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 00000000..4dac888a Binary files /dev/null and b/zc-business/src/main/resources/wordTemplate/frameDataAnalysis.docx differ 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 00000000..2286a113 Binary files /dev/null and b/zc-business/src/main/resources/wordTemplate/tollGateEntrance.docx differ