需求变更 项目确认添加重点作业

dev
853931625@qq.com 2026-06-22 17:31:20 +08:00
parent 592a6a1992
commit 2584cb5653
6 changed files with 391 additions and 42 deletions

View File

@ -98,3 +98,8 @@ export const trainingUserListPage = declareRequest(
"qualificationStatisticsLoading",
`Post > @/edu/trainingUser/listEduUserPage`,
);
export const keyProjectAdd = declareRequest(
"qualificationStatisticsLoading",
"Post > @/keyProject/keyProject/save",
);

View File

@ -50,6 +50,9 @@ function Add(props) {
data.maintain = data.maintain && data.maintain.split(",")
data.detection = data.detection && data.detection.split(",")
data.otherHighRisk = data.otherHighRisk && data.otherHighRisk.split(",")
data.detectionName = data.detectionName && data.detectionName.split(",")
data.maintainName = data.maintainName && data.maintainName.split(",")
data.otherHighRiskName = data.otherHighRiskName && data.otherHighRiskName.split(",")
// 重新提交时删除id
if (query.resubmit) {
@ -152,6 +155,7 @@ const StepOneComponent = (props) => {
useEffect(() => {
getCorpInfoList(1, 0);
form.setFieldsValue(props.formValues);
}, []);
@ -304,7 +308,7 @@ const StepOneComponent = (props) => {
{
name: "maintain",
label: "维修、保养",
label: "维修、保养(多选)",
hidden:qualificationsTypeId !=="sbl",
required:false,
render: (
@ -321,7 +325,7 @@ const StepOneComponent = (props) => {
{ name: "maintainName", label: "维修、保养名称", onlyForLabel: true },
{
name: "detection",
label: "检测",
label: "检测(多选)",
hidden:qualificationsTypeId !=="sbl",
required:false,
render: (
@ -337,7 +341,7 @@ const StepOneComponent = (props) => {
{ name: "detectionName", label: "检测名称", onlyForLabel: true },
{
name: "otherHighRisk",
label: "其它高风险业务",
label: "其它高风险业务(多选)",
required:false,
hidden:qualificationsTypeId !=="sbl",
render: (
@ -447,9 +451,11 @@ const StepTwoComponent = forwardRef((props, ref) => {
const validateFileList = (list) => {
for (let i = 0; i < list.length; i++) {
if (!list[i].files || list[i].files.length === 0) {
message.error(`请上传${list[i].dataName}的资质`);
return false;
if(list[i].isRequired == null || list[i].isRequired === 1) {
if (!list[i].files || list[i].files.length === 0) {
message.error(`请上传${list[i].dataName}的资质`);
return false;
}
}
}
return true;
@ -523,6 +529,10 @@ const StepTwoComponent = forwardRef((props, ref) => {
dataIndex: "qualificationsTermStart",
render: (_, record) => record.qualificationsTermStart ? `${record.qualificationsTermStart}${record.qualificationsTermEnd}` : "-",
},
{ title: "是否必填", dataIndex: "isRequired", render: (_, record) => {
if (record.isRequired == null) return "必填";
return record.isRequired ? "必填" : "非必填";
} },
{
title: "操作",
width: 150,

View File

@ -104,6 +104,7 @@ function View(props) {
render: (_, record) => (
<Button
type="link"
onClick={() => {
setViewQualificationDetailsModalOpen(true);
setViewQualificationDetailsModalData(record);

View File

@ -5,21 +5,73 @@ import FormBuilder from "zy-react-library/components/FormBuilder";
import Page from "zy-react-library/components/Page";
import PreviewImg from "zy-react-library/components/PreviewImg";
import PreviewPdf from "zy-react-library/components/PreviewPdf";
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 { 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 { getFileSuffix, getLabelName } from "zy-react-library/utils";
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
import useUploadFile from "zy-react-library/hooks/useUploadFile";
import { getFileName, getFileSuffix, getFileUrl, 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 validatePhone(_, value) {
if (!value) {
return Promise.resolve();
}
if (/^1\d{10}$/.test(String(value).trim())) {
return Promise.resolve();
}
return Promise.reject(new Error("请输入正确的手机号"));
}
const getRemoteFileUrl = (file) => {
if (file.url) {
return file.url;
}
if (!file.filePath) {
return "";
}
if (/^https?:\/\//.test(file.filePath)) {
return file.filePath;
}
return `${getFileUrl()}${file.filePath}`;
};
const remoteFileToUploadFile = async (file) => {
const url = getRemoteFileUrl(file);
if (!url) {
return null;
}
const response = await fetch(url);
if (!response.ok) {
throw new Error(file.name || file.fileName || url);
}
const blob = await response.blob();
const name = file.name || file.fileName || getFileName(file.filePath || url) || "file";
return {
...file,
uid: file.id || file.filePath || name,
originFileObj: new File([blob], name, { type: blob.type || "application/octet-stream" }),
};
};
function Review(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const [keyProjectForm] = Form.useForm();
const projectWorkFlag = Form.useWatch("projectWorkFlag", keyProjectForm);
const supervisionUnitFlag = Form.useWatch("supervisionUnitFlag", keyProjectForm);
const [viewProjectReviewDetailsModalOpen, setViewProjectReviewDetailsModalOpen] = useState(false);
const [viewProjectReviewDetailsModalData, setViewProjectReviewDetailsModalData] = useState({});
const [info, setInfo] = useState({});
@ -29,6 +81,12 @@ function Review(props) {
const [viewProjectReviewUserModalOpen, setViewProjectReviewUserModalOpen] = useState(false);
const [viewProjectReviewUserModalData, setViewProjectReviewUserModalData] = useState({}); // 查看安全人员证书列表
const [projectListAll, setProjectListAll] = useState([]);
const [keyProjectModalOpen, setKeyProjectModalOpen] = useState(false);
const [keyProjectSubmitting, setKeyProjectSubmitting] = useState(false);
const [auditPassParams, setAuditPassParams] = useState({});
const { uploadFile, loading: uploadFileLoading } = useUploadFile();
const { getUserInfo } = useGetUserInfo();
const [userInfo, setUserInfo] = useState({});
const typeList = [
{ bianma: "0", name: "普通企业" },
{ bianma: "1", name: "集团单位" },
@ -37,18 +95,59 @@ function Review(props) {
{ bianma: "4", name: "货主单位" },
{ bianma: "5", name: "驻港单位" },
];
const getProjectTypeInfo = () => {
const projectTypeConfig = [
{ flag: info.threePeopleFlag, projectType: "more_people", projectTypeName: "三人及以上作业" },
{ flag: info.fourNewFlag, projectType: "four_new_homework", projectTypeName: "\"四新\"作业" },
{ flag: info.nightWorkFlag, projectType: "night_work", projectTypeName: "夜间作业" },
];
const selectedProjectType = projectTypeConfig.filter(item => item.flag === 1);
return {
projectType: selectedProjectType.map(item => item.projectType),
projectTypeName: selectedProjectType.map(item => item.projectTypeName),
};
};
const getUploadFilesFromRemoteFiles = async (remoteFiles) => {
const fileMap = new Map();
remoteFiles.filter(Boolean).forEach((file) => {
const key = file.id || file.filePath || file.url || file.name || file.fileName;
if (!key || !fileMap.has(key)) {
fileMap.set(key || `${fileMap.size}`, file);
}
});
const files = await Promise.all(
[...fileMap.values()].map(file => remoteFileToUploadFile(file)),
);
return files.filter(Boolean);
};
const getKeyProjectUploadFiles = async () => {
return getUploadFilesFromRemoteFiles(info.agreementFiles || []);
};
const getCurrentUserInfo = async () => {
const userInfo = await getUserInfo();
setUserInfo(userInfo);
};
useEffect(() => {
getCurrentUserInfo();
}, []);
const getData = async (id = query.id) => {
const projectDetailResult = await props["projectDetail"]({ id });
if (!projectDetailResult || !projectDetailResult.data) {
return;
}
const projectData = projectDetailResult.data;
projectData.agreementFiles = [];
if (projectData.agreementFileUuid) {
const file = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["156"],
eqForeignKey: projectData.agreementFileUuid,
});
projectData.agreementFiles = file;
projectData.imgFiles = file.filter(item => getFileSuffix(item.name) !== "pdf");
projectData.pdfFiles = file.filter(item => getFileSuffix(item.name) === "pdf");
}
@ -66,7 +165,6 @@ function Review(props) {
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;
}
@ -74,7 +172,6 @@ function Review(props) {
else {
projectData.corpInfo = null;
}
setInfo(projectData);
};
@ -90,6 +187,112 @@ function Review(props) {
const { data } = await props["projectListAll"]({});
setProjectListAll(data);
};
const auditPass = async (params = {}) => {
const { success } = await props["projectAudit"]({
id: query.id,
result: 1,
...params,
});
if (success) {
message.success("审核通过");
getData();
props.history.goBack();
}
return success;
};
const openKeyProjectModal = (params = {}) => {
setAuditPassParams(params);
keyProjectForm.resetFields();
keyProjectForm.setFieldsValue({
projectWorkFlag: 1,
projectId: info.id,
projectName: info.projectName,
planWorkStartDate: info.startProjectTime,
planWorkEndDate: info.endProjectTime,
jurisdictionCorpinfoId: userInfo.corpinfoId,
jurisdictionDepartmentId: userInfo.departmentId,
xgfCorpinfoId: info.corpInfo && info.corpInfo.id,
xgfMasterUserId: info.corpInfo && info.corpInfo.accountContactId,
xgfMasterPhone: info.corpInfo && info.corpInfo.lrMobile,
supervisionUnitFlag: 0,
});
setKeyProjectModalOpen(true);
};
const handleKeyProjectSubmit = async () => {
try {
await keyProjectForm.validateFields();
}
catch {
return;
}
const values = keyProjectForm.getFieldsValue(true);
setKeyProjectSubmitting(true);
try {
if (values.projectWorkFlag === 1) {
let agreementFileUuid = "";
try {
const keyProjectUploadFiles = await getKeyProjectUploadFiles();
const { id } = await uploadFile({
single: false,
files: keyProjectUploadFiles,
params: {
type: UPLOAD_FILE_TYPE_ENUM["168"],
foreignKey: "",
},
});
agreementFileUuid = id;
}
catch (error) {
message.error(`附件上传失败${error?.message ? `${error.message}` : ""}`);
return;
}
const projectTypeInfo = getProjectTypeInfo();
const keyProjectValues = {
...values,
projectWorkFlag: 1,
...projectTypeInfo,
projectId: query.id,
projectName: info.projectName,
planWorkStartDate: info.startProjectTime,
planWorkEndDate: info.endProjectTime,
jurisdictionCorpinfoId: userInfo.corpinfoId,
jurisdictionDepartmentId: userInfo.departmentId,
xgfCorpinfoId: info.corpInfo && info.corpInfo.id,
xgfMasterUserId: info.corpInfo && info.corpInfo.accountContactId,
xgfMasterPhone: info.corpInfo && info.corpInfo.lrMobile,
keyProjectId: agreementFileUuid,
applyStatus: 1,
};
if (values.supervisionUnitFlag !== 1) {
delete keyProjectValues.supervisionUnitCorpName;
delete keyProjectValues.supervisionUnitUserName;
delete keyProjectValues.supervisionUnitUserPhone;
}
const { success } = await props["keyProjectAdd"](keyProjectValues);
if (!success) {
return;
}
}
const auditSuccess = await auditPass(auditPassParams);
if (auditSuccess) {
setKeyProjectModalOpen(false);
}
}
finally {
setKeyProjectSubmitting(false);
}
};
const auditSubmit = (result) => {
if (result === 1) {
if (query.projectStatusLast === "7") {
@ -121,16 +324,9 @@ function Review(props) {
onOk: async () => {
try {
const values = await form.validateFields();
const { success } = await props["projectAudit"]({
id: query.id,
result,
await auditPass({
relatedProjectId: values.id,
});
if (success) {
message.success("审核通过");
getData();
props.history.goBack();
}
}
catch (error) {
// 表单验证失败,不关闭弹窗
@ -140,21 +336,18 @@ function Review(props) {
});
}
else {
Modal.confirm({
title: "审核确认",
content: "确定要通过审核吗?",
onOk: async () => {
const { success } = await props["projectAudit"]({
id: query.id,
result,
});
if (success) {
message.success("审核通过");
getData();
props.history.goBack();
}
},
});
if (query.projectStatusLast === "2") {
openKeyProjectModal();
}
else {
Modal.confirm({
title: "审核确认",
content: "确定要通过审核吗?",
onOk: async () => {
await auditPass();
},
});
}
}
}
else {
@ -321,6 +514,10 @@ function Review(props) {
{ label: "资产总额(万元)", children: info.corpInfo?.totalAssets },
{ label: "注册资金(万元)", children: info.corpInfo?.regcapital },
{ label: "企业类型", children: getLabelName({ list: typeList, status: info.corpInfo?.type }) },
{
label: "经营范围",
children: info.corpInfo?.natureBusiness,
},
{ label: "营业执照", children: <PreviewImg files={info.corpInfo?.qiyefile || []} /> },
// { label: "营业执照有效期", children: info.corpInfo?.licenseStart ? `${info.corpInfo?.licenseStart}-${info.corpInfo?.licenseEnd}` : "-" },
]}
@ -456,6 +653,113 @@ function Review(props) {
data={viewProjectReviewDetailsModalData}
/>
)}
{
keyProjectModalOpen && (
<Modal
title="是否创建重点作业"
open={keyProjectModalOpen}
width={1200}
forceRender
maskClosable={false}
confirmLoading={keyProjectSubmitting || uploadFileLoading || props.qualificationStatistics?.qualificationStatisticsLoading}
onCancel={() => setKeyProjectModalOpen(false)}
onOk={handleKeyProjectSubmit}
>
<FormBuilder
form={keyProjectForm}
showActionButtons={false}
labelCol={{ span: 8 }}
values={{ projectWorkFlag: 1, supervisionUnitFlag: 0 }}
onValuesChange={(changedValues) => {
if ("projectWorkFlag" in changedValues) {
keyProjectForm.setFieldsValue({
jurisdictionUserId: undefined,
masterDepartmentId: undefined,
supervisionUnitFlag: 0,
supervisionUnitCorpName: undefined,
supervisionUnitUserName: undefined,
supervisionUnitUserPhone: undefined,
});
}
if ("supervisionUnitFlag" in changedValues) {
keyProjectForm.setFieldsValue({
supervisionUnitCorpName: undefined,
supervisionUnitUserName: undefined,
supervisionUnitUserPhone: undefined,
});
}
}}
options={[
{
name: "projectWorkFlag",
label: "是否创建重点作业",
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [
{ bianma: 1, name: "是" },
{ bianma: 0, name: "否" },
],
},
{
span: 24,
customizeRender: true,
hidden: projectWorkFlag !== 1,
render: (
<div style={{ fontSize: 12, color: "red", marginLeft: 96, marginBottom: 16 }}>
若不创建可直接进行相关生产作业进行创城
</div>
),
},
{
label: "辖区单位负责人",
name: "jurisdictionUserId",
hidden: projectWorkFlag !== 1,
render: (
<PersonnelSelect
params={{ departmentId: userInfo.departmentId }}
/>
),
},
{
label: "重点作业主管部门",
name: "masterDepartmentId",
hidden: projectWorkFlag !== 1,
render: <DepartmentSelectTree />,
},
{
label: "是否设置监理单位",
name: "supervisionUnitFlag",
hidden: projectWorkFlag !== 1,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [
{ bianma: 1, name: "是" },
{ bianma: 0, name: "否" },
],
},
{
label: "监理单位",
name: "supervisionUnitCorpName",
hidden: projectWorkFlag !== 1 || supervisionUnitFlag !== 1,
required: projectWorkFlag === 1 && supervisionUnitFlag === 1,
},
{
label: "监理单位工程负责人",
name: "supervisionUnitUserName",
hidden: projectWorkFlag !== 1 || supervisionUnitFlag !== 1,
required: projectWorkFlag === 1 && supervisionUnitFlag === 1,
},
{
label: "监理单位工程负责人电话",
name: "supervisionUnitUserPhone",
hidden: projectWorkFlag !== 1 || supervisionUnitFlag !== 1,
required: projectWorkFlag === 1 && supervisionUnitFlag === 1,
rules: [{ validator: validatePhone }],
},
]}
/>
</Modal>
)
}
{props.children}
</div>

View File

@ -22,6 +22,14 @@ function Add(props) {
if (data.qualificationsTypeId === "wzgll") {
setCorpTypeList([2, 6]);
}
if (data?.details?.length) {
data?.details?.forEach((item) => {
item.isRequired = item.isRequired ?? 1;
});
}
console.log(data);
form.setFieldsValue({
...data,
managerUser: data.managerUser.split(","),
@ -60,6 +68,7 @@ function Add(props) {
dataTypeName: undefined,
dataName: undefined,
isValidity: undefined,
isRequired:1
}],
}}
loading={props.qualificationMaintenance.qualificationMaintenanceLoading}
@ -233,7 +242,8 @@ function Add(props) {
{
label: "资料属性",
name: [field.name, "dataType"],
span: 8,
span: 6,
labelCol: { span: 6 },
render: (
<DictionarySelect
dictValue="dataType"
@ -243,16 +253,26 @@ function Add(props) {
/>
),
},
{ label: "资料属性名称", name: [field.name, "dataTypeName"], span: 8, onlyForLabel: true },
{ label: "资料名称", name: [field.name, "dataName"], span: 8 },
{ label: "资料名称", name: [field.name, "dataName"], span: 6 , labelCol: { span: 6 },},
{
label: "是否涉及有效时间",
name: [field.name, "isValidity"],
span: 8,
span: 6,
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 0, name: "是" }, { bianma: 1, name: "否" }],
labelCol: { span: 6 },
labelCol: { span: 10 },
},
{
label: "是否必填",
name: [field.name, "isRequired"],
span: 6,
labelCol: { span: 6 },
render: FORM_ITEM_RENDER_ENUM.RADIO,
items: [{ bianma: 1, name: "是" }, { bianma: 0, name: "否" }],
},
{ label: "资料属性名称", name: [field.name, "dataTypeName"], span: 6, onlyForLabel: true },
]
),
},

View File

@ -53,11 +53,15 @@ function ViewInfo(props) {
});
await getTypeGroup(data);
for (let i = 0; i < data.specialList.length; i++) {
const files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["148"],
eqForeignKey: data.specialList[i].applyDetailId,
});
data.specialList[i].files = files;
if(data.specialList[i].applyDetailId){
const files = await getFile({
eqType: UPLOAD_FILE_TYPE_ENUM["148"],
eqForeignKey: data.specialList[i].applyDetailId ,
});
data.specialList[i].files = files;
}
}
setInfo(data);
props.onGetData?.(data);
@ -174,6 +178,10 @@ function ViewInfo(props) {
label: "企业类型",
children: getLabelName({ status: corpInfoData.type, list: ENTERPRISE_TYPE }),
},
{
label: "经营范围",
children: corpInfoData.natureBusiness,
},
{ label: "营业执照", children: <PreviewImg files={corpInfoData.licenseFile} /> },
// { label: "营业执照有效期", children: corpInfoData.licenseStart ? `${corpInfoData.licenseStart} 至 ${corpInfoData.licenseEnd}` : "" },
]}
@ -202,6 +210,7 @@ function ViewInfo(props) {
render: (_, record) => (
<Button
type="link"
disabled={!record.uploadedTime}
onClick={() => {
setViewQualificationDetailsModalOpen(true);
setViewQualificationDetailsModalData(record);