diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/LivePhoto.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/LivePhoto.java index 417ad1d..d1aee5e 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/LivePhoto.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/api/entity/LivePhoto.java @@ -20,4 +20,6 @@ public class LivePhoto { private String md5; private String url; + + private String type; } 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 016cd54..423490e 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 @@ -2,9 +2,11 @@ package org.jeecg.module.custom.ocr.api.thread; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.jeecg.module.custom.ocr.api.entity.TaskCompletionRequest; import org.jeecg.module.custom.ocr.common.entity.RequestData; @@ -18,7 +20,9 @@ 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.HashCompareUtil; import org.jeecg.module.custom.ocr.utils.ImageClassUtil; +import org.jeecg.module.custom.ocr.utils.StringUtils; import org.jeecg.module.custom.ocr.utils.httputil.HttpClient; import org.jeecg.module.custom.ocr.utils.httputil.HttpMethod; import org.jeecg.module.custom.ocr.utils.httputil.HttpParamers; @@ -30,10 +34,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -70,6 +71,9 @@ public class DuplicateTaskRunner { @Value("${image.classifyBaseUrl}") private String classifyBaseUrl; + @Value("${image.classifyPath}") + private String classifyPath; + private ScheduledExecutorService executor; @Autowired private OcrPictureInfoService ocrPictureInfoService; @@ -95,12 +99,24 @@ public class DuplicateTaskRunner { // // 调用 OcrPictureService.listPage 查询图片 // List pictures = ocrPictureService.listPage(queryWrapper); - List tasks = taskMapper.selectByAccountNoAndQueryConfig(duplicateTask.getAccountNo(), duplicateTask.getQueryConfig()); + List tasks = taskMapper.selectByAccountNoAndQueryConfig(duplicateTask.getTenantNo(), duplicateTask.getQueryConfig()); + if (StringUtils.isNotEmpty(duplicateTask.getTaskNos())) { + List taskNos = Arrays.asList(duplicateTask.getTaskNos().split(",")); + if (!CollectionUtils.isEmpty(taskNos)) { + tasks = tasks.stream().filter(item -> taskNos.contains(String.valueOf(item.getTaskNo()))).collect(Collectors.toList()); + } + } - boolean result = true; + DuplicateTask.QueryConfig queryConfig = JSONObject.parseObject(duplicateTask.getQueryConfig(), DuplicateTask.QueryConfig.class); + List historyLists = Lists.newArrayList(); + Set pictureIds = Sets.newHashSet(); if (!CollectionUtils.isEmpty(tasks)) { - List taskIds = tasks.stream().map(Task::getId).collect(Collectors.toList()); - List pictures = ocrPictureInfoMapper.selectByTaskIds(taskIds); + List taskNoList = tasks.stream().map(Task::getTaskNo).collect(Collectors.toList()); + List pictures = ocrPictureInfoMapper.selectByTaskNos(taskNoList); + if (!CollectionUtils.isEmpty(pictures)) { + pictures = pictures.stream().filter(item -> queryConfig.getValidateColumn().contains(item.getType())).collect(Collectors.toList()); + } + // 如果图片数量大于 1,进行两两对比 double maxSimilarity = 0.0; if (pictures != null && pictures.size() > 1) { @@ -110,8 +126,18 @@ public class DuplicateTaskRunner { OcrPictureInfo second = pictures.get(j); // 计算相似度 - String similarityScore = ImageClassUtil.getSimilarity(first.getImageUrl(), second.getImageUrl(), classifyBaseUrl); + String similarityScore = HashCompareUtil.cmpHash(first.getImgHash(), second.getImgHash()); +// String similarityScore = ImageClassUtil.getSimilarity(first.getImageUrl(), second.getImageUrl(), classifyBaseUrl); double similarityValue = Double.parseDouble(similarityScore); + if (!pictureIds.contains(first.getId()) && similarityValue > queryConfig.getConfidenceLevel()) { + TaskCompletionRequest.HisPictureRepeat hisPictureRepeat = new TaskCompletionRequest.HisPictureRepeat(); + hisPictureRepeat.setHisTaskNo(first.getTaskNo()); + hisPictureRepeat.setHisRepeatImgUrl(first.getImageUrl()); + hisPictureRepeat.setHisRepeatImgNo(first.getId()); + pictureIds.add(first.getId()); + historyLists.add(hisPictureRepeat); + } + maxSimilarity = Math.max(maxSimilarity, similarityValue); // 保存对比结果到 PictureCompare @@ -138,12 +164,12 @@ public class DuplicateTaskRunner { String[] taskNos = duplicateTask.getTaskNos().split(","); for (String taskNo : taskNos) { - notifyTaskCompletion(taskNo, duplicateTask.getTenantNo(), duplicateTask.getAccountNo(), maxSimilarity, pictures); + notifyTaskCompletion(taskNo, duplicateTask.getTenantNo(), duplicateTask.getAccountNo(), maxSimilarity, pictures, historyLists); } } else { String[] taskNos = duplicateTask.getTaskNos().split(","); for (String taskNo : taskNos) { - notifyTaskCompletion(taskNo, duplicateTask.getTenantNo(), duplicateTask.getAccountNo(), 0, Lists.newArrayList()); + notifyTaskCompletion(taskNo, duplicateTask.getTenantNo(), duplicateTask.getAccountNo(), 0, Lists.newArrayList(), historyLists); } duplicateTaskMapper.updateCompletedAndMaxSimilarity(duplicateTask.getId(), 1, "0"); } @@ -160,130 +186,7 @@ public class DuplicateTaskRunner { } } - private QueryWrapper toQueryWrapper(DuplicateTask task) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - - // 解析 queryConfig JSON - if (task.getQueryConfig() != null && !task.getQueryConfig().isEmpty()) { - try { - ObjectMapper objectMapper = new ObjectMapper(); - Map queryMap = objectMapper.readValue(task.getQueryConfig(), Map.class); - - // 映射 OcrPicture 的数据库列名 - Map fieldToColumnMap = new HashMap<>(); - fieldToColumnMap.put("id", "ID"); - fieldToColumnMap.put("createBy", "create_by"); - fieldToColumnMap.put("createTime", "create_time"); - fieldToColumnMap.put("updateBy", "update_by"); - fieldToColumnMap.put("updateTime", "update_time"); - fieldToColumnMap.put("classificationid", "classificationid"); - fieldToColumnMap.put("pictureclassid", "pictureclassid"); - fieldToColumnMap.put("pictureclassscores", "pictureclassscores"); - fieldToColumnMap.put("iztrueorfalse", "iztrueorfalse"); - fieldToColumnMap.put("judgeid", "judgeid"); - fieldToColumnMap.put("judgedesc", "judgedesc"); - fieldToColumnMap.put("tenantId", "tenant_id"); - fieldToColumnMap.put("tenantstatus", "tenantstatus"); - fieldToColumnMap.put("plantcode", "plantCode"); - fieldToColumnMap.put("tenantname", "tenantname"); - fieldToColumnMap.put("pictureid", "pictureid"); - fieldToColumnMap.put("picturename", "picturename"); - fieldToColumnMap.put("imgname", "imgName"); - fieldToColumnMap.put("imgurl", "imgUrl"); - fieldToColumnMap.put("picturestatus", "picturestatus"); - fieldToColumnMap.put("projectid", "projectId"); - fieldToColumnMap.put("projectidname", "projectIdName"); - fieldToColumnMap.put("projectstatus", "projectstatus"); - fieldToColumnMap.put("planid", "planId"); - fieldToColumnMap.put("planname", "planName"); - fieldToColumnMap.put("planstatus", "planstatus"); - fieldToColumnMap.put("planchildid", "planchildid"); - fieldToColumnMap.put("planchildname", "planchildname"); - fieldToColumnMap.put("planchildstatus", "planchildstatus"); - fieldToColumnMap.put("uptime", "upTime"); - fieldToColumnMap.put("gentime", "genTime"); - fieldToColumnMap.put("space", "space"); - fieldToColumnMap.put("source", "source"); - fieldToColumnMap.put("uphead", "upHead"); - fieldToColumnMap.put("upuserid", "upuserid"); - fieldToColumnMap.put("upname", "upName"); - fieldToColumnMap.put("releasearea", "releaseArea"); - fieldToColumnMap.put("releaseprovince", "releaseProvince"); - fieldToColumnMap.put("remark", "remark"); - fieldToColumnMap.put("taskname", "taskName"); - fieldToColumnMap.put("taskstatus", "taskstatus"); - fieldToColumnMap.put("workStatus", "work_status"); - fieldToColumnMap.put("categoryid", "categoryid"); - fieldToColumnMap.put("taskchildpictureid", "taskchildpictureid"); - fieldToColumnMap.put("field1", "field1"); - fieldToColumnMap.put("field2", "field2"); - fieldToColumnMap.put("field3", "field3"); - fieldToColumnMap.put("field4", "field4"); - fieldToColumnMap.put("field5", "field5"); - fieldToColumnMap.put("field6", "field6"); - fieldToColumnMap.put("field7", "field7"); - fieldToColumnMap.put("field8", "field8"); - fieldToColumnMap.put("field9", "field9"); - fieldToColumnMap.put("field10", "field10"); - fieldToColumnMap.put("field11", "field11"); - fieldToColumnMap.put("field12", "field12"); - fieldToColumnMap.put("field13", "field13"); - fieldToColumnMap.put("field14", "field14"); - fieldToColumnMap.put("field15", "field15"); - fieldToColumnMap.put("field16", "field16"); - fieldToColumnMap.put("field17", "field17"); - fieldToColumnMap.put("field18", "field18"); - fieldToColumnMap.put("localpictrueurl", "local_pictrue_url"); - fieldToColumnMap.put("isdownload", "is_download"); - fieldToColumnMap.put("imgHash", "img_hash"); - fieldToColumnMap.put("similarityscore", "similarity_score"); - fieldToColumnMap.put("downloadErrorCount", "download_error_count"); - fieldToColumnMap.put("localThumbnailUrl", "local_thumbnail_url"); - fieldToColumnMap.put("serverThumbnailUrl", "server_thumbnail_url"); - fieldToColumnMap.put("submitDateTimestamp", "submit_date_timestamp"); - fieldToColumnMap.put("isRepeat", "is_repeat"); - fieldToColumnMap.put("suspiciousfile", "suspiciousfile"); - fieldToColumnMap.put("location", "location"); - fieldToColumnMap.put("comment", "comment"); - fieldToColumnMap.put("photoDateTimestamp", "photo_date_timestamp"); - fieldToColumnMap.put("completeSimilarGroupId", "complete_similar_group_id"); - fieldToColumnMap.put("history", "history"); - - // 动态添加查询条件 - for (Map.Entry entry : queryMap.entrySet()) { - String fieldName = entry.getKey(); - Object value = entry.getValue(); - String columnName = fieldToColumnMap.get(fieldName); - - if (columnName != null && value != null) { - queryWrapper.eq(columnName, value); - } - } - } catch (Exception e) { - throw new RuntimeException("Failed to parse queryConfig", e); - } - } - - // 添加 DuplicateTask 的其他字段作为查询条件 - if (task.getTenantNo() != null) { - queryWrapper.eq("tenant_id", task.getTenantNo()); - } - if (task.getAccountNo() != null) { - queryWrapper.eq("pictureid", task.getAccountNo()); // 假设 pictureid 对应 accountNo - } - if (task.getTaskNos() != null && !task.getTaskNos().isEmpty()) { - // 假设 taskNos 是逗号分隔的字符串,转换为 List - String[] taskNosArray = task.getTaskNos().split(","); - List taskNosList = Arrays.asList(taskNosArray).stream() - .map(Long::parseLong) - .collect(Collectors.toList()); - queryWrapper.in("remark", taskNosList); - } - - return queryWrapper; - } - - private boolean notifyTaskCompletion(String taskNo, Long tenantNo, Long accountNo, double maxSimilarity, List pictures) { + private boolean notifyTaskCompletion(String taskNo, Long tenantNo, Long accountNo, double maxSimilarity, List pictures, List historyLists) { try { // 构造任务完成数据 TaskCompletionRequest.TaskCompletionData data = new TaskCompletionRequest.TaskCompletionData(); @@ -305,7 +208,7 @@ public class DuplicateTaskRunner { repeat.setImgNo(p.getId()); repeat.setImgUrl(p.getImageUrl()); repeat.setDynamicFields(new HashMap<>()); // 动态字段待补充 - repeat.setHisPictureRepeatList(Arrays.asList()); + repeat.setHisPictureRepeatList(historyLists); return repeat; }) .collect(Collectors.toList()); @@ -317,19 +220,26 @@ public class DuplicateTaskRunner { data.setApproveDetailList(Arrays.asList()); // 序列化 data 为 JSON - String jsonData = JSONObject.toJSONString(data); + String jsonData = JSONObject.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect); // 加密请求参数 - RequestData requestData = ApiHelper.buildRequest( - tenantNo.toString(), - apiConfig.getAccessKey(), - apiConfig.getAccessCode(), - jsonData - ); -// RequestData requestData = ApiHelper.buildResponse( +// RequestData requestData = ApiHelper.buildRequest( +// tenantNo.toString(), +// apiConfig.getAccessKey(), // apiConfig.getAccessCode(), // jsonData // ); + ResultData stringResultData = ApiHelper.buildResponse( + apiConfig.getAccessCode(), + jsonData + ); + + RequestData requestData = new RequestData(); + requestData.setAccessKey(apiConfig.getAccessKey()); + requestData.setSignature(stringResultData.getSignature()); + requestData.setTimestamp(stringResultData.getTimestamp()); + requestData.setTenantCode(tenantNo.toString()); + requestData.setData(stringResultData.getData()); // 组装请求 // TODO: 需提供实际路径 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 09f9032..f226470 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 @@ -46,13 +46,13 @@ public class PictureImgToLocalTask implements Runnable { //1.开始转储图片 Boolean result = true; - handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getLivePhoto()); - handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0011()); - handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0013()); - handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0014()); + handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getLivePhoto(), "LivePhoto1"); + handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0011(), "drt0011"); + handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0013(), "drt0013"); + handlePicture(result, task, ocrPictureService, taskService, pictureImgToLocal.getDrt0014(), "drt0014"); } - private void handlePicture(Boolean result, Task task, OcrPictureService ocrPictureService, TaskService taskService, List livePhotos) { + private void handlePicture(Boolean result, Task task, OcrPictureService ocrPictureService, TaskService taskService, List livePhotos, String type) { if (CollectionUtils.isEmpty(livePhotos)) { return; } @@ -63,7 +63,7 @@ public class PictureImgToLocalTask implements Runnable { File file = new File(livePhoto.getFileUrl()); // pictureImgToLocal.getLivePhoto().getLocalImgUrl() if (!file.isFile()) { - result = DownloadImgUtil.downloadImage(livePhoto.getFileUrl().replaceAll("https://https://", "https://"), livePhoto.getFileName()); + result = DownloadImgUtil.downloadImage(livePhoto.getFileUrl(), livePhoto.getFileName()); // result = DownloadImgUtil.downloadImage(pictureImgToLocal.getLivePhoto().getFileUrl(), "D:\\code\\ocr-activity-backend\\1.jpeg"); } } @@ -87,7 +87,7 @@ public class PictureImgToLocalTask implements Runnable { taskService.updateById(task); logger.info("图片本地化,回写数据完成!"); logger.info("开启获取图片信息操作!"); - ocrPictureService.savePicturesInfo(task); + ocrPictureService.savePicturesInfo(task, livePhoto.getFileUrl(), type); logger.info("获取图片信息操作,结束!"); } } else { diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/controller/PrevailCloudApiController.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/controller/PrevailCloudApiController.java index 31900a4..b6329e9 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/controller/PrevailCloudApiController.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/controller/PrevailCloudApiController.java @@ -3,10 +3,13 @@ package org.jeecg.module.custom.ocr.controller; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.jeecg.module.custom.ocr.api.PrevailCloudApi; +import org.jeecg.module.custom.ocr.api.entity.LivePhoto; import org.jeecg.module.custom.ocr.api.entity.PictureSourceAllPullMsg; import org.jeecg.module.custom.ocr.api.thread.PullAllPictureSourceThread; import org.jeecg.module.custom.ocr.common.entity.RequestData; @@ -129,7 +132,19 @@ public class PrevailCloudApiController { try { RequestData requestData = JSON.parseObject(JSON.toJSONString(request), RequestData.class); String decryptRequest = ApiHelper.decryptRequest(accessCode, requestData); - List taskDTOS = JSON.parseArray(decryptRequest, TaskDTO.class); + + // Create ObjectMapper with FAIL_ON_UNKNOWN_PROPERTIES set to false + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + // Parse the decrypted request into TaskDTO list + List taskDTOS = objectMapper.readValue(decryptRequest, + objectMapper.getTypeFactory().constructCollectionType(List.class, TaskDTO.class)); + + // Convert LivePhoto fields from LinkedHashMap to LivePhoto objects + for (TaskDTO taskDTO : taskDTOS) { + convertLivePhotoFields(taskDTO); + } AddTaskRequest addTaskRequest = convertToAddTaskRequest(request); addTaskRequest.getData().setRecords(taskDTOS); @@ -139,6 +154,42 @@ public class PrevailCloudApiController { } } + private void convertLivePhotoFields(TaskDTO taskDTO) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + + // Convert livePhoto field + if (taskDTO.getLivePhoto() != null) { + List livePhotos = objectMapper.convertValue(taskDTO.getLivePhoto(), + objectMapper.getTypeFactory().constructCollectionType(List.class, LivePhoto.class)); + taskDTO.setLivePhoto(livePhotos); + } + + // Convert drt0011 field + if (taskDTO.getDrt0011() != null) { + List drt0011 = objectMapper.convertValue(taskDTO.getDrt0011(), + objectMapper.getTypeFactory().constructCollectionType(List.class, LivePhoto.class)); + taskDTO.setDrt0011(drt0011); + } + + // Convert drt0013 field + if (taskDTO.getDrt0013() != null) { + List drt0013 = objectMapper.convertValue(taskDTO.getDrt0013(), + objectMapper.getTypeFactory().constructCollectionType(List.class, LivePhoto.class)); + taskDTO.setDrt0013(drt0013); + } + + // Convert drt0014 field + if (taskDTO.getDrt0014() != null) { + List drt0014 = objectMapper.convertValue(taskDTO.getDrt0014(), + objectMapper.getTypeFactory().constructCollectionType(List.class, LivePhoto.class)); + taskDTO.setDrt0014(drt0014); + } + } catch (Exception e) { + throw new RuntimeException("Failed to convert LivePhoto fields", e); + } + } + /** * 删除任务 * 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 a2d1aa0..d021265 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 @@ -14,4 +14,6 @@ import java.util.List; */ public interface OcrPictureInfoMapper extends BaseMapper { List selectByTaskIds(@Param("taskIds") List taskIds); + + List selectByTaskNos(@Param("taskNos") List taskNos); } diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/DuplicateTask.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/DuplicateTask.java index c682df1..56130f3 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/DuplicateTask.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/dataobject/DuplicateTask.java @@ -1,6 +1,7 @@ package org.jeecg.module.custom.ocr.dataobject; import lombok.Data; +import java.util.List; @Data public class DuplicateTask { @@ -61,4 +62,24 @@ public class DuplicateTask { * 是否已经完成 */ private Boolean completed; + + @Data + public static class QueryConfig { + + private Integer confidenceLevel; + + private List validateColumn; + + private String validateObject; + + private String validateScope; + + private String startTime; + + private String endTime; + + private String crossProvider; + + private boolean exCondition; + } } 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 77d147e..a03af18 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 @@ -97,6 +97,12 @@ public class OcrPictureInfo { @TableField(value = "task_id") private Long taskId; + @TableField(value = "task_no") + private Long taskNo; + + @TableField(value = "type") + private String type; + @TableField(value = "img_hash") private String imgHash; diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/OcrPictureService.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/OcrPictureService.java index 8f7b0ae..7c24adc 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/OcrPictureService.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/service/OcrPictureService.java @@ -29,5 +29,5 @@ public interface OcrPictureService extends BaseService { OcrPicture getByTaskId(Long taskId); - void savePicturesInfo(Task task); + void savePicturesInfo(Task task, String fileUrl , String type); } 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 1b60613..1e29df8 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 @@ -164,20 +164,18 @@ public class OcrPictureServiceImpl extends BaseServiceImpl taskNos) { - taskMapper.deleteByTaskNos(taskNos); +// taskMapper.deleteByTaskNos(taskNos); } private Task toTask(AddTaskRequest request) { diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/HashCompareUtil.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/HashCompareUtil.java new file mode 100644 index 0000000..6441fad --- /dev/null +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/HashCompareUtil.java @@ -0,0 +1,42 @@ +package org.jeecg.module.custom.ocr.utils; + +public class HashCompareUtil { + + public static String cmpHash(String hash1,String hash2){ + int n = 0; + // hash长度不同则返回-1代表传参出错 + if (hash1.length() != hash2.length()){ + return "-1"; + } + for(int i = 0; i < hash1.length(); i++){ + if( hash1.charAt(i) != hash2.charAt(i)){ + n=n + 1; + } + } + String formattedResult=""; + double c=100.0 - n/64.0 * 100.0; + if (c % 1 == 0) { + // 如果是整数,将小数位去除 + formattedResult = String.valueOf((int) c); + } else { + // 如果不是整数,保留两位小数 + formattedResult = String.valueOf(Math.round(c)); + } + return formattedResult; + } + + + public static void main(String[] args) { + String a="1111111100000111000110110001101100110011001100000000000011110001"; + String b="1111111100000111000110110001101100110011001100000000000011110001"; + long start = System.currentTimeMillis(); + int ss=0; +// for(int i=0;i<5000000;i++){ +// String a="1111111100000111000110110001101100110011001100000000000011110001"+i; +// String b="1011111100000111000110110001101100110011001100000000000011110001"+i; + String dd = HashCompareUtil.cmpHash(a, b); + System.out.println(dd); +// ss=i; +// } + } +} diff --git a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/ImageClassUtil.java b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/ImageClassUtil.java index c2a6372..bf89e3a 100644 --- a/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/ImageClassUtil.java +++ b/jeecg-module-custom/src/main/java/org/jeecg/module/custom/ocr/utils/ImageClassUtil.java @@ -70,8 +70,9 @@ public class ImageClassUtil { JSONObject jsonObjectVi = new JSONObject(); jsonObjectVi.put("taskId", taskId); JSONArray jsonArrayVi = new JSONArray(); -// jsonArrayVi.add(imgurl); - jsonArrayVi.add("/server/ocr/data/images/test01.png"); + // TODO: 测试环境可能需要调整本地图片地址路径 + jsonArrayVi.add(imgurl); +// jsonArrayVi.add("/server/ocr/data/images/test01.png"); jsonObjectVi.put("imgUrls", jsonArrayVi); HttpParamers paramersVi = HttpParamers.httpPostParamers(); diff --git a/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml b/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml index 076cfc6..935e39c 100644 --- a/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml +++ b/jeecg-module-custom/src/main/resources/mapper/OcrPictureInfoMapper.xml @@ -15,17 +15,20 @@ + - - - id, picture_id, img_size, img_format, img_measure, upload_time, create_time, img_space, - tag_time, `source` - - SELECT * FROM ocr_picture_info WHERE history = 0 AND task_id IN #{taskId} + + diff --git a/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml b/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml index 47e63e3..1ccf5ec 100644 --- a/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml +++ b/jeecg-module-custom/src/main/resources/mapper/TaskMapper.xml @@ -28,7 +28,7 @@ - id, tenant_code, access_key, timestamp, signature, tenant_no, task_no, account_no, + tenant_code, access_key, timestamp, signature, tenant_no, task_no, account_no, account_name, project_no, project_name, task_form_no, plan_no, plan_name, plan_child_no, plan_child_name, task_id, task_name, user_no, user_name, submit_time, live_photo, dynamic_fields @@ -38,7 +38,6 @@ INSERT INTO task ( ) VALUES ( - #{id}, #{tenantCode}, #{accessKey}, #{timestamp}, @@ -79,46 +78,18 @@ SELECT * FROM task t WHERE t.account_no = #{accountNo} - - AND ( - - - - = CAST(JSON_EXTRACT(#{queryConfig}, '$.confidenceLevel') AS DECIMAL) - ]]> - - - 1=1 - - - - - - = UNIX_TIMESTAMP(STR_TO_DATE( - JSON_UNQUOTE(JSON_EXTRACT(#{queryConfig}, '$.startTime')), - '%Y-%m-%d %H:%i:%s.%f' - )) * 1000 - ]]> - - - - - - - - - - - ) - + AND JSON_EXTRACT(t.dynamic_fields, '$.createTime') BETWEEN + UNIX_TIMESTAMP(STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(#{queryConfig}, '$.startTime')), '%Y-%m-%d %H:%i:%s.%f')) * 1000 + AND + UNIX_TIMESTAMP(STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(#{queryConfig}, '$.endTime')), '%Y-%m-%d %H:%i:%s.%f')) * 1000 + AND EXISTS ( + SELECT 1 + FROM JSON_TABLE( + JSON_EXTRACT(#{queryConfig}, '$.validateColumn'), + '$[*]' COLUMNS (col VARCHAR(255) PATH '$') + ) AS jt + WHERE JSON_EXTRACT(t.dynamic_fields, CONCAT('$.', jt.col)) IS NOT NULL + AND JSON_LENGTH(JSON_EXTRACT(t.dynamic_fields, CONCAT('$.', jt.col))) > 0 + )