dev-xjf #50

Merged
xiaojinfei merged 5 commits from dev-xjf into master 4 weeks ago
  1. 21
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java
  2. 12
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantController.java
  3. 27
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcReqVO.java
  4. 38
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java
  5. 3
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantSaveReqVO.java
  6. 16
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnPageReqVO.java
  7. 48
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnRespVO.java
  8. 4
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/vo/WarnSaveReqVO.java
  9. 10
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/warn/warnController.java
  10. 33
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnCalcDO.java
  11. 18
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/warn/WarnDO.java
  12. 19
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnCalcMapper.java
  13. 26
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/mysql/warn/WarnMapper.java
  14. 10
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantService.java
  15. 108
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/instant/InstantServiceImpl.java
  16. 14
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnService.java
  17. 135
      yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/service/warn/WarnServiceImpl.java
  18. 3
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
  19. 2
      yudao-server/src/main/resources/application-local.yaml

21
yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/InstantCalcController.java

@ -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;
}

12
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<InstantCalcResultVO> calcInstant( @Valid @RequestBody InstantCalcReqVO instantCalcReqVO) {
InstantCalcResultVO instantCalcResult= instantService.calcInstant(instantCalcReqVO);
return success(instantCalcResult);
}
}

27
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;
}

38
yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/instant/vo/InstantCalcResultVO.java

@ -0,0 +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 {
@JsonProperty("Dimension")
private Integer Dimension;
@JsonProperty("CoveredPercent")
private String CoveredPercent;
@JsonProperty("AlarmToatlMinutes")
private String AlarmToatlMinutes;
@JsonProperty("AlarmNumber")
private Integer AlarmNumber;
@JsonProperty("CalcSeconds")
private String CalcSeconds;
}

3
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;
}

16
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;
}

48
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;
}

4
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;

10
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<WarnDO> pageResult = warnService.getWarnPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WarnRespVO.class));
}
@GetMapping("/page-real")
@Operation(summary = "获得预警分页列表")
@PreAuthorize("@ss.hasPermission('run:warn:query')")
public CommonResult<PageResult<WarnRespVO>> getWarnPageReal(@Valid WarnPageReqVO pageReqVO) {
pageReqVO.setStatusRealTime(0L);
pageReqVO.setWarnStatus1(1L);
PageResult<WarnRespVO> pageResult = warnService.getWarnPageReal(pageReqVO);
return success(pageResult);
}
@GetMapping("/get")
@Operation(summary = "获得预警信息")
@PreAuthorize("@ss.hasPermission('run:warn:query')")

33
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;
}

18
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;
}

19
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<WarnCalcDO> {
// 新增:根据 pointId 查询单个告警记录
default WarnCalcDO selectByPointId(String pointId) {
return selectOne(new LambdaQueryWrapperX<WarnCalcDO>()
.eq(WarnCalcDO::getPointId, pointId));
}
}

26
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<WarnDO> {
default PageResult<WarnDO> selectPage(WarnPageReqVO reqVO) {
//计算当前时间与create_time的时间差(秒),并筛选出大于阈值的记录
// 筛选出时间差大于阈值的记录
return selectPage(reqVO, new LambdaQueryWrapperX<WarnDO>()
.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<WarnDO> selectPageReal(WarnPageReqVO reqVO) {
//计算当前时间与create_time的时间差(秒),并筛选出大于阈值的记录
// 筛选出时间差大于阈值的记录
return selectPage(reqVO, new LambdaQueryWrapperX<WarnDO>()
.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));
}
}

10
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);
}

108
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,15 @@ 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.alibaba.fastjson.JSONObject;
import com.google.common.annotations.VisibleForTesting;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
@ -36,13 +36,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 +45,7 @@ import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
@Service
@Slf4j
public class InstantServiceImpl implements InstantService {
@Resource
private InstantMapper instantMapper;
@Resource
@ -63,19 +59,26 @@ 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}")
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}}",
success = SYSTEM_INSTANT_CREATE_SUCCESS)
public List<String> createInstant(InstantSaveReqVO createReqVO, Integer type) throws IOException {
try{
try {
// 1. 校验角色
// validateRoleDuplicate(createReqVO.getName(), createReqVO.getCode(), null);
//根据modelversionid查询modelversion,录入instantcfg表的modelversion字段
@ -170,6 +173,7 @@ try{
createReqVO.setMpId(insertId);
createReqVO.setInstantStatus(instant.getInstantStatus());
createReqVO.setVisible(instant.getVisible());
createReqVO.setInputInfo(inputInfoList);
@ -227,22 +231,19 @@ try{
return resultList;
} catch (Exception e) {
log.error("模型实例创建失败,错误信息: ", e);
throw exception(CREATE_INSTANT_ERROR,"模型实例创建失败: " + e.getMessage());
throw exception(CREATE_INSTANT_ERROR, "模型实例创建失败: " + e.getMessage());
}
}
public void createWarn1(InstantTableDO instant, InstantSaveReqVO createReqVO) {
try{
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);
@ -259,6 +260,8 @@ try{
// warn.setId(insertId);
//设置实例id
warnSaveReqVO.setMpId(instant.getMpId());
warnSaveReqVO.setPointOrModel("point");
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()));
@ -276,7 +279,7 @@ try{
}
} catch (Exception e) {
log.error("模型实例创建失败,错误信息: ", e);
throw exception(CREATE_INSTANT_ERROR,"模型实例创建失败: " + e.getMessage());
throw exception(CREATE_INSTANT_ERROR, "模型实例创建失败: " + e.getMessage());
}
}
@ -485,4 +488,75 @@ 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(instant.getModelInfo());
calcReqVO.setInstantInfo_Str(instant.getInstantInfo());
InstantInfoVO instantInfoVO = JsonUtils.parseObject(instant.getInstantInfo(), InstantInfoVO.class);
List<String> pointInfoList = instantInfoVO.getInputInfo();
//循环point
// 新增:循环处理每个输入点,查询预警计算配置
List<Map<String, Object>> warnCalcMapList = new ArrayList<>();
for (String pointId : pointInfoList) {
// 根据pointId查询预警计算记录(假设WarnCalcMapper有此查询方法)
WarnCalcDO warnCalc = warnCalcMapper.selectByPointId(pointId);
Map<String, Object> 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<String, Object> 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";
String params = JsonUtils.toJsonString(calcReqVO);
// 调用http接口,获取计算结果
String httpResult = HttpUtils.post(PCA_CALC_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());
}
// 解析返回结果
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;
}
}

14
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<WarnDO> getWarnPage(WarnPageReqVO reqVO);
/**
* 获得预警分页包含已获取实时值
*
* @param reqVO 预警分页查询
* @return 预警分页结果
*/
PageResult<WarnRespVO> getWarnPageReal(WarnPageReqVO reqVO);
/**
* 获得预警
*
* @param id 预警编号
* @return 预警
*/
WarnDO getWarn(Long id);
/**

135
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<WarnDO> getWarnPage(WarnPageReqVO reqVO) {
return warnMapper.selectPage(reqVO);
}
@Override
public PageResult<WarnRespVO> getWarnPageReal(WarnPageReqVO reqVO) {
PageResult<WarnDO> warnPage = warnMapper.selectPageReal(reqVO);
EXAUtils exaUtils = new EXAUtils();
// 2. 循环处理每个预警,读取实时值并转换为WarnRespVO
List<WarnRespVO> respVOList = warnPage.getList().stream().map(warnDO -> {
// 2.1 基础属性拷贝
WarnRespVO respVO = BeanUtils.toBean(warnDO, WarnRespVO.class);
// 2.2 读取pointId和outpointPoint的实时值(假设实时服务方法为getRealTimeValue)
List<String> pointValue = null;
List<String> 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<String> 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<String> 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 校验是否可以更新

3
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, "预警不存在");
@ -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测点实时数据失败!失败测点:({})");
}

2
yudao-server/src/main/resources/application-local.yaml

@ -279,3 +279,5 @@ algorithm:
host: 120.26.116.243:8082
assess-report:
host: 120.26.116.243:8098
PCA:
calcurl: http://120.26.116.243:8098/api/PCA/deepTrack

Loading…
Cancel
Save