feat
parent
6199943ac1
commit
15847d7933
|
|
@ -1,6 +1,6 @@
|
|||
评价人员任命及专家聘用书
|
||||
根据市场部下达的评价项目为: 任务,现任命 担任该安全评价项目组长(负责人)。
|
||||
根据评价部项目组组建原则及风险分析记录情况,现任命 、 、 、 、 、 为该评价项目组成员;任命 为该评价报告主要编制人、 为该评价报告内部审核人、 为该评价报告技术负责人、 为该评价报告过程控制负责人;聘请所需技术专家 。
|
||||
根据市场部下达的评价项目为:{projectName} {evalTypeText} 任务,现任命 {projectLeader} 担任该安全评价项目组长(负责人)。
|
||||
根据评价部项目组组建原则及风险分析记录情况,现任命 {membersText} 为该评价项目组成员;任命 {compiler} 为该评价报告主要编制人、{auditor} 为该评价报告内部审核人、{techLead} 为该评价报告技术负责人、{processControlLead}为该评价报告过程控制负责人;聘请所需技术专家 。
|
||||
备注事项:
|
||||
|
||||
部门经理或负责人:
|
||||
|
|
|
|||
|
|
@ -16,12 +16,15 @@ import {
|
|||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||
import { ROLE_DEFINITIONS } from "~/enumerate/constant";
|
||||
import { ROLE_DEFINITIONS, EVAL_TYPE_MAP } from "~/enumerate/constant";
|
||||
import StatCardGroup from "~/components/StatCardGroup";
|
||||
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||
import { fillDocxTemplate } from "~/utils/fillDocxTemplate";
|
||||
|
||||
const { router } = tools;
|
||||
|
||||
const TEAM_TEMPLATE_URL = "/评价人员任命及专家聘用书(空白模板).docx";
|
||||
|
||||
const TeamContent = ({ readOnly, ...props }) => {
|
||||
const {
|
||||
safetyEvalBusiness,
|
||||
|
|
@ -225,6 +228,39 @@ const TeamContent = ({ readOnly, ...props }) => {
|
|||
setSigners((prev) => prev.filter((s) => s.personnelId !== personnelId));
|
||||
};
|
||||
|
||||
// 导出Word:按当前项目组配置填充模板(聘请所需技术专家、备注事项、部门经理或负责人、年月日保留空白)
|
||||
const handleExport = async () => {
|
||||
const namesByRole = (role) =>
|
||||
teamMembers
|
||||
.filter((m) => m.roles.some((r) => r.role === role))
|
||||
.map((m) => m.personnelName)
|
||||
.join("、");
|
||||
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((m) => m.personnelName)
|
||||
.join("、"),
|
||||
compiler: namesByRole("REPORT_COMPILER"),
|
||||
auditor: namesByRole("INTERNAL_AUDITOR"),
|
||||
techLead: namesByRole("TECHNICAL_LEAD"),
|
||||
processControlLead: namesByRole("PROCESS_CONTROL_LEAD"),
|
||||
};
|
||||
try {
|
||||
await fillDocxTemplate(
|
||||
TEAM_TEMPLATE_URL,
|
||||
data,
|
||||
`评价人员任命及专家聘用书${data.projectName ? `-${data.projectName}` : ""}.docx`,
|
||||
{ download: true },
|
||||
);
|
||||
message.success("导出成功");
|
||||
} catch {
|
||||
message.error("导出失败,请重试");
|
||||
}
|
||||
};
|
||||
|
||||
const handleSave = async () => {
|
||||
const allRoles = teamMembers.flatMap((m) => m.roles.map((r) => r.role));
|
||||
const requiredRoles = [
|
||||
|
|
@ -523,6 +559,7 @@ const TeamContent = ({ readOnly, ...props }) => {
|
|||
{!readOnly && (
|
||||
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||
<Flex justify="flex-end" gap={8}>
|
||||
<Button onClick={handleExport}>导出Word</Button>
|
||||
<Button
|
||||
type="primary"
|
||||
loading={memberSaveLoading || memberParticipantSaveLoading}
|
||||
|
|
|
|||
Loading…
Reference in New Issue