隐患修改 12.4
parent
9af12d3be8
commit
9b16bab9dd
|
|
@ -1,5 +1,5 @@
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
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 { 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";
|
||||||
|
|
@ -38,6 +38,10 @@ function Add(props) {
|
||||||
const [aiHiddenModalOpen, setAiHiddenModalOpen] = useState(false);
|
const [aiHiddenModalOpen, setAiHiddenModalOpen] = useState(false);
|
||||||
const [selectHiddens, setSelectHiddens] = useState([]);
|
const [selectHiddens, setSelectHiddens] = useState([]);
|
||||||
const [currentProcessHiddenIndex, setCurrentProcessHiddenIndex] = useState(-1);
|
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 [hiddenPartType, setHiddenPartType] = useState("select");
|
||||||
const [confirmUserList, setConfirmUserList] = useState([]);
|
const [confirmUserList, setConfirmUserList] = useState([]);
|
||||||
|
|
@ -99,27 +103,83 @@ function Add(props) {
|
||||||
getConfirmUserList();
|
getConfirmUserList();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const getAIHiddenImageRecognize = async () => {
|
const getAIHiddenImageRecognize = async (selectedImage = null) => {
|
||||||
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles");
|
const hiddenImageFiles = form.getFieldValue("hiddenImageFiles");
|
||||||
if (!hiddenImageFiles || hiddenImageFiles.length === 0) {
|
|
||||||
message.warning("请上传图片");
|
const imageToProcess = selectedImage || hiddenImageFiles[0];
|
||||||
return;
|
|
||||||
}
|
if (imageToProcess && !processedImages.includes(imageToProcess)) {
|
||||||
if (hiddenImageFiles.length > 1) {
|
setProcessedImages([...processedImages, imageToProcess]);
|
||||||
message.warning("只能上传一张图片");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aiHiddenImageRecognizeFilePath.current) {
|
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 = filePath;
|
||||||
aiHiddenImageRecognizeFilePath.current = "https://pic.rmb.bdstatic.com/bjh/news/0a68c2681805fcaea506d922f024420c.png";
|
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: "https://pic.rmb.bdstatic.com/bjh/news/0a68c2681805fcaea506d922f024420c.png" });
|
||||||
// const { data } = await props["hiddenAiRecognize"]({ hiddenUrl: getFileUrl() + aiHiddenImageRecognizeFilePath.current });
|
// 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);
|
setAiHiddenModalOpen(true);
|
||||||
// await deleteFile({ files: [{ filePath: aiHiddenImageRecognizeFilePath.current }] });
|
// 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 onMergeHidden = (selectedRowKeys) => {
|
||||||
const toBeMerged = aiHiddens.filter(hidden => selectedRowKeys.includes(hidden.id));
|
const toBeMerged = aiHiddens.filter(hidden => selectedRowKeys.includes(hidden.id));
|
||||||
|
|
@ -206,16 +266,30 @@ function Add(props) {
|
||||||
form={form}
|
form={form}
|
||||||
loading={deleteFileLoading || uploadFileLoading || getFileLoading || props.ledger.ledgerLoading}
|
loading={deleteFileLoading || uploadFileLoading || getFileLoading || props.ledger.ledgerLoading}
|
||||||
values={defaultValues}
|
values={defaultValues}
|
||||||
submitButtonText={isExistNextOneHidden() ? "下一个" : "提交"}
|
|
||||||
onFinish={onSubmit}
|
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={[
|
options={[
|
||||||
{
|
{
|
||||||
name: "hiddenImageFiles",
|
name: "hiddenImageFiles",
|
||||||
label: "隐患图片",
|
label: "隐患图片",
|
||||||
render: (
|
render: (
|
||||||
<Upload
|
<Upload
|
||||||
maxCount={isAi === 1 ? 1 : 4}
|
|
||||||
disabled={currentProcessHiddenIndex > 0}
|
disabled={currentProcessHiddenIndex > 0}
|
||||||
|
listType="picture-card"
|
||||||
onRemove={() => {
|
onRemove={() => {
|
||||||
if (isAi === 1) {
|
if (isAi === 1) {
|
||||||
form.setFieldValue("isAi", "");
|
form.setFieldValue("isAi", "");
|
||||||
|
|
@ -239,14 +313,12 @@ function Add(props) {
|
||||||
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={handleAiRecognizeClick}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
<div>
|
<div>
|
||||||
最多上传
|
最多上传4个文件,并且只能上传jpg、jpeg、png格式的文件。
|
||||||
{isAi === 1 ? 1 : 4}
|
|
||||||
个文件,并且只能上传jpg、jpeg、png格式的文件。
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
@ -596,6 +668,18 @@ function Add(props) {
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
imageSelectModalOpen && (
|
||||||
|
<ImageSelectModal
|
||||||
|
title={modalTitle}
|
||||||
|
images={uploadedImages}
|
||||||
|
onCancel={() => setImageSelectModalOpen(false)}
|
||||||
|
onConfirm={(selectedImage) => {
|
||||||
|
getAIHiddenImageRecognize(selectedImage);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
</div>
|
</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);
|
export default Connect([NS_LEDGER, NS_CONFIRM_USER, NS_PART], true)(Add);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue