package com.slibra.business.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.slibra.business.domain.*; import com.slibra.business.mapper.*; import com.slibra.business.req.ChatReq; import com.slibra.business.res.XinyiIndustrySimple; import com.slibra.business.service.IFrontService; import com.slibra.common.exception.ServiceException; import com.slibra.common.utils.DateUtils; import com.slibra.common.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import static com.slibra.common.constant.MyConstants.FORECAST_WARNING_TEMPLATE; import static com.slibra.common.constant.MyConstants.WARNING_TEMPLATE; @Service @Slf4j public class FrontServiceImpl implements IFrontService { @Autowired private TXinyiIndustryMapper xinyiIndustryMapper; @Autowired private TXinyiDailyMapper xinyiDailyMapper; @Autowired private TXinyiNormConfigMapper tXinyiNormConfigMapper; @Autowired private TXinyiWarningRecordMapper xinyiWarningRecordMapper; @Autowired private TXinyiRecommendQaMapper xinyiRecommendQaMapper; @Autowired private TXinyiChatRecordMapper xinyiChatRecordMapper; @Override public XinyiIndustrySimple countInfo() { //查询基本的工业库数据 XinyiIndustrySimple xinyiIndustrySimple = new XinyiIndustrySimple(); LocalDateTime nowTime = LocalDateTime.now(); //调用接口查询指标 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", "信义污水厂出水瞬时流量"}; xinyiIndustrySimple = this.getRealTimeData(queryTags, nowTime); //处理日报数据 this.addDailyData(xinyiIndustrySimple, nowTime); //处理配置信息 this.addConfigData(xinyiIndustrySimple); //计算 this.calculateData(xinyiIndustrySimple, nowTime); //当前的小事数 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_CHINESE); xinyiIndustrySimple.setTestHour(formatter.format(nowTime) + ":00");//只要小时 但是要后面的:00 return xinyiIndustrySimple; } @Override public List warningCount() { ArrayList result = new ArrayList<>(); //获取告警的统计数量 int count = this.xinyiWarningRecordMapper.getWarningCountByType(1); if(count > 0)//2024年5月26日19:01:39 有告警记录再返回 result.add(WARNING_TEMPLATE.replace("#", String.valueOf(count))); //获取报警警的统计数量 count = this.xinyiWarningRecordMapper.getWarningCountByType(2); if(count > 0)//2024年5月26日19:01:39 有告警记录再返回 result.add(FORECAST_WARNING_TEMPLATE.replace("#", String.valueOf(count))); return result; } @Override public List homeWarningList() { return this.xinyiWarningRecordMapper.homeWarningList(); } @Override public List recommendQAList(Integer type) { return this.xinyiRecommendQaMapper.selectTXinyiRecommendQaList(TXinyiRecommendQa.builder().type(type).build()); } @Override public TXinyiChatRecord qaDetailByWarningId(String warningId) { List tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).build()); return CollectionUtils.isEmpty(tXinyiChatRecords) ? null : tXinyiChatRecords.get(0); } @Override public String isSatisfiedAnswer(ChatReq chatReq) { Long id = chatReq.getId(); Integer isSatisfied = chatReq.getIsSatisfied(); if(Objects.isNull(id) || Objects.isNull(isSatisfied)) throw new ServiceException("请输入正确的参数"); TXinyiChatRecord tXinyiChatRecord = this.xinyiChatRecordMapper.selectTXinyiChatRecordById(id); if(!Objects.isNull(tXinyiChatRecord)){ tXinyiChatRecord.setIsSatisfied(isSatisfied); tXinyiChatRecord.setUpdateBy(SecurityUtils.getUsername()); tXinyiChatRecord.setUpdateTime(DateUtils.getNowDate()); this.xinyiChatRecordMapper.updateTXinyiChatRecord(tXinyiChatRecord); } return "操作成功"; } @Override public String handleWarningByMan(TXinyiWarningRecord warningRecordReq) { Long id = warningRecordReq.getId(); if(Objects.isNull(id)) throw new ServiceException("请输入告警记录id"); TXinyiWarningRecord tXinyiWarningRecord = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordById(id); if(Objects.isNull(tXinyiWarningRecord)) throw new ServiceException("请输入正确的告警记录id"); warningRecordReq.setUpdateBy(SecurityUtils.getUsername()); warningRecordReq.setUpdateTime(DateUtils.getNowDate()); xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordReq); return "操作成功"; } private XinyiIndustrySimple calculateData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowTime) { LocalDateTime yesterdaySameTime = nowTime.plusDays(-1); DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_TS); String testTime = formatter.format(yesterdaySameTime); //处理昨日同时期的进水 获取环比 List tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testTime(testTime).build()); if(!CollectionUtils.isEmpty(tXinyiIndustries)){ TXinyiIndustry industry = tXinyiIndustries.get(0); BigDecimal jsSlqYesterday = industry.getJsSlq(); BigDecimal csSlqcYesterday = industry.getCsSlqc(); BigDecimal jsSlqToday = xinyiIndustrySimple.getJsSlq(); BigDecimal csSlqcToday = xinyiIndustrySimple.getCsSlqc(); if(!Objects.isNull(jsSlqYesterday) && !Objects.isNull(jsSlqToday)) xinyiIndustrySimple.setSsJsHb((jsSlqToday.subtract(jsSlqYesterday)).divide(jsSlqYesterday, 4, RoundingMode.HALF_UP)); if(!Objects.isNull(csSlqcYesterday) && !Objects.isNull(csSlqcToday)) xinyiIndustrySimple.setSsJsHb((csSlqcToday.subtract(csSlqcYesterday)).divide(csSlqcYesterday, 4, RoundingMode.HALF_UP)); } //通过sql查询上周的平均值和环比情况 DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS); //获取上周的统计进出水品均值 String begin = formatterDate.format(nowTime.plusDays(-7)); String end = formatterDate.format(nowTime.plusDays(-1)); HashMap lastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end); if(!Objects.isNull(lastWeek)){ BigDecimal lastJSL = lastWeek.get("JSL"); BigDecimal lastCSL = lastWeek.get("CSL"); //获取上上周的统计进出水品均值 begin = formatterDate.format(nowTime.plusDays(-14)); end = formatterDate.format(nowTime.plusDays(-8)); HashMap beforeLastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end); if(!Objects.isNull(beforeLastWeek)){ BigDecimal beforeLastJSL = beforeLastWeek.get("JSL"); BigDecimal beforeLastCSL = beforeLastWeek.get("CSL"); if(!Objects.isNull(lastJSL)){ xinyiIndustrySimple.setSzZJSAvg(lastJSL); if(!Objects.isNull(beforeLastJSL)) xinyiIndustrySimple.setSzZJSHb((lastJSL.subtract(beforeLastJSL)).divide(beforeLastJSL, 4, RoundingMode.HALF_UP)); } if(!Objects.isNull(lastCSL)){ xinyiIndustrySimple.setSzZCSAvg(lastCSL); if(!Objects.isNull(beforeLastCSL)) xinyiIndustrySimple.setSzZCSHb((lastCSL.subtract(beforeLastCSL)).divide(beforeLastCSL, 4, RoundingMode.HALF_UP)); } } } return xinyiIndustrySimple; } private XinyiIndustrySimple addConfigData(XinyiIndustrySimple xinyiIndustrySimple) { //获取配置表 List tXinyiNormConfigs = this.tXinyiNormConfigMapper.selectTXinyiNormConfigList(null); if(!CollectionUtils.isEmpty(tXinyiNormConfigs)){ TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0); BeanUtils.copyProperties(normConfig, xinyiIndustrySimple); } return xinyiIndustrySimple; } private XinyiIndustrySimple addDailyData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowDate) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS); String nowDateStr = nowDate.format(formatter); String yesterdayStr = nowDate.plusDays(-1).format(formatter);//昨天 String beforeYesterdayStr = nowDate.plusDays(-2).format(formatter);//前天 List tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(nowDateStr).build()); if(!CollectionUtils.isEmpty(tXinyiDailies)){ TXinyiDaily tXinyiDaily = tXinyiDailies.get(0); BeanUtils.copyProperties(tXinyiDaily, xinyiIndustrySimple); } //昨日数据 List tXinyiDailiesYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(yesterdayStr).build()); if(!CollectionUtils.isEmpty(tXinyiDailiesYesterday)){ TXinyiDaily tXinyiDailyYesterday = tXinyiDailiesYesterday.get(0); BigDecimal zrJsl = tXinyiDailyYesterday.getJSL(); xinyiIndustrySimple.setZrZJSL(zrJsl); BigDecimal zrCsl = tXinyiDailyYesterday.getCSL(); xinyiIndustrySimple.setZrZCSL(zrCsl); //有可能今日获取不到日报数据,相关信息从昨天获取 if(CollectionUtils.isEmpty(tXinyiDailies)) BeanUtils.copyProperties(tXinyiDailyYesterday, xinyiIndustrySimple); //获取前日数据 并计算环比 List tXinyiDailiesBeforeYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(beforeYesterdayStr).build()); if(!CollectionUtils.isEmpty(tXinyiDailiesBeforeYesterday)){ TXinyiDaily tXinyiDailyBeforeYesterday = tXinyiDailiesBeforeYesterday.get(0); BigDecimal qrZJSL = tXinyiDailyBeforeYesterday.getJSL(); if(!Objects.isNull(qrZJSL) && !Objects.isNull(zrJsl)) xinyiIndustrySimple.setZrZJsHb((zrJsl.subtract(qrZJSL)).divide(qrZJSL, 4, RoundingMode.HALF_UP)); BigDecimal qrZCSL = tXinyiDailyBeforeYesterday.getCSL(); if(!Objects.isNull(qrZCSL) && !Objects.isNull(zrCsl)) xinyiIndustrySimple.setZrZCsHb((zrCsl.subtract(qrZCSL)).divide(qrZCSL, 4, RoundingMode.HALF_UP)); } } return xinyiIndustrySimple; } private XinyiIndustrySimple getRealTimeData(String[] queryTags, LocalDateTime nowTime) { AtomicReference result = new AtomicReference<>(); /*String time = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate()); time = time + ":00:00";*/ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS); //获取当前的时间 LocalDateTime beginTime = nowTime.plusMinutes(-1); //调用工业库接口 String url = "http://10.0.0.27:4568/api/v1/khquerydata"; HashMap req = new HashMap<>(); req.put("tagNames", queryTags); req.put("startTime", formatter.format(beginTime)); req.put("endTime", formatter.format(nowTime)); req.put("recordNumbers", 100000); String body = HttpRequest.post(url).header("Authorization", "c2E6c2E=").header("clientName", "hongshan").body(JSON.toJSONString(req)).execute().body(); // System.out.println("body = " + body); List> list = new ArrayList<>(); //行转列数据处理 for (String queryTag : queryTags) { JSONArray array = JSON.parseObject(body).getJSONArray(queryTag); //特殊数据处理一 if(Objects.isNull(array) || array.isEmpty()){ System.out.println(queryTag + "查询到了空的数据,跳过本次循环"); continue; } int size = array.size(); //特殊数据处理二 if("0".equals(array.get(1) + "")){ System.out.println(queryTag + "查询到了数据,但是数据集合只有一条,且都是0"); continue; } //存放的数据集 //利用map去重 HashMap map = new LinkedHashMap<>(); for (int i = 2; i < size; i++) { // System.out.println(i + "" + array.get(i)); JSONArray oneRecord = JSON.parseArray(JSON.toJSONString(array.get(i))); //处理为空或者为0的数据 Object timeStampValue = oneRecord.get(2); if(Objects.isNull(timeStampValue) || "0".equals(timeStampValue + "")) continue; BigDecimal value = Objects.isNull(oneRecord.get(0)) ? null : new BigDecimal(oneRecord.get(0) + ""); long timestamp = (long) timeStampValue; String format = DateUtil.format(new Date(timestamp), DateUtils.YYYYMMDDHH_TS); map.put(format, queryTag + "-" + value); } list.add(map); } Set recordTimeSet = new HashSet<>(); Map recordMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { HashMap map = list.get(i); int finalJ = i; map.forEach((k, v) ->{ XinyiIndustrySimple xinyiIndustrySimple = null; if(!recordTimeSet.contains(k)){//第一次 xinyiIndustrySimple = new XinyiIndustrySimple(); recordTimeSet.add(k); recordMap.put(k, xinyiIndustrySimple); }else{ xinyiIndustrySimple = recordMap.get(k); } xinyiIndustrySimple.setTestTime(k); //解析值 String[] split = v.split("-"); String type = split[0]; BigDecimal value = new BigDecimal(split[1]); if ("信义污水厂JS_COD_Value".equals(type)) { xinyiIndustrySimple.setJsCod(value); } else if ("信义污水厂JS_PH_Value".equals(type)) { xinyiIndustrySimple.setJsPh(value); } else if ("信义污水厂JS_SS_Value".equals(type)) { xinyiIndustrySimple.setJsSs(value); } else if ("信义污水厂JS_ZL_Value".equals(type)) { xinyiIndustrySimple.setJsTp(value); } else if ("信义污水厂JS_ZA_Value".equals(type)) { xinyiIndustrySimple.setJsTn(value); } else if ("信义污水厂JS_AD_Value".equals(type)) { xinyiIndustrySimple.setJsNh3(value); } else if ("信义污水厂出水瞬时流量".equals(type)) { xinyiIndustrySimple.setCsSlqc(value); } else if ("信义污水厂升级出水COD".equals(type)) { xinyiIndustrySimple.setCsCod(value); } else if ("信义污水厂升级出水PH".equals(type)) { xinyiIndustrySimple.setCsPh(value); } else if ("信义污水厂升级出水SS".equals(type)) { xinyiIndustrySimple.setCsSs(value); } else if ("信义污水厂升级出水TN".equals(type)) { xinyiIndustrySimple.setCsTn(value); } else if ("信义污水厂升级出水TP".equals(type)) { xinyiIndustrySimple.setCsTp(value); } else if ("信义污水厂升级出水氨氮".equals(type)) { xinyiIndustrySimple.setCsNh3(value); } else if ("信义污水厂FT101_Value".equals(type)) { xinyiIndustrySimple.setJsSlq(value); } //只有最后一次才执行数据库添加 if(finalJ == list.size()-1){ //赋值完毕返回数据 result.set(xinyiIndustrySimple); } }); } return Objects.isNull(result) ? new XinyiIndustrySimple() : result.get(); } public static void main(String[] args) { String s = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate()); s = s + ":00:00"; System.out.println("s = " + s); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime endTime = LocalDateTime.now(); LocalDateTime begin = endTime.plusMinutes(-1); System.out.println(formatter.format(endTime)); System.out.println(formatter.format(begin)); } }