diff --git a/package.json b/package.json index 67ea179..6265a45 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-to-print": "^3.2.0", - "zy-react-library": "^1.0.130" + "zy-react-library": "^1.0.137" }, "devDependencies": { "@antfu/eslint-config": "^5.4.1", diff --git a/src/api/ledger/index.js b/src/api/ledger/index.js index 1bb10c9..8da40ae 100644 --- a/src/api/ledger/index.js +++ b/src/api/ledger/index.js @@ -24,3 +24,7 @@ export const hiddenExportColumn = declareRequest( "ledgerLoading", `Get > /hidden/hidden/exportHiddenFields`, ); +export const hiddenAiRecognize = declareRequest( + "ledgerLoading", + `Post > @/hidden/hidden/aiHidden`, +); diff --git a/src/pages/Container/BranchCompany/Average/Confirm/List/index.js b/src/pages/Container/BranchCompany/Average/Confirm/List/index.js index 0392c66..879715b 100644 --- a/src/pages/Container/BranchCompany/Average/Confirm/List/index.js +++ b/src/pages/Container/BranchCompany/Average/Confirm/List/index.js @@ -5,7 +5,6 @@ import Search from "zy-react-library/components/Search"; import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj"; import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary"; import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj"; -import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/Gwj"; import Table from "zy-react-library/components/Table"; import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender"; import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj"; @@ -36,11 +35,6 @@ function List(props) { label: "隐患类型", render: , }, - { - name: "hiddenPart", - label: "隐患部位", - render: , - }, { name: "hiddenLevel", label: "隐患级别", @@ -68,7 +62,6 @@ function List(props) { { title: "隐患描述", dataIndex: "hiddenDesc" }, { title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 }, { title: "隐患类型", dataIndex: "hiddenTypeName" }, - { title: "隐患部位", dataIndex: "hiddenPartName" }, { title: "隐患发现部门", dataIndex: "hiddenFindDeptName" }, { title: "隐患发现人", dataIndex: "createName", width: 130 }, { diff --git a/src/pages/Container/BranchCompany/Average/Ledger/Add/index.js b/src/pages/Container/BranchCompany/Average/Ledger/Add/index.js index 65ba7eb..59ed6ab 100644 --- a/src/pages/Container/BranchCompany/Average/Ledger/Add/index.js +++ b/src/pages/Container/BranchCompany/Average/Ledger/Add/index.js @@ -1,5 +1,5 @@ import { Connect } from "@cqsjjb/jjb-dva-runtime"; -import { Button, Form, Input, message } from "antd"; +import { Button, Form, Input, message, Modal } from "antd"; import { useEffect, useRef, useState } from "react"; import FormBuilder from "zy-react-library/components/FormBuilder"; import HeaderBack from "zy-react-library/components/HeaderBack"; @@ -9,6 +9,7 @@ import DepartmentSelectTree from "zy-react-library/components/SelectTree/Departm import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary"; import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj"; import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/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 { HIDDEN_RECTIFICATION_TYPE_ENUM } from "zy-react-library/enum/hidden/gwj"; @@ -18,7 +19,7 @@ import useGetFile from "zy-react-library/hooks/useGetFile"; import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo"; import useUploadFile from "zy-react-library/hooks/useUploadFile"; -import { getFileUrl } from "zy-react-library/utils"; +import { createGuid, getLabelName } from "zy-react-library/utils"; import ai_recognize from "~/assets/images/ai_recognize.png"; import { NS_CONFIRM_USER, NS_LEDGER, NS_PART } from "~/enumerate/namespace"; @@ -29,16 +30,21 @@ function Add(props) { const rectificationDeptId = Form.useWatch("rectificationDeptId", form); const checkDeptId = Form.useWatch("checkDeptId", form); const isAi = Form.useWatch("isAi", form); + const isRelated = Form.useWatch("isRelated", form); + const defaultValues = { isRelated: 2, rectificationType: 2 }; - const [aiHiddenImageRecognizeLoading, setAIHiddenImageRecognizeLoading] = useState(false); const aiHiddenImageRecognizeFilePath = useRef(""); + const [aiHiddens, setAiHiddens] = useState([]); + const [aiHiddenModalOpen, setAiHiddenModalOpen] = useState(false); + const [selectHiddens, setSelectHiddens] = useState([]); + const [currentProcessHiddenIndex, setCurrentProcessHiddenIndex] = useState(-1); const [hiddenPartType, setHiddenPartType] = useState("select"); const [confirmUserList, setConfirmUserList] = useState([]); - const [deleteHiddenImageFiles, setDeleteHiddenImageFiles] = useState([]); - const [deleteHiddenVideoFiles, setDeleteHiddenVideoFiles] = useState([]); - const [deleteAfterRectificationImageFiles, setDeleteAfterRectificationImageFiles] = useState([]); + const deleteHiddenImageFiles = useRef([]); + const deleteHiddenVideoFiles = useRef([]); + const deleteAfterRectificationImageFiles = useRef([]); const { getUserInfo } = useGetUserInfo(); const { loading: deleteFileLoading, deleteFile } = useDeleteFile(); @@ -93,10 +99,55 @@ function Add(props) { getConfirmUserList(); }, []); + const getAIHiddenImageRecognize = async () => { + const hiddenImageFiles = form.getFieldValue("hiddenImageFiles"); + if (!hiddenImageFiles || hiddenImageFiles.length === 0) { + message.warning("请上传图片"); + return; + } + if (hiddenImageFiles.length > 1) { + message.warning("只能上传一张图片"); + return; + } + if (!aiHiddenImageRecognizeFilePath.current) { + // const { filePath } = await uploadFile({ files: hiddenImageFiles, params: { type: UPLOAD_FILE_TYPE_ENUM["3"] } }); + // aiHiddenImageRecognizeFilePath.current = filePath; + aiHiddenImageRecognizeFilePath.current = "https://pic.rmb.bdstatic.com/bjh/news/0a68c2681805fcaea506d922f024420c.png"; + } + const { data } = await props["hiddenAiRecognize"]({ hiddenUrl: "https://pic.rmb.bdstatic.com/bjh/news/0a68c2681805fcaea506d922f024420c.png" }); + // const { data } = await props["hiddenAiRecognize"]({ hiddenUrl: getFileUrl() + aiHiddenImageRecognizeFilePath.current }); + setAiHiddens(data.aiHiddens.map(item => ({ ...JSON.parse(item), id: createGuid() }))); + setAiHiddenModalOpen(true); + // await deleteFile({ files: [{ filePath: aiHiddenImageRecognizeFilePath.current }] }); + }; + + const onMergeHidden = (selectedRowKeys) => { + const toBeMerged = aiHiddens.filter(hidden => selectedRowKeys.includes(hidden.id)); + + const mergedHiddenDescr = toBeMerged.map(h => h.hiddenDescr).join("\n"); + const mergedLegalBasis = toBeMerged.map(h => h.legalBasis).join("\n"); + const mergedRectificationSuggestions = toBeMerged.map(h => h.rectificationSuggestions).join("\n"); + + const newMergedHidden = { + id: createGuid(), + hiddenDescr: mergedHiddenDescr, + legalBasis: mergedLegalBasis, + rectificationSuggestions: mergedRectificationSuggestions, + }; + setAiHiddens([ + ...aiHiddens.filter(hidden => !selectedRowKeys.includes(hidden.id)), + newMergedHidden, + ]); + }; + const isExistNextOneHidden = () => { + if (currentProcessHiddenIndex !== -1) + return currentProcessHiddenIndex !== selectHiddens.length - 1; + return false; + }; const onSubmit = async (values) => { - await deleteFile({ single: false, files: deleteHiddenImageFiles }); - await deleteFile({ single: false, files: deleteHiddenVideoFiles }); - await deleteFile({ single: false, files: deleteAfterRectificationImageFiles }); + await deleteFile({ single: false, files: deleteHiddenImageFiles.current }); + await deleteFile({ single: false, files: deleteHiddenVideoFiles.current }); + await deleteFile({ single: false, files: deleteAfterRectificationImageFiles.current }); const { id } = await uploadFile({ single: false, files: values.hiddenImageFiles, @@ -123,43 +174,27 @@ function Add(props) { }); if (success) { message.success("操作成功"); - props.history.goBack(); - } - }; - const getAIHiddenImageRecognize = async () => { - const hiddenImageFiles = form.getFieldValue("hiddenImageFiles"); - if (!hiddenImageFiles || hiddenImageFiles.length === 0) { - message.warning("请上传图片"); - return; - } - if (hiddenImageFiles.length > 1) { - message.warning("只能上传一张图片"); - return; - } - setAIHiddenImageRecognizeLoading(true); - if (!aiHiddenImageRecognizeFilePath.current) { - const { filePath } = await uploadFile({ files: hiddenImageFiles, params: { type: UPLOAD_FILE_TYPE_ENUM["3"] } }); - aiHiddenImageRecognizeFilePath.current = filePath; - } - try { - const response = await fetch("http://101.201.170.9:3000/ai-manager/ai/url/modelResult", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ url: getFileUrl() + aiHiddenImageRecognizeFilePath.current }), - }); - const { data } = await response.json(); - form.setFieldValue("isAi", 1); - form.setFieldValue("hiddenDesc", data.description); - form.setFieldValue("legalBasis", data.legalBasis); - form.setFieldValue("rectificationDescr", data.guidance); - aiHiddenImageRecognizeFilePath.current = ""; - await deleteFile({ files: [{ filePath: aiHiddenImageRecognizeFilePath.current }] }); - } - catch { - message.error("获取图片识别结果失败"); - } - finally { - setAIHiddenImageRecognizeLoading(false); + if (isExistNextOneHidden()) { + setCurrentProcessHiddenIndex(currentProcessHiddenIndex + 1); + const currentValues = form.getFieldsValue(); + const hiddenImageFiles = form.getFieldValue("hiddenImageFiles"); + const resetValues = {}; + Object.keys(currentValues).forEach((key) => { + resetValues[key] = undefined; + }); + form.setFieldsValue({ + ...resetValues, + ...defaultValues, + isAi: 1, + hiddenImageFiles, + hiddenDesc: selectHiddens[currentProcessHiddenIndex + 1].hiddenDescr, + legalBasis: selectHiddens[currentProcessHiddenIndex + 1].legalBasis, + rectificationDescr: selectHiddens[currentProcessHiddenIndex + 1].rectificationSuggestions, + }); + } + else { + props.history.goBack(); + } } }; @@ -169,11 +204,9 @@ function Add(props) {
0} onRemove={() => { if (isAi === 1) { form.setFieldValue("isAi", ""); form.setFieldValue("hiddenDesc", ""); form.setFieldValue("legalBasis", ""); form.setFieldValue("rectificationDescr", ""); + aiHiddenImageRecognizeFilePath.current = ""; + setSelectHiddens([]); + setAiHiddens([]); + setCurrentProcessHiddenIndex(-1); } }} onGetRemoveFile={(file) => { - setDeleteHiddenImageFiles([...deleteHiddenImageFiles, file]); + deleteHiddenImageFiles.current = [...deleteHiddenImageFiles.current, file]; }} tipContent={( <> - ai_recognize + { + (!query.id && currentProcessHiddenIndex <= 0) && ( + ai_recognize + ) + }
最多上传 {isAi === 1 ? 1 : 4} @@ -221,43 +263,7 @@ function Add(props) { span: 24, required: false, hidden: !(isAi === 1), - componentProps: { readOnly: true }, - }, - { - name: "hiddenPart", - customizeRender: true, - render: ( - -
- - { - hiddenPartType === "select" - ? - : - } - - -
-
- ), + componentProps: { disabled: true }, }, { name: "hiddenLevel", @@ -293,9 +299,76 @@ function Add(props) { label: "是否相关方", render: FORM_ITEM_RENDER_ENUM.RADIO, items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }], + componentProps: { + onChange: () => { + form.setFieldValue("projectName", ""); + form.setFieldValue("rectificationDeptId", ""); + form.setFieldValue("rectificationDeptName", ""); + form.setFieldValue("rectificationUserId", ""); + form.setFieldValue("rectificationUserName", ""); + form.setFieldValue("checkDeptId", ""); + form.setFieldValue("hiddenYDeptName", ""); + form.setFieldValue("checkUserId", ""); + form.setFieldValue("hiddenYUserName", ""); + }, + }, + }, + { + name: "projectId", + label: "相关方项目", + dependencies: ["isRelated"], + hidden: formValues => !(formValues.isRelated === 1), + render: FORM_ITEM_RENDER_ENUM.SELECT, + items: [{ bianma: 1, name: "相关方未做" }, { bianma: 2, name: "后期补全" }], // TODO + componentProps: { + onChange: (value) => { + form.setFieldValue("projectName", getLabelName({ + list: [], + status: value, + })); + }, + }, + }, + { name: "projectName", label: "相关方项目名称", onlyForLabel: true }, + { + name: "hiddenPart", + span: 24, + customizeRender: true, + render: ( + +
+ + { + hiddenPartType === "select" + ? + : + } + + +
+
+ ), }, - { name: "map", customizeRender: true, render: , span: 24 }, { name: "positionDesc", label: "隐患位置描述", required: false, span: 24 }, + { name: "map", customizeRender: true, render: , span: 24 }, { name: "hiddenVideoFiles", label: "隐患视频", @@ -303,7 +376,7 @@ function Add(props) { { - setDeleteHiddenVideoFiles([...deleteHiddenVideoFiles, file]); + deleteHiddenVideoFiles.current = [...deleteHiddenVideoFiles, file]; }} /> ), @@ -411,7 +484,7 @@ function Add(props) { label: "整改后图片", render: ( { - setDeleteAfterRectificationImageFiles([...deleteAfterRectificationImageFiles, file]); + deleteAfterRectificationImageFiles.current = [...deleteAfterRectificationImageFiles.current, file]; }} /> ), @@ -421,19 +494,24 @@ function Add(props) { }, { name: "rectificationDeptId", - label: "整改部门", + label: isRelated === 2 ? "整改部门" : "整改单位", required: false, render: ( - { - form.setFieldValue("rectificationUserId", ""); - form.setFieldValue("rectificationUserName", ""); - }} - onGetLabel={(label) => { - form.setFieldValue("rectificationDeptName", label); - }} - /> + isRelated === 2 && ( + { + form.setFieldValue("rectificationUserId", ""); + form.setFieldValue("rectificationUserName", ""); + }} + onGetLabel={(label) => { + form.setFieldValue("rectificationDeptName", label); + }} + /> + ) ), + componentProps: { + disabled: isRelated === 1, + }, }, { name: "rectificationDeptName", label: "整改部门名称", onlyForLabel: true }, { @@ -441,28 +519,38 @@ function Add(props) { label: "整改人", required: false, render: ( - form.setFieldValue("rectificationUserName", label)} - /> + isRelated === 2 && ( + form.setFieldValue("rectificationUserName", label)} + /> + ) ), + componentProps: { + disabled: isRelated === 1, + }, }, { name: "rectificationUserName", label: "整改人名称", onlyForLabel: true }, { name: "checkDeptId", - label: "验收部门", + label: isRelated === 2 ? "验收部门" : "验收单位", required: false, render: ( - { - form.setFieldValue("checkUserId", ""); - form.setFieldValue("hiddenYUserName", ""); - }} - onGetLabel={(label) => { - form.setFieldValue("hiddenYDeptName", label); - }} - /> + isRelated === 2 && ( + { + form.setFieldValue("checkUserId", ""); + form.setFieldValue("hiddenYUserName", ""); + }} + onGetLabel={(label) => { + form.setFieldValue("hiddenYDeptName", label); + }} + /> + ) ), + componentProps: { + disabled: isRelated === 1, + }, dependencies: ["rectificationType"], hidden: formValues => !(formValues.rectificationType === 1), }, @@ -472,11 +560,16 @@ function Add(props) { label: "验收人", required: false, render: ( - form.setFieldValue("hiddenYUserName", label)} - /> + isRelated === 2 && ( + form.setFieldValue("hiddenYUserName", label)} + /> + ) ), + componentProps: { + disabled: isRelated === 1, + }, dependencies: ["rectificationType"], hidden: formValues => !(formValues.rectificationType === 1), }, @@ -484,8 +577,97 @@ function Add(props) { ]} />
+ { + aiHiddenModalOpen && ( + { + setAiHiddenModalOpen(false); + }} + onConfirm={(selectedRows) => { + setSelectHiddens(selectedRows); + setCurrentProcessHiddenIndex(0); + form.setFieldValue("isAi", 1); + form.setFieldValue("hiddenDesc", selectedRows[0].hiddenDescr); + form.setFieldValue("legalBasis", selectedRows[0].legalBasis); + form.setFieldValue("rectificationDescr", selectedRows[0].rectificationSuggestions); + }} + onMergeHidden={onMergeHidden} + /> + ) + }
); } +const AiHiddenModal = (props) => { + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [selectedRows, setSelectedRows] = useState([]); + return ( + { + if (selectedRowKeys.length < 2) { + message.warning("至少选择两个隐患才能进行合并"); + return; + } + Modal.confirm({ + title: "合并隐患", + content: "确定要合并所选的隐患吗?", + onOk: () => { + props.onConfirm(selectedRowKeys); + }, + }); + }} + > + 合并隐患 + , + , + , + ]} + > + { + setSelectedRowKeys(selectedRowKeys); + setSelectedRows(selectedRows); + }, + }} + dataSource={props.aiHiddens} + pagination={false} + options={false} + disabledResizer={true} + columns={[ + { title: "隐患描述", dataIndex: "hiddenDescr" }, + { title: "法律依据", dataIndex: "legalBasis" }, + { title: "整改描述", dataIndex: "rectificationSuggestions" }, + ]} + /> + + ); +}; + export default Connect([NS_LEDGER, NS_CONFIRM_USER, NS_PART], true)(Add); diff --git a/src/pages/Container/BranchCompany/Average/Ledger/List/index.js b/src/pages/Container/BranchCompany/Average/Ledger/List/index.js index 7539397..c9e13ae 100644 --- a/src/pages/Container/BranchCompany/Average/Ledger/List/index.js +++ b/src/pages/Container/BranchCompany/Average/Ledger/List/index.js @@ -186,11 +186,12 @@ function List(props) { { title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 }, { title: "隐患类型", dataIndex: "hiddenTypeName" }, { title: "隐患部位", dataIndex: "hiddenPartName" }, - { title: "隐患发现部门", dataIndex: "hiddenFindDeptName" }, + { title: "隐患发现部门", dataIndex: "hiddenFindDeptName", width: 180 }, { title: "隐患发现人", dataIndex: "createName", width: 130 }, { title: "隐患发现时间", dataIndex: "hiddenFindTime", + width: 180, render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "", }, { @@ -206,6 +207,15 @@ function List(props) { { title: "整改人", dataIndex: "rectificationUserName", width: 100 }, { title: "整改时间", dataIndex: "rectificationTime" }, { title: "验收人", dataIndex: "hiddenYUserName", width: 100 }, + { + title: "是否相关方", + dataIndex: "isRelated", + width: 150, + render: (_, record) => getLabelName({ + list: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }], + status: record.isRelated, + }), + }, { title: "隐患状态", dataIndex: "state", @@ -237,7 +247,7 @@ function List(props) { ) } - + {record.state === 100 && } ), }, @@ -326,7 +336,7 @@ const PrintModal = (props) => { contentRef, pageStyle: `@page { size: landscape; - margin: 0mm; + margin: 3mm; } @media print { body { @@ -360,13 +370,21 @@ const PrintModal = (props) => { dataSource={props.data} pagination={false} columns={[ - { title: "排查时间", dataIndex: "hiddenFindTime", render: (_, record) => dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") }, + { + title: "排查时间", + dataIndex: "hiddenFindTime", + render: (_, record) => dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss"), + }, { title: "检查人", dataIndex: "createName" }, { title: "责任部门", dataIndex: "hiddenFindDeptName" }, { title: "事故隐患", dataIndex: "hiddenDesc" }, { title: "隐患等级", dataIndex: "hiddenLevelName" }, { title: "治理措施", dataIndex: "tempSafeMeasure" }, - { title: "完成时限", dataIndex: "rectificationDeadline" }, + { + title: "完成时限", + dataIndex: "rectificationDeadline", + render: (_, record) => record.rectificationDeadline && dayjs(record.rectificationDeadline).format("YYYY-MM-DD hh:mm:ss"), + }, { title: "整改责任人", dataIndex: "rectificationUserName" }, { title: "验收人员", @@ -407,7 +425,7 @@ const PrintModal = (props) => { - + diff --git a/src/pages/Container/BranchCompany/Average/Part/index.js b/src/pages/Container/BranchCompany/Average/Part/index.js index 070ab23..14e400a 100644 --- a/src/pages/Container/BranchCompany/Average/Part/index.js +++ b/src/pages/Container/BranchCompany/Average/Part/index.js @@ -116,7 +116,7 @@ function Part(props) { )} columns={[ { - title: "区域/设备名称", + title: "区域名称", dataIndex: "hiddenregion", render: (_, record) => (
{item.hiddenDesc} {item.hiddenLevelName} {item.RECTIFYDESCR}{item.RECTIFICATIONDEADLINE}{dayjs(item.rectificationDeadline).format("YYYY-MM-DD hh:mm:ss")} {item.rectificationUserName} {item.state === 301 ? item.hiddenYUserName : ""} {item.hiddenYTime}