|
@@ -12,7 +12,6 @@ import com.slibra.business.res.ShowValueBasic;
|
|
import com.slibra.common.constant.MyConstants;
|
|
import com.slibra.common.constant.MyConstants;
|
|
import com.slibra.common.enums.BusinessEnum;
|
|
import com.slibra.common.enums.BusinessEnum;
|
|
import com.slibra.common.utils.DateUtils;
|
|
import com.slibra.common.utils.DateUtils;
|
|
-import com.slibra.common.utils.StringUtils;
|
|
|
|
import com.slibra.common.utils.uuid.IdUtils;
|
|
import com.slibra.common.utils.uuid.IdUtils;
|
|
import inference.InferenceAPIsServiceGrpc;
|
|
import inference.InferenceAPIsServiceGrpc;
|
|
import inference.PredictionResponse;
|
|
import inference.PredictionResponse;
|
|
@@ -55,6 +54,9 @@ public class AsyncTask {
|
|
@Autowired
|
|
@Autowired
|
|
private TXinyiCalculateMapper xinyiCalculateMapper;
|
|
private TXinyiCalculateMapper xinyiCalculateMapper;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private TXinyiRobotMapper xinyiRobotMapper;
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
@@ -493,8 +495,9 @@ public class AsyncTask {
|
|
* @param tXinyiWarningRecord
|
|
* @param tXinyiWarningRecord
|
|
* @param tXinyiIndustry
|
|
* @param tXinyiIndustry
|
|
* @param normConfig
|
|
* @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("进入了调⽤大模型决策接口");
|
|
log.info("进入了调⽤大模型决策接口");
|
|
ChatReq chatReq = new ChatReq();
|
|
ChatReq chatReq = new ChatReq();
|
|
// StringBuilder sb = new StringBuilder();
|
|
// 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);
|
|
String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls);
|
|
@@ -792,7 +812,7 @@ public class AsyncTask {
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
}else {
|
|
}else {
|
|
//继续调用决策
|
|
//继续调用决策
|
|
- this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
|
|
|
+ this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false);
|
|
}
|
|
}
|
|
}else{
|
|
}else{
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
@@ -802,7 +822,7 @@ public class AsyncTask {
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
}else {
|
|
}else {
|
|
//继续调用决策
|
|
//继续调用决策
|
|
- this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
|
|
|
+ this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -876,7 +896,7 @@ public class AsyncTask {
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
}else {
|
|
}else {
|
|
//继续调用决策
|
|
//继续调用决策
|
|
- this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
|
|
|
+ this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false);
|
|
}
|
|
}
|
|
}else{
|
|
}else{
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
@@ -886,7 +906,7 @@ public class AsyncTask {
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
}else {
|
|
}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(CCCDCHRT_LAST);
|
|
System.out.println(GSLS_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);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|