|
@@ -22,6 +22,7 @@ import com.slibra.common.utils.DateUtils;
|
|
|
import com.slibra.common.utils.LocalDateTimeUtil;
|
|
|
import com.slibra.common.utils.StringUtils;
|
|
|
import com.slibra.common.utils.format.WaterFormat;
|
|
|
+import com.slibra.common.utils.third.StringUtil;
|
|
|
import com.slibra.common.utils.uuid.IdUtils;
|
|
|
import com.slibra.quartz.business.JsCsFormatData;
|
|
|
import inference.InferenceAPIsServiceGrpc;
|
|
@@ -2063,7 +2064,8 @@ public class AsyncTask {
|
|
|
|
|
|
//进水相关报警
|
|
|
//进水总磷超标报警
|
|
|
- BigDecimal jsTp = tXinyiIndustry.getJsTp();
|
|
|
+ //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
|
|
|
+ /*BigDecimal jsTp = tXinyiIndustry.getJsTp();
|
|
|
warningMoreExceed = handleXinYiWarningRecordJSMore(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
|
breakpointCount++;
|
|
@@ -2072,7 +2074,7 @@ public class AsyncTask {
|
|
|
if(warningMoreExceed.isNoChange()){
|
|
|
noChange++;
|
|
|
noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
//进水COD超标报警
|
|
|
BigDecimal jsCod = tXinyiIndustry.getJsCod();
|
|
@@ -2598,8 +2600,9 @@ public class AsyncTask {
|
|
|
handleXinYiWarningsCsOrigin(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
if(csSSExecute && !Objects.isNull(csSSBzz) && csSSBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(csssGkz) && csssGkz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
handleXinYiWarningsCsOrigin(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
- if(jsZLExecute && !Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
+ //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
|
|
|
+ /*if(jsZLExecute && !Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
+ handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));*/
|
|
|
if(jsCodExecute && !Objects.isNull(jscodSjz) && jscodSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
handleXinYiWarningRecordJSOrigin(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
|
|
|
if(jsZDExecute && !Objects.isNull(jszdSjz) && jszdSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
@@ -4093,54 +4096,17 @@ public class AsyncTask {
|
|
|
TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
|
|
|
|
|
|
//单点突变-异常升高报警
|
|
|
- TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
|
|
|
- List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
|
|
|
- //是否存在异常升高的问题
|
|
|
- if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_3){
|
|
|
- //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
|
|
|
- Map<String, BigDecimal> resultMap = existsYCSG(currentVal, category, tXinyiIndustries);
|
|
|
- BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
|
|
|
- if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
|
|
|
- //关闭同类型的其他报警
|
|
|
- closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
|
|
|
- //触发报警 并且模拟大模型返回决策问答数据
|
|
|
- if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
|
|
|
- //插入该类型报警
|
|
|
- warningRecordYCSG.setTime(nowDate);
|
|
|
- warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
|
|
|
- warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
|
|
|
- warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
|
|
|
- warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
- warningRecordYCSG.setCreateTime(nowDate);
|
|
|
- warningRecordYCSG.setWarningVal(currentVal);
|
|
|
- warningRecordYCSG.setDesignVal(jsBzz);
|
|
|
- warningRecordYCSG.setRemark(ZERO_SZ_WARNING.getCode());
|
|
|
- warningRecordYCSG.setCwrwfhz(cwrwfhz);
|
|
|
- warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
|
|
|
- this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
|
|
|
- //同时处理决策 不用调用大模型,本地处理问答
|
|
|
- addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
|
|
|
- }else{
|
|
|
- log.info("工业库报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
- }
|
|
|
- //后续的报警不再进行
|
|
|
- log.info("工业库报警的时候,发现存在{}异常升高的报警,后续报警不再处理", category);
|
|
|
- return;
|
|
|
- }else{//不存在 查看历史是否有报警,有的话关闭
|
|
|
- if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
|
|
|
- TXinyiWarningRecord warningRecordExists = tXinyiNoChangeYCSGRecords.get(0);
|
|
|
- warningRecordExists.setStatus(2);
|
|
|
- warningRecordExists.setOffTime(nowDate);
|
|
|
- warningRecordExists.setUpdateTime(nowDate);
|
|
|
- warningRecordExists.setUpdateBy(WARNING_DEFAULT_CREATE);
|
|
|
- this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordExists);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ if (existsJsNh3YCSG(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
|
|
|
+ return;
|
|
|
|
|
|
//单点突变-异常偏低报警
|
|
|
//2025年04月15日15:45:48 这种的暂时先不报
|
|
|
|
|
|
+ //2025年04月16日14:35:48 新增高低值设备报警
|
|
|
+ if (existsJsNh3GDZ(jsBzz, currentVal, category, tXinyiIndustry, normConfig, cwrwfhz, tXinyiIndustries, nowDate))
|
|
|
+ return;
|
|
|
+
|
|
|
+ //最开始的工艺报警 (超标准工艺报警) 2025年04月16日15:40:23 改成只有超标准才会报警,并且具体逻辑做拆分 todo
|
|
|
|
|
|
BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
|
|
|
TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
|
|
@@ -4249,6 +4215,113 @@ public class AsyncTask {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private boolean existsJsNh3YCSG(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_8){
|
|
|
+ //查询同类型的历史报警
|
|
|
+ TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
|
|
|
+ List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
|
|
|
+ //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
|
|
|
+ Map<String, BigDecimal> resultMap = existsYCSGJsNh3(currentVal, category, tXinyiIndustries);
|
|
|
+ BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
|
|
|
+ if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
|
|
|
+ //关闭同类型的其他报警
|
|
|
+ closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
|
|
|
+ //触发报警 并且模拟大模型返回决策问答数据
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
|
|
|
+ //插入该类型报警
|
|
|
+ warningRecordYCSG.setTime(nowDate);
|
|
|
+ warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
|
|
|
+ warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
|
|
|
+ warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
|
|
|
+ warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ warningRecordYCSG.setCreateTime(nowDate);
|
|
|
+ warningRecordYCSG.setWarningVal(currentVal);
|
|
|
+ warningRecordYCSG.setDesignVal(jsBzz);
|
|
|
+ warningRecordYCSG.setRemark(ZERO_SZ_WARNING.getCode());
|
|
|
+ warningRecordYCSG.setCwrwfhz(cwrwfhz);
|
|
|
+ warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
|
|
|
+ //同时处理决策 不用调用大模型,本地处理问答
|
|
|
+ addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
|
|
|
+ }else{
|
|
|
+ log.info("工业库报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
+ //2025年04月16日15:56:47 这种的继续报警,所以决策还需要再次调用一次
|
|
|
+ addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL));
|
|
|
+ }
|
|
|
+ //后续的报警不再进行
|
|
|
+ log.info("工业库报警的时候,发现存在{}异常升高的报警,后续报警不再处理", category);
|
|
|
+ return true;
|
|
|
+ }else{//不存在 查看历史是否有报警,有的话关闭
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
|
|
|
+ closeWarning(tXinyiNoChangeYCSGRecords.get(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private boolean existsJsNh3GDZ(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz, List<TXinyiIndustry> tXinyiIndustries, Date nowDate) {
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_8){
|
|
|
+ //查询同类型的历史报警
|
|
|
+ TXinyiWarningRecord warningRecordGDZ = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode()).status(0).build();
|
|
|
+ List<TXinyiWarningRecord> tXinyiNoChangeGDZRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordGDZ);
|
|
|
+ //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
|
|
|
+ Map<String, BigDecimal> resultMap = existsGdzJsNh3(currentVal, category, tXinyiIndustries);
|
|
|
+ BigDecimal exceedVal = resultMap.get(EXCEEDVAL);
|
|
|
+ if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
|
|
|
+ //拼接决策的最近8小时的值
|
|
|
+ String last8Str = this.getJsNh3Str8(tXinyiIndustries);
|
|
|
+ //关闭同类型的其他报警
|
|
|
+ closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
|
|
|
+ //触发报警 并且模拟大模型返回决策问答数据
|
|
|
+ if(CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
|
|
|
+ //插入该类型报警
|
|
|
+ warningRecordGDZ.setTime(nowDate);
|
|
|
+ warningRecordGDZ.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getMsg());
|
|
|
+ warningRecordGDZ.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
|
|
|
+ warningRecordGDZ.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getCode());
|
|
|
+ warningRecordGDZ.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ warningRecordGDZ.setCreateTime(nowDate);
|
|
|
+ warningRecordGDZ.setWarningVal(currentVal);
|
|
|
+ warningRecordGDZ.setDesignVal(jsBzz);
|
|
|
+ warningRecordGDZ.setRemark(ZERO_SZ_WARNING.getCode());
|
|
|
+ warningRecordGDZ.setCwrwfhz(cwrwfhz);
|
|
|
+ warningRecordGDZ.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
|
|
|
+ this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordGDZ);
|
|
|
+ //同时处理决策 不用调用大模型,本地处理问答
|
|
|
+ addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
|
|
|
+ }else{
|
|
|
+ log.info("工业库报警的时候,发现存在高低值的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
+ //2025年04月16日15:56:47 这种的继续报警,所以决策还需要再次调用一次
|
|
|
+ addChatRecordByGDZ(warningRecordGDZ, tXinyiIndustry, normConfig, category, exceedVal, resultMap.get(LASTVAL), last8Str);
|
|
|
+ }
|
|
|
+ //后续的报警不再进行
|
|
|
+ log.info("工业库报警的时候,发现存在{}高低值的报警,后续报警不再处理", category);
|
|
|
+ return true;
|
|
|
+ }else{//不存在 查看历史是否有报警,有的话关闭
|
|
|
+ if(!CollectionUtils.isEmpty(tXinyiNoChangeGDZRecords)){
|
|
|
+ closeWarning(tXinyiNoChangeGDZRecords.get(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getJsNh3Str8(List<TXinyiIndustry> tXinyiIndustries) {
|
|
|
+// return StringUtil.join(tXinyiIndustries.stream().map(TXinyiIndustry::getJsNh3).collect(Collectors.toList()) , "mg/L、");
|
|
|
+ int size = tXinyiIndustries.size();
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(i);
|
|
|
+ if(i < size - 1)
|
|
|
+ sb.append(tXinyiIndustry.getJsNh3()).append("mg/L、");
|
|
|
+ else
|
|
|
+ sb.append("mg/L");
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 通过输入的值 生成对应类型的报警对象(进水)
|
|
@@ -4570,6 +4643,132 @@ public class AsyncTask {
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 2025年04月16日14:20:11 异常升高逻辑也不同指标不同的判断方式
|
|
|
+ * 【工业库异常升高】先判断该指标是否超过最大值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
|
|
|
+ * 一个字段返回用作2个地方
|
|
|
+ * 2025年03月06日10:35:30 判断是否超标,不再获取最近3个小时;最近2个小时比较即可。
|
|
|
+ * 2025年03月19日10:47:18 返回逻辑调整:额外再返回一个上个小时同指标的值,决策力需要展示该值。
|
|
|
+ * @param currentVal
|
|
|
+ * @param category
|
|
|
+ * @param industryList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, BigDecimal> existsYCSGJsNh3(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
|
|
|
+
|
|
|
+ Map<String, BigDecimal> resultMap = new HashMap<>();
|
|
|
+ TXinyiIndustry tXinyiIndustry1 = industryList.get(INDEX_1);
|
|
|
+// BigDecimal compareVal = BigDecimal.valueOf(YCSG_VAL_CONF);
|
|
|
+ BigDecimal compareVal = BigDecimal.valueOf(0.7D);
|
|
|
+ BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
|
|
|
+ TXinyiIndustry tXinyiIndustryCurrent = industryList.get(INDEX_0);
|
|
|
+ BigDecimal jsTn = tXinyiIndustryCurrent.getJsTn();
|
|
|
+ if(!Objects.isNull(currentVal) && !Objects.isNull(jsNh31)){
|
|
|
+ BigDecimal divide1 = currentVal.subtract(jsNh31).divide(jsNh31, NUMBER_SCALE_4, RoundingMode.HALF_UP);
|
|
|
+ //2025年04月16日14:28:55 除非条件修改: 触发条件:(现在-前一小时)/前一小时*100%> 70% and 进水氨氮 > 58 and 进水总氮<65
|
|
|
+ if(divide1.compareTo(compareVal) > 0 && currentVal.compareTo(BigDecimal.valueOf(58)) > 0 && jsTn.compareTo(BigDecimal.valueOf(65)) < 0){
|
|
|
+ resultMap.put(EXCEEDVAL, divide1);
|
|
|
+ resultMap.put(LASTVAL, jsNh31);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 进水氨氮是否存在高低值切换
|
|
|
+ * @param currentVal
|
|
|
+ * @param category
|
|
|
+ * @param industryList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, BigDecimal> existsGdzJsNh3(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
|
|
|
+
|
|
|
+ Map<String, BigDecimal> resultMap = new HashMap<>();
|
|
|
+ BigDecimal compareValHigh = BigDecimal.valueOf(58);
|
|
|
+ BigDecimal compareValLow = BigDecimal.valueOf(13);
|
|
|
+
|
|
|
+ if(gdzJsNh3(compareValHigh, compareValLow, industryList))
|
|
|
+ resultMap.put(EXCEEDVAL, compareValHigh);//这里随便存一个值就可以 有值代表存在高低值 没有就是不存在
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断8个值 是否存在高低值切换报警
|
|
|
+ * @param compareValHigh
|
|
|
+ * @param compareValLow
|
|
|
+ * @param industryList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean gdzJsNh3(BigDecimal compareValHigh, BigDecimal compareValLow, List<TXinyiIndustry> industryList) {
|
|
|
+ BigDecimal jsNh30 = industryList.get(INDEX_0).getJsNh3();
|
|
|
+ BigDecimal jsNh31 = industryList.get(INDEX_1).getJsNh3();
|
|
|
+ BigDecimal jsNh32 = industryList.get(INDEX_2).getJsNh3();
|
|
|
+ BigDecimal jsNh33 = industryList.get(INDEX_3).getJsNh3();
|
|
|
+ BigDecimal jsNh34 = industryList.get(INDEX_4).getJsNh3();
|
|
|
+ BigDecimal jsNh35 = industryList.get(INDEX_5).getJsNh3();
|
|
|
+ BigDecimal jsNh36 = industryList.get(INDEX_6).getJsNh3();
|
|
|
+ BigDecimal jsNh37 = industryList.get(INDEX_7).getJsNh3();
|
|
|
+
|
|
|
+ //判断规则:
|
|
|
+ return commonGdzCompare(compareValHigh, compareValLow, jsNh30, jsNh31, jsNh32, jsNh33, jsNh34, jsNh35, jsNh36, jsNh37);
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean commonGdzCompare(BigDecimal compareValHigh, BigDecimal compareValLow, BigDecimal jsNh30, BigDecimal jsNh31, BigDecimal jsNh32, BigDecimal jsNh33, BigDecimal jsNh34, BigDecimal jsNh35, BigDecimal jsNh36, BigDecimal jsNh37) {
|
|
|
+ boolean result = false;
|
|
|
+ if(high(jsNh30, compareValHigh) && low(jsNh31, compareValLow) && high(jsNh32, compareValHigh) && low(jsNh33, compareValLow))
|
|
|
+ result = true;
|
|
|
+ if(high(jsNh30, compareValHigh) && high(jsNh31, compareValHigh) && low(jsNh32, compareValLow) && low(jsNh33, compareValLow)
|
|
|
+ && high(jsNh34, compareValHigh) && high(jsNh35, compareValHigh) && low(jsNh36, compareValLow) && low(jsNh37, compareValLow))
|
|
|
+ result = true;
|
|
|
+ if(high(jsNh30, compareValHigh) && low(jsNh31, compareValLow) && low(jsNh32, compareValLow) && high(jsNh33, compareValHigh))
|
|
|
+ result = true;
|
|
|
+ if(high(jsNh30, compareValHigh) && low(jsNh31, compareValLow) && low(jsNh32, compareValLow) && low(jsNh33, compareValLow) && high(jsNh34, compareValHigh))
|
|
|
+ result = true;
|
|
|
+
|
|
|
+ if(low(jsNh30, compareValLow) && high(jsNh31, compareValHigh) && low(jsNh32, compareValLow) && high(jsNh33, compareValHigh))
|
|
|
+ result = true;
|
|
|
+ if(low(jsNh30, compareValLow) && low(jsNh31, compareValLow) && high(jsNh32, compareValHigh) && high(jsNh33, compareValHigh)
|
|
|
+ && low(jsNh34, compareValLow) && low(jsNh35, compareValLow) && high(jsNh36, compareValHigh) && high(jsNh37, compareValHigh))
|
|
|
+ result = true;
|
|
|
+ if(low(jsNh30, compareValLow) && high(jsNh31, compareValHigh) && high(jsNh32, compareValHigh) && low(jsNh33, compareValLow))
|
|
|
+ result = true;
|
|
|
+ if(low(jsNh30, compareValLow) && high(jsNh31, compareValHigh) && high(jsNh32, compareValHigh) && high(jsNh33, compareValHigh) && low(jsNh34, compareValLow))
|
|
|
+ result = true;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 判断 origin 是否 大于 compare 大于返回true
|
|
|
+ * @param origin
|
|
|
+ * @param compare
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean high(BigDecimal origin, BigDecimal compare){
|
|
|
+ if(Objects.isNull(origin) || Objects.isNull(compare))
|
|
|
+ return false;
|
|
|
+ return origin.compareTo(compare) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 判断 origin 是否 小于 compare 小于于返回true
|
|
|
+ * @param origin
|
|
|
+ * @param compare
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean low(BigDecimal origin, BigDecimal compare){
|
|
|
+ if(Objects.isNull(origin) || Objects.isNull(compare))
|
|
|
+ return false;
|
|
|
+ return origin.compareTo(compare) < 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
*
|
|
|
* 【工业库异常升高】先判断该指标是否超过最大值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
|
|
@@ -5478,6 +5677,31 @@ public class AsyncTask {
|
|
|
this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ private void addChatRecordByGDZ(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category, BigDecimal exceedVal, BigDecimal lastVal, String last8Str) {
|
|
|
+ ChatReq chatReq = new ChatReq();
|
|
|
+ //保存聊天记录
|
|
|
+ //将问答更新到数据库中
|
|
|
+ chatReq.setSessionId(IdUtils.simpleUUID());
|
|
|
+ chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
|
|
|
+ chatReq.setModule(3);
|
|
|
+ /*String userId = SecurityUtils.getUserId().toString();
|
|
|
+ String username = SecurityUtils.getUsername();*/
|
|
|
+ chatReq.setUserId(WARNING_DEFAULT_CREATE);
|
|
|
+ String showVal = this.buildShowValue(warningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
|
|
|
+ chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
|
|
|
+ chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.SJYC_GDZ.getMsg());//本地问题
|
|
|
+// chatReq.setAnswer(category + YCSG_ANSWER_ONE + exceedVal.multiply(BigDecimal_100) + "%" + YCSG_ANSWER_TWO + warningRecord.getWarningVal() + YCSG_ANSWER_THREE);
|
|
|
+ chatReq.setAnswer(GDZ_ANSWER_REPLACE.replaceAll("@@@0", category).replaceAll("@@@1", last8Str));//只替换最近8小时的值 和 类型
|
|
|
+ chatReq.setWarningId(String.valueOf(warningRecord.getId()));
|
|
|
+ chatReq.setCounts(1);//问答次数
|
|
|
+
|
|
|
+ chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
+ chatReq.setCreateTime(DateUtils.getNowDate());
|
|
|
+ this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
|
|
|
+ }
|
|
|
+
|
|
|
private void addChatRecordByYCSG(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category, BigDecimal exceedVal, BigDecimal lastVal) {
|
|
|
ChatReq chatReq = new ChatReq();
|
|
|
//保存聊天记录
|
|
@@ -5668,6 +5892,29 @@ public class AsyncTask {
|
|
|
System.out.println("\n对已有分组结果按键反转排序(降序):");
|
|
|
reversedAfter.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
|
|
|
+
|
|
|
+ System.out.println("------");
|
|
|
+ List<BigDecimal> list = new ArrayList<>();
|
|
|
+ list.add(BigDecimal.valueOf(1));
|
|
|
+ list.add(BigDecimal.valueOf(1.2));
|
|
|
+ list.add(BigDecimal.valueOf(1.4));
|
|
|
+ list.add(BigDecimal.valueOf(1.5));
|
|
|
+ list.add(BigDecimal.valueOf(1.00));
|
|
|
+ String join = StringUtil.join(list, "mg/L、");
|
|
|
+ System.out.println(join);
|
|
|
+
|
|
|
+
|
|
|
+ int size = list.size();
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ BigDecimal bigDecimal = list.get(i);
|
|
|
+ if(i < size - 1)
|
|
|
+ sb.append(bigDecimal).append("mg/L、");
|
|
|
+ else
|
|
|
+ sb.append("mg/L");
|
|
|
+ }
|
|
|
+ System.out.println(sb.toString());
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -5939,14 +6186,15 @@ public class AsyncTask {
|
|
|
}
|
|
|
|
|
|
|
|
|
- if(!Objects.isNull(tpRccJqr)){
|
|
|
+ //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
|
|
|
+ /*if(!Objects.isNull(tpRccJqr)){
|
|
|
BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
|
|
|
warningMoreExceed = handleXinYiWarningRecordRobotMore(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
if(warningMoreExceed.isBreakpoint()){
|
|
|
breakpointCount++;
|
|
|
breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
|
|
|
//判断 增加容错
|
|
@@ -6166,12 +6414,13 @@ public class AsyncTask {
|
|
|
}
|
|
|
|
|
|
//总磷
|
|
|
- if(!Objects.isNull(tpRccJqr) && tpRccJqr.compareTo(BigDecimal.ZERO) > 0 && ecczlxyExecute){
|
|
|
+ //2025年04月16日18:29:37 进水总磷因为大模型有点问题,暂时注释掉 ToDo 后续放开
|
|
|
+ /*if(!Objects.isNull(tpRccJqr) && tpRccJqr.compareTo(BigDecimal.ZERO) > 0 && ecczlxyExecute){
|
|
|
BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
|
|
|
if(!Objects.isNull(cszlBzz)){
|
|
|
handleXinYiWarningsRobotOrigin(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
|
|
|
//2#缺氧出-硝酸盐
|