diff --git a/jjb.config.js b/jjb.config.js index 1efdf3b..d3c3722 100644 --- a/jjb.config.js +++ b/jjb.config.js @@ -10,7 +10,7 @@ module.exports = { javaGitBranch: "", // 本地联调 safety-eval-service(context-path: /safety-eval,默认端口 8095) // 可通过环境变量覆盖: SAFETY_EVAL_API_HOST=http://192.168.x.x:8095 - API_HOST: "http://192.168.0.204:8095", + API_HOST: "http://192.168.0.149", }, production: { // 应用后端分支名称,部署上线需要 diff --git a/src/components/AttachmentUpload/index.js b/src/components/AttachmentUpload/index.js new file mode 100644 index 0000000..7a4f7de --- /dev/null +++ b/src/components/AttachmentUpload/index.js @@ -0,0 +1,68 @@ +import { Form, Image, Upload } from "antd"; +import { useState } from "react"; + +const isImage = (url) => /\.(png|jpe?g|gif|bmp|webp|svg)(\?.*)?$/i.test(url || ""); + +export default function AttachmentUpload({ name, label, disabled }) { + const [previewImage, setPreviewImage] = useState(""); + + return ( + <> + { + if (Array.isArray(value)) { + return { fileList: value }; + } + return { + fileList: value + ? value.split(",").map((item) => ({ + url: item, + uid: item, + status: "done", + name: "附件", + })) + : [], + }; + }} + getValueFromEvent={({ fileList }) => { + return ( + fileList?.map((file) => ({ + url: file.response?.data?.url || file.url, + uid: file.uid, + status: "done", + name: file.name, + })) || [] + ); + }} + > + { + if (isImage(file.url || file.thumbUrl)) { + setPreviewImage(file.url || file.thumbUrl); + } else { + window.open(file.url || file.thumbUrl); + } + }} + > + 上传附件 + + + { + if (!visible) setPreviewImage(""); + }, + }} + /> + + ); +} \ No newline at end of file diff --git a/src/pages/Container/QualApplication/FilingForm/components/BasicInfoStep.jsx b/src/pages/Container/QualApplication/FilingForm/components/BasicInfoStep.jsx index 10bb022..ebdd776 100644 --- a/src/pages/Container/QualApplication/FilingForm/components/BasicInfoStep.jsx +++ b/src/pages/Container/QualApplication/FilingForm/components/BasicInfoStep.jsx @@ -1,21 +1,39 @@ import { Form, Input, InputNumber, Row, Col, Select } from "antd"; -import { CHONGQING_DISTRICTS, QUALIFICATION_INDUSTRY_OPTIONS } from "~/enumerate/enterpriseOptions"; +import { + CHONGQING_DISTRICTS, + QUALIFICATION_INDUSTRY_OPTIONS, +} from "~/enumerate/enterpriseOptions"; import { FILING_UNIT_TYPE_OPTIONS } from "~/enumerate/qualFilingOptions"; -import FilingUpload, { resolveFilingUploadUrl } from "./FilingUpload"; +import AttachmentUpload from "~/components/AttachmentUpload"; -export default function -BasicInfoStep({ form, disabled, onAttachmentChange }) { +export default function BasicInfoStep({ form, disabled }) { return (
- - - - @@ -79,12 +97,18 @@ BasicInfoStep({ form, disabled, onAttachmentChange }) { - + - + @@ -94,18 +118,7 @@ BasicInfoStep({ form, disabled, onAttachmentChange }) { - - { - if (disabled) { - return; - } - const url = resolveFilingUploadUrl(files); - onAttachmentChange?.(url, files); - }} - /> - +
diff --git a/src/pages/Container/QualApplication/FilingForm/components/CommitmentStep.jsx b/src/pages/Container/QualApplication/FilingForm/components/CommitmentStep.jsx index a85f284..5f7fffa 100644 --- a/src/pages/Container/QualApplication/FilingForm/components/CommitmentStep.jsx +++ b/src/pages/Container/QualApplication/FilingForm/components/CommitmentStep.jsx @@ -1,6 +1,7 @@ import { DatePicker, Form, Input, Row, Col, Select } from "antd"; import { COMMITMENT_PARAGRAPHS } from "../../filingCommitment"; import FilingUpload, { resolveFilingUploadUrl } from "./FilingUpload"; +import AttachmentUpload from "~/components/AttachmentUpload"; const BLANK_STYLE = { display: "inline-block", @@ -13,9 +14,7 @@ const BLANK_STYLE = { function renderBlank(value) { const text = value?.trim() || ""; - return ( - {text || "\u00A0".repeat(8)} - ); + return {text || "\u00A0".repeat(8)}; } function CommitmentBody({ legalRepName, filingUnitName }) { @@ -23,10 +22,20 @@ function CommitmentBody({ legalRepName, filingUnitName }) { return (
{COMMITMENT_PARAGRAPHS.map((paragraph) => ( -

+

{paragraph.parts.map((part, index) => { if (part.type === "blank") { - return {renderBlank(values[part.field])}; + return ( + + {renderBlank(values[part.field])} + + ); } return {part.value}; })} @@ -50,7 +59,9 @@ export default function CommitmentStep({ form.setFieldsValue({ legalRepPersonnelId: undefined, legalRepName: "" }); return; } - const selected = personnelOptions.find((item) => item.value === personnelId); + const selected = personnelOptions.find( + (item) => item.value === personnelId, + ); form.setFieldsValue({ legalRepPersonnelId: personnelId, legalRepName: selected?.staffName || selected?.label || "", @@ -70,15 +81,19 @@ export default function CommitmentStep({ -

- +
@@ -104,20 +119,11 @@ export default function CommitmentStep({ - - - { - if (disabled) { - return; - } - const url = resolveFilingUploadUrl(files); - onSignatureChange?.(url, files); - }} - /> - +
); diff --git a/src/pages/Container/QualApplication/FilingForm/components/FilingUpload.jsx b/src/pages/Container/QualApplication/FilingForm/components/FilingUpload.jsx index 12be7c5..a5191ac 100644 --- a/src/pages/Container/QualApplication/FilingForm/components/FilingUpload.jsx +++ b/src/pages/Container/QualApplication/FilingForm/components/FilingUpload.jsx @@ -15,9 +15,10 @@ export default function FilingUpload({ false} + onChange={(info) => { if (disabled) return; onChange?.(info.fileList); diff --git a/src/pages/Container/QualApplication/FilingForm/components/MaterialStep.jsx b/src/pages/Container/QualApplication/FilingForm/components/MaterialStep.jsx index 826424c..fbf5dbf 100644 --- a/src/pages/Container/QualApplication/FilingForm/components/MaterialStep.jsx +++ b/src/pages/Container/QualApplication/FilingForm/components/MaterialStep.jsx @@ -1,7 +1,5 @@ -import { Button, Space, Table, Tag } from "antd"; +import { Button, Image, Space, Table, Tag, Upload } from "antd"; import { useState } from "react"; -import { resolveUploadFileId } from "~/utils/mockUpload"; -import FilePreviewModal from "~/components/FilePreviewModal"; export default function MaterialStep({ materials = [], @@ -9,8 +7,10 @@ export default function MaterialStep({ onUpload, loading, }) { - const [preview, setPreview] = useState(null); -console.log(disabled) + const [previewImage, setPreviewImage] = useState(""); + + const isImage = (url) => /\.(png|jpe?g|gif|bmp|webp|svg)(\?.*)?$/i.test(url || ""); + return ( <> ( {record.attachmentUrl ? ( - + ) : ( !disabled && ( - + + ) )} @@ -62,12 +81,15 @@ console.log(disabled) { title: "注释", dataIndex: "materialRemark", ellipsis: true }, ]} /> - setPreview(null)} + { + if (!visible) setPreviewImage(""); + }, + }} /> ); diff --git a/src/pages/Container/QualApplication/FilingForm/index.js b/src/pages/Container/QualApplication/FilingForm/index.js index 4934232..5fe2621 100644 --- a/src/pages/Container/QualApplication/FilingForm/index.js +++ b/src/pages/Container/QualApplication/FilingForm/index.js @@ -93,12 +93,14 @@ function FilingFormPage(props) { useEffect(() => { loadPersonnelOptions(); if(query.id){ - fetchQualFilingDetail({ id: query.id }).then((res) => { - updateDetail((prev) => ({ ...prev, ...res?.data || {} })); + fetchQualFilingDetail(query.id).then((res) => { + setDetail((prev) => ({ ...prev, ...res?.data || {} })); + console.log(res?.data, 'res.data'); + basicForm.setFieldsValue(res?.data || {}); }); } else{ - updateDetail((prev) => ({ ...prev, materials: FILING_MATERIAL_TEMPLATE })); + setDetail((prev) => ({ ...prev, materials: FILING_MATERIAL_TEMPLATE })); } }, []); @@ -131,21 +133,6 @@ function FilingFormPage(props) { }, [commitmentForm, personnelOptions]); - const updateDetail = useCallback( - (updater) => { - setDetail((prev) => { - const next = - typeof updater === "function" - ? updater(prev) - : { ...prev, ...updater }; - detailRef.current = next; - - return next; - }); - }, - [ mode, readOnly], - ); - const collectCurrentDetail = useCallback(() => { const current = detailRef.current || detail; return mergeDetailFromForms(current, { @@ -171,7 +158,7 @@ function FilingFormPage(props) { setSubmitting(false); } }; - + const handleSubmitRequest = () => { if (readOnly) { return; @@ -189,8 +176,9 @@ function FilingFormPage(props) { setSubmitting(true); try { const currentDetail = collectCurrentDetail(); + debugger const saved = await persistFilingToBackend(props, currentDetail, mode); - clearLocalDraft(mode); + if (mode === FILING_FORM_MODE.CHANGE) { const res = await props.qualFilingChangeSubmit({ @@ -219,32 +207,31 @@ function FilingFormPage(props) { const handleMaterialUpload = (record, url) => { const attachmentUrl = url || resolveUploadFileId([]); - updateDetail((prev) => ({ + setDetail((prev) => ({ ...prev, materials: (prev.materials || []).map((item) => - item.id === record.id || item.sortOrder === record.sortOrder + { + + return item.id === record.id ? { ...item, attachmentUrl, uploadStatusCode: 2, uploadStatusName: "已上传", } - : item, + : item + } ), })); message.success(`材料已选择,${saveActionHint}`); }; - const handleAttachmentChange = (url) => { - updateDetail((prev) => ({ ...prev, attachmentUrl: url })); - }; - const handleSignatureChange = (url, files) => { commitmentForm.setFieldsValue({ signatureFiles: files, legalRepSignatureUrl: url, }); - updateDetail((prev) => ({ + setDetail((prev) => ({ ...prev, commitment: { ...prev.commitment, @@ -273,7 +260,7 @@ function FilingFormPage(props) { ? mapStaffRowToFilingPersonnel(row) : mapStaffRowToFilingPersonnel({ id }); }); - updateDetail((prev) => ({ + setDetail((prev) => ({ ...prev, personnelList: [...(prev.personnelList || []), ...newRows], })); @@ -285,7 +272,7 @@ function FilingFormPage(props) { title: "提示", content: `确认删除人员「${record.personName}」?`, onOk: () => { - updateDetail((prev) => ({ + setDetail((prev) => ({ ...prev, personnelList: (prev.personnelList || []).filter( (item) => item.id !== record.id, @@ -314,7 +301,7 @@ function FilingFormPage(props) { ? mapEquipRowToFilingEquipment(row) : mapEquipRowToFilingEquipment({ id }); }); - updateDetail((prev) => ({ + setDetail((prev) => ({ ...prev, equipmentList: [...(prev.equipmentList || []), ...newRows], })); @@ -326,7 +313,7 @@ function FilingFormPage(props) { title: "提示", content: `确认移除装备「${record.deviceName}」?`, onOk: () => { - updateDetail((prev) => ({ + setDetail((prev) => ({ ...prev, equipmentList: (prev.equipmentList || []).filter( (item) => item.id !== record.id, @@ -390,7 +377,6 @@ function FilingFormPage(props) { )} {activeStep === "materials" && ( @@ -461,7 +447,10 @@ function FilingFormPage(props) { {!isLastStep && ( diff --git a/src/pages/Container/QualApplication/filingMaterialTemplate.js b/src/pages/Container/QualApplication/filingMaterialTemplate.js index d3dc294..7cb9e75 100644 --- a/src/pages/Container/QualApplication/filingMaterialTemplate.js +++ b/src/pages/Container/QualApplication/filingMaterialTemplate.js @@ -1,16 +1,16 @@ /** 备案材料通用模板(对齐后端 QualFilingMaterialTemplateProvider / 原型 10 项) */ export const FILING_MATERIAL_TEMPLATE = [ - { sortOrder: 1, materialContent: "申请材料目录(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, - { sortOrder: 2, materialContent: "申请书(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, - { sortOrder: 3, materialContent: "法人证明(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "营业执照或事业单位法人证书等", requiredFlag: 1 }, - { sortOrder: 4, materialContent: "三年内无重大违法失信记录查询证明(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, - { sortOrder: 5, materialContent: "法定代表人承诺书(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名", requiredFlag: 1 }, - { sortOrder: 6, materialContent: "固定资产法定证明材料或书面承诺", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, - { sortOrder: 7, materialContent: "工作场所及档案室面积证明资料(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "房产证、租赁协议等", requiredFlag: 1 }, - { sortOrder: 8, materialContent: "安全评价师专业能力证明(彩色复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "学历证书、职称证及其他相关证明材料", requiredFlag: 1 }, - { sortOrder: 9, materialContent: "相关负责人证明材料(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "任命文件、简历、职称证等", requiredFlag: 1 }, - { sortOrder: 10, materialContent: "机构内部管理制度(非受控版)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, + { id: 1, materialContent: "申请材料目录(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, + { id: 2, materialContent: "申请书(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, + { id: 3, materialContent: "法人证明(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "营业执照或事业单位法人证书等", requiredFlag: 1 }, + { id: 4, materialContent: "三年内无重大违法失信记录查询证明(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, + { id: 5, materialContent: "法定代表人承诺书(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名", requiredFlag: 1 }, + { id: 6, materialContent: "固定资产法定证明材料或书面承诺", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, + { id: 7, materialContent: "工作场所及档案室面积证明资料(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "房产证、租赁协议等", requiredFlag: 1 }, + { id: 8, materialContent: "安全评价师专业能力证明(彩色复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "学历证书、职称证及其他相关证明材料", requiredFlag: 1 }, + { id: 9, materialContent: "相关负责人证明材料(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "任命文件、简历、职称证等", requiredFlag: 1 }, + { id: 10, materialContent: "机构内部管理制度(非受控版)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, ]; export function createLocalMaterials() { diff --git a/src/pages/Container/QualApplication/filingPersist.js b/src/pages/Container/QualApplication/filingPersist.js index fc12180..1b1db1c 100644 --- a/src/pages/Container/QualApplication/filingPersist.js +++ b/src/pages/Container/QualApplication/filingPersist.js @@ -267,20 +267,18 @@ export async function persistFilingToBackend(props, detail, mode) { } export function mergeDetailFromForms(detail, { basicValues, commitmentValues }) { - const attachmentUrl = resolveUploadFileId(basicValues?.attachments) || detail.attachmentUrl; + return { ...detail, ...basicValues, - attachmentUrl, + attachmentUrl: basicValues?.attachmentUrl?.map((file) => file.url).join(",") || undefined, materials: detail.materials, personnelList: detail.personnelList, equipmentList: detail.equipmentList, commitment: { ...detail.commitment, ...commitmentValues, - legalRepSignatureUrl: resolveUploadFileId(commitmentValues?.signatureFiles) - || commitmentValues?.legalRepSignatureUrl - || detail.commitment?.legalRepSignatureUrl, + legalRepSignatureUrl: basicValues?.legalRepSignatureUrl?.map((file) => file.url).join(",") || undefined, }, }; } diff --git a/src/pages/Container/QualApplication/filingVerify.js b/src/pages/Container/QualApplication/filingVerify.js index 4395d40..5d7c262 100644 --- a/src/pages/Container/QualApplication/filingVerify.js +++ b/src/pages/Container/QualApplication/filingVerify.js @@ -84,16 +84,16 @@ export function verifyFilingPrerequisites(detail = {}) { desc: "负责人、技术负责人、质量负责人具有高级职称,工作八年以上", passed: SKIP_PERSONNEL_VERIFY || keyOk, }); + + + // const mgmtUploaded=detail.materials.every((m) => m.attachmentUrl); - const mgmtMaterial = (detail.materials || []).find((m) => Number(m.sortOrder) === 10); - const mgmtUploaded = !!mgmtMaterial?.attachmentUrl; - - items.push({ - key: "mgmtSystem", - label: "管理体系", - desc: mgmtUploaded ? "管理体系文件已上传" : "尚未上传管理体系文件", - passed: mgmtUploaded, - }); + // items.push({ + // key: "mgmtSystem", + // label: "管理体系", + // desc: mgmtUploaded? "管理体系文件已上传" : "尚未上传管理体系文件", + // passed: mgmtUploaded, + // }); return { passed: items.every((item) => item.passed),