diff --git a/src/main/java/com/inspect/simulator/domain/result/PatrolUpdataLog.java b/src/main/java/com/inspect/simulator/domain/result/PatrolUpdataLog.java new file mode 100644 index 0000000..ed451f8 --- /dev/null +++ b/src/main/java/com/inspect/simulator/domain/result/PatrolUpdataLog.java @@ -0,0 +1,33 @@ +package com.inspect.simulator.domain.result; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * @author WGY + * @create 2025-03-31 11:33 + **/ +@Data +@TableName("patrol_updata_log") +public class PatrolUpdataLog { + private static final long serialVersionUID = 1L; + @TableId + private Long logId; + + private String algorithmsType; + + private String resultCode; + + private String upNum; + + private String filter; + + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss" + ) + private Date createTime; +} diff --git a/src/main/java/com/inspect/simulator/mapper/PatrolUpdataLogMapper.java b/src/main/java/com/inspect/simulator/mapper/PatrolUpdataLogMapper.java new file mode 100644 index 0000000..227e0cb --- /dev/null +++ b/src/main/java/com/inspect/simulator/mapper/PatrolUpdataLogMapper.java @@ -0,0 +1,14 @@ +package com.inspect.simulator.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.inspect.simulator.domain.result.PatrolUpdataLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author WGY + * @create 2025-03-31 11:38 + **/ +@Mapper +public interface PatrolUpdataLogMapper extends BaseMapper { + +} diff --git a/src/main/java/com/inspect/simulator/service/IPatrolUpdataLogService.java b/src/main/java/com/inspect/simulator/service/IPatrolUpdataLogService.java new file mode 100644 index 0000000..3f6ce99 --- /dev/null +++ b/src/main/java/com/inspect/simulator/service/IPatrolUpdataLogService.java @@ -0,0 +1,11 @@ +package com.inspect.simulator.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.inspect.simulator.domain.result.PatrolUpdataLog; + +/** + * @author WGY + * @create 2025-03-31 13:35 + **/ +public interface IPatrolUpdataLogService extends IService { +} diff --git a/src/main/java/com/inspect/simulator/service/impl/PatrolResultServiceImpl.java b/src/main/java/com/inspect/simulator/service/impl/PatrolResultServiceImpl.java index 5d9079c..0820161 100644 --- a/src/main/java/com/inspect/simulator/service/impl/PatrolResultServiceImpl.java +++ b/src/main/java/com/inspect/simulator/service/impl/PatrolResultServiceImpl.java @@ -1,15 +1,20 @@ package com.inspect.simulator.service.impl; +import com.alibaba.nacos.client.config.common.GroupKey; import com.google.gson.Gson; import com.inspect.simulator.domain.result.PatrolResult; +import com.inspect.simulator.domain.result.PatrolUpdataLog; import com.inspect.simulator.domain.result.upper.*; import com.inspect.simulator.mapper.PatrolResultMapper; +import com.inspect.simulator.service.IPatrolUpdataLogService; import com.inspect.simulator.service.PatrolResultService; import com.inspect.simulator.service.remote.UpperRemoteService; import com.inspect.simulator.utils.DateUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import retrofit2.Call; @@ -20,18 +25,32 @@ import java.util.stream.Collectors; @Service public class PatrolResultServiceImpl implements PatrolResultService { + + @Value("${upper.stationCode:30000001-112967078}") + private String stationCode; + + @Value("${upper.provinceCode:330000}") + private String provinceCode; + + @Value("${upper.voltLevel:800}") + private String voltLevel; private static String token; private static final String MLLM_FILTER = "0"; private static final String FITLER_FILTER = "1"; + private static final Set VALID_RESULT_CODES = new HashSet<>(Arrays.asList("0", "1")); + private final Logger log = LoggerFactory.getLogger(this.getClass()); private final UpperRemoteService upperRemoteService; private final PatrolResultMapper patrolResultMapper; + @Autowired + private IPatrolUpdataLogService patrolUpdataLogService; + public PatrolResultServiceImpl(PatrolResultMapper patrolResultMapper, UpperRemoteService upperRemoteService) { this.patrolResultMapper = patrolResultMapper; this.upperRemoteService = upperRemoteService; @@ -83,7 +102,8 @@ public class PatrolResultServiceImpl implements PatrolResultService { log.info("[{}] [{}] sendPatrolResultToUpperSystem", threadId, execTime); // 查询当天的巡检结果 String createTimeStr = DateUtils.parseDateToStr("yyyy-MM-dd", date); -// createTimeStr = "2024-06-19"; + +// createTimeStr = "2025-03-27"; List patrolResults = patrolResultMapper.selectCurrentPatrolResultList(createTimeStr); if (patrolResults == null || patrolResults.size() <= 0) { log.info("[{}] [{}] sendPatrolResultToUpperSystem no data", threadId, execTime); @@ -91,7 +111,8 @@ public class PatrolResultServiceImpl implements PatrolResultService { } try { String token = getOrRefreshToken(false); - MessageBody messageBody = prepareMessageBody(patrolResults); + Set lineIds = new HashSet<>(); + MessageBody messageBody = prepareMessageBody(patrolResults, lineIds); MessageResult messageResult = messageNotify(token, messageBody); if (messageResult == null || !messageResult.getSuccess()) { @@ -100,11 +121,54 @@ public class PatrolResultServiceImpl implements PatrolResultService { messageResult = messageNotify(token, messageBody); } log.info("sendPatrolResultToUpperSystem messageResult: {}", messageResult); - if (messageResult != null && messageResult.getSuccess()) { + if (messageResult != null && messageResult.getSuccess() && lineIds.size() > 0) { // 成功则更新数据库中上送状态 - Set lineIds = patrolResults.stream().map(PatrolResult::getLineId).collect(Collectors.toSet()); int row = patrolResultMapper.updatePatrolResultUpStatus(lineIds); log.info("[{}] [{}] sendPatrolResultToUpperSystem updatePatrolResultUpStatus row:{}", threadId, execTime, row); + List samples = messageBody.getSamples(); + // 记录上送初筛正常的数据 + List filterDataList = samples.stream().filter(messageData -> "0".equals(messageData.getFitlerResultCode()) && StringUtils.isEmpty(messageData.getMllmResultCode())).collect(Collectors.toList()); + Map> staticFilterListMap = filterDataList.stream().collect(Collectors.groupingBy(p -> new GroupKeyStatic(p.getAlgorithmsType(), p.getFitlerResultCode()))); + Map staticFilterResultMap = new HashMap<>(); + for (Map.Entry> groupKeyStaticListEntry : staticFilterListMap.entrySet()) { + GroupKeyStatic groupKey = groupKeyStaticListEntry.getKey(); + List messageDatas = groupKeyStaticListEntry.getValue(); + staticFilterResultMap.put(groupKey, messageDatas.size()); + } + List updataLogs = new ArrayList<>(); + for (Map.Entry groupKeyStaticIntegerEntry : staticFilterResultMap.entrySet()) { + PatrolUpdataLog patrolUpdataLog = new PatrolUpdataLog(); + GroupKeyStatic groupKey = groupKeyStaticIntegerEntry.getKey(); + int count = groupKeyStaticIntegerEntry.getValue(); + patrolUpdataLog.setAlgorithmsType(groupKey.getAlgorithmsType()); + patrolUpdataLog.setResultCode(groupKey.getResultCode()); + patrolUpdataLog.setUpNum(String.valueOf(count)); + patrolUpdataLog.setCreateTime(date); + patrolUpdataLog.setFilter(FITLER_FILTER); + updataLogs.add(patrolUpdataLog); + } + // 记录初筛缺陷(大模型正常,缺陷)数据 + List mllmDataList = samples.stream().filter(messageData -> StringUtils.isNotEmpty(messageData.getMllmResultCode())).collect(Collectors.toList()); + Map> staticMllmListMap = mllmDataList.stream().collect(Collectors.groupingBy(p -> new GroupKeyStatic(p.getAlgorithmsType(), p.getMllmResultCode()))); + Map staticMllmResultMap = new HashMap<>(); + for (Map.Entry> groupKeyStaticListEntry : staticMllmListMap.entrySet()) { + GroupKeyStatic groupKey = groupKeyStaticListEntry.getKey(); + List messageDatas = groupKeyStaticListEntry.getValue(); + staticMllmResultMap.put(groupKey, messageDatas.size()); + } + for (Map.Entry groupKeyStaticIntegerEntry : staticMllmResultMap.entrySet()) { + PatrolUpdataLog patrolUpdataLog = new PatrolUpdataLog(); + GroupKeyStatic groupKey = groupKeyStaticIntegerEntry.getKey(); + int count = groupKeyStaticIntegerEntry.getValue(); + patrolUpdataLog.setAlgorithmsType(groupKey.getAlgorithmsType()); + patrolUpdataLog.setResultCode(groupKey.getResultCode()); + patrolUpdataLog.setUpNum(String.valueOf(count)); + patrolUpdataLog.setCreateTime(date); + patrolUpdataLog.setFilter(MLLM_FILTER); + updataLogs.add(patrolUpdataLog); + } + log.info("updataLogs size:{},updataLogs: {}", updataLogs.size(), updataLogs); + boolean b = patrolUpdataLogService.saveBatch(updataLogs); } else { log.error("[{}] [{}] sendPatrolResultToUpperSystem failed", threadId, execTime); } @@ -112,7 +176,6 @@ public class PatrolResultServiceImpl implements PatrolResultService { log.error("sendPatrolResultToUpperSystem Exception", e); } } - private String getOrRefreshToken(Boolean isTokenExpired) { if (token == null || isTokenExpired) { TokenParam tokenParam = new TokenParam(); @@ -139,32 +202,147 @@ public class PatrolResultServiceImpl implements PatrolResultService { return token; } - private MessageBody prepareMessageBody(List patrolResults) { + private MessageBody prepareMessageBody(List patrolResults, Set lineIds) { MessageBody messageBody = new MessageBody(); - messageBody.setProvinceCode("330000"); - messageBody.setStationCode("30000001-112967078"); - messageBody.setVoltLevel("800"); + // 绍兴站 +// messageBody.setProvinceCode("330000"); +// messageBody.setStationCode("30000001-112967078"); + // 灵州站 +// messageBody.setProvinceCode("640000"); +// messageBody.setStationCode("1cc010d8a78a598ccb52fb470301531cbff88e26c5"); +// messageBody.setVoltLevel("800"); + messageBody.setProvinceCode(provinceCode); + messageBody.setStationCode(stationCode); + messageBody.setVoltLevel(voltLevel); List samples = new ArrayList<>(); - for (PatrolResult patrolResult : patrolResults) { - MessageData sample = new MessageData(); - sample.setAreaName(patrolResult.getAreaName()); - sample.setDeviceName(patrolResult.getDeviceName()); - sample.setPointName(patrolResult.getDeviceName()); - sample.setTime(DateUtils.format(DateUtils.yyyyMMddHHmmss2, patrolResult.getCreateTime())); - sample.setAlgorithmsName(patrolResult.getAlgorithmsName()); - sample.setAlgorithmsType(patrolResult.getAlgorithmsType()); - sample.setSampleRaw(patrolResult.getFilePath()); - - sample.setFitlerDefect(FITLER_FILTER.equals(patrolResult.getFilter()) ? patrolResult.getResImgUrl() : ""); - sample.setMllmDefect(MLLM_FILTER.equals(patrolResult.getFilter()) ? patrolResult.getResImgUrl() : ""); - sample.setFitlerDiffBase(FITLER_FILTER.equals(patrolResult.getFilter()) ? patrolResult.getImageNormalUrlPath() : ""); - String resultType = StringUtils.isEmpty(patrolResult.getResultType()) ? patrolResult.getResultType() : ("1".equals(patrolResult.getResultType()) ? "0" : "1"); - sample.setFitlerResultCode(FITLER_FILTER.equals(patrolResult.getFilter()) ? resultType : ""); - sample.setMllmResultCode(MLLM_FILTER.equals(patrolResult.getFilter()) ? resultType : ""); - samples.add(sample); + if (patrolResults == null) { + return messageBody; } + Map> groupedResults = patrolResults.stream() + .collect(Collectors.groupingBy(p -> new GroupKey( + p.getLineId(), + p.getDeviceName(), + p.getCreateTime(), + p.getAlgorithmsType() + ))); + + groupedResults.forEach((key, group) -> { + MessageData sample = new MessageData(); + PatrolResult firstPr = group.get(0); + sample.setAreaName(firstPr.getAreaName()); + sample.setDeviceName(firstPr.getDeviceName()); + sample.setPointName(firstPr.getPointName()); + sample.setTime(DateUtils.format(DateUtils.yyyyMMddHHmmss2, firstPr.getCreateTime())); + sample.setSampleRaw(firstPr.getFilePath()); + sample.setAlgorithmsName(firstPr.getAlgorithmsName()); + sample.setAlgorithmsType(firstPr.getAlgorithmsType()); + + // 处理同一分组内的不同filter结果 + group.forEach(pr -> { + // result type是检测出来有缺陷的 0是缺陷 1是正常 2是异常(异常不算是缺陷比如图片抓拍失败为空算是异常,或者是大模型服务挂掉分析失败也是异常,这种的不算是缺陷) + String resultType = pr.getResultType(); + if (StringUtils.isNotEmpty(resultType)) { + if ("1".equals(pr.getResultType())) { + resultType = "0"; + } else if ("0".equals(pr.getResultType())) { + resultType = "1"; + } + } + String filter = pr.getFilter(); + + if (MLLM_FILTER.equals(filter)) { + sample.setMllmDefect(pr.getResImgUrl()); + sample.setMllmResultCode(resultType); + } else if (FITLER_FILTER.equals(filter)) { + sample.setFitlerDefect(pr.getResImgUrl()); + sample.setFitlerDiffBase(pr.getImageNormalUrlPath()); + sample.setFitlerResultCode(resultType); + } + }); + // 上传大模型正常0和缺陷1的图片,忽略异常的图片,初筛正常的图片(去掉表计识别) + if (isValidResultCode(sample.getMllmResultCode()) || ("0".equals(sample.getFitlerResultCode()) && StringUtils.isEmpty(sample.getMllmResultCode()))) { + samples.add(sample); + lineIds.add(firstPr.getLineId()); + } + }); messageBody.setSamples(samples); log.info("samples size: {},messageBody: {}", samples.size(), messageBody); return messageBody; } + + private boolean isValidResultCode(String resultCode) { + return VALID_RESULT_CODES.contains(resultCode); + } + + // 分组键,用于分组PatrolResult对象 + private static class GroupKey { + private final Long lineId; + private final String deviceName; + private final Date createTime; + private final String algorithmsType; + + public GroupKey(Long lineId, String deviceName, Date createTime, String algorithmsType) { + this.lineId = lineId; + this.deviceName = deviceName; + this.createTime = createTime; + this.algorithmsType = algorithmsType; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GroupKey groupKey = (GroupKey) o; + return Objects.equals(lineId, groupKey.lineId) && + Objects.equals(deviceName, groupKey.deviceName) && + Objects.equals(createTime, groupKey.createTime) && + Objects.equals(algorithmsType, groupKey.algorithmsType); + } + + @Override + public int hashCode() { + return Objects.hash(lineId, deviceName, createTime, algorithmsType); + } + } + + private static class GroupKeyStatic { + private final String algorithmsType; + private final String resultCode; + + public GroupKeyStatic(String algorithmsType, String resultCode) { + this.resultCode = resultCode; + this.algorithmsType = algorithmsType; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GroupKeyStatic groupKey = (GroupKeyStatic) o; + return Objects.equals(algorithmsType, groupKey.algorithmsType) && + Objects.equals(resultCode, groupKey.resultCode); + } + + @Override + public int hashCode() { + return Objects.hash(algorithmsType, resultCode); + } + + public String getAlgorithmsType() { + return algorithmsType; + } + + public String getResultCode() { + return resultCode; + } + + @Override + public String toString() { + return "GroupKeyStatic{" + + "algorithmsType='" + algorithmsType + '\'' + + ", resultCode='" + resultCode + '\'' + + '}'; + } + } + } diff --git a/src/main/java/com/inspect/simulator/service/impl/PatrolUpdataLogServiceImpl.java b/src/main/java/com/inspect/simulator/service/impl/PatrolUpdataLogServiceImpl.java new file mode 100644 index 0000000..b8ff4cb --- /dev/null +++ b/src/main/java/com/inspect/simulator/service/impl/PatrolUpdataLogServiceImpl.java @@ -0,0 +1,18 @@ +package com.inspect.simulator.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.inspect.simulator.domain.result.PatrolUpdataLog; +import com.inspect.simulator.mapper.PatrolUpdataLogMapper; +import com.inspect.simulator.service.IPatrolUpdataLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author WGY + * @create 2025-03-31 13:37 + **/ +@Service +@Slf4j +public class PatrolUpdataLogServiceImpl extends ServiceImpl implements IPatrolUpdataLogService { + +} diff --git a/src/main/resources/mapper/PatrolResultMapper.xml b/src/main/resources/mapper/PatrolResultMapper.xml index f046f57..6b7297e 100644 --- a/src/main/resources/mapper/PatrolResultMapper.xml +++ b/src/main/resources/mapper/PatrolResultMapper.xml @@ -767,8 +767,8 @@ resultType="com.inspect.simulator.domain.result.PatrolResult"> select f.line_id lineId, e.area_name areaName, - f.device_name deviceName, - f.device_name pointName, + c.device_name deviceName, + a.patrol_point_name pointName, f.create_time createTime, f.file_path filePath, bas.alg_subtype_name algorithmsName, @@ -779,12 +779,13 @@ ra.filter filter from patrol_result f left join basedata_patrolpoint a on f.device_id = a.patrol_point_id + left join basedata_device c on a.main_device_id = c.device_id left join basedata_area e on a.area_id = e.area_id left join result_analysis ra on f.line_id = ra.business_id and f.device_id = ra.objectId and f.task_patrolled_id = ra.task_patrol_id left join basedata_alg_subtype bas on bas.alg_subtype_code = ra.alg_type and find_in_set(bas.alg_subtype_id, a.alg_subtype_ids) where f.create_time between concat(#{createTimeStr}, ' 00:00:00') and concat(#{createTimeStr}, ' 23:59:59') - and f.check_time is null and ra.result_type != '1' + and f.check_time is null diff --git a/src/main/resources/mapper/PatrolUpdataLog.xml b/src/main/resources/mapper/PatrolUpdataLog.xml new file mode 100644 index 0000000..7740efc --- /dev/null +++ b/src/main/resources/mapper/PatrolUpdataLog.xml @@ -0,0 +1,7 @@ + + + + +