This commit is contained in:
lyp 2025-05-27 10:47:05 +08:00
parent d2c09876b0
commit b524324414
13 changed files with 1056 additions and 387 deletions

View File

@ -6,7 +6,7 @@ VITE_OPERATOR_PLUGIN_BASE_URL=${VITE_BASE_URL}:8099
VITE_AI_SHOP_BASE_URL=http://192.168.0.115:8081
VITE_WEBSOCKET_BASE_URL=ws://${VITE_HOST}:7025/copyright
# 18634604067
# VITE_USERID=80d3365e-0597-4988-979e-18ef1c3ec671
VITE_USERID=e3e40f95-7a3f-4b53-a1a0-51dd4e881d74
VITE_USERID=80d3365e-0597-4988-979e-18ef1c3ec671
# VITE_USERID=e3e40f95-7a3f-4b53-a1a0-51dd4e881d74
# VITE_CURRENT_THEME=fzkj
VITE_CURRENT_THEME=mzw

View File

@ -121,3 +121,25 @@ export const updateBindPhone = (params:any) => phoneRequest.post(`/operator/api/
export const unbind = () => phoneRequest.get(`/operator/api/user-wx-update-username/unlock-phone`)
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// APP电子软著接口----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//获取APP电子软著可买商品展示列表
export const appGoodsList = () => aiShopRequest.get(`/aishop/api/data/listbyparentid/71831561-108f-49f0-92c8-f9e4f0483c02`)
// 获取运行系统选项
export const runSystemList = () => aiShopRequest.get(`/aishop/api/data/listbyparentid/9fc8636a-b930-4e82-beb3-db7ca6151e6b`)
// 获取大类选项
export const bigClassList = () => aiShopRequest.get(`/aishop/api/data/listbyparentid/8abb5b58-83d2-465c-b164-a189efee28c1`)
// 获取小类
export const smallClassList = (id:string) => aiShopRequest.get(`/aishop/api/data/listbyparentid/8abb5b58-83d2-465c-b164-a189efee28c1/${id}`)
// 下单购买APP电子软著
export const buyAppGoods = (orderMoneyId:string) => aiShopRequest.post(`/aishop/api/apporder/pay/${orderMoneyId}`)
// 获取我的app电子软著订单列表
export const appOrderList = (params:any) => aiShopRequest.get(`/aishop/api/apporder/listpage-self`, { params })
// 获取app电子软著详情
export const appOrderDetail = (appOrderId:any) => aiShopRequest.get(`/aishop/api/apporder/get/${appOrderId}`)
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

View File

@ -64,7 +64,7 @@ request.interceptors.response.use(
// 买卖功能----------------------------------------------------------------------------
// 买卖功能(交易中心/APP电子软著)----------------------------------------------------------------------------
const aiShopRequest = axios.create({
baseURL: aiShopBaseUrl,
timeout: 5000,

View File

@ -8,88 +8,265 @@ import EditAppFiles from './components/EditAppFiles/EditAppFiles';
import AppInfo from './components/AppInfo/AppInfo';
import AppCompany from './components/AppCompany/AppCompany';
import { useParams } from 'react-router-dom'
import { runSystemList, bigClassList, smallClassList } from '../../request/api'
import './app-edit.css'
import {
RightOutlined
} from '@ant-design/icons';
import {
message,
Spin,
} from 'antd';
import { appOrderDetail } from '../../request/api'
export default function AppEdit() {
const [messageApi, contextHolder] = message.useMessage();
const pathParams = useParams();
// 进度
const appOrderId = pathParams.appOrderId;
const [systemList, setSystemList] = useState<any[]>([]); // 运行系统选项
const [bigClass, setBigClass] = useState<any[]>([]); // 软件分类(大类)选项
const [smallClass, setSmallClass] = useState<any[]>([]); // 软件分类(小类)选项
// 获取运行系统选项
const getRunSystemList = async () => {
try {
const res: any = await runSystemList();
console.log('运行系统选项', res.map((item: any) => {
return {
label: item.dataName,
value: item.dataName,
}
}));
setSystemList(res.map((item: any) => {
return {
label: item.dataName,
value: item.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 getBigClassList = async () => {
try {
const res: any = await bigClassList();
console.log('大类选项', res.map((item: any) => {
return {
label: item.dataName,
value: item.dataId,
}
}));
setBigClass(res.map((item: any) => {
return {
label: item.dataId,
value: item.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 getSmallClassList = async (id: string) => {
try {
const res: any = await smallClassList(id);
console.log(res);
setSmallClass(res.map((item: any) => {
return {
label: item.dataId,
value: item.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 [loading, setLoading] = useState(false);
const [editProcess, setEditProcess] = useState(1);
// 企业/机构认证
const [companyInfo, setCompanyInfo] = useState<any>({
companyName: '', // 企业名称
companyNumber: '', // 企业统一社会信用代码
companyPhoto: '', // 企业照片
companyAuth: '',//授权书
});
// 软件基本信息
const [appInfo, setAppInfo] = useState<any>({
appName: '', // 项目名称
subName: '', // 软件简称
versionName: '', // 版本号
packageName: '', // 包名APPID
systemName: '', // 运行系统
bigClassify: '', // 软件分类(大类)
subClassify: '', // 软件分类(小类)
developWay: '', // 开发方式
completeTime: '', // 开发完成时期
projOwnerName: '',//著作权人姓名
projOwnerIdentity: '',//著作权人证件号
projOwnerId: '',//著作权人信息ID
})
// 材料信息
const [filesInfo, setFilesInfo] = useState<any>({
sourceCodeDocFile: '',//源码
softwareDocFile: '',//软件
})
// 获取详情
const getAppOrderDetail = async () => {
try {
setLoading(true)
const res: any = await appOrderDetail(appOrderId);
console.log('详情', res);
setCompanyInfo({
companyName: res.companyName, // 企业名称
companyNumber: res.companyNumber, // 企业统一社会信用代码
companyPhoto: res.companyPhoto, // 企业照片
companyAuth: res.companyAuth,//授权书
})
setAppInfo({
appName: res.appName, // 项目名称
subName: res.subName, // 软件简称
versionName: res.versionName, // 版本号
packageName: res.packageName, // 包名APPID
systemName: res.systemName, // 运行系统
bigClassify: res.bigClassify, // 软件分类(大类)
subClassify: res.subClassify, // 软件分类(小类)
developWay: res.developWay, // 开发方式
completeTime: res.completeTime, // 开发完成时期
projOwnerName: res.projOwnerName,//著作权人姓名
projOwnerIdentity: res.projOwnerIdentity,//著作权人证件号
projOwnerId: res.projOwnerId,//著作权人信息ID
})
setFilesInfo({
sourceCodeDocFile: res.sourceCodeDocFile,//源码
softwareDocFile: res.softwareDocFile,//软件
})
setEditProcess(Number(res.appOrderProgress) + 1)
setLoading(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)
}
} finally {
setLoading(false)
}
}
// 进度
// 获取详情
useEffect(() => {
getAppOrderDetail()
//获取进度
setEditProcess(1)
// 带来的id
console.log('参数', pathParams);
// 获取 信息
// setEditProcess(1)
getRunSystemList()
getBigClassList()
if(appInfo.bigClassify) {
getSmallClassList(appInfo.bigClassify)
}
}, []);
const height = window.innerHeight - 180;
return (
<div className='appEdit' style={{ height: `${height}px`, overflow: 'auto' }}>
<div className='editProcessBox'>
<div className='editProcess' >
<div className='editProcessNum'
style={{
background: editProcess >= 1 ? '#3B60E8' : '',
color: editProcess >= 1 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 1 ? '' : '#B1B1B1'
}}
>1</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 1 ? '#353535' : '#878787',
fontWeight: editProcess >= 1 ? 'bold' : 'normal'
}}
>/</div>
</div>
<div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 2 ? '#3B60E8' : '',
color: editProcess >= 2 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 2 ? '' : '#B1B1B1'
}}>2</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 2 ? '#353535' : '#878787',
fontWeight: editProcess >= 2 ? 'bold' : 'normal'
}}
></div>
</div>
<div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 3 ? '#3B60E8' : '',
color: editProcess >= 3 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 3 ? '' : '#B1B1B1'
}}>3</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 3 ? '#353535' : '#878787',
fontWeight: editProcess >= 3 ? 'bold' : 'normal'
}}
></div>
</div>
<div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 4 ? '#3B60E8' : '',
color: editProcess >= 4 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 4 ? '' : '#B1B1B1'
}}>4</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 4 ? '#353535' : '#878787',
fontWeight: editProcess >= 4 ? 'bold' : 'normal'
}}
>
{/* 功能特点 */}
<Spin tip="加载中..." size="small" spinning={loading}>
<div className='appEdit' style={{ height: `${height}px`, overflow: 'auto' }}>
{contextHolder}
<div className='editProcessBox'>
<div className='editProcess' >
<div className='editProcessNum'
style={{
background: editProcess >= 1 ? '#3B60E8' : '',
color: editProcess >= 1 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 1 ? '' : '#B1B1B1'
}}
>1</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 1 ? '#353535' : '#878787',
fontWeight: editProcess >= 1 ? 'bold' : 'normal'
}}
>/</div>
</div>
</div>
{/* <div className='editright'><RightOutlined /></div>
<div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 2 ? '#3B60E8' : '',
color: editProcess >= 2 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 2 ? '' : '#B1B1B1'
}}>2</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 2 ? '#353535' : '#878787',
fontWeight: editProcess >= 2 ? 'bold' : 'normal'
}}
></div>
</div>
<div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 3 ? '#3B60E8' : '',
color: editProcess >= 3 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 3 ? '' : '#B1B1B1'
}}>3</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 3 ? '#353535' : '#878787',
fontWeight: editProcess >= 3 ? 'bold' : 'normal'
}}
></div>
</div>
<div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 4 ? '#3B60E8' : '',
color: editProcess >= 4 ? '#fff' : '#B1B1B1',
borderColor: editProcess >= 4 ? '' : '#B1B1B1'
}}>4</div>
<div className='editProcessTitle'
style={{
color: editProcess >= 4 ? '#353535' : '#878787',
fontWeight: editProcess >= 4 ? 'bold' : 'normal'
}}
>
{/* 功能特点 */}
</div>
</div>
{/* <div className='editright'><RightOutlined /></div>
<div className='editProcess'>
<div className='editProcessNum' style={{
background: editProcess >= 5 ? '#3B60E8' : '',
@ -119,60 +296,73 @@ export default function AppEdit() {
</div> */}
</div>
<div className='editFormBox'>
<div style={{
display: editProcess == 1 ? 'block' : 'none'
}}>
<AppCompany setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></AppCompany>
{/* <EditAppInfo setEditProcess={
</div>
<div className='editFormBox'>
<div style={{
display: editProcess == 1 ? 'block' : 'none'
}}>
<AppCompany
companyInfo={companyInfo}
setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></AppCompany>
{/* <EditAppInfo setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppInfo> */}
</div>
<div style={{
display: editProcess == 2 ? 'block' : 'none'
}}>
<EditAppInfo setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppInfo>
{/* <EditAppDes setEditProcess={
</div>
<div style={{
display: editProcess == 2 ? 'block' : 'none'
}}>
<EditAppInfo
bigClass={bigClass}
systemList={systemList}
smallClass={smallClass}
appInfo={appInfo}
setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppInfo>
{/* <EditAppDes setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppDes> */}
</div>
<div style={{
display: editProcess == 3 ? 'block' : 'none'
}}>
<EditAppFiles setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppFiles>
</div>
<div style={{
display: editProcess == 4 ? 'block' : 'none'
}}>
{/* <EditAppFunction setEditProcess={
</div>
<div style={{
display: editProcess == 3 ? 'block' : 'none'
}}>
<EditAppFiles
filesInfo={filesInfo}
setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppFiles>
</div>
<div style={{
display: editProcess == 4 ? 'block' : 'none'
}}>
{/* <EditAppFunction setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></EditAppFunction> */}
<AppInfo setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></AppInfo>
</div>
{/* <div style={{
<AppInfo
companyInfo={companyInfo}
appInfo={appInfo}
filesInfo={filesInfo}
setEditProcess={
(num: number) => {
setEditProcess(num)
}
}></AppInfo>
</div>
{/* <div style={{
display: editProcess == 5 ? 'block' : 'none'
}}>
<EditBelongPeople setEditProcess={
@ -190,7 +380,8 @@ export default function AppEdit() {
}
}></AppInfo>
</div> */}
</div>
</div>
</div>
</Spin>
)
}

View File

@ -1,47 +1,241 @@
import { useState, useEffect } from 'react'
import { useSelector, useDispatch } from 'react-redux'
import {
Pagination,
// Table,
// Modal,
// Spin
// Spin,
message,
Spin,
Table
} from 'antd';
import { appOrderList } from '../../request/api'
import './app-election.css'
import nothingImg from '../../static/appimgs/nothing.png'
import { useLocation } from 'react-router-dom';
import type { TableProps } from 'antd';
import { useNavigate } from "react-router-dom";
interface DataType {
appName: string; //项目名称
bigClassify: string; //软件分类(大类)
appOrderPayMoney: number; //支付金额;
appOrderPayTime: string; //支付时间;
gmtCreate: string;
}
export default function AppElectron() {
const height = window.innerHeight - 180;
const [page, setPage] = useState(1);
const [total, setTotal] = useState(0);
const data = [
// { name: '123' }
]
useEffect(() => {
setTotal(100)
}, [page])
return (
<div className='appElectionBox' style={{ height: `${height}px`, overflow: 'auto' }}>
{data.length <= 0 ? (<div style={{ height: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center', flexDirection: 'column' }}>
const nav = useNavigate();
const dispath = useDispatch()
const redxuState: any = useSelector(state => state)
const data = redxuState.appGoodsListData;
const columns: TableProps<DataType>['columns'] = [
{
title: '序号',
dataIndex: 'index',
key: 'index',
align: 'center',
width: 90,
render: (_text, _record, index) => (page - 1) * 10 + index + 1, // 显示序号从1开始
<img src={nothingImg} alt="" width={368} height={355} />
},
{
title: '项目名称',
dataIndex: 'appName',
key: 'appOrderId',
align: 'center',
ellipsis: {
showTitle: true,
},
width: 200,
render: (text) => (
<span>
{text ? text : '未完善'}
</span>
)
},
{
title: '软件分类',
dataIndex: 'bigClassify',
align: 'center',
key: 'appOrderId',
width: 120,
ellipsis: {
showTitle: true,
},
render: (text) => (
<span>
{text ? text : '未完善'}
</span>
)
},
{
title: '支付金额',
dataIndex: 'appOrderPayMoney',
key: 'appOrderId',
align: 'center',
width: 120,
render: (text) => (
<span>
{text / 100}
</span>
)
},
{
title: '支付时间',
dataIndex: 'appOrderPayTime',
align: 'center',
key: 'appOrderId',
width: 200,
},
{
title: '审核状态',
dataIndex: 'checkStatus',
align: 'center',
key: 'appOrderId',
width: 100,
render: (text) => (
<span>
{text == '1' ? '待审核' : text == '2' ? '通过' : text == '0' ? '未通过' : '未提交'}
</span>
)
},
{
title: '申请状态',
dataIndex: 'appOrderStatus',
align: 'center',
key: 'appOrderId',
width: 100,
render: (text) => (
<span>
{text == '1' ? '未付款' : text == '2' ? '资料填写中' : text == '3' ? '资料审核中' : text == '4' ? '下线申请中' : text == '5' ? '已下证' : '未知'}
</span>
)
},
{
title: '操作',
// dataIndex: 'contractManagementId',
align: 'center',
key: 'appOrderId',
width: 80,
render: (record) => (
<div style={{
marginTop: 50,
fontSize: 16,
color: '#D0D0D0'
}}></div>
</div>) : (
<div className='transaction-order-table'>
<div style={{ height: `${height - 80}px` }}>
cursor: 'pointer',
color: '#007FFF',
}} onClick={() => {
nav(`/app-edit/${record.appOrderId}`)
// console.log(record);
}}></div>
)
},
]
const [messageApi, contextHolder] = message.useMessage();
const height = window.innerHeight - 180;
const { state } = useLocation()
const keywords = state ? state.appKeyWords : ''
const checkStatus = state? state.checkStatus : ''
const appOrderStatus = state? state.appOrderStatus : ''
const [page, setPage] = useState(1);
// const [total, setTotal] = useState(0);
const [loading, setLoading] = useState(false);
// const [data, setData] = useState<any[]>([]);
// 获取我得订单列表
const getAppOrderList = async (page: number) => {
try {
setLoading(true)
const res: any = await appOrderList({ page, keywords, rows: 10,checkStatus,appOrderStatus })
// console.log(res);
// setData(res.rows)
// setTotal(res.total)
setLoading(false)
dispath({
type: 'upAppGoodsListData',
val: 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)
}
} finally {
setLoading(false)
}
}
useEffect(() => {
setPage(1)
getAppOrderList(1)
}, [state,checkStatus,appOrderStatus])
return (
<div className='appElectionBox' style={{ height: `${height}px` }}>
<Spin tip="加载中..." size="small" spinning={loading}>
{contextHolder}
{data.length <= 0 ? (
<div style={{
height: `${height}px`,
// background:'pink',
display: 'flex', justifyContent: 'center', alignItems: 'center', flexDirection: 'column'
}}>
<img src={nothingImg} alt="" width={368} height={355} />
<div style={{
marginTop: 50,
fontSize: 16,
color: '#D0D0D0'
}}></div>
</div>
) : (
<div className='transaction-order-table' >
<div style={{
height: `${height - 80}px`,
// background: "pink" ,
paddingTop: 20
}}>
<Table
scroll={{ y: `${height - 150}px` }}
dataSource={data.rows}
columns={columns}
// pagination={{
// defaultPageSize: 10, // 设置默认一页显示 5 条数据
// }}
pagination={false} // 不显示分页
style={{ textAlign: 'center' }} // 设置表格内容居中显示
rowKey="appOrderId" // 指定数据项的唯一标识符
locale={{ emptyText: '暂无数据' }}
></Table>
</div>
<div className='product-release-pagination'>
<Pagination
showSizeChanger={false}
current={page} total={data.total} defaultPageSize={10} onChange={(page) => {
setPage(page)
getAppOrderList(page)
}} />
</div>
</div>
<div className='product-release-pagination'>
<Pagination
showSizeChanger={false}
current={page} total={total} defaultPageSize={10} onChange={(page) => {
setPage(page)
}} />
</div>
</div>
)}
)}
</Spin>
</div>
)
}

View File

@ -1,4 +1,4 @@
import { useState } from 'react'
import { useState,useEffect } from 'react'
import './app-company.css'
import { uploadFileUrl } from '../../../../request/request'
import { Button, Form, Input, message,
@ -21,38 +21,7 @@ import type { GetProp, UploadProps } from 'antd';
// // pId: string;
// }
export default function AppCompany(props: any) {
// const [messageApi, contextHolder] = message.useMessage();
// const [areaArray, setAreaArray] = useState<Option[]>([]);
// 加载城市列表
// const loadCityList = async (selectedOptions: Option[]) => {
// const targetOption = selectedOptions[selectedOptions.length - 1];
// // console.log('targetOption', targetOption.children);
// try {
// const res: any = await getCityList(targetOption.value as string);
// // console.log('城市列表', res);
// const cities = res.map((city: any) => ({
// value: city.areaId,
// label: city.areaName,
// }));
// targetOption.children = cities;
// // 更新 areaArray 状态
// setAreaArray([...areaArray]);
// } 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)
// }
// }
// };
// 定义 beforeUpload 函数
const beforeUpload = (file: any) => {
const isJpgOrPng = ['image/jpeg', 'image/png', 'image/bmp'].includes(file.type);
@ -138,6 +107,13 @@ export default function AppCompany(props: any) {
submitInfo(values)
};
useEffect(() => {
// console.log('认证数据',props.companyInfo);
if(props.companyInfo.companyName){
console.log('嘻嘻');
}
},[props.companyInfo])
return (
<div className='appInfoBox'>
{/* {contextHolder} */}
@ -170,26 +146,7 @@ export default function AppCompany(props: any) {
}} placeholder="请输入企业/机构名称" />
</Form.Item>
</div>
{/* <div className='appInfoFormInput' style={{
}}>
<div className='FormInputTitle'></div>
<Form.Item name="subName" label="" rules={[{ required: true, message: '请选择省市' },
]}>
<Cascader options={areaArray}
allowClear
style={{
width: '300px',
height: '42px',
}}
loadData={loadCityList}
placeholder="请选择省市"
changeOnSelect
/>
</Form.Item>
</div> */}
<div className='appInfoFormInput'>
<div className='FormInputTitle' style={{
}}><span style={{color:'red',}}>*</span></div>
@ -206,85 +163,7 @@ export default function AppCompany(props: any) {
</div>
</div>
{/* <div style={{
display: 'flex',
justifyContent: 'space-between',
width: '900px',
}}>
<div className='appInfoFormInput'>
<div className='FormInputTitle'>/</div>
<Form.Item name="vnum" label="" rules={[{ required: true, message: '请输企业/机构地址' },
]}>
<Input
allowClear
style={{
width: '300px',
height: '42px',
}} placeholder="请输入企业/机构地址" />
</Form.Item>
</div>
<div className='appInfoFormInput' style={{
}}>
<div className='FormInputTitle'></div>
<Form.Item name="appId" label="" rules={[{ required: true, message: '请选择成立日期' },
]}>
<DatePicker placeholder="请选择成立日期"
style={{
width: '300px',
height: '42px',
}}
locale={locale}
/>
</Form.Item>
</div>
</div> */}
{/* <div style={{
display: 'flex',
justifyContent: 'space-between',
width: '900px',
}}>
<div className='appInfoFormInput'>
<div className='FormInputTitle'></div>
<Form.Item name="runtype" label="" rules={[{ required: true, message: '请选择证件类型' },
]}>
<Select
allowClear
style={{
width: '300px',
height: '42px',
}}
options={[
// { value: '', label: '全部项目' },
{ value: '1', label: '类型1' },
{ value: '2', label: '类型2' },
{ value: '3', label: '类型3' },
]}
// defaultValue=""
placeholder={'请选择证件类型'}
/>
</Form.Item>
</div>
<div className='appInfoFormInput'>
<div className='FormInputTitle' style={{
}}></div>
<Form.Item name="type" label="" rules={[{ required: true, message: '请输入证件号' },
]}>
<Input
allowClear
style={{
width: '300px',
height: '42px',
}} placeholder="请输入证件号" />
</Form.Item>
</div>
</div> */}
<div style={{
display: 'flex',
justifyContent: 'space-between',

View File

@ -1,9 +1,13 @@
import { useState } from 'react'
import { Button, Form, Upload, message, } from "antd"
import { Button, Form, Upload, message, Modal } from "antd"
import { uploadFileUrl } from '../../../../request/request'
import { UploadOutlined } from '@ant-design/icons';
import './edit-app-files.css'
export default function EditAppFiles(props: any) {
// 源码文档弹窗
const [codeVisible, setCodeVisible] = useState(false)
// 软件文档弹窗
const [softVisible, setSoftVisible] = useState(false)
// 定义允许上传的文件格式
const ALLOWED_FILE_TYPES = ['.pdf', '.doc', '.docx', '.jpg', '.jpeg', '.png'];
const beforeUpload = (file: File) => {
@ -107,6 +111,8 @@ export default function EditAppFiles(props: any) {
<div className='appInfoFormBox' style={{
height: height,
justifyContent: 'flex-start',
// alignItems: 'center',
// background: 'pink',
flexDirection: 'column',
marginLeft: '100px',
paddingBottom: '0'
@ -180,7 +186,13 @@ export default function EditAppFiles(props: any) {
textWrap: 'nowrap'
}}>[ ]</a>
</div>
<a></a>
<a style={{
marginLeft: 58,
}}
onClick={() => {
setCodeVisible(true)
}}
></a>
</div>
<div>
<div className='appInfoFormInput' style={{
@ -225,7 +237,14 @@ export default function EditAppFiles(props: any) {
textWrap: 'nowrap'
}}>[ ]</a>
</div>
<a></a>
<a style={{
// background: 'red',
marginLeft: 58
}}
onClick={() => {
setSoftVisible(true)
}}
></a>
</div>
</div>
@ -272,6 +291,141 @@ export default function EditAppFiles(props: any) {
}}></Button>
</div>
<Modal title="应用软件源程序提交注意事项及相关规范"
centered
footer={null}
destroyOnClose
open={codeVisible}
width={1000}
onCancel={() => {
setCodeVisible(false)
}}>
<div style={{
lineHeight: '30px',
fontSize: '16px'
}}>
<div>
</div>
<div>
PDF格式的文件306030303030
</div>
<div>
116060
</div>
<div>
250
</div>
<div>
3
</div>
<div>
4
</div>
<div>
5
</div>
<div>
6
</div>
<div>
7
</div>
<div>
8/License/
</div>
<div>
9
</div>
<div>
10
</div>
<div>
11
</div>
<div>
12
</div>
</div>
</Modal>
<Modal title="应用软件文档提交注意事项及相关规范"
centered
footer={null}
destroyOnClose
open={softVisible}
width={1000}
onCancel={() => {
setSoftVisible(false)
}}>
<div style={{
lineHeight: '30px',
fontSize: '16px'
}}>
<div>
</div>
<div>
使PDF格式10-6060603030
</div>
<div>
1使使
</div>
<div>
2
</div>
<div>
3
</div>
<div>
4使使
</div>
<div>
5
</div>
<div>
6
</div>
<div>
7
</div>
<div>
8
</div>
<div>
9
</div>
<div>
10
</div>
<div>
11
</div>
<div>
12
</div>
</div>
</Modal>
</div>
)
}

View File

@ -125,7 +125,8 @@ export default function CONTRACT() {
<div style={{
height: height - 60,
background: 'white',
overflow: 'auto', marginTop: 18, marginBottom: -10
overflow: 'auto', marginTop: 18,
marginBottom: -10
}}>
{/* 表格 */}
<div style={{ display: contractArray.length > 0 ? 'block' : 'none', padding: 10 }}>

View File

@ -0,0 +1,10 @@
import React from 'react'
import './trademark-edit.css'
export default function TrademarkExpertEdit() {
const height = window.innerHeight - 180;
return (
<div className='trademarkExpertBox' style={{ height: `${height}px`, overflow: 'auto'}}>
</div>
)
}

View File

@ -0,0 +1,8 @@
.trademarkExpertBox {
margin-top: 18px;
background-color: rgb(255, 255, 255);
padding: 0px 19px 0px 19px;
box-sizing: border-box;
padding: 30px 45px 0 45px;
box-sizing: border-box;
}

View File

@ -1,8 +1,9 @@
import './index.css';
// import { MouseEvent, Reducer, useEffect, useReducer, useState, useContext } from "react";
import { MouseEvent, Reducer, useEffect, useReducer, useState } from "react";
import { MouseEvent, Reducer, useEffect, useReducer, useState, useContext } from "react";
import { useSelector, useDispatch } from 'react-redux'
import { useNavigate, useSearchParams, Outlet } from "react-router-dom";
import { GlobalDispatchContext, reloadUser } from "../../context/GlobalContext.ts";
import {
Modal,
// Row,
@ -21,7 +22,7 @@ import MenuWithBottomButtom from '../../components/menu/MenuWithBottomButton.tsx
// import MenuTreeWithTopButton from "../../components/menu/MenuTreeWithTopButton.tsx";
// import ListProj from "../../components/list/ListProj.tsx";
// import ListProjAgent from "../../components/list/ListProjAgent.tsx";
// import { getMenuActive } from '../../util/cache.ts'
import { getMenuActive } from '../../util/cache.ts'
import {
@ -53,10 +54,14 @@ import {
// downloadUrl,
post, getCouponUrl
} from '../../util/AjaxUtils.ts'
// import { getLanguageList, getSoftTypeList } from '../../request/api'
import { setMenuActive,
import {
// getLanguageList, getSoftTypeList
appGoodsList, buyAppGoods, appOrderList
} from '../../request/api'
import {
setMenuActive,
// getMenuActive
} from '../../util/cache.ts'
} from '../../util/cache.ts'
import gpsImg from '@theme/img/right/gps.png'
import backImg from '@theme/img/right/back.png'
// import { Link } from "react-router-dom";
@ -80,10 +85,10 @@ interface DataType {
}
// import app from '../../static/left/app.png'
// import appnew from '../../static/left/appnew.png'
// import tra from '../../static/left/tra.png'
// import tranew from '../../static/left/tranew.png'
import app from '../../static/left/app.png'
import appnew from '../../static/left/appnew.png'
import tra from '../../static/left/tra.png'
import tranew from '../../static/left/tranew.png'
import topblack from '../../static/appimgs/topblack.png'
import topblue from '../../static/appimgs/topblue.png'
@ -94,7 +99,7 @@ import firImg from '../../static/fir.png'
import noFirImg from '../../static/noFir.png'
export default function Index() {
const globalDispatchContext = useContext(GlobalDispatchContext);
// const height = window.innerHeight - 180;
const columns: TableColumnsType<DataType> = [
{
@ -880,7 +885,7 @@ export default function Index() {
const copyrightKeyWordshandleSearch = () => {
setCopyrightKeywords(copyrightNewKeywords)
}
const [specialPrice,setSpecialPrice] = useState(false) //商品特价标识
const [specialPrice, setSpecialPrice] = useState(false) //商品特价标识
const copyrightInit = () => {
setMinPrice(null)
setMaxPrice(null)
@ -906,11 +911,11 @@ export default function Index() {
copyrightLanguage: copyrightLanguage,
copyrightType: copyrightType,
// 新增特价标识
goodsFlag:specialPrice?'特价':''
goodsFlag: specialPrice ? '特价' : ''
}
})
}
}, [copyrightKeywords, minPrice, maxPrice, sort, copyrightDate, copyrightLanguage, copyrightType,specialPrice])
}, [copyrightKeywords, minPrice, maxPrice, sort, copyrightDate, copyrightLanguage, copyrightType, specialPrice])
// ----------------------------------------------------------------------------------------------
@ -971,13 +976,103 @@ export default function Index() {
// APP电子软著框是否显示----------------------------------------------------------------------------------------
const [appSearchBox, setAppSearchBox] = useState(false)
const [appKeyWords, setAppKeyWords] = useState('') // 电子软著搜索关键字
const [showAppkeyWords, setShowAppkeyWords] = useState('') // 电子软著搜索关键字显示
const [appModal, setAppModal] = useState(false) // 申请电子软著弹窗
const [toEditsModal, setToEditsModal] = useState(false) // 电子软著编辑弹窗
const [appGoodsArray, setAppGoodsArray] = useState<any>([]) // 电子软著可选商品列表
const [buyLoading, setBuyLoading] = useState(false) // 购买loading
const [appOrderId, setAppOrderId] = useState<any>() // 电子软著订单id
const [appExamineStatus, setAppExamineStatus] = useState<string | null>(null) // 电子软著审核状态
const [appApplyStatus, setAppApplyStatus] = useState<string | null>(null) // 电子软著申请状态
const appInit = () => {
setAppKeyWords('')
setShowAppkeyWords('')
setAppExamineStatus(null)
setAppApplyStatus(null)
}
const getAppOrderList = async (page: number) => {
try {
const res: any = await appOrderList({ page, keywords: '', rows: 10 })
dispath({
type: 'upAppGoodsListData',
val: 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)
}
} finally {
setLoading(false)
}
}
//电子软著点击搜索
const handleAppSearch = (value: string) => {
setAppKeyWords(value)
// nav('/app-electron', {
// state: {
// appKeyWords: value,
// }
// })
}
// 电子软著删除关键字
const handleAppChange = (e: any) => {
setShowAppkeyWords(e.target.value)
if (e.target.value == '') {
setAppKeyWords('')
}
}
useEffect(() => {
nav('/app-electron', {
state: {
appKeyWords: appKeyWords,
checkStatus: appExamineStatus,
appOrderStatus: appApplyStatus
}
})
}, [appKeyWords,appExamineStatus,appApplyStatus])
// 获取电子软著可选商品列表
const getAppGoodsList = async () => {
try {
const res = await appGoodsList()
// console.log('电子软著可选商品列表', res);
setAppGoodsArray(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 [trademarkBox, setTrademarkBox] = useState(false) // 申请商标弹窗
const [trademarkModal, setTrademarkModal] = useState(false) // 申请商标弹窗
// const [toRradeMarkModal, setToRradeMarkModal] = useState(false) // 申请商标编辑弹窗
// ----------------------------------------------------------------------------------------------------
const [correctionSearchBox, setCorrectionSearchBox] = useState(false)
@ -1155,16 +1250,17 @@ export default function Index() {
// app电子软著数组
const appGoodsArray = [
{ id: '1', title: '10个工作日下证', price: '500', back: 'black' },
{ id: '2', title: '3个工作日下证', price: '900', back: 'blue' },
{ id: '3', title: '1个工作日下证', price: '2599', back: 'black' },
{ id: '4', title: '当天下证', price: '3699', back: 'black' },
]
// const appGoodsArray = [
// { id: '1', title: '10个工作日下证', price: '500', back: 'black' },
// { id: '2', title: '3个工作日下证', price: '900', back: 'blue' },
// { id: '3', title: '1个工作日下证', price: '2599', back: 'black' },
// { id: '4', title: '当天下证', price: '3699', back: 'black' },
// ]
// 商标数组
const trademarkArray = [
{
id: '1', title: '智能申请注册', nowprice: '500',
id: '1', title: '智能申请注册', nowprice: '270',
old: true, //是否显示原价
oldprice: '318', //原价
cheap: true,//特价
@ -1611,7 +1707,7 @@ export default function Index() {
// getLanguageListDate()
// getSoftTypeListDate()
getAppGoodsList()
}, []);
useEffect(() => {
// loactionStorage里的activeMenu
@ -1875,7 +1971,7 @@ export default function Index() {
list={agentMenu.list}
handleListItem={agentMenu.handleListItem}
/> */}
{/* {THEME == 'mzw' ? (
{THEME == 'mzw' ? (
<>
<div style={{
background: getMenuActive() == 'APP' ? 'linear-gradient(90deg, #FF9F08 0%, #FF7331 100%)' : ' var(--color-menuback)',
@ -1948,7 +2044,7 @@ export default function Index() {
</>
) : (
<></>
)} */}
)}
{THEME == 'mzw' ? (
<MenuWithBottomButtom
button={sellMenu.button}
@ -3094,18 +3190,18 @@ export default function Index() {
value={copyrightType}
/>
<Button
icon={<img src={specialPrice?noFirImg:firImg} style={{ width: 15, height: 18 }} />}
icon={<img src={specialPrice ? noFirImg : firImg} style={{ width: 15, height: 18 }} />}
style={{
background: specialPrice?'#FF9F08':'#FFF6EF',
color: specialPrice?'white':'#FF9F00 ',
background: specialPrice ? '#FF9F08' : '#FFF6EF',
color: specialPrice ? 'white' : '#FF9F00 ',
marginLeft: 5, height: 31,
border:'1px solid #FF9F00 ',
border: '1px solid #FF9F00 ',
}}
onClick={()=>{
onClick={() => {
// 特价标识
setSpecialPrice(!specialPrice)
}}
>
>
</Button>
<Button
@ -3217,6 +3313,70 @@ export default function Index() {
setAppModal(true)
}}
></Button>
<Search
allowClear
placeholder='请输入关键字' value={showAppkeyWords}
onSearch={handleAppSearch}
onChange={handleAppChange}
style={{
// maxWidth: '200px',
width: '170px',
height: '31px',
marginLeft: '5px'
}}
>
</Search>
<Select
allowClear
placeholder='选择审核状态'
style={{
width: '130px',
height: '31px', marginLeft: 5,
}}
onChange={(value) => {
setAppExamineStatus(value)
}}
value={appExamineStatus}
options={[
{ value: '', label: '未提交' },
{ value: '0', label: '未通过' },
{ value: '1', label: '待审核' },
{ value: '2', label: '通过' },
]}
>
</Select>
<Select
allowClear
placeholder='选择申请状态'
style={{
width: '130px',
height: '31px', marginLeft: 5,
}}
onChange={(value) => {
setAppApplyStatus(value)
}}
value={appApplyStatus}
options={[
// { value: '0', label: '已取消' },
// { value: '1', label: '未付款' },
{ value: '2', label: '资料填写中' },
{ value: '3', label: '资料审核中' },
{ value: '4', label: '下线申请中' },
{ value: '5', label: '已下证' },
]}
>
</Select>
<Button style={{
marginLeft: 5, height: 31
}}
icon={<ClearOutlined />}
onClick={() => {
appInit()
}}></Button>
</div>
</div>
@ -3667,73 +3827,105 @@ export default function Index() {
centered
>
<div style={{
paddingBottom: 30,
paddingTop: 30
}}>
<Spin tip="正在购买..." size="small" spinning={buyLoading}>
<div style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
paddingBottom: 30,
paddingTop: 30
}}>
{appGoodsArray.map((item: any) => {
return (
<div className='appGoodsBox'
key={item.id}
style={{
background: item.back == 'black' ? '#F9F9F9 ' : '#DDECFF',
border: item.id == appGoodsId ? '1px solid #f19e31' : '',
boxShadow: item.id == appGoodsId ? '5px 5px 10px rgb(114, 114, 114)' : '',
marginTop: item.id == appGoodsId ? -20 : 0,
}}
onClick={() => {
setAppGoodsId(item.id)
}}
>
<div className='appGoodsTop'>
<div className='appgoodsTitle'
style={{
color: item.back == 'black' ? '#E2B682' : '#FFFFFF',
backgroundImage: item.back == 'black' ? `url(${topblack})` : `url(${topblue})`,
}}
>
{item.title}
</div>
<div style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
}}>
{appGoodsArray.map((item: any, index: number) => {
return (
<div className='appGoodsBox'
key={item.dataId}
style={{
background: item.back == 'black' ? '#F9F9F9 ' : '#DDECFF',
border: item.dataId == appGoodsId ? '1px solid #f19e31' : '',
boxShadow: item.dataId == appGoodsId ? '5px 5px 10px rgb(114, 114, 114)' : '',
marginTop: item.dataId == appGoodsId ? -20 : 0,
}}
onClick={() => {
setAppGoodsId(item.dataId)
// console.log('item.dataId: ', item.dataId);
</div>
<div className='appGoodsBot'>
<div className='appgoodsPrice' style={{
color: item.back == 'black' ? '#835114' : '#233E9E',
}}>
<span></span>
<span style={{
fontSize: 42,
}}>{item.price}</span>
<span>/</span>
}}
>
<div className='appGoodsTop'>
<div className='appgoodsTitle'
style={{
color: index !== 1 ? '#E2B682' : '#FFFFFF',
backgroundImage: index !== 1 ? `url(${topblack})` : `url(${topblue})`,
}}
>
{item.dataSummary}
</div>
</div>
<div className='appGoodsBot'>
<div className='appgoodsPrice' style={{
color: index !== 1 ? '#835114' : '#233E9E',
}}>
<span></span>
<span style={{
fontSize: 42,
}}>{item.dataName / 100}</span>
<span>/</span>
</div>
</div>
</div>
</div>
)
)
})}
})}
</div>
<div className='appGoodsBtnBox'>
<div className='appGoodsBtn' onClick={async () => {
if (appGoodsId) {
// alert('开发中')
// 创建按订单 如果成功 询问是否继续编辑
// setAppGoodsId('')
try {
setBuyLoading(true)
const res = await buyAppGoods(appGoodsId)
setAppOrderId(res.data)
setBuyLoading(false)
setAppModal(false)
getAppOrderList(1)
setToEditsModal(true)
appInit()
reloadUser(messageApi, globalDispatchContext).then(() => {
messageApi.success('扣款成功');
});
// 更新redux中的appGoodsListAray
} 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)
}
}
return
} else {
messageApi.error('请选择商品')
}
}}></div>
</div>
</div>
<div className='appGoodsBtnBox'>
<div className='appGoodsBtn' onClick={() => {
if (appGoodsId) {
// alert('开发中')
// 创建按订单 如果成功 询问是否继续编辑
setAppGoodsId('')
setAppModal(false)
setToEditsModal(true)
} else {
messageApi.error('请选择商品')
}
}}></div>
</div>
</div>
</Spin>
</Modal>
<Modal
title="提示"
@ -3746,7 +3938,7 @@ export default function Index() {
// okButtonProps={{ style: { background: 'red', color: 'white' } }}
onOk={() => {
setToEditsModal(false)
nav('/app-edit/dajsdkjakdl')
nav(`/app-edit/${appOrderId}`)
}}
// 设置确定和取消得文字
okText="编辑"
@ -3758,6 +3950,7 @@ export default function Index() {
>
<div>,</div>
</Modal>
<Modal
title="申请商标"
destroyOnClose={true}
@ -3831,6 +4024,10 @@ export default function Index() {
<div className='trademarkNowPrice'>
<span></span>
<span style={{ fontSize: 42 }}>{item.nowprice}</span>
<span style={{
// 数组第一个才显示
display: item.old ? 'unset' : 'none'
}}></span>
</div>
<div className='trademarkOldPrice' style={{
display: item.old ? 'unset' : 'none'
@ -3869,9 +4066,13 @@ export default function Index() {
}}
onClick={() => {
console.log(item.nowprice);
setTrademarkModal(false)
nav('/trademark-expert-edit')
console.log('简单');
}}
></div>
></div>
</div>
</div>
<div style={{
@ -3894,9 +4095,9 @@ export default function Index() {
}}
onClick={() => {
console.log(item.nowprice);
console.log('复杂');
}}
></div>
></div>
</div>
</div>
</div>

View File

@ -4,6 +4,7 @@ import ProductRelease from '../route/ProductRelease/ProductRelease.tsx'
import AppElectron from '../route/AppElectron/AppElectron.tsx'
import AppEdit from '../route/AppElectron/AppEdit.tsx'
import TrademarkMall from '../route/TrademarkMall/TrademarkMall.tsx'
import TrademarkExpertEdit from '../route/TrademarkMall/TrademarkExpertEdit.tsx'
import TransactionOrder from '../route/TransactionOrder/TransactionOrder.tsx'
import CopyrightGgoods from '../route/CopyrightGgoods/CopyrightGgoods.tsx'
import TradingGoods from '../route/TradingGoods/TradingGoods.tsx'
@ -226,13 +227,17 @@ export const router = createHashRouter(
element: <AppElectron/>
},
{
path: '/app-edit/:appId',
path: '/app-edit/:appOrderId',
element: <AppEdit/>
},
{
path: '/trademark-mall',
element: <TrademarkMall/>
},
{
path:'/trademark-expert-edit',
element:<TrademarkExpertEdit/>
},
{
path: '/transaction-order',
element: <TransactionOrder />

View File

@ -9,22 +9,23 @@ const baseState = {
// val: ''
// },
belongArray: [],
refunArray:[],
correctionArray:[],
contractArray:[],
contractTotal:0,
refunTotal:0,
correctionTotal:0,
couponModal:false,
projName:'',
projStatus:'',
newRefun:false,
newCorrection:false,
packNum:{
ALL:0,
MATERIAL:0,
refunArray: [],
correctionArray: [],
contractArray: [],
contractTotal: 0,
refunTotal: 0,
correctionTotal: 0,
couponModal: false,
projName: '',
projStatus: '',
newRefun: false,
newCorrection: false,
packNum: {
ALL: 0,
MATERIAL: 0,
},
phoneModal:false,
phoneModal: false,
appGoodsListData: {},
}
// 创建仓库
@ -78,9 +79,12 @@ const reducer = (state = baseState, action: any) => {
if (action.type == 'upPackNum') {
nstate.packNum = action.val
}
if(action.type == 'changePhoneModal'){
if (action.type == 'changePhoneModal') {
nstate.phoneModal = action.val
}
if (action.type == 'upAppGoodsListData') {
nstate.appGoodsListData = action.val
}
return nstate
}
const store = createStore(reducer)