FrontServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package com.slibra.business.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import com.alibaba.fastjson2.JSON;
  5. import com.alibaba.fastjson2.JSONArray;
  6. import com.slibra.business.domain.*;
  7. import com.slibra.business.mapper.*;
  8. import com.slibra.business.res.XinyiIndustrySimple;
  9. import com.slibra.business.service.IFrontService;
  10. import com.slibra.common.utils.DateUtils;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.beans.BeanUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.util.CollectionUtils;
  16. import java.math.BigDecimal;
  17. import java.math.RoundingMode;
  18. import java.time.LocalDateTime;
  19. import java.time.format.DateTimeFormatter;
  20. import java.util.*;
  21. import java.util.concurrent.atomic.AtomicReference;
  22. import static com.slibra.common.constant.MyConstants.FORECAST_WARNING_TEMPLATE;
  23. import static com.slibra.common.constant.MyConstants.WARNING_TEMPLATE;
  24. @Service
  25. @Slf4j
  26. public class FrontServiceImpl implements IFrontService {
  27. @Autowired
  28. private TXinyiIndustryMapper xinyiIndustryMapper;
  29. @Autowired
  30. private TXinyiDailyMapper xinyiDailyMapper;
  31. @Autowired
  32. private TXinyiNormConfigMapper tXinyiNormConfigMapper;
  33. @Autowired
  34. private TXinyiWarningRecordMapper xinyiWarningRecordMapper;
  35. @Autowired
  36. private TXinyiRecommendQaMapper xinyiRecommendQaMapper;
  37. @Autowired
  38. private TXinyiChatRecordMapper xinyiChatRecordMapper;
  39. @Override
  40. public XinyiIndustrySimple countInfo() {
  41. //查询基本的工业库数据
  42. XinyiIndustrySimple xinyiIndustrySimple = new XinyiIndustrySimple();
  43. LocalDateTime nowTime = LocalDateTime.now();
  44. //调用接口查询指标
  45. 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", "信义污水厂出水瞬时流量"};
  46. xinyiIndustrySimple = this.getRealTimeData(queryTags, nowTime);
  47. //处理日报数据
  48. this.addDailyData(xinyiIndustrySimple, nowTime);
  49. //处理配置信息
  50. this.addConfigData(xinyiIndustrySimple);
  51. //计算
  52. this.calculateData(xinyiIndustrySimple, nowTime);
  53. //当前的小事数
  54. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_CHINESE);
  55. xinyiIndustrySimple.setTestHour(formatter.format(nowTime) + ":00");//只要小时 但是要后面的:00
  56. return xinyiIndustrySimple;
  57. }
  58. @Override
  59. public List<String> warningCount() {
  60. ArrayList<String> result = new ArrayList<>(2);
  61. //获取告警的统计数量
  62. int count = this.xinyiWarningRecordMapper.getWarningCountByType(1);
  63. result.add(WARNING_TEMPLATE.replace("#", String.valueOf(count)));
  64. //获取报警警的统计数量
  65. count = this.xinyiWarningRecordMapper.getWarningCountByType(2);
  66. result.add(FORECAST_WARNING_TEMPLATE.replace("#", String.valueOf(count)));
  67. return result;
  68. }
  69. @Override
  70. public List<TXinyiWarningRecord> homeWarningList() {
  71. return this.xinyiWarningRecordMapper.homeWarningList();
  72. }
  73. @Override
  74. public List<TXinyiRecommendQa> recommendQAList(Integer type) {
  75. return this.xinyiRecommendQaMapper.selectTXinyiRecommendQaList(TXinyiRecommendQa.builder().type(type).build());
  76. }
  77. @Override
  78. public TXinyiChatRecord qaDetailByWarningId(String warningId) {
  79. List<TXinyiChatRecord> tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).build());
  80. return CollectionUtils.isEmpty(tXinyiChatRecords) ? null : tXinyiChatRecords.get(0);
  81. }
  82. private XinyiIndustrySimple calculateData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowTime) {
  83. LocalDateTime yesterdaySameTime = nowTime.plusDays(-1);
  84. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_TS);
  85. String testTime = formatter.format(yesterdaySameTime);
  86. //处理昨日同时期的进水 获取环比
  87. List<TXinyiIndustry> tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testTime(testTime).build());
  88. if(!CollectionUtils.isEmpty(tXinyiIndustries)){
  89. TXinyiIndustry industry = tXinyiIndustries.get(0);
  90. BigDecimal jsSlqYesterday = industry.getJsSlq();
  91. BigDecimal csSlqcYesterday = industry.getCsSlqc();
  92. BigDecimal jsSlqToday = xinyiIndustrySimple.getJsSlq();
  93. BigDecimal csSlqcToday = xinyiIndustrySimple.getCsSlqc();
  94. if(!Objects.isNull(jsSlqYesterday) && !Objects.isNull(jsSlqToday))
  95. xinyiIndustrySimple.setSsJsHb((jsSlqToday.subtract(jsSlqYesterday)).divide(jsSlqYesterday, 4, RoundingMode.HALF_UP));
  96. if(!Objects.isNull(csSlqcYesterday) && !Objects.isNull(csSlqcToday))
  97. xinyiIndustrySimple.setSsJsHb((csSlqcToday.subtract(csSlqcYesterday)).divide(csSlqcYesterday, 4, RoundingMode.HALF_UP));
  98. }
  99. //通过sql查询上周的平均值和环比情况
  100. DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS);
  101. //获取上周的统计进出水品均值
  102. String begin = formatterDate.format(nowTime.plusDays(-7));
  103. String end = formatterDate.format(nowTime.plusDays(-1));
  104. HashMap<String, BigDecimal> lastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end);
  105. if(!Objects.isNull(lastWeek)){
  106. BigDecimal lastJSL = lastWeek.get("JSL");
  107. BigDecimal lastCSL = lastWeek.get("CSL");
  108. //获取上上周的统计进出水品均值
  109. begin = formatterDate.format(nowTime.plusDays(-14));
  110. end = formatterDate.format(nowTime.plusDays(-8));
  111. HashMap<String, BigDecimal> beforeLastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end);
  112. if(!Objects.isNull(beforeLastWeek)){
  113. BigDecimal beforeLastJSL = beforeLastWeek.get("JSL");
  114. BigDecimal beforeLastCSL = beforeLastWeek.get("CSL");
  115. if(!Objects.isNull(lastJSL)){
  116. xinyiIndustrySimple.setSzZJSAvg(lastJSL);
  117. if(!Objects.isNull(beforeLastJSL))
  118. xinyiIndustrySimple.setSzZJSHb((lastJSL.subtract(beforeLastJSL)).divide(beforeLastJSL, 4, RoundingMode.HALF_UP));
  119. }
  120. if(!Objects.isNull(lastCSL)){
  121. xinyiIndustrySimple.setSzZCSAvg(lastCSL);
  122. if(!Objects.isNull(beforeLastCSL))
  123. xinyiIndustrySimple.setSzZCSHb((lastCSL.subtract(beforeLastCSL)).divide(beforeLastCSL, 4, RoundingMode.HALF_UP));
  124. }
  125. }
  126. }
  127. return xinyiIndustrySimple;
  128. }
  129. private XinyiIndustrySimple addConfigData(XinyiIndustrySimple xinyiIndustrySimple) {
  130. //获取配置表
  131. List<TXinyiNormConfig> tXinyiNormConfigs = this.tXinyiNormConfigMapper.selectTXinyiNormConfigList(null);
  132. if(!CollectionUtils.isEmpty(tXinyiNormConfigs)){
  133. TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0);
  134. BeanUtils.copyProperties(normConfig, xinyiIndustrySimple);
  135. }
  136. return xinyiIndustrySimple;
  137. }
  138. private XinyiIndustrySimple addDailyData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowDate) {
  139. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS);
  140. String nowDateStr = nowDate.format(formatter);
  141. String yesterdayStr = nowDate.plusDays(-1).format(formatter);//昨天
  142. String beforeYesterdayStr = nowDate.plusDays(-2).format(formatter);//前天
  143. List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(nowDateStr).build());
  144. if(!CollectionUtils.isEmpty(tXinyiDailies)){
  145. TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
  146. BeanUtils.copyProperties(tXinyiDaily, xinyiIndustrySimple);
  147. }
  148. //昨日数据
  149. List<TXinyiDaily> tXinyiDailiesYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(yesterdayStr).build());
  150. if(!CollectionUtils.isEmpty(tXinyiDailiesYesterday)){
  151. TXinyiDaily tXinyiDailyYesterday = tXinyiDailiesYesterday.get(0);
  152. BigDecimal zrJsl = tXinyiDailyYesterday.getJSL();
  153. xinyiIndustrySimple.setZrZJSL(zrJsl);
  154. BigDecimal zrCsl = tXinyiDailyYesterday.getCSL();
  155. xinyiIndustrySimple.setZrZCSL(zrCsl);
  156. //有可能今日获取不到日报数据,相关信息从昨天获取
  157. if(CollectionUtils.isEmpty(tXinyiDailies))
  158. BeanUtils.copyProperties(tXinyiDailyYesterday, xinyiIndustrySimple);
  159. //获取前日数据 并计算环比
  160. List<TXinyiDaily> tXinyiDailiesBeforeYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(beforeYesterdayStr).build());
  161. if(!CollectionUtils.isEmpty(tXinyiDailiesBeforeYesterday)){
  162. TXinyiDaily tXinyiDailyBeforeYesterday = tXinyiDailiesBeforeYesterday.get(0);
  163. BigDecimal qrZJSL = tXinyiDailyBeforeYesterday.getJSL();
  164. if(!Objects.isNull(qrZJSL) && !Objects.isNull(zrJsl))
  165. xinyiIndustrySimple.setZrZJsHb((zrJsl.subtract(qrZJSL)).divide(qrZJSL, 4, RoundingMode.HALF_UP));
  166. BigDecimal qrZCSL = tXinyiDailyBeforeYesterday.getCSL();
  167. if(!Objects.isNull(qrZCSL) && !Objects.isNull(zrCsl))
  168. xinyiIndustrySimple.setZrZCsHb((zrCsl.subtract(qrZCSL)).divide(qrZCSL, 4, RoundingMode.HALF_UP));
  169. }
  170. }
  171. return xinyiIndustrySimple;
  172. }
  173. private XinyiIndustrySimple getRealTimeData(String[] queryTags, LocalDateTime nowTime) {
  174. AtomicReference<XinyiIndustrySimple> result = new AtomicReference<>();
  175. /*String time = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate());
  176. time = time + ":00:00";*/
  177. DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS);
  178. //获取当前的时间
  179. LocalDateTime beginTime = nowTime.plusMinutes(-1);
  180. //调用工业库接口
  181. String url = "http://10.0.0.27:4568/api/v1/khquerydata";
  182. HashMap<String, Object> req = new HashMap<>();
  183. req.put("tagNames", queryTags);
  184. req.put("startTime", formatter.format(beginTime));
  185. req.put("endTime", formatter.format(nowTime));
  186. req.put("recordNumbers", 100000);
  187. String body = HttpRequest.post(url).header("Authorization", "c2E6c2E=").header("clientName", "hongshan").body(JSON.toJSONString(req)).execute().body();
  188. // System.out.println("body = " + body);
  189. List<HashMap<String, String>> list = new ArrayList<>();
  190. //行转列数据处理
  191. for (String queryTag : queryTags) {
  192. JSONArray array = JSON.parseObject(body).getJSONArray(queryTag);
  193. //特殊数据处理一
  194. if(Objects.isNull(array) || array.isEmpty()){
  195. System.out.println(queryTag + "查询到了空的数据,跳过本次循环");
  196. continue;
  197. }
  198. int size = array.size();
  199. //特殊数据处理二
  200. if("0".equals(array.get(1) + "")){
  201. System.out.println(queryTag + "查询到了数据,但是数据集合只有一条,且都是0");
  202. continue;
  203. }
  204. //存放的数据集
  205. //利用map去重
  206. HashMap<String, String> map = new LinkedHashMap<>();
  207. for (int i = 2; i < size; i++) {
  208. // System.out.println(i + "" + array.get(i));
  209. JSONArray oneRecord = JSON.parseArray(JSON.toJSONString(array.get(i)));
  210. //处理为空或者为0的数据
  211. Object timeStampValue = oneRecord.get(2);
  212. if(Objects.isNull(timeStampValue) || "0".equals(timeStampValue + ""))
  213. continue;
  214. BigDecimal value = Objects.isNull(oneRecord.get(0)) ? null : new BigDecimal(oneRecord.get(0) + "");
  215. long timestamp = (long) timeStampValue;
  216. String format = DateUtil.format(new Date(timestamp), DateUtils.YYYYMMDDHH_TS);
  217. map.put(format, queryTag + "-" + value);
  218. }
  219. list.add(map);
  220. }
  221. Set<String> recordTimeSet = new HashSet<>();
  222. Map<String, XinyiIndustrySimple> recordMap = new HashMap<>();
  223. for (int i = 0; i < list.size(); i++) {
  224. HashMap<String, String> map = list.get(i);
  225. int finalJ = i;
  226. map.forEach((k, v) ->{
  227. XinyiIndustrySimple xinyiIndustrySimple = null;
  228. if(!recordTimeSet.contains(k)){//第一次
  229. xinyiIndustrySimple = new XinyiIndustrySimple();
  230. recordTimeSet.add(k);
  231. recordMap.put(k, xinyiIndustrySimple);
  232. }else{
  233. xinyiIndustrySimple = recordMap.get(k);
  234. }
  235. xinyiIndustrySimple.setTestTime(k);
  236. //解析值
  237. String[] split = v.split("-");
  238. String type = split[0];
  239. BigDecimal value = new BigDecimal(split[1]);
  240. if ("信义污水厂JS_COD_Value".equals(type)) {
  241. xinyiIndustrySimple.setJsCod(value);
  242. } else if ("信义污水厂JS_PH_Value".equals(type)) {
  243. xinyiIndustrySimple.setJsPh(value);
  244. } else if ("信义污水厂JS_SS_Value".equals(type)) {
  245. xinyiIndustrySimple.setJsSs(value);
  246. } else if ("信义污水厂JS_ZL_Value".equals(type)) {
  247. xinyiIndustrySimple.setJsTp(value);
  248. } else if ("信义污水厂JS_ZA_Value".equals(type)) {
  249. xinyiIndustrySimple.setJsTn(value);
  250. } else if ("信义污水厂JS_AD_Value".equals(type)) {
  251. xinyiIndustrySimple.setJsNh3(value);
  252. } else if ("信义污水厂出水瞬时流量".equals(type)) {
  253. xinyiIndustrySimple.setCsSlqc(value);
  254. } else if ("信义污水厂升级出水COD".equals(type)) {
  255. xinyiIndustrySimple.setCsCod(value);
  256. } else if ("信义污水厂升级出水PH".equals(type)) {
  257. xinyiIndustrySimple.setCsPh(value);
  258. } else if ("信义污水厂升级出水SS".equals(type)) {
  259. xinyiIndustrySimple.setCsSs(value);
  260. } else if ("信义污水厂升级出水TN".equals(type)) {
  261. xinyiIndustrySimple.setCsTn(value);
  262. } else if ("信义污水厂升级出水TP".equals(type)) {
  263. xinyiIndustrySimple.setCsTp(value);
  264. } else if ("信义污水厂升级出水氨氮".equals(type)) {
  265. xinyiIndustrySimple.setCsNh3(value);
  266. } else if ("信义污水厂FT101_Value".equals(type)) {
  267. xinyiIndustrySimple.setJsSlq(value);
  268. }
  269. //只有最后一次才执行数据库添加
  270. if(finalJ == list.size()-1){
  271. //赋值完毕返回数据
  272. result.set(xinyiIndustrySimple);
  273. }
  274. });
  275. }
  276. return Objects.isNull(result) ? new XinyiIndustrySimple() : result.get();
  277. }
  278. public static void main(String[] args) {
  279. String s = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate());
  280. s = s + ":00:00";
  281. System.out.println("s = " + s);
  282. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  283. LocalDateTime endTime = LocalDateTime.now();
  284. LocalDateTime begin = endTime.plusMinutes(-1);
  285. System.out.println(formatter.format(endTime));
  286. System.out.println(formatter.format(begin));
  287. }
  288. }