Browse Source

feat:盐源新版巡视报告,及自动归档,websocket推送

yanyuan
wangguangyuan 4 weeks ago
parent
commit
57e78d5c3f
19 changed files with 1647 additions and 44 deletions
  1. +1
    -0
      inspect-base/inspect-base-core/src/main/java/com/inspect/base/core/constant/RedisConst.java
  2. +1
    -1
      inspect-main/inspect-main-api/src/main/java/com/inspect/api/config/RabbitMQConfig.java
  3. +2
    -0
      inspect-main/inspect-main-api/src/main/java/com/inspect/api/domain/AlarmMessage.java
  4. +1
    -1
      inspect-main/inspect-main-start/src/main/java/com/inspect/InspectStartApplication.java
  5. +2
    -2
      inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/utils/ResultAnalysisUtils.java
  6. +7
    -2
      inspect-main/inspect-main-task/src/main/java/com/inspect/aspect/TaskStatusChangeAspect.java
  7. +3
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/img/domain/InspectionReportImg.java
  8. +5
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/insreportdata/domain/InspectionReportData.java
  9. +2
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/message/MessageUtils.java
  10. +34
    -28
      inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java
  11. +57
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/reportpush/config/ReportPushProperties.java
  12. +197
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/reportpush/service/ReportAutoArchiveService.java
  13. +130
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/reportpush/service/ReportPushService.java
  14. +1189
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/DonghuanReportExportController.java
  15. +1
    -1
      inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java
  16. +7
    -4
      inspect-main/inspect-main-task/src/main/java/com/inspect/taskstatus/service/impl/PatrolTaskStatusServiceImpl.java
  17. +4
    -2
      inspect-main/inspect-main-task/src/main/resources/mapper/task/InspectionReportDataMapper.xml
  18. +4
    -3
      inspect-main/inspect-main-task/src/main/resources/mapper/task/InspectionReportImgMapper.xml
  19. BIN
      inspect-main/inspect-main-task/src/main/resources/report/logo.png

+ 1
- 0
inspect-base/inspect-base-core/src/main/java/com/inspect/base/core/constant/RedisConst.java View File

@ -13,4 +13,5 @@ public class RedisConst {
public static final String TASK_RECORD_CNT = "TASK_RECORD_CNT";
public static final String TASK_CURRENT_CODE = "TASK_CURRENT_CODE@";
public static final String IMMEDIATELY_EXEC_TASK_TIME = "IMMEDIATELY_EXEC_TASK_TIME";
public static final String REPORT_PUSH_LOCK = "REPORT_PUSH_LOCK@";//任务完成自动归档+报告推送 防重锁
}

+ 1
- 1
inspect-main/inspect-main-api/src/main/java/com/inspect/api/config/RabbitMQConfig.java View File

@ -25,7 +25,7 @@ public class RabbitMQConfig {
@Bean
public Binding alarmBinding() {
return BindingBuilder.bind(alarmQueue()).to(alarmExchange()).with(YanyuanConstants.EXCHANGE);
return BindingBuilder.bind(alarmQueue()).to(alarmExchange()).with(YanyuanConstants.ROUTING_KEY);
}
@Bean


+ 2
- 0
inspect-main/inspect-main-api/src/main/java/com/inspect/api/domain/AlarmMessage.java View File

@ -6,6 +6,8 @@ import lombok.*;
@ToString
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AlarmMessage extends BaseEntity {
private String messageId;
private String messageType;


+ 1
- 1
inspect-main/inspect-main-start/src/main/java/com/inspect/InspectStartApplication.java View File

@ -18,7 +18,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableRyFeignClients
@EnableDiscoveryClient
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableAsync
public class InspectStartApplication {
private final static Logger log = LoggerFactory.getLogger(InspectStartApplication.class);


+ 2
- 2
inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/utils/ResultAnalysisUtils.java View File

@ -508,7 +508,7 @@ public class ResultAnalysisUtils {
if (!NumberUtils.isCreatable(val)) {
return val;
}
// 红外算法保留1位小数四舍五入
if (AlgConstants.ALG_INFRARED_LIST.contains(algType)) {
String formatted = BigDecimalUtil.toOneDecimal(val, 1);
return shouldAddUnit ? formatted + unit : formatted;
@ -521,7 +521,7 @@ public class ResultAnalysisUtils {
}
return val;
}
// 所有值都加单位如果有单位的话
return shouldAddUnit ? val + unit : val;
})
.collect(Collectors.joining(","));


+ 7
- 2
inspect-main/inspect-main-task/src/main/java/com/inspect/aspect/TaskStatusChangeAspect.java View File

@ -1,6 +1,7 @@
package com.inspect.aspect;
import com.inspect.annotation.TaskStatusChange;
import com.inspect.reportpush.service.ReportAutoArchiveService;
import com.inspect.task.service.IPatrolTaskService;
import com.inspect.taskstatus.domain.PatrolTaskStatus;
import lombok.extern.slf4j.Slf4j;
@ -18,6 +19,9 @@ public class TaskStatusChangeAspect {
@Autowired
private IPatrolTaskService patrolTaskService;
@Autowired
private ReportAutoArchiveService reportAutoArchiveService;
/**
* 拦截带有 @TaskStatusChange 注解的方法
@ -46,8 +50,9 @@ public class TaskStatusChangeAspect {
// 执行切面逻辑
if (taskStatusChange.async()) {
log.info("异步执行区域任务合并报告,任务执行id: {}", taskStatus.getTaskPatrolledId());
patrolTaskService.executeAsync(taskStatus);
log.info("异步执行自动归档,任务执行id: {}", taskStatus.getTaskPatrolledId());
// 任务巡检完成自动归档 + 生成报告 + websocket 推送盐源外部平台
reportAutoArchiveService.onTaskCompleted(taskStatus);
} else {
executeSync(taskStatus);
}


+ 3
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/img/domain/InspectionReportImg.java View File

@ -28,6 +28,9 @@ public class InspectionReportImg extends BaseEntity {
name = "缩略图路径"
)
private String imgSrc;
private String imageNormalUrlPath;
@JsonFormat(
pattern = "yyyy-MM-dd"
)


+ 5
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/insreportdata/domain/InspectionReportData.java View File

@ -58,6 +58,11 @@ public class InspectionReportData extends BaseEntity {
name = "巡视结果"
)
private String inspectionResults;
@Excel(
name = "巡视读数"
)
private String inspectionValue;
@Excel(
name = "点位状态:正常、异常、待人工确 认三种状态"
)


+ 2
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/message/MessageUtils.java View File

@ -235,6 +235,8 @@ public class MessageUtils {
return "summary";
case "缺陷":
return "defect";
case "本次巡检未发现缺陷项":
return "No defects were found during this inspection.";
case"分析失败":
return "analysis failed";
default:


+ 34
- 28
inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java View File

@ -1321,31 +1321,33 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
reportData.setTaskName(resultTaskName);
reportData.setTaskPatrolledId(taskPatrolledId);
reportData.setTaskResultId(String.valueOf(mainId));
if ("1".equals(patrolResultRef.getResultType()) && validAlgTypes.contains(patrolResultRef.getAlgType())) {
reportData.setInspectionResults(patrolResultRef.getValue());
} else {
reportData.setInspectionResults(patrolResultRef.getDescription());
}
// if ("1".equals(patrolResultRef.getResultType()) && validAlgTypes.contains(patrolResultRef.getAlgType())) {
// reportData.setInspectionResults(patrolResultRef.getValue());
// } else {
// reportData.setInspectionResults(patrolResultRef.getDescription());
// }
reportData.setInspectionResults(patrolResultRef.getDescription());
reportData.setInspectionValue(patrolResultRef.getValue());
reportData.setAlgName(patrolResultRef.getAlgName());
String threshold = patrolResultRef.getThreshold();
if (StringUtils.isBlank(threshold)) {
threshold = "";
}
if ("1".equals(patrolResultRef.getResultType()) && threshold.contains("sub_53")) {
reportData.setInspectionResults(patrolResultRef.getValue());
}
if ("1".equals(patrolResultRef.getResultType()) && (threshold.contains("sub_52") || threshold.contains("sub_53"))
&& !"0".equals(patrolResultRef.getValue())
&& !"1".equals(patrolResultRef.getValue())
&& !"-1".equals(patrolResultRef.getValue())
&& !"check image".equals(patrolResultRef.getValue())) {
reportData.setInspectionResults(patrolResultRef.getValue());
}
// String threshold = patrolResultRef.getThreshold();
// if (StringUtils.isBlank(threshold)) {
// threshold = "";
// }
// if ("1".equals(patrolResultRef.getResultType()) && threshold.contains("sub_53")) {
// reportData.setInspectionResults(patrolResultRef.getValue());
// }
//
// if ("1".equals(patrolResultRef.getResultType()) && (threshold.contains("sub_52") || threshold.contains("sub_53"))
// && !"0".equals(patrolResultRef.getValue())
// && !"1".equals(patrolResultRef.getValue())
// && !"-1".equals(patrolResultRef.getValue())
// && !"check image".equals(patrolResultRef.getValue())) {
// reportData.setInspectionResults(patrolResultRef.getValue());
// }
// 给读数增加单位
String resValue = resultAnalysisUtils.addUnit2Value(reportData.getInspectionResults(), patrolResultRef.getAlgType(), patrolResultRef.getUnit());
reportData.setInspectionResults(resValue);
String resValue = resultAnalysisUtils.addUnit2Value(reportData.getInspectionValue(), patrolResultRef.getAlgType(), patrolResultRef.getUnit());
reportData.setInspectionValue(resValue);
String pointStatus = patrolResultRef.getPointStatus();
String resultType = patrolResultRef.getResultType();
@ -1395,16 +1397,20 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
//List<resultList> results = JSONObject.parseObject(resultContent).getJSONArray("resultList").toJavaList(resultList.class);
//String imgUrl = results.get(0).getResults().get(0).getResImageUrl();
AnalyseResPoint analyseResPoint = JSONObject.parseObject(resultContent, AnalyseResPoint.class);
String imgUrl = analyseResPoint.getResImageUrl();
String resImageUrl = analyseResPoint.getResImageUrl();
String imageNormalUrlPath = analyseResPoint.getImageNormalUrlPath();
if (StringUtils.isEmpty(imgUrl)) {
imgUrl = patrolResultRef.getFilePath().split(StringUtils.COMMA)[0];
if (StringUtils.isEmpty(resImageUrl)) {
resImageUrl = patrolResultRef.getFilePath().split(StringUtils.COMMA)[0];
}
if (StringUtils.isEmpty(imageNormalUrlPath)) {
imageNormalUrlPath = patrolResultRef.getFilePath().split(StringUtils.COMMA)[0];
}
InspectionReportImg reportImg = new InspectionReportImg();
reportImg.setReportInfoId(reportDataId);
reportImg.setImg(imgUrl);
reportImg.setImgSrc(imgUrl);
reportImg.setImg(resImageUrl);
reportImg.setImgSrc(patrolResultRef.getFilePath().split(StringUtils.COMMA)[0]);
reportImg.setImageNormalUrlPath(imageNormalUrlPath);
reportImg.setImgType("0");
reportImg.setCreatTime(new Date());
reportImages.add(reportImg);


+ 57
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/reportpush/config/ReportPushProperties.java View File

@ -0,0 +1,57 @@
package com.inspect.reportpush.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 任务巡检完成自动归档 + 生成报告 + websocket 推送配置
* <p>
* 对应 application.yml {@code inspect.report-push.*} 配置块
* 可在 nacos 配置中心按现场覆盖
*
* @author inspect
*/
@Data
@Component
@ConfigurationProperties(prefix = "inspect.report-push")
public class ReportPushProperties {
/** 是否启用自动归档 + 推送 */
private boolean enabled = true;
// /** 外部平台网关基础路径(/ext_auth/getAuthToken 获取 Joinbright-Token) */
// private String baseUrl;
//
// /** 外部平台 websocket 地址 */
// private String wsUrl;
//
// /** 认证凭据(现场提供) */
// private String clientId;
//
// private String clientSecret;
//
// /** token 缓存时长(秒) */
// private long tokenCacheSeconds = 7200;
//
// /** websocket 连接超时(秒) */
// private int connectTimeoutSeconds = 10;
//
// /** 发送后等待时间(毫秒) */
// private long sendWaitMillis = 500;
/** 自动归档审核人 */
private String checkPerson = "admin";
/** 自动归档巡视结论 */
private String taskResult = "巡检完成,自动归档";
/** 无缺陷数据时是否仍归档(false: 与手动归档一致,无缺陷不归档) */
private boolean archiveWithoutDefect = false;
/** 任务状态更新事务提交等待时间(毫秒) */
private long afterCommitDelayMillis = 2000;
/** 归档防重锁过期时间(秒) */
private long lockExpireSeconds = 86400;
}

+ 197
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/reportpush/service/ReportAutoArchiveService.java View File

@ -0,0 +1,197 @@
package com.inspect.reportpush.service;
import com.inspect.base.core.constant.RedisConst;
import com.inspect.base.core.enums.TaskStatus;
import com.inspect.base.core.enums.TaskType;
import com.inspect.base.core.utils.StringUtils;
import com.inspect.base.redis.service.RedisService;
import com.inspect.analysis.domain.ResultAnalysis;
import com.inspect.analysis.service.IResultAnalysisService;
import com.inspect.reportpush.config.ReportPushProperties;
import com.inspect.resultmain.controller.DonghuanReportExportController;
import com.inspect.resultmain.domain.PatrolTaskResultMain;
import com.inspect.resultmain.service.IPatrolTaskResultMainService;
import com.inspect.taskstatus.domain.PatrolTaskStatus;
import com.inspect.taskstatus.service.IPatrolTaskStatusService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 任务巡检完成 自动归档 + 生成报告动环 Word websocket 推送
* <p>
* {@code TaskStatusChangeAspect} 在任务状态变更为已完成(1)时异步触发
* 仅处理主任务/普通任务子任务由主任务统一归档
* 通过 Redis 防重锁避免重复归档
*
* @author inspect
*/
@Slf4j
@Service
public class ReportAutoArchiveService {
private final ReportPushProperties properties;
private final RedisService redisService;
private final IPatrolTaskStatusService patrolTaskStatusService;
private final IPatrolTaskResultMainService patrolTaskResultMainService;
private final IResultAnalysisService resultAnalysisService;
private final DonghuanReportExportController donghuanReportExportController;
public ReportAutoArchiveService(ReportPushProperties properties,
RedisService redisService,
IPatrolTaskStatusService patrolTaskStatusService,
IPatrolTaskResultMainService patrolTaskResultMainService,
IResultAnalysisService resultAnalysisService,
DonghuanReportExportController donghuanReportExportController) {
this.properties = properties;
this.redisService = redisService;
this.patrolTaskStatusService = patrolTaskStatusService;
this.patrolTaskResultMainService = patrolTaskResultMainService;
this.resultAnalysisService = resultAnalysisService;
this.donghuanReportExportController = donghuanReportExportController;
}
/**
* 任务状态变更为已完成时触发异步
*
* @param taskStatus 变更后的任务状态切面入参
*/
@Async
public void onTaskCompleted(PatrolTaskStatus taskStatus) {
try {
if (!properties.isEnabled()) {
log.info("[AUTO_ARCHIVE] 未启用 inspect.report-push.enabled,跳过自动归档: taskPatrolledId={}",
taskStatus == null ? null : taskStatus.getTaskPatrolledId());
return;
}
if (taskStatus == null || StringUtils.isEmpty(taskStatus.getTaskPatrolledId())) {
log.warn("[AUTO_ARCHIVE] 任务状态参数为空,跳过自动归档");
return;
}
// 子任务不单独归档由主任务统一归档
if (TaskType.SUB.getCode().equals(taskStatus.getTaskType())) {
log.debug("[AUTO_ARCHIVE] 子任务不触发归档: {}", taskStatus.getTaskPatrolledId());
return;
}
// 归档单元主任务联合任务或普通任务自身
PatrolTaskStatus mainTask = patrolTaskStatusService.selectPatrolTaskStatusMain(taskStatus.getTaskPatrolledId());
String archiveTaskPatrolledId = mainTask != null
? mainTask.getTaskPatrolledId() : taskStatus.getTaskPatrolledId();
if (StringUtils.isEmpty(archiveTaskPatrolledId)) {
log.warn("[AUTO_ARCHIVE] 无法确定归档任务ID,跳过: {}", taskStatus.getTaskPatrolledId());
return;
}
// 防重锁同一归档单元只允许一次自动归档
String lockKey = RedisConst.REPORT_PUSH_LOCK + archiveTaskPatrolledId;
Boolean locked = redisService.redisTemplate.opsForValue()
.setIfAbsent(lockKey, archiveTaskPatrolledId,
properties.getLockExpireSeconds(), TimeUnit.SECONDS);
if (!Boolean.TRUE.equals(locked)) {
log.info("[AUTO_ARCHIVE] 任务 {} 已在归档/推送中(防重锁),跳过", archiveTaskPatrolledId);
return;
}
log.info("[AUTO_ARCHIVE] 获取归档防重锁: {}", lockKey);
// 等待任务状态事务提交结果数据落库
long waitMillis = properties.getAfterCommitDelayMillis();
if (waitMillis > 0) {
try {
Thread.sleep(waitMillis);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
releaseLock(lockKey);
return;
}
}
// 二次校验任务仍为已完成状态
PatrolTaskStatus freshTask = patrolTaskStatusService.selectPatrolTaskStatusByTaskPatrolledId(archiveTaskPatrolledId);
if (freshTask == null || !TaskStatus.DONE.getCode().equals(freshTask.getTaskState())) {
log.info("[AUTO_ARCHIVE] 任务 {} 当前状态 {},非已完成,跳过自动归档",
archiveTaskPatrolledId, freshTask == null ? "null" : freshTask.getTaskState());
releaseLock(lockKey);
return;
}
// 二次校验已归档file_status=1的任务不重复归档
PatrolTaskResultMain existMain = patrolTaskResultMainService
.selectPatrolTaskResultMainByTaskPatrolledId(archiveTaskPatrolledId);
if (existMain != null && "1".equals(existMain.getFileStatus())) {
log.info("[AUTO_ARCHIVE] 任务 {} 已归档(fileStatus=1),跳过", archiveTaskPatrolledId);
releaseLock(lockKey);
return;
}
// 归档范围主任务 + 其下所有子任务联合任务
List<String> taskPatrolledIds = new ArrayList<>();
taskPatrolledIds.add(archiveTaskPatrolledId);
List<PatrolTaskStatus> subTasks = patrolTaskStatusService.selectPatrolTaskStatusListByMainId(archiveTaskPatrolledId);
if (subTasks != null) {
for (PatrolTaskStatus subTask : subTasks) {
if (StringUtils.isNotEmpty(subTask.getTaskPatrolledId())) {
taskPatrolledIds.add(subTask.getTaskPatrolledId());
}
}
}
// 无缺陷不归档与手动归档一致
// if (!properties.isArchiveWithoutDefect() && !hasDefect(taskPatrolledIds)) {
// log.info("[AUTO_ARCHIVE] 任务 {} 无缺陷数据,不归档(archive-without-defect=false)", archiveTaskPatrolledId);
// releaseLock(lockKey);
// return;
// }
// 触发归档动环 Word 报告报告生成后由 exportDonghuanReport 回调推送
PatrolTaskResultMain resultMain = new PatrolTaskResultMain();
resultMain.setTaskPatrolledIds(taskPatrolledIds);
resultMain.setCheckPerson(properties.getCheckPerson());
resultMain.setTaskResult(properties.getTaskResult());
log.info("[AUTO_ARCHIVE] 触发自动归档: taskPatrolledIds={}, checkPerson={}, taskResult={}",
taskPatrolledIds, resultMain.getCheckPerson(), resultMain.getTaskResult());
donghuanReportExportController.updateInfo_donghuan(resultMain);
} catch (Exception e) {
log.error("[AUTO_ARCHIVE] 自动归档异常: taskPatrolledId={}",
taskStatus == null ? null : taskStatus.getTaskPatrolledId(), e);
}
}
/**
* 校验任务含子任务是否存在缺陷数据初筛缺陷 + 大模型缺陷
*/
private boolean hasDefect(List<String> taskPatrolledIds) {
try {
Map<String, ResultAnalysis> abnormalMap = resultAnalysisService.selectTaskAbnormalDataBatch(taskPatrolledIds);
if (abnormalMap == null || abnormalMap.isEmpty()) {
return false;
}
int csQxNum = 0, aiQxNum = 0;
for (ResultAnalysis analysis : abnormalMap.values()) {
if (analysis == null) {
continue;
}
csQxNum += analysis.getCsQxNum();
aiQxNum += analysis.getAiQxNum();
}
return csQxNum + aiQxNum > 0;
} catch (Exception e) {
log.error("[AUTO_ARCHIVE] 查询缺陷数据异常,按存在缺陷处理: taskPatrolledIds={}", taskPatrolledIds, e);
return true;
}
}
private void releaseLock(String lockKey) {
try {
redisService.deleteObject(lockKey);
} catch (Exception e) {
log.warn("[AUTO_ARCHIVE] 释放防重锁失败: {}", lockKey, e);
}
}
}

+ 130
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/reportpush/service/ReportPushService.java View File

@ -0,0 +1,130 @@
package com.inspect.reportpush.service;
import com.alibaba.fastjson.JSONObject;
import com.inspect.api.domain.AlarmMessage;
import com.inspect.api.enums.MessageType;
import com.inspect.api.enums.SystemCode;
import com.inspect.api.service.AlarmPublisher;
import com.inspect.insreport.domain.InspectionReport;
import com.inspect.insreportdata.domain.InspectionReportData;
import com.inspect.message.MessageUtils;
import com.inspect.reportpush.config.ReportPushProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.UUID;
/**
* 巡检报告 websocket 推送
* <p>
* 报告归档Word生成完毕后组装 report_push 消息沿用 AlarmMessage 结构
* 通过 {@link AlarmPublisher} 发布到 alarm.exchange
* inspect-main-api AlarmConsumer {@code AlarmWsConnection} 推送到外部平台
* ws:///jb-base-socket?Joinbright-Token=
*
* @author inspect
*/
@Slf4j
@Service
public class ReportPushService {
private static final DateTimeFormatter TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private final ReportPushProperties properties;
private final AlarmPublisher alarmPublisher;
private final MessageUtils messageUtils;
@Autowired
public ReportPushService(ReportPushProperties properties,
AlarmPublisher alarmPublisher,
MessageUtils messageUtils) {
this.properties = properties;
this.alarmPublisher = alarmPublisher;
this.messageUtils = messageUtils;
}
/**
* 报告生成并上传完成后推送自动归档与手动归档均会触发
*
* @param report 已保存 filePath 的巡检报告
*/
public void pushReport(InspectionReport report) {
if (report == null) {
return;
}
if (!properties.isEnabled()) {
log.info("[REPORT_PUSH] 未启用 report-push 配置,跳过报告推送: reportId={}", report.getLineId());
return;
}
try {
AlarmMessage message = AlarmMessage.builder()
.messageId(UUID.randomUUID().toString().replace("-", ""))
.messageType(MessageType.REPORT.getCode())
.timestamp(LocalDateTime.now().format(TIME_FORMATTER))
.systemCode(SystemCode.PATROL.getCode())
.data(buildReportData(report))
.build();
alarmPublisher.publish(message);
log.info("[REPORT_PUSH] 报告推送消息已发布: reportId={}, taskName={}, filePath={}",
report.getLineId(), report.getInspectionTaskName(), report.getFilePath());
} catch (Exception e) {
log.error("[REPORT_PUSH] 报告推送失败: reportId={}", report.getLineId(), e);
}
}
/**
* 组装推送 data 载荷报告基本信息 + 状态统计
*/
private JSONObject buildReportData(InspectionReport report) {
JSONObject data = new JSONObject();
data.put("reportId", report.getLineId());
data.put("reportName", report.getInspectionTaskName());
data.put("filePath", report.getFilePath());
data.put("taskId", report.getTaskId());
data.put("taskPatrolledId", report.getTaskPatrolledId());
data.put("stationName", report.getStationName());
data.put("areaName", report.getAreaName());
data.put("checkPerson", report.getCheckPerson());
data.put("description", report.getDescription());
if (report.getInspectionStartTime() != null) {
data.put("inspectionStartTime", TIME_FORMATTER.format(
LocalDateTime.ofInstant(report.getInspectionStartTime().toInstant(),
java.time.ZoneId.systemDefault())));
}
if (report.getInspectionEndTime() != null) {
data.put("inspectionEndTime", TIME_FORMATTER.format(
LocalDateTime.ofInstant(report.getInspectionEndTime().toInstant(),
java.time.ZoneId.systemDefault())));
}
// 状态统计
String defect = messageUtils.get("缺陷");
String abnormal = messageUtils.get("异常");
String normal = messageUtils.get("正常");
int defectCount = 0, abnormalCount = 0, normalCount = 0, total = 0;
List<InspectionReportData> dataList = report.getReportDatalist();
if (!CollectionUtils.isEmpty(dataList)) {
for (InspectionReportData item : dataList) {
total++;
String status = item.getPointStatus();
if (defect.equals(status)) {
defectCount++;
} else if (abnormal.equals(status)) {
abnormalCount++;
} else if (normal.equals(status)) {
normalCount++;
}
}
}
data.put("totalCount", total);
data.put("defectCount", defectCount);
data.put("abnormalCount", abnormalCount);
data.put("normalCount", normalCount);
return data;
}
}

+ 1189
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/DonghuanReportExportController.java
File diff suppressed because it is too large
View File


+ 1
- 1
inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java View File

@ -263,7 +263,7 @@ public class PatrolTaskResultMainController extends BaseController {
}
@PostMapping({"/updateInfo_shaoxing"})
@PostMapping({"/updateInfo_shaoxing1"})
public AjaxResult updateInfo_shaoxing(
@RequestBody PatrolTaskResultMain resultMain) {
long startTime = System.currentTimeMillis();


+ 7
- 4
inspect-main/inspect-main-task/src/main/java/com/inspect/taskstatus/service/impl/PatrolTaskStatusServiceImpl.java View File

@ -22,6 +22,7 @@ import com.inspect.taskstatus.mapper.PatrolTaskStatusMapper;
import com.inspect.taskstatus.service.IPatrolTaskStatusService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -102,6 +103,7 @@ public class PatrolTaskStatusServiceImpl implements IPatrolTaskStatusService {
return this.patrolTaskStatusMapper.updatePatrolTaskStatusOfTaskState(patrolTaskStatus);
}
@TaskStatusChange(targetState = "1", async = true) // "1"表示已完成状态
public int updatePatrolTaskStatusOfTaskStateAndEndTime(PatrolTaskStatus patrolTaskStatus) {
return this.patrolTaskStatusMapper.updatePatrolTaskStatusOfTaskStateAndEndTime(patrolTaskStatus);
}
@ -119,6 +121,7 @@ public class PatrolTaskStatusServiceImpl implements IPatrolTaskStatusService {
}
@Override
@TaskStatusChange(targetState = "1", async = true) // "1"表示已完成状态
public int insertIgnorePatrolTaskStatus(PatrolTaskStatus patrolTaskStatusMain) {
return this.patrolTaskStatusMapper.insertIgnorePatrolTaskStatus(patrolTaskStatusMain);
}
@ -158,8 +161,8 @@ public class PatrolTaskStatusServiceImpl implements IPatrolTaskStatusService {
patrolTaskStatus.setTaskState(state);
setNormalTaskStatus(patrolTaskStatus);
// 更新子任务或普通任务
updatePatrolTaskStatus(patrolTaskStatus);
// 更新子任务或普通任务走代理调用确保 @TaskStatusChange 切面在状态变为完成时触发
((IPatrolTaskStatusService) AopContext.currentProxy()).updatePatrolTaskStatus(patrolTaskStatus);
log.info("updateTaskProgress: {}", patrolTaskStatus);
// 如果是子任务需要同步更新主任务
if (TaskType.SUB.getCode().equals(patrolTaskStatus.getTaskType()) && patrolTaskStatus.getMainId() != null) {
@ -239,8 +242,8 @@ public class PatrolTaskStatusServiceImpl implements IPatrolTaskStatusService {
mainTask.setTaskEstimatedTime(mainAlgorithmProgress.toString());
setNormalTaskStatus(mainTask);
// 更新主任务
patrolTaskStatusMapper.updatePatrolTaskStatus(mainTask);
// 更新主任务走代理调用确保 @TaskStatusChange 切面在联合任务完成时触发
((IPatrolTaskStatusService) AopContext.currentProxy()).updatePatrolTaskStatus(mainTask);
}
// 生成巡视归档记录


+ 4
- 2
inspect-main/inspect-main-task/src/main/resources/mapper/task/InspectionReportDataMapper.xml View File

@ -15,6 +15,7 @@
<result property="dataSources" column="data_sources"/>
<result property="acquisitionTime" column="acquisition_time"/>
<result property="inspectionResults" column="inspection_results"/>
<result property="inspectionValue" column="inspection_value"/>
<result property="pointStatus" column="point_status"/>
<result property="inspectionImg" column="inspection_img"/>
<result property="reportId" column="report_id"/>
@ -36,6 +37,7 @@
data_sources,
acquisition_time,
inspection_results,
inspection_value,
point_status,
inspection_img,
alg_name,
@ -164,11 +166,11 @@
</delete>
<insert id="batchInsertInspectionReportData" parameterType="java.util.List">
insert into inspection_report_data
(line_id,code,report_id,area,time_interval,eq_name,parts,point_name,data_sources,acquisition_time,inspection_results,point_status,inspection_img,alg_name,task_name,task_patrolled_id,task_result_id)
(line_id,code,report_id,area,time_interval,eq_name,parts,point_name,data_sources,acquisition_time,inspection_results,inspection_value,point_status,inspection_img,alg_name,task_name,task_patrolled_id,task_result_id)
values
<foreach collection="list" item="t" index="index" separator=",">
(#{t.lineId}, #{t.code}, #{t.reportId}, #{t.area}, #{t.timeInterval}, #{t.eqName}, #{t.parts},
#{t.pointName},#{t.dataSources},#{t.acquisitionTime},#{t.inspectionResults},#{t.pointStatus},#{t.inspectionImg},#{t.algName},#{t.taskName},#{t.taskPatrolledId},#{t.taskResultId})
#{t.pointName},#{t.dataSources},#{t.acquisitionTime},#{t.inspectionResults},#{t.inspectionValue},#{t.pointStatus},#{t.inspectionImg},#{t.algName},#{t.taskName},#{t.taskPatrolledId},#{t.taskResultId})
</foreach>
</insert>
</mapper>

+ 4
- 3
inspect-main/inspect-main-task/src/main/resources/mapper/task/InspectionReportImgMapper.xml View File

@ -9,12 +9,13 @@
<result property="reportInfoId" column="report_info_id"/>
<result property="img" column="img"/>
<result property="imgSrc" column="img_src"/>
<result property="imageNormalUrlPath" column="image_normal_url_path"/>
<result property="creatTime" column="creat_time"/>
<result property="imgType" column="img_type"/>
</resultMap>
<sql id="selectInspectionReportImgVo">
select line_id, report_info_id, img, img_src, creat_time, img_type
select line_id, report_info_id, img, img_src, image_normal_url_path, creat_time, img_type
from inspection_report_img
</sql>
@ -87,9 +88,9 @@
</foreach>
</delete>
<insert id="batchInsertInspectionReportImg" parameterType="java.util.List">
insert into inspection_report_img (line_id, report_info_id, img, img_src, creat_time, img_type) values
insert into inspection_report_img (line_id, report_info_id, img, img_src, image_normal_url_path, creat_time, img_type) values
<foreach collection="list" item="t" index="index" separator=",">
(#{t.lineId}, #{t.reportInfoId}, #{t.img}, #{t.imgSrc}, #{t.creatTime}, #{t.imgType})
(#{t.lineId}, #{t.reportInfoId}, #{t.img}, #{t.imgSrc}, #{t.imageNormalUrlPath}, #{t.creatTime}, #{t.imgType})
</foreach>
</insert>
</mapper>

BIN
inspect-main/inspect-main-task/src/main/resources/report/logo.png View File

Before After
Width: 406  |  Height: 68  |  Size: 15 KiB

Loading…
Cancel
Save