From 912fd96925641233099d1a90e888a3b38bb1acfc Mon Sep 17 00:00:00 2001 From: WangGuangYuan Date: Thu, 22 Oct 2026 17:10:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=BA=E9=99=B7=E8=AE=B0=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E7=BC=BA=E9=99=B7=E8=AE=B0=E5=BD=95=E6=96=B0=E5=BB=BA=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=8C=E5=AF=BC=E5=87=BA=E7=9A=84=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8C=89=E7=82=B9=E4=BD=8D=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ResultAnalysisController.java | 1 + .../impl/BigModelResultServiceImpl.java | 115 +++++++++++++++--- .../domain/BasePointAreaInfo.java | 3 + .../service/impl/PatrolResultServiceImpl.java | 25 +++- .../PatrolTaskResultMainController.java | 2 +- .../com/inspect/task/domain/PatrolData.java | 9 ++ .../mapper/task/PatrolResultMapper.xml | 12 +- .../metadata/area/domain/BaseDataArea.java | 11 ++ .../metadata/montdatamqhandle/vo/Coord.java | 9 ++ .../impl/BasedataDeviceServiceImpl.java | 5 + .../BasedataMontPatDevPatRouteMapper.xml | 5 +- 11 files changed, 171 insertions(+), 26 deletions(-) diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java index befa469..789538c 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java @@ -737,6 +737,7 @@ public class ResultAnalysisController extends BaseController { patrolData.setResStatus(value.stream().map(item -> item.getResStatus() != null ? item.getResStatus() : "").distinct().findFirst().orElse("")); patrolData.setSuggestion(value.stream().map(item -> item.getSuggestion() != null ? item.getSuggestion() : "").distinct().findFirst().orElse("")); patrolData.setWarnStatus(value.stream().map(item -> item.getWarnStatus() != null ? item.getWarnStatus() : "").distinct().findFirst().orElse("")); + patrolData.setTaskName(value.stream().map(item -> item.getTaskName() != null ? item.getTaskName() : "").distinct().findFirst().orElse("")); resultList.add(patrolData); }); diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/bigmodel/service/impl/BigModelResultServiceImpl.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/bigmodel/service/impl/BigModelResultServiceImpl.java index caafed6..543f14b 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/bigmodel/service/impl/BigModelResultServiceImpl.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/bigmodel/service/impl/BigModelResultServiceImpl.java @@ -1,37 +1,124 @@ package com.inspect.bigmodel.service.impl; import com.alibaba.fastjson.JSONObject; +import com.inspect.analysis.domain.AnalyseLog; +import com.inspect.analysis.domain.ResultAnalysis; +import com.inspect.analysis.service.IResultAnalysisService; import com.inspect.base.core.utils.HttpClientUtils; +import com.inspect.base.core.utils.StringUtils; +import com.inspect.base.redis.service.RedisService; import com.inspect.bigmodel.service.IBigModelResultService; +import com.inspect.partrolresult.domain.PatrolResult; +import com.inspect.partrolresult.service.IPatrolResultService; +import com.inspect.task.domain.PatrolData; import com.inspect.task.service.IPatrolTaskService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class BigModelResultServiceImpl implements IBigModelResultService { private final Logger log = LoggerFactory.getLogger(BigModelResultServiceImpl.class); @Autowired private IPatrolTaskService patrolTaskService; + @Autowired + private IResultAnalysisService resultAnalysisService; + + @Autowired + private IPatrolResultService patrolResultService; + + @Autowired + private RedisService redisService; + @Override public JSONObject getBigModelResult() { - String analyseFilter = patrolTaskService.selectConfigByKey("ANALYSE_FILTER_URL"); - log.info("-----调用大模型结果接口地址,url:{}", analyseFilter + "/bigModel/record/latest"); - String resultStr = null; - try { - resultStr = HttpClientUtils.get(analyseFilter + "/bigModel/record/latest", ""); - } catch (Exception e) { - log.error("调用大模型结果接口,返回数据异常,exception:{}", e.getMessage()); +// String analyseFilter = patrolTaskService.selectConfigByKey("ANALYSE_FILTER_URL"); +// log.info("-----调用大模型结果接口地址,url:{}", analyseFilter + "/bigModel/record/latest"); +// String resultStr = null; +// try { +// resultStr = HttpClientUtils.get(analyseFilter + "/bigModel/record/latest", ""); +// } catch (Exception e) { +// log.error("调用大模型结果接口,返回数据异常,exception:{}", e.getMessage()); +// } +// log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr); +// JSONObject result = JSONObject.parseObject(resultStr); +// if (result != null && "200".equals(result.getString("code"))) { +// return result.getJSONObject("data"); +// } else { +// log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr); +// return result; +// } + JSONObject jsonObject = new JSONObject(); +// ResultAnalysis resultAnalysis = new ResultAnalysis(); +// resultAnalysis.setFilter("0"); +// ResultAnalysis bigModelResult = resultAnalysisService.getLatestResult(resultAnalysis); +// if (bigModelResult == null) { +// return jsonObject; +// } +// resultAnalysis.setFilter("1"); +// resultAnalysis.setAlgType(bigModelResult.getAlgType()); +// resultAnalysis.setObjectId(bigModelResult.getObjectId()); +// resultAnalysis.setTaskPatrolId(bigModelResult.getTaskPatrolId()); +// ResultAnalysis filterResult = resultAnalysisService.getLatestResult(resultAnalysis); +// AnalyseLog analyseLog = new AnalyseLog("","1",bigModelResult.getTaskPatrolId(),"0","", bigModelResult.getObjectId(), ""); +// AnalyseLog analyseLog = new AnalyseLog("","","","","", "", ""); +// analyseLog = resultAnalysisService.getAnalyseLog(analyseLog); + if (!redisService.hasKey("patrol_infer")) { + return jsonObject; + } + Object patrol_infer = redisService.getCacheObject("patrol_infer"); + JSONObject result = JSONObject.parseObject(patrol_infer.toString()); + // 原图路径 + String original_image_path = result.getString("original_image_path"); + // 大模型分析图片路径 + String model_image_url = result.getString("model_image_url"); + if (StringUtils.isNotEmpty(original_image_path) && !original_image_path.startsWith("/")) { + original_image_path = "/" + original_image_path; } - log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr); - JSONObject result = JSONObject.parseObject(resultStr); - if (result != null && "200".equals(result.getString("code"))) { - return result.getJSONObject("data"); - } else { - log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr); - return result; + if (StringUtils.isNotEmpty(model_image_url) && !model_image_url.startsWith("/")) { + model_image_url = "/" + model_image_url; } + // 重点区域分割图片路径 + jsonObject.put("keyZonePicture", original_image_path); + // 特征点对比图片路径 + jsonObject.put("featureComparePictureA", original_image_path); + // 特征点对比图片B路径 + jsonObject.put("featureComparePictureB", original_image_path); + // 多模态大模型图片路径 + jsonObject.put("bigModelPicture", model_image_url); + // 多模态大模型图片返回说明 + jsonObject.put("bigModelDesc", result.getString("model_analysis")); + // 多模态大模型图片问题 + jsonObject.put("bigModelProblem", result.getString("prompt")); + // 日志信息 + jsonObject.put("logInfo", "日志:" + result.toJSONString()); + + String object_id = result.getString("object_id"); + if (!redisService.hasKey("patrol_infer:" + object_id)) { + return jsonObject; + } + Object filterCacheObject = redisService.getCacheObject("patrol_infer:" + object_id); + JSONObject filterResultJson = JSONObject.parseObject(filterCacheObject.toString()); + String roi_dots = filterResultJson.getString("roi_dots"); + String roi_result = filterResultJson.getString("roi_result"); + if (StringUtils.isNotEmpty(roi_dots) && !roi_dots.startsWith("/")) { + roi_dots = "/" + roi_dots; + } + if (StringUtils.isNotEmpty(roi_result) && !roi_result.startsWith("/")) { + roi_result = "/" + roi_result; + } + // 特征点对比图片路径 + jsonObject.put("featureComparePictureA", roi_dots); + // 特征点对比图片B路径 + jsonObject.put("featureComparePictureB", roi_result); + + + return jsonObject; + } } diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/domain/BasePointAreaInfo.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/domain/BasePointAreaInfo.java index 6df8557..128686d 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/domain/BasePointAreaInfo.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/domain/BasePointAreaInfo.java @@ -3,6 +3,7 @@ package com.inspect.partrolresult.domain; import lombok.Getter; import lombok.Setter; +import java.util.Date; import java.util.Objects; @Setter @@ -17,6 +18,8 @@ public class BasePointAreaInfo { private String areaName; private String channelId; private String eqpBookId; + /** 点位创建时间 basedata_patrolpoint.create_time,用于报告数据按点位创建时间降序排序 */ + private Date createTime; @Override public boolean equals(Object object) { diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java index 5dd1676..39cb897 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java @@ -716,6 +716,17 @@ public class PatrolResultServiceImpl implements IPatrolResultService { patrolResultRefs = processedRefs; startTime = PrintUtil.useTime("导出报告:全部数据处理", startTime); } + // 导出的报告数据按点位创建时间(basedata_patrolpoint.create_time)降序排序: + // 报告明细行序 = 下方 batchInsertReportData_shaoxing 遍历写入顺序,故在落库前对结果集做一次内存排序即可。 + // 点位创建时间复用已查询的 basePointAreaInfoList,无需额外SQL/ORDER BY,避免大表关联排序带来的性能开销。 + Map pointCreateTimeMap = basePointAreaInfoList.stream() + .filter(item -> item != null && item.getDeviceId() != null && item.getCreateTime() != null) + .collect(Collectors.toMap(BasePointAreaInfo::getDeviceId, BasePointAreaInfo::getCreateTime, (a, b) -> a)); + if (patrolResultRefs.size() > 1) { + patrolResultRefs.sort(Comparator.comparing( + (PatrolResultRef ref) -> pointCreateTimeMap.get(ref.getDeviceId()), + Comparator.nullsLast(Comparator.reverseOrder()))); + } long okNum = 0L; long failNum = 0L; long defectNum = 0L; @@ -1282,6 +1293,10 @@ public class PatrolResultServiceImpl implements IPatrolResultService { public void batchInsertReportData_shaoxing(String reportId, List patrolResultRefs, List basePointAreaInfoList, List lineIds) { Map> taskCounterMap = new HashMap<>(); + // 设备id,区域map + Map basePointAreaInfoByDeviceId = basePointAreaInfoList.stream() + .filter(item -> item != null && item.getDeviceId() != null) + .collect(Collectors.toMap(BasePointAreaInfo::getDeviceId, item -> item, (a, b) -> a)); // 为每个任务初始化计数器 for (Long item : lineIds) { @@ -1307,14 +1322,13 @@ public class PatrolResultServiceImpl implements IPatrolResultService { String resultTaskName = patrolResultRef.getTaskName(); String taskPatrolledId = patrolResultRef.getTaskPatrolledId(); Long mainId = patrolResultRef.getMainId(); - BasePointAreaInfo basePointAreaInfo; - try { - basePointAreaInfo = basePointAreaInfoList.stream().filter((item) -> item != null && patrolResultRef.getDeviceId().equals(item.getDeviceId())).findFirst().get(); - } catch (Exception e) { + BasePointAreaInfo basePointAreaInfo = basePointAreaInfoByDeviceId.get(patrolResultRef.getDeviceId()); + if (basePointAreaInfo == null) { log.error("[REPORT DETAIL] The point lacking belonging area: {}", patrolResultRef.getDeviceId()); basePointAreaInfo = new BasePointAreaInfo(); } + InspectionReportData reportData = new InspectionReportData(); reportData.setReportId(reportId); reportData.setArea(basePointAreaInfo.getAreaName()); @@ -2246,6 +2260,9 @@ public class PatrolResultServiceImpl implements IPatrolResultService { merged.setThreshold(filterResult.getThreshold()); merged.setAlgName(filterResult.getAlgName()); merged.setResultType(resultType); + // 随便取,反正是同个任务 + merged.setMainId(filterResult.getMainId()); + merged.setTaskName(filterResult.getTaskName()); return merged; } diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java index 36c2cf2..90b53ff 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java @@ -1627,7 +1627,7 @@ public class PatrolTaskResultMainController extends BaseController { } }); - } catch (Exception e) { + } catch (Throwable e) { logger.error("生成巡视文件异常:{}", e); closeResources(sxssfWorkbook, wordDocument, tempFiles); } diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/task/domain/PatrolData.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/task/domain/PatrolData.java index d21583e..ea336e8 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/task/domain/PatrolData.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/task/domain/PatrolData.java @@ -87,6 +87,15 @@ public class PatrolData implements Comparable { private String taskPatrolId; + private String taskName; + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } public String warnStatus(String ws) { byte var3 = -1; diff --git a/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml b/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml index 9131603..f0c5991 100644 --- a/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml +++ b/inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml @@ -370,7 +370,7 @@ b.res_status, d.device_name, e.area_name, - d.area_id, + e.area_id, b.alg_type, b.objectId, b.suggestion, @@ -383,8 +383,8 @@ and a.task_patrolled_id = b.task_patrol_id and a.device_id = b.objectId left join basedata_patrolpoint c on a.device_id = c.patrol_point_id - left join basedata_device d on c.device_id = d.device_id - left join basedata_area e on e.area_id = d.area_id + left join basedata_device d on c.relation_device_id = d.device_id + left join basedata_area e on e.area_id = c.relation_area_id @@ -400,10 +400,10 @@ and b.result_type = '0' - and b.point_status = '4' or b.point_status = '5' + and (b.point_status = '4' or b.point_status = '5') and b.filter = #{filter} and b.alg_type = #{algType} - and d.area_id = #{areaId} + and e.area_id = #{areaId} and d.device_id = #{deviceId} and a.device_id = #{pointId} and a.task_code = #{taskCode} @@ -824,6 +824,7 @@ + SELECT - time, patrol_device_code, coord_pixel, SUBSTRING_INDEX( coord_pixel, ',', 1 ) x, SUBSTRING_INDEX( SUBSTRING_INDEX( coord_pixel, ',', 2 ), ',', - 1 ) y + time, patrol_device_code, coord_pixel, coord_geography, SUBSTRING_INDEX( coord_pixel, ',', 1 ) x, SUBSTRING_INDEX( SUBSTRING_INDEX( coord_pixel, ',', 2 ), ',', - 1 ) y FROM basedata_mont_patdevcoord WHERE @@ -146,7 +147,7 @@