From d54c0c284bf79383edf140e67cda39258f626eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E9=A3=9E=E5=AE=87?= <2684146481@qq.com> Date: Tue, 1 Aug 2023 11:05:19 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=80=9A=E8=AE=AF?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E7=9A=84=E6=9C=80=E5=90=8E=E4=B8=80=E5=B0=8F?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E8=BF=90=E8=A1=8C=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CentralMonitorController.java | 4 +- .../config/service/CentralMonitorService.java | 4 +- .../service/impl/CentralMonitorServiceImpl.java | 24 +++++++++++- .../hzims/operational/config/vo/PointDataVo.java | 45 ++++++++++++++++++++++ .../station/service/IStationService.java | 6 +++ .../station/service/impl/StationServiceImpl.java | 35 ++++++++++++++--- 6 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/vo/PointDataVo.java diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/controller/CentralMonitorController.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/controller/CentralMonitorController.java index f9a3356..a86b507 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/controller/CentralMonitorController.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/controller/CentralMonitorController.java @@ -1,7 +1,9 @@ package com.hnac.hzims.operational.config.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.hnac.hzims.operational.config.service.CentralMonitorService; +import com.hnac.hzims.operational.config.vo.PointDataVo; import com.hnac.hzims.operational.station.service.IRealMonitorService; import com.hnac.hzims.operational.main.vo.RealStationVo; import com.hnac.hzinfo.datasearch.PointData; @@ -57,7 +59,7 @@ public class CentralMonitorController extends BladeController { public R selectCommunication(@PathVariable Integer page, @PathVariable Integer size, String roleId){ - HzPage result = monitorService.selectOriginalDataByRealIds(page, size, roleId); + IPage result = monitorService.selectOriginalDataByRealIds(page, size, roleId); return R.data(result); } } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/CentralMonitorService.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/CentralMonitorService.java index cceb159..887026e 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/CentralMonitorService.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/CentralMonitorService.java @@ -1,6 +1,8 @@ package com.hnac.hzims.operational.config.service; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.hnac.hzims.operational.config.vo.PointDataVo; import com.hnac.hzims.operational.main.vo.RealStationVo; import com.hnac.hzinfo.datasearch.PointData; import com.hnac.hzinfo.sdk.core.response.HzPage; @@ -26,6 +28,6 @@ public interface CentralMonitorService{ * @param roleId * @return */ - HzPage selectOriginalDataByRealIds(Integer page, Integer size, String roleId); + IPage selectOriginalDataByRealIds(Integer page, Integer size, String roleId); } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java index 8d0afa6..34b2d03 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java @@ -1,10 +1,14 @@ package com.hnac.hzims.operational.config.service.impl; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hnac.hzims.operational.config.service.CentralMonitorService; +import com.hnac.hzims.operational.config.vo.PointDataVo; import com.hnac.hzims.operational.main.constant.HomePageConstant; import com.hnac.hzims.operational.station.entity.StationEntity; import com.hnac.hzims.operational.station.service.IStationService; import com.hnac.hzims.operational.main.vo.RealStationVo; +import com.hnac.hzims.operational.ticket.fegin.StationFeginService; import com.hnac.hzinfo.datasearch.PointData; import com.hnac.hzinfo.datasearch.history.IHistoryDataSearchClient; import com.hnac.hzinfo.datasearch.history.OriginalDataQuery; @@ -17,7 +21,9 @@ import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.entity.Dept; import org.springblade.system.feign.ISysClient; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -81,7 +87,7 @@ public class CentralMonitorServiceImpl implements CentralMonitorService { * @return */ @Override - public HzPage selectOriginalDataByRealIds(Integer page, Integer size, String roleId) { + public IPage selectOriginalDataByRealIds(Integer page, Integer size, String roleId) { OriginalDataQuery originalDataQuery = new OriginalDataQuery(); originalDataQuery.setRealId(roleId); originalDataQuery.setLimit(size); @@ -93,12 +99,26 @@ public class CentralMonitorServiceImpl implements CentralMonitorService { if (!originalDataByRealIds.isSuccess()) { throw new IllegalArgumentException("数据不存在"); } - return originalDataByRealIds.getData(); + HzPage data = originalDataByRealIds.getData(); + List collect = data.getRecords().stream().map(item -> { + PointDataVo pointDataVo = new PointDataVo(); + BeanUtils.copyProperties(item, pointDataVo); + //通过站点id获取站点名称 + String station = pointDataVo.getStation(); + String stationName = stationService.selectStationById(station); + pointDataVo.setStationName(stationName); + return pointDataVo; + }).collect(Collectors.toList()); + + IPage iPage = new Page(data.getCurrent(), data.getSize()); + iPage.setRecords(collect); + return iPage; } /** * LocalDateTime 转 date + * * @param localDateTime * @return */ diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/vo/PointDataVo.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/vo/PointDataVo.java new file mode 100644 index 0000000..444da82 --- /dev/null +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/vo/PointDataVo.java @@ -0,0 +1,45 @@ +package com.hnac.hzims.operational.config.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +/** + * @Author WL + * @Version v1.0 + * @Serial 1.0 + * @Date 2023/8/1 10:37 + */ +@Data +public class PointDataVo { + + /** + * 站点id + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private String station; + + + /** + * 站点名称 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private String stationName; + /** + * 数据采集时间 + */ + private String time; + /** + * 数据 + */ + private String value; + /** + * 质量值 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private Integer q; + + + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private String signage; + +} diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/IStationService.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/IStationService.java index 1d8e8d1..95e2bc6 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/IStationService.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/IStationService.java @@ -131,4 +131,10 @@ public interface IStationService extends BaseService { */ void uniqueStationByStation(String signage); + /** + * 通过站点id获取站点名称 + * @param station + * @return + */ + String selectStationById(String station); } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/StationServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/StationServiceImpl.java index e2b5123..bc86153 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/StationServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/station/service/impl/StationServiceImpl.java @@ -2,6 +2,7 @@ package com.hnac.hzims.operational.station.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.hnac.hzims.common.service.UserAuthDataService; @@ -37,6 +38,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.log.logger.BladeLogger; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; @@ -106,19 +108,20 @@ public class StationServiceImpl extends BaseServiceImpl questionClient.submitStationInfo(configVO.getFdpStationType(), req.getCode(), "运维平台推送"), "智能诊断站点推送").start(); } // 如果设备数据来源未选定其他 则进行站点初始化操作 if (StationConstants.GATHER.equals(req.getDataOrigin()) && !StationConstants.HZ3000_OTHER.equals(req.getDataSource())) { - log.info("{}站点开始数据平台新建项目",req.getCode()); + log.info("{}站点开始数据平台新建项目", req.getCode()); new Thread(() -> this.instanceProject(req), "数据平台新建项目").start(); } } @@ -697,8 +700,30 @@ public class StationServiceImpl extends BaseServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(StationEntity::getSignage, signage); Integer count = baseMapper.selectCount(queryWrapper); - if (count > 0){ - throw new ServiceException("两票编号抬头已存在"); + if (count > 0) { + throw new ServiceException("两票编号抬头已存在"); + } + } + + + /** + * 通过站点id获取站点名称 + * + * @param station + * @return + */ + @Override + public String selectStationById(String station) { + if (StringUtils.isEmpty(station)) { + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(BaseEntity::getId, station); + queryWrapper.lambda().or().eq(StationEntity::getCode, station); + StationEntity stationEntity = baseMapper.selectOne(queryWrapper); + if (stationEntity != null) { + return stationEntity.getName(); } + return null; } } From 84e662f08969a970f9c1289036669be5cda06594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E9=A3=9E=E5=AE=87?= <2684146481@qq.com> Date: Tue, 1 Aug 2023 14:11:22 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=80=9A=E8=AE=AF?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E7=9A=84=E6=9C=80=E5=90=8E=E4=B8=80=E5=B0=8F?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E8=BF=90=E8=A1=8C=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operational/config/service/impl/CentralMonitorServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java index 34b2d03..7d9bc9b 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/config/service/impl/CentralMonitorServiceImpl.java @@ -16,6 +16,7 @@ import com.hnac.hzinfo.sdk.core.response.HzPage; import com.hnac.hzinfo.sdk.core.response.Result; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.StringUtil; @@ -91,13 +92,13 @@ public class CentralMonitorServiceImpl implements CentralMonitorService { OriginalDataQuery originalDataQuery = new OriginalDataQuery(); originalDataQuery.setRealId(roleId); originalDataQuery.setLimit(size); - LocalDateTime startTime = LocalDateTime.now(); - LocalDateTime endTime = startTime.minusHours(1); + LocalDateTime endTime = LocalDateTime.now(); + LocalDateTime startTime = endTime.minusHours(1); originalDataQuery.setBeginTime(this.getOriginalDate(startTime)); originalDataQuery.setEndTime(this.getOriginalDate(endTime)); Result> originalDataByRealIds = historyDataSearchClient.getOriginalDataByRealIds(originalDataQuery); if (!originalDataByRealIds.isSuccess()) { - throw new IllegalArgumentException("数据不存在"); + throw new ServiceException("数据不存在"); } HzPage data = originalDataByRealIds.getData(); List collect = data.getRecords().stream().map(item -> { From e279c4682a5d9d42e298bdad14b92741c329b078 Mon Sep 17 00:00:00 2001 From: tyty Date: Tue, 1 Aug 2023 16:00:19 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B0=B4=E7=94=B5=E7=AB=99=E6=9C=88?= =?UTF-8?q?=E6=8A=A5=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hzims/ticket/constants/TicketConstants.java | 2 +- .../operational/data/controller/BarChartDemo.java | 236 --------- .../main/controller/AreaMonthReportController.java | 30 +- .../service/impl/AreaMonthReportServiceImpl.java | 561 +++++++++++---------- .../com/hnac/hzims/operational/util/JFreeUtil.java | 44 +- .../com/hnac/hzims/operational/util/TimeUtils.java | 35 ++ .../com/hnac/hzims/operational/util/WordUtils.java | 88 ++++ .../main/resources/template/waterMonReport.docx | Bin 0 -> 113046 bytes 8 files changed, 478 insertions(+), 518 deletions(-) delete mode 100644 hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java create mode 100644 hzims-service/operational/src/main/resources/template/waterMonReport.docx diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java index fbe4fea..a6d0812 100644 --- a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java @@ -169,7 +169,7 @@ public interface TicketConstants { } public static String getTicketNameByType(String type) { - Optional optional = Arrays.stream(WordFileNameEnum.values()).filter(e -> type.equals(e.getType())).findFirst(); + Optional optional = Arrays.stream(TicketTypeNameEnum.values()).filter(e -> type.equals(e.getType())).findFirst(); return optional.map(e -> e.fileName).orElse(null); } } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java deleted file mode 100644 index 85747a3..0000000 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.hnac.hzims.operational.data.controller; - -import java.awt.*; -import java.io.FileOutputStream; -import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import com.hnac.hzims.operational.report.vo.TicketChartCell; -import com.hnac.hzims.operational.report.vo.TicketChartVo; -import com.hnac.hzims.ticket.constants.TicketConstants; -import org.jfree.chart.ChartFactory; -import org.jfree.chart.ChartFrame; -import org.jfree.chart.ChartUtils; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.axis.CategoryAxis; -import org.jfree.chart.axis.CategoryLabelPositions; -import org.jfree.chart.axis.NumberAxis; -import org.jfree.chart.axis.ValueAxis; -import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; -import org.jfree.chart.plot.CategoryPlot; -import org.jfree.chart.plot.PlotOrientation; -import org.jfree.chart.renderer.category.BarRenderer; -import org.jfree.chart.renderer.category.StandardBarPainter; -import org.jfree.chart.title.TextTitle; -import org.jfree.data.category.CategoryDataset; -import org.jfree.data.category.DefaultCategoryDataset; - -public class BarChartDemo { -// public static void main(String[] args) { -// // 1. 得到数据 -// CategoryDataset dataset = getDataSetTicket(); -//// CategoryDataset dataset = getDataSet(); -//// CategoryDataset dataset = getDataSet3(); -// // 2. 构造chart -// JFreeChart chart = ChartFactory.createBarChart( -// "水果产量图", // 图表标题 -// "水果", // 目录轴的显示标签--横轴 -// "产量", // 数值轴的显示标签--纵轴 -// dataset, // 数据集 -// PlotOrientation.VERTICAL, // 图表方向:水平、 -// true, // 是否显示图例(对于简单的柱状图必须 -// false, // 是否生成工具 -// false // 是否生成URL链接 -// ); -// // 3. 处理chart中文显示问题 -// iSetBarChart(chart); -// -// // 4. chart输出图片 -//// writeChartAsImage(chart, "fruit.jpg"); -// writeChartAsImage(chart, "ticket.jpg"); -// -//// writeChartAsImage(chart, "fruit2.jpg"); -// -// // 5. chart 以swing形式输出 -// ChartFrame pieFrame = new ChartFrame("水果生产", chart); -// pieFrame.pack(); -// pieFrame.setVisible(true); -// -// } - - /** - * 获取一个演示用的组合数据集对象 - * - * @return - */ - private static CategoryDataset getDataSet() { - DefaultCategoryDataset dataset = new DefaultCategoryDataset(); - dataset.addValue(100, "北京", "苹果"); - dataset.addValue(120, "上海", "苹果"); - dataset.addValue(160, "广州", "苹果"); - dataset.addValue(210, "北京", "梨子"); - dataset.addValue(220, "上海", "梨子"); - dataset.addValue(230, "广州", "梨子"); - dataset.addValue(330, "北京", "葡萄"); - dataset.addValue(340, "上海", "葡萄"); - dataset.addValue(340, "广州", "葡萄"); - dataset.addValue(420, "北京", "香蕉"); - dataset.addValue(430, "上海", "香蕉"); - dataset.addValue(400, "广州", "香蕉"); - dataset.addValue(510, "北京", "荔枝"); - dataset.addValue(530, "上海", "荔枝"); - dataset.addValue(510, "广州", "荔枝"); - return dataset; - } - - private static CategoryDataset getDataSet3() { - DefaultCategoryDataset dataset = new DefaultCategoryDataset(); - dataset.addValue(100, "北京", "苹果"); - dataset.addValue(210, "北京", "梨子"); - dataset.addValue(330, "北京", "葡萄"); - dataset.addValue(420, "北京", "香蕉"); - dataset.addValue(510, "北京", "荔枝"); - return dataset; - } - - - private static CategoryDataset getDataSetTicket() { - List ticketList = new ArrayList<>(); - TicketConstants.TicketTypeNameEnum[] values = TicketConstants.TicketTypeNameEnum.values(); - TicketChartVo sum=new TicketChartVo(); - List sas = new ArrayList<>(); - sum.setDeptName("总计"); - for (TicketConstants.TicketTypeNameEnum value : values) { - TicketChartCell ticketChartCell = new TicketChartCell(); - ticketChartCell.setTicketType(value.getType()); - ticketChartCell.setTicketName(value.getFileName()); - Integer integer = Integer.valueOf(value.getType()); - ticketChartCell.setTicketMon(30+ integer); - BigDecimal d=BigDecimal.valueOf(integer).divide(BigDecimal.valueOf(100),2,BigDecimal.ROUND_UP); - ticketChartCell.setTicketMonPerc(0.3+ d.doubleValue()); - sas.add(ticketChartCell); - } - sum.setChartCells(sas); - ticketList.add(sum); - //两票柱状图数据 - // 创建数据 - DefaultCategoryDataset dataset = new DefaultCategoryDataset(); -// for (TicketChartVo chartVo : ticketList) { -// for (int i = 0; i < chartVo.getChartCells().size(); i++) { -// TicketChartCell ticketChartCell = chartVo.getChartCells().get(i); -// dataset.addValue(ticketChartCell.getTicketMon(), ticketChartCell.getTicketName(), ticketChartCell.getTicketName()); -// } -// } - - dataset.addValue(33+1, "", "倒闸操作票"); - dataset.addValue(33+2,"", "开机操作票"); - dataset.addValue(33+3,"", "停机操作票"); - dataset.addValue(33+4,"", "第一种工作票"); - dataset.addValue(33+5,"", "第二种工作票"); - dataset.addValue(33+6,"", "水力机械票"); - return dataset; - } - - /** - * 解决图表汉字显示问题 - * - * @param chart - */ - private static void processChart(JFreeChart chart) { - CategoryPlot plot = chart.getCategoryPlot(); - CategoryAxis domainAxis = plot.getDomainAxis(); - ValueAxis rAxis = plot.getRangeAxis(); - chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, - RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); - TextTitle textTitle = chart.getTitle(); - textTitle.setFont(new Font("宋体", Font.PLAIN, 20)); - domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11)); - domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12)); - rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12)); - rAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12)); - chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12)); - // renderer.setItemLabelGenerator(new LabelGenerator(0.0)); - // renderer.setItemLabelFont(new Font("宋体", Font.PLAIN, 12)); - // renderer.setItemLabelsVisible(true); - } - - /** - * 输出图片 - * - * @param chart - */ - private static void writeChartAsImage(JFreeChart chart, String fileName) { - FileOutputStream fos_jpg = null; - try { - fos_jpg = new FileOutputStream("D:\\test\\"+fileName); - ChartUtils.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null); -// ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - fos_jpg.close(); - } catch (Exception e) { - } - } - } - - - public static void iSetBarChart(JFreeChart chart) { - CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身 - ValueAxis rangeAxis = categoryplot.getRangeAxis(); - CategoryAxis domainAxis = categoryplot.getDomainAxis(); - // 设置Y轴的提示文字样式 - rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); - // 设置Y轴刻度线的长度 - rangeAxis.setTickMarkInsideLength(10f); - - domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的 - domainAxis.setLowerMargin(0.1); - domainAxis.setUpperMargin(0.1); - - // rangeAxis.setTickMarkOutsideLength(10f); - // 设置X轴下的标签文字 - domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); - // 设置X轴上提示文字样式 - domainAxis.setTickLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); - NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis(); - - // 设置Y轴的数字为百分比样式显示设置Y轴的数字为百分比样式显示 - DecimalFormat df = new DecimalFormat("0.0"); - vn.setNumberFormatOverride(df); - // 使柱状图反过来显示 - // vn.setInverted(true); - // vn.setVerticalTickLabels(true); - - // 自定义柱状图中柱子的样式 - CustomRenderer brender = new CustomRenderer(); - // 设置柱状图的顶端显示数字 - brender.setIncludeBaseInRange(true); - brender.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); - brender.setDefaultItemLabelsVisible(true); - // 设置柱子为平面图不是立体的 - brender.setBarPainter(new StandardBarPainter()); - // 设置柱状图之间的距离0.1代表10%; - brender.setItemMargin(0.3); - // 设置柱子的阴影,false代表没有阴影 - brender.setShadowVisible(false); - - // 设置图的背景为白色 - categoryplot.setBackgroundPaint(Color.WHITE); - // 设置背景虚线的颜色 - categoryplot.setRangeGridlinePaint(Color.decode("#B6A2DE")); - // 去掉柱状图的背景边框,使边框不可见 - categoryplot.setOutlineVisible(false); - // 设置标题的字体样式 - chart.getTitle().setFont(new Font("微软雅黑", Font.PLAIN, 24)); - // 设置图表下方图例上的字体样式 - chart.getLegend().setItemFont(new Font("微软雅黑", Font.PLAIN, 12)); - - categoryplot.setRenderer(brender); - - - } -} diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java index 6bcade8..38638c5 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java @@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.log.annotation.ApiLog; import org.springblade.core.tool.api.R; @@ -22,8 +23,11 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; +import java.io.IOException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -121,14 +125,32 @@ public class AreaMonthReportController extends BladeController { public R exportHydropowerStationMonthReport(HttpServletResponse response, @ApiParam(value = "日期-年", required = true) Integer year,@ApiParam(value = "日期-月", required = true) Integer month, @ApiParam(value = "日期-日", required = true) Integer date,@ApiParam(value = "站点Id", required = true) Long stationId,@ApiParam(value = "月报类型", required = true) Long type) { + HashMap map = new HashMap<>(); if (type==1){ - HashMap map = new HashMap<>(); service.exportHydropowerStationMonthReport(response, map,year,month,date,stationId); - WordUtils.exportWord("template/waterMonV3.docx", "F:/", "生成月报.docx", map); //word模板相对路径、word生成路径、word生成的文件名称、数据源 - } + XWPFDocument xwpfDocument = WordUtils.exportWordV2("template/waterMonReport.docx", map); + // 下载导出 + String filename = "(" + year+"年"+month+"月"+ ")水电站月报"; + // 设置头信息 + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.ms-excel"); + ServletOutputStream outputStream = null; + try { + //设置xlsx格式 + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename + ".docx", "UTF-8")); + //创建一个输出流 + outputStream = response.getOutputStream(); - return R.success("测试成功"); + //写入数据 + xwpfDocument.write(outputStream); + // 关闭 + outputStream.close(); + xwpfDocument.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return R.data("导出成功"); } } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/AreaMonthReportServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/AreaMonthReportServiceImpl.java index dd80fb7..77f6308 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/AreaMonthReportServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/AreaMonthReportServiceImpl.java @@ -3,6 +3,7 @@ package com.hnac.hzims.operational.main.service.impl; import cn.afterturn.easypoi.entity.ImageEntity; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hnac.hzims.EquipmentConstants; import com.hnac.hzims.equipment.entity.PlanGenerationEntity; import com.hnac.hzims.equipment.feign.IEmParamClient; import com.hnac.hzims.equipment.feign.IPlanGenertionClient; @@ -25,7 +26,6 @@ import com.hnac.hzims.operational.station.entity.StationEntity; import com.hnac.hzims.operational.station.service.IStationService; import com.hnac.hzims.operational.util.JFreeUtil; import com.hnac.hzims.operational.util.TimeUtils; -import com.hnac.hzims.operational.util.WordUtils; import com.hnac.hzims.safeproduct.dto.SafeEquipmentTrialDTO; import com.hnac.hzims.safeproduct.feign.ISafeCheckClient; import com.hnac.hzims.safeproduct.feign.ISafeEquipmentTrialClient; @@ -69,6 +69,7 @@ import java.math.BigDecimal; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -83,7 +84,7 @@ import java.util.stream.Collectors; */ @Service @RequiredArgsConstructor -public class AreaMonthReportServiceImpl implements IAreaMonthReportService { +public class AreaMonthReportServiceImpl implements IAreaMonthReportService { @NotNull private final IMainTaskStatisticService mainTaskStatisticService; @@ -119,8 +120,6 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { private final ISafeCheckClient safeCheckClient; - - @Value("${hzims.operation.area.report}") private String area_month_report_key; @@ -202,9 +201,12 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { } return R.data("success"); } - @Override public R exportHydropowerStationMonthReport(HttpServletResponse response, HashMap map, Integer year, Integer month, Integer date, Long deptId) { + R> deptByCurrentUser = sysClient.getDeptByCurrentUser(); + if (!deptByCurrentUser.isSuccess()||deptByCurrentUser.getData()!=null){ + return R.fail("用户权限查询失败"); + } R deptNameR = sysClient.getDeptName(deptId); if (!deptNameR.isSuccess()) { return R.fail("暂无该机构"); @@ -218,7 +220,18 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { if (deptList == null) { return R.fail("该机构不包含水站信息"); } + List deptByUser = deptByCurrentUser.getData().stream().map(s -> s.getId()).collect(Collectors.toList()); + if (!deptByUser.contains(deptId)){ + return R.fail("该用户不包含该机构权限,请申请权限再试"); + } List deptIds = deptList.stream().map(s -> s.getId()).collect(Collectors.toList()); + List stationEntityList = stationService.list(Wrappers.lambdaQuery() + .in(StationEntity::getRefDept, deptIds) + .eq(StationEntity::getType, HomePageConstant.HYDROPOWER)); + Integer commissionTime = stationEntityList.stream().map(s -> { + Duration dur = Duration.between(s.getCommissionTime(), LocalDateTime.now()); + return (int) dur.toDays();}).reduce(Integer::max).get(); + List stationIds = stationEntityList.stream().map(s -> s.getId()).collect(Collectors.toList()); //其它普通数据 map.put("year", year); Integer yearBefore = year - 1; @@ -227,48 +240,40 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { Integer monthBefore = month - 1; map.put("monthBefore", monthBefore); map.put("date", date); - map.put("commissionTime", "commissionTime"); + map.put("commissionTime", commissionTime.toString()); map.put("stationName", deptName); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日"); + map.put("writeTime", simpleDateFormat.format(new Date())); + List> safelist=new ArrayList<>(); + List> form=new ArrayList<>(); + for (Dept dept : deptList) { + HashMap temp = new HashMap<>(); + HashMap temp2 = new HashMap<>(); + temp.put("name", dept.getDeptName()); + temp2.put("name", dept.getDeptName()); + safelist.add(temp); + form.add(temp2); + } + map.put("safelist",safelist); + map.put("form",form); + map.put("form2",form); // 今年年度 String yearStart = TimeUtils.getYear(year); - String yearEnd = TimeUtils.getYearEnd(year); String yearEndV2 = TimeUtils.getYearEndV2(year); - //去年年度 - String yearBeforeStart = TimeUtils.getYear(yearBefore); - String yearBeforeEnd = TimeUtils.getYearEnd(yearBefore); // 今年当月 String monthStart = TimeUtils.getMonthStart(year, month); - String monthEnd = TimeUtils.getMonthEnd(year, month); String monthEndV2 = TimeUtils.getMonthEndV2(year, month); - // 今年上个月 - String beforeMonthStart = TimeUtils.getMonthStart(year, monthBefore); - String beforeMonthEnd = TimeUtils.getMonthEnd(year, monthBefore); - // 去年当月 - String monthStartBeforeYear = TimeUtils.getMonthStart(yearBefore, month); - String monthEndBeforeYear = TimeUtils.getMonthEnd(yearBefore, month); - // 所有设备信息 - List devices = mainSystemMonitoringService.getEmInfoList(); List reals = (List) redisTemplate.opsForValue().get(load_hydropower_unit_real_key); -// R installedCapacityCountByDepts = emParamClient.getInstalledCapacityCountByDepts(deptIds); -// if (installedCapacityCountByDepts.isSuccess()){ -// double sum = Optional.ofNullable(installedCapacityCountByDepts.getData()) -// .orElse(new ArrayList<>()).stream() -// .filter(s -> s.getInstalledCapacity() != null) -// .mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum(); -// map.put("installedCapacity", 0); -// } -// List realsByDept = reals.stream().filter(s -> deptIds.contains(s.getDeptId())).collect(Collectors.toList()); -// TODO 伪造数据 - List realsByDept = reals.stream().filter(s -> deptIds.contains(s.getDeptId())).map(s->{s.setInstalledCapacity(3.2);return s;}).collect(Collectors.toList()); - + List realsByDept = reals.stream().filter(s -> deptIds.contains(s.getDeptId())).collect(Collectors.toList()); // 装机容量占比数据组装 //总容量 double sum = Optional.ofNullable(realsByDept) .orElse(new ArrayList<>()).stream() .filter(s -> s.getInstalledCapacity() != null) .mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum(); - map.put("installedCapacity", sum); + BigDecimal sumData=new BigDecimal(sum).divide(new BigDecimal(1000),2,BigDecimal.ROUND_UP); + map.put("installedCapacity", sumData); //各站点分组 Map> listMap = Optional.ofNullable(realsByDept) .orElse(new ArrayList<>()).stream() @@ -290,140 +295,97 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { ImageEntity capacityProportionChart = JFreeUtil.pieChartByDouble("水电项目装机容量占比图", capacityProportionMap, 500, 400); map.put("capacityProportionChart", capacityProportionChart); //各发电站发电量环比图+表格数据组装 + List deptIdsString = deptIds.stream().map(s -> String.valueOf(s)).collect(Collectors.toList()); + List planYearData = planGenertionClient.getPlanGenerationByParam(null, deptIdsString, year.toString()); List powerPercentageVoList = new ArrayList<>(); - for (Dept dept : deptList) { - MonPowerPercentageVo powerVo = new MonPowerPercentageVo(); - powerVo.setDeptId(dept.getId()); - powerVo.setDeptName(dept.getDeptName()); - BigDecimal powerYear = new BigDecimal(0); - BigDecimal powerYearBefore = new BigDecimal(0); - BigDecimal powerMonth = new BigDecimal(0); - BigDecimal powerMonthBefore = new BigDecimal(0); - BigDecimal powerMonthYearBefore = new BigDecimal(0); - Double planGeneration = 0d; -// todo shuju -// List planYearData = planGenertionClient.getPlanGenerationByParam(null, Arrays.asList(dept.getId().toString()), year.toString()); - PlanGenerationEntity planGenerationEntity=new PlanGenerationEntity(); - planGenerationEntity.setPlanGeneration(2f); - List planYearData =new ArrayList<>(); - planYearData.add(planGenerationEntity); - if (CollectionUtils.isNotEmpty(planYearData)) { - planGeneration = Double.valueOf(planYearData.get(0).getPlanGeneration()); - } - // 站点设备集合 - List stationDevices = devices.stream().filter(device -> device.getCreateDept().equals(dept.getId())).collect(Collectors.toList()); - for (EminfoAndEmParamVo device : stationDevices) { + //水电站,光伏站和带代运维数据近三年数据 + Map> powerMapThree = (Map>) redisTemplate.opsForValue().get(RECENT_YEAR_POWER_DATA); + List listByYear = TimeUtils.getListByYear(year); + List listByYearBefore = TimeUtils.getListByYear(yearBefore); + String monStart = TimeUtils.getMon(year, month); + String monStartYearBefore = TimeUtils.getMon(yearBefore, month); + String monStartMonBefore = TimeUtils.getMon(year, monthBefore); + for (Map.Entry> deviceMap : powerMapThree.entrySet()) { + String deptNameByKey = ""; + if (stationIds.contains(deviceMap.getKey())) { + MonPowerPercentageVo powerVo = new MonPowerPercentageVo(); + powerVo.setDeptId(deviceMap.getKey()); + List collect = stationEntityList.stream().filter(s -> deviceMap.getKey().equals(s.getId())).collect(Collectors.toList()); + if (collect!=null) { + Long dept = collect.get(0).getRefDept(); + List dep = deptList.stream().filter(s -> dept.equals(s.getId())).collect(Collectors.toList()); + deptNameByKey=dep.get(0).getDeptName(); + } + powerVo.setDeptName(deptNameByKey); + BigDecimal powerYear = new BigDecimal(0); + BigDecimal powerYearBefore = new BigDecimal(0); + BigDecimal powerMonth = new BigDecimal(0); + BigDecimal powerMonthBefore = new BigDecimal(0); + BigDecimal powerMonthYearBefore = new BigDecimal(0); + Double planGeneration = 0d; + List planGenerationById = planYearData.stream().filter(s -> collect.get(0).getRefDept().equals(s.getStationDeptId())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(planGenerationById)) { + planGeneration = Double.valueOf(planGenerationById.get(0).getPlanGeneration()); + } + //当前机构近三年的数据 + Map value = deviceMap.getValue(); //今年发电量 -// List analyseData = analyseDataService.periodTargetData(yearStart, yearEnd, 3, EquipmentConstants.CycleTypeEnum.YEAR_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); - AnalyseDataTaosVO analyseData1=new AnalyseDataTaosVO(); - analyseData1.setVal("2"); - List analyseData =new ArrayList<>(); - analyseData.add(analyseData1); - // todo 数据还原 - if (CollectionUtil.isNotEmpty(analyseData)) { - BigDecimal yearPower = analyseData.stream().filter(ktv -> ktv.getVal() != null) - .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) - .reduce(BigDecimal.ZERO, BigDecimal::add); - powerYear = powerYear.add(yearPower); + powerYear=value.entrySet().stream().filter(s->listByYear.contains(s.getKey())).map(s->BigDecimal.valueOf(s.getValue())).reduce(BigDecimal.ZERO, BigDecimal::add); + //转换单位kwh-》万Kwh + powerYear=powerYear.divide(new BigDecimal(10000),2,BigDecimal.ROUND_UP); + powerYearBefore=value.entrySet().stream().filter(s->listByYearBefore.contains(s.getKey())).map(s->BigDecimal.valueOf(s.getValue())).reduce(BigDecimal.ZERO, BigDecimal::add); + powerYearBefore=powerYearBefore.divide(new BigDecimal(10000),2,BigDecimal.ROUND_UP); + powerMonth=value.entrySet().stream().filter(s->monStart.equals(s.getKey())).map(s->BigDecimal.valueOf(s.getValue())).reduce(BigDecimal.ZERO, BigDecimal::add); + powerMonth=powerMonth.divide(new BigDecimal(10000),2,BigDecimal.ROUND_UP); + powerMonthBefore=value.entrySet().stream().filter(s->monStartMonBefore.equals(s.getKey())).map(s->BigDecimal.valueOf(s.getValue())).reduce(BigDecimal.ZERO, BigDecimal::add); + powerMonthBefore=powerMonthBefore.divide(new BigDecimal(10000),2,BigDecimal.ROUND_UP); + powerMonthYearBefore=value.entrySet().stream().filter(s->monStartYearBefore.equals(s.getKey())).map(s->BigDecimal.valueOf(s.getValue())).reduce(BigDecimal.ZERO, BigDecimal::add); + powerMonthYearBefore=powerMonthYearBefore.divide(new BigDecimal(10000),2,BigDecimal.ROUND_UP); + powerVo.setPowerYear(powerYear.doubleValue()); + powerVo.setPowerYearBefore(powerYearBefore.doubleValue()); + BigDecimal yearPercentage = new BigDecimal(0); + BigDecimal planPercentage = new BigDecimal(0); + if (powerYearBefore.compareTo(BigDecimal.ZERO) != 0) { + yearPercentage = (powerYear.subtract(powerYearBefore)).divide(powerYearBefore, 2, BigDecimal.ROUND_UP); } - //去年发电量 -// List analyseDataYearBefore = analyseDataService.periodTargetData(yearBeforeStart, yearBeforeEnd, 3, EquipmentConstants.CycleTypeEnum.YEAR_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); - AnalyseDataTaosVO analyseDataYearBefore1=new AnalyseDataTaosVO(); - analyseDataYearBefore1.setVal("16"); - List analyseDataYearBefore =new ArrayList<>(); - analyseDataYearBefore.add(analyseDataYearBefore1); - // todo 数据还原 - if (CollectionUtil.isNotEmpty(analyseDataYearBefore)) { - BigDecimal powerBefore = analyseDataYearBefore.stream().filter(ktv -> ktv.getVal() != null) - .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) - .reduce(BigDecimal.ZERO, BigDecimal::add); - powerYearBefore = powerYearBefore.add(powerBefore); + if (BigDecimal.valueOf(planGeneration).compareTo(BigDecimal.ZERO) != 0) { + planPercentage = powerYear.divide(BigDecimal.valueOf(planGeneration), 2, BigDecimal.ROUND_UP); } - //今年当月发电量 -// List analyseDataMonth = analyseDataService.periodTargetData(monthStart, monthEnd, 3, EquipmentConstants.CycleTypeEnum.MONTH_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); - AnalyseDataTaosVO analyseDataMonth1=new AnalyseDataTaosVO(); - analyseDataMonth1.setVal("0.66"); - List analyseDataMonth =new ArrayList<>(); - analyseDataMonth.add(analyseDataMonth1); - // todo 数据还原 - if (CollectionUtil.isNotEmpty(analyseDataMonth)) { - BigDecimal powerBefore = analyseDataMonth.stream().filter(ktv -> ktv.getVal() != null) - .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) - .reduce(BigDecimal.ZERO, BigDecimal::add); - powerMonth = powerMonth.add(powerBefore); + powerVo.setPlanPercentage(planPercentage.doubleValue()); + powerVo.setPowerYearPercentage(yearPercentage.doubleValue()); + powerVo.setPowerMon(powerMonth.doubleValue()); + powerVo.setPowerMonBefore(powerMonthBefore.doubleValue()); + powerVo.setPowerMonYearBefore(powerMonthYearBefore.doubleValue()); + BigDecimal monPercentage = new BigDecimal(0); + if (powerMonthYearBefore.compareTo(BigDecimal.ZERO) != 0) { + monPercentage = (powerMonth.subtract(powerMonthYearBefore)).divide(powerMonthYearBefore, 2, BigDecimal.ROUND_UP); } - //上个月发电量 -// List analyseDataMonthBefore = analyseDataService.periodTargetData(beforeMonthStart, beforeMonthEnd, 3, EquipmentConstants.CycleTypeEnum.MONTH_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); - AnalyseDataTaosVO analyseDataMonthBefore1=new AnalyseDataTaosVO(); - analyseDataMonthBefore1.setVal("0.56"); - List analyseDataMonthBefore =new ArrayList<>(); - analyseDataMonthBefore.add(analyseDataMonthBefore1); -// todo 数据还原 - if (CollectionUtil.isNotEmpty(analyseDataMonthBefore)) { - BigDecimal powerBefore = analyseDataMonthBefore.stream().filter(ktv -> ktv.getVal() != null) - .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) - .reduce(BigDecimal.ZERO, BigDecimal::add); - powerMonthBefore = powerMonthBefore.add(powerBefore); - } - //去年当月发电量 -// List analyseDataMonthBeforeYear = analyseDataService.periodTargetData(monthStartBeforeYear, monthEndBeforeYear, 3, EquipmentConstants.CycleTypeEnum.MONTH_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); - AnalyseDataTaosVO analyseDataMonthBeforeYear1=new AnalyseDataTaosVO(); - analyseDataMonthBeforeYear1.setVal("0.3"); - List analyseDataMonthBeforeYear =new ArrayList<>(); - analyseDataMonthBeforeYear.add(analyseDataMonthBeforeYear1); -// todo 数据还原 - if (CollectionUtil.isNotEmpty(analyseDataMonthBeforeYear)) { - BigDecimal powerBefore = analyseDataMonthBeforeYear.stream().filter(ktv -> ktv.getVal() != null) - .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) - .reduce(BigDecimal.ZERO, BigDecimal::add); - powerMonthYearBefore = powerMonthYearBefore.add(powerBefore); - } - } - powerVo.setPowerYear(powerYear.doubleValue()); - powerVo.setPowerYearBefore(powerYearBefore.doubleValue()); - BigDecimal yearPercentage = new BigDecimal(0); - BigDecimal planPercentage = new BigDecimal(0); - if (powerYearBefore.compareTo(BigDecimal.ZERO)!=0) { - yearPercentage = (powerYear.subtract(powerYearBefore)).divide(powerYearBefore, 2, BigDecimal.ROUND_UP); - } - if (BigDecimal.valueOf(planGeneration).compareTo(BigDecimal.ZERO)!=0) { - planPercentage = powerYear.divide(BigDecimal.valueOf(planGeneration), 2, BigDecimal.ROUND_UP); - } - powerVo.setPlanPercentage(planPercentage.doubleValue()); - powerVo.setPowerYearPercentage(yearPercentage.doubleValue()); - powerVo.setPowerMon(powerMonth.doubleValue()); - powerVo.setPowerMonBefore(powerMonthBefore.doubleValue()); - powerVo.setPowerMonYearBefore(powerMonthYearBefore.doubleValue()); - BigDecimal monPercentage = new BigDecimal(0); - if (powerMonthYearBefore.compareTo(BigDecimal.ZERO)!=0) { - monPercentage = (powerMonth.subtract(powerMonthYearBefore)).divide(powerMonthYearBefore, 2, BigDecimal.ROUND_UP); + powerVo.setPowerMonPercentage(monPercentage.doubleValue()); + powerPercentageVoList.add(powerVo); } - powerVo.setPowerMonPercentage(monPercentage.doubleValue()); - powerPercentageVoList.add(powerVo); } +// getPowerData(deptList, yearStart, yearEnd, yearBeforeStart, yearBeforeEnd, monthStart, monthEnd, beforeMonthStart, beforeMonthEnd, monthStartBeforeYear, monthEndBeforeYear, devices, planYearData, powerPercentageVoList); // 各发电站发电量环比图数据组装 - //柱状图图数据 // 创建数据 DefaultCategoryDataset powerDataset = new DefaultCategoryDataset(); for (MonPowerPercentageVo monPowerPercentageVo : powerPercentageVoList) { - powerDataset.addValue(monPowerPercentageVo.getPowerMonYearBefore(),monthBefore +"月", monPowerPercentageVo.getDeptName()); + powerDataset.addValue(monPowerPercentageVo.getPowerMonBefore(),monthBefore +"月", monPowerPercentageVo.getDeptName()); powerDataset.addValue(monPowerPercentageVo.getPowerMon(), month +"月", monPowerPercentageVo.getDeptName()); - } - String powerTitle=deptName+"水电运维项目各电站发电量环比对比图(万kWh)"; - String powerDomainAxis="发电量"; - String powerRangeAxis="站点名称"; - ImageEntity powerChainHistogram = JFreeUtil.iCreateBarChart( powerTitle, powerDomainAxis, powerRangeAxis, powerDataset, 500, 400); + String powerTitle = deptName + "水电运维项目各电站发电量环比对比图(万kWh)"; + String powerDomainAxis = "发电量"; + String powerRangeAxis = "站点名称"; + ImageEntity powerChainHistogram = JFreeUtil.iCreateBarChart(powerTitle, powerDomainAxis, powerRangeAxis, powerDataset, 500, 400); map.put("powerChainHistogram", powerChainHistogram); - //柱状图下的表格 + //柱状图下添加的表格 if (powerPercentageVoList != null) { ArrayList> powerMap = new ArrayList<>(powerPercentageVoList.size()); for (MonPowerPercentageVo monPowerPercentageVo : powerPercentageVoList) { HashMap power = new HashMap<>(); power.put("name", monPowerPercentageVo.getDeptName()); - power.put("monthBefore", String.valueOf(monPowerPercentageVo.getPowerMonBefore())); - power.put("month", String.valueOf(monPowerPercentageVo.getPowerMon())); + power.put("monthBefore", monPowerPercentageVo.getPowerMonBefore()+"MW"); + power.put("month",monPowerPercentageVo.getPowerMon()+"MW"); powerMap.add(power); } map.put("power", powerMap); @@ -440,11 +402,11 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { temp.put("name", monPowerPercentageVo.getDeptName()); temp.put("powerMonBefore", String.valueOf(monPowerPercentageVo.getPowerMonYearBefore())); temp.put("powerYearBefore", String.valueOf(monPowerPercentageVo.getPowerYearBefore())); - temp.put("mon",String.valueOf(monPowerPercentageVo.getPowerMon())); - temp.put("year",String.valueOf(monPowerPercentageVo.getPowerYear())); - temp.put("monPercentage", monPowerPercentageVo.getPowerMonPercentage()*100+"%"); - temp.put("yearPercentage", monPowerPercentageVo.getPowerYearPercentage()*100+"%"); - temp.put("plan",monPowerPercentageVo.getPlanPercentage()*100+"%"); + temp.put("mon", String.valueOf(monPowerPercentageVo.getPowerMon())); + temp.put("year", String.valueOf(monPowerPercentageVo.getPowerYear())); + temp.put("monPercentage", monPowerPercentageVo.getPowerMonPercentage() * 100 + "%"); + temp.put("yearPercentage", monPowerPercentageVo.getPowerYearPercentage() * 100 + "%"); + temp.put("plan", monPowerPercentageVo.getPlanPercentage() * 100 + "%"); list.add(temp); } map.put("powerGeneration", list); @@ -459,12 +421,14 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { wrapper.eq(OperPhenomenonEntity::getDiscriminateStatus, TreatMethodConstant.AUTO_SCREENED); wrapper.in(OperPhenomenonEntity::getCreateDept, deptIds); List monPhenomenonList = operPhenomenonService.list(wrapper); - monPhenomenonList= monPhenomenonList.stream().filter(s -> s.getDefectLevel() != null).collect(Collectors.toList()); - List monConclusionList = monPhenomenonList.stream().filter(s -> s.getConclusionStatus().equals(1)).collect(Collectors.toList()); + monPhenomenonList = monPhenomenonList.stream().filter(s -> s.getDefectLevel() != null).collect(Collectors.toList()); + List monConclusionList = monPhenomenonList.stream().filter(s -> s.getConclusionStatus().equals("1")).collect(Collectors.toList()); +// 只填写二类及以上缺陷 + List monConclusionListBy = monConclusionList.stream().filter(s -> !s.getDefectGrading().equals("1")).collect(Collectors.toList()); // 各电站缺陷处理统计表 - monConclusionList.stream().sorted(Comparator.comparing(OperPhenomenonEntity::getDefectGrading).reversed().thenComparing(OperPhenomenonEntity::getCreateTime)); - ArrayList> checkList = new ArrayList<>(monConclusionList.size()); - for (OperPhenomenonEntity operPhenomenonEntity : monConclusionList) { + monConclusionListBy.stream().sorted(Comparator.comparing(OperPhenomenonEntity::getCreateDept).reversed().thenComparing(OperPhenomenonEntity::getDefectGrading)); + ArrayList> checkList = new ArrayList<>(); + for (OperPhenomenonEntity operPhenomenonEntity : monConclusionListBy) { Long createDept = operPhenomenonEntity.getCreateDept(); R createDeptName = sysClient.getDeptName(createDept); if (!createDeptName.isSuccess() && createDeptName.getData() != null) { @@ -473,9 +437,21 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { //表格数据 HashMap temp = new HashMap<>(); temp.put("name", createDeptName.getData()); - temp.put("level", operPhenomenonEntity.getDefectGrading()); - temp.put("createTime", operPhenomenonEntity.getCreateTime().toString()); - temp.put("findTime", operPhenomenonEntity.getFindTime().toString()); + String checkLevel=""; + if(operPhenomenonEntity.getDefectGrading().equals("1")) { + checkLevel="Ⅰ级缺陷"; + } + if(operPhenomenonEntity.getDefectGrading().equals("2") ){ + checkLevel="Ⅱ级缺陷"; + } + if(operPhenomenonEntity.getDefectGrading().equals("3") ){ + checkLevel="Ⅲ级缺陷"; + } + temp.put("level", checkLevel); + String createTime= simpleDateFormat.format(operPhenomenonEntity.getCreateTime()); + temp.put("createTime", createTime); + String findTime= simpleDateFormat.format(operPhenomenonEntity.getFindTime()); + temp.put("findTime", findTime); temp.put("descripiton", operPhenomenonEntity.getDescripiton()); temp.put("disposeDesc", operPhenomenonEntity.getDisposeDesc()); checkList.add(temp); @@ -490,8 +466,8 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { wrapperYear.eq(OperPhenomenonEntity::getDiscriminateStatus, TreatMethodConstant.AUTO_SCREENED); wrapperYear.in(OperPhenomenonEntity::getCreateDept, deptIds); List yearPhenomenonEntities = operPhenomenonService.list(wrapperYear); - yearPhenomenonEntities= yearPhenomenonEntities.stream().filter(s ->StringUtil.isNotBlank(s.getDefectGrading())).filter(s -> ObjectUtil.isNotEmpty(s.getCreateDept())).collect(Collectors.toList()); - List yearConclusionList = yearPhenomenonEntities.stream().filter(s -> s.getConclusionStatus().equals(1)).collect(Collectors.toList()); + yearPhenomenonEntities = yearPhenomenonEntities.stream().filter(s -> StringUtil.isNotBlank(s.getDefectGrading())).filter(s -> ObjectUtil.isNotEmpty(s.getCreateDept())).collect(Collectors.toList()); + List yearConclusionList = yearPhenomenonEntities.stream().filter(s -> s.getConclusionStatus().equals("1")).collect(Collectors.toList()); ArrayList> checkStatistics = new ArrayList<>(); List checkChartRes = new ArrayList<>(); @@ -499,13 +475,13 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { //表格数据 HashMap temp = new HashMap<>(); temp.put("deptName", "总计"); - temp.put("checkLevel", "0"); + temp.put("checkLevel", "无等级"); temp.put("findShortagesMon", "0"); temp.put("shortagesMon", "0"); temp.put("findShortagesYear", "0"); temp.put("shortagesYear", "0"); - temp.put("shortagesRate", "0"); - checkList.add(temp); + temp.put("shortagesRate", "0%"); + checkStatistics.add(temp); map.put("checkStatistics", checkStatistics); } else { Map>> phenomenonMap = yearPhenomenonEntities.stream().collect( @@ -515,13 +491,13 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { R deptName1 = sysClient.getDeptName(deptMapEntry.getKey()); for (Map.Entry> levelList : deptMapEntry.getValue().entrySet()) { Integer findShortagesYear = levelList.getValue().size(); - Integer shortagesYear = yearConclusionList.stream().filter(s -> s.getDefectLevel().equals(deptMapEntry)).filter(s -> s.getDefectLevel().equals(deptMapEntry)).collect(Collectors.toList()).size(); + Integer shortagesYear = yearConclusionList.stream().filter(s -> s.getDefectGrading().equals(levelList.getKey())).collect(Collectors.toList()).size(); Double shortagesRate = 0d; if (findShortagesYear != 0 && shortagesYear != 0) { shortagesRate = BigDecimal.valueOf(shortagesYear).divide(BigDecimal.valueOf(findShortagesYear), 2, BigDecimal.ROUND_UP).doubleValue(); } - Integer findShortagesMon = Optional.ofNullable(monPhenomenonList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectLevel().equals(deptMapEntry)).filter(s -> s.getDefectLevel().equals(deptMapEntry)).collect(Collectors.toList()).size(); - Integer shortagesMon = Optional.ofNullable(monConclusionList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectLevel().equals(deptMapEntry)).filter(s -> s.getDefectLevel().equals(deptMapEntry)).collect(Collectors.toList()).size(); + Integer findShortagesMon = Optional.ofNullable(monPhenomenonList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectGrading().equals(levelList.getKey())).collect(Collectors.toList()).size(); + Integer shortagesMon = Optional.ofNullable(monConclusionList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectGrading().equals(levelList.getKey())).collect(Collectors.toList()).size(); CheckChartVo checkChartVo = new CheckChartVo(deptName1.getData(), levelList.getKey(), findShortagesMon, shortagesMon, findShortagesYear, shortagesYear, shortagesRate); checkChartRes.add(checkChartVo); } @@ -530,37 +506,41 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { Map> levelPhenomenonList = yearPhenomenonEntities.stream().collect(Collectors.groupingBy(OperPhenomenonEntity::getDefectGrading)); for (Map.Entry> levelPhenomenon : levelPhenomenonList.entrySet()) { Integer findShortagesYear = levelPhenomenon.getValue().size(); - Integer shortagesYear = Optional.ofNullable(yearConclusionList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectLevel().equals(levelPhenomenon)).collect(Collectors.toList()).size(); + Integer shortagesYear = Optional.ofNullable(yearConclusionList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectGrading().equals(levelPhenomenon.getKey())).collect(Collectors.toList()).size(); Double shortagesRate = 0d; if (findShortagesYear != 0 && shortagesYear != 0) { shortagesRate = BigDecimal.valueOf(shortagesYear).divide(BigDecimal.valueOf(findShortagesYear), 2, BigDecimal.ROUND_UP).doubleValue(); } - Integer findShortagesMon = Optional.ofNullable(monPhenomenonList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectLevel().equals(levelPhenomenon)).collect(Collectors.toList()).size(); - Integer shortagesMon = Optional.ofNullable(monConclusionList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectLevel().equals(levelPhenomenon)).collect(Collectors.toList()).size(); + Integer findShortagesMon = Optional.ofNullable(monPhenomenonList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectGrading().equals(levelPhenomenon.getKey())).collect(Collectors.toList()).size(); + Integer shortagesMon = Optional.ofNullable(monConclusionList).orElse(new ArrayList<>()).stream().filter(s -> s.getDefectGrading().equals(levelPhenomenon.getKey())).collect(Collectors.toList()).size(); CheckChartVo checkChartVo = new CheckChartVo("总计", levelPhenomenon.getKey(), findShortagesMon, shortagesMon, findShortagesYear, shortagesYear, shortagesRate); checkChartRes.add(checkChartVo); } + for (CheckChartVo checkChartRe : checkChartRes) { + //表格数据 + HashMap temp = new HashMap<>(); + temp.put("deptName", checkChartRe.getDeptName()); + String checkLevel=null; + if(checkChartRe.getCheckLevel().equals("1")) { + checkLevel="Ⅰ级缺陷"; + } + if(checkChartRe.getCheckLevel().equals("2")) { + checkLevel="Ⅱ级缺陷"; + } + if(checkChartRe.getCheckLevel().equals("3")) { + checkLevel="Ⅲ级缺陷"; + } + temp.put("checkLevel", checkLevel); + temp.put("findShortagesMon", checkChartRe.getFindShortagesMon().toString()); + temp.put("shortagesMon", checkChartRe.getShortagesMon().toString()); + temp.put("findShortagesYear", checkChartRe.getShortagesYear().toString()); + temp.put("shortagesYear", checkChartRe.getFindShortagesYear().toString()); + temp.put("shortagesRate", checkChartRe.getShortagesRate()* 100 + "%"); + checkStatistics.add(temp); + map.put("checkStatistics", checkStatistics); + } } - for (CheckChartVo checkChartRe : checkChartRes) { - //表格数据 - HashMap temp = new HashMap<>(); - temp.put("deptName", checkChartRe.getDeptName()); - temp.put("checkLevel", checkChartRe.getCheckLevel()); - temp.put("findShortagesMon",checkChartRe.getFindShortagesMon().toString()); - temp.put("shortagesMon",checkChartRe.getShortagesMon().toString()); - temp.put("findShortagesYear", checkChartRe.getShortagesYear().toString()); - temp.put("shortagesYear", checkChartRe.getFindShortagesYear().toString()); - temp.put("shortagesRate", checkChartRe.getShortagesRate().toString()); - checkList.add(temp); - map.put("checkStatistics", checkStatistics); - } - - -// if (CollectionUtils.isNotEmpty(ticketNumbers)) { -// String percent = PercentCountUtils.getPercent(evaluateEntities.size(), ticketNumbers.size()); -// ticketCount.setPercentPassTicket(percent); -// } // 两票执行情况 R> yearTicket = ticketInfoClient.getWorkTicketByTime(yearStart, yearEndV2); R> yearOperateTicket = ticketInfoClient.getOperateTicketByTime(yearStart, yearEndV2); @@ -572,7 +552,7 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { List ticketList = new ArrayList<>(); for (Dept dept : deptList) { String stationId = dept.getStationId(); - if (stationId==null){ + if (stationId == null) { continue; } TicketChartVo chartVo = new TicketChartVo(); @@ -582,61 +562,61 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { TicketChartCell ticketChartCell = new TicketChartCell(); ticketChartCell.setTicketType(value.getType()); ticketChartCell.setTicketName(value.getFileName()); - if (value.getTicketType()==2){ + if (value.getTicketType() == 2) { List yearTicketCollect = Optional.ofNullable(yearTicket.getData()).orElse(new ArrayList<>()).stream() - .filter(s ->stationId.equals(s.getSignageCode())) + .filter(s -> stationId.equals(s.getSignageCode())) .filter(s -> s.getType().equals(value.getType())).collect(Collectors.toList()); List monthTicketCollect = Optional.ofNullable(monthTicket.getData()).orElse(new ArrayList<>()).stream() .filter(s -> s.getSignageCode().equals(stationId)) .filter(s -> s.getType().equals(value.getType())).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(yearTicketCollect)){ + if (CollectionUtils.isNotEmpty(yearTicketCollect)) { //年合格率和数量 Integer count = yearTicketCollect.size(); ticketChartCell.setTicketYear(count); List ticketIds = yearTicketCollect.stream().map(s -> s.getId()).collect(Collectors.toList()); R ticketPassCount = ticketInfoClient.getTicketPassByIds(ticketIds); - if (ticketPassCount.isSuccess() && ticketPassCount.getData() != null&&count!=0) { + if (ticketPassCount.isSuccess() && ticketPassCount.getData() != null && count != 0) { Double ticketYearPerc = BigDecimal.valueOf(ticketPassCount.getData()).divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_UP).doubleValue(); ticketChartCell.setTicketYeaPercr(ticketYearPerc); } } - if (CollectionUtils.isNotEmpty(monthTicketCollect)){ + if (CollectionUtils.isNotEmpty(monthTicketCollect)) { //月合格率和数量 Integer count = monthTicketCollect.size(); ticketChartCell.setTicketMon(count); List monthTicketIds = monthTicketCollect.stream().map(s -> s.getId()).collect(Collectors.toList()); R ticketMonthPassCount = ticketInfoClient.getTicketPassByIds(monthTicketIds); - if (ticketMonthPassCount.isSuccess() && ticketMonthPassCount.getData() != null&&count!=0) { + if (ticketMonthPassCount.isSuccess() && ticketMonthPassCount.getData() != null && count != 0) { Double ticketMonthPerc = BigDecimal.valueOf(ticketMonthPassCount.getData()).divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_UP).doubleValue(); ticketChartCell.setTicketMonPerc(ticketMonthPerc); } } } - if (value.getTicketType()==1){ + if (value.getTicketType() == 1) { List yearOperateCollect = Optional.ofNullable(yearOperateTicket.getData()).orElse(new ArrayList<>()).stream() - .filter(s ->stationId.equals(s.getSignageCode())) + .filter(s -> stationId.equals(s.getSignageCode())) .filter(s -> s.getTicketType().equals(value.getType())).collect(Collectors.toList()); List monthOperateCollect = Optional.ofNullable(monthOperateTicket.getData()).orElse(new ArrayList<>()).stream() .filter(s -> s.getSignageCode().equals(stationId)) .filter(s -> s.getTicketType().equals(value.getType())).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(yearOperateCollect)){ + if (CollectionUtils.isNotEmpty(yearOperateCollect)) { //年合格率和数量 Integer count = yearOperateCollect.size(); ticketChartCell.setTicketYear(count); List ticketIds = yearOperateCollect.stream().map(s -> s.getId()).collect(Collectors.toList()); R ticketPassCount = ticketInfoClient.getTicketPassByIds(ticketIds); - if (ticketPassCount.isSuccess() && ticketPassCount.getData() != null&&count!=0) { + if (ticketPassCount.isSuccess() && ticketPassCount.getData() != null && count != 0) { Double ticketYearPerc = BigDecimal.valueOf(ticketPassCount.getData()).divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_UP).doubleValue(); ticketChartCell.setTicketYeaPercr(ticketYearPerc); } } - if (CollectionUtils.isNotEmpty(monthOperateCollect)){ + if (CollectionUtils.isNotEmpty(monthOperateCollect)) { //月合格率和数量 Integer count = monthOperateCollect.size(); ticketChartCell.setTicketMon(count); List monthTicketIds = monthOperateCollect.stream().map(s -> s.getId()).collect(Collectors.toList()); R ticketMonthPassCount = ticketInfoClient.getTicketPassByIds(monthTicketIds); - if (ticketMonthPassCount.isSuccess() && ticketMonthPassCount.getData() != null&&count!=0) { + if (ticketMonthPassCount.isSuccess() && ticketMonthPassCount.getData() != null && count != 0) { Double ticketMonthPerc = BigDecimal.valueOf(ticketMonthPassCount.getData()).divide(BigDecimal.valueOf(count), 2, BigDecimal.ROUND_UP).doubleValue(); ticketChartCell.setTicketMonPerc(ticketMonthPerc); } @@ -647,11 +627,14 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { chartVo.setChartCells(cellList); ticketList.add(chartVo); } - List sumCollect=new ArrayList<>(); - ticketList.stream().map(s -> sumCollect.addAll(s.getChartCells())); - Map> groupingCollect = sumCollect.stream().collect(Collectors.groupingBy(TicketChartCell::getTicketType)); + List allCollect = new ArrayList<>(); + List sumCollect = new ArrayList<>(); + for (TicketChartVo ticketChartVo : ticketList) { + allCollect.addAll( ticketChartVo.getChartCells()); + } + Map> groupingCollect = allCollect.stream().collect(Collectors.groupingBy(TicketChartCell::getTicketType)); for (Map.Entry> mapTicketChart : groupingCollect.entrySet()) { - TicketChartCell sumCell=new TicketChartCell(); + TicketChartCell sumCell = new TicketChartCell(); sumCell.setTicketType(mapTicketChart.getKey()); sumCell.setTicketName(TicketConstants.TicketTypeNameEnum.getTicketNameByType(mapTicketChart.getKey())); List ticketChartValue = mapTicketChart.getValue(); @@ -661,72 +644,132 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { sumCell.setTicketYeaPercr(ticketChartValue.stream().mapToDouble(TicketChartCell::getTicketYeaPercr).sum()); sumCollect.add(sumCell); } - TicketChartVo ticketChartVo=new TicketChartVo(); + TicketChartVo ticketChartVo = new TicketChartVo(); ticketChartVo.setDeptName("总计"); ticketChartVo.setChartCells(sumCollect); - + ticketList.add(ticketChartVo); +// 两票排序 + ticketList.sort(Comparator.comparing(TicketChartVo::getDeptName,Comparator.reverseOrder())); //两票表格数据 ArrayList> ticketListRes = new ArrayList<>(); for (TicketChartVo chartVo : ticketList) { HashMap ticketMap = new HashMap<>(); + HashMap ticketMap2 = new HashMap<>(); for (TicketChartCell chartCell : chartVo.getChartCells()) { String ticketType = chartCell.getTicketType(); - ticketMap.put("deptName",chartVo.getDeptName()); - ticketMap.put("info","执行"); - ticketMap.put("infoPass","合格率"); - ticketMap.put("ticketMon"+ticketType,String.valueOf(chartCell.getTicketMon())); - ticketMap.put("ticketYear"+ticketType,String.valueOf(chartCell.getTicketYear())); - ticketMap.put("ticketMonPerc"+ticketType,String.valueOf(chartCell.getTicketMonPerc())); - ticketMap.put("ticketYeaPercr"+ticketType,String.valueOf(chartCell.getTicketYeaPercr())); + ticketMap.put("deptName", chartVo.getDeptName()); + ticketMap2.put("deptName", chartVo.getDeptName()); + ticketMap.put("info", "执行"); + ticketMap2.put("info", "合格率"); + ticketMap.put("ticketMon" + ticketType, String.valueOf(chartCell.getTicketMon())); + ticketMap.put("ticketYear" + ticketType, String.valueOf(chartCell.getTicketYear())); + ticketMap2.put("ticketMon" + ticketType, chartCell.getTicketMonPerc()* 100 + "%"); + ticketMap2.put("ticketYear" + ticketType, chartCell.getTicketYeaPercr()* 100 + "%"); } ticketListRes.add(ticketMap); + ticketListRes.add(ticketMap2); } + ticketListRes.sort(Comparator.comparing(o -> o.get("deptName"))); map.put("ticketList", ticketListRes); //两票柱状图数据 - // 创建数据 + // 创建柱状和折线数据库 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); - for (TicketChartVo chartVo : ticketList) { - for (int i = 0; i < chartVo.getChartCells().size(); i++) { - TicketChartCell ticketChartCell = chartVo.getChartCells().get(i); - dataset.addValue(ticketChartCell.getTicketMon(), String.valueOf(i), ticketChartCell.getTicketName()); - } + for (TicketChartCell sumTicket : sumCollect) { + dataset.addValue(sumTicket.getTicketMon(), "数量", sumTicket.getTicketName()); } DefaultCategoryDataset datasetLine = new DefaultCategoryDataset(); - for (TicketChartVo chartVo : ticketList) { - for (int i = 0; i < chartVo.getChartCells().size(); i++) { - TicketChartCell ticketChartCell = chartVo.getChartCells().get(i); - datasetLine.addValue(ticketChartCell.getTicketMonPerc(), ticketChartCell.getTicketName(), ticketChartCell.getTicketName()); - } + for (TicketChartCell sumTicket : sumCollect) { + datasetLine.addValue(sumTicket.getTicketMonPerc(), "合格率", sumTicket.getTicketName()); } - String title=deptName+"水电运维项目两票统计表"; - String domainAxis="数量"; - String rangeAxis="票据类型"; - ImageEntity ticketImage = JFreeUtil.iCreateBarLineChart(true, title, domainAxis, rangeAxis, dataset, datasetLine,662, 378); + String title = deptName + "水电运维项目两票统计表"; + String rangeAxis = "数量"; + ImageEntity ticketImage = JFreeUtil.iCreateBarLineChart(true, title, null, rangeAxis, dataset, datasetLine, 662, 378); map.put("ticketImage", ticketImage); - -// //模拟表格数据 -// ArrayList> list = new ArrayList<>(2); -// -// HashMap temp = new HashMap<>(3); -// temp.put("name", "name1"); -//// temp.put("name", "第一个人"); -//// temp.put("age", "23"); -// list.add(temp); -// temp = new HashMap<>(3); -// temp.put("name", "2"); -//// temp.put("name", "第二个人"); -//// temp.put("age", "24"); -// list.add(temp); -// map.put("safelist", list); - - -// //模拟柱状图图数据 -// String[] monthArray = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月"}; -// double[] value = {20, 30, 25, 50, 40, 25, 50, 40}; -// ImageEntity lineEntity = JFreeUtil.lineChart("测试111", monthArray, value, 300, 200); -// map.put("lineEntity", lineEntity); return R.success("成功"); + } + + private void getPowerData(List deptList, String yearStart, String yearEnd, String yearBeforeStart, String yearBeforeEnd, String monthStart, String monthEnd, String beforeMonthStart, String beforeMonthEnd, String monthStartBeforeYear, String monthEndBeforeYear, List devices, List planYearData, List powerPercentageVoList) { + for (Dept dept : deptList) { + MonPowerPercentageVo powerVo = new MonPowerPercentageVo(); + powerVo.setDeptId(dept.getId()); + powerVo.setDeptName(dept.getDeptName()); + BigDecimal powerYear = new BigDecimal(0); + BigDecimal powerYearBefore = new BigDecimal(0); + BigDecimal powerMonth = new BigDecimal(0); + BigDecimal powerMonthBefore = new BigDecimal(0); + BigDecimal powerMonthYearBefore = new BigDecimal(0); + Double planGeneration = 0d; + List planGenerationById = planYearData.stream().filter(s -> dept.getId().equals(s.getCreateDept())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(planGenerationById)) { + planGeneration = Double.valueOf(planGenerationById.get(0).getPlanGeneration()); + } + // 站点设备集合 + List stationDevices = devices.stream().filter(device -> device.getCreateDept().equals(dept.getId())).collect(Collectors.toList()); + for (EminfoAndEmParamVo device : stationDevices) { + //今年发电量 + List analyseData = analyseDataService.periodTargetData(yearStart, yearEnd, 3, EquipmentConstants.CycleTypeEnum.YEAR_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); + if (CollectionUtil.isNotEmpty(analyseData)) { + BigDecimal yearPower = analyseData.stream().filter(ktv -> ktv.getVal() != null) + .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + powerYear = powerYear.add(yearPower); + } + //去年发电量 + List analyseDataYearBefore = analyseDataService.periodTargetData(yearBeforeStart, yearBeforeEnd, 3, EquipmentConstants.CycleTypeEnum.YEAR_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); + if (CollectionUtil.isNotEmpty(analyseDataYearBefore)) { + BigDecimal powerBefore = analyseDataYearBefore.stream().filter(ktv -> ktv.getVal() != null) + .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + powerYearBefore = powerYearBefore.add(powerBefore); + } + //今年当月发电量 + List analyseDataMonth = analyseDataService.periodTargetData(monthStart, monthEnd, 3, EquipmentConstants.CycleTypeEnum.MONTH_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); + if (CollectionUtil.isNotEmpty(analyseDataMonth)) { + BigDecimal powerBefore = analyseDataMonth.stream().filter(ktv -> ktv.getVal() != null) + .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + powerMonth = powerMonth.add(powerBefore); + } + //上个月发电量 + List analyseDataMonthBefore = analyseDataService.periodTargetData(beforeMonthStart, beforeMonthEnd, 3, EquipmentConstants.CycleTypeEnum.MONTH_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); + if (CollectionUtil.isNotEmpty(analyseDataMonthBefore)) { + BigDecimal powerBefore = analyseDataMonthBefore.stream().filter(ktv -> ktv.getVal() != null) + .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + powerMonthBefore = powerMonthBefore.add(powerBefore); + } + //去年当月发电量 + List analyseDataMonthBeforeYear = analyseDataService.periodTargetData(monthStartBeforeYear, monthEndBeforeYear, 3, EquipmentConstants.CycleTypeEnum.MONTH_CYCLE.getType(), device.getEmCode(), HomePageConstant.ELECTRICITY_CONSUMPTION); + if (CollectionUtil.isNotEmpty(analyseDataMonthBeforeYear)) { + BigDecimal powerBefore = analyseDataMonthBeforeYear.stream().filter(ktv -> ktv.getVal() != null) + .map(ktv -> BigDecimal.valueOf(Double.valueOf(ktv.getVal()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + powerMonthYearBefore = powerMonthYearBefore.add(powerBefore); + } + } + powerVo.setPowerYear(powerYear.doubleValue()); + powerVo.setPowerYearBefore(powerYearBefore.doubleValue()); + BigDecimal yearPercentage = new BigDecimal(0); + BigDecimal planPercentage = new BigDecimal(0); + if (powerYearBefore.compareTo(BigDecimal.ZERO) != 0) { + yearPercentage = (powerYear.subtract(powerYearBefore)).divide(powerYearBefore, 2, BigDecimal.ROUND_UP); + } + if (BigDecimal.valueOf(planGeneration).compareTo(BigDecimal.ZERO) != 0) { + planPercentage = powerYear.divide(BigDecimal.valueOf(planGeneration), 2, BigDecimal.ROUND_UP); + } + powerVo.setPlanPercentage(planPercentage.doubleValue()); + powerVo.setPowerYearPercentage(yearPercentage.doubleValue()); + powerVo.setPowerMon(powerMonth.doubleValue()); + powerVo.setPowerMonBefore(powerMonthBefore.doubleValue()); + powerVo.setPowerMonYearBefore(powerMonthYearBefore.doubleValue()); + BigDecimal monPercentage = new BigDecimal(0); + if (powerMonthYearBefore.compareTo(BigDecimal.ZERO) != 0) { + monPercentage = (powerMonth.subtract(powerMonthYearBefore)).divide(powerMonthYearBefore, 2, BigDecimal.ROUND_UP); + } + powerVo.setPowerMonPercentage(monPercentage.doubleValue()); + powerPercentageVoList.add(powerVo); + } } private static void getTabelSum(Long deptId, List powerPercentageVoList, List planYearAll, List planMonAll, HashMap map) { @@ -752,15 +795,15 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { powerVo.setPowerYearBefore(powerYearBefore.doubleValue()); BigDecimal yearPercentage = new BigDecimal(0); BigDecimal planPercentage = new BigDecimal(0); - if (powerYearBefore.compareTo(BigDecimal.ZERO)!=0) { + if (powerYearBefore.compareTo(BigDecimal.ZERO) != 0) { // 年累计环比 yearPercentage = (powerYear.subtract(powerYearBefore)).divide(powerYearBefore, 2, BigDecimal.ROUND_UP); } - if (BigDecimal.valueOf(planGeneration).compareTo(BigDecimal.ZERO)!=0) { + if (BigDecimal.valueOf(planGeneration).compareTo(BigDecimal.ZERO) != 0) { planPercentage = powerYear.divide(BigDecimal.valueOf(planGeneration), 2, BigDecimal.ROUND_UP); // 年计划完成率 map.put("yearCompletionRate", planPercentage.toString()); - }else { + } else { map.put("yearCompletionRate", 0); } powerVo.setPowerYearPercentage(yearPercentage.doubleValue()); @@ -773,7 +816,7 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { map.put("powerMon", powerMonth.toString()); // 项目月计划完成量 BigDecimal planMonPercentage = new BigDecimal(0); - if (powerMonth.compareTo(BigDecimal.ZERO)!=0 &&BigDecimal.valueOf(planMonGeneration).compareTo(BigDecimal.ZERO)!=0) { + if (powerMonth.compareTo(BigDecimal.ZERO) != 0 && BigDecimal.valueOf(planMonGeneration).compareTo(BigDecimal.ZERO) != 0) { planMonPercentage = powerMonth.divide(BigDecimal.valueOf(planMonGeneration), 2, BigDecimal.ROUND_UP); } map.put("monCompletionRate", planMonPercentage); @@ -786,12 +829,12 @@ public class AreaMonthReportServiceImpl implements IAreaMonthReportService { .reduce(BigDecimal.ZERO, BigDecimal::add); powerVo.setPowerMonYearBefore(powerMonthYearBefore.doubleValue()); BigDecimal monPercentage = new BigDecimal(0); - if (powerMonthYearBefore.compareTo(BigDecimal.ZERO)!=0) { - monPercentage =(powerMonth.subtract(powerMonthYearBefore)).divide(powerMonthYearBefore, 2, BigDecimal.ROUND_UP); + if (powerMonthYearBefore.compareTo(BigDecimal.ZERO) != 0) { + monPercentage = (powerMonth.subtract(powerMonthYearBefore)).divide(powerMonthYearBefore, 2, BigDecimal.ROUND_UP); } //发电量环比增加 BigDecimal monAdd = powerMonth.subtract(powerMonthBefore); - if (powerMonthBefore.compareTo(BigDecimal.ZERO)==0) { + if (powerMonthBefore.compareTo(BigDecimal.ZERO) == 0) { map.put("percentageAdd", 0); } else { map.put("percentageAdd", monAdd.divide(powerMonthBefore, 2, BigDecimal.ROUND_UP).toString()); diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java index 40a632c..909c71c 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java @@ -2,6 +2,7 @@ package com.hnac.hzims.operational.util; import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.lang.Assert; +import com.hnac.hzims.operational.data.controller.CustomRenderer; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.jfree.chart.ChartFactory; @@ -12,9 +13,7 @@ import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; -import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; -import org.jfree.chart.labels.StandardCategoryToolTipGenerator; -import org.jfree.chart.labels.StandardPieSectionLabelGenerator; +import org.jfree.chart.labels.*; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.DatasetRenderingOrder; import org.jfree.chart.plot.PiePlot; @@ -23,6 +22,7 @@ import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.chart.renderer.category.CategoryItemRenderer; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.chart.renderer.category.StandardBarPainter; +import org.jfree.chart.ui.TextAnchor; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DefaultPieDataset; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge; @@ -288,14 +288,20 @@ public class JFreeUtil { CategoryPlot categoryplot = chart.getCategoryPlot(); categoryplot.setDataset(1, datasetLine); LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer(); + //数据标签展示 lineandshaperenderer.setDefaultToolTipGenerator(new StandardCategoryToolTipGenerator()); lineandshaperenderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); lineandshaperenderer.setDefaultLinesVisible(true); - lineandshaperenderer.setSeriesPaint(0, Color.decode("#9BBB59")); +// lineandshaperenderer.setDefaultItemLabelPaint(Color.BLACK); +// lineandshaperenderer.setDefaultItemLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); +// lineandshaperenderer.setDefaultPositiveItemLabelPosition(new ItemLabelPosition( +// ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_RIGHT)); + lineandshaperenderer.setSeriesPaint(0, Color.BLACK); categoryplot.setRenderer(1, lineandshaperenderer); - NumberAxis numberaxis = new NumberAxis("平均值"); - numberaxis.setLabelFont(new Font("宋体", Font.TRUETYPE_FONT, 12)); + NumberAxis numberaxis = new NumberAxis("合格率"); + numberaxis.setLabelFont(new Font("微软雅黑", Font.TRUETYPE_FONT, 12)); categoryplot.setRangeAxis(1, numberaxis); +// // 显示折线图,1,1坐标轴都在右侧 categoryplot.mapDatasetToRangeAxis(1, 1); categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); } @@ -345,13 +351,16 @@ public class JFreeUtil { CategoryAxis domainAxis = categoryplot.getDomainAxis(); // 设置Y轴的提示文字样式 rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); +// chart.setTextAntiAlias(false); // 设置Y轴刻度线的长度 rangeAxis.setTickMarkInsideLength(10f); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的 domainAxis.setLowerMargin(0.1); domainAxis.setUpperMargin(0.1); - + // 设置横轴的label为45度 + domainAxis.setMaximumCategoryLabelWidthRatio(4f); + domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // rangeAxis.setTickMarkOutsideLength(10f); // 设置X轴下的标签文字 domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); @@ -367,17 +376,17 @@ public class JFreeUtil { // vn.setVerticalTickLabels(true); // 自定义柱状图中柱子的样式 - BarRenderer brender = new BarRenderer(); - brender.setSeriesPaint(0, Color.decode("#C0504D")); // 给series1 Bar - brender.setSeriesPaint(1, Color.decode("#E46C0A")); // 给series2 Bar - brender.setSeriesPaint(2, Color.decode("#4F81BD")); // 给series3 Bar - brender.setSeriesPaint(3, Color.decode("#00B050")); // 给series4 Bar - brender.setSeriesPaint(4, Color.decode("#7030A0")); // 给series5 Bar - brender.setSeriesPaint(5, Color.decode("#00BF00")); // 给series6 Bar + CustomRenderer brender = new CustomRenderer(); // 设置柱状图的顶端显示数字 + brender.setDefaultItemLabelsVisible(true); brender.setIncludeBaseInRange(true); brender.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); - brender.setDefaultItemLabelsVisible(true); + brender.setDefaultItemLabelPaint(Color.WHITE); + brender.setDefaultItemLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); + brender.setDefaultPositiveItemLabelPosition(new ItemLabelPosition( + ItemLabelAnchor.INSIDE11, TextAnchor.TOP_LEFT)); + brender.setMinimumBarLength(10); + // 设置柱子为平面图不是立体的 brender.setBarPainter(new StandardBarPainter()); // 设置柱状图之间的距离0.1代表10%; @@ -437,8 +446,8 @@ public class JFreeUtil { // brender.setSeriesPaint(5, Color.decode("#00BF00")); // 给series6 Bar // 设置柱状图的顶端显示数字 brender.setIncludeBaseInRange(true); -// brender.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); -// brender.setBaseItemLabelsVisible(isBaseItemLabelsVisible()); + brender.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); + brender.setDefaultItemLabelsVisible(true); // 设置柱子为平面图不是立体的 brender.setBarPainter(new StandardBarPainter()); // 设置柱状图之间的距离0.1代表10%; @@ -459,7 +468,6 @@ public class JFreeUtil { categoryplot.setRenderer(brender); - } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/TimeUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/TimeUtils.java index 71005de..58bf871 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/TimeUtils.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/TimeUtils.java @@ -2,8 +2,10 @@ package com.hnac.hzims.operational.util; import org.springblade.core.tool.utils.DateUtil; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; public class TimeUtils { @@ -108,4 +110,37 @@ public class TimeUtils { String end = DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATE) + " 23:59:59"; return end; } + public static List getListByYear(Integer year) { + List monthList=new ArrayList<>(); + for (int i = 1; i <13; i++) { + // 创建一个Calendar对象 + Calendar calendar = Calendar.getInstance(); + // 设置年份 + calendar.set(Calendar.YEAR, Integer.valueOf(year)); + // 设置月份为1(即一月) + calendar.set(Calendar.MONTH, i); + calendar.set(Calendar.DAY_OF_MONTH, 1); + // 将日期对象减去一天,即为当月的最后一天 + String mon = DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATE); + + monthList.add(mon); + } + return monthList; + } + public static String getMon(Integer year,Integer month) { + // 创建一个Calendar对象 + Calendar calendar = Calendar.getInstance(); + // 设置年份 + calendar.set(Calendar.YEAR, year); + // 设置月份为1(即一月) + calendar.set(Calendar.MONTH, month-1); + // 设置日期为1 + calendar.set(Calendar.DATE, 1); + // 设置时间为0点0分0秒 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + String start = DateUtil.format(calendar.getTime(), DateUtil.PATTERN_DATE) ; + return start; + } } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java index 306ab29..5b28ec5 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java @@ -7,12 +7,17 @@ import com.hnac.hzims.operational.util.pojo.HttpResponse; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.List; import java.util.Map; /** @@ -83,4 +88,87 @@ public abstract class WordUtils { } } + public static XWPFDocument exportWordV2(String templatePath, Map params) { + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); +// 合并第一列相同行的数据 + tableIfSame(doc); + return doc; + } catch (Exception e) { + e.printStackTrace(); + return new XWPFDocument(); + } + } + + /** + * 合并第一列相同行的数据 + * @param xwpfDocument + */ + public static void tableIfSame(XWPFDocument xwpfDocument){ + //获取文档中所有的表格 + List tableList = xwpfDocument.getTables(); + if (tableList.size()>0){ + //循环表格 + for (int tabIndex=0;tabIndex rows = xwpfTable.getRows(); + for (int i = 0; i < rows.size(); i++) { + if (i==rows.size()-1){ + continue; + } + XWPFTableCell cell = rows.get(i).getCell(0); + XWPFTableCell cell2 = rows.get(i+1).getCell(0); + String text = cell.getText(); + String text2 = cell2.getText(); + if (text2.equals(text)){ + mergeCellsVertically(xwpfTable,0,i,i+1); + } + } + } + } + } + + /** + * word单元格列合并 + * @param table 表格 + * @param row 合并列所在行 + * @param startCell 开始列 + * @param endCell 结束列 + * @date 2020年4月8日 下午4:43:54 + */ + public static void mergeCellsHorizontal(XWPFTable table, int row, int startCell, int endCell) { + for (int i = startCell; i <= endCell; i++) { + XWPFTableCell cell = table.getRow(row).getCell(i); + if (i == startCell) { + // The first merged cell is set with RESTART merge value + cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART); + } else { + // Cells which join (merge) the first one, are set with CONTINUE + cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE); + } + } + } + + /** + * word单元格行合并 + * @param table 表格 + * @param col 合并行所在列 + * @param startRow 开始行 + * @param endRow 结束行 + * @date 2020年4月8日 下午4:46:18 + */ + public static void mergeCellsVertically(XWPFTable table, int col, int startRow, int endRow) { + for (int i = startRow; i <= endRow; i++) { + XWPFTableCell cell = table.getRow(i).getCell(col); + if (i == startRow) { + // The first merged cell is set with RESTART merge value + cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART); + } else { + // Cells which join (merge) the first one, are set with CONTINUE + cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE); + } + } + } + } diff --git a/hzims-service/operational/src/main/resources/template/waterMonReport.docx b/hzims-service/operational/src/main/resources/template/waterMonReport.docx new file mode 100644 index 0000000000000000000000000000000000000000..f29b3210f5fe0a368dfb64cadb4fba1db52f69a2 GIT binary patch literal 113046 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 literal 0 HcmV?d00001 From f61883984d4001470f13327da16a1e99db3221fe Mon Sep 17 00:00:00 2001 From: haungxing <1203316822@qq.com> Date: Tue, 1 Aug 2023 20:02:01 +0800 Subject: [PATCH 4/4] =?UTF-8?q?#=20APP=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E4=BF=AE=E6=94=B9=20#=20=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=BF=A1=E6=81=AF=E6=87=92=E5=8A=A0=E8=BD=BD=E6=A0=91?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4=20#=20=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=B6=88=E6=81=AF=E4=B8=AD=E5=BF=83=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8E=BB=E9=99=A4=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hnac/hzims/equipment/feign/IEmInfoClient.java | 10 +++++++++- .../hnac/hzims/equipment/feign/IEmInfoClientBack.java | 5 +++++ .../com/hnac/hzims/equipment/feign/EmInfoClient.java | 19 +++++++++++++++---- .../equipment/service/impl/EmInfoServiceImpl.java | 5 +++-- .../inspect/obj/services/impl/ObjectServiceImpl.java | 11 +++++++---- .../hnac/hzims/message/config/ThreadPoolConfig.java | 2 +- .../controller/MessagePushRecordController.java | 4 ++-- .../message/service/IMessagePushRecordService.java | 15 +++++++++++++++ .../service/impl/MessagePushRecordServiceImpl.java | 10 ++++++++++ 9 files changed, 67 insertions(+), 14 deletions(-) diff --git a/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClient.java b/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClient.java index 7d22c2e..4d5d095 100644 --- a/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClient.java +++ b/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClient.java @@ -79,7 +79,7 @@ public interface IEmInfoClient { String GET_EM_INFO_TREE_BY_EM_CODE = API_PREFIX + "/getEmInfoTreeByEmCode"; String UPDATE_BY_EM_CODE = API_PREFIX + "/updateByEmCode"; String UPDATE_BATCH_EM_STATE = API_PREFIX + "/updateBachEmState"; - + String GET_CHILDREN_BY_EM_CODE = API_PREFIX + "/getChildrenByEmCode"; String GET_EM_CREATE_TABLE = API_PREFIX + "/getEmCreateTable"; @PostMapping(DETAIL) @@ -153,4 +153,12 @@ public interface IEmInfoClient { @PostMapping(GET_EM_CREATE_TABLE) List getEmCreateTable(@RequestParam("list") List tableNames); + + /** + * 获取设备下的子设备编号列表 + * @param emCode 设备编号 + * @return 子设备编号列表 + */ + @GetMapping(GET_CHILDREN_BY_EM_CODE) + R> getChildrenByEmCode(@RequestParam("emCode") String emCode); } diff --git a/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClientBack.java b/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClientBack.java index f79cbfd..e8b0b95 100644 --- a/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClientBack.java +++ b/hzims-service-api/equipment-api/src/main/java/com/hnac/hzims/equipment/feign/IEmInfoClientBack.java @@ -98,4 +98,9 @@ public class IEmInfoClientBack implements IEmInfoClient { public List getEmCreateTable(List tableNames) { return new ArrayList<>(); } + + @Override + public R> getChildrenByEmCode(String emCode) { + return R.fail("远程调用失败"); + } } diff --git a/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/feign/EmInfoClient.java b/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/feign/EmInfoClient.java index 5d999c3..dd24111 100644 --- a/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/feign/EmInfoClient.java +++ b/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/feign/EmInfoClient.java @@ -3,19 +3,20 @@ package com.hnac.hzims.equipment.feign; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.collect.Lists; import com.hnac.hzims.equipment.entity.EmInfoEntity; import com.hnac.hzims.equipment.service.IEmInfoService; import com.hnac.hzims.equipment.vo.DeviceVO; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.system.vo.CreateTableVO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.stream.Collectors; @RestController @@ -133,6 +134,16 @@ public class EmInfoClient implements IEmInfoClient { return service.getEmCreateTable(tableNames); } + @Override + public R> getChildrenByEmCode(@RequestParam String emCode) { + EmInfoEntity emInfo = service.getOne(Wrappers.lambdaQuery().eq(EmInfoEntity::getNumber, emCode)); + if(ObjectUtil.isEmpty(emInfo)) { + return R.data(Lists.newArrayList()); + } + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().like(EmInfoEntity::getPath, emInfo.getPath()); + return R.data(service.list(wrapper).stream().map(EmInfoEntity::getNumber).distinct().collect(Collectors.toList())); + } + /** * * @param emCode diff --git a/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/service/impl/EmInfoServiceImpl.java b/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/service/impl/EmInfoServiceImpl.java index 0d468b4..12726bd 100644 --- a/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/service/impl/EmInfoServiceImpl.java +++ b/hzims-service/equipment/src/main/java/com/hnac/hzims/equipment/service/impl/EmInfoServiceImpl.java @@ -599,14 +599,15 @@ public class EmInfoServiceImpl extends BaseServiceImpl Arrays.stream(path.split("/"))).distinct().collect(Collectors.toList()); emCodes.addAll(childrenEmCode); } + EmInfoEntity emInfo = this.getOne(Wrappers.lambdaQuery().eq(EmInfoEntity::getNumber, parentCode)); // 获取parentCode下的子设备集合 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() - .eq(EmInfoEntity::getGpid, parentCode) + .eq(EmInfoEntity::getGpid, Optional.ofNullable(emInfo).map(EmInfoEntity::getId).orElse(0L)) .eq(EmInfoEntity::getDepartment,deptId); List emInfoList = this.list(queryWrapper); List result = emInfoList.stream().map(emInfoEntity -> { JSONObject object = JSONObject.parseObject(JSON.toJSONString(emInfoEntity)); - object.put("disabled", emCodes.contains(emInfoEntity.getNumber()) ? true : false); + object.put("disabled", emCodes.contains(emInfoEntity.getNumber()) ? false : true); return object; }).collect(Collectors.toList()); return result; diff --git a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/services/impl/ObjectServiceImpl.java b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/services/impl/ObjectServiceImpl.java index 2e97031..0614870 100644 --- a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/services/impl/ObjectServiceImpl.java +++ b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/services/impl/ObjectServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; import com.google.zxing.BarcodeFormat; +import com.hnac.hzims.equipment.feign.IEmInfoClient; import com.hnac.hzinfo.inspect.Constants; import com.hnac.hzinfo.inspect.obj.ObjectConstants; import com.hnac.hzinfo.inspect.obj.entity.*; @@ -58,6 +59,8 @@ public class ObjectServiceImpl extends BaseServiceImpl emCodeList = Func.toStrList(",", object.getEmCodes()); - Function getTemplateProjectByEmCode = index -> { + Function getTemplateProjectByEmCode = emCode -> { ProjectEntity project = new ProjectEntity(); - project.setEmCode(emCodeList.get(index)); + project.setEmCode(emCode); project.setStatus(ObjectConstants.ProjectEnableEnum.YES.getEnableType()); ProjectEntity one = projectService.getOne(project); - return TemplateProjectEntity.builder().templateId(template.getId()).projectId(one.getId()).sort(index).build(); + return TemplateProjectEntity.builder().templateId(template.getId()).projectId(one.getId()).build(); }; List templateProjectList = Stream.iterate(0,n -> n + 1).limit(emCodeList.size()) - .map(getTemplateProjectByEmCode).collect(Collectors.toList()); + .flatMap(index -> emInfoClient.getChildrenByEmCode(emCodeList.get(index)).getData().stream()).map(getTemplateProjectByEmCode).collect(Collectors.toList()); templateProjectService.saveBatch(templateProjectList); } } diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/config/ThreadPoolConfig.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/config/ThreadPoolConfig.java index b3e8b1a..3d2a9a3 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/config/ThreadPoolConfig.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/config/ThreadPoolConfig.java @@ -25,6 +25,6 @@ public class ThreadPoolConfig { @Bean public ExecutorService appMessagePushExecutor() { - return new ThreadPoolExecutor(2, 5, 5L, TimeUnit.SECONDS,new LinkedBlockingQueue()); + return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS,new LinkedBlockingQueue()); } } diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java index c5c3958..560bbcc 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java @@ -51,7 +51,7 @@ public class MessagePushRecordController extends BladeController { @ApiOperation("查询消息推送记录列表") @ApiOperationSupport(order = 3) public R> list(MessagePushRecordEntity request) { - return R.data(messagePushRecordService.list(request)); + return R.data(messagePushRecordService.listNoUserScope(request)); } @GetMapping("/listPage") @@ -62,7 +62,7 @@ public class MessagePushRecordController extends BladeController { title = "消息管理", operatorType = OperatorType.MOBILE, businessType = BusinessType.GENCODE, action = "分页查询消息推送记录列表") public R> listPage(MessagePushRecordEntity request, Query query) { - return R.data(messagePushRecordService.listPage(request, query)); + return R.data(messagePushRecordService.listPageNoUserScope(request, query)); } @GetMapping("/send/{id}") diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java index 56a2974..94a1d31 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java @@ -22,6 +22,13 @@ public interface IMessagePushRecordService extends BaseService list(MessagePushRecordEntity request); /** + * 查询消息推送记录列表 - 无数据权限 + * @param request + * @return + */ + List listNoUserScope(MessagePushRecordEntity request); + + /** * 分页查询消息推送记录列表 * @param request 查询条件 * @param query 分页 @@ -29,6 +36,14 @@ public interface IMessagePushRecordService extends BaseService listPage(MessagePushRecordEntity request, Query query); + /** + * 分页查询消息推送记录列表 - 无数据权限 + * @param request 查询条件 + * @param query 分页 + * @return 消息记录列表 + */ + IPage listPageNoUserScope(MessagePushRecordEntity request, Query query); + /** @Author hx * @Description 根据ID发送短信 * @Date 2023/4/4 17:37 diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessagePushRecordServiceImpl.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessagePushRecordServiceImpl.java index 909b955..cbc3f0c 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessagePushRecordServiceImpl.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessagePushRecordServiceImpl.java @@ -57,10 +57,20 @@ public class MessagePushRecordServiceImpl extends BaseServiceImpl listNoUserScope(MessagePushRecordEntity request) { + return noAurhScopeMapper.selectList(this.getQueryWrapper(request)); + } + + @Override public IPage listPage(MessagePushRecordEntity request, Query query) { return this.page(Condition.getPage(query), this.getQueryWrapper(request)); } + @Override + public IPage listPageNoUserScope(MessagePushRecordEntity request, Query query) { + return noAurhScopeMapper.selectPage(Condition.getPage(query), this.getQueryWrapper(request)); + } + /** * @return java.lang.Boolean 推送结果 * @Author hx