123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223 |
- package com.shkpr.service.aimodelpower.bizmgr;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.global.base.log.LogLevelFlag;
- import com.global.base.log.LogPrintMgr;
- import com.global.base.tools.FastJsonUtil;
- import com.shkpr.service.aimodelpower.commtools.ProbabilityAlgorithm;
- import com.shkpr.service.aimodelpower.commtools.TimeTool;
- import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
- import com.shkpr.service.aimodelpower.dbdao.DBMgrProxy;
- import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.WaterZILAISHUIDao;
- import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.service.intef.WaterCollecationService;
- import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.service.intef.WaterTapWaterService;
- import com.shkpr.service.aimodelpower.dto.ResponseCode;
- import com.shkpr.service.aimodelpower.dto.ResponseRes;
- import com.shkpr.service.aimodelpower.dto.TraceRunnable;
- import com.shkpr.service.aimodelpower.dto.zilaishuiModel.InPumpModel;
- import com.shkpr.service.aimodelpower.globalmgr.ThreadTaskMgr;
- import com.shkpr.service.aimodelpower.globalmgr.TraceLogMgr;
- import com.shkpr.service.aimodelpower.jsonbean.zilaishui.*;
- import com.shkpr.service.aimodelpower.services.ServiceMgrProxy;
- import org.apache.commons.collections.MapUtils;
- import org.springframework.util.CollectionUtils;
- import org.springframework.util.ObjectUtils;
- import org.springframework.util.StringUtils;
- import java.io.*;
- import java.time.LocalDateTime;
- import java.time.LocalTime;
- import java.time.YearMonth;
- import java.time.format.DateTimeFormatter;
- import java.time.temporal.TemporalAdjusters;
- import java.util.*;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ThreadLocalRandom;
- import java.util.stream.Collectors;
- /**
- * @ClassName KprAimWaterCollecationBizFun
- * @Description: TODO
- * @Author LX
- * @Date 2024/5/27
- * @Version V1.0
- **/
- public class KprAimWaterCollecationBizFun {
- private static final String MSG_SUCCESS = "success.";
- private static final String MSG_FAILED = "failed.";
- private static final String mStrClassName = "KprAimTapWaterBizFun";
- private static final String EMPTY_NULL = "NULL";
- static JSONObject pumpObj = JSONObject.parseObject("{\n" +
- " \"UZD299F12944DC10957HJ\": {\n" +
- " \"outRoom\": {\n" +
- " \"pumps\": [\n" +
- " {\n" +
- " \"label\": \"1\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"2\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"3\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"4\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"5\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"6\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"7\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " },\n" +
- " \"UZD299F12DF5241082772\": {\n" +
- " \"outRoom\": {\n" +
- " \"pumps\": [\n" +
- " {\n" +
- " \"label\": \"1\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"2\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"3\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"4\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"5\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"6\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"7\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"8\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"9\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"10\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " },\n" +
- " \"UZD299F1301D04107668V\": {\n" +
- " \"outRoom\": {\n" +
- " \"pumps\": [\n" +
- " {\n" +
- " \"label\": \"1\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"2\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"3\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"4\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"5\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"6\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"7\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"8\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " },\n" +
- " \"UZD299F133DE5C1066A5L\": {\n" +
- " \"outRoom\": {\n" +
- " \"pumps\": [\n" +
- " {\n" +
- " \"label\": \"1\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"2\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"3\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"4\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"5\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"6\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " },\n" +
- " \"UZD299F1389E6010476AV\": {\n" +
- " \"outRoom\": {\n" +
- " \"pumps\": [\n" +
- " {\n" +
- " \"label\": \"1\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"2\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"3\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"4\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"5\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"6\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 0\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"7\",\n" +
- " \"status\": 1,\n" +
- " \"forecastStatus\": 1\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " },\n" +
- " \"UZD299F139CB2410181HP\": {\n" +
- " \"outRoom\": {\n" +
- " \"pumps\": [\n" +
- " {\n" +
- " \"label\": \"1\",\n" +
- " \"status\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"2\",\n" +
- " \"status\": 1\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"3\"\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"4\"\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"5\"\n" +
- " },\n" +
- " {\n" +
- " \"label\": \"6\"\n" +
- " }\n" +
- " ]\n" +
- " }\n" +
- " }\n" +
- "}");
- public static WaterCollecationService getWaterTapWaterApi(){
- return DBMgrProxy.getInstance().applyWaterCollecationService();
- }
- public static WaterTapWaterService getWaterTapApi(){
- return DBMgrProxy.getInstance().applyWaterTapWaterService();
- }
- static DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- static DateTimeFormatter formater2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- public static String databaseName = "";
- //TODO 获取数据库名
- public static void initDatabaseName(){
- Properties prop = new Properties();
- InputStream input = null;
- try {
- input = new FileInputStream("./sql.properties");
- // 加载properties文件
- prop.load(input);
- // 根据属性名获取属性值
- String databaseName = prop.getProperty("spring,database.name");
- KprAimWaterCollecationBizFun.databaseName = databaseName;
- } catch (IOException ex) {
- ex.printStackTrace();
- } finally {
- if (input != null) {
- try {
- input.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * 通过 orgId 查找对应的 orgName
- *
- * @param workZoneIds Map 集合
- * @param orgId 指定的 orgId
- * @return Optional<String> 对应的 orgName
- */
- public static Optional<String> findOrgNameByOrgId(Map<String, String> workZoneIds, String orgId) {
- return workZoneIds.entrySet()
- .stream()
- .filter(entry -> orgId.equals(entry.getValue()))
- .map(Map.Entry::getKey)
- .findFirst(); // 找不到会自动返回 Optional.empty()
- }
- private static double parseDouble(Object value) {
- return value == null ? 0.0 : Double.parseDouble(value.toString());
- }
- //TODO 查询日取水量预测接口
- /**
- * 1.传入水厂Id及起止日期(日期格式为YYYY-MM-DD),返回日期内,每天的预测取水量数据和实际取水量数据
- * 2.同时返回指定截止日期之后,未来4天的预测水量数据和实际水量(如没有,则返回为空数据)
- */
- public static ResponseRes selectTbWaterList(JPTbMWater jpTbMWater,Integer level,Map<String, Map<String, List<String>>> result
- ,Map<String,String> workZonIds){
- ResponseRes responseRes = new ResponseRes();
- List<Map<String,Object>> list =new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- map.put("ID", null);
- map.put("Date", null);
- map.put("Max_temperature", null);
- map.put("Min_temperature", null);
- map.put("Weather", null);
- map.put("Month", null);
- map.put("Week", null);
- map.put("Holiday", null);
- map.put("LastActualWaterWithdrawals", null);
- map.put("LastActualWaterSupply", null);
- map.put("ActualWaterWithdrawals", null);
- map.put("ActualWaterSupply", null);
- map.put("ForecastWaterWithdrawals", null);
- map.put("ForecastActualWaterSupply", null);
- map.put("isAbnormal", null);
- map.put("isForecast", null);
- map.put("LastModifyTime", null);
- list.add(map);
- responseRes.setResdata(list);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- if ("water_volume_prediction".equals(databaseName)){
- //TODO 自来水分了二级泵房,要做查询数据处理,点击水厂查询条件时,查询其下的泵房数据 再相加,
- //TODO 点击泵房则就查泵房的数据 ,无需做处理
- List<String> childList = new ArrayList<>();//要查询的组织机构名称集合
- List<String> childIdList = new ArrayList<>();//要查询的组织机构id集合
- if (level==1){
- //TODO 一级已经没有数据了(水厂), 查询一级的话则是将其下的供水数据相加
- //TODO 查询二级,及其二级带的三级
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMWater.getOrgId());
- if(zoneNameOpt.isPresent()){
- String zoneName = zoneNameOpt.get().toString();
- Map<String, List<String>> childMap = result.get(zoneName);//二级
- Collection<List<String>> child2Map = childMap.values();//三级
- // 添加二级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap.keySet());
- // 添加三级组织机构名称(child2Map 的所有 List<String>)
- for (List<String> child2List : child2Map) {
- childList.addAll(child2List);
- }
- }
- }else if(level==2){
- //TODO 如果是二级,就查询其自身,看看其下还有没有集合,有的话就查其下的所有集合,没有的话就查其自身
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMWater.getOrgId());
- if(zoneNameOpt.isPresent()) {
- String zoneName = zoneNameOpt.get().toString();
- List<String> childMap = new ArrayList<>();//三级
- // 遍历第一级 Map
- for (Map.Entry<String, Map<String, List<String>>> entry : result.entrySet()) {
- Map<String, List<String>> nestedMap = entry.getValue();
- // 检查第二级键
- if (nestedMap.containsKey(zoneName)) {
- childMap = nestedMap.get(zoneName);
- }
- }
- if(childMap.size()>0) {
- // 添三级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap);
- }else{
- childList.add(zoneName);
- }
- }
- }else if(level==3){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_INTERNAL.toStrValue(), mStrClassName, ""
- , "5555");
- //TODO 如果是三级,就查询其自身
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMWater.getOrgId());
- if(zoneNameOpt.isPresent()) {
- String zoneName = zoneNameOpt.get().toString();
- childList.add(zoneName);
- }
- }else if(level==-1){
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- Map<String,Object> objectMap = orgConfig.stream()
- .filter(mapX -> Objects.equals(jpTbMWater.getOrgId(), mapX.get("org_id")))
- .findFirst().orElse(null);
- if(objectMap!=null) {
- childList.add(objectMap.get("org_name").toString());
- childIdList.add(objectMap.get("org_id").toString());
- }
- }
- //TODO 开始查询
- // 结果集合,存储 childList 对应的组织机构 ID
- // 遍历 childList,从 workZonIds 中获取对应的 ID
- for (String orgName : childList) {
- String orgId = workZonIds.get(orgName);
- if (orgId != null) { // 避免空值
- childIdList.add(orgId);
- }
- }
- List<Map<String,Object>> newResList = new ArrayList<>();
- int index = 0;
- for (String orgId:childIdList){
- jpTbMWater.setOrgId(orgId);
- jpTbMWater.checkValid();
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMWater(jpTbMWater.getIsPage(),
- jpTbMWater.getLimit(), jpTbMWater.getOffset(), jpTbMWater.getForDateStr() + " ORDER BY \"Date\" ASC ");
- if(!CollectionUtils.isEmpty(newResList)&&!CollectionUtils.isEmpty(resList)){
- //TODO 说明要查询的分区不止一个,则把原来有的数据与新查的数据相加,因为按Date排了序所以一致
- for (int i=0;i<newResList.size();i++){
- newResList.get(i).put("LastActualWaterWithdrawals",
- parseDouble(newResList.get(i).get("LastActualWaterWithdrawals")) +
- parseDouble(resList.get(i).get("LastActualWaterWithdrawals")));
- newResList.get(i).put("LastActualWaterSupply",
- parseDouble(newResList.get(i).get("LastActualWaterSupply")) +
- parseDouble(resList.get(i).get("LastActualWaterSupply")));
- newResList.get(i).put("ActualWaterWithdrawals",
- parseDouble(newResList.get(i).get("ActualWaterWithdrawals")) +
- parseDouble(resList.get(i).get("ActualWaterWithdrawals")));
- newResList.get(i).put("ActualWaterSupply",
- parseDouble(newResList.get(i).get("ActualWaterSupply")) +
- parseDouble(resList.get(i).get("ActualWaterSupply")));
- newResList.get(i).put("ForecastWaterWithdrawals",
- parseDouble(newResList.get(i).get("ForecastWaterWithdrawals")) +
- parseDouble(resList.get(i).get("ForecastWaterWithdrawals")));
- newResList.get(i).put("ForecastActualWaterSupply",
- parseDouble(newResList.get(i).get("ForecastActualWaterSupply")) +
- parseDouble(resList.get(i).get("ForecastActualWaterSupply")));
- }
- }else {
- newResList.addAll(resList);
- }
- index++;
- }
- if (!CollectionUtils.isEmpty(newResList)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(newResList);
- }
- }else {
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMWater(jpTbMWater.getIsPage(),
- jpTbMWater.getLimit(), jpTbMWater.getOffset(), jpTbMWater.getForDateStr());
- if (!CollectionUtils.isEmpty(resList)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(resList);
- }
- }
- return responseRes;
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- //TODO 获取15分钟实际水量数据
- public static ResponseRes selectRealMinutesWaterList(JPRealHourWater jpTbMHourWater,Integer level,Map<String, Map<String, List<String>>> result
- ,Map<String,String> workZonIds){
- ResponseRes responseRes = new ResponseRes();
- List<Map<String, Object>> list = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- // map.put("id", null);
- map.put("org_name", null);
- map.put("time", null);
- map.put("value", null);
- // map.put("value_tag", null);
- // map.put("collcation_tag_array", null);
- list.add(map);
- responseRes.setResdata(list);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- List<Map<String, Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0, "");
- if ("water_volume_prediction_jiangjin2".equals(databaseName)) {
- orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0, "");
- }
- if(!CollectionUtils.isEmpty(orgConfig)){
- //TODO 根据分区编号找到对应的名称
- if(level==null||level!=1||level==-1) {
- Optional<Map<String, Object>> mapOrg = orgConfig.stream()
- .filter(maps -> jpTbMHourWater.getOrgId().equals(maps.get("org_id")))
- .findFirst();
- if (mapOrg.isPresent()) {
- Map<String, Object> currentOrg = mapOrg.get();
- List<Map<String, Object>> recordAllRes = getWaterTapApi()
- .getWaterCollectionRecordAllListAllNew(" WHERE 1=1 " +
- " AND org_name = '" + currentOrg.get("org_name").toString() + "'" +
- jpTbMHourWater.getForDateStr());
- recordAllRes.stream()
- .forEach(item -> {
- item.remove("id");
- item.remove("value_tag");
- item.remove("collcation_tag_array");
- });
- if (jpTbMHourWater.getDayData()) {
- responseRes.setResdata(aggregateByDay(recordAllRes));
- } else {
- responseRes.setResdata(recordAllRes);
- }
- }
- }else if(level!=null&&level ==1){
- //TODO 一级已经没有数据了(水厂), 查询一级的话则是将其下的供水数据相加
- //TODO 查询二级,及其二级带的三级
- List<String> childList = new ArrayList<>();//要查询的组织机构名称集合
- List<String> childIdList = new ArrayList<>();//要查询的组织机构id集合
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()){
- String zoneName = zoneNameOpt.get().toString();
- Map<String, List<String>> childMap = result.get(zoneName);//二级
- Collection<List<String>> child2Map = childMap.values();//三级
- // 添加二级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap.keySet());
- // 添加三级组织机构名称(child2Map 的所有 List<String>)
- for (List<String> child2List : child2Map) {
- childList.addAll(child2List);
- }
- }
- // 结果集合,存储 childList 对应的组织机构 ID
- // 遍历 childList,从 workZonIds 中获取对应的 ID
- for (String orgName : childList) {
- String orgId = workZonIds.get(orgName);
- if (orgId != null) { // 避免空值
- childIdList.add(orgId);
- }
- }
- List<Map<String,Object>> newResList = new ArrayList<>();
- int index = 0;
- for (String orgName:childList){
- List<Map<String,Object>> resList = getWaterTapApi()
- .getWaterCollectionRecordAllListAllNew(" WHERE 1=1 " +
- " AND org_name = '"+orgName+"'" +
- jpTbMHourWater.getForDateStr() + " ORDER BY time ASC ");
- if(!CollectionUtils.isEmpty(newResList)&&!CollectionUtils.isEmpty(resList)){
- //TODO 说明要查询的分区不止一个,则&把原来有的数据与新查的数据相加,因为按Date排了序所以一致
- for (int i=0;i<newResList.size();i++){
- if(i>=resList.size()){
- continue;
- }
- newResList.get(i).put("value",
- String.valueOf(parseDouble(newResList.get(i).get("value")) +
- parseDouble(resList.get(i).get("value"))));
- newResList.get(i).put("org_name",orgName);
- newResList.get(i).put("time",resList.get(i).get("time"));
- }
- }else {
- newResList.addAll(resList);
- }
- index++;
- }
- newResList.stream()
- .forEach(item -> {
- item.remove("id");
- item.remove("value_tag");
- item.remove("collcation_tag_array");
- });
- if(jpTbMHourWater.getDayData()){
- responseRes.setResdata(aggregateByDay(newResList));
- }else{
- responseRes.setResdata(newResList);
- }
- }
- }
- return responseRes;
- }catch(Exception ex){
- ex.printStackTrace();
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- //TODO 获取小时实际水量数据
- public static ResponseRes selectRealHourWaterList(JPRealHourWater jpTbMHourWater,Integer level,Map<String, Map<String, List<String>>> result
- ,Map<String,String> workZonIds){
- ResponseRes responseRes = new ResponseRes();
- List<Map<String, Object>> list = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- // map.put("id", null);
- map.put("org_name", null);
- map.put("time", null);
- map.put("value", null);
- // map.put("value_tag", null);
- // map.put("collcation_tag_array", null);
- list.add(map);
- responseRes.setResdata(list);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- List<Map<String, Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0, "");
- if ("water_volume_prediction_jiangjin2".equals(databaseName)) {
- orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0, "");
- }
- if(!CollectionUtils.isEmpty(orgConfig)){
- //TODO 根据分区编号找到对应的名称
- if(level==null||level!=1||level==-1) {
- Optional<Map<String, Object>> mapOrg = orgConfig.stream()
- .filter(maps -> jpTbMHourWater.getOrgId().equals(maps.get("org_id")))
- .findFirst();
- if (mapOrg.isPresent()) {
- Map<String, Object> currentOrg = mapOrg.get();
- List<Map<String, Object>> recordAllRes = getWaterTapApi()
- .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND org_name = '" + currentOrg.get("org_name").toString() + "'" +
- jpTbMHourWater.getForDateStr());
- recordAllRes.stream()
- .forEach(item -> {
- item.remove("id");
- item.remove("value_tag");
- item.remove("collcation_tag_array");
- });
- if (jpTbMHourWater.getDayData()) {
- responseRes.setResdata(aggregateByDay(recordAllRes));
- } else {
- responseRes.setResdata(recordAllRes);
- }
- }
- }else if(level!=null&&level ==1){
- //TODO 一级已经没有数据了(水厂), 查询一级的话则是将其下的供水数据相加
- //TODO 查询二级,及其二级带的三级
- List<String> childList = new ArrayList<>();//要查询的组织机构名称集合
- List<String> childIdList = new ArrayList<>();//要查询的组织机构id集合
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()){
- String zoneName = zoneNameOpt.get().toString();
- Map<String, List<String>> childMap = result.get(zoneName);//二级
- Collection<List<String>> child2Map = childMap.values();//三级
- // 添加二级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap.keySet());
- // 添加三级组织机构名称(child2Map 的所有 List<String>)
- for (List<String> child2List : child2Map) {
- childList.addAll(child2List);
- }
- }
- // 结果集合,存储 childList 对应的组织机构 ID
- // 遍历 childList,从 workZonIds 中获取对应的 ID
- for (String orgName : childList) {
- String orgId = workZonIds.get(orgName);
- if (orgId != null) { // 避免空值
- childIdList.add(orgId);
- }
- }
- List<Map<String,Object>> newResList = new ArrayList<>();
- int index = 0;
- for (String orgName:childList){
- List<Map<String,Object>> resList = getWaterTapApi()
- .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND org_name = '"+orgName+"'" +
- jpTbMHourWater.getForDateStr() + " ORDER BY time ASC ");
- if(!CollectionUtils.isEmpty(newResList)&&!CollectionUtils.isEmpty(resList)){
- //TODO 说明要查询的分区不止一个,则&把原来有的数据与新查的数据相加,因为按Date排了序所以一致
- for (int i=0;i<newResList.size();i++){
- newResList.get(i).put("value",
- String.valueOf(parseDouble(newResList.get(i).get("value")) +
- parseDouble(resList.get(i).get("value"))));
- newResList.get(i).put("org_name",orgName);
- newResList.get(i).put("time",resList.get(i).get("time"));
- }
- }else {
- newResList.addAll(resList);
- }
- index++;
- }
- newResList.stream()
- .forEach(item -> {
- item.remove("id");
- item.remove("value_tag");
- item.remove("collcation_tag_array");
- });
- if(jpTbMHourWater.getDayData()){
- responseRes.setResdata(aggregateByDay(newResList));
- }else{
- responseRes.setResdata(newResList);
- }
- }
- }
- return responseRes;
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- public static List<Map<String, Object>> aggregateByDay(List<Map<String, Object>> hourlyData) {
- // 定义日期格式
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00:00");
- // 按日期分组
- Map<String, List<Map<String, Object>>> groupedByDate = hourlyData.stream()
- .collect(Collectors.groupingBy(
- record -> {
- String timeStr = (String) record.get("time");
- LocalDateTime dateTime = LocalDateTime.parse(timeStr, formatter);
- return dateTime.format(dateFormatter);
- }
- ));
- // 创建结果列表
- List<Map<String, Object>> dailyData = new ArrayList<>();
- // 对每天的数据进行聚合
- groupedByDate.forEach((date, records) -> {
- Map<String, Object> dailyRecord = new HashMap<>();
- // 保留第一个记录的id和org_name
- dailyRecord.put("org_name", records.get(0).get("org_name"));
- dailyRecord.put("time", date);
- // 计算当天的总值(示例为求和)
- double sum = records.stream()
- .mapToDouble(record -> Double.parseDouble((String) record.get("value")))
- .sum();
- // 计算当天平均值
- double average = sum / records.size();
- // dailyRecord.put("total_value", String.valueOf(sum));
- // dailyRecord.put("average_value", String.valueOf(average));
- // dailyRecord.put("record_count", records.size());
- dailyRecord.put("value", String.valueOf(sum));
- dailyData.add(dailyRecord);
- });
- return dailyData;
- }
- //TODO 15分钟水量预测接口
- /**
- * 传入水厂id及日期,返回指定日期内的小时取水量预测数据和实际小时取水量数据
- */
- public static ResponseRes selectTbMinutesWaterList(JPTbMMinutesWater jpTbMHourWater,Integer level,Map<String, Map<String, List<String>>> result
- ,Map<String,String> workZonIds){
- ResponseRes responseRes = new ResponseRes();
- List<Map<String, Object>> list = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- map.put("ID", null);
- map.put("Date", null);
- map.put("Hour", null);
- map.put("HourForecastWaterWithdrawals", null);
- map.put("HourForecastActualWaterSupply", null);
- map.put("WaterWithdrawalsEnergy", null);
- map.put("WaterSupplyEnergy", null);
- map.put("RealWaterWithdrawalsEnergy", null);
- map.put("RealWaterSupplyEnergy", null);
- map.put("LastModifyTime", null);
- map.put("HourActualWaterWithdrawals", null);
- map.put("HourActualWaterSupply ", null);
- list.add(map);
- responseRes.setResdata(list);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- if ("water_volume_prediction".equals(databaseName)){
- //TODO 自来水分了二级泵房,要做查询数据处理,点击水厂查询条件时,查询其下的泵房数据 再相加,
- //TODO 点击泵房则就查泵房的数据 ,无需做处理
- List<String> childList = new ArrayList<>();//要查询的组织机构名称集合
- List<String> childIdList = new ArrayList<>();//要查询的组织机构id集合
- if (level==1){
- //TODO 一级已经没有数据了(水厂), 查询一级的话则是将其下的供水数据相加
- //TODO 查询二级,及其二级带的三级
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()){
- String zoneName = zoneNameOpt.get().toString();
- Map<String, List<String>> childMap = result.get(zoneName);//二级
- Collection<List<String>> child2Map = childMap.values();//三级
- // 添加二级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap.keySet());
- // 添加三级组织机构名称(child2Map 的所有 List<String>)
- for (List<String> child2List : child2Map) {
- childList.addAll(child2List);
- }
- }
- }else if(level==2){
- //TODO 如果是二级,就查询其自身,看看其下还有没有集合,有的话就查其下的所有集合,没有的话就查其自身
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()) {
- String zoneName = zoneNameOpt.get().toString();
- List<String> childMap = new ArrayList<>();//三级
- // 遍历第一级 Map
- for (Map.Entry<String, Map<String, List<String>>> entry : result.entrySet()) {
- Map<String, List<String>> nestedMap = entry.getValue();
- // 检查第二级键
- if (nestedMap.containsKey(zoneName)) {
- childMap = nestedMap.get(zoneName);
- }
- }
- if(childMap.size()>0) {
- // 添三级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap);
- }else{
- childList.add(zoneName);
- }
- }
- }else if(level==3){
- //TODO 如果是三级,就查询其自身
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()) {
- String zoneName = zoneNameOpt.get().toString();
- childList.add(zoneName);
- }
- }else if(level==-1){
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- Map<String,Object> objectMap = orgConfig.stream()
- .filter(mapX -> Objects.equals(jpTbMHourWater.getOrgId(), mapX.get("org_id")))
- .findFirst().orElse(null);
- if(objectMap!=null) {
- childList.add(objectMap.get("org_name").toString());
- childIdList.add(objectMap.get("org_id").toString());
- }
- }
- //TODO 开始查询
- // 结果集合,存储 childList 对应的组织机构 ID
- // 遍历 childList,从 workZonIds 中获取对应的 ID
- for (String orgName : childList) {
- String orgId = workZonIds.get(orgName);
- if (orgId != null) { // 避免空值
- childIdList.add(orgId);
- }
- }
- List<Map<String,Object>> newResList = new ArrayList<>();
- int index = 0;
- for (String orgId:childIdList){
- jpTbMHourWater.setOrgId(orgId);
- jpTbMHourWater.checkValid();
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwaterNew(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr()+ " ORDER BY \"Date\",\"Hour\" ASC ");
- if(!CollectionUtils.isEmpty(newResList)&&!CollectionUtils.isEmpty(resList)){
- //TODO 说明要查询的分区不止一个,则&把原来有的数据与新查的数据相加,因为按Date排了序所以一致
- for (int i=0;i<newResList.size();i++){
- newResList.get(i).put("HourForecastWaterWithdrawals",
- parseDouble(newResList.get(i).get("HourForecastWaterWithdrawals")) +
- parseDouble(resList.get(i).get("HourForecastWaterWithdrawals")));
- newResList.get(i).put("HourForecastActualWaterSupply",
- parseDouble(newResList.get(i).get("HourForecastActualWaterSupply")) +
- parseDouble(resList.get(i).get("HourForecastActualWaterSupply")));
- newResList.get(i).put("WaterWithdrawalsEnergy",
- parseDouble(newResList.get(i).get("WaterWithdrawalsEnergy")) +
- parseDouble(resList.get(i).get("WaterWithdrawalsEnergy")));
- newResList.get(i).put("WaterSupplyEnergy",
- parseDouble(newResList.get(i).get("WaterSupplyEnergy")) +
- parseDouble(resList.get(i).get("WaterSupplyEnergy")));
- newResList.get(i).put("RealWaterWithdrawalsEnergy",
- parseDouble(newResList.get(i).get("RealWaterWithdrawalsEnergy")) +
- parseDouble(resList.get(i).get("RealWaterWithdrawalsEnergy")));
- newResList.get(i).put("RealWaterSupplyEnergy",
- parseDouble(newResList.get(i).get("RealWaterSupplyEnergy")) +
- parseDouble(resList.get(i).get("RealWaterSupplyEnergy")));
- newResList.get(i).put("HourActualWaterWithdrawals",
- parseDouble(newResList.get(i).get("HourActualWaterWithdrawals")) +
- parseDouble(resList.get(i).get("HourActualWaterWithdrawals")));
- newResList.get(i).put("HourActualWaterSupply",
- parseDouble(newResList.get(i).get("HourActualWaterSupply")) +
- parseDouble(resList.get(i).get("HourActualWaterSupply")));
- }
- }else {
- newResList.addAll(resList);
- }
- index++;
- }
- if (!CollectionUtils.isEmpty(newResList)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(newResList);
- }
- }else {
- //
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwater(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr());
- if (!CollectionUtils.isEmpty(resList)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(resList);
- }
- }
- return responseRes;
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- //TODO 小时水量预测接口
- /**
- * 传入水厂id及日期,返回指定日期内的小时取水量预测数据和实际小时取水量数据
- */
- public static ResponseRes selectTbHourWaterList(JPTbMHourWater jpTbMHourWater,Integer level,Map<String, Map<String, List<String>>> result
- ,Map<String,String> workZonIds){
- ResponseRes responseRes = new ResponseRes();
- List<Map<String, Object>> list = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- map.put("ID", null);
- map.put("Date", null);
- map.put("Hour", null);
- map.put("HourForecastWaterWithdrawals", null);
- map.put("HourForecastActualWaterSupply", null);
- map.put("WaterWithdrawalsEnergy", null);
- map.put("WaterSupplyEnergy", null);
- map.put("RealWaterWithdrawalsEnergy", null);
- map.put("RealWaterSupplyEnergy", null);
- map.put("LastModifyTime", null);
- map.put("HourActualWaterWithdrawals", null);
- map.put("HourActualWaterSupply ", null);
- list.add(map);
- responseRes.setResdata(list);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- if ("water_volume_prediction".equals(databaseName)){
- //TODO 自来水分了二级泵房,要做查询数据处理,点击水厂查询条件时,查询其下的泵房数据 再相加,
- //TODO 点击泵房则就查泵房的数据 ,无需做处理
- List<String> childList = new ArrayList<>();//要查询的组织机构名称集合
- List<String> childIdList = new ArrayList<>();//要查询的组织机构id集合
- if (level==1){
- //TODO 一级已经没有数据了(水厂), 查询一级的话则是将其下的供水数据相加
- //TODO 查询二级,及其二级带的三级
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()){
- String zoneName = zoneNameOpt.get().toString();
- Map<String, List<String>> childMap = result.get(zoneName);//二级
- Collection<List<String>> child2Map = childMap.values();//三级
- // 添加二级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap.keySet());
- // 添加三级组织机构名称(child2Map 的所有 List<String>)
- for (List<String> child2List : child2Map) {
- childList.addAll(child2List);
- }
- }
- }else if(level==2){
- //TODO 如果是二级,就查询其自身,看看其下还有没有集合,有的话就查其下的所有集合,没有的话就查其自身
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()) {
- String zoneName = zoneNameOpt.get().toString();
- List<String> childMap = new ArrayList<>();//三级
- // 遍历第一级 Map
- for (Map.Entry<String, Map<String, List<String>>> entry : result.entrySet()) {
- Map<String, List<String>> nestedMap = entry.getValue();
- // 检查第二级键
- if (nestedMap.containsKey(zoneName)) {
- childMap = nestedMap.get(zoneName);
- }
- }
- if(childMap.size()>0) {
- // 添三级组织机构名称(childMap 的 keySet)
- childList.addAll(childMap);
- }else{
- childList.add(zoneName);
- }
- }
- }else if(level==3){
- //TODO 如果是三级,就查询其自身
- Optional zoneNameOpt = findOrgNameByOrgId(workZonIds,jpTbMHourWater.getOrgId());
- if(zoneNameOpt.isPresent()) {
- String zoneName = zoneNameOpt.get().toString();
- childList.add(zoneName);
- }
- }else if(level==-1){
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- Map<String,Object> objectMap = orgConfig.stream()
- .filter(mapX -> Objects.equals(jpTbMHourWater.getOrgId(), mapX.get("org_id")))
- .findFirst().orElse(null);
- if(objectMap!=null) {
- childList.add(objectMap.get("org_name").toString());
- childIdList.add(objectMap.get("org_id").toString());
- }
- }
- //TODO 开始查询
- // 结果集合,存储 childList 对应的组织机构 ID
- // 遍历 childList,从 workZonIds 中获取对应的 ID
- for (String orgName : childList) {
- String orgId = workZonIds.get(orgName);
- if (orgId != null) { // 避免空值
- childIdList.add(orgId);
- }
- }
- List<Map<String,Object>> newResList = new ArrayList<>();
- int index = 0;
- for (String orgId:childIdList){
- jpTbMHourWater.setOrgId(orgId);
- jpTbMHourWater.checkValid();
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwater(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr()+ " ORDER BY \"Date\",\"Hour\" ASC ");
- if(!CollectionUtils.isEmpty(newResList)&&!CollectionUtils.isEmpty(resList)){
- //TODO 说明要查询的分区不止一个,则&把原来有的数据与新查的数据相加,因为按Date排了序所以一致
- for (int i=0;i<newResList.size();i++){
- newResList.get(i).put("HourForecastWaterWithdrawals",
- parseDouble(newResList.get(i).get("HourForecastWaterWithdrawals")) +
- parseDouble(resList.get(i).get("HourForecastWaterWithdrawals")));
- newResList.get(i).put("HourForecastActualWaterSupply",
- parseDouble(newResList.get(i).get("HourForecastActualWaterSupply")) +
- parseDouble(resList.get(i).get("HourForecastActualWaterSupply")));
- newResList.get(i).put("WaterWithdrawalsEnergy",
- parseDouble(newResList.get(i).get("WaterWithdrawalsEnergy")) +
- parseDouble(resList.get(i).get("WaterWithdrawalsEnergy")));
- newResList.get(i).put("WaterSupplyEnergy",
- parseDouble(newResList.get(i).get("WaterSupplyEnergy")) +
- parseDouble(resList.get(i).get("WaterSupplyEnergy")));
- newResList.get(i).put("RealWaterWithdrawalsEnergy",
- parseDouble(newResList.get(i).get("RealWaterWithdrawalsEnergy")) +
- parseDouble(resList.get(i).get("RealWaterWithdrawalsEnergy")));
- newResList.get(i).put("RealWaterSupplyEnergy",
- parseDouble(newResList.get(i).get("RealWaterSupplyEnergy")) +
- parseDouble(resList.get(i).get("RealWaterSupplyEnergy")));
- newResList.get(i).put("HourActualWaterWithdrawals",
- parseDouble(newResList.get(i).get("HourActualWaterWithdrawals")) +
- parseDouble(resList.get(i).get("HourActualWaterWithdrawals")));
- newResList.get(i).put("HourActualWaterSupply",
- parseDouble(newResList.get(i).get("HourActualWaterSupply")) +
- parseDouble(resList.get(i).get("HourActualWaterSupply")));
- }
- }else {
- newResList.addAll(resList);
- }
- index++;
- }
- if (!CollectionUtils.isEmpty(newResList)) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_INTERNAL.toStrValue(), mStrClassName, ""
- , "7777");
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(newResList);
- }
- }else {
- //
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwater(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr());
- if (!CollectionUtils.isEmpty(resList)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(resList);
- }
- }
- return responseRes;
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- //TODO 小时取水泵房电耗预测接口
- /**
- * 传入水厂id及日期
- */
- public static ResponseRes selectTbMHourwaterWaterwithdrawals(JPTbMHourWater jpTbMHourWater,String subType){
- ResponseRes responseRes = new ResponseRes();
- //TODO 默认值
- List<InPumpModel> defaultModels = new ArrayList<>();
- InPumpModel entity = new InPumpModel();
- entity.setOrgId(null);
- entity.setPumpId(null);
- entity.setSubType(subType);
- List<Map<String, Object>> defaultRes = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- map.put("ID", null);
- map.put("Date", null);
- map.put("Hour", null);
- map.put("PumpID", null);
- map.put("PumpStatus", null);
- map.put("HourForecastWaterWithdrawals", null);
- map.put("PumpWater", null);
- map.put("RealPumpStatus", null);
- map.put("PumpEnergy", null);
- map.put("RealPumpEnergy", null);
- map.put("LastModifyTime", null);
- map.put("orgId", null);
- defaultRes.add(map);
- defaultModels.add(entity);
- responseRes.setResdata(defaultModels);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwaterWaterwithdrawals(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr());
- //TODO 按水厂分组
- Map<Object, List<Map<String, Object>>> groupedData =
- resList.stream().collect(Collectors.groupingBy(item -> item.get("orgId")));
- //TODO 查询水厂的取水泵,然后将数据拼接
- List<InPumpModel> inPumpModels = new ArrayList<>();
- for (Object key:groupedData.keySet()) {
- InPumpModel model = new InPumpModel();
- List<Map<String,Object>> zoonList = getWaterTapWaterApi().getZoonInfoList(key.toString(),subType);
- if(!CollectionUtils.isEmpty(zoonList)){
- model.setPumpId(zoonList.get(0).get("uid").toString());
- }
- model.setOrgId(key.toString());
- model.setSubType(subType);
- List<Map<String, Object>> dataList = groupedData.get(key);
- //TODO 将年月日时作为分组条件
- Map<String, List<Map<String, Object>>> dataMap = dataList.stream()
- .collect(Collectors.groupingBy(emp ->
- emp.get("Date") + " " + emp.get("Hour") // 创建复合键
- ));
- model.setDataList(dataMap);
- //TODO 查询相应方案数据
- List<Map<String,Object>> drawalsList = getWaterTapWaterApi().getTbMWaterwithdrawalspump(false,
- 20,0," AND \"orgId\" = '"+key.toString()+"'");
- model.setDrawalsList(drawalsList);
- inPumpModels.add(model);
- }
- if(!CollectionUtils.isEmpty(inPumpModels)){
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(inPumpModels);
- }
- return responseRes;
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- //TODO 小时供水泵房电耗预测接口
- /**
- * 传入水厂id及日期
- */
- public static ResponseRes selectTbMHourwaterWatersupply(JPTbMHourPump jpTbMHourWater,String subType){
- ResponseRes responseRes = new ResponseRes();
- //TODO 默认值
- List<InPumpModel> defaultModels = new ArrayList<>();
- InPumpModel entity = new InPumpModel();
- entity.setOrgId(null);
- entity.setPumpId(null);
- entity.setSubType(subType);
- List<Map<String, Object>> defaultRes = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- map.put("ID", null);
- map.put("Date", null);
- map.put("Hour", null);
- map.put("PumpID", null);
- map.put("PumpStatus", null);
- map.put("HourForecastActualWaterSupply", null);
- map.put("PumpWater", null);
- map.put("RealPumpStatus", null);
- map.put("PumpEnergy", null);
- map.put("RealPumpEnergy", null);
- map.put("LastModifyTime", null);
- map.put("orgId", null);
- defaultRes.add(map);
- defaultModels.add(entity);
- responseRes.setResdata(defaultModels);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- //
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwaterWatersupply(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr());
- if("water_volume_prediction_jiangjin2".equals(databaseName)){
- //TODO 按水厂分组
- Map<Object, List<Map<String, Object>>> groupedData =
- resList.stream().collect(Collectors.groupingBy(item -> item.get("orgId")));
- //TODO 查询水厂的取水泵,然后将数据拼接
- List<InPumpModel> inPumpModels = new ArrayList<>();
- for (Object key : groupedData.keySet()) {
- InPumpModel model = new InPumpModel();
- List<Map<String, Object>> zoonList = getWaterTapWaterApi().getZoonInfoList(key.toString(), subType);
- if (!CollectionUtils.isEmpty(zoonList)) {
- model.setPumpId(zoonList.get(0).get("uid").toString());
- }
- model.setOrgId(key.toString());
- model.setSubType(subType);
- List<Map<String, Object>> dataList = groupedData.get(key);
- //TODO 将年月日时作为分组条件
- Map<String, List<Map<String, Object>>> dataMap = dataList.stream()
- .collect(Collectors.groupingBy(emp ->
- emp.get("Date") + " " + emp.get("Hour") // 创建复合键
- ));
- model.setDataList(dataMap);
- //TODO 查询相应方案数据
- List<Map<String, Object>> drawalsList = getWaterTapWaterApi().getTbMWatersupplypump(false,
- 20, 0, " AND \"orgId\" = '" + key.toString() + "'");
- model.setDrawalsList(drawalsList);
- inPumpModels.add(model);
- }
- if (!CollectionUtils.isEmpty(inPumpModels)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(inPumpModels);
- }
- return responseRes;
- }else {
- Map<Object, List<Map<String, Object>>> groupedData =
- resList.stream().collect(Collectors.groupingBy(item -> item.get("orgId")));
- //TODO 查询水厂的取水泵,然后将数据拼接
- List<InPumpModel> inPumpModels = new ArrayList<>();
- for (Object key : groupedData.keySet()) {
- InPumpModel model = new InPumpModel();
- List<Map<String, Object>> zoonList = getWaterTapWaterApi().getZoonInfoList(key.toString(), subType);
- if (!CollectionUtils.isEmpty(zoonList)) {
- model.setPumpId(zoonList.get(0).get("uid").toString());
- }
- model.setOrgId(key.toString());
- model.setSubType(subType);
- List<Map<String, Object>> dataList = groupedData.get(key);
- //TODO 将年月日时作为分组条件
- Map<String, List<Map<String, Object>>> dataMap = dataList.stream()
- .collect(Collectors.groupingBy(emp ->
- emp.get("Date") + " " + emp.get("Hour") // 创建复合键
- ));
- model.setDataList(dataMap);
- //TODO 查询相应方案数据
- List<Map<String, Object>> drawalsList = getWaterTapWaterApi().getTbMWatersupplypump(false,
- 20, 0, " AND \"orgId\" = '" + key.toString() + "'");
- model.setDrawalsList(drawalsList);
- inPumpModels.add(model);
- }
- if (!CollectionUtils.isEmpty(inPumpModels)) {
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(inPumpModels);
- }
- return responseRes;
- }
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测泵供水小时数据调用异常 ERROR:{%s} ",
- ex.getLocalizedMessage()));
- return responseRes;
- }
- }
- //TODO 定时任务 定时调用水力模型预测接口,截止今天
- public static void insertYuceDayData(String monthNow){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测日数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- String yearStr = "";
- String monthStr = "";
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
- int days = LocalDateTime.now().getDayOfMonth();//获取月份天数
- for (int i = 1;i<=days;i++) {
- LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
- if (dateNow.isAfter(LocalDateTime.now())) {
- break;
- }
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- //TODO A
- JP3TPDay tpDay = new JP3TPDay();
- tpDay.setOrgId("");
- tpDay.setSdate(dateStr);
- tpDay.setEndate(dateStr);
- try {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
- , mStrClassName
- , mStrClassName
- , String.format("执行预测日数据" + FastJsonUtil.toJSON(tpDay) + "调用"));
- ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- .applyCloud3tpServiceApi().dayDataPredictSupply(tpDay);
- if (ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测日数据" + dateStr + "调用失败 ERROR:{%s} ",
- tpRes.getResdata()));
- }
- } catch (Exception ex) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测日数据" + dateStr + "调用异常 ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测日数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 截止到未来的今天+3
- public static void insertYuceDayAddData(String monthNow){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测日数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- String yearStr = "";
- String monthStr = "";
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withHour(0).withMinute(0).withSecond(0).withNano(0);
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0," AND org_name != '井口水厂' AND org_name != '丰收坝水厂' AND org_name != '沙坪坝水厂' AND org_name != '北碚红工水厂' AND org_name != '大溪沟水厂' ");
- if("water_volume_prediction_jiangjin2".equals(databaseName)){
- orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- }
- LocalDateTime dateNow = startDate;
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- //TODO A
- for (Map<String,Object> config:orgConfig) {
- JP3TPDay tpDay = new JP3TPDay();
- tpDay.setOrgId(config.get("org_id").toString());
- tpDay.setSdate(dateStr);
- // tpDay.setEndate(dateNow.minusDays(-3).toLocalDate().format(formatter2));
- //TODO 预测模型的逻辑是预测当前天往后+3天
- tpDay.setEndate(dateNow.minusDays(0).toLocalDate().format(formatter2));
- try {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
- , mStrClassName
- , mStrClassName
- , String.format("执行预测未来日数据" + FastJsonUtil.toJSON(tpDay) + "调用"));
- ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- .applyCloud3tpServiceApi().dayDataPredictSupply(tpDay);
- if (ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测日数据" + dateStr + "调用失败 ERROR:{%s} ",
- tpRes.getResdata()));
- }
- } catch (Exception ex) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测日数据" + dateStr + "调用异常 ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测日数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 定时任务 定时调用水力模型小时预测接口,截止今天
- public static void insertYuceHourData(String monthNow){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测小时数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- //先获取配置项 根据配置项来进行逻辑添加
- String yearStr = "";
- String monthStr ="";
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
- //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
- int days = LocalDateTime.now().getDayOfMonth();//获取月份天数
- for (int i = 1;i<=days;i++){
- LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
- if(dateNow.toLocalDate().isAfter(LocalDateTime.now().toLocalDate())){
- break;
- }
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- //TODO A
- JP3TPHour tpHour = new JP3TPHour();
- tpHour.setOrgId("");
- tpHour.setDate(dateStr);
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
- , mStrClassName
- , mStrClassName
- , String.format("执行预测小时数据" + FastJsonUtil.toJSON(tpHour) + "调用"));
- try {
- ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- .applyCloud3tpServiceApi().dayHourPredictSupply(tpHour);
- if(ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测小时数据"+dateStr+"调用失败 ERROR:{%s} ",
- tpRes.getResdata()));
- }
- }catch(Exception ex){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测小时数据"+dateStr+"调用异常 ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"调用预测模型小时数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 截止到未来的今天+3
- public static void insertYuceHourAddData(String monthNow,Integer days){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测小时数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- //先获取配置项 根据配置项来进行逻辑添加
- String yearStr = "";
- String monthStr ="";
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withHour(0).withMinute(0).withSecond(0).withNano(0);
- //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0," AND org_name != '井口水厂' AND org_name != '丰收坝水厂' AND org_name != '沙坪坝水厂' AND org_name != '北碚红工水厂' AND org_name != '大溪沟水厂' ");
- if("water_volume_prediction_jiangjin2".equals(databaseName)){
- orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- }
- for (int i = 0;i<days;i++){
- LocalDateTime dateNow = startDate.minusDays(-i);//当前循环时间
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- //TODO A
- for (Map<String,Object> org : orgConfig) {
- JP3TPHour tpHour = new JP3TPHour();
- tpHour.setOrgId(org.get("org_id").toString());
- tpHour.setDate(dateStr);
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
- , mStrClassName
- , mStrClassName
- , String.format("执行未来预测小时数据" + FastJsonUtil.toJSON(tpHour) + "调用"));
- try {
- ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- .applyCloud3tpServiceApi().dayHourPredictSupply(tpHour);
- if (ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测小时数据" + dateStr + "调用失败 ERROR:{%s} ",
- tpRes.getResdata()));
- }
- } catch (Exception ex) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测小时数据" + dateStr + "调用异常 ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"调用预测模型小时数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 跑+1天
- public static void insertYucePump(String monthNow){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测泵组优化小时数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- //先获取配置项 根据配置项来进行逻辑添加
- String yearStr = "";
- String monthStr ="";
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withHour(0).withMinute(0).withSecond(0).withNano(0);
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0," AND org_name != '井口水厂' AND org_name != '丰收坝水厂' AND org_name != '沙坪坝水厂' AND org_name != '北碚红工水厂' AND org_name != '大溪沟水厂' ");
- if("water_volume_prediction_jiangjin2".equals(databaseName)) {
- orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0,"");
- }
- //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
- for (int i = 0;i<2;i++){
- LocalDateTime dateNow = startDate.minusDays(-i);//当前循环时间
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- //TODO A
- for (Map<String,Object> org : orgConfig) {
- JP3TPHour tpHour = new JP3TPHour();
- tpHour.setOrgId(org.get("org_id").toString());
- tpHour.setDate(dateStr);
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
- , mStrClassName
- , mStrClassName
- , String.format("执行未来预测泵组优化小时数据" + FastJsonUtil.toJSON(tpHour) + "调用"));
- try {
- ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- .applyCloud3tpServiceApi().dayHourPump(tpHour);
- if (ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测泵小时数据" + dateStr + "调用失败 ERROR:{%s} ",
- tpRes.getResdata()));
- }
- } catch (Exception ex) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("预测泵小时数据" + dateStr + "调用异常 ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"调用预测模型泵组优化小时数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 跑泵组数据插入预测实际值
- public static void insertYucePumpReal(String monthNow,int monthDay){
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加实际值");
- try {
- //先获取配置项 根据配置项来进行逻辑添加
- String yearStr = "";
- String monthStr = "";
- if (!StringUtils.isEmpty(monthNow)) {
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(monthDay).withHour(0).withMinute(0).withSecond(0).withNano(0);
- LocalDateTime endDate = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
- //TODO 查询开始时间开始的原始数据
- List<Map<String,Object>> recordAllRes = getWaterTapApi()
- .getPumpCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND \"time\"::timestamp BETWEEN '"+startDate.format(formatter)+"' "+"AND '"+endDate.format(formatter)+"'");
- for (Map<String,Object> recordAll:recordAllRes){
- //TODO 查询对应Day和hour对应的预测数据是否存在, 存在的话就修改实际值状态
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbMHourwaterWatersupply(true,
- 1, 0, "AND \"PumpID\" = '"+recordAll.get("device_code")+"' AND \"Date\" = '"+LocalDateTime.parse(recordAll.get("time").toString(), formatter).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
- +"' AND \"Hour\" = '"+LocalDateTime.parse(recordAll.get("time").toString(), formatter).format(DateTimeFormatter.ofPattern("HH:mm:ss"))+"'");
- if(!CollectionUtils.isEmpty(resList)){
- //TODO 说明存在,则修改
- Map<String,Object> oldMap = resList.get(0);
- if(!ObjectUtils.isEmpty(recordAll.get("startup_state"))){
- oldMap.put("RealPumpStatus",recordAll.get("startup_state"));
- }else if (!ObjectUtils.isEmpty(recordAll.get("active_energy"))){
- oldMap.put("RealPumpStatus",1);
- }else{
- oldMap.put("RealPumpStatus",0);
- }
- oldMap.remove("ID");
- int res = getWaterTapApi().insertOrUpdateTbmHourwaterWatersupply(oldMap);
- if(res<0){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- ,"修改泵实际状态数据失败");
- }
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"泵数据实际值修改完成");
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 定时任务 定时添加预测数据 废弃
- public static void insertYuceDataScheduled(String monthNow){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测日数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- //先获取配置项 根据配置项来进行逻辑添加
- List<Map<String, Object>> configRes = getWaterTapWaterApi().getWaterYuceConfig(false, 0, 0, "");
- if(!CollectionUtils.isEmpty(configRes)){
- Map<String,Object> config = configRes.get(0);
- Integer isMonth = Integer.valueOf(config.get("is_month").toString());//是否预测指定月份 0 是 1否(判定是否走自添加逻辑)
- String month = config.get("month").toString();//指定预测年月 yyyy-mm
- Double randomCode = Double.valueOf(config.get("random_code").toString());//上下随机石百分比范围
- if(isMonth==0){
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- String yearStr = month.split("-")[0];
- String monthStr = month.split("-")[1];
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
- LocalDateTime endDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
- //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
- List<Map<String, Object>> configList = getWaterTapApi().getWaterCollectionConfigList(null);
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- if (!CollectionUtils.isEmpty(configList)&&!CollectionUtils.isEmpty(orgConfig)) {
- //TODO 按照组织机构分组
- Map<Object, List<Map<String, Object>>> groupedData =
- configList.stream().collect(Collectors.groupingBy(item -> item.get("org_name")));
- final CountDownLatch latch = new CountDownLatch(groupedData.keySet().size());
- for (Object key:groupedData.keySet()){
- try {
- ThreadTaskMgr.runTask(new TraceRunnable(TraceLogMgr.getTraceId()) {
- @Override
- public void function() {
- //TODO ①计算水厂指定月每日平均值
- List<Map<String,Object>> recordAllRes = getWaterTapApi()
- .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND org_name = '"+key.toString()+"'" +
- " AND \"time\"::timestamp BETWEEN '"+startDate.format(formatter)+"' "+"AND '"+endDate.format(formatter)+"'");
- if(!CollectionUtils.isEmpty(recordAllRes)){
- int days = YearMonth.from(startDate).lengthOfMonth();//获取月份天数
- Double numAge = 0.0;//日平均值
- Double numMonthAll = null;//月总值
- for (int i = 1;i<=days;i++){
- LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
- Double numAll = null;//日总值
- //TODO 筛选成当前循环时间的集合
- List<Map<String,Object>> daysRecord = recordAllRes.stream().filter(item ->
- LocalDateTime.parse(item.get("time").toString(),formatter).toLocalDate().equals(dateNow.toLocalDate()))
- .collect(Collectors.toList());
- for (Map<String,Object> mapEntity : daysRecord){
- //TODO 筛选与当前天一样的数据在计算平均值,数据相加除以24小时 (recordAllRes内容为这天每小时的数据)
- if(numAll == null){
- numAll = 0.0;
- }
- numAll += Double.valueOf(mapEntity.get("value").toString());
- }
- if(numMonthAll==null){
- numMonthAll = 0.0;
- }
- numMonthAll+= numAll==null?0.0:numAll;
- }
- if(numMonthAll!=null){
- numAge = numMonthAll/days;
- }
- //TODO ②正式插入或修改日预测数据表
- Optional<String> orgIdOptional = orgConfig.stream()
- .filter(item -> key.toString().replace("(", "(").replace(")", ")")
- .equals(item.get("org_name").toString().replace("(", "(").replace(")", ")")))
- .map(item -> item.get("org_id").toString())
- .findFirst();
- String orgId = orgIdOptional.orElse(null);
- if (!StringUtils.isEmpty(orgId)) {
- //预测比对时间如果不是今年,则变为今年的时间
- for (int i = 1;i<=days;i++) {
- LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
- if(dateNow.isAfter(LocalDateTime.now())){
- break;
- }
- Double numAll = null;//日总值
- //TODO 筛选成当前循环时间的集合
- List<Map<String,Object>> daysRecord = recordAllRes.stream().filter(item ->
- LocalDateTime.parse(item.get("time").toString(),formatter).toLocalDate().equals(dateNow.toLocalDate()))
- .collect(Collectors.toList());
- for (Map<String,Object> mapEntity : daysRecord){
- //TODO 筛选与当前天一样的数据在计算平均值,数据相加除以24小时 (recordAllRes内容为这天每小时的数据)
- if(numAll == null){
- numAll = 0.0;
- }
- numAll += Double.valueOf(mapEntity.get("value").toString());
- }
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- // //TODO A
- // JP3TPDay tpDay = new JP3TPDay();
- // tpDay.setOrgId(orgId);
- // tpDay.setSdate(dateStr);
- // tpDay.setEndate(dateStr);
- // try {
- // ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- // .applyCloud3tpServiceApi().dayDataPredictSupply(tpDay);
- // if(ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())){
- // LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- // , mStrClassName
- // , mStrClassName
- // , String.format("预测日数据"+dateStr+"调用失败 ERROR:{%s} ",
- // tpRes.getResdata()));
- // break;
- // }
- // }catch(Exception ex){
- // LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- // , mStrClassName
- // , mStrClassName
- // , String.format("预测日数据"+dateStr+"调用异常 ERROR:{%s} ",
- // ex.getLocalizedMessage()));
- // }
- //TODO B
- Map<String, Object> recordAllEntity = new LinkedHashMap<>();//需要添加的实体数据,此处要用有序map
- recordAllEntity.put("Date", dateStr);
- recordAllEntity.put("Month", dateNow.withYear(LocalDateTime.now().getYear()).getMonth().getValue());
- recordAllEntity.put("Week", dateNow.withYear(LocalDateTime.now().getYear()).getDayOfWeek().getValue());
- // recordAllEntity.put("ActualWaterWithdrawals", "");
- //实际从该时间查询结果中得出(当前年当前日的实际数据)
- String newStartDate = dateNow.withYear(LocalDateTime.now().getYear()).format(formatter);
- String newEndDate = dateNow.withYear(LocalDateTime.now().getYear()).minusDays(-1).minusSeconds(1).format(formatter);
- List<Map<String,Object>> newRecordAllRes = getWaterTapApi()
- .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND org_name = '"+key.toString()+"'" +
- " AND \"time\"::timestamp BETWEEN '"+newStartDate
- +"' "+"AND '"+newEndDate+"'");
- String actualWaterSupply = null;
- if(!CollectionUtils.isEmpty(newRecordAllRes)){
- actualWaterSupply = String.valueOf(newRecordAllRes.stream()
- .mapToDouble(record -> {
- Object value = record.get("value");
- if (value instanceof Number) {
- return ((Number) value).doubleValue();
- } else if (value instanceof String) {
- try {
- return Double.parseDouble((String) value);
- } catch (NumberFormatException e) {
- // 处理或记录错误,这里简单返回0
- return 0;
- }
- }
- return 0;
- })
- .sum());
- }
- recordAllEntity.put("ActualWaterSupply", actualWaterSupply);
- // recordAllEntity.put("ForecastWaterWithdrawals", "");
- //TODO 随机数逻辑
- int randomUpOrDown = ThreadLocalRandom.current().nextInt(2);//随机向上或者向下 0表示向下 1表示向上
- Double randomWater = randomUpOrDown == 0 ?
- numAge - (numAge * (randomCode / 100)) :
- numAge + (numAge * (randomCode / 100));
- // recordAllEntity.put("ForecastActualWaterSupply", randomWater);
- recordAllEntity.put("isAbnormal", 0);
- recordAllEntity.put("isForecast", 1);
- recordAllEntity.put("LastModifyTime", LocalDateTime.now().format(formatter));
- // 如果找到了org_id,就将其赋值给orgId,否则orgId为null
- recordAllEntity.put("orgId", orgId);
- //TODO 添加or修改
- Integer insertRes = getWaterTapApi().insertOrUpdateTbmWater(recordAllEntity);
- if (insertRes < 1) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
- "新增或修改失败"));
- }
- }
- }
- }
- latch.countDown();
- }
- });
- }catch(Exception ex){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- try{latch.await();}catch(Exception ex){}
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测日数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }else{
- }
- }
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //TODO 定时任务 定时添加小时预测数据 转变为之做假泵数据
- public static void insertYuceHourDataScheduled(String monthNow){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测小时数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- try {
- //先获取配置项 根据配置项来进行逻辑添加
- List<Map<String, Object>> configRes = getWaterTapWaterApi().getWaterYuceConfig(false, 0, 0, "");
- if(!CollectionUtils.isEmpty(configRes)){
- Map<String,Object> config = configRes.get(0);
- Integer isMonth = Integer.valueOf(config.get("is_month").toString());//是否预测指定月份 0 是 1否(判定是否走自添加逻辑)
- String month = config.get("month").toString();//指定预测年月 yyyy-mm
- Double randomCode = Double.valueOf(config.get("random_code").toString());//上下随机石百分比范围
- if(isMonth==0){
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- String yearStr = month.split("-")[0];
- String monthStr = month.split("-")[1];
- if(!StringUtils.isEmpty(monthNow)){
- yearStr = monthNow.split("-")[0];
- monthStr = monthNow.split("-")[1];
- }
- LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
- .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
- LocalDateTime endDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
- //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
- List<Map<String, Object>> configList = getWaterTapApi().getWaterCollectionConfigList(null);
- List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
- if (!CollectionUtils.isEmpty(configList)&&!CollectionUtils.isEmpty(orgConfig)) {
- //TODO 按照组织机构分组
- Map<Object, List<Map<String, Object>>> groupedData =
- configList.stream().collect(Collectors.groupingBy(item -> item.get("org_name")));
- final CountDownLatch latch = new CountDownLatch(groupedData.keySet().size());
- for (Object key:groupedData.keySet()){
- try {
- ThreadTaskMgr.runTask(new TraceRunnable(TraceLogMgr.getTraceId()) {
- @Override
- public void function() {
- //TODO ①计算水厂指定月每日小时平均值
- List<Map<String,Object>> recordAllRes = getWaterTapApi()
- .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND org_name = '"+key.toString()+"'" +
- " AND \"time\"::timestamp BETWEEN '"+startDate.format(formatter)+"' "+"AND '"+endDate.format(formatter)+"'");
- if(!CollectionUtils.isEmpty(recordAllRes)){
- int days = YearMonth.from(startDate).lengthOfMonth();//获取月份天数
- for (int i = 1;i<=days;i++){
- LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
- if(dateNow.isAfter(LocalDateTime.now().minusDays(-4))){
- break;
- }
- Double numAll = null;//日总值
- Double numAge = 0.0;//日小时平均值
- //TODO 筛选成当前循环时间的集合
- List<Map<String,Object>> daysRecord = recordAllRes.stream().filter(item ->
- LocalDateTime.parse(item.get("time").toString(),formatter).toLocalDate().equals(dateNow.toLocalDate()))
- .collect(Collectors.toList());
- for (Map<String,Object> mapEntity : daysRecord){
- //TODO 筛选与当前天一样的数据在计算平均值,数据相加除以24小时 (recordAllRes内容为这天每小时的数据)
- if(numAll == null){
- numAll = 0.0;
- }
- numAll += Double.valueOf(mapEntity.get("value").toString());
- }
- if (numAll!=null){
- numAge = numAll/24;
- }
- //TODO ②正式插入或修改日预测数据表
- Optional<String> orgIdOptional = orgConfig.stream()
- .filter(item -> key.toString().replace("(", "(").replace(")", ")")
- .equals(item.get("org_name").toString().replace("(", "(").replace(")", ")")))
- .map(item -> item.get("org_id").toString())
- .findFirst();
- String orgId = orgIdOptional.orElse(null);
- if (!StringUtils.isEmpty(orgId)) {
- //预测比对时间如果不是今年,则变为今年的时间
- //TODO 取泵号
- JSONObject pumpItem = (JSONObject)pumpObj.get(orgId);
- JSONArray pumpArray = ((JSONObject)pumpItem.get("outRoom")).getJSONArray("pumps");
- //TODO 一天24小时
- for (int j = 0;j<24;j++) {
- //TODO 数据库操作 A 调用对应时间预测接口 B 在修改实际值
- DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("HH:mm:ss");
- String dateStr = dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2);
- // 创建一个LocalTime实例,设置为指定小时,分钟和秒数为0
- LocalTime time = LocalTime.of(j, 0, 0);
- // 创建一个DateTimeFormatter用于格式化时间
- String timeStr = time.format(formatter3);
- // //TODO A
- // JP3TPHour tpHour = new JP3TPHour();
- // tpHour.setOrgId(orgId);
- // tpHour.setDate(dateStr);
- // try {
- // ResponseRes<String> tpRes = ServiceMgrProxy.getInstance()
- // .applyCloud3tpServiceApi().dayHourPredictSupply(tpHour);
- // if(ResponseCode.RESULT_BAD.toStrCode().equals(tpRes.getRescode())){
- // LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- // , mStrClassName
- // , mStrClassName
- // , String.format("预测小时数据"+dateStr+"调用失败 ERROR:{%s} ",
- // tpRes.getResdata()));
- // break;
- // }
- // }catch(Exception ex){
- // LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- // , mStrClassName
- // , mStrClassName
- // , String.format("预测小时数据"+dateStr+"调用异常 ERROR:{%s} ",
- // ex.getLocalizedMessage()));
- // }
- //TODO B
- Map<String, Object> recordAllEntity = new LinkedHashMap<>();//需要添加的实体数据,此处要用有序map
- recordAllEntity.put("Date", dateStr);
- recordAllEntity.put("Hour", timeStr);
- // recordAllEntity.put("HourForecastWaterWithdrawals", null);
- //TODO 随机数逻辑
- int randomUpOrDown = ThreadLocalRandom.current().nextInt(2);//随机向上或者向下 0表示向下 1表示向上
- Double randomWater = randomUpOrDown == 0 ?
- numAge - (numAge * (randomCode / 100)) :
- numAge + (numAge * (randomCode / 100));
- // recordAllEntity.put("HourForecastActualWaterSupply", randomWater);
- // recordAllEntity.put("HourActualWaterWithdrawals", "");
- //实际从该时间查询结果中得出
- List<Map<String,Object>> newRecordAllRes = getWaterTapApi()
- .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
- " AND org_name = '"+key.toString()+"'" +
- " AND \"time\" = '"+dateNow.withYear(LocalDateTime.now().getYear()).withHour(j).format(formatter)+"' ");
- String hourActualWaterSupply = null;
- if(!CollectionUtils.isEmpty(newRecordAllRes)){
- hourActualWaterSupply = newRecordAllRes.get(0).get("value").toString();
- }
- recordAllEntity.put("HourActualWaterSupply",hourActualWaterSupply);
- recordAllEntity.put("LastModifyTime", LocalDateTime.now().format(formatter));
- // 如果找到了org_id,就将其赋值给orgId,否则orgId为null
- recordAllEntity.put("orgId", orgId);
- // //TODO 添加or修改
- // Integer insertRes = getWaterTapApi().insertOrUpdateTbmHourWater(recordAllEntity);
- // if (insertRes < 1) {
- // LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- // , mStrClassName
- // , mStrClassName
- // , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
- // "新增或修改失败"));
- // }
- //TODO ③ 泵集合数据添加或修改
- // 生成[1, pumpArray.size()]范围内的随机数
- int randomNum = (int) (Math.random() * (pumpArray.size() - 1)) + 1;
- List<Double> splitRandom = splitValueRandomlyWithZeros(Double.valueOf((hourActualWaterSupply==null
- ?"0.0":hourActualWaterSupply)),pumpArray.size(),randomNum);//实际值随机数集合
- List<Double> splitRandomYuce = splitValueRandomlyWithZeros((randomWater==null
- ?0.0:randomWater),pumpArray.size(),randomNum);//预测值随机数集合
- //泵集合
- int kIndex = 0;
- for (Object obj:pumpArray){
- JSONObject itemObj = (JSONObject)obj;
- Map<String,Object> map = new LinkedHashMap<>();
- //TODO 泵状态根据值是否为0设置
- map.put("Date", dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate()
- .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- // 创建一个LocalTime实例,设置为指定小时,分钟和秒数为0
- // 创建一个DateTimeFormatter用于格式化时间
- map.put("Hour", time.format(formatter3));
- map.put("PumpID",itemObj.get("label"));
- // 设置1的概率为0.7,0的概率为0.3
- ProbabilityAlgorithm algorithm = new ProbabilityAlgorithm(0.7);
- // if(splitRandom.get(kIndex)==0){
- // //TODO 说明泵实际值为0,状态为关
- // map.put("PumpStatus",0);
- // }else{
- // map.put("PumpStatus",1);
- // }
- // map.put("PumpStatus",algorithm.getNextValue());
- // map.put("HourForecastActualWaterSupply",splitRandomYuce.get(kIndex));//预测泵的供水量/
- // map.put("PumpWater",splitRandom.get(kIndex));//实际泵的供水量
- // if(splitRandom.get(kIndex)==0){
- // //TODO 说明泵实际值为0,状态为关
- // map.put("RealPumpStatus",0);
- // }else{
- // map.put("RealPumpStatus",1);
- // }
- // map.put("RealPumpStatus",algorithm.getNextValue());
- map.put("PumpEnergy",splitRandomYuce.get(kIndex)/1000*180);
- map.put("RealPumpEnergy",splitRandom.get(kIndex)/1000*200);
- // map.put("LastModifyTime", LocalDateTime.now().format(formatter));
- map.put("orgId", orgId);
- //TODO 添加or修改 暂时注释
- Integer insertRes2 = getWaterTapApi().insertOrUpdateTbmHourwaterWatersupply(map);
- if (insertRes2 < 1) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("Batch insertOrUpdateTbmHourwaterWatersupply ERROR:{%s} ",
- "新增或修改失败"));
- }
- kIndex++;
- }
- }
- }
- }
- }
- latch.countDown();
- }
- });
- }catch(Exception ex){
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
- , mStrClassName
- , mStrClassName
- , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
- ex.getLocalizedMessage()));
- }
- }
- try{latch.await();}catch(Exception ex){}
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"添加预测小时数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
- }else{
- }
- }
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- //生成指定份额的随机数,并且带有0值
- public static List<Double> splitValueRandomlyWithZeros(double totalValue, int parts, int zeroCount) {
- if (zeroCount >= parts) {
- throw new IllegalArgumentException("Zero count must be less than the number of parts.");
- }
- Random random = new Random();
- List<Double> points = new ArrayList<>();
- int nonZeroParts = parts - zeroCount;
- // 添加初始点
- points.add(0.0);
- // 生成分割点
- for (int i = 0; i < nonZeroParts - 1; i++) {
- points.add(random.nextDouble() * totalValue);
- }
- // 添加终点
- points.add(totalValue);
- // 排序
- Collections.sort(points);
- // 计算每份的大小
- List<Double> splits = new ArrayList<>();
- for (int i = 1; i < points.size(); i++) {
- splits.add(points.get(i) - points.get(i - 1));
- }
- // 添加0值份额
- for (int i = 0; i < zeroCount; i++) {
- splits.add(0.0);
- }
- // 打乱列表,以确保0值分布均匀
- Collections.shuffle(splits);
- return splits;
- }
- /**
- * TODO 水位预测相关
- */
- //TODO 小时取水量预测接口
- /**
- * 传入水厂id及日期,返回指定日期内的小时取水量预测数据和实际小时取水量数据
- */
- public static ResponseRes selectTbHourLevelList(JPTbLevelHourWater jpTbMHourWater){
- ResponseRes responseRes = new ResponseRes();
- List<Map<String, Object>> list = new ArrayList<>();
- Map<String, Object> map = new HashMap<>();
- map.put("id",null);
- map.put("date",null);
- map.put("hour",null);
- map.put("hour_forecast_actual_level",null);
- map.put("hour_actual_water_level",null);
- map.put("last_modify_time",null);
- map.put("device_code",null);
- map.put("site_id",null);
- map.put("zone_id",null);
- list.add(map);
- responseRes.setResdata(list);
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- try {
- //
- List<Map<String, Object>> resList = getWaterTapWaterApi().getTbLevelHourwater(jpTbMHourWater.getIsPage(),
- jpTbMHourWater.getLimit(), jpTbMHourWater.getOffset(), jpTbMHourWater.getForDateStr());
- if(!CollectionUtils.isEmpty(resList)){
- responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
- responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
- responseRes.setResdata(resList);
- }
- return responseRes;
- }catch(Exception ex){
- responseRes.setResdata(null);
- responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
- responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
- return responseRes;
- }
- }
- //TODO 重新计算原始小时数据的用电量
- //TODO 逻辑:有小时读数的 按小时读数去算, 没有的话就按额定功率*1h去作为用电量
- public static void initPumpPowerZero(){
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- //TODO 首先查询出所有的设备
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"计算原始小时数据的用电量....");
- List<Map<String, Object>> configList = getWaterTapApi().getWaterPumpCollectionConfigList("");
- List<Map<String, Object>> energyList = getWaterTapApi().getWatertPumpEnergy("");
- if (!CollectionUtils.isEmpty(configList) && !CollectionUtils.isEmpty(energyList)) {
- // 按照设备分组
- Map<Object, List<Map<String, Object>>> groupedData = configList.stream()
- .collect(Collectors.groupingBy(item -> item.get("device_code")));
- final CountDownLatch latch = new CountDownLatch(groupedData.keySet().size());
- ExecutorService executor = Executors.newFixedThreadPool(groupedData.keySet().size()); // 使用线程池
- for (Object config : groupedData.keySet()) {
- try {
- List<Map<String, Object>> recordAll = getWaterTapApi().getWaterPumpRecordAllListAll(
- "WHERE device_code ='" + config + "' " +
- " AND \"time\"::timestamp BETWEEN '" + LocalDateTime.now().minusDays(2).withHour(0).withMinute(0).withSecond(0).withNano(0).format(formatter) + "' " + "AND '" + LocalDateTime.now().format(formatter) + "'" +
- " ORDER BY time ASC ");
- if (CollectionUtils.isEmpty(recordAll)) {
- continue; // 如果设备没有数据,跳过
- }
- // 遍历 recordAll 中的每条记录
- for (int i = 1; i < recordAll.size(); i++) {
- Map<String, Object> currentRecord = recordAll.get(i);
- Map<String, Object> previousRecord = recordAll.get(i - 1);
- Double currentEnergy = (Double) currentRecord.get("active_energy");
- Double previousEnergy = (Double) previousRecord.get("active_energy");
- double powerConsumption = 0.0;
- if (currentEnergy != null && previousEnergy != null) {
- // 情况1:累计电量读数都非空
- powerConsumption = currentEnergy - previousEnergy;
- } else {
- // 情况2:累计电量读数有一个为空
- String deviceCode = (String) currentRecord.get("device_code");
- Optional<Map<String, Object>> targetMap = energyList.stream()
- .filter(map -> deviceCode.equals(map.get("PumpID"))) // 过滤条件
- .findFirst();
- if (targetMap.isPresent()) {
- Map<String, Object> resultMap = targetMap.get();
- Object ratedPower = resultMap.get(deviceCode);
- if (ratedPower != null) {
- powerConsumption = Double.valueOf(ratedPower.toString()) * 1; // 用电量 = 额定功率 × 1
- } else {
- powerConsumption = 0.0; // 额定功率未找到,用电量为 0
- }
- } else {
- powerConsumption = 500 + (Math.random() - 0.5) * 200; // 额定功率未找到,用电量为 0
- }
- }
- // 更新当前记录的用电量字段
- currentRecord.put("power_cons", powerConsumption);
- int res = getWaterTapApi().insertOrUpdateWaterPumpRecordAll(currentRecord);
- if (res <= 0) {
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"修改小时用电量失败");
- }
- }
- } catch (Exception ex) {
- }
- }
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO,mStrClassName, mStrClassName,"修改小时用电量完成");
- }
- }
- }
|