项目管理相关页面

master
yujia 2025-12-19 09:01:46 +08:00
parent 2f099ff407
commit 2c0355049d
85 changed files with 5185 additions and 1 deletions

View File

@ -10,6 +10,7 @@ module.exports = {
javaGitBranch: "<branch-name>",
// 接口服务地址
API_HOST: "http://192.168.20.100:30140",
// API_HOST: "http://192.168.10.41:81",
},
production: {
// 应用后端分支名称,部署上线需要

View File

@ -30,7 +30,7 @@
"lodash-es": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"zy-react-library": "^1.0.156"
"zy-react-library": "^1.0.171"
},
"devDependencies": {
"@antfu/eslint-config": "^5.4.1",

View File

@ -1,6 +1,85 @@
import { declareRequest } from "@cqsjjb/jjb-dva-runtime";
export const corpInfoList = declareRequest(
`Post > @/basicInfo/corpInfo/list`,
);
export const qualificationStatistics = declareRequest(
"qualificationStatisticsLoading",
`Get > /xgfManager/qualificationsApply/statistics`,
);
export const qualificationsList = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/qualifications/listAll`,
);
export const inCheckList = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/project/inCheckList`,
);
export const userList = declareRequest(
`Post > @/basicInfo/user/list`,
);
export const projectAdd = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/project/save`,
);
export const projectUpdate = declareRequest(
"qualificationStatisticsLoading",
`Put > @/xgfManager/project/edit`,
);
export const userQualificationInfo = declareRequest(
`Post > @/basicInfo/userQualificationInfo/list`,
);
export const projectDetail = declareRequest(
"qualificationStatisticsLoading",
`Get > /xgfManager/project/{id}`,
);
export const projectApprovalFlow = declareRequest(
"qualificationStatisticsLoading",
`Get > /xgfManager/projectApprovalFlow/getRejectCause/`,
);
export const deptListByType = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/qualifications/deptListByType`,
);
export const userListByDeptId = declareRequest(
"qualificationStatisticsLoading",
`Get > /xgfManager/qualifications/userListByDeptId/{id}`,
);
export const qualificationsDetails = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/qualifications/qualificationsDetails/`,
);
export const projectAudit = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/project/audit`,
);
export const projectListAll = declareRequest(
"qualificationStatisticsLoading",
`Get > /xgfManager/project/listAll`,
);
export const corpInfoInfo = declareRequest(
"qualificationStatisticsLoading",
`Post > @/basicInfo/corpInfo/info/{id}`,
);
export const projectPage = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/project/projectPage`,
);
export const projectUserList = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/projectUser/list`,
);
export const projectUserDelete = declareRequest(
"qualificationStatisticsLoading",
`Delete > @/xgfManager/projectUser/{id}`,
);
export const projectUserAdd = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/projectUser/addProjectUser`,
);
export const projectUserChangeRecordList = declareRequest(
"qualificationStatisticsLoading",
`Post > @/xgfManager/projectUserChangeRecord/list`,
);

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Modal } from "antd";
import { useEffect, useMemo, useRef, useState } from "react";
import Table from "zy-react-library/components/Table";
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 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,
},
});
const [tableData, setTableData] = useState([]);
const hasFetchedRef = useRef(false);
useEffect(() => {
// 只在第一次获取数据时执行,或者数据真正变化时
if (tableProps.dataSource
&& tableProps.dataSource.length > 0
&& !getFileLoading
&& !hasFetchedRef.current) {
hasFetchedRef.current = true;
const fetchFiles = async () => {
const dataWithFiles = await Promise.all(
tableProps.dataSource.map(async (item) => {
try {
const files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["6"],
eqForeignKey: item.userId,
});
return { ...item, files: files || [] };
}
catch (error) {
console.error("获取文件失败:", error);
return { ...item, files: [] };
}
}),
);
setTableData(dataWithFiles);
};
fetchFiles();
}
}, [tableProps.dataSource, getFileLoading, getFile]);
// 使用 useMemo 避免重复计算
const enhancedTableProps = useMemo(() => ({
...tableProps,
dataSource: tableData.length > 0 ? tableData : tableProps.dataSource || [],
}), [tableProps, tableData]);
if (eqQualificationinfoType === 1) {
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: "operatingProjectName" },
{ title: "证书编号", dataIndex: "certificateNo" },
{ title: "图片", dataIndex: "files", render: (_, record) => (<TooltipPreviewImg files={record.files} />) },
]}
{...enhancedTableProps}
/>
</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

@ -12,3 +12,13 @@ export {};
// FIRST_PARTY_AUDITING(100, "集团单位审核"),
// COMPANY_DEPARTMENT_AUDITING(200, "股份主管部门审核"),
// COMPANY_SAFETY_AUDITING(300, "股份安监部门审核");
export const PROJECT_STATUS_MAP = [
{ name: "待提交", bianma: "0" },
{ name: "待主管部门审核", bianma: "1" },
{ name: "待执行属地公司审核", bianma: "2" },
{ name: "待推荐属地公司审核", bianma: "3" },
{ name: "运行中", bianma: "4" },
{ name: "已完成", bianma: "5" },
{ name: "已驳回", bianma: "6" },
{ name: "待集团公司审核", bianma: "7" },
];

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "two-level",
eqProjectStatus: 7,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "集团单位名称", dataIndex: "groupCompanyName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "二级项目名称", dataIndex: "projectName" },
{ title: "项目负责人", dataIndex: "userName" },
{ title: "立项时间", dataIndex: "initiationTime" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "相关方名称", dataIndex: "corpinfoName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=7`);
}}
>
{record.projectStatus === 7 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function ProjectApproval(props) {
return (<div>{props.children}</div>);
}
export default ProjectApproval;

View File

@ -0,0 +1,7 @@
import AddView from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/Add";
function Add(props) {
return (<AddView {...props} />);
};
export default Add;

View File

@ -0,0 +1,7 @@
import ListView from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/list";
function List(props) {
return (<ListView {...props} />);
};
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function ProjectFilingApplication(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingApplication;

View File

@ -0,0 +1,100 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["projectPage"], {
form,
params: {
searchType: 2,
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "eqSubcontractFlag", label: "是否存在分包", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [
{ bianma: "1", name: "是" },
{ bianma: "0", name: "否" },
] },
{
name: "eqProjectStatus",
label: "项目审核状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: PROJECT_STATUS_MAP,
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "项目名称", dataIndex: "projectName" },
{ title: "是否为属地公司推荐", dataIndex: "isLocalCompany", render: (_, record) => record.isLocalCompany === 1 ? "是" : "否" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag === 1 ? "是" : "否" },
{ title: "分包项目总数", dataIndex: "secondLevelTotal" },
{
title: "一级项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 350,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChange?id=${record.id}`);
}}
>
项目人员变更
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChangeRecord?id=${record.id}`);
}}
>
人员变更记录
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,7 @@
import ViewUserChange from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChange";
function UserChange(props) {
return (<ViewUserChange {...props} />);
};
export default UserChange;

View File

@ -0,0 +1,7 @@
import ViewUserChangeRecordPage from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChangeRecord";
function UserChangeRecord(props) {
return (<ViewUserChangeRecordPage {...props} />);
};
export default UserChangeRecord;

View File

@ -0,0 +1,5 @@
function ProjectFilingInformation(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingInformation;

View File

@ -0,0 +1,5 @@
function ProjectReview(props) {
return (<div>{props.children}</div>);
}
export default ProjectReview;

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "one-level",
eqSubcontractFlag: 0,
eqProjectStatus: 3,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=3`);
}}
>
{record.projectStatus === 3 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,73 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "one-level",
eqSubcontractFlag: 0,
eqProjectStatus: 2,
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=2`);
}}
>
{record.projectStatus === 2 ? "确认" : "查看"}
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "one-level",
eqSubcontractFlag: 1,
eqProjectStatus: 3,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=3`);
}}
>
{record.projectStatus === 3 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,74 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "one-level",
eqSubcontractFlag: 1,
eqProjectStatus: 2,
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "二级项目数", dataIndex: "secondLevelTotal" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=2`);
}}
>
{record.projectStatus === 2 ? "确认" : "查看"}
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,5 @@
function ProjectApproval(props) {
return (<div>{props.children}</div>);
}
export default ProjectApproval;

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "two-level",
eqProjectStatus: 3,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "一级相关方名称(集团单位)", dataIndex: "parentProjectCorpName" },
{ title: "所属一级项目", dataIndex: "parentProjectName" },
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=3`);
}}
>
{record.projectStatus === 3 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,73 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "two-level",
eqProjectStatus: 2,
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "一级相关方名称(集团单位)", dataIndex: "parentProjectCorpName" },
{ title: "所属一级项目", dataIndex: "parentProjectName" },
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=2`);
}}
>
{record.projectStatus === 2 ? "确认" : "查看"}
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,5 @@
function ProjectApprovalTwo(props) {
return (<div>{props.children}</div>);
}
export default ProjectApprovalTwo;

View File

@ -0,0 +1,7 @@
import ListView from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/list";
function List(props) {
return (<ListView searchType="4" {...props} />);
};
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,7 @@
import ViewUserChange from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChange";
function UserChange(props) {
return (<ViewUserChange {...props} />);
};
export default UserChange;

View File

@ -0,0 +1,7 @@
import ViewUserChangeRecordPage from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChangeRecord";
function UserChangeRecord(props) {
return (<ViewUserChangeRecordPage {...props} />);
};
export default UserChangeRecord;

View File

@ -0,0 +1,5 @@
function ProjectFilingInformation(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingInformation;

View File

@ -0,0 +1,7 @@
import ListView from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/list";
function List(props) {
return (<ListView searchType="3" {...props} />);
};
export default List;

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,7 @@
import ViewUserChange from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChange";
function UserChange(props) {
return (<ViewUserChange {...props} />);
};
export default UserChange;

View File

@ -0,0 +1,7 @@
import ViewUserChangeRecordPage from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChangeRecord";
function UserChangeRecord(props) {
return (<ViewUserChangeRecordPage {...props} />);
};
export default UserChangeRecord;

View File

@ -0,0 +1,5 @@
function ProjectFilingInformation(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingInformation;

View File

@ -0,0 +1,5 @@
function ProjectReview(props) {
return (<div>{props.children}</div>);
}
export default ProjectReview;

View File

@ -0,0 +1,156 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
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";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevel: "one-level",
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "eqSubcontractFlag", label: "是否存在分包", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [{ name: "是", bianma: "1" }, { name: "否", bianma: "0" }] },
{
name: "",
label: "项目审核状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: PROJECT_STATUS_MAP,
},
]}
form={form}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<Space>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
</Space>
)}
columns={[
{ title: "项目名称", dataIndex: "projectName" },
{ title: "是否为属地公司推荐", dataIndex: "isLocalCompany", render: (_, record) => record.isLocalCompany === 1 ? "是" : "否" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag === 1 ? "是" : "否" },
{
title: "一级项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
{record.projectStatus === 6 && (
<>
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
</>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,454 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Divider, Form, Input, message, Modal, Space, Spin } from "antd";
import { useEffect, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import Table from "zy-react-library/components/Table";
import TooltipPreviewImg from "zy-react-library/components/TooltipPreviewImg";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
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 { getLabelName } from "zy-react-library/utils";
import ViewProjectReviewDetailsModal from "~/components/ViewProjectReviewDetailsModal";
import ViewProjectReviewUserModal from "~/components/ViewProjectReviewUserModal";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
import "./index.less";
function Review(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const [viewProjectReviewDetailsModalOpen, setViewProjectReviewDetailsModalOpen] = useState(false);
const [viewProjectReviewDetailsModalData, setViewProjectReviewDetailsModalData] = useState({});
const [info, setInfo] = useState({});
const { getFile } = useGetFile();
const [projectFileAddCmdList, setProjectFileAddCmdList] = useState([]);
const [projectUserAddCmdList, setProjectUserAddCmdList] = useState([]);
const [viewProjectReviewUserModalOpen, setViewProjectReviewUserModalOpen] = useState(false);
const [viewProjectReviewUserModalData, setViewProjectReviewUserModalData] = useState({}); // 查看安全人员证书列表
const [projectListAll, setProjectListAll] = useState([]);
const typeList = [
{ bianma: "0", name: "普通企业" },
{ bianma: "1", name: "集团单位" },
{ bianma: "2", name: "股份单位" },
{ bianma: "3", name: "相关方企业" },
{ bianma: "4", name: "货主单位" },
{ bianma: "5", name: "驻港单位" },
];
const getData = async () => {
const projectDetailResult = await props["projectDetail"]({ id: query.id });
if (!projectDetailResult || !projectDetailResult.data) {
return;
}
const projectData = projectDetailResult.data;
if (projectData.agreementFileUuid) {
const file = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["156"],
eqForeignKey: projectData.agreementFileUuid,
});
projectData.files = file;
}
setProjectFileAddCmdList(projectData.projectFileAddCmdList || []);
setProjectUserAddCmdList(projectData.projectUserAddCmdList || []);
if (projectData.corpinfoId) {
try {
const corpInfoResult = await props["corpInfoInfo"]({
id: projectData.corpinfoId,
});
const qiyefile = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["6"],
eqForeignKey: projectData.corpinfoId,
});
corpInfoResult.data.qiyefile = qiyefile;
projectData.corpInfo = corpInfoResult.data;
}
// eslint-disable-next-line no-unused-vars,unused-imports/no-unused-vars
catch (error) {
projectData.corpInfo = null;
}
}
else {
projectData.corpInfo = null;
}
setInfo(projectData);
};
const getProjectListAll = async () => {
const { data } = await props["projectListAll"]({});
setProjectListAll(data);
};
const auditSubmit = (result) => {
if (result === 1) {
if (query.projectStatusLast === "7") {
Modal.confirm({
title: "审核确认",
icon: null,
okText: "确认审核",
cancelText: "取消",
width: 1200,
content: (
<div>
<FormBuilder
form={form}
showActionButtons={false}
span={24}
options={[
{
name: "id",
label: "请选择对应的一级项目",
labelCol: { span: 5 },
items: projectListAll,
render: FORM_ITEM_RENDER_ENUM.SELECT,
itemsField: { valueKey: "id", labelKey: "projectName" },
},
]}
/>
</div>
),
onOk: async () => {
try {
const values = await form.validateFields();
const { success } = await props["projectAudit"]({
id: query.id,
result,
relatedProjectId: values.id,
});
if (success) {
message.success("审核通过");
getData();
props.history.goBack();
}
}
catch (error) {
// 表单验证失败,不关闭弹窗
return Promise.reject(error);
}
},
});
}
else {
Modal.confirm({
title: "审核确认",
content: "确定要通过审核吗?",
onOk: async () => {
const { success } = await props["projectAudit"]({
id: query.id,
result,
});
if (success) {
message.success("审核通过");
getData();
props.history.goBack();
}
},
});
}
}
else {
Modal.confirm({
title: "审核驳回",
content: (
<div>
<div style={{ marginBottom: 8 }}>确定要驳回审核吗</div>
<Form
form={form}
layout="vertical"
style={{ marginTop: 16 }}
>
<Form.Item
name="rejectReason"
label="驳回原因"
rules={[{ required: true, message: "请输入驳回原因" }]}
>
<Input.TextArea
placeholder="请输入驳回原因"
rows={3}
maxLength={200}
showCount
/>
</Form.Item>
</Form>
</div>
),
icon: null,
okText: "确认驳回",
cancelText: "取消",
width: 500,
onOk: async () => {
try {
const values = await form.validateFields();
const { success } = await props["projectAudit"]({
id: query.id,
result,
rejectReason: values.rejectReason, // 添加拒绝原因
});
if (success) {
message.success("审核驳回成功");
getData();
props.history.goBack();
}
}
catch (error) {
// 表单验证失败,不关闭弹窗
return Promise.reject(error);
}
},
});
}
};
useEffect(() => {
getData();
}, []);
useEffect(() => {
getProjectListAll();
}, []);
return (
<div>
<HeaderBack title="查看" />
<div style={{ padding: "0 20px 20px 20px" }}>
{info.relatedProjectId && (
<div style={{ "font-size": "16px" }}>
<Divider orientation="left">一级项目信息</Divider>
<p>
公司名称
{info.parentProjectCorpName}
</p>
<div style={{ display: "flex" }}>
<p>
项目名称
{info.parentProjectName}
项目
</p>
<Button
style={{ marginLeft: "20px" }}
type="primary"
onClick={() => {
props.history.push(`../ProjectFilingApplication/reView?id=${info.relatedProjectId}`);
}}
>
查看一级项目资料
</Button>
</div>
</div>
)}
<div>
<Divider orientation="left">项目基础信息</Divider>
<Spin spinning="">
<Descriptions
bordered
column={4}
items={[
{ label: "项目名称", children: info.projectName },
{ label: "项目负责人", children: info.userName },
{ label: "立项时间", children: info.initiationTime },
{ label: "计划开始时间", children: info.startProjectTime },
{ label: "计划竣工时间", children: info.endProjectTime },
{ label: "选取形式", children: info.chooseForm },
{ label: "是否涉及四新工作内容", children: info.fourNewFlag === 1 ? "是" : "否" },
{ label: "是否涉及三人及以上工作内容", children: info.threePeopleFlag === 1 ? "是" : "否" },
{ label: "是否涉及夜间作业", children: info.nightWorkFlag === 1 ? "是" : "否" },
{ label: "项目类别", children: info.qualificationsTypeName },
{ label: "是否存在分包项目", children: info.subcontractFlag === 1 ? "是" : "否" },
{ label: "是否为属地公司推荐", children: info.isLocalCompany === 1 ? "是" : "否" },
{ label: "安全管理协议", children: <TooltipPreviewImg files={info.files} /> },
]}
/>
</Spin>
</div>
<div>
<Divider orientation="left">企业基础信息</Divider>
<Spin spinning="">
<Descriptions
bordered
column={4}
items={[
{ label: "公司名称", children: info.corpInfo?.corpName },
{ label: "企业状态", children: info.corpInfo?.corpStateName },
{ label: "开户人", children: info.corpInfo?.accountContactName },
{ label: "社会统一信号代码", children: info.corpInfo?.code },
{ label: "属地", children: info.corpInfo?.companyArea },
{ label: "所属行业", children: [info.corpInfo?.corpType2Name, info.corpInfo?.corpType3Name, info.corpInfo?.corpType4Name, info.corpInfo?.corpTypeName].filter(Boolean).join("/") },
{ label: "单位经营地址", children: info.corpInfo?.addressBusiness },
{ label: "企业规模", children: info.corpInfo?.scaleName },
{ label: "法定代表人姓名", children: info.corpInfo?.lrName },
{ label: "打定代表人电话", children: info.corpInfo?.lrMobile },
{ label: "主要负责人姓名", children: info.corpInfo?.contacts },
{ label: "主要负责人电话", children: info.corpInfo?.contactsPhone },
{ label: "成立日期", children: info.corpInfo?.createDate },
{ label: "公司人数(人)", children: info.corpInfo?.employees },
{ label: "资产总额(万元)", children: info.corpInfo?.totalAssets },
{ 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: "" },
]}
/>
</Spin>
</div>
<div>
<Divider orientation="left">项目资料信息</Divider>
<Table
options={false}
pagination={false}
disabledResizer={true}
dataSource={projectFileAddCmdList}
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", dataIndex: "createTime" },
{
title: "时效性",
dataIndex: "startValidityPeriod",
render: (_, record) => record.startValidityPeriod ? `${record.startValidityPeriod}${record.endValidityPeriod}` : "-",
},
{
title: "操作",
render: (_, record) => (
<Button
type="link"
onClick={() => {
setViewProjectReviewDetailsModalOpen(true);
setViewProjectReviewDetailsModalData(record);
}}
>
查看
</Button>
),
},
]}
/>
</div>
<div>
<Divider orientation="left">项目人员</Divider>
<Table
options={false}
disabledResizer={true}
pagination={false}
dataSource={projectUserAddCmdList}
columns={[
{ title: "姓名", dataIndex: "userName" },
{ title: "部门", dataIndex: "deptName" },
{
title: "操作",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
setViewProjectReviewUserModalOpen(true);
setViewProjectReviewUserModalData({
...record,
eqQualificationinfoType: 1,
});
}}
>
查看特种证书
</Button>
</Space>
),
},
]}
/>
</div>
{info.subcontractFlag === 1 && (
<div>
<Divider orientation="left">分包项目信息详情</Divider>
<Spin spinning="">
<Table
options={false}
pagination={false}
disabledResizer={true}
dataSource={info.subcontractProjectList || []}
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "审核状态", dataIndex: "projectStatus", render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }) },
{
title: "操作",
render: (_, record) => (
<Button
type="link"
onClick={() => {
props.history.push(`../ProjectFilingApplicationTwo/reView?id=${record.id}`);
}}
>
查看
</Button>
),
},
]}
/>
</Spin>
</div>
)}
<div>
<Divider orientation="left">{info.stakeholderLevel === "one-level" ? "一级项目审核信息" : "审核记录"}</Divider>
<Spin spinning="">
<Table
options={false}
pagination={false}
disabledResizer={true}
dataSource={info.approvalFlowCOList || []}
columns={[
{ title: "审核单位", dataIndex: "corpinfoName" },
{ title: "部门", dataIndex: "departmentName" },
{ title: "姓名", dataIndex: "userName" },
{ title: "时间", dataIndex: "approvalTime" },
{ title: "审核结果", dataIndex: "approvalStatus", render: (_, record) => getLabelName({ list: [{ name: "审核中", bianma: "1" }, { name: "已通过", bianma: "2" }, { name: "已驳回", bianma: "3" }], status: record.approvalStatus }) },
]}
/>
</Spin>
</div>
{(query.projectStatusLast === "1" || query.projectStatusLast === "3" || query.projectStatusLast === "7")
&& (
<div className="btn_bottom">
<Button
onClick={() => auditSubmit(0)}
>
驳回
</Button>
<Button
style={{ marginLeft: "20px" }}
type="primary"
onClick={() => auditSubmit(1)}
>
审核通过
</Button>
</div>
)}
{query.projectStatusLast === "2"
&& (
<div className="btn_bottom">
<Button
onClick={() => props.history.goBack()}
>
返回
</Button>
<Button
style={{ marginLeft: "20px" }}
type="primary"
onClick={() => auditSubmit(1)}
>
确认信息
</Button>
</div>
)}
{viewProjectReviewUserModalOpen
&& <ViewProjectReviewUserModal onCancel={() => setViewProjectReviewUserModalOpen(false)} data={viewProjectReviewUserModalData} />}
{viewProjectReviewDetailsModalOpen
&& (
<ViewProjectReviewDetailsModal
onCancel={() => setViewProjectReviewDetailsModalOpen(false)}
data={viewProjectReviewDetailsModalData}
/>
)}
{props.children}
</div>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(Review);

View File

@ -0,0 +1,57 @@
.qualification-view {
.flows-container {
width: 80%;
margin: 10px auto 0;
.flows {
display: flex;
justify-content: space-between;
align-items: flex-start;
.flow {
text-align: center;
min-width: 120px;
.status {
border-radius: 50%;
border: 1px solid rgba(0, 0, 0, 0.2);
padding: 10px;
width: 80px;
height: 80px;
line-height: 60px;
margin: 0 auto 10px;
&.blue {
color: #1890ff;
border-color: #1890ff;
}
&.green {
color: #52c41a;
border-color: #52c41a;
}
&.red {
color: #ff4d4f;
border-color: #ff4d4f;
}
}
}
.line {
flex: 1;
height: 2px;
background-color: #1890ff;
align-self: center;
margin: 0 10px;
}
}
}
}
.btn_bottom{
text-align: center;
margin-top: 20px;
}

View File

@ -0,0 +1,5 @@
function ProjectFilingApplication(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingApplication;

View File

@ -0,0 +1,101 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["projectPage"], {
form,
params: {
searchType: 5,
eqStakeholderLevel: "one-level",
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{ name: "eqSubcontractFlag", label: "是否存在分包", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [
{ bianma: "1", name: "是" },
{ bianma: "0", name: "否" },
] },
{
name: "eqProjectStatus",
label: "项目审核状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: PROJECT_STATUS_MAP,
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "项目名称", dataIndex: "projectName" },
{ title: "是否为属地公司推荐", dataIndex: "isLocalCompany", render: (_, record) => record.isLocalCompany === 1 ? "是" : "否" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag ? "是" : "否" },
{ title: "分包项目总数", dataIndex: "secondLevelTotal" },
{
title: "一级项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 350,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChange?id=${record.id}`);
}}
>
项目人员变更
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChangeRecord?id=${record.id}`);
}}
>
人员变更记录
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,7 @@
import ViewUserChange from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChange";
function UserChange(props) {
return (<ViewUserChange {...props} />);
};
export default UserChange;

View File

@ -0,0 +1,7 @@
import ViewUserChangeRecordPage from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChangeRecord";
function UserChangeRecord(props) {
return (<ViewUserChangeRecordPage {...props} />);
};
export default UserChangeRecord;

View File

@ -0,0 +1,5 @@
function ProjectFilingInformation(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingInformation;

View File

@ -0,0 +1,932 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Divider, Form, message, Modal, Space, Spin } from "antd";
import dayjs from "dayjs";
import { useEffect, useMemo, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import DepartmentLeftTree from "zy-react-library/components/LeftTree/Department/Gwj";
import Search from "zy-react-library/components/Search";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import PersonnelSelect from "zy-react-library/components/Select/Personnel/Gwj";
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
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 useDeleteFile from "zy-react-library/hooks/useDeleteFile";
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 useUploadFile from "zy-react-library/hooks/useUploadFile";
import { validatorEndTime } from "zy-react-library/utils";
import ViewProjectReviewUserModal from "~/components/ViewProjectReviewUserModal";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function Add(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const [currentStep, setCurrentStep] = useState(1);
const [formValues, setFormValues] = useState({});
const [projectFileAddCmdList, setProjectFileAddCmdList] = useState([]); // 项目资料
const [usercontentAddCmdList, setUsercontentAddCmdList] = useState([]); // 项目审核人员
const [projectLocalCompanyAddCmdList, setProjectLocalCompanyAddCmdList] = useState([]); // 项目执行属地公司
const [projectApprovalUserAddCmdList, setProjectApprovalUserAddCmdList] = useState([]); // 项目审核人员
const [projectApprovalFlowAddCmdList, setProjectApprovalFlowAddCmdList] = useState([]); // 项目审核流程
const [corpinfoId, setCorpinfoId] = useState(); // 项目id
const { getFile } = useGetFile();
// 获取详情数据
const getData = async () => {
const { data } = await props["projectDetail"]({ id: query.id });
if (data.agreementFileUuid) {
const files = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["156"], eqForeignKey: data.agreementFileUuid });
data.projectFiles = files;
}
setFormValues(data);
form.setFieldsValue(data);
let projectUserAddCmdList = [];
if (data.projectUserAddCmdList && data.projectUserAddCmdList.length > 0) {
const otherUsers = data.projectUserAddCmdList.map((item) => {
return {
...item,
id: item.userId,
name: item.userName,
departmentId: item.deptId,
departmentName: item.deptName,
type: "normal", // 普通项目人员
phone: item.userPhone || "",
postName: item.userPostName || "",
};
});
projectUserAddCmdList = [...projectUserAddCmdList, ...otherUsers];
}
setProjectFileAddCmdList(data.projectFileAddCmdList);
setUsercontentAddCmdList(projectUserAddCmdList);
setProjectLocalCompanyAddCmdList(data.projectLocalCompanyAddCmdList);
setProjectApprovalUserAddCmdList(data.projectApprovalUserAddCmdList);
setProjectApprovalFlowAddCmdList(data.projectApprovalFlowAddCmdList);
setCorpinfoId(data.corpinfoId);
};
useEffect(() => {
query.id && getData();
}, []);
return (
<div>
<HeaderBack title={query.id ? "编辑" : "新增"} />
<div style={{ padding: 20 }}>
{currentStep === 1
&& (
<StepOne
setFormValues={setFormValues}
setCurrentStep={setCurrentStep}
formValues={formValues}
form={form}
usercontentAddCmdList={usercontentAddCmdList}
setUsercontentAddCmdList={setUsercontentAddCmdList}
/>
)}
{currentStep === 2
&& (
<StepTwo
setCurrentStep={setCurrentStep}
formValues={formValues}
query={query}
setUsercontentAddCmdList={setUsercontentAddCmdList}
setProjectFileAddCmdList={setProjectFileAddCmdList}
projectFileAddCmdList={projectFileAddCmdList}
usercontentAddCmdList={usercontentAddCmdList}
projectLocalCompanyAddCmdList={projectLocalCompanyAddCmdList}
projectApprovalUserAddCmdList={projectApprovalUserAddCmdList}
projectApprovalFlowAddCmdList={projectApprovalFlowAddCmdList}
corpinfoId={corpinfoId}
/>
)}
</div>
</div>
);
}
const StepOneComponent = (props) => {
const form = props.form;
const approvalCorpId = Form.useWatch("approvalCorpId", form); // 项目审核部门公司
const approvalDeptId = Form.useWatch("approvalDeptId", form); // 项目审核部门
const [corpInfoList, setCorpInfoList] = useState([]); // 项目执行属地公司
const startProjectTime = Form.useWatch("startProjectTime", form); // 项目开始时间
// 获取项目执行属地公司数据
const getCorpInfoList = async () => {
const { data } = await props["corpInfoList"]({ pageIndex: 1, pageSize: 1000, inType: [0, 1, 2] });
setCorpInfoList(data);
};
const handleProjectLeaderChange = (label, extraInfo) => {
if (!extraInfo.userId)
return;
const existingLeaderIndex = props.usercontentAddCmdList.findIndex(
item => item.projectLeader === 1,
);
const newUserList = [...props.usercontentAddCmdList];
// 如果已存在项目负责人,更新之
if (existingLeaderIndex >= 0) {
newUserList[existingLeaderIndex] = {
...newUserList[existingLeaderIndex],
id: extraInfo.userId,
name: label,
departmentId: extraInfo?.departmentId || "",
departmentName: extraInfo?.departmentName || "",
phone: extraInfo?.phone || "",
postName: extraInfo?.postName || "",
projectLeader: 1,
};
}
else {
// 如果不存在,添加新的项目负责人
newUserList.unshift({
id: extraInfo.userId,
name: label,
departmentId: extraInfo?.departmentId || "",
departmentName: extraInfo?.departmentName || "",
phone: extraInfo?.phone || "",
postName: extraInfo?.postName || "",
projectLeader: 1,
});
}
props.setUsercontentAddCmdList(newUserList);
};
useEffect(() => {
getCorpInfoList();
form.setFieldsValue(props.formValues);
if (props.formValues.userId && props.formValues.userName) {
const existingLeader = props.usercontentAddCmdList.find(
item => item.projectLeader === 1,
);
if (!existingLeader) {
const newUserList = [
{
id: props.formValues.userId,
name: props.formValues.userName,
departmentId: props.formValues.deptId || "",
departmentName: props.formValues.deptName || "",
phone: props.formValues.userPhone || "",
postName: props.formValues.userPostName || "",
projectLeader: 1,
},
...props.usercontentAddCmdList.filter(item => item.projectLeader !== 1),
];
props.setUsercontentAddCmdList(newUserList);
}
}
}, [props.formValues]);
return (
<FormBuilder
form={form}
span={8}
loading={props.qualificationStatistics.qualificationStatisticsLoading}
onFinish={(values) => {
props.setCurrentStep(2);
props.setFormValues(values);
}}
values={{ stakeholderLevel: "two-level", stakeholderLevelName: "二级相关方" }}
submitButtonText="下一步"
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: "userName", label: "项目负责人", onlyForLabel: true },
{ name: "initiationTime", label: "立项时间", render: FORM_ITEM_RENDER_ENUM.DATE },
{ name: "startProjectTime", label: "计划开始时间", render: FORM_ITEM_RENDER_ENUM.DATE },
{ name: "endProjectTime", label: "计划竣工时间", render: FORM_ITEM_RENDER_ENUM.DATE, rules: [validatorEndTime(startProjectTime)] },
{ 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: "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",
label: "集团公司审核",
labelCol: { span: 5 },
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("approvalCorpName", label);
form.setFieldsValue({
approvalDeptId: "",
approvalDeptName: "",
approvalUserIds: [],
approvalUserNames: "",
});
},
},
},
{ name: "approvalCorpName", label: "集团公司审核名称", onlyForLabel: true },
{
name: "approvalDeptId",
labelCol: { span: 5 },
label: "集团公司部门审核",
render: (
<DepartmentSelectTree
params={{ eqCorpinfoId: approvalCorpId }}
isNeedCorpInfoId
onGetLabel={label => form.setFieldValue("approvalDeptName", label)}
onChange={() => {
form.setFieldsValue({
approvalUserIds: [],
approvalUserNames: "",
});
}}
/>
),
},
{ name: "approvalDeptName", label: "集团公司部门审核名称", onlyForLabel: true },
{
name: "approvalUserIds",
label: "集团公司人员审核",
labelCol: { span: 5 },
render: (
<PersonnelSelect
params={{ departmentId: approvalDeptId }}
onGetLabel={label => form.setFieldValue("approvalUserNames", label)}
mode="multiple"
/>
),
},
{ 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: "deleteProjectFileAddCmdList", label: "删除的安全管理协议", onlyForLabel: true },
{ name: "agreementFileUuid", label: "安全协议uuid", onlyForLabel: true },
{ name: "stakeholderLevel", onlyForLabel: true },
{ name: "stakeholderLevelName", onlyForLabel: true },
]}
/>
);
};
const StepTwoComponent = (props) => {
const query = props.query;
const projectFileList = props.projectFileAddCmdList || []; // 项目资料
const usercontentList = props.usercontentAddCmdList || []; // 项目审核人员
const setProjectFileList = props.setProjectFileAddCmdList || []; // 项目资料赋值
const setUsercontentList = props.setUsercontentAddCmdList || []; // 项目审核人员赋值
const projectLocalCompanyAddCmdList = props.projectLocalCompanyAddCmdList || []; // 项目所属属地公司
const projectApprovalUserAddCmdList = props.projectApprovalUserAddCmdList || []; // 项目审核人员
const projectApprovalFlowAddCmdList = props.projectApprovalFlowAddCmdList || []; // 项目审核流程
const corpinfoId = props.corpinfoId; // 公司id
const [uploadFileModalOpen, setUploadFileModalOpen] = useState(false); // 上传文件弹窗显示
const [usercontentOpen, setUsercontentOpen] = useState(false); // 选择项目审核人员弹窗显示
const [uploadFileModalData, setUploadFileModalData] = useState({ // 上传文件弹窗数据
index: -1,
files: [],
});
const [fetchUserList, setFetchUserList] = useState({ // 选择项目审核人员弹窗数据
index: -1,
});
const { loading: uploadFileLoading, uploadFile } = useUploadFile();
const { loading: deleteFileLoading, deleteFile } = useDeleteFile();
const [viewProjectReviewUserModalOpen, setViewProjectReviewUserModalOpen] = useState(false); // 查看特种作业人员证书弹窗
const [viewProjectReviewUserModalData, setViewProjectReviewUserModalData] = useState({}); // 查看安全人员证书列表
const { loading: getFileLoading, getFile } = useGetFile();
const [chooseFilsListModalOpen, setChooseFilsListModalOpen] = useState(false);
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 });
projectFileList[i].files = files;
}
};
useEffect(() => {
getData();
}, []);
// 点击新增项目相关资料
const onUploadFileOpen = () => {
// 初始化项目相关资料弹窗数据
setUploadFileModalData({
type: "add",
index: -1,
files: [],
deleteFiles: [],
});
setUploadFileModalOpen(true);
};
// 项目相关资料提交
const onUploadFileConfirm = (values) => {
const newItem = {
dataName: values.dataName,
files: values.files || [],
deleteFiles: values.deleteFiles || [],
startValidityPeriod: values.startValidityPeriod,
endValidityPeriod: values.endValidityPeriod,
createTime: dayjs().format("YYYY-MM-DD hh:mm:ss"),
};
if (values.type === "add") {
setProjectFileList(prev => [...prev, newItem]);
}
else {
setProjectFileList((prev) => {
const newList = [...prev];
if (values.index >= 0 && values.index < newList.length) {
newList[values.index] = { ...newList[values.index], ...newItem };
}
return newList;
});
}
setUploadFileModalOpen(false);
};
// 点击修改项目相关资料
const handleEdit = (index) => {
const item = projectFileList[index];
setUploadFileModalData({
type: "update",
index,
files: item.files || [],
deleteFiles: item.deleteFiles || [],
dataName: item.dataName,
startValidityPeriod: item.startValidityPeriod,
endValidityPeriod: item.endValidityPeriod,
});
setUploadFileModalOpen(true);
};
// 点击删除项目相关资料
const handleDelete = (index) => {
Modal.confirm({
title: "确认删除",
content: "确定要删除这条资料吗?",
onOk: () => {
setProjectFileList((prev) => {
const newList = [...prev];
newList.splice(index, 1);
return newList;
});
message.success("删除成功");
},
});
};
// 点击新增项目人员
const OnUsercontentOpen = () => {
setUsercontentOpen(true);
setFetchUserList(usercontentList);
};
// 项目人员确认提交
const handleConfirmAdd = (selectedData) => {
setUsercontentList(selectedData);
setFetchUserList(selectedData);
// 关闭弹窗
setUsercontentOpen(false);
};
// 提交审核
const onSubmit = async () => {
if (props.formValues.length === 0) {
message.error(`请新增项目相关资料`);
return;
}
if (usercontentList.length === 0) {
message.error(`请新增项目人员`);
return;
}
await deleteFile({ single: false, files: props.formValues.deleteProjectFileAddCmdList });
const { id: agreementFileUuid } = await uploadFile({
single: false,
files: props.formValues.projectFiles,
params: { type: UPLOAD_FILE_TYPE_ENUM["156"], foreignKey: props.formValues.agreementFileUuid },
});
props.formValues.agreementFileUuid = agreementFileUuid;
for (let i = 0; i < projectFileList.length; i++) {
await deleteFile({ single: false, files: projectFileList[i].deleteFiles });
const { id } = await uploadFile({
single: false,
files: projectFileList[i].files,
params: { type: UPLOAD_FILE_TYPE_ENUM["151"], foreignKey: projectFileList[i].projectFileId },
});
projectFileList[i].projectFileId = id;
}
console.log("usercontentList", usercontentList);
const userList = usercontentList.map(item => ({
userId: item.id,
userName: item.name,
deptId: item.departmentId,
deptName: item.departmentName,
userPhone: item.phone,
userPostName: item.postName,
projectLeader: item.projectLeader,
}));
console.log("userList", userList);
const data = { ...props.formValues, projectUserAddCmdList: [...userList], projectFileAddCmdList: [...projectFileList], projectLocalCompanyAddCmdList: [...projectLocalCompanyAddCmdList], projectApprovalUserAddCmdList: [...projectApprovalUserAddCmdList], projectApprovalFlowAddCmdList: [...projectApprovalFlowAddCmdList], corpinfoId };
const { success } = await props[!query.id ? "projectAdd" : "projectUpdate"]({
...data,
id: query.id,
});
if (success) {
message.success("提交成功,请等待审核");
window.history.back();
}
};
const handleChooseFilsSubmit = (selectedRows) => {
const existingIds = projectFileList
.filter(item => item.detailId)
.map(item => item.detailId);
const newRows = selectedRows.filter(row =>
row.detailId && !existingIds.includes(row.detailId),
);
const formattedRows = newRows.map(row => ({
...row,
}));
// 合并到现有列表中
setProjectFileList(prev => [...prev, ...formattedRows]);
setChooseFilsListModalOpen(false);
};
return (
<div>
<Spin
spinning={props.qualificationStatistics.qualificationStatisticsLoading || uploadFileLoading || deleteFileLoading || getFileLoading}
>
<div>
<Divider orientation="left">项目相关资料</Divider>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
setChooseFilsListModalOpen(true);
}}
>
添加已审核资质资料
</Button>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
onUploadFileOpen();
}}
>
新增
</Button>
</>
)}
dataSource={projectFileList}
pagination={false}
options={false}
disabledResizer={true}
rowKey={record => record.id || record.dataName}
columns={[
{ title: "材料名称", key: "dataName", dataIndex: "dataName" },
{ title: "上传时间", key: "createTime", dataIndex: "createTime", render: (_, record) => record.createTime || "-" },
{
title: "时效性",
key: "validityPeriod",
dataIndex: "startValidityPeriod",
render: (_, record) => record.startValidityPeriod ? `${record.startValidityPeriod}${record.endValidityPeriod}` : "-",
},
{
title: "操作",
render: (_, record, index) => (
<Space>
<Button
type="link"
onClick={() => handleEdit(index)}
>
修改
</Button>
<Button
type="link"
onClick={() => handleDelete(index)}
>
删除
</Button>
</Space>
),
},
]}
/>
</div>
<div>
<Divider orientation="left">项目人员</Divider>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
OnUsercontentOpen();
}}
>
新增
</Button>
</>
)}
dataSource={usercontentList}
pagination={false}
options={false}
disabledResizer={true}
rowKey="id"
columns={[
{ title: "姓名", dataIndex: "name" },
{ title: "部门", dataIndex: "departmentName" },
{
title: "操作",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
setViewProjectReviewUserModalOpen(true);
setViewProjectReviewUserModalData({
...record,
eqQualificationinfoType: 1,
});
}}
>
特种作业人员证书
</Button>
<Button
type="link"
onClick={() => {
setViewProjectReviewUserModalOpen(true);
setViewProjectReviewUserModalData({
...record,
eqQualificationinfoType: 2,
});
}}
>
安全人员证书列表
</Button>
</Space>
),
},
]}
/>
</div>
<div style={{ textAlign: "center", marginTop: 20 }}>
<Space>
<Button onClick={() => {
Modal.confirm({
title: "提示",
content: "填写的信息将被清除,确定要返回吗?",
onOk: () => props.setCurrentStep(1),
});
}}
>
上一步
</Button>
<Button type="primary" onClick={onSubmit}>提交审核</Button>
</Space>
</div>
</Spin>
{uploadFileModalOpen && (
<FileUpload
data={uploadFileModalData}
onCancel={() => {
setUploadFileModalOpen(false);
}}
onSubmit={(values) => {
setUploadFileModalOpen(false);
onUploadFileConfirm(values);
}}
/>
)}
{usercontentOpen && (
<Usercontent
data={fetchUserList}
onCancel={() => {
setUsercontentOpen(false);
}}
onConfirm={handleConfirmAdd}
/>
)}
{viewProjectReviewUserModalOpen
&& <ViewProjectReviewUserModal onCancel={() => setViewProjectReviewUserModalOpen(false)} data={viewProjectReviewUserModalData} />}
{chooseFilsListModalOpen && (
<ChooseFilsList
data={projectFileList}
onSubmit={handleChooseFilsSubmit} // 使用新的处理函数
onCancel={() => {
setChooseFilsListModalOpen(false);
}}
/>
)}
</div>
);
};
const ChooseFilsComponent = (props) => {
const [selectedRowKeys, setSelectedRowKeys] = useState([]); // 存储选中的行键
const [selectedRows, setSelectedRows] = useState([]); // 存储选中行的完整数据
const { tableProps } = useTable(props["qualificationsDetails"], {
params: {
qualificationsTypeId: "",
},
});
const submit = () => {
if (props.onSubmit) {
props.onSubmit(selectedRows);
}
};
useEffect(() => {
if (props.data && Array.isArray(props.data)) {
const keys = props.data
.filter(item => item && item.detailId)
.map(item => item.detailId);
setSelectedRowKeys(keys);
setSelectedRows(props.data);
}
}, [props.data]);
const handleRowSelectionChange = (selectedRowKeys, selectedRows) => {
setSelectedRowKeys(selectedRowKeys);
setSelectedRows(selectedRows);
};
return (
<Modal
title="项目备案申请"
width={1200}
open
maskClosable={false}
onCancel={props.onCancel}
onOk={submit}
>
<Table
rowSelection={{
selectedRowKeys,
preserveSelectedRowKeys: true,
onChange: handleRowSelectionChange,
}}
rowKey="detailId"
columns={[
{ title: "材料名称", dataIndex: "dataName" },
{ title: "上传时间", key: "createTime", dataIndex: "createTime", render: (_, record) => record.createTime || "-" },
{
title: "时效性",
key: "validityPeriod",
dataIndex: "startValidityPeriod",
render: (_, record) => record.startValidityPeriod ? `${record.startValidityPeriod}${record.endValidityPeriod}` : "-",
},
]}
{...tableProps}
/>
</Modal>
);
};
// 选择项目人员的组件
const UsercontentComponent = (props) => {
const [form] = Form.useForm();
const [selectedRowKeys, setSelectedRowKeys] = useState([]); // 存储选中的行键
const [selectedRows, setSelectedRows] = useState([]); // 存储选中行的完整数据
const [inDepartmentId, setInDepartmentId] = useState([]); // 存储已选择的部门id
const { tableProps, getData } = useTable(props["userList"], {
form,
params: {
likeName: "",
likeUserIdCard: "",
inDepartmentId,
eqEmploymentFlag: 1, // 在职
},
});
const projectLeader = useMemo(() => {
if (props.data && Array.isArray(props.data)) {
return props.data.find(item => item.projectLeader === 1);
}
return null;
}, [props.data]);
// 初始化选中的数据
useEffect(() => {
const initialSelectedRows = [...(props.data || [])];
const initialSelectedKeys = initialSelectedRows
.filter(item => item && item.id)
.map(item => item.id);
const processedRows = initialSelectedRows.map(item => ({
...item,
projectLeader: item.projectLeader || (projectLeader && item.id === projectLeader.id ? 1 : 0),
}));
setSelectedRowKeys(initialSelectedKeys);
setSelectedRows(processedRows);
}, [props.data, projectLeader]);
const handleConfirmAdd = () => {
if (props.onConfirm) {
// 确保项目负责人始终在选中列表中
const finalSelectedRows = [...selectedRows];
if (projectLeader && !selectedRows.find(item => item.id === projectLeader.id)) {
finalSelectedRows.unshift(projectLeader);
}
// 为选中的用户数据添加 projectLeader 字段
const processedRows = finalSelectedRows.map(item => ({
...item,
projectLeader: projectLeader && item.id === projectLeader.id ? 1 : 0,
}));
props.onConfirm(processedRows);
}
};
const handleRowSelectionChange = (selectedRowKeys, selectedRows) => {
// 如果项目负责人已存在,确保不会被取消选择
if (projectLeader) {
const leaderKey = projectLeader.id;
if (!selectedRowKeys.includes(leaderKey)) {
selectedRowKeys.push(leaderKey);
selectedRows.push({
...projectLeader,
projectLeader: 1,
});
}
}
setSelectedRowKeys([...selectedRowKeys]);
setSelectedRows([...selectedRows]);
};
return (
<Modal
title="相关方企业人员列表"
width={1200}
open
maskClosable={false}
onCancel={props.onCancel}
footer={null}
>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeName", label: "姓名" },
{ name: "likeUserIdCard", label: "身份证" },
]}
form={form}
onFinish={(values) => {
getData(values);
}}
/>
<div style={{ display: "flex", gap: 20 }}>
<div style={{ width: 300 }}>
<DepartmentLeftTree
checkable
onCheck={(checkedKeys) => {
setInDepartmentId(checkedKeys);
getData();
}}
/>
</div>
<div style={{ flex: 1 }}>
<Table
rowSelection={{
selectedRowKeys,
preserveSelectedRowKeys: true,
onChange: handleRowSelectionChange,
getCheckboxProps: record => ({
// 如果是项目负责人,禁用取消选择
disabled: projectLeader && record.id === projectLeader.id,
}),
}}
rowKey="id"
toolBarRender={() => (
<>
<Button
type="primary"
onClick={handleConfirmAdd}
>
确认添加
</Button>
</>
)}
columns={[
{ title: "手机号", dataIndex: "phone" },
{ title: "姓名", dataIndex: "name" },
{ title: "所属部门", dataIndex: "departmentName" },
{ title: "所属岗位", dataIndex: "postName" },
{ title: "是否存在人资系统", dataIndex: "rzFlag", render: (_, record) => record.rzFlag === 1 ? "是" : "否" },
]}
{...tableProps}
/>
</div>
</div>
</Modal>
);
};
// 项目资料信息的组件
const FileUpload = (props) => {
const [form] = Form.useForm();
const startValidityPeriod = Form.useWatch("startValidityPeriod", form);
useEffect(() => {
form.setFieldsValue({
type: props.data.type,
index: props.data.index,
dataName: props.data.dataName,
files: props.data.files,
startValidityPeriod: props.data.startValidityPeriod,
endValidityPeriod: props.data.endValidityPeriod,
});
}, []);
return (
<Modal
title="项目相关资料"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
onOk={form.submit}
>
<FormBuilder
form={form}
showActionButtons={false}
onFinish={values => props.onSubmit(values)}
span={24}
labelCol={{ span: 8 }}
options={[
{ name: "dataName", label: "资料名称" },
{
name: "startValidityPeriod",
label: "有效期开始时间",
render: FORM_ITEM_RENDER_ENUM.DATE,
},
{ name: "type", label: "新增或修改", onlyForLabel: true },
{ name: "index", label: "索引", onlyForLabel: true },
{
name: "endValidityPeriod",
label: "有效期结束时间",
render: FORM_ITEM_RENDER_ENUM.DATE,
rules: [validatorEndTime(startValidityPeriod)],
},
{
name: "files",
label: "资料",
render: (
<Upload
fileType="image"
maxCount={10}
accept=".pdf,.jpg,.jpeg,.png"
onGetRemoveFile={(files) => {
form.setFieldValue("deleteFiles", [...(form.getFieldValue("deleteFiles") || []), files]);
}}
/>
),
},
{ name: "deleteFiles", label: "删除的资料", onlyForLabel: true },
]}
/>
</Modal>
);
};
const StepOne = Connect([NS_QUALIFICATION_STATISTICS], true)(StepOneComponent);
const StepTwo = Connect([NS_QUALIFICATION_STATISTICS], true)(StepTwoComponent);
const Usercontent = Connect([NS_QUALIFICATION_STATISTICS], true)(UsercontentComponent);
const ChooseFilsList = Connect([NS_QUALIFICATION_STATISTICS], true)(ChooseFilsComponent);
export default Connect([NS_QUALIFICATION_STATISTICS], true)(Add);

View File

@ -0,0 +1,145 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
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";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevel: "two-level",
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
{
name: "",
label: "项目审核状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: PROJECT_STATUS_MAP,
},
]}
form={form}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<Space>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
</Space>
)}
columns={[
{ title: "集团单位名称", dataIndex: "corpinfoName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "二级项目名称", dataIndex: "projectName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "上级审核主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function ProjectFilingApplication(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingApplication;

View File

@ -0,0 +1,89 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["projectPage"], {
form,
params: {
searchType: 5,
eqStakeholderLevel: "two-level",
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "集团单位名称", dataIndex: "groupCompanyName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "二级项目名称", dataIndex: "projectName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{ title: "上级审核主管部门", dataIndex: "parentManageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{
title: "项目审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 350,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChange?id=${record.id}`);
}}
>
项目人员变更
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChangeRecord?id=${record.id}`);
}}
>
人员变更记录
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,7 @@
import ViewUserChange from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChange";
function UserChange(props) {
return (<ViewUserChange {...props} />);
};
export default UserChange;

View File

@ -0,0 +1,7 @@
import ViewUserChangeRecordPage from "~/pages/Container/Supervision/ProjectReview/ProjectFilingInformation/UserChangeRecord";
function UserChangeRecord(props) {
return (<ViewUserChangeRecordPage {...props} />);
};
export default UserChangeRecord;

View File

@ -0,0 +1,5 @@
function ProjectFilingInformation(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingInformation;

View File

@ -0,0 +1,5 @@
function ProjectReview(props) {
return (<div>{props.children}</div>);
}
export default ProjectReview;

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "one-level",
eqSubcontractFlag: 0,
eqProjectStatus: 1,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=1`);
}}
>
{record.projectStatus === 1 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "one-level",
eqSubcontractFlag: 1,
eqProjectStatus: 1,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=1`);
}}
>
{record.projectStatus === 1 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function Subcontract(props) {
return (<div>{props.children}</div>);
}
export default Subcontract;

View File

@ -0,0 +1,5 @@
function ProjectApproval(props) {
return (<div>{props.children}</div>);
}
export default ProjectApproval;

View File

@ -0,0 +1,118 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Descriptions, Form, Modal, Space } from "antd";
import { useState } from "react";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["inCheckList"], {
form,
params: {
eqStakeholderLevelL: "two-level",
eqProjectStatus: 1,
},
});
const [rejectReasonModalOpen, setRejectReasonModalOpen] = useState(false); // 驳回原因弹窗
const [rejectReason, setRejectReason] = useState(false); // 驳回原因
// 点击查看驳回原因
const onViewRejectReason = async (id) => {
const { data } = await props["projectApprovalFlow"]({ id });
setRejectReason(data);
setRejectReasonModalOpen(true);
};
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "集团单位名称", dataIndex: "groupCompanyName" },
{ title: "一级项目名称", dataIndex: "parentProjectName" },
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 150,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}&projectStatusLast=1`);
}}
>
{record.projectStatus === 1 ? "审核" : "查看"}
</Button>
{record.projectStatus === 6 && (
<Button
type="link"
onClick={() => {
onViewRejectReason(record.id);
}}
danger
>
查看驳回原因
</Button>
)}
</Space>
),
},
]}
{...tableProps}
/>
{rejectReasonModalOpen && <RejectReason rejectReason={rejectReason} onCancel={() => setRejectReasonModalOpen(false)} />}
</div>
);
}
const RejectReason = (props) => {
return (
<Modal
title="查看驳回原因"
width={800}
open
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
]}
>
<Descriptions
bordered
column={1}
styles={{ label: { width: 200 } }}
items={[
{ label: "驳回原因", children: props.rejectReason },
]}
/>
</Modal>
);
};
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,5 @@
function ProjectApprovalTwo(props) {
return (<div>{props.children}</div>);
}
export default ProjectApprovalTwo;

View File

@ -0,0 +1,91 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
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";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROJECT_STATUS_MAP } from "~/enumerate/constant";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["projectPage"], {
form,
params: {
searchType: props.searchType || 1,
eqStakeholderLevel: props.eqStakeholderLevel || "",
},
});
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeProjectName", label: "项目名称" },
{ name: "likeCorpInfoName", label: "相关方名称" },
{
name: "eqQualificationsTypeId",
label: "项目类别",
render: (<DictionarySelect dictValue="qualificationsType" />),
},
]}
form={form}
onFinish={getData}
/>
<Table
columns={[
{ title: "相关方名称", dataIndex: "corpinfoName" },
{ title: "项目名称", dataIndex: "projectName" },
{ title: "股份主管部门", dataIndex: "manageDeptName" },
{ title: "项目类别", dataIndex: "qualificationsTypeName" },
{ title: "是否存在分包", dataIndex: "subcontractFlag", render: (_, record) => record.subcontractFlag ? "是" : "否" },
{ title: "二级项目数", dataIndex: "secondLevelTotal" },
{ title: "项目执行属地公司", dataIndex: "companyName" },
{
title: "项目备案审核状态",
dataIndex: "projectStatus",
render: (_, record) => getLabelName({ list: PROJECT_STATUS_MAP, status: record.projectStatus }),
},
{
title: "操作",
fixed: "right",
width: 350,
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
props.history.push(`./reView?id=${record.id}`);
}}
>
查看
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChange?id=${record.id}`);
}}
>
项目人员变更
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./UserChangeRecord?id=${record.id}`);
}}
>
人员变更记录
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(List);

View File

@ -0,0 +1,7 @@
import ViewPage from "~/pages/Container/Stakeholder/ProjectReview/ProjectFilingApplication/ReView";
function ReView(props) {
return (<ViewPage {...props} />);
};
export default ReView;

View File

@ -0,0 +1,343 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space } from "antd";
import { useEffect, useMemo, useState } from "react";
import HeaderBack from "zy-react-library/components/HeaderBack";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import DepartmentLeftTree from "zy-react-library/components/LeftTree/Department/Gwj";
import Search from "zy-react-library/components/Search";
import Table from "zy-react-library/components/Table";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function UserChange(props) {
const query = useGetUrlQuery();
const { tableProps, getData } = useTable(props["projectUserList"], { params: { eqProjectId: query.id } });
const { tableProps: allData } = useTable(props["projectUserList"], { params: { eqProjectId: query.id, pageIndex: 1, pageSize: 999999 } });
const [usercontentOpen, setUsercontentOpen] = useState(false); // 选择项目审核人员弹窗显示
const [fetchUserList, setFetchUserList] = useState([]); // 已存在的项目人员数据
const onDelete = (record) => {
Modal.confirm({
title: "删除确认",
content: "确定要删除吗?",
onOk: async () => {
const { success } = await props["projectUserDelete"]({ id: record.id });
if (success) {
message.success("删除成功");
getData();
}
},
});
};
// 点击新增项目人员
const OnUsercontentOpen = () => {
setUsercontentOpen(true);
// 保存已存在的项目人员数据,用于弹窗回显
if (allData.dataSource && Array.isArray(allData.dataSource)) {
setFetchUserList(allData.dataSource.map(item => ({
id: item.userId || item.id,
name: item.userName || item.name,
departmentId: item.deptId || item.departmentId,
departmentName: item.deptName || item.departmentName,
phone: item.userPhone || item.phone,
postName: item.userPostName || item.postName,
projectLeader: item.projectLeader || 0,
})));
}
};
// 项目人员确认提交
const handleConfirmAdd = async (selectedData) => {
const userList = selectedData.map(item => ({
userId: item.id,
userName: item.name,
deptId: item.departmentId,
deptName: item.departmentName,
userPhone: item.phone,
userPostName: item.postName,
projectLeader: item.projectLeader,
}));
const { success } = await props["projectUserAdd"]({
id: query.id,
projectUserAddCmdList: userList,
});
if (success) {
message.success("新增成功");
setUsercontentOpen(false);
getData();
}
};
return (
<div>
<HeaderBack title="项目人员变更" />
<div style={{ padding: "0 20px 20px 20px" }}>
<Table
toolBarRender={() => (
<Space>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
OnUsercontentOpen();
}}
>
新增
</Button>
</Space>
)}
columns={[
{ title: "姓名", dataIndex: "userName" },
{ title: "部门", dataIndex: "deptName" },
{
title: "是否为项目负责人",
dataIndex: "projectLeader",
render: value => value === 1 ? "是" : "否",
},
{
title: "操作",
fixed: "right",
render: (_, record) => (
<Space>
<Button
type="link"
onClick={() => {
// 查看特种证书逻辑
}}
>
查看特种证书
</Button>
<Button
type="link"
danger
onClick={() => onDelete(record)}
>
删除
</Button>
</Space>
),
},
]}
{...tableProps}
/>
</div>
{usercontentOpen && (
<Usercontent
data={fetchUserList}
projectId={query.id}
onCancel={() => {
setUsercontentOpen(false);
}}
onConfirm={handleConfirmAdd}
/>
)}
</div>
);
}
// 选择项目人员的组件
const UsercontentComponent = (props) => {
const [form] = Form.useForm();
const [selectedRowKeys, setSelectedRowKeys] = useState([]); // 存储选中的行键
const [selectedRows, setSelectedRows] = useState([]); // 存储选中行的完整数据
const [inDepartmentId, setInDepartmentId] = useState([]); // 存储已选择的部门id
const [tableDataSource, setTableDataSource] = useState([]); // 表格数据源
const { tableProps, getData } = useTable(props["userList"], {
form,
params: {
likeName: "",
likeUserIdCard: "",
inDepartmentId,
eqEmploymentFlag: 1, // 在职
},
});
// 合并表格数据:接口返回的数据 + 已存在但可能不在接口数据中的人员
useEffect(() => {
if (tableProps.dataSource) {
// 创建已存在用户的ID映射用于去重
const existingUserIds = new Set();
const mergedData = [];
// 1. 添加接口返回的数据
tableProps.dataSource.forEach((item) => {
mergedData.push({
...item,
// 统一字段名
id: item.id,
name: item.username || item.name,
});
existingUserIds.add(item.id);
});
// 2. 添加已存在但不在接口数据中的用户
if (props.data && Array.isArray(props.data)) {
props.data.forEach((user) => {
if (!existingUserIds.has(user.id)) {
mergedData.push({
...user,
id: user.id,
name: user.name,
// 确保有必要的字段
username: user.name,
departmentName: user.departmentName,
postName: user.postName,
phone: user.phone,
rzFlag: user.rzFlag,
});
}
});
}
setTableDataSource(mergedData);
}
}, [tableProps.dataSource, props.data]);
const projectLeader = useMemo(() => {
if (props.data && Array.isArray(props.data)) {
return props.data.find(item => item.projectLeader === 1);
}
return null;
}, [props.data]);
// 初始化选中的数据
useEffect(() => {
if (props.data && Array.isArray(props.data)) {
const initialSelectedRows = [];
const initialSelectedKeys = [];
props.data.forEach((item) => {
if (item && item.id) {
initialSelectedKeys.push(item.id);
initialSelectedRows.push({
...item,
name: item.name,
projectLeader: item.projectLeader || 0,
});
}
});
setSelectedRowKeys(initialSelectedKeys);
setSelectedRows(initialSelectedRows);
}
}, [props.data]);
const handleConfirmAdd = () => {
if (props.onConfirm) {
// 获取所有选中的行
const selectedUsers = selectedRows;
// 确保项目负责人在列表中
if (projectLeader && !selectedUsers.find(item => item.id === projectLeader.id)) {
selectedUsers.unshift({
...projectLeader,
projectLeader: 1,
});
}
// 为选中的用户数据添加 projectLeader 字段
const processedRows = selectedUsers.map(item => ({
...item,
projectLeader: projectLeader && item.id === projectLeader.id ? 1 : 0,
}));
props.onConfirm(processedRows);
}
};
const handleRowSelectionChange = (selectedRowKeys, selectedRows) => {
// 处理选中的行
const processedSelectedRows = selectedRows.map(row => ({
...row,
projectLeader: projectLeader && row.id === projectLeader.id ? 1 : 0,
}));
setSelectedRowKeys(selectedRowKeys);
setSelectedRows(processedSelectedRows);
};
return (
<Modal
title="相关方企业人员列表"
width={1200}
open
maskClosable={false}
onCancel={props.onCancel}
footer={null}
>
<Search
labelCol={{ span: 8 }}
options={[
{ name: "likeName", label: "姓名" },
{ name: "likeUserIdCard", label: "身份证" },
]}
form={form}
onFinish={(values) => {
getData(values);
}}
/>
<div style={{ display: "flex", gap: 20 }}>
<div style={{ width: 300 }}>
<DepartmentLeftTree
checkable
onCheck={(checkedKeys) => {
setInDepartmentId(checkedKeys);
getData();
}}
/>
</div>
<div style={{ flex: 1 }}>
<Table
rowSelection={{
selectedRowKeys,
preserveSelectedRowKeys: true,
onChange: handleRowSelectionChange,
getCheckboxProps: record => ({
// 如果是项目负责人,禁用取消选择
disabled: projectLeader && record.id === projectLeader.id,
}),
}}
rowKey="id"
toolBarRender={() => (
<>
<Button
type="primary"
onClick={handleConfirmAdd}
>
确认添加
</Button>
</>
)}
columns={[
{ title: "手机号", dataIndex: "phone" },
{
title: "姓名",
dataIndex: "name",
render: (text, record) => (
<div>
{text}
{projectLeader && record.id === projectLeader.id && (
<span style={{ color: "#1890ff", marginLeft: 8 }}>(项目负责人)</span>
)}
</div>
),
},
{ title: "所属部门", dataIndex: "departmentName" },
{ title: "所属岗位", dataIndex: "postName" },
{ title: "是否存在人资系统", dataIndex: "rzFlag", render: (_, record) => record.rzFlag === 1 ? "是" : "否" },
]}
dataSource={tableDataSource}
pagination={tableProps.pagination}
loading={tableProps.loading}
/>
</div>
</div>
</Modal>
);
};
const Usercontent = Connect([NS_QUALIFICATION_STATISTICS], true)(UsercontentComponent);
export default Connect([NS_QUALIFICATION_STATISTICS], true)(UserChange);

View File

@ -0,0 +1,29 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import HeaderBack from "zy-react-library/components/HeaderBack";
import Table from "zy-react-library/components/Table";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { NS_QUALIFICATION_STATISTICS } from "~/enumerate/namespace";
function UserChange(props) {
const query = useGetUrlQuery();
const { tableProps } = useTable(props["projectUserChangeRecordList"], { params: { eqProjectId: query.id } });
return (
<div>
<HeaderBack title="项目人员变更记录" />
<div style={{ padding: "0 20px 20px 20px" }}>
<Table
columns={[
{ title: "姓名", dataIndex: "userName" },
{ title: "部门", dataIndex: "deptName" },
{ title: "操作", dataIndex: "changeType", render: (text) => { return text === 1 ? "删除" : "新增"; } },
{ title: "记录时间", dataIndex: "createTime" },
]}
{...tableProps}
/>
</div>
</div>
);
}
export default Connect([NS_QUALIFICATION_STATISTICS], true)(UserChange);

View File

@ -0,0 +1,5 @@
function ProjectFilingInformation(props) {
return (<div>{props.children}</div>);
}
export default ProjectFilingInformation;

View File

@ -0,0 +1,5 @@
function ProjectReview(props) {
return (<div>{props.children}</div>);
}
export default ProjectReview;