Эх сурвалжийг харах

机器人化验室相关报警处理

wangmiaomiao 10 сар өмнө
parent
commit
81e2543b12

+ 1 - 0
slibra-common/src/main/java/com/slibra/common/constant/MyConstants.java

@@ -24,6 +24,7 @@ public class MyConstants {
     public static final String NUMBER_2 = "2";
     public static final Double DOUBLE_75 = 75D;
     public static final int NUMBER_SCALE_4 = 4;
+    public static final BigDecimal ROBOT_HY_DIVIDE = new BigDecimal("0.8");
     public static final BigDecimal GSLSONE_LAST = BigDecimal.valueOf(0.02 * 1.3 * 40 * 2);
     public static final BigDecimal GSLSTWO_LAST = BigDecimal.valueOf(0.016 * 1.1 * 41 * 2);
     public static final BigDecimal GSLS_XGS_LAST = BigDecimal.valueOf(Math.PI * 0.003 * 0.003 * 4 * 97119);

+ 154 - 6
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -12,7 +12,6 @@ import com.slibra.business.res.ShowValueBasic;
 import com.slibra.common.constant.MyConstants;
 import com.slibra.common.enums.BusinessEnum;
 import com.slibra.common.utils.DateUtils;
-import com.slibra.common.utils.StringUtils;
 import com.slibra.common.utils.uuid.IdUtils;
 import inference.InferenceAPIsServiceGrpc;
 import inference.PredictionResponse;
@@ -55,6 +54,9 @@ public class AsyncTask {
     @Autowired
     private TXinyiCalculateMapper xinyiCalculateMapper;
 
+    @Autowired
+    private TXinyiRobotMapper xinyiRobotMapper;
+
 
     /**
      *
@@ -493,8 +495,9 @@ public class AsyncTask {
      * @param tXinyiWarningRecord
      * @param tXinyiIndustry
      * @param normConfig
+     * @param isSpecial  机器人化验库,需要把总磷和总氮的值特殊处理一下
      */
-    private void handleDecision(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
+    private void handleDecision(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, boolean isSpecial) {
         log.info("进入了调⽤大模型决策接口");
         ChatReq chatReq = new ChatReq();
 //        StringBuilder sb = new StringBuilder();
@@ -533,6 +536,23 @@ public class AsyncTask {
                         }
                     }
                 }
+                //如果是机器人化验室的报警,需要把总磷和总氮,获取化验室对应的数据且计算
+                if(isSpecial){
+                    List<TXinyiRobot> xinyiRobots = this.xinyiRobotMapper.selectTXinyiRobotList(TXinyiRobot.builder().testHour(tXinyiIndustry.getTestHour()).build());
+                    TXinyiRobot tXinyiRobot = xinyiRobots.get(0);
+                    //总氮
+                    BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
+                    BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
+                    if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
+                        decisionReq.setTnOff((no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), NUMBER_SCALE_4, RoundingMode.HALF_UP));
+                    }
+
+                    //总磷
+                    BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
+                    if(!Objects.isNull(tpRccJqr)){
+                        decisionReq.setTpOff(tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP));
+                    }
+                }
             }
         }
         String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls);
@@ -792,7 +812,7 @@ public class AsyncTask {
                     this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
                 }else {
                     //继续调用决策
-                    this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig);
+                    this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false);
                 }
             }else{
                 log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
@@ -802,7 +822,7 @@ public class AsyncTask {
                         this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
                     }else {
                         //继续调用决策
-                        this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig);
+                        this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false);
                     }
                 }
             }
@@ -876,7 +896,7 @@ public class AsyncTask {
                     this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
                 }else {
                     //继续调用决策
-                    this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig);
+                    this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false);
                 }
             }else{
                 log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
@@ -886,7 +906,7 @@ public class AsyncTask {
                         this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
                     }else {
                         //继续调用决策
-                        this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig);
+                        this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false);
                     }
                 }
             }
@@ -920,4 +940,132 @@ public class AsyncTask {
         System.out.println(CCCDCHRT_LAST);
         System.out.println(GSLS_LAST);
     }
+
+    /**
+     * 处理机器人化验数据报警
+     * @param uniqueList
+     */
+    public void handleRobotWarning(List<TXinyiRobot> uniqueList) {
+        log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑");
+        //查询配置
+        List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
+        if(CollectionUtils.isEmpty(tXinyiNormConfigs))
+            throw new RuntimeException("未查询到配置信息");
+        TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
+
+        //查询最新的一条工业库的数据(showvalue展示使用)
+        List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
+        TXinyiIndustry tXinyiIndustry = CollectionUtils.isEmpty(tXinyiIndustries) ? new TXinyiIndustry() : tXinyiIndustries.get(0);
+
+        //处理数据
+        for (TXinyiRobot tXinyiRobot : uniqueList) {
+            //处理总氮和总磷报警
+            //总氮
+            BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
+            BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
+            if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
+                BigDecimal csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), NUMBER_SCALE_4, RoundingMode.HALF_UP);
+                BigDecimal cszzBzz = normConfig.getCszzBzz();
+                BigDecimal cszzGkz = normConfig.getCszzGkz();
+                if(!Objects.isNull(cszzBzz)){
+                    handleXinYiWarningsRobot(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig);
+                }
+            }
+
+            //总磷
+            BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
+            if(!Objects.isNull(tpRccJqr)){
+                BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
+                BigDecimal cszlBzz = normConfig.getCszlBzz();
+                BigDecimal cszlGkz = normConfig.getCszlGkz();
+                if(!Objects.isNull(cszlBzz)){
+                    handleXinYiWarningsRobot(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig);
+                }
+            }
+
+        }
+    }
+
+
+    /**
+     * 通过输入的值 生成对应类型的报警对象(出水)
+     *
+     * @param csBzz
+     * @param currentVal
+     * @param csGkz
+     * @param category
+     * @param tXinyiIndustry
+     * @param normConfig
+     * @return
+     */
+    private void handleXinYiWarningsRobot(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
+        BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
+        TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
+        tXinyiWarningRecord.setStatus(0);
+        tXinyiWarningRecord.setType(0);
+        tXinyiWarningRecord.setCategory(category);
+        tXinyiWarningRecord.setTime(DateUtils.getNowDate());
+        tXinyiWarningRecord.setWarningVal(currentVal);
+        tXinyiWarningRecord.setDesignVal(csBzz);
+        tXinyiWarningRecord.setControlVal(csGkz);
+        tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
+        tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
+        tXinyiWarningRecord.setRemark("3");//化验室
+
+        //2024年5月25日17:52:33  如果工业库获取不到数据,也触发报警,但是不调用决策接口
+        if(Objects.isNull(currentVal)){
+            tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
+            tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
+        }else if(currentVal.compareTo(multiply) > 0){//一级
+            tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
+            tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
+        }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
+            tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
+            tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
+        }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
+            tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
+            tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
+        }else{
+            tXinyiWarningRecord = null;//这种的无需处理
+        }
+        //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
+        List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).warningStatus(0).build());
+        if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
+            if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
+                log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
+                for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
+                    xinyiWarningRecord.setStatus(2);
+                    Date nowDate = DateUtils.getNowDate();
+                    xinyiWarningRecord.setOffTime(nowDate);
+                    xinyiWarningRecord.setUpdateTime(nowDate);
+                    xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
+                    this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
+                }
+            }
+        }else{//有告警信息
+            if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
+                //保存到数据库中
+                this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
+                if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
+                    //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
+                    this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
+                }else {
+                    //继续调用决策
+                    this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, true);
+                }
+            }else{
+                log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
+                for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
+                    if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
+                        //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
+                        this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
+                    }else {
+                        //继续调用决策
+                        this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, true);
+                    }
+                }
+            }
+        }
+
+    }
 }

+ 18 - 0
slibra-quartz/src/main/java/com/slibra/quartz/task/RyTask.java

@@ -36,6 +36,7 @@ import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.slibra.common.constant.MyConstants.*;
 
@@ -885,6 +886,7 @@ public class RyTask
         result.put("csData", csData);
 //        JSONObject chartsData = getChartsCsonObject(tXinyiIndustry, normConfig);//图表数据 因为展示不同,所以要传过来或者判断
         result.put("chartsData", chartsDataList);
+        result.put("chartsTitle",  tXinyiWarningRecord.getCategory() + "数据趋势图");
         return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
     }
 
@@ -1168,6 +1170,7 @@ public class RyTask
 //        System.out.println(JSON.toJSONString(tXinyiRobots));
 //        System.out.println("-------------");
         //主
+        List<TXinyiRobot> needHandleList = new ArrayList<>();
         if(!CollectionUtils.isEmpty(tXinyiRobots)){
             for (TXinyiRobot tXinyiRobot : tXinyiRobots) {
                 String date = handleDate(tXinyiRobot.getVDate().replaceAll(" ", ""));//有空格
@@ -1197,8 +1200,23 @@ public class RyTask
                 extraList.add(tXinyiRobot.getTpHl1Jqr());
                 extraList.add(tXinyiRobot.getTpHl2Jqr());
                 tXinyiRobot.setHyzlsyAll(JSON.toJSONString(extraList));
+                //按照小时填充集合 然后处理报警相关逻辑
+                //2024年6月17日13:32:59 因为机器人化验室数据基本几个小时的都一致 改成一小时取一次
+                needHandleList.add(tXinyiRobot);
+//                this.xinyiRobotMapper.insertTXinyiRobot(tXinyiRobot);
+            }
+        }
+        if(!CollectionUtils.isEmpty(needHandleList)){
+            List<TXinyiRobot> uniqueList = needHandleList.stream()
+                    .collect(Collectors.collectingAndThen(
+                            Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TXinyiRobot::getTestHour))),
+                            ArrayList::new
+                    ));
+        if(!CollectionUtils.isEmpty(uniqueList))
+            for (TXinyiRobot tXinyiRobot : uniqueList) {
                 this.xinyiRobotMapper.insertTXinyiRobot(tXinyiRobot);
             }
+        asyncTask.handleRobotWarning(uniqueList);
         }
 
     }