From a3e796831d6968f945ca2443aaecb5c913d42c14 Mon Sep 17 00:00:00 2001 From: tangjie <122778500@qq.com> Date: Fri, 28 Aug 2026 18:43:13 +0800 Subject: [PATCH] fix --- ...J-CX-2-JL02 评价人员任命及专家聘用书.docx | Bin 0 -> 13141 bytes src/enumerate/constant/index.js | 11 +++ .../EvalProject/Create/index.js | 32 ++++++--- .../ProjectFlow/RiskAnalysisContent.js | 2 +- .../ProjectFlow/TeamContent.js | 65 +++++++++++++----- src/utils/index.js | 7 +- 6 files changed, 90 insertions(+), 27 deletions(-) create mode 100644 public/QAPJ-CX-2-JL02 评价人员任命及专家聘用书.docx diff --git a/public/QAPJ-CX-2-JL02 评价人员任命及专家聘用书.docx b/public/QAPJ-CX-2-JL02 评价人员任命及专家聘用书.docx new file mode 100644 index 0000000000000000000000000000000000000000..e9c252293aa12be277faa7fd3191263ef8c21fac GIT binary patch literal 13141 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 bz`ysl<)y&?7!UU!ea3Vi>EX literal 0 HcmV?d00001 diff --git a/src/enumerate/constant/index.js b/src/enumerate/constant/index.js index 655a538..238f47a 100644 --- a/src/enumerate/constant/index.js +++ b/src/enumerate/constant/index.js @@ -600,6 +600,17 @@ export const CAPABILITY_MAP = CAPABILITY_OPTIONS.reduce((acc, cur) => { return acc; }, {}); +/** 业务范围与所需专业能力配备标准对照(依据《安全评价机构资质条件》应急〔2026〕60号附件) */ +export const INDUSTRY_REQUIRED_CAPABILITIES = { + COAL_MINING: ["SAFETY", "MECHANICAL", "ELECTRICAL", "MINING", "VENTILATION", "GEOLOGY", "MINE_CONSTRUCTION"], + METAL_NONMETAL_MINING: ["SAFETY", "MECHANICAL", "ELECTRICAL", "MINING", "VENTILATION", "GEOLOGY", "HYDRAULIC_STRUCTURE"], + ONSHORE_OIL_GAS: ["SAFETY", "MECHANICAL", "ELECTRICAL", "OIL_PRODUCTION", "STORAGE_AND_TRANSPORT"], + ONSHORE_OIL_GAS_PIPELINE: ["OIL_GAS_STORAGE_TRANSPORT", "EQUIPMENT", "INSTRUMENT", "ELECTRICAL", "ANTICORROSION", "SAFETY"], + PETROCHEMICAL_CHEMICAL_PHARMACEUTICAL: ["CHEMICAL_PROCESS", "CHEMICAL_MECHANICAL", "AUTOMATION_INSTRUMENT", "ELECTRICAL", "SAFETY"], + FIREWORKS_FIRECRACKERS: ["EXPLOSIVES", "EXPLOSION_TECHNOLOGY", "MECHANICAL", "ELECTRICAL", "SAFETY"], + METAL_SMELTING: ["SAFETY", "MECHANICAL", "ELECTRICAL", "METALLURGY", "NONFERROUS_METAL"], +}; + /** 专业(职称信息) */ export const PROFESSIONAL_MAJOR_OPTIONS = [ { label: "安全工程", value: "SAFETY_ENGINEERING" }, diff --git a/src/pages/Container/SafetyEvalBusiness/EvalProject/Create/index.js b/src/pages/Container/SafetyEvalBusiness/EvalProject/Create/index.js index 16186e8..0bf6d9c 100644 --- a/src/pages/Container/SafetyEvalBusiness/EvalProject/Create/index.js +++ b/src/pages/Container/SafetyEvalBusiness/EvalProject/Create/index.js @@ -21,7 +21,7 @@ import { Connect } from "@cqsjjb/jjb-dva-runtime"; import useIndustryOptions from "~/hooks/useIndustryOptions"; import BaiduMapPicker from "~/components/BaiduMapPicker"; import { district } from "~/enumerate/constant"; -import {REGISTER_ENGINEER_CATEGORY_OPTIONS} from '~/enumerate/enterpriseOptions'; +import {QUALIFICATION_INDUSTRY_OPTIONS} from '~/enumerate/enterpriseOptions'; import { phoneRule } from "~/utils/validators"; import { renderCapabilityList } from "~/utils"; import StaffPickerModal from "./StaffPickerModal"; @@ -29,6 +29,7 @@ import StaffPickerModal from "./StaffPickerModal"; import { EVAL_TYPE_OPTIONS, CHECKIN_RADIUS_OPTIONS, + INDUSTRY_REQUIRED_CAPABILITIES, } from "~/enumerate/constant"; const { router } = tools; @@ -102,9 +103,26 @@ const EvalProjectCreate = (props) => { setMapPickerVisible(false); }; + /** 按所选业务范围(配备标准)筛选人员能力,仅提交范围内所需的专业能力条目 */ + const filterCapacityByIndustry = (item, industryCodes) => { + const requiredCaps = industryCodes.flatMap( + (code) => INDUSTRY_REQUIRED_CAPABILITIES[code] || [], + ); + if (!requiredCaps.length || !Array.isArray(item.capabilityAssessment)) { + return item.capabilityAssessment?.length + ? renderCapabilityList(item.capabilityAssessment, {capFlag: true}) + : item.capacity; + } + const matched = item.capabilityAssessment.filter((cap) => + requiredCaps.includes(cap.professionalCapabilityCode), + ); + return matched.length ? renderCapabilityList(matched, {capFlag: true}) : item.capacity; + }; + const handleSubmit = () => { form.validateFields().then(async (values) => { const { planStartDate, planEndDate, ...rest } = values; + const industryCodes = String(values.industryCode || "").split(","); const params = { ...rest, planStartDate: planStartDate?.format("YYYY-MM-DD"), @@ -114,9 +132,7 @@ const EvalProjectCreate = (props) => { name: item.userName, deptName: item.deptName, posName: item.postName, - capacity: item.capabilityAssessment - ? renderCapabilityList(item.capabilityAssessment) - : item.capacity, + capacity: filterCapacityByIndustry(item, industryCodes), })), }; if (projectId) { @@ -357,18 +373,18 @@ const EvalProjectCreate = (props) => { } > - + */} diff --git a/src/pages/Container/SafetyEvalBusiness/ProjectFlow/RiskAnalysisContent.js b/src/pages/Container/SafetyEvalBusiness/ProjectFlow/RiskAnalysisContent.js index 77b76a2..47f021c 100644 --- a/src/pages/Container/SafetyEvalBusiness/ProjectFlow/RiskAnalysisContent.js +++ b/src/pages/Container/SafetyEvalBusiness/ProjectFlow/RiskAnalysisContent.js @@ -304,7 +304,7 @@ const RiskAnalysisContent = ({ readOnly, ...props }) => { Array.isArray(value) ? value.join(",") : value } > - {QUALIFICATION_INDUSTRY_OPTIONS.map((opt) => ( {opt.label} diff --git a/src/pages/Container/SafetyEvalBusiness/ProjectFlow/TeamContent.js b/src/pages/Container/SafetyEvalBusiness/ProjectFlow/TeamContent.js index bd286af..9e16e21 100644 --- a/src/pages/Container/SafetyEvalBusiness/ProjectFlow/TeamContent.js +++ b/src/pages/Container/SafetyEvalBusiness/ProjectFlow/TeamContent.js @@ -25,7 +25,9 @@ import { fillDocxTemplate } from "~/utils/fillDocxTemplate"; const { router } = tools; -const TEAM_TEMPLATE_URL = "https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a86d2b2e4b072649bfb8a93.docx"; +const TEAM_TEMPLATE_URL = encodeURI( + "https://gbs-cqaqpj.oss-cn-beijing.aliyuncs.com/jjb/6a9165e2e4b0b3767a786858.docx", +); const TeamContent = ({ readOnly, ...props }) => { const { @@ -268,28 +270,57 @@ const TeamContent = ({ readOnly, ...props }) => { setSigners((prev) => prev.filter((s) => s.personnelId !== personnelId)); }; - // 导出Word:按当前项目组配置填充模板(聘请所需技术专家、备注事项、部门经理或负责人、年月日保留空白) + // 导出Word:按当前项目组配置填充模板(任命语句用"姓名(能力)",表格姓名/专业分列展示;聘用专家、评价部经理、年月日留白) const handleExport = async () => { /** 人员展示文本:姓名后追加能力,如"张三(化工)" */ const personText = (m) => `${m.personnelName}${m.capacity ? `(${m.capacity})` : ""}`; + const roleMembers = (role) => + teamMembers.filter((m) => m.roles.some((r) => r.role === role)); + const sentenceByRole = (role) => + roleMembers(role).map(personText).join("、"); const namesByRole = (role) => - teamMembers - .filter((m) => m.roles.some((r) => r.role === role)) - .map(personText) - .join("、"); + roleMembers(role).map((m) => m.personnelName).join("、"); + const capsByRole = (role) => + roleMembers(role).map((m) => m.capacity).filter(Boolean).join("、"); + const auditorList = roleMembers("INTERNAL_AUDITOR").map((m) => ({ + auditorName: m.personnelName, + auditorCapacity: m.capacity || "", + })); + const techLeadList = roleMembers("TECHNICAL_LEAD").map((m) => ({ + techLeadName: m.personnelName, + techLeadCapacity: m.capacity || "", + })); + const compilerList = roleMembers("REPORT_COMPILER").map((m) => ({ + compilerName: m.personnelName, + compilerCapacity: m.capacity || "", + })); + const memberList = teamMembers + .filter((m) => !m.roles.some((r) => r.role === "PROJECT_LEAD")) + .map((m) => ({ name: m.personnelName, major: m.capacity || "" })); const data = { projectName: evalProjectDetailData?.projectName || "", evalTypeText: EVAL_TYPE_MAP[evalProjectDetailData?.evalTypeCode] || "", - projectLeader: namesByRole("PROJECT_LEAD"), - membersText: teamMembers - .filter((m) => !m.roles.some((r) => r.role === "PROJECT_LEAD")) - .map(personText) - .join("、"), - compiler: namesByRole("REPORT_COMPILER"), - auditor: namesByRole("INTERNAL_AUDITOR"), - techLead: namesByRole("TECHNICAL_LEAD"), - processControlLead: namesByRole("PROCESS_CONTROL_LEAD"), + projectLeader: sentenceByRole("PROJECT_LEAD"), + compiler: sentenceByRole("REPORT_COMPILER"), + projectLeaderName: namesByRole("PROJECT_LEAD"), + projectLeaderCapacity: capsByRole("PROJECT_LEAD"), + // 标签合并分组:首行固定放第一人,循环行(continue)逐人一行 + firstAuditorName: auditorList[0]?.auditorName || "", + firstAuditorCapacity: auditorList[0]?.auditorCapacity || "", + auditorRows: auditorList.slice(1), + firstTechLeadName: techLeadList[0]?.techLeadName || "", + firstTechLeadCapacity: techLeadList[0]?.techLeadCapacity || "", + techLeadRows: techLeadList.slice(1), + processControlLeadName: namesByRole("PROCESS_CONTROL_LEAD"), + processControlLeadCapacity: capsByRole("PROCESS_CONTROL_LEAD"), + // 模板中标签列已纵向合并:restart 行放第一名成员,循环行(continue)逐人一行 + firstMemberName: memberList[0]?.name || "", + firstMemberMajor: memberList[0]?.major || "", + memberRows: memberList.slice(1), + firstCompilerName: compilerList[0]?.compilerName || "", + firstCompilerCapacity: compilerList[0]?.compilerCapacity || "", + compilerRows: compilerList.slice(1), }; try { await fillDocxTemplate( @@ -613,7 +644,9 @@ const TeamContent = ({ readOnly, ...props }) => { { ( - + {!readOnly &&