|
@@ -12,7 +12,7 @@ import com.slibra.business.mapper.*;
|
|
|
import com.slibra.business.req.ChatReq;
|
|
|
import com.slibra.business.req.DecisionReq;
|
|
|
import com.slibra.business.res.ChartBasic;
|
|
|
-import com.slibra.business.res.ShowValueBasic;
|
|
|
+import com.slibra.business.res.ShowValueChartBasic;
|
|
|
import com.slibra.common.constant.MyConstants;
|
|
|
import com.slibra.common.enums.BusinessEnum;
|
|
|
import com.slibra.common.enums.DataSourceType;
|
|
@@ -839,44 +839,46 @@ public class RyTask
|
|
|
|
|
|
/**
|
|
|
* 带图形的构建展示数据
|
|
|
+ *
|
|
|
* @param tXinyiWarningRecord
|
|
|
* @param tXinyiIndustry
|
|
|
* @param normConfig
|
|
|
+ * @param date
|
|
|
+ * @param yjHour
|
|
|
* @return
|
|
|
*/
|
|
|
- private String buildShowValueWithCharts(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, List<ChartBasic> chartsDataList) {
|
|
|
+ private String buildShowValueWithCharts(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, List<ChartBasic> chartsDataList, String date, String yjHour) {
|
|
|
JSONObject result = new JSONObject();
|
|
|
// JSONObject basic = new JSONObject();
|
|
|
Integer status = tXinyiWarningRecord.getStatus();
|
|
|
Date warningTime = tXinyiWarningRecord.getTime();
|
|
|
String remark = tXinyiWarningRecord.getRemark();
|
|
|
int count = DateUtils.differentHoursByMillisecond(warningTime, DateUtils.getNowDate()) + 1;
|
|
|
- ShowValueBasic showValueBasic = new ShowValueBasic();
|
|
|
+ ShowValueChartBasic showValueChartBasic = new ShowValueChartBasic();
|
|
|
if("0".equals(remark)){//水质报警
|
|
|
- showValueBasic.setH("在线仪表");
|
|
|
- showValueBasic.setF(tXinyiWarningRecord.getLevel());
|
|
|
+ showValueChartBasic.setH("在线仪表");
|
|
|
}else if("1".equals(remark)){//生化报警
|
|
|
- showValueBasic.setH("在线仪表");
|
|
|
+ showValueChartBasic.setH("在线仪表");
|
|
|
}else if("2".equals(remark)){//预测报错
|
|
|
- showValueBasic.setH("预测");
|
|
|
- showValueBasic.setF(tXinyiWarningRecord.getLevel());
|
|
|
+ showValueChartBasic.setH("预测");
|
|
|
}else {//机器人化验室报警
|
|
|
- showValueBasic.setH("化验室");
|
|
|
- showValueBasic.setF(tXinyiWarningRecord.getLevel());
|
|
|
+ showValueChartBasic.setH("化验室");
|
|
|
}
|
|
|
//通用的
|
|
|
// showValueBasic.setA(tXinyiWarningRecord.getReason());
|
|
|
- showValueBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
|
|
|
- showValueBasic.setC(tXinyiWarningRecord.getWarningVal());
|
|
|
- showValueBasic.setD(tXinyiWarningRecord.getControlVal());
|
|
|
- showValueBasic.setE(tXinyiWarningRecord.getDesignVal());
|
|
|
- showValueBasic.setG(Math.min(count, MAX_COUNT));
|
|
|
+ showValueChartBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
|
|
|
+ showValueChartBasic.setC(date + " " + yjHour);//预计超标时间
|
|
|
+ showValueChartBasic.setD(tXinyiWarningRecord.getWarningVal());
|
|
|
+ showValueChartBasic.setE(tXinyiWarningRecord.getForecastVal());
|
|
|
+ showValueChartBasic.setF(tXinyiWarningRecord.getControlVal());
|
|
|
+ showValueChartBasic.setG(tXinyiWarningRecord.getDesignVal());
|
|
|
+// showValueChartBasic.setH(Math.min(count, MAX_COUNT));
|
|
|
if(tXinyiWarningRecord.getType() != 2)
|
|
|
- showValueBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
|
|
|
+ showValueChartBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
|
|
|
else
|
|
|
- showValueBasic.setI(status == 0 ? "预警中" : "已完成");
|
|
|
+ showValueChartBasic.setI(status == 0 ? "预警中" : "已完成");
|
|
|
|
|
|
- result.put("basic", showValueBasic);
|
|
|
+ result.put("basic", showValueChartBasic);
|
|
|
JSONObject jsData = getJsonObject(tXinyiIndustry, normConfig);//进水数据
|
|
|
result.put("jsData", jsData);
|
|
|
JSONObject csData = getCsonObject(tXinyiIndustry, normConfig);//出水数据
|
|
@@ -1249,6 +1251,7 @@ public class RyTask
|
|
|
String task = jsonObject.getString("task");
|
|
|
String hour = jsonObject.getString("hour");
|
|
|
String pred = jsonObject.getString("pred");
|
|
|
+ String date = jsonObject.getString("date");
|
|
|
if(StringUtils.isNotBlank(pred) && pred.contains(",")){
|
|
|
String[] split = pred.split(",");
|
|
|
if(split.length != 3){
|
|
@@ -1258,14 +1261,14 @@ public class RyTask
|
|
|
return;
|
|
|
}
|
|
|
//解析数据 处理报警 调研prompt 保存等
|
|
|
- this.handlePredictorWarning(split, hour, task, tXinyiIndustries6, tXinyiRobots6);
|
|
|
+ this.handlePredictorWarning(split, hour, task, tXinyiIndustries6, tXinyiRobots6, date);
|
|
|
}else {
|
|
|
log.error("预测数据返回结果为{},无法正常解析", result);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void handlePredictorWarning(String[] split, String hour, String task, List<TXinyiIndustry> tXinyiIndustries6, List<TXinyiRobot> tXinyiRobots6) {
|
|
|
+ private void handlePredictorWarning(String[] split, String hour, String task, List<TXinyiIndustry> tXinyiIndustries6, List<TXinyiRobot> tXinyiRobots6, String date) {
|
|
|
//获取配置表
|
|
|
List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
|
|
|
if(CollectionUtils.isEmpty(tXinyiNormConfigs)) {
|
|
@@ -1295,7 +1298,7 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(cscodBzz, split, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_COD_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(cscodBzz, split, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_COD_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else if("ss".equals(task)){
|
|
|
BigDecimal csSSBzz = normConfig.getCsssBzz();
|
|
|
BigDecimal csssGkz = normConfig.getCsssGkz();
|
|
@@ -1315,7 +1318,7 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(csSSBzz, split, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(csSSBzz, split, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else if("tn".equals(task)){
|
|
|
BigDecimal cszzBzz = normConfig.getCszzBzz();
|
|
|
BigDecimal cszzGkz = normConfig.getCszzGkz();
|
|
@@ -1335,7 +1338,7 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(cszzBzz, split, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_TN_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(cszzBzz, split, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_TN_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else if("tp".equals(task)){
|
|
|
BigDecimal cszlBzz = normConfig.getCszlBzz();
|
|
|
BigDecimal cszlGkz = normConfig.getCszlGkz();
|
|
@@ -1355,7 +1358,7 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(cszlBzz, split, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_TP_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(cszlBzz, split, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_TP_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else if("nh3".equals(task)){
|
|
|
BigDecimal csadBzz = normConfig.getCsadBzz();
|
|
|
BigDecimal csadGkz = normConfig.getCsadGkz();
|
|
@@ -1375,7 +1378,7 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(csadBzz, split, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(csadBzz, split, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else if("xsy1".equals(task)){
|
|
|
BigDecimal cscodBzz = new BigDecimal(XIAOSUANYAN_BZK);
|
|
|
BigDecimal cscodGkz = new BigDecimal(XIAOSUANYAN_GKZ);
|
|
@@ -1395,7 +1398,7 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(cscodBzz, split, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_XSY_1_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(cscodBzz, split, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_XSY_1_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else if("xsy2".equals(task)){
|
|
|
BigDecimal cscodBzz = new BigDecimal(XIAOSUANYAN_BZK);
|
|
|
BigDecimal cscodGkz = new BigDecimal(XIAOSUANYAN_GKZ);
|
|
@@ -1415,17 +1418,19 @@ public class RyTask
|
|
|
chartBasic.setVal(new BigDecimal(val));
|
|
|
chartsDataList.add(chartBasic);
|
|
|
}
|
|
|
- handleXinYiWarningsYC(cscodBzz, split, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_XSY_2_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList);
|
|
|
+ handleXinYiWarningsYC(cscodBzz, split, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_XSY_2_YC.getCode(), hour, normConfig,tXinyiIndustry.getCsCod(), tXinyiIndustry, chartsDataList, date);
|
|
|
}else {
|
|
|
log.error("暂未支持的类型{}", task);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- private void handleXinYiWarningsYC(BigDecimal csBzz, String[] split, BigDecimal csGkz, String category, String hour, TXinyiNormConfig normConfig, BigDecimal currentVal, TXinyiIndustry tXinyiIndustry, List<ChartBasic> chartsDataList) {
|
|
|
+ private void handleXinYiWarningsYC(BigDecimal csBzz, String[] split, BigDecimal csGkz, String category, String hour, TXinyiNormConfig normConfig, BigDecimal currentVal, TXinyiIndustry tXinyiIndustry, List<ChartBasic> chartsDataList, String date) {
|
|
|
BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
|
|
|
TXinyiWarningRecord tXinyiWarningRecord = null;
|
|
|
- for (String forecast : split) {
|
|
|
+ String yjHour = null;
|
|
|
+ for (int i = 0, splitLength = split.length; i < splitLength; i++) {
|
|
|
+ String forecast = split[i];
|
|
|
BigDecimal forecastVal = new BigDecimal(forecast);
|
|
|
tXinyiWarningRecord = new TXinyiWarningRecord();
|
|
|
/*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
|
|
@@ -1439,26 +1444,27 @@ public class RyTask
|
|
|
tXinyiWarningRecord.setControlVal(csGkz);
|
|
|
tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
|
|
|
- tXinyiWarningRecord.setRemark("0");
|
|
|
+ tXinyiWarningRecord.setRemark("2");
|
|
|
|
|
|
//2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
|
|
|
- if(Objects.isNull(forecastVal)){
|
|
|
+ if (Objects.isNull(forecastVal)) {
|
|
|
tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING_YC);
|
|
|
tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
|
|
|
- }else if(forecastVal.compareTo(multiply) > 0){//一级
|
|
|
+ } else if (forecastVal.compareTo(multiply) > 0) {//一级
|
|
|
tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING_YC);
|
|
|
tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
|
|
|
- }else if(forecastVal.compareTo(csBzz) >= 0 && forecastVal.compareTo(multiply) <= 0){//二级
|
|
|
+ } else if (forecastVal.compareTo(csBzz) >= 0 && forecastVal.compareTo(multiply) <= 0) {//二级
|
|
|
tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING_YC);
|
|
|
tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
|
|
|
- }else if(!Objects.isNull(csGkz) && forecastVal.compareTo(csGkz) > 0){
|
|
|
+ } else if (!Objects.isNull(csGkz) && forecastVal.compareTo(csGkz) > 0) {
|
|
|
tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING_YC);
|
|
|
tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
tXinyiWarningRecord = null;//这种的无需处理
|
|
|
}
|
|
|
- if(!Objects.isNull(tXinyiWarningRecord)){
|
|
|
+ if (!Objects.isNull(tXinyiWarningRecord)) {
|
|
|
log.info("预测报警中出现了超标的情况,循环可以退出了");
|
|
|
+ yjHour = hour.split(",")[i];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -1485,7 +1491,7 @@ public class RyTask
|
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
}else {
|
|
|
//继续调用大模型prompt
|
|
|
- this.askBigModelForYC(tXinyiWarningRecord, tXinyiIndustry, normConfig, chartsDataList);
|
|
|
+ this.askBigModelForYC(tXinyiWarningRecord, tXinyiIndustry, normConfig, chartsDataList, date, yjHour);
|
|
|
}
|
|
|
}else{
|
|
|
log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
|
|
@@ -1495,14 +1501,14 @@ public class RyTask
|
|
|
this.addChatRecordByWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig);
|
|
|
}else {
|
|
|
//继续调用决策
|
|
|
- this.askBigModelForYC(xinyiWarningRecord, tXinyiIndustry, normConfig, chartsDataList);
|
|
|
+ this.askBigModelForYC(xinyiWarningRecord, tXinyiIndustry, normConfig, chartsDataList, date, yjHour);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void askBigModelForYC(TXinyiWarningRecord xinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, List<ChartBasic> chartsDataList) {
|
|
|
+ private void askBigModelForYC(TXinyiWarningRecord xinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, List<ChartBasic> chartsDataList, String date, String yjHour) {
|
|
|
log.info("预测进入了后台接口调⽤⼤模型获取问答结果处理(预测)");
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
String sessionId = IdUtils.simpleUUID();
|
|
@@ -1549,7 +1555,7 @@ public class RyTask
|
|
|
chatReq.setSessionId(sessionId);
|
|
|
chatReq.setType(3);//0问答 1决策 2本地 3仿真预测
|
|
|
chatReq.setModule(3);//0专家问答 1智能工单 2智能体助手 3告警 4简报
|
|
|
- String showVal = this.buildShowValueWithCharts(xinyiWarningRecord, tXinyiIndustry, normConfig, chartsDataList);
|
|
|
+ String showVal = this.buildShowValueWithCharts(xinyiWarningRecord, tXinyiIndustry, normConfig, chartsDataList, date, yjHour);
|
|
|
chatReq.setShowVal(showVal);
|
|
|
chatReq.setQuestion(shWarningPrompt);
|
|
|
chatReq.setAnswer(sb.toString());
|