diff --git a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java index b67218667..8326d25e0 100644 --- a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java +++ b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/CommMonitorEventReportService.java @@ -20,6 +20,13 @@ public interface CommMonitorEventReportService { void getLineExport(ExportParam exportParam, LineDetailDataCommDTO lineDetailDataCommDTO, HttpServletResponse response); + /** + * 暂降事件报告 + * @param exportParam + * @param lineDetailDataCommDTO + * @param response + */ + void getWlLineExport(ExportParam exportParam, LineDetailDataCommDTO lineDetailDataCommDTO, HttpServletResponse response); /** * 暂态事件报告 diff --git a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java index 3dcf96519..527ff81bd 100644 --- a/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java +++ b/pqs-event/event-common/src/main/java/com/njcn/event/common/service/impl/CommMonitorEventReportServiceImpl.java @@ -479,6 +479,389 @@ public class CommMonitorEventReportServiceImpl implements CommMonitorEventReport } + @Override + public void getWlLineExport(ExportParam exportParam, LineDetailDataCommDTO lineDetailData, HttpServletResponse response) { + //创建word文档(poi生成word) + XWPFDocument doc = new XWPFDocument(); //创建Word文件 + //设置标题样式 + WordUtils.setHeadingStyle(doc); + XWPFParagraph p = doc.createParagraph(); //新建一个段落 + //设置对齐 + p.setAlignment(ParagraphAlignment.CENTER); + p.setVerticalAlignment(TextAlignment.CENTER); + XWPFRun r = p.createRun();//创建段落文本 + r.addBreak(); + r.addBreak(); + r.addBreak(); + r.addBreak(); + r.addBreak(); + r.addBreak(); + r.setText(""); + r.setBold(true);//设置为粗体 + r.setFontSize(14);//字体大小 + r.addBreak(); + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.CENTER); + XWPFRun r1 = p.createRun();//创建段落文本 + r1.setText("电压暂降事件分析报告"); + r1.setBold(true);//设置为粗体 + r1.setFontSize(36);//字体大小 + r1.addBreak(); + r1.addBreak(); + r1.addBreak(); + r1.addBreak(); + r1.addBreak(); + r1.addBreak(); + r1.addBreak(); + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.CENTER); + XWPFRun r2 = p.createRun();//创建段落文本 + //获取当前时间 + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日"); + String time = dateFormat.format(date); + + r2.setText("日期: " + time); + r2.setBold(true);//设置为粗体 + r2.setFontSize(14);//字体大小 + + r2.addBreak(); + r2.addBreak(); + r2.addBreak(); + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.CENTER); + XWPFRun r3 = p.createRun();//创建段落文本 + r3.setText("电压暂降事件区域报告"); + r3.setFontSize(24);//字体大小 + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.LEFT); + createTitle(doc, "1. 引言", "标题 1", 0, 15); + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.BOTH); + XWPFRun r5 = p.createRun();//创建段落文本 + r5.setText("对所选中区间内电压暂降事件进行分析,能够直观清晰查看响应的暂降事件信息。"); + r5.setFontSize(11);//字体大小 + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.LEFT); + createTitle(doc, "2. 报告分析对象", "标题 1", 0, 15); + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.BOTH); + XWPFRun r7 = p.createRun();//创建段落文本 + r7.setText(exportParam.getLineName()); + r7.setFontSize(11);//字体大小 + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.LEFT); + createTitle(doc, "3. 报告分析时间", "标题 1", 0, 15); + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.BOTH); + XWPFRun r9 = p.createRun();//创建段落文本 + r9.setText(exportParam.getSearchBeginTime() + " 至 " + exportParam.getSearchEndTime()); + r9.setFontSize(11);//字体大小 + + p = doc.createParagraph(); //新建一个段落 + p.setAlignment(ParagraphAlignment.LEFT); + createTitle(doc, "4. 总汇信息", "标题 1", 0, 15); + + //查询参数 + StatisticsParam param = new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(), exportParam.getFlag()); + //获取暂降原因字典 + List reasonData = dicDataFeignClient.getDicDataByTypeName(DicDataTypeEnum.EVENT_REASON.getName()).getData(); + //获取暂降类型字典 + List typeData = dicDataFeignClient.getDicDataByTypeName(DicDataTypeEnum.EVENT_TYPE.getName()).getData(); + //influxdb查询结果(pqs_eventdetail表) + List info = info(param, true); + + //记录数 + int i = 1; + //1.监测点信息 + if (exportParam.isXq()) { + createTitle(doc, "4." + i + " 监测点信息", "标题 2", 200, 15); + XWPFTable table = createTable(doc); + XWPFParagraph centerParagraph = WordUtils.getCenterParagraph(doc); + insertRow(doc, table, centerParagraph, true, "项目", "描述"); + insertRow(doc, table, centerParagraph, false, "监测点名称", lineDetailData.getLineName()); + insertRow(doc, table, centerParagraph, false, "电压等级", lineDetailData.getScale()); + insertRow(doc, table, centerParagraph, false, "PT变比", lineDetailData.getPt()); + insertRow(doc, table, centerParagraph, false, "CT变比", lineDetailData.getCt()); + insertRow(doc, table, centerParagraph, false, "协议容量", lineDetailData.getDealCapacity() + ""); + insertRow(doc, table, centerParagraph, false, "设备容量", lineDetailData.getDevCapacity() + ""); + insertRow(doc, table, centerParagraph, false, "最小短路容量", lineDetailData.getShortCapacity() + ""); + insertRow(doc, table, centerParagraph, false, "接线方式", lineDetailData.getPtType()); + if (exportParam.getType() == 0) { + insertRow(doc, table, centerParagraph, false, "基准容量", lineDetailData.getStandardCapacity() + ""); + } + i++; + } + //2.暂降事件暂降事件列表和暂降点图 + //2.1.判断列表和点图是否是要导出 + if (exportParam.isLb() || exportParam.isSjdF47() || exportParam.isSjdITIC()) { + List plot = eventReportService.getPlot(info, reasonData, typeData); + //暂降事件列表 + if (exportParam.isLb()) { + createTitle(doc, "4." + i + " 暂降事件列表", "标题 2", 200, 15); + XWPFTable table = createTable(doc); + XWPFParagraph centerParagraph = WordUtils.getCenterParagraph(doc); + insertRow(doc, table, centerParagraph, true, "序号", "暂降发生时刻", "暂降幅值(%)", "持续时间(s)", "暂降类型", "暂降原因", "严重度"); + for (int j = 0; j < plot.size(); j++) { + EventDetail eventDetail = plot.get(j); + String s = eventDetail.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); + + insertRow(doc, table, centerParagraph, false, j + 1 + "", s, BigDecimal.valueOf(eventDetail.getFeatureAmplitude() * 100).setScale(2, RoundingMode.HALF_UP).toString(), eventDetail.getDuration() + "", Objects.isNull(eventDetail.getAdvanceType()) ? "/" : eventDetail.getAdvanceType(), Objects.isNull(eventDetail.getAdvanceReason()) ? "/" : eventDetail.getAdvanceReason(), Objects.isNull(eventDetail.getSeverity()) ? "/" : eventDetail.getSeverity() + ""); + } + i++; + } + //暂降事件点图 + if (exportParam.isSjdF47() || exportParam.isSjdITIC()) { + ArrayList> ass = getAss(plot); + createTitle(doc, "4." + i + " 暂降事件点图", "标题 2", 200, 15); + int two = 1; + if (exportParam.isSjdITIC()) { + createTitle(doc, "4." + i + "." + two + " ITIC 曲线", "标题 3", 400, 15); + String itic = drawPicUtil.drawItic(ass); + createPic(doc, itic, "ITIC曲线"); + two++; + } + if (exportParam.isSjdF47()) { + createTitle(doc, "4." + i + "." + two + " F47 曲线", "标题 3", 400, 15); + String f47 = drawPicUtil.drawF47(ass); + createPic(doc, f47, "SEMI F47曲线"); + two++; + } + i++; + } + } + + + //3.暂降密度 + if (exportParam.isMdbg() || exportParam.isMdtx()) { + createTitle(doc, "4." + i + " 暂降密度", "标题 2", 200, 15); + int two = 1; + if (exportParam.isMdtx()) { + createTitle(doc, "4." + i + "." + two + " 暂降密度点图", "标题 3", 400, 15); + Integer[][] eventDensityData = eventReportService.getCoords(info); + String str = drawPicUtil.drawEventDensity(eventDensityData); + createPic(doc, str, "暂降密度图"); + two++; + } + if (exportParam.isMdbg()) { + XWPFParagraph centerParagraph = WordUtils.getCenterParagraph(doc); + createTitle(doc, "4." + i + "." + two + " DISDIP 表格:国际发配电联盟(UNIPEDE)", "标题 3", 400, 15); +// List eventDisdip = eventAnalysisService.eventDisdip(new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(),exportParam.getFlag())); + List eventDisdip = eventReportService.eventDisdip(info); + + XWPFTable table1 = createTable(doc); + insertRow(doc, table1, centerParagraph, true, "剩余电压", "20ms", "100ms", "500ms", "1s", "3s", "20s", "60s", "180s"); + for (int j = 0; j < eventDisdip.size(); j++) { + DISDIPVO disdipvo = eventDisdip.get(j); + insertRow(doc, table1, centerParagraph, false, disdipvo.getName(), disdipvo.getTwentyMs(), disdipvo.getOneHundredMs(), disdipvo.getFiveHundredMs(), disdipvo.getOneS(), disdipvo.getThreeS(), disdipvo.getTwentyS(), disdipvo.getSixtyS(), disdipvo.getOneEightyS()); + } + two++; + createTitle(doc, "4." + i + "." + two + " IEC 61000-4-11:(用电终端的电压暂降抗度)", "标题 3", 400, 15); +// List iec411VOS = eventAnalysisService.IEC411(new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(),exportParam.getFlag())); + List iec411VOS = eventReportService.IEC411(info); + XWPFTable table2 = createTable(doc); + insertRow(doc, table2, centerParagraph, true, "剩余电压", "10~20ms", "20~100ms", "0.1~0.2s", "0.2~0.5s", "0.5~1s", ">1s"); + for (int j = 0; j < iec411VOS.size(); j++) { + IEC411VO iec411VO = iec411VOS.get(j); + insertRow(doc, table2, centerParagraph, false, iec411VO.getName(), iec411VO.getTenTwentyMs(), iec411VO.getTwentyOneHundredMs(), iec411VO.getZeroPiontOneTwoS(), iec411VO.getZeroPiontTwoFiveS(), iec411VO.getZeroPiontFive1S(), iec411VO.getGreater1S()); + } + two++; + createTitle(doc, "4." + i + "." + two + " IEC 61000-2-8:(公共电网电压暂降测量统计)", "标题 3", 400, 15); +// List iec28VOS = eventAnalysisService.IEC28(new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(),exportParam.getFlag())); + List iec28VOS = eventReportService.IEC28(info); + XWPFTable table3 = createTable(doc); + insertRow(doc, table3, centerParagraph, true, "剩余电压", "0.02~0.1s", "0.1~0.25s", "0.25~0.5s", "0.5s~1s", "1~3s", "3~20s", "20~60s", "60~180s"); + for (int j = 0; j < iec28VOS.size(); j++) { + IEC28VO iec28VO = iec28VOS.get(j); + insertRow(doc, table3, centerParagraph, false, iec28VO.getName(), iec28VO.getQ(), iec28VO.getW(), iec28VO.getE(), iec28VO.getR(), iec28VO.getT(), iec28VO.getY(), iec28VO.getU(), iec28VO.getI()); + } + two++; + } + i++; + } + //4.暂降幅值概率分布 + if (exportParam.isGlfbfz() || exportParam.isGlfbsj()) { + createTitle(doc, "4." + i + " 暂降幅值概率分布图", "标题 2", 200, 15); +// ProbabilityVO probabilityVO = eventAnalysisService.getProbabilityDistribution(new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(),exportParam.getFlag())); + ProbabilityVO probabilityVO = eventReportService.getProbabilityDistribution(info); + int two = 1; + if (exportParam.isGlfbfz()) { + createTitle(doc, "4." + i + "." + two + " 暂降幅值的概率分函数", "标题 3", 400, 15); + List ybardata = probabilityVO.getPereventvalue(); + List ylinedata = probabilityVO.getEventvalue(); + String fz = drawPicUtil.drawEventAmplitude(ylinedata, ybardata); + createPic(doc, fz, "暂降幅值的概率分布函数"); + two++; + } + if (exportParam.isGlfbsj()) { + createTitle(doc, "4." + i + "." + two + " 持续时间的概率分函数", "标题 3", 400, 15); + List ybardata = probabilityVO.getPersisttime(); + List ylinedata = probabilityVO.getSisttime(); + String sj = drawPicUtil.drawPersistentTime(ylinedata, ybardata); + createPic(doc, sj, "持续时间的概率分布函数"); + two++; + } + i++; + } + + + //5.月份统计 + if (exportParam.isTjbg() || exportParam.isTjtx()) { + createTitle(doc, "4." + i + " 月份统计", "标题 2", 200, 15); + int two = 1; + List reasonTypeTime = eventAnalysisService.getReasonTypeTime(param); + //暂时时间端按月查询不能查询 +// List reasonTypeTime = eventReportService.getReasonTypeTime(param,null); + if (exportParam.isTjtx()) { + createTitle(doc, "4." + i + "." + two + " 月份统计图", "标题 3", 400, 15); + List count = new ArrayList<>(); + List name = new ArrayList<>(); + if (exportParam.getFlag() == 0) { + for (TimeVO timeVO : reasonTypeTime) { + name.add(timeVO.getMonth() + ""); + count.add(Integer.parseInt(timeVO.getTimes())); + } + } else { + for (TimeVO timeVO : reasonTypeTime) { + name.add(timeVO.getDay() + ""); + count.add(Integer.parseInt(timeVO.getTimes())); + } + } + String yftj = drawPicUtil.drawMonth(name, count, reasonTypeTime.get(0).getYear(), exportParam.getFlag()); + createPic(doc, yftj, "月份统计图"); + two++; + } + if (exportParam.isTjbg()) { + XWPFParagraph centerParagraph = WordUtils.getCenterParagraph(doc); + createTitle(doc, "4." + i + "." + two + " 时间统计表格", "标题 3", 400, 15); + + XWPFTable table1 = createTable(doc); + if (exportParam.getFlag() == 0) { + insertRow(doc, table1, centerParagraph, true, "时间(月)", "电压暂降次数"); + } else { + insertRow(doc, table1, centerParagraph, true, "时间(天)", "电压暂降次数"); + } + if (exportParam.getFlag() == 0) { + for (int j = 0; j < reasonTypeTime.size(); j++) { + TimeVO timeVO = reasonTypeTime.get(j); + insertRow(doc, table1, centerParagraph, false, timeVO.getMonth(), timeVO.getTimes()); + } + } else { + for (int j = 0; j < reasonTypeTime.size(); j++) { + TimeVO timeVO = reasonTypeTime.get(j); + insertRow(doc, table1, centerParagraph, false, timeVO.getFulltime(), timeVO.getTimes()); + } + } + two++; + } + i++; + } + + + //6.原因统计 + //6.1整合提出查询语句 + Boolean fly = exportParam.isYybg() || exportParam.isYytx() || exportParam.isLxbg() || exportParam.isLxtx(); + if (fly) { + List tempDictType = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.EVENT_STATIS.getCode()).getData(); + List typeIds = tempDictType.stream().filter(x -> DicDataEnum.VOLTAGE_DIP.getCode().equals(x.getCode()) || DicDataEnum.SHORT_INTERRUPTIONS.getCode().equals(x.getCode())) + .map(DictData::getId).collect(Collectors.toList()); + List tempInfo = info.stream().filter(temp -> typeIds.contains(temp.getEventType())).collect(Collectors.toList()); + StatisticVO statistic = eventReportService.getStatistic(tempInfo, reasonData, typeData); + if (exportParam.isYybg() || exportParam.isYytx()) { + createTitle(doc, "4." + i + " 原因统计", "标题 2", 200, 15); +// StatisticVO statistic = eventAnalysisService.getStatistic(new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(),exportParam.getFlag())); + int two = 1; + if (exportParam.isYytx()) { + createTitle(doc, "4." + i + "." + two + " 原因统计图", "标题 3", 400, 15); + List xdata = new ArrayList<>(); + List> reasonList = new ArrayList<>(); + + List reason = statistic.getReason(); + for (ReasonsVO reasonsVO : reason) { + Map map = new LinkedHashMap<>(); + map.put("value", reasonsVO.getTimes()); + map.put("name", reasonsVO.getReason()); + reasonList.add(map); + xdata.add(reasonsVO.getReason()); + } + String tr = drawPicUtil.drawReason(xdata, reasonList); + createPic(doc, tr, "暂降原因图"); + two++; + } + if (exportParam.isYybg()) { + XWPFParagraph centerParagraph = WordUtils.getCenterParagraph(doc); + createTitle(doc, "4." + i + "." + two + " 原因统计表格", "标题 3", 400, 15); + XWPFTable table1 = createTable(doc); + insertRow(doc, table1, centerParagraph, true, "暂降原因", "电压暂降次数"); + List reason = statistic.getReason(); + for (int j = 0; j < reason.size(); j++) { + ReasonsVO reasonsVO = reason.get(j); + insertRow(doc, table1, centerParagraph, false, reasonsVO.getReason(), reasonsVO.getTimes() + ""); + } + two++; + } + i++; + } + //7.类型统计 + if (exportParam.isLxbg() || exportParam.isLxtx()) { + createTitle(doc, "4." + i + " 类型统计", "标题 2", 200, 15); +// StatisticVO statistic = eventAnalysisService.getStatistic(new StatisticsParam(exportParam.getLineId(), exportParam.getSearchBeginTime(), exportParam.getSearchEndTime(),exportParam.getFlag())); + int two = 1; + if (exportParam.isLxtx()) { + createTitle(doc, "4." + i + "." + two + " 类型统计图", "标题 3", 400, 15); + List xdata = new ArrayList<>(); + List types = statistic.getTypes(); + + List> reasonList = new ArrayList<>(); + for (TypesVO type : types) { + Map map = new LinkedHashMap<>(); + map.put("value", type.getTimes()); + map.put("name", type.getType()); + reasonList.add(map); + xdata.add(type.getType()); + } + String tr = drawPicUtil.drawType(xdata, reasonList); + createPic(doc, tr, "暂降类型图"); + two++; + } + if (exportParam.isLxbg()) { + createTitle(doc, "4." + i + "." + two + " 类型统计表格", "标题 3", 400, 15); + XWPFParagraph centerParagraph = WordUtils.getCenterParagraph(doc); + XWPFTable table1 = createTable(doc); + insertRow(doc, table1, centerParagraph, true, "暂降原因", "电压暂降次数"); + List types = statistic.getTypes(); + for (int j = 0; j < types.size(); j++) { + TypesVO typesVO = types.get(j); + insertRow(doc, table1, centerParagraph, false, typesVO.getType(), typesVO.getTimes() + ""); + } + two++; + } + i++; + } + } + + + try { + ServletOutputStream outputStream = response.getOutputStream(); + String fileName = URLEncoder.encode(exportParam.getLineName() + ".docx", "UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + response.setContentType("application/octet-stream;charset=UTF-8"); + doc.write(outputStream); + outputStream.close(); + } catch (Exception e) { + throw new BusinessException(CommonResponseEnum.FAIL, "导出监测点暂降报告异常"); + } + + } /** * 创建标题 @@ -598,6 +981,23 @@ public class CommMonitorEventReportServiceImpl implements CommMonitorEventReport return BeanUtil.copyToList(info, EventDetail.class); } + private List info(StatisticsParam statisticsParam, Boolean dip) { + // 构建查询条件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(RmpEventDetailPO::getMeasurementPointId, statisticsParam.getLineIndex()) + .ge(StrUtil.isNotBlank(statisticsParam.getStartTime()), RmpEventDetailPO::getStartTime, DateUtil.beginOfDay(DateUtil.parse(statisticsParam.getStartTime()))) + .le(StrUtil.isNotBlank(statisticsParam.getEndTime()), RmpEventDetailPO::getStartTime, DateUtil.endOfDay(DateUtil.parse(statisticsParam.getEndTime()))) + .orderByDesc(RmpEventDetailPO::getStartTime); + if (dip) { + List data = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.EVENT_STATIS.getCode()).getData(); + List typeList = data.stream().filter(it->it.getCode().equals(DicDataEnum.VOLTAGE_DIP.getCode()) || it.getCode().equals(DicDataEnum.SHORT_INTERRUPTIONS.getCode())).map(DictData::getId).collect(Collectors.toList()); List list = new ArrayList<>(); + queryWrapper.in(RmpEventDetailPO::getEventType, typeList); + } + // 数据暂降查询 + List info = rmpEventDetailMapper.selectList(queryWrapper); + return BeanUtil.copyToList(info, EventDetail.class); + } + /** * 生成暂降事件报告