diff --git a/src/api/qualFiling/index.js b/src/api/qualFiling/index.js index 5b54312..6b239c6 100644 --- a/src/api/qualFiling/index.js +++ b/src/api/qualFiling/index.js @@ -101,30 +101,14 @@ export function fromFilingBasicForm(values = {}) { export function toFilingDetail(data = {}) { return { ...toFilingBasicForm(data), - materials: (data.materials || []).map(toFilingMaterialRow), + materials: (data.materials || []), commitment: data.commitment ? toFilingCommitmentForm(data.commitment, data.filingUnitName) : null, personnelList: (data.personnelList || []).map(toFilingPersonnelRow), equipmentList: (data.equipmentList || []).map(toFilingEquipmentRow), }; } -// ─── 字段映射:材料 ─── -export function toFilingMaterialRow(data = {}) { - return { - id: asId(data.id), - filingId: asId(data.filingId), - sortOrder: data.sortOrder, - materialContent: data.materialContent, - materialFormat: data.materialFormat, - requiredFlag: data.requiredFlag, - uploadStatusCode: data.uploadStatusCode, - uploadStatusName: data.uploadStatusName, - attachmentDesc: data.attachmentDesc, - attachmentUrl: data.attachmentUrl, - materialRemark: data.materialRemark, - }; -} // ─── 字段映射:承诺书 ─── diff --git a/src/api/qualReview/index.js b/src/api/qualReview/index.js index 56c1dab..d1333f9 100644 --- a/src/api/qualReview/index.js +++ b/src/api/qualReview/index.js @@ -8,6 +8,12 @@ export const queryReviewList = declareRequest( export const queryComplianceCheck = declareRequest( "qualReviewLoading", - "Get > /safety-eval/qual-filing/compliance-check > id", + "Get > /safetyEval/qual-filing/compliance-check", 'complianceCheckItems: [] | res.data || []', +); + +export const fetchQualFilingDetail = declareRequest( + "fetchQualFilingDetailLoading", + "Get > /safetyEval/qual-filing/detail", + 'qualFilingDetail: {} | res.data || {}', ); \ No newline at end of file diff --git a/src/components/PreviewUrlButton/index.js b/src/components/PreviewUrlButton/index.js new file mode 100644 index 0000000..7d8dfba --- /dev/null +++ b/src/components/PreviewUrlButton/index.js @@ -0,0 +1,39 @@ +import { useState } from "react"; +import { Button, Image } from "antd"; + +const isImage = (url) => + /\.(png|jpe?g|gif|bmp|webp|svg)(\?.*)?$/i.test(url || ""); + +export default function PreviewUrlButton({ url, children = "预览", ...btnProps }) { + const [previewImage, setPreviewImage] = useState(""); + + return ( + <> + + {previewImage && ( + { if (!v) setPreviewImage(""); }, + }} + /> + )} + + ); +} \ No newline at end of file diff --git a/src/enumerate/constant/index.js b/src/enumerate/constant/index.js index a88c442..7e154a9 100644 --- a/src/enumerate/constant/index.js +++ b/src/enumerate/constant/index.js @@ -18,7 +18,7 @@ export const VERIFY_STATUS_MAP = { /** 审核状态 */ export const REVIEW_STATUS_MAP = { - pending: { label: "待审核", color: "warning" }, + 2: { label: "审核中", color: "processing" }, 3: { label: "打回", color: "error" }, }; @@ -50,3 +50,8 @@ export const EXPERT_LEVEL_MAP = { 2: "二级", 3: "三级", }; +export const LEGAL_STATUS_STYLE = { + PASS: { icon: "✅", borderColor: "#059669", bg: "#f0fdf4" }, + WARN: { icon: "⚠️", borderColor: "#d97706", bg: "#fffbeb" }, + NOT_PASS: { icon: "❌", borderColor: "#dc2626", bg: "#fef2f2" }, +}; \ No newline at end of file diff --git a/src/enumerate/qualFilingOptions.js b/src/enumerate/qualFilingOptions.js index 3466782..24316b3 100644 --- a/src/enumerate/qualFilingOptions.js +++ b/src/enumerate/qualFilingOptions.js @@ -34,11 +34,26 @@ export const CHANGE_STATUS_OPTIONS = [ ]; export const QUAL_FILING_STATUS_COLOR = { - 5: "cyan", - 1: "success", - 2: "processing", - 3: "error", - 4: "warning", + 5: { + color: "cyan", + label: "暂存", + }, + 1: { + color: "success", + label: "已备案", + }, + 2: { + color: "processing", + label: "审核中", + }, + 3: { + color: "error", + label: "已打回", + }, + 4: { + color: "warning", + label: "变更审核中", + }, }; export function getFilingStatusOptions(mode) { diff --git a/src/pages/Container/EnterpriseInfo/PersonnelInfo/StaffViewModal.js b/src/pages/Container/EnterpriseInfo/PersonnelInfo/StaffViewModal.js index b9a1b1d..8635b52 100644 --- a/src/pages/Container/EnterpriseInfo/PersonnelInfo/StaffViewModal.js +++ b/src/pages/Container/EnterpriseInfo/PersonnelInfo/StaffViewModal.js @@ -3,6 +3,7 @@ import { useEffect, useRef, useState } from "react"; import FilePreviewModal, { FilePreviewContent } from "~/components/FilePreviewModal"; import { resolvePreviewSrc } from "~/components/CertPreviewImg"; import { fetchStaffCertDetail, fetchStaffCertListByPersonnelId } from "~/api/staffCertificate"; +import { fetchOrgPersonnelDetail } from "~/api/qualFiling/personnelHelper"; import { safeRequest } from "~/utils"; const GENDER_MAP = { 1: "男", 2: "女" }; @@ -11,7 +12,7 @@ const REGISTER_ENGINEER_MAP = { 1: "是", 2: "否" }; export default function StaffViewModal({ open, currentId, - requestDetails, + requestDetails = fetchOrgPersonnelDetail, requestCertList = fetchStaffCertListByPersonnelId, requestCertDetails = fetchStaffCertDetail, onCancel, diff --git a/src/pages/Container/QualApplication/FilingForm/components/EquipmentStep.jsx b/src/pages/Container/QualApplication/FilingForm/components/EquipmentStep.jsx index 69296eb..b9ecd3e 100644 --- a/src/pages/Container/QualApplication/FilingForm/components/EquipmentStep.jsx +++ b/src/pages/Container/QualApplication/FilingForm/components/EquipmentStep.jsx @@ -57,7 +57,7 @@ export default function EquipmentStep({ !disabled && ( { if (info.file.status === "done") { const data = info.file.response?.data; diff --git a/src/pages/Container/QualApplication/FilingForm/components/PersonnelStep.jsx b/src/pages/Container/QualApplication/FilingForm/components/PersonnelStep.jsx index 955978b..4e03f3a 100644 --- a/src/pages/Container/QualApplication/FilingForm/components/PersonnelStep.jsx +++ b/src/pages/Container/QualApplication/FilingForm/components/PersonnelStep.jsx @@ -1,7 +1,7 @@ import { Button, Modal, Space, Table } from "antd"; import { useState } from "react"; import StaffViewModal from "~/pages/Container/EnterpriseInfo/PersonnelInfo/StaffViewModal"; -import { fetchOrgPersonnelDetail } from "~/api/qualFiling/personnelHelper"; + import OrgPersonnelSelectModal from "./OrgPersonnelSelectModal"; export default function PersonnelStep({ @@ -71,7 +71,7 @@ export default function PersonnelStep({ setViewId("")} /> diff --git a/src/pages/Container/QualApplication/FilingListTable.jsx b/src/pages/Container/QualApplication/FilingListTable.jsx index 6aa68d6..b8f3926 100644 --- a/src/pages/Container/QualApplication/FilingListTable.jsx +++ b/src/pages/Container/QualApplication/FilingListTable.jsx @@ -75,11 +75,16 @@ export default function FilingListTable({ title: "备案状态", dataIndex: "filingStatusName", width: 110, - render: (_, record) => ( - - {record.filingStatusName || "-"} - - ), + render: (_, record) => { + const obj= QUAL_FILING_STATUS_COLOR[record.filingStatusCode] + const color = obj?.color || "default"; + const name= obj?.label || "-"; + return ( + obj? + {name || "-"} + :"--" + ); + }, }); columns.push({ diff --git a/src/pages/Container/QualApplication/filingMaterialTemplate.js b/src/pages/Container/QualApplication/filingMaterialTemplate.js index fa3a283..14390d1 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 = [ - {id: 1, materialType: 1, materialContent: "申请材料目录(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, - {id: 2, materialType: 2, materialContent: "申请书(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, - {id: 3, materialType: 3, materialContent: "法人证明(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "营业执照或事业单位法人证书等", requiredFlag: 1 }, - {id: 4, materialType: 4, materialContent: "三年内无重大违法失信记录查询证明(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, - {id: 5, materialType: 5, materialContent: "法定代表人承诺书(原件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名", requiredFlag: 1 }, - {id: 6, materialType: 6, materialContent: "固定资产法定证明材料或书面承诺", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, - {id: 7, materialType: 7, materialContent: "工作场所及档案室面积证明资料(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "房产证、租赁协议等", requiredFlag: 1 }, - {id: 8, materialType: 8, materialContent: "安全评价师专业能力证明(彩色复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "学历证书、职称证及其他相关证明材料", requiredFlag: 1 }, - {id: 9, materialType: 9, materialContent: "相关负责人证明材料(复印件)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: "任命文件、简历、职称证等", requiredFlag: 1 }, - {id: 10, materialType: 10, materialContent: "机构内部管理制度(非受控版)", materialFormat: "pdf", attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, + {id: 1, materialType: 1, materialContent: "申请材料目录(原件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, + {id: 2, materialType: 2, materialContent: "申请书(原件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, + {id: 3, materialType: 3, materialContent: "法人证明(复印件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "营业执照或事业单位法人证书等", requiredFlag: 1 }, + {id: 4, materialType: 4, materialContent: "三年内无重大违法失信记录查询证明(原件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名并加盖单位公章", requiredFlag: 1 }, + {id: 5, materialType: 5, materialContent: "法定代表人承诺书(原件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "法定代表人亲笔签名", requiredFlag: 1 }, + {id: 6, materialType: 6, materialContent: "固定资产法定证明材料或书面承诺", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, + {id: 7, materialType: 7, materialContent: "工作场所及档案室面积证明资料(复印件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "房产证、租赁协议等", requiredFlag: 1 }, + {id: 8, materialType: 8, materialContent: "安全评价师专业能力证明(彩色复印件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "学历证书、职称证及其他相关证明材料", requiredFlag: 1 }, + {id: 9, materialType: 9, materialContent: "相关负责人证明材料(复印件)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: "任命文件、简历、职称证等", requiredFlag: 1 }, + {id: 10, materialType: 10, materialContent: "机构内部管理制度(非受控版)", materialFormat: null, attachmentDesc: "纸质版扫描件", materialRemark: null, requiredFlag: 1 }, ]; export function createLocalMaterials() { diff --git a/src/pages/Container/QualificationReview/FilingDetail/index.js b/src/pages/Container/QualificationReview/FilingDetail/index.js index df479e5..b480f6c 100644 --- a/src/pages/Container/QualificationReview/FilingDetail/index.js +++ b/src/pages/Container/QualificationReview/FilingDetail/index.js @@ -1,20 +1,29 @@ -import React, { useMemo } from "react"; -import { Tag, Space } from "antd"; +import React, { useEffect } from "react"; +import { Tag, Space, Spin } from "antd"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import { REVIEW_STATUS_MAP } from "~/enumerate/constant"; +import { Connect } from "@cqsjjb/jjb-dva-runtime"; +import { NS_QUAL_REVIEW } from "~/enumerate/namespace"; +import { tools } from "@cqsjjb/jjb-common-lib"; import { MOCK_DETAIL } from "../mockData"; import FilingTabs from "../FilingTabs"; -function parseQueryId(location) { - const search = location?.search || window.location.search || ""; - return new URLSearchParams(search).get("id"); -} +const {router}=tools; + + const FilingDetail = (props) => { - const id = useMemo(() => parseQueryId(props.location), [props.location?.search]); + const { qualReview, fetchQualFilingDetail } = props; + const { fetchQualFilingDetailLoading, qualFilingDetail } = qualReview; const detail = MOCK_DETAIL; const statusConfig = REVIEW_STATUS_MAP[detail.reviewStatus]; + useEffect(() => { + fetchQualFilingDetail({ + id: router.query.id, + }); + }, []); + return ( { history={props.history} previous > - + + + ); }; -export default FilingDetail; + +export default Connect( + [NS_QUAL_REVIEW], + true, +)(FilingDetail); diff --git a/src/pages/Container/QualificationReview/FilingTabs/index.js b/src/pages/Container/QualificationReview/FilingTabs/index.js index 8c517c8..52e97ae 100644 --- a/src/pages/Container/QualificationReview/FilingTabs/index.js +++ b/src/pages/Container/QualificationReview/FilingTabs/index.js @@ -1,12 +1,12 @@ -import React, { useState } from "react"; -import { Button, Descriptions, Table, Tag, Tabs, Select, Modal, Space } from "antd"; +import React, { useState, useEffect } from "react"; +import { Button, Descriptions, Table, Tag, Tabs, Select, Modal, Space, Image } from "antd"; +import { Connect } from "@cqsjjb/jjb-dva-runtime"; +import { NS_QUAL_REVIEW } from "~/enumerate/namespace"; +import StaffViewModal from "~/pages/Container/EnterpriseInfo/PersonnelInfo/StaffViewModal"; +import PreviewUrlButton from "~/components/PreviewUrlButton/index"; import { - MOCK_MATERIALS, - MOCK_PERSONNEL, - MOCK_EQUIPMENT, MOCK_EQUIP_DETAIL, - MOCK_PERSONNEL_DETAIL, - MOCK_CERTIFICATES, + CALIBRATION_MAP, } from "../mockData"; @@ -28,21 +28,24 @@ const FilingTabs = ({ onPersonnelView, onEquipView, }) => { - const [personnelVisible, setPersonnelVisible] = useState(false); + const [equipVisible, setEquipVisible] = useState(false); const [selectedEquip, setSelectedEquip] = useState(null); + const [viewId, setViewId] = useState(""); + + const baseCols = [ { title: "序号", width: 60, render: (_, __, i) => i + 1 }, - { title: "材料名称", dataIndex: "name" }, + { title: "材料名称", dataIndex: "materialContent" }, ]; const materialCols = isReview ? [ ...baseCols, - { title: "上传附件", dataIndex: "attachment", width: 120 }, - { title: "格式", dataIndex: "format", width: 80 }, - { title: "状态", dataIndex: "status", width: 100, render: () => 已上传 }, + { title: "上传附件", dataIndex: "attachmentDesc", width: 120 }, + { title: "格式", dataIndex: "materialFormat", width: 80 }, + { title: "状态", width: 100, render: (_, record) => record.uploadStatusCode === 2 ? {record.uploadStatusName || "已上传"} : {record.uploadStatusName || "待上传"} }, { title: "符合性", width: 100, render: (_, record) => (