From f20630786ac5ea77d7aba44c4547b84b946577f1 Mon Sep 17 00:00:00 2001 From: stream Date: Mon, 9 Feb 2026 14:16:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=A1=B9=E7=9B=AE=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evaluation/AeEvaluationController.java | 5 +- .../evaluation/model/domain/AeEvaluation.java | 5 +- .../evaluation/service/AeCallbackService.java | 11 +++ .../service/ExViProjectService.java | 14 ++++ .../service/IAeEvaluationService.java | 10 ++- .../service/impl/AeCallbackServiceImpl.java | 78 +++++++++++++++++++ .../service/impl/AeEvaluationServiceImpl.java | 78 +++++++------------ .../dispatcher/FlowEndNodeHandler.java | 2 + .../com/cmvr/vi/model/domain/ViProject.java | 2 +- .../vi/service/ex/ExViProjectServiceImpl.java | 32 ++++++++ .../vi/service/impl/ViProjectServiceImpl.java | 12 +-- 11 files changed, 188 insertions(+), 61 deletions(-) create mode 100644 cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/AeCallbackService.java create mode 100644 cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/ExViProjectService.java create mode 100644 cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeCallbackServiceImpl.java create mode 100644 cmvr-iot-vi/src/main/java/com/cmvr/vi/service/ex/ExViProjectServiceImpl.java diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/evaluation/AeEvaluationController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/evaluation/AeEvaluationController.java index 11ee75d..e431842 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/evaluation/AeEvaluationController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/evaluation/AeEvaluationController.java @@ -3,6 +3,7 @@ package com.cmvr.web.controller.evaluation; import com.cmvr.common.core.controller.BaseController; import com.cmvr.common.core.domain.AjaxResult; import com.cmvr.evaluation.model.domain.AeEvaluation; +import com.cmvr.evaluation.service.AeCallbackService; import com.cmvr.evaluation.service.IAeEvaluationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -18,13 +19,13 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class AeEvaluationController extends BaseController { - private final IAeEvaluationService aeEvaluationService; + private final AeCallbackService aeCallbackService; @ApiOperation("回调AI评估") @PostMapping("/callback") public AjaxResult list(@RequestBody AeEvaluation aeEvaluation) { - aeEvaluationService.callback(aeEvaluation); + aeCallbackService.callback(aeEvaluation); return AjaxResult.ok(); } diff --git a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/model/domain/AeEvaluation.java b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/model/domain/AeEvaluation.java index 930bbce..4ed7710 100644 --- a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/model/domain/AeEvaluation.java +++ b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/model/domain/AeEvaluation.java @@ -25,6 +25,9 @@ public class AeEvaluation implements Serializable { @ApiModelProperty("流程实例ID") private String instId; + @ApiModelProperty("项目ID") + private String taskId; + @ApiModelProperty("检测项ID") private String itemId; @@ -37,7 +40,7 @@ public class AeEvaluation implements Serializable { @ApiModelProperty("视频地址") private String videoPath; - @ApiModelProperty("评估状态,0:待评估,1:评估中,3:评估成功,4:评估失败") + @ApiModelProperty("评估状态,0:待评估,1:评估中,2:评估成功,3:评估失败") private Integer status; @ApiModelProperty("评估最终结果(JSON)") diff --git a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/AeCallbackService.java b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/AeCallbackService.java new file mode 100644 index 0000000..39200a5 --- /dev/null +++ b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/AeCallbackService.java @@ -0,0 +1,11 @@ +package com.cmvr.evaluation.service; + +import com.cmvr.evaluation.model.domain.AeEvaluation; + +/** + * 评估回写服务(防止依赖循环) + */ +public interface AeCallbackService { + + public void callback(AeEvaluation aeEvaluation); +} diff --git a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/ExViProjectService.java b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/ExViProjectService.java new file mode 100644 index 0000000..e857cba --- /dev/null +++ b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/ExViProjectService.java @@ -0,0 +1,14 @@ +package com.cmvr.evaluation.service; + +import com.alibaba.fastjson2.JSONObject; + +public interface ExViProjectService { + + public JSONObject queryById(String id); + + /** + * 评估完成回写项目状态 + */ + public boolean updateStatus(String id); + +} diff --git a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/IAeEvaluationService.java b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/IAeEvaluationService.java index e32a1f3..1736dcd 100644 --- a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/IAeEvaluationService.java +++ b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/IAeEvaluationService.java @@ -12,10 +12,12 @@ public interface IAeEvaluationService extends IService { */ public void executeEvaluation(AeEvaluation evaluation); - /** - * 评估回调 - */ - void callback(AeEvaluation aeEvaluation); + public void runEvaluation(AeEvaluation evaluation); List queryEvaluation(String instId); + + /** + * 判断当前项目是否已完成全部评估 + */ + public boolean isAllEvaluationsFinished(String instId); } diff --git a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeCallbackServiceImpl.java b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeCallbackServiceImpl.java new file mode 100644 index 0000000..4a2945b --- /dev/null +++ b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeCallbackServiceImpl.java @@ -0,0 +1,78 @@ +package com.cmvr.evaluation.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cmvr.common.exception.GlobalException; +import com.cmvr.evaluation.model.domain.AeEvaluation; +import com.cmvr.evaluation.service.AeCallbackService; +import com.cmvr.evaluation.service.ExViProjectService; +import com.cmvr.evaluation.service.IAeEvaluationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Objects; + + +@Slf4j +@Service +@RequiredArgsConstructor +public class AeCallbackServiceImpl implements AeCallbackService { + + private final IAeEvaluationService aeEvaluationService; + private final ExViProjectService exViProjectService; + private final StringRedisTemplate redisTemplate; + + @Override + public void callback(AeEvaluation aeEvaluation) { + String aeId = aeEvaluation.getAeId(); + if (StrUtil.isEmpty(aeId)) { + throw new GlobalException("AI评估ID不能为空!"); + } + String result = aeEvaluation.getResult(); + if (StrUtil.isEmpty(result)) { + throw new GlobalException("AI评估结果不能为空!"); + } + AeEvaluation byId = aeEvaluationService.getById(aeId); + if (Objects.isNull(byId)) { + log.error("ID为 {} 的评估对象不存在!", aeId); + } + JSONObject jsonObject = JSON.parseObject(result); + String overallResult = jsonObject.getString("overall_result"); + int status; + if (StrUtil.isNotEmpty(overallResult) && overallResult.equals("成功")) { + status = 3; + } else { + status = 4; + } + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(AeEvaluation::getAeId, aeId) + .set(AeEvaluation::getResult, result) + .set(AeEvaluation::getStatus, status); // 评估完成/失败 + + aeEvaluationService.update(wrapper); + + // 判断是否是最后一次评估 更改项目状态 + boolean finished = aeEvaluationService.isAllEvaluationsFinished(byId.getInstId()); + if (finished) { + exViProjectService.updateStatus(byId.getTaskId()); + } + + // 继续下一个评估 + String str = redisTemplate.opsForList().leftPop("ae:evaluation:queue"); + if (StrUtil.isEmpty(str)) { + return; + } + AeEvaluation evaluation = JSON.parseObject(str, AeEvaluation.class); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + aeEvaluationService.runEvaluation(evaluation); + } +} diff --git a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeEvaluationServiceImpl.java b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeEvaluationServiceImpl.java index a6ad4a4..5641c44 100644 --- a/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeEvaluationServiceImpl.java +++ b/cmvr-iot-evaluation/src/main/java/com/cmvr/evaluation/service/impl/AeEvaluationServiceImpl.java @@ -8,7 +8,6 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.cmvr.common.exception.GlobalException; @@ -27,7 +26,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; @@ -43,6 +41,7 @@ import java.util.stream.Collectors; public class AeEvaluationServiceImpl extends ServiceImpl implements IAeEvaluationService { private final ITeNodeInstService teNodeInstService; + private final APIProperties apiProperties; private final StringRedisTemplate redisTemplate; @@ -100,7 +99,7 @@ public class AeEvaluationServiceImpl extends ServiceImpl e.getAction().equals(ActionEnum.CAMERA_RECORDING_STOP.getAction())) - .map(x->JSONObject.parseObject(x.getParamsOut()).getJSONObject("videoUrl").getString("videoUrl")) + .map(x -> JSONObject.parseObject(x.getParamsOut()).getJSONObject("videoUrl").getString("videoUrl")) .collect(Collectors.toList()) .forEach(System.out::println); @@ -205,57 +204,20 @@ public class AeEvaluationServiceImpl extends ServiceImpl body = new HashMap<>(); - body.put("aeId", first.getAeId()); - body.put("audioPath", first.getAudioPath()); - body.put("videoPath", first.getVideoPath()); - body.put("content", first.getAvContent()); - body.put("aeType", first.getAeType()); + body.put("aeId", evaluation.getAeId()); + body.put("audioPath", evaluation.getAudioPath()); + body.put("videoPath", evaluation.getVideoPath()); + body.put("content", evaluation.getAvContent()); + body.put("aeType", evaluation.getAeType()); CallAPIUtil.doPostJson(apiProperties.getEvaluation(), null, body); - first.setStatus(1); - this.updateById(first); + evaluation.setStatus(1); + this.updateById(evaluation); } - @Override - public void callback(AeEvaluation aeEvaluation) { - String aeId = aeEvaluation.getAeId(); - if (StrUtil.isEmpty(aeId)) { - throw new GlobalException("AI评估ID不能为空!"); - } - String result = aeEvaluation.getResult(); - if (StrUtil.isEmpty(result)) { - throw new GlobalException("AI评估结果不能为空!"); - } - AeEvaluation byId = this.getById(aeId); - if (Objects.isNull(byId)) { - log.error("ID为 {} 的评估对象不存在!",aeId); - } - JSONObject jsonObject = JSON.parseObject(result); - String overallResult = jsonObject.getString("overall_result"); - int status; - if (StrUtil.isNotEmpty(overallResult) && overallResult.equals("成功")) { - status = 3; - } else { - status = 4; - } - LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); - wrapper.eq(AeEvaluation::getAeId, aeId) - .set(AeEvaluation::getResult, result) - .set(AeEvaluation::getStatus, status); // 评估完成/失败 - - this.update(wrapper); - - // 继续下一个评估 - String str = redisTemplate.opsForList().leftPop("ae:evaluation:queue"); - if (StrUtil.isEmpty(str)) { - return; - } - AeEvaluation evaluation = JSON.parseObject(str, AeEvaluation.class); - runEvaluation(evaluation); - } @Override public List queryEvaluation(String instId) { @@ -264,6 +226,26 @@ public class AeEvaluationServiceImpl extends ServiceImpl> buildSingleIterationMap(List view) { return view.stream() .filter(e -> StrUtil.isNotEmpty(e.getIteration())) diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowEndNodeHandler.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowEndNodeHandler.java index d8dec2e..8cdd839 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowEndNodeHandler.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/dispatcher/FlowEndNodeHandler.java @@ -29,6 +29,7 @@ public class FlowEndNodeHandler implements FlowNodeTypeHandler { public TaskNodeExecuteResult handle(TaskNodeExecuteMessage message) { String instId = message.getInstId(); String itemId = message.getItemId(); + String taskId = message.getTaskId(); TaskContext context = taskInstHolder.getContext(instId); RunModeEnum runMode = context.getRunMode(); // if (runMode.equals(RunModeEnum.NORMAL) || runMode.equals(RunModeEnum.TRIAL)) { @@ -38,6 +39,7 @@ public class FlowEndNodeHandler implements FlowNodeTypeHandler { JSONObject jsonObject = new JSONObject(); jsonObject.put("instId", instId); + jsonObject.put("taskId", taskId); jsonObject.put("itemId", itemId); jsonObject.put("aeType", RunModeEnum.VI_PROJECT.name()); diff --git a/cmvr-iot-vi/src/main/java/com/cmvr/vi/model/domain/ViProject.java b/cmvr-iot-vi/src/main/java/com/cmvr/vi/model/domain/ViProject.java index c8b67ce..d936d12 100644 --- a/cmvr-iot-vi/src/main/java/com/cmvr/vi/model/domain/ViProject.java +++ b/cmvr-iot-vi/src/main/java/com/cmvr/vi/model/domain/ViProject.java @@ -78,6 +78,6 @@ public class ViProject extends BaseEntity { @ApiModelProperty("送样日期") private Date sampleDate; - @ApiModelProperty(value = "状态", notes = "状态(0已执行 1未执行)") + @ApiModelProperty(value = "状态", notes = "状态(0未执行 1执行中 2执行完成(评估))") private String status; } diff --git a/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/ex/ExViProjectServiceImpl.java b/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/ex/ExViProjectServiceImpl.java new file mode 100644 index 0000000..9145034 --- /dev/null +++ b/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/ex/ExViProjectServiceImpl.java @@ -0,0 +1,32 @@ +package com.cmvr.vi.service.ex; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cmvr.evaluation.service.ExViProjectService; +import com.cmvr.vi.model.domain.ViProject; +import com.cmvr.vi.service.IViProjectService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ExViProjectServiceImpl implements ExViProjectService { + + private final IViProjectService viProjectService; + + @Override + public JSONObject queryById(String id) { + ViProject project = viProjectService.getById(id); + return null; + } + + @Override + public boolean updateStatus(String id) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(ViProject::getProjectId, id) + .eq(ViProject::getStatus, 1) // 运行中 + .set(ViProject::getStatus, 2); // 完成 + return viProjectService.update(null, wrapper); + } +} diff --git a/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/impl/ViProjectServiceImpl.java b/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/impl/ViProjectServiceImpl.java index db31022..e9b7952 100644 --- a/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/impl/ViProjectServiceImpl.java +++ b/cmvr-iot-vi/src/main/java/com/cmvr/vi/service/impl/ViProjectServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.cmvr.common.exception.GlobalException; @@ -73,6 +74,7 @@ public class ViProjectServiceImpl extends ServiceImpl() -// .eq(ViProject::getProjectId, taskExecuteProjectVO.getProjectId()) -// .set(ViProject::getStatus, "0") -// ); + this.update( + new LambdaUpdateWrapper() + .eq(ViProject::getProjectId, taskExecuteProjectVO.getProjectId()) + .set(ViProject::getStatus, "1") //执行中 + ); return instId; }