AsyncTask.java 335 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220
  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.text.ParseException;
  41. import java.util.*;
  42. import static com.slibra.common.constant.MyConstants.*;
  43. import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.*;
  44. import static com.slibra.common.enums.BusinessEnum.WarningCategoryEnum.*;
  45. @Component
  46. @Slf4j
  47. public class AsyncTask {
  48. @Autowired
  49. private TXinyiIndustryMapper xinyiIndustryMapper;
  50. @Autowired
  51. private TXinyiNormConfigMapper xinyiNormConfigMapper;
  52. @Autowired
  53. private TXinyiWarningRecordMapper xinyiWarningRecordMapper;
  54. @Autowired
  55. private TXinyiChatRecordMapper xinyiChatRecordMapper;
  56. @Autowired
  57. private TXinyiDailyMapper xinyiDailyMapper;
  58. @Autowired
  59. private TXinyiCalculateMapper xinyiCalculateMapper;
  60. @Autowired
  61. private TXinyiRobotMapper xinyiRobotMapper;
  62. @Autowired
  63. private TXinyiForecastComparisonMapper xinyiForecastComparisonMapper;
  64. @Autowired
  65. private TXinyiBigTableHourMapper xinyiBigTableHourMapper;
  66. @Autowired
  67. private BigModelConfig bigModelConfig;
  68. @Autowired
  69. private JsCsFormatData jsCsFormatData;
  70. /** 使用的是哪个环境 */
  71. @Value("${spring.profiles.active}")
  72. private String environment;
  73. @Autowired
  74. private ITXinyiDailyService xinyiDailyService;
  75. /**
  76. * 异步处理告警任务
  77. *
  78. * @param tXinyiIndustry
  79. * @param normConfig
  80. * @param xinyiCalculate
  81. */
  82. // @Async("customizeExecutor")
  83. public void handleWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, TXinyiCalculate xinyiCalculate){
  84. //2024年08月09日14:26:29 为了节省费用,测试环境关闭报警并增加手动触发报警操作
  85. if(PROD_ENVIRONMENT.equalsIgnoreCase(environment) || DENGBAO_ENVIRONMENT.equalsIgnoreCase(environment)
  86. || DEV_ENVIRONMENT.equalsIgnoreCase(environment) || LOCAL_ENVIRONMENT.equalsIgnoreCase(environment)){
  87. log.info("进入了定时任务处理工业库报警的具体逻辑处理");
  88. //新的逻辑:
  89. //只要当前获取的工业库数据和当前时间
  90. //如果当前时间和工业库传过来的相差不到一个小时,说明正常,工业库没挂掉:需要查询是否有挂掉的记录,有的话,关闭此报警,并触发整体的业务数据报警。
  91. //如果超过1小时了,说明工业库同步数据挂掉了,这时候去查询有无此类型的报警,如果有,不做任何处理,程序结束;如果没有,新增该类型报警并结束程序。
  92. Date nowDate = DateUtils.getNowDate();
  93. Date warningDate = null;
  94. try {
  95. warningDate = DateUtils.parseDate(tXinyiIndustry.getTestHour(), DateUtils.YYYYMMDDHH_TS);
  96. } catch (ParseException e) {
  97. // throw new RuntimeException(e.getMessage());
  98. log.error("将工业库的化验时间转换date类型异常,异常信息为{}", e.getMessage());
  99. return;
  100. }
  101. //查询工业库同步任务失败的报警正在进行的数据
  102. /*TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.INDUSTRY_SYNC_ERROR.getCode()).status(0).build();
  103. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecord);*/
  104. long hours = DateUtils.differentHoursByLocalDateTime(nowDate, warningDate);
  105. if(hours == 0L){
  106. //查看是否有正在进行的同步任务失败的报警
  107. /*if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  108. closeWarning(tXinyiWarningRecords.get(0));
  109. }*/
  110. //正常的业务数据报警
  111. //水质报警
  112. //2025年02月20日10:52:31 在具体的报警类型中增加新的判断 仪表故障 数据异常等
  113. this.handleSZWarning(tXinyiIndustry, normConfig);
  114. //2024年5月28日14:14:26 下面是新增的 生化报警处理
  115. this.handleSHWarning(tXinyiIndustry, normConfig, xinyiCalculate);
  116. }else{
  117. log.info("同步工业库任务获取最新的数据失败,无法处理报警信息。");
  118. log.error("同步工业库任务获取最新的数据失败,无法处理报警信息。");
  119. //todo 发送短信
  120. //查询是否有正在工业库的同步任务失败的报警,有的话,什么都不做; 没有的话,新增该类型报警
  121. /*if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
  122. //插入该类型报警
  123. warningRecord.setType(0);
  124. String msg = BusinessEnum.WarningSymbolEnum.INDUSTRY_SYNC_ERROR.getMsg();
  125. warningRecord.setCategory(msg);
  126. warningRecord.setTime(nowDate);
  127. warningRecord.setReason(msg);
  128. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.INDUSTRY_SYNC_ERROR.getCode());
  129. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  130. warningRecord.setCreateTime(nowDate);
  131. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  132. }else{
  133. log.info("工业库报警的时候,发现同步工业库任务挂掉了,并且已经有该类型报警了,不做任何处理");
  134. }*/
  135. //将其他类型的报警全部关闭
  136. //2025年02月27日17:09:56 此场景不关闭其他报警
  137. // closeOtherWarningsBySymbol(null);
  138. }
  139. }
  140. }
  141. /**
  142. * 将不是此报警类型的报警全部关闭
  143. * @param symbol
  144. */
  145. private void closeOtherWarningsBySymbol(Integer symbol) {
  146. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.getOtherWarningsBySymbol(symbol);
  147. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  148. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
  149. this.closeWarning(tXinyiWarningRecord);
  150. }
  151. }
  152. }
  153. /**
  154. * 将此化验类型的其他的报警全部关闭
  155. * @param category
  156. */
  157. private void closeOtherWarningsByCategory(String category, Integer symbol) {
  158. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.getOtherWarningsByCategory(category, symbol);
  159. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  160. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
  161. this.closeWarning(tXinyiWarningRecord);
  162. }
  163. }
  164. }
  165. private void closeWarning(TXinyiWarningRecord tXinyiWarningRecord) {
  166. Date nowDate = DateUtils.getNowDate();
  167. tXinyiWarningRecord.setStatus(2);
  168. tXinyiWarningRecord.setOffTime(nowDate);
  169. tXinyiWarningRecord.setUpdateTime(nowDate);
  170. tXinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  171. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
  172. }
  173. public void addBigTable(TXinyiIndustry tXinyiIndustry, TXinyiCalculate xinyiCalculate) {
  174. TXinyiBigTableHour xinyiBigTableHour = TXinyiBigTableHour.builder().build();
  175. //处理工业库的在线数据
  176. this.addIndustry2BigTable(xinyiBigTableHour, tXinyiIndustry);
  177. //处理计算的数据
  178. this.addCalculate2BigTable(xinyiBigTableHour, xinyiCalculate);
  179. //2024年08月13日13:35:15 修复bug:如果工业库挂了某段时间,那么这段时间内的日报和化验数据可能就一直无法获取到了
  180. //先去查询日报是否,查看是否已经有了
  181. List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(tXinyiIndustry.getTestDate()).build());
  182. if(!CollectionUtils.isEmpty(tXinyiDailies)){
  183. log.info("~~~~进入了兜底处理因为工业库挂掉或者其他原因,导致日报数据早于工业库数据的问题@@@%%%");
  184. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
  185. //处理天级的数据
  186. xinyiDailyService.addDailyData(tXinyiDaily, xinyiBigTableHour);
  187. }
  188. //再去查询化验库,查看是否已经存在化验库的数据了
  189. List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectTXinyiRobotList(TXinyiRobot.builder().testHour(tXinyiIndustry.getTestHour()).build());
  190. if(!CollectionUtils.isEmpty(tXinyiRobots)){
  191. log.info("~~~~进入了兜底处理因为工业库挂掉或者其他原因,导致化验室数据早于工业库数据的问题@@@***");
  192. TXinyiRobot tXinyiRobot = tXinyiRobots.get(0);
  193. jsCsFormatData.addRobot2Hour(xinyiBigTableHour, tXinyiRobot);
  194. }
  195. //插入
  196. this.xinyiBigTableHourMapper.insertTXinyiBigTableHour(xinyiBigTableHour);
  197. }
  198. private void addIndustry2BigTable(TXinyiBigTableHour xinyiBigTableHour, TXinyiIndustry tXinyiIndustry) {
  199. //2024年7月5日18:13:43 处理时间和日期
  200. xinyiBigTableHour.setTestDate(tXinyiIndustry.getTestDate());
  201. xinyiBigTableHour.setTestHour(tXinyiIndustry.getTestHour());
  202. xinyiBigTableHour.setGyJsCod(tXinyiIndustry.getJsCod());
  203. xinyiBigTableHour.setGyJsPh(tXinyiIndustry.getJsPh());
  204. xinyiBigTableHour.setGyJsSs(tXinyiIndustry.getJsSs());
  205. xinyiBigTableHour.setGyJsTp(tXinyiIndustry.getJsTp());
  206. xinyiBigTableHour.setGyJsTn(tXinyiIndustry.getJsTn());
  207. xinyiBigTableHour.setGyJsNh3(tXinyiIndustry.getJsNh3());
  208. xinyiBigTableHour.setGyJsSwPh(tXinyiIndustry.getJsSwPh());
  209. xinyiBigTableHour.setGyJsBfyw(tXinyiIndustry.getJsBfyw());
  210. xinyiBigTableHour.setGyCsSlqc(tXinyiIndustry.getCsSlqc());
  211. xinyiBigTableHour.setGyCsCod(tXinyiIndustry.getCsCod());
  212. xinyiBigTableHour.setGyCsPh(tXinyiIndustry.getCsPh());
  213. xinyiBigTableHour.setGyCsSs(tXinyiIndustry.getCsSs());
  214. xinyiBigTableHour.setGyCsTn(tXinyiIndustry.getCsTn());
  215. xinyiBigTableHour.setGyCsTp(tXinyiIndustry.getCsTp());
  216. xinyiBigTableHour.setGyCsNh3(tXinyiIndustry.getCsNh3());
  217. xinyiBigTableHour.setGyOneHyzdDo(tXinyiIndustry.getOneHyzdDo());
  218. xinyiBigTableHour.setGyOneHymdDo(tXinyiIndustry.getOneHymdDo());
  219. xinyiBigTableHour.setGyTwoHyzdDo(tXinyiIndustry.getTwoHyzdDo());
  220. xinyiBigTableHour.setGyTwoHymdDo(tXinyiIndustry.getTwoHymdDo());
  221. xinyiBigTableHour.setGyOneMlss(tXinyiIndustry.getOneMlss());
  222. xinyiBigTableHour.setGyTwoMlss(tXinyiIndustry.getTwoMlss());
  223. xinyiBigTableHour.setGyJsTds(tXinyiIndustry.getJsTds());
  224. xinyiBigTableHour.setGyJsSlq(tXinyiIndustry.getJsSlq());
  225. xinyiBigTableHour.setGyNHlbOneGp(tXinyiIndustry.getNHlbOneGp());
  226. xinyiBigTableHour.setGyNHlbTwoGp(tXinyiIndustry.getNHlbTwoGp());
  227. xinyiBigTableHour.setGyNHlbThreeGp(tXinyiIndustry.getNHlbThreeGp());
  228. xinyiBigTableHour.setGyNHlbFourGp(tXinyiIndustry.getNHlbFourGp());
  229. xinyiBigTableHour.setGyNhlBFiveGp(tXinyiIndustry.getNhlBFiveGp());
  230. xinyiBigTableHour.setGyNHlbSixGp(tXinyiIndustry.getNHlbSixGp());
  231. xinyiBigTableHour.setGyWHlbOneGp(tXinyiIndustry.getWHlbOneGp());
  232. xinyiBigTableHour.setGyWHlbTwoGp(tXinyiIndustry.getWHlbTwoGp());
  233. xinyiBigTableHour.setGyWHlbThreeGp(tXinyiIndustry.getWHlbThreeGp());
  234. xinyiBigTableHour.setGyWHlbFourGp(tXinyiIndustry.getWHlbFourGp());
  235. xinyiBigTableHour.setGyWHlbFiveGp(tXinyiIndustry.getWHlbFiveGp());
  236. xinyiBigTableHour.setGyFjOne(tXinyiIndustry.getFjOne());
  237. xinyiBigTableHour.setGyFjTwo(tXinyiIndustry.getFjTwo());
  238. xinyiBigTableHour.setGyFjThree(tXinyiIndustry.getFjThree());
  239. xinyiBigTableHour.setGyFjFour(tXinyiIndustry.getFjFour());
  240. xinyiBigTableHour.setGyFjFive(tXinyiIndustry.getFjFive());
  241. xinyiBigTableHour.setGyFjSix(tXinyiIndustry.getFjSix());
  242. xinyiBigTableHour.setGyKqllOne(tXinyiIndustry.getKqllOne());
  243. xinyiBigTableHour.setGyKqllTwo(tXinyiIndustry.getKqllTwo());
  244. xinyiBigTableHour.setGyKqllThree(tXinyiIndustry.getKqllThree());
  245. xinyiBigTableHour.setGyKqllFour(tXinyiIndustry.getKqllFour());
  246. xinyiBigTableHour.setGyKqllFive(tXinyiIndustry.getKqllFive());
  247. xinyiBigTableHour.setGyKqllSix(tXinyiIndustry.getKqllSix());
  248. xinyiBigTableHour.setGySjtyjly(tXinyiIndustry.getSJTYJLY());
  249. xinyiBigTableHour.setGyCljyssll(tXinyiIndustry.getCLJYSSLL());
  250. xinyiBigTableHour.setGyHycRjyAll(tXinyiIndustry.getHycRjyAll());
  251. xinyiBigTableHour.setGyHycRjyZdAll(tXinyiIndustry.getHycRjyZdAll());
  252. xinyiBigTableHour.setGyHycWnndAll(tXinyiIndustry.getHycWnndAll());
  253. xinyiBigTableHour.setGyClP04Ycz(tXinyiIndustry.getCLP04YCZ());
  254. }
  255. private void addCalculate2BigTable(TXinyiBigTableHour xinyiBigTableHour, TXinyiCalculate xinyiCalculate) {
  256. xinyiBigTableHour.setJsJsTdb(xinyiCalculate.getJsTdb());
  257. xinyiBigTableHour.setJsJsTlb(xinyiCalculate.getJsTlb());
  258. xinyiBigTableHour.setJsJsBodBCod(xinyiCalculate.getJsBodBCod());
  259. xinyiBigTableHour.setJsYyqHrt(xinyiCalculate.getYyqHrt());
  260. xinyiBigTableHour.setJsQyqHrt(xinyiCalculate.getQyqHrt());
  261. xinyiBigTableHour.setJsHyqHrt(xinyiCalculate.getHyqHrt());
  262. xinyiBigTableHour.setJsHfxwnndzb(xinyiCalculate.getHFXWNNDZB());
  263. xinyiBigTableHour.setJsFM(xinyiCalculate.getFM());
  264. xinyiBigTableHour.setJsGsls(xinyiCalculate.getGSLS());
  265. xinyiBigTableHour.setJsGslsOne(xinyiCalculate.getGslsOne());
  266. xinyiBigTableHour.setJsGslsTwo(xinyiCalculate.getGslsTwo());
  267. xinyiBigTableHour.setJsXgsGsls(xinyiCalculate.getXgsGsls());
  268. xinyiBigTableHour.setJsXlcscBmfh(xinyiCalculate.getXlcscBmfh());
  269. xinyiBigTableHour.setJsXlcscHrt(xinyiCalculate.getXlcscHrt());
  270. xinyiBigTableHour.setJsCccdcBmfh(xinyiCalculate.getCccdcBmfh());
  271. xinyiBigTableHour.setJsCccdcHrt(xinyiCalculate.getCccdcHrt());
  272. xinyiBigTableHour.setJsEccBmfh(xinyiCalculate.getEccBmfh());
  273. xinyiBigTableHour.setJsEccHrt(xinyiCalculate.getEccHrt());
  274. xinyiBigTableHour.setJsEccGtfh(xinyiCalculate.getEccGtfh());
  275. xinyiBigTableHour.setJsClsnJcsj(xinyiCalculate.getClsnJcsj());
  276. xinyiBigTableHour.setJsXgcdcQsqSsls(xinyiCalculate.getXgcdcQsqSsls());
  277. xinyiBigTableHour.setJsWhlb(xinyiCalculate.getWHLB());
  278. xinyiBigTableHour.setJsNhlb(xinyiCalculate.getNHLB());
  279. xinyiBigTableHour.setJsWdscnl(xinyiCalculate.getWDSCNL());
  280. xinyiBigTableHour.setJsQsb(xinyiCalculate.getQSB());
  281. xinyiBigTableHour.setJsFcxsl(xinyiCalculate.getFCXSL());
  282. xinyiBigTableHour.setJsFcxslbl(xinyiCalculate.getFCXSLBL());
  283. //2024年7月11日15:57:20 外回流比采用新的公式计算
  284. xinyiBigTableHour.setJsWhlbRN(xinyiCalculate.getWhlRN());
  285. }
  286. /**
  287. * 额外计算一下预测的准确度
  288. * @param tXinyiIndustry
  289. */
  290. public void updateForecastComparisonByIndustry(TXinyiIndustry tXinyiIndustry) {
  291. BigDecimal csCod = tXinyiIndustry.getCsCod();
  292. BigDecimal csSs = tXinyiIndustry.getCsSs();
  293. BigDecimal csTn = tXinyiIndustry.getCsTn();
  294. BigDecimal csTp = tXinyiIndustry.getCsTp();
  295. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  296. String testHour = tXinyiIndustry.getTestHour();
  297. //时间段1
  298. List<TXinyiForecastComparison> tXinyiForecastComparisons1 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeOne(testHour).build());
  299. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons1)){
  300. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons1) {
  301. BigDecimal hsForecastOne = tXinyiForecastComparison.getHsForecastOne();
  302. BigDecimal yyForecastOne = tXinyiForecastComparison.getYyForecastOne();
  303. BigDecimal jlForecastOne = tXinyiForecastComparison.getJlForecastOne();
  304. if(BusinessEnum.BigModelForecastEnum.COD.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  305. tXinyiForecastComparison.setRealOne(csCod);
  306. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  307. if(!Objects.isNull(hsForecastOne)){
  308. BigDecimal subtract = csCod.subtract(hsForecastOne);
  309. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  310. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  311. }
  312. if(!Objects.isNull(yyForecastOne)){
  313. BigDecimal subtract = csCod.subtract(yyForecastOne);
  314. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  315. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  316. }
  317. if(!Objects.isNull(jlForecastOne)){
  318. BigDecimal subtract = csCod.subtract(jlForecastOne);
  319. tXinyiForecastComparison.setJlErrorRateOne((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  320. tXinyiForecastComparison.setJlOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  321. }
  322. }
  323. }
  324. if(BusinessEnum.BigModelForecastEnum.SS.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  325. tXinyiForecastComparison.setRealOne(csSs);
  326. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  327. if(!Objects.isNull(hsForecastOne)){
  328. BigDecimal subtract = csSs.subtract(hsForecastOne);
  329. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  330. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  331. }
  332. if(!Objects.isNull(yyForecastOne)){
  333. BigDecimal subtract = csSs.subtract(yyForecastOne);
  334. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  335. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  336. }
  337. }
  338. }
  339. //2024年6月21日16:28:56 tn总氮的预测用xsy1和xsy2计算 并从化验库获取
  340. /*if(TN.equals(tXinyiForecastComparison.getCategory())){
  341. tXinyiForecastComparison.setRealOne(csTn);
  342. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  343. if(!Objects.isNull(hsForecastOne))
  344. tXinyiForecastComparison.setHsErrorRateOne((csTn.subtract(hsForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  345. if(!Objects.isNull(yyForecastOne))
  346. tXinyiForecastComparison.setYyErrorRateOne((csTn.subtract(yyForecastOne)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  347. }
  348. }*/
  349. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  350. /*if(TP.equals(tXinyiForecastComparison.getCategory())){
  351. tXinyiForecastComparison.setRealOne(csTp);
  352. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  353. tXinyiForecastComparison.setHsErrorRateOne((csTp.subtract(hsForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  354. tXinyiForecastComparison.setYyErrorRateOne((csTp.subtract(yyForecastOne)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  355. }
  356. }*/
  357. if(BusinessEnum.BigModelForecastEnum.NH3.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  358. tXinyiForecastComparison.setRealOne(csNh3);
  359. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  360. if(!Objects.isNull(hsForecastOne)){
  361. BigDecimal subtract = csNh3.subtract(hsForecastOne);
  362. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  363. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  364. }
  365. if(!Objects.isNull(yyForecastOne)){
  366. BigDecimal subtract = csNh3.subtract(yyForecastOne);
  367. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  368. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  369. }
  370. }
  371. }
  372. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  373. }
  374. }
  375. //时间段2
  376. List<TXinyiForecastComparison> tXinyiForecastComparisons2 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeTwo(testHour).build());
  377. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons2)){
  378. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons2) {
  379. BigDecimal hsForecastTwo = tXinyiForecastComparison.getHsForecastTwo();
  380. BigDecimal yyForecastTwo = tXinyiForecastComparison.getYyForecastTwo();
  381. BigDecimal jlForecastTwo = tXinyiForecastComparison.getJlForecastTwo();
  382. if(BusinessEnum.BigModelForecastEnum.COD.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  383. tXinyiForecastComparison.setRealTwo(csCod);
  384. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  385. if(!Objects.isNull(hsForecastTwo)){
  386. BigDecimal subtract = csCod.subtract(hsForecastTwo);
  387. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  388. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  389. }
  390. if(!Objects.isNull(yyForecastTwo)){
  391. BigDecimal subtract = csCod.subtract(yyForecastTwo);
  392. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  393. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  394. }
  395. if(!Objects.isNull(jlForecastTwo)){
  396. BigDecimal subtract = csCod.subtract(jlForecastTwo);
  397. tXinyiForecastComparison.setJlErrorRateTwo((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  398. tXinyiForecastComparison.setJlTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  399. }
  400. }
  401. }
  402. if(BusinessEnum.BigModelForecastEnum.SS.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  403. tXinyiForecastComparison.setRealTwo(csSs);
  404. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  405. if(!Objects.isNull(hsForecastTwo)){
  406. BigDecimal subtract = csSs.subtract(hsForecastTwo);
  407. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  408. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  409. }
  410. if(!Objects.isNull(yyForecastTwo)){
  411. BigDecimal subtract = csSs.subtract(yyForecastTwo);
  412. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  413. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  414. }
  415. }
  416. }
  417. /*if(TN.equals(tXinyiForecastComparison.getCategory())){
  418. tXinyiForecastComparison.setRealTwo(csTn);
  419. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  420. if(!Objects.isNull(hsForecastTwo))
  421. tXinyiForecastComparison.setHsErrorRateTwo((csTn.subtract(hsForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  422. if(!Objects.isNull(yyForecastTwo))
  423. tXinyiForecastComparison.setYyErrorRateTwo((csTn.subtract(yyForecastTwo)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  424. }
  425. }*/
  426. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  427. /*if(TP.equals(tXinyiForecastComparison.getCategory())){
  428. tXinyiForecastComparison.setRealTwo(csTp);
  429. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  430. tXinyiForecastComparison.setHsErrorRateTwo((csTp.subtract(hsForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  431. tXinyiForecastComparison.setYyErrorRateTwo((csTp.subtract(yyForecastTwo)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  432. }
  433. }*/
  434. if(BusinessEnum.BigModelForecastEnum.NH3.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  435. tXinyiForecastComparison.setRealTwo(csNh3);
  436. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  437. if(!Objects.isNull(hsForecastTwo)){
  438. BigDecimal subtract = csNh3.subtract(hsForecastTwo);
  439. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  440. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  441. }
  442. if(!Objects.isNull(yyForecastTwo)){
  443. BigDecimal subtract = csNh3.subtract(yyForecastTwo);
  444. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  445. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  446. }
  447. }
  448. }
  449. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  450. }
  451. }
  452. //时间段3
  453. List<TXinyiForecastComparison> tXinyiForecastComparisons3 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeThree(testHour).build());
  454. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons3)){
  455. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons3) {
  456. BigDecimal hsForecastThree = tXinyiForecastComparison.getHsForecastThree();
  457. BigDecimal yyForecastThree = tXinyiForecastComparison.getYyForecastThree();
  458. BigDecimal jlForecastThree = tXinyiForecastComparison.getJlForecastThree();
  459. if(BusinessEnum.BigModelForecastEnum.COD.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  460. tXinyiForecastComparison.setRealThree(csCod);
  461. if(!Objects.isNull(csCod) && csCod.compareTo(BigDecimal.ZERO) > 0){
  462. if(!Objects.isNull(hsForecastThree)){
  463. BigDecimal subtract = csCod.subtract(hsForecastThree);
  464. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  465. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  466. }
  467. if(!Objects.isNull(yyForecastThree)){
  468. BigDecimal subtract = csCod.subtract(yyForecastThree);
  469. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  470. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  471. }
  472. if(!Objects.isNull(jlForecastThree)){
  473. BigDecimal subtract = csCod.subtract(jlForecastThree);
  474. tXinyiForecastComparison.setJlErrorRateThree((subtract).divide(csCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  475. tXinyiForecastComparison.setJlThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  476. }
  477. }
  478. }
  479. if(BusinessEnum.BigModelForecastEnum.SS.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  480. tXinyiForecastComparison.setRealThree(csSs);
  481. if(!Objects.isNull(csSs) && csSs.compareTo(BigDecimal.ZERO) > 0){
  482. if(!Objects.isNull(hsForecastThree)){
  483. BigDecimal subtract = csSs.subtract(hsForecastThree);
  484. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  485. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  486. }
  487. if(!Objects.isNull(yyForecastThree)){
  488. BigDecimal subtract = csSs.subtract(yyForecastThree);
  489. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csSs, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  490. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  491. }
  492. }
  493. }
  494. /*if(TN.equals(tXinyiForecastComparison.getCategory())){
  495. tXinyiForecastComparison.setRealThree(csTn);
  496. if(!Objects.isNull(csTn) && csTn.compareTo(BigDecimal.ZERO) > 0){
  497. if(!Objects.isNull(hsForecastThree))
  498. tXinyiForecastComparison.setHsErrorRateThree((csTn.subtract(hsForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  499. if(!Objects.isNull(yyForecastThree))
  500. tXinyiForecastComparison.setYyErrorRateThree((csTn.subtract(yyForecastThree)).divide(csTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  501. }
  502. }*/
  503. //2024年6月20日11:16:55 出水总磷的真实值从化验室获取
  504. /*if(TP.equals(tXinyiForecastComparison.getCategory())){
  505. tXinyiForecastComparison.setRealThree(csTp);
  506. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  507. tXinyiForecastComparison.setHsErrorRateThree((csTp.subtract(hsForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  508. tXinyiForecastComparison.setYyErrorRateThree((csTp.subtract(yyForecastThree)).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  509. }
  510. }*/
  511. if(BusinessEnum.BigModelForecastEnum.NH3.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  512. tXinyiForecastComparison.setRealThree(csNh3);
  513. if(!Objects.isNull(csNh3) && csNh3.compareTo(BigDecimal.ZERO) > 0){
  514. if(!Objects.isNull(hsForecastThree)){
  515. BigDecimal subtract = csNh3.subtract(hsForecastThree);
  516. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  517. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  518. }
  519. if(!Objects.isNull(yyForecastThree)){
  520. BigDecimal subtract = csNh3.subtract(yyForecastThree);
  521. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csNh3, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  522. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  523. }
  524. }
  525. }
  526. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  527. }
  528. }
  529. }
  530. /**
  531. * 额外计算一下预测的准确度
  532. * @param tXinyiRobot
  533. */
  534. public void updateForecastComparisonByRobot(TXinyiRobot tXinyiRobot) {
  535. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  536. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  537. //2024年09月08日11:28:17 新增的四个预测使用
  538. BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  539. BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  540. BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  541. BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  542. String testHour = tXinyiRobot.getTestHour();
  543. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  544. BigDecimal csTp = null;
  545. // BigDecimal csTn = null;
  546. if(!Objects.isNull(tpRccJqr)){
  547. csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  548. //2024年6月20日13:44:26 先不计算,结果会更准确
  549. //2024年6月21日14:23:14 就是要 除以0.8
  550. // csTp = tpRccJqr;
  551. }
  552. //2024年7月12日16:29:00 需要单独计算了 csTn不再合并,分别从两个池子获取。。。
  553. // if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr))
  554. // csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP).divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  555. //时间段1
  556. List<TXinyiForecastComparison> tXinyiForecastComparisons1 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeOne(testHour).build());
  557. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons1)){
  558. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons1) {
  559. BigDecimal hsForecastOne = tXinyiForecastComparison.getHsForecastOne();
  560. BigDecimal yyForecastOne = tXinyiForecastComparison.getYyForecastOne();
  561. /*if(XSY1.equals(tXinyiForecastComparison.getCategory())){
  562. tXinyiForecastComparison.setRealOne(no3Hlj1Jqr);
  563. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  564. if(!Objects.isNull(hsForecastOne))
  565. tXinyiForecastComparison.setHsErrorRateOne((no3Hlj1Jqr.subtract(hsForecastOne)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  566. if(!Objects.isNull(yyForecastOne))
  567. tXinyiForecastComparison.setYyErrorRateOne((no3Hlj1Jqr.subtract(yyForecastOne)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  568. }
  569. }
  570. if(XSY2.equals(tXinyiForecastComparison.getCategory())){
  571. tXinyiForecastComparison.setRealOne(no3Hlj2Jqr);
  572. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  573. if(!Objects.isNull(hsForecastOne))
  574. tXinyiForecastComparison.setHsErrorRateOne((no3Hlj2Jqr.subtract(hsForecastOne)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  575. if(!Objects.isNull(yyForecastOne))
  576. tXinyiForecastComparison.setYyErrorRateOne((no3Hlj2Jqr.subtract(yyForecastOne)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  577. }
  578. }*/
  579. //2024年6月21日17:04:01 总氮的真实值也从化验室获取
  580. //2024年7月12日10:31:29 tn又改成xsy1和xsy2了。。。
  581. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  582. || BusinessEnum.BigModelForecastEnum.XSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  583. tXinyiForecastComparison.setRealOne(no3Hlj1Jqr);
  584. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  585. if(!Objects.isNull(hsForecastOne)){
  586. BigDecimal subtract = no3Hlj1Jqr.subtract(hsForecastOne);
  587. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  588. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  589. }
  590. if(!Objects.isNull(yyForecastOne)){
  591. BigDecimal subtract = no3Hlj1Jqr.subtract(yyForecastOne);
  592. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  593. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  594. }
  595. }
  596. }
  597. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  598. || BusinessEnum.BigModelForecastEnum.XSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  599. tXinyiForecastComparison.setRealOne(no3Hlj2Jqr);
  600. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  601. if(!Objects.isNull(hsForecastOne)){
  602. BigDecimal subtract = no3Hlj2Jqr.subtract(hsForecastOne);
  603. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  604. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  605. }
  606. if(!Objects.isNull(yyForecastOne)){
  607. BigDecimal subtract = no3Hlj2Jqr.subtract(yyForecastOne);
  608. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  609. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  610. }
  611. }
  612. }
  613. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  614. //2024年7月11日17:08:51 tp改名字了。。。
  615. if(BusinessEnum.BigModelForecastEnum.TP.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  616. || BusinessEnum.BigModelForecastEnum.ZLSY.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  617. tXinyiForecastComparison.setRealOne(csTp);
  618. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  619. if(!Objects.isNull(hsForecastOne)){
  620. BigDecimal subtract = csTp.subtract(hsForecastOne);
  621. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  622. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  623. }
  624. if(!Objects.isNull(yyForecastOne)){
  625. BigDecimal subtract = csTp.subtract(yyForecastOne);
  626. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  627. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  628. }
  629. }
  630. }
  631. //2024年09月08日11:31:16 新增四个预测的真实值的字段更新
  632. if(BusinessEnum.BigModelForecastEnum.QYXSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  633. tXinyiForecastComparison.setRealOne(no3Qyc1Jqr);
  634. if(!Objects.isNull(no3Qyc1Jqr) && no3Qyc1Jqr.compareTo(BigDecimal.ZERO) > 0){
  635. if(!Objects.isNull(hsForecastOne)){
  636. BigDecimal subtract = no3Qyc1Jqr.subtract(hsForecastOne);
  637. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  638. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  639. }
  640. if(!Objects.isNull(yyForecastOne)){
  641. BigDecimal subtract = no3Qyc1Jqr.subtract(yyForecastOne);
  642. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  643. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  644. }
  645. }
  646. }
  647. if(BusinessEnum.BigModelForecastEnum.QYXSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  648. tXinyiForecastComparison.setRealOne(no3Qyc2Jqr);
  649. if(!Objects.isNull(no3Qyc2Jqr) && no3Qyc2Jqr.compareTo(BigDecimal.ZERO) > 0){
  650. if(!Objects.isNull(hsForecastOne)){
  651. BigDecimal subtract = no3Qyc2Jqr.subtract(hsForecastOne);
  652. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  653. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  654. }
  655. if(!Objects.isNull(yyForecastOne)){
  656. BigDecimal subtract = no3Qyc2Jqr.subtract(yyForecastOne);
  657. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  658. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  659. }
  660. }
  661. }
  662. if(BusinessEnum.BigModelForecastEnum.QYNH31.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  663. tXinyiForecastComparison.setRealOne(nh31Jqr);
  664. if(!Objects.isNull(nh31Jqr) && nh31Jqr.compareTo(BigDecimal.ZERO) > 0){
  665. if(!Objects.isNull(hsForecastOne)){
  666. BigDecimal subtract = nh31Jqr.subtract(hsForecastOne);
  667. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  668. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  669. }
  670. if(!Objects.isNull(yyForecastOne)){
  671. BigDecimal subtract = nh31Jqr.subtract(yyForecastOne);
  672. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  673. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  674. }
  675. }
  676. }
  677. if(BusinessEnum.BigModelForecastEnum.QYNH32.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  678. tXinyiForecastComparison.setRealOne(nh32Jqr);
  679. if(!Objects.isNull(nh32Jqr) && nh32Jqr.compareTo(BigDecimal.ZERO) > 0){
  680. if(!Objects.isNull(hsForecastOne)){
  681. BigDecimal subtract = nh32Jqr.subtract(hsForecastOne);
  682. tXinyiForecastComparison.setHsErrorRateOne((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  683. tXinyiForecastComparison.setHsOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  684. }
  685. if(!Objects.isNull(yyForecastOne)){
  686. BigDecimal subtract = nh32Jqr.subtract(yyForecastOne);
  687. tXinyiForecastComparison.setYyErrorRateOne((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  688. tXinyiForecastComparison.setYyOneSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  689. }
  690. }
  691. }
  692. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  693. }
  694. }
  695. //时间段2
  696. List<TXinyiForecastComparison> tXinyiForecastComparisons2 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeTwo(testHour).build());
  697. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons2)){
  698. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons2) {
  699. BigDecimal hsForecastTwo = tXinyiForecastComparison.getHsForecastTwo();
  700. BigDecimal yyForecastTwo = tXinyiForecastComparison.getYyForecastTwo();
  701. /*if(XSY1.equals(tXinyiForecastComparison.getCategory())){
  702. tXinyiForecastComparison.setRealTwo(no3Hlj1Jqr);
  703. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  704. if(!Objects.isNull(hsForecastTwo))
  705. tXinyiForecastComparison.setHsErrorRateTwo((no3Hlj1Jqr.subtract(hsForecastTwo)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  706. if(!Objects.isNull(yyForecastTwo))
  707. tXinyiForecastComparison.setYyErrorRateTwo((no3Hlj1Jqr.subtract(yyForecastTwo)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  708. }
  709. }
  710. if(XSY2.equals(tXinyiForecastComparison.getCategory())){
  711. tXinyiForecastComparison.setRealTwo(no3Hlj2Jqr);
  712. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  713. if(!Objects.isNull(hsForecastTwo))
  714. tXinyiForecastComparison.setHsErrorRateTwo((no3Hlj2Jqr.subtract(hsForecastTwo)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  715. if(!Objects.isNull(yyForecastTwo))
  716. tXinyiForecastComparison.setYyErrorRateTwo((no3Hlj2Jqr.subtract(yyForecastTwo)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  717. }
  718. }*/
  719. //2024年6月21日17:04:01 总氮的真实值也从化验室获取
  720. //2024年7月12日10:31:29 tn又改成xsy1和xsy2了。。。
  721. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  722. || BusinessEnum.BigModelForecastEnum.XSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  723. tXinyiForecastComparison.setRealTwo(no3Hlj1Jqr);
  724. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  725. if(!Objects.isNull(hsForecastTwo)){
  726. BigDecimal subtract = no3Hlj1Jqr.subtract(hsForecastTwo);
  727. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  728. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  729. }
  730. if(!Objects.isNull(yyForecastTwo)){
  731. BigDecimal subtract = no3Hlj1Jqr.subtract(yyForecastTwo);
  732. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  733. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  734. }
  735. }
  736. }
  737. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  738. || BusinessEnum.BigModelForecastEnum.XSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  739. tXinyiForecastComparison.setRealTwo(no3Hlj2Jqr);
  740. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  741. if(!Objects.isNull(hsForecastTwo)){
  742. BigDecimal subtract = no3Hlj2Jqr.subtract(hsForecastTwo);
  743. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  744. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  745. }
  746. if(!Objects.isNull(yyForecastTwo)){
  747. BigDecimal subtract = no3Hlj2Jqr.subtract(yyForecastTwo);
  748. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  749. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  750. }
  751. }
  752. }
  753. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  754. //2024年7月11日17:08:51 tp改名字了。。。
  755. if(BusinessEnum.BigModelForecastEnum.TP.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  756. || BusinessEnum.BigModelForecastEnum.ZLSY.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  757. tXinyiForecastComparison.setRealTwo(csTp);
  758. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  759. if(!Objects.isNull(hsForecastTwo)){
  760. BigDecimal subtract = csTp.subtract(hsForecastTwo);
  761. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  762. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  763. }
  764. if(!Objects.isNull(yyForecastTwo)){
  765. BigDecimal subtract = csTp.subtract(yyForecastTwo);
  766. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  767. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  768. }
  769. }
  770. }
  771. //2024年09月08日11:31:16 新增四个预测的真实值的字段更新
  772. if(BusinessEnum.BigModelForecastEnum.QYXSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  773. tXinyiForecastComparison.setRealTwo(no3Qyc1Jqr);
  774. if(!Objects.isNull(no3Qyc1Jqr) && no3Qyc1Jqr.compareTo(BigDecimal.ZERO) > 0){
  775. if(!Objects.isNull(hsForecastTwo)){
  776. BigDecimal subtract = no3Qyc1Jqr.subtract(hsForecastTwo);
  777. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  778. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  779. }
  780. if(!Objects.isNull(yyForecastTwo)){
  781. BigDecimal subtract = no3Qyc1Jqr.subtract(yyForecastTwo);
  782. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  783. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  784. }
  785. }
  786. }
  787. if(BusinessEnum.BigModelForecastEnum.QYXSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  788. tXinyiForecastComparison.setRealTwo(no3Qyc2Jqr);
  789. if(!Objects.isNull(no3Qyc2Jqr) && no3Qyc2Jqr.compareTo(BigDecimal.ZERO) > 0){
  790. if(!Objects.isNull(hsForecastTwo)){
  791. BigDecimal subtract = no3Qyc2Jqr.subtract(hsForecastTwo);
  792. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  793. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  794. }
  795. if(!Objects.isNull(yyForecastTwo)){
  796. BigDecimal subtract = no3Qyc2Jqr.subtract(yyForecastTwo);
  797. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  798. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  799. }
  800. }
  801. }
  802. if(BusinessEnum.BigModelForecastEnum.QYNH31.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  803. tXinyiForecastComparison.setRealTwo(nh31Jqr);
  804. if(!Objects.isNull(nh31Jqr) && nh31Jqr.compareTo(BigDecimal.ZERO) > 0){
  805. if(!Objects.isNull(hsForecastTwo)){
  806. BigDecimal subtract = nh31Jqr.subtract(hsForecastTwo);
  807. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  808. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  809. }
  810. if(!Objects.isNull(yyForecastTwo)){
  811. BigDecimal subtract = nh31Jqr.subtract(yyForecastTwo);
  812. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  813. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  814. }
  815. }
  816. }
  817. if(BusinessEnum.BigModelForecastEnum.QYNH32.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  818. tXinyiForecastComparison.setRealTwo(nh32Jqr);
  819. if(!Objects.isNull(nh32Jqr) && nh32Jqr.compareTo(BigDecimal.ZERO) > 0){
  820. if(!Objects.isNull(hsForecastTwo)){
  821. BigDecimal subtract = nh32Jqr.subtract(hsForecastTwo);
  822. tXinyiForecastComparison.setHsErrorRateTwo((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  823. tXinyiForecastComparison.setHsTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  824. }
  825. if(!Objects.isNull(yyForecastTwo)){
  826. BigDecimal subtract = nh32Jqr.subtract(yyForecastTwo);
  827. tXinyiForecastComparison.setYyErrorRateTwo((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  828. tXinyiForecastComparison.setYyTwoSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  829. }
  830. }
  831. }
  832. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  833. }
  834. }
  835. //时间段3
  836. List<TXinyiForecastComparison> tXinyiForecastComparisons3 = this.xinyiForecastComparisonMapper.selectTXinyiForecastComparisonList(TXinyiForecastComparison.builder().forecastTimeThree(testHour).build());
  837. if(!CollectionUtils.isEmpty(tXinyiForecastComparisons3)){
  838. for (TXinyiForecastComparison tXinyiForecastComparison : tXinyiForecastComparisons3) {
  839. BigDecimal hsForecastThree = tXinyiForecastComparison.getHsForecastThree();
  840. BigDecimal yyForecastThree = tXinyiForecastComparison.getYyForecastThree();
  841. /*if(XSY1.equals(tXinyiForecastComparison.getCategory())){
  842. tXinyiForecastComparison.setRealThree(no3Hlj1Jqr);
  843. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  844. if(!Objects.isNull(hsForecastThree))
  845. tXinyiForecastComparison.setHsErrorRateThree((no3Hlj1Jqr.subtract(hsForecastThree)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  846. if(!Objects.isNull(yyForecastThree))
  847. tXinyiForecastComparison.setYyErrorRateThree((no3Hlj1Jqr.subtract(yyForecastThree)).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  848. }
  849. }
  850. if(XSY2.equals(tXinyiForecastComparison.getCategory())){
  851. tXinyiForecastComparison.setRealThree(no3Hlj2Jqr);
  852. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  853. if(!Objects.isNull(hsForecastThree))
  854. tXinyiForecastComparison.setHsErrorRateThree((no3Hlj2Jqr.subtract(hsForecastThree)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  855. if(!Objects.isNull(yyForecastThree))
  856. tXinyiForecastComparison.setYyErrorRateThree((no3Hlj2Jqr.subtract(yyForecastThree)).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  857. }
  858. }*/
  859. //2024年6月21日17:04:01 总氮的真实值也从化验室获取
  860. //2024年7月12日10:31:29 tn又改成xsy1和xsy2了。。。
  861. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  862. || BusinessEnum.BigModelForecastEnum.XSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  863. tXinyiForecastComparison.setRealThree(no3Hlj1Jqr);
  864. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0){
  865. if(!Objects.isNull(hsForecastThree)){
  866. BigDecimal subtract = no3Hlj1Jqr.subtract(hsForecastThree);
  867. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  868. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  869. }
  870. if(!Objects.isNull(yyForecastThree)){
  871. BigDecimal subtract = no3Hlj1Jqr.subtract(yyForecastThree);
  872. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Hlj1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  873. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  874. }
  875. }
  876. }
  877. if(BusinessEnum.BigModelForecastEnum.TN.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  878. || BusinessEnum.BigModelForecastEnum.XSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  879. tXinyiForecastComparison.setRealThree(no3Hlj2Jqr);
  880. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0){
  881. if(!Objects.isNull(hsForecastThree)){
  882. BigDecimal subtract = no3Hlj2Jqr.subtract(hsForecastThree);
  883. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  884. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  885. }
  886. if(!Objects.isNull(yyForecastThree)){
  887. BigDecimal subtract = no3Hlj2Jqr.subtract(yyForecastThree);
  888. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Hlj2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  889. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  890. }
  891. }
  892. }
  893. //2024年6月20日11:14:42 总磷的真实值也从化验室获取
  894. //2024年7月11日17:08:51 tp改名字了。。。
  895. if(BusinessEnum.BigModelForecastEnum.TP.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())
  896. || BusinessEnum.BigModelForecastEnum.ZLSY.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  897. tXinyiForecastComparison.setRealThree(csTp);
  898. if(!Objects.isNull(csTp) && csTp.compareTo(BigDecimal.ZERO) > 0){
  899. if(!Objects.isNull(hsForecastThree)){
  900. BigDecimal subtract = csTp.subtract(hsForecastThree);
  901. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  902. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  903. }
  904. if(!Objects.isNull(yyForecastThree)){
  905. BigDecimal subtract = csTp.subtract(yyForecastThree);
  906. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(csTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  907. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  908. }
  909. }
  910. }
  911. //2024年09月08日11:31:16 新增四个预测的真实值的字段更新
  912. if(BusinessEnum.BigModelForecastEnum.QYXSY1.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  913. tXinyiForecastComparison.setRealThree(no3Qyc1Jqr);
  914. if(!Objects.isNull(no3Qyc1Jqr) && no3Qyc1Jqr.compareTo(BigDecimal.ZERO) > 0){
  915. if(!Objects.isNull(hsForecastThree)){
  916. BigDecimal subtract = no3Qyc1Jqr.subtract(hsForecastThree);
  917. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  918. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  919. }
  920. if(!Objects.isNull(yyForecastThree)){
  921. BigDecimal subtract = no3Qyc1Jqr.subtract(yyForecastThree);
  922. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Qyc1Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  923. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  924. }
  925. }
  926. }
  927. if(BusinessEnum.BigModelForecastEnum.QYXSY2.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  928. tXinyiForecastComparison.setRealThree(no3Qyc2Jqr);
  929. if(!Objects.isNull(no3Qyc2Jqr) && no3Qyc2Jqr.compareTo(BigDecimal.ZERO) > 0){
  930. if(!Objects.isNull(hsForecastThree)){
  931. BigDecimal subtract = no3Qyc2Jqr.subtract(hsForecastThree);
  932. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  933. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  934. }
  935. if(!Objects.isNull(yyForecastThree)){
  936. BigDecimal subtract = no3Qyc2Jqr.subtract(yyForecastThree);
  937. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(no3Qyc2Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  938. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  939. }
  940. }
  941. }
  942. if(BusinessEnum.BigModelForecastEnum.QYNH31.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  943. tXinyiForecastComparison.setRealThree(nh31Jqr);
  944. if(!Objects.isNull(nh31Jqr) && nh31Jqr.compareTo(BigDecimal.ZERO) > 0){
  945. if(!Objects.isNull(hsForecastThree)){
  946. BigDecimal subtract = nh31Jqr.subtract(hsForecastThree);
  947. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  948. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  949. }
  950. if(!Objects.isNull(yyForecastThree)){
  951. BigDecimal subtract = nh31Jqr.subtract(yyForecastThree);
  952. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(nh31Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  953. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  954. }
  955. }
  956. }
  957. if(BusinessEnum.BigModelForecastEnum.QYNH32.getCode().equalsIgnoreCase(tXinyiForecastComparison.getCategory())){
  958. tXinyiForecastComparison.setRealThree(nh32Jqr);
  959. if(!Objects.isNull(nh32Jqr) && nh32Jqr.compareTo(BigDecimal.ZERO) > 0){
  960. if(!Objects.isNull(hsForecastThree)){
  961. BigDecimal subtract = nh32Jqr.subtract(hsForecastThree);
  962. tXinyiForecastComparison.setHsErrorRateThree((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  963. tXinyiForecastComparison.setHsThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  964. }
  965. if(!Objects.isNull(yyForecastThree)){
  966. BigDecimal subtract = nh32Jqr.subtract(yyForecastThree);
  967. tXinyiForecastComparison.setYyErrorRateThree((subtract).divide(nh32Jqr, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  968. tXinyiForecastComparison.setYyThreeSubtract(DecimalUtils.getAbsAndScale(subtract, INT_2));
  969. }
  970. }
  971. }
  972. this.xinyiForecastComparisonMapper.updateTXinyiForecastComparison(tXinyiForecastComparison);
  973. }
  974. }
  975. }
  976. public TXinyiCalculate addCalculateByIndustry(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  977. //获取的一些配置信息
  978. BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
  979. BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
  980. BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
  981. BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
  982. BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
  983. BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
  984. BigDecimal gfjgzts = normConfig.getGFJGZTS();
  985. BigDecimal gfjckll = normConfig.getGFJCKLL();
  986. BigDecimal fcxbsjll = normConfig.getFCXBSJLL();
  987. BigDecimal fclbsl = normConfig.getFCLBSL();
  988. BigDecimal fcxbgzxl = normConfig.getFCXBGZXL();
  989. //结算结果
  990. TXinyiCalculate tXinyiCalculate = new TXinyiCalculate();
  991. //时间相关
  992. tXinyiCalculate.setTestDate(tXinyiIndustry.getTestDate());
  993. tXinyiCalculate.setTestHour(tXinyiIndustry.getTestHour());
  994. tXinyiCalculate.setTestTime(tXinyiIndustry.getTestTime());
  995. //获取最新的一条日报信息
  996. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  997. if(Objects.isNull(tXinyiDaily)){
  998. //理论不会出现
  999. log.error("没有日报数据");
  1000. return null;
  1001. }
  1002. BigDecimal jsBod5 = tXinyiDaily.getJsBod5();
  1003. BigDecimal csBod5 = tXinyiDaily.getCsBod5();
  1004. BigDecimal whlR = tXinyiDaily.getWhlR();
  1005. BigDecimal oneMlvss = tXinyiDaily.getShcHyOneMlvss();
  1006. BigDecimal twoMlvss = tXinyiDaily.getShcHyTwoMlvss();
  1007. BigDecimal avgMlvss = null;
  1008. if(!Objects.isNull(oneMlvss) && !Objects.isNull(twoMlvss))
  1009. avgMlvss = ((oneMlvss.add(twoMlvss)).divide(new BigDecimal(2),4, RoundingMode.HALF_UP));
  1010. BigDecimal oneMlss = tXinyiDaily.getShcHyOneMlss();
  1011. BigDecimal twoMlss = tXinyiDaily.getShcHyTwoMlss();
  1012. BigDecimal avgMlss = null;
  1013. if(!Objects.isNull(oneMlss) && !Objects.isNull(twoMlss))
  1014. avgMlss = ((oneMlss.add(twoMlss)).divide(new BigDecimal(NUMBER_2),NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1015. //工业库的指标
  1016. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  1017. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  1018. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  1019. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  1020. //计算
  1021. if(!Objects.isNull(jsBod5)){
  1022. if(!Objects.isNull(jsTn) && jsTn.compareTo(BigDecimal.ZERO) > 0)
  1023. tXinyiCalculate.setJsTdb(jsBod5.divide(jsTn, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1024. if(!Objects.isNull(jsTp) && jsTp.compareTo(BigDecimal.ZERO) > 0)
  1025. tXinyiCalculate.setJsTlb(jsBod5.divide(jsTp, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1026. if(!Objects.isNull(jsCod) && jsCod.compareTo(BigDecimal.ZERO) > 0)
  1027. tXinyiCalculate.setJsBodBCod(jsBod5.divide(jsCod, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1028. if(!Objects.isNull(csBod5) && !Objects.isNull(avgMlss) && avgMlss.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(jsSlq) && jsSlq.compareTo(BigDecimal.ZERO) > 0)
  1029. 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));
  1030. }
  1031. if(!Objects.isNull(avgMlss) && avgMlss.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(avgMlvss) && avgMlvss.compareTo(BigDecimal.ZERO) > 0)
  1032. tXinyiCalculate.setHFXWNNDZB(avgMlvss.divide(avgMlss, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1033. if(!Objects.isNull(jsSlq) && jsSlq.compareTo(BigDecimal.ZERO) > 0){
  1034. tXinyiCalculate.setYyqHrt(new BigDecimal(YYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1035. tXinyiCalculate.setQyqHrt(new BigDecimal(QYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1036. tXinyiCalculate.setHyqHrt(new BigDecimal(HYQ_TLSJ_FIRST).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1037. // 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));
  1038. tXinyiCalculate.setGSLS(jsSlq.divide(GSLS_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1039. 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));
  1040. 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));
  1041. 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));
  1042. tXinyiCalculate.setXlcscBmfh(jsSlq.divide(XLCSCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1043. tXinyiCalculate.setXlcscHrt(XLCSCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1044. tXinyiCalculate.setCccdcBmfh(jsSlq.divide(CCCDCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1045. tXinyiCalculate.setCccdcHrt(CCCDCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1046. tXinyiCalculate.setEccBmfh(jsSlq.divide(ECCBMFH_LAST, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1047. tXinyiCalculate.setEccHrt(ECCHRT_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1048. //2024年7月1日17:16:16 计算逻辑调整
  1049. 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));
  1050. tXinyiCalculate.setClsnJcsj(CLSNJCSJ_LAST.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1051. tXinyiCalculate.setXgcdcQsqSsls(jsSlq.multiply(XGCDCQSQSSLS_LAST));
  1052. //2024年6月29日15:18:01 增加几个新的计算指标
  1053. if(!Objects.isNull(nhlbqdsl) && !Objects.isNull(nhlbdsjll) && !Objects.isNull(nhlbgzxl))
  1054. tXinyiCalculate.setNHLB(nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).multiply(BigDecimal_100).divide(jsSlq, 4, RoundingMode.HALF_UP));
  1055. if(!Objects.isNull(whlbqdsl) && !Objects.isNull(whlbdsjll) && !Objects.isNull(whlbgzxl))
  1056. tXinyiCalculate.setWHLB(whlbqdsl.multiply(whlbdsjll).multiply(whlbgzxl).multiply(BigDecimal_100).divide(jsSlq, 4, RoundingMode.HALF_UP));
  1057. if(!Objects.isNull(gfjgzts) && !Objects.isNull(gfjckll))
  1058. tXinyiCalculate.setQSB(gfjgzts.multiply(gfjckll).divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP));
  1059. if(!Objects.isNull(fcxbsjll) && !Objects.isNull(fclbsl) && !Objects.isNull(fcxbgzxl)){
  1060. BigDecimal fcxsl = fcxbsjll.multiply(fclbsl).multiply(fcxbgzxl);
  1061. tXinyiCalculate.setFCXSL(fcxsl);
  1062. //2024年7月3日10:54:28 额外再增加一个字段
  1063. tXinyiCalculate.setFCXSLBL(fcxsl.divide(jsSlq, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  1064. }
  1065. //2024年7月11日15:43:47 之前给的外回流比计算不准确,额外一个字段记录新的外回流比
  1066. BigDecimal divide = jsSlq.divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  1067. if(divide.compareTo(DECIMAL_1500) < 0)
  1068. tXinyiCalculate.setWhlRN(DECIMAL_1200.divide(divide, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  1069. else
  1070. tXinyiCalculate.setWhlRN(DECIMAL_1620.divide(divide, NUMBER_SCALE_4, RoundingMode.HALF_UP).multiply(BigDecimal_100));
  1071. }
  1072. return tXinyiCalculate;
  1073. }
  1074. public void handleSHWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, TXinyiCalculate xinyiCalculate) {
  1075. //判断对应指标是否报警 然后调研大模型获取决策信息
  1076. // BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  1077. //内回流比报警
  1078. // BigDecimal nhlbSjz = normConfig.getNhlbSjz();//400
  1079. // BigDecimal nhlbnkSxz = normConfig.getNhlbnkSxz();//360
  1080. BigDecimal nhlbnkXxz = normConfig.getNhlbnkXxz();//270
  1081. // BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
  1082. // BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
  1083. // BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
  1084. /*BigDecimal nhlb = xinyiCalculate.getNHLB();
  1085. if(!Objects.isNull(nhlb) && !Objects.isNull(nhlbnkXxz)){
  1086. // BigDecimal divide = nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).divide(jsSlq, 4, RoundingMode.HALF_UP);
  1087. handleXinYiWarningsSH(nhlbnkXxz, nhlb, BusinessEnum.WarningCategoryEnum.NHLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  1088. }*/
  1089. //外回流比报警
  1090. // BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
  1091. // BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
  1092. // BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
  1093. BigDecimal whlbnkXxz = normConfig.getWhlbnkXxz();//75
  1094. // BigDecimal whlbSjz = normConfig.getWhlbSjz();
  1095. // BigDecimal whlb = xinyiCalculate.getWHLB();
  1096. //2024年7月11日15:54:19 外回流比采用新的计算方式获取的值
  1097. BigDecimal whlb = xinyiCalculate.getWhlRN();
  1098. if(!Objects.isNull(whlb) && !Objects.isNull(whlbnkXxz)){
  1099. handleXinYiWarningsSH(whlbnkXxz, whlb, BusinessEnum.WarningCategoryEnum.WHLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  1100. }
  1101. //最新的一条日报数据
  1102. /*List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(null);
  1103. if(CollectionUtils.isEmpty(tXinyiDailies))
  1104. return;//肯定不会出现这种情况 因为有很多历史数据了
  1105. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);*/
  1106. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  1107. if(Objects.isNull(tXinyiDaily))
  1108. return;//肯定不会出现这种情况 因为有很多历史数据了 新水厂可能会有这个问题
  1109. // log.info("生化报警获取日报的最新的一条数据为{}", JSON.toJSONString(tXinyiDaily));
  1110. //污泥浓度报警
  1111. BigDecimal sjscgkz = null;
  1112. //判断是否是夏季
  1113. if(LocalDateTimeUtil.isSummer())
  1114. sjscgkz = normConfig.getXjwnndXxz();
  1115. else
  1116. sjscgkz = normConfig.getDjwnndXxz();
  1117. //#1
  1118. BigDecimal oneMlss = tXinyiIndustry.getOneMlss();
  1119. if(!Objects.isNull(oneMlss) && !Objects.isNull(sjscgkz)){
  1120. handleXinYiWarningsSH(sjscgkz, oneMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_1.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1121. }
  1122. //#1
  1123. BigDecimal twoMlss = tXinyiIndustry.getTwoMlss();
  1124. if(!Objects.isNull(twoMlss) && !Objects.isNull(sjscgkz)){
  1125. handleXinYiWarningsSH(sjscgkz, twoMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_2.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1126. }
  1127. //污泥负荷(需要从日报获取数据) 计算 + 部分数据从日报获取
  1128. //污泥负荷=[Ls]=24*([BOD_in]-[BOD_off])*[Q_in]/[MLSS]/([V_hao]+[V_que]+[V_yan])/2 kgBOD/(kgMLSS·d)
  1129. //2024年6月27日17:18:33 直接从计算结果拿到
  1130. BigDecimal fm = xinyiCalculate.getFM();
  1131. //2024年6月28日17:17:03 已经配置了新的
  1132. BigDecimal wnfhnkXxz = normConfig.getWnfhnkXxz();
  1133. if(!Objects.isNull(fm) && !Objects.isNull(wnfhnkXxz)){
  1134. handleXinYiWarningsSH(wnfhnkXxz, fm, BusinessEnum.WarningCategoryEnum.WNFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.KGBOD_KGMLSS_D.getCode());
  1135. }
  1136. //万吨水产泥率(todo 没有计算规则,只能从日报获取)
  1137. //挥发性污泥浓度占比(MLVSS/MLSS)
  1138. //特殊:小于
  1139. BigDecimal hfxwnndzb = xinyiCalculate.getHFXWNNDZB();
  1140. BigDecimal hfxwnndzbSjz = normConfig.getHfxwnndzbSjz();
  1141. if(!Objects.isNull(hfxwnndzb) && !Objects.isNull(hfxwnndzbSjz)){
  1142. handleXinYiWarningsSH(hfxwnndzbSjz, hfxwnndzb, BusinessEnum.WarningCategoryEnum.HFXWNNDZB.getCode(), tXinyiIndustry, normConfig, false, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1143. }
  1144. //进水碳氮比
  1145. BigDecimal jsTdb = xinyiCalculate.getJsTdb();
  1146. BigDecimal jstdbnkzXxz = normConfig.getJstdbnkzXxz();
  1147. if(!Objects.isNull(jsTdb) && !Objects.isNull(jstdbnkzXxz)){
  1148. handleXinYiWarningsSH(jstdbnkzXxz, jsTdb, BusinessEnum.WarningCategoryEnum.TDB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1149. }
  1150. //进水碳磷比
  1151. BigDecimal jsTlb = xinyiCalculate.getJsTlb();
  1152. BigDecimal jstlbNkz = normConfig.getJstlbNkz();
  1153. if(!Objects.isNull(jsTlb) && !Objects.isNull(jstlbNkz)){
  1154. handleXinYiWarningsSH(jstlbNkz, jsTlb, BusinessEnum.WarningCategoryEnum.TLB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1155. }
  1156. //进水BOD与COD比值(生化性)
  1157. BigDecimal jsBodBCod = xinyiCalculate.getJsBodBCod();
  1158. String jsbodycodbzGkz = normConfig.getJsbodycodbzGkz();
  1159. if(!StringUtils.isBlank(jsbodycodbzGkz) && jsbodycodbzGkz.contains("-")){
  1160. String[] split = jsbodycodbzGkz.split("-");
  1161. sjscgkz = new BigDecimal(split[0]);
  1162. if(!Objects.isNull(jsBodBCod)){
  1163. handleXinYiWarningsSH(sjscgkz, jsBodBCod, BusinessEnum.WarningCategoryEnum.BODCODB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.NULL.getCode());
  1164. }
  1165. }
  1166. //好氧区DO(一池) 2024年5月31日14:04:37 加数据,让他一直报警
  1167. BigDecimal shcHyOneDo = tXinyiIndustry.getOneHymdDo();
  1168. // BigDecimal shcHyOneDo = new BigDecimal("5");
  1169. // BigDecimal hycrjysjzSxz = normConfig.getHycrjysjzSxz();
  1170. BigDecimal hycrjyNkz = normConfig.getHycrjyNkz();
  1171. if(!Objects.isNull(shcHyOneDo) && !Objects.isNull(hycrjyNkz)){
  1172. handleXinYiWarningsSH(hycrjyNkz, shcHyOneDo, BusinessEnum.WarningCategoryEnum.HYQDO_ONE.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1173. }
  1174. //好氧区DO(二池) 2024年5月31日14:09:36 溶解氧从日报获取 工业的不准
  1175. //2024年6月27日17:00:31 都先从工业库获取,日报没有必要再报警了
  1176. BigDecimal shcHyTwoDo = tXinyiIndustry.getTwoHymdDo();
  1177. if(!Objects.isNull(shcHyTwoDo) && !Objects.isNull(hycrjyNkz)){
  1178. handleXinYiWarningsSH(hycrjyNkz, shcHyTwoDo, BusinessEnum.WarningCategoryEnum.HYQDO_TWO.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.MG_L.getCode());
  1179. }
  1180. //气水比
  1181. BigDecimal qsb = xinyiCalculate.getQSB();
  1182. BigDecimal shcqbNkz = normConfig.getShcqbNkz();
  1183. if(!Objects.isNull(qsb) && !Objects.isNull(shcqbNkz))
  1184. handleXinYiWarningsSH(shcqbNkz, qsb, BusinessEnum.WarningCategoryEnum.QSB.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.M3_M3.getCode());
  1185. //二沉池表面负荷
  1186. BigDecimal eccBmfh = xinyiCalculate.getEccBmfh();
  1187. BigDecimal eccbmfhznkzXxz = normConfig.getEccbmfhznkzXxz();
  1188. if(!Objects.isNull(eccBmfh) && !Objects.isNull(eccbmfhznkzXxz)){
  1189. handleXinYiWarningsSH(eccbmfhznkzXxz, eccBmfh, BusinessEnum.WarningCategoryEnum.ECC_BMFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.M3_M2_H.getCode());
  1190. }
  1191. //二沉池固体负荷
  1192. BigDecimal eccGtfh = xinyiCalculate.getEccGtfh();
  1193. BigDecimal eccgtfhnkxxz = normConfig.getECCGTFHNKXXZ();
  1194. if(!Objects.isNull(eccGtfh) && !Objects.isNull(eccgtfhnkxxz)){
  1195. handleXinYiWarningsSH(eccgtfhnkxxz, eccGtfh, BusinessEnum.WarningCategoryEnum.ECC_GTFH.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.KG_M2_D.getCode());
  1196. }
  1197. //反冲洗水量
  1198. //2024年7月3日10:59:32 这里用反冲洗水量比例做计算
  1199. BigDecimal fcxslBl = xinyiCalculate.getFCXSLBL();
  1200. BigDecimal fcxslblsjzXxz = normConfig.getFcxslblsjzXxz();
  1201. if(!Objects.isNull(fcxslBl) && !Objects.isNull(fcxslblsjzXxz))
  1202. handleXinYiWarningsSH(fcxslblsjzXxz, fcxslBl, BusinessEnum.WarningCategoryEnum.FCXSL.getCode(), tXinyiIndustry, normConfig, true, BusinessEnum.BigModelUnitEnum.PERCENT.getCode());
  1203. }
  1204. /**
  1205. * 处理信义生化报警的逻辑 统一处理
  1206. * @param sjscgkz :实际生产管控值
  1207. * @param currentVal
  1208. * @param category
  1209. * @param tXinyiIndustry
  1210. * @param normConfig
  1211. * @param normal 是否常规判断:默认都是超过;只有这个挥发性污泥浓度占比(VSS/SS)是小于才报警
  1212. * 2024年6月27日15:39:15 调整:生化报警只取实际生产管控指标
  1213. * 2024年7月11日10:44:11 新增单位unit 拼接完单位以后返回
  1214. *
  1215. */
  1216. private void handleXinYiWarningsSH(BigDecimal sjscgkz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Boolean normal, String unit) {
  1217. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  1218. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  1219. tXinyiWarningRecord.setStatus(0);
  1220. tXinyiWarningRecord.setType(1);
  1221. tXinyiWarningRecord.setCategory(category);
  1222. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  1223. tXinyiWarningRecord.setWarningVal(currentVal);
  1224. tXinyiWarningRecord.setDesignVal(sjscgkz);
  1225. tXinyiWarningRecord.setControlVal(sjscgkz);
  1226. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1227. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  1228. tXinyiWarningRecord.setRemark(ONE_SH_WARNING.getCode());
  1229. //2024年6月27日17:36:25 有一个判断是反正的
  1230. if(normal){
  1231. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1232. if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
  1233. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1234. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1235. } else if (currentVal.compareTo(sjscgkz) > 0) {//一级
  1236. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1237. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1238. } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
  1239. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1240. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1241. } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
  1242. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1243. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1244. }*/ else {
  1245. tXinyiWarningRecord = null;//这种的无需处理
  1246. }
  1247. }else{
  1248. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  1249. if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
  1250. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  1251. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  1252. } else if (currentVal.compareTo(sjscgkz) < 0) {//一级
  1253. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1254. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  1255. } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
  1256. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  1257. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  1258. } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
  1259. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  1260. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  1261. }*/ else {
  1262. tXinyiWarningRecord = null;//这种的无需处理
  1263. }
  1264. }
  1265. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  1266. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(1).category(category).status(0).build());
  1267. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  1268. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1269. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  1270. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  1271. xinyiWarningRecord.setStatus(2);
  1272. Date nowDate = DateUtils.getNowDate();
  1273. xinyiWarningRecord.setOffTime(nowDate);
  1274. xinyiWarningRecord.setUpdateTime(nowDate);
  1275. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1276. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1277. }
  1278. }
  1279. }else{//有新的告警信息
  1280. Date nowDate = DateUtils.getNowDate();
  1281. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  1282. //保存到数据库中
  1283. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  1284. tXinyiWarningRecord.setUpdateTime(nowDate);
  1285. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1286. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1287. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1288. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1289. }else {
  1290. //继续调用决策(普通问答)
  1291. this.askBigModelForSHWarning(tXinyiWarningRecord, tXinyiIndustry, normConfig, unit);
  1292. }
  1293. }else{
  1294. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  1295. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  1296. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  1297. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  1298. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1299. }else {
  1300. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  1301. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  1302. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  1303. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  1304. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  1305. xinyiWarningRecord.setUpdateTime(nowDate);
  1306. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1307. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  1308. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  1309. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  1310. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  1311. //更新数据库
  1312. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1313. //继续调用决策(普通问答)
  1314. this.askBigModelForSHWarning(xinyiWarningRecord, tXinyiIndustry, normConfig, unit);
  1315. }
  1316. }
  1317. }
  1318. }
  1319. }
  1320. public void handleSZWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  1321. //出水相关
  1322. //出水COD报警
  1323. //2025年02月14日10:22:05 计算出相应的超污染物限制 和 超污染物负荷值,然后传到下一个方法,否则下一个方法很多判断
  1324. BigDecimal csCod = tXinyiIndustry.getCsCod();
  1325. BigDecimal cscodBzz = normConfig.getCscodBzz();
  1326. BigDecimal cscodGkz = normConfig.getCscodGkz();
  1327. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  1328. BigDecimal jsslSjz = normConfig.getJsslSjz();
  1329. BigDecimal cszlBzz = normConfig.getCszlBzz();
  1330. BigDecimal cszlGkz = normConfig.getCszlGkz();
  1331. BigDecimal cszzBzz = normConfig.getCszzBzz();
  1332. BigDecimal cszzGkz = normConfig.getCszzGkz();
  1333. BigDecimal csadBzz = normConfig.getCsadBzz();
  1334. BigDecimal csadGkz = normConfig.getCsadGkz();
  1335. BigDecimal csSSBzz = normConfig.getCsssBzz();
  1336. BigDecimal csssGkz = normConfig.getCsssGkz();
  1337. BigDecimal jszlSjz = normConfig.getJszlSjz();
  1338. BigDecimal jszdSjz = normConfig.getJszdSjz();
  1339. BigDecimal jscodSjz = normConfig.getJscodSjz();
  1340. BigDecimal jsadSjz = normConfig.getJsadSjz();
  1341. BigDecimal jsSSSjz = normConfig.getJsssSjz();
  1342. //2025年02月20日11:19:17 累计的断点数量
  1343. int breakpointCount = 0;
  1344. int noChange = 0;
  1345. List<TXinyiWarningRecord> breakPointList = new ArrayList<>();//断点集合
  1346. List<TXinyiWarningRecord> noChangeList = new ArrayList<>();//连续不变集合
  1347. //2025年02月27日16:17:47 标识进出水的指标是否可以进行后续的报警
  1348. boolean csCodExecute = true;
  1349. boolean csZLExecute = true;
  1350. boolean csZDExecute = true;
  1351. boolean csADExecute = true;
  1352. boolean csSSExecute = true;
  1353. boolean jsZLExecute = true;
  1354. boolean jsCodExecute = true;
  1355. boolean jsZDExecute = true;
  1356. boolean jsADExecute = true;
  1357. boolean jsSSExecute = true;
  1358. //出水cod超标报警
  1359. WarningMoreExceed warningMoreExceed = handleXinYiWarningsCsMore(cscodBzz, csCod, cscodGkz, CS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
  1360. if(warningMoreExceed.isBreakpoint()){
  1361. breakpointCount++;
  1362. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1363. }
  1364. if(warningMoreExceed.isNoChange()){
  1365. noChange++;
  1366. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1367. }
  1368. //出水总磷超标报警
  1369. BigDecimal csTp = tXinyiIndustry.getCsTp();
  1370. warningMoreExceed = handleXinYiWarningsCsMore(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  1371. if(warningMoreExceed.isBreakpoint()){
  1372. breakpointCount++;
  1373. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1374. }
  1375. if(warningMoreExceed.isNoChange()){
  1376. noChange++;
  1377. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1378. }
  1379. //出水总氮超标报警
  1380. BigDecimal csTn = tXinyiIndustry.getCsTn();
  1381. warningMoreExceed = handleXinYiWarningsCsMore(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  1382. if(warningMoreExceed.isBreakpoint()){
  1383. breakpointCount++;
  1384. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1385. }
  1386. if(warningMoreExceed.isNoChange()){
  1387. noChange++;
  1388. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1389. }
  1390. //出水氨氮超标报警
  1391. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  1392. warningMoreExceed = handleXinYiWarningsCsMore(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  1393. if(warningMoreExceed.isBreakpoint()){
  1394. breakpointCount++;
  1395. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1396. }
  1397. if(warningMoreExceed.isNoChange()){
  1398. noChange++;
  1399. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1400. }
  1401. //出水SS超标报警
  1402. BigDecimal csSS = tXinyiIndustry.getCsSs();
  1403. warningMoreExceed = handleXinYiWarningsCsMore(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
  1404. if(warningMoreExceed.isBreakpoint()){
  1405. breakpointCount++;
  1406. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1407. }
  1408. if(warningMoreExceed.isNoChange()){
  1409. noChange++;
  1410. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1411. }
  1412. //进水相关报警
  1413. //进水总磷超标报警
  1414. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  1415. warningMoreExceed = handleXinYiWarningRecordJSMore(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  1416. if(warningMoreExceed.isBreakpoint()){
  1417. breakpointCount++;
  1418. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1419. }
  1420. if(warningMoreExceed.isNoChange()){
  1421. noChange++;
  1422. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1423. }
  1424. //进水COD超标报警
  1425. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  1426. warningMoreExceed = handleXinYiWarningRecordJSMore(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
  1427. if(warningMoreExceed.isBreakpoint()){
  1428. breakpointCount++;
  1429. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1430. }
  1431. if(warningMoreExceed.isNoChange()){
  1432. noChange++;
  1433. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1434. }
  1435. //进水总氮超标报警
  1436. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  1437. warningMoreExceed = handleXinYiWarningRecordJSMore(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  1438. if(warningMoreExceed.isBreakpoint()){
  1439. breakpointCount++;
  1440. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1441. }
  1442. if(warningMoreExceed.isNoChange()){
  1443. noChange++;
  1444. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1445. }
  1446. //进水氨氮超标报警
  1447. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  1448. warningMoreExceed = handleXinYiWarningRecordJSMore(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  1449. if(warningMoreExceed.isBreakpoint()){
  1450. breakpointCount++;
  1451. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1452. }
  1453. if(warningMoreExceed.isNoChange()){
  1454. noChange++;
  1455. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1456. }
  1457. //进水SS超标报警
  1458. BigDecimal jsSS = tXinyiIndustry.getJsSs();
  1459. warningMoreExceed = handleXinYiWarningRecordJSMore(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
  1460. if(warningMoreExceed.isBreakpoint()){
  1461. breakpointCount++;
  1462. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  1463. }
  1464. if(warningMoreExceed.isNoChange()){
  1465. noChange++;
  1466. noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
  1467. }
  1468. Date nowDate = DateUtils.getNowDate();
  1469. //下面是处理多个指标的 【断点】和 连续不变的报警
  1470. //断点
  1471. //2025年02月28日13:45:49 逻辑调整:多指标断点/联系不变 也要记录对应的化验类型 所以下面可以查询出来多个
  1472. TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode()).status(0).build();
  1473. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecord);
  1474. if(breakpointCount < 1){//恢复正常 关闭多个断点报警
  1475. //关闭之前的多个 多指标断点报警
  1476. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1477. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
  1478. closeWarning(tXinyiWarningRecord);
  1479. }
  1480. }
  1481. }else if(breakpointCount == 1){//只有单个的断点
  1482. TXinyiWarningRecord warningRecordBreakPointOne = breakPointList.get(0);
  1483. String category = warningRecordBreakPointOne.getCategory();
  1484. TXinyiWarningRecord warningRecordReq = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
  1485. List<TXinyiWarningRecord> tXinyiBreakPointSingleWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordReq);
  1486. //关闭同类型的其他报警
  1487. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  1488. //触发报警 并且模拟大模型返回决策问答数据
  1489. if(CollectionUtils.isEmpty(tXinyiBreakPointSingleWarningRecords)){
  1490. //插入该类型报警
  1491. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordBreakPointOne);
  1492. //同时处理决策 不用调用大模型,本地处理问答
  1493. addChatRecordByBreakPointsSingle(warningRecordBreakPointOne, tXinyiIndustry, normConfig, category);
  1494. }else{
  1495. log.info("工业库报警的时候,发现存在仪表故障(断点不变单个指标)的报警,并且已经有该类型报警了,不做任何处理");
  1496. //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
  1497. TXinyiWarningRecord xinyiWarningRecord = tXinyiBreakPointSingleWarningRecords.get(0);
  1498. xinyiWarningRecord.setWarningVal(warningRecordBreakPointOne.getWarningVal());
  1499. xinyiWarningRecord.setTime(warningRecordBreakPointOne.getTime());
  1500. xinyiWarningRecord.setUpdateTime(nowDate);
  1501. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1502. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  1503. xinyiWarningRecord.setReason(warningRecordBreakPointOne.getReason());
  1504. //更新数据库
  1505. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1506. //继续调用决策【本地模拟的决策】
  1507. addChatRecordByBreakPointsSingle(xinyiWarningRecord, tXinyiIndustry, normConfig, category);
  1508. }
  1509. //额外判断当前的异常是哪个指标,并处理标识
  1510. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  1511. csCodExecute = false;
  1512. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  1513. csZLExecute = false;
  1514. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  1515. csZDExecute = false;
  1516. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  1517. csADExecute = false;
  1518. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  1519. csSSExecute = false;
  1520. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  1521. jsZLExecute = false;
  1522. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  1523. jsCodExecute = false;
  1524. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  1525. jsZDExecute = false;
  1526. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  1527. jsADExecute = false;
  1528. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  1529. jsSSExecute = false;
  1530. }else{
  1531. log.error("处理是否后续报警的报警类型是不支持的类型");
  1532. throw new ServiceException("处理是否后续报警的报警类型是不支持的类型");
  1533. }
  1534. //关闭之前的多个 多指标断点报警
  1535. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1536. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
  1537. closeWarning(tXinyiWarningRecord);
  1538. }
  1539. }
  1540. }else{
  1541. //将其他类型的报警全部关闭
  1542. //2025年02月27日17:09:56 此场景不关闭其他报警
  1543. // closeOtherWarningsBySymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
  1544. //再新增新的类型的报警
  1545. /*if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1546. //插入该类型报警
  1547. warningRecord.setType(0);
  1548. String msg = BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getMsg();
  1549. warningRecord.setCategory(msg);
  1550. warningRecord.setTime(nowDate);
  1551. warningRecord.setReason(msg);
  1552. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
  1553. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  1554. warningRecord.setCreateTime(nowDate);
  1555. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  1556. //同时处理决策 不用调用大模型,本地处理问答
  1557. addChatRecordByBreakPointsMore(warningRecord, tXinyiIndustry, normConfig);
  1558. }else{
  1559. log.info("工业库报警的时候,发现存在仪表故障(断点多个指标)的报警,并且已经有该类型报警了,不做任何处理");
  1560. }
  1561. log.info("工业库报警的时候,发现存在仪表故障(断点多个指标)的报警,其他报警不再处理");
  1562. return;*/
  1563. //逻辑调整:要按指标报多指标断点 需要当前的集合和原来的集合判断,新的报警增加,如果之前有了报警则不处理
  1564. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
  1565. //新增的断点的数据全部都报警
  1566. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointList) {
  1567. String category = tXinyiWarningRecord.getCategory();
  1568. //判断那些指标不能再次执行
  1569. //额外判断当前的异常是哪个指标,并处理标识
  1570. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  1571. csCodExecute = false;
  1572. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  1573. csZLExecute = false;
  1574. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  1575. csZDExecute = false;
  1576. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  1577. csADExecute = false;
  1578. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  1579. csSSExecute = false;
  1580. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  1581. jsZLExecute = false;
  1582. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  1583. jsCodExecute = false;
  1584. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  1585. jsZDExecute = false;
  1586. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  1587. jsADExecute = false;
  1588. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  1589. jsSSExecute = false;
  1590. }else{
  1591. log.error("处理是否后续报警的报警类型是不支持的类型");
  1592. throw new ServiceException("处理是否后续报警的报警类型是不支持的类型");
  1593. }
  1594. //关闭该指标的其他类型的报警
  1595. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
  1596. //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
  1597. tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getMsg());
  1598. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
  1599. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1600. //同时处理决策 不用调用大模型,本地处理问答
  1601. addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1602. }
  1603. }else{//之前存在报警了 所以需要2个集合数据进行匹配,如果新的和原来的一样则不用做任何操作【持续报警】;如果不一样,则新的要报警,老报警要关闭
  1604. List<TXinyiWarningRecord> breakPointListNew = new ArrayList<>(breakPointList);//断点集合[需要新增的]
  1605. breakPointListNew.removeAll(tXinyiWarningRecords);
  1606. List<TXinyiWarningRecord> breakPointListClose = new ArrayList<>(tXinyiWarningRecords);//断点集合[需要关闭的] 还有2这重叠的,这种重叠的,是不需要做任何操作的,持续报警
  1607. breakPointListClose.removeAll(breakPointList);
  1608. //插入新的报警
  1609. if(!CollectionUtils.isEmpty(breakPointListNew)){
  1610. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListNew) {
  1611. String category = tXinyiWarningRecord.getCategory();
  1612. //判断那些指标不能再次执行
  1613. //额外判断当前的异常是哪个指标,并处理标识
  1614. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  1615. csCodExecute = false;
  1616. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  1617. csZLExecute = false;
  1618. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  1619. csZDExecute = false;
  1620. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  1621. csADExecute = false;
  1622. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  1623. csSSExecute = false;
  1624. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  1625. jsZLExecute = false;
  1626. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  1627. jsCodExecute = false;
  1628. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  1629. jsZDExecute = false;
  1630. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  1631. jsADExecute = false;
  1632. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  1633. jsSSExecute = false;
  1634. }else{
  1635. log.error("处理是否后续报警的报警类型是不支持的类型");
  1636. throw new ServiceException("处理是否后续报警的报警类型是不支持的类型");
  1637. }
  1638. //关闭该指标的其他类型的报警
  1639. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
  1640. //新插入
  1641. //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
  1642. tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getMsg());
  1643. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
  1644. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1645. //同时处理决策 不用调用大模型,本地处理问答
  1646. addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1647. }
  1648. }
  1649. //关闭老的报警
  1650. if(!CollectionUtils.isEmpty(breakPointListClose)){
  1651. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListClose) {
  1652. //老的报警,新的没有出现,关闭
  1653. closeWarning(tXinyiWarningRecord);
  1654. }
  1655. }
  1656. //2025年03月06日10:56:41 需要额外记录哪些是历史报警,现在仍然报警的,这种的更新部分信息,更新决策内容
  1657. List<TXinyiWarningRecord> breakPointListContinue = new ArrayList<>(tXinyiWarningRecords);
  1658. breakPointListContinue.removeAll(breakPointListNew);
  1659. if(!CollectionUtils.isEmpty(breakPointListContinue)){
  1660. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListContinue) {
  1661. //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
  1662. //需要匹配新的报警中的最新的值
  1663. String category = tXinyiWarningRecord.getCategory();
  1664. TXinyiWarningRecord tXinyiWarningRecordContinue = tXinyiWarningRecord;//兜底处理
  1665. Optional<TXinyiWarningRecord> optional = breakPointListNew.stream().filter(r -> category.equals(r.getCategory())).findAny();
  1666. if(optional.isPresent()){
  1667. tXinyiWarningRecordContinue = optional.get();
  1668. log.info("存在之前多指标断点,现在仍然断点的数据{}", JSON.toJSONString(tXinyiWarningRecordContinue));
  1669. }
  1670. tXinyiWarningRecord.setWarningVal(tXinyiWarningRecordContinue.getWarningVal());
  1671. tXinyiWarningRecord.setTime(tXinyiWarningRecordContinue.getTime());
  1672. tXinyiWarningRecord.setUpdateTime(nowDate);
  1673. tXinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1674. //从单指标变成多指标 这个不可以修改
  1675. // tXinyiWarningRecord.setReason(tXinyiWarningRecordContinue.getReason());
  1676. //更新数据库
  1677. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
  1678. //继续调用决策【本地模拟的决策】
  1679. addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1680. }
  1681. }
  1682. }
  1683. //如果出现多指标问题,后续的报警不再处理
  1684. // return;
  1685. //2025年03月03日16:07:09 不是其他报警都不执行,只是出现异常的问题不再进行报警,其他的还需要再次报警
  1686. }
  1687. //连续不变
  1688. TXinyiWarningRecord warningRecordNoChangeMore = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode()).status(0).build();
  1689. List<TXinyiWarningRecord> tXinyiWarningNoChangeMoreRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordNoChangeMore);
  1690. if(noChange < 1){//恢复正常,关闭多个连续不变报警
  1691. //关闭之前的多个 多指标断点报警
  1692. if(!CollectionUtils.isEmpty(tXinyiWarningNoChangeMoreRecords)){
  1693. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningNoChangeMoreRecords) {
  1694. closeWarning(tXinyiWarningRecord);
  1695. }
  1696. }
  1697. }else if(noChange == 1){
  1698. TXinyiWarningRecord noChangeWarningRecord = noChangeList.get(0);
  1699. String category = noChangeWarningRecord.getCategory();
  1700. TXinyiWarningRecord warningRecordReq = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode()).status(0).build();
  1701. List<TXinyiWarningRecord> tXinyiNoChangeSingleWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordReq);
  1702. //关闭同类型的其他报警
  1703. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode());
  1704. //触发报警 并且模拟大模型返回决策问答数据
  1705. if(CollectionUtils.isEmpty(tXinyiNoChangeSingleWarningRecords)){
  1706. //插入该类型报警
  1707. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(noChangeWarningRecord);
  1708. //同时处理决策 不用调用大模型,本地处理问答
  1709. addChatRecordByNoChangeSingle(noChangeWarningRecord, tXinyiIndustry, normConfig, category);
  1710. }else{
  1711. log.info("工业库报警的时候,发现存在仪表故障(连续不变单个指标)的报警,并且已经有该类型报警了,不做任何处理");
  1712. //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
  1713. TXinyiWarningRecord xinyiWarningRecord = tXinyiNoChangeSingleWarningRecords.get(0);
  1714. xinyiWarningRecord.setWarningVal(noChangeWarningRecord.getWarningVal());
  1715. xinyiWarningRecord.setTime(noChangeWarningRecord.getTime());
  1716. xinyiWarningRecord.setUpdateTime(nowDate);
  1717. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1718. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  1719. xinyiWarningRecord.setReason(noChangeWarningRecord.getReason());
  1720. //更新数据库
  1721. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  1722. //继续调用决策【本地模拟的决策】
  1723. addChatRecordByNoChangeSingle(xinyiWarningRecord, tXinyiIndustry, normConfig, category);
  1724. }
  1725. //额外判断当前的异常是哪个指标,并处理标识
  1726. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  1727. csCodExecute = false;
  1728. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  1729. csZLExecute = false;
  1730. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  1731. csZDExecute = false;
  1732. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  1733. csADExecute = false;
  1734. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  1735. csSSExecute = false;
  1736. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  1737. jsZLExecute = false;
  1738. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  1739. jsCodExecute = false;
  1740. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  1741. jsZDExecute = false;
  1742. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  1743. jsADExecute = false;
  1744. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  1745. jsSSExecute = false;
  1746. }else{
  1747. log.error("处理是否后续报警的报警类型是不支持的类型");
  1748. throw new ServiceException("处理是否后续报警的报警类型是不支持的类型");
  1749. }
  1750. //关闭之前的多个 多指标断点报警
  1751. if(!CollectionUtils.isEmpty(tXinyiWarningNoChangeMoreRecords)){
  1752. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningNoChangeMoreRecords) {
  1753. closeWarning(tXinyiWarningRecord);
  1754. }
  1755. }
  1756. }else{
  1757. //将其他类型的报警全部关闭
  1758. //2025年02月27日17:09:56 此场景不关闭其他报警
  1759. // closeOtherWarningsBySymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
  1760. //触发 多个连续不变报警
  1761. /*if(CollectionUtils.isEmpty(tXinyiWarningNoChangeMoreRecords)){
  1762. //插入该类型报警
  1763. warningRecordNoChangeMore.setType(0);
  1764. String msg = BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getMsg();
  1765. warningRecordNoChangeMore.setCategory(msg);
  1766. warningRecordNoChangeMore.setTime(nowDate);
  1767. warningRecordNoChangeMore.setReason(msg);
  1768. warningRecordNoChangeMore.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
  1769. warningRecordNoChangeMore.setCreateBy(WARNING_DEFAULT_CREATE);
  1770. warningRecordNoChangeMore.setCreateTime(nowDate);
  1771. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordNoChangeMore);
  1772. //同时处理决策 不用调用大模型,本地处理问答
  1773. addChatRecordByNoChangeMore(warningRecordNoChangeMore, tXinyiIndustry, normConfig);
  1774. }else{
  1775. log.info("工业库报警的时候,发现存在仪表故障(连续不变多个指标)的报警,并且已经有该类型报警了,不做任何处理");
  1776. }
  1777. log.info("发现存在仪表故障(连续不变多个指标)的报警,其他报警不再处理");
  1778. return;*/
  1779. //逻辑调整:要按指标报多指标断点 需要当前的集合和原来的集合判断,新的报警增加,如果之前有了报警则不处理
  1780. if(CollectionUtils.isEmpty(tXinyiWarningNoChangeMoreRecords)){
  1781. //新增的断点的数据全部都报警
  1782. for (TXinyiWarningRecord tXinyiWarningRecord : noChangeList) {
  1783. String category = tXinyiWarningRecord.getCategory();
  1784. //判断那些指标不能再次执行
  1785. //额外判断当前的异常是哪个指标,并处理标识
  1786. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  1787. csCodExecute = false;
  1788. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  1789. csZLExecute = false;
  1790. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  1791. csZDExecute = false;
  1792. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  1793. csADExecute = false;
  1794. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  1795. csSSExecute = false;
  1796. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  1797. jsZLExecute = false;
  1798. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  1799. jsCodExecute = false;
  1800. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  1801. jsZDExecute = false;
  1802. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  1803. jsADExecute = false;
  1804. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  1805. jsSSExecute = false;
  1806. }else{
  1807. log.error("处理是否后续报警的报警类型是不支持的类型");
  1808. throw new ServiceException("处理是否后续报警的报警类型是不支持的类型");
  1809. }
  1810. //关闭该指标的其他类型的报警
  1811. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
  1812. //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
  1813. tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getMsg());
  1814. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
  1815. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1816. //同时处理决策 不用调用大模型,本地处理问答
  1817. addChatRecordByNoChangeMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1818. }
  1819. }else{//之前存在报警了 所以需要2个集合数据进行匹配,如果新的和原来的一样则不用做任何操作【持续报警】;如果不一样,则新的要报警,老报警要关闭
  1820. List<TXinyiWarningRecord> noChangeListNew = new ArrayList<>(noChangeList);//断点集合[需要新增的]
  1821. noChangeListNew.removeAll(tXinyiWarningNoChangeMoreRecords);
  1822. List<TXinyiWarningRecord> noChangeListClose = new ArrayList<>(tXinyiWarningNoChangeMoreRecords);//断点集合[需要关闭的] 还有2这重叠的,这种重叠的,是不需要做任何操作的,持续报警
  1823. noChangeListClose.removeAll(noChangeList);
  1824. //插入新的报警
  1825. if(!CollectionUtils.isEmpty(noChangeListNew)){
  1826. for (TXinyiWarningRecord tXinyiWarningRecord : noChangeListNew) {
  1827. String category = tXinyiWarningRecord.getCategory();
  1828. //判断那些指标不能再次执行
  1829. //额外判断当前的异常是哪个指标,并处理标识
  1830. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  1831. csCodExecute = false;
  1832. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  1833. csZLExecute = false;
  1834. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  1835. csZDExecute = false;
  1836. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  1837. csADExecute = false;
  1838. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  1839. csSSExecute = false;
  1840. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  1841. jsZLExecute = false;
  1842. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  1843. jsCodExecute = false;
  1844. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  1845. jsZDExecute = false;
  1846. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  1847. jsADExecute = false;
  1848. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  1849. jsSSExecute = false;
  1850. }else{
  1851. log.error("处理是否后续报警的报警类型是不支持的类型");
  1852. throw new ServiceException("处理是否后续报警的报警类型是不支持的类型");
  1853. }
  1854. //关闭该指标的其他类型的报警
  1855. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
  1856. //新插入
  1857. //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
  1858. tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getMsg());
  1859. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
  1860. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  1861. //同时处理决策 不用调用大模型,本地处理问答
  1862. addChatRecordByNoChangeMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1863. }
  1864. }
  1865. //关闭老的报警
  1866. if(!CollectionUtils.isEmpty(noChangeListClose)){
  1867. for (TXinyiWarningRecord tXinyiWarningRecord : noChangeListClose) {
  1868. //老的报警,新的没有出现,关闭
  1869. closeWarning(tXinyiWarningRecord);
  1870. }
  1871. }
  1872. //2025年03月06日10:56:41 需要额外记录哪些是历史报警,现在仍然报警的,这种的更新部分信息,更新决策内容
  1873. List<TXinyiWarningRecord> noChangeListContinue = new ArrayList<>(tXinyiWarningRecords);
  1874. noChangeListContinue.removeAll(noChangeListNew);
  1875. if(!CollectionUtils.isEmpty(noChangeListContinue)){
  1876. for (TXinyiWarningRecord tXinyiWarningRecord : noChangeListContinue) {
  1877. //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
  1878. //需要匹配新的报警中的最新的值
  1879. String category = tXinyiWarningRecord.getCategory();
  1880. TXinyiWarningRecord tXinyiWarningRecordContinue = tXinyiWarningRecord;//兜底处理
  1881. Optional<TXinyiWarningRecord> optional = noChangeListNew.stream().filter(r -> category.equals(r.getCategory())).findAny();
  1882. if(optional.isPresent()){
  1883. tXinyiWarningRecordContinue = optional.get();
  1884. log.info("存在之前多指标连续不变的数据,现在仍然连续不变的数据{}", JSON.toJSONString(tXinyiWarningRecordContinue));
  1885. }
  1886. tXinyiWarningRecord.setWarningVal(tXinyiWarningRecordContinue.getWarningVal());
  1887. tXinyiWarningRecord.setTime(tXinyiWarningRecordContinue.getTime());
  1888. tXinyiWarningRecord.setUpdateTime(nowDate);
  1889. tXinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  1890. //从单指标变成多指标 这个不可以修改
  1891. // tXinyiWarningRecord.setReason(tXinyiWarningRecordContinue.getReason());
  1892. //更新数据库
  1893. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
  1894. //继续调用决策【本地模拟的决策】
  1895. addChatRecordByNoChangeMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  1896. }
  1897. }
  1898. }
  1899. //如果出现多指标问题,后续的报警不再处理
  1900. // return;
  1901. //2025年03月03日16:07:09 不是其他报警都不执行,只是出现异常的问题不再进行报警,其他的还需要再次报警
  1902. }
  1903. //开始走正常的水质报警 + 突变
  1904. //2025年02月27日15:33:39 加上校验:此次的检查指标必须是不存在断点且不存在连续不变才执行下面的报警。
  1905. //没有断点,且没有连续不变,全部执行
  1906. /*if(breakpointCount < 1 && noChange < 1){
  1907. handleXinYiWarningsCsOrigin(cscodBzz, csCod, cscodGkz, CS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
  1908. handleXinYiWarningsCsOrigin(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  1909. handleXinYiWarningsCsOrigin(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  1910. handleXinYiWarningsCsOrigin(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  1911. handleXinYiWarningsCsOrigin(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
  1912. handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  1913. handleXinYiWarningRecordJSOrigin(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
  1914. handleXinYiWarningRecordJSOrigin(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  1915. handleXinYiWarningRecordJSOrigin(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  1916. handleXinYiWarningRecordJSOrigin(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
  1917. }*/
  1918. //如果只有单一的报警,只有该指标不再进行报警,其他的指标还是要报警的
  1919. /*if(breakpointCount == 1 && noChange == 0){//只有断点
  1920. }
  1921. if(breakpointCount == 0 && noChange == 1){//只有连续不变
  1922. }
  1923. if(breakpointCount == 1 && noChange == 1){//既有断点,又有连续不变 【可能是相同的指标,也可能是不同的指标】
  1924. }*/
  1925. //综合上面3中情况,断点和连续不变的,2个报警类型至少有一个报警,且只能有一个指标报警
  1926. //上述逻辑存在bug:如果是不同的指标 比如出水cod断点 出水ss连续不变 则无法处理。 所以决定进出水的指标是否报警,需要每个知道都要单独记录,只要存在异常项就不能再走 异常升高/偏低/普通的报警了
  1927. //后续的指标是否往下进行,用新的逻辑:
  1928. if(csCodExecute && !Objects.isNull(cscodBzz) && cscodBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(cscodGkz) && cscodGkz.compareTo(BigDecimal.ZERO) > 0)
  1929. handleXinYiWarningsCsOrigin(cscodBzz, csCod, cscodGkz, CS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
  1930. if(csZLExecute && !Objects.isNull(cszlBzz) && cszlBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(cszlGkz) && cszlGkz.compareTo(BigDecimal.ZERO) > 0)
  1931. handleXinYiWarningsCsOrigin(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  1932. if(csZDExecute && !Objects.isNull(cszzBzz) && cszzBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(cszzGkz) && cszzGkz.compareTo(BigDecimal.ZERO) > 0)
  1933. handleXinYiWarningsCsOrigin(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  1934. if(csADExecute && !Objects.isNull(csadBzz) && csadBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(csadGkz) && csadGkz.compareTo(BigDecimal.ZERO) > 0)
  1935. handleXinYiWarningsCsOrigin(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  1936. if(csSSExecute && !Objects.isNull(csSSBzz) && csSSBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(csssGkz) && csssGkz.compareTo(BigDecimal.ZERO) > 0)
  1937. handleXinYiWarningsCsOrigin(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
  1938. if(jsZLExecute && !Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
  1939. handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  1940. if(jsCodExecute && !Objects.isNull(jscodSjz) && jscodSjz.compareTo(BigDecimal.ZERO) > 0)
  1941. handleXinYiWarningRecordJSOrigin(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
  1942. if(jsZDExecute && !Objects.isNull(jszdSjz) && jszdSjz.compareTo(BigDecimal.ZERO) > 0)
  1943. handleXinYiWarningRecordJSOrigin(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  1944. if(jsADExecute && !Objects.isNull(jsadSjz) && jsadSjz.compareTo(BigDecimal.ZERO) > 0)
  1945. handleXinYiWarningRecordJSOrigin(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  1946. if(jsSSExecute && !Objects.isNull(jsSSSjz) && jsSSSjz.compareTo(BigDecimal.ZERO) > 0)
  1947. handleXinYiWarningRecordJSOrigin(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
  1948. }
  1949. private void askBigModelForSHWarning(TXinyiWarningRecord xinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String unit) {
  1950. log.info("进入了后台接口调⽤⼤模型获取问答结果处理");
  1951. StringBuilder sb = new StringBuilder();
  1952. String sessionId = IdUtils.simpleUUID();
  1953. ChatReq chatReq = new ChatReq();
  1954. // String ipAddr = IpUtils.getIpAddr();//获取用户的ip地址 传给大模型
  1955. String ipAddr = "";//获取用户的ip地址 传给大模型 定时任务获取不到ip地址
  1956. int counts = 1;//默认是第一次
  1957. //这种问答 没有历史问答的概念 直接把问题扔进去就行 无需查询历史记录
  1958. List<String> historyDates = new ArrayList<>();
  1959. //构建问题(替换提示词中的占位符)
  1960. /*String shWarningPrompt = SH_WARNING_PROMPT;
  1961. shWarningPrompt =shWarningPrompt.replace("#{0}", xinyiWarningRecord.getReason());
  1962. shWarningPrompt =shWarningPrompt.replace("#{1}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getDesignVal(), INT_2)));
  1963. shWarningPrompt =shWarningPrompt.replace("#{2}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getControlVal(), INT_2)));
  1964. shWarningPrompt =shWarningPrompt.replace("#{3}", String.valueOf(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getWarningVal(), INT_2)));*/
  1965. //2024年7月5日10:08:54 拼接优化
  1966. StringBuilder prompt = new StringBuilder(SH_WARNING_PROMPT_1);
  1967. prompt.append(xinyiWarningRecord.getReason());
  1968. prompt.append(SH_WARNING_PROMPT_2).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getDesignVal(), INT_2));
  1969. prompt.append(SH_WARNING_PROMPT_3).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getControlVal(), INT_2));
  1970. prompt.append(SH_WARNING_PROMPT_4).append(DecimalUtils.getAbsAndScale(xinyiWarningRecord.getWarningVal(), INT_2));
  1971. prompt.append(SH_WARNING_PROMPT_5);
  1972. historyDates.add(prompt.toString());
  1973. // 获取输出流
  1974. ManagedChannel channel = null;
  1975. try {
  1976. channel = ManagedChannelBuilder.forAddress(bigModelConfig.getIp(), bigModelConfig.getPort())
  1977. .usePlaintext()
  1978. .build();
  1979. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  1980. // 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) + "}";
  1981. //2024年6月27日13:29:18 优化,不再使用拼接JSON字符串
  1982. String dataJson = buildBigModelReqForChat(sessionId, historyDates, ipAddr, false);
  1983. // log.info("请求大模型的问答参数为{}", dataJson);
  1984. PredictionsRequest request = PredictionsRequest.newBuilder()
  1985. .setModelName("slibra_bot")
  1986. .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理
  1987. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  1988. .buildPartial();
  1989. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  1990. //将结果记录到问答表
  1991. while (predictions.hasNext()) {
  1992. String responseStr = predictions.next().getPrediction().toStringUtf8();
  1993. // log.info("大模型问答返回的原始结果为{}", responseStr);
  1994. responseStr = JSON.parseObject(responseStr).getString("message");
  1995. if("complete".equals(responseStr)){
  1996. log.info("结尾语句并且是非JSON,无需处理");
  1997. }else{
  1998. sb.append(responseStr);
  1999. }
  2000. }
  2001. //将问答更新到数据库中
  2002. chatReq.setSessionId(sessionId);
  2003. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  2004. chatReq.setModule(3);//0专家问答 1智能工单 2智能体助手 3告警 4简报
  2005. String showVal = this.buildShowValueSH(xinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate(), unit);
  2006. chatReq.setShowVal(showVal);
  2007. chatReq.setQuestion(prompt.toString());
  2008. chatReq.setAnswer(sb.toString());
  2009. chatReq.setWarningId(String.valueOf(xinyiWarningRecord.getId()));
  2010. chatReq.setCounts(counts);//问答次数
  2011. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  2012. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  2013. chatReq.setCreateTime(DateUtils.getNowDate());
  2014. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  2015. } catch (IOException e) {
  2016. throw new RuntimeException(e);
  2017. } finally {
  2018. // 关闭输出流
  2019. channel.shutdown();
  2020. }
  2021. }
  2022. private String buildBigModelReqForChat(String sessionId, List<String> historyDates, String ipAddr, Boolean strengthen) {
  2023. ChatRequest chatRequest = new ChatRequest();
  2024. chatRequest.setSessionId(sessionId);
  2025. chatRequest.setHistoryDia(historyDates);
  2026. //2024年7月5日13:24:10 temperature做区分
  2027. GenerateArgs generateArgs = new GenerateArgs();
  2028. generateArgs.setTemperature(bigModelConfig.getTemperature());
  2029. chatRequest.setGenerateArgs(generateArgs);
  2030. Map<String, Object> extra = new HashMap<>();
  2031. extra.put("ip_address", ipAddr);
  2032. chatRequest.setExtra(extra);
  2033. chatRequest.setStrengthen(strengthen);
  2034. //2024年7月3日16:21:28 明确该场景不用调工具
  2035. chatRequest.setTools(String.valueOf(false));
  2036. return JSON.toJSONString(chatRequest);
  2037. }
  2038. /**
  2039. * 调用大模型获取决策结果 并同时记录对应信息到聊天记录表中
  2040. *
  2041. * @param tXinyiWarningRecord
  2042. * @param tXinyiIndustry
  2043. * @param normConfig
  2044. * @param isSpecial 机器人化验库,需要把总磷和总氮的值特殊处理一下
  2045. * @param nowDate
  2046. */
  2047. private void handleDecision(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, boolean isSpecial, Date nowDate) {
  2048. log.info("进入了调⽤大模型决策接口");
  2049. ChatReq chatReq = new ChatReq();
  2050. // StringBuilder sb = new StringBuilder();
  2051. //大模型结果 放入一个结合中
  2052. List<String> resultData = new ArrayList<>();
  2053. //决策和问答不一样 没有历史的概念 所以sessionId都是新的 次数都是1
  2054. String sessionId = IdUtils.simpleUUID();
  2055. // String feedback = chatReq.getFeedback();
  2056. //决策请求的业务参数
  2057. // List<HashMap<String, Object>> list = this.xinyiIndustryMapper.selectLast10RecordsForDecision();
  2058. //2024年5月21日15:23:07 这里不能用关联查询处理,日报要获取最新的一条而不是今日的数据。
  2059. List<DecisionReq> decisionReqs = this.xinyiIndustryMapper.selectLast10RecordsForDecisionOnlyIndustry();
  2060. if(!CollectionUtils.isEmpty(decisionReqs)){
  2061. //处理日报数据
  2062. TXinyiDaily daily = this.xinyiDailyMapper.selectNewestData();
  2063. for (DecisionReq decisionReq : decisionReqs) {
  2064. if(!Objects.isNull(daily)){
  2065. WaterFormat.getWaterDecimationData(decisionReq, daily);
  2066. // decisionReq.setT(daily.getJsSw());
  2067. // decisionReq.setSVI(daily.getWntjzsAll());
  2068. // decisionReq.setSV(daily.getWncjbAll());
  2069. // decisionReq.setMlvss(daily.getHfxwnndAll());
  2070. // //2024年7月2日17:20:12 mlss和DO_O也要从日报获取
  2071. // decisionReq.setMlss(daily.getHycWnndAll());
  2072. // decisionReq.setDoO(daily.getHycRjyAll());
  2073. // decisionReq.setDoAna(daily.getYycRjyAll());
  2074. // decisionReq.setDoQue(daily.getQycRjyAll());
  2075. // //2024年5月26日11:59:02 干污泥量数据做了同步
  2076. // decisionReq.setGwnl(daily.getGWNL());
  2077. // BigDecimal jsBod5 = daily.getJsBod5();
  2078. // decisionReq.setBodIn(jsBod5);
  2079. // BigDecimal tpIn = decisionReq.getTpIn();
  2080. // BigDecimal tnIn = decisionReq.getTnIn();
  2081. // if(!Objects.isNull(jsBod5)){
  2082. // if(!Objects.isNull(tpIn) && tpIn.compareTo(new BigDecimal("0")) >0){
  2083. // decisionReq.setC(jsBod5.divide(tpIn, 4, RoundingMode.HALF_UP));
  2084. // }
  2085. // if(!Objects.isNull(tnIn) && tnIn.compareTo(new BigDecimal("0")) >0){
  2086. // decisionReq.setB(jsBod5.divide(tnIn, 4, RoundingMode.HALF_UP));
  2087. // }
  2088. // }
  2089. // //2024年6月1日08:37:09 内回流加上
  2090. // decisionReq.setR(daily.getNhlR());
  2091. // decisionReq.setRR(daily.getWhlR());
  2092. }
  2093. //如果是机器人化验室的报警,需要把总磷和总氮,获取化验室对应的数据且计算
  2094. //2024年08月20日15:16:16 化验室的报警和工业库传参一样 新增了4个参数额外标记化验室数据
  2095. /*if(isSpecial){
  2096. List<TXinyiRobot> xinyiRobots = this.xinyiRobotMapper.selectTXinyiRobotList(TXinyiRobot.builder().testHour(tXinyiIndustry.getTestHour()).build());
  2097. if(CollectionUtils.isEmpty(xinyiRobots)){
  2098. log.error("{}获取化验室数据失败", tXinyiIndustry.getTestHour());
  2099. }else{
  2100. TXinyiRobot tXinyiRobot = xinyiRobots.get(0);
  2101. //总氮
  2102. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  2103. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  2104. if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
  2105. decisionReq.setTnOff((no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), INT_0, RoundingMode.HALF_UP));
  2106. }
  2107. //总磷
  2108. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  2109. if(!Objects.isNull(tpRccJqr)){
  2110. decisionReq.setTpOff(tpRccJqr.divide(ROBOT_HY_DIVIDE, INT_0, RoundingMode.HALF_UP));
  2111. }
  2112. }
  2113. }*/
  2114. }
  2115. }
  2116. // String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls);
  2117. // 获取输出流
  2118. ManagedChannel channel = null;
  2119. String dataJson = "";
  2120. try {
  2121. channel = ManagedChannelBuilder.forAddress(bigModelConfig.getIp(), bigModelConfig.getPort())
  2122. .usePlaintext()
  2123. .build();
  2124. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  2125. // 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 + "}}";
  2126. //2024年6月24日17:59:17 优化,不再拼接JSON字符串
  2127. PolicyReq policyReq = new PolicyReq();
  2128. //2024年7月11日17:57:53 因为化验室的改了 但是 调用决策还得用原来的几个值
  2129. String category = tXinyiWarningRecord.getCategory();
  2130. /*if(ROBOT_XSY_1.getCode().equalsIgnoreCase(category) || ROBOT_XSY_2.getCode().equalsIgnoreCase(category)){
  2131. category = CS_ZD.getCode();
  2132. } else if (ROBOT_ANDAN_1.getCode().equalsIgnoreCase(category) || ROBOT_ANDAN_2.getCode().equalsIgnoreCase(category)) {
  2133. category = CS_AD.getCode();
  2134. }else if (ROBOT_ECCZLSY.getCode().equalsIgnoreCase(category)) {
  2135. category = CS_ZL.getCode();
  2136. }*/
  2137. //2024年08月25日15:40:31 处理数据映射,改成字母,但是显示的还是中文
  2138. category = this.parseCategory(category);
  2139. policyReq.setNorm(category);
  2140. HashMap<String, Object> hashMap = new HashMap<>();
  2141. policyReq.setFeedback(hashMap);//不能传null
  2142. policyReq.setSimulate(hashMap);//不能传null
  2143. policyReq.setSessionId(sessionId);
  2144. //2024年7月5日13:24:10 temperature做区分
  2145. GenerateArgs generateArgs = new GenerateArgs();
  2146. generateArgs.setTemperature(bigModelConfig.getTemperature());
  2147. policyReq.setGenerateArgs(generateArgs);
  2148. HashMap<String, Object> map = new HashMap<>();
  2149. map.put("rows", decisionReqs);
  2150. //2024年6月25日14:16:05 增加报警是管控值报警还是标准值报警
  2151. if(WARNING_LEVEL_ONE.equals(tXinyiWarningRecord.getLevel()) || WARNING_LEVEL_TWO.equals(tXinyiWarningRecord.getLevel()))
  2152. map.put("source", "bzz");
  2153. else
  2154. map.put("source", "gkz");
  2155. policyReq.setExtra(map);
  2156. dataJson = JSON.toJSONString(policyReq, JSONWriter.Feature.WriteNulls);
  2157. // log.info("~~~~~~请求大模型的决策的参数为{}", dataJson);
  2158. PredictionsRequest request = PredictionsRequest.newBuilder()
  2159. .setModelName("slibra_bot")
  2160. .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理
  2161. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  2162. .buildPartial();
  2163. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  2164. while (predictions.hasNext()) {
  2165. String responseStr = predictions.next().getPrediction().toStringUtf8();
  2166. // log.info("决策流式返回的结果是{}", responseStr);
  2167. //2024年5月25日16:37:16 按照大模型返回的类型解析数据
  2168. String biz = JSON.parseObject(responseStr).getString("biz");
  2169. if(BusinessEnum.BigModelBizEnum.OK.getCode().equals(biz)){
  2170. log.info("结尾语句并且是非JSON,无需处理");
  2171. //结束语句也流式输出,但是并不记录下来 2024年5月24日11:15:23 也不返回前端
  2172. /*outputStream.write(responseStr.getBytes());
  2173. outputStream.flush();*/
  2174. }else if(BusinessEnum.BigModelBizEnum.DECISION_DEBUGGER.getCode().equals(biz)){
  2175. log.info("中间过程,目前只打印日志,不记录数据,也不返回给前端,返回数据为{}", responseStr);
  2176. //结束语句也流式输出,但是并不记录下来 2024年5月24日11:15:23 也不返回前端
  2177. /*outputStream.write(responseStr.getBytes());
  2178. outputStream.flush();*/
  2179. }else{//其他 要么错误 要么alert 要么出的报告
  2180. // sb.append(responseStr);
  2181. resultData.add(responseStr);
  2182. }
  2183. }
  2184. } catch (Exception e) {
  2185. // throw new RuntimeException(e);
  2186. log.error("定时任务处理告警调用决策异常,异常信息为{}", JSON.toJSONString(e));
  2187. resultData.add("{\"biz\":\"ERROR\",\"message\":\"大模型分析数据异常,请稍后再试\"}");
  2188. } finally {
  2189. // log.info("决策最终要保存的数据是{}", JSON.toJSONString(resultData));
  2190. //保存聊天记录
  2191. //将问答更新到数据库中
  2192. chatReq.setSessionId(sessionId);
  2193. chatReq.setType(1);//0问答 1决策
  2194. chatReq.setModule(3);
  2195. /*String userId = SecurityUtils.getUserId().toString();
  2196. String username = SecurityUtils.getUsername();*/
  2197. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  2198. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, nowDate);
  2199. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  2200. chatReq.setQuestion(dataJson);
  2201. chatReq.setAnswer(JSON.toJSONString(resultData));
  2202. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  2203. chatReq.setCounts(1);//问答次数
  2204. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  2205. chatReq.setCreateTime(DateUtils.getNowDate());
  2206. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  2207. // 关闭输出流
  2208. if(!Objects.isNull(channel))
  2209. channel.shutdown();
  2210. }
  2211. }
  2212. private String parseCategory(String category) {
  2213. switch (category) {
  2214. case "进水COD" : return "js_cod";
  2215. case "进水总磷" : return "js_tp";
  2216. case "进水总氮" : return "js_tn";
  2217. case "进水氨氮" : return "js_andan";
  2218. case "进水SS" : return "js_ss";
  2219. case "出水COD" : return "cs_cod";
  2220. case "出水总磷" : return "cs_tp";
  2221. case "出水总氮" : return "cs_tn";
  2222. case "出水氨氮" : return "cs_andan";
  2223. case "出水SS" : return "cs_ss";
  2224. case "#1好氧硝酸盐" : return "cs_tn_lxjc1";
  2225. case "#2好氧硝酸盐" : return "cs_tn_lxjc2";
  2226. case "出水氨氮连续检测" : return "cs_andan_lxjc1";
  2227. case "二沉池正磷酸盐" : return "cs_tp_lxjc";
  2228. default: throw new ServiceException("暂时不支持的类型");
  2229. }
  2230. }
  2231. /**
  2232. * 2024年7月11日10:32:49 生化报警的展示额外处理(因为涉及到很多的单位)
  2233. *
  2234. * @param tXinyiWarningRecord
  2235. * @param tXinyiIndustry
  2236. * @param normConfig
  2237. * @param nowDate
  2238. * @param unit
  2239. * @return
  2240. */
  2241. private String buildShowValueSH(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Date nowDate, String unit) {
  2242. JSONObject result = new JSONObject();
  2243. // JSONObject basic = new JSONObject();
  2244. Integer status = tXinyiWarningRecord.getStatus();
  2245. // Date warningTime = tXinyiWarningRecord.getTime();
  2246. //2025年02月21日17:09:29 因为报警时间改过一次逻辑,以前是最开始的那个时候,后来每次报警都更新它,所以这里需要的是创建时间
  2247. Date warningTime = tXinyiWarningRecord.getCreateTime();
  2248. String remark = tXinyiWarningRecord.getRemark();
  2249. //2025年02月26日16:17:10 这里计算的截止时间可能是当前时间,也可能是报警结束时间,需要判断
  2250. Date endDate = null;
  2251. //判断类型 如果结束了 截止时间就是告警截止时间; 如果正在报警 截止时间就是当前时间
  2252. if(0 == tXinyiWarningRecord.getStatus() || 3 == tXinyiWarningRecord.getStatus())
  2253. endDate = DateUtils.getNowDate();
  2254. else
  2255. endDate = tXinyiWarningRecord.getOffTime();
  2256. long count = DateUtils.differentHoursByLocalDateTime(warningTime, endDate) + 1;
  2257. ShowValueSHBasic showValueSHBasic = new ShowValueSHBasic();
  2258. /*if("0".equals(remark)){//水质报警
  2259. showValueSHBasic.setH(ZAIXIANYIBIAO);
  2260. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  2261. }else if("1".equals(remark)){//生化报警
  2262. showValueSHBasic.setH(ZAIXIANYIBIAO);
  2263. }else if("2".equals(remark)){//预测报警
  2264. showValueSHBasic.setH(YVCE);
  2265. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  2266. }else {//机器人化验室报警(特殊的 水质报警)
  2267. showValueSHBasic.setH(LIANXUJIANCE);
  2268. showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  2269. }*/
  2270. //生化报警固定了
  2271. // showValueSHBasic.setF(tXinyiWarningRecord.getLevel());
  2272. showValueSHBasic.setF(tXinyiWarningRecord.getSymbolDesc());
  2273. showValueSHBasic.setH("计算");
  2274. //通用的
  2275. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  2276. showValueSHBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM, tXinyiWarningRecord.getTime()));
  2277. showValueSHBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2) + unit);
  2278. showValueSHBasic.setD(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2) + unit);
  2279. showValueSHBasic.setG(count > MAX_COUNT ? MAX_COUNT_STR : String.valueOf(count));
  2280. if(tXinyiWarningRecord.getType() != 2)
  2281. showValueSHBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  2282. else
  2283. showValueSHBasic.setI(status == 0 ? "预警中" : "已完成");
  2284. result.put("basic", showValueSHBasic);
  2285. JSONObject jsData = jsCsFormatData.getJsonObject(tXinyiIndustry, normConfig);//进水数据
  2286. result.put("jsData", jsData);
  2287. JSONObject csData = jsCsFormatData.getCsonObject(tXinyiIndustry, normConfig);//出水数据
  2288. result.put("csData", csData);
  2289. // return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
  2290. return JSON.toJSONString(result);
  2291. }
  2292. private String buildShowValue(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Date nowDate) {
  2293. JSONObject result = new JSONObject();
  2294. // JSONObject basic = new JSONObject();
  2295. Integer status = tXinyiWarningRecord.getStatus();
  2296. // Date warningTime = tXinyiWarningRecord.getTime();
  2297. //2025年02月21日17:09:29 因为报警时间改过一次逻辑,以前是最开始的那个时候,后来每次报警都更新它,所以这里需要的是创建时间
  2298. Date warningTime = tXinyiWarningRecord.getCreateTime();
  2299. String remark = tXinyiWarningRecord.getRemark();
  2300. //2025年02月26日16:17:10 这里计算的截止时间可能是当前时间,也可能是报警结束时间,需要判断
  2301. Date endDate = null;
  2302. //判断类型 如果结束了 截止时间就是告警截止时间; 如果正在报警 截止时间就是当前时间
  2303. if(0 == tXinyiWarningRecord.getStatus() || 3 == tXinyiWarningRecord.getStatus())
  2304. endDate = DateUtils.getNowDate();
  2305. else
  2306. endDate = tXinyiWarningRecord.getOffTime();
  2307. long count = DateUtils.differentHoursByLocalDateTime(warningTime, endDate) + 1;
  2308. String category = tXinyiWarningRecord.getCategory();
  2309. /*basic.put("title", tXinyiWarningRecord.getReason());
  2310. basic.put("报警时间", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  2311. basic.put("报警值", tXinyiWarningRecord.getWarningVal());
  2312. basic.put("标准值", tXinyiWarningRecord.getDesignVal());
  2313. basic.put("管控值", tXinyiWarningRecord.getControlVal());
  2314. basic.put("报警次数", count > MAX_COUNT ? MAX_COUNT_STR : count);
  2315. if(tXinyiWarningRecord.getType() != 2)
  2316. basic.put("状态", status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  2317. else
  2318. basic.put("状态", status == 0 ? "预警中" : "已完成");
  2319. //2024年5月27日14:04:22 额外返回2个字段 [管控值 和 告警级别] 返回的json没有数据是因为value没有值
  2320. // basic.put("管控值", tXinyiWarningRecord.getControlVal());
  2321. basic.put("告警级别", tXinyiWarningRecord.getLevel());*/
  2322. //2024年6月25日16:00:18 进出水展示的不一样
  2323. //2024年7月15日10:57:31 因为新增了化验室的3个指标,也是出水数据
  2324. if(category.contains(CHUSHUI)
  2325. || ROBOT_ECCZLSY.getCode().equalsIgnoreCase(category)
  2326. || ROBOT_XSY_1.getCode().equalsIgnoreCase(category)
  2327. || ROBOT_XSY_2.getCode().equalsIgnoreCase(category)
  2328. || ROBOT_ANDAN_1.getCode().equalsIgnoreCase(category)
  2329. || ROBOT_ANDAN_2.getCode().equalsIgnoreCase(category)
  2330. || ROBOT_CS_AD.getCode().equalsIgnoreCase(category)){//出水的展示
  2331. ShowValueCSBasic showValueCSBasic = new ShowValueCSBasic();
  2332. if(ZERO_SZ_WARNING.getCode().equals(remark)){//水质报警
  2333. showValueCSBasic.setH(ZAIXIANYIBIAO);
  2334. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  2335. showValueCSBasic.setF(tXinyiWarningRecord.getSymbolDesc());
  2336. }else if(ONE_SH_WARNING.getCode().equals(remark)){//生化报警
  2337. showValueCSBasic.setH(ZAIXIANYIBIAO);
  2338. }else if(BusinessEnum.BigModelWarningTypeRemarkEnum.TWO_YC_WARNING.getCode().equals(remark)){//预测报警
  2339. showValueCSBasic.setH(YVCE);
  2340. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  2341. }else {//机器人化验室报警(特殊的水质报警)
  2342. showValueCSBasic.setH(LIANXUJIANCE);
  2343. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  2344. showValueCSBasic.setF(tXinyiWarningRecord.getSymbolDesc());
  2345. }
  2346. //通用的
  2347. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  2348. // showValueCSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,warningTime));
  2349. showValueCSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,nowDate));
  2350. showValueCSBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2));
  2351. showValueCSBasic.setD(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getControlVal(), INT_2));
  2352. showValueCSBasic.setE(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2));
  2353. showValueCSBasic.setG(count > MAX_COUNT ? MAX_COUNT_STR : String.valueOf(count));
  2354. if(tXinyiWarningRecord.getType() != 2)
  2355. showValueCSBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  2356. else
  2357. showValueCSBasic.setI(status == 0 ? "预警中" : "已完成");
  2358. result.put("basic", showValueCSBasic);
  2359. }else{//进水的展示
  2360. ShowValueJSBasic showValueJSBasic = new ShowValueJSBasic();
  2361. if(ZERO_SZ_WARNING.getCode().equals(remark)){//水质报警
  2362. showValueJSBasic.setH(ZAIXIANYIBIAO);
  2363. // showValueJSBasic.setF(tXinyiWarningRecord.getLevel());
  2364. showValueJSBasic.setF(tXinyiWarningRecord.getSymbolDesc());
  2365. }else if(ONE_SH_WARNING.getCode().equals(remark)){//生化报警
  2366. showValueJSBasic.setH(ZAIXIANYIBIAO);
  2367. }else if(BusinessEnum.BigModelWarningTypeRemarkEnum.TWO_YC_WARNING.getCode().equals(remark)){//预测报警
  2368. showValueJSBasic.setH(YVCE);
  2369. // showValueCSBasic.setF(tXinyiWarningRecord.getLevel());
  2370. }else {//机器人化验室报警(特殊的 水质报警)
  2371. showValueJSBasic.setH(LIANXUJIANCE);
  2372. // showValueJSBasic.setF(tXinyiWarningRecord.getLevel());
  2373. showValueJSBasic.setF(tXinyiWarningRecord.getSymbolDesc());
  2374. }
  2375. //通用的
  2376. // showValueBasic.setA(tXinyiWarningRecord.getReason());
  2377. showValueJSBasic.setB(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM ,tXinyiWarningRecord.getTime()));
  2378. showValueJSBasic.setC(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getWarningVal(), INT_2));
  2379. showValueJSBasic.setE(DecimalUtils.getAbsAndScale(tXinyiWarningRecord.getDesignVal(), INT_2));
  2380. showValueJSBasic.setG(count > MAX_COUNT ? MAX_COUNT_STR : String.valueOf(count));
  2381. if(tXinyiWarningRecord.getType() != 2)
  2382. showValueJSBasic.setI(status == 0 ? "报警中" : status == 1 ? "用户关闭" : status == 2 ? "系统关闭" : "应急处理中");
  2383. else
  2384. showValueJSBasic.setI(status == 0 ? "预警中" : "已完成");
  2385. result.put("basic", showValueJSBasic);
  2386. }
  2387. JSONObject jsData = jsCsFormatData.getJsonObject(tXinyiIndustry, normConfig);//进水数据
  2388. result.put("jsData", jsData);
  2389. JSONObject csData = jsCsFormatData.getCsonObject(tXinyiIndustry, normConfig);//出水数据
  2390. result.put("csData", csData);
  2391. // return JSON.toJSONString(result, JSONWriter.Feature.WriteNulls);
  2392. return JSON.toJSONString(result);
  2393. }
  2394. private static JSONObject getJsonObject(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  2395. JSONObject jsData = new JSONObject();
  2396. HashMap<Object, Object> temp1 = new HashMap<>();
  2397. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  2398. temp1.put("value", DecimalUtils.getAbsAndScale(jsSlq, INT_2));
  2399. temp1.put("exceed", jsSlq.compareTo(normConfig.getJsslSjz()) >0);
  2400. jsData.put("流量", temp1);
  2401. HashMap<Object, Object> temp2 = new HashMap<>();
  2402. BigDecimal jsCod = tXinyiIndustry.getJsCod();
  2403. temp2.put("value", DecimalUtils.getAbsAndScale(jsCod, INT_2));
  2404. temp2.put("exceed", jsCod.compareTo(normConfig.getJscodSjz()) > 0);
  2405. jsData.put("COD", temp2);
  2406. HashMap<Object, Object> temp3 = new HashMap<>();
  2407. BigDecimal jsNh3 = tXinyiIndustry.getJsNh3();
  2408. temp3.put("value", DecimalUtils.getAbsAndScale(jsNh3, INT_2));
  2409. temp3.put("exceed", jsNh3.compareTo(normConfig.getJsadSjz()) > 0);
  2410. jsData.put("NH3-N", temp3);
  2411. HashMap<Object, Object> temp4 = new HashMap<>();
  2412. BigDecimal jsTp = tXinyiIndustry.getJsTp();
  2413. temp4.put("value", DecimalUtils.getAbsAndScale(jsTp, INT_2));
  2414. temp4.put("exceed", jsTp.compareTo(normConfig.getJszlSjz()) > 0);
  2415. jsData.put("TP", temp4);
  2416. HashMap<Object, Object> temp5 = new HashMap<>();
  2417. BigDecimal jsSs = tXinyiIndustry.getJsSs();
  2418. temp5.put("value", DecimalUtils.getAbsAndScale(jsSs, INT_2));
  2419. temp5.put("exceed", jsSs.compareTo(normConfig.getJsssSjz()) > 0);
  2420. jsData.put("SS", temp5);
  2421. HashMap<Object, Object> temp6 = new HashMap<>();
  2422. BigDecimal jsTn = tXinyiIndustry.getJsTn();
  2423. temp6.put("value", DecimalUtils.getAbsAndScale(jsTn, INT_2));
  2424. temp6.put("exceed", jsTn.compareTo(normConfig.getJszdSjz()) > 0);
  2425. jsData.put("TN", temp6);
  2426. return jsData;
  2427. }
  2428. private static JSONObject getCsonObject(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  2429. JSONObject csData = new JSONObject();
  2430. HashMap<Object, Object> temp1 = new HashMap<>();
  2431. BigDecimal csSlq = tXinyiIndustry.getCsSlqc();
  2432. temp1.put("value", DecimalUtils.getAbsAndScale(csSlq, INT_2));
  2433. temp1.put("exceed", false);//出水水量没有管控值
  2434. csData.put("流量", temp1);
  2435. HashMap<Object, Object> temp2 = new HashMap<>();
  2436. BigDecimal csCod = tXinyiIndustry.getCsCod();
  2437. temp2.put("value", DecimalUtils.getAbsAndScale(csCod, INT_2));
  2438. temp2.put("exceed", csCod.compareTo(normConfig.getCscodGkz()) > 0);
  2439. csData.put("COD", temp2);
  2440. HashMap<Object, Object> temp3 = new HashMap<>();
  2441. BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
  2442. temp3.put("value", DecimalUtils.getAbsAndScale(csNh3, INT_2));
  2443. temp3.put("exceed", csNh3.compareTo(normConfig.getCsadGkz()) > 0);
  2444. csData.put("NH3-N", temp3);
  2445. HashMap<Object, Object> temp4 = new HashMap<>();
  2446. BigDecimal csTp = tXinyiIndustry.getCsTp();
  2447. temp4.put("value", DecimalUtils.getAbsAndScale(csTp, INT_2));
  2448. temp4.put("exceed", csTp.compareTo(normConfig.getCszlGkz()) > 0);
  2449. csData.put("TP", temp4);
  2450. HashMap<Object, Object> temp5 = new HashMap<>();
  2451. BigDecimal csSs = tXinyiIndustry.getCsSs();
  2452. temp5.put("value", DecimalUtils.getAbsAndScale(csSs, INT_2));
  2453. temp5.put("exceed", csSs.compareTo(normConfig.getCsssGkz()) > 0);
  2454. csData.put("SS", temp5);
  2455. HashMap<Object, Object> temp6 = new HashMap<>();
  2456. BigDecimal csTn = tXinyiIndustry.getCsTn();
  2457. temp6.put("value", DecimalUtils.getAbsAndScale(csTn, INT_2));
  2458. temp6.put("exceed", csTn.compareTo(normConfig.getCszzGkz()) > 0);
  2459. csData.put("TN", temp6);
  2460. return csData;
  2461. }
  2462. /**
  2463. * 通过输入的值 生成对应类型的报警对象(出水)
  2464. *
  2465. * @param currentVal
  2466. * @param category
  2467. * 2025年02月20日11:15:05 返回map 分别是是否断点 是否连续不变
  2468. * @return
  2469. */
  2470. private WarningMoreExceed handleXinYiWarningsCsMore(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
  2471. WarningMoreExceed warningMoreExceed = new WarningMoreExceed();
  2472. boolean breakpoint = false;
  2473. boolean noChange = false;
  2474. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_3);
  2475. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  2476. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  2477. return new WarningMoreExceed();
  2478. }
  2479. TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  2480. //2025年02月20日14:17:29 在这里处理额外的其他报警项
  2481. //该类型的断点历史报警
  2482. Date nowDate = DateUtils.getNowDate();
  2483. //是否存在断点
  2484. if(!Objects.isNull(tXinyiIndustry1)){
  2485. if(existsBreakPoints(currentVal, category, tXinyiIndustry1)){
  2486. //关闭同类型的其他报警
  2487. //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
  2488. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  2489. breakpoint = true;
  2490. //插入该类型报警
  2491. TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
  2492. warningRecord.setTime(nowDate);
  2493. warningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());
  2494. warningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  2495. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  2496. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  2497. warningRecord.setCreateTime(nowDate);
  2498. warningRecord.setWarningVal(currentVal);
  2499. warningRecord.setDesignVal(csBzz);
  2500. warningRecord.setControlVal(csGkz);
  2501. warningRecord.setCwrwfhz(cwrwfhz);
  2502. warningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  2503. warningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
  2504. //存放起来
  2505. warningMoreExceed.setBreakPointWarningRecord(warningRecord);
  2506. //这里不报警 需要根据优先级报警
  2507. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  2508. //同时处理决策 不用调用大模型,本地处理问答
  2509. // addChatRecordByBreakPointsSingle(warningRecord, tXinyiIndustry, normConfig, category);
  2510. }
  2511. }
  2512. //是否存在连续不变
  2513. if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_3){
  2514. //2025年02月21日14:20:41 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
  2515. if(existsNoChange(currentVal, category, tXinyiIndustries)){
  2516. //关闭同类型的其他报警
  2517. //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
  2518. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode());
  2519. noChange = true;
  2520. //触发报警 并且模拟大模型返回决策问答数据
  2521. //插入该类型报警
  2522. //该类型的连续不变报警
  2523. TXinyiWarningRecord warningRecordNoChangeSingle = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode()).status(0).build();
  2524. warningRecordNoChangeSingle.setTime(nowDate);
  2525. warningRecordNoChangeSingle.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getMsg());
  2526. warningRecordNoChangeSingle.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  2527. warningRecordNoChangeSingle.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode());
  2528. warningRecordNoChangeSingle.setCreateBy(WARNING_DEFAULT_CREATE);
  2529. warningRecordNoChangeSingle.setCreateTime(nowDate);
  2530. warningRecordNoChangeSingle.setWarningVal(currentVal);
  2531. warningRecordNoChangeSingle.setDesignVal(csBzz);
  2532. warningRecordNoChangeSingle.setControlVal(csGkz);
  2533. warningRecordNoChangeSingle.setCwrwfhz(cwrwfhz);
  2534. warningRecordNoChangeSingle.setRemark(ZERO_SZ_WARNING.getCode());
  2535. warningRecordNoChangeSingle.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
  2536. //存放起来
  2537. warningMoreExceed.setNoChangeWarningRecord(warningRecordNoChangeSingle);
  2538. //
  2539. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordNoChangeSingle);
  2540. // //同时处理决策 不用调用大模型,本地处理问答
  2541. // addChatRecordByNoChangeSingle(warningRecordNoChangeSingle, tXinyiIndustry, normConfig, category);
  2542. }
  2543. }
  2544. //是否连续不变
  2545. warningMoreExceed.setBreakpoint(breakpoint);
  2546. warningMoreExceed.setNoChange(noChange);
  2547. return warningMoreExceed;
  2548. }
  2549. /**
  2550. * 通过输入的值 生成对应类型的报警对象(出水)
  2551. *
  2552. * @param csBzz
  2553. * @param currentVal
  2554. * @param csGkz
  2555. * @param category
  2556. * @param tXinyiIndustry
  2557. * @param normConfig
  2558. * @param cwrwfhz
  2559. * 2025年02月20日11:15:05 返回map 分别是是否断点 是否连续不变
  2560. * @return
  2561. */
  2562. private void handleXinYiWarningsCsOrigin(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
  2563. Date nowDate = DateUtils.getNowDate();
  2564. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_3);
  2565. TXinyiIndustry tXinyiIndustry1 = null;
  2566. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  2567. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  2568. return ;
  2569. }
  2570. tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  2571. //单点突变-异常升高报警
  2572. TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
  2573. List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
  2574. //是否存在异常升高的问题
  2575. if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_3){
  2576. //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
  2577. BigDecimal exceedVal = existsYCSG(currentVal, category, tXinyiIndustries);
  2578. if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
  2579. //关闭同类型的其他报警
  2580. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
  2581. //触发报警 并且模拟大模型返回决策问答数据
  2582. if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
  2583. //插入该类型报警
  2584. warningRecordYCSG.setTime(nowDate);
  2585. warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
  2586. warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  2587. warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
  2588. warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
  2589. warningRecordYCSG.setCreateTime(nowDate);
  2590. warningRecordYCSG.setWarningVal(currentVal);
  2591. warningRecordYCSG.setDesignVal(csBzz);
  2592. warningRecordYCSG.setControlVal(csGkz);
  2593. warningRecordYCSG.setRemark(ZERO_SZ_WARNING.getCode());
  2594. warningRecordYCSG.setCwrwfhz(cwrwfhz);
  2595. warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  2596. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
  2597. //同时处理决策 不用调用大模型,本地处理问答
  2598. addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal);
  2599. }else{
  2600. log.info("工业库报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
  2601. }
  2602. log.info("工业库报警的时候,发现存在{}异常升高的报警,后续同指标报警不再处理", category);
  2603. return;
  2604. }else{//不存在 查看历史是否有报警,有的话关闭
  2605. if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
  2606. closeWarning(tXinyiNoChangeYCSGRecords.get(0));
  2607. }
  2608. }
  2609. }
  2610. //单点突变-异常偏低报警
  2611. //2025年03月03日15:00:55 异常偏低的报警暂时不需要了
  2612. // TXinyiWarningRecord warningRecordYCPD = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode()).status(0).build();
  2613. // List<TXinyiWarningRecord> tXinyiNoChangeYCPDRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCPD);
  2614. // //是否存在异常偏低的问题
  2615. // if(!Objects.isNull(tXinyiIndustry1)){
  2616. // //2025年02月21日15:05:41 这里只需要比较当前值和标准值的差 以及上个小时的值和标准值的差 所以不用取最近3个小时的
  2617. // BigDecimal exceedVal = existsYCPD(currentVal, category, tXinyiIndustry1, csBzz);
  2618. // if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
  2619. // //关闭同类型的其他报警
  2620. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode());
  2621. // //触发报警 并且模拟大模型返回决策问答数据
  2622. // if(CollectionUtils.isEmpty(tXinyiNoChangeYCPDRecords)){
  2623. // //插入该类型报警
  2624. // warningRecordYCPD.setType(0);
  2625. // warningRecordYCPD.setCategory(category);
  2626. // warningRecordYCPD.setTime(nowDate);
  2627. // warningRecordYCPD.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getMsg());
  2628. // warningRecordYCPD.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  2629. // warningRecordYCPD.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode());
  2630. // warningRecordYCPD.setCreateBy(WARNING_DEFAULT_CREATE);
  2631. // warningRecordYCPD.setCreateTime(nowDate);
  2632. // warningRecordYCPD.setWarningVal(currentVal);
  2633. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCPD);
  2634. // //同时处理决策 不用调用大模型,本地处理问答
  2635. // addChatRecordByYCPD(warningRecordYCPD, tXinyiIndustry, normConfig, category, exceedVal);
  2636. // }else{
  2637. // log.info("工业库报警的时候,发现存在异常偏低的报警,并且已经有该类型报警了,不做任何处理");
  2638. // }
  2639. // log.info("工业库报警的时候,发现存在{}异常偏低的报警,后续同指标报警不再处理", category);
  2640. // return;
  2641. // }else{//不存在 查看历史是否有报警,有的话关闭
  2642. // if(!CollectionUtils.isEmpty(tXinyiNoChangeYCPDRecords)){
  2643. // closeWarning(tXinyiNoChangeYCPDRecords.get(0));
  2644. // }
  2645. // }
  2646. // }
  2647. //下面是最原始的处理 超标准 超管控报警
  2648. BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  2649. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  2650. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  2651. tXinyiWarningRecord.setStatus(0);
  2652. tXinyiWarningRecord.setType(0);
  2653. tXinyiWarningRecord.setCategory(category);
  2654. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  2655. tXinyiWarningRecord.setWarningVal(currentVal);
  2656. tXinyiWarningRecord.setDesignVal(csBzz);
  2657. tXinyiWarningRecord.setControlVal(csGkz);
  2658. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  2659. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  2660. tXinyiWarningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  2661. //2025年02月10日14:45:08 下面是新增加的字段
  2662. tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  2663. //超污染物限制:计算公式为:当前氨氮/氨氮设计值 或者 当前氨氮/氨氮管控值(智能工单使用) 这里是出水的 【需要根据超标还是超管控,具体计算】
  2664. //超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
  2665. tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
  2666. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  2667. if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
  2668. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  2669. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  2670. }else if(currentVal.compareTo(multiply) > 0){//一级
  2671. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  2672. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  2673. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  2674. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  2675. }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  2676. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  2677. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  2678. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  2679. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  2680. }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  2681. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  2682. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  2683. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CGKZ.getCode());
  2684. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
  2685. }else{
  2686. tXinyiWarningRecord = null;//这种的无需处理
  2687. }
  2688. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  2689. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().type(0).category(category).status(0).build());
  2690. //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
  2691. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  2692. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  2693. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  2694. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  2695. xinyiWarningRecord.setStatus(2);
  2696. xinyiWarningRecord.setOffTime(nowDate);
  2697. xinyiWarningRecord.setUpdateTime(nowDate);
  2698. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  2699. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  2700. }
  2701. }
  2702. }else{//有告警信息
  2703. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  2704. TXinyiIndustry tXinyiIndustry2 = tXinyiIndustries.get(INDEX_2);//前两个小时
  2705. if(!this.judgeContinuousIndustry(tXinyiIndustry1, tXinyiIndustry2, category)){
  2706. log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiIndustry1), JSON.toJSONString(tXinyiIndustry2));
  2707. return ;
  2708. }
  2709. //保存到数据库中
  2710. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  2711. tXinyiWarningRecord.setUpdateTime(nowDate);
  2712. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  2713. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  2714. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  2715. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  2716. }else {
  2717. //继续调用决策
  2718. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  2719. }
  2720. }else{
  2721. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  2722. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  2723. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  2724. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  2725. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  2726. }else {
  2727. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  2728. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  2729. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  2730. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  2731. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  2732. xinyiWarningRecord.setUpdateTime(nowDate);
  2733. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  2734. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  2735. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  2736. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  2737. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  2738. //更新数据库
  2739. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  2740. //继续调用决策
  2741. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  2742. }
  2743. }
  2744. }
  2745. }
  2746. }
  2747. /**
  2748. *
  2749. * 超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
  2750. * 因为配置的值都不为0 所以不做校验了
  2751. * @param tXinyiIndustry
  2752. * @param normConfig
  2753. * @return
  2754. */
  2755. /*@Deprecated
  2756. private BigDecimal getCwrwfhz(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  2757. return (tXinyiIndustry.getJsSlq().multiply(tXinyiIndustry.getJsNh3())).divide((normConfig.getJsslSjz().multiply(normConfig.getJsadSjz())), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2758. }*/
  2759. /**
  2760. * 2025年02月14日10:26:03 因为超污染物负荷值 要根据具体的指标计算
  2761. * @param itemVal
  2762. * @param jsslSjz
  2763. * @return
  2764. */
  2765. private BigDecimal getCwrwfhzByDetail(BigDecimal jsSlq, BigDecimal itemVal, BigDecimal jsslSjz, BigDecimal itemConfigVal) {
  2766. return (jsSlq.multiply(itemVal)).divide((jsslSjz.multiply(itemConfigVal)), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2767. }
  2768. /**
  2769. * 计算超污染物限制的值: 需要判断进水还是出水;是超标准还是超管控 出水的标准值=进水的设计值
  2770. * @param currentVal
  2771. * @param normConfig
  2772. * @param code
  2773. * @param isBzz
  2774. * @return
  2775. */
  2776. private BigDecimal getCwrwxzByDetail(BigDecimal currentVal, TXinyiNormConfig normConfig, String code, boolean isBzz) {
  2777. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(code)){
  2778. if(isBzz)
  2779. return currentVal.divide(normConfig.getCscodBzz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2780. return currentVal.divide(normConfig.getCscodGkz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2781. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(code) || ROBOT_ECCZLSY.getCode().equals(code)){
  2782. if(isBzz)
  2783. return currentVal.divide(normConfig.getCszlBzz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2784. return currentVal.divide(normConfig.getCszlGkz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2785. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(code) || ROBOT_XSY_1.getCode().equals(code) || ROBOT_XSY_2.getCode().equals(code)){
  2786. if(isBzz)
  2787. return currentVal.divide(normConfig.getCszzBzz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2788. return currentVal.divide(normConfig.getCszzGkz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2789. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(code) || ROBOT_CS_AD.getCode().equals(code)){
  2790. if(isBzz)
  2791. return currentVal.divide(normConfig.getCsadBzz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2792. return currentVal.divide(normConfig.getCsadGkz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2793. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(code)){
  2794. if(isBzz)
  2795. return currentVal.divide(normConfig.getCsssBzz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2796. return currentVal.divide(normConfig.getCsssGkz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2797. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(code)){
  2798. return currentVal.divide(normConfig.getJszlSjz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2799. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(code)){
  2800. return currentVal.divide(normConfig.getJscodSjz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2801. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(code)){
  2802. return currentVal.divide(normConfig.getJszdSjz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2803. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(code)){
  2804. return currentVal.divide(normConfig.getJsadSjz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2805. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(code)){
  2806. return currentVal.divide(normConfig.getJsssSjz(), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  2807. }else{
  2808. log.error("暂时不支持的类型,返回null");
  2809. return null;
  2810. }
  2811. }
  2812. /**
  2813. * [工业库]通过输入的值 生成对应类型的报警对象(进水)
  2814. *
  2815. * @param currentVal
  2816. * @param category
  2817. * @return
  2818. */
  2819. private WarningMoreExceed handleXinYiWarningRecordJSMore(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
  2820. WarningMoreExceed warningMoreExceed = new WarningMoreExceed();
  2821. boolean breakpoint = false;
  2822. boolean noChange = false;
  2823. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_3);
  2824. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  2825. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  2826. return new WarningMoreExceed();
  2827. }
  2828. TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  2829. //2025年02月21日10:32:42 在这里处理额外的其他报警项
  2830. //该类型的断点历史报警
  2831. TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
  2832. Date nowDate = DateUtils.getNowDate();
  2833. //是否存在断点
  2834. if(!Objects.isNull(tXinyiIndustry1)){
  2835. if(existsBreakPoints(currentVal, category, tXinyiIndustry1)){
  2836. //关闭同类型的其他报警
  2837. //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
  2838. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  2839. breakpoint = true;
  2840. //触发报警 并且模拟大模型返回决策问答数据
  2841. //插入该类型报警
  2842. warningRecord.setTime(nowDate);
  2843. warningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());
  2844. warningRecord.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
  2845. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  2846. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  2847. warningRecord.setCreateTime(nowDate);
  2848. warningRecord.setWarningVal(currentVal);
  2849. warningRecord.setDesignVal(jsBzz);
  2850. warningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  2851. warningRecord.setCwrwfhz(cwrwfhz);
  2852. warningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  2853. //存起来
  2854. warningMoreExceed.setBreakPointWarningRecord(warningRecord);
  2855. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  2856. //同时处理决策 不用调用大模型,本地处理问答
  2857. // addChatRecordByBreakPointsSingle(warningRecord, tXinyiIndustry, normConfig, category);
  2858. }
  2859. }
  2860. //该类型的连续不变报警
  2861. TXinyiWarningRecord warningRecordNoChangeSingle = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode()).status(0).build();
  2862. //是否存在连续不变的数据
  2863. if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_3){
  2864. //2025年02月21日14:20:41 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
  2865. if(existsNoChange(currentVal, category, tXinyiIndustries)){
  2866. //关闭同类型的其他报警‘
  2867. //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
  2868. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode());
  2869. noChange = true;
  2870. //触发报警 并且模拟大模型返回决策问答数据
  2871. //插入该类型报警
  2872. warningRecordNoChangeSingle.setType(0);
  2873. warningRecordNoChangeSingle.setCategory(category);
  2874. warningRecordNoChangeSingle.setTime(nowDate);
  2875. warningRecordNoChangeSingle.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getMsg());
  2876. warningRecordNoChangeSingle.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
  2877. warningRecordNoChangeSingle.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getCode());
  2878. warningRecordNoChangeSingle.setCreateBy(WARNING_DEFAULT_CREATE);
  2879. warningRecordNoChangeSingle.setCreateTime(nowDate);
  2880. warningRecordNoChangeSingle.setWarningVal(currentVal);
  2881. warningRecord.setDesignVal(jsBzz);
  2882. warningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  2883. warningRecord.setCwrwfhz(cwrwfhz);
  2884. warningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  2885. //存起来
  2886. warningMoreExceed.setNoChangeWarningRecord(warningRecordNoChangeSingle);
  2887. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordNoChangeSingle);
  2888. //同时处理决策 不用调用大模型,本地处理问答
  2889. // addChatRecordByNoChangeSingle(warningRecordNoChangeSingle, tXinyiIndustry, normConfig, category);
  2890. }
  2891. }
  2892. warningMoreExceed.setBreakpoint(breakpoint);
  2893. warningMoreExceed.setNoChange(noChange);
  2894. return warningMoreExceed;
  2895. }
  2896. /**
  2897. * [化验室]通过输入的值 生成对应类型的报警对象(进水)
  2898. * 化验室只有断点报警,没有连续不变报警(因为化验室数据本身就是4-8个小时一轮 是重复的)
  2899. * @param currentVal
  2900. * @param category
  2901. * @return
  2902. */
  2903. private WarningMoreExceed handleXinYiWarningRecordRobotMore(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
  2904. WarningMoreExceed warningMoreExceed = new WarningMoreExceed();
  2905. boolean breakpoint = false;
  2906. Date nowDate = DateUtils.getNowDate();
  2907. List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_3);
  2908. if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < 3){
  2909. log.error("处理连续检测报警时,获取最近的3条化验数据失败~~~~~~~");
  2910. return new WarningMoreExceed();
  2911. }
  2912. TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时
  2913. //2025年02月21日10:32:42 在这里处理额外的其他报警项
  2914. //该类型的断点历史报警
  2915. TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
  2916. //是否存在断点
  2917. if(!Objects.isNull(tXinyiRobot1)){
  2918. if(existsRobotBreakPoints(currentVal, category, tXinyiRobot1)){
  2919. //关闭同类型的其他报警
  2920. //2025年02月25日14:45:09 不用在此关闭,因为在后续处理的时候,判断是单一报警还是多指标表报警的时候,都做了对应的关闭。
  2921. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  2922. breakpoint = true;
  2923. //触发报警 并且模拟大模型返回决策问答数据
  2924. //插入该类型报警
  2925. warningRecord.setTime(nowDate);
  2926. warningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());
  2927. warningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  2928. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  2929. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  2930. warningRecord.setCreateTime(nowDate);
  2931. warningRecord.setWarningVal(currentVal);
  2932. warningRecord.setDesignVal(csBzz);
  2933. warningRecord.setControlVal(csGkz);
  2934. warningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
  2935. warningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
  2936. warningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
  2937. //存起来
  2938. warningMoreExceed.setBreakPointWarningRecord(warningRecord);
  2939. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  2940. //同时处理决策 不用调用大模型,本地处理问答
  2941. // addChatRecordByBreakPointsSingle(warningRecord, tXinyiIndustry, normConfig, category);
  2942. }
  2943. }
  2944. warningMoreExceed.setBreakpoint(breakpoint);
  2945. return warningMoreExceed;
  2946. }
  2947. /**
  2948. * 通过输入的值 生成对应类型的报警对象(进水)
  2949. *
  2950. * @param jsBzz
  2951. * @param currentVal
  2952. * @param category
  2953. * @param tXinyiIndustry
  2954. * @param normConfig
  2955. * @param cwrwfhz
  2956. * @return
  2957. */
  2958. private void handleXinYiWarningRecordJSOrigin(BigDecimal jsBzz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
  2959. Date nowDate = DateUtils.getNowDate();
  2960. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(INT_3);
  2961. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  2962. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  2963. return ;
  2964. }
  2965. TXinyiIndustry tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  2966. //单点突变-异常升高报警
  2967. TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
  2968. List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
  2969. //是否存在异常升高的问题
  2970. if(!CollectionUtils.isEmpty(tXinyiIndustries) && tXinyiIndustries.size() == INT_3){
  2971. //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
  2972. BigDecimal exceedVal = existsYCSG(currentVal, category, tXinyiIndustries);
  2973. if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
  2974. //关闭同类型的其他报警
  2975. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
  2976. //触发报警 并且模拟大模型返回决策问答数据
  2977. if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
  2978. //插入该类型报警
  2979. warningRecordYCSG.setTime(nowDate);
  2980. warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
  2981. warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
  2982. warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
  2983. warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
  2984. warningRecordYCSG.setCreateTime(nowDate);
  2985. warningRecordYCSG.setWarningVal(currentVal);
  2986. warningRecordYCSG.setDesignVal(jsBzz);
  2987. warningRecordYCSG.setRemark(ZERO_SZ_WARNING.getCode());
  2988. warningRecordYCSG.setCwrwfhz(cwrwfhz);
  2989. warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  2990. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
  2991. //同时处理决策 不用调用大模型,本地处理问答
  2992. addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal);
  2993. }else{
  2994. log.info("工业库报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
  2995. }
  2996. //后续的报警不再进行
  2997. log.info("工业库报警的时候,发现存在{}异常升高的报警,后续报警不再处理", category);
  2998. return;
  2999. }else{//不存在 查看历史是否有报警,有的话关闭
  3000. if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
  3001. TXinyiWarningRecord warningRecordExists = tXinyiNoChangeYCSGRecords.get(0);
  3002. warningRecordExists.setStatus(2);
  3003. warningRecordExists.setOffTime(nowDate);
  3004. warningRecordExists.setUpdateTime(nowDate);
  3005. warningRecordExists.setUpdateBy(WARNING_DEFAULT_CREATE);
  3006. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordExists);
  3007. }
  3008. }
  3009. }
  3010. //单点突变-异常偏低报警
  3011. //2025年03月03日15:00:55 异常偏低的报警暂时不需要了
  3012. // TXinyiWarningRecord warningRecordYCPD = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode()).status(0).build();
  3013. // List<TXinyiWarningRecord> tXinyiNoChangeYCPDRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCPD);
  3014. // //是否存在异常偏低的问题
  3015. // if(!Objects.isNull(tXinyiIndustry1)){
  3016. // //2025年02月21日15:05:41 这里只需要比较当前值和标准值的差 以及上个小时的值和标准值的差 所以不用取最近3个小时的
  3017. // BigDecimal exceedVal = existsYCPD(currentVal, category, tXinyiIndustry1, jsBzz);
  3018. // if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
  3019. // //关闭同类型的其他报警
  3020. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode());
  3021. // //触发报警 并且模拟大模型返回决策问答数据
  3022. // if(CollectionUtils.isEmpty(tXinyiNoChangeYCPDRecords)){
  3023. // //插入该类型报警
  3024. // warningRecordYCPD.setType(0);
  3025. // warningRecordYCPD.setCategory(category);
  3026. // warningRecordYCPD.setTime(nowDate);
  3027. // warningRecordYCPD.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getMsg());
  3028. // warningRecordYCPD.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
  3029. // warningRecordYCPD.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode());
  3030. // warningRecordYCPD.setCreateBy(WARNING_DEFAULT_CREATE);
  3031. // warningRecordYCPD.setCreateTime(nowDate);
  3032. // warningRecordYCPD.setWarningVal(currentVal);
  3033. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCPD);
  3034. // //同时处理决策 不用调用大模型,本地处理问答
  3035. // addChatRecordByYCPD(warningRecordYCPD, tXinyiIndustry, normConfig, category, exceedVal);
  3036. // }else{
  3037. // log.info("工业库报警的时候,发现存在异常偏低的报警,并且已经有该类型报警了,不做任何处理");
  3038. // }
  3039. // //后续的报警不再进行
  3040. // return;
  3041. // }else{//不存在 查看历史是否有报警,有的话关闭
  3042. // if(!CollectionUtils.isEmpty(tXinyiNoChangeYCPDRecords)){
  3043. // TXinyiWarningRecord warningRecordExists = tXinyiNoChangeYCPDRecords.get(0);
  3044. // warningRecordExists.setStatus(2);
  3045. // warningRecordExists.setOffTime(nowDate);
  3046. // warningRecordExists.setUpdateTime(nowDate);
  3047. // warningRecordExists.setUpdateBy(WARNING_DEFAULT_CREATE);
  3048. // this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordExists);
  3049. // }
  3050. // }
  3051. // }
  3052. BigDecimal multiply = jsBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  3053. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  3054. /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
  3055. tXinyiWarningRecord.setStatus(0);
  3056. tXinyiWarningRecord.setType(0);
  3057. tXinyiWarningRecord.setCategory(category);
  3058. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  3059. tXinyiWarningRecord.setWarningVal(currentVal);
  3060. tXinyiWarningRecord.setDesignVal(jsBzz);
  3061. // tXinyiWarningRecord.setControlVal(csGkz);
  3062. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  3063. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  3064. tXinyiWarningRecord.setRemark(ZERO_SZ_WARNING.getCode());
  3065. //2025年02月10日14:45:08 下面是新增加的字段
  3066. tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.JS.getCode());
  3067. //超污染物限制:计算公式为:当前氨氮/氨氮设计值 或者 当前氨氮/氨氮管控值(智能工单使用) 这里是出水的 【需要根据超标还是超管控,具体计算】
  3068. //超污染物负荷值:计算公式为:当前水量与氨氮乘积 / 设计水量与设计进水氨氮的乘积(智能工单使用)
  3069. tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:48:32 具体的值由上游传过来
  3070. //2024年5月25日17:52:33 如果工业库获取不到数据,也触发报警,但是不调用决策接口
  3071. if(Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0){
  3072. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  3073. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  3074. }else if(currentVal.compareTo(multiply) > 0){//一级
  3075. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  3076. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  3077. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  3078. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  3079. }else if(currentVal.compareTo(jsBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  3080. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  3081. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  3082. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  3083. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  3084. }else{
  3085. tXinyiWarningRecord = null;//这种的无需处理
  3086. }
  3087. /*else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  3088. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  3089. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  3090. }*/
  3091. //最近3条输出 连续升高趋势 和 新增的报警都需要
  3092. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  3093. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().type(0).category(category).status(0).build());
  3094. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  3095. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  3096. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  3097. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  3098. xinyiWarningRecord.setStatus(2);
  3099. xinyiWarningRecord.setOffTime(nowDate);
  3100. xinyiWarningRecord.setUpdateTime(nowDate);
  3101. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  3102. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  3103. }
  3104. }
  3105. }else{//有告警信息
  3106. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  3107. //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
  3108. if(CollectionUtils.isEmpty(tXinyiIndustries) || tXinyiIndustries.size() < 3){
  3109. log.error("处理生化报警时,获取最近的3条工业库数据失败~~~~~~~");
  3110. return ;
  3111. }
  3112. tXinyiIndustry1 = tXinyiIndustries.get(INDEX_1);//前一个小时
  3113. TXinyiIndustry tXinyiIndustry2 = tXinyiIndustries.get(INDEX_2);//前两个小时
  3114. if(!this.judgeContinuousIndustry(tXinyiIndustry1, tXinyiIndustry2, category)){
  3115. log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiIndustry1), JSON.toJSONString(tXinyiIndustry2));
  3116. return ;
  3117. }
  3118. //保存到数据库中
  3119. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  3120. tXinyiWarningRecord.setUpdateTime(nowDate);
  3121. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  3122. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  3123. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  3124. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  3125. }else {
  3126. //继续调用决策
  3127. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  3128. }
  3129. }else{
  3130. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  3131. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  3132. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  3133. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  3134. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  3135. }else {
  3136. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  3137. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  3138. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  3139. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  3140. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  3141. xinyiWarningRecord.setUpdateTime(nowDate);
  3142. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  3143. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  3144. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  3145. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  3146. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  3147. //更新数据库
  3148. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  3149. //继续调用决策
  3150. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, false, nowDate);
  3151. }
  3152. }
  3153. }
  3154. }
  3155. }
  3156. /**
  3157. * 先判断该指标计算值是否大于最低阈值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
  3158. * 一个字段返回用作2个地方
  3159. *
  3160. * @param currentVal
  3161. * @param category
  3162. * @param tXinyiIndustry1
  3163. * @param bzz
  3164. * @return
  3165. */
  3166. private BigDecimal existsYCPD(BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry1, BigDecimal bzz) {
  3167. BigDecimal result = null;//默认不超标
  3168. BigDecimal compareVal = BigDecimal.valueOf(YCPD_VAL_CONF);
  3169. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  3170. BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  3171. if(!Objects.isNull(currentVal) && !Objects.isNull(csCod1)){
  3172. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3173. BigDecimal divide2 = bzz.subtract(csCod1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3174. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3175. result = divide1;
  3176. }
  3177. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  3178. BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  3179. if(!Objects.isNull(currentVal) && !Objects.isNull(csSs1)){
  3180. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3181. BigDecimal divide2 = bzz.subtract(csSs1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3182. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3183. result = divide1;
  3184. }
  3185. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  3186. BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  3187. if(!Objects.isNull(currentVal) && !Objects.isNull(csTn1)){
  3188. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3189. BigDecimal divide2 = bzz.subtract(csTn1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3190. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3191. result = divide1;
  3192. }
  3193. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  3194. BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  3195. if(!Objects.isNull(currentVal) && !Objects.isNull(csTp1)){
  3196. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3197. BigDecimal divide2 = bzz.subtract(csTp1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3198. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3199. result = divide1;
  3200. }
  3201. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  3202. BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  3203. if(!Objects.isNull(currentVal) && !Objects.isNull(csNh31)){
  3204. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3205. BigDecimal divide2 = bzz.subtract(csNh31).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3206. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3207. result = divide1;
  3208. }
  3209. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  3210. BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  3211. if(!Objects.isNull(currentVal) && !Objects.isNull(jsCod1)){
  3212. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3213. BigDecimal divide2 = bzz.subtract(jsCod1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3214. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3215. result = divide1;
  3216. }
  3217. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  3218. BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  3219. if(!Objects.isNull(currentVal) && !Objects.isNull(jsSs1)){
  3220. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3221. BigDecimal divide2 = bzz.subtract(jsSs1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3222. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3223. result = divide1;
  3224. }
  3225. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  3226. BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  3227. if(!Objects.isNull(currentVal) && !Objects.isNull(jsTn1)){
  3228. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3229. BigDecimal divide2 = bzz.subtract(jsTn1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3230. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3231. result = divide1;
  3232. }
  3233. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  3234. BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  3235. if(!Objects.isNull(currentVal) && !Objects.isNull(jsTp1)){
  3236. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3237. BigDecimal divide2 = bzz.subtract(jsTp1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3238. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3239. result = divide1;
  3240. }
  3241. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  3242. BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  3243. if(!Objects.isNull(currentVal) && !Objects.isNull(jsNh31)){
  3244. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3245. BigDecimal divide2 = bzz.subtract(jsNh31).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3246. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3247. result = divide1;
  3248. }
  3249. }else{
  3250. log.error("暂时还不支持的报警类型~~~~");
  3251. }
  3252. return result;
  3253. }
  3254. /**
  3255. *
  3256. * 【工业库异常升高】先判断该指标是否超过最大值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
  3257. * 一个字段返回用作2个地方
  3258. * 2025年03月06日10:35:30 判断是否超标,不再获取最近3个小时;最近2个小时比较即可。
  3259. * @param currentVal
  3260. * @param category
  3261. * @param industryList
  3262. * @return
  3263. */
  3264. private BigDecimal existsYCSG(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
  3265. // BigDecimal result = null;//默认不超标
  3266. // TXinyiIndustry tXinyiIndustry1 = industryList.get(INDEX_1);
  3267. // TXinyiIndustry tXinyiIndustry2 = industryList.get(INDEX_2);
  3268. // BigDecimal compareVal = BigDecimal.valueOf(YCSG_VAL_CONF);
  3269. // if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  3270. // BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  3271. // BigDecimal csCod2 = tXinyiIndustry2.getCsCod();
  3272. // if(!Objects.isNull(currentVal) && !Objects.isNull(csCod1) && !Objects.isNull(csCod2)){
  3273. // BigDecimal divide1 = currentVal.subtract(csCod1).divide(csCod1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3274. // BigDecimal divide2 = csCod1.subtract(csCod2).divide(csCod2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3275. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3276. // result = divide1;
  3277. // }
  3278. // }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  3279. // BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  3280. // BigDecimal csSs2 = tXinyiIndustry2.getCsSs();
  3281. // if(!Objects.isNull(currentVal) && !Objects.isNull(csSs1) && !Objects.isNull(csSs2)){
  3282. // BigDecimal divide1 = currentVal.subtract(csSs1).divide(csSs1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3283. // BigDecimal divide2 = csSs1.subtract(csSs2).divide(csSs2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3284. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3285. // result = divide1;
  3286. // }
  3287. // }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  3288. // BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  3289. // BigDecimal csTn2 = tXinyiIndustry2.getCsTn();
  3290. // if(!Objects.isNull(currentVal) && !Objects.isNull(csTn1)){
  3291. // BigDecimal divide1 = currentVal.subtract(csTn1).divide(csTn1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3292. // BigDecimal divide2 = csTn1.subtract(csTn2).divide(csTn2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3293. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3294. // result = divide1;
  3295. // }
  3296. // }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  3297. // BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  3298. // BigDecimal csTp2 = tXinyiIndustry2.getCsTp();
  3299. // if(!Objects.isNull(currentVal) && !Objects.isNull(csTp1)){
  3300. // BigDecimal divide1 = currentVal.subtract(csTp1).divide(csTp1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3301. // BigDecimal divide2 = csTp1.subtract(csTp2).divide(csTp2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3302. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3303. // result = divide1;
  3304. // }
  3305. // }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  3306. // BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  3307. // BigDecimal csNh32 = tXinyiIndustry2.getCsNh3();
  3308. // if(!Objects.isNull(currentVal) && !Objects.isNull(csNh31)){
  3309. // BigDecimal divide1 = currentVal.subtract(csNh31).divide(csNh31, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3310. // BigDecimal divide2 = csNh31.subtract(csNh32).divide(csNh32, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3311. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3312. // result = divide1;
  3313. // }
  3314. // }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  3315. // BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  3316. // BigDecimal jsCod2 = tXinyiIndustry2.getJsCod();
  3317. // if(!Objects.isNull(currentVal) && !Objects.isNull(jsCod1)){
  3318. // BigDecimal divide1 = currentVal.subtract(jsCod1).divide(jsCod1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3319. // BigDecimal divide2 = jsCod1.subtract(jsCod2).divide(jsCod2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3320. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3321. // result = divide1;
  3322. // }
  3323. // }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  3324. // BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  3325. // BigDecimal jsSs2 = tXinyiIndustry2.getJsSs();
  3326. // if(!Objects.isNull(currentVal) && !Objects.isNull(jsSs1)){
  3327. // BigDecimal divide1 = currentVal.subtract(jsSs1).divide(jsSs1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3328. // BigDecimal divide2 = jsSs1.subtract(jsSs2).divide(jsSs2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3329. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3330. // result = divide1;
  3331. // }
  3332. // }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  3333. // BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  3334. // BigDecimal jsTn2 = tXinyiIndustry2.getJsTn();
  3335. // if(!Objects.isNull(currentVal) && !Objects.isNull(jsTn1)){
  3336. // BigDecimal divide1 = currentVal.subtract(jsTn1).divide(jsTn1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3337. // BigDecimal divide2 = jsTn1.subtract(jsTn2).divide(jsTn2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3338. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3339. // result = divide1;
  3340. // }
  3341. // }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  3342. // BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  3343. // BigDecimal jsTp2 = tXinyiIndustry2.getJsTp();
  3344. // if(!Objects.isNull(currentVal) && !Objects.isNull(jsTp1)){
  3345. // BigDecimal divide1 = currentVal.subtract(jsTp1).divide(jsTp1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3346. // BigDecimal divide2 = jsTp1.subtract(jsTp2).divide(jsTp2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3347. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3348. // result = divide1;
  3349. // }
  3350. // }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  3351. // BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  3352. // BigDecimal jsNh32 = tXinyiIndustry2.getJsNh3();
  3353. // if(!Objects.isNull(currentVal) && !Objects.isNull(jsNh31)){
  3354. // BigDecimal divide1 = currentVal.subtract(jsNh31).divide(jsNh31, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3355. // BigDecimal divide2 = jsNh31.subtract(jsNh32).divide(jsNh32, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3356. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3357. // result = divide1;
  3358. // }
  3359. // }else{
  3360. // log.error("暂时还不支持的报警类型~~~~");
  3361. // }
  3362. // return result;
  3363. BigDecimal result = null;//默认不超标
  3364. TXinyiIndustry tXinyiIndustry1 = industryList.get(INDEX_1);
  3365. BigDecimal compareVal = BigDecimal.valueOf(YCSG_VAL_CONF);
  3366. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  3367. BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  3368. if(!Objects.isNull(currentVal) && !Objects.isNull(csCod1)){
  3369. BigDecimal divide1 = currentVal.subtract(csCod1).divide(csCod1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3370. if(divide1.compareTo(compareVal) > 0)
  3371. result = divide1;
  3372. }
  3373. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  3374. BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  3375. if(!Objects.isNull(currentVal) && !Objects.isNull(csSs1)){
  3376. BigDecimal divide1 = currentVal.subtract(csSs1).divide(csSs1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3377. if(divide1.compareTo(compareVal) > 0)
  3378. result = divide1;
  3379. }
  3380. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  3381. BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  3382. if(!Objects.isNull(currentVal) && !Objects.isNull(csTn1)){
  3383. BigDecimal divide1 = currentVal.subtract(csTn1).divide(csTn1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3384. if(divide1.compareTo(compareVal) > 0)
  3385. result = divide1;
  3386. }
  3387. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  3388. BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  3389. if(!Objects.isNull(currentVal) && !Objects.isNull(csTp1)){
  3390. BigDecimal divide1 = currentVal.subtract(csTp1).divide(csTp1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3391. if(divide1.compareTo(compareVal) > 0)
  3392. result = divide1;
  3393. }
  3394. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  3395. BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  3396. if(!Objects.isNull(currentVal) && !Objects.isNull(csNh31)){
  3397. BigDecimal divide1 = currentVal.subtract(csNh31).divide(csNh31, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3398. if(divide1.compareTo(compareVal) > 0)
  3399. result = divide1;
  3400. }
  3401. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  3402. BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  3403. if(!Objects.isNull(currentVal) && !Objects.isNull(jsCod1)){
  3404. BigDecimal divide1 = currentVal.subtract(jsCod1).divide(jsCod1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3405. if(divide1.compareTo(compareVal) > 0)
  3406. result = divide1;
  3407. }
  3408. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  3409. BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  3410. if(!Objects.isNull(currentVal) && !Objects.isNull(jsSs1)){
  3411. BigDecimal divide1 = currentVal.subtract(jsSs1).divide(jsSs1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3412. if(divide1.compareTo(compareVal) > 0)
  3413. result = divide1;
  3414. }
  3415. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  3416. BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  3417. if(!Objects.isNull(currentVal) && !Objects.isNull(jsTn1)){
  3418. BigDecimal divide1 = currentVal.subtract(jsTn1).divide(jsTn1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3419. if(divide1.compareTo(compareVal) > 0)
  3420. result = divide1;
  3421. }
  3422. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  3423. BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  3424. if(!Objects.isNull(currentVal) && !Objects.isNull(jsTp1)){
  3425. BigDecimal divide1 = currentVal.subtract(jsTp1).divide(jsTp1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3426. if(divide1.compareTo(compareVal) > 0)
  3427. result = divide1;
  3428. }
  3429. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  3430. BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  3431. if(!Objects.isNull(currentVal) && !Objects.isNull(jsNh31)){
  3432. BigDecimal divide1 = currentVal.subtract(jsNh31).divide(jsNh31, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3433. if(divide1.compareTo(compareVal) > 0)
  3434. result = divide1;
  3435. }
  3436. }else{
  3437. log.error("暂时还不支持的报警类型~~~~");
  3438. }
  3439. return result;
  3440. }
  3441. /**
  3442. *
  3443. * 【化验室异常升高】先判断该指标是否超过最大值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
  3444. * 一个字段返回用作2个地方
  3445. * 2025年03月06日10:40:54 不再用连续2个小时超标,只判断当前值和上个小时的值比较
  3446. * @param currentVal
  3447. * @param category
  3448. * @param tXinyiRobots
  3449. * @return
  3450. */
  3451. private BigDecimal existsRobotYCSG(BigDecimal currentVal, String category, List<TXinyiRobot> tXinyiRobots) {
  3452. // BigDecimal result = null;//默认不超标
  3453. // TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);
  3454. // TXinyiRobot tXinyiRobot2 = tXinyiRobots.get(INDEX_2);
  3455. // BigDecimal compareVal = BigDecimal.valueOf(YCSG_VAL_CONF);
  3456. // if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
  3457. // BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  3458. // BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj1Jqr();
  3459. // if(!Objects.isNull(currentVal) && !Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2)){
  3460. // BigDecimal divide1 = currentVal.subtract(no3Hlj1Jqr1).divide(no3Hlj1Jqr1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3461. // BigDecimal divide2 = no3Hlj1Jqr1.subtract(no3Hlj1Jqr2).divide(no3Hlj1Jqr2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3462. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3463. // result = divide1;
  3464. // }
  3465. // }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
  3466. // BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  3467. // BigDecimal no3Hlj2Jqr2 = tXinyiRobot2.getNo3Hlj2Jqr();
  3468. // if(!Objects.isNull(currentVal) && !Objects.isNull(no3Hlj2Jqr1) && !Objects.isNull(no3Hlj2Jqr2)){
  3469. // BigDecimal divide1 = currentVal.subtract(no3Hlj2Jqr1).divide(no3Hlj2Jqr1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3470. // BigDecimal divide2 = no3Hlj2Jqr1.subtract(no3Hlj2Jqr2).divide(no3Hlj2Jqr2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3471. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3472. // result = divide1;
  3473. // }
  3474. // }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
  3475. // BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
  3476. // BigDecimal tpRccJqr2 = tXinyiRobot2.getTpRccJqr();
  3477. // if(!Objects.isNull(currentVal) && !Objects.isNull(tpRccJqr1) && !Objects.isNull(tpRccJqr2)){
  3478. // BigDecimal divide1 = currentVal.subtract(tpRccJqr1).divide(tpRccJqr1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3479. // BigDecimal divide2 = tpRccJqr1.subtract(tpRccJqr2).divide(tpRccJqr2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3480. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3481. // result = divide1;
  3482. // }
  3483. // }else if(BusinessEnum.WarningCategoryEnum.ROBOT_CS_AD.getCode().equals(category)){//2025年02月25日16:23:08 合并一个指标:出水氨氮 通过计算获得
  3484. // //计算得到对应的值
  3485. // //计算1(1池)
  3486. // BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
  3487. // BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
  3488. // BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
  3489. // if(Objects.isNull(no3Qyc1Jqr11))
  3490. // no3Qyc1Jqr11 = BigDecimal.ZERO;
  3491. // if(Objects.isNull(nh31Jqr11))
  3492. // nh31Jqr11 = BigDecimal.ZERO;
  3493. // if(Objects.isNull(no3Hlj1Jqr11))
  3494. // no3Hlj1Jqr11 = BigDecimal.ZERO;
  3495. // BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
  3496. // //计算1(2池)
  3497. // BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
  3498. // BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
  3499. // BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
  3500. // if(Objects.isNull(no3Qyc1Jqr12))
  3501. // no3Qyc1Jqr12 = BigDecimal.ZERO;
  3502. // if(Objects.isNull(nh31Jqr12))
  3503. // nh31Jqr12 = BigDecimal.ZERO;
  3504. // if(Objects.isNull(no3Hlj1Jqr12))
  3505. // no3Hlj1Jqr12 = BigDecimal.ZERO;
  3506. // BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
  3507. // BigDecimal anDan1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3508. //
  3509. // //计算2(1池)
  3510. // BigDecimal no3Qyc1Jqr21 = tXinyiRobot2.getNo3Qyc1Jqr();
  3511. // BigDecimal nh31Jqr21 = tXinyiRobot2.getNh31Jqr();
  3512. // BigDecimal no3Hlj1Jqr21 = tXinyiRobot2.getNo3Hlj1Jqr();
  3513. // if(Objects.isNull(no3Qyc1Jqr21))
  3514. // no3Qyc1Jqr21 = BigDecimal.ZERO;
  3515. // if(Objects.isNull(nh31Jqr21))
  3516. // nh31Jqr21 = BigDecimal.ZERO;
  3517. // if(Objects.isNull(no3Hlj1Jqr21))
  3518. // no3Hlj1Jqr21 = BigDecimal.ZERO;
  3519. // BigDecimal anDan21 = no3Qyc1Jqr21.add(nh31Jqr21).subtract(no3Hlj1Jqr21);
  3520. // //计算2(2池)
  3521. // BigDecimal no3Qyc1Jqr22 = tXinyiRobot2.getNo3Qyc2Jqr();
  3522. // BigDecimal nh31Jqr22 = tXinyiRobot2.getNh32Jqr();
  3523. // BigDecimal no3Hlj1Jqr22 = tXinyiRobot2.getNo3Hlj2Jqr();
  3524. // if(Objects.isNull(no3Qyc1Jqr22))
  3525. // no3Qyc1Jqr22 = BigDecimal.ZERO;
  3526. // if(Objects.isNull(nh31Jqr22))
  3527. // nh31Jqr22 = BigDecimal.ZERO;
  3528. // if(Objects.isNull(no3Hlj1Jqr22))
  3529. // no3Hlj1Jqr22 = BigDecimal.ZERO;
  3530. // BigDecimal anDan22 = no3Qyc1Jqr22.add(nh31Jqr22).subtract(no3Hlj1Jqr22);
  3531. // BigDecimal anDan2 = anDan21.add(anDan22).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3532. //
  3533. // if(!Objects.isNull(currentVal) && !Objects.isNull(anDan1) && !Objects.isNull(anDan2)){
  3534. // BigDecimal divide1 = currentVal.subtract(anDan1).divide(anDan1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3535. // BigDecimal divide2 = anDan1.subtract(anDan2).divide(anDan2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3536. // if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3537. // result = divide1;
  3538. // }
  3539. // }else{
  3540. // log.error("化验室暂时还不支持的报警类型~~~~");
  3541. // }
  3542. // return result;
  3543. BigDecimal result = null;//默认不超标
  3544. TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);
  3545. BigDecimal compareVal = BigDecimal.valueOf(YCSG_VAL_CONF);
  3546. if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
  3547. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  3548. if(!Objects.isNull(currentVal) && !Objects.isNull(no3Hlj1Jqr1)){
  3549. BigDecimal divide1 = currentVal.subtract(no3Hlj1Jqr1).divide(no3Hlj1Jqr1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3550. if(divide1.compareTo(compareVal) > 0)
  3551. result = divide1;
  3552. }
  3553. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
  3554. BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  3555. if(!Objects.isNull(currentVal) && !Objects.isNull(no3Hlj2Jqr1) ){
  3556. BigDecimal divide1 = currentVal.subtract(no3Hlj2Jqr1).divide(no3Hlj2Jqr1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3557. if(divide1.compareTo(compareVal) > 0)
  3558. result = divide1;
  3559. }
  3560. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
  3561. BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
  3562. if(!Objects.isNull(currentVal) && !Objects.isNull(tpRccJqr1)){
  3563. BigDecimal divide1 = currentVal.subtract(tpRccJqr1).divide(tpRccJqr1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3564. if(divide1.compareTo(compareVal) > 0)
  3565. result = divide1;
  3566. }
  3567. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_CS_AD.getCode().equals(category)){//2025年02月25日16:23:08 合并一个指标:出水氨氮 通过计算获得
  3568. //计算得到对应的值
  3569. //计算1(1池)
  3570. BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
  3571. BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
  3572. BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
  3573. if(Objects.isNull(no3Qyc1Jqr11))
  3574. no3Qyc1Jqr11 = BigDecimal.ZERO;
  3575. if(Objects.isNull(nh31Jqr11))
  3576. nh31Jqr11 = BigDecimal.ZERO;
  3577. if(Objects.isNull(no3Hlj1Jqr11))
  3578. no3Hlj1Jqr11 = BigDecimal.ZERO;
  3579. BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
  3580. //计算1(2池)
  3581. BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
  3582. BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
  3583. BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
  3584. if(Objects.isNull(no3Qyc1Jqr12))
  3585. no3Qyc1Jqr12 = BigDecimal.ZERO;
  3586. if(Objects.isNull(nh31Jqr12))
  3587. nh31Jqr12 = BigDecimal.ZERO;
  3588. if(Objects.isNull(no3Hlj1Jqr12))
  3589. no3Hlj1Jqr12 = BigDecimal.ZERO;
  3590. BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
  3591. BigDecimal anDan1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3592. if(!Objects.isNull(currentVal) && !Objects.isNull(anDan1)){
  3593. BigDecimal divide1 = currentVal.subtract(anDan1).divide(anDan1, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3594. if(divide1.compareTo(compareVal) > 0)
  3595. result = divide1;
  3596. }
  3597. }else{
  3598. log.error("化验室暂时还不支持的报警类型~~~~");
  3599. }
  3600. return result;
  3601. }
  3602. /**
  3603. *
  3604. * 【化验室异常偏低】先判断该指标计算值是否大于最低阈值,如果超过了,返回对应的超过的值; 如果没有超标,返回null。
  3605. * 一个字段返回用作2个地方
  3606. * @param currentVal
  3607. * @param category
  3608. * @param tXinyiRobot1
  3609. * @param bzz
  3610. * @return
  3611. */
  3612. private BigDecimal existsRobotYCPD(BigDecimal currentVal, String category, TXinyiRobot tXinyiRobot1, BigDecimal bzz) {
  3613. BigDecimal result = null;//默认不超标
  3614. BigDecimal compareVal = BigDecimal.valueOf(YCPD_VAL_CONF);
  3615. if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
  3616. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  3617. if(!Objects.isNull(currentVal) && !Objects.isNull(no3Hlj1Jqr1)){
  3618. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3619. BigDecimal divide2 = bzz.subtract(no3Hlj1Jqr1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3620. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3621. result = divide1;
  3622. }
  3623. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
  3624. BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  3625. if(!Objects.isNull(currentVal) && !Objects.isNull(no3Hlj2Jqr1)){
  3626. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3627. BigDecimal divide2 = bzz.subtract(no3Hlj2Jqr1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3628. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3629. result = divide1;
  3630. }
  3631. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
  3632. BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
  3633. if(!Objects.isNull(currentVal) && !Objects.isNull(tpRccJqr1)){
  3634. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3635. BigDecimal divide2 = bzz.subtract(tpRccJqr1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3636. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3637. result = divide1;
  3638. }
  3639. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_CS_AD.getCode().equals(category)){//2025年02月25日16:23:08 合并一个指标:出水氨氮 通过计算获得
  3640. //计算得到对应的值
  3641. //计算1(1池)
  3642. BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
  3643. BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
  3644. BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
  3645. if(Objects.isNull(no3Qyc1Jqr11))
  3646. no3Qyc1Jqr11 = BigDecimal.ZERO;
  3647. if(Objects.isNull(nh31Jqr11))
  3648. nh31Jqr11 = BigDecimal.ZERO;
  3649. if(Objects.isNull(no3Hlj1Jqr11))
  3650. no3Hlj1Jqr11 = BigDecimal.ZERO;
  3651. BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
  3652. //计算1(2池)
  3653. BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
  3654. BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
  3655. BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
  3656. if(Objects.isNull(no3Qyc1Jqr12))
  3657. no3Qyc1Jqr12 = BigDecimal.ZERO;
  3658. if(Objects.isNull(nh31Jqr12))
  3659. nh31Jqr12 = BigDecimal.ZERO;
  3660. if(Objects.isNull(no3Hlj1Jqr12))
  3661. no3Hlj1Jqr12 = BigDecimal.ZERO;
  3662. BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
  3663. BigDecimal anDan1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3664. if(!Objects.isNull(currentVal) && !Objects.isNull(anDan1)){
  3665. BigDecimal divide1 = bzz.subtract(currentVal).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3666. BigDecimal divide2 = bzz.subtract(anDan1).divide(bzz, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3667. if(divide1.compareTo(compareVal) > 0 && divide2.compareTo(compareVal) > 0)
  3668. result = divide1;
  3669. }
  3670. }else{
  3671. log.error("化验室暂时还不支持的报警类型~~~~");
  3672. }
  3673. return result;
  3674. }
  3675. /**
  3676. *
  3677. * 判断当前时间和上个时间段的值是否存在连续不变
  3678. * @param currentVal
  3679. * @param category
  3680. * @param industryList
  3681. * @return
  3682. */
  3683. private boolean existsNoChange(BigDecimal currentVal, String category, List<TXinyiIndustry> industryList) {
  3684. boolean result = false;//默认不超标
  3685. TXinyiIndustry tXinyiIndustry1 = industryList.get(INDEX_1);
  3686. TXinyiIndustry tXinyiIndustry2 = industryList.get(INDEX_2);
  3687. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  3688. BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  3689. BigDecimal csCod2 = tXinyiIndustry2.getCsCod();
  3690. if(!Objects.isNull(currentVal) && !Objects.isNull(csCod1) && currentVal.compareTo(csCod1) == 0 && !Objects.isNull(csCod2) && currentVal.compareTo(csCod2) == 0)
  3691. result = true;
  3692. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  3693. BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  3694. BigDecimal csSs2 = tXinyiIndustry2.getCsSs();
  3695. if(!Objects.isNull(currentVal) && !Objects.isNull(csSs1) && currentVal.compareTo(csSs1) == 0 && !Objects.isNull(csSs2) && currentVal.compareTo(csSs2) == 0)
  3696. result = true;
  3697. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  3698. BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  3699. BigDecimal csTn2 = tXinyiIndustry2.getCsTn();
  3700. if(!Objects.isNull(currentVal) && !Objects.isNull(csTn1) && currentVal.compareTo(csTn1) == 0 && !Objects.isNull(csTn2) && currentVal.compareTo(csTn2) == 0)
  3701. result = true;
  3702. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  3703. BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  3704. BigDecimal csTp2 = tXinyiIndustry2.getCsTp();
  3705. if(!Objects.isNull(currentVal) && !Objects.isNull(csTp1) && currentVal.compareTo(csTp1) == 0 && !Objects.isNull(csTp2) && currentVal.compareTo(csTp2) == 0)
  3706. result = true;
  3707. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  3708. BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  3709. BigDecimal csNh32 = tXinyiIndustry2.getCsNh3();
  3710. if(!Objects.isNull(currentVal) && !Objects.isNull(csNh31) && currentVal.compareTo(csNh31) == 0 && !Objects.isNull(csNh32) && currentVal.compareTo(csNh32) == 0)
  3711. result = true;
  3712. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  3713. BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  3714. BigDecimal jsCod2 = tXinyiIndustry2.getJsCod();
  3715. if(!Objects.isNull(currentVal) && !Objects.isNull(jsCod1) && currentVal.compareTo(jsCod1) == 0 && !Objects.isNull(jsCod2) && currentVal.compareTo(jsCod2) == 0)
  3716. result = true;
  3717. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  3718. BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  3719. BigDecimal jsSs2 = tXinyiIndustry2.getJsSs();
  3720. if(!Objects.isNull(currentVal) && !Objects.isNull(jsSs1) && currentVal.compareTo(jsSs1) == 0 && !Objects.isNull(jsSs2) && currentVal.compareTo(jsSs2) == 0)
  3721. result = true;
  3722. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  3723. BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  3724. BigDecimal jsTn2 = tXinyiIndustry2.getJsTn();
  3725. if(!Objects.isNull(currentVal) && !Objects.isNull(jsTn1) && currentVal.compareTo(jsTn1) == 0 && !Objects.isNull(jsTn2) && currentVal.compareTo(jsTn2) == 0)
  3726. result = true;
  3727. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  3728. BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  3729. BigDecimal jsTp2 = tXinyiIndustry2.getJsTp();
  3730. if(!Objects.isNull(currentVal) && !Objects.isNull(jsTp1) && currentVal.compareTo(jsTp1) == 0 && !Objects.isNull(jsTp2) && currentVal.compareTo(jsTp2) == 0)
  3731. result = true;
  3732. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  3733. BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  3734. BigDecimal jsNh32 = tXinyiIndustry2.getJsNh3();
  3735. if(!Objects.isNull(currentVal) && !Objects.isNull(jsNh31) && currentVal.compareTo(jsNh31) == 0 && !Objects.isNull(jsNh32) && currentVal.compareTo(jsNh32) == 0)
  3736. result = true;
  3737. }else{
  3738. log.error("暂时还不支持的报警类型~~~~");
  3739. }
  3740. return result;
  3741. }
  3742. /**
  3743. *
  3744. * 判断当前时间和上个时间段的值是否存在断点
  3745. * @param currentVal
  3746. * @param category
  3747. * @param tXinyiIndustry1
  3748. * @return
  3749. */
  3750. private boolean existsBreakPoints(BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry1) {
  3751. boolean result = false;//默认不超标
  3752. boolean currentBreakpoint = Objects.isNull(currentVal) || BigDecimal.ZERO.compareTo(currentVal) == 0;
  3753. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  3754. BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  3755. if(currentBreakpoint && (Objects.isNull(csCod1) || BigDecimal.ZERO.compareTo(csCod1) == 0))
  3756. result = true;
  3757. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  3758. BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  3759. if(currentBreakpoint && (Objects.isNull(csSs1) || BigDecimal.ZERO.compareTo(csSs1) == 0))
  3760. result = true;
  3761. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  3762. BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  3763. if(currentBreakpoint && (Objects.isNull(csTn1) || BigDecimal.ZERO.compareTo(csTn1) == 0))
  3764. result = true;
  3765. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  3766. BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  3767. if(currentBreakpoint && (Objects.isNull(csTp1) || BigDecimal.ZERO.compareTo(csTp1) == 0))
  3768. result = true;
  3769. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  3770. BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  3771. if(currentBreakpoint && (Objects.isNull(csNh31) || BigDecimal.ZERO.compareTo(csNh31) == 0))
  3772. result = true;
  3773. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  3774. BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  3775. if(currentBreakpoint && (Objects.isNull(jsCod1) || BigDecimal.ZERO.compareTo(jsCod1) == 0))
  3776. result = true;
  3777. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  3778. BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  3779. if(currentBreakpoint && (Objects.isNull(jsSs1) || BigDecimal.ZERO.compareTo(jsSs1) == 0))
  3780. result = true;
  3781. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  3782. BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  3783. if(currentBreakpoint && (Objects.isNull(jsTn1) || BigDecimal.ZERO.compareTo(jsTn1) == 0))
  3784. result = true;
  3785. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  3786. BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  3787. if(currentBreakpoint && (Objects.isNull(jsTp1) || BigDecimal.ZERO.compareTo(jsTp1) == 0))
  3788. result = true;
  3789. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  3790. BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  3791. if(currentBreakpoint && (Objects.isNull(jsNh31) || BigDecimal.ZERO.compareTo(jsNh31) == 0))
  3792. result = true;
  3793. }else{
  3794. log.error("暂时还不支持的报警类型~~~~");
  3795. }
  3796. return result;
  3797. }
  3798. /**
  3799. *
  3800. * 判断当前时间和上个时间段的值是否存在断点
  3801. * @param currentVal
  3802. * @param category
  3803. * @param tXinyiRobot1
  3804. * @return
  3805. */
  3806. private boolean existsRobotBreakPoints(BigDecimal currentVal, String category, TXinyiRobot tXinyiRobot1) {
  3807. boolean result = false;//默认不超标
  3808. boolean currentBreakpoint = Objects.isNull(currentVal) || BigDecimal.ZERO.compareTo(currentVal) == 0;
  3809. if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
  3810. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  3811. if(currentBreakpoint && (Objects.isNull(no3Hlj1Jqr1) || BigDecimal.ZERO.compareTo(no3Hlj1Jqr1) == 0))
  3812. result = true;
  3813. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
  3814. BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  3815. if(currentBreakpoint && (Objects.isNull(no3Hlj2Jqr1) || BigDecimal.ZERO.compareTo(no3Hlj2Jqr1) == 0))
  3816. result = true;
  3817. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
  3818. BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
  3819. if(currentBreakpoint && (Objects.isNull(tpRccJqr1) || BigDecimal.ZERO.compareTo(tpRccJqr1) == 0))
  3820. result = true;
  3821. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_CS_AD.getCode().equals(category)){//2025年02月25日16:23:08 合并一个指标:出水氨氮 通过计算获得
  3822. //计算得到对应的值
  3823. //计算1(1池)
  3824. BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
  3825. BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
  3826. BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
  3827. if(Objects.isNull(no3Qyc1Jqr11))
  3828. no3Qyc1Jqr11 = BigDecimal.ZERO;
  3829. if(Objects.isNull(nh31Jqr11))
  3830. nh31Jqr11 = BigDecimal.ZERO;
  3831. if(Objects.isNull(no3Hlj1Jqr11))
  3832. no3Hlj1Jqr11 = BigDecimal.ZERO;
  3833. BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
  3834. //计算1(2池)
  3835. BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
  3836. BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
  3837. BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
  3838. if(Objects.isNull(no3Qyc1Jqr12))
  3839. no3Qyc1Jqr12 = BigDecimal.ZERO;
  3840. if(Objects.isNull(nh31Jqr12))
  3841. nh31Jqr12 = BigDecimal.ZERO;
  3842. if(Objects.isNull(no3Hlj1Jqr12))
  3843. no3Hlj1Jqr12 = BigDecimal.ZERO;
  3844. BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
  3845. BigDecimal anDan1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  3846. if(currentBreakpoint && (Objects.isNull(anDan1) || BigDecimal.ZERO.compareTo(anDan1) == 0))
  3847. result = true;
  3848. }else{
  3849. log.error("化验室暂时还不支持的报警类型~~~~");
  3850. }
  3851. return result;
  3852. }
  3853. private boolean judgeContinuousIndustry(TXinyiIndustry tXinyiIndustry1, TXinyiIndustry tXinyiIndustry2, String category) {
  3854. boolean result = false;//默认不超标
  3855. if(BusinessEnum.WarningCategoryEnum.CS_COD.getCode().equals(category)){
  3856. BigDecimal csCod1 = tXinyiIndustry1.getCsCod();
  3857. BigDecimal csCod2 = tXinyiIndustry2.getCsCod();
  3858. if(!Objects.isNull(csCod1) && !Objects.isNull(csCod2) && csCod1.compareTo(csCod2) > INT_0)
  3859. result = true;
  3860. }else if(BusinessEnum.WarningCategoryEnum.CS_SS.getCode().equals(category)){
  3861. BigDecimal csSs1 = tXinyiIndustry1.getCsSs();
  3862. BigDecimal csSs2 = tXinyiIndustry2.getCsSs();
  3863. if(!Objects.isNull(csSs1) && !Objects.isNull(csSs2) && csSs1.compareTo(csSs2) > INT_0)
  3864. result = true;
  3865. }else if(BusinessEnum.WarningCategoryEnum.CS_ZD.getCode().equals(category)){
  3866. BigDecimal csTn1 = tXinyiIndustry1.getCsTn();
  3867. BigDecimal csTn2 = tXinyiIndustry2.getCsTn();
  3868. if(!Objects.isNull(csTn1) && !Objects.isNull(csTn2) && csTn1.compareTo(csTn2) > INT_0)
  3869. result = true;
  3870. }else if(BusinessEnum.WarningCategoryEnum.CS_ZL.getCode().equals(category)){
  3871. BigDecimal csTp1 = tXinyiIndustry1.getCsTp();
  3872. BigDecimal csTp2 = tXinyiIndustry2.getCsTp();
  3873. if(!Objects.isNull(csTp1) && !Objects.isNull(csTp2) && csTp1.compareTo(csTp2) > INT_0)
  3874. result = true;
  3875. }else if(BusinessEnum.WarningCategoryEnum.CS_AD.getCode().equals(category)){
  3876. BigDecimal csNh31 = tXinyiIndustry1.getCsNh3();
  3877. BigDecimal csNh32 = tXinyiIndustry2.getCsNh3();
  3878. if(!Objects.isNull(csNh31) && !Objects.isNull(csNh32) && csNh31.compareTo(csNh32) > INT_0)
  3879. result = true;
  3880. }else if(BusinessEnum.WarningCategoryEnum.JS_COD.getCode().equals(category)){
  3881. BigDecimal jsCod1 = tXinyiIndustry1.getJsCod();
  3882. BigDecimal jsCod2 = tXinyiIndustry2.getJsCod();
  3883. if(!Objects.isNull(jsCod1) && !Objects.isNull(jsCod2) && jsCod1.compareTo(jsCod2) > INT_0)
  3884. result = true;
  3885. }else if(BusinessEnum.WarningCategoryEnum.JS_SS.getCode().equals(category)){
  3886. BigDecimal jsSs1 = tXinyiIndustry1.getJsSs();
  3887. BigDecimal jsSs2 = tXinyiIndustry2.getJsSs();
  3888. if(!Objects.isNull(jsSs1) && !Objects.isNull(jsSs2) && jsSs1.compareTo(jsSs2) > INT_0)
  3889. result = true;
  3890. }else if(BusinessEnum.WarningCategoryEnum.JS_ZD.getCode().equals(category)){
  3891. BigDecimal jsTn1 = tXinyiIndustry1.getJsTn();
  3892. BigDecimal jsTn2 = tXinyiIndustry2.getJsTn();
  3893. if(!Objects.isNull(jsTn1) && !Objects.isNull(jsTn2) && jsTn1.compareTo(jsTn2) > INT_0)
  3894. result = true;
  3895. }else if(BusinessEnum.WarningCategoryEnum.JS_ZL.getCode().equals(category)){
  3896. BigDecimal jsTp1 = tXinyiIndustry1.getJsTp();
  3897. BigDecimal jsTp2 = tXinyiIndustry2.getJsTp();
  3898. if(!Objects.isNull(jsTp1) && !Objects.isNull(jsTp2) && jsTp1.compareTo(jsTp2) > INT_0)
  3899. result = true;
  3900. }else if(BusinessEnum.WarningCategoryEnum.JS_AD.getCode().equals(category)){
  3901. BigDecimal jsNh31 = tXinyiIndustry1.getJsNh3();
  3902. BigDecimal jsNh32 = tXinyiIndustry2.getJsNh3();
  3903. if(!Objects.isNull(jsNh31) && !Objects.isNull(jsNh32) && jsNh31.compareTo(jsNh32) > INT_0)
  3904. result = true;
  3905. }else{
  3906. log.error("暂时还不支持的报警类型~~~~");
  3907. }
  3908. return result;
  3909. }
  3910. private void addChatRecordByDeviceErr(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  3911. ChatReq chatReq = new ChatReq();
  3912. //保存聊天记录
  3913. //将问答更新到数据库中
  3914. chatReq.setSessionId(IdUtils.simpleUUID());
  3915. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  3916. chatReq.setModule(3);
  3917. /*String userId = SecurityUtils.getUserId().toString();
  3918. String username = SecurityUtils.getUsername();*/
  3919. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  3920. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  3921. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  3922. chatReq.setQuestion(WARNING_DEFAULT_QUESTION);//本地问题
  3923. chatReq.setAnswer(tXinyiWarningRecord.getReason() + ",请检查设备是否正常运行");
  3924. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  3925. chatReq.setCounts(1);//问答次数
  3926. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  3927. chatReq.setCreateTime(DateUtils.getNowDate());
  3928. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  3929. }
  3930. private void addChatRecordByYCPD(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category, BigDecimal exceedVal) {
  3931. ChatReq chatReq = new ChatReq();
  3932. //保存聊天记录
  3933. //将问答更新到数据库中
  3934. chatReq.setSessionId(IdUtils.simpleUUID());
  3935. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  3936. chatReq.setModule(3);
  3937. /*String userId = SecurityUtils.getUserId().toString();
  3938. String username = SecurityUtils.getUsername();*/
  3939. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  3940. String showVal = this.buildShowValue(warningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  3941. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  3942. chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getMsg());//本地问题
  3943. chatReq.setAnswer(category + YCPD_ANSWER_ONE + exceedVal.multiply(BigDecimal_100) + "%" + YCPD_ANSWER_TWO);
  3944. chatReq.setWarningId(String.valueOf(warningRecord.getId()));
  3945. chatReq.setCounts(1);//问答次数
  3946. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  3947. chatReq.setCreateTime(DateUtils.getNowDate());
  3948. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  3949. }
  3950. private void addChatRecordByYCSG(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category, BigDecimal exceedVal) {
  3951. ChatReq chatReq = new ChatReq();
  3952. //保存聊天记录
  3953. //将问答更新到数据库中
  3954. chatReq.setSessionId(IdUtils.simpleUUID());
  3955. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  3956. chatReq.setModule(3);
  3957. /*String userId = SecurityUtils.getUserId().toString();
  3958. String username = SecurityUtils.getUsername();*/
  3959. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  3960. String showVal = this.buildShowValue(warningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  3961. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  3962. chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());//本地问题
  3963. // chatReq.setAnswer(category + YCSG_ANSWER_ONE + exceedVal.multiply(BigDecimal_100) + "%" + YCSG_ANSWER_TWO + warningRecord.getWarningVal() + YCSG_ANSWER_THREE);
  3964. chatReq.setAnswer(YCSG_ANSWER_REPLACE.replaceAll("@@@0", category).replaceAll("@@@1", String.valueOf(warningRecord.getWarningVal())).replaceAll("@@@2", exceedVal.multiply(BigDecimal_100) + "%"));
  3965. chatReq.setWarningId(String.valueOf(warningRecord.getId()));
  3966. chatReq.setCounts(1);//问答次数
  3967. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  3968. chatReq.setCreateTime(DateUtils.getNowDate());
  3969. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  3970. }
  3971. private void addChatRecordByNoChangeSingle(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category) {
  3972. ChatReq chatReq = new ChatReq();
  3973. //保存聊天记录
  3974. //将问答更新到数据库中
  3975. chatReq.setSessionId(IdUtils.simpleUUID());
  3976. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  3977. chatReq.setModule(3);
  3978. /*String userId = SecurityUtils.getUserId().toString();
  3979. String username = SecurityUtils.getUsername();*/
  3980. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  3981. String showVal = this.buildShowValue(warningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  3982. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  3983. chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.YBGZ_LX_SINGLE.getMsg());//本地问题
  3984. // chatReq.setAnswer(SINGLE_NO_CHANGE_ANSWER_ONE + category + SINGLE_NO_CHANGE_ANSWER_TWO + category + SINGLE_NO_CHANGE_ANSWER_THREE);
  3985. chatReq.setAnswer(SINGLE_NO_CHANGE_ANSWER_REPLACE.replaceAll("@@@0", category));
  3986. chatReq.setWarningId(String.valueOf(warningRecord.getId()));
  3987. chatReq.setCounts(1);//问答次数
  3988. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  3989. chatReq.setCreateTime(DateUtils.getNowDate());
  3990. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  3991. }
  3992. private void addChatRecordByBreakPointsSingle(TXinyiWarningRecord warningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, String category) {
  3993. ChatReq chatReq = new ChatReq();
  3994. //保存聊天记录
  3995. //将问答更新到数据库中
  3996. chatReq.setSessionId(IdUtils.simpleUUID());
  3997. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  3998. chatReq.setModule(3);
  3999. /*String userId = SecurityUtils.getUserId().toString();
  4000. String username = SecurityUtils.getUsername();*/
  4001. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  4002. String showVal = this.buildShowValue(warningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  4003. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  4004. chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getMsg());//本地问题
  4005. // chatReq.setAnswer(SINGLE_BREAKPOINT_ANSWER_PREFIX + category + SINGLE_BREAKPOINT_ANSWER_SUFFIX);
  4006. chatReq.setAnswer(SINGLE_BREAKPOINT_ANSWER_REPLACE.replaceAll("@@@0", category));
  4007. chatReq.setWarningId(String.valueOf(warningRecord.getId()));
  4008. chatReq.setCounts(1);//问答次数
  4009. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  4010. chatReq.setCreateTime(DateUtils.getNowDate());
  4011. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  4012. }
  4013. private void addChatRecordByNoChangeMore(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  4014. ChatReq chatReq = new ChatReq();
  4015. //保存聊天记录
  4016. //将问答更新到数据库中
  4017. chatReq.setSessionId(IdUtils.simpleUUID());
  4018. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  4019. chatReq.setModule(3);
  4020. /*String userId = SecurityUtils.getUserId().toString();
  4021. String username = SecurityUtils.getUsername();*/
  4022. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  4023. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  4024. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  4025. chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getMsg());//本地问题
  4026. // chatReq.setAnswer(MORE_NO_CHANGE_ANSWER);
  4027. chatReq.setAnswer(MORE_NO_CHANGE_ANSWER_REPLACE.replaceAll("@@@0", tXinyiWarningRecord.getCategory()).replaceAll("@@@1", String.valueOf(tXinyiWarningRecord.getWarningVal())));
  4028. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  4029. chatReq.setCounts(1);//问答次数
  4030. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  4031. chatReq.setCreateTime(DateUtils.getNowDate());
  4032. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  4033. }
  4034. private void addChatRecordByBreakPointsMore(TXinyiWarningRecord tXinyiWarningRecord, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
  4035. ChatReq chatReq = new ChatReq();
  4036. //保存聊天记录
  4037. //将问答更新到数据库中
  4038. chatReq.setSessionId(IdUtils.simpleUUID());
  4039. chatReq.setType(1);//0问答 1决策 2本地 3仿真预测
  4040. chatReq.setModule(3);
  4041. /*String userId = SecurityUtils.getUserId().toString();
  4042. String username = SecurityUtils.getUsername();*/
  4043. chatReq.setUserId(WARNING_DEFAULT_CREATE);
  4044. String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig, DateUtils.getNowDate());
  4045. chatReq.setShowVal(showVal);//前端展示的数据和提问的数据不一致
  4046. chatReq.setQuestion(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getMsg());//本地问题
  4047. // chatReq.setAnswer(MORE_BREAKPOINT_ANSWER);
  4048. chatReq.setAnswer(MORE_BREAKPOINT_ANSWER_REPLACE.replaceAll("@@@0", tXinyiWarningRecord.getCategory()));
  4049. chatReq.setWarningId(String.valueOf(tXinyiWarningRecord.getId()));
  4050. chatReq.setCounts(1);//问答次数
  4051. chatReq.setCreateBy(WARNING_DEFAULT_CREATE);
  4052. chatReq.setCreateTime(DateUtils.getNowDate());
  4053. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  4054. }
  4055. public static void main(String[] args) {
  4056. System.out.println(CCCDCHRT_LAST);
  4057. System.out.println(GSLS_LAST);
  4058. // System.out.println(BigDecimal.valueOf(1).subtract(null));
  4059. String s = "asd@@@1dsa@@@1111@@@1222".replaceAll("@@@1", "!");
  4060. System.out.println(s);
  4061. }
  4062. /**
  4063. * 处理机器人化验数据报警
  4064. * 2025年02月25日15:54:05 此报警不再使用
  4065. */
  4066. // public void handleRobotWarning(List<TXinyiRobot> uniqueList) {
  4067. // log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑");
  4068. // //查询配置
  4069. // List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  4070. // if(CollectionUtils.isEmpty(tXinyiNormConfigs))
  4071. // throw new RuntimeException("未查询到配置信息");
  4072. // TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  4073. //
  4074. // //查询最新的一条工业库的数据(showvalue展示使用)
  4075. // List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
  4076. // TXinyiIndustry tXinyiIndustry = CollectionUtils.isEmpty(tXinyiIndustries) ? new TXinyiIndustry() : tXinyiIndustries.get(0);
  4077. //
  4078. // //处理数据
  4079. // for (TXinyiRobot tXinyiRobot : uniqueList) {
  4080. // //2024年7月11日17:27:32 化验室报警项原有总氮和总氮改为 1#好氧硝酸盐、2#好氧硝酸盐、二沉池正磷酸盐
  4081. // //处理总氮和总磷报警
  4082. // //总氮
  4083. // /*BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  4084. // BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  4085. // if(!Objects.isNull(no3Hlj1Jqr) && !Objects.isNull(no3Hlj2Jqr)){
  4086. // BigDecimal csTn = (no3Hlj1Jqr.add(no3Hlj2Jqr)).divide((new BigDecimal("2").multiply(ROBOT_HY_DIVIDE)), NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4087. // BigDecimal cszzBzz = normConfig.getCszzBzz();
  4088. // BigDecimal cszzGkz = normConfig.getCszzGkz();
  4089. // if(!Objects.isNull(cszzBzz)){
  4090. // handleXinYiWarningsRobot(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig);
  4091. // }
  4092. // }*/
  4093. // //总氮的标准值和管控值
  4094. // BigDecimal cszzBzz = normConfig.getCszzBzz();
  4095. // BigDecimal cszzGkz = normConfig.getCszzGkz();
  4096. // //氨氮的标准值和管控值
  4097. // BigDecimal csadBzz = normConfig.getCsadBzz();
  4098. // BigDecimal csadGkz = normConfig.getCsadGkz();
  4099. //
  4100. // BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  4101. // BigDecimal jsslSjz = normConfig.getJsslSjz();
  4102. //
  4103. // //#1好氧硝酸盐
  4104. // BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  4105. // if(!Objects.isNull(no3Hlj1Jqr)){
  4106. // if(!Objects.isNull(cszzBzz)){
  4107. // handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4108. // }
  4109. // }
  4110. //
  4111. // //#2好氧硝酸盐
  4112. // BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  4113. // if(!Objects.isNull(no3Hlj2Jqr)){
  4114. // if(!Objects.isNull(cszzBzz)){
  4115. // handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4116. // }
  4117. // }
  4118. //
  4119. // //总磷
  4120. // BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  4121. // if(!Objects.isNull(tpRccJqr)){
  4122. // BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4123. // BigDecimal cszlBzz = normConfig.getCszlBzz();
  4124. // BigDecimal cszlGkz = normConfig.getCszlGkz();
  4125. // if(!Objects.isNull(cszlBzz)){
  4126. // handleXinYiWarningsRobotOrigin(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  4127. // }
  4128. // }
  4129. //
  4130. // //2024年7月18日10:48:15 新增报警:出水氨氮 - 连续检测报警
  4131. // //1池
  4132. // /*BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  4133. // BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  4134. // //判断 增加容错
  4135. // if(Objects.isNull(no3Qyc1Jqr))
  4136. // no3Qyc1Jqr = BigDecimal.ZERO;
  4137. // if(Objects.isNull(nh31Jqr))
  4138. // nh31Jqr = BigDecimal.ZERO;
  4139. // if(Objects.isNull(no3Hlj1Jqr))
  4140. // no3Hlj1Jqr = BigDecimal.ZERO;
  4141. // BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
  4142. // if(!Objects.isNull(csadBzz)){
  4143. // handleXinYiWarningsRobot(csadBzz, anDan1, csadGkz, ROBOT_ANDAN_1.getCode(), tXinyiIndustry, normConfig);
  4144. // }
  4145. //
  4146. // //2池
  4147. // BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  4148. // BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  4149. // //判断 增加容错
  4150. // if(Objects.isNull(no3Qyc2Jqr))
  4151. // no3Qyc2Jqr = BigDecimal.ZERO;
  4152. // if(Objects.isNull(nh32Jqr))
  4153. // nh32Jqr = BigDecimal.ZERO;
  4154. // if(Objects.isNull(no3Hlj2Jqr))
  4155. // no3Hlj2Jqr = BigDecimal.ZERO;
  4156. // BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
  4157. // if(!Objects.isNull(csadBzz)){
  4158. // handleXinYiWarningsRobot(csadBzz, anDan2, csadGkz, ROBOT_ANDAN_2.getCode(), tXinyiIndustry, normConfig);
  4159. // }*/
  4160. //
  4161. // BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  4162. // BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  4163. // //判断 增加容错
  4164. // if(Objects.isNull(no3Qyc1Jqr))
  4165. // no3Qyc1Jqr = BigDecimal.ZERO;
  4166. // if(Objects.isNull(nh31Jqr))
  4167. // nh31Jqr = BigDecimal.ZERO;
  4168. // if(Objects.isNull(no3Hlj1Jqr))
  4169. // no3Hlj1Jqr = BigDecimal.ZERO;
  4170. // BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
  4171. //
  4172. //
  4173. // //2池
  4174. // BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  4175. // BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  4176. // //判断 增加容错
  4177. // if(Objects.isNull(no3Qyc2Jqr))
  4178. // no3Qyc2Jqr = BigDecimal.ZERO;
  4179. // if(Objects.isNull(nh32Jqr))
  4180. // nh32Jqr = BigDecimal.ZERO;
  4181. // if(Objects.isNull(no3Hlj2Jqr))
  4182. // no3Hlj2Jqr = BigDecimal.ZERO;
  4183. // BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
  4184. // if(!Objects.isNull(csadBzz)){
  4185. // BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
  4186. // handleXinYiWarningsRobotOrigin(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  4187. // }
  4188. // }
  4189. // }
  4190. public void handleRobotWarningNew(TXinyiRobot tXinyiRobot) {
  4191. log.info("进入了定时任务判断机器人化验库是否超标及后续逻辑--新的逻辑处理");
  4192. //查询配置
  4193. List<TXinyiNormConfig> tXinyiNormConfigs = this.xinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  4194. if(CollectionUtils.isEmpty(tXinyiNormConfigs)){
  4195. // throw new ServiceException("未查询到配置信息");
  4196. log.error("未查询到配置信息");
  4197. return;
  4198. }
  4199. TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  4200. String testHour = tXinyiRobot.getTestHour();
  4201. if(StringUtils.isBlank(testHour)){
  4202. log.error("化验室报警的时候,获取化验室的化验时间-小时失败,无法处理后续操作");
  4203. return;
  4204. }
  4205. //查询最新的一条工业库的数据(showvalue展示使用)
  4206. //2025年02月26日15:55:16 逻辑调整:这里不使用最新的一条工业库数据,获取化验室的同时段的数据
  4207. // List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectNIndustry(1);
  4208. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testHour(testHour).build());
  4209. if(CollectionUtils.isEmpty(tXinyiIndustries)){
  4210. // throw new ServiceException("未查询到对应的工业库数据,无法进行图表数据展示!");
  4211. log.error("未查询到对应的工业库数据,无法进行图表数据展示!");
  4212. return;
  4213. }
  4214. TXinyiIndustry tXinyiIndustry = tXinyiIndustries.get(0);
  4215. //新的逻辑:
  4216. //只要当前获取的工业库数据和当前时间
  4217. //如果当前时间和工业库传过来的相差不到一个小时,说明正常,工业库没挂掉:需要查询是否有挂掉的记录,有的话,关闭此报警,并触发整体的业务数据报警。
  4218. //如果超过1小时了,说明工业库同步数据挂掉了,这时候去查询有无此类型的报警,如果有,不做任何处理,程序结束;如果没有,新增该类型报警并结束程序。
  4219. Date nowDate = DateUtils.getNowDate();
  4220. Date warningDate = null;
  4221. try {
  4222. warningDate = DateUtils.parseDate(testHour, DateUtils.YYYYMMDDHH_TS);
  4223. } catch (ParseException e) {
  4224. // throw new RuntimeException(e.getMessage());
  4225. log.error("将化验室的的化验时间转换date类型异常,异常信息为{}", e.getMessage());
  4226. return;
  4227. }
  4228. //查询工业库同步任务失败的报警正在进行的数据
  4229. //2025年03月03日15:05:21 同步任务的报警不需要展示 后期考虑短信或者其他方式报警
  4230. /*TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.ROBOT_SYNC_ERROR.getCode()).status(0).build();
  4231. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecord);*/
  4232. long hours = DateUtils.differentHoursByLocalDateTime(nowDate, warningDate);
  4233. if(hours == 0L){
  4234. //查看是否有正在进行的同步任务失败的报警
  4235. /*if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4236. closeWarning(tXinyiWarningRecords.get(0));
  4237. }*/
  4238. //正常的业务数据报警
  4239. robotWarningDetail(tXinyiRobot, normConfig, tXinyiIndustry);
  4240. }else{
  4241. log.info("同步化验室任务获取最新的数据失败,无法处理报警信息。");
  4242. log.error("同步化验室任务获取最新的数据失败,无法处理报警信息。");
  4243. //todo 发送短信
  4244. //查询是否有正在工业库的同步任务失败的报警,有的话,什么都不做; 没有的话,新增该类型报警
  4245. /*if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4246. //插入该类型报警
  4247. warningRecord.setType(0);
  4248. String msg = BusinessEnum.WarningSymbolEnum.ROBOT_SYNC_ERROR.getMsg();
  4249. warningRecord.setCategory(msg);
  4250. warningRecord.setTime(nowDate);
  4251. warningRecord.setReason(msg);
  4252. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.ROBOT_SYNC_ERROR.getCode());
  4253. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  4254. warningRecord.setCreateTime(nowDate);
  4255. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  4256. }else{
  4257. log.info("化验室报警的时候,发现同步化验室同步定时任务挂掉了,并且已经有该类型报警了,不做任何处理");
  4258. }*/
  4259. //将其他类型的报警全部关闭
  4260. //2025年02月27日17:35:37 此场景不关闭其他报警
  4261. // closeOtherWarningsBySymbol(null);
  4262. }
  4263. }
  4264. private void robotWarningDetail(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
  4265. //先查看数据是否有断点--单指标 断点--多指标
  4266. int breakpointCount = 0;
  4267. List<TXinyiWarningRecord> breakPointList = new ArrayList<>();//断点集合
  4268. //判断单指标断点,后续同指标的其他报警是否可以继续执行
  4269. boolean xsy1Execute = true;
  4270. boolean xsy2Execute = true;
  4271. boolean ecczlxyExecute = true;
  4272. boolean csADExecute = true;
  4273. //#1好氧硝酸盐
  4274. BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  4275. //#2好氧硝酸盐
  4276. BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  4277. //总磷
  4278. BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  4279. //1#缺氧出-硝酸盐
  4280. BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  4281. BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  4282. //2#缺氧出-硝酸盐
  4283. BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  4284. BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  4285. //总氮的标准值和管控值
  4286. BigDecimal cszzBzz = normConfig.getCszzBzz();
  4287. BigDecimal cszzGkz = normConfig.getCszzGkz();
  4288. //氨氮的标准值和管控值
  4289. BigDecimal csadBzz = normConfig.getCsadBzz();
  4290. BigDecimal csadGkz = normConfig.getCsadGkz();
  4291. BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  4292. BigDecimal jsslSjz = normConfig.getJsslSjz();
  4293. BigDecimal cszlBzz = normConfig.getCszlBzz();
  4294. BigDecimal cszlGkz = normConfig.getCszlGkz();
  4295. WarningMoreExceed warningMoreExceed = null;
  4296. if(!Objects.isNull(no3Hlj1Jqr)){
  4297. warningMoreExceed = handleXinYiWarningRecordRobotMore(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4298. if(warningMoreExceed.isBreakpoint()){
  4299. breakpointCount++;
  4300. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  4301. }
  4302. }
  4303. if(!Objects.isNull(no3Hlj2Jqr)){
  4304. warningMoreExceed = handleXinYiWarningRecordRobotMore(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4305. if(warningMoreExceed.isBreakpoint()){
  4306. breakpointCount++;
  4307. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  4308. }
  4309. }
  4310. if(!Objects.isNull(tpRccJqr)){
  4311. BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4312. warningMoreExceed = handleXinYiWarningRecordRobotMore(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  4313. if(warningMoreExceed.isBreakpoint()){
  4314. breakpointCount++;
  4315. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  4316. }
  4317. }
  4318. //判断 增加容错
  4319. if(Objects.isNull(no3Qyc1Jqr))
  4320. no3Qyc1Jqr = BigDecimal.ZERO;
  4321. if(Objects.isNull(nh31Jqr))
  4322. nh31Jqr = BigDecimal.ZERO;
  4323. if(Objects.isNull(no3Hlj1Jqr))
  4324. no3Hlj1Jqr = BigDecimal.ZERO;
  4325. BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
  4326. //判断 增加容错
  4327. if(Objects.isNull(no3Qyc2Jqr))
  4328. no3Qyc2Jqr = BigDecimal.ZERO;
  4329. if(Objects.isNull(nh32Jqr))
  4330. nh32Jqr = BigDecimal.ZERO;
  4331. if(Objects.isNull(no3Hlj2Jqr))
  4332. no3Hlj2Jqr = BigDecimal.ZERO;
  4333. BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
  4334. BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
  4335. warningMoreExceed = handleXinYiWarningRecordRobotMore(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  4336. if(warningMoreExceed.isBreakpoint()){
  4337. breakpointCount++;
  4338. breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
  4339. }
  4340. Date nowDate = DateUtils.getNowDate();
  4341. //下面是处理多个指标的 【断点】报警
  4342. //断点
  4343. TXinyiWarningRecord warningRecord = TXinyiWarningRecord.builder().symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode()).status(0).build();
  4344. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecord);
  4345. if(breakpointCount < 1){//恢复正常 关闭多个断点报警
  4346. //2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警 关闭多个报警
  4347. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4348. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
  4349. closeWarning(tXinyiWarningRecord);
  4350. }
  4351. }
  4352. }else if(breakpointCount == 1){//只有单个的断点
  4353. TXinyiWarningRecord warningRecordBreakPointOne = breakPointList.get(0);
  4354. String category = warningRecordBreakPointOne.getCategory();
  4355. TXinyiWarningRecord warningRecordReq = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode()).status(0).build();
  4356. List<TXinyiWarningRecord> tXinyiBreakPointSingleWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordReq);
  4357. //关闭同类型的其他报警
  4358. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_SINGLE.getCode());
  4359. //触发报警 并且模拟大模型返回决策问答数据
  4360. if(CollectionUtils.isEmpty(tXinyiBreakPointSingleWarningRecords)){
  4361. //插入该类型报警
  4362. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordBreakPointOne);
  4363. //同时处理决策 不用调用大模型,本地处理问答
  4364. addChatRecordByBreakPointsSingle(warningRecordBreakPointOne, tXinyiIndustry, normConfig, category);
  4365. }else{
  4366. log.info("化验室报警的时候,发现存在仪表故障(断点不变单个指标)的报警,并且已经有该类型报警了,不做任何处理");
  4367. //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
  4368. TXinyiWarningRecord xinyiWarningRecord = tXinyiBreakPointSingleWarningRecords.get(0);
  4369. xinyiWarningRecord.setWarningVal(warningRecordBreakPointOne.getWarningVal());
  4370. xinyiWarningRecord.setTime(warningRecordBreakPointOne.getTime());
  4371. xinyiWarningRecord.setUpdateTime(nowDate);
  4372. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  4373. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  4374. // xinyiWarningRecord.setReason(warningRecordBreakPointOne.getReason());
  4375. //更新数据库
  4376. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  4377. //继续调用决策【本地模拟的决策】
  4378. addChatRecordByBreakPointsSingle(xinyiWarningRecord, tXinyiIndustry, normConfig, category);
  4379. }
  4380. //如果出现单指标报警 标识后续同指标是否可以继续报警
  4381. if(ROBOT_XSY_1.getCode().equals(category))
  4382. xsy1Execute = false;
  4383. if(ROBOT_XSY_2.getCode().equals(category))
  4384. xsy2Execute = false;
  4385. if(ROBOT_ECCZLSY.getCode().equals(category))
  4386. ecczlxyExecute = false;
  4387. if(ROBOT_CS_AD.getCode().equals(category))
  4388. csADExecute = false;
  4389. //2025年02月28日15:18:30 即使多指标断点,也是按具体分类报警 关闭多个报警
  4390. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4391. for (TXinyiWarningRecord tXinyiWarningRecord : tXinyiWarningRecords) {
  4392. closeWarning(tXinyiWarningRecord);
  4393. }
  4394. }
  4395. }else{
  4396. //将其他类型的报警全部关闭
  4397. //2025年02月27日17:35:37 此场景不关闭其他报警
  4398. // closeOtherWarningsBySymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
  4399. //再新增新的类型的报警
  4400. /*if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4401. //插入该类型报警
  4402. warningRecord.setType(0);
  4403. String msg = BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getMsg();
  4404. warningRecord.setCategory(msg);
  4405. warningRecord.setTime(nowDate);
  4406. warningRecord.setReason(msg);
  4407. warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
  4408. warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  4409. warningRecord.setCreateTime(nowDate);
  4410. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
  4411. //同时处理决策 不用调用大模型,本地处理问答
  4412. addChatRecordByBreakPointsMore(warningRecord, tXinyiIndustry, normConfig);
  4413. }else{
  4414. log.info("化验室报警的时候,发现存在仪表故障(断点多个指标)的报警,并且已经有该类型报警了,不做任何处理");
  4415. }
  4416. log.info("化验室报警的时候,发现存在仪表故障(断点多个指标)的报警,其他报警不再处理");
  4417. return;*/
  4418. //逻辑调整:要按指标报多指标断点 需要当前的集合和原来的集合判断,新的报警增加,如果之前有了报警则不处理
  4419. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4420. //新增的断点的数据全部都报警
  4421. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointList) {
  4422. String category = tXinyiWarningRecord.getCategory();
  4423. //后续对应的指标是否可以进行报警
  4424. //如果出现单指标报警 标识后续同指标是否可以继续报警
  4425. if(ROBOT_XSY_1.getCode().equals(category))
  4426. xsy1Execute = false;
  4427. if(ROBOT_XSY_2.getCode().equals(category))
  4428. xsy2Execute = false;
  4429. if(ROBOT_ECCZLSY.getCode().equals(category))
  4430. ecczlxyExecute = false;
  4431. if(ROBOT_CS_AD.getCode().equals(category))
  4432. csADExecute = false;
  4433. //关闭该指标的其他类型的报警
  4434. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
  4435. //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
  4436. tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getMsg());
  4437. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
  4438. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  4439. //同时处理决策 不用调用大模型,本地处理问答
  4440. addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  4441. }
  4442. }else{//之前存在报警了 所以需要2个集合数据进行匹配,如果新的和原来的一样则不用做任何操作【持续报警】;如果不一样,则新的要报警,老报警要关闭
  4443. List<TXinyiWarningRecord> breakPointListNew = new ArrayList<>(breakPointList);//断点集合[需要新增的]
  4444. breakPointListNew.removeAll(tXinyiWarningRecords);
  4445. List<TXinyiWarningRecord> breakPointListClose = new ArrayList<>(tXinyiWarningRecords);//断点集合[需要关闭的] 还有2这重叠的,这种重叠的,是不需要做任何操作的,持续报警
  4446. breakPointListClose.removeAll(breakPointList);
  4447. //插入新的报警
  4448. if(!CollectionUtils.isEmpty(breakPointListNew)){
  4449. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListNew) {
  4450. String category = tXinyiWarningRecord.getCategory();
  4451. //后续对应的指标是否可以进行报警
  4452. //如果出现单指标报警 标识后续同指标是否可以继续报警
  4453. if(ROBOT_XSY_1.getCode().equals(category))
  4454. xsy1Execute = false;
  4455. if(ROBOT_XSY_2.getCode().equals(category))
  4456. xsy2Execute = false;
  4457. if(ROBOT_ECCZLSY.getCode().equals(category))
  4458. ecczlxyExecute = false;
  4459. if(ROBOT_CS_AD.getCode().equals(category))
  4460. csADExecute = false;
  4461. //关闭该指标的其他类型的报警
  4462. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
  4463. //新插入
  4464. //原来集合里存放的都是单指标异常 下面2个值需要重新赋值
  4465. tXinyiWarningRecord.setReason(category + BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getMsg());
  4466. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_HYS.getCode());
  4467. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  4468. //同时处理决策 不用调用大模型,本地处理问答
  4469. addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  4470. }
  4471. }
  4472. //关闭老的报警
  4473. if(!CollectionUtils.isEmpty(breakPointListClose)){
  4474. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListClose) {
  4475. //老的报警,新的没有出现,关闭
  4476. closeWarning(tXinyiWarningRecord);
  4477. }
  4478. }
  4479. //2025年03月06日10:56:41 需要额外记录哪些是历史报警,现在仍然报警的,这种的更新部分信息,更新决策内容
  4480. List<TXinyiWarningRecord> breakPointListContinue = new ArrayList<>(tXinyiWarningRecords);
  4481. breakPointListContinue.removeAll(breakPointListNew);
  4482. if(!CollectionUtils.isEmpty(breakPointListContinue)){
  4483. for (TXinyiWarningRecord tXinyiWarningRecord : breakPointListContinue) {
  4484. //2025年03月06日10:52:57 逻辑调整:更新一直报警的那条记录的显示值
  4485. //需要匹配新的报警中的最新的值
  4486. String category = tXinyiWarningRecord.getCategory();
  4487. TXinyiWarningRecord tXinyiWarningRecordContinue = tXinyiWarningRecord;//兜底处理
  4488. Optional<TXinyiWarningRecord> optional = breakPointListNew.stream().filter(r -> category.equals(r.getCategory())).findAny();
  4489. if(optional.isPresent()){
  4490. tXinyiWarningRecordContinue = optional.get();
  4491. log.info("存在之前多指标断点,现在仍然断点的数据{}", JSON.toJSONString(tXinyiWarningRecordContinue));
  4492. }
  4493. tXinyiWarningRecord.setWarningVal(tXinyiWarningRecordContinue.getWarningVal());
  4494. tXinyiWarningRecord.setTime(tXinyiWarningRecordContinue.getTime());
  4495. tXinyiWarningRecord.setUpdateTime(nowDate);
  4496. tXinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  4497. //从单指标变成多指标 这个不可以修改
  4498. // tXinyiWarningRecord.setReason(tXinyiWarningRecordContinue.getReason());
  4499. //更新数据库
  4500. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(tXinyiWarningRecord);
  4501. //继续调用决策【本地模拟的决策】
  4502. addChatRecordByBreakPointsMore(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  4503. }
  4504. }
  4505. }
  4506. //如果出现多指标问题,后续的报警不再处理
  4507. //2025年03月03日17:31:53 只有上述指标出现异常的,才不可以报警,不会让所有的都不报警
  4508. // return;
  4509. }
  4510. //最原始的标准值和管控制报警
  4511. //2025年02月25日15:58:15 需要在最原始的报警里,增加是否出现单点突变 - 异常升高 和 单点突变 - 异常偏低的报警
  4512. // robotOriginWarning(tXinyiRobot, normConfig, tXinyiIndustry);
  4513. //这里需要根据是否出现了断点判断,做不同的 其他类型的报警 不能执行所有指标的 因为有可能某个指标是 单指标断点,这种的就不用执行其他报警了
  4514. //#1好氧硝酸盐
  4515. if(!Objects.isNull(no3Hlj1Jqr) && no3Hlj1Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy1Execute){
  4516. if(!Objects.isNull(cszzBzz)){
  4517. handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4518. }
  4519. }
  4520. //#2好氧硝酸盐
  4521. if(!Objects.isNull(no3Hlj2Jqr) && no3Hlj2Jqr.compareTo(BigDecimal.ZERO) > 0 && xsy2Execute){
  4522. if(!Objects.isNull(cszzBzz)){
  4523. handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4524. }
  4525. }
  4526. //总磷
  4527. if(!Objects.isNull(tpRccJqr) && tpRccJqr.compareTo(BigDecimal.ZERO) > 0 && ecczlxyExecute){
  4528. BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4529. if(!Objects.isNull(cszlBzz)){
  4530. handleXinYiWarningsRobotOrigin(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  4531. }
  4532. }
  4533. //2#缺氧出-硝酸盐
  4534. if(!Objects.isNull(csadBzz) && csADExecute){
  4535. handleXinYiWarningsRobotOrigin(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  4536. }
  4537. }
  4538. // private void robotOriginWarning(TXinyiRobot tXinyiRobot, TXinyiNormConfig normConfig, TXinyiIndustry tXinyiIndustry) {
  4539. // //总氮的标准值和管控值
  4540. // BigDecimal cszzBzz = normConfig.getCszzBzz();
  4541. // BigDecimal cszzGkz = normConfig.getCszzGkz();
  4542. // //氨氮的标准值和管控值
  4543. // BigDecimal csadBzz = normConfig.getCsadBzz();
  4544. // BigDecimal csadGkz = normConfig.getCsadGkz();
  4545. //
  4546. // BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
  4547. // BigDecimal jsslSjz = normConfig.getJsslSjz();
  4548. //
  4549. // //#1好氧硝酸盐
  4550. // BigDecimal no3Hlj1Jqr = tXinyiRobot.getNo3Hlj1Jqr();
  4551. // if(!Objects.isNull(no3Hlj1Jqr)){
  4552. // if(!Objects.isNull(cszzBzz)){
  4553. // handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj1Jqr, cszzGkz, ROBOT_XSY_1.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4554. // }
  4555. // }
  4556. //
  4557. // //#2好氧硝酸盐
  4558. // BigDecimal no3Hlj2Jqr = tXinyiRobot.getNo3Hlj2Jqr();
  4559. // if(!Objects.isNull(no3Hlj2Jqr)){
  4560. // if(!Objects.isNull(cszzBzz)){
  4561. // handleXinYiWarningsRobotOrigin(cszzBzz, no3Hlj2Jqr, cszzGkz, ROBOT_XSY_2.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
  4562. // }
  4563. // }
  4564. //
  4565. // //总磷
  4566. // BigDecimal tpRccJqr = tXinyiRobot.getTpRccJqr();
  4567. // if(!Objects.isNull(tpRccJqr)){
  4568. // BigDecimal csTp = tpRccJqr.divide(ROBOT_HY_DIVIDE, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4569. // BigDecimal cszlBzz = normConfig.getCszlBzz();
  4570. // BigDecimal cszlGkz = normConfig.getCszlGkz();
  4571. // if(!Objects.isNull(cszlBzz)){
  4572. // handleXinYiWarningsRobotOrigin(cszlBzz, csTp, cszlGkz, ROBOT_ECCZLSY.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
  4573. // }
  4574. // }
  4575. //
  4576. // //1#缺氧出-硝酸盐
  4577. // BigDecimal no3Qyc1Jqr = tXinyiRobot.getNo3Qyc1Jqr();
  4578. // BigDecimal nh31Jqr = tXinyiRobot.getNh31Jqr();
  4579. // //判断 增加容错
  4580. // if(Objects.isNull(no3Qyc1Jqr))
  4581. // no3Qyc1Jqr = BigDecimal.ZERO;
  4582. // if(Objects.isNull(nh31Jqr))
  4583. // nh31Jqr = BigDecimal.ZERO;
  4584. // if(Objects.isNull(no3Hlj1Jqr))
  4585. // no3Hlj1Jqr = BigDecimal.ZERO;
  4586. // BigDecimal anDan1 = no3Qyc1Jqr.add(nh31Jqr).subtract(no3Hlj1Jqr);
  4587. //
  4588. //
  4589. // //2#缺氧出-硝酸盐
  4590. // BigDecimal no3Qyc2Jqr = tXinyiRobot.getNo3Qyc2Jqr();
  4591. // BigDecimal nh32Jqr = tXinyiRobot.getNh32Jqr();
  4592. // //判断 增加容错
  4593. // if(Objects.isNull(no3Qyc2Jqr))
  4594. // no3Qyc2Jqr = BigDecimal.ZERO;
  4595. // if(Objects.isNull(nh32Jqr))
  4596. // nh32Jqr = BigDecimal.ZERO;
  4597. // if(Objects.isNull(no3Hlj2Jqr))
  4598. // no3Hlj2Jqr = BigDecimal.ZERO;
  4599. // BigDecimal anDan2 = no3Qyc2Jqr.add(nh32Jqr).subtract(no3Hlj2Jqr);
  4600. // if(!Objects.isNull(csadBzz)){
  4601. // BigDecimal divide = anDan1.add(anDan2).divide(DECIMAL_2, INT_2, RoundingMode.HALF_UP);
  4602. // handleXinYiWarningsRobotOrigin(csadBzz, divide, csadGkz, ROBOT_CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
  4603. // }
  4604. // }
  4605. /**
  4606. * 通过输入的值 生成对应类型的报警对象(出水)
  4607. *
  4608. * @param csBzz
  4609. * @param currentVal
  4610. * @param csGkz
  4611. * @param category
  4612. * @param tXinyiIndustry
  4613. * @param normConfig
  4614. * @param cwrwfhz
  4615. * @return
  4616. */
  4617. private void handleXinYiWarningsRobotOrigin(BigDecimal csBzz, BigDecimal currentVal, BigDecimal csGkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, BigDecimal cwrwfhz) {
  4618. Date nowDate = DateUtils.getNowDate();
  4619. List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_3);
  4620. if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < 3){
  4621. log.error("处理连续检测报警时,获取最近的3条化验数据失败~~~~~~~");
  4622. return;
  4623. }
  4624. TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时
  4625. //单点突变-异常升高报警
  4626. TXinyiWarningRecord warningRecordYCSG = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode()).status(0).build();
  4627. List<TXinyiWarningRecord> tXinyiNoChangeYCSGRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCSG);
  4628. //是否存在异常升高的问题
  4629. if(!CollectionUtils.isEmpty(tXinyiRobots) && tXinyiRobots.size() == INT_3){
  4630. //2025年02月21日14:33:37 这里要改成当前值和上个小时比较 上个小时和上上个小时比较
  4631. BigDecimal exceedVal = existsRobotYCSG(currentVal, category, tXinyiRobots);
  4632. if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
  4633. //关闭同类型的其他报警
  4634. closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
  4635. //触发报警 并且模拟大模型返回决策问答数据
  4636. if(CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
  4637. //插入该类型报警
  4638. warningRecordYCSG.setTime(nowDate);
  4639. warningRecordYCSG.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getMsg());
  4640. warningRecordYCSG.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  4641. warningRecordYCSG.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCSG.getCode());
  4642. warningRecordYCSG.setCreateBy(WARNING_DEFAULT_CREATE);
  4643. warningRecordYCSG.setCreateTime(nowDate);
  4644. warningRecordYCSG.setWarningVal(currentVal);
  4645. warningRecordYCSG.setDesignVal(csBzz);
  4646. warningRecordYCSG.setControlVal(csGkz);
  4647. warningRecordYCSG.setRemark(THREE_HYS_WARNING.getCode());//化验室
  4648. warningRecordYCSG.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
  4649. warningRecordYCSG.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
  4650. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCSG);
  4651. //同时处理决策 不用调用大模型,本地处理问答
  4652. addChatRecordByYCSG(warningRecordYCSG, tXinyiIndustry, normConfig, category, exceedVal);
  4653. }else{
  4654. log.info("化验室报警的时候,发现存在异常升高的报警,并且已经有该类型报警了,不做任何处理");
  4655. }
  4656. log.info("化验室报警的时候,发现存在异常升高的报警,后续同指标报警不再处理");
  4657. return;
  4658. }else{//不存在 查看历史是否有报警,有的话关闭
  4659. if(!CollectionUtils.isEmpty(tXinyiNoChangeYCSGRecords)){
  4660. closeWarning(tXinyiNoChangeYCSGRecords.get(0));
  4661. }
  4662. }
  4663. }
  4664. //单点突变-异常偏低报警
  4665. //2025年03月03日15:00:55 异常偏低的报警暂时不需要了
  4666. // TXinyiWarningRecord warningRecordYCPD = TXinyiWarningRecord.builder().type(0).category(category).symbol(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode()).status(0).build();
  4667. // List<TXinyiWarningRecord> tXinyiNoChangeYCPDRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(warningRecordYCPD);
  4668. // //是否存在异常偏低的问题
  4669. // if(!Objects.isNull(tXinyiRobot1)){
  4670. // //2025年02月21日15:05:41 这里只需要比较当前值和标准值的差 以及上个小时的值和标准值的差 所以不用取最近3个小时的
  4671. // BigDecimal exceedVal = existsRobotYCPD(currentVal, category, tXinyiRobot1, csBzz);
  4672. // if(!Objects.isNull(exceedVal)){//这里不能只返回一个布尔类型的结果,因为还要获取百分比的值
  4673. // //关闭同类型的其他报警
  4674. // closeOtherWarningsByCategory(category, BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode());
  4675. // //触发报警 并且模拟大模型返回决策问答数据
  4676. // if(CollectionUtils.isEmpty(tXinyiNoChangeYCPDRecords)){
  4677. // //插入该类型报警
  4678. // warningRecordYCPD.setType(0);
  4679. // warningRecordYCPD.setCategory(category);
  4680. // warningRecordYCPD.setTime(nowDate);
  4681. // warningRecordYCPD.setReason(category + BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getMsg());
  4682. // warningRecordYCPD.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  4683. // warningRecordYCPD.setSymbol(BusinessEnum.WarningSymbolEnum.SJYC_YCPD.getCode());
  4684. // warningRecordYCPD.setCreateBy(WARNING_DEFAULT_CREATE);
  4685. // warningRecordYCPD.setCreateTime(nowDate);
  4686. // warningRecordYCPD.setWarningVal(currentVal);
  4687. // this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordYCPD);
  4688. // //同时处理决策 不用调用大模型,本地处理问答
  4689. // addChatRecordByYCPD(warningRecordYCPD, tXinyiIndustry, normConfig, category, exceedVal);
  4690. // }else{
  4691. // log.info("化验室报警的时候,发现存在异常偏低的报警,并且已经有该类型报警了,不做任何处理");
  4692. // }
  4693. // log.info("化验室报警的时候,发现存在异常偏低的报警,后续同指标报警不再处理");
  4694. // return;
  4695. // }else{//不存在 查看历史是否有报警,有的话关闭
  4696. // if(!CollectionUtils.isEmpty(tXinyiNoChangeYCPDRecords)){
  4697. // closeWarning(tXinyiNoChangeYCPDRecords.get(0));
  4698. // }
  4699. // }
  4700. // }
  4701. //下面是最原始的处理 超标准 超管控报警
  4702. BigDecimal multiply = csBzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
  4703. TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
  4704. tXinyiWarningRecord.setStatus(0);
  4705. tXinyiWarningRecord.setType(0);
  4706. tXinyiWarningRecord.setCategory(category);
  4707. tXinyiWarningRecord.setTime(DateUtils.getNowDate());
  4708. tXinyiWarningRecord.setWarningVal(currentVal);
  4709. tXinyiWarningRecord.setDesignVal(csBzz);
  4710. tXinyiWarningRecord.setControlVal(csGkz);
  4711. tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
  4712. tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
  4713. tXinyiWarningRecord.setRemark(THREE_HYS_WARNING.getCode());//化验室
  4714. tXinyiWarningRecord.setCwrwfhz(cwrwfhz);//2025年02月14日10:42:53 具体指标具体计算,由上游传过来。
  4715. //2025年02月17日13:53:49 化验室的报警都是对应的类型都是出水
  4716. tXinyiWarningRecord.setWaterType(BusinessEnum.WaterTypeEnum.CS.getCode());
  4717. //2024年5月25日17:52:33 如果化验室获取不到数据,也触发报警,但是不调用决策接口
  4718. if(Objects.isNull(currentVal)){
  4719. tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
  4720. tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
  4721. }else if(currentVal.compareTo(multiply) > 0){//一级
  4722. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  4723. tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
  4724. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  4725. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  4726. }else if(currentVal.compareTo(csBzz) >= 0 && currentVal.compareTo(multiply) <= 0){//二级
  4727. tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
  4728. tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
  4729. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CBZZ.getCode());
  4730. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, true));//根据当前值和类型以及是否超标处理
  4731. }else if(!Objects.isNull(csGkz) && currentVal.compareTo(csGkz) > 0){
  4732. tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
  4733. tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
  4734. tXinyiWarningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.CGKZ.getCode());
  4735. tXinyiWarningRecord.setCwrwxz(getCwrwxzByDetail(currentVal, normConfig, category, false));//根据当前值和类型以及是否超标处理
  4736. }else{
  4737. tXinyiWarningRecord = null;//这种的无需处理
  4738. }
  4739. //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
  4740. List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(0).category(category).status(0).build());
  4741. if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息
  4742. if(!CollectionUtils.isEmpty(tXinyiWarningRecords)){
  4743. log.info( "{}:现在恢复正常,历史报警数据为{}", category,JSON.toJSONString(tXinyiWarningRecords));
  4744. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {
  4745. xinyiWarningRecord.setStatus(2);
  4746. xinyiWarningRecord.setOffTime(nowDate);
  4747. xinyiWarningRecord.setUpdateTime(nowDate);
  4748. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  4749. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  4750. }
  4751. }
  4752. }else{//有告警信息
  4753. if(CollectionUtils.isEmpty(tXinyiWarningRecords)){//之前没有告警记录
  4754. //2024年7月18日16:23:11 新增逻辑,查询是否有连续升高的趋势,如果有才需要报警
  4755. /*List<TXinyiRobot> tXinyiRobots = this.xinyiRobotMapper.selectNRobot(INT_3);
  4756. if(CollectionUtils.isEmpty(tXinyiRobots) || tXinyiRobots.size() < 3){
  4757. log.error("处理连续检测报警时,获取最近的3条化验数据失败~~~~~~~");
  4758. return;
  4759. }
  4760. TXinyiRobot tXinyiRobot1 = tXinyiRobots.get(INDEX_1);//前一个小时*/
  4761. TXinyiRobot tXinyiRobot2 = tXinyiRobots.get(INDEX_2);//前两个小时
  4762. if(!this.judgeContinuousRobot(tXinyiRobot1, tXinyiRobot2, category)){
  4763. log.info("虽然当前超标了,但是没有连续升高趋势,所以不报警,当前没有报警出来的数据为{}\n,前一个小时数据为{}\n前两个小时数据为{}", JSON.toJSONString(tXinyiWarningRecord), JSON.toJSONString(tXinyiRobot1), JSON.toJSONString(tXinyiRobot2));
  4764. return;
  4765. }
  4766. //保存到数据库中
  4767. //2024年7月15日11:06:16 因为只有一个告警记录,但是如果一直报警,现在报警时间取的是更新时间,兼容第一次报警处理
  4768. tXinyiWarningRecord.setUpdateTime(nowDate);
  4769. this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(tXinyiWarningRecord);
  4770. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  4771. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  4772. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  4773. }else {
  4774. //继续调用决策
  4775. this.handleDecision(tXinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
  4776. }
  4777. }else{
  4778. log.info("{}:之前已经有过告警记录了,且还是继续报警,无需重复添加报警,但是决策仍然要调用", category);
  4779. for (TXinyiWarningRecord xinyiWarningRecord : tXinyiWarningRecords) {//理论上只有一个的
  4780. if(WARNING_LEVEL_NO_DATE.equals(tXinyiWarningRecord.getLevel())){
  4781. //只保存一个普通的问答记录 不需要调用决策信息,但是实时数据还是要记录的
  4782. this.addChatRecordByDeviceErr(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  4783. }else {
  4784. //2024年7月5日10:45:24 逻辑调整:更新一直报警的那条记录的显示值
  4785. xinyiWarningRecord.setWarningVal(tXinyiWarningRecord.getWarningVal());
  4786. // xinyiWarningRecord.setDesignVal(tXinyiWarningRecord.getDesignVal());
  4787. // tXinyiWarningRecord.setControlVal(tXinyiWarningRecord.getControlVal());
  4788. xinyiWarningRecord.setTime(tXinyiWarningRecord.getTime());
  4789. xinyiWarningRecord.setUpdateTime(nowDate);
  4790. xinyiWarningRecord.setUpdateBy(WARNING_DEFAULT_CREATE);
  4791. //2024年7月15日11:07:33 报警的级别也要重新计算并更新
  4792. xinyiWarningRecord.setLevel(tXinyiWarningRecord.getLevel());
  4793. //2024年7月31日09:20:47 报警的原因(超标还是超管控也需要更新)
  4794. xinyiWarningRecord.setReason(tXinyiWarningRecord.getReason());
  4795. //更新数据库
  4796. this.xinyiWarningRecordMapper.updateTXinyiWarningRecord(xinyiWarningRecord);
  4797. //继续调用决策
  4798. this.handleDecision(xinyiWarningRecord, tXinyiIndustry, normConfig, true, nowDate);
  4799. }
  4800. }
  4801. }
  4802. }
  4803. }
  4804. private boolean judgeContinuousRobot(TXinyiRobot tXinyiRobot1, TXinyiRobot tXinyiRobot2, String category) {
  4805. boolean result = false;//默认不超标
  4806. if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_1.getCode().equals(category)){
  4807. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  4808. BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj1Jqr();
  4809. if(!Objects.isNull(no3Hlj1Jqr1) && !Objects.isNull(no3Hlj1Jqr2) && no3Hlj1Jqr1.compareTo(no3Hlj1Jqr2) > INT_0)
  4810. result = true;
  4811. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_XSY_2.getCode().equals(category)){
  4812. BigDecimal no3Hlj2Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  4813. BigDecimal no3Hlj2Jqr2 = tXinyiRobot2.getNo3Hlj2Jqr();
  4814. if(!Objects.isNull(no3Hlj2Jqr1) && !Objects.isNull(no3Hlj2Jqr2) && no3Hlj2Jqr1.compareTo(no3Hlj2Jqr2) > INT_0)
  4815. result = true;
  4816. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ECCZLSY.getCode().equals(category)){
  4817. BigDecimal tpRccJqr1 = tXinyiRobot1.getTpRccJqr();
  4818. BigDecimal tpRccJqr2 = tXinyiRobot2.getTpRccJqr();
  4819. if(!Objects.isNull(tpRccJqr1) && !Objects.isNull(tpRccJqr2) && tpRccJqr1.compareTo(tpRccJqr2) > INT_0)
  4820. result = true;
  4821. }/*else if(BusinessEnum.WarningCategoryEnum.ROBOT_ANDAN_1.getCode().equals(category)){
  4822. //计算1
  4823. BigDecimal no3Qyc1Jqr1 = tXinyiRobot1.getNo3Qyc1Jqr();
  4824. BigDecimal nh31Jqr1 = tXinyiRobot1.getNh31Jqr();
  4825. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj1Jqr();
  4826. if(Objects.isNull(no3Qyc1Jqr1))
  4827. no3Qyc1Jqr1 = BigDecimal.ZERO;
  4828. if(Objects.isNull(nh31Jqr1))
  4829. nh31Jqr1 = BigDecimal.ZERO;
  4830. if(Objects.isNull(no3Hlj1Jqr1))
  4831. no3Hlj1Jqr1 = BigDecimal.ZERO;
  4832. BigDecimal anDan1 = no3Qyc1Jqr1.add(nh31Jqr1).subtract(no3Hlj1Jqr1);
  4833. //计算2
  4834. BigDecimal no3Qyc1Jqr2 = tXinyiRobot2.getNo3Qyc1Jqr();
  4835. BigDecimal nh31Jqr2 = tXinyiRobot2.getNh31Jqr();
  4836. BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj1Jqr();
  4837. if(Objects.isNull(no3Qyc1Jqr2))
  4838. no3Qyc1Jqr2 = BigDecimal.ZERO;
  4839. if(Objects.isNull(nh31Jqr2))
  4840. nh31Jqr2 = BigDecimal.ZERO;
  4841. if(Objects.isNull(no3Hlj1Jqr2))
  4842. no3Hlj1Jqr2 = BigDecimal.ZERO;
  4843. BigDecimal anDan2 = no3Qyc1Jqr2.add(nh31Jqr2).subtract(no3Hlj1Jqr2);
  4844. if(anDan1.compareTo(anDan2) > INT_0)
  4845. result = true;
  4846. }else if(BusinessEnum.WarningCategoryEnum.ROBOT_ANDAN_2.getCode().equals(category)){
  4847. //计算1
  4848. BigDecimal no3Qyc1Jqr1 = tXinyiRobot1.getNo3Qyc2Jqr();
  4849. BigDecimal nh31Jqr1 = tXinyiRobot1.getNh32Jqr();
  4850. BigDecimal no3Hlj1Jqr1 = tXinyiRobot1.getNo3Hlj2Jqr();
  4851. if(Objects.isNull(no3Qyc1Jqr1))
  4852. no3Qyc1Jqr1 = BigDecimal.ZERO;
  4853. if(Objects.isNull(nh31Jqr1))
  4854. nh31Jqr1 = BigDecimal.ZERO;
  4855. if(Objects.isNull(no3Hlj1Jqr1))
  4856. no3Hlj1Jqr1 = BigDecimal.ZERO;
  4857. BigDecimal anDan1 = no3Qyc1Jqr1.add(nh31Jqr1).subtract(no3Hlj1Jqr1);
  4858. //计算2
  4859. BigDecimal no3Qyc1Jqr2 = tXinyiRobot2.getNo3Qyc2Jqr();
  4860. BigDecimal nh31Jqr2 = tXinyiRobot2.getNh32Jqr();
  4861. BigDecimal no3Hlj1Jqr2 = tXinyiRobot2.getNo3Hlj2Jqr();
  4862. if(Objects.isNull(no3Qyc1Jqr2))
  4863. no3Qyc1Jqr2 = BigDecimal.ZERO;
  4864. if(Objects.isNull(nh31Jqr2))
  4865. nh31Jqr2 = BigDecimal.ZERO;
  4866. if(Objects.isNull(no3Hlj1Jqr2))
  4867. no3Hlj1Jqr2 = BigDecimal.ZERO;
  4868. BigDecimal anDan2 = no3Qyc1Jqr2.add(nh31Jqr2).subtract(no3Hlj1Jqr2);
  4869. if(anDan1.compareTo(anDan2) > INT_0)
  4870. result = true;
  4871. }*/else if(BusinessEnum.WarningCategoryEnum.ROBOT_CS_AD.getCode().equals(category)){//2024年7月26日14:33:39 合并一个指标:出水氨氮
  4872. //计算1(1池)
  4873. BigDecimal no3Qyc1Jqr11 = tXinyiRobot1.getNo3Qyc1Jqr();
  4874. BigDecimal nh31Jqr11 = tXinyiRobot1.getNh31Jqr();
  4875. BigDecimal no3Hlj1Jqr11 = tXinyiRobot1.getNo3Hlj1Jqr();
  4876. if(Objects.isNull(no3Qyc1Jqr11))
  4877. no3Qyc1Jqr11 = BigDecimal.ZERO;
  4878. if(Objects.isNull(nh31Jqr11))
  4879. nh31Jqr11 = BigDecimal.ZERO;
  4880. if(Objects.isNull(no3Hlj1Jqr11))
  4881. no3Hlj1Jqr11 = BigDecimal.ZERO;
  4882. BigDecimal anDan11 = no3Qyc1Jqr11.add(nh31Jqr11).subtract(no3Hlj1Jqr11);
  4883. //计算1(2池)
  4884. BigDecimal no3Qyc1Jqr12 = tXinyiRobot1.getNo3Qyc2Jqr();
  4885. BigDecimal nh31Jqr12 = tXinyiRobot1.getNh32Jqr();
  4886. BigDecimal no3Hlj1Jqr12 = tXinyiRobot1.getNo3Hlj2Jqr();
  4887. if(Objects.isNull(no3Qyc1Jqr12))
  4888. no3Qyc1Jqr12 = BigDecimal.ZERO;
  4889. if(Objects.isNull(nh31Jqr12))
  4890. nh31Jqr12 = BigDecimal.ZERO;
  4891. if(Objects.isNull(no3Hlj1Jqr12))
  4892. no3Hlj1Jqr12 = BigDecimal.ZERO;
  4893. BigDecimal anDan12 = no3Qyc1Jqr12.add(nh31Jqr12).subtract(no3Hlj1Jqr12);
  4894. BigDecimal divide1 = anDan11.add(anDan12).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4895. //计算2(1池)
  4896. BigDecimal no3Qyc1Jqr21 = tXinyiRobot2.getNo3Qyc1Jqr();
  4897. BigDecimal nh31Jqr21 = tXinyiRobot2.getNh31Jqr();
  4898. BigDecimal no3Hlj1Jqr21 = tXinyiRobot2.getNo3Hlj1Jqr();
  4899. if(Objects.isNull(no3Qyc1Jqr21))
  4900. no3Qyc1Jqr21 = BigDecimal.ZERO;
  4901. if(Objects.isNull(nh31Jqr21))
  4902. nh31Jqr21 = BigDecimal.ZERO;
  4903. if(Objects.isNull(no3Hlj1Jqr21))
  4904. no3Hlj1Jqr21 = BigDecimal.ZERO;
  4905. BigDecimal anDan21 = no3Qyc1Jqr21.add(nh31Jqr21).subtract(no3Hlj1Jqr21);
  4906. //计算2(2池)
  4907. BigDecimal no3Qyc1Jqr22 = tXinyiRobot2.getNo3Qyc2Jqr();
  4908. BigDecimal nh31Jqr22 = tXinyiRobot2.getNh32Jqr();
  4909. BigDecimal no3Hlj1Jqr22 = tXinyiRobot2.getNo3Hlj2Jqr();
  4910. if(Objects.isNull(no3Qyc1Jqr22))
  4911. no3Qyc1Jqr22 = BigDecimal.ZERO;
  4912. if(Objects.isNull(nh31Jqr22))
  4913. nh31Jqr22 = BigDecimal.ZERO;
  4914. if(Objects.isNull(no3Hlj1Jqr22))
  4915. no3Hlj1Jqr22 = BigDecimal.ZERO;
  4916. BigDecimal anDan22 = no3Qyc1Jqr22.add(nh31Jqr22).subtract(no3Hlj1Jqr22);
  4917. BigDecimal divide2 = anDan21.add(anDan22).divide(DECIMAL_2, NUMBER_SCALE_4, RoundingMode.HALF_UP);
  4918. if(divide1.compareTo(divide2) > INT_0)
  4919. result = true;
  4920. }else{
  4921. log.error("暂时还不支持的报警类型~~~~");
  4922. }
  4923. return result;
  4924. }
  4925. /**
  4926. *
  4927. * 大宽表的数据处理
  4928. * @param tXinyiRobot
  4929. */
  4930. public void updateBigTableHourByRobot(TXinyiRobot tXinyiRobot) {
  4931. List<TXinyiBigTableHour> tXinyiBigTableHours = this.xinyiBigTableHourMapper.selectTXinyiBigTableHourList(TXinyiBigTableHour.builder().testHour(tXinyiRobot.getTestHour()).build());
  4932. if(!CollectionUtils.isEmpty(tXinyiBigTableHours)){
  4933. for (TXinyiBigTableHour tXinyiBigTableHour : tXinyiBigTableHours) {
  4934. this.updateBigTableByRobot(tXinyiBigTableHour, tXinyiRobot);
  4935. }
  4936. }
  4937. }
  4938. private void updateBigTableByRobot(TXinyiBigTableHour tXinyiBigTableHour, TXinyiRobot tXinyiRobot) {
  4939. jsCsFormatData.addRobot2Hour(tXinyiBigTableHour, tXinyiRobot);
  4940. //更新数据库
  4941. this.xinyiBigTableHourMapper.updateTXinyiBigTableHour(tXinyiBigTableHour);
  4942. }
  4943. }