隐患修改 12.4

master
LiuJiaNan 2025-12-04 17:29:43 +08:00
parent 9af12d3be8
commit 9b16bab9dd
1 changed files with 159 additions and 17 deletions

View File

@ -1,5 +1,5 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Input, message, Modal } from "antd";
import { Button, Col, Form, Image, Input, message, Modal, Row } from "antd";
import { useEffect, useRef, useState } from "react";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
@ -38,6 +38,10 @@ function Add(props) {
const [aiHiddenModalOpen, setAiHiddenModalOpen] = useState(false);
const [selectHiddens, setSelectHiddens] = useState([]);
const [currentProcessHiddenIndex, setCurrentProcessHiddenIndex] = useState(-1);
const [imageSelectModalOpen, setImageSelectModalOpen] = useState(false);
const [uploadedImages, setUploadedImages] = useState([]);
const [processedImages, setProcessedImages] = useState([]);
const [modalTitle, setModalTitle] = useState("选择图片进行AI识别");
const [hiddenPartType, setHiddenPartType] = useState("select");
const [confirmUserList, setConfirmUserList] = useState([]);
@ -99,27 +103,83 @@ function Add(props) {
getConfirmUserList();
}, []);
const getAIHiddenImageRecognize = async () => {
const getAIHiddenImageRecognize = async (selectedImage = null) => {
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles");
if (!hiddenImageFiles || hiddenImageFiles.length === 0) {
message.warning("请上传图片");
return;
}
if (hiddenImageFiles.length > 1) {
message.warning("只能上传一张图片");
return;
const imageToProcess = selectedImage || hiddenImageFiles[0];
if (imageToProcess && !processedImages.includes(imageToProcess)) {
setProcessedImages([...processedImages, imageToProcess]);
}
if (!aiHiddenImageRecognizeFilePath.current) {
// const { filePath } = await uploadFile({ files: hiddenImageFiles, params: { type: UPLOAD_FILE_TYPE_ENUM["3"] } });
// const { filePath } = await uploadFile({ files: [imageToProcess], 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() })));
setAiHiddens((data?.aiHiddens || []).map(item => ({ ...JSON.parse(item), id: createGuid() })));
setAiHiddenModalOpen(true);
// await deleteFile({ files: [{ filePath: aiHiddenImageRecognizeFilePath.current }] });
};
const handleAiRecognizeClick = () => {
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles");
if (!hiddenImageFiles || hiddenImageFiles.length === 0) {
message.warning("请上传图片");
return;
}
setProcessedImages([]);
setAiHiddens([]);
setSelectHiddens([]);
setCurrentProcessHiddenIndex(-1);
form.setFieldValue("isAi", "");
form.setFieldValue("hiddenDesc", "");
form.setFieldValue("legalBasis", "");
form.setFieldValue("rectificationDescr", "");
if (hiddenImageFiles.length === 1) {
getAIHiddenImageRecognize(hiddenImageFiles[0]);
}
else {
setUploadedImages(hiddenImageFiles);
setModalTitle("选择图片进行AI识别");
setImageSelectModalOpen(true);
}
};
const handleSelectOtherImage = () => {
Modal.confirm({
title: "确认切换图片",
content: "当前有未处理完的隐患信息确认后进入选择图片选择图片重新AI识别将丢弃之前没有处理完的隐患",
onOk: () => {
setAiHiddens([]);
setSelectHiddens([]);
setCurrentProcessHiddenIndex(-1);
form.setFieldValue("isAi", "");
form.setFieldValue("hiddenDesc", "");
form.setFieldValue("legalBasis", "");
form.setFieldValue("rectificationDescr", "");
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles");
const unprocessedImages = hiddenImageFiles.filter(img =>
!processedImages.includes(img),
);
setUploadedImages(unprocessedImages);
setModalTitle("选择其他图片进行AI识别");
setImageSelectModalOpen(true);
},
});
};
const getUnprocessedImagesCount = () => {
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles") || [];
return hiddenImageFiles.filter(img =>
!processedImages.includes(img),
).length;
};
const onMergeHidden = (selectedRowKeys) => {
const toBeMerged = aiHiddens.filter(hidden => selectedRowKeys.includes(hidden.id));
@ -206,16 +266,30 @@ function Add(props) {
form={form}
loading={deleteFileLoading || uploadFileLoading || getFileLoading || props.ledger.ledgerLoading}
values={defaultValues}
submitButtonText={isExistNextOneHidden() ? "下一个" : "提交"}
onFinish={onSubmit}
showSubmitButton={false}
showCancelButton={false}
extraActionButtons={[
<Button key="submit" type="primary" onClick={form.submit}>{isExistNextOneHidden() ? "提交并下一个" : "提交"}</Button>,
...(isAi === 1 && processedImages.length > 0 && getUnprocessedImagesCount() > 0
? [
<Button key="selectOther" onClick={handleSelectOtherImage}>
选择其他图片 (
{getUnprocessedImagesCount()}
)
</Button>,
]
: []),
<Button key="back" onClick={() => props.history.goBack()}>取消</Button>,
]}
options={[
{
name: "hiddenImageFiles",
label: "隐患图片",
render: (
<Upload
maxCount={isAi === 1 ? 1 : 4}
disabled={currentProcessHiddenIndex > 0}
listType="picture-card"
onRemove={() => {
if (isAi === 1) {
form.setFieldValue("isAi", "");
@ -239,14 +313,12 @@ function Add(props) {
src={ai_recognize}
alt="ai_recognize"
style={{ width: 150, height: 30, cursor: "pointer", marginBottom: 10 }}
onClick={getAIHiddenImageRecognize}
onClick={handleAiRecognizeClick}
/>
)
}
<div>
最多上传
{isAi === 1 ? 1 : 4}
个文件并且只能上传jpgjpegpng格式的文件
最多上传4个文件并且只能上传jpgjpegpng格式的文件
</div>
</>
)}
@ -596,6 +668,18 @@ function Add(props) {
/>
)
}
{
imageSelectModalOpen && (
<ImageSelectModal
title={modalTitle}
images={uploadedImages}
onCancel={() => setImageSelectModalOpen(false)}
onConfirm={(selectedImage) => {
getAIHiddenImageRecognize(selectedImage);
}}
/>
)
}
</div>
);
}
@ -670,4 +754,62 @@ const AiHiddenModal = (props) => {
);
};
const ImageSelectModal = (props) => {
const [selectedImage, setSelectedImage] = useState(null);
const handleConfirm = () => {
if (!selectedImage) {
message.warning("请选择一张图片进行AI识别");
return;
}
props.onConfirm(selectedImage);
props.onCancel();
};
return (
<Modal
title={props.title || "选择图片进行AI识别"}
open
onCancel={props.onCancel}
maskClosable={false}
width={800}
onOk={handleConfirm}
okText="开始识别"
cancelText="取消"
>
<Row gutter={[16, 16]}>
{props.images.map((image, index) => (
<Col key={index} span={6}>
<div
style={{
border: selectedImage === image ? "2px solid #1890ff" : "1px solid #d9d9d9",
borderRadius: 8,
padding: 8,
cursor: "pointer",
textAlign: "center",
height: 200,
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
onClick={() => setSelectedImage(image)}
>
<Image
src={image.url || URL.createObjectURL(image.originFileObj)}
alt={`图片 ${index + 1}`}
style={{
maxWidth: "100%",
maxHeight: "100%",
objectFit: "contain",
}}
preview={false}
/>
</div>
</Col>
))}
</Row>
</Modal>
);
};
export default Connect([NS_LEDGER, NS_CONFIRM_USER, NS_PART], true)(Add);