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 240ae20a4..ada22d759 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 @@ -33,6 +33,7 @@ public class ReportSearchParam { @ApiModelProperty(name = "deptId",value = "部门ID") private String deptId; - private Integer resourceType = 1; + //目前用于区分不同系统资源,null默认 1.无线系统,配合cs-device + private Integer resourceType; } diff --git a/pqs-harmonic/harmonic-boot/pom.xml b/pqs-harmonic/harmonic-boot/pom.xml index 6ba5b8d00..4352a74c3 100644 --- a/pqs-harmonic/harmonic-boot/pom.xml +++ b/pqs-harmonic/harmonic-boot/pom.xml @@ -106,6 +106,12 @@ 1.0.0 compile + + + com.njcn + cs-device-api + 1.0.0 + 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 83c5cd040..6f069e95c 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 @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; 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.device.biz.commApi.CommTerminalGeneralClient; import com.njcn.device.pq.api.DeptLineFeignClient; import com.njcn.device.pq.api.DeviceUnitClient; @@ -100,6 +101,8 @@ public class CustomReportServiceImpl implements CustomReportService { private final CommTerminalGeneralClient commTerminalGeneralClient; + private final CsCommTerminalFeignClient csCommTerminalFeignClient; + @Override public boolean addCustomReportTemplate(ReportTemplateParam reportTemplateParam) { checkName(reportTemplateParam, false); @@ -238,14 +241,7 @@ public class CustomReportServiceImpl implements CustomReportService { if (Objects.isNull(excelRptTemp)) { throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_ACTIVE); } - try { - analyzeReport(reportSearchParam, excelRptTemp, response); - } catch (Exception exception) { - log.error(exception.getMessage()); - exception.printStackTrace(); - throw new BusinessException(HarmonicResponseEnum.REPORT_DOWNLOAD_ERROR); - } - + analyzeReport(reportSearchParam, excelRptTemp, response); } @@ -306,10 +302,10 @@ public class CustomReportServiceImpl implements CustomReportService { if (val.get(0).getHarmStart() == 1) { count = i + 0.5; reportTreeItem.setShowName(count + "次" + val.get(0).getShowName()); - reportTreeItem.setName("%"+one + count + "#" + val.get(0).getFormula() + "#" + val.get(0).getLimitTable()+"%"); + reportTreeItem.setName("%" + one + count + "#" + val.get(0).getFormula() + "#" + val.get(0).getLimitTable() + "%"); } else { reportTreeItem.setShowName(i + "次" + val.get(0).getShowName()); - reportTreeItem.setName("%"+one + i + "#" + val.get(0).getFormula()+ "#" + val.get(0).getLimitTable()+"%"); + reportTreeItem.setName("%" + one + i + "#" + val.get(0).getFormula() + "#" + val.get(0).getLimitTable() + "%"); } reportTreeItem.setFlag(1); @@ -317,7 +313,7 @@ public class CustomReportServiceImpl implements CustomReportService { } reportTreeVO.setChildren(temList); } else { - reportTreeVO.setName("%"+val.get(0).getLimitName() + "#" + val.get(0).getLimitTable()+"%"+ val.get(0).getFormula()+"%"); + reportTreeVO.setName("%" + val.get(0).getLimitName() + "#" + val.get(0).getLimitTable() + "%" + val.get(0).getFormula() + "%"); reportTreeVO.setFlag(1); } @@ -424,16 +420,19 @@ public class CustomReportServiceImpl implements CustomReportService { } - - /** * 数据单位信息 * - * @param lineID + * @param reportSearchParam * @return */ - private Map unitMap(String lineID) { - PqsDeviceUnit deviceUnit = commTerminalGeneralClient.lineUnitDetail(lineID).getData(); + private Map unitMap(ReportSearchParam reportSearchParam) { + PqsDeviceUnit deviceUnit; + if(Objects.isNull(reportSearchParam.getResourceType())){ + deviceUnit = commTerminalGeneralClient.lineUnitDetail(reportSearchParam.getLineId()).getData(); + }else { + deviceUnit = csCommTerminalFeignClient.lineUnitDetail(reportSearchParam.getLineId()).getData(); + } List dictData = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEVICE_UNIT.getCode()).getData(); Map unit = new HashMap<>(); List list = dictData.stream().map(DictData::getCode).collect(Collectors.toList()); @@ -484,7 +483,6 @@ public class CustomReportServiceImpl implements CustomReportService { } - /** * @param data 同类型的cell模板 * @param sql 单个cell模板 @@ -495,21 +493,17 @@ public class CustomReportServiceImpl implements CustomReportService { */ private void assSqlNew(List data, StringBuilder sql, List endList, String method, ReportSearchParam reportSearchParam, Map limitMap, Map overLimitMap, Map assNoPassMap) { //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)) { - + if (InfluxDbSqlConstant.CP95.equals(method)) { for (int i = 0; i < data.size(); i++) { if (i == data.size() - 1) { - sql.append("MAX") + sql.append(InfluxDbSqlConstant.MAX) .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("MAX") + sql.append(InfluxDbSqlConstant.MAX) .append(InfluxDbSqlConstant.LBK) .append(data.get(i).getTemplateName()) .append(InfluxDbSqlConstant.RBK) @@ -517,9 +511,7 @@ public class CustomReportServiceImpl implements CustomReportService { .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) @@ -540,6 +532,7 @@ public class CustomReportServiceImpl implements CustomReportService { } + //拼接表名 sql.append(StrPool.C_SPACE) .append(InfluxDbSqlConstant.FROM) .append(data.get(0).getResourceId()); @@ -561,16 +554,12 @@ public class CustomReportServiceImpl implements CustomReportService { .append(InfluxDbSqlConstant.QM); } - - //data_flicker、data_fluc、data_plt 无 value_type - //if (!"r_stat_data_flicker_d".equals(data.get(0).getResourceId()) && !"r_stat_data_fluc_d".equals(data.get(0).getResourceId()) && !"r_stat_data_plt_d".equals(data.get(0).getResourceId())) { - sql.append(InfluxDbSqlConstant.AND) - .append(InfluxDBTableConstant.VALUE_TYPE) - .append(InfluxDbSqlConstant.EQ) - .append(InfluxDbSqlConstant.QM) - .append(data.get(0).getStatMethod()) - .append(InfluxDbSqlConstant.QM); - //} + sql.append(InfluxDbSqlConstant.AND) + .append(InfluxDBTableConstant.VALUE_TYPE) + .append(InfluxDbSqlConstant.EQ) + .append(InfluxDbSqlConstant.QM) + .append(data.get(0).getStatMethod()) + .append(InfluxDbSqlConstant.QM); //频率和频率偏差仅统计T相 @@ -591,16 +580,14 @@ public class CustomReportServiceImpl implements CustomReportService { System.out.println(sql); long l = System.currentTimeMillis(); - List> mapList = SqlRunner.db().selectList(sql.toString()); + List> mapList = SqlRunner.db().selectList(sql.toString()); long la = System.currentTimeMillis(); - System.out.println("当前sql结束花费时长:"+(la-l)+"ms"); + System.out.println("当前sql结束花费时长:" + (la - l) + "ms"); if (CollUtil.isEmpty(mapList)) { data = data.stream().peek(item -> item.setValue("/")).collect(Collectors.toList()); } else { Map map = mapList.get(0); - - for (ReportTemplateDTO item : data) { if (Objects.nonNull(map) && map.containsKey(item.getItemName())) { double v = Double.parseDouble(map.get(item.getItemName()).toString()); @@ -616,14 +603,13 @@ public class CustomReportServiceImpl implements CustomReportService { } //判断是否越限 - if(limitMap.size()!=0) { + if (limitMap.size() != 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); - assNoPassMap.put(key, tem); } else if (!assNoPassMap.containsKey(key)) { tem.setOverLimitFlag(0); @@ -661,7 +647,7 @@ public class CustomReportServiceImpl implements CustomReportService { JSONArray jsonArray; try (InputStream fileStream = fileStorageUtil.getFileStream(excelRptTemp.getContent())) { jsonArray = new JSONArray(new JSONTokener(fileStream, new JSONConfig())); - parseTemplate(jsonArray, reportTemplateDTOList, reportLimitList,terminalList); + parseTemplate(jsonArray, reportTemplateDTOList, reportLimitList, terminalList); } catch (Exception e) { throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON); } @@ -681,7 +667,6 @@ public class CustomReportServiceImpl implements CustomReportService { List endList = new ArrayList<>(); if (CollUtil.isNotEmpty(reportTemplateDTOList)) { - //开始组织sql reportTemplateDTOList = reportTemplateDTOList.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection( @@ -707,7 +692,7 @@ public class CustomReportServiceImpl implements CustomReportService { } else if (InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(valueTypeKey)) { assSqlNew(phaseVal, sql, endList, InfluxDbSqlConstant.AVG_WEB, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap); } else if (InfluxDbSqlConstant.CP95.equalsIgnoreCase(valueTypeKey)) { - assSqlNew(phaseVal, sql, endList, InfluxDbSqlConstant.PERCENTILE, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap); + assSqlNew(phaseVal, sql, endList, InfluxDbSqlConstant.CP95, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap); } }); }); @@ -717,13 +702,13 @@ 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 ("Voltage_Dev".equals(val.getTemplateName()) || "Freq_Dev".equals(val.getTemplateName())) { + val.setValue("±" + val.getValue()); } if (val.getOverLimitFlag() == 1) { - val.setValue("不合格 ("+val.getValue()+")"); + val.setValue("不合格 (" + val.getValue() + ")"); } else { - val.setValue("合格 ("+val.getValue()+")"); + val.setValue("合格 (" + val.getValue() + ")"); } endList.add(val); }); @@ -746,13 +731,13 @@ public class CustomReportServiceImpl implements CustomReportService { if (CollUtil.isNotEmpty(endList)) { long jie = System.currentTimeMillis(); //数据单位信息 - //Map unit = unitMap(reportSearchParam.getLineId()); + Map unit = unitMap(reportSearchParam); //进行反向赋值到模板 //1、根据itemName分组 Map> assMap = endList.stream().collect(Collectors.groupingBy(ReportTemplateDTO::getItemName)); //处理台账信息 - Map terminalMap = null; - if(CollUtil.isNotEmpty(terminalList)){ + Map terminalMap = null; + if (CollUtil.isNotEmpty(terminalList)) { terminalMap = commTerminalGeneralClient.getCustomDetailByLineId(reportSearchParam.getLineId()).getData(); } Map finalTerminalMap = terminalMap; @@ -803,10 +788,10 @@ public class CustomReportServiceImpl implements CustomReportService { } 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 { + 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, "/")); } @@ -815,7 +800,7 @@ public class CustomReportServiceImpl implements CustomReportService { //解决数据单位问题 @指标#类型@ if (v.charAt(0) == '@' && v.contains("#")) { String replace = v.replace("@", ""); - // son.set("v", unit.getOrDefault(replace, "/")); + son.set("v", unit.getOrDefault(replace, "/")); } } @@ -830,7 +815,7 @@ public class CustomReportServiceImpl implements CustomReportService { long daochu = System.currentTimeMillis(); //导出自定义报表 - downReport(jsonArray,response); + downReport(jsonArray, response); long daochuEnd = System.currentTimeMillis(); System.out.println("导出耗时 " + (daochuEnd - daochu) / 1000 + "S"); @@ -916,13 +901,13 @@ public class CustomReportServiceImpl implements CustomReportService { } - /** * 获取测点限值 + * * @author cdf * @date 2023/10/23 */ - private Map overLimitDeal(List reportLimitList, ReportSearchParam reportSearchParam) { + private Map overLimitDeal(List reportLimitList, ReportSearchParam reportSearchParam) { Map limitMap = new HashMap<>(); if (CollUtil.isNotEmpty(reportLimitList)) { StringBuilder sql = new StringBuilder("select "); @@ -935,6 +920,9 @@ public class CustomReportServiceImpl implements CustomReportService { } sql.append(" from ").append(reportLimitList.get(0).getResourceId()).append(" where id ='").append(reportSearchParam.getLineId()).append("'"); limitMap = excelRptTempMapper.dynamicSqlMap(sql.toString()); + if (Objects.isNull(limitMap)) { + throw new BusinessException("当前测点限值缺失!"); + } for (ReportTemplateDTO item : reportLimitList) { if (limitMap.containsKey(item.getTemplateName())) { @@ -948,7 +936,7 @@ public class CustomReportServiceImpl implements CustomReportService { /** * 报告下载 */ - private void downReport(JSONArray jsonArray,HttpServletResponse response){ + private void downReport(JSONArray jsonArray, HttpServletResponse response) { InputStream reportStream = IoUtil.toStream(jsonArray.toString(), CharsetUtil.UTF_8); //String newContent = fileStorageUtil.uploadStream(reportStream, OssPath.HARMONIC_EXCEL_REPORT, FileUtil.generateFileName("json"));