隐患修改 12.4
parent
16a5d2d9f3
commit
9af12d3be8
|
|
@ -31,7 +31,7 @@
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-to-print": "^3.2.0",
|
"react-to-print": "^3.2.0",
|
||||||
"zy-react-library": "^1.0.130"
|
"zy-react-library": "^1.0.137"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@antfu/eslint-config": "^5.4.1",
|
"@antfu/eslint-config": "^5.4.1",
|
||||||
|
|
|
||||||
|
|
@ -24,3 +24,7 @@ export const hiddenExportColumn = declareRequest(
|
||||||
"ledgerLoading",
|
"ledgerLoading",
|
||||||
`Get > /hidden/hidden/exportHiddenFields`,
|
`Get > /hidden/hidden/exportHiddenFields`,
|
||||||
);
|
);
|
||||||
|
export const hiddenAiRecognize = declareRequest(
|
||||||
|
"ledgerLoading",
|
||||||
|
`Post > @/hidden/hidden/aiHidden`,
|
||||||
|
);
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import Search from "zy-react-library/components/Search";
|
||||||
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
|
import DepartmentSelectTree from "zy-react-library/components/SelectTree/Department/Gwj";
|
||||||
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
|
import DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
|
||||||
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
|
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 Table from "zy-react-library/components/Table";
|
||||||
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
|
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";
|
import { HIDDEN_RECTIFICATION_TYPE_ENUM, HIDDEN_SOURCE_ENUM } from "zy-react-library/enum/hidden/gwj";
|
||||||
|
|
@ -36,11 +35,6 @@ function List(props) {
|
||||||
label: "隐患类型",
|
label: "隐患类型",
|
||||||
render: <DictionarySelectTree dictValue="hiddenType" onlyLastLevel />,
|
render: <DictionarySelectTree dictValue="hiddenType" onlyLastLevel />,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "hiddenPart",
|
|
||||||
label: "隐患部位",
|
|
||||||
render: <HiddenPartSelectTree />,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "hiddenLevel",
|
name: "hiddenLevel",
|
||||||
label: "隐患级别",
|
label: "隐患级别",
|
||||||
|
|
@ -68,7 +62,6 @@ function List(props) {
|
||||||
{ title: "隐患描述", dataIndex: "hiddenDesc" },
|
{ title: "隐患描述", dataIndex: "hiddenDesc" },
|
||||||
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
|
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
|
||||||
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
|
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
|
||||||
{ title: "隐患部位", dataIndex: "hiddenPartName" },
|
|
||||||
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
|
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
|
||||||
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
|
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
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 { useEffect, useRef, useState } from "react";
|
||||||
import FormBuilder from "zy-react-library/components/FormBuilder";
|
import FormBuilder from "zy-react-library/components/FormBuilder";
|
||||||
import HeaderBack from "zy-react-library/components/HeaderBack";
|
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 DictionarySelectTree from "zy-react-library/components/SelectTree/Dictionary";
|
||||||
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
|
import HiddenLevelSelectTree from "zy-react-library/components/SelectTree/HiddenLevel/Gwj";
|
||||||
import HiddenPartSelectTree from "zy-react-library/components/SelectTree/HiddenPart/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 Upload from "zy-react-library/components/Upload";
|
||||||
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
|
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
|
||||||
import { HIDDEN_RECTIFICATION_TYPE_ENUM } from "zy-react-library/enum/hidden/gwj";
|
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 useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
|
||||||
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
|
import useGetUserInfo from "zy-react-library/hooks/useGetUserInfo";
|
||||||
import useUploadFile from "zy-react-library/hooks/useUploadFile";
|
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 ai_recognize from "~/assets/images/ai_recognize.png";
|
||||||
import { NS_CONFIRM_USER, NS_LEDGER, NS_PART } from "~/enumerate/namespace";
|
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 rectificationDeptId = Form.useWatch("rectificationDeptId", form);
|
||||||
const checkDeptId = Form.useWatch("checkDeptId", form);
|
const checkDeptId = Form.useWatch("checkDeptId", form);
|
||||||
const isAi = Form.useWatch("isAi", 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 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 [hiddenPartType, setHiddenPartType] = useState("select");
|
||||||
const [confirmUserList, setConfirmUserList] = useState([]);
|
const [confirmUserList, setConfirmUserList] = useState([]);
|
||||||
|
|
||||||
const [deleteHiddenImageFiles, setDeleteHiddenImageFiles] = useState([]);
|
const deleteHiddenImageFiles = useRef([]);
|
||||||
const [deleteHiddenVideoFiles, setDeleteHiddenVideoFiles] = useState([]);
|
const deleteHiddenVideoFiles = useRef([]);
|
||||||
const [deleteAfterRectificationImageFiles, setDeleteAfterRectificationImageFiles] = useState([]);
|
const deleteAfterRectificationImageFiles = useRef([]);
|
||||||
|
|
||||||
const { getUserInfo } = useGetUserInfo();
|
const { getUserInfo } = useGetUserInfo();
|
||||||
const { loading: deleteFileLoading, deleteFile } = useDeleteFile();
|
const { loading: deleteFileLoading, deleteFile } = useDeleteFile();
|
||||||
|
|
@ -93,10 +99,55 @@ function Add(props) {
|
||||||
getConfirmUserList();
|
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) => {
|
const onSubmit = async (values) => {
|
||||||
await deleteFile({ single: false, files: deleteHiddenImageFiles });
|
await deleteFile({ single: false, files: deleteHiddenImageFiles.current });
|
||||||
await deleteFile({ single: false, files: deleteHiddenVideoFiles });
|
await deleteFile({ single: false, files: deleteHiddenVideoFiles.current });
|
||||||
await deleteFile({ single: false, files: deleteAfterRectificationImageFiles });
|
await deleteFile({ single: false, files: deleteAfterRectificationImageFiles.current });
|
||||||
const { id } = await uploadFile({
|
const { id } = await uploadFile({
|
||||||
single: false,
|
single: false,
|
||||||
files: values.hiddenImageFiles,
|
files: values.hiddenImageFiles,
|
||||||
|
|
@ -123,43 +174,27 @@ function Add(props) {
|
||||||
});
|
});
|
||||||
if (success) {
|
if (success) {
|
||||||
message.success("操作成功");
|
message.success("操作成功");
|
||||||
|
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();
|
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);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -169,11 +204,9 @@ function Add(props) {
|
||||||
<div style={{ paddingBottom: 10 }}>
|
<div style={{ paddingBottom: 10 }}>
|
||||||
<FormBuilder
|
<FormBuilder
|
||||||
form={form}
|
form={form}
|
||||||
loading={deleteFileLoading || uploadFileLoading || getFileLoading || aiHiddenImageRecognizeLoading || props.ledger.ledgerLoading}
|
loading={deleteFileLoading || uploadFileLoading || getFileLoading || props.ledger.ledgerLoading}
|
||||||
values={{
|
values={defaultValues}
|
||||||
isRelated: 2,
|
submitButtonText={isExistNextOneHidden() ? "下一个" : "提交"}
|
||||||
rectificationType: 2,
|
|
||||||
}}
|
|
||||||
onFinish={onSubmit}
|
onFinish={onSubmit}
|
||||||
options={[
|
options={[
|
||||||
{
|
{
|
||||||
|
|
@ -182,25 +215,34 @@ function Add(props) {
|
||||||
render: (
|
render: (
|
||||||
<Upload
|
<Upload
|
||||||
maxCount={isAi === 1 ? 1 : 4}
|
maxCount={isAi === 1 ? 1 : 4}
|
||||||
|
disabled={currentProcessHiddenIndex > 0}
|
||||||
onRemove={() => {
|
onRemove={() => {
|
||||||
if (isAi === 1) {
|
if (isAi === 1) {
|
||||||
form.setFieldValue("isAi", "");
|
form.setFieldValue("isAi", "");
|
||||||
form.setFieldValue("hiddenDesc", "");
|
form.setFieldValue("hiddenDesc", "");
|
||||||
form.setFieldValue("legalBasis", "");
|
form.setFieldValue("legalBasis", "");
|
||||||
form.setFieldValue("rectificationDescr", "");
|
form.setFieldValue("rectificationDescr", "");
|
||||||
|
aiHiddenImageRecognizeFilePath.current = "";
|
||||||
|
setSelectHiddens([]);
|
||||||
|
setAiHiddens([]);
|
||||||
|
setCurrentProcessHiddenIndex(-1);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onGetRemoveFile={(file) => {
|
onGetRemoveFile={(file) => {
|
||||||
setDeleteHiddenImageFiles([...deleteHiddenImageFiles, file]);
|
deleteHiddenImageFiles.current = [...deleteHiddenImageFiles.current, file];
|
||||||
}}
|
}}
|
||||||
tipContent={(
|
tipContent={(
|
||||||
<>
|
<>
|
||||||
|
{
|
||||||
|
(!query.id && currentProcessHiddenIndex <= 0) && (
|
||||||
<img
|
<img
|
||||||
src={ai_recognize}
|
src={ai_recognize}
|
||||||
alt="ai_recognize"
|
alt="ai_recognize"
|
||||||
style={{ width: 150, height: 30, cursor: "pointer", marginBottom: 10 }}
|
style={{ width: 150, height: 30, cursor: "pointer", marginBottom: 10 }}
|
||||||
onClick={getAIHiddenImageRecognize}
|
onClick={getAIHiddenImageRecognize}
|
||||||
/>
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
<div>
|
<div>
|
||||||
最多上传
|
最多上传
|
||||||
{isAi === 1 ? 1 : 4}
|
{isAi === 1 ? 1 : 4}
|
||||||
|
|
@ -221,43 +263,7 @@ function Add(props) {
|
||||||
span: 24,
|
span: 24,
|
||||||
required: false,
|
required: false,
|
||||||
hidden: !(isAi === 1),
|
hidden: !(isAi === 1),
|
||||||
componentProps: { readOnly: true },
|
componentProps: { disabled: true },
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "hiddenPart",
|
|
||||||
customizeRender: true,
|
|
||||||
render: (
|
|
||||||
<Form.Item label="隐患部位" required>
|
|
||||||
<div style={{ display: "flex", gap: 10 }}>
|
|
||||||
<Form.Item
|
|
||||||
name="hiddenPart"
|
|
||||||
noStyle
|
|
||||||
rules={[
|
|
||||||
{ required: true, message: "请选择隐患部位" },
|
|
||||||
...(hiddenPartType === "input" ? [{ max: 50, message: "最多输入50字符" }] : []),
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
{
|
|
||||||
hiddenPartType === "select"
|
|
||||||
? <HiddenPartSelectTree />
|
|
||||||
: <Input maxLength={50} placeholder="请输入隐患部位" />
|
|
||||||
}
|
|
||||||
</Form.Item>
|
|
||||||
<Button
|
|
||||||
type="primary"
|
|
||||||
onClick={() => {
|
|
||||||
if (hiddenPartType === "select")
|
|
||||||
setHiddenPartType("input");
|
|
||||||
if (hiddenPartType === "input")
|
|
||||||
setHiddenPartType("select");
|
|
||||||
form.setFieldValue("hiddenPart", "");
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{hiddenPartType === "select" ? "输入" : "选择"}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</Form.Item>
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "hiddenLevel",
|
name: "hiddenLevel",
|
||||||
|
|
@ -293,9 +299,76 @@ function Add(props) {
|
||||||
label: "是否相关方",
|
label: "是否相关方",
|
||||||
render: FORM_ITEM_RENDER_ENUM.RADIO,
|
render: FORM_ITEM_RENDER_ENUM.RADIO,
|
||||||
items: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
|
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: (
|
||||||
|
<Form.Item label="隐患部位" required labelCol={{ span: 2 }} wrapperCol={{ span: 22 }}>
|
||||||
|
<div style={{ display: "flex", gap: 10 }}>
|
||||||
|
<Form.Item
|
||||||
|
name="hiddenPart"
|
||||||
|
noStyle
|
||||||
|
rules={[
|
||||||
|
{ required: true, message: "请选择隐患部位" },
|
||||||
|
...(hiddenPartType === "input" ? [{ max: 50, message: "最多输入50字符" }] : []),
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
hiddenPartType === "select"
|
||||||
|
? <HiddenPartSelectTree />
|
||||||
|
: <Input maxLength={50} placeholder="请输入隐患部位" />
|
||||||
|
}
|
||||||
|
</Form.Item>
|
||||||
|
<Button
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
if (hiddenPartType === "select")
|
||||||
|
setHiddenPartType("input");
|
||||||
|
if (hiddenPartType === "input")
|
||||||
|
setHiddenPartType("select");
|
||||||
|
form.setFieldValue("hiddenPart", "");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{hiddenPartType === "select" ? "输入" : "选择"}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</Form.Item>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{ name: "map", customizeRender: true, render: <Map required={false} />, span: 24 },
|
|
||||||
{ name: "positionDesc", label: "隐患位置描述", required: false, span: 24 },
|
{ name: "positionDesc", label: "隐患位置描述", required: false, span: 24 },
|
||||||
|
{ name: "map", customizeRender: true, render: <Map required={false} />, span: 24 },
|
||||||
{
|
{
|
||||||
name: "hiddenVideoFiles",
|
name: "hiddenVideoFiles",
|
||||||
label: "隐患视频",
|
label: "隐患视频",
|
||||||
|
|
@ -303,7 +376,7 @@ function Add(props) {
|
||||||
<Upload
|
<Upload
|
||||||
fileType="video"
|
fileType="video"
|
||||||
onGetRemoveFile={(file) => {
|
onGetRemoveFile={(file) => {
|
||||||
setDeleteHiddenVideoFiles([...deleteHiddenVideoFiles, file]);
|
deleteHiddenVideoFiles.current = [...deleteHiddenVideoFiles, file];
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
|
|
@ -411,7 +484,7 @@ function Add(props) {
|
||||||
label: "整改后图片",
|
label: "整改后图片",
|
||||||
render: (
|
render: (
|
||||||
<Upload onGetRemoveFile={(file) => {
|
<Upload onGetRemoveFile={(file) => {
|
||||||
setDeleteAfterRectificationImageFiles([...deleteAfterRectificationImageFiles, file]);
|
deleteAfterRectificationImageFiles.current = [...deleteAfterRectificationImageFiles.current, file];
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
|
|
@ -421,9 +494,10 @@ function Add(props) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "rectificationDeptId",
|
name: "rectificationDeptId",
|
||||||
label: "整改部门",
|
label: isRelated === 2 ? "整改部门" : "整改单位",
|
||||||
required: false,
|
required: false,
|
||||||
render: (
|
render: (
|
||||||
|
isRelated === 2 && (
|
||||||
<DepartmentSelectTree
|
<DepartmentSelectTree
|
||||||
onChange={() => {
|
onChange={() => {
|
||||||
form.setFieldValue("rectificationUserId", "");
|
form.setFieldValue("rectificationUserId", "");
|
||||||
|
|
@ -433,7 +507,11 @@ function Add(props) {
|
||||||
form.setFieldValue("rectificationDeptName", label);
|
form.setFieldValue("rectificationDeptName", label);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)
|
||||||
),
|
),
|
||||||
|
componentProps: {
|
||||||
|
disabled: isRelated === 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{ name: "rectificationDeptName", label: "整改部门名称", onlyForLabel: true },
|
{ name: "rectificationDeptName", label: "整改部门名称", onlyForLabel: true },
|
||||||
{
|
{
|
||||||
|
|
@ -441,18 +519,24 @@ function Add(props) {
|
||||||
label: "整改人",
|
label: "整改人",
|
||||||
required: false,
|
required: false,
|
||||||
render: (
|
render: (
|
||||||
|
isRelated === 2 && (
|
||||||
<PersonnelSelect
|
<PersonnelSelect
|
||||||
params={{ departmentId: rectificationDeptId }}
|
params={{ departmentId: rectificationDeptId }}
|
||||||
onGetLabel={label => form.setFieldValue("rectificationUserName", label)}
|
onGetLabel={label => form.setFieldValue("rectificationUserName", label)}
|
||||||
/>
|
/>
|
||||||
|
)
|
||||||
),
|
),
|
||||||
|
componentProps: {
|
||||||
|
disabled: isRelated === 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{ name: "rectificationUserName", label: "整改人名称", onlyForLabel: true },
|
{ name: "rectificationUserName", label: "整改人名称", onlyForLabel: true },
|
||||||
{
|
{
|
||||||
name: "checkDeptId",
|
name: "checkDeptId",
|
||||||
label: "验收部门",
|
label: isRelated === 2 ? "验收部门" : "验收单位",
|
||||||
required: false,
|
required: false,
|
||||||
render: (
|
render: (
|
||||||
|
isRelated === 2 && (
|
||||||
<DepartmentSelectTree
|
<DepartmentSelectTree
|
||||||
onChange={() => {
|
onChange={() => {
|
||||||
form.setFieldValue("checkUserId", "");
|
form.setFieldValue("checkUserId", "");
|
||||||
|
|
@ -462,7 +546,11 @@ function Add(props) {
|
||||||
form.setFieldValue("hiddenYDeptName", label);
|
form.setFieldValue("hiddenYDeptName", label);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)
|
||||||
),
|
),
|
||||||
|
componentProps: {
|
||||||
|
disabled: isRelated === 1,
|
||||||
|
},
|
||||||
dependencies: ["rectificationType"],
|
dependencies: ["rectificationType"],
|
||||||
hidden: formValues => !(formValues.rectificationType === 1),
|
hidden: formValues => !(formValues.rectificationType === 1),
|
||||||
},
|
},
|
||||||
|
|
@ -472,11 +560,16 @@ function Add(props) {
|
||||||
label: "验收人",
|
label: "验收人",
|
||||||
required: false,
|
required: false,
|
||||||
render: (
|
render: (
|
||||||
|
isRelated === 2 && (
|
||||||
<PersonnelSelect
|
<PersonnelSelect
|
||||||
params={{ departmentId: checkDeptId }}
|
params={{ departmentId: checkDeptId }}
|
||||||
onGetLabel={label => form.setFieldValue("hiddenYUserName", label)}
|
onGetLabel={label => form.setFieldValue("hiddenYUserName", label)}
|
||||||
/>
|
/>
|
||||||
|
)
|
||||||
),
|
),
|
||||||
|
componentProps: {
|
||||||
|
disabled: isRelated === 1,
|
||||||
|
},
|
||||||
dependencies: ["rectificationType"],
|
dependencies: ["rectificationType"],
|
||||||
hidden: formValues => !(formValues.rectificationType === 1),
|
hidden: formValues => !(formValues.rectificationType === 1),
|
||||||
},
|
},
|
||||||
|
|
@ -484,8 +577,97 @@ function Add(props) {
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
{
|
||||||
|
aiHiddenModalOpen && (
|
||||||
|
<AiHiddenModal
|
||||||
|
aiHiddens={aiHiddens}
|
||||||
|
onCancel={() => {
|
||||||
|
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}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const AiHiddenModal = (props) => {
|
||||||
|
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
|
||||||
|
const [selectedRows, setSelectedRows] = useState([]);
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
title="AI识别隐患"
|
||||||
|
open
|
||||||
|
onCancel={props.onCancel}
|
||||||
|
maskClosable={false}
|
||||||
|
width={1000}
|
||||||
|
footer={[
|
||||||
|
<Button
|
||||||
|
key="merge"
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
if (selectedRowKeys.length < 2) {
|
||||||
|
message.warning("至少选择两个隐患才能进行合并");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Modal.confirm({
|
||||||
|
title: "合并隐患",
|
||||||
|
content: "确定要合并所选的隐患吗?",
|
||||||
|
onOk: () => {
|
||||||
|
props.onConfirm(selectedRowKeys);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
合并隐患
|
||||||
|
</Button>,
|
||||||
|
<Button
|
||||||
|
key="process"
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
if (selectedRows.length === 0) {
|
||||||
|
message.error("请选择要处理的隐患");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
props.onConfirm(selectedRows);
|
||||||
|
props.onCancel();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
处理隐患
|
||||||
|
</Button>,
|
||||||
|
<Button key="cancel" onClick={props.onCancel}>取消</Button>,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Table
|
||||||
|
rowSelection={{
|
||||||
|
preserveSelectedRowKeys: true,
|
||||||
|
selectedRowKeys,
|
||||||
|
onChange: (selectedRowKeys, selectedRows) => {
|
||||||
|
setSelectedRowKeys(selectedRowKeys);
|
||||||
|
setSelectedRows(selectedRows);
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
dataSource={props.aiHiddens}
|
||||||
|
pagination={false}
|
||||||
|
options={false}
|
||||||
|
disabledResizer={true}
|
||||||
|
columns={[
|
||||||
|
{ title: "隐患描述", dataIndex: "hiddenDescr" },
|
||||||
|
{ title: "法律依据", dataIndex: "legalBasis" },
|
||||||
|
{ title: "整改描述", dataIndex: "rectificationSuggestions" },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default Connect([NS_LEDGER, NS_CONFIRM_USER, NS_PART], true)(Add);
|
export default Connect([NS_LEDGER, NS_CONFIRM_USER, NS_PART], true)(Add);
|
||||||
|
|
|
||||||
|
|
@ -186,11 +186,12 @@ function List(props) {
|
||||||
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
|
{ title: "隐患级别", dataIndex: "hiddenLevelName", width: 100 },
|
||||||
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
|
{ title: "隐患类型", dataIndex: "hiddenTypeName" },
|
||||||
{ title: "隐患部位", dataIndex: "hiddenPartName" },
|
{ title: "隐患部位", dataIndex: "hiddenPartName" },
|
||||||
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName" },
|
{ title: "隐患发现部门", dataIndex: "hiddenFindDeptName", width: 180 },
|
||||||
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
|
{ title: "隐患发现人", dataIndex: "createName", width: 130 },
|
||||||
{
|
{
|
||||||
title: "隐患发现时间",
|
title: "隐患发现时间",
|
||||||
dataIndex: "hiddenFindTime",
|
dataIndex: "hiddenFindTime",
|
||||||
|
width: 180,
|
||||||
render: (_, record) => record.hiddenFindTime ? dayjs(record.hiddenFindTime).format("YYYY-MM-DD hh:mm:ss") : "",
|
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: "rectificationUserName", width: 100 },
|
||||||
{ title: "整改时间", dataIndex: "rectificationTime" },
|
{ title: "整改时间", dataIndex: "rectificationTime" },
|
||||||
{ title: "验收人", dataIndex: "hiddenYUserName", width: 100 },
|
{ title: "验收人", dataIndex: "hiddenYUserName", width: 100 },
|
||||||
|
{
|
||||||
|
title: "是否相关方",
|
||||||
|
dataIndex: "isRelated",
|
||||||
|
width: 150,
|
||||||
|
render: (_, record) => getLabelName({
|
||||||
|
list: [{ bianma: 1, name: "是" }, { bianma: 2, name: "否" }],
|
||||||
|
status: record.isRelated,
|
||||||
|
}),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "隐患状态",
|
title: "隐患状态",
|
||||||
dataIndex: "state",
|
dataIndex: "state",
|
||||||
|
|
@ -237,7 +247,7 @@ function List(props) {
|
||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
<Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>
|
{record.state === 100 && <Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>}
|
||||||
</Space>
|
</Space>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|
@ -326,7 +336,7 @@ const PrintModal = (props) => {
|
||||||
contentRef,
|
contentRef,
|
||||||
pageStyle: `@page {
|
pageStyle: `@page {
|
||||||
size: landscape;
|
size: landscape;
|
||||||
margin: 0mm;
|
margin: 3mm;
|
||||||
}
|
}
|
||||||
@media print {
|
@media print {
|
||||||
body {
|
body {
|
||||||
|
|
@ -360,13 +370,21 @@ const PrintModal = (props) => {
|
||||||
dataSource={props.data}
|
dataSource={props.data}
|
||||||
pagination={false}
|
pagination={false}
|
||||||
columns={[
|
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: "createName" },
|
||||||
{ title: "责任部门", dataIndex: "hiddenFindDeptName" },
|
{ title: "责任部门", dataIndex: "hiddenFindDeptName" },
|
||||||
{ title: "事故隐患", dataIndex: "hiddenDesc" },
|
{ title: "事故隐患", dataIndex: "hiddenDesc" },
|
||||||
{ title: "隐患等级", dataIndex: "hiddenLevelName" },
|
{ title: "隐患等级", dataIndex: "hiddenLevelName" },
|
||||||
{ title: "治理措施", dataIndex: "tempSafeMeasure" },
|
{ 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: "整改责任人", dataIndex: "rectificationUserName" },
|
||||||
{
|
{
|
||||||
title: "验收人员",
|
title: "验收人员",
|
||||||
|
|
@ -407,7 +425,7 @@ const PrintModal = (props) => {
|
||||||
<td>{item.hiddenDesc}</td>
|
<td>{item.hiddenDesc}</td>
|
||||||
<td>{item.hiddenLevelName}</td>
|
<td>{item.hiddenLevelName}</td>
|
||||||
<td>{item.RECTIFYDESCR}</td>
|
<td>{item.RECTIFYDESCR}</td>
|
||||||
<td>{item.RECTIFICATIONDEADLINE}</td>
|
<td>{dayjs(item.rectificationDeadline).format("YYYY-MM-DD hh:mm:ss")}</td>
|
||||||
<td>{item.rectificationUserName}</td>
|
<td>{item.rectificationUserName}</td>
|
||||||
<td>{item.state === 301 ? item.hiddenYUserName : ""}</td>
|
<td>{item.state === 301 ? item.hiddenYUserName : ""}</td>
|
||||||
<td>{item.hiddenYTime}</td>
|
<td>{item.hiddenYTime}</td>
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ function Part(props) {
|
||||||
)}
|
)}
|
||||||
columns={[
|
columns={[
|
||||||
{
|
{
|
||||||
title: "区域/设备名称",
|
title: "区域名称",
|
||||||
dataIndex: "hiddenregion",
|
dataIndex: "hiddenregion",
|
||||||
render: (_, record) => (
|
render: (_, record) => (
|
||||||
<Button
|
<Button
|
||||||
|
|
@ -215,8 +215,8 @@ const AddModalComponent = (props) => {
|
||||||
showActionButtons={false}
|
showActionButtons={false}
|
||||||
onFinish={onSubmit}
|
onFinish={onSubmit}
|
||||||
options={[
|
options={[
|
||||||
{ name: "parentName", label: "上级区域/设备名称", required: false, render: <Tag color="blue">{props.parentName || "无"}</Tag> },
|
{ name: "parentName", label: "上级区域名称", required: false, render: <Tag color="blue">{props.parentName || "无"}</Tag> },
|
||||||
{ name: "hiddenregion", label: "区域/设备名称" },
|
{ name: "hiddenregion", label: "区域名称" },
|
||||||
{
|
{
|
||||||
name: "responsibleDeptId",
|
name: "responsibleDeptId",
|
||||||
label: "负责部门",
|
label: "负责部门",
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import Table from "zy-react-library/components/Table";
|
||||||
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
|
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
|
||||||
import useIsExistenceDuplicateSelection from "zy-react-library/hooks/useIsExistenceDuplicateSelection";
|
import useIsExistenceDuplicateSelection from "zy-react-library/hooks/useIsExistenceDuplicateSelection";
|
||||||
import useTable from "zy-react-library/hooks/useTable";
|
import useTable from "zy-react-library/hooks/useTable";
|
||||||
|
import { getLabelName } from "zy-react-library/utils";
|
||||||
import { NS_EVALUATION_TEAM_CONFIG } from "~/enumerate/namespace";
|
import { NS_EVALUATION_TEAM_CONFIG } from "~/enumerate/namespace";
|
||||||
|
|
||||||
const STATE_ENUM = [
|
const STATE_ENUM = [
|
||||||
|
|
@ -325,7 +326,12 @@ const AddModalComponent = (props) => {
|
||||||
itemsField: { valueKey: "id", labelKey: "corpName" },
|
itemsField: { valueKey: "id", labelKey: "corpName" },
|
||||||
componentProps: {
|
componentProps: {
|
||||||
onChange: (value) => {
|
onChange: (value) => {
|
||||||
form.setFieldValue("corpinfoName", corpInfoList.find(item => item.id === value)?.corpName);
|
form.setFieldValue("corpinfoName", getLabelName({
|
||||||
|
list: corpInfoList,
|
||||||
|
status: value,
|
||||||
|
idKey: "id",
|
||||||
|
nameKey: "corpName",
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue