Compare commits

...

2 Commits

Author SHA1 Message Date
fangjiakai 840952e848 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	src/pages/Container/BranchCompany/Qualification/Apply/Add/index.js
2025-12-12 08:51:42 +08:00
fangjiakai 25c55071a4 feat(qualification): 新增资质变更记录功能并优化申请流程
- 新增资质维护变更日志相关接口
- 移除资质审核批次号相关接口
- 优化资质申请页面,支持重新提交功能
- 统一资质类别和级别的命名规范
- 调整资质申请材料上传逻辑,按资料类型分组展示
- 完善资质记录列表的状态显示和操作按钮
- 优化资质维护页面表单结构和字段配置
- 修复资质申请和维护相关页面的数据显示问题
2025-12-12 08:49:50 +08:00
15 changed files with 560 additions and 510 deletions

View File

@ -28,3 +28,12 @@ export const qualificationMaintenanceQualificationsList = declareRequest(
"qualificationMaintenanceLoading",
`Post > @/xgfManager/qualificationsDetail/list`,
);
export const qualificationMaintenanceChangeLogList = declareRequest(
"qualificationMaintenanceLoading",
`Post > @/xgfManager/qualificationsChangeLog/list`,
);export const getQualificationMaintenanceChangeLogByIds = declareRequest(
"qualificationMaintenanceLoading",
`Get > /xgfManager/qualificationsChangeLog/listByIds?ids={ids}`,
);

View File

@ -8,10 +8,6 @@ export const qualificationReviewInfo = declareRequest(
"qualificationReviewLoading",
`Get > /xgfManager/qualificationsApply/{id}`,
);
export const qualificationReviewInfoBatchNum = declareRequest(
"qualificationReviewLoading",
`Get > /xgfManager/qualificationsApply/{id}/{batchNum}`,
);
export const corpInfoDetails = declareRequest(
"enterpriseLoading",
"Post > @/basicInfo/corpInfo/info/{id}",

View File

@ -16,8 +16,8 @@ import useDeleteFile from "zy-react-library/hooks/useDeleteFile";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { getLabelName, validatorEndTime } from "zy-react-library/utils";
import { NS_QUALIFICATION_APPLY } from "~/enumerate/namespace";
import { getLabelName,validatorEndTime, validatorTimeGTCurrentDay } from "zy-react-library/utils";
import { NS_QUALIFICATION_APPLY, NS_QUALIFICATION_MAINTENANCE } from "~/enumerate/namespace";
function Add(props) {
const query = useGetUrlQuery();
@ -25,14 +25,16 @@ function Add(props) {
const [currentStep, setCurrentStep] = useState(1);
const [formValues, setFormValues] = useState({});
const [specialList, setSpecialList] = useState([]);
const [secureList, setSecureList] = useState([]);
const getData = async () => {
const { data } = await props["qualificationApplyInfo"]({ id: query.id });
// 重新提交时删除id
if (query.resubmit) {
delete data.id;
}
setFormValues(data);
form.setFieldsValue(data);
setSpecialList(data.specialList);
setSecureList(data.secureList);
};
useEffect(() => {
@ -41,20 +43,19 @@ function Add(props) {
return (
<div>
<HeaderBack title={query.id ? "编辑" : "新增"} />
<HeaderBack title={query.resubmit ? "重新提交" : (query.id ? "编辑" : "新增")} />
<div style={{ padding: 20 }}>
{currentStep === 1
&& <StepOne setFormValues={setFormValues} setCurrentStep={setCurrentStep} formValues={formValues} form={form} />}
&&
<StepOne setFormValues={setFormValues} setCurrentStep={setCurrentStep} formValues={formValues} form={form} />}
{currentStep === 2
&& (
<StepTwo
setCurrentStep={setCurrentStep}
formValues={formValues}
query={query}
setSecureList={setSecureList}
setSpecialList={setSpecialList}
specialList={specialList}
secureList={secureList}
/>
)}
</div>
@ -120,10 +121,10 @@ const StepOneComponent = (props) => {
/>
),
},
{ name: "qualificationsTypeName", label: "资质类别名称", onlyForLabel: true },
{ name: "qualificationsTypeName", label: "资质类别", onlyForLabel: true },
{
name: "stakeholderLevel",
label: "资质级",
label: "资质",
render: (
<DictionarySelect
dictValue="stakeholderLevel"
@ -137,7 +138,7 @@ const StepOneComponent = (props) => {
/>
),
},
{ name: "stakeholderLevelName", label: "资质等级名称", onlyForLabel: true },
{ name: "stakeholderLevelName", label: "资质级别", onlyForLabel: true },
{
name: "groupUnitId",
label: "集团单位",
@ -200,24 +201,23 @@ const StepOneComponent = (props) => {
items: qualificationsListAll,
itemsField: { labelKey: "qualificationsName", valueKey: "id" },
},
{ name: "qualificationsRemarks", label: "备注", required: false, span: 24, render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
{ name: "remarks", label: "备注", required: false, span: 24, render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
]}
/>
);
};
const StepTwoComponent = (props) => {
const query = props.query;
const secureList = props.secureList;
const specialList = props.specialList;
const setSecureList = props.setSecureList;
const setSpecialList = props.setSpecialList;
const [uploadFileModalOpen, setUploadFileModalOpen] = useState(false);
const [typeGroup, setTypeGroup] = useState([]);
const [uploadFileModalData, setUploadFileModalData] = useState({
title: "",
index: -1,
files: [],
currentList: "",
isValidity: "",
});
@ -228,33 +228,42 @@ const StepTwoComponent = (props) => {
const getData = async () => {
if (!props.formValues.qualificationsId)
return;
if (specialList.length === 0 || secureList.length === 0) {
const { data } = await props["qualificationApplyQualificationListAll"]({ qualificationsId: props.formValues.qualificationsId });
setSpecialList(data.specialList || []);
setSecureList(data.secureList || []);
}
else {
if (specialList.length === 0) {
const { data } = await props["qualificationMaintenanceInfo"]({ id: props.formValues.qualificationsId });
await getTypeGroup(data.details)
setSpecialList(data.details || []);
} else {
await getTypeGroup(specialList)
for (let i = 0; i < specialList.length; i++) {
const files = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["148"], eqForeignKey: specialList[i].applyDetailId });
specialList[i].files = files;
}
for (let i = 0; i < secureList.length; i++) {
const files = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["149"], eqForeignKey: secureList[i].applyDetailId });
secureList[i].files = files;
specialList[i].files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["148"],
eqForeignKey: specialList[i].applyDetailId
});
}
}
};
const getTypeGroup = async (details) => {
const typeMap = new Map();
for (let i = 0; i < details.length; i++) {
const { dataType, dataTypeName } = details[i];
if (dataType && dataTypeName) {
typeMap.set(dataType, { dataType, dataTypeName });
}
}
setTypeGroup(Array.from(typeMap.values()));
}
useEffect(() => {
getData();
}, [props.formValues.qualificationsId]);
const onUploadFileOpen = (record, index, files, currentList) => {
const onUploadFileOpen = (record, id, files) => {
setUploadFileModalData({
id,
title: record.dataName,
index,
files,
currentList,
isValidity: record.isValidity,
qualificationsTermStart: record.qualificationsTermStart,
qualificationsTermEnd: record.qualificationsTermEnd,
@ -264,11 +273,12 @@ const StepTwoComponent = (props) => {
const onUploadFileConfirm = (values, list) => {
const newList = cloneDeep(list);
newList[uploadFileModalData.index].files = values.files;
newList[uploadFileModalData.index].deleteFiles = values.deleteFiles;
newList[uploadFileModalData.index].qualificationsTermStart = values.qualificationsTermStart;
newList[uploadFileModalData.index].qualificationsTermEnd = values.qualificationsTermEnd;
newList[uploadFileModalData.index].uploadedTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
const index = newList.findIndex(item => item.id === uploadFileModalData.id);
newList[index].files = values.files;
newList[index].deleteFiles = values.deleteFiles;
newList[index].qualificationsTermStart = values.qualificationsTermStart;
newList[index].qualificationsTermEnd = values.qualificationsTermEnd;
newList[index].uploadedTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
return newList;
};
@ -285,8 +295,6 @@ const StepTwoComponent = (props) => {
const onSubmit = async () => {
if (!validateFileList(specialList))
return;
if (!validateFileList(secureList))
return;
for (let i = 0; i < specialList.length; i++) {
await deleteFile({ single: false, files: specialList[i].deleteFiles });
const { id } = await uploadFile({
@ -296,19 +304,13 @@ const StepTwoComponent = (props) => {
});
specialList[i].applyDetailId = id;
}
for (let i = 0; i < secureList.length; i++) {
await deleteFile({ single: false, files: secureList[i].deleteFiles });
const { id } = await uploadFile({
single: false,
files: secureList[i].files,
params: { type: UPLOAD_FILE_TYPE_ENUM["149"], foreignKey: secureList[i].applyDetailId },
});
secureList[i].applyDetailId = id;
// 重新提交时删除id
if (query.resubmit) {
delete query.id;
}
const data = { ...props.formValues, qualificationsApplyDetailList: [...specialList, ...secureList] };
const data = { ...props.formValues, qualificationsApplyDetailList: [...specialList] };
const { success } = await props[!query.id ? "qualificationApplyAdd" : "qualificationApplyUpdate"]({
...data,
batchNum: 1,
id: query.id,
});
if (success) {
@ -322,14 +324,16 @@ const StepTwoComponent = (props) => {
<Spin
spinning={props.qualificationApply.qualificationApplyLoading || uploadFileLoading || deleteFileLoading || getFileLoading}
>
<div>
<Divider orientation="left">专项资质信息</Divider>
{typeGroup.map((item) => (
<div key={item.dataType}>
<Divider orientation="left">{item.dataTypeName}</Divider>
<Table
dataSource={specialList}
dataSource={specialList.filter((record) => record.dataType === item.dataType)}
pagination={false}
options={false}
disabledResizer={true}
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", dataIndex: "uploadedTime", render: (_, record) => record.uploadedTime || "-" },
{
@ -340,7 +344,7 @@ const StepTwoComponent = (props) => {
{
title: "操作",
width: 150,
render: (_, record, index) => (
render: (_, record) => (
<Space>
{
record.files?.length > 0
@ -348,7 +352,7 @@ const StepTwoComponent = (props) => {
<Button
type="link"
onClick={() => {
onUploadFileOpen(record, index, record.files, "specialList");
onUploadFileOpen(record, record.id, record.files);
}}
>
修改
@ -358,7 +362,7 @@ const StepTwoComponent = (props) => {
<Button
type="link"
onClick={() => {
onUploadFileOpen(record, index, [], "specialList");
onUploadFileOpen(record, record.id, []);
}}
>
上传
@ -371,55 +375,8 @@ const StepTwoComponent = (props) => {
]}
/>
</div>
<div>
<Divider orientation="left">安全资质信息</Divider>
<Table
dataSource={secureList}
pagination={false}
options={false}
disabledResizer={true}
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", dataIndex: "uploadedTime", render: (_, record) => record.uploadedTime || "-" },
{
title: "时效性",
dataIndex: "qualificationsTermStart",
render: (_, record) => record.qualificationsTermStart ? `${record.qualificationsTermStart}${record.qualificationsTermEnd}` : "-",
},
{
title: "操作",
width: 150,
render: (_, record, index) => (
<Space>
{
record.files?.length > 0
? (
<Button
type="link"
onClick={() => {
onUploadFileOpen(record, index, record.files, "secureList");
}}
>
修改
</Button>
)
: (
<Button
type="link"
onClick={() => {
onUploadFileOpen(record, index, [], "secureList");
}}
>
上传
</Button>
)
))
}
</Space>
),
},
]}
/>
</div>
<div style={{ textAlign: "center", marginTop: 20 }}>
<Space>
<Button onClick={() => {
@ -444,11 +401,7 @@ const StepTwoComponent = (props) => {
}}
onSubmit={(values) => {
setUploadFileModalOpen(false);
if (uploadFileModalData.currentList === "specialList") {
setSpecialList(onUploadFileConfirm(values, specialList));
return;
}
setSecureList(onUploadFileConfirm(values, secureList));
}}
/>
)}
@ -509,7 +462,7 @@ const FileUpload = (props) => {
name: "qualificationsTermEnd",
label: "有效期结束时间",
render: FORM_ITEM_RENDER_ENUM.DATETIME,
rules: [validatorEndTime(qualificationsTermStart)],
rules: [validatorEndTime(qualificationsTermStart), validatorTimeGTCurrentDay()],
hidden: !(props.data.isValidity === 0),
},
]}
@ -519,6 +472,6 @@ const FileUpload = (props) => {
};
const StepOne = Connect([NS_QUALIFICATION_APPLY], true)(StepOneComponent);
const StepTwo = Connect([NS_QUALIFICATION_APPLY], true)(StepTwoComponent);
const StepTwo = Connect([NS_QUALIFICATION_APPLY, NS_QUALIFICATION_MAINTENANCE], true)(StepTwoComponent);
export default Connect([NS_QUALIFICATION_APPLY], true)(Add);

View File

@ -30,8 +30,8 @@ function List(props) {
labelCol={{ span: 8 }}
options={[
{ name: "qualificationsName", label: "资质名称" },
{ name: "qualificationsTypeId", label: "相关方类别", render: (<DictionarySelect dictValue="qualificationsType" />) },
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "qualificationsTypeId", label: "资质类别", render: (<DictionarySelect dictValue="qualificationsType" />) },
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
]}
form={form}
onFinish={getData}
@ -52,11 +52,10 @@ function List(props) {
)}
columns={[
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别(相关方类别)", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "材料数量", dataIndex: "materialNum" },
{ title: "审核公司", dataIndex: "groupUnitName" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{ title: "审核状态", dataIndex: "status", render: (_, record) => (
<>
{record.status === 200 && "审核中"}

View File

@ -14,13 +14,14 @@ function View(props) {
const { loading: getFileLoading, getFile } = useGetFile();
const [info, setInfo] = useState([]);
const [typeGroup, setTypeGroup] = useState([]);
const [specialList, setSpecialList] = useState([]);
const [secureList, setSecureList] = useState([]);
const [viewQualificationDetailsModalOpen, setViewQualificationDetailsModalOpen] = useState(false);
const [viewQualificationDetailsModalData, setViewQualificationDetailsModalData] = useState({});
const getData = async () => {
const { data } = await props["qualificationApplyInfo"]({ id: query.id });
await getTypeGroup(data.specialList);
setInfo(data);
for (let i = 0; i < data.specialList.length; i++) {
const files = await getFile({
@ -29,17 +30,20 @@ function View(props) {
});
data.specialList[i].files = files;
}
for (let i = 0; i < data.secureList.length; i++) {
const files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["149"],
eqForeignKey: data.secureList[i].applyDetailId,
});
data.secureList[i].files = files;
}
setSpecialList(data.specialList);
setSecureList(data.secureList);
};
const getTypeGroup = async (details) => {
const typeMap = new Map();
for (let i = 0; i < details.length; i++) {
const { dataType, dataTypeName } = details[i];
if (dataType && dataTypeName) {
typeMap.set(dataType, { dataType, dataTypeName });
}
}
setTypeGroup(Array.from(typeMap.values()));
}
useEffect(() => {
getData();
}, []);
@ -59,7 +63,7 @@ function View(props) {
styles={{ label: { width: 200 } }}
items={[
{ label: "资质类别", children: info.qualificationsTypeName },
{ label: "资质级", children: info.stakeholderLevelName },
{ label: "资质", children: info.stakeholderLevelName },
...(info.stakeholderLevel === "two-level"
? [
{ label: "集团单位", children: info.groupUnitName },
@ -68,47 +72,15 @@ function View(props) {
]
: []),
{ label: "资质名称", children: info.qualificationsName },
{ label: "备注", children: info.qualificationsRemarks },
{ label: "备注", children: info.remarks },
]}
/>
</div>
<div>
<Divider orientation="left">专项资质信息</Divider>
{typeGroup.map((item) => (
<div key={item.dataType}>
<Divider orientation="left">{item.dataTypeName}</Divider>
<Table
dataSource={specialList}
pagination={false}
options={false}
disabledResizer={true}
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", dataIndex: "uploadedTime", render: (_, record) => record.uploadedTime || "-" },
{
title: "时效性",
dataIndex: "qualificationsTermStart",
render: (_, record) => record.qualificationsTermStart ? `${record.qualificationsTermStart}${record.qualificationsTermEnd}` : "-",
},
{
title: "操作",
width: 80,
render: (_, record) => (
<Button
type="link"
onClick={() => {
setViewQualificationDetailsModalOpen(true);
setViewQualificationDetailsModalData(record);
}}
>
查看
</Button>
),
},
]}
/>
</div>
<div>
<Divider orientation="left">安全资质信息</Divider>
<Table
dataSource={secureList}
dataSource={specialList.filter((detail) => detail.dataType === item.dataType)}
pagination={false}
options={false}
disabledResizer={true}
@ -138,6 +110,8 @@ function View(props) {
]}
/>
</div>
))
}
</Spin>
{viewQualificationDetailsModalOpen
&& <ViewQualificationDetailsModal onCancel={() => setViewQualificationDetailsModalOpen(false)} data={viewQualificationDetailsModalData} />}

View File

@ -1,5 +1,7 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import { useState } from "react";
import { Button, Form, Space, Tooltip } from "antd";
import { WarningOutlined } from "@ant-design/icons";
import Search from "zy-react-library/components/Search";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import Table from "zy-react-library/components/Table";
@ -8,6 +10,7 @@ import useTable from "zy-react-library/hooks/useTable";
import { NS_QUALIFICATION_RECORDS } from "~/enumerate/namespace";
function List(props) {
const [currentTenantId, setCurrentTenantId] = useState("");
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["qualificationRecordsList"], {
form,
@ -18,6 +21,9 @@ function List(props) {
auditStatus: auditStatus[1],
};
},
onSuccess: (data) => {
setCurrentTenantId(data.extValues.currentTenantId);
}
});
return (
@ -28,17 +34,17 @@ function List(props) {
{ name: "qualificationsName", label: "资质名称" },
{
name: "qualificationsTypeId",
label: "相关方类别",
label: "资质类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "auditStatus", label: "审核状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{
name: "auditStatus", label: "审核状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [
{ bianma: "200-200", name: "主管部门审核中" },
{ bianma: "200-300", name: "主管部门已驳回" },
{ bianma: "300-200", name: "安监部门审核中" },
{ bianma: "300-300", name: "安监部门已驳回" },
{ bianma: "400", name: "已完成" },
] },
]
},
]}
form={form}
onFinish={getData}
@ -48,26 +54,65 @@ function List(props) {
{ title: "相关方名称", dataIndex: "corpName" },
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "资质等级", dataIndex: "stakeholderLevelName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "时效属性", dataIndex: "isLongTerm", render: (_, record) => record.isLongTerm ? "长期" : "短期" },
{ title: "材料数", dataIndex: "materialNum" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{ title: "当前状态", dataIndex: "auditProcess", render: (_, record) => (
{
title: "资质状态", dataIndex: "qualificationsStatus", render: (_, record) => (
<div>
{record.qualificationsStatus === 0 && "正常"}
{record.qualificationsStatus === 1 && "待完善"}
{record.qualificationsStatus === 2 && (
<Tooltip
overlayStyle={{ width: 'auto', maxWidth: '700px', whiteSpace: 'normal', wordBreak: 'break-word' }}
title={
record.expireList ? (
<div style={{ width: '100%' }}>
{record.expireList.map((item, index) => (
<div key={index}>
{item.dataName} 已于 {item.qualificationsTermEnd} 过期
</div>
))}
</div>
) : "部分资料已过期"
}
>
<span style={{ display: 'inline-flex', alignItems: 'center' }}>
存在异常 <WarningOutlined style={{ color: '#faad14', marginLeft: 4 }} />
</span>
</Tooltip>
)}
{record.qualificationsStatus === 3 && "资质过期"}
</div>
)
},
{
title: "当前状态", dataIndex: "auditProcess", render: (_, record) => (
<div>
{record.auditProcess === "100" && "集团单位"}
{record.auditProcess === "200" && "股份主管部门"}
{record.auditProcess === "300" && "股份安监部门"}
{record.status === 100 && "待审核"}
{record.status === 200 && "审核中"}
{record.status === 300 && "已驳回"}
{record.status === 400 && "已通过"}
</div>
) },
)
},
{
title: "操作",
fixed: "right",
width: 100,
width: 200,
render: (_, record) => (
<Space>
{record.status === 400 && record.corpId === currentTenantId && (record.qualificationsStatus === 1 || record.qualificationsStatus === 2) && (
<Button
type="link"
onClick={() => {
props.history.push(`../apply/add?id=${record.id}&resubmit=true`);
}}
>
重新提交
</Button>
)}
<Button
type="link"
onClick={() => {

View File

@ -20,10 +20,10 @@ function List(props) {
{ name: "qualificationsName", label: "资质名称" },
{
name: "qualificationsTypeId",
label: "相关方类别",
label: "资质类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
]}
form={form}
onFinish={getData}
@ -33,9 +33,37 @@ function List(props) {
{ title: "相关方名称", dataIndex: "corpName" },
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "材料数", dataIndex: "materialNum" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{
title: "资质状态", dataIndex: "qualificationsStatus", render: (_, record) => (
<div>
{record.qualificationsStatus === 0 && "正常"}
{record.qualificationsStatus === 1 && "待完善"}
{record.qualificationsStatus === 2 && (
<Tooltip
overlayStyle={{ width: 'auto', maxWidth: '700px', whiteSpace: 'normal', wordBreak: 'break-word' }}
title={
record.expireList ? (
<div style={{ width: '100%' }}>
{record.expireList.map((item, index) => (
<div key={index}>
{item.dataName} 已于 {item.qualificationsTermEnd} 过期
</div>
))}
</div>
) : "部分资料已过期"
}
>
<span style={{ display: 'inline-flex', alignItems: 'center' }}>
存在异常 <WarningOutlined style={{ color: '#faad14', marginLeft: 4 }} />
</span>
</Tooltip>
)}
{record.qualificationsStatus === 3 && "资质过期"}
</div>
)
},
{
title: "操作",
fixed: "right",

View File

@ -20,10 +20,10 @@ function List(props) {
{ name: "qualificationsName", label: "资质名称" },
{
name: "qualificationsTypeId",
label: "相关方类别",
label: "资质类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
]}
form={form}
onFinish={getData}
@ -33,9 +33,37 @@ function List(props) {
{ title: "相关方名称", dataIndex: "corpName" },
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "材料数", dataIndex: "materialNum" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{
title: "资质状态", dataIndex: "qualificationsStatus", render: (_, record) => (
<div>
{record.qualificationsStatus === 0 && "正常"}
{record.qualificationsStatus === 1 && "待完善"}
{record.qualificationsStatus === 2 && (
<Tooltip
overlayStyle={{ width: 'auto', maxWidth: '700px', whiteSpace: 'normal', wordBreak: 'break-word' }}
title={
record.expireList ? (
<div style={{ width: '100%' }}>
{record.expireList.map((item, index) => (
<div key={index}>
{item.dataName} 已于 {item.qualificationsTermEnd} 过期
</div>
))}
</div>
) : "部分资料已过期"
}
>
<span style={{ display: 'inline-flex', alignItems: 'center' }}>
存在异常 <WarningOutlined style={{ color: '#faad14', marginLeft: 4 }} />
</span>
</Tooltip>
)}
{record.qualificationsStatus === 3 && "资质过期"}
</div>
)
},
{
title: "操作",
fixed: "right",

View File

@ -30,8 +30,8 @@ function List(props) {
labelCol={{ span: 8 }}
options={[
{ name: "qualificationsName", label: "资质名称" },
{ name: "qualificationsTypeId", label: "相关方类别", render: (<DictionarySelect dictValue="qualificationsType" />) },
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "qualificationsTypeId", label: "资质类别", render: (<DictionarySelect dictValue="qualificationsType" />) },
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
]}
form={form}
onFinish={getData}
@ -52,11 +52,11 @@ function List(props) {
)}
columns={[
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别(相关方类别)", dataIndex: "qualificationsTypeName" },
{ title: "资质级", dataIndex: "stakeholderLevelName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "资质", dataIndex: "stakeholderLevelName" },
{ title: "材料数量", dataIndex: "materialNum" },
{ title: "直属审核公司", dataIndex: "groupUnitName" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{ title: "备注", dataIndex: "remarks" },
{ title: "审核状态", dataIndex: "status", render: (_, record) => (
<>
{record.status === 200 && "审核中"}

View File

@ -22,8 +22,6 @@ function Add(props) {
...data,
managerUser: data.managerUser.split(","),
managerUserName: data.managerUserName.split(","),
supervisionUser: data.supervisionUser.split(","),
supervisionUserName: data.supervisionUserName.split(","),
});
};
@ -36,8 +34,6 @@ function Add(props) {
...values,
managerUser: values.managerUser.join(","),
managerUserName: values.managerUserName.join(","),
supervisionUser: values.supervisionUser.join(","),
supervisionUserName: values.supervisionUserName.join(","),
id: query.id,
});
if (success) {
@ -54,14 +50,21 @@ function Add(props) {
form={form}
values={{
status: 0,
details: [{
dataType: undefined,
dataTypeName: undefined,
dataName: undefined,
isValidity: undefined,
}],
}}
loading={props.qualificationMaintenance.qualificationMaintenanceLoading}
onFinish={onSubmit}
options={[
{ key: "divider-basic", label: "基础信息", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{ name: "qualificationsName", label: "资质名称", span: 24 },
{
name: "qualificationsTypeId",
label: "相关方类别",
label: "资质类别",
render: (
<DictionarySelect
dictValue="qualificationsType"
@ -71,7 +74,7 @@ function Add(props) {
/>
),
},
{ name: "qualificationsTypeName", label: "相关方类别名称", onlyForLabel: true },
{ name: "qualificationsTypeName", label: "资质类别", onlyForLabel: true },
{
name: "stakeholderLevel",
label: "资质级别",
@ -84,7 +87,7 @@ function Add(props) {
/>
),
},
{ name: "stakeholderLevelName", label: "资质级别名称", onlyForLabel: true },
{ name: "stakeholderLevelName", label: "资质级别", onlyForLabel: true },
{
name: "managerDept",
label: "主管部门",
@ -117,42 +120,48 @@ function Add(props) {
),
},
{ name: "managerUserName", label: "主管人员名称", onlyForLabel: true },
{
name: "supervisionDept",
label: "安监部门",
render: (
<DepartmentSelectTree
onGetLabel={(label) => {
form.setFieldValue("supervisionDeptName", label);
}}
onChange={() => {
form.setFieldValue("supervisionUser", []);
form.setFieldValue("supervisionUserName", []);
}}
/>
),
},
{ name: "supervisionDeptName", label: "安监部门名称", onlyForLabel: true },
{
name: "supervisionUser",
label: "安监人员",
render: (
<PersonnelSelect
params={{ departmentId: supervisionDept }}
mode="multiple"
onGetLabel={(label) => {
form.setFieldValue("supervisionUserName", label);
}}
/>
),
},
{ name: "supervisionUserName", label: "安监人员名称", onlyForLabel: true },
{
name: "status",
label: "是否启用",
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ name: "是", bianma: 0 }, { name: "否", bianma: 1 }],
},
{ key: "divider-detail", label: "资料信息", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
name: "details",
span: 24,
render: FORM_ITEM_RENDER_ENUM.FORM_LIST,
formListUniqueProps: {
options: field => (
[
{
label: "资料属性",
name: [field.name, "dataType"],
span: 8,
render: (
<DictionarySelect
dictValue="dataType"
onGetLabel={(label) => {
form.setFieldValue(["details", field.name, "dataTypeName"], label);
}}
/>
),
},
{ label: "资料属性名称", name: [field.name, "dataTypeName"], span: 8, onlyForLabel: true },
{ label: "资料名称", name: [field.name, "dataName"], span: 8 },
{
label: "是否涉及有效时间",
name: [field.name, "isValidity"],
span: 8,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 0, name: "是" }, { bianma: 1, name: "否" }],
labelCol: { span: 6 },
},
]
),
},
},
]}
/>
</div>

View File

@ -34,8 +34,8 @@ function List(props) {
labelCol={{ span: 8 }}
options={[
{ name: "qualificationsName", label: "资质名称" },
{ name: "qualificationsTypeId", label: "相关方类别", render: (<DictionarySelect dictValue="qualificationsType" />) },
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "qualificationsTypeId", label: "资质类别", render: (<DictionarySelect dictValue="qualificationsType" />) },
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
]}
form={form}
onFinish={getData}
@ -56,10 +56,11 @@ function List(props) {
)}
columns={[
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别(相关方类别)", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "主管部门", dataIndex: "managerDeptName" },
{ title: "材料数量", dataIndex: "materialNum" },
{ title: "材料数量", dataIndex: "materialNum",render:(_,record) => record.details?.length || 0 },
{ title: "状态", dataIndex: "status",render:(_,record) => record.status === 0 ? "启用" : "禁用" },
{
title: "操作",
fixed: "right",
@ -74,15 +75,6 @@ function List(props) {
>
编辑
</Button>
<Button
type="link"
disabled={record.applyNum > 0}
onClick={() => {
props.history.push(`./addQualifications?id=${record.id}`);
}}
>
添加资质
</Button>
<Button
type="link"
danger
@ -90,6 +82,14 @@ function List(props) {
>
{record.status === 0 ? "禁用" : "启用"}
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./changeLogList?id=${record.id}`);
}}
>
变更记录
</Button>
</Space>
),
},

View File

@ -19,14 +19,40 @@ function History(props) {
{ title: "相关方名称", dataIndex: "corpName" },
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "材料数", dataIndex: "materialNum" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{
title: "资质状态", dataIndex: "qualificationsStatus", render: (_, record) => (
<div>
{record.qualificationsStatus === 0 && "正常"}
{record.qualificationsStatus === 1 && "待完善"}
{record.qualificationsStatus === 2 && (
<Tooltip
overlayStyle={{ width: 'auto', maxWidth: '700px', whiteSpace: 'normal', wordBreak: 'break-word' }}
title={
record.expireList ? (
<div style={{ width: '100%' }}>
{record.expireList.map((item, index) => (
<div key={index}>
{item.dataName} 已于 {item.qualificationsTermEnd} 过期
</div>
))}
</div>
) : "部分资料已过期"
}
>
<span style={{ display: 'inline-flex', alignItems: 'center' }}>
存在异常 <WarningOutlined style={{ color: '#faad14', marginLeft: 4 }} />
</span>
</Tooltip>
)}
{record.qualificationsStatus === 3 && "资质过期"}
</div>
)
},
{ title: "当前状态", dataIndex: "auditProcess", render: (_, record) => (
<div>
{record.auditProcess === "100" && "集团单位"}
{record.auditProcess === "200" && "股份主管部门"}
{record.auditProcess === "300" && "股份安监部门"}
{record.status === 100 && "待审核"}
{record.status === 200 && "审核中"}
{record.status === 300 && "已驳回"}
@ -43,7 +69,7 @@ function History(props) {
<Button
type="link"
onClick={() => {
props.history.push(`../ViewInfo?id=${record.id}&batchNum=${record.batchNum}`);
props.history.push(`../ViewInfo?id=${record.id}`);
}}
>
查看

View File

@ -1,5 +1,6 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import { Button, Form, Space, Tooltip } from "antd";
import { WarningOutlined } from "@ant-design/icons";
import Search from "zy-react-library/components/Search";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import Table from "zy-react-library/components/Table";
@ -28,17 +29,17 @@ function List(props) {
{ name: "qualificationsName", label: "资质名称" },
{
name: "qualificationsTypeId",
label: "相关方类别",
label: "资质类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "auditStatus", label: "审核状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{
name: "auditStatus", label: "审核状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [
{ bianma: "200-200", name: "主管部门审核中" },
{ bianma: "200-300", name: "主管部门已驳回" },
{ bianma: "300-200", name: "安监部门审核中" },
{ bianma: "300-300", name: "安监部门已驳回" },
{ bianma: "400", name: "已完成" },
] },
]
},
]}
form={form}
onFinish={getData}
@ -48,20 +49,50 @@ function List(props) {
{ title: "相关方名称", dataIndex: "corpName" },
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "时效属性", dataIndex: "isLongTerm", render: (_, record) => record.isLongTerm ? "长期" : "短期" },
{ title: "材料数", dataIndex: "materialNum" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{ title: "当前状态", dataIndex: "auditProcess", render: (_, record) => (
{
title: "资质状态", dataIndex: "qualificationsStatus", render: (_, record) => (
<div>
{record.qualificationsStatus === 0 && "正常"}
{record.qualificationsStatus === 1 && "待完善"}
{record.qualificationsStatus === 2 && (
<Tooltip
overlayStyle={{ width: 'auto', maxWidth: '700px', whiteSpace: 'normal', wordBreak: 'break-word' }}
title={
record.expireList ? (
<div style={{ width: '100%' }}>
{record.expireList.map((item, index) => (
<div key={index}>
{item.dataName} 已于 {item.qualificationsTermEnd} 过期
</div>
))}
</div>
) : "部分资料已过期"
}
>
<span style={{ display: 'inline-flex', alignItems: 'center' }}>
存在异常 <WarningOutlined style={{ color: '#faad14', marginLeft: 4 }} />
</span>
</Tooltip>
)}
{record.qualificationsStatus === 3 && "资质过期"}
</div>
)
},
{
title: "审核状态", dataIndex: "auditProcess", render: (_, record) => (
<div>
{record.auditProcess === "100" && "集团单位"}
{record.auditProcess === "200" && "股份主管部门"}
{record.auditProcess === "300" && "股份安监部门"}
{record.status === 100 && "待审核"}
{record.status === 200 && "审核中"}
{record.status === 300 && "已驳回"}
{record.status === 400 && "已通过"}
</div>
) },
)
},
{ title:"时效性", dataIndex:"qualificationsTermStart", render: (_, record) => record.qualificationsTermStart ? `${record.qualificationsTermStart}${record.qualificationsTermEnd}` : "-",},
{
title: "操作",
fixed: "right",
@ -76,14 +107,6 @@ function List(props) {
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./history?id=${record.id}`);
}}
>
过往资料
</Button>
</Space>
),
},

View File

@ -20,10 +20,10 @@ function List(props) {
{ name: "qualificationsName", label: "资质名称" },
{
name: "qualificationsTypeId",
label: "相关方类别",
label: "资质类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "stakeholderLevel", label: "相关方级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
{ name: "stakeholderLevel", label: "资质级别", render: (<DictionarySelect dictValue="stakeholderLevel" />) },
]}
form={form}
onFinish={getData}
@ -38,9 +38,37 @@ function List(props) {
},
{ title: "资质名称", dataIndex: "qualificationsName" },
{ title: "资质类别", dataIndex: "qualificationsTypeName" },
{ title: "相关方等级", dataIndex: "stakeholderLevelName" },
{ title: "资质级别", dataIndex: "stakeholderLevelName" },
{ title: "材料数", dataIndex: "materialNum" },
{ title: "备注", dataIndex: "qualificationsRemarks" },
{
title: "资质状态", dataIndex: "qualificationsStatus", render: (_, record) => (
<div>
{record.qualificationsStatus === 0 && "正常"}
{record.qualificationsStatus === 1 && "待完善"}
{record.qualificationsStatus === 2 && (
<Tooltip
overlayStyle={{ width: 'auto', maxWidth: '700px', whiteSpace: 'normal', wordBreak: 'break-word' }}
title={
record.expireList ? (
<div style={{ width: '100%' }}>
{record.expireList.map((item, index) => (
<div key={index}>
{item.dataName} 已于 {item.qualificationsTermEnd} 过期
</div>
))}
</div>
) : "部分资料已过期"
}
>
<span style={{ display: 'inline-flex', alignItems: 'center' }}>
存在异常 <WarningOutlined style={{ color: '#faad14', marginLeft: 4 }} />
</span>
</Tooltip>
)}
{record.qualificationsStatus === 3 && "资质过期"}
</div>
)
},
{
title: "操作",
fixed: "right",

View File

@ -7,7 +7,6 @@ import TooltipPreviewImg from "zy-react-library/components/TooltipPreviewImg";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import ViewQualificationDetailsModal from "~/components/ViewQualificationDetailsModal";
import { NS_QUALIFICATION_REVIEW } from "~/enumerate/namespace";
@ -29,41 +28,21 @@ function ViewInfo(props) {
const [info, setInfo] = useState({
processFlow: [],
specialList: [],
secureList: [],
});
const [corpInfoData, setCorpInfoData] = useState({});
const [list, setList] = useState([]);
const [typeGroup, setTypeGroup] = useState([]);
const [viewQualificationDetailsModalOpen, setViewQualificationDetailsModalOpen] = useState(false);
const [viewQualificationDetailsModalData, setViewQualificationDetailsModalData] = useState({});
const getFiles = async (list) => {
for (let i = 0; i < list.length; i++) {
const files = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["6"], eqForeignKey: list[i].userQualificationinfoId });
list[i].files = files;
}
setList(list);
};
const { tableProps, getData: run } = useTable(props["userQualificationList"], {
useStorageQueryCriteria: false,
params: () => ({
eqCorpinfoId: info.corpId,
eqQualificationinfoType: 1,
}),
manual: true,
defaultPageSize: 10,
onSuccess: (data) => {
getFiles(data.list);
},
});
const getData = async () => {
if (!query.id)
return;
const { data } = await props[query.batchNum ? "qualificationReviewInfoBatchNum" : "qualificationReviewInfo"]({
const { data } = await props["qualificationReviewInfo"]({
id: query.id,
batchNum: query.batchNum,
});
await getTypeGroup(data);
for (let i = 0; i < data.specialList.length; i++) {
const files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["148"],
@ -71,13 +50,6 @@ function ViewInfo(props) {
});
data.specialList[i].files = files;
}
for (let i = 0; i < data.secureList.length; i++) {
const files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["149"],
eqForeignKey: data.secureList[i].applyDetailId,
});
data.secureList[i].files = files;
}
setInfo(data);
props.onGetData?.(data);
@ -88,9 +60,17 @@ function ViewInfo(props) {
});
corpInfoData.licenseFile = licenseFile;
setCorpInfoData(corpInfoData);
run();
};
const getTypeGroup = async (data) => {
const typeMap = new Map();
for (let i = 0; i < data.specialList.length; i++) {
const { dataType, dataTypeName } = data.specialList[i];
if (dataType && dataTypeName) {
typeMap.set(dataType, { dataType, dataTypeName });
}
}
setTypeGroup(Array.from(typeMap.values()));
}
useEffect(() => {
getData();
@ -102,22 +82,7 @@ function ViewInfo(props) {
<div style={{ padding: "0 20px 20px 20px" }}>
<div className="qualification-view">
<div>
<Divider orientation="left">审核信息及流程</Divider>
<Spin spinning={props.qualificationReview.qualificationReviewLoading}>
<Descriptions
column={2}
bordered
styles={{ label: { width: 200 }, content: { width: 500 } }}
items={[
{ label: "相关方名称", children: info.corpName },
{ label: "所属集团单位", children: info.groupUnitName },
{ label: "资质名称", children: info.qualificationsName },
{ label: "资质类别", children: info.qualificationsTypeName },
{ label: "相关方等级", children: info.stakeholderLevelName },
{ label: "材料数", children: info.materialNum },
{ label: "备注", children: info.qualificationsRemarks },
]}
/>
<Divider orientation="left">流程信息</Divider>
<div className="flows-container">
<div className="flows">
{
@ -150,6 +115,25 @@ function ViewInfo(props) {
}
</div>
</div>
</div>
<div>
<Divider orientation="left">审核信息</Divider>
<Spin spinning={props.qualificationReview.qualificationReviewLoading}>
<Descriptions
column={2}
bordered
styles={{ label: { width: 200 }, content: { width: 500 } }}
items={[
{ label: "相关方名称", children: info.corpName },
{ label: "所属集团单位", children: info.groupUnitName },
{ label: "资质名称", children: info.qualificationsName },
{ label: "资质类别", children: info.qualificationsTypeName },
{ label: "资质级别", children: info.stakeholderLevelName },
{ label: "材料数", children: info.materialNum },
{ label: "备注", children: info.remarks },
]}
/>
</Spin>
</div>
<div>
@ -189,14 +173,15 @@ function ViewInfo(props) {
/>
</Spin>
</div>
<div>
<Divider orientation="left">专项资质信息</Divider>
{typeGroup.map((item) => (
<div key={item.dataType}>
<Divider orientation="left">{item.dataTypeName}</Divider>
<Spin spinning={props.qualificationReview.qualificationReviewLoading}>
<Table
options={false}
pagination={false}
disabledResizer={true}
dataSource={info.specialList || []}
dataSource={info.specialList.filter((i) => i.dataType === item.dataType) || []}
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", dataIndex: "uploadedTime" },
@ -223,60 +208,7 @@ function ViewInfo(props) {
/>
</Spin>
</div>
<div>
<Divider orientation="left">安全资质信息</Divider>
<Spin spinning={props.qualificationReview.qualificationReviewLoading}>
<Table
options={false}
pagination={false}
disabledResizer={true}
dataSource={info.secureList || []}
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", dataIndex: "uploadedTime" },
{
title: "时效性",
dataIndex: "qualificationsTermStart",
render: (_, record) => record.qualificationsTermStart ? `${record.qualificationsTermStart}${record.qualificationsTermEnd}` : "-",
},
{
title: "操作",
render: (_, record) => (
<Button
type="link"
onClick={() => {
setViewQualificationDetailsModalOpen(true);
setViewQualificationDetailsModalData(record);
}}
>
查看
</Button>
),
},
]}
/>
</Spin>
</div>
<div>
<Divider orientation="left">特证人员列表</Divider>
<Table
options={false}
disabledResizer={true}
columns={[
{ title: "姓名", dataIndex: "userName" },
{ title: "部门", dataIndex: "departmentName" },
{ title: "人员类型", dataIndex: "todo" }, // TODO 是否流动人员 没字段
{ title: "证书名称", dataIndex: "qualificationName" },
{ title: "证书作业类别", dataIndex: "qualificationinfoCategoryName" },
{ title: "操作项目", dataIndex: "operatingProjectName" },
{ title: "证书编号", dataIndex: "certificateNo" },
{ title: "就职状态", dataIndex: "employmentFlagName" },
{ title: "图片", dataIndex: "files", render: (_, record) => (<TooltipPreviewImg files={record.files} />) },
]}
{...tableProps}
dataSource={list}
/>
</div>
))}
</div>
{viewQualificationDetailsModalOpen
&& (