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 { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||||
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
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 StatCardGroup from "~/components/StatCardGroup";
|
||||||
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
import { fillDocxTemplate } from "~/utils/fillDocxTemplate";
|
||||||
|
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
|
|
||||||
|
const TEAM_TEMPLATE_URL = "/评价人员任命及专家聘用书(空白模板).docx";
|
||||||
|
|
||||||
const TeamContent = ({ readOnly, ...props }) => {
|
const TeamContent = ({ readOnly, ...props }) => {
|
||||||
const {
|
const {
|
||||||
safetyEvalBusiness,
|
safetyEvalBusiness,
|
||||||
|
|
@ -225,6 +228,39 @@ const TeamContent = ({ readOnly, ...props }) => {
|
||||||
setSigners((prev) => prev.filter((s) => s.personnelId !== personnelId));
|
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 handleSave = async () => {
|
||||||
const allRoles = teamMembers.flatMap((m) => m.roles.map((r) => r.role));
|
const allRoles = teamMembers.flatMap((m) => m.roles.map((r) => r.role));
|
||||||
const requiredRoles = [
|
const requiredRoles = [
|
||||||
|
|
@ -523,6 +559,7 @@ const TeamContent = ({ readOnly, ...props }) => {
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
<LayoutFooterPortal slotId="pf-footer-slot">
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
<Flex justify="flex-end" gap={8}>
|
<Flex justify="flex-end" gap={8}>
|
||||||
|
<Button onClick={handleExport}>导出Word</Button>
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
loading={memberSaveLoading || memberParticipantSaveLoading}
|
loading={memberSaveLoading || memberParticipantSaveLoading}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue