FrontServiceImpl.java 18 KB

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