diff --git a/package.json b/package.json index dc1653c..ac530b7 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-to-print": "^3.2.0", - "zy-react-library": "^1.0.125" + "zy-react-library": "^1.0.156" }, "devDependencies": { "@antfu/eslint-config": "^5.4.1", diff --git a/src/api/inspection/index.js b/src/api/inspection/index.js index 8658a41..6d25a81 100644 --- a/src/api/inspection/index.js +++ b/src/api/inspection/index.js @@ -32,6 +32,14 @@ export const hiddenAdd = declareRequest( "inspectionLoading", `Post > @/hidden/hidden/save`, ); +export const hiddenEdit = declareRequest( + "ledgerLoading", + `Put > @/hidden/hidden/edit`, +); +export const hiddenView = declareRequest( + "ledgerLoading", + `Get > /hidden/hidden/{id}`, +); export const partAdd = declareRequest( "inspectionLoading", `Post > @/hidden/hiddenRegion/save`, diff --git a/src/pages/Container/BranchCompany/Inspection/Add/components/HiddenAdd/index.js b/src/pages/Container/BranchCompany/Inspection/Add/components/HiddenAdd/index.js index 48bf17b..959115c 100644 --- a/src/pages/Container/BranchCompany/Inspection/Add/components/HiddenAdd/index.js +++ b/src/pages/Container/BranchCompany/Inspection/Add/components/HiddenAdd/index.js @@ -1,6 +1,6 @@ import { Button, Form, Input, Modal } from "antd"; import dayjs from "dayjs"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import FormBuilder from "zy-react-library/components/FormBuilder"; import Map from "zy-react-library/components/Map"; import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary"; @@ -13,8 +13,17 @@ function HiddenAddModal(props) { const [form] = Form.useForm(); const [hiddenPartType, setHiddenPartType] = useState("select"); + useEffect(() => { + form.setFieldsValue(props.hiddenInfo); + }, []); + const onSubmit = (values) => { - props.onConfirm({ ...values, hiddenPartType, hiddenFindTime: dayjs().format("YYYY-MM-DD hh:mm:ss"), rectificationType: 2 }); + props.onConfirm({ + ...values, + hiddenPartType, + hiddenFindTime: dayjs().format("YYYY-MM-DD hh:mm:ss"), + rectificationType: 2, + }); props.onCancel(); }; @@ -106,16 +115,27 @@ function HiddenAddModal(props) { { name: "hiddenImageFiles", label: "隐患图片", - render: (), + render: ( + form.setFieldValue("hiddenImageFiles", [...(form.getFieldValue("hiddenImageFiles") || []), file])} + /> + ), span: 24, }, + { name: "deleteHiddenImageFiles", label: "删除的隐患图片", onlyForLabel: true }, { name: "hiddenVideoFiles", label: "隐患视频", - render: (), + render: ( + form.setFieldValue("deleteHiddenVideoFiles", [...(form.getFieldValue("hiddenVideoFiles") || []), file])} + /> + ), span: 24, required: false, }, + { name: "deleteHiddenVideoFiles", label: "删除的隐患视频", onlyForLabel: true }, { name: "creatorId", label: "隐患发现人", diff --git a/src/pages/Container/BranchCompany/Inspection/Add/index.js b/src/pages/Container/BranchCompany/Inspection/Add/index.js index dd5a424..5253b4d 100644 --- a/src/pages/Container/BranchCompany/Inspection/Add/index.js +++ b/src/pages/Container/BranchCompany/Inspection/Add/index.js @@ -1,5 +1,5 @@ import { Connect } from "@cqsjjb/jjb-dva-runtime"; -import { Button, Col, Form, Input, message, Modal, Row } from "antd"; +import { Button, Form, message, Modal, Space } from "antd"; import { cloneDeep } from "lodash-es"; import { useEffect, useRef, useState } from "react"; import FormBuilder from "zy-react-library/components/FormBuilder"; @@ -37,11 +37,15 @@ function Add(props) { const timeStart = Form.useWatch("timeStart", form); const [userInfo, setUserInfo] = useState({}); + + const [signatureFilePath, setSignatureFilePath] = useState(""); + const [hiddenAddModalOpen, setHiddenAddModalOpen] = useState(false); const [hiddenDiscovererUserList, setHiddenDiscovererUserList] = useState([]); const [hiddenList, setHiddenList] = useState([]); const deleteHiddenIds = useRef([]); - const [signatureFilePath, setSignatureFilePath] = useState(""); + const [currentHiddenInfo, setCurrentHiddenInfo] = useState({}); + const currentHiddenIndex = useRef(-1); const getData = async () => { const userInfo = await getUserInfo(); @@ -70,7 +74,11 @@ function Add(props) { signatureTime: currentInspectorUser.signatureTime, }, }); - const { data: hiddenList } = await props["hiddenList"]({ foreignKey: query.inspectionId, pageIndex: 1, pageSize: 999 }); + const { data: hiddenList } = await props["hiddenList"]({ + foreignKey: query.inspectionId, + pageIndex: 1, + pageSize: 999, + }); setHiddenList(hiddenList); } else { @@ -89,24 +97,52 @@ function Add(props) { getData(); }, []); - const onSubmit = async (values, isDraft) => { - await isExistenceDuplicateSelection({ data: values.inspectorList, key: "userId" }); - // 删除旧的签字图片 + const getHiddenDiscovererUserList = () => { + const inspectorList = form.getFieldValue("inspectorList"); + const newHiddenDiscovererUserList = cloneDeep(inspectorList).filter(item => item && item.userId && item.departmentId); + if (!newHiddenDiscovererUserList.some(item => userInfo.id === item.userId)) { + newHiddenDiscovererUserList.unshift({ + departmentId: userInfo.departmentId, + departmentName: userInfo.departmentName, + userId: userInfo.id, + userName: userInfo.name, + }); + } + return newHiddenDiscovererUserList; + }; + + const getCurrentHiddenInfo = async (id, hiddenId) => { + const { data } = await props["hiddenView"]({ id }); + const hiddenImageFiles = await getFile({ + eqType: UPLOAD_FILE_TYPE_ENUM["3"], + eqForeignKey: hiddenId, + }); + const hiddenVideoFiles = await getFile({ + eqType: UPLOAD_FILE_TYPE_ENUM["102"], + eqForeignKey: hiddenId, + }); + setCurrentHiddenInfo({ ...data, hiddenImageFiles, hiddenVideoFiles }); + }; + + // 处理签名逻辑 + const handleSignature = async (values) => { await deleteFile({ single: false, files: [{ filePath: values.deleteSignature }] }); - let signatureFilePath = ""; - // 签字图片 + if (typeof values.initiator.signature !== "string") { const { filePath } = await uploadFile({ files: [{ originFileObj: values.initiator.signature }], params: { type: UPLOAD_FILE_TYPE_ENUM["139"] }, }); - signatureFilePath = filePath; - } - else { - signatureFilePath = values.initiator.signature; + return filePath; } + + return values.initiator.signature; + }; + + // 处理检查情况图片 + const handleSituationImages = async (values) => { const situationList = cloneDeep(values.situationList.filter(Boolean)); - // 检查情况图片 + for (let i = 0; i < situationList.length; i++) { await deleteFile({ single: false, files: situationList[i].deleteFiles }); const { id } = await uploadFile({ @@ -115,10 +151,15 @@ function Add(props) { params: { type: UPLOAD_FILE_TYPE_ENUM["140"], foreignKey: situationList[i].contentId }, }); situationList[i].imgId = id; - delete situationList[i].deleteFiles; - delete situationList[i].files; } + + return situationList; + }; + + // 处理检查人员列表 + const handleInspectorList = (values) => { const inspectorList = cloneDeep(values.inspectorList.filter(Boolean)); + if (!inspectorList.some(item => userInfo.id === item.userId)) { inspectorList.push({ departmentId: userInfo.departmentId, @@ -127,12 +168,17 @@ function Add(props) { userName: userInfo.name, }); } - // 发起新增请求 - const { traceId } = await props[!query.id ? "inspectionAdd" : "inspectionUpdate"]({ + + return inspectorList; + }; + + // 提交主表单数据 + const submitInspectionData = async (values, situationList, inspectorList, signaturePath, isDraft) => { + return await props[!query.id ? "inspectionAdd" : "inspectionUpdate"]({ ...values, situationList, inspectorList, - initiator: { ...values.initiator, signature: signatureFilePath }, + initiator: { ...values.initiator, signature: signaturePath }, isDraft, source: props.source || "5", deleteSignature: undefined, @@ -140,47 +186,112 @@ function Add(props) { inspectionId: query.id, inspectionBusinessId: query.inspectionId, }); - // 删除隐患附件,删除隐患 - for (let i = 0; i < deleteHiddenIds.current.length; i++) { + }; + + // 更新现有隐患 + const handleHiddenSubmit = async (traceId, isDraft, index) => { + await deleteFile({ + single: false, + files: hiddenList[index].deleteHiddenImageFiles, + }); + + await deleteFile({ + single: false, + files: hiddenList[index].deleteHiddenVideoFiles, + }); + + const { id } = await uploadFile({ + single: false, + files: hiddenList[index].hiddenImageFiles, + params: { + type: UPLOAD_FILE_TYPE_ENUM["3"], + foreignKey: hiddenList[index].hiddenId, + }, + }); + + await uploadFile({ + single: false, + files: hiddenList[index].hiddenVideoFiles, + params: { + type: UPLOAD_FILE_TYPE_ENUM["102"], + foreignKey: hiddenList[index].hiddenId, + }, + }); + + if (hiddenList[index].hiddenPartType === "input") { + await props["partAdd"]({ hiddenregion: hiddenList[index].hiddenPart }); + } + + const hiddenImageFiles = await getFile({ + eqType: UPLOAD_FILE_TYPE_ENUM["3"], + eqForeignKey: hiddenList[index].hiddenId, + }); + + await props["hiddenEdit"]({ + ...hiddenList[index], + source: 5, + hiddenId: id, + state: isDraft === 0 ? 102 : 98, + foreignKey: traceId, + hiddenJson: JSON.stringify({ + confirm: 1, + rectify: 1, + check: 1, + special: 1, + extension: 1, + }), + hiddenImgAddCmds: hiddenImageFiles.map(item => ({ url: item.url })), + hiddenUserId: "", + }); + }; + + // 处理隐患数据 + const handleHiddenData = async (traceId, isDraft) => { + // 删除隐患 + if (deleteHiddenIds.current.length > 0) { props["hiddenDelete"]({ ids: deleteHiddenIds.current.join(",") }); + } + + // 删除隐患附件 + for (let i = 0; i < deleteHiddenIds.current.length; i++) { const hiddenImageFiles = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["3"], eqForeignKey: deleteHiddenIds.current[i], }); await deleteFile({ single: false, files: hiddenImageFiles }); + const hiddenVideoFiles = await getFile({ eqType: UPLOAD_FILE_TYPE_ENUM["102"], eqForeignKey: deleteHiddenIds.current[i], }); await deleteFile({ single: false, files: hiddenVideoFiles }); } - // 上传隐患图片,新增隐患 + + // 新增/更新隐患 for (let i = 0; i < hiddenList.length; i++) { - if (!hiddenList[i].hiddenId) { - const { id } = await uploadFile({ - single: false, - files: hiddenList[i].hiddenImageFiles, - params: { type: UPLOAD_FILE_TYPE_ENUM["3"], foreignKey: hiddenList[i].hiddenId }, - }); - await uploadFile({ - single: false, - files: hiddenList[i].hiddenVideoFiles, - params: { type: UPLOAD_FILE_TYPE_ENUM["102"], foreignKey: id }, - }); - delete hiddenList[i].hiddenImageFiles; - delete hiddenList[i].hiddenVideoFiles; - if (hiddenList[i].hiddenPartType === "input") { - await props["partAdd"]({ hiddenregion: hiddenList[i].hiddenPart }); - } - await props["hiddenAdd"]({ - ...hiddenList[i], - source: 5, - hiddenId: id, - state: isDraft === 0 ? 102 : 98, - foreignKey: traceId, - }); - } + await handleHiddenSubmit(traceId, isDraft, i); } + }; + + const onSubmit = async (values, isDraft) => { + // 检查重复选择 + await isExistenceDuplicateSelection({ data: values.inspectorList, key: "userId" }); + + // 处理签名 + const signatureResult = await handleSignature(values); + + // 处理检查情况图片 + const situationList = await handleSituationImages(values); + + // 处理检查人员列表 + const inspectorList = handleInspectorList(values); + + // 提交主表单数据 + const { traceId } = await submitInspectionData(values, situationList, inspectorList, signatureResult, isDraft); + + // 处理隐患数据 + await handleHiddenData(traceId, isDraft); + message.success("操作成功"); props.history.goBack(); }; @@ -272,123 +383,71 @@ function Add(props) { }, { label: "检查人员", render: FORM_ITEM_RENDER_ENUM.DIVIDER }, { - key: "inspectorList", - customizeRender: true, + name: "inspectorList", span: 24, - render: ( - <> - - {(fields, { add, remove }) => ( - <> - {fields.map((field, index) => ( - - - - { - form.setFieldValue(["inspectorList", field.name, "userId"], ""); - form.setFieldValue(["inspectorList", field.name, "userName"], ""); - }} - onGetLabel={(label) => { - form.setFieldValue(["inspectorList", field.name, "departmentName"], label); - }} - /> - - - - - - - -
- - form.setFieldValue(["inspectorList", field.name, "userName"], label)} - /> - - { - index >= 1 - ? - : - } -
-
- - - - -
- ))} - - )} -
- - ), + render: FORM_ITEM_RENDER_ENUM.FORM_LIST, + formListUniqueProps: { + addButtonText: "添加检查人员", + options: field => ( + [ + { + name: [field.name, "departmentId"], + label: "检查人员部门", + render: ( + { + form.setFieldValue(["inspectorList", field.name, "userId"], ""); + form.setFieldValue(["inspectorList", field.name, "userName"], ""); + }} + onGetLabel={(label) => { + form.setFieldValue(["inspectorList", field.name, "departmentName"], label); + }} + /> + ), + }, + { name: [field.name, "departmentName"], label: "检查人员部门名称", onlyForLabel: true }, + { name: [field.name, "userName"], label: "检查人员名称", onlyForLabel: true }, + { + name: [field.name, "userId"], + label: "检查人员", + render: ( + form.setFieldValue(["inspectorList", field.name, "userName"], label)} + /> + ), + }, + ] + ), + }, }, { label: "检查情况", render: FORM_ITEM_RENDER_ENUM.DIVIDER }, { - key: "situationList", - customizeRender: true, + name: "situationList", span: 24, - render: ( - <> - - {(fields, { add, remove }) => ( - <> - {fields.map((field, index) => ( - - - - - - - - -
-
- - { - form.setFieldValue( - ["situationList", field.name, "deleteFiles"], - [...(form.getFieldValue(["situationList", field.name, "deleteFiles"]) || []), file], - ); - }} - /> - -
- { - index >= 1 - ? - : - } -
-
- - - - -
- ))} - - )} -
- - ), + render: FORM_ITEM_RENDER_ENUM.FORM_LIST, + formListUniqueProps: { + addButtonText: "添加检查情况", + options: field => ([ + { name: [field.name, "content"], label: "检查情况", render: FORM_ITEM_RENDER_ENUM.TEXTAREA }, + { name: [field.name, "deleteFiles"], label: "删除的图片", onlyForLabel: true }, + { + name: [field.name, "files"], + label: "图片", + render: ( + { + form.setFieldValue( + ["situationList", field.name, "deleteFiles"], + [...(form.getFieldValue(["situationList", field.name, "deleteFiles"]) || []), file], + ); + }} + /> + ), + }, + ]), + }, }, { label: "发现问题", render: FORM_ITEM_RENDER_ENUM.DIVIDER }, { @@ -405,18 +464,10 @@ function Add(props) { + + + + ), }, ]} @@ -483,8 +552,26 @@ function Add(props) { hiddenAddModalOpen && ( setHiddenAddModalOpen(false)} - onConfirm={values => setHiddenList([...hiddenList, values])} + hiddenInfo={currentHiddenInfo} + onCancel={() => { + setHiddenAddModalOpen(false); + setCurrentHiddenInfo({}); + }} + onConfirm={(values) => { + if (currentHiddenIndex.current === -1) { + setHiddenList([...hiddenList, values]); + } + else { + setHiddenList( + hiddenList.map((item, index) => { + if (index === currentHiddenIndex.current) + return values; + return item; + }), + ); + } + setCurrentHiddenInfo({}); + }} /> ) }