From a6acf6d1c9689c3c4ab98ea1d2db9701ffa926e5 Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Fri, 15 Nov 2024 10:51:26 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=87=AA=E5=AE=9A=E4=B9=89=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E8=B0=83=E6=95=B4=202.=E6=9A=82=E9=99=8D?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=88=97=E8=A1=A8=E6=B7=BB=E5=8A=A0=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=8E=92=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../njcn/event/pojo/param/TransientParam.java | 4 + .../Impl/TransientServiceImpl.java | 19 +- .../pojo/param/ReportSearchParam.java | 3 + .../njcn/harmonic/pojo/po/ExcelRptTemp.java | 2 + .../controller/CustomReportController.java | 2 + .../mapper/mapping/ExcelRptTempMapper.xml | 26 +- .../harmonic/service/CustomReportService.java | 3 + .../service/impl/CustomReportServiceImpl.java | 563 ++++++++++++++++-- 8 files changed, 572 insertions(+), 50 deletions(-) diff --git a/pqs-event/event-api/src/main/java/com/njcn/event/pojo/param/TransientParam.java b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/param/TransientParam.java index a5efc6e90..3baf8752d 100644 --- a/pqs-event/event-api/src/main/java/com/njcn/event/pojo/param/TransientParam.java +++ b/pqs-event/event-api/src/main/java/com/njcn/event/pojo/param/TransientParam.java @@ -64,5 +64,9 @@ public class TransientParam extends DeviceInfoParam.BusinessParam { @ApiModelProperty("在线离线 0:在线 1:离线") private Integer isType; + + private String sortBy; + + private String orderBy; } diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java index 77ad329cd..3f80a6f30 100644 --- a/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java +++ b/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java @@ -301,8 +301,23 @@ public class TransientServiceImpl implements TransientService { // 事件 .in(CollUtil.isNotEmpty(transientParam.getWaveType()), RmpEventDetailPO::getEventType, transientParam.getWaveType()) .in(CollUtil.isNotEmpty(transientParam.getEventReason()), RmpEventDetailPO::getAdvanceReason, transientParam.getEventReason()) - .in(CollUtil.isNotEmpty(transientParam.getEventType()), RmpEventDetailPO::getAdvanceType, transientParam.getEventType()) - .orderByDesc(RmpEventDetailPO::getStartTime); + .in(CollUtil.isNotEmpty(transientParam.getEventType()), RmpEventDetailPO::getAdvanceType, transientParam.getEventType()); + + + if(StrUtil.isNotBlank(transientParam.getOrderBy())){ + if(transientParam.getSortBy().equals("start_time")){ + wrapper.orderBy(true,transientParam.getOrderBy().equals("asc"),RmpEventDetailPO::getStartTime); + }else if(transientParam.getSortBy().equals("feature_amplitude")){ + wrapper.orderBy(true,transientParam.getOrderBy().equals("asc"),RmpEventDetailPO::getFeatureAmplitude); + }else if(transientParam.getSortBy().equals("firstMs")){ + wrapper.orderBy(true,transientParam.getOrderBy().equals("asc"),RmpEventDetailPO::getFirstMs); + }else if(transientParam.getSortBy().equals("duration")){ + wrapper.orderBy(true,transientParam.getOrderBy().equals("asc"),RmpEventDetailPO::getDuration); + } + }else { + wrapper.orderByDesc(RmpEventDetailPO::getStartTime); + } + //暂态幅值 if (Objects.nonNull(transientParam.getEventValueMin())) { wrapper.ge(RmpEventDetailPO::getFeatureAmplitude, transientParam.getEventValueMin()); diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/ReportSearchParam.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/ReportSearchParam.java index ada22d759..3e03eb773 100644 --- a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/ReportSearchParam.java +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/ReportSearchParam.java @@ -36,4 +36,7 @@ public class ReportSearchParam { //目前用于区分不同系统资源,null默认 1.无线系统,配合cs-device private Integer resourceType; + //浙江无线报表特殊标识 null为通用报表 1.浙江无线报表 + private Integer customType; + } diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/po/ExcelRptTemp.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/po/ExcelRptTemp.java index 5afdfaceb..fc388204a 100644 --- a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/po/ExcelRptTemp.java +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/po/ExcelRptTemp.java @@ -32,4 +32,6 @@ public class ExcelRptTemp extends BaseEntity { private String reportForm; + private Integer sort; + } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/CustomReportController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/CustomReportController.java index bee939d66..a09fd8e48 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/CustomReportController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/CustomReportController.java @@ -266,4 +266,6 @@ public class CustomReportController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, res, methodDescribe); } + + } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/ExcelRptTempMapper.xml b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/ExcelRptTempMapper.xml index bb0a0bc59..78f59a82f 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/ExcelRptTempMapper.xml +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/ExcelRptTempMapper.xml @@ -42,19 +42,21 @@ diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/CustomReportService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/CustomReportService.java index 815d5ea6d..2214dda4e 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/CustomReportService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/CustomReportService.java @@ -118,4 +118,7 @@ public interface CustomReportService { List getTemplateByDept(String id); void viewCustomReportTemplateById(String id, HttpServletResponse response); + + + } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java index 6f069e95c..f28021fb1 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/CustomReportServiceImpl.java @@ -1,8 +1,11 @@ package com.njcn.harmonic.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.StrBuilder; import cn.hutool.core.text.StrPool; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; @@ -13,6 +16,8 @@ import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.utils.FileUtil; import com.njcn.csdevice.api.CsCommTerminalFeignClient; +import com.njcn.csdevice.api.WlRecordFeignClient; +import com.njcn.csdevice.pojo.po.WlRecord; import com.njcn.device.biz.commApi.CommTerminalGeneralClient; import com.njcn.device.pq.api.DeptLineFeignClient; import com.njcn.device.pq.api.DeviceUnitClient; @@ -62,10 +67,12 @@ import sun.reflect.generics.tree.Tree; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -103,6 +110,8 @@ public class CustomReportServiceImpl implements CustomReportService { private final CsCommTerminalFeignClient csCommTerminalFeignClient; + private final WlRecordFeignClient wlRecordFeignClient; + @Override public boolean addCustomReportTemplate(ReportTemplateParam reportTemplateParam) { checkName(reportTemplateParam, false); @@ -206,6 +215,7 @@ public class CustomReportServiceImpl implements CustomReportService { } + @Override public List getTemplateList(ReportSearchParam reportSearchParam) { return excelRptTempMapper.getReportTemplateList(reportSearchParam); @@ -241,10 +251,18 @@ public class CustomReportServiceImpl implements CustomReportService { if (Objects.isNull(excelRptTemp)) { throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_ACTIVE); } - analyzeReport(reportSearchParam, excelRptTemp, response); + if(Objects.isNull(reportSearchParam.getCustomType())){ + //通用报表 + analyzeReport(reportSearchParam, excelRptTemp, response); + }else { + //浙江无线报表 + analyzeReportZhejiang(reportSearchParam, excelRptTemp, response); + } } + + @Override public List reportChooseTree() { DictData dic = dicDataFeignClient.getDicDataByNameAndTypeName(DicDataTypeEnum.CS_DATA_TYPE.getName(), DicDataEnum.EPD.getName()).getData(); @@ -428,10 +446,10 @@ public class CustomReportServiceImpl implements CustomReportService { */ private Map unitMap(ReportSearchParam reportSearchParam) { PqsDeviceUnit deviceUnit; - if(Objects.isNull(reportSearchParam.getResourceType())){ + if (Objects.isNull(reportSearchParam.getResourceType())) { deviceUnit = commTerminalGeneralClient.lineUnitDetail(reportSearchParam.getLineId()).getData(); - }else { - deviceUnit = csCommTerminalFeignClient.lineUnitDetail(reportSearchParam.getLineId()).getData(); + } else { + deviceUnit = csCommTerminalFeignClient.lineUnitDetail(reportSearchParam.getLineId()).getData(); } List dictData = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEVICE_UNIT.getCode()).getData(); Map unit = new HashMap<>(); @@ -657,27 +675,21 @@ public class CustomReportServiceImpl implements CustomReportService { //处理指标是否合格 - reportLimitList = reportLimitList.stream() - .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ReportTemplateDTO::getItemName))), ArrayList::new)); - + reportLimitList = new LinkedHashSet<>(reportLimitList).stream().sorted(Comparator.comparing(ReportTemplateDTO::getItemName)).collect(Collectors.toList()); Map limitMap = overLimitDeal(reportLimitList, reportSearchParam); //存放限值指标的map Map limitTargetMapX = reportLimitList.stream().collect(Collectors.toMap(ReportTemplateDTO::getItemName, Function.identity())); List endList = new ArrayList<>(); if (CollUtil.isNotEmpty(reportTemplateDTOList)) { - //开始组织sql - reportTemplateDTOList = reportTemplateDTOList.stream() - .collect(Collectors.collectingAndThen(Collectors.toCollection( - () -> new TreeSet<>(Comparator.comparing(ReportTemplateDTO::getItemName))), ArrayList::new)); - + reportTemplateDTOList = new LinkedHashSet<>(reportTemplateDTOList).stream().sorted(Comparator.comparing(ReportTemplateDTO::getItemName)).collect(Collectors.toList()); Map> classMap = reportTemplateDTOList.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getResourceId)); + //定义存放越限指标的map Map assNoPassMap = new HashMap<>(); long deal = System.currentTimeMillis(); classMap.forEach((classKey, templateValue) -> { Map> valueTypeMap = templateValue.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getStatMethod)); - //avg.max,min,cp95 valueTypeMap.forEach((valueTypeKey, valueTypeVal) -> { @@ -699,28 +711,8 @@ public class CustomReportServiceImpl implements CustomReportService { }); - //处理合格率 - assNoPassMap.forEach((key, val) -> { - limitTargetMapX.remove(key); - if ("Voltage_Dev".equals(val.getTemplateName()) || "Freq_Dev".equals(val.getTemplateName())) { - val.setValue("±" + val.getValue()); - } - if (val.getOverLimitFlag() == 1) { - val.setValue("不合格 (" + val.getValue() + ")"); - } else { - val.setValue("合格 (" + val.getValue() + ")"); - } - endList.add(val); - }); - - limitTargetMapX.forEach((key, val) -> { - if (Objects.isNull(val.getOverLimitFlag())) { - val.setValue("/"); - } else { - val.setValue("合格"); - } - endList.add(val); - }); + //处理指标最终判定合格还是不合格 + dealTargetResult(assNoPassMap,limitTargetMapX,endList); long dealEnd = System.currentTimeMillis(); System.out.println("模板解析时间:" + (temEnd - begin) / 1000 + "S"); @@ -744,7 +736,6 @@ public class CustomReportServiceImpl implements CustomReportService { //2、把itemName的value赋给v和m - jsonArray.forEach(item -> { JSONObject jsonObject = (JSONObject) item; JSONArray itemArr = (JSONArray) jsonObject.get("celldata"); @@ -958,6 +949,506 @@ public class CustomReportServiceImpl implements CustomReportService { } } + + private void analyzeReportZhejiang(ReportSearchParam reportSearchParam, ExcelRptTemp excelRptTemp, HttpServletResponse response) { + + //指标 + List reportTemplateDTOList = new ArrayList<>(); + //限值 + List reportLimitList = new ArrayList<>(); + //台账 + List terminalList = new ArrayList<>(); + JSONArray jsonArray; + try (InputStream fileStream = fileStorageUtil.getFileStream(excelRptTemp.getContent())) { + jsonArray = new JSONArray(new JSONTokener(fileStream, new JSONConfig())); + parseTemplateZhejiang(jsonArray, reportTemplateDTOList, reportLimitList, terminalList); + } catch (Exception e) { + throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON); + } + + + long temEnd = System.currentTimeMillis(); + + + //处理指标是否合格 + reportLimitList = new LinkedHashSet<>(reportLimitList) + .stream() + .sorted(Comparator.comparing(ReportTemplateDTO::getItemName)) + .collect(Collectors.toList()); + + Map limitMap = overLimitDeal(reportLimitList, reportSearchParam); + //存放限值指标的map + Map limitTargetMapX = reportLimitList.stream().collect(Collectors.toMap(ReportTemplateDTO::getItemName, Function.identity())); + + List endList = new ArrayList<>(); + if (CollUtil.isNotEmpty(reportTemplateDTOList)) { + + //组装最后监测点条件 + List wlRecordList = wlRecordFeignClient.getWlAssByWlId(reportSearchParam.getLineId()).getData(); + if (CollUtil.isEmpty(wlRecordList)) { + throw new BusinessException("当前测试项无测试数据"); + } + + //开始组织sql + reportTemplateDTOList = new LinkedHashSet<>(reportTemplateDTOList) + .stream() + .sorted(Comparator.comparing(ReportTemplateDTO::getItemName)) + .collect(Collectors.toList()); + + + Map> classMap = reportTemplateDTOList.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getResourceId)); + Map assNoPassMap = new HashMap<>(); + long deal = System.currentTimeMillis(); + classMap.forEach((classKey, templateValue) -> { + Map> valueTypeMap = templateValue.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getStatMethod)); + + //avg.max,min,cp95 + valueTypeMap.forEach((valueTypeKey, valueTypeVal) -> { + + //相别分组 + Map> phaseMap = valueTypeVal.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getPhase)); + phaseMap.forEach((phaseKey, phaseVal) -> { + StringBuilder sql = new StringBuilder(InfluxDbSqlConstant.SELECT); + if (InfluxDbSqlConstant.MAX.equalsIgnoreCase(valueTypeKey)) { + assSqlZhejiang(phaseVal, sql, endList, InfluxDbSqlConstant.MAX, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap, wlRecordList); + } else if (InfluxDbSqlConstant.MIN.equalsIgnoreCase(valueTypeKey)) { + assSqlZhejiang(phaseVal, sql, endList, InfluxDbSqlConstant.MIN, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap, wlRecordList); + } else if (InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(valueTypeKey)) { + assSqlZhejiang(phaseVal, sql, endList, InfluxDbSqlConstant.AVG, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap, wlRecordList); + } else if (InfluxDbSqlConstant.CP95.equalsIgnoreCase(valueTypeKey)) { + assSqlZhejiang(phaseVal, sql, endList, InfluxDbSqlConstant.PERCENTILE, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap, wlRecordList); + } + }); + }); + + }); + + //处理指标最终判定合格还是不合格 + dealTargetResult(assNoPassMap,limitTargetMapX,endList); + + long dealEnd = System.currentTimeMillis(); + System.out.println("查询数据库花费时间" + (dealEnd - deal) / 1000 + "S"); + } + + + if (CollUtil.isNotEmpty(endList)) { + long jie = System.currentTimeMillis(); + //数据单位信息 + Map unit = unitMap(reportSearchParam); + //进行反向赋值到模板 + //1、根据itemName分组 + Map> assMap = endList.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getItemName)); + //处理台账信息 + /*Map terminalMap = null; + if (CollUtil.isNotEmpty(terminalList)) { + terminalMap = commTerminalGeneralClient.getCustomDetailByLineId(reportSearchParam.getLineId()).getData(); + } + Map finalTerminalMap = terminalMap;*/ + + + //2、把itemName的value赋给v和m + dealExcelResult(jsonArray,assMap,unit); + long jieEnd = System.currentTimeMillis(); + + System.out.println("组装信息耗时 " + (jieEnd - jie) / 1000 + "S"); + } + + + long daochu = System.currentTimeMillis(); + //导出自定义报表 + downReport(jsonArray, response); + long daochuEnd = System.currentTimeMillis(); + System.out.println("导出耗时 " + (daochuEnd - daochu) / 1000 + "S"); + + } + + + private void assSqlZhejiang(List data, StringBuilder sql, List endList, String method, ReportSearchParam reportSearchParam, Map limitMap, Map overLimitMap, Map assNoPassMap, List wlRecordList) { + //sql拼接示例:select MAX(IHA2) as IHA2 from power_quality_data where Phase = 'A' and LineId='1324564568' and Stat_Method='max' tz('Asia/Shanghai') + //cp95函数特殊处理 PERCENTILE(field_key, N) + if (InfluxDbSqlConstant.PERCENTILE.equals(method)) { + for (int i = 0; i < data.size(); i++) { + if (i == data.size() - 1) { + sql.append(InfluxDbSqlConstant.PERCENTILE) + .append(InfluxDbSqlConstant.LBK) + .append(data.get(i).getTemplateName()).append(InfluxDbSqlConstant.NUM_95) + .append(InfluxDbSqlConstant.RBK) + .append(InfluxDbSqlConstant.AS).append(InfluxDbSqlConstant.DQM) + .append(data.get(i).getItemName()).append(InfluxDbSqlConstant.DQM); + } else { + sql.append(InfluxDbSqlConstant.PERCENTILE) + .append(InfluxDbSqlConstant.LBK) + .append(data.get(i).getTemplateName()).append(InfluxDbSqlConstant.NUM_95) + .append(InfluxDbSqlConstant.RBK) + .append(InfluxDbSqlConstant.AS).append(InfluxDbSqlConstant.DQM) + .append(data.get(i).getItemName()).append(InfluxDbSqlConstant.DQM).append(StrUtil.COMMA); + } + } + } else { + for (int i = 0; i < data.size(); i++) { + if (i == data.size() - 1) { + sql.append(method) + .append(InfluxDbSqlConstant.LBK) + .append(data.get(i).getTemplateName()) + .append(InfluxDbSqlConstant.RBK) + .append(InfluxDbSqlConstant.AS).append(InfluxDbSqlConstant.DQM) + .append(data.get(i).getItemName()).append(InfluxDbSqlConstant.DQM); + } else { + sql.append(method) + .append(InfluxDbSqlConstant.LBK) + .append(data.get(i).getTemplateName()) + .append(InfluxDbSqlConstant.RBK) + .append(InfluxDbSqlConstant.AS).append(InfluxDbSqlConstant.DQM) + .append(data.get(i).getItemName()).append(InfluxDbSqlConstant.DQM).append(StrUtil.COMMA); + } + } + + } + + sql.append(StrPool.C_SPACE).append(InfluxDbSqlConstant.FROM).append("pqd_data"); + //相别特殊处理 + sql.append(InfluxDbSqlConstant.WHERE) + .append(InfluxDBTableConstant.PHASIC_TYPE) + .append(InfluxDbSqlConstant.EQ) + .append(InfluxDbSqlConstant.QM) + .append(data.get(0).getPhase()) + .append(InfluxDbSqlConstant.QM); + + //data_flicker、data_fluc、data_plt 无 value_type + sql.append(InfluxDbSqlConstant.AND) + .append(InfluxDBTableConstant.VALUE_TYPE) + .append(InfluxDbSqlConstant.EQ) + .append(InfluxDbSqlConstant.QM) + .append(data.get(0).getStatMethod().toLowerCase()) + .append(InfluxDbSqlConstant.QM); + + List> allList = new ArrayList<>(); + for (WlRecord wlRecord : wlRecordList) { + StringBuilder temSql = new StringBuilder(sql); + String start = LocalDateTimeUtil.format(wlRecord.getStartTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)); + String end = LocalDateTimeUtil.format(wlRecord.getEndTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)); + temSql.append(" and line_id = '").append(wlRecord.getLineId()).append(InfluxDbSqlConstant.QM) + .append(InfluxDbSqlConstant.AND) + .append(InfluxDbSqlConstant.TIME).append(InfluxDbSqlConstant.GE).append(InfluxDbSqlConstant.QM).append(start).append(InfluxDbSqlConstant.QM) + .append(InfluxDbSqlConstant.AND) + .append(InfluxDbSqlConstant.TIME).append(InfluxDbSqlConstant.LT).append(InfluxDbSqlConstant.QM).append(end).append(InfluxDbSqlConstant.QM) + .append(InfluxDbSqlConstant.TZ); + + List> temMapList = influxDbUtils.getMapResult(temSql.toString()); + if (CollUtil.isNotEmpty(temMapList)) { + allList.add(temMapList.get(0)); + } + } + + Map resultMap = dealResultMap(method, allList); + if (resultMap.isEmpty()) { + data = data.stream().peek(item -> item.setValue("/")).collect(Collectors.toList()); + } else { + for (ReportTemplateDTO item : data) { + if (resultMap.containsKey(item.getItemName())) { + double v = (Double) resultMap.get(item.getItemName()); + item.setValue(String.format("%.3f", v)); + + + if (overLimitMap.containsKey(item.getLimitName())) { + Float tagVal = overLimitMap.get(item.getLimitName()); + if (v > tagVal) { + item.setOverLimitFlag(1); + } else { + item.setOverLimitFlag(0); + } + } + + //结论判断是否越限 + String key = item.getLimitName() + "#" + item.getStatMethod().toLowerCase() + "#pq_overlimit"; + if (limitMap.containsKey(key)) { + ReportTemplateDTO tem = limitMap.get(key); + double limitVal = Double.parseDouble(tem.getValue()); + if (v > limitVal) { + tem.setOverLimitFlag(1); + tem.setValue(tem.getValue()); + assNoPassMap.put(key, tem); + } else if (!assNoPassMap.containsKey(key)) { + tem.setOverLimitFlag(0); + tem.setValue(tem.getValue()); + assNoPassMap.put(key, tem); + } + } + } else { + item.setValue("/"); + } + } + } + + endList.addAll(data); + } + + + private Map dealResultMap(String method, List> allList) { + Map resultMap = new HashMap<>(); + // 遍历列表中的每个Map + if (method.equals(InfluxDbSqlConstant.MIN)) { + for (Map map : allList) { + // 遍历当前Map的键值对 + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (!key.equals("time")) { + double value = (double) entry.getValue(); + // 检查结果Map中是否已包含该键 + if (!resultMap.containsKey(key) || (double) resultMap.get(key) > value) { + // 如果不包含,或当前值更大,则更新结果Map + resultMap.put(key, value); + } + } + } + } + } else if (method.equals(InfluxDbSqlConstant.MAX) || method.equals(InfluxDbSqlConstant.PERCENTILE)) { + for (Map map : allList) { + // 遍历当前Map的键值对 + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (!key.equals("time")) { + double value = (double) entry.getValue(); + // 检查结果Map中是否已包含该键 + if (!resultMap.containsKey(key) || (double) resultMap.get(key) < value) { + // 如果不包含,或当前值更大,则更新结果Map + resultMap.put(key, value); + } + } + } + } + } else if (method.equals(InfluxDbSqlConstant.AVG)) { + Map sumMap = new HashMap<>(); + Map countMap = new HashMap<>(); + // 遍历列表中的每个Map + for (Map map : allList) { + // 遍历当前Map的键值对 + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + if (!key.equals("time")) { + double value = (double) entry.getValue(); + + // 更新累计和 + sumMap.put(key, sumMap.getOrDefault(key, 0.0) + value); + // 更新计数 + countMap.put(key, countMap.getOrDefault(key, 0) + 1); + } + } + } + + // 计算平均值并存储到结果Map中 + for (String key : sumMap.keySet()) { + double sum = sumMap.get(key); + int count = countMap.get(key); + double average = BigDecimal.valueOf(sum / count).setScale(3, RoundingMode.HALF_UP).doubleValue(); + resultMap.put(key, average); + } + } + + return resultMap; + } + + + private void dealExcelResult(JSONArray jsonArray,Map> assMap,Map unit){ + jsonArray.forEach(item -> { + JSONObject jsonObject = (JSONObject) item; + JSONArray itemArr = (JSONArray) jsonObject.get("celldata"); + itemArr.forEach((it) -> { + if (Objects.nonNull(it) && !"null".equals(it.toString())) { + //获取到1列 + JSONObject data = (JSONObject) it; + JSONObject son = (JSONObject) data.get("v"); + if (son.containsKey("v")) { + String v = son.getStr("v"); + //数据格式:$HA[_25]#B#max#classId$ 或 $HA[_25]#max#classId$ + if (v.charAt(0) == '$' && v.contains("#")) { + String str = ""; + List rDto = assMap.get(v.replace("$", "")); + if (Objects.nonNull(rDto)) { + str = rDto.get(0).getValue(); + //没有值,赋"/" + if (StringUtils.isBlank(str)) { + str = "/"; + } + son.set("v", str); + if (Objects.nonNull(rDto.get(0).getOverLimitFlag()) && rDto.get(0).getOverLimitFlag() == 1) { + son.set("fc", "#990000"); + } + } + } else if (v.charAt(0) == '%' && v.contains("#")) { + //指标合格情况 + String str = ""; + List rDto = assMap.get(v.replace("%", "")); + if (Objects.nonNull(rDto)) { + str = rDto.get(0).getValue(); + //没有值,赋"/" + if (StringUtils.isBlank(str)) { + str = "/"; + } + son.set("v", str); + if ("不合格".equals(str)) { + son.set("fc", "#990000"); + } + } + } /*else if (v.charAt(0) == '&') { + //结论 + String tem = v.replace("&", ""); + if (Objects.nonNull(finalTerminalMap)) { + if ("statis_time".equals(tem)) { + son.set("v", reportSearchParam.getStartTime() + InfluxDbSqlConstant.START_TIME + "_" + reportSearchParam.getEndTime() + InfluxDbSqlConstant.END_TIME); + } else { + //台账信息 + son.set("v", finalTerminalMap.getOrDefault(tem, "/")); + } + } + }*/ else if (v.charAt(0) == '@' && v.contains("#")) { + //解决数据单位问题 @指标#类型@ + String replace = v.replace("@", ""); + son.set("v", unit.getOrDefault(replace, "/")); + + } + } + } + }); + }); + } + + + /** + * 处理指标超标结论 + */ + private void dealTargetResult(Map assNoPassMap,Map limitTargetMapX,List endList){ + assNoPassMap.forEach((key, val) -> { + limitTargetMapX.remove(key); + if ("Voltage_Dev".equals(val.getTemplateName()) || "Freq_Dev".equals(val.getTemplateName())) { + val.setValue("±" + val.getValue()); + } + if (val.getOverLimitFlag() == 1) { + val.setValue("不合格 (" + val.getValue() + ")"); + } else { + val.setValue("合格 (" + val.getValue() + ")"); + } + endList.add(val); + }); + + limitTargetMapX.forEach((key, val) -> { + if (Objects.isNull(val.getOverLimitFlag())) { + val.setValue("/"); + } else { + val.setValue("合格"); + } + endList.add(val); + }); + } + + + /** + * 解析模板 + * + * @author cdf + * @date 2023/10/20 + */ + private void parseTemplateZhejiang(JSONArray jsonArray, List reportTemplateDTOList, List reportLimitList, List terminalList) { + try { + //通过文件服务器获取 + + jsonArray.forEach(item -> { + JSONObject jsonObject = (JSONObject) item; + JSONArray itemArr = (JSONArray) jsonObject.get("celldata"); + itemArr.forEach((it) -> { + if (Objects.nonNull(it) && !"null".equals(it.toString())) { + //获取到1列 + JSONObject data = (JSONObject) it; + JSONObject son = (JSONObject) data.get("v"); + if (son.containsKey("v")) { + String v = son.getStr("v"); + //数据格式:$HA[_25]#B#max#classId$ 或 $HA[_25]#max#classId$ + if (v.charAt(0) == '$' && v.contains("#")) { + //剔除前后$ + v = v.replace("$", ""); + //封装ReportTemplateDTO + ReportTemplateDTO reportTemplateDTO = new ReportTemplateDTO(); + reportTemplateDTO.setItemName(v); + //根据#分割数据 + String[] vItem = v.split("#"); + if (vItem.length == 5) { + //$HA[_25]#B#max#classId$ + reportTemplateDTO.setTemplateName(vItem[0]); + reportTemplateDTO.setPhase(vItem[1]); + reportTemplateDTO.setStatMethod(vItem[2].toUpperCase()); + reportTemplateDTO.setResourceId(vItem[3]); + reportTemplateDTO.setLimitName(vItem[4]); + } else if (vItem.length == 4) { + //$HA[_25]#max#classId$ + reportTemplateDTO.setTemplateName(vItem[0]); + reportTemplateDTO.setPhase("M"); + reportTemplateDTO.setStatMethod(vItem[1].toUpperCase()); + reportTemplateDTO.setResourceId(vItem[2]); + reportTemplateDTO.setLimitName(vItem[3]); + } + + reportTemplateDTOList.add(reportTemplateDTO); + } else if (v.charAt(0) == '%' && v.contains("#")) { + //封装ReportTemplateDTO + ReportTemplateDTO reportTemplateDTO = new ReportTemplateDTO(); + + v = v.replace("%", ""); + reportTemplateDTO.setItemName(v); + //根据#分割数据 + String[] vItem = v.split("#"); + if (vItem.length == 3) { + //$HA[_25]#B#max#classId$ + reportTemplateDTO.setTemplateName(vItem[0]); + reportTemplateDTO.setStatMethod(vItem[1].toUpperCase()); + reportTemplateDTO.setResourceId(vItem[2]); + } + reportLimitList.add(reportTemplateDTO); + } else if (v.charAt(0) == '&') { + //封装ReportTemplateDTO + ReportTemplateDTO reportTemplateDTO = new ReportTemplateDTO(); + v = v.replace("&", ""); + reportTemplateDTO.setItemName(v); + reportTemplateDTO.setTemplateName(v); + terminalList.add(reportTemplateDTO); + } + } + } + }); + }); + } catch (Exception e) { + throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON); + } + } + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + +