From 3aafd2813e2093ab463061de4ff5608fd6d8fdbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Thu, 22 Aug 2024 16:26:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=A8=E6=9E=B6=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcSdhsEventController.java | 26 +- .../DcTrafficStatisticsController.java | 7 + .../domain/TrafficFlowStatisticsMap.java | 24 + .../mapper/DcGantryStatisticsDataMapper.java | 3 + .../DcTollStationStatisticsDataMapper.java | 1 + .../IDcGantryStatisticsDataService.java | 3 + .../business/service/IDcSdhsEventService.java | 26 +- .../IDcTollStationStatisticsDataService.java | 9 + .../impl/DcGantryStatisticsDataImpl.java | 7 + .../service/impl/DcSdhsEventServiceImpl.java | 670 +++++++++++++----- .../impl/DcTollStationStatisticsDataImpl.java | 5 + .../business/DcGantryStatisticsDataMapper.xml | 93 +++ .../DcTollStationStatisticsDataMapper.xml | 22 + .../wordTemplate/frameDataAnalysis.docx | Bin 0 -> 24321 bytes .../wordTemplate/tollGateEntrance.docx | Bin 0 -> 24035 bytes 15 files changed, 700 insertions(+), 196 deletions(-) create mode 100644 zc-business/src/main/java/com/zc/business/domain/TrafficFlowStatisticsMap.java create mode 100644 zc-business/src/main/resources/wordTemplate/frameDataAnalysis.docx create mode 100644 zc-business/src/main/resources/wordTemplate/tollGateEntrance.docx diff --git a/zc-business/src/main/java/com/zc/business/controller/DcSdhsEventController.java b/zc-business/src/main/java/com/zc/business/controller/DcSdhsEventController.java index 9c44826d..2e1f0c9e 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcSdhsEventController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcSdhsEventController.java @@ -146,10 +146,10 @@ public class DcSdhsEventController { for (String trafficIncidentType : exportKey) { if ("8".equals(trafficIncidentType)){ //门架车流量 - + dcSdhsEventService.exporFrameDataAnalysis(newDoc,dcSdhsEventQuery); } else if ("9".equals(trafficIncidentType)){ //收费站车流量 - + dcSdhsEventService.exporttollGateEntrance(newDoc,dcSdhsEventQuery); } } @@ -226,7 +226,29 @@ public class DcSdhsEventController { @ApiOperation("事故车型分析") public AjaxResult accidentModelAnalysis(DcSdhsEventQuery dcSdhsEventQuery){ return AjaxResult.success( dcSdhsEventService.accidentModelAnalysis(dcSdhsEventQuery)); + } /** + * 收费站出入口分析 + * @param dcSdhsEventQuery + * @return + */ + @GetMapping("/TollBoothStatisticsList") + @ApiOperation("收费站出入口分析") + public AjaxResult TollBoothStatisticsList(DcSdhsEventQuery dcSdhsEventQuery){ + return AjaxResult.success( dcSdhsEventService.TollBoothStatisticsList(dcSdhsEventQuery)); + } + + /** + * 门架分析 + * @param dcSdhsEventQuery + * @return + */ + @GetMapping("/gantryAnalysis") + @ApiOperation("门架分析") + public AjaxResult gantryAnalysis(DcSdhsEventQuery dcSdhsEventQuery){ + return AjaxResult.success( dcSdhsEventService.trafficFlowStatistics(dcSdhsEventQuery)); } + + @ApiOperation("查询交通管制情况分析") @PostMapping("/selectStationAnalysis") public AjaxResult selectStationAnalysis(@RequestBody DcSdhsEventQuery dcSdhsEventQuery) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java b/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java index 035d99c7..ed5a33c1 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java @@ -1065,6 +1065,13 @@ public AjaxResult trafficFlowAtTollStationEntrance(String startDate, String endD // 将查询结果封装为成功响应并返回 return AjaxResult.success(mapList); } + @ApiOperation("获取据库中收费站数数据") + @GetMapping("/history/TollBoothStatisticsList") + public AjaxResult TollBoothStatisticsList(String startDate, String accessType,String periodType) throws HttpException, IOException{ + List mapList = dcTollStationStatisticsDataService.TollBoothStatisticsList(startDate,accessType,periodType); + // 将查询结果封装为成功响应并返回 + return AjaxResult.success(mapList); + } /** * 导出全路段双向实时车流量 diff --git a/zc-business/src/main/java/com/zc/business/domain/TrafficFlowStatisticsMap.java b/zc-business/src/main/java/com/zc/business/domain/TrafficFlowStatisticsMap.java new file mode 100644 index 00000000..d927f89c --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/domain/TrafficFlowStatisticsMap.java @@ -0,0 +1,24 @@ +package com.zc.business.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TrafficFlowStatisticsMap { + private String intervalName; + private String stakeMake; + private String endMake; + private String facilityCode; + private String direction; + private String statisticalDate; + private String facilityName; + private Long trafficVolume; + private String periodType; + +} diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcGantryStatisticsDataMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcGantryStatisticsDataMapper.java index 8249e63b..9395dee0 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcGantryStatisticsDataMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcGantryStatisticsDataMapper.java @@ -2,6 +2,7 @@ package com.zc.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zc.business.domain.DcGantryStatisticsData; +import com.zc.business.domain.TrafficFlowStatisticsMap; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -57,6 +58,8 @@ public interface DcGantryStatisticsDataMapper extends BaseMapper> trafficFlowStatistics(@Param("startDate")String startDate, @Param("endDate")String endDate, @Param("direction")String direction, @Param("periodType")String periodType); + //桩号升序排列 + List trafficFlowStatisticsAsc(@Param("startDate")String startDate, @Param("endDate")String endDate, @Param("direction")String direction, @Param("periodType")String periodType); List> sectionTrafficRanking(@Param("startDate")String startDate, @Param("direction")String direction, @Param("periodType")String periodType); } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcTollStationStatisticsDataMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcTollStationStatisticsDataMapper.java index 83bbec5f..e14eae85 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcTollStationStatisticsDataMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcTollStationStatisticsDataMapper.java @@ -36,5 +36,6 @@ public interface DcTollStationStatisticsDataMapper extends BaseMapper> TollBoothStatistics(@Param("startDate") String startDate, @Param("accessType") String accessType, @Param("periodType") String periodType); + List TollBoothStatisticsList(@Param("startDate") String startDate, @Param("accessType") String accessType, @Param("periodType") String periodType); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcGantryStatisticsDataService.java b/zc-business/src/main/java/com/zc/business/service/IDcGantryStatisticsDataService.java index c096d622..35db947e 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcGantryStatisticsDataService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcGantryStatisticsDataService.java @@ -2,6 +2,7 @@ package com.zc.business.service; import com.baomidou.mybatisplus.extension.service.IService; import com.zc.business.domain.DcGantryStatisticsData; +import com.zc.business.domain.TrafficFlowStatisticsMap; import java.util.List; import java.util.Map; @@ -54,6 +55,8 @@ public interface IDcGantryStatisticsDataService extends IService> trafficFlowStatistics(String startDate, String endDate, String direction, String periodType); + //桩号升序排列 + List trafficFlowStatisticsAsc(String startDate, String endDate, String direction, String periodType); List> sectionTrafficRanking(String startDate, String direction, String periodType); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcSdhsEventService.java b/zc-business/src/main/java/com/zc/business/service/IDcSdhsEventService.java index 2d47612f..1b030d7e 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcSdhsEventService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcSdhsEventService.java @@ -1,8 +1,7 @@ package com.zc.business.service; import com.ruoyi.common.core.domain.AjaxResult; -import com.zc.business.domain.DcSdhsEvent; -import com.zc.business.domain.DcSdhsEventQuery; +import com.zc.business.domain.*; import org.apache.poi.xwpf.usermodel.XWPFDocument; import com.zc.business.domain.DcSdhsEventQuery; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -67,4 +66,27 @@ public interface IDcSdhsEventService void exportAccidentType(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery); AjaxResult selectWeather(); + + + /** + * 收费站出入口分析 + * @param dcSdhsEventQuery + * @return + */ + Map > TollBoothStatisticsList(DcSdhsEventQuery dcSdhsEventQuery); + /** + * 收费站出入口 + * @param newDoc + * @param dcSdhsEventQuery + */ + void exporttollGateEntrance(XWPFDocument newDoc,DcSdhsEventQuery dcSdhsEventQuery); + + /** + * 门架数据导出 + * @param newDoc + * @param dcSdhsEventQuery + */ + void exporFrameDataAnalysis(XWPFDocument newDoc,DcSdhsEventQuery dcSdhsEventQuery); + + Map > trafficFlowStatistics(DcSdhsEventQuery dcSdhsEventQuery); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcTollStationStatisticsDataService.java b/zc-business/src/main/java/com/zc/business/service/IDcTollStationStatisticsDataService.java index 95b630b6..1db72f14 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcTollStationStatisticsDataService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcTollStationStatisticsDataService.java @@ -42,4 +42,13 @@ public interface IDcTollStationStatisticsDataService extends IService accumulatedFlow(DcTollStationStatisticsData request); List> TollBoothStatistics(String startDate, String accessType, String periodType); + + /** + * 统计收费站数据 + * @param startDate + * @param accessType + * @param periodType + * @return + */ + List TollBoothStatisticsList(String startDate,String accessType, String periodType); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java index 067e7444..50fe2eea 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java @@ -7,6 +7,7 @@ import com.ruoyi.common.exception.ServiceException; import com.zc.business.domain.DcGantryMetricsStatisticsData; import com.zc.business.domain.DcGantryStatisticsData; import com.zc.business.domain.OdsTollEtctuData; +import com.zc.business.domain.TrafficFlowStatisticsMap; import com.zc.business.enums.TrafficDataPeriodTypeEnum; import com.zc.business.enums.UniversalEnum; import com.zc.business.mapper.DcGantryStatisticsDataMapper; @@ -229,6 +230,12 @@ public class DcGantryStatisticsDataImpl extends ServiceImpl trafficFlowStatisticsAsc(String startDate, String endDate, String direction, String periodType) { + + return dcGantryStatisticsDataMapper.trafficFlowStatisticsAsc(startDate,endDate,direction,periodType); + } @Override public List> sectionTrafficRanking(String startDate, String direction, String periodType) { diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcSdhsEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcSdhsEventServiceImpl.java index dc98d7e7..5b50cd82 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcSdhsEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcSdhsEventServiceImpl.java @@ -10,23 +10,26 @@ import com.zc.business.constant.RedisKeyConstants; import com.zc.business.controller.WeatherForecastController; import com.zc.business.domain.DcSdhsEvent; import com.zc.business.domain.DcSdhsEventQuery; +import com.zc.business.domain.DcTollStationStatisticsDataMap; +import com.zc.business.domain.TrafficFlowStatisticsMap; import com.zc.business.enums.UniversalEnum; +import com.zc.business.service.IDcGantryStatisticsDataService; import com.zc.business.service.IDcSdhsEventService; +import com.zc.business.service.IDcTollStationStatisticsDataService; import com.zc.business.utils.PoiUtil; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import javax.naming.NamingEnumeration; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -35,18 +38,16 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; -import java.time.ZoneId; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.zc.business.utils.PoiUtil.*; -import static com.zc.business.utils.PoiUtil.addDescription; - /** * 高速云事件分析Service业务层处理 * @@ -61,18 +62,22 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { @Autowired private WeatherForecastController weatherForecastController; + @Autowired + private IDcTollStationStatisticsDataService dcTollStationStatisticsDataService; + @Autowired + private IDcGantryStatisticsDataService dcGantryStatisticsDataService; @Override - public AjaxResult importData(String fileName,String fileUrl) throws IOException { + public AjaxResult importData(String fileName, String fileUrl) throws IOException { List importData = new ArrayList<>(); try { //本地路径 - String newFileUrl = fileUrl.replace("/profile/upload",""); + String newFileUrl = fileUrl.replace("/profile/upload", ""); String filePath = RuoYiConfig.getUploadPath() + newFileUrl; ExcelUtil util = new ExcelUtil(DcSdhsEvent.class); importData = util.importExcel(new FileInputStream(filePath)); - } catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("导入失败,请检查数据是否有误"); } @@ -80,7 +85,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { redisCache.deleteObject(RedisKeyConstants.SDHS_EVENT); List eventList = new ArrayList<>(); - if (importData != null && importData.size() > 0){ + if (importData != null && importData.size() > 0) { int id = 1; for (DcSdhsEvent dcSdhsEvent : importData) { @@ -89,14 +94,14 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { //是否多车事故 String carNum = dcSdhsEvent.getCarNum(); - if (StringUtils.isNotEmpty(carNum)){ + if (StringUtils.isNotEmpty(carNum)) { List numbers = extractNumbers(carNum); Integer carNumbers = 0; for (Integer number : numbers) { carNumbers += number; } - if (carNumbers > 0){ + if (carNumbers > 0) { dcSdhsEvent.setMultiVehicle("是"); } else { dcSdhsEvent.setMultiVehicle("否"); @@ -107,7 +112,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { String stakeMark = dcSdhsEvent.getStakeMark(); - if (StringUtils.isNotEmpty(stakeMark) && !"无".equals(stakeMark) && !StakeMarkUtils.checkStakeMark(stakeMark)){ + if (StringUtils.isNotEmpty(stakeMark) && !"无".equals(stakeMark) && !StakeMarkUtils.checkStakeMark(stakeMark)) { //尝试桩号补零 List numbers = new ArrayList<>(); @@ -124,11 +129,11 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } formattedNumbers.add(number); } - stakeMark = "K" + String.join("+",formattedNumbers); + stakeMark = "K" + String.join("+", formattedNumbers); //如果还验证不通过 则此条信息作废 - if (!StakeMarkUtils.checkStakeMark(stakeMark)){ + if (!StakeMarkUtils.checkStakeMark(stakeMark)) { continue; } dcSdhsEvent.setStakeMark(stakeMark); @@ -141,18 +146,18 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } //不入数据库, 放入缓存 - redisCache.setCacheList(RedisKeyConstants.SDHS_EVENT,eventList); + redisCache.setCacheList(RedisKeyConstants.SDHS_EVENT, eventList); - Map fileInfo = new HashMap<>(); - fileInfo.put("fileName",fileName); - fileInfo.put("fileUrl",fileUrl); + Map fileInfo = new HashMap<>(); + fileInfo.put("fileName", fileName); + fileInfo.put("fileUrl", fileUrl); Date now = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String updateTime = simpleDateFormat.format(now); - fileInfo.put("uploadTime",updateTime); + fileInfo.put("uploadTime", updateTime); - redisCache.setCacheMapValue(RedisKeyConstants.SDHS_EVENT_FILE,now.getTime(),fileInfo); + redisCache.setCacheMapValue(RedisKeyConstants.SDHS_EVENT_FILE, now.getTime(), fileInfo); return AjaxResult.success("导入成功"); } @@ -237,18 +242,19 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { /** * 事故车型分析 导出 + * * @param doc * @param dcSdhsEventQuery */ @Override - public void exportAccidentModelAnalysis(XWPFDocument doc,DcSdhsEventQuery dcSdhsEventQuery) { + public void exportAccidentModelAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { // 初始化一个空的结果映射 Map> result = accidentModelAnalysis(dcSdhsEventQuery); // 计算最大车辆类型数量 int maxVehicleTypes = 5; // 创建一个具有最大车辆类型数量的列的表格 - XWPFTable table = doc.createTable(result.size() + 1, maxVehicleTypes ); + XWPFTable table = doc.createTable(result.size() + 1, maxVehicleTypes); // 提取所有不同的车辆类型作为列标题 Set vehicleTypes = new HashSet<>(); @@ -276,7 +282,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { Integer count = entry.getValue().get(vehicleType); XWPFTableCell cell = row.getCell(cellIdx++); XWPFRun run = cell.getParagraphs().get(0).createRun(); - run.setText(String.valueOf(count != null ?count : 0)); // 如果该事件没有这种车辆类型,则设为0 + run.setText(String.valueOf(count != null ? count : 0)); // 如果该事件没有这种车辆类型,则设为0 } } @@ -288,9 +294,9 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { // 获取word中所有图表对象 List charts = copiedTemplate.getCharts(); - XWPFChart chart = charts.get(0); - XSSFWorkbook workbook = chart.getWorkbook(); - XSSFSheet sheet = workbook.getSheetAt(0); + XWPFChart chart = charts.get(0); + XSSFWorkbook workbook = chart.getWorkbook(); + XSSFSheet sheet = workbook.getSheetAt(0); // 系列信息 String[] singleBarSeriesNames = vehicleTypes.toArray(new String[0]); @@ -326,17 +332,17 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } rowId++; // 移动到下一行 } - for (int i=sheet.getLastRowNum();i> result.size();i--){ + for (int i = sheet.getLastRowNum(); i > result.size(); i--) { sheet.removeRow(sheet.getRow(i)); } - // 创建柱状图 - PoiUtil.wordExportChar(chart, "事故车型分析", singleBarSeriesNames, sheet); + // 创建柱状图 + PoiUtil.wordExportChar(chart, "事故车型分析", singleBarSeriesNames, sheet); - // 追加到同一个Word文档中 - mergeChart(chart, doc); - // 关闭复制的模板文档 - copiedTemplate.close(); + // 追加到同一个Word文档中 + mergeChart(chart, doc); + // 关闭复制的模板文档 + copiedTemplate.close(); } catch (Exception e) { @@ -351,11 +357,12 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { /** * 事故车型分析 查询 + * * @param dcSdhsEventQuery * @return */ @Override - public Map>accidentModelAnalysis(DcSdhsEventQuery dcSdhsEventQuery) { + public Map> accidentModelAnalysis(DcSdhsEventQuery dcSdhsEventQuery) { List cacheList = redisCache.getCacheList(RedisKeyConstants.SDHS_EVENT); // 将查询开始时间和结束时间转换为 LocalDateTime @@ -406,7 +413,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { int index = carNum.indexOf("辆"); if (index > 0) { // 确保 "辆" 的索引大于 0,表示字符串中包含 "辆" 且前面有字符 // 提取车辆类型和数量 - String carType = carNum.substring(0, index-1); // 车辆类型 + String carType = carNum.substring(0, index - 1); // 车辆类型 int carCount = Integer.parseInt(carNum.substring(index - 1, index)); // 数量 // 在映射中累加数量 @@ -421,6 +428,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { /** * 事故时间分析查询 + * * @param dcSdhsEventQuery * @return */ @@ -478,7 +486,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { dailyCounts.merge(dateString, 0L, Long::sum); } return dailyCounts; - }else { + } else { // 将查询开始时间和结束时间转换为 LocalDateTime LocalDateTime queryStart = dcSdhsEventQuery.getStartTime().toInstant().atZone(zoneId).toLocalDateTime(); // 获取该年的最后一天 @@ -511,7 +519,8 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } /** - * // 在指定时间范围内的事件 + * // 在指定时间范围内的事件 + * * @param dcSdhsEventQuery * @param cacheList * @param zoneId @@ -542,45 +551,46 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { /** * 事故时间分析导出 + * * @param doc * @param dcSdhsEventQuery */ @Override - public void exportAccidentTimeAnalysis(XWPFDocument doc,DcSdhsEventQuery dcSdhsEventQuery) { + public void exportAccidentTimeAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { - Map currentYearData = accidentTimeAnalysis(dcSdhsEventQuery); + Map currentYearData = accidentTimeAnalysis(dcSdhsEventQuery); // 获取一年前的日期 Date startTime = dcSdhsEventQuery.getStartTime(); - // 使用 Calendar 计算一年前的时间 + // 使用 Calendar 计算一年前的时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(startTime); // 设置当前时间为 startTime calendar.add(Calendar.YEAR, -1); // 减去一年 Date oneYearAgoStart = calendar.getTime(); // 一年前的开始时间 dcSdhsEventQuery.setStartTime(oneYearAgoStart); - Map lastYearData = accidentTimeAnalysis(dcSdhsEventQuery); + Map lastYearData = accidentTimeAnalysis(dcSdhsEventQuery); String type = dcSdhsEventQuery.getType(); - int rows=0; - String stingType= ""; - String name= ""; - if (type.equals("2")){ - rows=25; - stingType="点"; - name= "wordTemplate/accidentTimeAnalysis.docx"; - }else if (type.equals("1")){ - rows=32; - stingType="日"; - name= "wordTemplate/accidentTimeDayAnalysis.docx"; - - }else { - rows=13; - stingType="月"; - name= "wordTemplate/accidentTimeMonthAnalysis.docx"; + int rows = 0; + String stingType = ""; + String name = ""; + if (type.equals("2")) { + rows = 25; + stingType = "点"; + name = "wordTemplate/accidentTimeAnalysis.docx"; + } else if (type.equals("1")) { + rows = 32; + stingType = "日"; + name = "wordTemplate/accidentTimeDayAnalysis.docx"; + + } else { + rows = 13; + stingType = "月"; + name = "wordTemplate/accidentTimeMonthAnalysis.docx"; } // 创建表格 - XWPFTable table = doc.createTable(rows,3); + XWPFTable table = doc.createTable(rows, 3); CTTblWidth infoTableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); infoTableWidth.setType(STTblWidth.DXA); infoTableWidth.setW(BigInteger.valueOf(UniversalEnum.NINE_THOUSAND_AND_SEVENTY_TWO.getNumber())); @@ -595,18 +605,18 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { String dateString = String.format("%02d", i); indexToDateMap.put(i, dateString); } - String dayString=""; + String dayString = ""; // 填充表格数据 - for (int i = 0; i < rows-1; i++) { + for (int i = 0; i < rows - 1; i++) { - if (type.equals("2")){ - dayString = indexToDateMap.get(i); // 获取 i 对应的日期字符串 - }else { - dayString = indexToDateMap.get(i+1); // 获取 i 对应的日期字符串 + if (type.equals("2")) { + dayString = indexToDateMap.get(i); // 获取 i 对应的日期字符串 + } else { + dayString = indexToDateMap.get(i + 1); // 获取 i 对应的日期字符串 } - setTableFonts(table.getRow(i + 1).getCell(0), (dayString ) + stingType); + setTableFonts(table.getRow(i + 1).getCell(0), (dayString) + stingType); Long currentYearValue = currentYearData.getOrDefault(dayString, 0L); setTableFonts(table.getRow(i + 1).getCell(1), String.valueOf(currentYearValue)); Long lastYearValue = lastYearData.getOrDefault(dayString, 0L); @@ -626,11 +636,11 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { XSSFWorkbook workbook = chart.getWorkbook(); XSSFSheet sheet = workbook.getSheetAt(UniversalEnum.ZERO.getNumber()); // 更新图表数据 - for (int i = UniversalEnum.ZERO.getNumber(); i < rows-1; i++){ - if (type.equals("2")){ - dayString = indexToDateMap.get(i); // 获取 i 对应的日期字符串 - }else { - dayString = indexToDateMap.get(i+1); // 获取 i 对应的日期字符串 + for (int i = UniversalEnum.ZERO.getNumber(); i < rows - 1; i++) { + if (type.equals("2")) { + dayString = indexToDateMap.get(i); // 获取 i 对应的日期字符串 + } else { + dayString = indexToDateMap.get(i + 1); // 获取 i 对应的日期字符串 } sheet.getRow(i + 1).getCell(0).setCellValue((dayString) + stingType); @@ -649,7 +659,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } // 设置单元格的值 sheet.getRow(i + 1).getCell(1).setCellValue(currentYearData.get(dayString)); - int rowIndexTwo = i +1+ UniversalEnum.ONE.getNumber(); // 计算行索引 + int rowIndexTwo = i + 1 + UniversalEnum.ONE.getNumber(); // 计算行索引 Row rowTwo = sheet.getRow(rowIndexTwo); if (rowTwo == null) { // 如果行不存在,则创建新行 @@ -671,7 +681,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { sheet.getRow(i + 1).getCell(1).setCellValue(currentYearData.get(i)); sheet.getRow(i + 1).getCell(2).setCellValue(lastYearData.get(i)); }*/ - for (int i=sheet.getLastRowNum();i> currentYearData.size();i--){ + for (int i = sheet.getLastRowNum(); i > currentYearData.size(); i--) { sheet.removeRow(sheet.getRow(i)); } // 更新图表 @@ -682,24 +692,22 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { // 关闭模板文档 copiedTemplate.close(); - } catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } //换行 createLineBreak(doc); - } /** + * @param input + * @return java.util.List * @Description 提取文字中的数字 - * * @author liuwenge * @date 2024/8/15 17:05 - * @param input - * @return java.util.List */ private static List extractNumbers(String input) { List numbers = new ArrayList<>(); @@ -715,10 +723,10 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } @Override - public AjaxResult getFileInfo(){ - Map> allFileInfo = redisCache.getCacheMapValue(RedisKeyConstants.SDHS_EVENT_FILE); + public AjaxResult getFileInfo() { + Map> allFileInfo = redisCache.getCacheMapValue(RedisKeyConstants.SDHS_EVENT_FILE); Map lastFile = new HashMap<>(); - if (allFileInfo != null && allFileInfo.size() > 0){ + if (allFileInfo != null && allFileInfo.size() > 0) { String maxKeyNumerically = Collections.max(allFileInfo.keySet(), new Comparator() { @Override public int compare(String o1, String o2) { @@ -736,18 +744,17 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { /** + * @param dcSdhsEventQuery + * @return com.ruoyi.common.core.domain.AjaxResult * @Description 事故地市分布 - * * @author liuwenge * @date 2024/8/20 9:13 - * @param dcSdhsEventQuery - * @return com.ruoyi.common.core.domain.AjaxResult */ @Override - public AjaxResult selectRegionAnalysis(DcSdhsEventQuery dcSdhsEventQuery){ + public AjaxResult selectRegionAnalysis(DcSdhsEventQuery dcSdhsEventQuery) { List eventList = redisCache.getCacheList(RedisKeyConstants.SDHS_EVENT); - if (eventList == null || eventList.size() == 0){ + if (eventList == null || eventList.size() == 0) { return AjaxResult.error("请先导入数据"); } @@ -777,11 +784,11 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { //地市统计 Map region = eventList.stream() .collect(Collectors.groupingBy(item -> getRange(item.getStakeMark()), Collectors.counting())); - List> list = new ArrayList<>(); - region.forEach((key,count)->{ - Map map = new HashMap<>(); - map.put("regionName",key); - map.put("num",count); + List> list = new ArrayList<>(); + region.forEach((key, count) -> { + Map map = new HashMap<>(); + map.put("regionName", key); + map.put("num", count); list.add(map); }); return AjaxResult.success(list); @@ -790,7 +797,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { private static String getRange(String stakeMark) { Long stakeMarkMetre = StakeMarkUtils.formatMetreLong(stakeMark); - if (stakeMarkMetre == null){ + if (stakeMarkMetre == null) { return "其他"; } if (stakeMarkMetre >= 0 && stakeMarkMetre <= 132469) { @@ -807,23 +814,22 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } /** + * @param doc + * @param dcSdhsEventQuery + * @return void * @Description 导出事故地市分布 - * * @author liuwenge * @date 2024/8/20 9:17 - * @param doc - * @param dcSdhsEventQuery - * @return void */ @Override - public void exportRegionAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery){ + public void exportRegionAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { AjaxResult ajaxResult = selectRegionAnalysis(dcSdhsEventQuery); if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) { - PoiUtil.createHeading2(doc,"事故地市分布"); - List> data = (List>) ajaxResult.get("data"); - if (data != null && data.size() != UniversalEnum.ZERO.getNumber()){ + PoiUtil.createHeading2(doc, "事故地市分布"); + List> data = (List>) ajaxResult.get("data"); + if (data != null && data.size() != UniversalEnum.ZERO.getNumber()) { //插入图表 try { @@ -843,23 +849,23 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { String[] singleBarSeriesNames = {"数量"}; //分类信息 for (int i = 0; i < data.size(); i++) { - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ZERO.getNumber()).setCellValue(data.get(i).get("regionName").toString()); - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(data.get(i).get("num").toString())); + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ZERO.getNumber()).setCellValue(data.get(i).get("regionName").toString()); + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(data.get(i).get("num").toString())); } - for (int i = sheet.getLastRowNum(); i > data.size();i--){ + for (int i = sheet.getLastRowNum(); i > data.size(); i--) { sheet.removeRow(sheet.getRow(i)); } - PoiUtil.wordExportChar(chart,"事故地市分布" , singleBarSeriesNames,sheet ); + PoiUtil.wordExportChar(chart, "事故地市分布", singleBarSeriesNames, sheet); // 追加到同一个Word文档中 - mergeChart(chart,doc); + mergeChart(chart, doc); // 关闭复制的模板文档 copiedTemplate.close(); - } catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } @@ -869,7 +875,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { //插入表格 - XWPFTable table = doc.createTable(data.size()+1, 2); + XWPFTable table = doc.createTable(data.size() + 1, 2); //列宽自动分割 CTTblWidth infoTableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); infoTableWidth.setType(STTblWidth.DXA); @@ -878,33 +884,32 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { setTableFonts(table.getRow(0).getCell(0), "地市"); setTableFonts(table.getRow(0).getCell(1), "数量"); for (int i = 0; i < data.size(); i++) { - setTableFonts(table.getRow(i+1).getCell(0), data.get(i).get("regionName").toString()); - setTableFonts(table.getRow(i+1).getCell(1), data.get(i).get("num").toString()); + setTableFonts(table.getRow(i + 1).getCell(0), data.get(i).get("regionName").toString()); + setTableFonts(table.getRow(i + 1).getCell(1), data.get(i).get("num").toString()); } } else { - addDescription(doc,UniversalEnum.NO_DATA_AVAILABLE.getValue()); + addDescription(doc, UniversalEnum.NO_DATA_AVAILABLE.getValue()); } } else { - addDescription(doc,UniversalEnum.NO_DATA_AVAILABLE.getValue()); + addDescription(doc, UniversalEnum.NO_DATA_AVAILABLE.getValue()); } } /** + * @param dcSdhsEventQuery + * @return com.ruoyi.common.core.domain.AjaxResult * @Description 查询交通管制情况统计 - * * @author liuwenge * @date 2024/8/20 11:06 - * @param dcSdhsEventQuery - * @return com.ruoyi.common.core.domain.AjaxResult */ @Override - public AjaxResult selectStationAnalysis(DcSdhsEventQuery dcSdhsEventQuery){ + public AjaxResult selectStationAnalysis(DcSdhsEventQuery dcSdhsEventQuery) { List eventList = redisCache.getCacheList(RedisKeyConstants.SDHS_EVENT); - if (eventList == null || eventList.size() == 0){ + if (eventList == null || eventList.size() == 0) { return AjaxResult.error("请先导入数据"); } @@ -951,26 +956,26 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { stationSet.addAll(restrictionStation.keySet()); //收费站统 - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); for (String stationName : stationSet) { - Map map = new HashMap<>(); + Map map = new HashMap<>(); Long allNum = 0L; - map.put("stationName",stationName); - if (closeStation.containsKey(stationName)){ - map.put("close",closeStation.get(stationName)); + map.put("stationName", stationName); + if (closeStation.containsKey(stationName)) { + map.put("close", closeStation.get(stationName)); allNum += closeStation.get(stationName); } else { - map.put("close",0); + map.put("close", 0); } - if (restrictionStation.containsKey(stationName)){ - map.put("restriction",restrictionStation.get(stationName)); + if (restrictionStation.containsKey(stationName)) { + map.put("restriction", restrictionStation.get(stationName)); allNum += restrictionStation.get(stationName); } else { - map.put("restriction",0); + map.put("restriction", 0); } - map.put("allNum",allNum); + map.put("allNum", allNum); list.add(map); } @@ -980,19 +985,18 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } /** + * @param title + * @return java.lang.String * @Description 从标题中截取收费站名称 - * * @author liuwenge * @date 2024/8/19 15:32 - * @param title - * @return java.lang.String */ private static String getStationName(String title) { String[] titleStr = title.split(",山东"); - if (titleStr.length > 1){ + if (titleStr.length > 1) { String[] stationStr = titleStr[1].split("发生"); - if (stationStr.length > 0){ + if (stationStr.length > 0) { return stationStr[0]; } else { return "其他"; @@ -1004,23 +1008,22 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { /** + * @param doc + * @param dcSdhsEventQuery + * @return com.ruoyi.common.core.domain.AjaxResult * @Description 导出交通管制情况统计 - * * @author liuwenge * @date 2024/8/20 11:05 - * @param doc - * @param dcSdhsEventQuery - * @return com.ruoyi.common.core.domain.AjaxResult */ @Override - public void exportStationAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery){ + public void exportStationAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { AjaxResult ajaxResult = selectStationAnalysis(dcSdhsEventQuery); if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) { - PoiUtil.createHeading2(doc,"交通管制情况统计"); - List> data = (List>) ajaxResult.get("data"); - if (data != null && data.size() != UniversalEnum.ZERO.getNumber()){ + PoiUtil.createHeading2(doc, "交通管制情况统计"); + List> data = (List>) ajaxResult.get("data"); + if (data != null && data.size() != UniversalEnum.ZERO.getNumber()) { //插入图表 try { @@ -1037,28 +1040,28 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { XSSFSheet sheet = workbook.getSheetAt(UniversalEnum.ZERO.getNumber()); //系列信息 - String[] singleBarSeriesNames = {UniversalEnum.CLOSE.getValue(),UniversalEnum.TRAFFIC_RESTRICTION.getValue()}; + String[] singleBarSeriesNames = {UniversalEnum.CLOSE.getValue(), UniversalEnum.TRAFFIC_RESTRICTION.getValue()}; //分类信息 - for (int i = UniversalEnum.ZERO.getNumber(); i < data.size(); i++){ - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ZERO.getNumber()).setCellValue(data.get(i).get("stationName").toString()); - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(data.get(i).get("close").toString())); - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.TWO.getNumber()).setCellValue(Long.parseLong(data.get(i).get("restriction").toString())); + for (int i = UniversalEnum.ZERO.getNumber(); i < data.size(); i++) { + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ZERO.getNumber()).setCellValue(data.get(i).get("stationName").toString()); + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(data.get(i).get("close").toString())); + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.TWO.getNumber()).setCellValue(Long.parseLong(data.get(i).get("restriction").toString())); } - for (int i = sheet.getLastRowNum(); i > data.size();i--){ + for (int i = sheet.getLastRowNum(); i > data.size(); i--) { sheet.removeRow(sheet.getRow(i)); } - PoiUtil.wordExportChar(chart, "交通管制情况统计", singleBarSeriesNames,sheet ); + PoiUtil.wordExportChar(chart, "交通管制情况统计", singleBarSeriesNames, sheet); // 追加到同一个Word文档中 - mergeChart(chart,doc); + mergeChart(chart, doc); // 关闭复制的模板文档 copiedTemplate.close(); - } catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } @@ -1068,7 +1071,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { //插入表格 - XWPFTable table = doc.createTable(data.size()+1, 3); + XWPFTable table = doc.createTable(data.size() + 1, 3); //列宽自动分割 CTTblWidth infoTableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); infoTableWidth.setType(STTblWidth.DXA); @@ -1078,50 +1081,49 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { setTableFonts(table.getRow(0).getCell(2), "限行"); //excel - for (int i = 0; i < data.size(); i++){ - setTableFonts(table.getRow(i+1).getCell(0), data.get(i).get("stationName").toString()); - setTableFonts(table.getRow(i+1).getCell(1), data.get(i).get("close").toString()); - setTableFonts(table.getRow(i+1).getCell(2), data.get(i).get("restriction").toString()); + for (int i = 0; i < data.size(); i++) { + setTableFonts(table.getRow(i + 1).getCell(0), data.get(i).get("stationName").toString()); + setTableFonts(table.getRow(i + 1).getCell(1), data.get(i).get("close").toString()); + setTableFonts(table.getRow(i + 1).getCell(2), data.get(i).get("restriction").toString()); } } else { - addDescription(doc,UniversalEnum.NO_DATA_AVAILABLE.getValue()); + addDescription(doc, UniversalEnum.NO_DATA_AVAILABLE.getValue()); } } else { - addDescription(doc,UniversalEnum.NO_DATA_AVAILABLE.getValue()); + addDescription(doc, UniversalEnum.NO_DATA_AVAILABLE.getValue()); } } /** + * @param dcSdhsEventQuery + * @return com.ruoyi.common.core.domain.AjaxResult * @Description 查询交通事故类型统计 - * * @author liuwenge * @date 2024/8/21 10:56 - * @param dcSdhsEventQuery - * @return com.ruoyi.common.core.domain.AjaxResult */ @Override - public AjaxResult selectAccidentType(DcSdhsEventQuery dcSdhsEventQuery){ + public AjaxResult selectAccidentType(DcSdhsEventQuery dcSdhsEventQuery) { List eventList = redisCache.getCacheList(RedisKeyConstants.SDHS_EVENT); - if (eventList == null || eventList.size() == 0){ + if (eventList == null || eventList.size() == 0) { return AjaxResult.error("请先导入数据"); } eventList = eventList.stream().filter(item -> item.getStartTime() != null - && item.getStartTime().getTime() >= dcSdhsEventQuery.getStartTime().getTime() - && item.getStartTime().getTime() <= dcSdhsEventQuery.getEndTime().getTime() - && "交通事故".equals(item.getEventType())) + && item.getStartTime().getTime() >= dcSdhsEventQuery.getStartTime().getTime() + && item.getStartTime().getTime() <= dcSdhsEventQuery.getEndTime().getTime() + && "交通事故".equals(item.getEventType())) .collect(Collectors.toList()); - List> list = new ArrayList<>(); + List> list = new ArrayList<>(); - if(eventList.size() > 0){ + if (eventList.size() > 0) { //根据详细类型 分组计数 - Map subclass = eventList.stream().collect(Collectors.groupingBy(DcSdhsEvent::getEventSubclass,Collectors.counting())); - subclass.forEach((key,count)->{ - Map map = new HashMap<>(); - map.put("subclassName",key); - map.put("num",count); + Map subclass = eventList.stream().collect(Collectors.groupingBy(DcSdhsEvent::getEventSubclass, Collectors.counting())); + subclass.forEach((key, count) -> { + Map map = new HashMap<>(); + map.put("subclassName", key); + map.put("num", count); list.add(map); }); } @@ -1130,22 +1132,21 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { } /** + * @param doc + * @param dcSdhsEventQuery + * @return void * @Description 导出交通事故类型统计 - * * @author liuwenge * @date 2024/8/21 11:07 - * @param doc - * @param dcSdhsEventQuery - * @return void */ @Override - public void exportAccidentType(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery){ + public void exportAccidentType(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { AjaxResult ajaxResult = selectAccidentType(dcSdhsEventQuery); if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) { - PoiUtil.createHeading2(doc,"事故类型统计"); - List> data = (List>) ajaxResult.get("data"); - if (data != null && data.size() != UniversalEnum.ZERO.getNumber()){ + PoiUtil.createHeading2(doc, "事故类型统计"); + List> data = (List>) ajaxResult.get("data"); + if (data != null && data.size() != UniversalEnum.ZERO.getNumber()) { //插入图表 try { // 复制Word模板 @@ -1162,25 +1163,25 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { //系列信息 String[] singleBarSeriesNames = {"数量"}; //分类信息 - for (int i = UniversalEnum.ZERO.getNumber(); i < data.size(); i++){ - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ZERO.getNumber()).setCellValue(data.get(i).get("subclassName").toString()); - sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(data.get(i).get("num").toString())); + for (int i = UniversalEnum.ZERO.getNumber(); i < data.size(); i++) { + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ZERO.getNumber()).setCellValue(data.get(i).get("subclassName").toString()); + sheet.getRow(i + UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(data.get(i).get("num").toString())); } - for (int i = sheet.getLastRowNum(); i > data.size();i--){ + for (int i = sheet.getLastRowNum(); i > data.size(); i--) { sheet.removeRow(sheet.getRow(i)); } - PoiUtil.wordExportChar(chart, "事故类型统计", singleBarSeriesNames,sheet ); + PoiUtil.wordExportChar(chart, "事故类型统计", singleBarSeriesNames, sheet); // 追加到同一个Word文档中 - mergeChart(chart,doc); + mergeChart(chart, doc); // 关闭复制的模板文档 copiedTemplate.close(); - } catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } @@ -1190,7 +1191,7 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { //插入表格 - XWPFTable table = doc.createTable(data.size()+1, 2); + XWPFTable table = doc.createTable(data.size() + 1, 2); //列宽自动分割 CTTblWidth infoTableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); infoTableWidth.setType(STTblWidth.DXA); @@ -1200,16 +1201,16 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { setTableFonts(table.getRow(0).getCell(1), "数量"); //excel - for (int i = 0; i < data.size(); i++){ - setTableFonts(table.getRow(i+1).getCell(0), data.get(i).get("subclassName").toString()); - setTableFonts(table.getRow(i+1).getCell(1), data.get(i).get("num").toString()); + for (int i = 0; i < data.size(); i++) { + setTableFonts(table.getRow(i + 1).getCell(0), data.get(i).get("subclassName").toString()); + setTableFonts(table.getRow(i + 1).getCell(1), data.get(i).get("num").toString()); } } else { - addDescription(doc,UniversalEnum.NO_DATA_AVAILABLE.getValue()); + addDescription(doc, UniversalEnum.NO_DATA_AVAILABLE.getValue()); } } else { - addDescription(doc,UniversalEnum.NO_DATA_AVAILABLE.getValue()); + addDescription(doc, UniversalEnum.NO_DATA_AVAILABLE.getValue()); } } @@ -1334,4 +1335,289 @@ public class DcSdhsEventServiceImpl implements IDcSdhsEventService { result.put("dataList",dataList); return AjaxResult.success(result); } + + /** + * 收费站出入口分析 + * + * @param dcSdhsEventQuery + * @return + */ + @Override + public Map> TollBoothStatisticsList(DcSdhsEventQuery dcSdhsEventQuery) { + Date startTime = dcSdhsEventQuery.getStartTime(); + LocalDateTime localDateTime = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 将 LocalDateTime 转换为字符串 + String startDate = localDateTime.format(formatter); + String type = dcSdhsEventQuery.getType(); + String periodType = ""; + if (type.equals("2")) { + periodType = "4"; + } + if (type.equals("1")) { + periodType = "3"; + } + if (type.equals("0")) { + periodType = "1"; + } + Map> map = new HashMap<>(); + //入口 + List entrance = dcTollStationStatisticsDataService.TollBoothStatisticsList(startDate, "1",periodType); + //出口 + List exit = dcTollStationStatisticsDataService.TollBoothStatisticsList(startDate, "2",periodType); + map.put("entrance", entrance); + map.put("exit", exit); + + return map; + } + /** + * 收费站出入口导出 + * + * @param doc + * @param dcSdhsEventQuery + */ + @Override + public void exporttollGateEntrance(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { + Map> map = TollBoothStatisticsList( dcSdhsEventQuery); + List entrance = map.get("entrance"); + List exit = map.get("exit"); + int rows = entrance.size(); + String name = "wordTemplate/tollGateEntrance.docx"; + +// 创建表格 + XWPFTable table = doc.createTable(rows+1, 3); + CTTblWidth infoTableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); + infoTableWidth.setType(STTblWidth.DXA); + infoTableWidth.setW(BigInteger.valueOf(UniversalEnum.NINE_THOUSAND_AND_SEVENTY_TWO.getNumber())); + +// 表头 + setTableFonts(table.getRow(0).getCell(0), "收费站"); + setTableFonts(table.getRow(0).getCell(1), "入口"); + setTableFonts(table.getRow(0).getCell(2), "出口"); +// 填充表格数据 + for (int i = 0; i < rows ; i++) { + + setTableFonts(table.getRow(i + 1).getCell(0), (entrance.get(i).getFacilityName())); + Integer entranceValue = entrance.get(i).getTrafficVolume(); + setTableFonts(table.getRow(i + 1).getCell(1), String.valueOf(entranceValue)); + Integer exitValue = exit.get(i).getTrafficVolume(); + setTableFonts(table.getRow(i + 1).getCell(2), String.valueOf(exitValue)); + } + +// 图表部分 + try { + + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(name); + + + XWPFDocument copiedTemplate = new XWPFDocument(inputStream); + + List charts = copiedTemplate.getCharts(); + XWPFChart chart = charts.get(0); + XSSFWorkbook workbook = chart.getWorkbook(); + XSSFSheet sheet = workbook.getSheetAt(UniversalEnum.ZERO.getNumber()); + // 更新图表数据 + for (int i = UniversalEnum.ZERO.getNumber(); i < rows; i++) { + + sheet.getRow(i + 1).getCell(0).setCellValue(entrance.get(i).getFacilityName()); + int rowIndex = i + UniversalEnum.ONE.getNumber(); // 计算行索引 + Row row = sheet.getRow(rowIndex); + if (row == null) { + // 如果行不存在,则创建新行 + row = sheet.createRow(rowIndex); + } + + // 现在可以安全地访问或创建单元格了 + Cell cell = row.getCell(UniversalEnum.ONE.getNumber()); + if (cell == null) { + // 通常情况下,getCell 会创建新的单元格,但这里我们显式地检查以防万一 + cell = row.createCell(UniversalEnum.ONE.getNumber(), CellType.NUMERIC); + } + // 设置单元格的值 + sheet.getRow(i + 1).getCell(1).setCellValue( entrance.get(i).getTrafficVolume()); + int rowIndexTwo = i + 1 + UniversalEnum.ONE.getNumber(); // 计算行索引 + Row rowTwo = sheet.getRow(rowIndexTwo); + if (rowTwo == null) { + // 如果行不存在,则创建新行 + rowTwo = sheet.createRow(rowIndexTwo); + } + + // 现在可以安全地访问或创建单元格了 + Cell cellTwo = row.getCell(UniversalEnum.TWO.getNumber()); + if (cellTwo == null) { + // 通常情况下,getCell 会创建新的单元格,但这里我们显式地检查以防万一 + cell = row.createCell(UniversalEnum.TWO.getNumber(), CellType.NUMERIC); + } + sheet.getRow(i + 1).getCell(2).setCellValue(exit.get(i).getTrafficVolume()); + //sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(entries.get(i).getValue().toString())); + } +/* for (int i = 0; i < 24; i++) { + + sheet.getRow(i + 1).getCell(0).setCellValue((i) + "点"); + sheet.getRow(i + 1).getCell(1).setCellValue(currentYearData.get(i)); + sheet.getRow(i + 1).getCell(2).setCellValue(lastYearData.get(i)); + }*/ + for (int i = sheet.getLastRowNum(); i > entrance.size(); i--) { + sheet.removeRow(sheet.getRow(i)); + } + // 更新图表 + PoiUtil.wordExportChar(chart, "收费站出入口车流量", new String[]{"入口", "出口"}, sheet); + + // 合并图表到Word文档 + mergeChart(chart, doc); + + // 关闭模板文档 + copiedTemplate.close(); + } catch (Exception e) { + e.printStackTrace(); + } + //换行 + createLineBreak(doc); + + + } + /** + * 收门架数据导出 + * + * @param doc + * @param dcSdhsEventQuery + */ + @Override + public void exporFrameDataAnalysis(XWPFDocument doc, DcSdhsEventQuery dcSdhsEventQuery) { + Map> map = trafficFlowStatistics( dcSdhsEventQuery); + Listentrance = map.get("hezeDirection"); + List exit = map.get("jinanDirection"); + int rows = entrance.size(); + String name = "wordTemplate/frameDataAnalysis.docx"; + +// 创建表格 + XWPFTable table = doc.createTable(rows+1, 3); + CTTblWidth infoTableWidth = table.getCTTbl().addNewTblPr().addNewTblW(); + infoTableWidth.setType(STTblWidth.DXA); + infoTableWidth.setW(BigInteger.valueOf(UniversalEnum.NINE_THOUSAND_AND_SEVENTY_TWO.getNumber())); + +// 表头 + setTableFonts(table.getRow(0).getCell(0), "门架"); + setTableFonts(table.getRow(0).getCell(1), "菏泽方向"); + setTableFonts(table.getRow(0).getCell(2), "济南方向"); +// 填充表格数据 + for (int i = 0; i < rows ; i++) { + + setTableFonts(table.getRow(i + 1).getCell(0), (entrance.get(i).getFacilityName())); + Long entranceValue = entrance.get(i).getTrafficVolume()!=null ?entrance.get(i).getTrafficVolume() : 0; + + setTableFonts(table.getRow(i + 1).getCell(1), String.valueOf(entranceValue)); + Long exitValue = exit.get(i).getTrafficVolume()!=null ?exit.get(i).getTrafficVolume() : 0; + setTableFonts(table.getRow(i + 1).getCell(2), String.valueOf(exitValue)); + } + +// 图表部分 + try { + + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(name); + + + XWPFDocument copiedTemplate = new XWPFDocument(inputStream); + + List charts = copiedTemplate.getCharts(); + XWPFChart chart = charts.get(0); + XSSFWorkbook workbook = chart.getWorkbook(); + XSSFSheet sheet = workbook.getSheetAt(UniversalEnum.ZERO.getNumber()); + // 更新图表数据 + for (int i = UniversalEnum.ZERO.getNumber(); i < rows; i++) { + + sheet.getRow(i + 1).getCell(0).setCellValue(entrance.get(i).getFacilityName()); + int rowIndex = i + UniversalEnum.ONE.getNumber(); // 计算行索引 + Row row = sheet.getRow(rowIndex); + if (row == null) { + // 如果行不存在,则创建新行 + row = sheet.createRow(rowIndex); + } + + // 现在可以安全地访问或创建单元格了 + Cell cell = row.getCell(UniversalEnum.ONE.getNumber()); + if (cell == null) { + // 通常情况下,getCell 会创建新的单元格,但这里我们显式地检查以防万一 + cell = row.createCell(UniversalEnum.ONE.getNumber(), CellType.NUMERIC); + } + // 设置单元格的值 + sheet.getRow(i + 1).getCell(1).setCellValue( entrance.get(i).getTrafficVolume()!=null ?entrance.get(i).getTrafficVolume() : 0); + int rowIndexTwo = i + 1 + UniversalEnum.ONE.getNumber(); // 计算行索引 + Row rowTwo = sheet.getRow(rowIndexTwo); + if (rowTwo == null) { + // 如果行不存在,则创建新行 + rowTwo = sheet.createRow(rowIndexTwo); + } + + // 现在可以安全地访问或创建单元格了 + Cell cellTwo = row.getCell(UniversalEnum.TWO.getNumber()); + if (cellTwo == null) { + // 通常情况下,getCell 会创建新的单元格,但这里我们显式地检查以防万一 + cell = row.createCell(UniversalEnum.TWO.getNumber(), CellType.NUMERIC); + } + sheet.getRow(i + 1).getCell(2).setCellValue(exit.get(i).getTrafficVolume()!=null ?exit.get(i).getTrafficVolume() : 0); + //sheet.getRow(i+UniversalEnum.ONE.getNumber()).getCell(UniversalEnum.ONE.getNumber()).setCellValue(Long.parseLong(entries.get(i).getValue().toString())); + } +/* for (int i = 0; i < 24; i++) { + + sheet.getRow(i + 1).getCell(0).setCellValue((i) + "点"); + sheet.getRow(i + 1).getCell(1).setCellValue(currentYearData.get(i)); + sheet.getRow(i + 1).getCell(2).setCellValue(lastYearData.get(i)); + }*/ + for (int i = sheet.getLastRowNum(); i > entrance.size(); i--) { + sheet.removeRow(sheet.getRow(i)); + } + // 更新图表 + PoiUtil.wordExportChar(chart, "门架车流量", new String[]{"菏泽", "济南"}, sheet); + + // 合并图表到Word文档 + mergeChart(chart, doc); + + // 关闭模板文档 + copiedTemplate.close(); + } catch (Exception e) { + e.printStackTrace(); + } + //换行 + createLineBreak(doc); + + + } + + /** + * 门架数据分析 + * @param dcSdhsEventQuery + * @return + */ + @Override + public Map> trafficFlowStatistics(DcSdhsEventQuery dcSdhsEventQuery) { + Date startTime = dcSdhsEventQuery.getStartTime(); + LocalDateTime localDateTime = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 将 LocalDateTime 转换为字符串 + String startDate = localDateTime.format(formatter); + String type = dcSdhsEventQuery.getType(); + String periodType = ""; + if (type.equals("2")) { + periodType = "4"; + } + if (type.equals("1")) { + periodType = "3"; + } + if (type.equals("0")) { + periodType = "1"; + } + //菏泽方向 + List hezeDirection = dcGantryStatisticsDataService.trafficFlowStatisticsAsc(startDate,startDate,"1",periodType); + //济南方向 + List jinanDirection = dcGantryStatisticsDataService.trafficFlowStatisticsAsc(startDate,startDate,"3",periodType); + Map> map = new HashMap<>(); + map.put("hezeDirection",hezeDirection); + map.put("jinanDirection",jinanDirection); + + return map; + } + } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcTollStationStatisticsDataImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcTollStationStatisticsDataImpl.java index 24ffd0c1..cee5c473 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcTollStationStatisticsDataImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcTollStationStatisticsDataImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.zc.business.domain.DcTollStationStatisticsData; +import com.zc.business.domain.DcTollStationStatisticsDataMap; import com.zc.business.domain.OdsTollEnpassData; import com.zc.business.domain.OdsTollExpassData; import com.zc.business.enums.TrafficDataPeriodTypeEnum; @@ -238,6 +239,10 @@ public class DcTollStationStatisticsDataImpl extends ServiceImpl> TollBoothStatistics(String startDate, String accessType, String periodType) { return dcTollStationStatisticsDataMapper.TollBoothStatistics(startDate,accessType,periodType); } + @Override + public List TollBoothStatisticsList(String startDate, String accessType, String periodType) { + return dcTollStationStatisticsDataMapper.TollBoothStatisticsList(startDate,accessType,periodType); + } /** * 恢复日缓存数据的方法(获取当月收费站站点入口和出口数据)。 diff --git a/zc-business/src/main/resources/mapper/business/DcGantryStatisticsDataMapper.xml b/zc-business/src/main/resources/mapper/business/DcGantryStatisticsDataMapper.xml index 03a98a3a..020b218a 100644 --- a/zc-business/src/main/resources/mapper/business/DcGantryStatisticsDataMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcGantryStatisticsDataMapper.xml @@ -29,6 +29,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + INSERT INTO @@ -337,6 +348,88 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY dgsd.statistical_date DESC + + + + diff --git a/zc-business/src/main/resources/wordTemplate/frameDataAnalysis.docx b/zc-business/src/main/resources/wordTemplate/frameDataAnalysis.docx new file mode 100644 index 0000000000000000000000000000000000000000..4dac888a21cd79a927b03d50a96f004c347b8d05 GIT binary patch literal 24321 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 literal 0 HcmV?d00001 diff --git a/zc-business/src/main/resources/wordTemplate/tollGateEntrance.docx b/zc-business/src/main/resources/wordTemplate/tollGateEntrance.docx new file mode 100644 index 0000000000000000000000000000000000000000..2286a113e2e1aba453ace076003b41abaff90174 GIT binary patch literal 24035 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 Qz>&ahLA}SM>Luv^02sUlIsgCw literal 0 HcmV?d00001