FrontServiceImpl.java 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  1. package com.slibra.business.service.impl;
  2. import cn.hutool.http.HttpUtil;
  3. import com.alibaba.fastjson2.JSON;
  4. import com.alibaba.fastjson2.JSONObject;
  5. import com.slibra.business.domain.*;
  6. import com.slibra.business.mapper.*;
  7. import com.slibra.business.req.ChatReq;
  8. import com.slibra.business.req.WorkOrderReq;
  9. import com.slibra.business.res.*;
  10. import com.slibra.business.service.IFrontService;
  11. import com.slibra.common.DecimalUtils;
  12. import com.slibra.common.core.domain.TXinyiDaily;
  13. import com.slibra.common.core.redis.RedisCache;
  14. import com.slibra.common.enums.BusinessEnum;
  15. import com.slibra.common.exception.ServiceException;
  16. import com.slibra.common.utils.DateUtils;
  17. import com.slibra.common.utils.SecurityUtils;
  18. import com.slibra.common.utils.StringUtils;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.beans.BeanUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.data.redis.connection.stream.RecordId;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.util.CollectionUtils;
  26. import java.math.BigDecimal;
  27. import java.math.RoundingMode;
  28. import java.time.LocalDate;
  29. import java.time.LocalDateTime;
  30. import java.time.format.DateTimeFormatter;
  31. import java.util.*;
  32. import java.util.concurrent.TimeUnit;
  33. import static com.slibra.common.constant.MyConstants.*;
  34. import static com.slibra.common.enums.BusinessEnum.BigModelBizEnum.DECISION_REPORT;
  35. import static com.slibra.common.utils.DateUtils.getAllDatesBetween;
  36. @Service
  37. @Slf4j
  38. public class FrontServiceImpl implements IFrontService {
  39. @Autowired
  40. private TXinyiIndustryMapper xinyiIndustryMapper;
  41. @Autowired
  42. private TXinyiDailyMapper xinyiDailyMapper;
  43. @Autowired
  44. private TXinyiRobotMapper xinyiRobotMapper;
  45. @Autowired
  46. private TXinyiNormConfigMapper tXinyiNormConfigMapper;
  47. @Autowired
  48. private TXinyiWarningRecordMapper xinyiWarningRecordMapper;
  49. @Autowired
  50. private TXinyiRecommendQaMapper xinyiRecommendQaMapper;
  51. @Autowired
  52. private TXinyiChatRecordMapper xinyiChatRecordMapper;
  53. @Autowired
  54. private RedisCache redisCache;
  55. @Autowired
  56. private TXinyiForecastComparisonMapper xinyiForecastComparisonMapper;
  57. @Autowired
  58. private AutoFeedbackMapper autoFeedbackMapper;
  59. @Autowired
  60. private TJlPredictMapper jlPredictMapper;
  61. @Autowired
  62. private XsyFeedbackMapper xsyFeedbackMapper;
  63. @Override
  64. public XinyiIndustrySimple countInfo() {
  65. //查询基本的工业库数据
  66. XinyiIndustrySimple xinyiIndustrySimple = new XinyiIndustrySimple();
  67. LocalDateTime nowTime = LocalDateTime.now();
  68. //调用接口查询指标
  69. String[] queryTags = {"信义污水厂JS_COD_Value", "信义污水厂升级出水COD", "信义污水厂JS_AD_Value", "信义污水厂升级出水氨氮", "信义污水厂JS_ZA_Value", "信义污水厂升级出水TN", "信义污水厂JS_ZL_Value", "信义污水厂升级出水TP", "信义污水厂JS_SS_Value", "信义污水厂升级出水SS", "信义污水厂JS_PH_Value", "信义污水厂升级出水PH", "信义污水厂FT101_Value", "信义污水厂出水瞬时流量"};
  70. xinyiIndustrySimple = this.getRealTimeData(queryTags, nowTime);
  71. //处理日报数据
  72. this.addDailyData(xinyiIndustrySimple, nowTime);
  73. //处理配置信息
  74. this.addConfigData(xinyiIndustrySimple);
  75. //计算
  76. this.calculateData(xinyiIndustrySimple, nowTime);
  77. //当前的小事数
  78. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_CHINESE);
  79. xinyiIndustrySimple.setTestHour(formatter.format(nowTime) + ":00");//只要小时 但是要后面的:00
  80. //2024年12月24日14:01:42 新增字段,累计出水总量【统计的是今日的所有的工业库的出水水量】
  81. xinyiIndustrySimple.setTotalTodayCSL(this.xinyiIndustryMapper.getTotalTodayCSL(nowTime.format(DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS))));
  82. return xinyiIndustrySimple;
  83. }
  84. @Override
  85. public List<String> warningCount() {
  86. ArrayList<String> result = new ArrayList<>();
  87. //获取告警的统计数量
  88. int count = this.xinyiWarningRecordMapper.getWarningCountByType(1);
  89. if(count > 0)//2024年5月26日19:01:39 有告警记录再返回
  90. result.add(WARNING_TEMPLATE.replace("#", String.valueOf(count)));
  91. //获取报警警的统计数量
  92. count = this.xinyiWarningRecordMapper.getWarningCountByType(2);
  93. if(count > 0)//2024年5月26日19:01:39 有告警记录再返回
  94. result.add(FORECAST_WARNING_TEMPLATE.replace("#", String.valueOf(count)));
  95. return result;
  96. }
  97. @Override
  98. public List<TXinyiWarningRecord> homeWarningList() {
  99. return this.xinyiWarningRecordMapper.homeWarningList();
  100. }
  101. @Override
  102. public List<TXinyiRecommendQa> recommendQAList(Integer type) {
  103. return this.xinyiRecommendQaMapper.selectTXinyiRecommendQaList(TXinyiRecommendQa.builder().type(type).build());
  104. }
  105. /**
  106. * 2024年6月23日17:30:07 因为只展示一条数据,所以判断是不是最后一条数据是report类型的,如果是就返回; 如果不是,获取是定时任务生成的最近的一条数据
  107. * 2024年6月23日20:13:34 因为决策和预测走的同一个接口,所以把type去掉,否则type为1获取不到预测数据
  108. * 2024年09月20日10:50:04 因为大模型返回不再有alert类型的了,所以下面可以再次优化
  109. * @param warningId
  110. * @return
  111. */
  112. @Override
  113. public TXinyiChatRecord qaDetailByWarningId(String warningId) {
  114. //2024年5月28日19:10:21 只获取决策的 因为决策和仿真预测是一个接口,所以通过类型区分
  115. List<TXinyiChatRecord> tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).type(1).build());
  116. if(CollectionUtils.isEmpty(tXinyiChatRecords))
  117. return null;
  118. //2024年09月20日10:50:04 直接返回最新一条记录接口,否则判断回答内容,包含太多字段,查询会非常慢
  119. return tXinyiChatRecords.get(0);
  120. /*TXinyiChatRecord tXinyiChatRecord = tXinyiChatRecords.get(0);
  121. //todo 表增肌一个字段,记录类型,否则查询速度会慢
  122. if(tXinyiChatRecord.getAnswer().contains(DECISION_REPORT.getCode()))
  123. return tXinyiChatRecord;
  124. else{
  125. tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).type(1).userId(WARNING_DEFAULT_CREATE).build());
  126. return CollectionUtils.isEmpty(tXinyiChatRecords) ? null : tXinyiChatRecords.get(0);
  127. }*/
  128. }
  129. @Override
  130. public String isSatisfiedAnswer(ChatReq chatReq) {
  131. Long id = chatReq.getId();
  132. Integer isSatisfied = chatReq.getIsSatisfied();
  133. if(Objects.isNull(id) || Objects.isNull(isSatisfied))
  134. throw new ServiceException("请输入正确的参数");
  135. TXinyiChatRecord tXinyiChatRecord = this.xinyiChatRecordMapper.selectTXinyiChatRecordById(id);
  136. if(!Objects.isNull(tXinyiChatRecord)){
  137. tXinyiChatRecord.setIsSatisfied(isSatisfied);
  138. tXinyiChatRecord.setUpdateBy(SecurityUtils.getUsername());
  139. tXinyiChatRecord.setUpdateTime(DateUtils.getNowDate());
  140. this.xinyiChatRecordMapper.updateTXinyiChatRecord(tXinyiChatRecord);
  141. }
  142. return "操作成功";
  143. }
  144. @Override
  145. public String handleWarningByMan(TXinyiWarningRecord warningRecordReq) {
  146. Long id = warningRecordReq.getId();
  147. if(Objects.isNull(id))
  148. throw new ServiceException("请输入告警记录id");
  149. TXinyiWarningRecord tXinyiWarningRecord = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordById(id);
  150. if(Objects.isNull(tXinyiWarningRecord))
  151. throw new ServiceException("请输入正确的告警记录id");
  152. warningRecordReq.setUpdateBy(SecurityUtils.getUsername());
  153. warningRecordReq.setUpdateTime(DateUtils.getNowDate());
  154. xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordReq);
  155. return "操作成功";
  156. }
  157. @Override
  158. public TXinyiChatRecord getLeastShortReport() {
  159. /*List<TXinyiChatRecord> tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().module(4).build());
  160. return CollectionUtils.isEmpty(tXinyiChatRecords) ? null : tXinyiChatRecords.get(0);*/
  161. return this.xinyiChatRecordMapper.getLeastShortReport();
  162. }
  163. @Override
  164. public List<TXinyiChatRecord> forecastList(String warningId) {
  165. return this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).type(3).build());
  166. }
  167. @Override
  168. public XinyiDailyFeeSimple recentlyOneFeeInfo() {
  169. //获取最新的一条日报
  170. TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
  171. XinyiDailyFeeSimple xinyiDailyFeeSimple = new XinyiDailyFeeSimple();
  172. if(!Objects.isNull(tXinyiDaily))
  173. BeanUtils.copyProperties(tXinyiDaily, xinyiDailyFeeSimple);
  174. return xinyiDailyFeeSimple;
  175. }
  176. /**
  177. * 自定义工单接口 获取数据接口
  178. * @param workOrderReq
  179. * @return
  180. *
  181. * 2024年6月23日17:12:12 小数处理,所有的小数均保留两位小数处理
  182. */
  183. @Override
  184. public List<WorkOrderRes> customWorkOrder(WorkOrderReq workOrderReq) {
  185. checkCustomWorkOrder(workOrderReq);
  186. //两个日期之间所有的时间-天
  187. List<String> allDatesBetween = getAllDatesBetween(LocalDate.parse(workOrderReq.getTimeBegin()), LocalDate.parse(workOrderReq.getTimeEnd()));
  188. //返回结果
  189. List<WorkOrderRes> result = new ArrayList<>(allDatesBetween.size());
  190. for (String date : allDatesBetween) {
  191. //查询机器人数据
  192. WorkOrderRes workOrderRes = new WorkOrderRes();
  193. workOrderRes.setTime(date);
  194. TXinyiRobot xinyiRobot = this.xinyiRobotMapper.selectRebotAvgByDate(date);
  195. if(!Objects.isNull(xinyiRobot))
  196. this.buildRobotData(xinyiRobot, workOrderRes, workOrderReq);
  197. //判断数据来源(进出水情况)
  198. if(workOrderReq.getWhichWay() == 0){// 0:日报 1:工业库(在线仪表)
  199. List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(date).build());
  200. if(!CollectionUtils.isEmpty(tXinyiDailies)){
  201. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
  202. this.buildDailyData(tXinyiDaily, workOrderRes, workOrderReq);
  203. }
  204. }else {
  205. TXinyiIndustry industry = this.xinyiIndustryMapper.selectIndustryAvgByDate(date);
  206. if(!Objects.isNull(industry))
  207. this.buildIndustryData(industry, workOrderRes, workOrderReq);
  208. }
  209. result.add(workOrderRes);
  210. }
  211. return result;
  212. }
  213. @Override
  214. public JSONObject customWorkOrderHandle(WorkOrderReq workOrderReq) {
  215. List<WorkOrderRes> workOrderRes = this.customWorkOrder(workOrderReq);
  216. JSONObject jsonObject = new JSONObject();
  217. List<JSONObject> jsGroup = new ArrayList<>();
  218. List<JSONObject> csGroup = new ArrayList<>();
  219. List<JSONObject> hyGroup = new ArrayList<>();
  220. //处理成前端响应的结构
  221. if(!CollectionUtils.isEmpty(workOrderRes)){
  222. for (WorkOrderRes workOrderRe : workOrderRes) {
  223. //处理进水
  224. if(workOrderReq.getJsSlq() || workOrderReq.getJsCod() || workOrderReq.getJsTn()
  225. || workOrderReq.getJsTp() || workOrderReq.getJsNh3() || workOrderReq.getJsSs()){
  226. JSONObject jsonObjectJS = new JSONObject();
  227. jsonObjectJS.put("time", workOrderRe.getTime());
  228. if(workOrderReq.getJsSlq())
  229. jsonObjectJS.put("jsSlq", workOrderRe.getJsSlq());
  230. if(workOrderReq.getJsCod())
  231. jsonObjectJS.put("jsCod", workOrderRe.getJsCod());
  232. if(workOrderReq.getJsTn())
  233. jsonObjectJS.put("jsTn", workOrderRe.getJsTn());
  234. if(workOrderReq.getJsTp())
  235. jsonObjectJS.put("jsTp", workOrderRe.getJsTp());
  236. if(workOrderReq.getJsNh3())
  237. jsonObjectJS.put("jsNh3", workOrderRe.getJsNh3());
  238. if(workOrderReq.getJsSs())
  239. jsonObjectJS.put("jsSs", workOrderRe.getJsSs());
  240. jsGroup.add(jsonObjectJS);
  241. }
  242. //处理出水
  243. if(workOrderReq.getCsSlqc() || workOrderReq.getCsCod() || workOrderReq.getCsTn()
  244. || workOrderReq.getCsTp() || workOrderReq.getCsNh3() || workOrderReq.getCsSs()){
  245. JSONObject jsonObjectCS = new JSONObject();
  246. jsonObjectCS.put("time", workOrderRe.getTime());
  247. if(workOrderReq.getCsSlqc())
  248. jsonObjectCS.put("csSlqc", workOrderRe.getCsSlqc());
  249. if(workOrderReq.getCsCod())
  250. jsonObjectCS.put("csCod", workOrderRe.getCsCod());
  251. if(workOrderReq.getCsTn())
  252. jsonObjectCS.put("csTn", workOrderRe.getCsTn());
  253. if(workOrderReq.getCsTp())
  254. jsonObjectCS.put("csTp", workOrderRe.getCsTp());
  255. if(workOrderReq.getCsNh3())
  256. jsonObjectCS.put("csNh3", workOrderRe.getCsNh3());
  257. if(workOrderReq.getCsSs())
  258. jsonObjectCS.put("csSs", workOrderRe.getCsSs());
  259. csGroup.add(jsonObjectCS);
  260. }
  261. //处理化验
  262. if(workOrderReq.getNo3Hlj1Jqr() || workOrderReq.getNo3Hlj2Jqr() || workOrderReq.getNh31Jqr()
  263. || workOrderReq.getNh32Jqr() || workOrderReq.getNo3Qyc1Jqr() || workOrderReq.getNo3Qyc2Jqr() || workOrderReq.getTpRccJqr()){
  264. JSONObject jsonObjectHY = new JSONObject();
  265. jsonObjectHY.put("time", workOrderRe.getTime());
  266. if(workOrderReq.getNo3Hlj1Jqr())
  267. jsonObjectHY.put("no3Hlj1Jqr", workOrderRe.getNo3Hlj1Jqr());
  268. if(workOrderReq.getNo3Hlj2Jqr())
  269. jsonObjectHY.put("no3Hlj2Jqr", workOrderRe.getNo3Hlj2Jqr());
  270. if(workOrderReq.getNh31Jqr())
  271. jsonObjectHY.put("nh31Jqr", workOrderRe.getNh31Jqr());
  272. if(workOrderReq.getNh32Jqr())
  273. jsonObjectHY.put("nh32Jqr", workOrderRe.getNh32Jqr());
  274. if(workOrderReq.getNo3Qyc1Jqr())
  275. jsonObjectHY.put("no3Qyc1Jqr", workOrderRe.getNo3Qyc1Jqr());
  276. if(workOrderReq.getNo3Qyc2Jqr())
  277. jsonObjectHY.put("no3Qyc2Jqr", workOrderRe.getNo3Qyc2Jqr());
  278. if(workOrderReq.getTpRccJqr())
  279. jsonObjectHY.put("tpRccJqr", workOrderRe.getTpRccJqr());
  280. hyGroup.add(jsonObjectHY);
  281. }
  282. }
  283. }
  284. jsonObject.put("jsGroup", jsGroup);
  285. jsonObject.put("csGroup", csGroup);
  286. jsonObject.put("hyGroup", hyGroup);
  287. return jsonObject;
  288. }
  289. @Override
  290. public JSONObject customWorkOrderHandleByData(WorkOrderReq workOrderReq, List<WorkOrderRes> workOrderRes) {
  291. JSONObject jsonObject = new JSONObject();
  292. List<JSONObject> jsGroup = new ArrayList<>();
  293. List<JSONObject> csGroup = new ArrayList<>();
  294. List<JSONObject> hyGroup = new ArrayList<>();
  295. //处理成前端响应的结构
  296. if(!CollectionUtils.isEmpty(workOrderRes)){
  297. for (WorkOrderRes workOrderRe : workOrderRes) {
  298. //处理进水
  299. if(workOrderReq.getJsSlq() || workOrderReq.getJsCod() || workOrderReq.getJsTn()
  300. || workOrderReq.getJsTp() || workOrderReq.getJsNh3() || workOrderReq.getJsSs()){
  301. JSONObject jsonObjectJS = new JSONObject();
  302. jsonObjectJS.put("time", workOrderRe.getTime());
  303. if(workOrderReq.getJsSlq())
  304. jsonObjectJS.put("jsSlq", workOrderRe.getJsSlq());
  305. if(workOrderReq.getJsCod())
  306. jsonObjectJS.put("jsCod", workOrderRe.getJsCod());
  307. if(workOrderReq.getJsTn())
  308. jsonObjectJS.put("jsTn", workOrderRe.getJsTn());
  309. if(workOrderReq.getJsTp())
  310. jsonObjectJS.put("jsTp", workOrderRe.getJsTp());
  311. if(workOrderReq.getJsNh3())
  312. jsonObjectJS.put("jsNh3", workOrderRe.getJsNh3());
  313. if(workOrderReq.getJsSs())
  314. jsonObjectJS.put("jsSs", workOrderRe.getJsSs());
  315. jsGroup.add(jsonObjectJS);
  316. }
  317. //处理出水
  318. if(workOrderReq.getCsSlqc() || workOrderReq.getCsCod() || workOrderReq.getCsTn()
  319. || workOrderReq.getCsTp() || workOrderReq.getCsNh3() || workOrderReq.getCsSs()){
  320. JSONObject jsonObjectCS = new JSONObject();
  321. jsonObjectCS.put("time", workOrderRe.getTime());
  322. if(workOrderReq.getCsSlqc())
  323. jsonObjectCS.put("csSlqc", workOrderRe.getCsSlqc());
  324. if(workOrderReq.getCsCod())
  325. jsonObjectCS.put("csCod", workOrderRe.getCsCod());
  326. if(workOrderReq.getCsTn())
  327. jsonObjectCS.put("csTn", workOrderRe.getCsTn());
  328. if(workOrderReq.getCsTp())
  329. jsonObjectCS.put("csTp", workOrderRe.getCsTp());
  330. if(workOrderReq.getCsNh3())
  331. jsonObjectCS.put("csNh3", workOrderRe.getCsNh3());
  332. if(workOrderReq.getCsSs())
  333. jsonObjectCS.put("csSs", workOrderRe.getCsSs());
  334. csGroup.add(jsonObjectCS);
  335. }
  336. //处理化验
  337. if(workOrderReq.getNo3Hlj1Jqr() || workOrderReq.getNo3Hlj2Jqr() || workOrderReq.getNh31Jqr()
  338. || workOrderReq.getNh32Jqr() || workOrderReq.getNo3Qyc1Jqr() || workOrderReq.getNo3Qyc2Jqr() || workOrderReq.getTpRccJqr()){
  339. JSONObject jsonObjectHY = new JSONObject();
  340. jsonObjectHY.put("time", workOrderRe.getTime());
  341. if(workOrderReq.getNo3Hlj1Jqr())
  342. jsonObjectHY.put("no3Hlj1Jqr", workOrderRe.getNo3Hlj1Jqr());
  343. if(workOrderReq.getNo3Hlj2Jqr())
  344. jsonObjectHY.put("no3Hlj2Jqr", workOrderRe.getNo3Hlj2Jqr());
  345. if(workOrderReq.getNh31Jqr())
  346. jsonObjectHY.put("nh31Jqr", workOrderRe.getNh31Jqr());
  347. if(workOrderReq.getNh32Jqr())
  348. jsonObjectHY.put("nh32Jqr", workOrderRe.getNh32Jqr());
  349. if(workOrderReq.getNo3Qyc1Jqr())
  350. jsonObjectHY.put("no3Qyc1Jqr", workOrderRe.getNo3Qyc1Jqr());
  351. if(workOrderReq.getNo3Qyc2Jqr())
  352. jsonObjectHY.put("no3Qyc2Jqr", workOrderRe.getNo3Qyc2Jqr());
  353. if(workOrderReq.getTpRccJqr())
  354. jsonObjectHY.put("tpRccJqr", workOrderRe.getTpRccJqr());
  355. hyGroup.add(jsonObjectHY);
  356. }
  357. }
  358. }
  359. jsonObject.put("jsGroup", jsGroup);
  360. jsonObject.put("csGroup", csGroup);
  361. jsonObject.put("hyGroup", hyGroup);
  362. //2024年6月25日13:45:48 新增逻辑 区分是在线仪表的还是日报的,方便前端展示单位
  363. jsonObject.put("whichWay", workOrderReq.getWhichWay());
  364. return jsonObject;
  365. }
  366. @Override
  367. public String stopChat(String sessionId) {
  368. HashMap<String, Object> map = new HashMap<>();
  369. map.put(SESSION_ID, sessionId);
  370. RecordId stopGenStream = redisCache.streamXadd(STOP_GEN_STREAM, map);
  371. log.info("返回结果是{}", JSON.toJSONString(stopGenStream));
  372. return "操作成功";
  373. }
  374. @Override
  375. public SmartAdd smartAddDataInfo() {
  376. SmartAdd build = SmartAdd.builder().build();
  377. //处理需要的数据
  378. //获取最新的日报数据
  379. TXinyiIndustry tXinyiIndustry = this.xinyiIndustryMapper.selectTXinyiIndustryNewest();
  380. if(!Objects.isNull(tXinyiIndustry)){
  381. build.setJslYB(tXinyiIndustry.getJsSlq());
  382. build.setJsCodYB(tXinyiIndustry.getJsCod());
  383. build.setJsTnYB(tXinyiIndustry.getJsTn());
  384. build.setTytjzl(tXinyiIndustry.getSJTYJLY());
  385. }
  386. //获取最新的化验室数据
  387. TXinyiRobot tXinyiRobot = this.xinyiRobotMapper.selectNewest();
  388. if(!Objects.isNull(tXinyiRobot)){
  389. build.setJsCodHY(tXinyiRobot.getCodJqr());
  390. build.setHyXsyHYOne(tXinyiRobot.getNo3Hlj1Jqr());
  391. build.setHyXsyHYTwo(tXinyiRobot.getNo3Hlj2Jqr());
  392. build.setQyXsyHYOne(tXinyiRobot.getNo3Qyc1Jqr());
  393. build.setQyXsyHYTwo(tXinyiRobot.getNo3Qyc2Jqr());
  394. build.setQyAdHYOne(tXinyiRobot.getNh31Jqr());
  395. build.setQyAdHYTwo(tXinyiRobot.getNh32Jqr());
  396. }
  397. //获取最新的预测数据
  398. TXinyiForecastComparison tXinyiForecastComparison = this.xinyiForecastComparisonMapper.selectNewestForecastComparison(BusinessEnum.BigModelForecastEnum.XSY1.getCode());
  399. if(!Objects.isNull(tXinyiForecastComparison)){
  400. build.setHyXsyYCOne(tXinyiForecastComparison.getHsForecastOne());
  401. }
  402. tXinyiForecastComparison = this.xinyiForecastComparisonMapper.selectNewestForecastComparison(BusinessEnum.BigModelForecastEnum.XSY2.getCode());
  403. if(!Objects.isNull(tXinyiForecastComparison)){
  404. build.setHyXsyYCTwo(tXinyiForecastComparison.getHsForecastOne());
  405. }
  406. //获取最新的计算数据
  407. return build;
  408. }
  409. @Override
  410. public Map<String, List<ChartBasic>> smartAddCharList(int type, String timeBegin, String timeEnd) {
  411. //日期兜底处理
  412. Date nowDate = DateUtils.getNowDate();
  413. Date dayBefore7 = DateUtils.plusDate(-7, nowDate);
  414. //2024年09月13日17:02:59 支持前段自定义起止时间
  415. //先用日期获取当天和前一天的数据,如果获取不到,则提示错误信息
  416. String nowDateStr = StringUtils.isBlank(timeEnd) ? DateUtils.parseDateToStr(DateUtils.YYYYMMDD_TS, nowDate) : timeEnd;
  417. String dayBefore3Str = StringUtils.isBlank(timeBegin) ? DateUtils.parseDateToStr(DateUtils.YYYYMMDD_TS, dayBefore7) : timeBegin;
  418. //返回的对象
  419. Map<String, List<ChartBasic>> result = new HashMap<>();
  420. List<ChartBasic> list = new ArrayList<>();
  421. //先判断类型,然后根据不同类型,查询不同的数据
  422. if(BusinessEnum.SmartAddMedicineReqEnum.JSLL.getCode() == type){
  423. //查询仪表即可
  424. list = this.xinyiIndustryMapper.selectJSLByDate(dayBefore3Str, nowDateStr);
  425. result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list);
  426. }else if(BusinessEnum.SmartAddMedicineReqEnum.HY_1_XSY.getCode() == type){
  427. //查询化验室
  428. list = this.xinyiRobotMapper.selectXSY1ByDate(dayBefore3Str, nowDateStr);
  429. result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list);
  430. //查询预测
  431. list = this.xinyiForecastComparisonMapper.selectOneValAndTimeByDate(BusinessEnum.BigModelForecastEnum.XSY1.getCode());//SQL中处理日期 否则索引失效
  432. result.put(BusinessEnum.DataSourceEnum.YC.getCode(), list);
  433. }else if(BusinessEnum.SmartAddMedicineReqEnum.HY_2_XSY.getCode() == type){
  434. //查询化验室
  435. list = this.xinyiRobotMapper.selectXSY2ByDate(dayBefore3Str, nowDateStr);
  436. result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list);
  437. //查询预测
  438. list = this.xinyiForecastComparisonMapper.selectOneValAndTimeByDate(BusinessEnum.BigModelForecastEnum.XSY2.getCode());//SQL中处理日期 否则索引失效
  439. result.put(BusinessEnum.DataSourceEnum.YC.getCode(), list);
  440. }else if(BusinessEnum.SmartAddMedicineReqEnum.QY_1_AD.getCode() == type){
  441. //查询化验室
  442. list = this.xinyiRobotMapper.selectAD1ByDate(dayBefore3Str, nowDateStr);
  443. result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list);
  444. }else if(BusinessEnum.SmartAddMedicineReqEnum.QY_2_AD.getCode() == type){
  445. //查询化验室
  446. list = this.xinyiRobotMapper.selectAD2ByDate(dayBefore3Str, nowDateStr);
  447. result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list);
  448. }else if(BusinessEnum.SmartAddMedicineReqEnum.JSCOD.getCode() == type){
  449. //查询仪表即可
  450. list = this.xinyiIndustryMapper.selectJsCodByDate(dayBefore3Str, nowDateStr);
  451. result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list);
  452. //查询化验室
  453. list = this.xinyiRobotMapper.selectCodByDate(dayBefore3Str, nowDateStr);
  454. result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list);
  455. }else if(BusinessEnum.SmartAddMedicineReqEnum.JSTN.getCode() == type){
  456. //查询仪表即可
  457. list = this.xinyiIndustryMapper.selectJsTnByDate(dayBefore3Str, nowDateStr);
  458. result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list);
  459. }else if(BusinessEnum.SmartAddMedicineReqEnum.TYTJL.getCode() == type){
  460. //查询仪表即可
  461. list = this.xinyiIndustryMapper.selectTytzjlByDate(dayBefore3Str, nowDateStr);
  462. result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list);
  463. }else{
  464. log.info("暂不支持的类型~~~");
  465. }
  466. return result;
  467. }
  468. @Override
  469. // @Transactional(rollbackFor = Exception.class)
  470. public List<AutoFeedback> configPredict(List<TJlPredict> tJlPredicts) {
  471. if(CollectionUtils.isEmpty(tJlPredicts))
  472. throw new ServiceException("必须输入至少一条数据");
  473. //先清除2个表
  474. autoFeedbackMapper.deleteAll();
  475. jlPredictMapper.deleteAll();
  476. xsyFeedbackMapper.deleteAll();
  477. //再保存数据
  478. for (TJlPredict tJlPredict : tJlPredicts) {
  479. jlPredictMapper.insertTJlPredict(tJlPredict);
  480. }
  481. //休眠2分钟
  482. try {
  483. TimeUnit.MINUTES.sleep(3);
  484. } catch (InterruptedException e) {
  485. throw new RuntimeException(e);
  486. }
  487. //查询新结果 并返回
  488. return autoFeedbackMapper.selectAutoFeedbackList(null);
  489. }
  490. private void buildIndustryData(TXinyiIndustry industry, WorkOrderRes workOrderRes, WorkOrderReq workOrderReq) {
  491. if(workOrderReq.getJsSlq())
  492. workOrderRes.setJsSlq(DecimalUtils.getAbsAndScale(industry.getJsSlq(), 2));
  493. if(workOrderReq.getJsCod())
  494. workOrderRes.setJsCod(DecimalUtils.getAbsAndScale(industry.getJsCod(), 2));
  495. if(workOrderReq.getJsTn())
  496. workOrderRes.setJsTn(DecimalUtils.getAbsAndScale(industry.getJsTn(), 2));
  497. if(workOrderReq.getJsTp())
  498. workOrderRes.setJsTp(DecimalUtils.getAbsAndScale(industry.getJsTp(), 2));
  499. if(workOrderReq.getJsNh3())
  500. workOrderRes.setJsNh3(DecimalUtils.getAbsAndScale(industry.getJsNh3(), 2));
  501. if(workOrderReq.getJsSs())
  502. workOrderRes.setJsSs(DecimalUtils.getAbsAndScale(industry.getJsSs(), 2));
  503. if(workOrderReq.getCsSlqc())
  504. workOrderRes.setCsSlqc(DecimalUtils.getAbsAndScale(industry.getCsSlqc(), 2));
  505. if(workOrderReq.getCsCod())
  506. workOrderRes.setCsCod(DecimalUtils.getAbsAndScale(industry.getCsCod(), 2));
  507. if(workOrderReq.getCsTn())
  508. workOrderRes.setCsTn(DecimalUtils.getAbsAndScale(industry.getCsTn(), 2));
  509. if(workOrderReq.getCsTp())
  510. workOrderRes.setCsTp(DecimalUtils.getAbsAndScale(industry.getCsTp(), 2));
  511. if(workOrderReq.getCsNh3())
  512. workOrderRes.setCsNh3(DecimalUtils.getAbsAndScale(industry.getCsNh3(), 2));
  513. if(workOrderReq.getCsSs())
  514. workOrderRes.setCsSs(DecimalUtils.getAbsAndScale(industry.getCsSs(), 2));
  515. }
  516. private void buildDailyData(TXinyiDaily tXinyiDaily, WorkOrderRes workOrderRes, WorkOrderReq workOrderReq) {
  517. if(workOrderReq.getJsSlq())
  518. workOrderRes.setJsSlq(DecimalUtils.getAbsAndScale(tXinyiDaily.getJSL(), 2));
  519. if(workOrderReq.getJsCod())
  520. workOrderRes.setJsCod(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsCod(), 2));
  521. if(workOrderReq.getJsTn())
  522. workOrderRes.setJsTn(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsTn(), 2));
  523. if(workOrderReq.getJsTp())
  524. workOrderRes.setJsTp(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsTp(), 2));
  525. if(workOrderReq.getJsNh3())
  526. workOrderRes.setJsNh3(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsNh3(), 2));
  527. if(workOrderReq.getJsSs())
  528. workOrderRes.setJsSs(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsSs(), 2));
  529. if(workOrderReq.getCsSlqc())
  530. workOrderRes.setCsSlqc(DecimalUtils.getAbsAndScale(tXinyiDaily.getCSL(), 2));
  531. if(workOrderReq.getCsCod())
  532. workOrderRes.setCsCod(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsCod(), 2));
  533. if(workOrderReq.getCsTn())
  534. workOrderRes.setCsTn(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsTn(), 2));
  535. if(workOrderReq.getCsTp())
  536. workOrderRes.setCsTp(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsTp(), 2));
  537. if(workOrderReq.getCsNh3())
  538. workOrderRes.setCsNh3(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsNh3(), 2));
  539. if(workOrderReq.getCsSs())
  540. workOrderRes.setCsSs(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsSs(), 2));
  541. }
  542. private void buildRobotData(TXinyiRobot xinyiRobot, WorkOrderRes workOrderRes, WorkOrderReq workOrderReq) {
  543. if(workOrderReq.getNo3Hlj1Jqr())
  544. workOrderRes.setNo3Hlj1Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Hlj1Jqr(), 2));
  545. if(workOrderReq.getNo3Hlj2Jqr())
  546. workOrderRes.setNo3Hlj2Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Hlj2Jqr(), 2));
  547. if(workOrderReq.getNh31Jqr())
  548. workOrderRes.setNh31Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNh31Jqr(), 2));
  549. if(workOrderReq.getNh32Jqr())
  550. workOrderRes.setNh32Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNh32Jqr(), 2));
  551. if(workOrderReq.getNo3Qyc1Jqr())
  552. workOrderRes.setNo3Qyc1Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Qyc1Jqr(), 2));
  553. if(workOrderReq.getNo3Qyc2Jqr())
  554. workOrderRes.setNo3Qyc2Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Qyc2Jqr(), 2));
  555. if(workOrderReq.getTpRccJqr())
  556. workOrderRes.setTpRccJqr(DecimalUtils.getAbsAndScale(xinyiRobot.getTpRccJqr(), 2));
  557. }
  558. private void checkCustomWorkOrder(WorkOrderReq workOrderReq) {
  559. if(StringUtils.isBlank(workOrderReq.getTimeBegin()) || StringUtils.isBlank(workOrderReq.getTimeEnd()))
  560. throw new ServiceException("输入的参数不合法");
  561. }
  562. /***
  563. * 将工业库数据计算出结果
  564. * @param xinyiIndustrySimple
  565. * @param nowTime
  566. * @return
  567. */
  568. private XinyiIndustrySimple calculateData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowTime) {
  569. LocalDateTime yesterdaySameTime = nowTime.plusDays(-1);
  570. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_TS);
  571. String testTime = formatter.format(yesterdaySameTime);
  572. //处理昨日同时期的进水 获取环比
  573. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testTime(testTime).build());
  574. if(!CollectionUtils.isEmpty(tXinyiIndustries)){
  575. TXinyiIndustry industry = tXinyiIndustries.get(0);
  576. BigDecimal jsSlqYesterday = industry.getJsSlq();
  577. BigDecimal csSlqcYesterday = industry.getCsSlqc();
  578. BigDecimal jsSlqToday = xinyiIndustrySimple.getJsSlq();
  579. BigDecimal csSlqcToday = xinyiIndustrySimple.getCsSlqc();
  580. if(!Objects.isNull(jsSlqYesterday) && !Objects.isNull(jsSlqToday))
  581. xinyiIndustrySimple.setSsJsHb((jsSlqToday.subtract(jsSlqYesterday)).divide(jsSlqYesterday, 4, RoundingMode.HALF_UP));
  582. if(!Objects.isNull(csSlqcYesterday) && !Objects.isNull(csSlqcToday))
  583. xinyiIndustrySimple.setSsJsHb((csSlqcToday.subtract(csSlqcYesterday)).divide(csSlqcYesterday, 4, RoundingMode.HALF_UP));
  584. }
  585. //通过sql查询上周的平均值和环比情况
  586. DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS);
  587. //获取上周的统计进出水品均值
  588. String begin = formatterDate.format(nowTime.plusDays(-7));
  589. String end = formatterDate.format(nowTime.plusDays(-1));
  590. HashMap<String, BigDecimal> lastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end);
  591. if(!Objects.isNull(lastWeek)){
  592. BigDecimal lastJSL = lastWeek.get("JSL");
  593. BigDecimal lastCSL = lastWeek.get("CSL");
  594. //获取上上周的统计进出水品均值
  595. begin = formatterDate.format(nowTime.plusDays(-14));
  596. end = formatterDate.format(nowTime.plusDays(-8));
  597. HashMap<String, BigDecimal> beforeLastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end);
  598. if(!Objects.isNull(beforeLastWeek)){
  599. BigDecimal beforeLastJSL = beforeLastWeek.get("JSL");
  600. BigDecimal beforeLastCSL = beforeLastWeek.get("CSL");
  601. if(!Objects.isNull(lastJSL)){
  602. xinyiIndustrySimple.setSzZJSAvg(lastJSL);
  603. if(!Objects.isNull(beforeLastJSL))
  604. xinyiIndustrySimple.setSzZJSHb((lastJSL.subtract(beforeLastJSL)).divide(beforeLastJSL, 4, RoundingMode.HALF_UP));
  605. }
  606. if(!Objects.isNull(lastCSL)){
  607. xinyiIndustrySimple.setSzZCSAvg(lastCSL);
  608. if(!Objects.isNull(beforeLastCSL))
  609. xinyiIndustrySimple.setSzZCSHb((lastCSL.subtract(beforeLastCSL)).divide(beforeLastCSL, 4, RoundingMode.HALF_UP));
  610. }
  611. }
  612. }
  613. return xinyiIndustrySimple;
  614. }
  615. private XinyiIndustrySimple addConfigData(XinyiIndustrySimple xinyiIndustrySimple) {
  616. //获取配置表
  617. List<TXinyiNormConfig> tXinyiNormConfigs = this.tXinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  618. if(!CollectionUtils.isEmpty(tXinyiNormConfigs)){
  619. TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  620. BeanUtils.copyProperties(normConfig, xinyiIndustrySimple);
  621. }
  622. return xinyiIndustrySimple;
  623. }
  624. private XinyiIndustrySimple addDailyData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowDate) {
  625. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS);
  626. String nowDateStr = nowDate.format(formatter);
  627. String yesterdayStr = nowDate.plusDays(-1).format(formatter);//昨天
  628. String beforeYesterdayStr = nowDate.plusDays(-2).format(formatter);//前天
  629. List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(nowDateStr).build());
  630. if(!CollectionUtils.isEmpty(tXinyiDailies)){
  631. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
  632. BeanUtils.copyProperties(tXinyiDaily, xinyiIndustrySimple);
  633. }
  634. //昨日数据
  635. List<TXinyiDaily> tXinyiDailiesYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(yesterdayStr).build());
  636. if(!CollectionUtils.isEmpty(tXinyiDailiesYesterday)){
  637. TXinyiDaily tXinyiDailyYesterday = tXinyiDailiesYesterday.get(0);
  638. BigDecimal zrJsl = tXinyiDailyYesterday.getJSL();
  639. xinyiIndustrySimple.setZrZJSL(zrJsl);
  640. BigDecimal zrCsl = tXinyiDailyYesterday.getCSL();
  641. xinyiIndustrySimple.setZrZCSL(zrCsl);
  642. //有可能今日获取不到日报数据,相关信息从昨天获取
  643. if(CollectionUtils.isEmpty(tXinyiDailies))
  644. BeanUtils.copyProperties(tXinyiDailyYesterday, xinyiIndustrySimple);
  645. //获取前日数据 并计算环比
  646. List<TXinyiDaily> tXinyiDailiesBeforeYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(beforeYesterdayStr).build());
  647. if(!CollectionUtils.isEmpty(tXinyiDailiesBeforeYesterday)){
  648. TXinyiDaily tXinyiDailyBeforeYesterday = tXinyiDailiesBeforeYesterday.get(0);
  649. BigDecimal qrZJSL = tXinyiDailyBeforeYesterday.getJSL();
  650. if(!Objects.isNull(qrZJSL) && !Objects.isNull(zrJsl))
  651. xinyiIndustrySimple.setZrZJsHb((zrJsl.subtract(qrZJSL)).divide(qrZJSL, 4, RoundingMode.HALF_UP));
  652. BigDecimal qrZCSL = tXinyiDailyBeforeYesterday.getCSL();
  653. if(!Objects.isNull(qrZCSL) && !Objects.isNull(zrCsl))
  654. xinyiIndustrySimple.setZrZCsHb((zrCsl.subtract(qrZCSL)).divide(qrZCSL, 4, RoundingMode.HALF_UP));
  655. }
  656. }
  657. return xinyiIndustrySimple;
  658. }
  659. private XinyiIndustrySimple getRealTimeData(String[] queryTags, LocalDateTime nowTime) {
  660. /*AtomicReference<XinyiIndustrySimple> result = new AtomicReference<>();
  661. *//*String time = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate());
  662. time = time + ":00:00";*//*
  663. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS);
  664. //获取当前的时间
  665. LocalDateTime beginTime = nowTime.plusMinutes(-1);
  666. //调用工业库接口
  667. String url = INDUSTRY_INTERFACE_ADDR;
  668. HashMap<String, Object> req = new HashMap<>();
  669. req.put("tagNames", queryTags);
  670. req.put("startTime", formatter.format(beginTime));
  671. req.put("endTime", formatter.format(nowTime));
  672. req.put("recordNumbers", 100000);
  673. String body = HttpRequest.post(url).header("Authorization", "c2E6c2E=").header("clientName", "hongshan").body(JSON.toJSONString(req)).execute().body();
  674. // System.out.println("body = " + body);
  675. log.info("实时数据返回的结果是{}", body);
  676. //2024年5月31日13:43:24 新增解析内容,判断是否正常返回
  677. String errorCode = (String) JSON.parseObject(body).get("errorCode");
  678. if("-1".equals(errorCode)){
  679. log.info("工业库数据返回错误");
  680. return new XinyiIndustrySimple();
  681. }
  682. List<HashMap<String, String>> list = new ArrayList<>();
  683. //行转列数据处理
  684. for (String queryTag : queryTags) {
  685. JSONArray array = JSON.parseObject(body).getJSONArray(queryTag);
  686. //特殊数据处理一
  687. if(Objects.isNull(array) || array.isEmpty()){
  688. System.out.println(queryTag + "查询到了空的数据,跳过本次循环");
  689. continue;
  690. }
  691. int size = array.size();
  692. //特殊数据处理二
  693. if("0".equals(array.get(1) + "")){
  694. System.out.println(queryTag + "查询到了数据,但是数据集合只有一条,且都是0");
  695. continue;
  696. }
  697. //存放的数据集
  698. //利用map去重
  699. HashMap<String, String> map = new LinkedHashMap<>();
  700. for (int i = 2; i < size; i++) {
  701. // System.out.println(i + "" + array.get(i));
  702. JSONArray oneRecord = JSON.parseArray(JSON.toJSONString(array.get(i)));
  703. //处理为空或者为0的数据
  704. Object timeStampValue = oneRecord.get(2);
  705. if(Objects.isNull(timeStampValue) || "0".equals(timeStampValue + ""))
  706. continue;
  707. BigDecimal value = Objects.isNull(oneRecord.get(0)) ? null : new BigDecimal(oneRecord.get(0) + "");
  708. long timestamp = (long) timeStampValue;
  709. String format = DateUtil.format(new Date(timestamp), DateUtils.YYYYMMDDHH_TS);
  710. map.put(format, queryTag + "-" + value);
  711. }
  712. list.add(map);
  713. }
  714. Set<String> recordTimeSet = new HashSet<>();
  715. Map<String, XinyiIndustrySimple> recordMap = new HashMap<>();
  716. for (int i = 0; i < list.size(); i++) {
  717. HashMap<String, String> map = list.get(i);
  718. int finalJ = i;
  719. map.forEach((k, v) ->{
  720. XinyiIndustrySimple xinyiIndustrySimple = null;
  721. if(!recordTimeSet.contains(k)){//第一次
  722. xinyiIndustrySimple = new XinyiIndustrySimple();
  723. recordTimeSet.add(k);
  724. recordMap.put(k, xinyiIndustrySimple);
  725. }else{
  726. xinyiIndustrySimple = recordMap.get(k);
  727. }
  728. xinyiIndustrySimple.setTestTime(k);
  729. //解析值
  730. String[] split = v.split("-");
  731. String type = split[0];
  732. BigDecimal value = new BigDecimal(split[1]);
  733. if ("信义污水厂JS_COD_Value".equals(type)) {
  734. xinyiIndustrySimple.setJsCod(value);
  735. } else if ("信义污水厂JS_PH_Value".equals(type)) {
  736. xinyiIndustrySimple.setJsPh(value);
  737. } else if ("信义污水厂JS_SS_Value".equals(type)) {
  738. xinyiIndustrySimple.setJsSs(value);
  739. } else if ("信义污水厂JS_ZL_Value".equals(type)) {
  740. xinyiIndustrySimple.setJsTp(value);
  741. } else if ("信义污水厂JS_ZA_Value".equals(type)) {
  742. xinyiIndustrySimple.setJsTn(value);
  743. } else if ("信义污水厂JS_AD_Value".equals(type)) {
  744. xinyiIndustrySimple.setJsNh3(value);
  745. } else if ("信义污水厂出水瞬时流量".equals(type)) {
  746. xinyiIndustrySimple.setCsSlqc(value);
  747. } else if ("信义污水厂升级出水COD".equals(type)) {
  748. xinyiIndustrySimple.setCsCod(value);
  749. } else if ("信义污水厂升级出水PH".equals(type)) {
  750. xinyiIndustrySimple.setCsPh(value);
  751. } else if ("信义污水厂升级出水SS".equals(type)) {
  752. xinyiIndustrySimple.setCsSs(value);
  753. } else if ("信义污水厂升级出水TN".equals(type)) {
  754. xinyiIndustrySimple.setCsTn(value);
  755. } else if ("信义污水厂升级出水TP".equals(type)) {
  756. xinyiIndustrySimple.setCsTp(value);
  757. } else if ("信义污水厂升级出水氨氮".equals(type)) {
  758. xinyiIndustrySimple.setCsNh3(value);
  759. } else if ("信义污水厂FT101_Value".equals(type)) {
  760. xinyiIndustrySimple.setJsSlq(value);
  761. }
  762. //只有最后一次才执行数据库添加
  763. if(finalJ == list.size()-1){
  764. //赋值完毕返回数据
  765. result.set(xinyiIndustrySimple);
  766. }
  767. });
  768. }
  769. XinyiIndustrySimple xinyiIndustrySimple = result.get();
  770. return Objects.isNull(xinyiIndustrySimple) ? new XinyiIndustrySimple() : xinyiIndustrySimple;*/
  771. //2024年6月11日16:16:17 逻辑调整,获取最新的那条工业库的数据
  772. TXinyiIndustry tXinyiIndustry = this.xinyiIndustryMapper.selectTXinyiIndustryNewest();
  773. XinyiIndustrySimple xinyiIndustrySimple = new XinyiIndustrySimple();
  774. if(!Objects.isNull(tXinyiIndustry))
  775. BeanUtils.copyProperties(tXinyiIndustry, xinyiIndustrySimple);
  776. //获取化验室的最新的一条数据
  777. TXinyiRobot tXinyiRobot = this.xinyiRobotMapper.selectNewest();
  778. if(!Objects.isNull(tXinyiRobot))
  779. BeanUtils.copyProperties(tXinyiRobot, xinyiIndustrySimple);
  780. return xinyiIndustrySimple;
  781. }
  782. public static void main(String[] args) {
  783. String s = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate());
  784. s = s + ":00:00";
  785. System.out.println("s = " + s);
  786. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  787. LocalDateTime endTime = LocalDateTime.now();
  788. LocalDateTime begin = endTime.plusMinutes(-1);
  789. System.out.println(formatter.format(endTime));
  790. System.out.println(formatter.format(begin));
  791. LocalDate parse = LocalDate.parse("2024-02-26");
  792. System.out.println("parse = " + parse);
  793. System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS)));
  794. String req = "{\"data\": [\n" +
  795. " {\n" +
  796. " \"test_hour\": \"2025/04/22 10\",\n" +
  797. " \"no3Hlj1Jqr\": \"2\",\n" +
  798. " \"no3Qyc1Jqr\": \"3\",\n" +
  799. " \"nh31Jqr\": \"4\"\n" +
  800. " },\n" +
  801. " {\n" +
  802. " \"test_hour\": \"2025/04/23 11\",\n" +
  803. " \"no3Hlj1Jqr\": \"5\",\n" +
  804. " \"no3Qyc1Jqr\": \"6\",\n" +
  805. " \"nh31Jqr\": \"7\"\n" +
  806. " },\n" +
  807. " {\n" +
  808. " \"test_hour\": \"2025/04/22 12\",\n" +
  809. " \"no3Hlj1Jqr\": \"2\",\n" +
  810. " \"no3Qyc1Jqr\": \"3\",\n" +
  811. " \"nh31Jqr\": \"4\"\n" +
  812. " },\n" +
  813. " {\n" +
  814. " \"test_hour\": \"2025/04/23 13\",\n" +
  815. " \"no3Hlj1Jqr\": \"5\",\n" +
  816. " \"no3Qyc1Jqr\": \"6\",\n" +
  817. " \"nh31Jqr\": \"7\"\n" +
  818. " },\n" +
  819. " {\n" +
  820. " \"test_hour\": \"2025/04/22 14\",\n" +
  821. " \"no3Hlj1Jqr\": \"2\",\n" +
  822. " \"no3Qyc1Jqr\": \"3\",\n" +
  823. " \"nh31Jqr\": \"4\"\n" +
  824. " },\n" +
  825. " {\n" +
  826. " \"test_hour\": \"2025/04/23 16\",\n" +
  827. " \"no3Hlj1Jqr\": \"5\",\n" +
  828. " \"no3Qyc1Jqr\": \"6\",\n" +
  829. " \"nh31Jqr\": \"7\"\n" +
  830. " }\n" +
  831. " ]}";
  832. String post = HttpUtil.post("http://192.168.40.21:30076/setfeedback", req);
  833. System.out.println(post);
  834. }
  835. }