From ceca52fd3721edb762b212bc4b975ee13dd2c276 Mon Sep 17 00:00:00 2001 From: xjf <378266566@qq.com> Date: Fri, 12 Dec 2025 11:07:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=B5=8B=E7=82=B9=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alert/controller/admin/instant/vo/InstantSaveReqVO.java | 3 +++ .../module/alert/controller/admin/warn/vo/WarnSaveReqVO.java | 4 ++++ .../module/alert/service/instant/InstantServiceImpl.java | 3 +++ 3 files changed, 10 insertions(+) diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantSaveReqVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantSaveReqVO.java index fbe8ccb..c61c480 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantSaveReqVO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantSaveReqVO.java @@ -73,4 +73,7 @@ public class InstantSaveReqVO extends InstantInfoVO { @DiffLogField(name = "版本编号") private String modelVersion; + + + } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnSaveReqVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnSaveReqVO.java index 790f186..c275594 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnSaveReqVO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnSaveReqVO.java @@ -49,6 +49,10 @@ public class WarnSaveReqVO { @DiffLogField(name = "参与报警") private Long warnStatus; + @Schema(description = "规则点号还是模型点号", example = "1") +// @NotNull(message = "单位不能为空") + private String pointOrModel; + private Long timeDurationThreshold; private Long alarmLevel; diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java index fcb4bf0..bc12f90 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java @@ -170,6 +170,7 @@ try{ createReqVO.setMpId(insertId); + createReqVO.setInstantStatus(instant.getInstantStatus()); createReqVO.setVisible(instant.getVisible()); createReqVO.setInputInfo(inputInfoList); @@ -259,6 +260,8 @@ try{ // warn.setId(insertId); //设置实例id warnSaveReqVO.setMpId(instant.getMpId()); + warnSaveReqVO.setPointOrModel("model"); + warnSaveReqVO.setPointId(createReqVO.getInputInfo().get(reportObj.getAssess().get(j).getIndex())); warnSaveReqVO.setPointName(createReqVO.getInputName().get(reportObj.getAssess().get(j).getIndex())); warnSaveReqVO.setGzpName(createReqVO.getInputName().get(reportObj.getAssess().get(j).getIndex())); From ac0c868e97f24562e6dd2e97ec568c63a6874670 Mon Sep 17 00:00:00 2001 From: xjf <378266566@qq.com> Date: Mon, 15 Dec 2025 09:12:07 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=E5=9B=9E=E7=AE=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/instant/InstantCalcController.java | 21 ------ .../admin/instant/InstantController.java | 12 +++ .../admin/instant/vo/InstantCalcReqVO.java | 27 +++++++ .../admin/instant/vo/InstantCalcResultVO.java | 12 +++ .../alert/dal/dataobject/warn/WarnCalcDO.java | 33 ++++++++ .../alert/dal/mysql/warn/WarnCalcMapper.java | 19 +++++ .../alert/service/instant/InstantService.java | 10 +++ .../service/instant/InstantServiceImpl.java | 75 ++++++++++++++++--- 8 files changed, 178 insertions(+), 31 deletions(-) delete mode 100644 yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java create mode 100644 yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcReqVO.java create mode 100644 yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java create mode 100644 yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnCalcDO.java create mode 100644 yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnCalcMapper.java diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java deleted file mode 100644 index c4e2f5c..0000000 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.alert.controller.admin.instant; - -import cn.iocoder.yudao.module.alert.service.instant.InstantService; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "运行中心 - 模型实例-回算") -@RestController -@RequestMapping("/alert/instant/calc") -@Validated -public class InstantCalcController { - @Resource - private InstantService instantService; - - - - -} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantController.java index 22ab714..553aaea 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantController.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantController.java @@ -111,4 +111,16 @@ public class InstantController { return success(true); } + + @PostMapping("/calc") + @Operation(summary = "回算模型实例" ) + @PreAuthorize("@ss.hasPermission('run:instant:query')") + public CommonResult calcInstant( @Valid @RequestBody InstantCalcReqVO instantCalcReqVO) { + InstantCalcResultVO instantCalcResult= instantService.calcInstant(instantCalcReqVO); + return success(instantCalcResult); + } + + + + } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcReqVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcReqVO.java new file mode 100644 index 0000000..b50fdfd --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.alert.controller.admin.instant.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class InstantCalcReqVO { + + + @Schema(description = "实例id") + private String mpId; + @Schema(description = "开始时间") + private String st; + @Schema(description = "结束时间") + private String et; + @Schema(description = "间隔时间-以秒为单位传入,会自动转为毫秒") + private Long interval; + private int indexType=1; + private int sigmaType=1; + + private String exA_IP; + private String warn_Instants_Str; + private String model; + private String instantInfo_Str; + + +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java new file mode 100644 index 0000000..190ab4d --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.alert.controller.admin.instant.vo; + +import lombok.Data; + +@Data +public class InstantCalcResultVO { + + private String Dimension; + private String CoveredPercent; + private String CalcSeconds; + private String AlarmToatlMinutes; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnCalcDO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnCalcDO.java new file mode 100644 index 0000000..11f54bc --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnCalcDO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.alert.dal.dataobject.warn; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@TableName(value = "WARN_ONLINE_CFG_VIEW_For_Calc", autoResultMap = true) +@KeySequence("system_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class WarnCalcDO extends BaseDO { + + @TableId(value="warn_id") + private Long warnId; + + private Long mpId; + + private String pointId; + + + private String TimeDurationThreshold; + + private String uplimit; + + private String lowlimit; + + private String lastFormula; + + +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnCalcMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnCalcMapper.java new file mode 100644 index 0000000..ebc7580 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnCalcMapper.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.alert.dal.mysql.warn; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnPageReqVO; +import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnCalcDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WarnCalcMapper extends BaseMapperX { + + // 新增:根据 pointId 查询单个告警记录 + default WarnCalcDO selectByPointId(String pointId) { + return selectOne(new LambdaQueryWrapperX() + .eq(WarnCalcDO::getPointId, pointId)); + } +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantService.java index 782a664..e7e88cc 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantService.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantService.java @@ -60,4 +60,14 @@ public interface InstantService { */ void deleteInstant(Long id); + + + + /** + * 回算模型实例 + * + * @param calcReqVO 回算模型实例信息 + * @return 回算结果 + */ + InstantCalcResultVO calcInstant(InstantCalcReqVO calcReqVO); } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java index bc12f90..d8269b9 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.alert.service.instant; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.alert.controller.admin.exa.vo.Point; @@ -13,16 +14,14 @@ import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantDO; import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantTableDO; import cn.iocoder.yudao.module.alert.dal.dataobject.report.Report; import cn.iocoder.yudao.module.alert.dal.dataobject.report.ReportDO; -import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnTableDO; +import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnCalcDO; import cn.iocoder.yudao.module.alert.dal.mysql.instant.InstantMapper; import cn.iocoder.yudao.module.alert.dal.mysql.instant.InstantTableMapper; import cn.iocoder.yudao.module.alert.dal.mysql.model.VersionMapper; import cn.iocoder.yudao.module.alert.dal.mysql.report.ReportMapper; -import cn.iocoder.yudao.module.alert.dal.mysql.warn.WarnTableMapper; +import cn.iocoder.yudao.module.alert.dal.mysql.warn.WarnCalcMapper; import cn.iocoder.yudao.module.alert.service.warn.WarnService; import cn.iocoder.yudao.module.alert.utils.EXAUtils; -import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import com.mzt.logapi.context.LogRecordContext; import com.mzt.logapi.service.impl.DiffParseFunction; @@ -36,13 +35,8 @@ import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; -import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.UNKNOWN; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; @@ -50,6 +44,7 @@ import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; @Service @Slf4j public class InstantServiceImpl implements InstantService { + @Resource private InstantMapper instantMapper; @Resource @@ -63,7 +58,11 @@ public class InstantServiceImpl implements InstantService { private WarnService warnService; + // 新增:注入WarnCalcMapper用于查询预警计算配置 + @Resource + private WarnCalcMapper warnCalcMapper; EXAUtils exaUtils = new EXAUtils(); + // 新增:从配置文件注入exaip @Value("${point.head}") private String HEAD; @Value("${EXA.ip}") @@ -488,4 +487,60 @@ try{ } + @Override + public InstantCalcResultVO calcInstant(InstantCalcReqVO calcReqVO) { + InstantCalcResultVO instantCalcResultVO = new InstantCalcResultVO(); + //根据mpId读取实例信息 + InstantDO instant = instantMapper.selectById(calcReqVO.getMpId()); + if (instant == null) { + throw exception(INSTANT_NOT_EXISTS); + } + + calcReqVO.setExA_IP(EXA_IP); + calcReqVO.setModel(JsonUtils.toJsonString(instant.getModelInfo())); + calcReqVO.setInstantInfo_Str( JsonUtils.toJsonString(instant.getInstantInfo())); + InstantInfoVO instantInfoVO = JsonUtils.parseObject(instant.getInstantInfo(), InstantInfoVO.class); + List pointInfoList = instantInfoVO.getInputInfo(); + //循环point + // 新增:循环处理每个输入点,查询预警计算配置 + List> warnCalcMapList = new ArrayList<>(); + for (String pointId : pointInfoList) { + // 根据pointId查询预警计算记录(假设WarnCalcMapper有此查询方法) + WarnCalcDO warnCalc = warnCalcMapper.selectByPointId(pointId); + Map calcInfoMap = new HashMap<>(3); + if (warnCalc != null) { + calcInfoMap.put("logic", warnCalc.getLastFormula().replaceAll("UPLIMIT", warnCalc.getUplimit()).replaceAll("LOWLIMIT", warnCalc.getLowlimit())); + calcInfoMap.put("TimeLong", warnCalc.getTimeDurationThreshold()); + calcInfoMap.put("Vaild", true); // 注意字段名是否与实体类一致 + } + else{ + calcInfoMap.put("logic", "1=1"); + calcInfoMap.put("TimeLong", "0"); + calcInfoMap.put("Vaild", false); // 注意字段名是否与实体类一致 + } + warnCalcMapList.add(calcInfoMap); + + } + // 构建WarnInstants对象并转换为JSON字符串 + Map warnInstantsObj = new HashMap<>(); + warnInstantsObj.put("WarnInstants", warnCalcMapList); + String warnInstantsJson = JsonUtils.toJsonString(warnInstantsObj); + calcReqVO.setWarn_Instants_Str(warnInstantsJson); // 假设InstantCalcResultVO有此setter方法 + + //调用http接口,获取计算结果 http://120.26.116.243:8098/api/PCA/deepTrack + String url = "http://120.26.116.243:8098/api/PCA/deepTrack"; + // 调用http接口,获取计算结果 + String result = HttpUtils.post(url, null, JsonUtils.toJsonString(calcReqVO)); + // 解析返回结果 + instantCalcResultVO = JsonUtils.parseObject(result, InstantCalcResultVO.class); + + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("instant", calcReqVO); + return instantCalcResultVO; + } + + + + + } From 219b10847fee27ab13aa2aab75065f84e9aea07e Mon Sep 17 00:00:00 2001 From: xjf <378266566@qq.com> Date: Mon, 15 Dec 2025 17:15:02 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=E5=9B=9E=E7=AE=97=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/instant/vo/InstantCalcResultVO.java | 30 +- .../service/instant/InstantServiceImpl.java | 406 +++++++++--------- .../system/enums/ErrorCodeConstants.java | 2 +- 3 files changed, 240 insertions(+), 198 deletions(-) diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java index 190ab4d..73f09df 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java @@ -1,12 +1,38 @@ package cn.iocoder.yudao.module.alert.controller.admin.instant.vo; +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; @Data public class InstantCalcResultVO { - private String Dimension; + + @JsonProperty("Dimension") + private Integer Dimension; + + @JsonProperty("CoveredPercent") private String CoveredPercent; - private String CalcSeconds; + + @JsonProperty("AlarmToatlMinutes") private String AlarmToatlMinutes; + + @JsonProperty("AlarmNumber") + private Integer AlarmNumber; + + @JsonProperty("CalcSeconds") + private String CalcSeconds; + } + + + diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java index d8269b9..861be4a 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java @@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.alert.dal.mysql.report.ReportMapper; import cn.iocoder.yudao.module.alert.dal.mysql.warn.WarnCalcMapper; import cn.iocoder.yudao.module.alert.service.warn.WarnService; import cn.iocoder.yudao.module.alert.utils.EXAUtils; +import com.alibaba.fastjson.JSONObject; import com.google.common.annotations.VisibleForTesting; import com.mzt.logapi.context.LogRecordContext; import com.mzt.logapi.service.impl.DiffParseFunction; @@ -74,212 +75,212 @@ public class InstantServiceImpl implements InstantService { success = SYSTEM_INSTANT_CREATE_SUCCESS) public List createInstant(InstantSaveReqVO createReqVO, Integer type) throws IOException { -try{ - // 1. 校验角色 + try { + // 1. 校验角色 // validateRoleDuplicate(createReqVO.getName(), createReqVO.getCode(), null); - //根据modelversionid查询modelversion,录入instantcfg表的modelversion字段 - String modelVersion = versionMapper.selectById(createReqVO.getModelVersionId()).getVersion(); - createReqVO.setModelVersion(modelVersion); + //根据modelversionid查询modelversion,录入instantcfg表的modelversion字段 + String modelVersion = versionMapper.selectById(createReqVO.getModelVersionId()).getVersion(); + createReqVO.setModelVersion(modelVersion); - //插入除instantInfo外的所有数据,获取到id - // 2. 插入到数据库-status、visible默认值 - InstantTableDO instant = BeanUtils.toBean(createReqVO, InstantTableDO.class) - .setInstantStatus(ObjUtil.defaultIfNull(createReqVO.getInstantStatus(), 1L)) - .setVisible(ObjUtil.defaultIfNull(createReqVO.getVisible(), 1L)); + //插入除instantInfo外的所有数据,获取到id + // 2. 插入到数据库-status、visible默认值 + InstantTableDO instant = BeanUtils.toBean(createReqVO, InstantTableDO.class) + .setInstantStatus(ObjUtil.defaultIfNull(createReqVO.getInstantStatus(), 1L)) + .setVisible(ObjUtil.defaultIfNull(createReqVO.getVisible(), 1L)); - instantTableMapper.insert(instant); + instantTableMapper.insert(instant); - // 3. 记录操作日志上下文 - LogRecordContext.putVariable("instant", instant); + // 3. 记录操作日志上下文 + LogRecordContext.putVariable("instant", instant); - Long insertId = instant.getMpId(); + Long insertId = instant.getMpId(); - //处理数据 + //处理数据 // inputInfo 各种转换 - List pointInfoList = createReqVO.getPointInfo(); - System.out.println(pointInfoList); - - List inputInfoList = new ArrayList<>(); - List inputNameList = new ArrayList<>(); - List unitList = new ArrayList<>(); - List outPointInfoList = new ArrayList<>(); - List timePointInfoList = new ArrayList<>(); - List biasPointInfoList = new ArrayList<>(); - List faultVariablePointList = new ArrayList<>(); - - List InstantPointList = new ArrayList<>(); - Point point = new Point(); - String outpoint = ""; - for (Integer i = 0; i < pointInfoList.size(); i++) { - inputInfoList.add(pointInfoList.get(i).getPointId()); - inputNameList.add(pointInfoList.get(i).getDescription()); - unitList.add(pointInfoList.get(i).getUnit()); - if (Objects.isNull(pointInfoList.get(i).getType()) || pointInfoList.get(i).getType().equals("1")) { - //构建重构值对象 - outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "R"; - point = new Point(); - point.setGroupName("WARN"); - outPointInfoList.add(outpoint); - point.setItemName(outpoint); - point.setDescriptor(pointInfoList.get(i).getDescription() + "_重构值"); - point.setEngUnits(pointInfoList.get(i).getUnit()); - point.setItemType(5); - InstantPointList.add(point); - - //构建时间值对象 - outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "T"; - point = new Point(); - point.setGroupName("WARN"); - timePointInfoList.add(outpoint); - point.setItemName(outpoint); - point.setDescriptor(pointInfoList.get(i).getDescription() + "_时间值"); - point.setEngUnits(pointInfoList.get(i).getUnit()); - point.setItemType(5); - InstantPointList.add(point); - - //构建偏差值对象 - outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "B"; - point = new Point(); - point.setGroupName("WARN"); - biasPointInfoList.add(outpoint); - point.setItemName(outpoint); - point.setDescriptor(pointInfoList.get(i).getDescription() + "_偏差值"); - point.setEngUnits(pointInfoList.get(i).getUnit()); - point.setItemType(5); - InstantPointList.add(point); - - //构建状态值对象 - outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "F"; - point = new Point(); - point.setGroupName("WARN"); - faultVariablePointList.add(outpoint); - point.setItemName(outpoint); - point.setDescriptor(pointInfoList.get(i).getDescription() + "_状态值"); - point.setEngUnits(pointInfoList.get(i).getUnit()); - point.setItemType(5); - InstantPointList.add(point); - } else { - outpoint = ""; - outPointInfoList.add(outpoint); - timePointInfoList.add(outpoint); - biasPointInfoList.add(outpoint); - faultVariablePointList.add(outpoint); - } - } - - - createReqVO.setMpId(insertId); - - createReqVO.setInstantStatus(instant.getInstantStatus()); - createReqVO.setVisible(instant.getVisible()); - createReqVO.setInputInfo(inputInfoList); - createReqVO.setInputName(inputNameList); - createReqVO.setUnit(unitList); - createReqVO.setOutPointInfo(outPointInfoList); - createReqVO.setTimePointInfo(timePointInfoList); - createReqVO.setBiasPointInfo(biasPointInfoList); - createReqVO.setFaultVariablePointInfo(faultVariablePointList); - - - //构建模型实例ste值-没有unit参数 - outpoint = HEAD + "M" + String.format("%04d", insertId) + "_ste"; - //赋值-createReqVO - createReqVO.setModel_state(outpoint); - point = new Point(); - point.setGroupName("WARN"); - point.setItemName(outpoint); - point.setDescriptor(instant.getMpName() + "_残差值"); - point.setItemType(5); - InstantPointList.add(point); - - //构建模型实例状态值-没有unit参数 - outpoint = HEAD + "M" + String.format("%04d", insertId) + "_status"; - //赋值-createReqVO - createReqVO.setModel_status(outpoint); - point = new Point(); - point.setGroupName("WARN"); - point.setItemName(outpoint); - point.setDescriptor(instant.getMpName() + "_状态值"); - point.setItemType(5); - InstantPointList.add(point); + List pointInfoList = createReqVO.getPointInfo(); + System.out.println(pointInfoList); + + List inputInfoList = new ArrayList<>(); + List inputNameList = new ArrayList<>(); + List unitList = new ArrayList<>(); + List outPointInfoList = new ArrayList<>(); + List timePointInfoList = new ArrayList<>(); + List biasPointInfoList = new ArrayList<>(); + List faultVariablePointList = new ArrayList<>(); + + List InstantPointList = new ArrayList<>(); + Point point = new Point(); + String outpoint = ""; + for (Integer i = 0; i < pointInfoList.size(); i++) { + inputInfoList.add(pointInfoList.get(i).getPointId()); + inputNameList.add(pointInfoList.get(i).getDescription()); + unitList.add(pointInfoList.get(i).getUnit()); + if (Objects.isNull(pointInfoList.get(i).getType()) || pointInfoList.get(i).getType().equals("1")) { + //构建重构值对象 + outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "R"; + point = new Point(); + point.setGroupName("WARN"); + outPointInfoList.add(outpoint); + point.setItemName(outpoint); + point.setDescriptor(pointInfoList.get(i).getDescription() + "_重构值"); + point.setEngUnits(pointInfoList.get(i).getUnit()); + point.setItemType(5); + InstantPointList.add(point); + + //构建时间值对象 + outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "T"; + point = new Point(); + point.setGroupName("WARN"); + timePointInfoList.add(outpoint); + point.setItemName(outpoint); + point.setDescriptor(pointInfoList.get(i).getDescription() + "_时间值"); + point.setEngUnits(pointInfoList.get(i).getUnit()); + point.setItemType(5); + InstantPointList.add(point); + + //构建偏差值对象 + outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "B"; + point = new Point(); + point.setGroupName("WARN"); + biasPointInfoList.add(outpoint); + point.setItemName(outpoint); + point.setDescriptor(pointInfoList.get(i).getDescription() + "_偏差值"); + point.setEngUnits(pointInfoList.get(i).getUnit()); + point.setItemType(5); + InstantPointList.add(point); + + //构建状态值对象 + outpoint = HEAD + "M" + String.format("%04d", insertId) + String.format("%04d", i + 1) + "F"; + point = new Point(); + point.setGroupName("WARN"); + faultVariablePointList.add(outpoint); + point.setItemName(outpoint); + point.setDescriptor(pointInfoList.get(i).getDescription() + "_状态值"); + point.setEngUnits(pointInfoList.get(i).getUnit()); + point.setItemType(5); + InstantPointList.add(point); + } else { + outpoint = ""; + outPointInfoList.add(outpoint); + timePointInfoList.add(outpoint); + biasPointInfoList.add(outpoint); + faultVariablePointList.add(outpoint); + } + } + + + createReqVO.setMpId(insertId); + + createReqVO.setInstantStatus(instant.getInstantStatus()); + createReqVO.setVisible(instant.getVisible()); + createReqVO.setInputInfo(inputInfoList); + createReqVO.setInputName(inputNameList); + createReqVO.setUnit(unitList); + createReqVO.setOutPointInfo(outPointInfoList); + createReqVO.setTimePointInfo(timePointInfoList); + createReqVO.setBiasPointInfo(biasPointInfoList); + createReqVO.setFaultVariablePointInfo(faultVariablePointList); + + + //构建模型实例ste值-没有unit参数 + outpoint = HEAD + "M" + String.format("%04d", insertId) + "_ste"; + //赋值-createReqVO + createReqVO.setModel_state(outpoint); + point = new Point(); + point.setGroupName("WARN"); + point.setItemName(outpoint); + point.setDescriptor(instant.getMpName() + "_残差值"); + point.setItemType(5); + InstantPointList.add(point); + + //构建模型实例状态值-没有unit参数 + outpoint = HEAD + "M" + String.format("%04d", insertId) + "_status"; + //赋值-createReqVO + createReqVO.setModel_status(outpoint); + point = new Point(); + point.setGroupName("WARN"); + point.setItemName(outpoint); + point.setDescriptor(instant.getMpName() + "_状态值"); + point.setItemType(5); + InstantPointList.add(point); //更新instantInfo字段 - InstantSaveReqVO updateReqVO = new InstantSaveReqVO(); - updateReqVO.setMpId(instant.getMpId()); - updateReqVO.setInstantInfo(JsonUtils.toJsonString(createReqVO)); - - updateInstant(updateReqVO); - List resultList = new ArrayList(); - - resultList.add(instant.getMpId().toString()); - - - for (Point item : InstantPointList) { - // 每次循环输出list中的元素 - System.out.println(item.toString()); - //循环加点 - String ss = exaUtils.setPoint(EXA_IP, item); - resultList.add(ss); - } - createWarn1(instant, createReqVO); - log.info("模型实例创建成功,实例ID: {}", instant.getMpId()); - return resultList; - } catch (Exception e) { - log.error("模型实例创建失败,错误信息: ", e); - throw exception(CREATE_INSTANT_ERROR,"模型实例创建失败: " + e.getMessage()); - } + InstantSaveReqVO updateReqVO = new InstantSaveReqVO(); + updateReqVO.setMpId(instant.getMpId()); + updateReqVO.setInstantInfo(JsonUtils.toJsonString(createReqVO)); + + updateInstant(updateReqVO); + List resultList = new ArrayList(); + + resultList.add(instant.getMpId().toString()); + + + for (Point item : InstantPointList) { + // 每次循环输出list中的元素 + System.out.println(item.toString()); + //循环加点 + String ss = exaUtils.setPoint(EXA_IP, item); + resultList.add(ss); + } + createWarn1(instant, createReqVO); + log.info("模型实例创建成功,实例ID: {}", instant.getMpId()); + return resultList; + } catch (Exception e) { + log.error("模型实例创建失败,错误信息: ", e); + throw exception(CREATE_INSTANT_ERROR, "模型实例创建失败: " + e.getMessage()); + } } public void createWarn1(InstantTableDO instant, InstantSaveReqVO createReqVO) { - try{ - //调用预警表和评估报告表的mapper - // 从instant对象获取modelid和version字段 - Long modelId = instant.getModelId(); - String version = instant.getModelVersion(); + try { + //调用预警表和评估报告表的mapper + // 从instant对象获取modelid和version字段 + Long modelId = instant.getModelId(); + String version = instant.getModelVersion(); // modelId=11L; // version="v-test"; - // 调用reportMapper获取对应记录(假设存在selectByModelIdAndVersion方法) - ReportDO report = reportMapper.selectByModelIdAndVersion(modelId, version); - - // 如果report不为空且report字段不为空,则解析为Report类 - if (report != null && StrUtil.isNotBlank(report.getReport())) { - Report reportObj = JsonUtils.parseObject(report.getReport(), Report.class); - // 此处可根据业务需求处理解析后的Report对象(如后续预警逻辑) - // 循环getInputInfo构建并插入预警记录 - for (int j = 0; j < reportObj.getAssess().size(); j++) { - - - WarnSaveReqVO warnSaveReqVO = new WarnSaveReqVO(); - // 设置预警ID(假设insertId为当前预警主记录ID) - // warn.setId(insertId); - //设置实例id - warnSaveReqVO.setMpId(instant.getMpId()); - warnSaveReqVO.setPointOrModel("model"); - - warnSaveReqVO.setPointId(createReqVO.getInputInfo().get(reportObj.getAssess().get(j).getIndex())); - warnSaveReqVO.setPointName(createReqVO.getInputName().get(reportObj.getAssess().get(j).getIndex())); - warnSaveReqVO.setGzpName(createReqVO.getInputName().get(reportObj.getAssess().get(j).getIndex())); - warnSaveReqVO.setEquation("[" + createReqVO.getBiasPointInfo().get(reportObj.getAssess().get(j).getIndex()) + "]>UPLIMIT or [" + createReqVO.getBiasPointInfo().get(reportObj.getAssess().get(j).getIndex()) + "]UPLIMIT or [" + createReqVO.getBiasPointInfo().get(reportObj.getAssess().get(j).getIndex()) + "] pointInfoList = instantInfoVO.getInputInfo(); //循环point @@ -512,8 +513,7 @@ try{ calcInfoMap.put("logic", warnCalc.getLastFormula().replaceAll("UPLIMIT", warnCalc.getUplimit()).replaceAll("LOWLIMIT", warnCalc.getLowlimit())); calcInfoMap.put("TimeLong", warnCalc.getTimeDurationThreshold()); calcInfoMap.put("Vaild", true); // 注意字段名是否与实体类一致 - } - else{ + } else { calcInfoMap.put("logic", "1=1"); calcInfoMap.put("TimeLong", "0"); calcInfoMap.put("Vaild", false); // 注意字段名是否与实体类一致 @@ -529,18 +529,34 @@ try{ //调用http接口,获取计算结果 http://120.26.116.243:8098/api/PCA/deepTrack String url = "http://120.26.116.243:8098/api/PCA/deepTrack"; + String params = JsonUtils.toJsonString(calcReqVO); // 调用http接口,获取计算结果 - String result = HttpUtils.post(url, null, JsonUtils.toJsonString(calcReqVO)); + String httpResult = HttpUtils.post(url, null, params); + JSONObject jsonResult = JsonUtils.parseObject(httpResult, JSONObject.class); + try { + String result = jsonResult.getString("result"); + if (!"OK".equals(result)) { + throw exception(CALCULATE_ERROR, "计算失败"); + } + } catch (Exception e) { + throw exception(CALCULATE_ERROR, "结果有误,返回结果为: " +jsonResult+ ",异常信息为: "+e.getMessage()); + } // 解析返回结果 - instantCalcResultVO = JsonUtils.parseObject(result, InstantCalcResultVO.class); - + String rtn = jsonResult.getString("rtn"); + // ... 新增:检查 rtn 是否为空 + if (StrUtil.isBlank(rtn)) { + throw exception(CALCULATE_ERROR, "计算结果 rtn 为空"); + } + // ... 新增:捕获 JSON 解析异常 + try { + instantCalcResultVO = JsonUtils.parseObject(rtn, InstantCalcResultVO.class); + } catch (Exception e) { + throw exception(CALCULATE_ERROR, "解析计算结果失败,rtn: " + rtn + ",异常信息: " + e.getMessage()); + } // 3. 记录操作日志上下文 LogRecordContext.putVariable("instant", calcReqVO); return instantCalcResultVO; } - - - } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index c59a7ee..4728dad 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -174,7 +174,7 @@ public interface ErrorCodeConstants { ErrorCode CREATE_INSTANT_ERROR = new ErrorCode(3_001_001, "模型实例创建失败,失败原因:({})"); - + ErrorCode CALCULATE_ERROR = new ErrorCode(3_001_002, "模型实例计算失败,失败原因:({})"); // ========== 预警模块 4-001========== ErrorCode WARN_NOT_EXISTS = new ErrorCode(4_001_000, "预警不存在"); From 1731d163049e188a801f74b55f1ae0c62bddff60 Mon Sep 17 00:00:00 2001 From: xjf <378266566@qq.com> Date: Tue, 16 Dec 2025 21:35:25 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=E9=9B=86=E4=B8=AD=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/warn/vo/WarnPageReqVO.java | 16 +++ .../controller/admin/warn/vo/WarnRespVO.java | 48 ++++++- .../controller/admin/warn/warnController.java | 10 +- .../alert/dal/dataobject/warn/WarnDO.java | 18 ++- .../alert/dal/mysql/warn/WarnMapper.java | 26 +++- .../service/instant/InstantServiceImpl.java | 10 +- .../alert/service/warn/WarnService.java | 14 ++ .../alert/service/warn/WarnServiceImpl.java | 135 ++++++++++++++++-- .../system/enums/ErrorCodeConstants.java | 1 + .../src/main/resources/application-local.yaml | 4 +- 10 files changed, 258 insertions(+), 24 deletions(-) diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnPageReqVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnPageReqVO.java index a13ef92..ab1f1a5 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnPageReqVO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnPageReqVO.java @@ -12,5 +12,21 @@ public class WarnPageReqVO extends PageParam { @Schema(description = "实例id", example = "id") private Long mpId; + @Schema(description = "机组id", example = "id") + private Integer unit; + @Schema(description = "系统id", example = "id") + private Integer type; + @Schema(description = "子系统id", example = "id") + private Integer system; + @Schema(description = "实例名称", example = "id") + private String mpName; + + //下面这俩个字段是为了集中告警筛选条件 + @Schema(description = "预警状态", example = "id") + private Long warnStatus1; + + @Schema(description = "实时状态", example = "id") + private Long statusRealTime; + } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnRespVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnRespVO.java index f6339e1..7745dd0 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnRespVO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnRespVO.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.alert.controller.admin.warn.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -20,19 +22,22 @@ public class WarnRespVO { private Long mpId; @Schema(description = "点号", example = "id") - private String pointId; - @Schema(description = "点号描述", example = "id") + + @Schema(description = "点号描述", example = "id") private String pointName; - @Schema(description = "实例名称", example = "id") + @Schema(description = "实例名称", example = "id") private String mpName; private String equation; + + @Schema(description = "输出值点号", example = "id") private String outputPoint; + private String unit; @@ -68,11 +73,13 @@ public class WarnRespVO { - private Double uplimit; + private String uplimit; + + private String lowlimit; - private Double lowlimit; private String systemName; + private String unitName; /** * 创建者-名称 @@ -81,6 +88,16 @@ public class WarnRespVO { */ private String createName; + /** + * 创建者-名称 + * + * + */ + + @Schema(description = "创建时间", example = "2025-01-01 12:00:00") +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; /** * 更新者-名称 * @@ -88,4 +105,25 @@ public class WarnRespVO { */ private String updateName; + + + private Long warnStatus1; + + private Long statusRealtime; + + + //集中告警新增的字段 + @Schema(description = "点号值", example = "id") + private Double pointValue; + @Schema(description = "输出值点号值", example = "id") + private Double outputPointValue; + // 偏差值=输入值-重构值 + @Schema(description = "偏差值", example = "id") + private Double biasValue; + // 时间差=当前时间-创建时间(单位:秒)--总秒数 + @Schema(description = "时间差", example = "id") + private Long timeDiff; + // 时间差=当前时间-创建时间(单位:秒)--时间字符串 + @Schema(description = "持续时长", example = "id") + private String timeDiffStr; } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/warnController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/warnController.java index d42e3ca..65678f6 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/warnController.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/warnController.java @@ -40,7 +40,15 @@ public class warnController { PageResult pageResult = warnService.getWarnPage(pageReqVO); return success(BeanUtils.toBean(pageResult, WarnRespVO.class)); } - + @GetMapping("/page-real") + @Operation(summary = "获得预警分页列表") + @PreAuthorize("@ss.hasPermission('run:warn:query')") + public CommonResult> getWarnPageReal(@Valid WarnPageReqVO pageReqVO) { + pageReqVO.setStatusRealTime(0L); + pageReqVO.setWarnStatus1(1L); + PageResult pageResult = warnService.getWarnPageReal(pageReqVO); + return success(pageResult); + } @GetMapping("/get") @Operation(summary = "获得预警信息") @PreAuthorize("@ss.hasPermission('run:warn:query')") diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnDO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnDO.java index 96eb219..13a6cbd 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnDO.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnDO.java @@ -59,13 +59,25 @@ public class WarnDO extends BaseDO { private Long warnStatus; +//这里得是String,因为可能是表达式 + private String uplimit; - private Double uplimit; - - private Double lowlimit; +//这里得是String,因为可能是表达式 + private String lowlimit; private String systemName; private String createName; private String updateName; + + private LocalDateTime createTime; + private String unitName; + private String systemTypeName; + private Long unitId; + private Long systemTypeId; + private Long algorithmId; + private Long systemId; + private Long warnStatus1; + + private Long statusRealtime; } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnMapper.java index f5a97b7..a8dadc6 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnMapper.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnMapper.java @@ -9,12 +9,36 @@ import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantDO; import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + @Mapper public interface WarnMapper extends BaseMapperX { default PageResult selectPage(WarnPageReqVO reqVO) { + + //计算当前时间与create_time的时间差(秒),并筛选出大于阈值的记录 + // 筛选出时间差大于阈值的记录 return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(WarnDO::getMpId, reqVO.getMpId().toString()) + .eqIfPresent(WarnDO::getMpId, reqVO.getMpId()) + .likeIfPresent(WarnDO::getMpName, reqVO.getMpName()) + .eqIfPresent(WarnDO::getUnitId,reqVO.getUnit()) + .eqIfPresent(WarnDO::getSystemTypeId,reqVO.getType()) + .eqIfPresent(WarnDO::getSystemId,reqVO.getSystem()) .orderByAsc(WarnDO::getWarnId)); } + default PageResult selectPageReal(WarnPageReqVO reqVO) { + //计算当前时间与create_time的时间差(秒),并筛选出大于阈值的记录 + // 筛选出时间差大于阈值的记录 + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WarnDO::getMpId, reqVO.getMpId()) + .likeIfPresent(WarnDO::getMpName, reqVO.getMpName()) + .eqIfPresent(WarnDO::getUnitId,reqVO.getUnit()) + .eqIfPresent(WarnDO::getSystemTypeId,reqVO.getType()) + .eqIfPresent(WarnDO::getSystemId,reqVO.getSystem()) + .eqIfPresent(WarnDO::getWarnStatus1,reqVO.getWarnStatus1()) + .eqIfPresent(WarnDO::getStatusRealtime,reqVO.getStatusRealTime()) + // ⭐ 核心条件:当前时间 - create_time < 表字段阈值 + .apply("TIMESTAMPDIFF(SECOND, create_time, NOW()) > time_duration_threshold") + .orderByAsc(WarnDO::getWarnId)); + } } diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java index 861be4a..0fadd5f 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java @@ -69,6 +69,9 @@ public class InstantServiceImpl implements InstantService { @Value("${EXA.ip}") private String EXA_IP; + //PCA回算的http请求地址 + @Value("${PCA.calcurl}") + private String PCA_CALC_URL; @Override @Transactional(rollbackFor = Exception.class) @LogRecord(type = SYSTEM_INSTANT_TYPE, subType = SYSTEM_INSTANT_CREATE_SUB_TYPE, bizNo = "{{#role.id}}", @@ -241,9 +244,6 @@ public class InstantServiceImpl implements InstantService { Long modelId = instant.getModelId(); String version = instant.getModelVersion(); -// modelId=11L; -// version="v-test"; - // 调用reportMapper获取对应记录(假设存在selectByModelIdAndVersion方法) ReportDO report = reportMapper.selectByModelIdAndVersion(modelId, version); @@ -528,10 +528,10 @@ public class InstantServiceImpl implements InstantService { calcReqVO.setWarn_Instants_Str(warnInstantsJson); // 假设InstantCalcResultVO有此setter方法 //调用http接口,获取计算结果 http://120.26.116.243:8098/api/PCA/deepTrack - String url = "http://120.26.116.243:8098/api/PCA/deepTrack"; +// String url = "http://120.26.116.243:8098/api/PCA/deepTrack"; String params = JsonUtils.toJsonString(calcReqVO); // 调用http接口,获取计算结果 - String httpResult = HttpUtils.post(url, null, params); + String httpResult = HttpUtils.post(PCA_CALC_URL, null, params); JSONObject jsonResult = JsonUtils.parseObject(httpResult, JSONObject.class); try { String result = jsonResult.getString("result"); diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnService.java index 35294c2..2cbb23f 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnService.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.alert.service.warn; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.alert.controller.admin.instant.vo.InstantSaveReqVO; import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnPageReqVO; +import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnRespVO; import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnSaveReqVO; import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantDO; import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnDO; @@ -17,7 +18,20 @@ public interface WarnService { */ PageResult getWarnPage(WarnPageReqVO reqVO); + /** + * 获得预警分页(包含已获取实时值) + * + * @param reqVO 预警分页查询 + * @return 预警分页结果 + */ + PageResult getWarnPageReal(WarnPageReqVO reqVO); + /** + * 获得预警 + * + * @param id 预警编号 + * @return 预警 + */ WarnDO getWarn(Long id); /** diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnServiceImpl.java index e818297..3e9d9b7 100644 --- a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnServiceImpl.java +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnServiceImpl.java @@ -6,12 +6,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.alert.controller.admin.instant.vo.InstantSaveReqVO; import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnPageReqVO; +import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnRespVO; import cn.iocoder.yudao.module.alert.controller.admin.warn.vo.WarnSaveReqVO; import cn.iocoder.yudao.module.alert.dal.dataobject.instant.InstantDO; import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnDO; import cn.iocoder.yudao.module.alert.dal.dataobject.warn.WarnTableDO; import cn.iocoder.yudao.module.alert.dal.mysql.warn.WarnMapper; import cn.iocoder.yudao.module.alert.dal.mysql.warn.WarnTableMapper; +import cn.iocoder.yudao.module.alert.utils.EXAUtils; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.UserPostDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -22,13 +24,23 @@ import com.mzt.logapi.service.impl.DiffParseFunction; import com.mzt.logapi.starter.annotation.LogRecord; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; +import java.net.URISyntaxException; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.WARN_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; @Service @@ -38,18 +50,127 @@ public class WarnServiceImpl implements WarnService { private WarnMapper warnMapper; @Resource private WarnTableMapper warnTableMapper; - + @Value("${EXA.ip}") + private String EXA_IP; @Override public PageResult getWarnPage(WarnPageReqVO reqVO) { return warnMapper.selectPage(reqVO); } + @Override + public PageResult getWarnPageReal(WarnPageReqVO reqVO) { + PageResult warnPage = warnMapper.selectPageReal(reqVO); + EXAUtils exaUtils = new EXAUtils(); + // 2. 循环处理每个预警,读取实时值并转换为WarnRespVO + List respVOList = warnPage.getList().stream().map(warnDO -> { + // 2.1 基础属性拷贝 + WarnRespVO respVO = BeanUtils.toBean(warnDO, WarnRespVO.class); + + // 2.2 读取pointId和outpointPoint的实时值(假设实时服务方法为getRealTimeValue) + List pointValue = null; + List outpointValue = null; + try { + + pointValue = exaUtils.getNowData(EXA_IP, warnDO.getPointId()); + outpointValue = exaUtils.getNowData(EXA_IP, warnDO.getPointId()); + + } catch (Exception e) { + throw exception(EXA_REAL_FAILED, "EXA实时值读取失败: " + e.getMessage()); + } + + // 2.3 实时值到value字段 + respVO.setPointValue(Double.parseDouble(pointValue.get(0))); + respVO.setOutputPointValue(Double.parseDouble(outpointValue.get(0))); +//偏差值 + //偏差值=输入值-重构值 + double point = Double.parseDouble(pointValue.get(0)); + double outpoint = Double.parseDouble(outpointValue.get(0)); + + respVO.setBiasValue(point - outpoint); + //2.4处理uplimit、lowlimit + if (warnDO.getUplimit() != null) { + String originalUplimit = warnDO.getUplimit(); + // 检查是否包含[]格式的点号 + if (originalUplimit.contains("[") && originalUplimit.contains("]")) { + // 使用正则提取[]内的点号(例如:[point123] -> point123) + Pattern pattern = Pattern.compile("\\[(.*?)\\]"); + Matcher matcher = pattern.matcher(originalUplimit); + if (matcher.find()) { + String innerPoint = matcher.group(1); // 获取括号内的点号 + // 读取内点的实时值 + List innerPointValue = null; + try { + innerPointValue = exaUtils.getNowData(EXA_IP, innerPoint); + } catch (Exception e) { + throw exception(EXA_REAL_FAILED, "EXA实时值读取失败: " + e.getMessage()); + } + + String realValue = innerPointValue.get(0); // 取第一个值 + // 替换[]内的点号为实时值(例如:"温度>[temp_point]" -> "温度>25.5") + String processedUplimit = originalUplimit.replace("[" + innerPoint + "]", realValue); + respVO.setUplimit(processedUplimit); + } else { + // 未匹配到有效格式,保留原始值 + respVO.setUplimit(originalUplimit); + } + } else { + // 不包含[],直接使用原始值 + respVO.setUplimit(originalUplimit); + } + } + if (warnDO.getLowlimit() != null) { + String originalLowlimit = warnDO.getLowlimit(); + // 检查是否包含[]格式的点号 + if (originalLowlimit.contains("[") && originalLowlimit.contains("]")) { + // 使用正则提取[]内的点号(例如:[point123] -> point123) + Pattern pattern = Pattern.compile("\\[(.*?)\\]"); + Matcher matcher = pattern.matcher(originalLowlimit); + if (matcher.find()) { + String innerPoint = matcher.group(1); // 获取括号内的点号 + // 读取内点的实时值 + List innerPointValue = null; + try { + innerPointValue = exaUtils.getNowData(EXA_IP, innerPoint); + } catch (Exception e) { + throw exception(EXA_REAL_FAILED, "EXA实时值读取失败: " + e.getMessage()); + } + String realValue = innerPointValue.get(0); // 取第一个值 + // 替换[]内的点号为实时值(例如:"温度>[temp_point]" -> "温度>25.5") + String processedLowlimit = originalLowlimit.replace("[" + innerPoint + "]", realValue); + respVO.setLowlimit(processedLowlimit); + } else { + // 未匹配到有效格式,保留原始值 + respVO.setLowlimit(originalLowlimit); + } + } else { + // 不包含[],直接使用原始值 + respVO.setLowlimit(originalLowlimit); + } + } + //计算当前时间与create_time的时间差(单位:秒) + long totalSeconds = ChronoUnit.SECONDS.between(warnDO.getCreateTime(), LocalDateTime.now()); + respVO.setTimeDiff(totalSeconds); + // 转换为天、时、分、秒 + long days = totalSeconds / 86400; // 1天 = 86400秒 + long remainingSeconds = totalSeconds % 86400; + long hours = remainingSeconds / 3600; // 1小时 = 3600秒 + remainingSeconds %= 3600; + long minutes = remainingSeconds / 60; // 1分钟 = 60秒 + long seconds = remainingSeconds % 60; + // 格式化时间差字符串(例如:1天2小时3分4秒) + String timeDiffStr = String.format("%d天%d小时%d分%d秒", days, hours, minutes, seconds); + respVO.setTimeDiffStr(timeDiffStr); + return respVO; + }).collect(Collectors.toList()); + + // 3. 构建并返回包含实时值的分页结果 + return new PageResult<>(respVOList, warnPage.getTotal()); + } @Override @Transactional(rollbackFor = Exception.class) - @LogRecord(type = SYSTEM_WARN_TYPE, subType = SYSTEM_WARN_CREATE_SUB_TYPE, bizNo = "{{#warn.id}}", - success = SYSTEM_WARN_CREATE_SUCCESS) + @LogRecord(type = SYSTEM_WARN_TYPE, subType = SYSTEM_WARN_CREATE_SUB_TYPE, bizNo = "{{#warn.id}}", success = SYSTEM_WARN_CREATE_SUCCESS) public Long createWarn(WarnSaveReqVO createReqVO) { // 1.1 校验账户配合 // tenantService.handleTenantInfo(tenant -> { @@ -72,16 +193,14 @@ public class WarnServiceImpl implements WarnService { } - - @Override public WarnDO getWarn(Long id) { return warnMapper.selectById(id); } + @Override @CacheEvict(value = RedisKeyConstants.WARN, key = "#updateReqVO.warnId") - @LogRecord(type = SYSTEM_WARN_TYPE, subType = SYSTEM_WARN_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", - success = SYSTEM_WARN_UPDATE_SUCCESS) + @LogRecord(type = SYSTEM_WARN_TYPE, subType = SYSTEM_WARN_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", success = SYSTEM_WARN_UPDATE_SUCCESS) public void updateWarn(WarnSaveReqVO updateReqVO) { //为简单--省去检验步骤,之后根据情况增加 // 1.1 校验是否可以更新 diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 4728dad..d2fc284 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -194,5 +194,6 @@ public interface ErrorCodeConstants { // ========== EXA模块 1-002-034-000 ========== ErrorCode EXA_POINT_IMPORT_LIST_IS_EMPTY = new ErrorCode(6_001_000, "导入EXA测点数据不能为空!"); ErrorCode EXA_POINT_IMPORT_FAILED = new ErrorCode(6_001_001, "导入EXA测点数据失败!失败测点:({})"); + ErrorCode EXA_REAL_FAILED = new ErrorCode(6_001_002, "读取EXA测点实时数据失败!失败测点:({})"); } diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 5512831..a5b1e18 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -278,4 +278,6 @@ point: algorithm: host: 120.26.116.243:8082 assess-report: - host: 120.26.116.243:8098 \ No newline at end of file + host: 120.26.116.243:8098 +PCA: + calcurl: http://120.26.116.243:8098/api/PCA/deepTrack