system-copyright-react/src/route/proj/ProjEditAll.tsx
2024-07-15 16:58:47 +08:00

1057 lines
46 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import './proj-edit.css';
// import {Link, useNavigate, useParams} from "react-router-dom";
import { useNavigate, useParams } from "react-router-dom";
import {
Button,
// FloatButton,
message, Modal,
Tag, Upload,
// GetProp,
UploadProps,
} from "antd";
import { UploadOutlined } from '@ant-design/icons';
import TextArea from "antd/es/input/TextArea";
import StepProjEdit from "../../components/step/StepProjEdit.tsx";
import CardProjEdit from "../../components/card/CardProjEdit.tsx";
import { Process } from "../../interfaces/step/IStepProj.ts";
import CardProjLoading from "../../components/card/CardProjLoading.tsx";
import CardProjResult from "../../components/card/CardProjResult.tsx";
import CardProjDownload from "../../components/card/CardProjDownload.tsx";
import CardProjJump from "../../components/card/CardProjJump.tsx";
import { useEffect, useState } from "react";
import { Axios, get, put, post, uploadFileUrl, DevUserId, downloadUrl } from "../../util/AjaxUtils.ts";
import { EditStepEnum, IProjEdit } from "../../interfaces/card/ICardProj.ts";
import { MIN_MOD_SIZE } from "./edit/ProjConfigModList.tsx";
import { GenerateStatus } from "../../interfaces/proj/IProj.ts";
// import AiHelper from "../../components/ai/AiHelper.tsx";
import TitleIntroduction from '../../route/proj/edit/ProjEditStep1.tsx'
import TitleIntroductionShow from '../../route/proj/edit/ProjEditStep1Show.tsx'
import SoftwareInfo from '../../route/proj/edit/ProjEditStep2.tsx'
import SoftwareInfoShow from '../../route/proj/edit/ProjEditStep2Show.tsx'
import SoftwareFeatures from '../../route/proj/edit/ProjEditStep3.tsx'
import SoftwareFeaturesShow from '../../route/proj/edit/ProjEditStep3Show.tsx'
import LoginPage from '../../route/proj/edit/ProjConfigLoginpage.tsx'
import LoginPageShow from '../../route/proj/edit/ProjConfigLoginpageShow.tsx'
import SoftwareManagement from '../../route/proj/edit/ProjConfigModList.tsx'
import SoftwareManagementShow from '../../route/proj/edit/ProjConfigModListShow.tsx'
import DisplayOrder from '../../route/proj/edit/ProjConfigMenuList.tsx'
import DisplayOrderShow from '../../route/proj/edit/ProjConfigMenuListShow.tsx'
// import aiGif from '../../static/ai.gif'
// type AiHelperType = {
// projId: string;
// projIntroduction: string;
// projDesc: string;
// projMods: ProjModType[];
// }
// type ProjModType = {
// name: string,
// desc: string
// }
// type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0];
export default function ProjEditAll() {
// 回复信息
const [aContent, setaContent] = useState('')
// 回复问题的id
const [projMaterialsAddId, setprojMaterialsAddId] = useState('')
// 上传附件
const [uploadedFiles, setUploadedFiles] = useState<any[]>([]);
// 接口需要的文件id数组
// const [aFiles, setAFiles] = useState<string[]>([])
const props: UploadProps = {
maxCount: 6,//上传限制最多6个
action: uploadFileUrl(),
headers: {
'X-USER-ID': DevUserId,
},
// headers={{'X-USER-ID': DevUserId}}
beforeUpload: (file) => {
const isPNG = file.type === 'application/pdf';
if (!isPNG) {
message.error('只能上传 PDF 格式文件!');
return Upload.LIST_IGNORE; // 不允许上传非PDF文件
}
// return isPNG || Upload.LIST_IGNORE;
// 检查是否已经上传过相同文件
const isDuplicate = uploadedFiles.some(uploadedFile => (
uploadedFile.name === file.name && uploadedFile.size === file.size
));
if (isDuplicate) {
message.error('文件已经存在,请勿重复上传!');
return Upload.LIST_IGNORE; // 不允许上传重复文件
}
return true; // 允许上传文件
},
onChange: (info) => {
console.log(info.fileList);
if (info.file.status === 'done') {
message.success('上传成功');
// info.file.name = '协议文件';
console.log('列表', info.fileList);
setUploadedFiles([...uploadedFiles, info.file]); // 将上传成功的文件信息添加到列表中
// setUploadSignFileId(info.file.response.data.fileId);
} else if (info.file.status === 'error') {
message.error('上传失败');
}
},
// action={uploadFileUrl()}
};
// const [uploadSignFileId, setUploadSignFileId] = useState('');
//第一步 标题简介弹窗
const [titleIntroductionOpen, setTitleIntroductionOpen] = useState(false)
const [titleIntroductionShowOpen, setTitleIntroductionShowOpen] = useState(false)
//第二步 软件基本信息弹窗
const [softwareInfoOpen, setSoftwareOpen] = useState(false)
const [softwareInfoShowOpen, setSoftwareShowOpen] = useState(false)
// 第三步 软件功能特点弹窗
const [softwareFeaturesOpen, setSoftwareFeaturesOpen] = useState(false)
const [softwareFeaturesShowOpen, setSoftwareFeaturesShowOpen] = useState(false)
// 第四步 登陆页面设置
const [loginPageOpne, setLoginPageOpne] = useState(false)
const [loginPageShowOpne, setLoginPageShowOpne] = useState(false)
// 第五步 软件功能管理
const [softwareManagementOpen, setSoftwareManagementOpen] = useState(false)
const [softwareManagementShowOpen, setSoftwareManagementShowOpen] = useState(false)
// 第六步 显示顺序
const [displayOrderOpen, setDisplayOrderOpen] = useState(false)
const [displayOrderShowOpen, setDisplayOrderShowOpen] = useState(false)
// 判断是否完成状态 成功未处理/失败/正在处理
// 模块数量
// const [projModCount, setprojModCount] = useState(0)
const height = window.innerHeight - 180;
const nav = useNavigate();
const pathParams = useParams();
// 是否显示下载代码压缩包模块
// const [showZpi, setShowZpi] = useState(false)
const [messageApi, contextHolder] = message.useMessage();
const [editStepArray, setEditStepArray] = useState<IProjEdit[]>([]);
const [configArray, setConfigArray] = useState<IProjEdit[]>([]);
const [isEditStepEdited, setIsEditStepEdited] = useState(false);
const [isConfigEdited, setIsConfigEdited] = useState(false);
const [canGenerate, setCanGenerate] = useState(false);
const [generateStatus, setGenerateStatus] = useState(GenerateStatus.NONE);
const [generateEmainingTime, setGenerateEmainingTime] = useState(0);
const [isGenerateModalOpen, setIsGenerateModalOpen] = useState(false);
const [previewUrl, setPreviewUrl] = useState('');
const [generateErrorModal, setGenerateErrorModal] = useState(false);
const [generateErrorMsg, setGenerateErrorMsg] = useState('');
const [aiHelperModalOpen, setAiHelperModalOpen] = useState(false);
// const [aiHelper, setAiHelper] = useState<AiHelperType>({
// projId: '',
// projIntroduction: '',
// projDesc: '',
// projMods: [],
// });
// 点击回复弹窗
const [replyModal, setReplyModal] = useState(false)
// const height = window.innerHeight - 240;
const renderEditStep = (data: any, isEdited: boolean) => {
console.log('嘻嘻', data);
// projIntroduction
const editStepArray: IProjEdit[] = [];
editStepArray.push(
{
title: '第1步:软件简介确认',
desc: '修改软件系统的相关简介与详细介绍',
step: 1,
// btnName: !isGenerateSuccess ? '设置' : '查看',
btnName: '查看',
status: data.projIntroduction ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
// if (!isGenerateSuccess) {
// // nav(`/proj-edit/step1/${pathParams.projId}`)
// setTitleIntroductionOpen(true)
// } else {
// nav(`/proj-edit/step1-show/${pathParams.projId}`)
setTitleIntroductionShowOpen(true)
// }
}
},
{
title: '第2步:软件基本信息填写',
desc: '完善软件简称、版本号、软件所属者及联系人等信息',
step: 2,
// btnName: !isGenerateSuccess ? '设置' : '查看',
btnName: '查看',
status: data.apply.projDevCompleteDate ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
// if (generateStatus != GenerateStatus.SUCCESS) {
// if (!isGenerateSuccess) {
// // nav(`/proj-edit/step2/${pathParams.projId}`)
// setSoftwareOpen(true)
// } else {
// nav(`/proj-edit/step2-show/${pathParams.projId}`)
setSoftwareShowOpen(true)
// }
}
},
{
title: '第3步:软件功能特点设置',
desc: '设置软件相关功能特点',
step: 3,
btnName: '查看',
status: data.apply.envHardDev ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
// if (!isGenerateSuccess) {
// // nav(`/proj-edit/step3/${pathParams.projId}`)
// setSoftwareFeaturesOpen(true)
// } else {
// nav(`/proj-edit/step3-show/${pathParams.projId}`)
setSoftwareFeaturesShowOpen(true)
// }
}
},
{
title: '第4步:登录页面设置',
desc: '对登录界面进行个性化设置,包括背景图片等',
step: 1,
btnName: '查看',
// 状态判断lyp
status: data.loginpage.loginpageId ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
// if (!isGenerateSuccess) {
// // nav(`/proj-edit/config-loginpage/${pathParams.projId}`)
// setLoginPageOpne(true)
// } else {
// nav(`/proj-edit/config-loginpage-show/${pathParams.projId}`)
setLoginPageShowOpne(true)
// }
}
},
// {
// title: '著作人信息',
// desc: '请完善著作人相关信息',
// step: 4,
// btnName: !isGenerateSuccess ? '设置' : '查看',
// status: editSteps[3].editStatus,
// handleEdit() {
// if (!isGenerateSuccess) {
// nav(`/proj-edit/step4/${pathParams.projId}`)
// } else {
// nav(`/proj-edit/step4-show/${pathParams.projId}`)
// }
// }
// },
// {
// title: '申请人信息',
// desc: '请完善申请人信息',
// step: 5,
// btnName: !isGenerateSuccess ? '设置' : '查看',
// status: editSteps[4].editStatus,
// handleEdit() {
// if (!isGenerateSuccess) {
// nav(`/proj-edit/step5/${pathParams.projId}`)
// } else {
// nav(`/proj-edit/step5-show/${pathParams.projId}`)
// }
// }
// },
// {
// title: '选择登录页面',
// desc: '选择软件的登录页面模板',
// step: 6,
// btnName: !isGenerateSuccess ? '设置' : '查看',
// status: editSteps[5].editStatus,
// handleEdit() {
// if (!isGenerateSuccess) {
// nav(`/proj-edit/step6/${pathParams.projId}`)
// } else {
// nav(`/proj-edit/step6-show/${pathParams.projId}`)
// }
// }
// }
)
setEditStepArray(editStepArray);
setIsEditStepEdited(isEdited);
}
const renderSetting = (data: any, isConfig: boolean) => {
const configArray: IProjEdit[] = [];
configArray.push(
// {
// title: '登录界面设置',
// desc: '请对登录界面完成个性化设置',
// step: 1,
// btnName: !isGenerateSuccess ? '设置' : '查看',
// status: data.loginpage.loginpageId ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
// handleEdit() {
// if (!isGenerateSuccess) {
// nav(`/proj-edit/config-loginpage/${pathParams.projId}`)
// } else {
// nav(`/proj-edit/config-loginpage-show/${pathParams.projId}`)
// }
// }
// },
{
title: '第5步:对软件功能进行管理',
desc: '可对软件功能列表进行添加与修改',
step: 2,
btnName: '查看',
status: data.projModCount >= MIN_MOD_SIZE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
// if (!isGenerateSuccess) {
// // nav(`/proj-edit/config-mod-list/${pathParams.projId}`)
// setSoftwareManagementOpen(true)
// } else {
// nav(`/proj-edit/config-mod-list-show/${pathParams.projId}`)
setSoftwareManagementShowOpen(true)
// }
}
},
{
title: '第6步:设置功能列表显示顺序',
desc: '调整菜单顺序',
step: 3,
btnName: '查看',
status: data.projModCount >= MIN_MOD_SIZE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() {
// if (!isGenerateSuccess) {
// // nav(`/proj-edit/config-menu-list/${pathParams.projId}`)
// setDisplayOrderOpen(true)
// } else {
// nav(`/proj-edit/config-menu-list-show/${pathParams.projId}`)
setDisplayOrderShowOpen(true);
// }
}
}
)
setConfigArray(configArray);
setIsConfigEdited(isConfig);
}
const renderData = () => {
get<any>({
messageApi: messageApi,
url: `/api/proj/get/${pathParams.projId}`,
onSuccess({ data }) {
console.log('状态判断', data.pay.chargeAdditionals);
// setShowZpi(true)
// const isShow = data.pay.chargeAdditionals.includes('PKG')
// console.log(isShow);
// if (isShow) {
// setShowZpi(true)
// } else {
// setShowZpi(false)
// }
// const isEdited = data.editSteps[0].editStatus == EditStepEnum.EDITED
// && data.editSteps[1].editStatus == EditStepEnum.EDITED
// && data.editSteps[2].editStatus == EditStepEnum.EDITED
// && data.editSteps[3].editStatus == EditStepEnum.EDITED
// && data.editSteps[4].editStatus == EditStepEnum.EDITED
// && data.editSteps[5].editStatus == EditStepEnum.EDITED;
// setprojModCount(data.projModCount)
const isEdited = Boolean(data.projIntroduction) == true && Boolean(data.apply.projDevCompleteDate) == true && Boolean(data.apply.envHardDev) == true && Boolean(data.loginpage.loginpageId) == true
// console.log('isEdited',isEdited);
const isConfig = data.loginpage.loginpageId && data.projModCount >= MIN_MOD_SIZE;
const isGenerate = isEdited && isConfig;
// const isGenerateSuccess: boolean = data.generate.generateStatus == GenerateStatus.SUCCESS || data.generate.generateStatus == GenerateStatus.GENERATING;
renderEditStep(data, isEdited);
renderSetting(data, isConfig,);
setCanGenerate(isGenerate);
setGenerateStatus(data.generate.generateStatus);
setPreviewUrl(data.previewUrl);
setGenerateEmainingTime(data.generate.generateEmainingTime);
setGenerateErrorMsg(data.generate.generateMsg);
// setAiHelper({
// projId: data.projId,
// projIntroduction: data.projIntroduction,
// projDesc: data.projDesc,
// projMods: data.projMods
// })
// setAiHelperModalOpen(!data.projIntroduction || !data.projDesc)
}
})
}
const [questionList, setQuestionList] = useState<any[]>([])
// 获取问题及回复列表
const getQuestionList = () => {
get<any>({
messageApi: messageApi,
url: `/api/proj/materials/add/listpage/${pathParams.projId}`,
onSuccess({ data }) {
console.log('问题列表', data);
setQuestionList(data.rows)
// console.log(JSON.parse(data.rows[0].aFiles));
}
})
}
useEffect(() => {
renderData();
getQuestionList()
}, [])
return (
<div className='proj-edit-box' style={{ height: `${height}px`, overflow: 'auto' }}>
{contextHolder}
{/* <Breadcrumb
items={[
{title: <Link to={'/'}>首页</Link>},
{title: <Link to={'/proj-create'}>创建项目</Link>},
{title: '编辑项目'},
]}
/> */}
{/* <div className="proj-edit" style={{height: `${height}px`}}> */}
<div className="proj-edit" style={{}}>
<StepProjEdit step={1} process={isEditStepEdited ? Process.COMPLETE : Process.PROCESSING}
descTitle="完善信息"
descDetail="完善项目的基本信息"
hasNext={true}>
{
editStepArray.map((item, index) => {
return <CardProjEdit key={`editStep-${index}`}
title={item.title}
desc={item.desc}
status={item.status}
btnName={item.btnName}
handleEdit={item.handleEdit}
background={item.status == EditStepEnum.EDITED ? '#F5FAFE' : '#f3f3f3'}
shadow={item.status == EditStepEnum.EDITED ? '0px 3px 0px 0px rgba(55,144,215,0.18)' : ''}
/>
})
}
</StepProjEdit>
{/*trueisEditStepEdited*/}
<StepProjEdit step={2}
process={!isEditStepEdited ? Process.PENDING : (isConfigEdited ? Process.COMPLETE : Process.PROCESSING)}
descTitle="功能设置"
descDetail="设置系统的菜单功能" hasNext={true}>
{
configArray.map((item, index) => {
return <CardProjEdit key={`config-${index}`}
title={item.title}
desc={item.desc}
btnName={item.btnName}
canBtnClick={true}
status={item.status}
handleEdit={item.handleEdit}
background={item.status == EditStepEnum.EDITED ? '#F5FEFA' : '#f3f3f3'}
shadow={item.status == EditStepEnum.EDITED ? ' 0px 3px 0px 0px rgba(55,215,138,0.18)' : ''}
/>
})
}
{
isEditStepEdited && isConfigEdited ? (
<CardProjJump title="预览系统"
desc="点击查看预览系统"
canBtnClick={true}
handleJump={() => {
window.open(`${Axios.defaults?.baseURL}/${previewUrl}`, '_blank')
}}
/>
) : <></>
}
</StepProjEdit>
<StepProjEdit step={3}
process={generateStatus == GenerateStatus.SUCCESS ? Process.COMPLETE : (canGenerate ? Process.PROCESSING : Process.PENDING)}
descTitle="资料生成"
hasNext={true}>
{
generateStatus == GenerateStatus.NONE || generateStatus == GenerateStatus.FAILED ? (
<CardProjEdit title="第8步:资料生成"
desc="生成软著所需要的资料,此操作后项目无法再次编辑"
btnName="生成"
status={EditStepEnum.UN_EDIT}
canBtnClick={canGenerate}
handleEdit={() => {
setIsGenerateModalOpen(true);
// setTimeout(() => {
// window.location.reload();
// }, 1000)
}}
// background = {status == EditStepEnum.EDITED?'#F5FAFE':'#f3f3f3'}
// shadow = {status == EditStepEnum.EDITED?'0px 3px 0px 0px rgba(55,144,215,0.18)':''}
background='#f3f3f3'
/>
) : <></>
}
{
generateStatus == GenerateStatus.PENDING ? (
<CardProjLoading title="正在排队"
desc="资料正在排队"
duration={generateEmainingTime}
handleCountDownOver={() => {
setTimeout(() => {
window.location.reload();
}, 1000)
}}
/>
) : <></>
}
{
generateStatus == GenerateStatus.GENERATING ? (
<CardProjLoading title="正在生成"
desc="资料正在生成,点击刷新"
duration={generateEmainingTime}
handleClick={() => {
renderData();
}}
handleCountDownOver={() => {
renderData();
}}
/>
) : <></>
}
{
generateStatus == GenerateStatus.SUCCESS ? (
<CardProjResult title="生成成功"
isSuccess={true}
/>
) : <></>
}
{
generateStatus == GenerateStatus.FAILED ? (
<CardProjResult title="生成失败"
isSuccess={false}
handleFeedback={() => {
setGenerateErrorModal(true);
console.log('反馈')
}}
/>
) : <></>
}
</StepProjEdit>
<StepProjEdit step={4}
process={generateStatus == GenerateStatus.SUCCESS ? Process.PROCESSING : Process.PENDING}
descTitle="资料下载">
<CardProjDownload title="申请表"
desc="点击下载申请表"
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/apply/${pathParams.projId}`)
}}
/>
<CardProjDownload title="操作手册"
desc="点击下载操作手册"
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/manual/${pathParams.projId}`)
}}
/>
{/* {showZpi && ( */}
<CardProjDownload title="代码压缩包"
desc="点击下载代码压缩包"
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/code-zip/${pathParams.projId}`)
}}
/>
{/* )} */}
{/* <CardProjDownload title="代码压缩包"
desc="点击下载代码压缩包"
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/code-zip/${pathParams.projId}`)
}}
/> */}
<CardProjDownload title="源代码"
desc="点击下载源代码"
canBtnClick={generateStatus == GenerateStatus.SUCCESS}
handleDownload={() => {
window.open(`${Axios.defaults?.baseURL}/route/proj/download/code/${pathParams.projId}`)
}}
/>
{/*<CardProjJump title="找代理"*/}
{/* desc="到软著代理完成软著申请"*/}
{/* handleJump={() => {*/}
{/* nav(`/agent-select/${pathParams.projId}`);*/}
{/* }}*/}
{/*/>*/}
</StepProjEdit>
<div className='editAll-box' >
<div className='editAll-box-title'>
</div>
<div style={{ display: questionList.length == 0 ? 'block' : 'none' }} className='editAll-boxNo-con'>
</div>
<div style={{ marginTop: 50, maxHeight: `${height - 230}px`, overflow: 'auto' }}>
{questionList.length == 0 ? (<>
</>) : (<>
{questionList.map((item, index) => (
<div key={index} className='editAll-box-con'>
<div className='question'>
<div></div>
<div className='questionStatus'>
<Tag color={item.status == 'NONE' ? '#108ee9' : item.status == 'PASSED' ? '#87d068' : item.status == 'UN_PASSED' ? '#f50' : item.status == 'PENDING' ? '#2db7f5' : ''}>
{item.status == 'NONE' ? '未回复' : item.status == 'PASSED' ? '通过' : item.status == 'UN_PASSED' ? '未通过' : item.status == 'PENDING' ? '待审核' : ''}
</Tag>
</div>
</div>
<div className='boxtextTop'>
<div style={{ maxHeight: '140px', overflow: 'auto', fontSize: 16 }}>
{item.qContent}
</div>
<div className='unReason' style={{ display: item.status == 'UN_PASSED' ? 'block' : 'none' }}>:{item.reason}</div>
<div className='fileBox' >
<a style={{ cursor: 'pointer' }} onClick={() => {
window.open(downloadUrl(item.qFiles))
}}>{item.qFiles}</a>
</div>
</div>
<div className='boxtitle' style={{}}></div>
<div className='boxtextBot'>
<div style={{ maxHeight: '100px', overflow: 'auto', fontSize: 16 }}>{item.aContent}</div>
<div className='fileBox'>
{JSON.parse(item.aFiles).map((fileName: string, index: number) => (
<span key={index}>
<a style={{ cursor: 'pointer', }} onClick={() => {
window.open(downloadUrl(fileName))
}}>{fileName} </a>
<span style={{marginRight:5, visibility: index + 1 == JSON.parse(item.aFiles).length ? 'hidden' : 'visible' }}>,</span>
</span>
))}
</div>
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
<Button style={{ marginTop: '8px', display: item.status == 'PASSED' ? 'none' : 'block' }} onClick={() => {
setReplyModal(true)
setprojMaterialsAddId(item.projMaterialsAddId)
setUploadedFiles([])//清除
setaContent('')
}}></Button>
</div>
</div>
</div>
))}
</>)}
{/* <div className='editAll-box-con' >
<div className=' question'>
<div>提问</div>
<div className='questionStatus'>
<Tag color="magenta">未通过</Tag>
</div>
</div>
<div className='boxtextTop'>
<div style={{ maxHeight: '140px', overflow: 'auto', fontSize: 16 }}>嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻</div>
<div className='fileBox'>文件1,文件2</div>
</div>
<div className='boxtitle'>回复</div>
<div className='boxtextBot'>
<div style={{ maxHeight: '100px', overflow: 'auto', fontSize: 16 }}>哈哈哈哈哈哈哈哈</div>
<div className='fileBox'>文件1,文件2</div>
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
<Button style={{ marginTop: '8px' }} onClick={() => {
setReplyModal(true)
}}>回复</Button>
</div>
</div>
</div> */}
</div>
</div>
</div>
<div className="btn-container">
<Button size="large" style={{
width: '200px',
height: '40px',
fontSize: '16px',
backgroundColor: 'white',
// color: '#A0A0A0',
// border: 'none',
}} onClick={() => {
nav(-1);
}}></Button>
</div>
{/* <FloatButton.Group>
<FloatButton
shape="square" //报错处理
onClick={() => { setAiHelperModalOpen(true) }}
description={<span style={{ fontWeight: 'bold' }}>AI</span>}
>AI助手</FloatButton>
</FloatButton.Group> */}
{/* <div className='aiImg' onClick={() => { setAiHelperModalOpen(true) }}>
<img src={aiGif} alt="" width={'100%'} height={'100%'} />
</div> */}
<Modal title="提示"
okText="确定"
cancelText="取消"
open={isGenerateModalOpen}
onOk={() => {
setTimeout(() => {
window.location.reload();
}, 1000)
post({
messageApi,
url: `/api/proj/generate/proj-id/${pathParams.projId}`,
body: {},
onSuccess() {
messageApi.success('提交成功');
setIsGenerateModalOpen(false);
renderData();
}
})
}}
onCancel={() => {
setIsGenerateModalOpen(false);
}}>
<div>便</div>
</Modal>
<Modal open={generateErrorModal}
title="出错信息"
okText="确定"
cancelText={false}
footer={false}
okButtonProps={{
style: {
backgroundColor: 'var(--color-primary)',
}
}}
onCancel={() => {
setGenerateErrorModal(false)
}}
>
<p style={{ color: 'var(--color-red)' }}>{generateErrorMsg}</p>
</Modal>
<Modal open={aiHelperModalOpen}
title=""
width={1200}
footer={false}
maskClosable={false}
destroyOnClose={true}
onCancel={() => {
setAiHelperModalOpen(false);
renderData()
// setAiHelperModalOpen(false);
// console.log(123);
}}
>
{/* <div style={{ height: `${height - 20}px`, overflow: 'hidden', }}>
<AiHelper
projId={aiHelper.projId}
projIntroduction={aiHelper.projIntroduction}
projDesc={aiHelper.projDesc}
isFree={false}
renderData={() => {
renderData()
}}
/>
</div> */}
</Modal>
{/* 第1步设置 */}
<Modal open={titleIntroductionOpen}
title="软件简介确认"
width={1500}
destroyOnClose={true}
onCancel={() => {
setTitleIntroductionOpen(false);
// setTimeout(() => {
// window.location.reload()
// }, 500)
}}
footer={null}
>
<TitleIntroduction closeModal={() => {
setTitleIntroductionOpen(false)
renderData()
}}></TitleIntroduction>
</Modal>
{/* 第1步查看 */}
<Modal open={titleIntroductionShowOpen}
destroyOnClose={true}
title="软件简介查看"
width={1500}
onCancel={() => {
setTitleIntroductionShowOpen(false);
}}
footer={null}
>
<TitleIntroductionShow></TitleIntroductionShow>
</Modal>
{/* 第二步设置 */}
<Modal open={softwareInfoOpen}
title="软件基本信息填写"
width={1500}
destroyOnClose={true}
onCancel={() => {
setSoftwareOpen(false);
// setTimeout(() => {
// props.closeModal()
// window.location.reload(); // 刷新页面
// }, 1000);
// setTimeout(() => {
// window.location.reload()
// }, 500)
}}
footer={null}
>
<SoftwareInfo closeModal={() => {
setSoftwareOpen(false)
renderData()
}}></SoftwareInfo>
</Modal>
{/* 第二步查看 */}
<Modal open={softwareInfoShowOpen}
title="软件基本信息查看"
width={1500}
destroyOnClose={true}
onCancel={() => {
setSoftwareShowOpen(false);
}}
footer={null}
>
<SoftwareInfoShow></SoftwareInfoShow>
</Modal>
{/* 第三步 设置 */}
<Modal open={softwareFeaturesOpen}
title="软件功能特点设置"
width={1500}
destroyOnClose={true}
onCancel={() => {
setSoftwareFeaturesOpen(false);
// setTimeout(() => {
// window.location.reload()
// }, 500)
}}
footer={null}
>
<SoftwareFeatures closeModal={() => {
setSoftwareFeaturesOpen(false)
renderData()
}}></SoftwareFeatures>
</Modal>
{/* 第三步 查看 */}
<Modal open={softwareFeaturesShowOpen}
title="软件功能特点查看"
width={1500}
destroyOnClose={true}
onCancel={() => {
setSoftwareFeaturesShowOpen(false);
}}
footer={null}
>
<SoftwareFeaturesShow ></SoftwareFeaturesShow>
</Modal>
{/* 第四步 设置 */}
<Modal open={loginPageOpne}
title="登陆页面设置"
width={1700}
destroyOnClose={true}
onCancel={() => {
setLoginPageOpne(false);
// setTimeout(() => {
// window.location.reload()
// }, 500)
}}
footer={null}
>
<LoginPage closeModal={() => {
setLoginPageOpne(false)
renderData()
}}></LoginPage>
</Modal>
{/* 第四步 查看 */}
<Modal open={loginPageShowOpne}
title="登陆页面查看"
width={1700}
destroyOnClose={true}
onCancel={() => {
setLoginPageShowOpne(false);
}}
footer={null}
>
<LoginPageShow></LoginPageShow>
</Modal>
{/* 第五步 设置 */}
<Modal open={softwareManagementOpen}
title="软件功能管理设置"
width={1500}
destroyOnClose={true}
onCancel={() => {
renderData()
setSoftwareManagementOpen(false);
}}
footer={null}
>
<SoftwareManagement></SoftwareManagement>
</Modal>
{/* 第五步 查看 */}
<Modal open={softwareManagementShowOpen}
title="软件功能管理查看"
width={1500}
onCancel={() => {
setSoftwareManagementShowOpen(false);
}}
destroyOnClose={true}
footer={null}
>
<SoftwareManagementShow></SoftwareManagementShow>
</Modal>
{/* 第六步 设置 */}
<Modal open={displayOrderOpen}
title="设置功能列表显示顺序"
width={1500}
destroyOnClose={true}
onCancel={() => {
renderData()
setDisplayOrderOpen(false);
}}
footer={null}
>
<DisplayOrder></DisplayOrder>
</Modal>
{/* 第六步 查看 */}
<Modal open={displayOrderShowOpen}
title="查看功能列表显示顺序"
width={1500}
destroyOnClose={true}
onCancel={() => {
setDisplayOrderShowOpen(false);
}}
footer={null}
>
<DisplayOrderShow></DisplayOrderShow>
</Modal>
<Modal title="回复内容"
okText="确定"
cancelText="取消"
destroyOnClose={true}
open={replyModal}
width={800}
onOk={() => {
console.log('上传文件', uploadedFiles);
console.log('上传信息', aContent)
if(aContent==''){
messageApi.open({
type: 'error',
content: '请回复内容'
})
}else if(uploadedFiles.length == 0){
messageApi.open({
type: 'error',
content: '请上传文件'
})
}else{
put({
messageApi,
url: `/api/proj/materials/add/update-a/${projMaterialsAddId}`,
body: {
aContent,
aFiles: uploadedFiles.map(file => file.response.data.fileId)
},
onBefore() {
},
onSuccess() {
// alert('编辑成功')
messageApi.open({
type: 'success',
content: '回复成功'
})
setTimeout(() => {
setReplyModal(false);
getQuestionList()
// window.location.reload(); // 刷新页面
}, 1000);
// getProjOwnerList()
},
onFinally() {
}
})
}
// uploadedFiles.map(file => file.uid);
// put({
// messageApi,
// url: `/api/proj/materials/add/update-a/${projMaterialsAddId}`,
// body: {
// aContent,
// aFiles: uploadedFiles.map(file => file.response.data.fileId)
// },
// onBefore() {
// },
// onSuccess() {
// // alert('编辑成功')
// messageApi.open({
// type: 'success',
// content: '回复成功'
// })
// setTimeout(() => {
// setReplyModal(false);
// getQuestionList()
// // window.location.reload(); // 刷新页面
// }, 1000);
// // getProjOwnerList()
// },
// onFinally() {
// }
// })
}}
onCancel={() => {
setReplyModal(false);
}}>
<div>
<TextArea style={{ height: '200px', resize: 'none', fontSize: 16 }} onChange={(e) => {
setaContent(e.target.value)
}} ></TextArea>
<div className='upload-box'>
<div className='uploadTitle'>
:
</div>
<Upload {...props} listType="picture" multiple>
<Button icon={<UploadOutlined />}></Button>
</Upload>
</div>
</div>
</Modal>
</div>
)
}