feat(qualification): 新增资质无效化功能并优化项目审核流程

- 添加了资质无效化API接口调用功能
- 修改了用户列表查询接口路径以支持无权限筛选
- 新增了资质类型列表查询功能
- 重构了项目审核用户模态框组件,统一显示特种作业人员证书
- 更新了多个项目列表页面中的列标题描述
- 在项目申请表单中集成用户信息获取功能
- 优化了项目负责人选择组件的参数配置
- 修复了项目类别选择时的数据联动逻辑
- 修正了项目选取形式显示名称问题
- 优化了分包项目信息的条件渲染逻辑
- 修复了营业执照有效期的空值显示问题
master
fangjiakai 2026-01-13 10:37:01 +08:00
parent 7fc5b1d238
commit 986f21f752
21 changed files with 333 additions and 261 deletions

View File

@ -30,3 +30,7 @@ export const qualificationApplyRejectReason = declareRequest(
"qualificationApplyLoading",
`Get > /xgfManager/qualificationsApply/getRejectReason/{id}`,
);
export const invalidateQualifications = declareRequest(
"qualificationApplyLoading",
`Get > /xgfManager/qualificationsApply/invalidateQualifications/{id}`,
);

View File

@ -18,7 +18,7 @@ export const inCheckList = declareRequest(
`Post > @/xgfManager/project/inCheckList`,
);
export const userList = declareRequest(
`Post > @/basicInfo/user/list`,
`Post > @/basicInfo/user/pageByNopermission`,
);
export const projectAdd = declareRequest(
"qualificationStatisticsLoading",
@ -83,3 +83,7 @@ export const projectUserChangeRecordList = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/projectUserChangeRecord/list`,
);
export const qualificationsTypeList = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/qualifications/projectUserChangeRecord/list`,
);

View File

@ -9,13 +9,11 @@ import useTable from "zy-react-library/hooks/useTable";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
const ViewProjectReviewUserModal = (props) => {
const eqQualificationinfoType = props.data.eqQualificationinfoType;
const [form] = Form.useForm();
const { loading: getFileLoading, getFile } = useGetFile();
const { tableProps } = useTable(props["userQualificationInfo"], {
form,
params: {
eqQualificationinfoType: props.data.eqQualificationinfoType,
eqUserld: props.data.id,
},
});
@ -59,7 +57,6 @@ const ViewProjectReviewUserModal = (props) => {
dataSource: tableData.length > 0 ? tableData : tableProps.dataSource || [],
}), [tableProps, tableData]);
if (eqQualificationinfoType === 1) {
return (
<Modal
title="特种作业人员证书"
@ -85,34 +82,6 @@ const ViewProjectReviewUserModal = (props) => {
/>
</Modal>
);
}
else {
return (
<Modal
title="安全人员证书列表"
width={1200}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Table
columns={[
{ title: "姓名", dataIndex: "userName" },
{ title: "证书名称", dataIndex: "qualificationName" },
{ title: "证书作业类别", dataIndex: "qualificationinfoCategoryName" },
{ title: "证书编号", dataIndex: "certificateNo" },
{ title: "就职状态", dataIndex: "employmentFlagName" },
{ title: "图片", dataIndex: "files", render: (_, record) => (<TooltipPreviewImg files={record.files} />) },
]}
{...enhancedTableProps}
/>
</Modal>
);
}
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(ViewProjectReviewUserModal);

View File

@ -49,7 +49,7 @@ function List(props) {
columns={[
{ title: "项目名称", dataIndex: "projectName" },
{ title: "是否为属地公司推荐", dataIndex: "isLocalCompany", render: (_, record) => record.isLocalCompany === 1 ? "是" : "否" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag === 1 ? "是" : "否" },

View File

@ -52,7 +52,7 @@ function List(props) {
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -43,7 +43,7 @@ function List(props) {
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -52,7 +52,7 @@ function List(props) {
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -43,7 +43,7 @@ function List(props) {
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "二级项目数", dataIndex: "secondLevelTotal" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -47,12 +47,12 @@ function List(props) {
/>
<Table
columns={[
{ title: "一级相关方名称(集团单位)", dataIndex: "parentProjectCorpName" },
{ title: "所属一级项目", dataIndex: "parentProjectName" },
{ title: "集团单位名称", dataIndex: "parentProjectCorpName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -37,12 +37,13 @@ function List(props) {
/>
<Table
columns={[
{ title: "一级相关方名称(集团单位)", dataIndex: "parentProjectCorpName" },
{ title: "所属一级项目", dataIndex: "parentProjectName" },
{ title: "集团单位名称", dataIndex: "parentProjectCorpName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "二级项目名称", dataIndex: "projectName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -14,6 +14,7 @@ import Table from "zy-react-library/components/Table";
import Upload from "zy-react-library/components/Upload";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
import useDeleteFile from "zy-react-library/hooks/useDeleteFile";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
@ -24,8 +25,10 @@ import ViewProjectReviewUserModal from "~/components/ViewProjectReviewUserModal"
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function Add(props) {
const { getUserInfo } = useGetUserInfo();
const query = useGetUrlQuery();
const [form] = Form.useForm();
const [userInfo, setUserInfo] = useState({});
const [currentStep, setCurrentStep] = useState(1);
const [formValues, setFormValues] = useState({});
const [projectFileAddCmdList, setProjectFileAddCmdList] = useState([]); // 项目资料
@ -33,6 +36,7 @@ function Add(props) {
const [projectLocalCompanyAddCmdList, setProjectLocalCompanyAddCmdList] = useState([]); // 项目执行属地公司
const [projectApprovalUserAddCmdList, setProjectApprovalUserAddCmdList] = useState([]); // 项目审核人员
const [projectApprovalFlowAddCmdList, setProjectApprovalFlowAddCmdList] = useState([]); // 项目审核流程
const [qualificationsTypeId, setQualificationsTypeId] = useState(); // 资质类型
const [corpinfoId, setCorpinfoId] = useState(); // 项目id
const { getFile } = useGetFile();
// 获取详情数据
@ -68,7 +72,13 @@ function Add(props) {
setCorpinfoId(data.corpinfoId);
};
const getCurrentUserInfo = async () => {
const userInfo = await getUserInfo();
setUserInfo(userInfo);
};
useEffect(() => {
getCurrentUserInfo();
query.id && getData();
}, []);
@ -82,8 +92,10 @@ function Add(props) {
setCurrentStep={setCurrentStep}
formValues={formValues}
form={form}
userInfo={userInfo}
usercontentAddCmdList={usercontentAddCmdList}
setUsercontentAddCmdList={setUsercontentAddCmdList}
setQualificationsTypeId={setQualificationsTypeId}
/>
)}
{currentStep === 2
@ -100,6 +112,7 @@ function Add(props) {
projectApprovalUserAddCmdList={projectApprovalUserAddCmdList}
projectApprovalFlowAddCmdList={projectApprovalFlowAddCmdList}
corpinfoId={corpinfoId}
qualificationsTypeId={qualificationsTypeId}
/>
)}
</>
@ -116,27 +129,34 @@ const StepOneComponent = (props) => {
const recommendCorpId = Form.useWatch("recommendCorpId", form);
const recommendDeptId = Form.useWatch("recommendDeptId", form);
const [corpInfoList, setCorpInfoList] = useState([]); // 项目执行属地公司
const [cropList, setCorpList] = useState([]); // 项目审核公司
const startProjectTime = Form.useWatch("startProjectTime", form); // 项目开始时间
const [deptList, setDeptList] = useState([]);
const [userList, setUserList] = useState([]);
const [qualificationsTypeList, setQualificationsTypeList] = useState([]);
// 获取项目执行属地公司数据
const getCorpInfoList = async () => {
const { data } = await props["corpInfoList"]({ pageIndex: 1, pageSize: 1000, inType: [0, 1, 2] });
const { data } = await props["corpInfoList"]({ pageIndex: 1, pageSize: 1000, inType: [0] });
setCorpInfoList(data);
};
// 获取项目执行属地公司名称列表数据
const getCropList = async () => {
const { data } = await props["corpInfoList"]({ pageIndex: 1, pageSize: 1000, inType: [1] });
setCorpList(data);
// 获取资质类型数据
const getQualificationsTypeList = async () => {
const { data } = await props["qualificationsTypeList"]();
setQualificationsTypeList(data);
};
// 获取项目执行属地公司名称列表数据
const getDeptList = async (id) => {
const { data } = await props["deptListByType"]({ qualificationsTypeId: id });
setDeptList(data);
};
const getUserList = async (id) => {
const { data } = id ? await props["userListByDeptId"]({ id }) : [];
setUserList(data);
// 去重
const uniqueUsers = data.filter((item, index, self) =>
index === self.findIndex((t) => (
t.userId === item.userId && t.userName === item.userName
))
);
setUserList(uniqueUsers);
};
const handleProjectLeaderChange = (label, extraInfo) => {
if (!extraInfo.userId)
@ -176,7 +196,7 @@ const StepOneComponent = (props) => {
};
useEffect(() => {
getCorpInfoList();
getCropList();
getQualificationsTypeList();
if (props.formValues.isLocalCompany === 0) {
getDeptList(props.formValues.qualificationsTypeId);
getUserList(props.formValues.manageDeptId);
@ -206,6 +226,7 @@ const StepOneComponent = (props) => {
}, [props.formValues]);
return (
<FormBuilder
labelCol={{ span: 5 }}
form={form}
span={8}
loading={props.qualificationStatistics.qualificationStatisticsLoading}
@ -218,37 +239,40 @@ const StepOneComponent = (props) => {
options={[
{ label: "项目基础信息", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{ name: "projectName", label: "项目名称" },
{ name: "userId", label: "项目负责人", render: (
<PersonnelSelect
isNeedDepartmentId={false}
onGetLabel={(label) => {
form.setFieldValue("userName", label);
}}
onGetOption={(option) => {
if (option) {
const extraInfo = {
name: option.name,
phone: option.phone || "",
postName: option.postName || "",
departmentId: option.departmentId || "",
departmentName: option.departmentName || "",
userId: option.id,
};
handleProjectLeaderChange(option.name, extraInfo);
}
}}
/>
), componentProps: {
onChange: (userId) => {
if (!userId) {
// 如果清空了项目负责人,从项目人员列表中移除
const newUserList = props.usercontentAddCmdList.filter(
item => item.projectLeader !== 1,
);
props.setUsercontentAddCmdList(newUserList);
}
},
} },
{
name: "userId", label: "项目负责人", render: (
<PersonnelSelect
isNeedCorpInfoId={true}
params={{ corpinfoId: props.userInfo?.corpinfoId || "" }}
isNeedDepartmentId={false}
onGetLabel={(label) => {
form.setFieldValue("userName", label);
}}
onGetOption={(option) => {
if (option) {
const extraInfo = {
name: option.name,
phone: option.phone || "",
postName: option.postName || "",
departmentId: option.departmentId || "",
departmentName: option.departmentName || "",
userId: option.id,
};
handleProjectLeaderChange(option.name, extraInfo);
}
}}
onChange={(userId) => {
if (!userId) {
// 如果清空了项目负责人,从项目人员列表中移除
const newUserList = props.usercontentAddCmdList.filter(
item => item.projectLeader !== 1,
);
props.setUsercontentAddCmdList(newUserList);
}
}}
/>
)
},
{ name: "userName", label: "项目负责人", onlyForLabel: true },
{ name: "initiationTime", label: "立项时间", render: FORM_ITEM_RENDER_ENUM.DATE },
{ name: "startProjectTime", label: "计划开始时间", render: FORM_ITEM_RENDER_ENUM.DATE },
@ -256,47 +280,71 @@ const StepOneComponent = (props) => {
{ name: "chooseForm", label: "项目选取形式", render: <DictionarySelect dictValue="project_choose_form" onGetLabel={label => form.setFieldValue("chooseFormName", label)} /> },
{ name: "chooseFormName", label: "项目选取形式名称", onlyForLabel: true },
{ name: "fourNewFlag", label: "是否涉及四新工作内容", labelCol: { span: 8 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ name: "threePeopleFlag", label: "是否涉及三人及以上工作内容", labelCol: { span: 8 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ name: "threePeopleFlag", label: "是否涉及三人及以上工作内容", labelCol: { span: 9 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ name: "nightWorkFlag", label: "是否涉及夜间作业", labelCol: { span: 8 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ name: "specialFlag", label: "是否包含特殊作业", labelCol: { span: 8 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ label: "项目审核信息", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{ name: "qualificationsTypeId", label: "项目类别", span: 24, wrapperCol: { span: 5 }, render: (
<DictionarySelect
dictValue="qualificationsType"
onGetLabel={label => form.setFieldValue("qualificationsTypeName", label)}
style={{ width: "100%" }}
onChange={() => {}}
/>
) },
{
name: "qualificationsTypeId", label: "项目类别", span: 24, wrapperCol: { span: 5 },
items: qualificationsTypeList,
render: FORM_ITEM_RENDER_ENUM.SELECT,
itemsField: { valueKey: "qualificationsTypeId", labelKey: "qualificationsTypeName" },
onGetLabel: (label) => {
form.setFieldValue("qualificationsTypeName", label);
},
componentProps: {
onChange: (event) => {
if (form.getFieldValue("isLocalCompany") === 0) {
getDeptList(event);
}
props.setQualificationsTypeId(event);
form.setFieldsValue({
recommendCorpId: "",
recommendCorpName: "",
recommendDeptId: "",
recommendDeptName: "",
recommendUserIds: [],
recommendUserNames: "",
manageDeptId: "",
manageDeptName: "",
manageUserIds: [],
manageUserNames: "",
});
},
},
},
{ name: "qualificationsTypeName", label: "项目类别名称", onlyForLabel: true },
{
span: 24,
render: (
<div style={{ fontSize: 12, color: "red", whiteSpace: "nowrap", marginTop: "-8px", marginBottom: "16px", marginLeft: "112px" }}>
如果选择项目类别或等级没有您相应的选项时请在"资质准入管理"中查看是否持有对应类比或等级的相关资质
如果选择项目类别或等级没有您相应的选项时请在"资质准入管理"中查看是否持有对应类或等级的相关资质
</div>
),
},
{ name: "qualificationsTypeName", label: "项目类别名称", onlyForLabel: true },
{ name: "subcontractFlag", label: "是否存在分包项目", span: 24, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ name: "isLocalCompany", label: "是否为属地公司推荐", span: 24, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }], componentProps: {
onChange: (event) => {
if (event.target.value === 0) {
getDeptList(qualificationsTypeId);
}
form.setFieldsValue({
recommendCorpId: "",
recommendCorpName: "",
recommendDeptId: "",
recommendDeptName: "",
recommendUserIds: [],
recommendUserNames: "",
manageDeptId: "",
manageDeptName: "",
manageUserIds: [],
manageUserNames: "",
});
},
} },
{
name: "isLocalCompany", label: "是否为属地公司推荐", span: 24, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }], componentProps: {
onChange: (event) => {
if (event.target.value === 0) {
getDeptList(qualificationsTypeId);
}
form.setFieldsValue({
recommendCorpId: "",
recommendCorpName: "",
recommendDeptId: "",
recommendDeptName: "",
recommendUserIds: [],
recommendUserNames: "",
manageDeptId: "",
manageDeptName: "",
manageUserIds: [],
manageUserNames: "",
});
},
}
},
{
span: 24,
render: (
@ -307,104 +355,104 @@ const StepOneComponent = (props) => {
},
...(isLocalCompany === 1
? [
{
name: "recommendCorpId",
label: "推荐属地公司名称",
labelCol: { span: 5 },
items: cropList,
render: FORM_ITEM_RENDER_ENUM.SELECT,
itemsField: { valueKey: "id", labelKey: "corpName" },
componentProps: {
onChange: (event) => {
const label = cropList.find(item => item.id === event)?.corpName;
form.setFieldValue("recommendCorpName", label);
{
name: "recommendCorpId",
label: "推荐属地公司名称",
labelCol: { span: 6 },
items: corpInfoList,
render: FORM_ITEM_RENDER_ENUM.SELECT,
itemsField: { valueKey: "id", labelKey: "corpName" },
componentProps: {
onChange: (event) => {
const label = corpInfoList.find(item => item.id === event)?.corpName;
form.setFieldValue("recommendCorpName", label);
form.setFieldsValue({
recommendDeptId: "",
recommendDeptName: "",
recommendUserIds: [],
recommendUserNames: "",
});
},
},
},
{ name: "recommendCorpName", label: "推荐属地公司名称", onlyForLabel: true },
{
name: "recommendDeptId",
labelCol: { span: 6 },
label: "推荐属地公司部门",
render: (
<DepartmentSelectTree
params={{ eqCorpinfoId: recommendCorpId }}
isNeedCorpInfoId
onGetLabel={label => form.setFieldValue("recommendDeptName", label)}
onChange={() => {
form.setFieldsValue({
recommendDeptId: "",
recommendDeptName: "",
recommendUserIds: [],
recommendUserNames: "",
});
},
},
},
{ name: "recommendCorpName", label: "推荐属地公司名称", onlyForLabel: true },
{
name: "recommendDeptId",
labelCol: { span: 5 },
label: "推荐属地公司部门",
render: (
<DepartmentSelectTree
params={{ eqCorpinfoId: recommendCorpId }}
isNeedCorpInfoId
onGetLabel={label => form.setFieldValue("recommendDeptName", label)}
onChange={() => {
form.setFieldsValue({
recommendUserIds: [],
recommendUserNames: "",
});
}}
/>
),
},
{ name: "recommendDeptName", label: "推荐属地公司部门", onlyForLabel: true },
{
name: "recommendUserIds",
label: "推荐属地公司人员",
span: 8,
labelCol: { span: 5 },
wrapperCol: { span: 19 },
render: (
<PersonnelSelect
params={{ departmentId: recommendDeptId }}
onGetLabel={label => form.setFieldValue("recommendUserNames", label)}
mode="multiple"
/>
),
},
{ name: "recommendUserNames", label: "推荐属地公司人员", onlyForLabel: true },
]
}}
/>
),
},
{ name: "recommendDeptName", label: "推荐属地公司部门", onlyForLabel: true },
{
name: "recommendUserIds",
label: "推荐属地公司人员",
span: 8,
labelCol: { span: 6 },
wrapperCol: { span: 19 },
render: (
<PersonnelSelect
params={{ departmentId: recommendDeptId }}
onGetLabel={label => form.setFieldValue("recommendUserNames", label)}
mode="multiple"
/>
),
},
{ name: "recommendUserNames", label: "推荐属地公司人员", onlyForLabel: true },
]
: [
{
name: "manageDeptId",
labelCol: { span: 5 },
label: "选择主管部门",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: deptList,
itemsField: { valueKey: "deptId", labelKey: "deptName" },
componentProps: {
onChange: (event) => {
const label = deptList.find(item => item.deptId === event)?.deptName;
form.setFieldValue("manageDeptName", label);
form.setFieldsValue({
manageUserIds: [],
recommendUserNames: "",
});
getUserList(event);
},
{
name: "manageDeptId",
labelCol: { span: 5 },
label: "选择主管部门",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: deptList,
itemsField: { valueKey: "deptId", labelKey: "deptName" },
componentProps: {
onChange: (event) => {
const label = deptList.find(item => item.deptId === event)?.deptName;
form.setFieldValue("manageDeptName", label);
form.setFieldsValue({
manageUserIds: [],
recommendUserNames: "",
});
getUserList(event);
},
},
{ name: "manageDeptName", label: "选择主管部门名称", onlyForLabel: true },
{
name: "manageUserIds",
label: "主管部门审核人",
span: 16,
labelCol: { span: 3 },
wrapperCol: { span: 8 },
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: userList,
itemsField: { valueKey: "userId", labelKey: "userName" },
componentProps: {
mode: "multiple",
onChange: (event) => {
const labels = event
.map(userId => userList.find(item => item.userId === userId)?.userName)
.filter(Boolean);
form.setFieldValue("manageUserNames", labels);
},
},
{ name: "manageDeptName", label: "选择主管部门名称", onlyForLabel: true },
{
name: "manageUserIds",
label: "主管部门审核人",
span: 16,
labelCol: { span: 3 },
wrapperCol: { span: 8 },
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: userList,
itemsField: { valueKey: "userId", labelKey: "userName" },
componentProps: {
mode: "multiple",
onChange: (event) => {
const labels = event
.map(userId => userList.find(item => item.userId === userId)?.userName)
.filter(Boolean);
form.setFieldValue("manageUserNames", labels);
},
},
{ name: "manageUserNames", label: "主管部门审核人名称", onlyForLabel: true },
]),
},
{ name: "manageUserNames", label: "主管部门审核人名称", onlyForLabel: true },
]),
{
render: (
<div style={{ fontSize: 12, color: "red", whiteSpace: "nowrap", marginTop: "-8px", marginBottom: "16px", marginLeft: "112px" }}>
@ -416,7 +464,7 @@ const StepOneComponent = (props) => {
{
name: "approvalCorpId",
label: "项目执行属地公司名称",
labelCol: { span: 5 },
labelCol: { span: 7 },
items: corpInfoList,
render: FORM_ITEM_RENDER_ENUM.SELECT,
itemsField: { valueKey: "id", labelKey: "corpName" },
@ -436,7 +484,7 @@ const StepOneComponent = (props) => {
{ name: "approvalCorpName", label: "项目执行属地公司名称", onlyForLabel: true },
{
name: "approvalDeptId",
labelCol: { span: 5 },
labelCol: { span: 7 },
label: "项目执行属地公司部门",
render: (
<DepartmentSelectTree
@ -456,7 +504,7 @@ const StepOneComponent = (props) => {
{
name: "approvalUserIds",
label: "项目执行属地公司人员",
labelCol: { span: 5 },
labelCol: { span: 7 },
render: (
<PersonnelSelect
params={{ departmentId: approvalDeptId }}
@ -466,17 +514,19 @@ const StepOneComponent = (props) => {
),
},
{ name: "approvalUserNames", label: "项目执行属地公司人员名称", onlyForLabel: true },
{ name: "projectFiles", label: "安全管理协议", span: 24, render: (
<Upload
fileType="image"
maxCount={5}
accept=".pdf,.jpg,.jpeg,.png"
size={40}
onGetRemoveFile={(file) => {
form.setFieldValue("deleteProjectFileAddCmdList", [...(form.getFieldValue("deleteProjectFileAddCmdList") || []), file]);
}}
/>
) },
{
name: "projectFiles", label: "安全管理协议", span: 24, render: (
<Upload
fileType="image"
maxCount={5}
accept=".pdf,.jpg,.jpeg,.png"
size={40}
onGetRemoveFile={(file) => {
form.setFieldValue("deleteProjectFileAddCmdList", [...(form.getFieldValue("deleteProjectFileAddCmdList") || []), file]);
}}
/>
)
},
{ name: "deleteProjectFileAddCmdList", label: "删除的安全管理协议", onlyForLabel: true },
{ name: "agreementFileUuid", label: "安全协议uuid", onlyForLabel: true },
{ name: "stakeholderLevel", onlyForLabel: true },
@ -761,23 +811,10 @@ const StepTwoComponent = (props) => {
setViewProjectReviewUserModalOpen(true);
setViewProjectReviewUserModalData({
...record,
eqQualificationinfoType: 1,
});
}}
>
特种作业人员证书
</Button>
<Button
type="link"
onClick={() => {
setViewProjectReviewUserModalOpen(true);
setViewProjectReviewUserModalData({
...record,
eqQualificationinfoType: 2,
});
}}
>
安全人员证书列表
查看特种证书
</Button>
</Space>
),
@ -804,6 +841,7 @@ const StepTwoComponent = (props) => {
{uploadFileModalOpen && (
<FileUpload
data={uploadFileModalData}
qualificationsTypeId={props.qualificationsTypeId}
onCancel={() => {
setUploadFileModalOpen(false);
}}
@ -841,7 +879,7 @@ const ChooseFilsComponent = (props) => {
const [selectedRows, setSelectedRows] = useState([]); // 存储选中行的完整数据
const { tableProps } = useTable(props["qualificationsDetails"], {
params: {
qualificationsTypeId: "",
qualificationsTypeId: props.qualificationsTypeId,
},
useStorageQueryCriteria: false,
});

View File

@ -71,7 +71,7 @@ function List(props) {
columns={[
{ title: "项目名称", dataIndex: "projectName" },
{ title: "是否为属地公司推荐", dataIndex: "isLocalCompany", render: (_, record) => record.isLocalCompany === 1 ? "是" : "否" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag === 1 ? "是" : "否" },

View File

@ -266,7 +266,7 @@ function Review(props) {
{ label: "立项时间", children: info.initiationTime },
{ label: "计划开始时间", children: info.startProjectTime },
{ label: "计划竣工时间", children: info.endProjectTime },
{ label: "选取形式", children: info.chooseForm },
{ label: "选取形式", children: info.chooseFormName },
{ label: "是否涉及四新工作内容", children: info.fourNewFlag === 1 ? "是" : "否" },
{ label: "是否涉及三人及以上工作内容", children: info.threePeopleFlag === 1 ? "是" : "否" },
{ label: "是否涉及夜间作业", children: info.nightWorkFlag === 1 ? "是" : "否" },
@ -292,7 +292,7 @@ function Review(props) {
{ label: "单位经营地址", children: info.corpInfo?.addressBusiness },
{ label: "企业规模", children: info.corpInfo?.scaleName },
{ label: "法定代表人姓名", children: info.corpInfo?.lrName },
{ label: "定代表人电话", children: info.corpInfo?.lrMobile },
{ label: "定代表人电话", children: info.corpInfo?.lrMobile },
{ label: "主要负责人姓名", children: info.corpInfo?.contacts },
{ label: "主要负责人电话", children: info.corpInfo?.contactsPhone },
{ label: "成立日期", children: info.corpInfo?.createDate },
@ -301,7 +301,7 @@ function Review(props) {
{ label: "注册资金(万元)", children: info.corpInfo?.regcapital },
{ label: "企业类型", children: getLabelName({ list: typeList, status: info.corpInfo?.type }) },
{ label: "营业执照", children: <TooltipPreviewImg files={info.corpInfo?.files || []} /> },
{ label: "营业执照有效期", children: `${info.corpInfo?.licenseStart}-${info.corpInfo?.licenseEnd}` },
{ label: "营业执照有效期", children: info.corpInfo?.licenseStart ? `${info.corpInfo?.licenseStart}-${info.corpInfo?.licenseEnd}` : "-" },
{ label: "", children: "" },
]}
/>
@ -371,7 +371,7 @@ function Review(props) {
/>
</div>
{info.subcontractFlag === 1 && (
{info.subcontractFlag === 1 && info.subcontractProjectList && info.subcontractProjectList.length > 0 && (
<div>
<Divider orientation="left">分包项目信息详情</Divider>
<Table

View File

@ -50,7 +50,7 @@ function List(props) {
columns={[
{ title: "项目名称", dataIndex: "projectName" },
{ title: "是否为属地公司推荐", dataIndex: "isLocalCompany", render: (_, record) => record.isLocalCompany === 1 ? "是" : "否" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag ? "是" : "否" },

View File

@ -16,6 +16,7 @@ import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import { UPLOAD_FILE_TYPE_ENUM } from "zy-react-library/enum/uploadFile/gwj";
import useDeleteFile from "zy-react-library/hooks/useDeleteFile";
import useGetFile from "zy-react-library/hooks/useGetFile";
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
@ -24,18 +25,26 @@ import ViewProjectReviewUserModal from "~/components/ViewProjectReviewUserModal"
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function Add(props) {
const { getUserInfo } = useGetUserInfo();
const query = useGetUrlQuery();
const [form] = Form.useForm();
const [userInfo, setUserInfo] = useState({});
const [currentStep, setCurrentStep] = useState(1);
const [formValues, setFormValues] = useState({});
const [projectFileAddCmdList, setProjectFileAddCmdList] = useState([]); // 项目资料
const [usercontentAddCmdList, setUsercontentAddCmdList] = useState([]); // 项目审核人员
const [projectLocalCompanyAddCmdList, setProjectLocalCompanyAddCmdList] = useState([]); // 项目执行属地公司
const [projectLocalCompanyAddCmdList, setProjectLocalCompanyAddCmdList] = useState([]); // 项目属地单位
const [projectApprovalUserAddCmdList, setProjectApprovalUserAddCmdList] = useState([]); // 项目审核人员
const [projectApprovalFlowAddCmdList, setProjectApprovalFlowAddCmdList] = useState([]); // 项目审核流程
const [qualificationsTypeId, setQualificationsTypeId] = useState(); // 资质类型
const [corpinfoId, setCorpinfoId] = useState(); // 项目id
const { getFile } = useGetFile();
// 获取详情数据
const getCurrentUserInfo = async () => {
const userInfo = await getUserInfo();
setUserInfo(userInfo);
};
const getData = async () => {
const { data } = await props["projectDetail"]({ id: query.id });
if (data.agreementFileUuid) {
@ -69,6 +78,7 @@ function Add(props) {
};
useEffect(() => {
getCurrentUserInfo();
query.id && getData();
}, []);
@ -81,8 +91,10 @@ function Add(props) {
setCurrentStep={setCurrentStep}
formValues={formValues}
form={form}
userInfo={userInfo}
usercontentAddCmdList={usercontentAddCmdList}
setUsercontentAddCmdList={setUsercontentAddCmdList}
setQualificationsTypeId={setQualificationsTypeId}
/>
)}
{currentStep === 2
@ -99,6 +111,7 @@ function Add(props) {
projectApprovalUserAddCmdList={projectApprovalUserAddCmdList}
projectApprovalFlowAddCmdList={projectApprovalFlowAddCmdList}
corpinfoId={corpinfoId}
qualificationsTypeId={qualificationsTypeId}
/>
)}
</Page>
@ -109,13 +122,20 @@ const StepOneComponent = (props) => {
const form = props.form;
const approvalCorpId = Form.useWatch("approvalCorpId", form); // 项目审核部门公司
const approvalDeptId = Form.useWatch("approvalDeptId", form); // 项目审核部门
const [corpInfoList, setCorpInfoList] = useState([]); // 项目执行属地公司
const qualificationsTypeId = Form.useWatch("qualificationsTypeId", form);
const [corpInfoList, setCorpInfoList] = useState([]); // 项目属地单位
const startProjectTime = Form.useWatch("startProjectTime", form); // 项目开始时间
// 获取项目执行属地公司数据
const [qualificationsTypeList, setQualificationsTypeList] = useState([]);
// 获取项目属地单位数据
const getCorpInfoList = async () => {
const { data } = await props["corpInfoList"]({ pageIndex: 1, pageSize: 1000, inType: [0, 1, 2] });
const { data } = await props["corpInfoList"]({ pageIndex: 1, pageSize: 1000, inType: [0] });
setCorpInfoList(data);
};
// 获取资质类型数据
const getQualificationsTypeList = async () => {
const { data } = await props["qualificationsTypeList"]();
setQualificationsTypeList(data);
};
const handleProjectLeaderChange = (label, extraInfo) => {
if (!extraInfo.userId)
return;
@ -154,6 +174,7 @@ const StepOneComponent = (props) => {
};
useEffect(() => {
getCorpInfoList();
getQualificationsTypeList();
form.setFieldsValue(props.formValues);
if (props.formValues.userId && props.formValues.userName) {
const existingLeader = props.usercontentAddCmdList.find(
@ -179,6 +200,7 @@ const StepOneComponent = (props) => {
}, [props.formValues]);
return (
<FormBuilder
labelCol={{ span: 5 }}
form={form}
span={8}
loading={props.qualificationStatistics.qualificationStatisticsLoading}
@ -193,6 +215,8 @@ const StepOneComponent = (props) => {
{ name: "projectName", label: "项目名称" },
{ name: "userId", label: "项目负责人", render: (
<PersonnelSelect
isNeedCorpInfoId={true}
params={{ corpinfoId: props.userInfo?.corpinfoId || "" }}
isNeedDepartmentId={false}
onGetLabel={(label) => {
form.setFieldValue("userName", label);
@ -210,6 +234,15 @@ const StepOneComponent = (props) => {
handleProjectLeaderChange(option.name, extraInfo);
}
}}
onChange={(userId) => {
if (!userId) {
// 如果清空了项目负责人,从项目人员列表中移除
const newUserList = props.usercontentAddCmdList.filter(
item => item.projectLeader !== 1,
);
props.setUsercontentAddCmdList(newUserList);
}
}}
/>
), componentProps: {
onChange: (userId) => {
@ -233,18 +266,37 @@ const StepOneComponent = (props) => {
{ name: "nightWorkFlag", label: "是否涉及夜间作业", labelCol: { span: 8 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ name: "specialFlag", label: "是否包含特殊作业", labelCol: { span: 8 }, render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }] },
{ label: "项目审核信息", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{ name: "qualificationsTypeId", label: "项目类别", span: 24, wrapperCol: { span: 5 }, render: (
<DictionarySelect
dictValue="qualificationsType"
onGetLabel={label => form.setFieldValue("qualificationsTypeName", label)}
onChange={() => {
}}
/>
) },
{ name: "qualificationsTypeName", label: "项目类别名称", onlyForLabel: true },
{
name: "approvalCorpId",
name: "qualificationsTypeId", label: "项目类别", span: 24, wrapperCol: { span: 5 },
items: qualificationsTypeList,
render: FORM_ITEM_RENDER_ENUM.SELECT,
itemsField: { valueKey: "qualificationsTypeId", labelKey: "qualificationsTypeName" },
onGetLabel: (label) => {
form.setFieldValue("qualificationsTypeName", label);
},
componentProps: {
onChange: (event) => {
if (form.getFieldValue("isLocalCompany") === 0) {
getDeptList(event);
}
props.setQualificationsTypeId(event);
form.setFieldsValue({
recommendCorpId: "",
recommendCorpName: "",
recommendDeptId: "",
recommendDeptName: "",
recommendUserIds: [],
recommendUserNames: "",
manageDeptId: "",
manageDeptName: "",
manageUserIds: [],
manageUserNames: "",
});
},
},
},
{ name: "qualificationsTypeName", label: "项目类别名称", onlyForLabel: true },
{ name: "approvalCorpId",
label: "集团公司审核",
labelCol: { span: 5 },
items: corpInfoList,
@ -341,6 +393,7 @@ const StepTwoComponent = (props) => {
const [viewProjectReviewUserModalData, setViewProjectReviewUserModalData] = useState({}); // 查看安全人员证书列表
const { loading: getFileLoading, getFile } = useGetFile();
const [chooseFilsListModalOpen, setChooseFilsListModalOpen] = useState(false);
const [chooseFilsListModalData, setChooseFilsListModalData] = useState([]);
const getData = async () => {
for (let i = 0; i < projectFileList.length; i++) {
const files = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["151"], eqForeignKey: projectFileList[i].projectFileId });
@ -503,6 +556,7 @@ const StepTwoComponent = (props) => {
icon={<AddIcon />}
onClick={() => {
setChooseFilsListModalOpen(true);
setChooseFilsListModalData(projectFileList);
}}
>
添加已审核资质资料
@ -631,6 +685,7 @@ const StepTwoComponent = (props) => {
{uploadFileModalOpen && (
<FileUpload
data={uploadFileModalData}
qualificationsTypeId={props.qualificationsTypeId}
onCancel={() => {
setUploadFileModalOpen(false);
}}
@ -654,7 +709,8 @@ const StepTwoComponent = (props) => {
{chooseFilsListModalOpen && (
<ChooseFilsList
data={projectFileList}
onSubmit={handleChooseFilsSubmit} // 使用新的处理函数
qualificationsTypeId={props.qualificationsTypeId}
onSubmit={handleChooseFilsSubmit}
onCancel={() => {
setChooseFilsListModalOpen(false);
}}
@ -668,7 +724,7 @@ const ChooseFilsComponent = (props) => {
const [selectedRows, setSelectedRows] = useState([]); // 存储选中行的完整数据
const { tableProps } = useTable(props["qualificationsDetails"], {
params: {
qualificationsTypeId: "",
qualificationsTypeId: props.qualificationsTypeId,
},
useStorageQueryCriteria: false,
});

View File

@ -71,7 +71,7 @@ function List(props) {
{ title: "集团单位名称", dataIndex: "corpinfoName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "二级项目名称", dataIndex: "projectName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{ title: "上级审核主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{

View File

@ -38,10 +38,10 @@ function List(props) {
<Table
columns={[
{ title: "集团单位名称", dataIndex: "groupCompanyName" },
{ title: "集团单位审核部门", dataIndex: "groupCompanyDeptName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "二级项目名称", dataIndex: "projectName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "上级审核主管部门", dataIndex: "parentManageDeptName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{
title: "项目审核状态",

View File

@ -52,7 +52,7 @@ function List(props) {
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -52,7 +52,7 @@ function List(props) {
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -52,7 +52,7 @@ function List(props) {
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",

View File

@ -44,7 +44,7 @@ function List(props) {
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag ? "是" : "否" },
{ title: "二级项目数", dataIndex: "secondLevelTotal" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "项目属地单位", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",