123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- 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<String> warningCount() {
- ArrayList<String> 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<TXinyiWarningRecord> homeWarningList() {
- return this.xinyiWarningRecordMapper.homeWarningList();
- }
- @Override
- public List<TXinyiRecommendQa> recommendQAList(Integer type) {
- return this.xinyiRecommendQaMapper.selectTXinyiRecommendQaList(TXinyiRecommendQa.builder().type(type).build());
- }
- @Override
- public TXinyiChatRecord qaDetailByWarningId(String warningId) {
- List<TXinyiChatRecord> 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<TXinyiIndustry> 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<String, BigDecimal> 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<String, BigDecimal> 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<TXinyiNormConfig> 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<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(nowDateStr).build());
- if(!CollectionUtils.isEmpty(tXinyiDailies)){
- TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
- BeanUtils.copyProperties(tXinyiDaily, xinyiIndustrySimple);
- }
- //昨日数据
- List<TXinyiDaily> 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<TXinyiDaily> 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<XinyiIndustrySimple> 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<String, Object> 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<HashMap<String, String>> 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<String, String> 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<String> recordTimeSet = new HashSet<>();
- Map<String, XinyiIndustrySimple> recordMap = new HashMap<>();
- for (int i = 0; i < list.size(); i++) {
- HashMap<String, String> 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));
- }
- }
|