From 2eb214947113c4cfa84c415ad5925880bb94e5c1 Mon Sep 17 00:00:00 2001 From: Vincent <19330835921@163.com> Date: Thu, 12 Jun 2025 16:11:36 +0800 Subject: [PATCH] =?UTF-8?q?temp:=20=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ocr/api/entity/TaskCompletionRequest.java | 6 +- .../ocr/api/thread/DuplicateTaskRunner.java | 125 +++++++++++------- .../thread/tasks/PictureImgToLocalTask.java | 2 +- .../module/custom/ocr/config/ApiConfig.java | 4 + .../ocr/dataDao/DuplicateTaskMapper.java | 2 +- .../ocr/dataDao/OcrPictureInfoMapper.java | 4 + .../module/custom/ocr/dataDao/TaskMapper.java | 2 + .../custom/ocr/dataobject/OcrPictureInfo.java | 14 ++ .../service/impl/OcrPictureServiceImpl.java | 4 + .../ocr/service/impl/TaskServiceImpl.java | 5 + .../custom/ocr/utils/ImageClassUtil.java | 9 +- .../src/main/resources/application.yml | 2 + .../resources/mapper/OcrPictureInfoMapper.xml | 8 ++ .../src/main/resources/mapper/TaskMapper.xml | 47 +++++++ 14 files changed, 179 insertions(+), 55 deletions(-) diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/TaskCompletionRequest.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/TaskCompletionRequest.java index 45abf46..c547f7f 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/TaskCompletionRequest.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/TaskCompletionRequest.java @@ -59,9 +59,6 @@ public class TaskCompletionRequest { @JSONField(name = "pictureRepeatList") private List pictureRepeatList; - @JSONField(name = "hisPictureRepeatList") - private List hisPictureRepeatList; - @JSONField(name = "falseImgList") private List falseImgList; @@ -82,6 +79,9 @@ public class TaskCompletionRequest { @JSONField(name = "dynamicFields") private Map dynamicFields; + + @JSONField(name = "hisPictureRepeatList") + private List hisPictureRepeatList; } @Data diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/DuplicateTaskRunner.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/DuplicateTaskRunner.java index 3fed1ec..016cd54 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/DuplicateTaskRunner.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/DuplicateTaskRunner.java @@ -4,16 +4,18 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.jeecg.module.custom.ocr.api.entity.TaskCompletionRequest; import org.jeecg.module.custom.ocr.common.entity.RequestData; import org.jeecg.module.custom.ocr.common.entity.ResultData; import org.jeecg.module.custom.ocr.config.ApiConfig; import org.jeecg.module.custom.ocr.dataDao.DuplicateTaskMapper; +import org.jeecg.module.custom.ocr.dataDao.OcrPictureInfoMapper; import org.jeecg.module.custom.ocr.dataDao.PictureCompareMapper; -import org.jeecg.module.custom.ocr.dataobject.DuplicateTask; -import org.jeecg.module.custom.ocr.dataobject.OcrPicture; -import org.jeecg.module.custom.ocr.dataobject.PictureCompare; +import org.jeecg.module.custom.ocr.dataDao.TaskMapper; +import org.jeecg.module.custom.ocr.dataobject.*; +import org.jeecg.module.custom.ocr.service.OcrPictureInfoService; import org.jeecg.module.custom.ocr.service.OcrPictureService; import org.jeecg.module.custom.ocr.utils.ApiHelper; import org.jeecg.module.custom.ocr.utils.ImageClassUtil; @@ -23,6 +25,7 @@ import org.jeecg.module.custom.ocr.utils.httputil.HttpParamers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -46,9 +49,15 @@ public class DuplicateTaskRunner { @Resource private DuplicateTaskMapper duplicateTaskMapper; + @Resource + private TaskMapper taskMapper; + @Resource private OcrPictureService ocrPictureService; + @Resource + private OcrPictureInfoMapper ocrPictureInfoMapper; + @Resource private PictureCompareMapper pictureCompareMapper; @@ -62,6 +71,8 @@ public class DuplicateTaskRunner { private String classifyBaseUrl; private ScheduledExecutorService executor; + @Autowired + private OcrPictureInfoService ocrPictureInfoService; @PostConstruct public void init() { @@ -76,52 +87,65 @@ public class DuplicateTaskRunner { private void processDuplicateTasks() { try { // 查询所有未完成的 DuplicateTask - List tasks = duplicateTaskMapper.getAllUnCompletedTask(); - if (tasks != null && !tasks.isEmpty()) { - for (DuplicateTask task : tasks) { + List duplicateTasks = duplicateTaskMapper.getAllUnCompletedTask(); + if (duplicateTasks != null && !duplicateTasks.isEmpty()) { + for (DuplicateTask duplicateTask : duplicateTasks) { // 解析 queryConfig 为 QueryWrapper - QueryWrapper queryWrapper = toQueryWrapper(task); - // 调用 OcrPictureService.listPage 查询图片 - List pictures = ocrPictureService.listPage(queryWrapper); - - // 如果图片数量大于 1,进行两两对比 - double maxSimilarity = 0.0; - if (pictures != null && pictures.size() > 1) { - for (int i = 0; i < pictures.size(); i++) { - for (int j = i + 1; j < pictures.size(); j++) { - OcrPicture first = pictures.get(i); - OcrPicture second = pictures.get(j); - - // 计算相似度 - String similarityScore = ImageClassUtil.getSimilarity(first.getImageUrl(), second.getImageUrl(), classifyBaseUrl); - double similarityValue = Double.parseDouble(similarityScore); - maxSimilarity = Math.max(maxSimilarity, similarityValue); - - // 保存对比结果到 PictureCompare - PictureCompare compare = new PictureCompare(); - compare.setFirstImgNo(first.getId()); - compare.setFirstImgUrl(first.getImageUrl()); - compare.setFirstLocalImgUrl(first.getLocalImageUrl()); - compare.setFirstImgHash(first.getImgHash()); - compare.setSecondImgNo(second.getId()); - compare.setSecondImgUrl(second.getImageUrl()); - compare.setSecondLocalImgUrl(second.getLocalImageUrl()); - compare.setSecondImgHash(second.getImgHash()); - compare.setSimilarityScore(similarityScore); - pictureCompareMapper.save(compare); +// QueryWrapper queryWrapper = toQueryWrapper(duplicateTask); +// // 调用 OcrPictureService.listPage 查询图片 +// List pictures = ocrPictureService.listPage(queryWrapper); + + List tasks = taskMapper.selectByAccountNoAndQueryConfig(duplicateTask.getAccountNo(), duplicateTask.getQueryConfig()); + + boolean result = true; + if (!CollectionUtils.isEmpty(tasks)) { + List taskIds = tasks.stream().map(Task::getId).collect(Collectors.toList()); + List pictures = ocrPictureInfoMapper.selectByTaskIds(taskIds); + // 如果图片数量大于 1,进行两两对比 + double maxSimilarity = 0.0; + if (pictures != null && pictures.size() > 1) { + for (int i = 0; i < pictures.size(); i++) { + for (int j = i + 1; j < pictures.size(); j++) { + OcrPictureInfo first = pictures.get(i); + OcrPictureInfo second = pictures.get(j); + + // 计算相似度 + String similarityScore = ImageClassUtil.getSimilarity(first.getImageUrl(), second.getImageUrl(), classifyBaseUrl); + double similarityValue = Double.parseDouble(similarityScore); + maxSimilarity = Math.max(maxSimilarity, similarityValue); + + // 保存对比结果到 PictureCompare + PictureCompare compare = new PictureCompare(); + compare.setFirstImgNo(first.getId()); + compare.setFirstImgUrl(first.getImageUrl()); + compare.setFirstLocalImgUrl(first.getLocalImageUrl()); + compare.setFirstImgHash(first.getImgHash()); + compare.setSecondImgNo(second.getId()); + compare.setSecondImgUrl(second.getImageUrl()); + compare.setSecondLocalImgUrl(second.getLocalImageUrl()); + compare.setSecondImgHash(second.getImgHash()); + compare.setSimilarityScore(similarityScore); + pictureCompareMapper.save(compare); + } } + + // 更新 DuplicateTask 状态和最大相似度 + duplicateTaskMapper.updateCompletedAndMaxSimilarity(duplicateTask.getId(), 1, String.valueOf(maxSimilarity)); + } else { + // 更新 DuplicateTask 状态和最大相似度 + duplicateTaskMapper.updateCompletedAndMaxSimilarity(duplicateTask.getId(), 1, "0"); } - // 更新 DuplicateTask 状态和最大相似度 - duplicateTaskMapper.updateCompletedAndMaxSimilarity(task.getId(), true, String.valueOf(maxSimilarity)); + String[] taskNos = duplicateTask.getTaskNos().split(","); + for (String taskNo : taskNos) { + notifyTaskCompletion(taskNo, duplicateTask.getTenantNo(), duplicateTask.getAccountNo(), maxSimilarity, pictures); + } } else { - // 更新 DuplicateTask 状态和最大相似度 - duplicateTaskMapper.updateCompletedAndMaxSimilarity(task.getId(), true, "0"); - } - - String[] taskNos = task.getTaskNos().split(","); - for (String taskNo : taskNos) { - notifyTaskCompletion(taskNo, task.getTenantNo(), task.getAccountNo(), maxSimilarity, pictures); + String[] taskNos = duplicateTask.getTaskNos().split(","); + for (String taskNo : taskNos) { + notifyTaskCompletion(taskNo, duplicateTask.getTenantNo(), duplicateTask.getAccountNo(), 0, Lists.newArrayList()); + } + duplicateTaskMapper.updateCompletedAndMaxSimilarity(duplicateTask.getId(), 1, "0"); } } } @@ -259,7 +283,7 @@ public class DuplicateTaskRunner { return queryWrapper; } - private void notifyTaskCompletion(String taskNo, Long tenantNo, Long accountNo, double maxSimilarity, List pictures) { + private boolean notifyTaskCompletion(String taskNo, Long tenantNo, Long accountNo, double maxSimilarity, List pictures) { try { // 构造任务完成数据 TaskCompletionRequest.TaskCompletionData data = new TaskCompletionRequest.TaskCompletionData(); @@ -281,13 +305,13 @@ public class DuplicateTaskRunner { repeat.setImgNo(p.getId()); repeat.setImgUrl(p.getImageUrl()); repeat.setDynamicFields(new HashMap<>()); // 动态字段待补充 + repeat.setHisPictureRepeatList(Arrays.asList()); return repeat; }) .collect(Collectors.toList()); data.setPictureRepeatList(pictureRepeatList); // 其他列表暂设为空(需补充逻辑) - data.setHisPictureRepeatList(Arrays.asList()); data.setFalseImgList(Arrays.asList()); data.setBriefRepeatTaskList(Arrays.asList()); data.setApproveDetailList(Arrays.asList()); @@ -302,10 +326,14 @@ public class DuplicateTaskRunner { apiConfig.getAccessCode(), jsonData ); +// RequestData requestData = ApiHelper.buildResponse( +// apiConfig.getAccessCode(), +// jsonData +// ); // 组装请求 // TODO: 需提供实际路径 - String url = apiConfig.getInterfaceDomain() + "/api/task/complete"; + String url = apiConfig.getInterfaceDomain(); String requestBodyJson = JSONObject.toJSONString(requestData); HttpParamers httpParamers = new HttpParamers(HttpMethod.POST); httpParamers.setJsonParamer(requestBodyJson); @@ -326,11 +354,14 @@ public class DuplicateTaskRunner { // 处理响应 if (resultData.getStatus() == 100) { log.info("Task {} completion notified successfully", taskNo); + return true; } else { log.error("Failed to notify task completion, taskNo={}, response={}", taskNo, responseJsonStr); + return false; } } catch (Exception e) { log.error("Error notifying task completion, taskNo={}", taskNo, e); + return false; } } } diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/tasks/PictureImgToLocalTask.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/tasks/PictureImgToLocalTask.java index 36bace3..09f9032 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/tasks/PictureImgToLocalTask.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/thread/tasks/PictureImgToLocalTask.java @@ -42,7 +42,7 @@ public class PictureImgToLocalTask implements Runnable { OcrPictureService ocrPictureService = SpringUtils.getBean("ocrPictureService"); // OcrPicture picture = ocrPictureService.getById(pictureImgToLocal.getId()); TaskService taskService = SpringUtils.getBean("taskServiceImpl"); - Task task = taskService.getById(pictureImgToLocal.getId()); + Task task = taskService.getById(pictureImgToLocal.getTaskId()); //1.开始转储图片 Boolean result = true; diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/config/ApiConfig.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/config/ApiConfig.java index 736e244..8cb9b55 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/config/ApiConfig.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/config/ApiConfig.java @@ -4,6 +4,7 @@ import lombok.Data; import org.jeecg.module.custom.ocr.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -16,16 +17,19 @@ public class ApiConfig { /** * 无量云 接口域名 */ + @Value("${interfaceDomain}") private String interfaceDomain; /** * 无量云 秘钥 */ + @Value("${accessKey}") private String accessKey; /** * 无量云 编码 */ + @Value("${accessCode}") private String accessCode; diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/DuplicateTaskMapper.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/DuplicateTaskMapper.java index 5abd832..16e0e81 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/DuplicateTaskMapper.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/DuplicateTaskMapper.java @@ -12,5 +12,5 @@ public interface DuplicateTaskMapper extends BaseMapper { void updateCompletedById(Long id); - void updateCompletedAndMaxSimilarity(Long id, boolean completed, String maxSimilarityScore); + void updateCompletedAndMaxSimilarity(Long id, Integer completed, String maxSimilarityScore); } diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/OcrPictureInfoMapper.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/OcrPictureInfoMapper.java index be84e2b..a2d1aa0 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/OcrPictureInfoMapper.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/OcrPictureInfoMapper.java @@ -1,8 +1,11 @@ package org.jeecg.module.custom.ocr.dataDao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; import org.jeecg.module.custom.ocr.dataobject.OcrPictureInfo; +import java.util.List; + /** * ClassName: $className$.java * Description: @@ -10,4 +13,5 @@ import org.jeecg.module.custom.ocr.dataobject.OcrPictureInfo; * Date: 2024/3/22 07:09 */ public interface OcrPictureInfoMapper extends BaseMapper { + List selectByTaskIds(@Param("taskIds") List taskIds); } diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/TaskMapper.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/TaskMapper.java index e57b502..0d9a73e 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/TaskMapper.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataDao/TaskMapper.java @@ -12,4 +12,6 @@ public interface TaskMapper extends BaseMapper { void deleteByTaskNo(@Param("taskNo") Long taskNo); void deleteByTaskNos(@Param("taskNos") List taskNos); + + List selectByAccountNoAndQueryConfig(@Param("accountNo") Long accountNo, @Param("queryConfig") String queryConfig); } diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/OcrPictureInfo.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/OcrPictureInfo.java index 857707e..77d147e 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/OcrPictureInfo.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/OcrPictureInfo.java @@ -88,4 +88,18 @@ public class OcrPictureInfo { @TableField(value = "`source`") private String source; + @TableField(value = "image_url") + private String imageUrl; + + @TableField(value = "local_image_url") + private String localImageUrl; + + @TableField(value = "task_id") + private Long taskId; + + @TableField(value = "img_hash") + private String imgHash; + + @TableField(value = "history") + private Boolean history; } diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/impl/OcrPictureServiceImpl.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/impl/OcrPictureServiceImpl.java index bd219db..1b60613 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/impl/OcrPictureServiceImpl.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/impl/OcrPictureServiceImpl.java @@ -174,6 +174,10 @@ public class OcrPictureServiceImpl extends BaseServiceImpl 0) { } else { } + + jsonObject = JSON.parseObject(responseDataVi); } catch (Exception e) { logger.error("classify={}", e); } - JSONObject jsonObject = JSON.parseObject(responseDataVi); return jsonObject; } diff --git a/jeecg-module-custom/src/main/resources/application.yml b/jeecg-module-custom/src/main/resources/application.yml index f6603d6..56bb528 100644 --- a/jeecg-module-custom/src/main/resources/application.yml +++ b/jeecg-module-custom/src/main/resources/application.yml @@ -269,3 +269,5 @@ image: serverUrl: http://81.70.154.131/api/image/ classifyBaseUrl: http://47.93.59.251/ai/api/classify/ accessCode: ED6F7B39768AF95E87AEA8ACCCC71A6F +accessKey: 7390F0221A1A73D8E13F8C8BB96F33B0 +interfaceDomain: https://saas-dev.rongyucloud.com/api/admin/pangu/jingwei/thirdclient/command/pb/approval/result diff --git a/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml b/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml index 6942837..076cfc6 100644 --- a/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml +++ b/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml @@ -14,10 +14,18 @@ + id, picture_id, img_size, img_format, img_measure, upload_time, create_time, img_space, tag_time, `source` + + diff --git a/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml b/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml index 3addc56..47e63e3 100644 --- a/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml +++ b/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml @@ -74,4 +74,51 @@ #{taskNo} + +