From 5af2ae1bcd4a3a1ef049d6461c86b0eefab5e241 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Fri, 10 Apr 2026 12:52:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E6=8C=89=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=9F=A5=E8=AF=A2=E5=92=8C=E6=89=B9=E9=87=8F=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20ROI=20=E7=BB=91=E5=AE=9A=E7=AE=97=E6=B3=95=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/aiot/bean/AiRoiAlgoBind.java | 8 ++++ .../controller/AiAlgorithmController.java | 40 +++++++++++++++++-- .../iot/vmp/aiot/dao/AiRoiAlgoBindMapper.java | 14 +++++++ .../vmp/aiot/service/IAiAlgorithmService.java | 5 +++ .../service/impl/AiAlgorithmServiceImpl.java | 29 ++++++++++++++ 5 files changed, 93 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/bean/AiRoiAlgoBind.java b/src/main/java/com/genersoft/iot/vmp/aiot/bean/AiRoiAlgoBind.java index bb300d162..51a03b80e 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/bean/AiRoiAlgoBind.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/bean/AiRoiAlgoBind.java @@ -39,4 +39,12 @@ public class AiRoiAlgoBind { @Schema(description = "更新时间") private String updateTime; + + // ---- 以下为关联查询字段,非表字段 ---- + + @Schema(description = "设备ID(关联查询)") + private String deviceId; + + @Schema(description = "ROI名称(关联查询)") + private String roiName; } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlgorithmController.java b/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlgorithmController.java index d982728bd..3c1365c79 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlgorithmController.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlgorithmController.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.aiot.controller; import com.genersoft.iot.vmp.aiot.bean.AiAlgorithm; +import com.genersoft.iot.vmp.aiot.bean.AiRoiAlgoBind; import com.genersoft.iot.vmp.aiot.service.IAiAlgorithmService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -8,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,10 +22,27 @@ public class AiAlgorithmController { @Autowired private IAiAlgorithmService algorithmService; - @Operation(summary = "查询算法列表") + @Operation(summary = "查询算法列表(可选按设备覆盖参数)") @GetMapping("/list") - public List queryList() { - return algorithmService.queryAll(); + public List queryList(@RequestParam(required = false) String deviceId) { + List algorithms = algorithmService.queryAll(); + if (deviceId != null && !deviceId.isEmpty()) { + List binds = algorithmService.queryBindsByDevice(deviceId); + // 按 algo_code 分组,取第一个绑定的 params 作为该设备的"实际参数" + Map deviceParams = new HashMap<>(); + for (AiRoiAlgoBind bind : binds) { + if (!deviceParams.containsKey(bind.getAlgoCode()) && bind.getParams() != null) { + deviceParams.put(bind.getAlgoCode(), bind.getParams()); + } + } + for (AiAlgorithm algo : algorithms) { + String dp = deviceParams.get(algo.getAlgoCode()); + if (dp != null) { + algo.setGlobalParams(dp); // 用设备实际参数覆盖展示 + } + } + } + return algorithms; } @Operation(summary = "启用/禁用算法") @@ -44,4 +63,19 @@ public class AiAlgorithmController { String globalParams = body.get("globalParams"); algorithmService.saveGlobalParams(algoCode, globalParams); } + + @Operation(summary = "查询设备下所有ROI算法绑定") + @GetMapping("/device-binds/{deviceId}") + public List queryDeviceBinds(@PathVariable String deviceId) { + return algorithmService.queryBindsByDevice(deviceId); + } + + @Operation(summary = "批量更新设备下某算法的参数") + @PostMapping("/device-binds/{deviceId}/{algoCode}") + public void updateDeviceAlgoParams(@PathVariable String deviceId, + @PathVariable String algoCode, + @RequestBody Map body) { + String params = body.get("params"); + algorithmService.updateDeviceAlgoParams(deviceId, algoCode, params); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiRoiAlgoBindMapper.java b/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiRoiAlgoBindMapper.java index 7d6e2a294..c77318fe8 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiRoiAlgoBindMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiRoiAlgoBindMapper.java @@ -45,4 +45,18 @@ public interface AiRoiAlgoBindMapper { @Select("SELECT * FROM wvp_ai_roi_algo_bind ORDER BY priority DESC, id") List queryAll(); + + @Select("SELECT b.*, r.device_id, r.name AS roi_name FROM wvp_ai_roi_algo_bind b " + + "LEFT JOIN wvp_ai_roi r ON b.roi_id = r.roi_id " + + "WHERE r.device_id = #{deviceId} ORDER BY b.priority DESC, b.id") + List queryByDeviceId(@Param("deviceId") String deviceId); + + @Update("UPDATE wvp_ai_roi_algo_bind b " + + "INNER JOIN wvp_ai_roi r ON b.roi_id = r.roi_id " + + "SET b.params = #{params}, b.update_time = #{updateTime} " + + "WHERE r.device_id = #{deviceId} AND b.algo_code = #{algoCode}") + int updateParamsByDeviceAndAlgo(@Param("deviceId") String deviceId, + @Param("algoCode") String algoCode, + @Param("params") String params, + @Param("updateTime") String updateTime); } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlgorithmService.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlgorithmService.java index f4890e17f..22a3b09f7 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlgorithmService.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlgorithmService.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.aiot.service; import com.genersoft.iot.vmp.aiot.bean.AiAlgorithm; +import com.genersoft.iot.vmp.aiot.bean.AiRoiAlgoBind; import java.util.List; @@ -15,4 +16,8 @@ public interface IAiAlgorithmService { void syncFromEdge(); void saveGlobalParams(String algoCode, String globalParams); + + List queryBindsByDevice(String deviceId); + + void updateDeviceAlgoParams(String deviceId, String algoCode, String params); } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlgorithmServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlgorithmServiceImpl.java index 5eca031bb..738e4a86d 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlgorithmServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlgorithmServiceImpl.java @@ -1,11 +1,14 @@ package com.genersoft.iot.vmp.aiot.service.impl; import com.genersoft.iot.vmp.aiot.bean.AiAlgorithm; +import com.genersoft.iot.vmp.aiot.bean.AiRoiAlgoBind; import com.genersoft.iot.vmp.aiot.config.AiServiceConfig; import com.genersoft.iot.vmp.aiot.dao.AiAlgorithmMapper; +import com.genersoft.iot.vmp.aiot.dao.AiRoiAlgoBindMapper; import com.genersoft.iot.vmp.aiot.service.IAiAlgorithmService; import com.genersoft.iot.vmp.aiot.service.IAiConfigLogService; import com.genersoft.iot.vmp.aiot.service.IAiConfigService; +import com.genersoft.iot.vmp.aiot.service.IAiRedisConfigService; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +28,9 @@ public class AiAlgorithmServiceImpl implements IAiAlgorithmService { @Autowired private AiAlgorithmMapper algorithmMapper; + @Autowired + private AiRoiAlgoBindMapper roiAlgoBindMapper; + @Autowired private AiServiceConfig aiServiceConfig; @@ -34,6 +40,9 @@ public class AiAlgorithmServiceImpl implements IAiAlgorithmService { @Autowired private IAiConfigService configService; + @Autowired + private IAiRedisConfigService redisConfigService; + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); /** @@ -176,4 +185,24 @@ public class AiAlgorithmServiceImpl implements IAiAlgorithmService { log.warn("[AI算法] 全局参数推送失败(参数已保存): {}", e.getMessage()); } } + + @Override + public List queryBindsByDevice(String deviceId) { + return roiAlgoBindMapper.queryByDeviceId(deviceId); + } + + @Override + public void updateDeviceAlgoParams(String deviceId, String algoCode, String params) { + String now = LocalDateTime.now().format(FORMATTER); + int updated = roiAlgoBindMapper.updateParamsByDeviceAndAlgo(deviceId, algoCode, params, now); + log.info("[AI算法] 批量更新设备算法参数: deviceId={}, algoCode={}, 影响行数={}", deviceId, algoCode, updated); + + // 更新后推送该设备配置到边缘端 + try { + redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE"); + log.info("[AI算法] 设备参数变更已推送到边缘端: deviceId={}", deviceId); + } catch (Exception e) { + log.warn("[AI算法] 设备参数推送失败(参数已保存): {}", e.getMessage()); + } + } }