AsyncTask.java 167 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642
  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.business.service.ITXinyiDailyService;
  13. import com.slibra.common.DecimalUtils;
  14. import com.slibra.common.config.BigModelConfig;
  15. import com.slibra.common.constant.MyConstants;
  16. import com.slibra.common.core.domain.DecisionReq;
  17. import com.slibra.common.core.domain.TXinyiDaily;
  18. import com.slibra.common.enums.BusinessEnum;
  19. import com.slibra.common.exception.ServiceException;
  20. import com.slibra.common.utils.DateUtils;
  21. import com.slibra.common.utils.LocalDateTimeUtil;
  22. import com.slibra.common.utils.StringUtils;
  23. import com.slibra.common.utils.format.WaterFormat;
  24. import com.slibra.common.utils.uuid.IdUtils;
  25. import com.slibra.quartz.business.JsCsFormatData;
  26. import inference.InferenceAPIsServiceGrpc;
  27. import inference.PredictionResponse;
  28. import inference.PredictionsRequest;
  29. import io.grpc.ManagedChannel;
  30. import io.grpc.ManagedChannelBuilder;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.scheduling.annotation.Async;
  35. import org.springframework.stereotype.Component;
  36. import org.springframework.util.CollectionUtils;
  37. import java.io.IOException;
  38. import java.math.BigDecimal;
  39. import java.math.RoundingMode;
  40. import java.util.*;
  41. import static com.slibra.common.constant.MyConstants.*;
  42. import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.*;
  43. import static com.slibra.common.enums.BusinessEnum.WarningCategoryEnum.*;
  44. @Component
  45. @Slf4j
  46. public class AsyncTask {
  47. @Autowired
  48. private TXinyiIndustryMapper xinyiIndustryMapper;
  49. @Autowired
  50. private TXinyiNormConfigMapper xinyiNormConfigMapper;
  51. @Autowired
  52. private TXinyiWarningRecordMapper xinyiWarningRecordMapper;
  53. @Autowired
  54. private TXinyiChatRecordMapper xinyiChatRecordMapper;
  55. @Autowired
  56. private TXinyiDailyMapper xinyiDailyMapper;
  57. @Autowired
  58. private TXinyiCalculateMapper xinyiCalculateMapper;
  59. @Autowired
  60. private TXinyiRobotMapper xinyiRobotMapper;
  61. @Autowired
  62. private TXinyiForecastComparisonMapper xinyiForecastComparisonMapper;
  63. @Autowired
  64. private TXinyiBigTableHourMapper xinyiBigTableHourMapper;
  65. @Autowired
  66. private BigModelConfig bigModelConfig;
  67. @Autowired
  68. private JsCsFormatData jsCsFormatData;
  69. /** 使用的是哪个环境 */
  70. @Value("${spring.profiles.active}")
  71. private String environment;
  72. @Autowired
  73. private ITXinyiDailyService xinyiDailyService;
  74. /**
  75. * 异步处理告警任务
  76. *
  77. * @param tXinyiIndustry
  78. * @param normConfig
  79. * @param xinyiCalculate
  80. */
  81. @Async("customizeExecutor")
  82. public void handleWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, TXinyiCalculate xinyiCalculate){
  83. log.info("进入了定时任务保存工业库数据并触发报警操作");
  84. //2024年08月09日14:26:29 为了节省费用,测试环境关闭报警并增加手动触发报警操作
  85. if(PROD_ENVIRONMENT.equalsIgnoreCase(environment) || DENGBAO_ENVIRONMENT.equalsIgnoreCase(environment)){
  86. //水质报警
  87. this.handleSZWarning(tXinyiIndustry, normConfig);
  88. //2024年5月28日14:14:26 下面是新增的 生化报警处理
  89. this.handleSHWarning(tXinyiIndustry, normConfig, xinyiCalculate);
  90. }
  91. }
  92. public void addBigTable(TXinyiIndustry tXinyiIndustry, TXinyiCalculate xinyiCalculate) {
  93. TXinyiBigTableHour xinyiBigTableHour = TXinyiBigTableHour.builder().build();
  94. //处理工业库的在线数据
  95. this.addIndustry2BigTable(xinyiBigTableHour, tXinyiIndustry);
  96. //处理计算的数据
  97. this.addCalculate2BigTable(xinyiBigTableHour, xinyiCalculate);
  98. //2024年08月13日13:35:15 修复bug:如果工业库挂了某段时间,那么这段时间内的日报和化验数据可能就一直无法获取到了
  99. //先去查询日报是否,查看是否已经有了
  100. List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(tXinyiIndustry.getTestDate()).build());
  101. if(!CollectionUtils.isEmpty(tXinyiDailies)){
  102. log.info("~~~~进入了兜底处理因为工业库挂掉或者其他原因,导致日报数据早于工业库数据的问题@@@%%%");
  103. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
  104. //处理天级的数据
  105. xinyiDailyService.addDailyData(tXinyiDaily, xinyiBigTableHour);
  106. }
  107. //再去查询化验库,查看是否已经存在化验库的数据了
  108. List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectTXinyiRobotList(TXinyiRobot.builder().testHour(tXinyiIndustry.getTestHour()).build());
  109. if(!CollectionUtils.isEmpty(tXinyiRobots)){
  110. log.info("~~~~进入了兜底处理因为工业库挂掉或者其他原因,导致化验室数据早于工业库数据的问题@@@***");
  111. TXinyiRobot tXinyiRobot = tXinyiRobots.get(0);
  112. jsCsFormatData.addRobot2Hour(xinyiBigTableHour, tXinyiRobot);
  113. }
  114. //插入
  115. this.xinyiBigTableHourMapper.insertTXinyiBigTableHour(xinyiBigTableHour);
  116. }
  117. private void addIndustry2BigTable(TXinyiBigTableHour xinyiBigTableHour, TXinyiIndustry tXinyiIndustry) {
  118. //2024年7月5日18:13:43 处理时间和日期
  119. xinyiBigTableHour.setTestDate(tXinyiIndustry.getTestDate());
  120. xinyiBigTableHour.setTestHour(tXinyiIndustry.getTestHour());
  121. xinyiBigTableHour.setGyJsCod(tXinyiIndustry.getJsCod());
  122. xinyiBigTableHour.setGyJsPh(tXinyiIndustry.getJsPh());
  123. xinyiBigTableHour.setGyJsSs(tXinyiIndustry.getJsSs());
  124. xinyiBigTableHour.setGyJsTp(tXinyiIndustry.getJsTp());
  125. xinyiBigTableHour.setGyJsTn(tXinyiIndustry.getJsTn());
  126. xinyiBigTableHour.setGyJsNh3(tXinyiIndustry.getJsNh3());
  127. xinyiBigTableHour.setGyJsSwPh(tXinyiIndustry.getJsSwPh());
  128. xinyiBigTableHour.setGyJsBfyw(tXinyiIndustry.getJsBfyw());
  129. xinyiBigTableHour.setGyCsSlqc(tXinyiIndustry.getCsSlqc());
  130. xinyiBigTableHour.setGyCsCod(tXinyiIndustry.getCsCod());
  131. xinyiBigTableHour.setGyCsPh(tXinyiIndustry.getCsPh());
  132. xinyiBigTableHour.setGyCsSs(tXinyiIndustry.getCsSs());
  133. xinyiBigTableHour.setGyCsTn(tXinyiIndustry.getCsTn());
  134. xinyiBigTableHour.setGyCsTp(tXinyiIndustry.getCsTp());
  135. xinyiBigTableHour.setGyCsNh3(tXinyiIndustry.getCsNh3());
  136. xinyiBigTableHour.setGyOneHyzdDo(tXinyiIndustry.getOneHyzdDo());
  137. xinyiBigTableHour.setGyOneHymdDo(tXinyiIndustry.getOneHymdDo());
  138. xinyiBigTableHour.setGyTwoHyzdDo(tXinyiIndustry.getTwoHyzdDo());
  139. xinyiBigTableHour.setGyTwoHymdDo(tXinyiIndustry.getTwoHymdDo());
  140. xinyiBigTableHour.setGyOneMlss(tXinyiIndustry.getOneMlss());
  141. xinyiBigTableHour.setGyTwoMlss(tXinyiIndustry.getTwoMlss());
  142. xinyiBigTableHour.setGyJsTds(tXinyiIndustry.getJsTds());
  143. xinyiBigTableHour.setGyJsSlq(tXinyiIndustry.getJsSlq());
  144. xinyiBigTableHour.setGyNHlbOneGp(tXinyiIndustry.getNHlbOneGp());
  145. xinyiBigTableHour.setGyNHlbTwoGp(tXinyiIndustry.getNHlbTwoGp());
  146. xinyiBigTableHour.setGyNHlbThreeGp(tXinyiIndustry.getNHlbThreeGp());
  147. xinyiBigTableHour.setGyNHlbFourGp(tXinyiIndustry.getNHlbFourGp());
  148. xinyiBigTableHour.setGyNhlBFiveGp(tXinyiIndustry.getNhlBFiveGp());
  149. xinyiBigTableHour.setGyNHlbSixGp(tXinyiIndustry.getNHlbSixGp());
  150. xinyiBigTableHour.setGyWHlbOneGp(tXinyiIndustry.getWHlbOneGp());
  151. xinyiBigTableHour.setGyWHlbTwoGp(tXinyiIndustry.getWHlbTwoGp());
  152. xinyiBigTableHour.setGyWHlbThreeGp(tXinyiIndustry.getWHlbThreeGp());
  153. xinyiBigTableHour.setGyWHlbFourGp(tXinyiIndustry.getWHlbFourGp());
  154. xinyiBigTableHour.setGyWHlbFiveGp(tXinyiIndustry.getWHlbFiveGp());
  155. xinyiBigTableHour.setGyFjOne(tXinyiIndustry.getFjOne());
  156. xinyiBigTableHour.setGyFjTwo(tXinyiIndustry.getFjTwo());
  157. xinyiBigTableHour.setGyFjThree(tXinyiIndustry.getFjThree());
  158. xinyiBigTableHour.setGyFjFour(tXinyiIndustry.getFjFour());
  159. xinyiBigTableHour.setGyFjFive(tXinyiIndustry.getFjFive());
  160. xinyiBigTableHour.setGyFjSix(tXinyiIndustry.getFjSix());
  161. xinyiBigTableHour.setGyKqllOne(tXinyiIndustry.getKqllOne());
  162. xinyiBigTableHour.setGyKqllTwo(tXinyiIndustry.getKqllTwo());
  163. xinyiBigTableHour.setGyKqllThree(tXinyiIndustry.getKqllThree());
  164. xinyiBigTableHour.setGyKqllFour(tXinyiIndustry.getKqllFour());
  165. xinyiBigTableHour.setGyKqllFive(tXinyiIndustry.getKqllFive());
  166. xinyiBigTableHour.setGyKqllSix(tXinyiIndustry.getKqllSix());
  167. xinyiBigTableHour.setGySjtyjly(tXinyiIndustry.getSJTYJLY());
  168. xinyiBigTableHour.setGyCljyssll(tXinyiIndustry.getCLJYSSLL());
  169. xinyiBigTableHour.setGyHycRjyAll(tXinyiIndustry.getHycRjyAll());
  170. xinyiBigTableHour.setGyHycRjyZdAll(tXinyiIndustry.getHycRjyZdAll());
  171. xinyiBigTableHour.setGyHycWnndAll(tXinyiIndustry.getHycWnndAll());
  172. xinyiBigTableHour.setGyClP04Ycz(tXinyiIndustry.getCLP04YCZ());
  173. }
  174. private void addCalculate2BigTable(TXinyiBigTableHour xinyiBigTableHour, TXinyiCalculate xinyiCalculate) {
  175. xinyiBigTableHour.setJsJsTdb(xinyiCalculate.getJsTdb());
  176. xinyiBigTableHour.setJsJsTlb(xinyiCalculate.getJsTlb());
  177. xinyiBigTableHour.setJsJsBodBCod(xinyiCalculate.getJsBodBCod());
  178. xinyiBigTableHour.setJsYyqHrt(xinyiCalculate.getYyqHrt());
  179. xinyiBigTableHour.setJsQyqHrt(xinyiCalculate.getQyqHrt());
  180. xinyiBigTableHour.setJsHyqHrt(xinyiCalculate.getHyqHrt());
  181. xinyiBigTableHour.setJsHfxwnndzb(xinyiCalculate.getHFXWNNDZB());
  182. xinyiBigTableHour.setJsFM(xinyiCalculate.getFM());
  183. xinyiBigTableHour.setJsGsls(xinyiCalculate.getGSLS());
  184. xinyiBigTableHour.setJsGslsOne(xinyiCalculate.getGslsOne());
  185. xinyiBigTableHour.setJsGslsTwo(xinyiCalculate.getGslsTwo());
  186. xinyiBigTableHour.setJsXgsGsls(xinyiCalculate.getXgsGsls());
  187. xinyiBigTableHour.setJsXlcscBmfh(xinyiCalculate.getXlcscBmfh());
  188. xinyiBigTableHour.setJsXlcscHrt(xinyiCalculate.getXlcscHrt());
  189. xinyiBigTableHour.setJsCccdcBmfh(xinyiCalculate.getCccdcBmfh());
  190. xinyiBigTableHour.setJsCccdcHrt(xinyiCalculate.getCccdcHrt());
  191. xinyiBigTableHour.setJsEccBmfh(xinyiCalculate.getEccBmfh());
  192. xinyiBigTableHour.setJsEccHrt(xinyiCalculate.getEccHrt());
  193. xinyiBigTableHour.setJsEccGtfh(xinyiCalculate.getEccGtfh());
  194. xinyiBigTableHour.setJsClsnJcsj(xinyiCalculate.getClsnJcsj());
  195. xinyiBigTableHour.setJsXgcdcQsqSsls(xinyiCalculate.getXgcdcQsqSsls());
  196. xinyiBigTableHour.setJsWhlb(xinyiCalculate.getWHLB());
  197. xinyiBigTableHour.setJsNhlb(xinyiCalculate.getNHLB());
  198. xinyiBigTableHour.setJsWdscnl(xinyiCalculate.getWDSCNL());
  199. xinyiBigTableHour.setJsQsb(xinyiCalculate.getQSB());
  200. xinyiBigTableHour.setJsFcxsl(xinyiCalculate.getFCXSL());
  201. xinyiBigTableHour.setJsFcxslbl(xinyiCalculate.getFCXSLBL());
  202. //2024年7月11日15:57:20 外回流比采用新的公式计算
  203. xinyiBigTableHour.setJsWhlbRN(xinyiCalculate.getWhlRN());
  204. }
  205. /**
  206. * 额外计算一下预测的准确度
  207. * @param tXinyiIndustry
  208. */
  209. public void updateForecastComparisonByIndustry(TXinyiIndustry tXinyiIndustry) {
  210. BigDecimal csCod = tXinyiIndustry.getCsCod();
  211. BigDecimal csSs = tXinyiIndustry.getCsSs();
  212. BigDecimal csTn = tXinyiIndustry.getCsTn();
  213. BigDecimal csTp = tXinyiIndustry.getCsTp();
  214. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  215. String testHour = tXinyiIndustry.getTestHour();
  216. //时间段1
  217. List<TXinyiForecastComparison> tXinyiForecastComparisons1 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeOne(testHour).build());
  218. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons1)){
  219. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons1) {
  220. BigDecimal hsForecastOne = tXinyiForecastComparison.getHsForecastOne();
  221. BigDecimal yyForecastOne = tXinyiForecastComparison.getYyForecastOne();
  222. BigDecimal jlForecastOne = tXinyiForecastComparison.getJlForecastOne();
  223. if(BusinessEnum.BigModelForecastEnum.COD.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  224. tXinyiForecastComparison.setRealOne(csCod);
  225. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  226. if(!Objects.isNull(hsForecastOne)){
  227. BigDecimal subtract = csCod.subtract(hsForecastOne);
  228. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  229. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  230. }
  231. if(!Objects.isNull(yyForecastOne)){
  232. BigDecimal subtract = csCod.subtract(yyForecastOne);
  233. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  234. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  235. }
  236. if(!Objects.isNull(jlForecastOne)){
  237. BigDecimal subtract = csCod.subtract(jlForecastOne);
  238. tXinyiForecastComparison.setJlErrorRateOne((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  239. tXinyiForecastComparison.setJlOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  240. }
  241. }
  242. }
  243. if(BusinessEnum.BigModelForecastEnum.SS.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  244. tXinyiForecastComparison.setRealOne(csSs);
  245. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  246. if(!Objects.isNull(hsForecastOne)){
  247. BigDecimal subtract = csSs.subtract(hsForecastOne);
  248. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  249. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  250. }
  251. if(!Objects.isNull(yyForecastOne)){
  252. BigDecimal subtract = csSs.subtract(yyForecastOne);
  253. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  254. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  255. }
  256. }
  257. }
  258. //2024年6月21日16:28:56 tn总氮的预测用xsy1和xsy2计算 并从化验库获取
  259. /*if(TN.equals(tXinyiForecastComparison.getCategory())){
  260. tXinyiForecastComparison.setRealOne(csTn);
  261. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  262. if(!Objects.isNull(hsForecastOne))
  263. tXinyiForecastComparison.setHsErrorRateOne((csTn.subtract(hsForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  264. if(!Objects.isNull(yyForecastOne))
  265. tXinyiForecastComparison.setYyErrorRateOne((csTn.subtract(yyForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  266. }
  267. }*/
  268. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  269. /*if(TP.equals(tXinyiForecastComparison.getCategory())){
  270. tXinyiForecastComparison.setRealOne(csTp);
  271. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  272. tXinyiForecastComparison.setHsErrorRateOne((csTp.subtract(hsForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  273. tXinyiForecastComparison.setYyErrorRateOne((csTp.subtract(yyForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  274. }
  275. }*/
  276. if(BusinessEnum.BigModelForecastEnum.NH3.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  277. tXinyiForecastComparison.setRealOne(csNh3);
  278. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  279. if(!Objects.isNull(hsForecastOne)){
  280. BigDecimal subtract = csNh3.subtract(hsForecastOne);
  281. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  282. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  283. }
  284. if(!Objects.isNull(yyForecastOne)){
  285. BigDecimal subtract = csNh3.subtract(yyForecastOne);
  286. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  287. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  288. }
  289. }
  290. }
  291. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  292. }
  293. }
  294. //时间段2
  295. List<TXinyiForecastComparison> tXinyiForecastComparisons2 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeTwo(testHour).build());
  296. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons2)){
  297. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons2) {
  298. BigDecimal hsForecastTwo = tXinyiForecastComparison.getHsForecastTwo();
  299. BigDecimal yyForecastTwo = tXinyiForecastComparison.getYyForecastTwo();
  300. BigDecimal jlForecastTwo = tXinyiForecastComparison.getJlForecastTwo();
  301. if(BusinessEnum.BigModelForecastEnum.COD.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  302. tXinyiForecastComparison.setRealTwo(csCod);
  303. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  304. if(!Objects.isNull(hsForecastTwo)){
  305. BigDecimal subtract = csCod.subtract(hsForecastTwo);
  306. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  307. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  308. }
  309. if(!Objects.isNull(yyForecastTwo)){
  310. BigDecimal subtract = csCod.subtract(yyForecastTwo);
  311. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  312. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  313. }
  314. if(!Objects.isNull(jlForecastTwo)){
  315. BigDecimal subtract = csCod.subtract(jlForecastTwo);
  316. tXinyiForecastComparison.setJlErrorRateTwo((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  317. tXinyiForecastComparison.setJlTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  318. }
  319. }
  320. }
  321. if(BusinessEnum.BigModelForecastEnum.SS.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  322. tXinyiForecastComparison.setRealTwo(csSs);
  323. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  324. if(!Objects.isNull(hsForecastTwo)){
  325. BigDecimal subtract = csSs.subtract(hsForecastTwo);
  326. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  327. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  328. }
  329. if(!Objects.isNull(yyForecastTwo)){
  330. BigDecimal subtract = csSs.subtract(yyForecastTwo);
  331. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  332. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  333. }
  334. }
  335. }
  336. /*if(TN.equals(tXinyiForecastComparison.getCategory())){
  337. tXinyiForecastComparison.setRealTwo(csTn);
  338. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  339. if(!Objects.isNull(hsForecastTwo))
  340. tXinyiForecastComparison.setHsErrorRateTwo((csTn.subtract(hsForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  341. if(!Objects.isNull(yyForecastTwo))
  342. tXinyiForecastComparison.setYyErrorRateTwo((csTn.subtract(yyForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  343. }
  344. }*/
  345. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  346. /*if(TP.equals(tXinyiForecastComparison.getCategory())){
  347. tXinyiForecastComparison.setRealTwo(csTp);
  348. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  349. tXinyiForecastComparison.setHsErrorRateTwo((csTp.subtract(hsForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  350. tXinyiForecastComparison.setYyErrorRateTwo((csTp.subtract(yyForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  351. }
  352. }*/
  353. if(BusinessEnum.BigModelForecastEnum.NH3.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  354. tXinyiForecastComparison.setRealTwo(csNh3);
  355. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  356. if(!Objects.isNull(hsForecastTwo)){
  357. BigDecimal subtract = csNh3.subtract(hsForecastTwo);
  358. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  359. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  360. }
  361. if(!Objects.isNull(yyForecastTwo)){
  362. BigDecimal subtract = csNh3.subtract(yyForecastTwo);
  363. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  364. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  365. }
  366. }
  367. }
  368. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  369. }
  370. }
  371. //时间段3
  372. List<TXinyiForecastComparison> tXinyiForecastComparisons3 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeThree(testHour).build());
  373. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons3)){
  374. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons3) {
  375. BigDecimal hsForecastThree = tXinyiForecastComparison.getHsForecastThree();
  376. BigDecimal yyForecastThree = tXinyiForecastComparison.getYyForecastThree();
  377. BigDecimal jlForecastThree = tXinyiForecastComparison.getJlForecastThree();
  378. if(BusinessEnum.BigModelForecastEnum.COD.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  379. tXinyiForecastComparison.setRealThree(csCod);
  380. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  381. if(!Objects.isNull(hsForecastThree)){
  382. BigDecimal subtract = csCod.subtract(hsForecastThree);
  383. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  384. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  385. }
  386. if(!Objects.isNull(yyForecastThree)){
  387. BigDecimal subtract = csCod.subtract(yyForecastThree);
  388. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  389. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  390. }
  391. if(!Objects.isNull(jlForecastThree)){
  392. BigDecimal subtract = csCod.subtract(jlForecastThree);
  393. tXinyiForecastComparison.setJlErrorRateThree((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  394. tXinyiForecastComparison.setJlThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  395. }
  396. }
  397. }
  398. if(BusinessEnum.BigModelForecastEnum.SS.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  399. tXinyiForecastComparison.setRealThree(csSs);
  400. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  401. if(!Objects.isNull(hsForecastThree)){
  402. BigDecimal subtract = csSs.subtract(hsForecastThree);
  403. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  404. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  405. }
  406. if(!Objects.isNull(yyForecastThree)){
  407. BigDecimal subtract = csSs.subtract(yyForecastThree);
  408. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  409. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  410. }
  411. }
  412. }
  413. /*if(TN.equals(tXinyiForecastComparison.getCategory())){
  414. tXinyiForecastComparison.setRealThree(csTn);
  415. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  416. if(!Objects.isNull(hsForecastThree))
  417. tXinyiForecastComparison.setHsErrorRateThree((csTn.subtract(hsForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  418. if(!Objects.isNull(yyForecastThree))
  419. tXinyiForecastComparison.setYyErrorRateThree((csTn.subtract(yyForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  420. }
  421. }*/
  422. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  423. /*if(TP.equals(tXinyiForecastComparison.getCategory())){
  424. tXinyiForecastComparison.setRealThree(csTp);
  425. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  426. tXinyiForecastComparison.setHsErrorRateThree((csTp.subtract(hsForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  427. tXinyiForecastComparison.setYyErrorRateThree((csTp.subtract(yyForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  428. }
  429. }*/
  430. if(BusinessEnum.BigModelForecastEnum.NH3.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  431. tXinyiForecastComparison.setRealThree(csNh3);
  432. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  433. if(!Objects.isNull(hsForecastThree)){
  434. BigDecimal subtract = csNh3.subtract(hsForecastThree);
  435. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  436. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  437. }
  438. if(!Objects.isNull(yyForecastThree)){
  439. BigDecimal subtract = csNh3.subtract(yyForecastThree);
  440. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  441. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  442. }
  443. }
  444. }
  445. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  446. }
  447. }
  448. }
  449. /**
  450. * 额外计算一下预测的准确度
  451. * @param tXinyiRobot
  452. */
  453. public void updateForecastComparisonByRobot(TXinyiRobot tXinyiRobot) {
  454. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  455. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  456. //2024年09月08日11:28:17 新增的四个预测使用
  457. BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  458. BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  459. BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  460. BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  461. String testHour = tXinyiRobot.getTestHour();
  462. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  463. BigDecimal csTp = null;
  464. // BigDecimal csTn = null;
  465. if(!Objects.isNull(tpRccJqr)){
  466. csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  467. //2024年6月20日13:44:26 先不计算,结果会更准确
  468. //2024年6月21日14:23:14 就是要 除以0.8
  469. // csTp = tpRccJqr;
  470. }
  471. //2024年7月12日16:29:00 需要单独计算了 csTn不再合并,分别从两个池子获取。。。
  472. // if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr))
  473. // csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP).divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  474. //时间段1
  475. List<TXinyiForecastComparison> tXinyiForecastComparisons1 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeOne(testHour).build());
  476. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons1)){
  477. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons1) {
  478. BigDecimal hsForecastOne = tXinyiForecastComparison.getHsForecastOne();
  479. BigDecimal yyForecastOne = tXinyiForecastComparison.getYyForecastOne();
  480. /*if(XSY1.equals(tXinyiForecastComparison.getCategory())){
  481. tXinyiForecastComparison.setRealOne(no3Hlj1Jqr);
  482. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  483. if(!Objects.isNull(hsForecastOne))
  484. tXinyiForecastComparison.setHsErrorRateOne((no3Hlj1Jqr.subtract(hsForecastOne)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  485. if(!Objects.isNull(yyForecastOne))
  486. tXinyiForecastComparison.setYyErrorRateOne((no3Hlj1Jqr.subtract(yyForecastOne)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  487. }
  488. }
  489. if(XSY2.equals(tXinyiForecastComparison.getCategory())){
  490. tXinyiForecastComparison.setRealOne(no3Hlj2Jqr);
  491. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  492. if(!Objects.isNull(hsForecastOne))
  493. tXinyiForecastComparison.setHsErrorRateOne((no3Hlj2Jqr.subtract(hsForecastOne)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  494. if(!Objects.isNull(yyForecastOne))
  495. tXinyiForecastComparison.setYyErrorRateOne((no3Hlj2Jqr.subtract(yyForecastOne)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  496. }
  497. }*/
  498. //2024年6月21日17:04:01 总氮的真实值也从化验室获取
  499. //2024年7月12日10:31:29 tn又改成xsy1和xsy2了。。。
  500. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  501. || BusinessEnum.BigModelForecastEnum.XSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  502. tXinyiForecastComparison.setRealOne(no3Hlj1Jqr);
  503. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  504. if(!Objects.isNull(hsForecastOne)){
  505. BigDecimal subtract = no3Hlj1Jqr.subtract(hsForecastOne);
  506. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  507. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  508. }
  509. if(!Objects.isNull(yyForecastOne)){
  510. BigDecimal subtract = no3Hlj1Jqr.subtract(yyForecastOne);
  511. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  512. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  513. }
  514. }
  515. }
  516. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  517. || BusinessEnum.BigModelForecastEnum.XSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  518. tXinyiForecastComparison.setRealOne(no3Hlj2Jqr);
  519. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  520. if(!Objects.isNull(hsForecastOne)){
  521. BigDecimal subtract = no3Hlj2Jqr.subtract(hsForecastOne);
  522. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  523. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  524. }
  525. if(!Objects.isNull(yyForecastOne)){
  526. BigDecimal subtract = no3Hlj2Jqr.subtract(yyForecastOne);
  527. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  528. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  529. }
  530. }
  531. }
  532. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  533. //2024年7月11日17:08:51 tp改名字了。。。
  534. if(BusinessEnum.BigModelForecastEnum.TP.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  535. || BusinessEnum.BigModelForecastEnum.ZLSY.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  536. tXinyiForecastComparison.setRealOne(csTp);
  537. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  538. if(!Objects.isNull(hsForecastOne)){
  539. BigDecimal subtract = csTp.subtract(hsForecastOne);
  540. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  541. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  542. }
  543. if(!Objects.isNull(yyForecastOne)){
  544. BigDecimal subtract = csTp.subtract(yyForecastOne);
  545. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  546. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  547. }
  548. }
  549. }
  550. //2024年09月08日11:31:16 新增四个预测的真实值的字段更新
  551. if(BusinessEnum.BigModelForecastEnum.QYXSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  552. tXinyiForecastComparison.setRealOne(no3Qyc1Jqr);
  553. if(!Objects.isNull(no3Qyc1Jqr) && no3Qyc1Jqr.compareTo(BigDecimal.ZERO) > 0){
  554. if(!Objects.isNull(hsForecastOne)){
  555. BigDecimal subtract = no3Qyc1Jqr.subtract(hsForecastOne);
  556. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  557. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  558. }
  559. if(!Objects.isNull(yyForecastOne)){
  560. BigDecimal subtract = no3Qyc1Jqr.subtract(yyForecastOne);
  561. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  562. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  563. }
  564. }
  565. }
  566. if(BusinessEnum.BigModelForecastEnum.QYXSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  567. tXinyiForecastComparison.setRealOne(no3Qyc2Jqr);
  568. if(!Objects.isNull(no3Qyc2Jqr) && no3Qyc2Jqr.compareTo(BigDecimal.ZERO) > 0){
  569. if(!Objects.isNull(hsForecastOne)){
  570. BigDecimal subtract = no3Qyc2Jqr.subtract(hsForecastOne);
  571. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  572. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  573. }
  574. if(!Objects.isNull(yyForecastOne)){
  575. BigDecimal subtract = no3Qyc2Jqr.subtract(yyForecastOne);
  576. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  577. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  578. }
  579. }
  580. }
  581. if(BusinessEnum.BigModelForecastEnum.QYNH31.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  582. tXinyiForecastComparison.setRealOne(nh31Jqr);
  583. if(!Objects.isNull(nh31Jqr) && nh31Jqr.compareTo(BigDecimal.ZERO) > 0){
  584. if(!Objects.isNull(hsForecastOne)){
  585. BigDecimal subtract = nh31Jqr.subtract(hsForecastOne);
  586. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  587. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  588. }
  589. if(!Objects.isNull(yyForecastOne)){
  590. BigDecimal subtract = nh31Jqr.subtract(yyForecastOne);
  591. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  592. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  593. }
  594. }
  595. }
  596. if(BusinessEnum.BigModelForecastEnum.QYNH32.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  597. tXinyiForecastComparison.setRealOne(nh32Jqr);
  598. if(!Objects.isNull(nh32Jqr) && nh32Jqr.compareTo(BigDecimal.ZERO) > 0){
  599. if(!Objects.isNull(hsForecastOne)){
  600. BigDecimal subtract = nh32Jqr.subtract(hsForecastOne);
  601. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  602. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  603. }
  604. if(!Objects.isNull(yyForecastOne)){
  605. BigDecimal subtract = nh32Jqr.subtract(yyForecastOne);
  606. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  607. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  608. }
  609. }
  610. }
  611. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  612. }
  613. }
  614. //时间段2
  615. List<TXinyiForecastComparison> tXinyiForecastComparisons2 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeTwo(testHour).build());
  616. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons2)){
  617. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons2) {
  618. BigDecimal hsForecastTwo = tXinyiForecastComparison.getHsForecastTwo();
  619. BigDecimal yyForecastTwo = tXinyiForecastComparison.getYyForecastTwo();
  620. /*if(XSY1.equals(tXinyiForecastComparison.getCategory())){
  621. tXinyiForecastComparison.setRealTwo(no3Hlj1Jqr);
  622. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  623. if(!Objects.isNull(hsForecastTwo))
  624. tXinyiForecastComparison.setHsErrorRateTwo((no3Hlj1Jqr.subtract(hsForecastTwo)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  625. if(!Objects.isNull(yyForecastTwo))
  626. tXinyiForecastComparison.setYyErrorRateTwo((no3Hlj1Jqr.subtract(yyForecastTwo)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  627. }
  628. }
  629. if(XSY2.equals(tXinyiForecastComparison.getCategory())){
  630. tXinyiForecastComparison.setRealTwo(no3Hlj2Jqr);
  631. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  632. if(!Objects.isNull(hsForecastTwo))
  633. tXinyiForecastComparison.setHsErrorRateTwo((no3Hlj2Jqr.subtract(hsForecastTwo)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  634. if(!Objects.isNull(yyForecastTwo))
  635. tXinyiForecastComparison.setYyErrorRateTwo((no3Hlj2Jqr.subtract(yyForecastTwo)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  636. }
  637. }*/
  638. //2024年6月21日17:04:01 总氮的真实值也从化验室获取
  639. //2024年7月12日10:31:29 tn又改成xsy1和xsy2了。。。
  640. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  641. || BusinessEnum.BigModelForecastEnum.XSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  642. tXinyiForecastComparison.setRealTwo(no3Hlj1Jqr);
  643. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  644. if(!Objects.isNull(hsForecastTwo)){
  645. BigDecimal subtract = no3Hlj1Jqr.subtract(hsForecastTwo);
  646. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  647. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  648. }
  649. if(!Objects.isNull(yyForecastTwo)){
  650. BigDecimal subtract = no3Hlj1Jqr.subtract(yyForecastTwo);
  651. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  652. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  653. }
  654. }
  655. }
  656. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  657. || BusinessEnum.BigModelForecastEnum.XSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  658. tXinyiForecastComparison.setRealTwo(no3Hlj2Jqr);
  659. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  660. if(!Objects.isNull(hsForecastTwo)){
  661. BigDecimal subtract = no3Hlj2Jqr.subtract(hsForecastTwo);
  662. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  663. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  664. }
  665. if(!Objects.isNull(yyForecastTwo)){
  666. BigDecimal subtract = no3Hlj2Jqr.subtract(yyForecastTwo);
  667. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  668. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  669. }
  670. }
  671. }
  672. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  673. //2024年7月11日17:08:51 tp改名字了。。。
  674. if(BusinessEnum.BigModelForecastEnum.TP.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  675. || BusinessEnum.BigModelForecastEnum.ZLSY.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  676. tXinyiForecastComparison.setRealTwo(csTp);
  677. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  678. if(!Objects.isNull(hsForecastTwo)){
  679. BigDecimal subtract = csTp.subtract(hsForecastTwo);
  680. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  681. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  682. }
  683. if(!Objects.isNull(yyForecastTwo)){
  684. BigDecimal subtract = csTp.subtract(yyForecastTwo);
  685. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  686. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  687. }
  688. }
  689. }
  690. //2024年09月08日11:31:16 新增四个预测的真实值的字段更新
  691. if(BusinessEnum.BigModelForecastEnum.QYXSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  692. tXinyiForecastComparison.setRealTwo(no3Qyc1Jqr);
  693. if(!Objects.isNull(no3Qyc1Jqr) && no3Qyc1Jqr.compareTo(BigDecimal.ZERO) > 0){
  694. if(!Objects.isNull(hsForecastTwo)){
  695. BigDecimal subtract = no3Qyc1Jqr.subtract(hsForecastTwo);
  696. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  697. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  698. }
  699. if(!Objects.isNull(yyForecastTwo)){
  700. BigDecimal subtract = no3Qyc1Jqr.subtract(yyForecastTwo);
  701. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  702. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  703. }
  704. }
  705. }
  706. if(BusinessEnum.BigModelForecastEnum.QYXSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  707. tXinyiForecastComparison.setRealTwo(no3Qyc2Jqr);
  708. if(!Objects.isNull(no3Qyc2Jqr) && no3Qyc2Jqr.compareTo(BigDecimal.ZERO) > 0){
  709. if(!Objects.isNull(hsForecastTwo)){
  710. BigDecimal subtract = no3Qyc2Jqr.subtract(hsForecastTwo);
  711. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  712. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  713. }
  714. if(!Objects.isNull(yyForecastTwo)){
  715. BigDecimal subtract = no3Qyc2Jqr.subtract(yyForecastTwo);
  716. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  717. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  718. }
  719. }
  720. }
  721. if(BusinessEnum.BigModelForecastEnum.QYNH31.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  722. tXinyiForecastComparison.setRealTwo(nh31Jqr);
  723. if(!Objects.isNull(nh31Jqr) && nh31Jqr.compareTo(BigDecimal.ZERO) > 0){
  724. if(!Objects.isNull(hsForecastTwo)){
  725. BigDecimal subtract = nh31Jqr.subtract(hsForecastTwo);
  726. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  727. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  728. }
  729. if(!Objects.isNull(yyForecastTwo)){
  730. BigDecimal subtract = nh31Jqr.subtract(yyForecastTwo);
  731. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  732. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  733. }
  734. }
  735. }
  736. if(BusinessEnum.BigModelForecastEnum.QYNH32.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  737. tXinyiForecastComparison.setRealTwo(nh32Jqr);
  738. if(!Objects.isNull(nh32Jqr) && nh32Jqr.compareTo(BigDecimal.ZERO) > 0){
  739. if(!Objects.isNull(hsForecastTwo)){
  740. BigDecimal subtract = nh32Jqr.subtract(hsForecastTwo);
  741. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  742. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  743. }
  744. if(!Objects.isNull(yyForecastTwo)){
  745. BigDecimal subtract = nh32Jqr.subtract(yyForecastTwo);
  746. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  747. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  748. }
  749. }
  750. }
  751. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  752. }
  753. }
  754. //时间段3
  755. List<TXinyiForecastComparison> tXinyiForecastComparisons3 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeThree(testHour).build());
  756. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons3)){
  757. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons3) {
  758. BigDecimal hsForecastThree = tXinyiForecastComparison.getHsForecastThree();
  759. BigDecimal yyForecastThree = tXinyiForecastComparison.getYyForecastThree();
  760. /*if(XSY1.equals(tXinyiForecastComparison.getCategory())){
  761. tXinyiForecastComparison.setRealThree(no3Hlj1Jqr);
  762. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  763. if(!Objects.isNull(hsForecastThree))
  764. tXinyiForecastComparison.setHsErrorRateThree((no3Hlj1Jqr.subtract(hsForecastThree)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  765. if(!Objects.isNull(yyForecastThree))
  766. tXinyiForecastComparison.setYyErrorRateThree((no3Hlj1Jqr.subtract(yyForecastThree)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  767. }
  768. }
  769. if(XSY2.equals(tXinyiForecastComparison.getCategory())){
  770. tXinyiForecastComparison.setRealThree(no3Hlj2Jqr);
  771. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  772. if(!Objects.isNull(hsForecastThree))
  773. tXinyiForecastComparison.setHsErrorRateThree((no3Hlj2Jqr.subtract(hsForecastThree)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  774. if(!Objects.isNull(yyForecastThree))
  775. tXinyiForecastComparison.setYyErrorRateThree((no3Hlj2Jqr.subtract(yyForecastThree)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  776. }
  777. }*/
  778. //2024年6月21日17:04:01 总氮的真实值也从化验室获取
  779. //2024年7月12日10:31:29 tn又改成xsy1和xsy2了。。。
  780. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  781. || BusinessEnum.BigModelForecastEnum.XSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  782. tXinyiForecastComparison.setRealThree(no3Hlj1Jqr);
  783. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  784. if(!Objects.isNull(hsForecastThree)){
  785. BigDecimal subtract = no3Hlj1Jqr.subtract(hsForecastThree);
  786. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  787. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  788. }
  789. if(!Objects.isNull(yyForecastThree)){
  790. BigDecimal subtract = no3Hlj1Jqr.subtract(yyForecastThree);
  791. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  792. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  793. }
  794. }
  795. }
  796. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  797. || BusinessEnum.BigModelForecastEnum.XSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  798. tXinyiForecastComparison.setRealThree(no3Hlj2Jqr);
  799. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  800. if(!Objects.isNull(hsForecastThree)){
  801. BigDecimal subtract = no3Hlj2Jqr.subtract(hsForecastThree);
  802. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  803. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  804. }
  805. if(!Objects.isNull(yyForecastThree)){
  806. BigDecimal subtract = no3Hlj2Jqr.subtract(yyForecastThree);
  807. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  808. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  809. }
  810. }
  811. }
  812. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  813. //2024年7月11日17:08:51 tp改名字了。。。
  814. if(BusinessEnum.BigModelForecastEnum.TP.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  815. || BusinessEnum.BigModelForecastEnum.ZLSY.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  816. tXinyiForecastComparison.setRealThree(csTp);
  817. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  818. if(!Objects.isNull(hsForecastThree)){
  819. BigDecimal subtract = csTp.subtract(hsForecastThree);
  820. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  821. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  822. }
  823. if(!Objects.isNull(yyForecastThree)){
  824. BigDecimal subtract = csTp.subtract(yyForecastThree);
  825. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  826. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  827. }
  828. }
  829. }
  830. //2024年09月08日11:31:16 新增四个预测的真实值的字段更新
  831. if(BusinessEnum.BigModelForecastEnum.QYXSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  832. tXinyiForecastComparison.setRealThree(no3Qyc1Jqr);
  833. if(!Objects.isNull(no3Qyc1Jqr) && no3Qyc1Jqr.compareTo(BigDecimal.ZERO) > 0){
  834. if(!Objects.isNull(hsForecastThree)){
  835. BigDecimal subtract = no3Qyc1Jqr.subtract(hsForecastThree);
  836. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  837. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  838. }
  839. if(!Objects.isNull(yyForecastThree)){
  840. BigDecimal subtract = no3Qyc1Jqr.subtract(yyForecastThree);
  841. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  842. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  843. }
  844. }
  845. }
  846. if(BusinessEnum.BigModelForecastEnum.QYXSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  847. tXinyiForecastComparison.setRealThree(no3Qyc2Jqr);
  848. if(!Objects.isNull(no3Qyc2Jqr) && no3Qyc2Jqr.compareTo(BigDecimal.ZERO) > 0){
  849. if(!Objects.isNull(hsForecastThree)){
  850. BigDecimal subtract = no3Qyc2Jqr.subtract(hsForecastThree);
  851. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  852. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  853. }
  854. if(!Objects.isNull(yyForecastThree)){
  855. BigDecimal subtract = no3Qyc2Jqr.subtract(yyForecastThree);
  856. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  857. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  858. }
  859. }
  860. }
  861. if(BusinessEnum.BigModelForecastEnum.QYNH31.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  862. tXinyiForecastComparison.setRealThree(nh31Jqr);
  863. if(!Objects.isNull(nh31Jqr) && nh31Jqr.compareTo(BigDecimal.ZERO) > 0){
  864. if(!Objects.isNull(hsForecastThree)){
  865. BigDecimal subtract = nh31Jqr.subtract(hsForecastThree);
  866. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  867. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  868. }
  869. if(!Objects.isNull(yyForecastThree)){
  870. BigDecimal subtract = nh31Jqr.subtract(yyForecastThree);
  871. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  872. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  873. }
  874. }
  875. }
  876. if(BusinessEnum.BigModelForecastEnum.QYNH32.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  877. tXinyiForecastComparison.setRealThree(nh32Jqr);
  878. if(!Objects.isNull(nh32Jqr) && nh32Jqr.compareTo(BigDecimal.ZERO) > 0){
  879. if(!Objects.isNull(hsForecastThree)){
  880. BigDecimal subtract = nh32Jqr.subtract(hsForecastThree);
  881. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  882. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  883. }
  884. if(!Objects.isNull(yyForecastThree)){
  885. BigDecimal subtract = nh32Jqr.subtract(yyForecastThree);
  886. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  887. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  888. }
  889. }
  890. }
  891. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  892. }
  893. }
  894. }
  895. public TXinyiCalculate addCalculateByIndustry(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  896. //获取的一些配置信息
  897. BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
  898. BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
  899. BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
  900. BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
  901. BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
  902. BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
  903. BigDecimal gfjgzts = normConfig.getGFJGZTS();
  904. BigDecimal gfjckll = normConfig.getGFJCKLL();
  905. BigDecimal fcxbsjll = normConfig.getFCXBSJLL();
  906. BigDecimal fclbsl = normConfig.getFCLBSL();
  907. BigDecimal fcxbgzxl = normConfig.getFCXBGZXL();
  908. //结算结果
  909. TXinyiCalculate tXinyiCalculate = new TXinyiCalculate();
  910. //时间相关
  911. tXinyiCalculate.setTestDate(tXinyiIndustry.getTestDate());
  912. tXinyiCalculate.setTestHour(tXinyiIndustry.getTestHour());
  913. tXinyiCalculate.setTestTime(tXinyiIndustry.getTestTime());
  914. //获取最新的一条日报信息
  915. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  916. if(Objects.isNull(tXinyiDaily)){
  917. //理论不会出现
  918. log.error("没有日报数据");
  919. return null;
  920. }
  921. BigDecimal jsBod5 = tXinyiDaily.getJsBod5();
  922. BigDecimal csBod5 = tXinyiDaily.getCsBod5();
  923. BigDecimal whlR = tXinyiDaily.getWhlR();
  924. BigDecimal oneMlvss = tXinyiDaily.getShcHyOneMlvss();
  925. BigDecimal twoMlvss = tXinyiDaily.getShcHyTwoMlvss();
  926. BigDecimal avgMlvss = null;
  927. if(!Objects.isNull(oneMlvss) && !Objects.isNull(twoMlvss))
  928. avgMlvss = ((oneMlvss.add(twoMlvss)).divide(new BigDecimal(2),4, RoundingMode.HALF_UP));
  929. BigDecimal oneMlss = tXinyiDaily.getShcHyOneMlss();
  930. BigDecimal twoMlss = tXinyiDaily.getShcHyTwoMlss();
  931. BigDecimal avgMlss = null;
  932. if(!Objects.isNull(oneMlss) && !Objects.isNull(twoMlss))
  933. avgMlss = ((oneMlss.add(twoMlss)).divide(new BigDecimal(NUMBER_2),NUMBER_SCALE_4, RoundingMode.HALF_UP));
  934. //工业库的指标
  935. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  936. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  937. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  938. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  939. //计算
  940. if(!Objects.isNull(jsBod5)){
  941. if(!Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.ZERO) > 0)
  942. tXinyiCalculate.setJsTdb(jsBod5.divide(jsTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  943. if(!Objects.isNull(jsTp) && jsTp.compareTo(BigDecimal.ZERO) > 0)
  944. tXinyiCalculate.setJsTlb(jsBod5.divide(jsTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  945. if(!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.ZERO) > 0)
  946. tXinyiCalculate.setJsBodBCod(jsBod5.divide(jsCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  947. if(!Objects.isNull(csBod5) && !Objects.isNull(avgMlss) && avgMlss.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(jsSlq) && jsSlq.compareTo(BigDecimal.ZERO) > 0)
  948. 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));
  949. }
  950. if(!Objects.isNull(avgMlss) && avgMlss.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(avgMlvss) && avgMlvss.compareTo(BigDecimal.ZERO) > 0)
  951. tXinyiCalculate.setHFXWNNDZB(avgMlvss.divide(avgMlss, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  952. if(!Objects.isNull(jsSlq) && jsSlq.compareTo(BigDecimal.ZERO) > 0){
  953. tXinyiCalculate.setYyqHrt(new BigDecimal(YYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  954. tXinyiCalculate.setQyqHrt(new BigDecimal(QYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  955. tXinyiCalculate.setHyqHrt(new BigDecimal(HYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  956. // 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));
  957. tXinyiCalculate.setGSLS(jsSlq.divide(GSLS_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  958. 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));
  959. 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));
  960. 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));
  961. tXinyiCalculate.setXlcscBmfh(jsSlq.divide(XLCSCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  962. tXinyiCalculate.setXlcscHrt(XLCSCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  963. tXinyiCalculate.setCccdcBmfh(jsSlq.divide(CCCDCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  964. tXinyiCalculate.setCccdcHrt(CCCDCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  965. tXinyiCalculate.setEccBmfh(jsSlq.divide(ECCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  966. tXinyiCalculate.setEccHrt(ECCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  967. //2024年7月1日17:16:16 计算逻辑调整
  968. 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));
  969. tXinyiCalculate.setClsnJcsj(CLSNJCSJ_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  970. tXinyiCalculate.setXgcdcQsqSsls(jsSlq.multiply(XGCDCQSQSSLS_LAST));
  971. //2024年6月29日15:18:01 增加几个新的计算指标
  972. if(!Objects.isNull(nhlbqdsl) && !Objects.isNull(nhlbdsjll) && !Objects.isNull(nhlbgzxl))
  973. tXinyiCalculate.setNHLB(nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).multiply(BigDecimal_100).divide(jsSlq, 4, RoundingMode.HALF_UP));
  974. if(!Objects.isNull(whlbqdsl) && !Objects.isNull(whlbdsjll) && !Objects.isNull(whlbgzxl))
  975. tXinyiCalculate.setWHLB(whlbqdsl.multiply(whlbdsjll).multiply(whlbgzxl).multiply(BigDecimal_100).divide(jsSlq, 4, RoundingMode.HALF_UP));
  976. if(!Objects.isNull(gfjgzts) && !Objects.isNull(gfjckll))
  977. tXinyiCalculate.setQSB(gfjgzts.multiply(gfjckll).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  978. if(!Objects.isNull(fcxbsjll) && !Objects.isNull(fclbsl) && !Objects.isNull(fcxbgzxl)){
  979. BigDecimal fcxsl = fcxbsjll.multiply(fclbsl).multiply(fcxbgzxl);
  980. tXinyiCalculate.setFCXSL(fcxsl);
  981. //2024年7月3日10:54:28 额外再增加一个字段
  982. tXinyiCalculate.setFCXSLBL(fcxsl.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  983. }
  984. //2024年7月11日15:43:47 之前给的外回流比计算不准确,额外一个字段记录新的外回流比
  985. BigDecimal divide = jsSlq.divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  986. if(divide.compareTo(DECIMAL_1500) < 0)
  987. tXinyiCalculate.setWhlRN(DECIMAL_1200.divide(divide, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  988. else
  989. tXinyiCalculate.setWhlRN(DECIMAL_1620.divide(divide, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  990. }
  991. return tXinyiCalculate;
  992. }
  993. public void handleSHWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, TXinyiCalculate xinyiCalculate) {
  994. //判断对应指标是否报警 然后调研大模型获取决策信息
  995. // BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  996. //内回流比报警
  997. // BigDecimal nhlbSjz = normConfig.getNhlbSjz();//400
  998. // BigDecimal nhlbnkSxz = normConfig.getNhlbnkSxz();//360
  999. BigDecimal nhlbnkXxz = normConfig.getNhlbnkXxz();//270
  1000. // BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
  1001. // BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
  1002. // BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
  1003. /*BigDecimal nhlb = xinyiCalculate.getNHLB();
  1004. if(!Objects.isNull(nhlb) && !Objects.isNull(nhlbnkXxz)){
  1005. // BigDecimal divide = nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).divide(jsSlq, 4, RoundingMode.HALF_UP);
  1006. handleXinYiWarningsSH(nhlbnkXxz, nhlb, BusinessEnum.WarningCategoryEnum.NHLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  1007. }*/
  1008. //外回流比报警
  1009. // BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
  1010. // BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
  1011. // BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
  1012. BigDecimal whlbnkXxz = normConfig.getWhlbnkXxz();//75
  1013. // BigDecimal whlbSjz = normConfig.getWhlbSjz();
  1014. // BigDecimal whlb = xinyiCalculate.getWHLB();
  1015. //2024年7月11日15:54:19 外回流比采用新的计算方式获取的值
  1016. BigDecimal whlb = xinyiCalculate.getWhlRN();
  1017. if(!Objects.isNull(whlb) && !Objects.isNull(whlbnkXxz)){
  1018. handleXinYiWarningsSH(whlbnkXxz, whlb, BusinessEnum.WarningCategoryEnum.WHLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  1019. }
  1020. //最新的一条日报数据
  1021. /*List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(null);
  1022. if(CollectionUtils.isEmpty(tXinyiDailies))
  1023. return;//肯定不会出现这种情况 因为有很多历史数据了
  1024. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);*/
  1025. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  1026. if(Objects.isNull(tXinyiDaily))
  1027. return;//肯定不会出现这种情况 因为有很多历史数据了 新水厂可能会有这个问题
  1028. // log.info("生化报警获取日报的最新的一条数据为{}", JSON.toJSONString(tXinyiDaily));
  1029. //污泥浓度报警
  1030. BigDecimal sjscgkz = null;
  1031. //判断是否是夏季
  1032. if(LocalDateTimeUtil.isSummer())
  1033. sjscgkz = normConfig.getXjwnndXxz();
  1034. else
  1035. sjscgkz = normConfig.getDjwnndXxz();
  1036. //#1
  1037. BigDecimal oneMlss = tXinyiIndustry.getOneMlss();
  1038. if(!Objects.isNull(oneMlss) && !Objects.isNull(sjscgkz)){
  1039. handleXinYiWarningsSH(sjscgkz, oneMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_1.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1040. }
  1041. //#1
  1042. BigDecimal twoMlss = tXinyiIndustry.getTwoMlss();
  1043. if(!Objects.isNull(twoMlss) && !Objects.isNull(sjscgkz)){
  1044. handleXinYiWarningsSH(sjscgkz, twoMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_2.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1045. }
  1046. //污泥负荷(需要从日报获取数据) 计算 + 部分数据从日报获取
  1047. //污泥负荷=[Ls]=24*([BOD_in]-[BOD_off])*[Q_in]/[MLSS]/([V_hao]+[V_que]+[V_yan])/2 kgBOD/(kgMLSS·d)
  1048. //2024年6月27日17:18:33 直接从计算结果拿到
  1049. BigDecimal fm = xinyiCalculate.getFM();
  1050. //2024年6月28日17:17:03 已经配置了新的
  1051. BigDecimal wnfhnkXxz = normConfig.getWnfhnkXxz();
  1052. if(!Objects.isNull(fm) && !Objects.isNull(wnfhnkXxz)){
  1053. handleXinYiWarningsSH(wnfhnkXxz, fm, BusinessEnum.WarningCategoryEnum.WNFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.KGBOD_KGMLSS_D.getCode());
  1054. }
  1055. //万吨水产泥率(todo 没有计算规则,只能从日报获取)
  1056. //挥发性污泥浓度占比(MLVSS/MLSS)
  1057. //特殊:小于
  1058. BigDecimal hfxwnndzb = xinyiCalculate.getHFXWNNDZB();
  1059. BigDecimal hfxwnndzbSjz = normConfig.getHfxwnndzbSjz();
  1060. if(!Objects.isNull(hfxwnndzb) && !Objects.isNull(hfxwnndzbSjz)){
  1061. handleXinYiWarningsSH(hfxwnndzbSjz, hfxwnndzb, BusinessEnum.WarningCategoryEnum.HFXWNNDZB.getCode(), tXinyiIndustry, normConfig, false, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1062. }
  1063. //进水碳氮比
  1064. BigDecimal jsTdb = xinyiCalculate.getJsTdb();
  1065. BigDecimal jstdbnkzXxz = normConfig.getJstdbnkzXxz();
  1066. if(!Objects.isNull(jsTdb) && !Objects.isNull(jstdbnkzXxz)){
  1067. handleXinYiWarningsSH(jstdbnkzXxz, jsTdb, BusinessEnum.WarningCategoryEnum.TDB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1068. }
  1069. //进水碳磷比
  1070. BigDecimal jsTlb = xinyiCalculate.getJsTlb();
  1071. BigDecimal jstlbNkz = normConfig.getJstlbNkz();
  1072. if(!Objects.isNull(jsTlb) && !Objects.isNull(jstlbNkz)){
  1073. handleXinYiWarningsSH(jstlbNkz, jsTlb, BusinessEnum.WarningCategoryEnum.TLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1074. }
  1075. //进水BOD与COD比值(生化性)
  1076. BigDecimal jsBodBCod = xinyiCalculate.getJsBodBCod();
  1077. String jsbodycodbzGkz = normConfig.getJsbodycodbzGkz();
  1078. if(!StringUtils.isBlank(jsbodycodbzGkz) && jsbodycodbzGkz.contains("-")){
  1079. String[] split = jsbodycodbzGkz.split("-");
  1080. sjscgkz = new BigDecimal(split[0]);
  1081. if(!Objects.isNull(jsBodBCod)){
  1082. handleXinYiWarningsSH(sjscgkz, jsBodBCod, BusinessEnum.WarningCategoryEnum.BODCODB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1083. }
  1084. }
  1085. //好氧区DO(一池) 2024年5月31日14:04:37 加数据,让他一直报警
  1086. BigDecimal shcHyOneDo = tXinyiIndustry.getOneHymdDo();
  1087. // BigDecimal shcHyOneDo = new BigDecimal("5");
  1088. // BigDecimal hycrjysjzSxz = normConfig.getHycrjysjzSxz();
  1089. BigDecimal hycrjyNkz = normConfig.getHycrjyNkz();
  1090. if(!Objects.isNull(shcHyOneDo) && !Objects.isNull(hycrjyNkz)){
  1091. handleXinYiWarningsSH(hycrjyNkz, shcHyOneDo, BusinessEnum.WarningCategoryEnum.HYQDO_ONE.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1092. }
  1093. //好氧区DO(二池) 2024年5月31日14:09:36 溶解氧从日报获取 工业的不准
  1094. //2024年6月27日17:00:31 都先从工业库获取,日报没有必要再报警了
  1095. BigDecimal shcHyTwoDo = tXinyiIndustry.getTwoHymdDo();
  1096. if(!Objects.isNull(shcHyTwoDo) && !Objects.isNull(hycrjyNkz)){
  1097. handleXinYiWarningsSH(hycrjyNkz, shcHyTwoDo, BusinessEnum.WarningCategoryEnum.HYQDO_TWO.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1098. }
  1099. //气水比
  1100. BigDecimal qsb = xinyiCalculate.getQSB();
  1101. BigDecimal shcqbNkz = normConfig.getShcqbNkz();
  1102. if(!Objects.isNull(qsb) && !Objects.isNull(shcqbNkz))
  1103. handleXinYiWarningsSH(shcqbNkz, qsb, BusinessEnum.WarningCategoryEnum.QSB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.M3_M3.getCode());
  1104. //二沉池表面负荷
  1105. BigDecimal eccBmfh = xinyiCalculate.getEccBmfh();
  1106. BigDecimal eccbmfhznkzXxz = normConfig.getEccbmfhznkzXxz();
  1107. if(!Objects.isNull(eccBmfh) && !Objects.isNull(eccbmfhznkzXxz)){
  1108. handleXinYiWarningsSH(eccbmfhznkzXxz, eccBmfh, BusinessEnum.WarningCategoryEnum.ECC_BMFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.M3_M2_H.getCode());
  1109. }
  1110. //二沉池固体负荷
  1111. BigDecimal eccGtfh = xinyiCalculate.getEccGtfh();
  1112. BigDecimal eccgtfhnkxxz = normConfig.getECCGTFHNKXXZ();
  1113. if(!Objects.isNull(eccGtfh) && !Objects.isNull(eccgtfhnkxxz)){
  1114. handleXinYiWarningsSH(eccgtfhnkxxz, eccGtfh, BusinessEnum.WarningCategoryEnum.ECC_GTFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.KG_M2_D.getCode());
  1115. }
  1116. //反冲洗水量
  1117. //2024年7月3日10:59:32 这里用反冲洗水量比例做计算
  1118. BigDecimal fcxslBl = xinyiCalculate.getFCXSLBL();
  1119. BigDecimal fcxslblsjzXxz = normConfig.getFcxslblsjzXxz();
  1120. if(!Objects.isNull(fcxslBl) && !Objects.isNull(fcxslblsjzXxz))
  1121. handleXinYiWarningsSH(fcxslblsjzXxz, fcxslBl, BusinessEnum.WarningCategoryEnum.FCXSL.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  1122. }
  1123. /**
  1124. * 处理信义生化报警的逻辑 统一处理
  1125. * @param sjscgkz :实际生产管控值
  1126. * @param currentVal
  1127. * @param category
  1128. * @param tXinyiIndustry
  1129. * @param normConfig
  1130. * @param normal 是否常规判断:默认都是超过;只有这个挥发性污泥浓度占比(VSS/SS)是小于才报警
  1131. * 2024年6月27日15:39:15 调整:生化报警只取实际生产管控指标
  1132. * 2024年7月11日10:44:11 新增单位unit 拼接完单位以后返回
  1133. *
  1134. */
  1135. private void handleXinYiWarningsSH(BigDecimal sjscgkz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Boolean normal, String unit) {
  1136. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1137. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  1138. tXinyiWarningRecord.setStatus(0);
  1139. tXinyiWarningRecord.setType(1);
  1140. tXinyiWarningRecord.setCategory(category);
  1141. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1142. tXinyiWarningRecord.setWarningVal(currentVal);
  1143. tXinyiWarningRecord.setDesignVal(sjscgkz);
  1144. tXinyiWarningRecord.setControlVal(sjscgkz);
  1145. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1146. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1147. tXinyiWarningRecord.setRemark(ONE_SH_WARNING.getCode());
  1148. //2024年6月27日17:36:25 有一个判断是反正的
  1149. if(normal){
  1150. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1151. if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
  1152. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1153. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1154. } else if (currentVal.compareTo(sjscgkz) > 0) {//一级
  1155. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1156. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1157. } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
  1158. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1159. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1160. } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
  1161. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1162. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1163. }*/ else {
  1164. tXinyiWarningRecord = null;//这种的无需处理
  1165. }
  1166. }else{
  1167. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1168. if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
  1169. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1170. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1171. } else if (currentVal.compareTo(sjscgkz) < 0) {//一级
  1172. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1173. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1174. } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
  1175. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1176. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1177. } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
  1178. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1179. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1180. }*/ else {
  1181. tXinyiWarningRecord = null;//这种的无需处理
  1182. }
  1183. }
  1184. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1185. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(1).category(category).status(0).build());
  1186. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1187. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1188. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1189. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1190. xinyiWarningRecord.setStatus(2);
  1191. Date nowDate = DateUtils.getNowDate();
  1192. xinyiWarningRecord.setOffTime(nowDate);
  1193. xinyiWarningRecord.setUpdateTime(nowDate);
  1194. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1195. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1196. }
  1197. }
  1198. }else{//有新的告警信息
  1199. Date nowDate = DateUtils.getNowDate();
  1200. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1201. //保存到数据库中
  1202. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  1203. tXinyiWarningRecord.setUpdateTime(nowDate);
  1204. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1205. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1206. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1207. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1208. }else {
  1209. //继续调用决策(普通问答)
  1210. this.askBigModelForSHWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig, unit);
  1211. }
  1212. }else{
  1213. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  1214. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  1215. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1216. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1217. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1218. }else {
  1219. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  1220. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  1221. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  1222. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  1223. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  1224. xinyiWarningRecord.setUpdateTime(nowDate);
  1225. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1226. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  1227. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  1228. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  1229. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  1230. //更新数据库
  1231. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1232. //继续调用决策(普通问答)
  1233. this.askBigModelForSHWarning(xinyiWarningRecord, tXinyiIndustry, normConfig, unit);
  1234. }
  1235. }
  1236. }
  1237. }
  1238. }
  1239. public void handleSZWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1240. //出水相关
  1241. //出水COD报警
  1242. BigDecimal csCod = tXinyiIndustry.getCsCod();
  1243. BigDecimal cscodBzz = normConfig.getCscodBzz();
  1244. BigDecimal cscodGkz = normConfig.getCscodGkz();
  1245. if(!Objects.isNull(cscodBzz)){
  1246. handleXinYiWarningsCs(cscodBzz, csCod, cscodGkz, BusinessEnum.WarningCategoryEnum.CS_COD.getCode(), tXinyiIndustry, normConfig);
  1247. }
  1248. //出水总磷超标报警
  1249. BigDecimal csTp = tXinyiIndustry.getCsTp();
  1250. BigDecimal cszlBzz = normConfig.getCszlBzz();
  1251. BigDecimal cszlGkz = normConfig.getCszlGkz();
  1252. if(!Objects.isNull(cszlBzz)){
  1253. handleXinYiWarningsCs(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig);
  1254. }
  1255. //出水总氮超标报警
  1256. BigDecimal csTn = tXinyiIndustry.getCsTn();
  1257. BigDecimal cszzBzz = normConfig.getCszzBzz();
  1258. BigDecimal cszzGkz = normConfig.getCszzGkz();
  1259. if(!Objects.isNull(cszzBzz)){
  1260. handleXinYiWarningsCs(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig);
  1261. }
  1262. //出水氨氮超标报警
  1263. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  1264. BigDecimal csadBzz = normConfig.getCsadBzz();
  1265. BigDecimal csadGkz = normConfig.getCsadGkz();
  1266. if(!Objects.isNull(csadBzz)){
  1267. handleXinYiWarningsCs(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig);
  1268. }
  1269. //出水SS超标报警
  1270. BigDecimal csSS = tXinyiIndustry.getCsSs();
  1271. BigDecimal csSSBzz = normConfig.getCsssBzz();
  1272. BigDecimal csssGkz = normConfig.getCsssGkz();
  1273. if(!Objects.isNull(csSSBzz)){
  1274. handleXinYiWarningsCs(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig);
  1275. }
  1276. //进水相关报警
  1277. //进水总磷超标报警
  1278. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  1279. BigDecimal jszlSjz = normConfig.getJszlSjz();
  1280. if(!Objects.isNull(jszlSjz)){
  1281. handleXinYiWarningRecordJS(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig);
  1282. }
  1283. //进水COD超标报警
  1284. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  1285. BigDecimal jscodSjz = normConfig.getJscodSjz();
  1286. if(!Objects.isNull(jscodSjz)){
  1287. handleXinYiWarningRecordJS(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig);
  1288. }
  1289. //进水总氮超标报警
  1290. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  1291. BigDecimal jszdSjz = normConfig.getJszdSjz();
  1292. if(!Objects.isNull(jszdSjz)){
  1293. handleXinYiWarningRecordJS(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig);
  1294. }
  1295. //进水氨氮超标报警
  1296. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  1297. BigDecimal jsadSjz = normConfig.getJsadSjz();
  1298. if(!Objects.isNull(jsadSjz)){
  1299. handleXinYiWarningRecordJS(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig);
  1300. }
  1301. //进水SS超标报警
  1302. BigDecimal jsSS = tXinyiIndustry.getJsSs();
  1303. BigDecimal jsSSSjz = normConfig.getJsssSjz();
  1304. if(!Objects.isNull(jsSSSjz)){
  1305. handleXinYiWarningRecordJS(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig);
  1306. }
  1307. }
  1308. private void askBigModelForSHWarning(TXinyiWarningRecord xinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String unit) {
  1309. log.info("进入了后台接口调⽤⼤模型获取问答结果处理");
  1310. StringBuilder sb = new StringBuilder();
  1311. String sessionId = IdUtils.simpleUUID();
  1312. ChatReq chatReq = new ChatReq();
  1313. // String ipAddr = IpUtils.getIpAddr();//获取用户的ip地址 传给大模型
  1314. String ipAddr = "";//获取用户的ip地址 传给大模型 定时任务获取不到ip地址
  1315. int counts = 1;//默认是第一次
  1316. //这种问答 没有历史问答的概念 直接把问题扔进去就行 无需查询历史记录
  1317. List<String> historyDates = new ArrayList<>();
  1318. //构建问题(替换提示词中的占位符)
  1319. /*String shWarningPrompt = SH_WARNING_PROMPT;
  1320. shWarningPrompt =shWarningPrompt.replace("#{0}", xinyiWarningRecord.getReason());
  1321. shWarningPrompt =shWarningPrompt.replace("#{1}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getDesignVal(), INT_2)));
  1322. shWarningPrompt =shWarningPrompt.replace("#{2}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getControlVal(), INT_2)));
  1323. shWarningPrompt =shWarningPrompt.replace("#{3}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getWarningVal(), INT_2)));*/
  1324. //2024年7月5日10:08:54 拼接优化
  1325. StringBuilder prompt = new StringBuilder(SH_WARNING_PROMPT_1);
  1326. prompt.append(xinyiWarningRecord.getReason());
  1327. prompt.append(SH_WARNING_PROMPT_2).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getDesignVal(), INT_2));
  1328. prompt.append(SH_WARNING_PROMPT_3).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getControlVal(), INT_2));
  1329. prompt.append(SH_WARNING_PROMPT_4).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getWarningVal(), INT_2));
  1330. prompt.append(SH_WARNING_PROMPT_5);
  1331. historyDates.add(prompt.toString());
  1332. // 获取输出流
  1333. ManagedChannel channel = null;
  1334. try {
  1335. channel = ManagedChannelBuilder.forAddress(bigModelConfig.getIp(), bigModelConfig.getPort())
  1336. .usePlaintext()
  1337. .build();
  1338. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  1339. // 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) + "}";
  1340. //2024年6月27日13:29:18 优化,不再使用拼接JSON字符串
  1341. String dataJson = buildBigModelReqForChat(sessionId, historyDates, ipAddr, false);
  1342. // log.info("请求大模型的问答参数为{}", dataJson);
  1343. PredictionsRequest request = PredictionsRequest.newBuilder()
  1344. .setModelName("slibra_bot")
  1345. .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理
  1346. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  1347. .buildPartial();
  1348. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  1349. //将结果记录到问答表
  1350. while (predictions.hasNext()) {
  1351. String responseStr = predictions.next().getPrediction().toStringUtf8();
  1352. // log.info("大模型问答返回的原始结果为{}", responseStr);
  1353. responseStr = JSON.parseObject(responseStr).getString("message");
  1354. if("complete".equals(responseStr)){
  1355. log.info("结尾语句并且是非JSON,无需处理");
  1356. }else{
  1357. sb.append(responseStr);
  1358. }
  1359. }
  1360. //将问答更新到数据库中
  1361. chatReq.setSessionId(sessionId);
  1362. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  1363. chatReq.setModule(3);//0专家问答 1智能工单 2智能体助手 3告警 4简报
  1364. String showVal = this.buildShowValueSH(xinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate(), unit);
  1365. chatReq.setShowVal(showVal);
  1366. chatReq.setQuestion(prompt.toString());
  1367. chatReq.setAnswer(sb.toString());
  1368. chatReq.setWarningId(String.valueOf(xinyiWarningRecord.getId()));
  1369. chatReq.setCounts(counts);//问答次数
  1370. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  1371. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  1372. chatReq.setCreateTime(DateUtils.getNowDate());
  1373. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  1374. } catch (IOException e) {
  1375. throw new RuntimeException(e);
  1376. } finally {
  1377. // 关闭输出流
  1378. channel.shutdown();
  1379. }
  1380. }
  1381. private String buildBigModelReqForChat(String sessionId, List<String> historyDates, String ipAddr, Boolean strengthen) {
  1382. ChatRequest chatRequest = new ChatRequest();
  1383. chatRequest.setSessionId(sessionId);
  1384. chatRequest.setHistoryDia(historyDates);
  1385. //2024年7月5日13:24:10 temperature做区分
  1386. GenerateArgs generateArgs = new GenerateArgs();
  1387. generateArgs.setTemperature(bigModelConfig.getTemperature());
  1388. chatRequest.setGenerateArgs(generateArgs);
  1389. Map<String, Object> extra = new HashMap<>();
  1390. extra.put("ip_address", ipAddr);
  1391. chatRequest.setExtra(extra);
  1392. chatRequest.setStrengthen(strengthen);
  1393. //2024年7月3日16:21:28 明确该场景不用调工具
  1394. chatRequest.setTools(String.valueOf(false));
  1395. return JSON.toJSONString(chatRequest);
  1396. }
  1397. /**
  1398. * 调用大模型获取决策结果 并同时记录对应信息到聊天记录表中
  1399. *
  1400. * @param tXinyiWarningRecord
  1401. * @param tXinyiIndustry
  1402. * @param normConfig
  1403. * @param isSpecial 机器人化验库,需要把总磷和总氮的值特殊处理一下
  1404. * @param nowDate
  1405. */
  1406. private void handleDecision(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, boolean isSpecial, Date nowDate) {
  1407. log.info("进入了调⽤大模型决策接口");
  1408. ChatReq chatReq = new ChatReq();
  1409. // StringBuilder sb = new StringBuilder();
  1410. //大模型结果 放入一个结合中
  1411. List<String> resultData = new ArrayList<>();
  1412. //决策和问答不一样 没有历史的概念 所以sessionId都是新的 次数都是1
  1413. String sessionId = IdUtils.simpleUUID();
  1414. // String feedback = chatReq.getFeedback();
  1415. //决策请求的业务参数
  1416. // List<HashMap<String, Object>> list = this.xinyiIndustryMapper.selectLast10RecordsForDecision();
  1417. //2024年5月21日15:23:07 这里不能用关联查询处理,日报要获取最新的一条而不是今日的数据。
  1418. List<DecisionReq> decisionReqs = this.xinyiIndustryMapper.selectLast10RecordsForDecisionOnlyIndustry();
  1419. if(!CollectionUtils.isEmpty(decisionReqs)){
  1420. //处理日报数据
  1421. TXinyiDaily daily = this.xinyiDailyMapper.selectNewestData();
  1422. for (DecisionReq decisionReq : decisionReqs) {
  1423. if(!Objects.isNull(daily)){
  1424. WaterFormat.getWaterDecimationData(decisionReq, daily);
  1425. // decisionReq.setT(daily.getJsSw());
  1426. // decisionReq.setSVI(daily.getWntjzsAll());
  1427. // decisionReq.setSV(daily.getWncjbAll());
  1428. // decisionReq.setMlvss(daily.getHfxwnndAll());
  1429. // //2024年7月2日17:20:12 mlss和DO_O也要从日报获取
  1430. // decisionReq.setMlss(daily.getHycWnndAll());
  1431. // decisionReq.setDoO(daily.getHycRjyAll());
  1432. // decisionReq.setDoAna(daily.getYycRjyAll());
  1433. // decisionReq.setDoQue(daily.getQycRjyAll());
  1434. // //2024年5月26日11:59:02 干污泥量数据做了同步
  1435. // decisionReq.setGwnl(daily.getGWNL());
  1436. // BigDecimal jsBod5 = daily.getJsBod5();
  1437. // decisionReq.setBodIn(jsBod5);
  1438. // BigDecimal tpIn = decisionReq.getTpIn();
  1439. // BigDecimal tnIn = decisionReq.getTnIn();
  1440. // if(!Objects.isNull(jsBod5)){
  1441. // if(!Objects.isNull(tpIn) && tpIn.compareTo(new BigDecimal("0")) >0){
  1442. // decisionReq.setC(jsBod5.divide(tpIn, 4, RoundingMode.HALF_UP));
  1443. // }
  1444. // if(!Objects.isNull(tnIn) && tnIn.compareTo(new BigDecimal("0")) >0){
  1445. // decisionReq.setB(jsBod5.divide(tnIn, 4, RoundingMode.HALF_UP));
  1446. // }
  1447. // }
  1448. // //2024年6月1日08:37:09 内回流加上
  1449. // decisionReq.setR(daily.getNhlR());
  1450. // decisionReq.setRR(daily.getWhlR());
  1451. }
  1452. //如果是机器人化验室的报警,需要把总磷和总氮,获取化验室对应的数据且计算
  1453. //2024年08月20日15:16:16 化验室的报警和工业库传参一样 新增了4个参数额外标记化验室数据
  1454. /*if(isSpecial){
  1455. List<TXinyiRobot> xinyiRobots = this.xinyiRobotMapper.selectTXinyiRobotList(TXinyiRobot.builder().testHour(tXinyiIndustry.getTestHour()).build());
  1456. if(CollectionUtils.isEmpty(xinyiRobots)){
  1457. log.error("{}获取化验室数据失败", tXinyiIndustry.getTestHour());
  1458. }else{
  1459. TXinyiRobot tXinyiRobot = xinyiRobots.get(0);
  1460. //总氮
  1461. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  1462. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  1463. if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
  1464. decisionReq.setTnOff((no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), INT_0, RoundingMode.HALF_UP));
  1465. }
  1466. //总磷
  1467. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  1468. if(!Objects.isNull(tpRccJqr)){
  1469. decisionReq.setTpOff(tpRccJqr.divide(ROBOT_HY_DIVIDE, INT_0, RoundingMode.HALF_UP));
  1470. }
  1471. }
  1472. }*/
  1473. }
  1474. }
  1475. // String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls);
  1476. // 获取输出流
  1477. ManagedChannel channel = null;
  1478. String dataJson = "";
  1479. try {
  1480. channel = ManagedChannelBuilder.forAddress(bigModelConfig.getIp(), bigModelConfig.getPort())
  1481. .usePlaintext()
  1482. .build();
  1483. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  1484. // 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 + "}}";
  1485. //2024年6月24日17:59:17 优化,不再拼接JSON字符串
  1486. PolicyReq policyReq = new PolicyReq();
  1487. //2024年7月11日17:57:53 因为化验室的改了 但是 调用决策还得用原来的几个值
  1488. String category = tXinyiWarningRecord.getCategory();
  1489. /*if(ROBOT_XSY_1.getCode().equalsIgnoreCase(category) || ROBOT_XSY_2.getCode().equalsIgnoreCase(category)){
  1490. category = CS_ZD.getCode();
  1491. } else if (ROBOT_ANDAN_1.getCode().equalsIgnoreCase(category) || ROBOT_ANDAN_2.getCode().equalsIgnoreCase(category)) {
  1492. category = CS_AD.getCode();
  1493. }else if (ROBOT_ECCZLSY.getCode().equalsIgnoreCase(category)) {
  1494. category = CS_ZL.getCode();
  1495. }*/
  1496. //2024年08月25日15:40:31 处理数据映射,改成字母,但是显示的还是中文
  1497. category = this.parseCategory(category);
  1498. policyReq.setNorm(category);
  1499. HashMap<String, Object> hashMap = new HashMap<>();
  1500. policyReq.setFeedback(hashMap);//不能传null
  1501. policyReq.setSimulate(hashMap);//不能传null
  1502. policyReq.setSessionId(sessionId);
  1503. //2024年7月5日13:24:10 temperature做区分
  1504. GenerateArgs generateArgs = new GenerateArgs();
  1505. generateArgs.setTemperature(bigModelConfig.getTemperature());
  1506. policyReq.setGenerateArgs(generateArgs);
  1507. HashMap<String, Object> map = new HashMap<>();
  1508. map.put("rows", decisionReqs);
  1509. //2024年6月25日14:16:05 增加报警是管控值报警还是标准值报警
  1510. if(WARNING_LEVEL_ONE.equals(tXinyiWarningRecord.getLevel()) || WARNING_LEVEL_TWO.equals(tXinyiWarningRecord.getLevel()))
  1511. map.put("source", "bzz");
  1512. else
  1513. map.put("source", "gkz");
  1514. policyReq.setExtra(map);
  1515. dataJson = JSON.toJSONString(policyReq, JSONWriter.Feature.WriteNulls);
  1516. // log.info("~~~~~~请求大模型的决策的参数为{}", dataJson);
  1517. PredictionsRequest request = PredictionsRequest.newBuilder()
  1518. .setModelName("slibra_bot")
  1519. .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理
  1520. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  1521. .buildPartial();
  1522. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  1523. while (predictions.hasNext()) {
  1524. String responseStr = predictions.next().getPrediction().toStringUtf8();
  1525. // log.info("决策流式返回的结果是{}", responseStr);
  1526. //2024年5月25日16:37:16 按照大模型返回的类型解析数据
  1527. String biz = JSON.parseObject(responseStr).getString("biz");
  1528. if(BusinessEnum.BigModelBizEnum.OK.getCode().equals(biz)){
  1529. log.info("结尾语句并且是非JSON,无需处理");
  1530. //结束语句也流式输出,但是并不记录下来 2024年5月24日11:15:23 也不返回前端
  1531. /*outputStream.write(responseStr.getBytes());
  1532. outputStream.flush();*/
  1533. }else if(BusinessEnum.BigModelBizEnum.DECISION_DEBUGGER.getCode().equals(biz)){
  1534. log.info("中间过程,目前只打印日志,不记录数据,也不返回给前端,返回数据为{}", responseStr);
  1535. //结束语句也流式输出,但是并不记录下来 2024年5月24日11:15:23 也不返回前端
  1536. /*outputStream.write(responseStr.getBytes());
  1537. outputStream.flush();*/
  1538. }else{//其他 要么错误 要么alert 要么出的报告
  1539. // sb.append(responseStr);
  1540. resultData.add(responseStr);
  1541. }
  1542. }
  1543. } catch (Exception e) {
  1544. // throw new RuntimeException(e);
  1545. log.error("定时任务处理告警调用决策异常,异常信息为{}", JSON.toJSONString(e));
  1546. resultData.add("{\"biz\":\"ERROR\",\"message\":\"大模型分析数据异常,请稍后再试\"}");
  1547. } finally {
  1548. // log.info("决策最终要保存的数据是{}", JSON.toJSONString(resultData));
  1549. //保存聊天记录
  1550. //将问答更新到数据库中
  1551. chatReq.setSessionId(sessionId);
  1552. chatReq.setType(1);//0问答 1决策
  1553. chatReq.setModule(3);
  1554. /*String userId = SecurityUtils.getUserId().toString();
  1555. String username = SecurityUtils.getUsername();*/
  1556. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  1557. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, nowDate);
  1558. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  1559. chatReq.setQuestion(dataJson);
  1560. chatReq.setAnswer(JSON.toJSONString(resultData));
  1561. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  1562. chatReq.setCounts(1);//问答次数
  1563. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  1564. chatReq.setCreateTime(DateUtils.getNowDate());
  1565. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  1566. // 关闭输出流
  1567. if(!Objects.isNull(channel))
  1568. channel.shutdown();
  1569. }
  1570. }
  1571. private String parseCategory(String category) {
  1572. switch (category) {
  1573. case "进水COD" : return "js_cod";
  1574. case "进水总磷" : return "js_tp";
  1575. case "进水总氮" : return "js_tn";
  1576. case "进水氨氮" : return "js_andan";
  1577. case "进水SS" : return "js_ss";
  1578. case "出水COD" : return "cs_cod";
  1579. case "出水总磷" : return "cs_tp";
  1580. case "出水总氮" : return "cs_tn";
  1581. case "出水氨氮" : return "cs_andan";
  1582. case "出水SS" : return "cs_ss";
  1583. case "#1好氧硝酸盐" : return "cs_tn_lxjc1";
  1584. case "#2好氧硝酸盐" : return "cs_tn_lxjc2";
  1585. case "出水氨氮连续检测" : return "cs_andan_lxjc1";
  1586. case "二沉池正磷酸盐" : return "cs_tp_lxjc";
  1587. default: throw new ServiceException("暂时不支持的类型");
  1588. }
  1589. }
  1590. /**
  1591. * 2024年7月11日10:32:49 生化报警的展示额外处理(因为涉及到很多的单位)
  1592. *
  1593. * @param tXinyiWarningRecord
  1594. * @param tXinyiIndustry
  1595. * @param normConfig
  1596. * @param nowDate
  1597. * @param unit
  1598. * @return
  1599. */
  1600. private String buildShowValueSH(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Date nowDate, String unit) {
  1601. JSONObject result = new JSONObject();
  1602. // JSONObject basic = new JSONObject();
  1603. Integer status = tXinyiWarningRecord.getStatus();
  1604. Date warningTime = tXinyiWarningRecord.getTime();
  1605. String remark = tXinyiWarningRecord.getRemark();
  1606. int count = DateUtils.differentHoursByMillisecond(warningTime, DateUtils.getNowDate()) + 1;
  1607. ShowValueSHBasic showValueSHBasic = new ShowValueSHBasic();
  1608. /*if("0".equals(remark)){//水质报警
  1609. showValueSHBasic.setH(ZAIXIANYIBIAO);
  1610. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  1611. }else if("1".equals(remark)){//生化报警
  1612. showValueSHBasic.setH(ZAIXIANYIBIAO);
  1613. }else if("2".equals(remark)){//预测报警
  1614. showValueSHBasic.setH(YVCE);
  1615. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1616. }else {//机器人化验室报警(特殊的 水质报警)
  1617. showValueSHBasic.setH(LIANXUJIANCE);
  1618. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  1619. }*/
  1620. //生化报警固定了
  1621. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  1622. showValueSHBasic.setH("计算");
  1623. //通用的
  1624. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  1625. showValueSHBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1626. showValueSHBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2) + unit);
  1627. showValueSHBasic.setD(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2) + unit);
  1628. showValueSHBasic.setG(count > MAX_COUNT ? MAX_COUNT_STR : String.valueOf(count));
  1629. if(tXinyiWarningRecord.getType() != 2)
  1630. showValueSHBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1631. else
  1632. showValueSHBasic.setI(status == 0 ? "预警中" : "已完成");
  1633. result.put("basic", showValueSHBasic);
  1634. JSONObject jsData = jsCsFormatData.getJsonObject(tXinyiIndustry, normConfig);//进水数据
  1635. result.put("jsData", jsData);
  1636. JSONObject csData = jsCsFormatData.getCsonObject(tXinyiIndustry, normConfig);//出水数据
  1637. result.put("csData", csData);
  1638. // return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
  1639. return JSON.toJSONString(result);
  1640. }
  1641. private String buildShowValue(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Date nowDate) {
  1642. JSONObject result = new JSONObject();
  1643. // JSONObject basic = new JSONObject();
  1644. Integer status = tXinyiWarningRecord.getStatus();
  1645. Date warningTime = tXinyiWarningRecord.getTime();
  1646. String remark = tXinyiWarningRecord.getRemark();
  1647. int count = DateUtils.differentHoursByMillisecond(warningTime, DateUtils.getNowDate()) + 1;
  1648. String category = tXinyiWarningRecord.getCategory();
  1649. /*basic.put("title", tXinyiWarningRecord.getReason());
  1650. basic.put("报警时间", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1651. basic.put("报警值", tXinyiWarningRecord.getWarningVal());
  1652. basic.put("标准值", tXinyiWarningRecord.getDesignVal());
  1653. basic.put("管控值", tXinyiWarningRecord.getControlVal());
  1654. basic.put("报警次数", count > MAX_COUNT ? MAX_COUNT_STR : count);
  1655. if(tXinyiWarningRecord.getType() != 2)
  1656. basic.put("状态", status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1657. else
  1658. basic.put("状态", status == 0 ? "预警中" : "已完成");
  1659. //2024年5月27日14:04:22 额外返回2个字段 [管控值 和 告警级别] 返回的json没有数据是因为value没有值
  1660. // basic.put("管控值", tXinyiWarningRecord.getControlVal());
  1661. basic.put("告警级别", tXinyiWarningRecord.getLevel());*/
  1662. //2024年6月25日16:00:18 进出水展示的不一样
  1663. //2024年7月15日10:57:31 因为新增了化验室的3个指标,也是出水数据
  1664. if(category.contains(CHUSHUI)
  1665. || ROBOT_ECCZLSY.getCode().equalsIgnoreCase(category)
  1666. || ROBOT_XSY_1.getCode().equalsIgnoreCase(category)
  1667. || ROBOT_XSY_2.getCode().equalsIgnoreCase(category)
  1668. || ROBOT_ANDAN_1.getCode().equalsIgnoreCase(category)
  1669. || ROBOT_ANDAN_2.getCode().equalsIgnoreCase(category)){//出水的展示
  1670. ShowValueCSBasic showValueCSBasic = new ShowValueCSBasic();
  1671. if(ZERO_SZ_WARNING.getCode().equals(remark)){//水质报警
  1672. showValueCSBasic.setH(ZAIXIANYIBIAO);
  1673. showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1674. }else if(ONE_SH_WARNING.getCode().equals(remark)){//生化报警
  1675. showValueCSBasic.setH(ZAIXIANYIBIAO);
  1676. }else if(BusinessEnum.BigModelWarningTypeRemarkEnum.TWO_YC_WARNING.getCode().equals(remark)){//预测报警
  1677. showValueCSBasic.setH(YVCE);
  1678. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1679. }else {//机器人化验室报警(特殊的水质报警)
  1680. showValueCSBasic.setH(LIANXUJIANCE);
  1681. showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1682. }
  1683. //通用的
  1684. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  1685. // showValueCSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1686. showValueCSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,nowDate));
  1687. showValueCSBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2));
  1688. showValueCSBasic.setD(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getControlVal(), INT_2));
  1689. showValueCSBasic.setE(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2));
  1690. showValueCSBasic.setG(count > MAX_COUNT ? MAX_COUNT_STR : String.valueOf(count));
  1691. if(tXinyiWarningRecord.getType() != 2)
  1692. showValueCSBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1693. else
  1694. showValueCSBasic.setI(status == 0 ? "预警中" : "已完成");
  1695. result.put("basic", showValueCSBasic);
  1696. }else{//进水的展示
  1697. ShowValueJSBasic showValueJSBasic = new ShowValueJSBasic();
  1698. if(ZERO_SZ_WARNING.getCode().equals(remark)){//水质报警
  1699. showValueJSBasic.setH(ZAIXIANYIBIAO);
  1700. showValueJSBasic.setF(tXinyiWarningRecord.getLevel());
  1701. }else if(ONE_SH_WARNING.getCode().equals(remark)){//生化报警
  1702. showValueJSBasic.setH(ZAIXIANYIBIAO);
  1703. }else if(BusinessEnum.BigModelWarningTypeRemarkEnum.TWO_YC_WARNING.getCode().equals(remark)){//预测报警
  1704. showValueJSBasic.setH(YVCE);
  1705. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  1706. }else {//机器人化验室报警(特殊的 水质报警)
  1707. showValueJSBasic.setH(LIANXUJIANCE);
  1708. showValueJSBasic.setF(tXinyiWarningRecord.getLevel());
  1709. }
  1710. //通用的
  1711. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  1712. showValueJSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  1713. showValueJSBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2));
  1714. showValueJSBasic.setE(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2));
  1715. showValueJSBasic.setG(count > MAX_COUNT ? MAX_COUNT_STR : String.valueOf(count));
  1716. if(tXinyiWarningRecord.getType() != 2)
  1717. showValueJSBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  1718. else
  1719. showValueJSBasic.setI(status == 0 ? "预警中" : "已完成");
  1720. result.put("basic", showValueJSBasic);
  1721. }
  1722. JSONObject jsData = jsCsFormatData.getJsonObject(tXinyiIndustry, normConfig);//进水数据
  1723. result.put("jsData", jsData);
  1724. JSONObject csData = jsCsFormatData.getCsonObject(tXinyiIndustry, normConfig);//出水数据
  1725. result.put("csData", csData);
  1726. // return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
  1727. return JSON.toJSONString(result);
  1728. }
  1729. private static JSONObject getJsonObject(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1730. JSONObject jsData = new JSONObject();
  1731. HashMap<Object, Object> temp1 = new HashMap<>();
  1732. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  1733. temp1.put("value", DecimalUtils.getAbsAndScale(jsSlq, INT_2));
  1734. temp1.put("exceed", jsSlq.compareTo(normConfig.getJsslSjz()) >0);
  1735. jsData.put("流量", temp1);
  1736. HashMap<Object, Object> temp2 = new HashMap<>();
  1737. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  1738. temp2.put("value", DecimalUtils.getAbsAndScale(jsCod, INT_2));
  1739. temp2.put("exceed", jsCod.compareTo(normConfig.getJscodSjz()) > 0);
  1740. jsData.put("COD", temp2);
  1741. HashMap<Object, Object> temp3 = new HashMap<>();
  1742. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  1743. temp3.put("value", DecimalUtils.getAbsAndScale(jsNh3, INT_2));
  1744. temp3.put("exceed", jsNh3.compareTo(normConfig.getJsadSjz()) > 0);
  1745. jsData.put("NH3-N", temp3);
  1746. HashMap<Object, Object> temp4 = new HashMap<>();
  1747. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  1748. temp4.put("value", DecimalUtils.getAbsAndScale(jsTp, INT_2));
  1749. temp4.put("exceed", jsTp.compareTo(normConfig.getJszlSjz()) > 0);
  1750. jsData.put("TP", temp4);
  1751. HashMap<Object, Object> temp5 = new HashMap<>();
  1752. BigDecimal jsSs = tXinyiIndustry.getJsSs();
  1753. temp5.put("value", DecimalUtils.getAbsAndScale(jsSs, INT_2));
  1754. temp5.put("exceed", jsSs.compareTo(normConfig.getJsssSjz()) > 0);
  1755. jsData.put("SS", temp5);
  1756. HashMap<Object, Object> temp6 = new HashMap<>();
  1757. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  1758. temp6.put("value", DecimalUtils.getAbsAndScale(jsTn, INT_2));
  1759. temp6.put("exceed", jsTn.compareTo(normConfig.getJszdSjz()) > 0);
  1760. jsData.put("TN", temp6);
  1761. return jsData;
  1762. }
  1763. private static JSONObject getCsonObject(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1764. JSONObject csData = new JSONObject();
  1765. HashMap<Object, Object> temp1 = new HashMap<>();
  1766. BigDecimal csSlq = tXinyiIndustry.getCsSlqc();
  1767. temp1.put("value", DecimalUtils.getAbsAndScale(csSlq, INT_2));
  1768. temp1.put("exceed", false);//出水水量没有管控值
  1769. csData.put("流量", temp1);
  1770. HashMap<Object, Object> temp2 = new HashMap<>();
  1771. BigDecimal csCod = tXinyiIndustry.getCsCod();
  1772. temp2.put("value", DecimalUtils.getAbsAndScale(csCod, INT_2));
  1773. temp2.put("exceed", csCod.compareTo(normConfig.getCscodGkz()) > 0);
  1774. csData.put("COD", temp2);
  1775. HashMap<Object, Object> temp3 = new HashMap<>();
  1776. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  1777. temp3.put("value", DecimalUtils.getAbsAndScale(csNh3, INT_2));
  1778. temp3.put("exceed", csNh3.compareTo(normConfig.getCsadGkz()) > 0);
  1779. csData.put("NH3-N", temp3);
  1780. HashMap<Object, Object> temp4 = new HashMap<>();
  1781. BigDecimal csTp = tXinyiIndustry.getCsTp();
  1782. temp4.put("value", DecimalUtils.getAbsAndScale(csTp, INT_2));
  1783. temp4.put("exceed", csTp.compareTo(normConfig.getCszlGkz()) > 0);
  1784. csData.put("TP", temp4);
  1785. HashMap<Object, Object> temp5 = new HashMap<>();
  1786. BigDecimal csSs = tXinyiIndustry.getCsSs();
  1787. temp5.put("value", DecimalUtils.getAbsAndScale(csSs, INT_2));
  1788. temp5.put("exceed", csSs.compareTo(normConfig.getCsssGkz()) > 0);
  1789. csData.put("SS", temp5);
  1790. HashMap<Object, Object> temp6 = new HashMap<>();
  1791. BigDecimal csTn = tXinyiIndustry.getCsTn();
  1792. temp6.put("value", DecimalUtils.getAbsAndScale(csTn, INT_2));
  1793. temp6.put("exceed", csTn.compareTo(normConfig.getCszzGkz()) > 0);
  1794. csData.put("TN", temp6);
  1795. return csData;
  1796. }
  1797. /**
  1798. * 通过输入的值 生成对应类型的报警对象(出水)
  1799. *
  1800. * @param csBzz
  1801. * @param currentVal
  1802. * @param csGkz
  1803. * @param category
  1804. * @param tXinyiIndustry
  1805. * @param normConfig
  1806. * @return
  1807. */
  1808. private void handleXinYiWarningsCs(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1809. BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  1810. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1811. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  1812. tXinyiWarningRecord.setStatus(0);
  1813. tXinyiWarningRecord.setType(0);
  1814. tXinyiWarningRecord.setCategory(category);
  1815. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1816. tXinyiWarningRecord.setWarningVal(currentVal);
  1817. tXinyiWarningRecord.setDesignVal(csBzz);
  1818. tXinyiWarningRecord.setControlVal(csGkz);
  1819. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1820. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1821. tXinyiWarningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  1822. //2025年02月10日14:45:08 下面是新增加的字段
  1823. tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  1824. //超污染物限制:计算公式为:当前氨氮/氨氮设计值 或者 当前氨氮/氨氮管控值(智能工单使用) 这里是出水的 【需要根据超标还是超管控,具体计算】
  1825. //超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
  1826. tXinyiWarningRecord.setCwrwfhz(this.getCwrwfhz(tXinyiIndustry, normConfig));
  1827. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  1828. BigDecimal csadBzz = normConfig.getCsadBzz();
  1829. BigDecimal csadGkz = normConfig.getCsadGkz();
  1830. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1831. if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
  1832. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1833. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1834. }else if(currentVal.compareTo(multiply) > 0){//一级
  1835. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1836. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1837. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  1838. tXinyiWarningRecord.setCwrwxz(csNh3.divide(csadBzz, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1839. }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  1840. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1841. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1842. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  1843. tXinyiWarningRecord.setCwrwxz(csNh3.divide(csadBzz, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1844. }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  1845. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1846. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1847. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CGKZ.getCode());
  1848. tXinyiWarningRecord.setCwrwxz(csNh3.divide(csadGkz, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1849. }else{
  1850. tXinyiWarningRecord = null;//这种的无需处理
  1851. }
  1852. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1853. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).warningStatus(0).build());
  1854. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1855. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1856. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1857. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1858. xinyiWarningRecord.setStatus(2);
  1859. Date nowDate = DateUtils.getNowDate();
  1860. xinyiWarningRecord.setOffTime(nowDate);
  1861. xinyiWarningRecord.setUpdateTime(nowDate);
  1862. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1863. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1864. }
  1865. }
  1866. }else{//有告警信息
  1867. Date nowDate = DateUtils.getNowDate();
  1868. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1869. //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
  1870. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_3);
  1871. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  1872. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  1873. return;
  1874. }
  1875. TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  1876. TXinyiIndustry tXinyiIndustry2 = tXinyiIndustries.get(INDEX_2);//前两个小时
  1877. if(!this.judgeContinuousIndustry(tXinyiIndustry1, tXinyiIndustry2, category)){
  1878. log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiIndustry1), JSON.toJSONString(tXinyiIndustry2));
  1879. return;
  1880. }
  1881. //保存到数据库中
  1882. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  1883. tXinyiWarningRecord.setUpdateTime(nowDate);
  1884. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1885. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1886. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1887. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1888. }else {
  1889. //继续调用决策
  1890. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  1891. }
  1892. }else{
  1893. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  1894. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  1895. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1896. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1897. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1898. }else {
  1899. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  1900. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  1901. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  1902. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  1903. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  1904. xinyiWarningRecord.setUpdateTime(nowDate);
  1905. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1906. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  1907. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  1908. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  1909. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  1910. //更新数据库
  1911. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1912. //继续调用决策
  1913. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  1914. }
  1915. }
  1916. }
  1917. }
  1918. }
  1919. /**
  1920. *
  1921. * 超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
  1922. * 因为配置的值都不为0 所以不做校验了
  1923. * @param tXinyiIndustry
  1924. * @param normConfig
  1925. * @return
  1926. */
  1927. private BigDecimal getCwrwfhz(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1928. return (tXinyiIndustry.getJsSlq().multiply(tXinyiIndustry.getJsNh3())).divide((normConfig.getJsslSjz().multiply(normConfig.getJsadSjz())), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  1929. }
  1930. /**
  1931. * 通过输入的值 生成对应类型的报警对象(进水)
  1932. *
  1933. * @param jsBzz
  1934. * @param currentVal
  1935. * @param category
  1936. * @param tXinyiIndustry
  1937. * @param normConfig
  1938. * @return
  1939. */
  1940. private void handleXinYiWarningRecordJS(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1941. BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  1942. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1943. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  1944. tXinyiWarningRecord.setStatus(0);
  1945. tXinyiWarningRecord.setType(0);
  1946. tXinyiWarningRecord.setCategory(category);
  1947. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1948. tXinyiWarningRecord.setWarningVal(currentVal);
  1949. tXinyiWarningRecord.setDesignVal(jsBzz);
  1950. // tXinyiWarningRecord.setControlVal(csGkz);
  1951. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1952. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1953. tXinyiWarningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  1954. //2025年02月10日14:45:08 下面是新增加的字段
  1955. tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
  1956. //超污染物限制:计算公式为:当前氨氮/氨氮设计值 或者 当前氨氮/氨氮管控值(智能工单使用) 这里是出水的 【需要根据超标还是超管控,具体计算】
  1957. //超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
  1958. tXinyiWarningRecord.setCwrwfhz(this.getCwrwfhz(tXinyiIndustry, normConfig));
  1959. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  1960. BigDecimal jsadSjz = normConfig.getJsadSjz();
  1961. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1962. if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
  1963. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1964. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1965. }else if(currentVal.compareTo(multiply) > 0){//一级
  1966. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1967. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1968. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  1969. tXinyiWarningRecord.setCwrwxz(jsNh3.divide(jsadSjz, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1970. }else if(currentVal.compareTo(jsBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  1971. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1972. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1973. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  1974. tXinyiWarningRecord.setCwrwxz(jsNh3.divide(jsadSjz, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1975. }else{
  1976. tXinyiWarningRecord = null;//这种的无需处理
  1977. }
  1978. /*else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  1979. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1980. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1981. }*/
  1982. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1983. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
  1984. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1985. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1986. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1987. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1988. xinyiWarningRecord.setStatus(2);
  1989. Date nowDate = DateUtils.getNowDate();
  1990. xinyiWarningRecord.setOffTime(nowDate);
  1991. xinyiWarningRecord.setUpdateTime(nowDate);
  1992. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1993. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1994. }
  1995. }
  1996. }else{//有告警信息
  1997. Date nowDate = DateUtils.getNowDate();
  1998. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1999. //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
  2000. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_3);
  2001. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  2002. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  2003. return;
  2004. }
  2005. TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  2006. TXinyiIndustry tXinyiIndustry2 = tXinyiIndustries.get(INDEX_2);//前两个小时
  2007. if(!this.judgeContinuousIndustry(tXinyiIndustry1, tXinyiIndustry2, category)){
  2008. log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiIndustry1), JSON.toJSONString(tXinyiIndustry2));
  2009. return;
  2010. }
  2011. //保存到数据库中
  2012. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  2013. tXinyiWarningRecord.setUpdateTime(nowDate);
  2014. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  2015. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  2016. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  2017. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  2018. }else {
  2019. //继续调用决策
  2020. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  2021. }
  2022. }else{
  2023. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  2024. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  2025. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  2026. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  2027. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  2028. }else {
  2029. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  2030. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  2031. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  2032. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  2033. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  2034. xinyiWarningRecord.setUpdateTime(nowDate);
  2035. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  2036. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  2037. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  2038. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  2039. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  2040. //更新数据库
  2041. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  2042. //继续调用决策
  2043. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  2044. }
  2045. }
  2046. }
  2047. }
  2048. }
  2049. private boolean judgeContinuousIndustry(TXinyiIndustry tXinyiIndustry1, TXinyiIndustry tXinyiIndustry2, String category) {
  2050. boolean result = false;//默认不超标
  2051. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  2052. BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  2053. BigDecimal csCod2 = tXinyiIndustry2.getCsCod();
  2054. if(!Objects.isNull(csCod1) && !Objects.isNull(csCod2) && csCod1.compareTo(csCod2) > INT_0)
  2055. result = true;
  2056. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  2057. BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  2058. BigDecimal csSs2 = tXinyiIndustry2.getCsSs();
  2059. if(!Objects.isNull(csSs1) && !Objects.isNull(csSs2) && csSs1.compareTo(csSs2) > INT_0)
  2060. result = true;
  2061. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  2062. BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  2063. BigDecimal csTn2 = tXinyiIndustry2.getCsTn();
  2064. if(!Objects.isNull(csTn1) && !Objects.isNull(csTn2) && csTn1.compareTo(csTn2) > INT_0)
  2065. result = true;
  2066. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  2067. BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  2068. BigDecimal csTp2 = tXinyiIndustry2.getCsTp();
  2069. if(!Objects.isNull(csTp1) && !Objects.isNull(csTp2) && csTp1.compareTo(csTp2) > INT_0)
  2070. result = true;
  2071. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  2072. BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  2073. BigDecimal csNh32 = tXinyiIndustry2.getCsNh3();
  2074. if(!Objects.isNull(csNh31) && !Objects.isNull(csNh32) && csNh31.compareTo(csNh32) > INT_0)
  2075. result = true;
  2076. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  2077. BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  2078. BigDecimal jsCod2 = tXinyiIndustry2.getJsCod();
  2079. if(!Objects.isNull(jsCod1) && !Objects.isNull(jsCod2) && jsCod1.compareTo(jsCod2) > INT_0)
  2080. result = true;
  2081. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  2082. BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  2083. BigDecimal jsSs2 = tXinyiIndustry2.getJsSs();
  2084. if(!Objects.isNull(jsSs1) && !Objects.isNull(jsSs2) && jsSs1.compareTo(jsSs2) > INT_0)
  2085. result = true;
  2086. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  2087. BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  2088. BigDecimal jsTn2 = tXinyiIndustry2.getJsTn();
  2089. if(!Objects.isNull(jsTn1) && !Objects.isNull(jsTn2) && jsTn1.compareTo(jsTn2) > INT_0)
  2090. result = true;
  2091. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  2092. BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  2093. BigDecimal jsTp2 = tXinyiIndustry2.getJsTp();
  2094. if(!Objects.isNull(jsTp1) && !Objects.isNull(jsTp2) && jsTp1.compareTo(jsTp2) > INT_0)
  2095. result = true;
  2096. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  2097. BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  2098. BigDecimal jsNh32 = tXinyiIndustry2.getJsNh3();
  2099. if(!Objects.isNull(jsNh31) && !Objects.isNull(jsNh32) && jsNh31.compareTo(jsNh32) > INT_0)
  2100. result = true;
  2101. }else{
  2102. log.error("暂时还不支持的报警类型~~~~");
  2103. }
  2104. return result;
  2105. }
  2106. private void addChatRecordByDeviceErr(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  2107. ChatReq chatReq = new ChatReq();
  2108. //保存聊天记录
  2109. //将问答更新到数据库中
  2110. chatReq.setSessionId(IdUtils.simpleUUID());
  2111. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  2112. chatReq.setModule(3);
  2113. /*String userId = SecurityUtils.getUserId().toString();
  2114. String username = SecurityUtils.getUsername();*/
  2115. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  2116. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  2117. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  2118. chatReq.setQuestion(WARNING_DEFAULT_QUESTION);//本地问题
  2119. chatReq.setAnswer(tXinyiWarningRecord.getReason() + ",请检查设备是否正常运行");
  2120. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  2121. chatReq.setCounts(1);//问答次数
  2122. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  2123. chatReq.setCreateTime(DateUtils.getNowDate());
  2124. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  2125. }
  2126. public static void main(String[] args) {
  2127. System.out.println(CCCDCHRT_LAST);
  2128. System.out.println(GSLS_LAST);
  2129. System.out.println(BigDecimal.valueOf(1).subtract(null));
  2130. }
  2131. /**
  2132. * 处理机器人化验数据报警
  2133. * @param uniqueList
  2134. */
  2135. public void handleRobotWarning(List<TXinyiRobot> uniqueList) {
  2136. log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑");
  2137. //查询配置
  2138. List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  2139. if(CollectionUtils.isEmpty(tXinyiNormConfigs))
  2140. throw new RuntimeException("未查询到配置信息");
  2141. TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  2142. //查询最新的一条工业库的数据(showvalue展示使用)
  2143. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
  2144. TXinyiIndustry tXinyiIndustry = CollectionUtils.isEmpty(tXinyiIndustries) ? new TXinyiIndustry() : tXinyiIndustries.get(0);
  2145. //处理数据
  2146. for (TXinyiRobot tXinyiRobot : uniqueList) {
  2147. //2024年7月11日17:27:32 化验室报警项原有总氮和总氮改为 1#好氧硝酸盐、2#好氧硝酸盐、二沉池正磷酸盐
  2148. //处理总氮和总磷报警
  2149. //总氮
  2150. /*BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  2151. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  2152. if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
  2153. BigDecimal csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2154. BigDecimal cszzBzz = normConfig.getCszzBzz();
  2155. BigDecimal cszzGkz = normConfig.getCszzGkz();
  2156. if(!Objects.isNull(cszzBzz)){
  2157. handleXinYiWarningsRobot(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig);
  2158. }
  2159. }*/
  2160. //总氮的标准值和管控值
  2161. BigDecimal cszzBzz = normConfig.getCszzBzz();
  2162. BigDecimal cszzGkz = normConfig.getCszzGkz();
  2163. //氨氮的标准值和管控值
  2164. BigDecimal csadBzz = normConfig.getCsadBzz();
  2165. BigDecimal csadGkz = normConfig.getCsadGkz();
  2166. //#1好氧硝酸盐
  2167. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  2168. if(!Objects.isNull(no3Hlj1Jqr)){
  2169. if(!Objects.isNull(cszzBzz)){
  2170. handleXinYiWarningsRobot(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig);
  2171. }
  2172. }
  2173. //#2好氧硝酸盐
  2174. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  2175. if(!Objects.isNull(no3Hlj2Jqr)){
  2176. if(!Objects.isNull(cszzBzz)){
  2177. handleXinYiWarningsRobot(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig);
  2178. }
  2179. }
  2180. //总磷
  2181. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  2182. if(!Objects.isNull(tpRccJqr)){
  2183. BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2184. BigDecimal cszlBzz = normConfig.getCszlBzz();
  2185. BigDecimal cszlGkz = normConfig.getCszlGkz();
  2186. if(!Objects.isNull(cszlBzz)){
  2187. handleXinYiWarningsRobot(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig);
  2188. }
  2189. }
  2190. //2024年7月18日10:48:15 新增报警:出水氨氮 - 连续检测报警
  2191. //1池
  2192. /*BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  2193. BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  2194. //判断 增加容错
  2195. if(Objects.isNull(no3Qyc1Jqr))
  2196. no3Qyc1Jqr = BigDecimal.ZERO;
  2197. if(Objects.isNull(nh31Jqr))
  2198. nh31Jqr = BigDecimal.ZERO;
  2199. if(Objects.isNull(no3Hlj1Jqr))
  2200. no3Hlj1Jqr = BigDecimal.ZERO;
  2201. BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
  2202. if(!Objects.isNull(csadBzz)){
  2203. handleXinYiWarningsRobot(csadBzz, anDan1, csadGkz, ROBOT_ANDAN_1.getCode(), tXinyiIndustry, normConfig);
  2204. }
  2205. //2池
  2206. BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  2207. BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  2208. //判断 增加容错
  2209. if(Objects.isNull(no3Qyc2Jqr))
  2210. no3Qyc2Jqr = BigDecimal.ZERO;
  2211. if(Objects.isNull(nh32Jqr))
  2212. nh32Jqr = BigDecimal.ZERO;
  2213. if(Objects.isNull(no3Hlj2Jqr))
  2214. no3Hlj2Jqr = BigDecimal.ZERO;
  2215. BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
  2216. if(!Objects.isNull(csadBzz)){
  2217. handleXinYiWarningsRobot(csadBzz, anDan2, csadGkz, ROBOT_ANDAN_2.getCode(), tXinyiIndustry, normConfig);
  2218. }*/
  2219. BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  2220. BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  2221. //判断 增加容错
  2222. if(Objects.isNull(no3Qyc1Jqr))
  2223. no3Qyc1Jqr = BigDecimal.ZERO;
  2224. if(Objects.isNull(nh31Jqr))
  2225. nh31Jqr = BigDecimal.ZERO;
  2226. if(Objects.isNull(no3Hlj1Jqr))
  2227. no3Hlj1Jqr = BigDecimal.ZERO;
  2228. BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
  2229. //2池
  2230. BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  2231. BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  2232. //判断 增加容错
  2233. if(Objects.isNull(no3Qyc2Jqr))
  2234. no3Qyc2Jqr = BigDecimal.ZERO;
  2235. if(Objects.isNull(nh32Jqr))
  2236. nh32Jqr = BigDecimal.ZERO;
  2237. if(Objects.isNull(no3Hlj2Jqr))
  2238. no3Hlj2Jqr = BigDecimal.ZERO;
  2239. BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
  2240. if(!Objects.isNull(csadBzz)){
  2241. BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
  2242. handleXinYiWarningsRobot(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig);
  2243. }
  2244. }
  2245. }
  2246. /**
  2247. * 通过输入的值 生成对应类型的报警对象(出水)
  2248. *
  2249. * @param csBzz
  2250. * @param currentVal
  2251. * @param csGkz
  2252. * @param category
  2253. * @param tXinyiIndustry
  2254. * @param normConfig
  2255. * @return
  2256. */
  2257. private void handleXinYiWarningsRobot(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  2258. BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  2259. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  2260. tXinyiWarningRecord.setStatus(0);
  2261. tXinyiWarningRecord.setType(0);
  2262. tXinyiWarningRecord.setCategory(category);
  2263. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  2264. tXinyiWarningRecord.setWarningVal(currentVal);
  2265. tXinyiWarningRecord.setDesignVal(csBzz);
  2266. tXinyiWarningRecord.setControlVal(csGkz);
  2267. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  2268. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  2269. tXinyiWarningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
  2270. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  2271. if(Objects.isNull(currentVal)){
  2272. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  2273. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  2274. }else if(currentVal.compareTo(multiply) > 0){//一级
  2275. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  2276. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  2277. }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  2278. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  2279. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  2280. }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  2281. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  2282. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  2283. }else{
  2284. tXinyiWarningRecord = null;//这种的无需处理
  2285. }
  2286. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  2287. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).warningStatus(0).build());
  2288. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  2289. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  2290. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  2291. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  2292. xinyiWarningRecord.setStatus(2);
  2293. Date nowDate = DateUtils.getNowDate();
  2294. xinyiWarningRecord.setOffTime(nowDate);
  2295. xinyiWarningRecord.setUpdateTime(nowDate);
  2296. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  2297. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  2298. }
  2299. }
  2300. }else{//有告警信息
  2301. Date nowDate = DateUtils.getNowDate();
  2302. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  2303. //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
  2304. List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_3);
  2305. if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < 3){
  2306. log.error("处理连续检测报警时,获取最近的3条化验数据失败~~~~~~~");
  2307. return;
  2308. }
  2309. TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时
  2310. TXinyiRobot tXinyiRobot2 = tXinyiRobots.get(INDEX_2);//前两个小时
  2311. if(!this.judgeContinuousRobot(tXinyiRobot1, tXinyiRobot2, category)){
  2312. log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiRobot1), JSON.toJSONString(tXinyiRobot2));
  2313. return;
  2314. }
  2315. //保存到数据库中
  2316. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  2317. tXinyiWarningRecord.setUpdateTime(nowDate);
  2318. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  2319. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  2320. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  2321. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  2322. }else {
  2323. //继续调用决策
  2324. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
  2325. }
  2326. }else{
  2327. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  2328. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  2329. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  2330. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  2331. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  2332. }else {
  2333. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  2334. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  2335. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  2336. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  2337. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  2338. xinyiWarningRecord.setUpdateTime(nowDate);
  2339. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  2340. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  2341. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  2342. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  2343. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  2344. //更新数据库
  2345. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  2346. //继续调用决策
  2347. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
  2348. }
  2349. }
  2350. }
  2351. }
  2352. }
  2353. private boolean judgeContinuousRobot(TXinyiRobot tXinyiRobot1, TXinyiRobot tXinyiRobot2, String category) {
  2354. boolean result = false;//默认不超标
  2355. if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
  2356. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  2357. BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj1Jqr();
  2358. if(!Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2) && no3Hlj1Jqr1.compareTo(no3Hlj1Jqr2) > INT_0)
  2359. result = true;
  2360. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
  2361. BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  2362. BigDecimal no3Hlj2Jqr2 = tXinyiRobot2.getNo3Hlj2Jqr();
  2363. if(!Objects.isNull(no3Hlj2Jqr1) && !Objects.isNull(no3Hlj2Jqr2) && no3Hlj2Jqr1.compareTo(no3Hlj2Jqr2) > INT_0)
  2364. result = true;
  2365. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
  2366. BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
  2367. BigDecimal tpRccJqr2 = tXinyiRobot2.getTpRccJqr();
  2368. if(!Objects.isNull(tpRccJqr1) && !Objects.isNull(tpRccJqr2) && tpRccJqr1.compareTo(tpRccJqr2) > INT_0)
  2369. result = true;
  2370. }/*else if(BusinessEnum.WarningCategoryEnum.ROBOT_ANDAN_1.getCode().equals(category)){
  2371. //计算1
  2372. BigDecimal no3Qyc1Jqr1 = tXinyiRobot1.getNo3Qyc1Jqr();
  2373. BigDecimal nh31Jqr1 = tXinyiRobot1.getNh31Jqr();
  2374. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  2375. if(Objects.isNull(no3Qyc1Jqr1))
  2376. no3Qyc1Jqr1 = BigDecimal.ZERO;
  2377. if(Objects.isNull(nh31Jqr1))
  2378. nh31Jqr1 = BigDecimal.ZERO;
  2379. if(Objects.isNull(no3Hlj1Jqr1))
  2380. no3Hlj1Jqr1 = BigDecimal.ZERO;
  2381. BigDecimal anDan1 = no3Qyc1Jqr1.add(nh31Jqr1).subtract(no3Hlj1Jqr1);
  2382. //计算2
  2383. BigDecimal no3Qyc1Jqr2 = tXinyiRobot2.getNo3Qyc1Jqr();
  2384. BigDecimal nh31Jqr2 = tXinyiRobot2.getNh31Jqr();
  2385. BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj1Jqr();
  2386. if(Objects.isNull(no3Qyc1Jqr2))
  2387. no3Qyc1Jqr2 = BigDecimal.ZERO;
  2388. if(Objects.isNull(nh31Jqr2))
  2389. nh31Jqr2 = BigDecimal.ZERO;
  2390. if(Objects.isNull(no3Hlj1Jqr2))
  2391. no3Hlj1Jqr2 = BigDecimal.ZERO;
  2392. BigDecimal anDan2 = no3Qyc1Jqr2.add(nh31Jqr2).subtract(no3Hlj1Jqr2);
  2393. if(anDan1.compareTo(anDan2) > INT_0)
  2394. result = true;
  2395. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ANDAN_2.getCode().equals(category)){
  2396. //计算1
  2397. BigDecimal no3Qyc1Jqr1 = tXinyiRobot1.getNo3Qyc2Jqr();
  2398. BigDecimal nh31Jqr1 = tXinyiRobot1.getNh32Jqr();
  2399. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  2400. if(Objects.isNull(no3Qyc1Jqr1))
  2401. no3Qyc1Jqr1 = BigDecimal.ZERO;
  2402. if(Objects.isNull(nh31Jqr1))
  2403. nh31Jqr1 = BigDecimal.ZERO;
  2404. if(Objects.isNull(no3Hlj1Jqr1))
  2405. no3Hlj1Jqr1 = BigDecimal.ZERO;
  2406. BigDecimal anDan1 = no3Qyc1Jqr1.add(nh31Jqr1).subtract(no3Hlj1Jqr1);
  2407. //计算2
  2408. BigDecimal no3Qyc1Jqr2 = tXinyiRobot2.getNo3Qyc2Jqr();
  2409. BigDecimal nh31Jqr2 = tXinyiRobot2.getNh32Jqr();
  2410. BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj2Jqr();
  2411. if(Objects.isNull(no3Qyc1Jqr2))
  2412. no3Qyc1Jqr2 = BigDecimal.ZERO;
  2413. if(Objects.isNull(nh31Jqr2))
  2414. nh31Jqr2 = BigDecimal.ZERO;
  2415. if(Objects.isNull(no3Hlj1Jqr2))
  2416. no3Hlj1Jqr2 = BigDecimal.ZERO;
  2417. BigDecimal anDan2 = no3Qyc1Jqr2.add(nh31Jqr2).subtract(no3Hlj1Jqr2);
  2418. if(anDan1.compareTo(anDan2) > INT_0)
  2419. result = true;
  2420. }*/else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){//2024年7月26日14:33:39 合并一个指标:出水氨氮
  2421. //计算1(1池)
  2422. BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
  2423. BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
  2424. BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
  2425. if(Objects.isNull(no3Qyc1Jqr11))
  2426. no3Qyc1Jqr11 = BigDecimal.ZERO;
  2427. if(Objects.isNull(nh31Jqr11))
  2428. nh31Jqr11 = BigDecimal.ZERO;
  2429. if(Objects.isNull(no3Hlj1Jqr11))
  2430. no3Hlj1Jqr11 = BigDecimal.ZERO;
  2431. BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
  2432. //计算1(2池)
  2433. BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
  2434. BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
  2435. BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
  2436. if(Objects.isNull(no3Qyc1Jqr12))
  2437. no3Qyc1Jqr12 = BigDecimal.ZERO;
  2438. if(Objects.isNull(nh31Jqr12))
  2439. nh31Jqr12 = BigDecimal.ZERO;
  2440. if(Objects.isNull(no3Hlj1Jqr12))
  2441. no3Hlj1Jqr12 = BigDecimal.ZERO;
  2442. BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
  2443. BigDecimal divide1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2444. //计算2(1池)
  2445. BigDecimal no3Qyc1Jqr21 = tXinyiRobot2.getNo3Qyc1Jqr();
  2446. BigDecimal nh31Jqr21 = tXinyiRobot2.getNh31Jqr();
  2447. BigDecimal no3Hlj1Jqr21 = tXinyiRobot2.getNo3Hlj1Jqr();
  2448. if(Objects.isNull(no3Qyc1Jqr21))
  2449. no3Qyc1Jqr21 = BigDecimal.ZERO;
  2450. if(Objects.isNull(nh31Jqr21))
  2451. nh31Jqr21 = BigDecimal.ZERO;
  2452. if(Objects.isNull(no3Hlj1Jqr21))
  2453. no3Hlj1Jqr21 = BigDecimal.ZERO;
  2454. BigDecimal anDan21 = no3Qyc1Jqr21.add(nh31Jqr21).subtract(no3Hlj1Jqr21);
  2455. //计算2(2池)
  2456. BigDecimal no3Qyc1Jqr22 = tXinyiRobot2.getNo3Qyc2Jqr();
  2457. BigDecimal nh31Jqr22 = tXinyiRobot2.getNh32Jqr();
  2458. BigDecimal no3Hlj1Jqr22 = tXinyiRobot2.getNo3Hlj2Jqr();
  2459. if(Objects.isNull(no3Qyc1Jqr22))
  2460. no3Qyc1Jqr22 = BigDecimal.ZERO;
  2461. if(Objects.isNull(nh31Jqr22))
  2462. nh31Jqr22 = BigDecimal.ZERO;
  2463. if(Objects.isNull(no3Hlj1Jqr22))
  2464. no3Hlj1Jqr22 = BigDecimal.ZERO;
  2465. BigDecimal anDan22 = no3Qyc1Jqr22.add(nh31Jqr22).subtract(no3Hlj1Jqr22);
  2466. BigDecimal divide2 = anDan21.add(anDan22).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2467. if(divide1.compareTo(divide2) > INT_0)
  2468. result = true;
  2469. }else{
  2470. log.error("暂时还不支持的报警类型~~~~");
  2471. }
  2472. return result;
  2473. }
  2474. /**
  2475. *
  2476. * 大宽表的数据处理
  2477. * @param tXinyiRobot
  2478. */
  2479. public void updateBigTableHourByRobot(TXinyiRobot tXinyiRobot) {
  2480. List<TXinyiBigTableHour> tXinyiBigTableHours = this.xinyiBigTableHourMapper.selectTXinyiBigTableHourList(TXinyiBigTableHour.builder().testHour(tXinyiRobot.getTestHour()).build());
  2481. if(!CollectionUtils.isEmpty(tXinyiBigTableHours)){
  2482. for (TXinyiBigTableHour tXinyiBigTableHour : tXinyiBigTableHours) {
  2483. this.updateBigTableByRobot(tXinyiBigTableHour, tXinyiRobot);
  2484. }
  2485. }
  2486. }
  2487. private void updateBigTableByRobot(TXinyiBigTableHour tXinyiBigTableHour, TXinyiRobot tXinyiRobot) {
  2488. jsCsFormatData.addRobot2Hour(tXinyiBigTableHour, tXinyiRobot);
  2489. //更新数据库
  2490. this.xinyiBigTableHourMapper.updateTXinyiBigTableHour(tXinyiBigTableHour);
  2491. }
  2492. }