app电子软著

This commit is contained in:
lyp 2025-05-29 17:02:18 +08:00
parent 2a6d12ed78
commit 06e26bc366
9 changed files with 1129 additions and 236 deletions

View File

@ -134,7 +134,8 @@ export const runSystemList = () => aiShopRequest.get(`/aishop/api/data/listbypar
export const bigClassList = () => aiShopRequest.get(`/aishop/api/data/listbyparentid/8abb5b58-83d2-465c-b164-a189efee28c1`)
// 获取小类
export const twoClass = (id:string) => aiShopRequest.get(`/aishop/api/data/listbyparentid/${id}`)
// 通过类得id获取内容
export const getContent = (id:string) => aiShopRequest.get(`/aishop/api/data/get/${id}`)
// 下单购买APP电子软著
export const buyAppGoods = (orderMoneyId:string) => aiShopRequest.post(`/aishop/api/apporder/pay/${orderMoneyId}`)
// 获取我的app电子软著订单列表
@ -149,7 +150,8 @@ export const agreementWord = (appOrderId:string,appName:string,versionName:strin
export const sourceCodeWord = (appOrderId:string,) => aiShopRequest.get(`aishop/api/apporder/create-file/SHOP02/${appOrderId}?name=源码文档示例`)
// 生成软件文档word文件
export const softwareDocumentWord = (appOrderId:string,) => aiShopRequest.get(`aishop/api/apporder/create-file/SHOP03/${appOrderId}?name=软件文档示例`)
// 补充资料
export const supplementAppData = (params:any) => aiShopRequest.post(`/aishop/api/correction/save-app`, params)
// 获取文件详细信息
export const fileDetail = (fileId:string) => aiShopRequest.get(`aishop/api/file/list?ids=${fileId}`)
// 第一步 企业认证
@ -158,5 +160,7 @@ export const companyAuth = (appOrderId:any,params:any) => aiShopRequest.post(`ai
export const softwareInfo = (appOrderId:any,params:any) => aiShopRequest.post(`aishop/api/apporder/update/2/${appOrderId}`,params)
// 第三步 上传鉴别材料
export const uploadMaterial = (appOrderId:any,params:any) => aiShopRequest.post(`/aishop/api/apporder/update/3/${appOrderId}`,params)
// 第四步 提交审核
export const submitapp = (appOrderId:any) => aiShopRequest.post(`/aishop/api/apporder/update/sub-check/${appOrderId}`)
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

View File

@ -35,12 +35,12 @@ export default function AppEdit() {
const getRunSystemList = async () => {
try {
const res: any = await runSystemList();
console.log('运行系统选项', res.map((item: any) => {
return {
label: item.dataName,
value: item.dataName,
}
}));
// console.log('运行系统选项', res.map((item: any) => {
// return {
// label: item.dataName,
// value: item.dataName,
// }
// }));
setSystemList(res.map((item: any) => {
return {
label: item.dataName,
@ -123,6 +123,7 @@ export default function AppEdit() {
companyPhoto: '', // 企业照片
companyAuth: '',//授权书
});
const [checkStatus, setCheckStatus] = useState<any>('') //审核状态
// 软件基本信息
const [appInfo, setAppInfo] = useState<any>({
appName: '', // 项目名称
@ -131,7 +132,9 @@ export default function AppEdit() {
packageName: '', // 包名APPID
systemName: '', // 运行系统
bigClassify: '', // 软件分类(大类)
// bigClassifyName: '',
subClassify: '', // 软件分类(小类)
// subClassifyName: '',
developWay: '', // 开发方式
completeTime: '', // 开发完成时期
projOwnerName: '',//著作权人姓名
@ -139,11 +142,13 @@ export default function AppEdit() {
projOwnerId: '',//著作权人信息ID
getFile: '',//获取文件
})
// 材料信息
const [filesInfo, setFilesInfo] = useState<any>({
sourceCodeDocFile: '',//源码
softwareDocFile: '',//软件
})
const [checkRemark, setCheckRemark] = useState('') //未通过原因
// 文件想想请
// const [fileList, setFileList] = useState<any[]>([]);
// 获取详情
@ -152,7 +157,7 @@ export default function AppEdit() {
setLoading(true)
const res: any = await appOrderDetail(appOrderId);
console.log('详情', res);
// console.log('详情', res);
setCompanyInfo({
companyName: res.companyName, // 企业名称
companyNumber: res.companyNumber, // 企业统一社会信用代码
@ -173,12 +178,16 @@ export default function AppEdit() {
projOwnerIdentity: res.projOwnerIdentity,//著作权人证件号
projOwnerId: res.projOwnerId,//著作权人信息ID
getFile: res.getFile,//获取文件
// bigClassifyName: res.bigClassifyName,
// subClassifyName: res.subClassifyName,
})
setFilesInfo({
sourceCodeDocFile: res.sourceCodeDocFile,//源码
softwareDocFile: res.softwareDocFile,//软件
})
setEditProcess(Number(res.appOrderProgress) + 1)
setCheckStatus(res.checkStatus)
setCheckRemark(res.checkRemark)
// const fileres: any = await fileDetail(res.getFile)
// console.log('文件详情', fileres);
@ -393,6 +402,10 @@ export default function AppEdit() {
}
}></EditAppFunction> */}
<AppInfo
checkStatus={checkStatus}
setCheckStatus={(value:string)=>{
setCheckStatus(value)
}}
appOrderId={appOrderId}
companyInfo={companyInfo}
appInfo={appInfo}
@ -401,7 +414,9 @@ export default function AppEdit() {
(num: number) => {
setEditProcess(num)
}
}></AppInfo>
}
checkRemark={checkRemark}
></AppInfo>
</div>
{/* <div style={{
display: editProcess == 5 ? 'block' : 'none'

View File

@ -7,9 +7,12 @@ import {
// Spin,
message,
Spin,
Table
Table,
Modal
} from 'antd';
import File from './components/File/File'
import { appOrderList } from '../../request/api'
import { showImage } from '../../request/request'
import './app-election.css'
import nothingImg from '../../static/appimgs/nothing.png'
import { useLocation } from 'react-router-dom';
@ -23,12 +26,17 @@ interface DataType {
gmtCreate: string;
bigClassifyName: string; //软件分类(大类)
subClassifyName: string; //软件分类(子类)
checkRemark: string; //未通过原因
}
export default function AppElectron() {
const [fileModal, setFileModal] = useState(false) //补充资料弹窗
const [appOrderId, setAppOrderId] = useState('') //订单id
const nav = useNavigate();
const dispath = useDispatch()
const redxuState: any = useSelector(state => state)
const data = redxuState.appGoodsListData;
const [checkRemarkModal, setCheckRemarkModal] = useState(false) //未通过原因弹窗
const [checkRemark, setCheckRemark] = useState('') //未通过原因
const columns: TableProps<DataType>['columns'] = [
{
title: '序号',
@ -68,7 +76,7 @@ export default function AppElectron() {
},
render: (text, record) => (
<span>
{text ? ` ${record.bigClassifyName} / ${record.subClassifyName}` : '未完善'}
{text ? ` ${record.bigClassifyName} - ${record.subClassifyName}` : '未完善'}
</span>
)
},
@ -97,9 +105,35 @@ export default function AppElectron() {
align: 'center',
key: 'appOrderId',
width: 100,
render: (text) => (
render: (text, record) => (
<span>
{text == '1' ? '待审核' : text == '2' ? '通过' : text == '0' ? '未通过' : '未提交'}
{text == '1' ?
<span style={{
color: 'skyblue',
}}></span>
: text == '2' ?
<span
style={{
color: 'green',
}}
></span>
: text == '0' ?
<span
style={{
color: 'red',
cursor: 'pointer'
}}
title='点击查看原因'
onClick={() => {
setCheckRemark(record.checkRemark)
setCheckRemarkModal(true)
}}
></span>
:
<span style={{
color: 'rgb(122 126 130)',
}}> </span>
}
</span>
)
},
@ -108,10 +142,10 @@ export default function AppElectron() {
dataIndex: 'appOrderStatus',
align: 'center',
key: 'appOrderId',
width: 100,
width: 150,
render: (text) => (
<span>
{text == '1' ? '未付款' : text == '2' ? '资料填写中' : text == '3' ? '资料审核中' : text == '4' ? '线申请中' : text == '5' ? '已下证' : '未知'}
{text == '1' ? '未付款' : text == '2' ? '资料填写中' : text == '3' ? '资料审核中' : text == '4' ? '线申请中' : text == '5' ? '已下证' : '未知'}
</span>
)
},
@ -121,10 +155,14 @@ export default function AppElectron() {
// dataIndex: 'contractManagementId',
align: 'center',
key: 'appOrderId',
width: 200,
width: 150,
// bordeLeft: true,
fixed: 'right',
render: (record) => (
<div style={{
display: 'flex', justifyContent: 'center', alignItems: 'center',
}}>
<div style={{
cursor: 'pointer',
color: '#007FFF',
@ -132,10 +170,64 @@ export default function AppElectron() {
}} onClick={() => {
nav(`/app-edit/${record.appOrderId}`)
// console.log(record.checkStatus);
}}>{record.checkStatus == '' ? '编辑' : record.checkStatus == '0' ? '修改' : '查看'}</div>
<div style={{
marginLeft: 10,
cursor: 'pointer',
// background: 'red',
color: '#007FFF',
position: 'relative',
display: record.waitCorrectionCount > 0 && record.appOrderStatus != '5' ? 'unset' : 'none',
}}
onClick={() => {
setFileModal(true)
// console.log(record);
setAppOrderId(record.appOrderId)
}}
>
<div style={{
}}></div>
position: 'absolute',
top: '-10px',
right: '-10px',
// fontSize:'16px',
background: 'red',
color: '#fff',
fontWeight: '700',
width: '20px',
height: '20px',
borderRadius: '50%',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}}>
{record.waitCorrectionCount}
</div>
</div>
<div style={{
marginLeft: 10,
cursor: 'pointer',
color: '#007FFF',
display: record.appOrderStatus == '5' ? 'unset' : 'none',
}}
onClick={() => {
console.log(record.appOrderResultFile);
window.open(showImage(record.appOrderResultFile, false));
}}
>
</div>
</div>
)
},
@ -164,7 +256,7 @@ export default function AppElectron() {
val: res
})
} catch (error: any) {
setLoading(false)
if (error.response) {
const data = error.response.data;
messageApi.open({
@ -242,7 +334,56 @@ export default function AppElectron() {
)}
</Spin>
<Modal title="未通过原因"
centered
footer={null}
destroyOnClose
// okText="确认提交"
// cancelText="取消"
open={checkRemarkModal}
// width={1200}
onCancel={() => {
setCheckRemarkModal(false)
}}
// onOk={
// // setModal(false)
// clickOk
// }
>
<div style={{
fontSize: '16px',
// color: 'red',
// fontWeight: 'bold'
}}>
{checkRemark}
</div>
</Modal>
<Modal
title="补充资料"
okText="确认"
cancelText="取消"
destroyOnClose={true}
footer={null}
open={fileModal}
// onOk={() => {
// setOrderDetailModal(false)
// }}
onCancel={() => {
setFileModal(false)
}}
width={1150}
centered
>
<File
upData={() => {
getAppOrderList(page)
}}
user={'buy'}
orderId={appOrderId}></File>
</Modal>
</div>

View File

@ -1,52 +1,290 @@
import { useEffect, useState } from 'react';
import './app-info.css'
import { Button, message } from "antd"
import { Button, message, Spin, Modal } from "antd"
import { fileDetail, submitapp, getContent } from '../../../../request/api'
import { showImage } from '../../../../request/request'
export default function AppInfo(props: any) {
const [messageApi, contextHolder] = message.useMessage();
const height = window.innerHeight - 460;
const [loading, setLoading] = useState(false);
const [modal, setModal] = useState(false);
const handleSubmit = () => {
message.success('提交成功');
setModal(true)
// message.success('提交成功');
// props.setCheckStatus('1')
};
const clickOk = async () => {
try {
setLoading(true)
await submitapp(props.appOrderId)
setModal(false)
setLoading(false)
message.success('提交成功');
props.setCheckStatus('1')
} catch (error: any) {
setLoading(false)
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
} finally {
setLoading(false)
}
}
const companyInfo = props.companyInfo;
const appInfo = props.appInfo;
const filesInfo = props.filesInfo;
const [photofileDetail, setPhotofileDetail] = useState<any>({
fileId: '', //文件id
fileName: '', //文件名称
url: ''
});
const [authfileDetail, setAuthfileDetail] = useState<any>({
fileId: '', //文件id
fileName: '', //文件名称
url: ''
})
const [file, setFile] = useState<any>({
fileId: '', //文件id
fileName: '', //文件名称
url: ''
})
const [codefileDetail, setCodefileDetail] = useState<any>({
fileId: '', //文件id
fileName: '', //文件名称
url: ''
})
const [softfileDetail, setSoftfileDetail] = useState<any>({
fileId: '', //文件id
fileName: '', //文件名称
url: ''
})
const getPhotoFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
setPhotofileDetail({
fileId: res[0].fileId, //文件id
fileName: res[0].fileName, //文件名称
url: showImage(res[0].fileId, false)
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const getAuthFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
setAuthfileDetail({
fileId: res[0].fileId, //文件id
fileName: res[0].fileName, //文件名称
url: showImage(res[0].fileId, false)
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const getFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
setFile({
fileId: res[0].fileId, //文件id
fileName: res[0].fileName, //文件名称
url: showImage(res[0].fileId, false)
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const getCodeFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
setCodefileDetail({
fileId: res[0].fileId, //文件id
fileName: res[0].fileName, //文件名称
url: showImage(res[0].fileId, false)
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const getSoftFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
setSoftfileDetail({
fileId: res[0].fileId, //文件id
fileName: res[0].fileName, //文件名称
url: showImage(res[0].fileId, false)
})
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const [bigClassName, setBigClassName] = useState('')
const [smallClassName, setSmallClassName] = useState('')
const getBigClassName = async (id: string) => {
try {
const res: any = await getContent(id)
// console.log(res);
setBigClassName(res.dataName)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const getSmallClassName = async (id: string) => {
try {
const res: any = await getContent(id)
// console.log(res);
setSmallClassName(res.dataName)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
useEffect(() => {
if (companyInfo.companyPhoto) {
getPhotoFileDetail(companyInfo.companyPhoto)
}
if (companyInfo.companyAuth) {
getAuthFileDetail(companyInfo.companyAuth)
}
if (appInfo.getFile) {
getFileDetail(appInfo.getFile)
}
if (filesInfo.sourceCodeDocFile) {
getCodeFileDetail(filesInfo.sourceCodeDocFile)
}
if (filesInfo.softwareDocFile) {
getSoftFileDetail(filesInfo.softwareDocFile)
}
if (appInfo.bigClassify) {
getBigClassName(appInfo.bigClassify)
}
if (appInfo.subClassify) {
getSmallClassName(appInfo.subClassify)
}
}, [companyInfo.companyPhoto, companyInfo.companyAuth, appInfo.getFile, filesInfo.sourceCodeDocFile, filesInfo.softwareDocFile, appInfo.bigClassify, appInfo.subClassify])
return (
<Spin tip="正在提交..." size="small" spinning={loading}>
<div>
{contextHolder}
<div className='bigLine'></div>
<div className='appInfoFormBox' style={{
height: height,
justifyContent: 'flex-start',
flexDirection: 'column',
}}>
<div className='appInfoBox'>
<div style={{
marginLeft: '100px',
width: '80%',
fontSize: '14px',
color: 'red',
fontWeight: 'bold',
display: props.checkStatus === '0' ? 'unset' : 'none'
}}>:{props.checkRemark}</div>
<div className='appInfoTitle'>/</div>
<div className='appInfoText'>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'>/ : </div>
<div className='appInfoTextItemText'></div>
<div className='appInfoTextItemText'>{companyInfo.companyName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'></div>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>{companyInfo.companyNumber}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'>/ : </div>
<div className='appInfoTextItemText'>xxx路xxx号</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>xx证</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>111111111</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> xx.png</div>
<div className='appInfoTextItemTitle'> : </div>
<a className='appInfoTextItemText'
style={{
textDecoration: 'underline'
}}
onClick={() => {
window.open(photofileDetail.url)
}}
>{photofileDetail.fileName}</a>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> xxx.jpg</div>
<a className='appInfoTextItemText'
style={{
textDecoration: 'underline'
}}
onClick={() => {
window.open(authfileDetail.url)
}}>{authfileDetail.fileName}</a>
</div>
</div>
</div>
<div className='appInfoBox'>
@ -54,131 +292,95 @@ export default function AppInfo(props: any) {
<div className='appInfoText'>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'>APP软件全称 : </div>
<div className='appInfoTextItemText'></div>
<div className='appInfoTextItemText'>{appInfo.appName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'></div>
<div className='appInfoTextItemText'>{appInfo.subName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>v.10</div>
<div className='appInfoTextItemText'>{appInfo.versionName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'>(APPID) : </div>
<div className='appInfoTextItemText'>com.zhongxinhy.communitymanage</div>
<div className='appInfoTextItemText'>{appInfo.packageName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>android for phone</div>
<div className='appInfoTextItemText'>{appInfo.systemName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'>APP软件分: </div>
<div className='appInfoTextItemText'> - </div>
<div className='appInfoTextItemTitle'>: </div>
<div className='appInfoTextItemText'> {bigClassName} - {smallClassName}</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> </div>
<div className='appInfoTextItemText'> {appInfo.developWay}</div>
</div>
{/* <div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> </div>
</div> */}
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle' style={{
display: appInfo.getFile ? 'block' : 'none'
}}> : </div>
<a style={{
textDecoration: 'underline'
}} className='appInfoTextItemText'
onClick={() => {
window.open(file.url)
}}
> {file.fileName}</a>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> 2025-05-05</div>
<div className='appInfoTextItemText'> {appInfo.completeTime}</div>
</div>
{/* <div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> </div>
</div> */}
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> </div>
<div className='appInfoTextItemText'> {appInfo.projOwnerName}</div>
</div>
</div>
</div>
{/* <div className='appInfoBox'>
<div className='appInfoTitle'></div>
<div className='appInfoText'>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'></div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'></div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>asdasjdadja.png</div>
</div>
</div>
</div> */}
<div className='appInfoBox'>
<div className='appInfoTitle'></div>
<div className='appInfoText'>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>asdkaksd.png</div>
<a style={{
textDecoration: 'underline'
}}
onClick={() => {
window.open(codefileDetail.url)
}}
className='appInfoTextItemText'>{codefileDetail.fileName}</a>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>asdkaksd.png</div>
<a style={{
textDecoration: 'underline'
}}
onClick={() => {
window.open(softfileDetail.url)
}}
className='appInfoTextItemText'>{softfileDetail.fileName}</a>
</div>
</div>
</div>
{/* <div className='appInfoBox'>
<div className='appInfoTitle'></div>
<div className='appInfoText'>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>1GHz以上处理器1GB以上内存16GB以上存储空间</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>Android操作系统</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> Java</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> 672384</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'>APP软件主要功能有考勤打卡退</div>
</div>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'> Android Jetpack ViewModel LiveData Retrofit OkHttp</div>
</div>
</div>
</div> */}
{/* <div className='appInfoBox'>
<div className='appInfoTitle'></div>
<div className='appInfoText'>
<div className='appInfoTextItem'>
<div className='appInfoTextItemTitle'> : </div>
<div className='appInfoTextItemText'></div>
</div>
</div>
</div> */}
</div>
<div className='bigLine'></div>
<div className='nextBtnBxo' >
<div style={{
display: props.checkStatus == '' || props.checkStatus == '0' ? 'unset' : 'none',
}}>
<Button
style={{
width: '235px',
@ -199,9 +401,55 @@ export default function AppInfo(props: any) {
onClick={() => {
handleSubmit()
}}></Button>
</div>
<div style={{
display: props.checkStatus == '1' ? 'unset' : 'none',
fontSize: '16px',
color: 'skyblue',
// color:'green',
fontWeight: 'bold'
}}>
...
</div>
<div style={{
display: props.checkStatus == '2' ? 'unset' : 'none',
fontSize: '16px',
// color:'skyblue',
color: 'green',
fontWeight: 'bold'
}}>
</div>
</div>
</div>
<Modal title="提示"
centered
// footer={null}
destroyOnClose
okText="确认提交"
cancelText="取消"
open={modal}
// width={1200}
onCancel={() => {
setModal(false)
}}
onOk={
// setModal(false)
clickOk
}
>
<div style={{
fontSize: '16px',
color: 'red',
fontWeight: 'bold'
}}>
: 提交后无法修改
</div>
</Modal>
</Spin>
)
}

View File

@ -35,4 +35,7 @@
.appInfoTextItemText{
max-width: 60%;
/* background-color: pink; */
/* 下划线 */
}

View File

@ -68,11 +68,11 @@ export default function EditAppFiles(props: any) {
return true;
};
// 处理文件点击预览
const handlePreview = (file: any) => {
console.log(file);
// const handlePreview = (file: any) => {
// console.log(file);
};
// };
// 上传文件源码文档列表
const [upCodeArray, setUpCodeArray] = useState<any>([])
// const [codeDis, setCodeDis] = useState(false)
@ -227,7 +227,7 @@ export default function EditAppFiles(props: any) {
const getCodeFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
console.log('文件详情', res);
// console.log('源码文档文件详情', res);
setUpCodeArray([
{
uid: res[0].fileId,
@ -252,7 +252,6 @@ export default function EditAppFiles(props: any) {
const getSoftFileDetail = async (id: string) => {
try {
const res: any = await fileDetail(id)
console.log('文件详情', res);
setUpSoftArray([
{
uid: res[0].fileId,
@ -385,7 +384,7 @@ export default function EditAppFiles(props: any) {
});
}}
beforeUpload={beforeUpload}
onPreview={handlePreview}
// onPreview={handlePreview}
// onChange={handleUploadChange}
headers={{ 'Auth': `Bearer ${token}` }}
>
@ -406,7 +405,7 @@ export default function EditAppFiles(props: any) {
onClick={
downCodeWord
}
>[ 1 ]</a>
>[ ]</a>
</div>
<a style={{
marginLeft: 58,
@ -494,7 +493,7 @@ export default function EditAppFiles(props: any) {
</div>
<a style={{
position: 'absolute',
top: '10px',
// top: '10px',
left: '260px',
textWrap: 'nowrap'
}}

View File

@ -20,7 +20,7 @@ export default function EditAppInfo(props: any) {
const getSmallClassList = async (id: string) => {
try {
const res: any = await twoClass(id)
console.log(res);
// console.log(res);
setSmallClassList(res.map((item: any) => {
return {
label: item.dataName,
@ -153,8 +153,8 @@ export default function EditAppInfo(props: any) {
}
const onFinish = async (values: any) => {
// 处理表单提交逻辑
console.log('表单提交成功', values);
console.log(dayjs(values.completeTime).format('YYYY-MM-DD'));
// console.log('表单提交成功', values);
// console.log(dayjs(values.completeTime).format('YYYY-MM-DD'));
// 给表单赋值 time: dayjs(res.goodsGetTime, 'YYYY-MM-DD'),
// submitInfo(values)
// 给表单赋值
@ -165,10 +165,10 @@ export default function EditAppInfo(props: any) {
projOwnerId: belongPeopleInfo.authorId,//著作权人信息ID
}
console.log('表单数据', data);
console.log('传递数据', props.appInfo);
// console.log('表单数据', data);
// console.log('传递数据', props.appInfo);
// console.log(JSON.stringify(props.appInfo) == JSON.stringify(data));
console.log(deepCompareObjects(props.appInfo, data));
// console.log(deepCompareObjects(props.appInfo, data));
// console.log(props.appInf == data);
// return
@ -256,13 +256,13 @@ export default function EditAppInfo(props: any) {
}
useEffect(() => {
if (props.appInfo.getFile) {
console.log('嘻嘻', props.appInfo.getFile);
// console.log('嘻嘻', props.appInfo.getFile);
getFileDetail(props.appInfo.getFile)
}
}, [props.appInfo.getFile])
useEffect(() => {
console.log('传过来的信息', props);
// console.log('传过来的信息', props);
if (props.appInfo.appName) {
// setSmallClassList(props.smallClass)
form.setFieldsValue({

View File

@ -0,0 +1,482 @@
import { useEffect, useState } from 'react'
import { Table, Space, Modal, Input, Form, Upload, Button } from "antd"
import { UploadOutlined } from '@ant-design/icons';
import { sellSupplementList, buySupplementList, supplementDetail, getFileTypeByIds, supplementAppData } from '../../../../request/api'
import { showImage, uploadFileUrl } from '../../../../request/request'
const { Column } = Table;
import useMessage from "antd/es/message/useMessage";
// import './File.css'
const { TextArea } = Input;
export default function File(props: any) {
const [upFileArray, setUpFileArray] = useState<any>([]) // 上传的文件数组
// 自定义验证函数
const validateContentOrFile = (_rule: any, _value: any, callback: (error?: string) => void, form: any) => {
const { upCorrectionRemark, upFile } = form.getFieldsValue();
if (upCorrectionRemark || (upFile && Array.isArray(upFile.fileList) && upFile.fileList.length > 0)) {
callback();
} else {
callback('内容和附件至少需要填写或上传一项');
}
};
// 点击上传资料确定
const submitData = async (params: any) => {
try {
await supplementAppData({
correctionParentId: correctionId,
// correctionType: CorrectionType,
orderId: props.orderId,
correctionFiles: params.correctionFiles,
correctionRemark: params.correctionRemark,
})
if (props.user == 'sell') {
getSellSupplementList()
} else if (props.user == 'buy') {
getBuySupplementList()
}
props.upData()
messageApi.open({
type: 'success',
content: '已提交',
})
setIsModalVisible(false)
// form.resetFields();
// console.log(res);
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const token = sessionStorage.getItem('token')
const [form] = Form.useForm();
const [messageApi, messageContext] = useMessage();
const [correctionId, setCorrectionId] = useState('') // 点击查看内容选中的id
// const [CorrectionType, setCorrectionType] = useState('')
// 补充资料弹窗
const [isModalVisible, setIsModalVisible] = useState(false)
const [page, setPage] = useState(1) // 当前页码
const [total, setTotal] = useState(0) // 总条数
const [data, setData] = useState([])
const getSellSupplementList = async () => {
try {
const res: any = await sellSupplementList({
orderId: props.orderId,
page: page,
rows: 10
})
setPage(res.page)
setTotal(res.total)
console.log(res);
setData(res.rows)
// let newData:any = [];
// for (let i = 0; i < 10; i++) {
// newData = newData.concat(res.rows);
// }
// setData(newData);
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const getBuySupplementList = async () => {
try {
const res: any = await buySupplementList({
orderId: props.orderId,
page: page,
rows: 10
})
setPage(res.page)
setTotal(res.total)
// console.log(res);
setData(res.rows)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
const [fileList, setFileList] = useState<any>([]) // 上传文件列表
// 获取文件类型
const getFileTypeByIdsArray = async (ids: string) => {
try {
const res: any = await getFileTypeByIds({
ids: ids
})
setFileList(res)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
// 补充资料详情
const [detailData, setDetailData] = useState<any>({})
const getSupplementDetail = async (id: string) => {
try {
const res: any = await supplementDetail(id)
// console.log(res);
setDetailData(res)
await getFileTypeByIdsArray(res.correctionFiles)
} catch (error: any) {
if (error.response) {
const data = error.response.data;
messageApi.open({
type: 'error',
content: data.msg ? data.msg : `${data.path}(${data.status})`,
});
} else {
console.error(error)
}
}
}
useEffect(() => {
if (props.user == 'sell') {
getSellSupplementList()
} else if (props.user == 'buy') {
getBuySupplementList()
}
}, [page])
return (
<div>
{messageContext}
<Table
// scroll={{ y: `${height - 190}px` }}
dataSource={data}
// pagination={{
// defaultPageSize: 5, // 设置默认一页显示 5 条数据
// }}
scroll={{ y: 480 }}
pagination={
{
pageSize: 10,
total: total,
onChange: (currentPage) => {
setPage(currentPage);
},
showSizeChanger: false,
current: page
}
}
// pagination={false} // 不显示分页
style={{ textAlign: 'center' }} // 设置表格内容居中显示
rowKey="correctionId" // 指定数据项的唯一标识符
>
<Column
width={70}
title="序号" render={(_text, _record, index: number) => (
index + 1
)} align="center" />
<Column
title="资料主题"
dataIndex="correctionTitle"
align="center"
width={200}
render={(text) => (
<div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={text}>{text}</div>
)}
// render={(text) => (
// <span style={{ color: '#1B8BD2', fontSize: '16px', fontWeight: '700' }}>{text}</span>
// )}
/>
<Column
title="资料内容"
dataIndex="correctionRemark"
align="center"
width={300}
render={(text) => (
<div style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={text}>{text}</div>
)}
/>
<Column
title="发起时间"
width={200}
dataIndex="createTime"
align="center"
// ellipsis
/>
<Column
title="状态"
dataIndex={props.user == 'sell' ? "sellId" : "buyId"}
align="center"
width={100}
render={(text) => (
<>
<span style={{ color: '#DD0000', fontSize: '16px', fontWeight: '700', display: text == '' ? 'unset' : 'none' }}></span>
<span style={{ color: 'green', fontSize: '16px', fontWeight: '700', display: text == '' ? 'none' : 'unset' }}></span>
</>
)}
/>
{/* <Column title="实名认证状态" dataIndex="address" key="key" /> */}
<Column
align="center"
title="操作"
width={100}
render={(_text, record: any) => (
<Space size="middle">
<span className='transaction-order-table-btn' onClick={() => {
// console.log(record.correctionId);
setCorrectionId(record.correctionId)
getSupplementDetail(record.correctionId)
setIsModalVisible(true)
// 清空表单
form.resetFields();
// setCorrectionType(record.correctionType)
}}></span>
</Space>
)}
/>
</Table>
<Modal title={'补充'}
destroyOnClose={true}
open={isModalVisible}
footer={null} // 将 footer 设置为 null 来隐藏自带按钮
width={1000}
onCancel={() => {
setIsModalVisible(false);
// 清空表单
form.resetFields();
}}
centered
>
<div>
{/* {correctionId}
{CorrectionType} */}
<div className='editModal-title'>
<div className='editModal-title-box'></div>
<div className='editModal-title-name'></div>
</div>
<div className='correctionTitleBox'>
<div className='correctionTitle'></div>
<Input value={detailData.correctionTitle} style={{
height: 40,
color: 'black'
}}
disabled
></Input>
</div>
<div className='correctionRemarkBox'>
<div className='correctionTitle'></div>
<TextArea value={detailData.correctionRemark} style={{
height: 100,
color: 'black',
resize: 'none'
}}
disabled
></TextArea>
</div>
<div className='upFileBox'>
<div className='correctionTitle'></div>
{fileList.length > 0 ? (
// <div>材料列表</div>
<div>
{
fileList.map((item: any) => {
return (
<div
key={item.fileId}
style={{
// background: 'pink',
marginBottom: 5,
maxWidth: 800,
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
cursor: 'pointer',
color: '#1B8BD2',
//下划线
textDecoration: 'underline',
}}
title={item.fileName}
onClick={() => {
window.open(showImage(item.fileId, false))
}}
>
{item.fileName}
</div>
)
})
}
</div>
) : (
<div style={{ fontSize: 18, fontWeight: 700 }}>
</div>
)}
</div>
<div className='editModal-title' style={{ marginTop: 30 }}>
<div className='editModal-title-box'></div>
<div className='editModal-title-name'></div>
</div>
<Form
name="basic"
form={form}
layout="vertical"
onFinish={(value) => {
// console.log(value);
// if (value.upFile && Array.isArray(value.upFile.fileList)) {
// const uids = value.upFile.fileList.map((file: any) => file.uid);
// const uidString = uids.join(',');
// console.log('提取的 uid 字符串:', uidString);
// // 你可以在这里继续处理 uid 字符串,比如发送请求等
// }
// const uids = value.upFile ? (value.upFile.fileList.map((file: any) => file.uid)).join(',') : '';
// console.log('提取的 uid 字符串:', uids);
// submitData({
// correctionFiles: uids,
// correctionRemark: value.upCorrectionRemark,
// })
// console.log(upFileArray);
// 将upFileArray 数组周末和每项的response里的data 里的 fileId 拼接成一个字符串,用逗号隔开
const uids = upFileArray.map((file: any) => file.response.data.fileId).join(',');
// console.log('提取的 uid 字符串:', uids);
submitData({
correctionFiles: uids,
correctionRemark: value.upCorrectionRemark,
})
}}
onFinishFailed={() => {
messageApi.open({
type: 'error',
content: '内容和附件至少需要填写或上传一项',
})
}}
autoComplete="off"
>
<div className='correctionRemarkBox'>
<div className='correctionTitle'></div>
<Form.Item
name="upCorrectionRemark"
rules={[
// { required: true, message: '请输入需要补充内容' },
{
validator: (rule, value, callback) => validateContentOrFile(rule, value, callback, form),
},
]}
>
<TextArea style={{
height: 100,
resize: 'none',
width: 900,
}}
placeholder='请输入需要补充内容'
></TextArea>
</Form.Item>
</div>
<div className='correctionRemarkBox' style={{
marginTop: 0
}}>
<div className='correctionTitle'></div>
<div style={{
maxWidth: 800,
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}}>
<Form.Item
name="upFile"
rules={[
// { required: true, message: '请上传附件' },
{
validator: (rule, value, callback) => validateContentOrFile(rule, value, callback, form),
},
]}
>
<Upload
name="file"
action={uploadFileUrl()}
defaultFileList={upFileArray}
onChange={(info) => {
setUpFileArray(info.fileList)
// console.log(info.fileList);
}}
headers={{ 'Auth': `Bearer ${token}` }}
>
<Button icon={<UploadOutlined />}></Button>
</Upload>
</Form.Item>
</div>
</div>
<Form.Item
>
<div style={{
display: 'flex',
justifyContent: 'flex-end',
gap: 10,
// marginTop: 20
}}>
<Button onClick={() => {
setIsModalVisible(false)
form.resetFields();
}}></Button>
<Button type="primary" htmlType="submit" ></Button>
</div>
</Form.Item>
</Form>
</div>
</Modal>
</div>
)
}

View File

@ -3314,6 +3314,7 @@ export default function Index() {
style={{ background: 'var(--color-searchbtn)' }}
onClick={() => {
setAppModal(true)
setAppGoodsId('')
}}
></Button>
<Search
@ -3366,7 +3367,7 @@ export default function Index() {
// { value: '1', label: '未付款' },
{ value: '2', label: '资料填写中' },
{ value: '3', label: '资料审核中' },
{ value: '4', label: '线申请中' },
{ value: '4', label: '线申请中' },
{ value: '5', label: '已下证' },
]}
>
@ -3822,7 +3823,7 @@ export default function Index() {
footer={null}
onCancel={() => {
setAppModal(false)
setAppGoodsId('')
}}
okButtonProps={{ style: { background: 'red', color: 'white' } }}
width={830}