济菏高速数据中心代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

838 lines
46 KiB

package com.zc.business.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StakeMarkUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.zc.business.domain.DcEvent;
import com.zc.business.domain.DcEventListQuery;
import com.zc.business.domain.DcWarning;
import com.zc.business.domain.export.*;
import com.zc.business.enums.UniversalEnum;
import com.zc.business.service.IDcTrafficIncidentsService;
import com.zc.common.core.httpclient.exception.HttpException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description 交通事件统计
*
* @author liuwenge
* @date 2024/1/13 9:41
*/
@Api(tags = "交通事件统计")
@RestController
@RequestMapping("/business/trafficIncidents")
public class DcTrafficIncidentsController {
@Autowired
private IDcTrafficIncidentsService trafficIncidentsService;
/**
* @Description 首页-重点数据
*
* @author liuwenge
* @date 2024/1/13 10:10
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("首页-重点监控")
@GetMapping("/getKeyData")
public AjaxResult getKeyData(){
return trafficIncidentsService.getKeyData();
}
/**
* @Description 首页-事件专题-根据事件类型获取事件列表
*
* @author liuwenge
* @date 2024/1/13 14:27
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("根据类型获取事件列表")
@PostMapping("/getEventList")
public AjaxResult getEventList(DcEventListQuery dcEventListQuery){
return trafficIncidentsService.getEventListByType(dcEventListQuery);
}
/**
* @Description 首页-事件专题-根据事件id获取事件详情
*
* @author liuwenge
* @date 2024/1/13 14:43
* @param eventId
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("获取交通事件详情")
@GetMapping("/getEventInfo/{eventId}")
public AjaxResult getEventInfo(@ApiParam(value = "事件id", name = "eventId",required = true) @PathVariable("eventId") String eventId){
return trafficIncidentsService.getEventInfo(eventId);
}
/**
* @Description 首页-状况统计-获取日周月年交通事件数量
*
* @author liuwenge
* @date 2024/1/13 15:07
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("获取日、周、月、年的交通事件数量")
@GetMapping("/getTrafficIncidentsNum")
public AjaxResult getTrafficIncidentsNum(){
return trafficIncidentsService.getTrafficIncidentsNum();
}
/**
* @Description 路网管控-事件管控分析-各类事件的状态数量
*
* @author liuwenge
* @date 2024/1/13 15:07
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("各类事件的状态数量")
@GetMapping("/getEventStatusNum")
public AjaxResult getEventStatusNum(){
return trafficIncidentsService.getEventStatusNum();
}
/**
* @Description 路网管控-事件管控分析-事件类型分析占比
*
* @author liuwenge
* @date 2024/1/13 15:07
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("事件类型分析占比")
@GetMapping("/getAllEventNum")
public AjaxResult getAllEventNum(){
return trafficIncidentsService.getAllEventNum();
}
@ApiOperation(value = "导出事件类型分析",tags = {"ECharts导出"})
@GetMapping("/exportGetAllEventNum")
public void exportGetAllEventNum(HttpServletResponse response){
AjaxResult ajaxResult = trafficIncidentsService.getAllEventNum();
List<AllEventNum> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String,Object>> data = (List<Map<String,Object>>) ajaxResult.get("data");
Long total = data.stream().mapToLong(item -> (long) item.get("num")).sum();
for (Map<String, Object> datum : data) {
AllEventNum allEventNum = new AllEventNum();
allEventNum.setEventName(datum.get("eventName").toString());
allEventNum.setNum(datum.get("num").toString());
//计算百分比
double ratio = (double) Long.parseLong(datum.get("num").toString()) / total * 100;
ratio = Math.round(ratio * 100.0) / 100.0;
allEventNum.setRatio(ratio + "%");
list.add(allEventNum);
}
}
ExcelUtil<AllEventNum> util = new ExcelUtil<>(AllEventNum.class);
util.exportExcel(response, list, "事件类型分析");
}
/**
* @Description 路网管控-事件管控分析-事件源分析占比
*
* @author liuwenge
* @date 2024/1/13 15:07
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("事件源分析占比")
@GetMapping("/getEventSourceRatio")
public AjaxResult getEventSourceRatio(){
return trafficIncidentsService.getEventSourceRatio();
}
/**
* @Description 路网管控-事件管控分析-今日事件趋势
*
* @author liuwenge
* @date 2024/1/15 14:30
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("今日事件趋势")
@GetMapping("/getEventTrend")
public AjaxResult getEventTrend(){
return trafficIncidentsService.getEventTrend();
}
@ApiOperation(value="导出今日事件趋势",tags = {"ECharts导出"})
@PostMapping("/exportGetEventTrend")
public void exportGetEventTrend(HttpServletResponse response,@RequestBody Map<String,String> params) throws IOException {
String fileUrl = params.get("fileUrl");
AjaxResult ajaxResult = trafficIncidentsService.getEventTrend();
List<EventTrend> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
Map<String,Object> data = (Map<String,Object>) ajaxResult.get("data");
List<Map<String,Object>> perception = (List<Map<String,Object>>)data.get("perception");
List<Map<String,Object>> traffic = (List<Map<String,Object>>)data.get("traffic");
for (int i = 0; i < perception.size(); i++) {
EventTrend eventTrend = new EventTrend();
eventTrend.setHours(perception.get(i).get("hours").toString() + "时");
eventTrend.setPerception(perception.get(i).get("num").toString());
eventTrend.setTraffic(traffic.get(i).get("num").toString());
list.add(eventTrend);
}
}
ExcelUtil<EventTrend> util = new ExcelUtil<>(EventTrend.class);
int commaIndex = fileUrl.indexOf(',');
if (commaIndex == -1) {
throw new IllegalArgumentException("Invalid Data URL, no comma found to separate base64 data");
}
String base64Data = fileUrl.substring(commaIndex + 1);
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
util.exportImgExcel(response, list, "今日事件趋势",imageBytes,7,14);
}
/**
* @Description 路网管控-事件管控分析-事故车型分析
*
* @author liuwenge
* @date 2024/1/15 15:38
* @param direction 方向
* @param direction 类型(1:日, 2:月, 3:季度, 4-年)
* @param direction 时间
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("事故车型分析")
// @GetMapping("/getAccidentVehicleAnalysis")
@PostMapping("/selectAccidentVehicleAnalysis")
public AjaxResult getAccidentVehicleAnalysis(@ApiParam(value="方向", name="direction", required=true) @RequestParam ("direction") String direction,
@ApiParam(value="类型(1:日, 2:月, 3:季度, 4-年)", name="type", required=true) @RequestParam ("type") String type,
@ApiParam(value="时间", name="startTime", required=true) @RequestParam ("startTime") String startTime){
return trafficIncidentsService.getAccidentVehicleAnalysis(direction,type,startTime);
}
@ApiOperation(value="导出事故车型分析",tags = {"ECharts导出"})
@GetMapping("/exportSelectAccidentVehicleAnalysis")
public void exportSelectAccidentVehicleAnalysis(HttpServletResponse response,
@ApiParam(value="方向", name="direction", required=true) @RequestParam ("direction") String direction,
@ApiParam(value="类型(1:日, 2:月, 3:季度, 4-年)", name="type", required=true) @RequestParam ("type") String type,
@ApiParam(value="时间", name="startTime", required=true) @RequestParam ("startTime") String startTime){
AjaxResult ajaxResult = trafficIncidentsService.getAccidentVehicleAnalysis(direction,type,startTime);
List<AccidentVehicleAnalysis> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String,Object>> data = (List<Map<String,Object>>) ajaxResult.get("data");
for (Map<String, Object> datum : data) {
AccidentVehicleAnalysis accidentVehicleAnalysis = new AccidentVehicleAnalysis();
accidentVehicleAnalysis.setTypeName(datum.get("typeName").toString());
accidentVehicleAnalysis.setNum(datum.get("num").toString());
accidentVehicleAnalysis.setAvgTime(datum.get("avgTime").toString());
list.add(accidentVehicleAnalysis);
}
}
ExcelUtil<AccidentVehicleAnalysis> util = new ExcelUtil<>(AccidentVehicleAnalysis.class);
util.exportExcel(response, list, "事故车型分析");
}
/**
* @Description 路网管控-事件管控分析-收费站统计分析table
*
* @author liuwenge
* @date 2024/1/15 17:31
* @param searchType 查询条件(1:站点,2:原因)
* @param facilityIdList 站点id
* @param controlType 类型(1:封闭,2:限行)
* @param startTime 开始时间
* @param endTime 结束时间
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("收费站统计分析table")
@PostMapping("/selectTollStationAnalysis")
public AjaxResult selectTollStationAnalysis(@ApiParam(value="查询条件(1:站点,2:原因)", name="searchType", required=true) @RequestParam ("searchType") String searchType,
@ApiParam(value="站点id", name="facilityId", required=false) @RequestParam (name="facilityId",required = false) String[] facilityIdList,
@ApiParam(value="类型(1:封闭,2:限行)", name="controlType", required=false) @RequestParam (name="controlType",required = false) String controlType,
@ApiParam(value="开始时间", name="startTime", required=true) @RequestParam ("startTime") String startTime,
@ApiParam(value="结束时间", name="endTime", required=true) @RequestParam ("endTime") String endTime){
return trafficIncidentsService.selectTollStationAnalysis(searchType,facilityIdList,controlType,startTime,endTime);
}
@ApiOperation(value="导出收费站统计分析table",tags = {"ECharts导出"})
@GetMapping("/exportSelectTollStationAnalysis")
public void exportSelectTollStationAnalysis(HttpServletResponse response,
@ApiParam(value="查询条件(1:站点,2:原因)", name="searchType", required=true) @RequestParam ("searchType") String searchType,
@ApiParam(value="站点id", name="facilityId", required=false) @RequestParam (name="facilityId",required = false) String[] facilityIdList,
@ApiParam(value="类型(1:封闭,2:限行)", name="controlType", required=false) @RequestParam (name="controlType",required = false) String controlType,
@ApiParam(value="开始时间", name="startTime", required=true) @RequestParam ("startTime") String startTime,
@ApiParam(value="结束时间", name="endTime", required=true) @RequestParam ("endTime") String endTime) throws IOException, HttpException {
AjaxResult ajaxResult = trafficIncidentsService.selectTollStationAnalysis(searchType,facilityIdList,controlType,startTime,endTime);
if ("1".equals(searchType)){
List<SelectTollStationAnalysis> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String,Object>> data = (List<Map<String,Object>>) ajaxResult.get("data");
Integer closeTotal = 0;
Integer restrictionTotal = 0;
Integer total = 0;
for (Map<String, Object> datum : data) {
SelectTollStationAnalysis selectTollStationAnalysis = new SelectTollStationAnalysis();
Integer facilityClose = Integer.parseInt(datum.get("facilityClose").toString());
Integer facilityRestriction = Integer.parseInt(datum.get("facilityRestriction").toString());
Integer sum = facilityClose + facilityRestriction;
selectTollStationAnalysis.setFacilityName(datum.get("facilityName").toString());
selectTollStationAnalysis.setFacilityClose(facilityClose.toString());
selectTollStationAnalysis.setFacilityRestriction(facilityRestriction.toString());
selectTollStationAnalysis.setSum(sum.toString());
list.add(selectTollStationAnalysis);
closeTotal += facilityClose;
restrictionTotal += facilityRestriction;
total += sum;
}
SelectTollStationAnalysis selectTollStationAnalysis = new SelectTollStationAnalysis();
selectTollStationAnalysis.setFacilityName("合计");
selectTollStationAnalysis.setFacilityClose(closeTotal.toString());
selectTollStationAnalysis.setFacilityRestriction(restrictionTotal.toString());
selectTollStationAnalysis.setSum(total.toString());
list.add(selectTollStationAnalysis);
}
ExcelUtil<SelectTollStationAnalysis> util = new ExcelUtil<>(SelectTollStationAnalysis.class);
util.exportExcel(response, list, "收费站统计分析列表");
} else {
XSSFWorkbook workbook = new XSSFWorkbook(); // 创建工作簿
Sheet sheet = workbook.createSheet(UniversalEnum.THE_WHOLE_SECTION_TWO_WAY_REAL_TIME_TRAFFIC_FLOW.getValue()); // 创建工作表
// 创建数据行样式
CellStyle dataStyle = workbook.createCellStyle();
dataStyle.setAlignment(HorizontalAlignment.CENTER);
dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);
dataStyle.setBorderRight(BorderStyle.THIN);
dataStyle.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
dataStyle.setBorderLeft(BorderStyle.THIN);
dataStyle.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
dataStyle.setBorderTop(BorderStyle.THIN);
dataStyle.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
dataStyle.setBorderBottom(BorderStyle.THIN);
dataStyle.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
Font dataFont = workbook.createFont();
dataFont.setFontName(UniversalEnum.ARIAL.getValue());
dataFont.setFontHeightInPoints((short) UniversalEnum.TEN.getNumber());
dataStyle.setFont(dataFont);
// 创建表头样式
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.cloneStyleFrom(dataStyle);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerStyle.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setRightBorderColor(IndexedColors.WHITE.getIndex());
headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setLeftBorderColor(IndexedColors.WHITE.getIndex());
headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setTopBorderColor(IndexedColors.WHITE.getIndex());
headerStyle.setBorderBottom(BorderStyle.THIN);
headerStyle.setBottomBorderColor(IndexedColors.WHITE.getIndex());
Font headerFont = workbook.createFont();
headerFont.setFontName(UniversalEnum.ARIAL.getValue());
headerFont.setFontHeightInPoints((short) UniversalEnum.TEN.getNumber());
headerFont.setBold(true);
headerFont.setColor(IndexedColors.WHITE.getIndex());
headerStyle.setFont(headerFont);
// 添加第一层级表头
Row row = sheet.createRow(UniversalEnum.ZERO.getNumber());
String[] row1 = new String[]{};
if ("2".equals(controlType)){
row1 = new String[]{"限行原因","","限行站次","","","","","限行时长","","","",""};
} else {
row1 = new String[]{"封闭原因","","封闭站次","","","","","封闭时长","","","",""};
}
for (int i = 0; i < row1.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(row1[i]);
cell.setCellStyle(headerStyle);
}
// 添加第二层级表头(与第一层级对齐)
String[] row2 = new String[]{"","","目标时段","","去年同期时段","","同比(%)","目标时段","","去年同期时段","","同比(%)"};
Row subHeaderRow1 = sheet.createRow(UniversalEnum.ONE.getNumber());
for (int i = 0; i < row2.length; i++) {
Cell cell = subHeaderRow1.createCell(i);
cell.setCellValue(row2[i]);
cell.setCellStyle(headerStyle);
}
// 添加第三层级表头
String[] row3 = new String[]{"","","站次","占比(%)","站次","占比(%)","","站次","占比(%)","站次","占比(%)",""};
Row subHeaderRow2 = sheet.createRow(UniversalEnum.TWO.getNumber());
for (int i = 0; i < row3.length; i++) {
Cell cell = subHeaderRow2.createCell(i);
cell.setCellValue(row3[i]);
cell.setCellStyle(headerStyle);
}
//合并表头单元格,参数依次为起始行,结束行,起始列,结束列 (从0开始)
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ZERO.getNumber(), UniversalEnum.TWO.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ONE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ZERO.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.TWO.getNumber(), UniversalEnum.SIX.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ZERO.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.SEVEN.getNumber(), UniversalEnum.ELEVEN.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ONE.getNumber(), UniversalEnum.ONE.getNumber(), UniversalEnum.TWO.getNumber(), UniversalEnum.THREE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ONE.getNumber(), UniversalEnum.ONE.getNumber(), UniversalEnum.FOUR.getNumber(), UniversalEnum.FIVE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ONE.getNumber(), UniversalEnum.TWO.getNumber(), UniversalEnum.SIX.getNumber(), UniversalEnum.SIX.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ONE.getNumber(), UniversalEnum.ONE.getNumber(), UniversalEnum.SEVEN.getNumber(), UniversalEnum.EIGHT.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ONE.getNumber(), UniversalEnum.ONE.getNumber(), UniversalEnum.NINE.getNumber(), UniversalEnum.TEN.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ONE.getNumber(), UniversalEnum.TWO.getNumber(), UniversalEnum.ELEVEN.getNumber(), UniversalEnum.ELEVEN.getNumber()));
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String, Object>> data = (List<Map<String, Object>>) ajaxResult.get("data");
//行号
int rowIndex = 3;
//先塞入恶劣天气类型数据
for (int i = 2; i < 9; i++) {
Map<String, Object> map = data.get(i);
Row subHeaderRow = sheet.createRow(rowIndex);
Cell cell = subHeaderRow.createCell(UniversalEnum.ZERO.getNumber());
cell.setCellValue(map.get("controlCauseName").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.ONE.getNumber());
cell.setCellValue(map.get("causeTypeName").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.TWO.getNumber());
cell.setCellValue(map.get("num").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.THREE.getNumber());
cell.setCellValue(map.get("numRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.FOUR.getNumber());
cell.setCellValue(map.get("lastYearNum").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.FIVE.getNumber());
cell.setCellValue(map.get("lastYearNumRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.SIX.getNumber());
cell.setCellValue(map.get("yearNumRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.SEVEN.getNumber());
cell.setCellValue(map.get("minuteTime").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.EIGHT.getNumber());
cell.setCellValue(map.get("timeRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.NINE.getNumber());
cell.setCellValue(map.get("lastYearTime").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.TEN.getNumber());
cell.setCellValue(map.get("lastYearTimeRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.ELEVEN.getNumber());
cell.setCellValue(map.get("yearTimeRatio").toString());
cell.setCellStyle(dataStyle);
rowIndex++;
}
//再塞入车流量大、交通事故
for (int i = 0; i < 2; i++) {
Map<String, Object> map = data.get(i);
Row subHeaderRow = sheet.createRow(rowIndex);
Cell cell = subHeaderRow.createCell(UniversalEnum.ZERO.getNumber());
cell.setCellValue(map.get("controlCauseName").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.ONE.getNumber());
cell.setCellValue(map.get("causeTypeName").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.TWO.getNumber());
cell.setCellValue(map.get("num").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.THREE.getNumber());
cell.setCellValue(map.get("numRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.FOUR.getNumber());
cell.setCellValue(map.get("lastYearNum").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.FIVE.getNumber());
cell.setCellValue(map.get("lastYearNumRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.SIX.getNumber());
cell.setCellValue(map.get("yearNumRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.SEVEN.getNumber());
cell.setCellValue(map.get("minuteTime").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.EIGHT.getNumber());
cell.setCellValue(map.get("timeRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.NINE.getNumber());
cell.setCellValue(map.get("lastYearTime").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.TEN.getNumber());
cell.setCellValue(map.get("lastYearTimeRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.ELEVEN.getNumber());
cell.setCellValue(map.get("yearTimeRatio").toString());
cell.setCellStyle(dataStyle);
rowIndex++;
}
//最后塞入施工、警备任务、其他
for (int i = 9; i < 12; i++) {
Map<String, Object> map = data.get(i);
Row subHeaderRow = sheet.createRow(rowIndex);
Cell cell = subHeaderRow.createCell(UniversalEnum.ZERO.getNumber());
cell.setCellValue(map.get("controlCauseName").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.ONE.getNumber());
cell.setCellValue(map.get("causeTypeName").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.TWO.getNumber());
cell.setCellValue(map.get("num").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.THREE.getNumber());
cell.setCellValue(map.get("numRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.FOUR.getNumber());
cell.setCellValue(map.get("lastYearNum").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.FIVE.getNumber());
cell.setCellValue(map.get("lastYearNumRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.SIX.getNumber());
cell.setCellValue(map.get("yearNumRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.SEVEN.getNumber());
cell.setCellValue(map.get("minuteTime").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.EIGHT.getNumber());
cell.setCellValue(map.get("timeRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.NINE.getNumber());
cell.setCellValue(map.get("lastYearTime").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.TEN.getNumber());
cell.setCellValue(map.get("lastYearTimeRatio").toString());
cell.setCellStyle(dataStyle);
cell = subHeaderRow.createCell(UniversalEnum.ELEVEN.getNumber());
cell.setCellValue(map.get("yearTimeRatio").toString());
cell.setCellStyle(dataStyle);
rowIndex++;
}
//合并数据单元格,参数依次为起始行,结束行,起始列,结束列 (从0开始)
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.THREE.getNumber(), UniversalEnum.NINE.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ZERO.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.TEN.getNumber(), UniversalEnum.TEN.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ONE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.ELEVEN.getNumber(), UniversalEnum.ELEVEN.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ONE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.TWELVE.getNumber(), UniversalEnum.TWELVE.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ONE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.THIRTEEN.getNumber(), UniversalEnum.THIRTEEN.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ONE.getNumber()));
sheet.addMergedRegion(new CellRangeAddress(UniversalEnum.FOURTEEN.getNumber(), UniversalEnum.FOURTEEN.getNumber(), UniversalEnum.ZERO.getNumber(), UniversalEnum.ONE.getNumber()));
}
response.setContentType(UniversalEnum.DERIVE_THE_TWO_WAY_REAL_TIME_TRAFFIC_FLOW_OF_THE_WHOLE_SECTION.getValue());
response.setCharacterEncoding(UniversalEnum.LOWERCASE_UTF_8.getValue());
String fileName = "收费站统计分析列表.xlsx";
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
// 写入文件
try (ServletOutputStream outputStream = response.getOutputStream()){
workbook.write(outputStream);
} finally {
workbook.close();
}
}
}
/**
* @Description 路网管控-事件管控分析-收费站统计分析echarts(当月)
*
* @author liuwenge
* @date 2024/1/16 11:09
* @param
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("收费站统计分析echarts(当月)")
@GetMapping("/getTollStationAnalysis")
public AjaxResult getTollStationAnalysis(){
return trafficIncidentsService.getTollStationAnalysis();
}
@ApiOperation(value="导出收费站管制分析",tags = {"ECharts导出"})
@GetMapping("/exportGetTollStationAnalysis")
public void exportGetTollStationAnalysis(HttpServletResponse response){
AjaxResult ajaxResult = trafficIncidentsService.getTollStationAnalysis();
List<TollStationAnalysis> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String,Object>> data = (List<Map<String,Object>>) ajaxResult.get("data");
for (Map<String, Object> datum : data) {
TollStationAnalysis tollStationAnalysis = new TollStationAnalysis();
tollStationAnalysis.setFacilityName(datum.get("facilityName").toString());
tollStationAnalysis.setTrafficClose(datum.get("trafficClose").toString());
tollStationAnalysis.setTrafficRestriction(datum.get("trafficRestriction").toString());
list.add(tollStationAnalysis);
}
}
ExcelUtil<TollStationAnalysis> util = new ExcelUtil<>(TollStationAnalysis.class);
util.exportExcel(response, list, "收费站管制分析");
}
/**
* @Description 路网管控-事件管控分析-事故多发路段分析
*
* @author liuwenge
* @date 2024/1/16 15:52
* @param direction 方向
* @param direction 类型(1:日, 2:月, 3:季度, 4-年)
* @param direction 时间
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("事故多发路段分析")
@PostMapping("/selectRoadSectionAnalysis")
public AjaxResult selectRoadSectionAnalysis(@ApiParam(value="方向", name="direction", required=true) @RequestParam ("direction") String direction,
@ApiParam(value="类型(1:日, 2:月, 3:季度, 4-年)", name="type", required=true) @RequestParam ("type") String type,
@ApiParam(value="时间", name="startTime", required=true) @RequestParam ("startTime") String startTime){
return trafficIncidentsService.selectRoadSectionAnalysis(direction,type,startTime);
}
@ApiOperation(value="导出事故多发路段分析",tags = {"ECharts导出"})
@PostMapping("/exportSelectRoadSectionAnalysis")
public void exportSelectRoadSectionAnalysis(HttpServletResponse response, @RequestBody Map<String,String> params) throws IOException {
String direction = params.get("direction");
String type = params.get("type");
String startTime = params.get("startTime");
String fileUrl = params.get("fileUrl");
AjaxResult ajaxResult = trafficIncidentsService.selectRoadSectionAnalysis(direction,type,startTime);
List<RoadSectionAnalysis> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String,Object>> data = (List<Map<String,Object>>) ajaxResult.get("data");
for (Map<String, Object> datum : data) {
RoadSectionAnalysis roadSectionAnalysis = new RoadSectionAnalysis();
roadSectionAnalysis.setSection_name(datum.get("section_name").toString());
roadSectionAnalysis.setNum(datum.get("num").toString());
roadSectionAnalysis.setAvgNum(datum.get("avgNum").toString());
roadSectionAnalysis.setLastNum(datum.get("lastNum").toString());
roadSectionAnalysis.setMileage(datum.get("mileage").toString());
list.add(roadSectionAnalysis);
}
}
ExcelUtil<RoadSectionAnalysis> util = new ExcelUtil<>(RoadSectionAnalysis.class);
int commaIndex = fileUrl.indexOf(',');
if (commaIndex == -1) {
throw new IllegalArgumentException("Invalid Data URL, no comma found to separate base64 data");
}
String base64Data = fileUrl.substring(commaIndex + 1);
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
util.exportImgExcel(response, list, "事故多发路段分析",imageBytes,8,12);
}
/**
* @Description 路网管控-事件管控分析-事故类型分析
*
* @author liuwenge
* @date 2024/1/16 15:52
* @param direction 方向
* @param direction 类型(1:日, 2:月, 3:季度, 4-年)
* @param direction 时间
* @return com.ruoyi.common.core.domain.AjaxResult
*/
@ApiOperation("事故类型分析")
@PostMapping("/selectEventTypeAnalysis")
public AjaxResult selectEventTypeAnalysis(@ApiParam(value="方向", name="direction", required=true) @RequestParam ("direction") String direction,
@ApiParam(value="类型(1:日, 2:月, 3:季度, 4-年)", name="type", required=true) @RequestParam ("type") String type,
@ApiParam(value="时间", name="startTime", required=true) @RequestParam ("startTime") String startTime){
return trafficIncidentsService.selectEventTypeAnalysis(direction,type,startTime);
}
@ApiOperation(value="导出事故类型分析",tags = {"ECharts导出"})
@PostMapping("/exportSelectEventTypeAnalysis")
public void exportSelectEventTypeAnalysis(HttpServletResponse response,@RequestBody Map<String,String> params) throws IOException {
String direction = params.get("direction");
String type = params.get("type");
String startTime = params.get("startTime");
String fileUrl = params.get("fileUrl");
AjaxResult ajaxResult = trafficIncidentsService.selectEventTypeAnalysis(direction,type,startTime);
List<EventTypeAnalysis> list = new ArrayList<>();
if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber())) {
List<Map<String,Object>> data = (List<Map<String,Object>>) ajaxResult.get("data");
for (Map<String, Object> datum : data) {
EventTypeAnalysis eventTypeAnalysis = new EventTypeAnalysis();
eventTypeAnalysis.setEventSubclassName(datum.get("eventSubclassName").toString());
eventTypeAnalysis.setNum(datum.get("num").toString());
eventTypeAnalysis.setLastNum(datum.get("lastNum").toString());
eventTypeAnalysis.setAvgTime(datum.get("avgTime").toString());
eventTypeAnalysis.setLastAvgTime(datum.get("lastAvgTime").toString());
list.add(eventTypeAnalysis);
}
}
ExcelUtil<EventTypeAnalysis> util = new ExcelUtil<>(EventTypeAnalysis.class);
int commaIndex = fileUrl.indexOf(',');
if (commaIndex == -1) {
throw new IllegalArgumentException("Invalid Data URL, no comma found to separate base64 data");
}
String base64Data = fileUrl.substring(commaIndex + 1);
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
util.exportImgExcel(response, list, "事故类型分析",imageBytes,8,12);
}
//事件时间数量占比
@PostMapping("/selectEventTimeProportion")
public AjaxResult selectEventTimeProportion(@RequestBody DcWarning dcWarning){
if (dcWarning==null|| StringUtils.isBlank(dcWarning.getDirection())||StringUtils.isBlank(dcWarning.getType())||
dcWarning.getCurrently()==null||dcWarning.getLastYear()==null){
return AjaxResult.success("参数存在异常");
}
Date currently = dcWarning.getCurrently();
Date lastYear = dcWarning.getLastYear();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(currently);
String format = sdf.format(lastYear);
List<HashMap<String, Object>> currentlyMap = trafficIncidentsService.selectEventTimeProportion(dcWarning.getDirection(),
dcWarning.getType(), formattedDate);
List<HashMap<String, Object>> lastYearMap = trafficIncidentsService.selectEventTimeProportion(dcWarning.getDirection(),
dcWarning.getType(), format);
HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("currentlyMap",currentlyMap);
hashMap.put("lastYearMap",lastYearMap);
return AjaxResult.success(hashMap);
}
//事件时间数量占比
@PostMapping("/exportSelectEventTimeProportion")
public void exportSelectEventTimeProportion(HttpServletResponse response,@RequestBody DcWarning dcWarning) throws IOException {
if (dcWarning==null|| StringUtils.isBlank(dcWarning.getDirection())||StringUtils.isBlank(dcWarning.getType())||
dcWarning.getCurrently()==null||dcWarning.getLastYear()==null){
return ;
}
Date currently = dcWarning.getCurrently();
Date lastYear = dcWarning.getLastYear();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(currently);
String format = sdf.format(lastYear);
List<HashMap<String, Object>> currentlyMap = trafficIncidentsService.selectEventTimeProportion(dcWarning.getDirection(),
dcWarning.getType(), formattedDate);
List<HashMap<String, Object>> lastYearMap = trafficIncidentsService.selectEventTimeProportion(dcWarning.getDirection(),
dcWarning.getType(), format);
HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("currentlyMap",currentlyMap);
hashMap.put("lastYearMap",lastYearMap);
Set<String> dateKey = new HashSet<>();
String type = dcWarning.getType();
List<EventTimeProportion> list = new ArrayList<>();
if ("1".equals(type)){
currentlyMap.forEach(item ->{
dateKey.add(item.get("time").toString());
});
lastYearMap.forEach(item ->{
dateKey.add(item.get("time").toString());
});
//排序
Set<String> sortedDateKey = dateKey.stream()
.sorted(Comparator.comparingInt(Integer::parseInt))
.collect(Collectors.toCollection(LinkedHashSet::new));
for (String date : sortedDateKey) {
EventTimeProportion eventTimeProportion = new EventTimeProportion();
eventTimeProportion.setTime(date);
for (HashMap<String, Object> map : currentlyMap) {
if (date.equals(map.get("time").toString())){
eventTimeProportion.setCurrentData(map.get("number").toString());
break;
}
}
for (HashMap<String, Object> map : lastYearMap) {
if (date.equals(map.get("time").toString())){
eventTimeProportion.setContemporaneousData(map.get("number").toString());
break;
}
}
list.add(eventTimeProportion);
}
} else if ("2".equals(type)){
currentlyMap.forEach(item ->{
dateKey.add(item.get("day").toString());
});
lastYearMap.forEach(item ->{
dateKey.add(item.get("day").toString());
});
//排序
Set<String> sortedDateKey = dateKey.stream()
.sorted().collect(Collectors.toCollection(LinkedHashSet::new));
for (String date : sortedDateKey) {
EventTimeProportion eventTimeProportion = new EventTimeProportion();
eventTimeProportion.setTime(date);
for (HashMap<String, Object> map : currentlyMap) {
if (date.equals(map.get("day").toString())){
eventTimeProportion.setCurrentData(map.get("num").toString());
break;
}
}
for (HashMap<String, Object> map : lastYearMap) {
if (date.equals(map.get("day").toString())){
eventTimeProportion.setContemporaneousData(map.get("num").toString());
break;
}
}
list.add(eventTimeProportion);
}
} else if ("3".equals(type) || "4".equals(type)){
currentlyMap.forEach(item ->{
dateKey.add(item.get("month").toString());
});
lastYearMap.forEach(item ->{
dateKey.add(item.get("month").toString());
});
//排序
Set<String> sortedDateKey = dateKey.stream()
.sorted(Comparator.comparingInt(Integer::parseInt))
.collect(Collectors.toCollection(LinkedHashSet::new));
for (String date : sortedDateKey) {
EventTimeProportion eventTimeProportion = new EventTimeProportion();
eventTimeProportion.setTime(date);
for (HashMap<String, Object> map : currentlyMap) {
if (date.equals(map.get("month").toString())){
eventTimeProportion.setCurrentData(map.get("number").toString());
break;
}
}
for (HashMap<String, Object> map : lastYearMap) {
if (date.equals(map.get("month").toString())){
eventTimeProportion.setContemporaneousData(map.get("number").toString());
break;
}
}
list.add(eventTimeProportion);
}
}
ExcelUtil<EventTimeProportion> util = new ExcelUtil<>(EventTimeProportion.class);
int commaIndex = dcWarning.getFileUrl().indexOf(',');
if (commaIndex == -1) {
throw new IllegalArgumentException("Invalid Data URL, no comma found to separate base64 data");
}
String base64Data = dcWarning.getFileUrl().substring(commaIndex + 1);
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
util.exportImgExcel(response, list, "事故时间分布",imageBytes,8,12);
}
}