feat
parent
ca9919149e
commit
1052abb276
|
|
@ -832,6 +832,11 @@ function StaffFormModal({
|
|||
<Select
|
||||
placeholder="请选择"
|
||||
options={REGISTER_ENGINEER_OPTIONS}
|
||||
onChange={()=>{
|
||||
form.setFieldsValue({
|
||||
registeredSafetyEngineerCert: null,
|
||||
})
|
||||
}}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Col>
|
||||
|
|
@ -910,7 +915,11 @@ function StaffFormModal({
|
|||
label="是否评价师"
|
||||
initialValue={2}
|
||||
>
|
||||
<Select placeholder="请选择" options={EVALUATOR_OPTIONS} />
|
||||
<Select placeholder="请选择" options={EVALUATOR_OPTIONS} onChange={()=>{
|
||||
form.setFieldsValue({
|
||||
evaluatorCert: null,
|
||||
})
|
||||
}} />
|
||||
</Form.Item>
|
||||
</Col>
|
||||
{watchedEvaluatorFlag === 1 && (
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import { CAPABILITY_MAP, CERT_TYPE_MAP } from "~/enumerate/constant";
|
|||
import StaffViewModal from "~/components/StaffViewModal";
|
||||
|
||||
export default function OrgPersonnelSelectModal(props) {
|
||||
const { open, onCancel, onConfirm, existingIds = [] } = props;
|
||||
const { open, onCancel, onConfirm, existingIds = [], managementFlag } = props;
|
||||
const [searchForm] = Form.useForm();
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
|
||||
const [selectedRows, setSelectedRows] = useState([]);
|
||||
|
|
@ -26,6 +26,7 @@ export default function OrgPersonnelSelectModal(props) {
|
|||
current: page,
|
||||
size: pageSize,
|
||||
personName: values.personName || undefined,
|
||||
managementFlag: managementFlag || undefined,
|
||||
});
|
||||
if (res?.success !== false) {
|
||||
setDataSource(res?.data || []);
|
||||
|
|
|
|||
|
|
@ -1,63 +1,69 @@
|
|||
import { Button, Modal, Space, Table } from "antd";
|
||||
import { useMemo, useState } from "react";
|
||||
import { CAPABILITY_MAP, GENDER_MAP } from "~/enumerate/constant";
|
||||
import { useState } from "react";
|
||||
import { CAPABILITY_MAP, CERT_LEVEL_LABEL_BY_TYPE } from "~/enumerate/constant";
|
||||
import {
|
||||
PERSONNEL_POST_TYPE_MAP,
|
||||
TITLE_LEVEL_MAP,
|
||||
} from "~/enumerate/enterpriseOptions";
|
||||
import StaffViewModal from "~/components/StaffViewModal";
|
||||
import OrgPersonnelSelectModal from "./OrgPersonnelSelectModal";
|
||||
|
||||
function calcAge(birthDate) {
|
||||
if (!birthDate) return "-";
|
||||
const birth = new Date(birthDate);
|
||||
if (isNaN(birth.getTime())) return "-";
|
||||
const now = new Date();
|
||||
let age = now.getFullYear() - birth.getFullYear();
|
||||
const m = now.getMonth() - birth.getMonth();
|
||||
if (m < 0 || (m === 0 && now.getDate() < birth.getDate())) age--;
|
||||
return age >= 0 ? age : "-";
|
||||
}
|
||||
|
||||
const PersonnelStep=({
|
||||
personnelList = [],
|
||||
disabled,
|
||||
onAdd,
|
||||
onRemove,
|
||||
})=> {
|
||||
const PersonnelStep = ({ personnelList = [], disabled, onAdd, onRemove, managementFlag }) => {
|
||||
const [selectOpen, setSelectOpen] = useState(false);
|
||||
const [viewId, setViewId] = useState("");
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
|
||||
|
||||
const tableData = useMemo(
|
||||
() => personnelList.map((item) => ({ ...item, age: item.age ?? calcAge(item.birthDate) })),
|
||||
[personnelList],
|
||||
const existingIds = personnelList.map((item) =>
|
||||
String(item.sourcePersonnelId || item.id || ""),
|
||||
);
|
||||
|
||||
const existingIds = personnelList.map((item) => String(item.sourcePersonnelId || item.id || ""));
|
||||
|
||||
const handleBatchRemove = () => {
|
||||
const records = selectedRowKeys
|
||||
.map((key) => personnelList.find(
|
||||
(item) => String(item.sourcePersonnelId || item.id) === key,
|
||||
))
|
||||
.map((key) =>
|
||||
personnelList.find(
|
||||
(item) => String(item.sourcePersonnelId || item.id) === key,
|
||||
),
|
||||
)
|
||||
.filter(Boolean);
|
||||
if (records.length > 0) {
|
||||
onRemove?.(records);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div style={{ display: "flex", justifyContent: "space-between", marginBottom: 12 }}>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
justifyContent: "space-between",
|
||||
marginBottom: 12,
|
||||
}}
|
||||
>
|
||||
<span style={{ fontWeight: 600 }}>
|
||||
备案人员信息
|
||||
<span style={{ marginLeft: 8, color: "rgba(0,0,0,0.45)", fontWeight: 400 }}>
|
||||
<span
|
||||
style={{
|
||||
marginLeft: 8,
|
||||
color: "rgba(0,0,0,0.45)",
|
||||
fontWeight: 400,
|
||||
}}
|
||||
>
|
||||
当前 {personnelList.length} 人
|
||||
</span>
|
||||
</span>
|
||||
{!disabled && (
|
||||
<Space size="small">
|
||||
<Button type="primary" size="small" onClick={() => setSelectOpen(true)}>添加人员信息</Button>
|
||||
<Button
|
||||
type="primary"
|
||||
size="small"
|
||||
onClick={() => setSelectOpen(true)}
|
||||
>
|
||||
添加人员信息
|
||||
</Button>
|
||||
{selectedRowKeys.length > 0 && (
|
||||
<Button danger size="small" onClick={handleBatchRemove}>批量删除</Button>
|
||||
<Button danger size="small" onClick={handleBatchRemove}>
|
||||
批量删除
|
||||
</Button>
|
||||
)}
|
||||
</Space>
|
||||
)}
|
||||
|
|
@ -67,27 +73,89 @@ const PersonnelStep=({
|
|||
rowKey={(record) => String(record.sourcePersonnelId || record.id)}
|
||||
pagination={false}
|
||||
scroll={{ x: 1200, y: 400 }}
|
||||
dataSource={tableData}
|
||||
rowSelection={!disabled ? {
|
||||
selectedRowKeys,
|
||||
onChange: setSelectedRowKeys,
|
||||
} : undefined}
|
||||
dataSource={personnelList}
|
||||
rowSelection={
|
||||
!disabled
|
||||
? {
|
||||
selectedRowKeys,
|
||||
onChange: setSelectedRowKeys,
|
||||
}
|
||||
: undefined
|
||||
}
|
||||
columns={[
|
||||
{ title: "序号", width: 60, render: (_, __, index) => index + 1 },
|
||||
{ title: "人员姓名", dataIndex: "personName" },
|
||||
{ title: "部门", dataIndex: "deptName", ellipsis: true },
|
||||
{ title: "岗位", dataIndex: "positionName", ellipsis: true },
|
||||
{ title: "性别", dataIndex: "genderCode", width: 70, render: (v) => GENDER_MAP[v] || "-" },
|
||||
{ title: "年龄", dataIndex: "age", width: 70 },
|
||||
{ title: "注册安全工程师", dataIndex: "registerEngineerFlag", width: 120, render: (v) => v === 1 ? "是" : "否" },
|
||||
{ title: "评价师", dataIndex: "evaluatorCertNo", width: 80, render: (v) => v ? "是" : "否" },
|
||||
{ title: "姓名", dataIndex: "personName" },
|
||||
{
|
||||
title: "职务",
|
||||
dataIndex: "personnelPositionType",
|
||||
width: 120,
|
||||
render: (v) => PERSONNEL_POST_TYPE_MAP[v] || "-",
|
||||
},
|
||||
{
|
||||
title: "职称",
|
||||
dataIndex: "titleCodeArr",
|
||||
width: 100,
|
||||
render: (list) => {
|
||||
if (!Array.isArray(list) || !list.length) return "-";
|
||||
return list
|
||||
.map(
|
||||
(item) => TITLE_LEVEL_MAP[item.titleCode] || item.titleCode,
|
||||
)
|
||||
.join("、");
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "专业能力",
|
||||
dataIndex: "capabilityAssessment",
|
||||
render: (list) => {
|
||||
if (!Array.isArray(list) || !list.length) return "-";
|
||||
return list
|
||||
.map(
|
||||
(item) =>
|
||||
CAPABILITY_MAP[item.professionalCapabilityCode] ||
|
||||
item.professionalCapabilityCode,
|
||||
)
|
||||
.join("、");
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "职业资格等级及证书编号",
|
||||
dataIndex: "personnelCertFilingPageCOList",
|
||||
width: 200,
|
||||
render: (_, record) => {
|
||||
const codes = record.professionalCapabilityCodeList || [];
|
||||
return codes.length
|
||||
? codes.map((code) => CAPABILITY_MAP[code] || code).join("、")
|
||||
: "-";
|
||||
const cert = (record.personnelCertFilingPageCOList || []).find(
|
||||
(item) => item.certTypeCode === "evaluator",
|
||||
);
|
||||
if (!cert) return "否";
|
||||
const levelMap = CERT_LEVEL_LABEL_BY_TYPE.evaluator || {};
|
||||
return (
|
||||
<div>
|
||||
<div>{levelMap[cert.certLevel] || cert.certLevel || "-"}</div>
|
||||
<div style={{ color: "rgba(0,0,0,0.45)" }}>
|
||||
{cert.certNo || "-"}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "是否具有注册安全工程师资格",
|
||||
width: 200,
|
||||
render: (_, record) => {
|
||||
const cert = (record.personnelCertFilingPageCOList || []).find(
|
||||
(item) => item.certTypeCode === "registered_safety_engineer",
|
||||
);
|
||||
if (!cert) return "否";
|
||||
const levelMap =
|
||||
CERT_LEVEL_LABEL_BY_TYPE.registered_safety_engineer || {};
|
||||
return (
|
||||
<div>
|
||||
<div>{levelMap[cert.certLevel] || cert.certLevel || "-"}</div>
|
||||
<div style={{ color: "rgba(0,0,0,0.45)" }}>
|
||||
{cert.certNo || "-"}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
@ -99,12 +167,21 @@ const PersonnelStep=({
|
|||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
onClick={() => setViewId(record.sourcePersonnelId || record.id)}
|
||||
onClick={() =>
|
||||
setViewId(record.sourcePersonnelId || record.id)
|
||||
}
|
||||
>
|
||||
查看
|
||||
</Button>
|
||||
{!disabled && (
|
||||
<Button type="link" size="small" danger onClick={() => onRemove?.(record)}>删除</Button>
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
danger
|
||||
onClick={() => onRemove?.(record)}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
)}
|
||||
</Space>
|
||||
),
|
||||
|
|
@ -114,6 +191,7 @@ const PersonnelStep=({
|
|||
<OrgPersonnelSelectModal
|
||||
open={selectOpen}
|
||||
existingIds={existingIds}
|
||||
managementFlag={managementFlag}
|
||||
onCancel={() => setSelectOpen(false)}
|
||||
onConfirm={(ids, rows) => {
|
||||
onAdd?.(ids, rows);
|
||||
|
|
@ -123,11 +201,11 @@ const PersonnelStep=({
|
|||
<StaffViewModal
|
||||
open={!!viewId}
|
||||
currentId={viewId}
|
||||
|
||||
|
||||
onCancel={() => setViewId("")}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default PersonnelStep;
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ function FilingFormPage(props) {
|
|||
}
|
||||
if (!currentDetail?.personnelList?.length) {
|
||||
message.warning("请至少添加一位备案人员");
|
||||
setActiveStep("personnel");
|
||||
setActiveStep("managementPersonnel");
|
||||
return;
|
||||
}
|
||||
if (!currentDetail?.equipmentList?.length) {
|
||||
|
|
@ -352,11 +352,24 @@ function FilingFormPage(props) {
|
|||
forceRender: true,
|
||||
},
|
||||
{
|
||||
key: "personnel",
|
||||
label: "2. 专职人员备案",
|
||||
key: "managementPersonnel",
|
||||
label: "2. 管理人员基本情况汇总表",
|
||||
children: (
|
||||
<PersonnelStep
|
||||
personnelList={detail?.personnelList || []}
|
||||
personnelList={(detail?.personnelList || []).filter((item) => !!item.personnelPositionType)}
|
||||
disabled={readOnly}
|
||||
onAdd={handlePersonnelAdd}
|
||||
onRemove={handlePersonnelRemove}
|
||||
managementFlag={true}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
key: "personnel",
|
||||
label: "3. 专职安全评价师基本情况汇总表",
|
||||
children: (
|
||||
<PersonnelStep
|
||||
personnelList={(detail?.personnelList || []).filter((item) => !item.personnelPositionType)}
|
||||
disabled={readOnly}
|
||||
onAdd={handlePersonnelAdd}
|
||||
onRemove={handlePersonnelRemove}
|
||||
|
|
|
|||
Loading…
Reference in New Issue