AsyncTask.java 112 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850
  1. package com.slibra.quartz.task;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.alibaba.fastjson2.JSONObject;
  4. import com.alibaba.fastjson2.JSONWriter;
  5. import com.google.protobuf.ByteString;
  6. import com.slibra.business.domain.*;
  7. import com.slibra.business.mapper.*;
  8. import com.slibra.business.req.*;
  9. import com.slibra.business.res.ShowValueCSBasic;
  10. import com.slibra.business.res.ShowValueJSBasic;
  11. import com.slibra.business.res.ShowValueSHBasic;
  12. import com.slibra.common.DecimalUtils;
  13. import com.slibra.common.config.BigModelConfig;
  14. import com.slibra.common.constant.MyConstants;
  15. import com.slibra.common.enums.BusinessEnum;
  16. import com.slibra.common.utils.DateUtils;
  17. import com.slibra.common.utils.LocalDateTimeUtil;
  18. import com.slibra.common.utils.StringUtils;
  19. import com.slibra.common.utils.uuid.IdUtils;
  20. import inference.InferenceAPIsServiceGrpc;
  21. import inference.PredictionResponse;
  22. import inference.PredictionsRequest;
  23. import io.grpc.ManagedChannel;
  24. import io.grpc.ManagedChannelBuilder;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.scheduling.annotation.Async;
  28. import org.springframework.stereotype.Component;
  29. import org.springframework.util.CollectionUtils;
  30. import java.io.IOException;
  31. import java.math.BigDecimal;
  32. import java.math.RoundingMode;
  33. import java.util.*;
  34. import static com.slibra.common.constant.MyConstants.*;
  35. @Component
  36. @Slf4j
  37. public class AsyncTask {
  38. @Autowired
  39. private TXinyiIndustryMapper xinyiIndustryMapper;
  40. @Autowired
  41. private TXinyiNormConfigMapper xinyiNormConfigMapper;
  42. @Autowired
  43. private TXinyiWarningRecordMapper xinyiWarningRecordMapper;
  44. @Autowired
  45. private TXinyiChatRecordMapper xinyiChatRecordMapper;
  46. @Autowired
  47. private TXinyiDailyMapper xinyiDailyMapper;
  48. @Autowired
  49. private TXinyiCalculateMapper xinyiCalculateMapper;
  50. @Autowired
  51. private TXinyiRobotMapper xinyiRobotMapper;
  52. @Autowired
  53. private TXinyiForecastComparisonMapper xinyiForecastComparisonMapper;
  54. @Autowired
  55. private TXinyiBigTableHourMapper xinyiBigTableHourMapper;
  56. @Autowired
  57. private BigModelConfig bigModelConfig;
  58. /**
  59. *
  60. * 异步处理告警任务
  61. * @param tXinyiIndustry
  62. */
  63. @Async("customizeExecutor")
  64. public void handleWarning(TXinyiIndustry tXinyiIndustry){
  65. //2024年6月18日10:45:20 额外计算一下预测的准确度
  66. try {
  67. this.updateForecastComparisonByIndustry(tXinyiIndustry);
  68. } catch (Exception e) {
  69. log.error("-------------------------------更新预测准确度的时候异常,异常信息为{}", e.getMessage());
  70. }
  71. log.info("进入了定时任务保存工业库数据并触发报警操作");
  72. //获取配置表
  73. List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  74. if(CollectionUtils.isEmpty(tXinyiNormConfigs))
  75. throw new RuntimeException("未查询到配置信息");
  76. TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  77. //2024年6月7日15:26:44 把一些额外的计算的值,同时记录下来(xinyiCalculate对象在生化报警可能用的到)
  78. TXinyiCalculate xinyiCalculate = this.addCalculateByIndustry(tXinyiIndustry, normConfig);
  79. this.xinyiCalculateMapper.insertTXinyiCalculate(xinyiCalculate);
  80. //水质报警
  81. this.handleSZWarning(tXinyiIndustry, normConfig);
  82. //2024年5月28日14:14:26 下面是新增的 生化报警处理
  83. this.handleSHWarning(tXinyiIndustry, normConfig, xinyiCalculate);
  84. //2024年7月3日18:01:13 额外处理大表数据
  85. this.addBigTable(tXinyiIndustry, xinyiCalculate);
  86. }
  87. private void addBigTable(TXinyiIndustry tXinyiIndustry, TXinyiCalculate xinyiCalculate) {
  88. TXinyiBigTableHour xinyiBigTableHour = TXinyiBigTableHour.builder().build();
  89. //处理工业库的在线数据
  90. this.addIndustry2BigTable(xinyiBigTableHour, tXinyiIndustry);
  91. //处理计算的数据
  92. this.addCalculate2BigTable(xinyiBigTableHour, xinyiCalculate);
  93. //插入
  94. this.xinyiBigTableHourMapper.insertTXinyiBigTableHour(xinyiBigTableHour);
  95. }
  96. private void addIndustry2BigTable(TXinyiBigTableHour xinyiBigTableHour, TXinyiIndustry tXinyiIndustry) {
  97. //2024年7月5日18:13:43 处理时间和日期
  98. xinyiBigTableHour.setTestDate(tXinyiIndustry.getTestDate());
  99. xinyiBigTableHour.setTestHour(tXinyiIndustry.getTestHour());
  100. xinyiBigTableHour.setGyJsCod(tXinyiIndustry.getJsCod());
  101. xinyiBigTableHour.setGyJsPh(tXinyiIndustry.getJsPh());
  102. xinyiBigTableHour.setGyJsSs(tXinyiIndustry.getJsSs());
  103. xinyiBigTableHour.setGyJsTp(tXinyiIndustry.getJsTp());
  104. xinyiBigTableHour.setGyJsTn(tXinyiIndustry.getJsTn());
  105. xinyiBigTableHour.setGyJsNh3(tXinyiIndustry.getJsNh3());
  106. xinyiBigTableHour.setGyJsSwPh(tXinyiIndustry.getJsSwPh());
  107. xinyiBigTableHour.setGyJsBfyw(tXinyiIndustry.getJsBfyw());
  108. xinyiBigTableHour.setGyCsSlqc(tXinyiIndustry.getCsSlqc());
  109. xinyiBigTableHour.setGyCsCod(tXinyiIndustry.getCsCod());
  110. xinyiBigTableHour.setGyCsPh(tXinyiIndustry.getCsPh());
  111. xinyiBigTableHour.setGyCsSs(tXinyiIndustry.getCsSs());
  112. xinyiBigTableHour.setGyCsTn(tXinyiIndustry.getCsTn());
  113. xinyiBigTableHour.setGyCsTp(tXinyiIndustry.getCsTp());
  114. xinyiBigTableHour.setGyCsNh3(tXinyiIndustry.getCsNh3());
  115. xinyiBigTableHour.setGyOneHyzdDo(tXinyiIndustry.getOneHyzdDo());
  116. xinyiBigTableHour.setGyOneHymdDo(tXinyiIndustry.getOneHymdDo());
  117. xinyiBigTableHour.setGyTwoHyzdDo(tXinyiIndustry.getTwoHyzdDo());
  118. xinyiBigTableHour.setGyTwoHymdDo(tXinyiIndustry.getTwoHymdDo());
  119. xinyiBigTableHour.setGyOneMlss(tXinyiIndustry.getOneMlss());
  120. xinyiBigTableHour.setGyTwoMlss(tXinyiIndustry.getTwoMlss());
  121. xinyiBigTableHour.setGyJsTds(tXinyiIndustry.getJsTds());
  122. xinyiBigTableHour.setGyJsSlq(tXinyiIndustry.getJsSlq());
  123. xinyiBigTableHour.setGyNHlbOneGp(tXinyiIndustry.getNHlbOneGp());
  124. xinyiBigTableHour.setGyNHlbTwoGp(tXinyiIndustry.getNHlbTwoGp());
  125. xinyiBigTableHour.setGyNHlbThreeGp(tXinyiIndustry.getNHlbThreeGp());
  126. xinyiBigTableHour.setGyNHlbFourGp(tXinyiIndustry.getNHlbFourGp());
  127. xinyiBigTableHour.setGyNhlBFiveGp(tXinyiIndustry.getNhlBFiveGp());
  128. xinyiBigTableHour.setGyNHlbSixGp(tXinyiIndustry.getNHlbSixGp());
  129. xinyiBigTableHour.setGyWHlbOneGp(tXinyiIndustry.getWHlbOneGp());
  130. xinyiBigTableHour.setGyWHlbTwoGp(tXinyiIndustry.getWHlbTwoGp());
  131. xinyiBigTableHour.setGyWHlbThreeGp(tXinyiIndustry.getWHlbThreeGp());
  132. xinyiBigTableHour.setGyWHlbFourGp(tXinyiIndustry.getWHlbFourGp());
  133. xinyiBigTableHour.setGyWHlbFiveGp(tXinyiIndustry.getWHlbFiveGp());
  134. xinyiBigTableHour.setGyFjOne(tXinyiIndustry.getFjOne());
  135. xinyiBigTableHour.setGyFjTwo(tXinyiIndustry.getFjTwo());
  136. xinyiBigTableHour.setGyFjThree(tXinyiIndustry.getFjThree());
  137. xinyiBigTableHour.setGyFjFour(tXinyiIndustry.getFjFour());
  138. xinyiBigTableHour.setGyFjFive(tXinyiIndustry.getFjFive());
  139. xinyiBigTableHour.setGyFjSix(tXinyiIndustry.getFjSix());
  140. xinyiBigTableHour.setGyKqllOne(tXinyiIndustry.getKqllOne());
  141. xinyiBigTableHour.setGyKqllTwo(tXinyiIndustry.getKqllTwo());
  142. xinyiBigTableHour.setGyKqllThree(tXinyiIndustry.getKqllThree());
  143. xinyiBigTableHour.setGyKqllFour(tXinyiIndustry.getKqllFour());
  144. xinyiBigTableHour.setGyKqllFive(tXinyiIndustry.getKqllFive());
  145. xinyiBigTableHour.setGyKqllSix(tXinyiIndustry.getKqllSix());
  146. xinyiBigTableHour.setGySjtyjly(tXinyiIndustry.getSJTYJLY());
  147. xinyiBigTableHour.setGyCljyssll(tXinyiIndustry.getCLJYSSLL());
  148. xinyiBigTableHour.setGyHycRjyAll(tXinyiIndustry.getHycRjyAll());
  149. xinyiBigTableHour.setGyHycRjyZdAll(tXinyiIndustry.getHycRjyZdAll());
  150. xinyiBigTableHour.setGyHycWnndAll(tXinyiIndustry.getHycWnndAll());
  151. xinyiBigTableHour.setGyClP04Ycz(tXinyiIndustry.getCLP04YCZ());
  152. }
  153. private void addCalculate2BigTable(TXinyiBigTableHour xinyiBigTableHour, TXinyiCalculate xinyiCalculate) {
  154. xinyiBigTableHour.setJsJsTdb(xinyiCalculate.getJsTdb());
  155. xinyiBigTableHour.setJsJsTlb(xinyiCalculate.getJsTlb());
  156. xinyiBigTableHour.setJsJsBodBCod(xinyiCalculate.getJsBodBCod());
  157. xinyiBigTableHour.setJsYyqHrt(xinyiCalculate.getYyqHrt());
  158. xinyiBigTableHour.setJsQyqHrt(xinyiCalculate.getQyqHrt());
  159. xinyiBigTableHour.setJsHyqHrt(xinyiCalculate.getHyqHrt());
  160. xinyiBigTableHour.setJsHfxwnndzb(xinyiCalculate.getHFXWNNDZB());
  161. xinyiBigTableHour.setJsFM(xinyiCalculate.getFM());
  162. xinyiBigTableHour.setJsGsls(xinyiCalculate.getGSLS());
  163. xinyiBigTableHour.setJsGslsOne(xinyiCalculate.getGslsOne());
  164. xinyiBigTableHour.setJsGslsTwo(xinyiCalculate.getGslsTwo());
  165. xinyiBigTableHour.setJsXgsGsls(xinyiCalculate.getXgsGsls());
  166. xinyiBigTableHour.setJsXlcscBmfh(xinyiCalculate.getXlcscBmfh());
  167. xinyiBigTableHour.setJsXlcscHrt(xinyiCalculate.getXlcscHrt());
  168. xinyiBigTableHour.setJsCccdcBmfh(xinyiCalculate.getCccdcBmfh());
  169. xinyiBigTableHour.setJsCccdcHrt(xinyiCalculate.getCccdcHrt());
  170. xinyiBigTableHour.setJsEccBmfh(xinyiCalculate.getEccBmfh());
  171. xinyiBigTableHour.setJsEccHrt(xinyiCalculate.getEccHrt());
  172. xinyiBigTableHour.setJsEccGtfh(xinyiCalculate.getEccGtfh());
  173. xinyiBigTableHour.setJsClsnJcsj(xinyiCalculate.getClsnJcsj());
  174. xinyiBigTableHour.setJsXgcdcQsqSsls(xinyiCalculate.getXgcdcQsqSsls());
  175. xinyiBigTableHour.setJsWhlb(xinyiCalculate.getWHLB());
  176. xinyiBigTableHour.setJsNhlb(xinyiCalculate.getNHLB());
  177. xinyiBigTableHour.setJsWdscnl(xinyiCalculate.getWDSCNL());
  178. xinyiBigTableHour.setJsQsb(xinyiCalculate.getQSB());
  179. xinyiBigTableHour.setJsFcxsl(xinyiCalculate.getFCXSL());
  180. xinyiBigTableHour.setJsFcxslbl(xinyiCalculate.getFCXSLBL());
  181. }
  182. /**
  183. * 额外计算一下预测的准确度
  184. * @param tXinyiIndustry
  185. */
  186. private void updateForecastComparisonByIndustry(TXinyiIndustry tXinyiIndustry) {
  187. BigDecimal csCod = tXinyiIndustry.getCsCod();
  188. BigDecimal csSs = tXinyiIndustry.getCsSs();
  189. BigDecimal csTn = tXinyiIndustry.getCsTn();
  190. BigDecimal csTp = tXinyiIndustry.getCsTp();
  191. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  192. String testHour = tXinyiIndustry.getTestHour();
  193. //时间段1
  194. List<TXinyiForecastComparison> tXinyiForecastComparisons1 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeOne(testHour).build());
  195. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons1)){
  196. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons1) {
  197. BigDecimal hsForecastOne = tXinyiForecastComparison.getHsForecastOne();
  198. BigDecimal yyForecastOne = tXinyiForecastComparison.getYyForecastOne();
  199. if("cod".equals(tXinyiForecastComparison.getCategory())){
  200. tXinyiForecastComparison.setRealOne(csCod);
  201. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  202. if(!Objects.isNull(hsForecastOne))
  203. tXinyiForecastComparison.setHsErrorRateOne((csCod.subtract(hsForecastOne)).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  204. if(!Objects.isNull(yyForecastOne))
  205. tXinyiForecastComparison.setYyErrorRateOne((csCod.subtract(yyForecastOne)).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  206. }
  207. }
  208. if("ss".equals(tXinyiForecastComparison.getCategory())){
  209. tXinyiForecastComparison.setRealOne(csSs);
  210. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  211. if(!Objects.isNull(hsForecastOne))
  212. tXinyiForecastComparison.setHsErrorRateOne((csSs.subtract(hsForecastOne)).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  213. if(!Objects.isNull(yyForecastOne))
  214. tXinyiForecastComparison.setYyErrorRateOne((csSs.subtract(yyForecastOne)).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  215. }
  216. }
  217. //2024年6月21日16:28:56 tn总氮的预测用xsy1和xsy2计算 并从化验库获取
  218. /*if("tn".equals(tXinyiForecastComparison.getCategory())){
  219. tXinyiForecastComparison.setRealOne(csTn);
  220. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  221. if(!Objects.isNull(hsForecastOne))
  222. tXinyiForecastComparison.setHsErrorRateOne((csTn.subtract(hsForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  223. if(!Objects.isNull(yyForecastOne))
  224. tXinyiForecastComparison.setYyErrorRateOne((csTn.subtract(yyForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  225. }
  226. }*/
  227. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  228. /*if("tp".equals(tXinyiForecastComparison.getCategory())){
  229. tXinyiForecastComparison.setRealOne(csTp);
  230. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  231. tXinyiForecastComparison.setHsErrorRateOne((csTp.subtract(hsForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  232. tXinyiForecastComparison.setYyErrorRateOne((csTp.subtract(yyForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  233. }
  234. }*/
  235. if("nh3".equals(tXinyiForecastComparison.getCategory())){
  236. tXinyiForecastComparison.setRealOne(csNh3);
  237. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  238. if(!Objects.isNull(hsForecastOne))
  239. tXinyiForecastComparison.setHsErrorRateOne((csNh3.subtract(hsForecastOne)).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  240. if(!Objects.isNull(yyForecastOne))
  241. tXinyiForecastComparison.setYyErrorRateOne((csNh3.subtract(yyForecastOne)).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  242. }
  243. }
  244. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  245. }
  246. }
  247. //时间段2
  248. List<TXinyiForecastComparison> tXinyiForecastComparisons2 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeTwo(testHour).build());
  249. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons2)){
  250. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons2) {
  251. BigDecimal hsForecastTwo = tXinyiForecastComparison.getHsForecastTwo();
  252. BigDecimal yyForecastTwo = tXinyiForecastComparison.getYyForecastTwo();
  253. if("cod".equals(tXinyiForecastComparison.getCategory())){
  254. tXinyiForecastComparison.setRealTwo(csCod);
  255. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  256. if(!Objects.isNull(hsForecastTwo))
  257. tXinyiForecastComparison.setHsErrorRateTwo((csCod.subtract(hsForecastTwo)).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  258. if(!Objects.isNull(yyForecastTwo))
  259. tXinyiForecastComparison.setYyErrorRateTwo((csCod.subtract(yyForecastTwo)).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  260. }
  261. }
  262. if("ss".equals(tXinyiForecastComparison.getCategory())){
  263. tXinyiForecastComparison.setRealTwo(csSs);
  264. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  265. if(!Objects.isNull(hsForecastTwo))
  266. tXinyiForecastComparison.setHsErrorRateTwo((csSs.subtract(hsForecastTwo)).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  267. if(!Objects.isNull(yyForecastTwo))
  268. tXinyiForecastComparison.setYyErrorRateTwo((csSs.subtract(yyForecastTwo)).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  269. }
  270. }
  271. /*if("tn".equals(tXinyiForecastComparison.getCategory())){
  272. tXinyiForecastComparison.setRealTwo(csTn);
  273. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  274. if(!Objects.isNull(hsForecastTwo))
  275. tXinyiForecastComparison.setHsErrorRateTwo((csTn.subtract(hsForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  276. if(!Objects.isNull(yyForecastTwo))
  277. tXinyiForecastComparison.setYyErrorRateTwo((csTn.subtract(yyForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  278. }
  279. }*/
  280. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  281. /*if("tp".equals(tXinyiForecastComparison.getCategory())){
  282. tXinyiForecastComparison.setRealTwo(csTp);
  283. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  284. tXinyiForecastComparison.setHsErrorRateTwo((csTp.subtract(hsForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  285. tXinyiForecastComparison.setYyErrorRateTwo((csTp.subtract(yyForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  286. }
  287. }*/
  288. if("nh3".equals(tXinyiForecastComparison.getCategory())){
  289. tXinyiForecastComparison.setRealTwo(csNh3);
  290. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  291. if(!Objects.isNull(hsForecastTwo))
  292. tXinyiForecastComparison.setHsErrorRateTwo((csNh3.subtract(hsForecastTwo)).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  293. if(!Objects.isNull(yyForecastTwo))
  294. tXinyiForecastComparison.setYyErrorRateTwo((csNh3.subtract(yyForecastTwo)).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  295. }
  296. }
  297. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  298. }
  299. }
  300. //时间段3
  301. List<TXinyiForecastComparison> tXinyiForecastComparisons3 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeThree(testHour).build());
  302. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons3)){
  303. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons3) {
  304. BigDecimal hsForecastThree = tXinyiForecastComparison.getHsForecastThree();
  305. BigDecimal yyForecastThree = tXinyiForecastComparison.getYyForecastThree();
  306. if("cod".equals(tXinyiForecastComparison.getCategory())){
  307. tXinyiForecastComparison.setRealThree(csCod);
  308. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  309. if(!Objects.isNull(hsForecastThree))
  310. tXinyiForecastComparison.setHsErrorRateThree((csCod.subtract(hsForecastThree)).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  311. if(!Objects.isNull(yyForecastThree))
  312. tXinyiForecastComparison.setYyErrorRateThree((csCod.subtract(yyForecastThree)).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  313. }
  314. }
  315. if("ss".equals(tXinyiForecastComparison.getCategory())){
  316. tXinyiForecastComparison.setRealThree(csSs);
  317. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  318. if(!Objects.isNull(hsForecastThree))
  319. tXinyiForecastComparison.setHsErrorRateThree((csSs.subtract(hsForecastThree)).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  320. if(!Objects.isNull(yyForecastThree))
  321. tXinyiForecastComparison.setYyErrorRateThree((csSs.subtract(yyForecastThree)).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  322. }
  323. }
  324. /*if("tn".equals(tXinyiForecastComparison.getCategory())){
  325. tXinyiForecastComparison.setRealThree(csTn);
  326. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  327. if(!Objects.isNull(hsForecastThree))
  328. tXinyiForecastComparison.setHsErrorRateThree((csTn.subtract(hsForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  329. if(!Objects.isNull(yyForecastThree))
  330. tXinyiForecastComparison.setYyErrorRateThree((csTn.subtract(yyForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  331. }
  332. }*/
  333. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  334. /*if("tp".equals(tXinyiForecastComparison.getCategory())){
  335. tXinyiForecastComparison.setRealThree(csTp);
  336. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  337. tXinyiForecastComparison.setHsErrorRateThree((csTp.subtract(hsForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  338. tXinyiForecastComparison.setYyErrorRateThree((csTp.subtract(yyForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  339. }
  340. }*/
  341. if("nh3".equals(tXinyiForecastComparison.getCategory())){
  342. tXinyiForecastComparison.setRealThree(csNh3);
  343. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  344. if(!Objects.isNull(hsForecastThree))
  345. tXinyiForecastComparison.setHsErrorRateThree((csNh3.subtract(hsForecastThree)).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  346. if(!Objects.isNull(yyForecastThree))
  347. tXinyiForecastComparison.setYyErrorRateThree((csNh3.subtract(yyForecastThree)).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  348. }
  349. }
  350. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  351. }
  352. }
  353. }
  354. /**
  355. * 额外计算一下预测的准确度
  356. * @param tXinyiRobot
  357. */
  358. public void updateForecastComparisonByRobot(TXinyiRobot tXinyiRobot) {
  359. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  360. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  361. String testHour = tXinyiRobot.getTestHour();
  362. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  363. BigDecimal csTp = null;
  364. BigDecimal csTn = null;
  365. if(!Objects.isNull(tpRccJqr)){
  366. csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  367. //2024年6月20日13:44:26 先不计算,结果会更准确
  368. //2024年6月21日14:23:14 就是要 除以0.8
  369. // csTp = tpRccJqr;
  370. }
  371. if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr))
  372. csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide(new BigDecimal(2), NUMBER_SCALE_4, RoundingMode.HALF_UP).divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  373. //时间段1
  374. List<TXinyiForecastComparison> tXinyiForecastComparisons1 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeOne(testHour).build());
  375. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons1)){
  376. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons1) {
  377. BigDecimal hsForecastOne = tXinyiForecastComparison.getHsForecastOne();
  378. BigDecimal yyForecastOne = tXinyiForecastComparison.getYyForecastOne();
  379. /*if("xsy1".equals(tXinyiForecastComparison.getCategory())){
  380. tXinyiForecastComparison.setRealOne(no3Hlj1Jqr);
  381. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  382. if(!Objects.isNull(hsForecastOne))
  383. tXinyiForecastComparison.setHsErrorRateOne((no3Hlj1Jqr.subtract(hsForecastOne)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  384. if(!Objects.isNull(yyForecastOne))
  385. tXinyiForecastComparison.setYyErrorRateOne((no3Hlj1Jqr.subtract(yyForecastOne)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  386. }
  387. }
  388. if("xsy2".equals(tXinyiForecastComparison.getCategory())){
  389. tXinyiForecastComparison.setRealOne(no3Hlj2Jqr);
  390. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  391. if(!Objects.isNull(hsForecastOne))
  392. tXinyiForecastComparison.setHsErrorRateOne((no3Hlj2Jqr.subtract(hsForecastOne)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  393. if(!Objects.isNull(yyForecastOne))
  394. tXinyiForecastComparison.setYyErrorRateOne((no3Hlj2Jqr.subtract(yyForecastOne)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  395. }
  396. }*/
  397. //2024年6月21日17:04:01 总磷的真实值也从化验室获取
  398. if("tn".equals(tXinyiForecastComparison.getCategory())){
  399. tXinyiForecastComparison.setRealOne(csTn);
  400. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  401. if(!Objects.isNull(hsForecastOne))
  402. tXinyiForecastComparison.setHsErrorRateOne((csTn.subtract(hsForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  403. if(!Objects.isNull(yyForecastOne))
  404. tXinyiForecastComparison.setYyErrorRateOne((csTn.subtract(yyForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  405. }
  406. }
  407. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  408. if("tp".equals(tXinyiForecastComparison.getCategory())){
  409. tXinyiForecastComparison.setRealOne(csTp);
  410. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  411. if(!Objects.isNull(hsForecastOne))
  412. tXinyiForecastComparison.setHsErrorRateOne((csTp.subtract(hsForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  413. if(!Objects.isNull(yyForecastOne))
  414. tXinyiForecastComparison.setYyErrorRateOne((csTp.subtract(yyForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  415. }
  416. }
  417. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  418. }
  419. }
  420. //时间段2
  421. List<TXinyiForecastComparison> tXinyiForecastComparisons2 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeTwo(testHour).build());
  422. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons2)){
  423. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons2) {
  424. BigDecimal hsForecastTwo = tXinyiForecastComparison.getHsForecastTwo();
  425. BigDecimal yyForecastTwo = tXinyiForecastComparison.getYyForecastTwo();
  426. /*if("xsy1".equals(tXinyiForecastComparison.getCategory())){
  427. tXinyiForecastComparison.setRealTwo(no3Hlj1Jqr);
  428. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  429. if(!Objects.isNull(hsForecastTwo))
  430. tXinyiForecastComparison.setHsErrorRateTwo((no3Hlj1Jqr.subtract(hsForecastTwo)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  431. if(!Objects.isNull(yyForecastTwo))
  432. tXinyiForecastComparison.setYyErrorRateTwo((no3Hlj1Jqr.subtract(yyForecastTwo)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  433. }
  434. }
  435. if("xsy2".equals(tXinyiForecastComparison.getCategory())){
  436. tXinyiForecastComparison.setRealTwo(no3Hlj2Jqr);
  437. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  438. if(!Objects.isNull(hsForecastTwo))
  439. tXinyiForecastComparison.setHsErrorRateTwo((no3Hlj2Jqr.subtract(hsForecastTwo)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  440. if(!Objects.isNull(yyForecastTwo))
  441. tXinyiForecastComparison.setYyErrorRateTwo((no3Hlj2Jqr.subtract(yyForecastTwo)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  442. }
  443. }*/
  444. //2024年6月21日17:04:01 总磷的真实值也从化验室获取
  445. if("tn".equals(tXinyiForecastComparison.getCategory())){
  446. tXinyiForecastComparison.setRealTwo(csTn);
  447. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  448. if(!Objects.isNull(hsForecastTwo))
  449. tXinyiForecastComparison.setHsErrorRateTwo((csTn.subtract(hsForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  450. if(!Objects.isNull(yyForecastTwo))
  451. tXinyiForecastComparison.setYyErrorRateTwo((csTn.subtract(yyForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  452. }
  453. }
  454. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  455. if("tp".equals(tXinyiForecastComparison.getCategory())){
  456. tXinyiForecastComparison.setRealTwo(csTp);
  457. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  458. if(!Objects.isNull(hsForecastTwo))
  459. tXinyiForecastComparison.setHsErrorRateTwo((csTp.subtract(hsForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  460. if(!Objects.isNull(yyForecastTwo))
  461. tXinyiForecastComparison.setYyErrorRateTwo((csTp.subtract(yyForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  462. }
  463. }
  464. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  465. }
  466. }
  467. //时间段3
  468. List<TXinyiForecastComparison> tXinyiForecastComparisons3 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeThree(testHour).build());
  469. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons3)){
  470. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons3) {
  471. BigDecimal hsForecastThree = tXinyiForecastComparison.getHsForecastThree();
  472. BigDecimal yyForecastThree = tXinyiForecastComparison.getYyForecastThree();
  473. /*if("xsy1".equals(tXinyiForecastComparison.getCategory())){
  474. tXinyiForecastComparison.setRealThree(no3Hlj1Jqr);
  475. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  476. if(!Objects.isNull(hsForecastThree))
  477. tXinyiForecastComparison.setHsErrorRateThree((no3Hlj1Jqr.subtract(hsForecastThree)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  478. if(!Objects.isNull(yyForecastThree))
  479. tXinyiForecastComparison.setYyErrorRateThree((no3Hlj1Jqr.subtract(yyForecastThree)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  480. }
  481. }
  482. if("xsy2".equals(tXinyiForecastComparison.getCategory())){
  483. tXinyiForecastComparison.setRealThree(no3Hlj2Jqr);
  484. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  485. if(!Objects.isNull(hsForecastThree))
  486. tXinyiForecastComparison.setHsErrorRateThree((no3Hlj2Jqr.subtract(hsForecastThree)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  487. if(!Objects.isNull(yyForecastThree))
  488. tXinyiForecastComparison.setYyErrorRateThree((no3Hlj2Jqr.subtract(yyForecastThree)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  489. }
  490. }*/
  491. //2024年6月21日17:04:01 总磷的真实值也从化验室获取
  492. if("tn".equals(tXinyiForecastComparison.getCategory())){
  493. tXinyiForecastComparison.setRealThree(csTn);
  494. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  495. if(!Objects.isNull(hsForecastThree))
  496. tXinyiForecastComparison.setHsErrorRateThree((csTn.subtract(hsForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  497. if(!Objects.isNull(yyForecastThree))
  498. tXinyiForecastComparison.setYyErrorRateThree((csTn.subtract(yyForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  499. }
  500. }
  501. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  502. if("tp".equals(tXinyiForecastComparison.getCategory())){
  503. tXinyiForecastComparison.setRealThree(csTp);
  504. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  505. if(!Objects.isNull(hsForecastThree))
  506. tXinyiForecastComparison.setHsErrorRateThree((csTp.subtract(hsForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  507. if(!Objects.isNull(yyForecastThree))
  508. tXinyiForecastComparison.setYyErrorRateThree((csTp.subtract(yyForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  509. }
  510. }
  511. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  512. }
  513. }
  514. }
  515. private TXinyiCalculate addCalculateByIndustry(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  516. //获取的一些配置信息
  517. BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
  518. BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
  519. BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
  520. BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
  521. BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
  522. BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
  523. BigDecimal gfjgzts = normConfig.getGFJGZTS();
  524. BigDecimal gfjckll = normConfig.getGFJCKLL();
  525. BigDecimal fcxbsjll = normConfig.getFCXBSJLL();
  526. BigDecimal fclbsl = normConfig.getFCLBSL();
  527. BigDecimal fcxbgzxl = normConfig.getFCXBGZXL();
  528. //结算结果
  529. TXinyiCalculate tXinyiCalculate = new TXinyiCalculate();
  530. //时间相关
  531. tXinyiCalculate.setTestDate(tXinyiIndustry.getTestDate());
  532. tXinyiCalculate.setTestHour(tXinyiIndustry.getTestHour());
  533. tXinyiCalculate.setTestTime(tXinyiIndustry.getTestTime());
  534. //获取最新的一条日报信息
  535. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  536. if(Objects.isNull(tXinyiDaily)){
  537. //理论不会出现
  538. log.error("没有日报数据");
  539. return null;
  540. }
  541. BigDecimal jsBod5 = tXinyiDaily.getJsBod5();
  542. BigDecimal csBod5 = tXinyiDaily.getCsBod5();
  543. BigDecimal whlR = tXinyiDaily.getWhlR();
  544. BigDecimal oneMlvss = tXinyiDaily.getShcHyOneMlvss();
  545. BigDecimal twoMlvss = tXinyiDaily.getShcHyTwoMlvss();
  546. BigDecimal avgMlvss = null;
  547. if(!Objects.isNull(oneMlvss) && !Objects.isNull(twoMlvss))
  548. avgMlvss = ((oneMlvss.add(twoMlvss)).divide(new BigDecimal(2),4, RoundingMode.HALF_UP));
  549. BigDecimal oneMlss = tXinyiDaily.getShcHyOneMlss();
  550. BigDecimal twoMlss = tXinyiDaily.getShcHyTwoMlss();
  551. BigDecimal avgMlss = null;
  552. if(!Objects.isNull(oneMlss) && !Objects.isNull(twoMlss))
  553. avgMlss = ((oneMlss.add(twoMlss)).divide(new BigDecimal(NUMBER_2),NUMBER_SCALE_4, RoundingMode.HALF_UP));
  554. //工业库的指标
  555. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  556. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  557. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  558. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  559. //计算
  560. if(!Objects.isNull(jsBod5)){
  561. if(!Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.ZERO) > 0)
  562. tXinyiCalculate.setJsTdb(jsBod5.divide(jsTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  563. if(!Objects.isNull(jsTp) && jsTp.compareTo(BigDecimal.ZERO) > 0)
  564. tXinyiCalculate.setJsTlb(jsBod5.divide(jsTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  565. if(!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.ZERO) > 0)
  566. tXinyiCalculate.setJsBodBCod(jsBod5.divide(jsCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  567. if(!Objects.isNull(csBod5) && !Objects.isNull(avgMlss) && avgMlss.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(jsSlq) && jsSlq.compareTo(BigDecimal.ZERO) > 0)
  568. tXinyiCalculate.setFM(new BigDecimal(ONE_DAY_HOURS).multiply((jsBod5.subtract(csBod5))).multiply(jsSlq).divide(avgMlss, NUMBER_SCALE_4, RoundingMode.HALF_UP).divide(new BigDecimal(F_M_LAST), NUMBER_SCALE_4, RoundingMode.HALF_UP));
  569. }
  570. if(!Objects.isNull(avgMlss) && avgMlss.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(avgMlvss) && avgMlvss.compareTo(BigDecimal.ZERO) > 0)
  571. tXinyiCalculate.setHFXWNNDZB(avgMlvss.divide(avgMlss, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  572. if(!Objects.isNull(jsSlq) && jsSlq.compareTo(BigDecimal.ZERO) > 0){
  573. tXinyiCalculate.setYyqHrt(new BigDecimal(YYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  574. tXinyiCalculate.setQyqHrt(new BigDecimal(QYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  575. tXinyiCalculate.setHyqHrt(new BigDecimal(HYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  576. // tXinyiCalculate.setGSLS(jsSlq.divide(new BigDecimal(NUMBER_3600), NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(new BigDecimal(NUMBER_4)).divide((new BigDecimal(Math.PI).multiply(new BigDecimal(NUMBER_0_0_0_3)).multiply(new BigDecimal(NUMBER_0_0_0_3)).multiply(new BigDecimal(NUMBER_4)).multiply(new BigDecimal(NUMBER_4)).multiply(new BigDecimal(NUMBER_97119))) , NUMBER_SCALE_4, RoundingMode.HALF_UP));
  577. tXinyiCalculate.setGSLS(jsSlq.divide(GSLS_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  578. tXinyiCalculate.setGslsOne(jsSlq.divide(new BigDecimal(NUMBER_3600), NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(new BigDecimal(Math.sqrt(Math.sin(Math.toRadians(DOUBLE_75))))).divide(GSLSONE_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  579. tXinyiCalculate.setGslsTwo(jsSlq.divide(new BigDecimal(NUMBER_3600), NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(new BigDecimal(Math.sqrt(Math.sin(Math.toRadians(DOUBLE_75))))).divide(GSLSTWO_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  580. tXinyiCalculate.setXgsGsls(jsSlq.divide(new BigDecimal(NUMBER_3600), NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(new BigDecimal(NUMBER_4)).divide((GSLS_XGS_LAST) , NUMBER_SCALE_4, RoundingMode.HALF_UP));
  581. tXinyiCalculate.setXlcscBmfh(jsSlq.divide(XLCSCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  582. tXinyiCalculate.setXlcscHrt(XLCSCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  583. tXinyiCalculate.setCccdcBmfh(jsSlq.divide(CCCDCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  584. tXinyiCalculate.setCccdcHrt(CCCDCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  585. tXinyiCalculate.setEccBmfh(jsSlq.divide(ECCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  586. tXinyiCalculate.setEccHrt(ECCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  587. //2024年7月1日17:16:16 计算逻辑调整
  588. tXinyiCalculate.setEccGtfh((new BigDecimal(1).add(whlR.divide(BigDecimal_100, NUMBER_SCALE_4, RoundingMode.HALF_UP))).multiply(jsSlq).multiply(new BigDecimal(NUMBER_24)).multiply(avgMlss).divide(ECCGTFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  589. tXinyiCalculate.setClsnJcsj(CLSNJCSJ_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  590. tXinyiCalculate.setXgcdcQsqSsls(jsSlq.multiply(XGCDCQSQSSLS_LAST));
  591. //2024年6月29日15:18:01 增加几个新的计算指标
  592. if(!Objects.isNull(nhlbqdsl) && !Objects.isNull(nhlbdsjll) && !Objects.isNull(nhlbgzxl))
  593. tXinyiCalculate.setNHLB(nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).multiply(BigDecimal_100).divide(jsSlq, 4, RoundingMode.HALF_UP));
  594. if(!Objects.isNull(whlbqdsl) && !Objects.isNull(whlbdsjll) && !Objects.isNull(whlbgzxl))
  595. tXinyiCalculate.setWHLB(whlbqdsl.multiply(whlbdsjll).multiply(whlbgzxl).multiply(BigDecimal_100).divide(jsSlq, 4, RoundingMode.HALF_UP));
  596. if(!Objects.isNull(gfjgzts) && !Objects.isNull(gfjckll))
  597. tXinyiCalculate.setQSB(gfjgzts.multiply(gfjckll).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  598. if(!Objects.isNull(fcxbsjll) && !Objects.isNull(fclbsl) && !Objects.isNull(fcxbgzxl)){
  599. BigDecimal fcxsl = fcxbsjll.multiply(fclbsl).multiply(fcxbgzxl);
  600. tXinyiCalculate.setFCXSL(fcxsl);
  601. //2024年7月3日10:54:28 额外再增加一个字段
  602. tXinyiCalculate.setFCXSLBL(fcxsl.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  603. }
  604. }
  605. return tXinyiCalculate;
  606. }
  607. private void handleSHWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, TXinyiCalculate xinyiCalculate) {
  608. //判断对应指标是否报警 然后调研大模型获取决策信息
  609. // BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  610. //内回流比报警
  611. // BigDecimal nhlbSjz = normConfig.getNhlbSjz();//400
  612. // BigDecimal nhlbnkSxz = normConfig.getNhlbnkSxz();//360
  613. BigDecimal nhlbnkXxz = normConfig.getNhlbnkXxz();//270
  614. // BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
  615. // BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
  616. // BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
  617. /*BigDecimal nhlb = xinyiCalculate.getNHLB();
  618. if(!Objects.isNull(nhlb) && !Objects.isNull(nhlbnkXxz)){
  619. // BigDecimal divide = nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).divide(jsSlq, 4, RoundingMode.HALF_UP);
  620. handleXinYiWarningsSH(nhlbnkXxz, nhlb, BusinessEnum.WarningCategoryEnum.NHLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  621. }*/
  622. //外回流比报警
  623. // BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
  624. // BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
  625. // BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
  626. BigDecimal whlbnkXxz = normConfig.getWhlbnkXxz();//75
  627. // BigDecimal whlbSjz = normConfig.getWhlbSjz();
  628. BigDecimal whlb = xinyiCalculate.getWHLB();
  629. if(!Objects.isNull(whlb) && !Objects.isNull(whlbnkXxz)){
  630. handleXinYiWarningsSH(whlbnkXxz, whlb, BusinessEnum.WarningCategoryEnum.WHLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  631. }
  632. //最新的一条日报数据
  633. /*List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(null);
  634. if(CollectionUtils.isEmpty(tXinyiDailies))
  635. return;//肯定不会出现这种情况 因为有很多历史数据了
  636. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);*/
  637. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  638. if(Objects.isNull(tXinyiDaily))
  639. return;//肯定不会出现这种情况 因为有很多历史数据了 新水厂可能会有这个问题
  640. log.info("生化报警获取日报的最新的一条数据为{}", JSON.toJSONString(tXinyiDaily));
  641. //污泥浓度报警
  642. BigDecimal sjscgkz = null;
  643. //判断是否是夏季
  644. if(LocalDateTimeUtil.isSummer())
  645. sjscgkz = normConfig.getXjwnndXxz();
  646. else
  647. sjscgkz = normConfig.getDjwnndXxz();
  648. //#1
  649. BigDecimal oneMlss = tXinyiIndustry.getOneMlss();
  650. if(!Objects.isNull(oneMlss) && !Objects.isNull(sjscgkz)){
  651. handleXinYiWarningsSH(sjscgkz, oneMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_1.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  652. }
  653. //#1
  654. BigDecimal twoMlss = tXinyiIndustry.getTwoMlss();
  655. if(!Objects.isNull(twoMlss) && !Objects.isNull(sjscgkz)){
  656. handleXinYiWarningsSH(sjscgkz, twoMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_2.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  657. }
  658. //污泥负荷(需要从日报获取数据) 计算 + 部分数据从日报获取
  659. //污泥负荷=[Ls]=24*([BOD_in]-[BOD_off])*[Q_in]/[MLSS]/([V_hao]+[V_que]+[V_yan])/2 kgBOD/(kgMLSS·d)
  660. //2024年6月27日17:18:33 直接从计算结果拿到
  661. BigDecimal fm = xinyiCalculate.getFM();
  662. //2024年6月28日17:17:03 已经配置了新的
  663. BigDecimal wnfhnkXxz = normConfig.getWnfhnkXxz();
  664. if(!Objects.isNull(fm) && !Objects.isNull(wnfhnkXxz)){
  665. handleXinYiWarningsSH(wnfhnkXxz, fm, BusinessEnum.WarningCategoryEnum.WNFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.KGBOD_KGMLSS_D.getCode());
  666. }
  667. //万吨水产泥率(todo 没有计算规则,只能从日报获取)
  668. //挥发性污泥浓度占比(MLVSS/MLSS)
  669. //特殊:小于
  670. BigDecimal hfxwnndzb = xinyiCalculate.getHFXWNNDZB();
  671. BigDecimal hfxwnndzbSjz = normConfig.getHfxwnndzbSjz();
  672. if(!Objects.isNull(hfxwnndzb) && !Objects.isNull(hfxwnndzbSjz)){
  673. handleXinYiWarningsSH(hfxwnndzbSjz, hfxwnndzb, BusinessEnum.WarningCategoryEnum.HFXWNNDZB.getCode(), tXinyiIndustry, normConfig, false, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  674. }
  675. //进水碳氮比
  676. BigDecimal jsTdb = xinyiCalculate.getJsTdb();
  677. BigDecimal jstdbnkzXxz = normConfig.getJstdbnkzXxz();
  678. if(!Objects.isNull(jsTdb) && !Objects.isNull(jstdbnkzXxz)){
  679. handleXinYiWarningsSH(jstdbnkzXxz, jsTdb, BusinessEnum.WarningCategoryEnum.TDB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  680. }
  681. //进水碳磷比
  682. BigDecimal jsTlb = xinyiCalculate.getJsTlb();
  683. BigDecimal jstlbNkz = normConfig.getJstlbNkz();
  684. if(!Objects.isNull(jsTlb) && !Objects.isNull(jstlbNkz)){
  685. handleXinYiWarningsSH(jstlbNkz, jsTlb, BusinessEnum.WarningCategoryEnum.TLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  686. }
  687. //进水BOD与COD比值(生化性)
  688. BigDecimal jsBodBCod = xinyiCalculate.getJsBodBCod();
  689. String jsbodycodbzGkz = normConfig.getJsbodycodbzGkz();
  690. if(!StringUtils.isBlank(jsbodycodbzGkz) && jsbodycodbzGkz.contains("-")){
  691. String[] split = jsbodycodbzGkz.split("-");
  692. sjscgkz = new BigDecimal(split[0]);
  693. if(!Objects.isNull(jsBodBCod)){
  694. handleXinYiWarningsSH(sjscgkz, jsBodBCod, BusinessEnum.WarningCategoryEnum.BODCODB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  695. }
  696. }
  697. //好氧区DO(一池) 2024年5月31日14:04:37 加数据,让他一直报警
  698. BigDecimal shcHyOneDo = tXinyiIndustry.getOneHymdDo();
  699. // BigDecimal shcHyOneDo = new BigDecimal("5");
  700. // BigDecimal hycrjysjzSxz = normConfig.getHycrjysjzSxz();
  701. BigDecimal hycrjyNkz = normConfig.getHycrjyNkz();
  702. if(!Objects.isNull(shcHyOneDo) && !Objects.isNull(hycrjyNkz)){
  703. handleXinYiWarningsSH(hycrjyNkz, shcHyOneDo, BusinessEnum.WarningCategoryEnum.HYQDO_ONE.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  704. }
  705. //好氧区DO(二池) 2024年5月31日14:09:36 溶解氧从日报获取 工业的不准
  706. //2024年6月27日17:00:31 都先从工业库获取,日报没有必要再报警了
  707. BigDecimal shcHyTwoDo = tXinyiIndustry.getTwoHymdDo();
  708. if(!Objects.isNull(shcHyTwoDo) && !Objects.isNull(hycrjyNkz)){
  709. handleXinYiWarningsSH(hycrjyNkz, shcHyTwoDo, BusinessEnum.WarningCategoryEnum.HYQDO_TWO.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  710. }
  711. //气水比
  712. BigDecimal qsb = xinyiCalculate.getQSB();
  713. BigDecimal shcqbNkz = normConfig.getShcqbNkz();
  714. if(!Objects.isNull(qsb) && !Objects.isNull(shcqbNkz))
  715. handleXinYiWarningsSH(shcqbNkz, qsb, BusinessEnum.WarningCategoryEnum.QSB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.M3_M3.getCode());
  716. //二沉池表面负荷
  717. BigDecimal eccBmfh = xinyiCalculate.getEccBmfh();
  718. BigDecimal eccbmfhznkzXxz = normConfig.getEccbmfhznkzXxz();
  719. if(!Objects.isNull(eccBmfh) && !Objects.isNull(eccbmfhznkzXxz)){
  720. handleXinYiWarningsSH(eccbmfhznkzXxz, eccBmfh, BusinessEnum.WarningCategoryEnum.ECC_BMFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.M3_M2_H.getCode());
  721. }
  722. //二沉池固体负荷
  723. BigDecimal eccGtfh = xinyiCalculate.getEccGtfh();
  724. BigDecimal eccgtfhnkxxz = normConfig.getECCGTFHNKXXZ();
  725. if(!Objects.isNull(eccGtfh) && !Objects.isNull(eccgtfhnkxxz)){
  726. handleXinYiWarningsSH(eccgtfhnkxxz, eccGtfh, BusinessEnum.WarningCategoryEnum.ECC_GTFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.KG_M2_D.getCode());
  727. }
  728. //反冲洗水量
  729. //2024年7月3日10:59:32 这里用反冲洗水量比例做计算
  730. BigDecimal fcxslBl = xinyiCalculate.getFCXSLBL();
  731. BigDecimal fcxslblsjzXxz = normConfig.getFcxslblsjzXxz();
  732. if(!Objects.isNull(fcxslBl) && !Objects.isNull(fcxslblsjzXxz))
  733. handleXinYiWarningsSH(fcxslblsjzXxz, fcxslBl, BusinessEnum.WarningCategoryEnum.FCXSL.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  734. }
  735. /**
  736. * 处理信义生化报警的逻辑 统一处理
  737. * @param sjscgkz :实际生产管控值
  738. * @param currentVal
  739. * @param category
  740. * @param tXinyiIndustry
  741. * @param normConfig
  742. * @param normal 是否常规判断:默认都是超过;只有这个挥发性污泥浓度占比(VSS/SS)是小于才报警
  743. * 2024年6月27日15:39:15 调整:生化报警只取实际生产管控指标
  744. * 2024年7月11日10:44:11 新增单位unit 拼接完单位以后返回
  745. *
  746. */
  747. private void handleXinYiWarningsSH(BigDecimal sjscgkz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Boolean normal, String unit) {
  748. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  749. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  750. tXinyiWarningRecord.setStatus(0);
  751. tXinyiWarningRecord.setType(1);
  752. tXinyiWarningRecord.setCategory(category);
  753. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  754. tXinyiWarningRecord.setWarningVal(currentVal);
  755. tXinyiWarningRecord.setDesignVal(sjscgkz);
  756. tXinyiWarningRecord.setControlVal(sjscgkz);
  757. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  758. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  759. tXinyiWarningRecord.setRemark("1");
  760. //2024年6月27日17:36:25 有一个判断是反正的
  761. if(normal){
  762. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  763. if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
  764. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  765. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  766. } else if (currentVal.compareTo(sjscgkz) > 0) {//一级
  767. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  768. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  769. } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
  770. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  771. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  772. } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
  773. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  774. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  775. }*/ else {
  776. tXinyiWarningRecord = null;//这种的无需处理
  777. }
  778. }else{
  779. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  780. if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
  781. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  782. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  783. } else if (currentVal.compareTo(sjscgkz) < 0) {//一级
  784. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  785. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  786. } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
  787. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  788. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  789. } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
  790. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  791. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  792. }*/ else {
  793. tXinyiWarningRecord = null;//这种的无需处理
  794. }
  795. }
  796. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  797. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(1).category(category).status(0).build());
  798. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  799. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  800. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  801. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  802. xinyiWarningRecord.setStatus(2);
  803. Date nowDate = DateUtils.getNowDate();
  804. xinyiWarningRecord.setOffTime(nowDate);
  805. xinyiWarningRecord.setUpdateTime(nowDate);
  806. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  807. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  808. }
  809. }
  810. }else{//有新的告警信息
  811. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  812. //保存到数据库中
  813. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  814. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  815. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  816. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  817. }else {
  818. //继续调用决策(普通问答)
  819. this.askBigModelForSHWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig, unit);
  820. }
  821. }else{
  822. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  823. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  824. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  825. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  826. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  827. }else {
  828. //继续调用决策(普通问答)
  829. this.askBigModelForSHWarning(xinyiWarningRecord, tXinyiIndustry, normConfig, unit);
  830. }
  831. }
  832. }
  833. }
  834. }
  835. private void handleSZWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  836. //出水相关
  837. //出水COD报警
  838. BigDecimal csCod = tXinyiIndustry.getCsCod();
  839. BigDecimal cscodBzz = normConfig.getCscodBzz();
  840. BigDecimal cscodGkz = normConfig.getCscodGkz();
  841. if(!Objects.isNull(cscodBzz)){
  842. handleXinYiWarningsCs(cscodBzz, csCod, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_COD.getCode(), tXinyiIndustry, normConfig);
  843. }
  844. //出水总磷超标报警
  845. BigDecimal csTp = tXinyiIndustry.getCsTp();
  846. BigDecimal cszlBzz = normConfig.getCszlBzz();
  847. BigDecimal cszlGkz = normConfig.getCszlGkz();
  848. if(!Objects.isNull(cszlBzz)){
  849. handleXinYiWarningsCs(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig);
  850. }
  851. //出水总氮超标报警
  852. BigDecimal csTn = tXinyiIndustry.getCsTn();
  853. BigDecimal cszzBzz = normConfig.getCszzBzz();
  854. BigDecimal cszzGkz = normConfig.getCszzGkz();
  855. if(!Objects.isNull(cszzBzz)){
  856. handleXinYiWarningsCs(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig);
  857. }
  858. //出水氨氮超标报警
  859. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  860. BigDecimal csadBzz = normConfig.getCsadBzz();
  861. BigDecimal csadGkz = normConfig.getCsadGkz();
  862. if(!Objects.isNull(csadBzz)){
  863. handleXinYiWarningsCs(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig);
  864. }
  865. //出水SS超标报警
  866. BigDecimal csSS = tXinyiIndustry.getCsSs();
  867. BigDecimal csSSBzz = normConfig.getCsssBzz();
  868. BigDecimal csssGkz = normConfig.getCsssGkz();
  869. if(!Objects.isNull(csSSBzz)){
  870. handleXinYiWarningsCs(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig);
  871. }
  872. //进水相关报警
  873. //进水总磷超标报警
  874. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  875. BigDecimal jszlSjz = normConfig.getJszlSjz();
  876. if(!Objects.isNull(jszlSjz)){
  877. handleXinYiWarningRecordJS(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig);
  878. }
  879. //进水COD超标报警
  880. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  881. BigDecimal jscodSjz = normConfig.getJscodSjz();
  882. if(!Objects.isNull(jscodSjz)){
  883. handleXinYiWarningRecordJS(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig);
  884. }
  885. //进水总氮超标报警
  886. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  887. BigDecimal jszdSjz = normConfig.getJszdSjz();
  888. if(!Objects.isNull(jszdSjz)){
  889. handleXinYiWarningRecordJS(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig);
  890. }
  891. //进水氨氮超标报警
  892. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  893. BigDecimal jsadSjz = normConfig.getJsadSjz();
  894. if(!Objects.isNull(jsadSjz)){
  895. handleXinYiWarningRecordJS(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig);
  896. }
  897. //进水SS超标报警
  898. BigDecimal jsSS = tXinyiIndustry.getJsSs();
  899. BigDecimal jsSSSjz = normConfig.getJsssSjz();
  900. if(!Objects.isNull(jsSSSjz)){
  901. handleXinYiWarningRecordJS(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig);
  902. }
  903. }
  904. private void askBigModelForSHWarning(TXinyiWarningRecord xinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String unit) {
  905. log.info("进入了后台接口调⽤⼤模型获取问答结果处理");
  906. StringBuilder sb = new StringBuilder();
  907. String sessionId = IdUtils.simpleUUID();
  908. ChatReq chatReq = new ChatReq();
  909. // String ipAddr = IpUtils.getIpAddr();//获取用户的ip地址 传给大模型
  910. String ipAddr = "";//获取用户的ip地址 传给大模型 定时任务获取不到ip地址
  911. int counts = 1;//默认是第一次
  912. //这种问答 没有历史问答的概念 直接把问题扔进去就行 无需查询历史记录
  913. List<String> historyDates = new ArrayList<>();
  914. //构建问题(替换提示词中的占位符)
  915. /*String shWarningPrompt = SH_WARNING_PROMPT;
  916. shWarningPrompt =shWarningPrompt.replace("#{0}", xinyiWarningRecord.getReason());
  917. shWarningPrompt =shWarningPrompt.replace("#{1}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getDesignVal(), INT_2)));
  918. shWarningPrompt =shWarningPrompt.replace("#{2}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getControlVal(), INT_2)));
  919. shWarningPrompt =shWarningPrompt.replace("#{3}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getWarningVal(), INT_2)));*/
  920. //2024年7月5日10:08:54 拼接优化
  921. StringBuilder prompt = new StringBuilder(SH_WARNING_PROMPT_1);
  922. prompt.append(xinyiWarningRecord.getReason());
  923. prompt.append(SH_WARNING_PROMPT_2).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getDesignVal(), INT_2));
  924. prompt.append(SH_WARNING_PROMPT_3).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getControlVal(), INT_2));
  925. prompt.append(SH_WARNING_PROMPT_4).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getWarningVal(), INT_2));
  926. prompt.append(SH_WARNING_PROMPT_5);
  927. historyDates.add(prompt.toString());
  928. // 获取输出流
  929. ManagedChannel channel = null;
  930. try {
  931. channel = ManagedChannelBuilder.forAddress(bigModelConfig.getIp(), bigModelConfig.getPort())
  932. .usePlaintext()
  933. .build();
  934. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  935. // String dataJson = "{\"bot_id\":\"721\",\"exp_id\":\"721\",\"session_id\":\"" + sessionId + "\",\"use_rag\":\"true\",\"prompt\":\"你是⼀个资深⽔务领域专家,能回答各种⽔务相关问题\",\"history_dia\":" + JSON.toJSONString(historyDates) + ",\"generate_args\":{\"max_new_tokens\":2048,\"max_length\":4096,\"num_beams\":1,\"do_sample\":true,\"top_p\":0.7,\"temperature\":0.95},\"extra\":{ \"ip_address\": \"" + ipAddr + "\" },\"strengthen\":" + (true) + "}";
  936. //2024年6月27日13:29:18 优化,不再使用拼接JSON字符串
  937. String dataJson = buildBigModelReqForChat(sessionId, historyDates, ipAddr, false);
  938. log.info("请求大模型的问答参数为{}", dataJson);
  939. PredictionsRequest request = PredictionsRequest.newBuilder()
  940. .setModelName("slibra_bot")
  941. .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理
  942. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  943. .buildPartial();
  944. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  945. //将结果记录到问答表
  946. while (predictions.hasNext()) {
  947. String responseStr = predictions.next().getPrediction().toStringUtf8();
  948. log.info("大模型问答返回的原始结果为{}", responseStr);
  949. responseStr = JSON.parseObject(responseStr).getString("message");
  950. if("complete".equals(responseStr)){
  951. log.info("结尾语句并且是非JSON,无需处理");
  952. }else{
  953. sb.append(responseStr);
  954. }
  955. }
  956. //将问答更新到数据库中
  957. chatReq.setSessionId(sessionId);
  958. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  959. chatReq.setModule(3);//0专家问答 1智能工单 2智能体助手 3告警 4简报
  960. String showVal = this.buildShowValueSH(xinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate(), unit);
  961. chatReq.setShowVal(showVal);
  962. chatReq.setQuestion(prompt.toString());
  963. chatReq.setAnswer(sb.toString());
  964. chatReq.setWarningId(String.valueOf(xinyiWarningRecord.getId()));
  965. chatReq.setCounts(counts);//问答次数
  966. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  967. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  968. chatReq.setCreateTime(DateUtils.getNowDate());
  969. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  970. } catch (IOException e) {
  971. throw new RuntimeException(e);
  972. } finally {
  973. // 关闭输出流
  974. channel.shutdown();
  975. }
  976. }
  977. private String buildBigModelReqForChat(String sessionId, List<String> historyDates, String ipAddr, Boolean strengthen) {
  978. ChatRequest chatRequest = new ChatRequest();
  979. chatRequest.setSessionId(sessionId);
  980. chatRequest.setHistoryDia(historyDates);
  981. //2024年7月5日13:24:10 temperature做区分
  982. GenerateArgs generateArgs = new GenerateArgs();
  983. generateArgs.setTemperature(bigModelConfig.getTemperature());
  984. chatRequest.setGenerateArgs(generateArgs);
  985. Map<String, Object> extra = new HashMap<>();
  986. extra.put("ip_address", ipAddr);
  987. chatRequest.setExtra(extra);
  988. chatRequest.setStrengthen(strengthen);
  989. //2024年7月3日16:21:28 明确该场景不用调工具
  990. chatRequest.setTools(String.valueOf(false));
  991. return JSON.toJSONString(chatRequest);
  992. }
  993. /**
  994. * 调用大模型获取决策结果 并同时记录对应信息到聊天记录表中
  995. *
  996. * @param tXinyiWarningRecord
  997. * @param tXinyiIndustry
  998. * @param normConfig
  999. * @param isSpecial 机器人化验库,需要把总磷和总氮的值特殊处理一下
  1000. * @param nowDate
  1001. */
  1002. private void handleDecision(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, boolean isSpecial, Date nowDate) {
  1003. log.info("进入了调⽤大模型决策接口");
  1004. ChatReq chatReq = new ChatReq();
  1005. // StringBuilder sb = new StringBuilder();
  1006. //大模型结果 放入一个结合中
  1007. List<String> resultData = new ArrayList<>();
  1008. //决策和问答不一样 没有历史的概念 所以sessionId都是新的 次数都是1
  1009. String sessionId = IdUtils.simpleUUID();
  1010. // String feedback = chatReq.getFeedback();
  1011. //决策请求的业务参数
  1012. // List<HashMap<String, Object>> list = this.xinyiIndustryMapper.selectLast10RecordsForDecision();
  1013. //2024年5月21日15:23:07 这里不能用关联查询处理,日报要获取最新的一条而不是今日的数据。
  1014. List<DecisionReq> decisionReqs = this.xinyiIndustryMapper.selectLast10RecordsForDecisionOnlyIndustry();
  1015. if(!CollectionUtils.isEmpty(decisionReqs)){
  1016. //处理日报数据
  1017. TXinyiDaily daily = this.xinyiDailyMapper.selectNewestData();
  1018. for (DecisionReq decisionReq : decisionReqs) {
  1019. if(!Objects.isNull(daily)){
  1020. decisionReq.setT(daily.getJsSw());
  1021. decisionReq.setSVI(daily.getWntjzsAll());
  1022. decisionReq.setSV(daily.getWncjbAll());
  1023. decisionReq.setMlvss(daily.getHfxwnndAll());
  1024. //2024年7月2日17:20:12 mlss和DO_O也要从日报获取
  1025. decisionReq.setMlss(daily.getHycWnndAll());
  1026. decisionReq.setDoO(daily.getHycRjyAll());
  1027. decisionReq.setDoAna(daily.getYycRjyAll());
  1028. decisionReq.setDoQue(daily.getQycRjyAll());
  1029. //2024年5月26日11:59:02 干污泥量数据做了同步
  1030. decisionReq.setGwnl(daily.getGWNL());
  1031. BigDecimal jsBod5 = daily.getJsBod5();
  1032. decisionReq.setBodIn(jsBod5);
  1033. BigDecimal tpIn = decisionReq.getTpIn();
  1034. BigDecimal tnIn = decisionReq.getTnIn();
  1035. if(!Objects.isNull(jsBod5)){
  1036. if(!Objects.isNull(tpIn) && tpIn.compareTo(new BigDecimal("0")) >0){
  1037. decisionReq.setC(jsBod5.divide(tpIn, 4, RoundingMode.HALF_UP));
  1038. }
  1039. if(!Objects.isNull(tnIn) && tnIn.compareTo(new BigDecimal("0")) >0){
  1040. decisionReq.setB(jsBod5.divide(tnIn, 4, RoundingMode.HALF_UP));
  1041. }
  1042. }
  1043. //2024年6月1日08:37:09 内回流加上
  1044. decisionReq.setR(daily.getNhlR());
  1045. decisionReq.setRR(daily.getWhlR());
  1046. }
  1047. //如果是机器人化验室的报警,需要把总磷和总氮,获取化验室对应的数据且计算
  1048. if(isSpecial){
  1049. List<TXinyiRobot> xinyiRobots = this.xinyiRobotMapper.selectTXinyiRobotList(TXinyiRobot.builder().testHour(tXinyiIndustry.getTestHour()).build());
  1050. if(CollectionUtils.isEmpty(xinyiRobots)){
  1051. log.error("{}获取化验室数据失败", tXinyiIndustry.getTestHour());
  1052. }else{
  1053. TXinyiRobot tXinyiRobot = xinyiRobots.get(0);
  1054. //总氮
  1055. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  1056. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  1057. if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
  1058. decisionReq.setTnOff((no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1059. }
  1060. //总磷
  1061. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  1062. if(!Objects.isNull(tpRccJqr)){
  1063. decisionReq.setTpOff(tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1064. }
  1065. }
  1066. }
  1067. }
  1068. }
  1069. // String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls);
  1070. // 获取输出流
  1071. ManagedChannel channel = null;
  1072. String dataJson = "";
  1073. try {
  1074. channel = ManagedChannelBuilder.forAddress(bigModelConfig.getIp(), bigModelConfig.getPort())
  1075. .usePlaintext()
  1076. .build();
  1077. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  1078. // dataJson = "{\"bot_id\":\"b00001\",\"exp_id\":\"721\",\"norm\":\"" + tXinyiWarningRecord.getCategory() + "\",\"feedback\":" + feedback + ",\"session_id\":" + "\"" + sessionId + "\"" + ",\"generate_args\":{\"max_new_tokens\":1024,\"max_length\":4096,\"num_beams\":1,\"do_sample\":true,\"top_p\":0.7,\"temperature\":0.95},\"extra\":{\"rows\":" + rows + "}}";
  1079. //2024年6月24日17:59:17 优化,不再拼接JSON字符串
  1080. PolicyReq policyReq = new PolicyReq();
  1081. policyReq.setNorm(tXinyiWarningRecord.getCategory());
  1082. HashMap<String, Object> hashMap = new HashMap<>();
  1083. policyReq.setFeedback(hashMap);//不能传null
  1084. policyReq.setSimulate(hashMap);//不能传null
  1085. policyReq.setSessionId(sessionId);
  1086. //2024年7月5日13:24:10 temperature做区分
  1087. GenerateArgs generateArgs = new GenerateArgs();
  1088. generateArgs.setTemperature(bigModelConfig.getTemperature());
  1089. policyReq.setGenerateArgs(generateArgs);
  1090. HashMap<String, Object> map = new HashMap<>();
  1091. map.put("rows", decisionReqs);
  1092. //2024年6月25日14:16:05 增加报警是管控值报警还是标准值报警
  1093. if(WARNING_LEVEL_ONE.equals(tXinyiWarningRecord.getLevel()) || WARNING_LEVEL_TWO.equals(tXinyiWarningRecord.getLevel()))
  1094. map.put("source", "bzz");
  1095. else
  1096. map.put("source", "gkz");
  1097. policyReq.setExtra(map);
  1098. dataJson = JSON.toJSONString(policyReq, JSONWriter.Feature.WriteNulls);
  1099. log.info("请求大模型的决策的参数为{}", dataJson);
  1100. PredictionsRequest request = PredictionsRequest.newBuilder()
  1101. .setModelName("slibra_bot")
  1102. .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理
  1103. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  1104. .buildPartial();
  1105. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  1106. while (predictions.hasNext()) {
  1107. String responseStr = predictions.next().getPrediction().toStringUtf8();
  1108. log.info("决策流式返回的结果是{}", responseStr);
  1109. //2024年5月25日16:37:16 按照大模型返回的类型解析数据
  1110. String biz = JSON.parseObject(responseStr).getString("biz");
  1111. if(BusinessEnum.BigModelBizEnum.OK.getCode().equals(biz)){
  1112. log.info("结尾语句并且是非JSON,无需处理");
  1113. //结束语句也流式输出,但是并不记录下来 2024年5月24日11:15:23 也不返回前端
  1114. /*outputStream.write(responseStr.getBytes());
  1115. outputStream.flush();*/
  1116. }else if(BusinessEnum.BigModelBizEnum.DECISION_DEBUGGER.getCode().equals(biz)){
  1117. log.info("中间过程,目前只打印日志,不记录数据,也不返回给前端,返回数据为{}", responseStr);
  1118. //结束语句也流式输出,但是并不记录下来 2024年5月24日11:15:23 也不返回前端
  1119. /*outputStream.write(responseStr.getBytes());
  1120. outputStream.flush();*/
  1121. }else{//其他 要么错误 要么alert 要么出的报告
  1122. // sb.append(responseStr);
  1123. resultData.add(responseStr);
  1124. }
  1125. }
  1126. } catch (Exception e) {
  1127. // throw new RuntimeException(e);
  1128. log.error("定时任务处理告警调用决策异常,异常信息为{}", JSON.toJSONString(e));
  1129. resultData.add("{\"biz\":\"ERROR\",\"message\":\"大模型分析数据异常,请稍后再试\"}");
  1130. } finally {
  1131. log.info("决策最终要保存的数据是{}", JSON.toJSONString(resultData));
  1132. //保存聊天记录
  1133. //将问答更新到数据库中
  1134. chatReq.setSessionId(sessionId);
  1135. chatReq.setType(1);//0问答 1决策
  1136. chatReq.setModule(3);
  1137. /*String userId = SecurityUtils.getUserId().toString();
  1138. String username = SecurityUtils.getUsername();*/
  1139. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  1140. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, nowDate);
  1141. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  1142. chatReq.setQuestion(dataJson);
  1143. chatReq.setAnswer(JSON.toJSONString(resultData));
  1144. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  1145. chatReq.setCounts(1);//问答次数
  1146. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  1147. chatReq.setCreateTime(DateUtils.getNowDate());
  1148. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  1149. // 关闭输出流
  1150. if(!Objects.isNull(channel))
  1151. channel.shutdown();
  1152. }
  1153. }
  1154. /**
  1155. * 2024年7月11日10:32:49 生化报警的展示额外处理(因为涉及到很多的单位)
  1156. *
  1157. * @param tXinyiWarningRecord
  1158. * @param tXinyiIndustry
  1159. * @param normConfig
  1160. * @param nowDate
  1161. * @param unit
  1162. * @return
  1163. */
  1164. private String buildShowValueSH(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Date nowDate, String unit) {
  1165. JSONObject result = new JSONObject();
  1166. // JSONObject basic = new JSONObject();
  1167. Integer status = tXinyiWarningRecord.getStatus();
  1168. Date warningTime = tXinyiWarningRecord.getTime();
  1169. String remark = tXinyiWarningRecord.getRemark();
  1170. int count = DateUtils.differentHoursByMillisecond(warningTime, DateUtils.getNowDate()) + 1;
  1171. ShowValueSHBasic showValueSHBasic = new ShowValueSHBasic();
  1172. /*if("0".equals(remark)){//水质报警
  1173. showValueSHBasic.setH("在线仪表");
  1174. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  1175. }else if("1".equals(remark)){//生化报警
  1176. showValueSHBasic.setH("在线仪表");
  1177. }else if("2".equals(remark)){//预测报警
  1178. showValueSHBasic.setH("预测");
  1179. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1180. }else {//机器人化验室报警(特殊的 水质报警)
  1181. showValueSHBasic.setH("化验室");
  1182. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  1183. }*/
  1184. //生化报警固定了
  1185. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  1186. showValueSHBasic.setH("计算");
  1187. //通用的
  1188. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  1189. showValueSHBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1190. showValueSHBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2) + unit);
  1191. showValueSHBasic.setD(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2) + unit);
  1192. showValueSHBasic.setG(Math.min(count, MAX_COUNT));
  1193. if(tXinyiWarningRecord.getType() != 2)
  1194. showValueSHBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1195. else
  1196. showValueSHBasic.setI(status == 0 ? "预警中" : "已完成");
  1197. result.put("basic", showValueSHBasic);
  1198. JSONObject jsData = getJsonObject(tXinyiIndustry, normConfig);//进水数据
  1199. result.put("jsData", jsData);
  1200. JSONObject csData = getCsonObject(tXinyiIndustry, normConfig);//出水数据
  1201. result.put("csData", csData);
  1202. // return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
  1203. return JSON.toJSONString(result);
  1204. }
  1205. private String buildShowValue(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Date nowDate) {
  1206. JSONObject result = new JSONObject();
  1207. // JSONObject basic = new JSONObject();
  1208. Integer status = tXinyiWarningRecord.getStatus();
  1209. Date warningTime = tXinyiWarningRecord.getTime();
  1210. String remark = tXinyiWarningRecord.getRemark();
  1211. int count = DateUtils.differentHoursByMillisecond(warningTime, DateUtils.getNowDate()) + 1;
  1212. /*basic.put("title", tXinyiWarningRecord.getReason());
  1213. basic.put("报警时间", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1214. basic.put("报警值", tXinyiWarningRecord.getWarningVal());
  1215. basic.put("标准值", tXinyiWarningRecord.getDesignVal());
  1216. basic.put("管控值", tXinyiWarningRecord.getControlVal());
  1217. basic.put("报警次数", Math.min(count, MAX_COUNT));
  1218. if(tXinyiWarningRecord.getType() != 2)
  1219. basic.put("状态", status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1220. else
  1221. basic.put("状态", status == 0 ? "预警中" : "已完成");
  1222. //2024年5月27日14:04:22 额外返回2个字段 [管控值 和 告警级别] 返回的json没有数据是因为value没有值
  1223. // basic.put("管控值", tXinyiWarningRecord.getControlVal());
  1224. basic.put("告警级别", tXinyiWarningRecord.getLevel());*/
  1225. //2024年6月25日16:00:18 进出水展示的不一样
  1226. if(tXinyiWarningRecord.getCategory().contains("出水")){//出水的展示
  1227. ShowValueCSBasic showValueCSBasic = new ShowValueCSBasic();
  1228. if("0".equals(remark)){//水质报警
  1229. showValueCSBasic.setH("在线仪表");
  1230. showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1231. }else if("1".equals(remark)){//生化报警
  1232. showValueCSBasic.setH("在线仪表");
  1233. }else if("2".equals(remark)){//预测报警
  1234. showValueCSBasic.setH("预测");
  1235. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1236. }else {//机器人化验室报警(特殊的水质报警)
  1237. showValueCSBasic.setH("化验室");
  1238. showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1239. }
  1240. //通用的
  1241. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  1242. // showValueCSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1243. showValueCSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,nowDate));
  1244. showValueCSBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2));
  1245. showValueCSBasic.setD(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getControlVal(), INT_2));
  1246. showValueCSBasic.setE(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2));
  1247. showValueCSBasic.setG(Math.min(count, MAX_COUNT));
  1248. if(tXinyiWarningRecord.getType() != 2)
  1249. showValueCSBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1250. else
  1251. showValueCSBasic.setI(status == 0 ? "预警中" : "已完成");
  1252. result.put("basic", showValueCSBasic);
  1253. }else{//进水的展示
  1254. ShowValueJSBasic showValueJSBasic = new ShowValueJSBasic();
  1255. if("0".equals(remark)){//水质报警
  1256. showValueJSBasic.setH("在线仪表");
  1257. showValueJSBasic.setF(tXinyiWarningRecord.getLevel());
  1258. }else if("1".equals(remark)){//生化报警
  1259. showValueJSBasic.setH("在线仪表");
  1260. }else if("2".equals(remark)){//预测报警
  1261. showValueJSBasic.setH("预测");
  1262. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1263. }else {//机器人化验室报警(特殊的 水质报警)
  1264. showValueJSBasic.setH("化验室");
  1265. showValueJSBasic.setF(tXinyiWarningRecord.getLevel());
  1266. }
  1267. //通用的
  1268. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  1269. showValueJSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1270. showValueJSBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2));
  1271. showValueJSBasic.setE(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2));
  1272. showValueJSBasic.setG(Math.min(count, MAX_COUNT));
  1273. if(tXinyiWarningRecord.getType() != 2)
  1274. showValueJSBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1275. else
  1276. showValueJSBasic.setI(status == 0 ? "预警中" : "已完成");
  1277. result.put("basic", showValueJSBasic);
  1278. }
  1279. JSONObject jsData = getJsonObject(tXinyiIndustry, normConfig);//进水数据
  1280. result.put("jsData", jsData);
  1281. JSONObject csData = getCsonObject(tXinyiIndustry, normConfig);//出水数据
  1282. result.put("csData", csData);
  1283. // return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
  1284. return JSON.toJSONString(result);
  1285. }
  1286. private static JSONObject getJsonObject(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1287. JSONObject jsData = new JSONObject();
  1288. HashMap<Object, Object> temp1 = new HashMap<>();
  1289. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  1290. temp1.put("value", DecimalUtils.getAbsAndScale(jsSlq, INT_2));
  1291. temp1.put("exceed", jsSlq.compareTo(normConfig.getJsslSjz()) >0);
  1292. jsData.put("流量", temp1);
  1293. HashMap<Object, Object> temp2 = new HashMap<>();
  1294. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  1295. temp2.put("value", DecimalUtils.getAbsAndScale(jsCod, INT_2));
  1296. temp2.put("exceed", jsCod.compareTo(normConfig.getJscodSjz()) > 0);
  1297. jsData.put("COD", temp2);
  1298. HashMap<Object, Object> temp3 = new HashMap<>();
  1299. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  1300. temp3.put("value", DecimalUtils.getAbsAndScale(jsNh3, INT_2));
  1301. temp3.put("exceed", jsNh3.compareTo(normConfig.getJsadSjz()) > 0);
  1302. jsData.put("NH3-N", temp3);
  1303. HashMap<Object, Object> temp4 = new HashMap<>();
  1304. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  1305. temp4.put("value", DecimalUtils.getAbsAndScale(jsTp, INT_2));
  1306. temp4.put("exceed", jsTp.compareTo(normConfig.getJszlSjz()) > 0);
  1307. jsData.put("TP", temp4);
  1308. HashMap<Object, Object> temp5 = new HashMap<>();
  1309. BigDecimal jsSs = tXinyiIndustry.getJsSs();
  1310. temp5.put("value", DecimalUtils.getAbsAndScale(jsSs, INT_2));
  1311. temp5.put("exceed", jsSs.compareTo(normConfig.getJsssSjz()) > 0);
  1312. jsData.put("SS", temp5);
  1313. HashMap<Object, Object> temp6 = new HashMap<>();
  1314. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  1315. temp6.put("value", DecimalUtils.getAbsAndScale(jsTn, INT_2));
  1316. temp6.put("exceed", jsTn.compareTo(normConfig.getJszdSjz()) > 0);
  1317. jsData.put("TN", temp6);
  1318. return jsData;
  1319. }
  1320. private static JSONObject getCsonObject(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1321. JSONObject csData = new JSONObject();
  1322. HashMap<Object, Object> temp1 = new HashMap<>();
  1323. BigDecimal csSlq = tXinyiIndustry.getCsSlqc();
  1324. temp1.put("value", DecimalUtils.getAbsAndScale(csSlq, INT_2));
  1325. temp1.put("exceed", false);//出水水量没有管控值
  1326. csData.put("流量", temp1);
  1327. HashMap<Object, Object> temp2 = new HashMap<>();
  1328. BigDecimal csCod = tXinyiIndustry.getCsCod();
  1329. temp2.put("value", DecimalUtils.getAbsAndScale(csCod, INT_2));
  1330. temp2.put("exceed", csCod.compareTo(normConfig.getCscodGkz()) > 0);
  1331. csData.put("COD", temp2);
  1332. HashMap<Object, Object> temp3 = new HashMap<>();
  1333. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  1334. temp3.put("value", DecimalUtils.getAbsAndScale(csNh3, INT_2));
  1335. temp3.put("exceed", csNh3.compareTo(normConfig.getCsadGkz()) > 0);
  1336. csData.put("NH3-N", temp3);
  1337. HashMap<Object, Object> temp4 = new HashMap<>();
  1338. BigDecimal csTp = tXinyiIndustry.getCsTp();
  1339. temp4.put("value", DecimalUtils.getAbsAndScale(csTp, INT_2));
  1340. temp4.put("exceed", csTp.compareTo(normConfig.getCszlGkz()) > 0);
  1341. csData.put("TP", temp4);
  1342. HashMap<Object, Object> temp5 = new HashMap<>();
  1343. BigDecimal csSs = tXinyiIndustry.getCsSs();
  1344. temp5.put("value", DecimalUtils.getAbsAndScale(csSs, INT_2));
  1345. temp5.put("exceed", csSs.compareTo(normConfig.getCsssGkz()) > 0);
  1346. csData.put("SS", temp5);
  1347. HashMap<Object, Object> temp6 = new HashMap<>();
  1348. BigDecimal csTn = tXinyiIndustry.getCsTn();
  1349. temp6.put("value", DecimalUtils.getAbsAndScale(csTn, INT_2));
  1350. temp6.put("exceed", csTn.compareTo(normConfig.getCszzGkz()) > 0);
  1351. csData.put("TN", temp6);
  1352. return csData;
  1353. }
  1354. /**
  1355. * 通过输入的值 生成对应类型的报警对象(出水)
  1356. *
  1357. * @param csBzz
  1358. * @param currentVal
  1359. * @param csGkz
  1360. * @param category
  1361. * @param tXinyiIndustry
  1362. * @param normConfig
  1363. * @return
  1364. */
  1365. private void handleXinYiWarningsCs(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1366. BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  1367. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1368. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  1369. tXinyiWarningRecord.setStatus(0);
  1370. tXinyiWarningRecord.setType(0);
  1371. tXinyiWarningRecord.setCategory(category);
  1372. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1373. tXinyiWarningRecord.setWarningVal(currentVal);
  1374. tXinyiWarningRecord.setDesignVal(csBzz);
  1375. tXinyiWarningRecord.setControlVal(csGkz);
  1376. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1377. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1378. tXinyiWarningRecord.setRemark("0");
  1379. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1380. if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
  1381. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1382. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1383. }else if(currentVal.compareTo(multiply) > 0){//一级
  1384. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1385. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1386. }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  1387. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1388. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1389. }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  1390. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1391. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1392. }else{
  1393. tXinyiWarningRecord = null;//这种的无需处理
  1394. }
  1395. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1396. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).warningStatus(0).build());
  1397. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1398. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1399. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1400. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1401. xinyiWarningRecord.setStatus(2);
  1402. Date nowDate = DateUtils.getNowDate();
  1403. xinyiWarningRecord.setOffTime(nowDate);
  1404. xinyiWarningRecord.setUpdateTime(nowDate);
  1405. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1406. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1407. }
  1408. }
  1409. }else{//有告警信息
  1410. Date nowDate = DateUtils.getNowDate();
  1411. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1412. //保存到数据库中
  1413. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1414. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1415. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1416. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1417. }else {
  1418. //继续调用决策
  1419. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  1420. }
  1421. }else{
  1422. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  1423. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  1424. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1425. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1426. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1427. }else {
  1428. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  1429. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  1430. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  1431. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  1432. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  1433. xinyiWarningRecord.setUpdateTime(nowDate);
  1434. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1435. //更新数据库
  1436. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1437. //继续调用决策
  1438. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  1439. }
  1440. }
  1441. }
  1442. }
  1443. }
  1444. /**
  1445. * 通过输入的值 生成对应类型的报警对象(进水)
  1446. *
  1447. * @param jsBzz
  1448. * @param currentVal
  1449. * @param category
  1450. * @param tXinyiIndustry
  1451. * @param normConfig
  1452. * @return
  1453. */
  1454. private void handleXinYiWarningRecordJS(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1455. BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  1456. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1457. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  1458. tXinyiWarningRecord.setStatus(0);
  1459. tXinyiWarningRecord.setType(0);
  1460. tXinyiWarningRecord.setCategory(category);
  1461. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1462. tXinyiWarningRecord.setWarningVal(currentVal);
  1463. tXinyiWarningRecord.setDesignVal(jsBzz);
  1464. // tXinyiWarningRecord.setControlVal(csGkz);
  1465. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1466. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1467. tXinyiWarningRecord.setRemark("0");
  1468. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1469. if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
  1470. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1471. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1472. }else if(currentVal.compareTo(multiply) > 0){//一级
  1473. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1474. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1475. }else if(currentVal.compareTo(jsBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  1476. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1477. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1478. }else{
  1479. tXinyiWarningRecord = null;//这种的无需处理
  1480. }
  1481. /*else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  1482. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1483. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1484. }*/
  1485. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1486. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
  1487. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1488. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1489. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1490. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1491. xinyiWarningRecord.setStatus(2);
  1492. Date nowDate = DateUtils.getNowDate();
  1493. xinyiWarningRecord.setOffTime(nowDate);
  1494. xinyiWarningRecord.setUpdateTime(nowDate);
  1495. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1496. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1497. }
  1498. }
  1499. }else{//有告警信息
  1500. Date nowDate = DateUtils.getNowDate();
  1501. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1502. //保存到数据库中
  1503. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1504. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1505. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1506. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1507. }else {
  1508. //继续调用决策
  1509. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  1510. }
  1511. }else{
  1512. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  1513. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  1514. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1515. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1516. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1517. }else {
  1518. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  1519. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  1520. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  1521. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  1522. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  1523. xinyiWarningRecord.setUpdateTime(nowDate);
  1524. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1525. //更新数据库
  1526. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1527. //继续调用决策
  1528. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  1529. }
  1530. }
  1531. }
  1532. }
  1533. }
  1534. private void addChatRecordByDeviceErr(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1535. ChatReq chatReq = new ChatReq();
  1536. //保存聊天记录
  1537. //将问答更新到数据库中
  1538. chatReq.setSessionId(IdUtils.simpleUUID());
  1539. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  1540. chatReq.setModule(3);
  1541. /*String userId = SecurityUtils.getUserId().toString();
  1542. String username = SecurityUtils.getUsername();*/
  1543. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  1544. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  1545. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  1546. chatReq.setQuestion(WARNING_DEFAULT_QUESTION);//本地问题
  1547. chatReq.setAnswer(tXinyiWarningRecord.getReason() + ",请检查设备是否正常运行");
  1548. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  1549. chatReq.setCounts(1);//问答次数
  1550. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  1551. chatReq.setCreateTime(DateUtils.getNowDate());
  1552. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  1553. }
  1554. public static void main(String[] args) {
  1555. System.out.println(CCCDCHRT_LAST);
  1556. System.out.println(GSLS_LAST);
  1557. System.out.println(BigDecimal.valueOf(1).subtract(null));
  1558. }
  1559. /**
  1560. * 处理机器人化验数据报警
  1561. * @param uniqueList
  1562. */
  1563. public void handleRobotWarning(List<TXinyiRobot> uniqueList) {
  1564. log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑");
  1565. //查询配置
  1566. List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  1567. if(CollectionUtils.isEmpty(tXinyiNormConfigs))
  1568. throw new RuntimeException("未查询到配置信息");
  1569. TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  1570. //查询最新的一条工业库的数据(showvalue展示使用)
  1571. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
  1572. TXinyiIndustry tXinyiIndustry = CollectionUtils.isEmpty(tXinyiIndustries) ? new TXinyiIndustry() : tXinyiIndustries.get(0);
  1573. //处理数据
  1574. for (TXinyiRobot tXinyiRobot : uniqueList) {
  1575. //处理总氮和总磷报警
  1576. //总氮
  1577. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  1578. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  1579. if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
  1580. BigDecimal csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  1581. BigDecimal cszzBzz = normConfig.getCszzBzz();
  1582. BigDecimal cszzGkz = normConfig.getCszzGkz();
  1583. if(!Objects.isNull(cszzBzz)){
  1584. handleXinYiWarningsRobot(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig);
  1585. }
  1586. }
  1587. //总磷
  1588. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  1589. if(!Objects.isNull(tpRccJqr)){
  1590. BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  1591. BigDecimal cszlBzz = normConfig.getCszlBzz();
  1592. BigDecimal cszlGkz = normConfig.getCszlGkz();
  1593. if(!Objects.isNull(cszlBzz)){
  1594. handleXinYiWarningsRobot(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig);
  1595. }
  1596. }
  1597. }
  1598. }
  1599. /**
  1600. * 通过输入的值 生成对应类型的报警对象(出水)
  1601. *
  1602. * @param csBzz
  1603. * @param currentVal
  1604. * @param csGkz
  1605. * @param category
  1606. * @param tXinyiIndustry
  1607. * @param normConfig
  1608. * @return
  1609. */
  1610. private void handleXinYiWarningsRobot(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1611. BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  1612. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1613. tXinyiWarningRecord.setStatus(0);
  1614. tXinyiWarningRecord.setType(0);
  1615. tXinyiWarningRecord.setCategory(category);
  1616. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1617. tXinyiWarningRecord.setWarningVal(currentVal);
  1618. tXinyiWarningRecord.setDesignVal(csBzz);
  1619. tXinyiWarningRecord.setControlVal(csGkz);
  1620. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1621. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1622. tXinyiWarningRecord.setRemark("3");//化验室
  1623. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1624. if(Objects.isNull(currentVal)){
  1625. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1626. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1627. }else if(currentVal.compareTo(multiply) > 0){//一级
  1628. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1629. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1630. }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  1631. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1632. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1633. }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  1634. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1635. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1636. }else{
  1637. tXinyiWarningRecord = null;//这种的无需处理
  1638. }
  1639. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1640. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).warningStatus(0).build());
  1641. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1642. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1643. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1644. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1645. xinyiWarningRecord.setStatus(2);
  1646. Date nowDate = DateUtils.getNowDate();
  1647. xinyiWarningRecord.setOffTime(nowDate);
  1648. xinyiWarningRecord.setUpdateTime(nowDate);
  1649. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1650. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1651. }
  1652. }
  1653. }else{//有告警信息
  1654. Date nowDate = DateUtils.getNowDate();
  1655. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1656. //保存到数据库中
  1657. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1658. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1659. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1660. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1661. }else {
  1662. //继续调用决策
  1663. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
  1664. }
  1665. }else{
  1666. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  1667. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  1668. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1669. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1670. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1671. }else {
  1672. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  1673. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  1674. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  1675. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  1676. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  1677. xinyiWarningRecord.setUpdateTime(nowDate);
  1678. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1679. //更新数据库
  1680. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1681. //继续调用决策
  1682. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
  1683. }
  1684. }
  1685. }
  1686. }
  1687. }
  1688. /**
  1689. *
  1690. * 大宽表的数据处理
  1691. * @param tXinyiRobot
  1692. */
  1693. public void updateBigTableHourByRobot(TXinyiRobot tXinyiRobot) {
  1694. List<TXinyiBigTableHour> tXinyiBigTableHours = this.xinyiBigTableHourMapper.selectTXinyiBigTableHourList(TXinyiBigTableHour.builder().testHour(tXinyiRobot.getTestHour()).build());
  1695. if(!CollectionUtils.isEmpty(tXinyiBigTableHours)){
  1696. for (TXinyiBigTableHour tXinyiBigTableHour : tXinyiBigTableHours) {
  1697. this.updateBigTableByRobot(tXinyiBigTableHour, tXinyiRobot);
  1698. }
  1699. }
  1700. }
  1701. private void updateBigTableByRobot(TXinyiBigTableHour tXinyiBigTableHour, TXinyiRobot tXinyiRobot) {
  1702. tXinyiBigTableHour.setHyCodYb(tXinyiRobot.getCodYb());
  1703. tXinyiBigTableHour.setHyCodJqr(tXinyiRobot.getCodJqr());
  1704. tXinyiBigTableHour.setHyCodYz(tXinyiRobot.getCodYz());
  1705. tXinyiBigTableHour.setHyTpHl1Jqr(tXinyiRobot.getTpHl1Jqr());
  1706. tXinyiBigTableHour.setHyTpHl2Jqr(tXinyiRobot.getTpHl2Jqr());
  1707. tXinyiBigTableHour.setHyTpRccJqr(tXinyiRobot.getTpRccJqr());
  1708. tXinyiBigTableHour.setHyTp1Yz(tXinyiRobot.getTp1Yz());
  1709. tXinyiBigTableHour.setHyTp2Yz(tXinyiRobot.getTp2Yz());
  1710. tXinyiBigTableHour.setHyTpRccYz(tXinyiRobot.getTpRccYz());
  1711. tXinyiBigTableHour.setHyNh31Jqr(tXinyiRobot.getNh31Jqr());
  1712. tXinyiBigTableHour.setHyNh32Jqr(tXinyiRobot.getNh32Jqr());
  1713. tXinyiBigTableHour.setHyNh31Yz(tXinyiRobot.getNh31Yz());
  1714. tXinyiBigTableHour.setHyNo3Hlc1Yz(tXinyiRobot.getNo3Hlc1Yz());
  1715. tXinyiBigTableHour.setHyNh32Yz(tXinyiRobot.getNh32Yz());
  1716. tXinyiBigTableHour.setHyNo3Hlc2Yz(tXinyiRobot.getNo3Hlc2Yz());
  1717. tXinyiBigTableHour.setHyNo3Hlj1Jqr(tXinyiRobot.getNo3Hlj1Jqr());
  1718. tXinyiBigTableHour.setHyNo3Hlj2Jqr(tXinyiRobot.getNo3Hlj2Jqr());
  1719. tXinyiBigTableHour.setHyTyll(tXinyiRobot.getTYLL());
  1720. tXinyiBigTableHour.setHyNo3Qyc1Jqr(tXinyiRobot.getNo3Qyc1Jqr());
  1721. tXinyiBigTableHour.setHyNo3Qyc2Jqr(tXinyiRobot.getNo3Qyc2Jqr());
  1722. tXinyiBigTableHour.setHyNo3Qyc1Yz(tXinyiRobot.getNo3Qyc1Yz());
  1723. tXinyiBigTableHour.setHyNo3Qyc2Yz(tXinyiRobot.getNo3Qyc2Yz());
  1724. tXinyiBigTableHour.setHyJsll(tXinyiRobot.getJSLL());
  1725. tXinyiBigTableHour.setHyHycxsyAll(tXinyiRobot.getHycxsyAll());
  1726. tXinyiBigTableHour.setHyQyanAll(tXinyiRobot.getQyanAll());
  1727. tXinyiBigTableHour.setHyQyckxsyAll(tXinyiRobot.getQyckxsyAll());
  1728. tXinyiBigTableHour.setHyHyzlsyAll(tXinyiRobot.getHyzlsyAll());
  1729. //更新数据库
  1730. this.xinyiBigTableHourMapper.updateTXinyiBigTableHour(tXinyiBigTableHour);
  1731. }
  1732. }