Commit c886e08d authored by zhoushiguang's avatar zhoushiguang
parents a209c4b5 56c487f0
...@@ -12,10 +12,14 @@ import net.wanji.common.framework.rest.JsonViewObject; ...@@ -12,10 +12,14 @@ import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.controllerv2.report.design.CrossRunStateAnalysisResult; import net.wanji.opt.controllerv2.report.design.CrossRunStateAnalysisResult;
import net.wanji.opt.controllerv2.report.design.CrossRunStatePeakAnalysisResult; import net.wanji.opt.controllerv2.report.design.CrossRunStatePeakAnalysisResult;
import net.wanji.opt.controllerv2.report.design.GreenReportRunStateResult; import net.wanji.opt.controllerv2.report.design.GreenReportRunStateResult;
import net.wanji.opt.controllerv2.report.vo.CrossRunStateAnalysisResultResponseDTO;
import net.wanji.opt.servicev2.report.AnalysisGreenWavePeakDetailService; import net.wanji.opt.servicev2.report.AnalysisGreenWavePeakDetailService;
import net.wanji.opt.servicev2.report.CrossRidLaneService;
import net.wanji.opt.vo2.report.GreenReportRunStateResponseVO; import net.wanji.opt.vo2.report.GreenReportRunStateResponseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -35,6 +39,9 @@ import java.util.List; ...@@ -35,6 +39,9 @@ import java.util.List;
@Api(value="CrossRunStateController", description="", tags = "路口分析报告-周报") @Api(value="CrossRunStateController", description="", tags = "路口分析报告-周报")
public class CrossRunStateController { public class CrossRunStateController {
@Autowired
private CrossRidLaneService crossRidLaneService;
@ApiOperation(httpMethod="GET",value="2.1-交通运行总体情况", notes="") @ApiOperation(httpMethod="GET",value="2.1-交通运行总体情况", notes="")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = true, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"), @ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = true, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"),
...@@ -45,10 +52,11 @@ public class CrossRunStateController { ...@@ -45,10 +52,11 @@ public class CrossRunStateController {
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossRunStateAnalysisResult.class), @ApiResponse(code = 200, message = "OK", response = CrossRunStateAnalysisResult.class),
}) })
public JsonViewObject getTotalitySituation(String crossIds,Integer year,Integer week) { public JsonViewObject getTotalitySituation(@RequestParam(required = false) String crossIds, Integer year, Integer week) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance(); JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try { try {
CrossRunStateAnalysisResultResponseDTO responseDTO = crossRidLaneService.getTotalitySituation(crossIds,year,week);
jsonViewObject.success(responseDTO);
} catch (Exception e) { } catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG")); jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e); log.error("{} getAll error", this.getClass().getSimpleName(), e);
......
package net.wanji.opt.controllerv2.report.vo;
import lombok.Data;
@Data
public class CrossPeakAnalysis {
// 路口 ID
private String crossId;
// 类型:1工作日 2节假日
private Integer dayType;
// 高峰类型 1早高峰 2晚高峰 3平峰
private Integer peakType;
// 日总流量平均值
private Integer dayTotalFlow;
// 日最大小时流量平均值
private Integer dayMaxHourFlow;
// 高峰期最大小时流量平均值
private Integer peakMaxHourFlow;
// 高峰期交通指数平均值
private Double peakTrafficIndex;
// 高峰期通行能力平均值
private Integer peakCapacity;
// 高峰期平均延误时间平均值
private Double peakAvgDelayTime;
// 高峰期最大排队长度平均值
private Integer peakMaxQueueLength;
// 高峰期平均停车次数平均值
private Integer peakAvgStopTimes;
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class CrossRunStateAnalysisResultResponseDTO {
@ApiModelProperty(value = "区域周最大流量路口名称", example = "经十路(舜耕路-山大路)")
private String maxFlowCrossName;
@ApiModelProperty(value = "区域周交通指数最大路口名称", example = "经十路(舜耕路-山大路)")
private String maxTrafficIndexCrossName;
@ApiModelProperty(value = "工作日平均流量", example = "13459899辆")
private String workDayAvgFlow;
@ApiModelProperty(value = "工作日早高峰最大小时流量", example = "35490辆")
private String workDayAmPeakMaxHourFlow;
@ApiModelProperty(value = "工作日晚高峰最大小时流量", example = "23454辆")
private String workDayPmPeakMaxHourFlow;
@ApiModelProperty(value = "工作日平峰最大小时流量", example = "234598辆")
private String workDayFmPeakMaxHourFlow;
@ApiModelProperty(value = "周末全天平均流量", example = "234598辆%")
private String weekEndAvgFlow;
@ApiModelProperty(value = "工作日早高峰平均交通指数", example = "4.5")
private String workDayAmPeakAvgTrafficIndex;
@ApiModelProperty(value = "工作日晚高峰平均交通指数", example = "5.5")
private String workDayPmPeakAvgTrafficIndex;
//========================================================================
@ApiModelProperty(value = "工作日平均流量与上周比较情况", example = "提升【下降】34000辆")
private String avgFlowLastWeekCompare;
@ApiModelProperty(value = "工作日早高峰最大小时流量与上周比较情况", example = "提升【下降】2300辆")
private String amPeakMaxHourFlowLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰最大小时流量与上周比较情况", example = "提升【下降】3100辆")
private String pmPeakMaxHourFlowLastWeekCompare;
@ApiModelProperty(value = "工作日平峰最大小时流量与上周比较情况", example = "提升【下降】1200辆")
private String fmPeakMaxHourFlowLastWeekCompare;
@ApiModelProperty(value = "周末全天平均流量与上周比较情况", example = "提升【下降】12000辆")
private String endAvgFlowLastWeekCompare;
@ApiModelProperty(value = "工作日早高峰平均交通指数与上周比较情况", example = "增加【减少】20%")
private String amPeakAvgTrafficIndexLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰平均交通指数与上周比较情况", example = "增加【减少】25%")
private String pmPeakAvgTrafficIndexLastWeekCompare;
//================================================================================================//
private List<CrossRunStateDetailAnalysisDataDTO> dataList = new ArrayList<>();
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class CrossRunStateDetailAnalysisDataDTO {
@ApiModelProperty(value = "路口名称", example = "经十路(舜耕路-山大路)",position =1)
private String crossName;
@ApiModelProperty(value = "本周高峰最大小时流量", example = "8900",position = 2)
private Integer thisWeekPeakMaxFlow;
@ApiModelProperty(value = "上周高峰最大小时流量", example = "8900",position =3)
private Integer lastWeekPeakMaxFlow;
@ApiModelProperty(value = "本周周末最大小时流量", example = "8900",position = 4)
private Integer thisWeekEndMaxFlow;
@ApiModelProperty(value = "上周周末最大小时流量", example = "8900",position = 5)
private Integer lastWeekEndMaxFlow;
@ApiModelProperty(value = "本周工作日早高峰交通指数", example = "4.0",position = 5)
private Double thisWeekWorkDayAmTrafficIndex;
@ApiModelProperty(value = "上周周工作日早高峰交通指数", example = "3.5",position = 6)
private Double lastWeekWorkDayAmTrafficIndex;
@ApiModelProperty(value = "本周工作日晚高峰交通指数", example = "3.5",position = 7)
private Double thisWeekWorkDayPmTrafficIndex;
@ApiModelProperty(value = "上周周工作日晚高峰交通指数", example = "4.5",position = 8)
private Double lastWeekWorkDayPmTrafficIndex;
}
\ No newline at end of file
...@@ -110,7 +110,7 @@ public class StrategyPriorityController { ...@@ -110,7 +110,7 @@ public class StrategyPriorityController {
return jsonView; return jsonView;
} }
@ApiOperation(value = "策略管理-策略优先级批量保存", notes = "批量保存", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false) @ApiOperation(value = "策略管理-策略路口干线优先级批量保存", notes = "批量保存", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false)
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "dataList", value = "优先级配置数据", required = false, dataType = "String"), @ApiImplicitParam(name = "dataList", value = "优先级配置数据", required = false, dataType = "String"),
}) })
...@@ -127,15 +127,18 @@ public class StrategyPriorityController { ...@@ -127,15 +127,18 @@ public class StrategyPriorityController {
return jsonView; return jsonView;
} }
@ApiOperation(value = "策略管理-策略优先级数据回显", notes = "数据回显", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false) @ApiOperation(value = "策略管理-策略路口干线优先级数据回显", notes = "数据回显", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false)
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "crossId", value = "路口id", required = true, dataType = "String") @ApiImplicitParam(name = "crossId", value = "路口id", required = false, dataType = "String"),
@ApiImplicitParam(name = "greenId", value = "干线id", required = false, dataType = "Integer"),
@ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "Integer"),
}) })
@GetMapping("/getPriorityConfig") @GetMapping("/getPriorityConfig")
public JsonViewObject getPriorityData(@RequestParam(required = true) String crossId){ public JsonViewObject getPriorityData(@RequestParam(required = false) String crossId,@RequestParam(required = false) Integer greenId,
@RequestParam(required = true) Integer type){
JsonViewObject jsonView = JsonViewObject.newInstance(); JsonViewObject jsonView = JsonViewObject.newInstance();
try { try {
List<StrategyFactoryEntity>list=strategyPriorityService.getPriorityData(crossId); List<StrategyFactoryEntity>list=strategyPriorityService.getPriorityData(crossId,greenId,type);
jsonView.success(list); jsonView.success(list);
} catch (Exception e) { } catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG")); jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG"));
......
package net.wanji.opt.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.opt.dto.SchemeGreenDirGreenTimeDTO;
/**
* @author duanruiming
* @date 2025/04/15 15:13
*/
public interface GreenChartSchemeRingPhaseMapper extends BaseMapper<SchemeGreenDirGreenTimeDTO> {
}
package net.wanji.opt.dao.mapper.report; package net.wanji.opt.dao.mapper.report;
import net.wanji.opt.controllerv2.report.vo.CrossPeakAnalysis;
import net.wanji.opt.entity.report.CrossRidLaneDTO; import net.wanji.opt.entity.report.CrossRidLaneDTO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -7,4 +8,6 @@ import java.util.List; ...@@ -7,4 +8,6 @@ import java.util.List;
public interface CrossRidLaneMapper { public interface CrossRidLaneMapper {
List<CrossRidLaneDTO> getCrossInfoList(@Param("crossIdList") List<String> crossIdList); List<CrossRidLaneDTO> getCrossInfoList(@Param("crossIdList") List<String> crossIdList);
List<CrossPeakAnalysis> getTotalitySituation(@Param("crossIdList") List<String> crossIdList,@Param("yearWeek") Integer yearWeek,@Param("dayType") Integer dayType,@Param("peakType") Integer peakType);
} }
...@@ -69,9 +69,9 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily ...@@ -69,9 +69,9 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily
List<String> getstrategyNo(String crossId); List<String> getstrategyNo(@Param("crossId") String crossId,@Param("type") Integer type);
List<StrategyFactoryEntity> getPriorityConfigData(@Param("strategyNo") List<String> strategyNo,@Param("crossId") String crossId); List<StrategyFactoryEntity> getPriorityConfigData(@Param("strategyNo") List<String> strategyNo,@Param("crossId") String crossId,@Param("type") Integer type);
void savePlanConfig(@Param("savePlanList") List<StrategyPriorityDailyInfo> savePlanList); void savePlanConfig(@Param("savePlanList") List<StrategyPriorityDailyInfo> savePlanList);
...@@ -92,5 +92,17 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily ...@@ -92,5 +92,17 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily
List<StrategyParameterConfig> getParamConfigData(String crossId); List<StrategyParameterConfig> getParamConfigData(String crossId);
List<StrategyPriorityDailyInfo> getStrategyGreenWave(); List<StrategyPriorityDailyInfo> getStrategyGreenWave();
List<StrategyPriorityConfig> selectGreenPriorityTable(Integer greenId);
void deleteGreenPriorityConfig(Integer greenId);
List<String> getGreenstrategyNo(@Param("greenId") Integer greenId,@Param("type") Integer type);
List<StrategyFactoryEntity> getGreenPriorityConfigData(@Param("strategyNo") List<String> strategyNo, @Param("greenId") Integer greenId,@Param("type") Integer type);
List<StrategyPriorityDailyInfo> selectGreenPlanTable(Integer greenId);
void deleteGreenPlanConfig(Integer greenId);
} }
package net.wanji.opt.dto; package net.wanji.opt.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -49,6 +51,9 @@ public class RingPhaseInfoDTO { ...@@ -49,6 +51,9 @@ public class RingPhaseInfoDTO {
private List<DirTurn> dirTurnInfoList; private List<DirTurn> dirTurnInfoList;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
/** /**
* 转换后万集的方向转向,不包含行人 * 转换后万集的方向转向,不包含行人
*/ */
......
package net.wanji.opt.dto; package net.wanji.opt.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import java.util.Date;
/** /**
* @author duanruiming * @author duanruiming
* @date 2025/04/01 15:38 * @date 2025/04/01 15:38
*/ */
@Data @Data
@TableName("t_green_chart_scheme_ring_phase_hist")
public class SchemeGreenDirGreenTimeDTO { public class SchemeGreenDirGreenTimeDTO {
@TableField(value = "cross_id")
private String crossId; private String crossId;
@TableField(value = "scheme_no")
private Integer schemeNo; private Integer schemeNo;
private Integer offset; private Integer offset;
@TableField(value = "cycle_len")
private Integer cycleLen; private Integer cycleLen;
@TableField(value = "ring_no")
private Integer ringNo; private Integer ringNo;
@TableField(value = "phase_id")
private Integer phaseId; private Integer phaseId;
private Integer start; private Integer start;
private Integer end; private Integer end;
private Integer dir; private Integer dir;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
} }
...@@ -29,6 +29,10 @@ public class GreenChartSchemeHist { ...@@ -29,6 +29,10 @@ public class GreenChartSchemeHist {
@TableField("scheme_detail") @TableField("scheme_detail")
private String schemeDetail; private String schemeDetail;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField("query_date")
private Date queryDate;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField("create_time") @TableField("create_time")
private Date createTime; private Date createTime;
......
...@@ -61,6 +61,11 @@ public class StrategyPriorityDailyInfo implements Serializable { ...@@ -61,6 +61,11 @@ public class StrategyPriorityDailyInfo implements Serializable {
*/ */
@TableField(exist = false) @TableField(exist = false)
private Integer greenId; private Integer greenId;
/**
* 类型 1:路口 2干线
*/
@TableField(exist = false)
private Integer type;
......
...@@ -40,4 +40,11 @@ public class StrategyPriorityGroup { ...@@ -40,4 +40,11 @@ public class StrategyPriorityGroup {
private StrategySchedulingParam schedulingParamters; private StrategySchedulingParam schedulingParamters;
//1:路口,2干线 //1:路口,2干线
private Integer type; private Integer type;
//干线 ID
private Integer greenId;
//干线 IDs
private List<Integer> greenIds;
} }
...@@ -117,7 +117,7 @@ public class EvaluationInfoServiceImpl extends ServiceImpl<CrossDataHistMapper, ...@@ -117,7 +117,7 @@ public class EvaluationInfoServiceImpl extends ServiceImpl<CrossDataHistMapper,
private static double calculatePercentage(double analyseValue, double contrastValue) { private static double calculatePercentage(double analyseValue, double contrastValue) {
// 防止除零错误 // 防止除零错误
if (contrastValue == 0) { if (contrastValue == 0) {
return 0; return (int)analyseValue*100;
} }
// 计算变化值(分析值 - 对比值) // 计算变化值(分析值 - 对比值)
......
...@@ -48,6 +48,7 @@ import org.springframework.util.StringUtils; ...@@ -48,6 +48,7 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -87,8 +88,8 @@ public class TrendServiceV2Impl implements TrendServiceV2 { ...@@ -87,8 +88,8 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
@Resource @Resource
private GreenChartSchemeHistMapper greenChartSchemeHistMapper; private GreenChartSchemeHistMapper greenChartSchemeHistMapper;
private static List<OptMonitoringVO> greenListCache = new ArrayList<>(10); private static List<OptMonitoringVO> greenListCache = new CopyOnWriteArrayList<>();
private static List<OptMonitoringVO> crossListCache = new ArrayList<>(80); private static List<OptMonitoringVO> crossListCache = new CopyOnWriteArrayList<>();
@Override @Override
...@@ -243,8 +244,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 { ...@@ -243,8 +244,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
} }
} }
}); });
if (!CollectionUtils.isEmpty(greenListCache)) {
greenListCache.clear(); greenListCache.clear();
greenListCache.addAll(optMonitoringVOS); greenListCache.addAll(optMonitoringVOS);
}
return optMonitoringVOS; return optMonitoringVOS;
} }
...@@ -287,8 +290,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 { ...@@ -287,8 +290,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
} }
} }
}); });
if (!CollectionUtils.isEmpty(crossListCache)) {
crossListCache.clear(); crossListCache.clear();
crossListCache.addAll(optMonitoringVOS); crossListCache.addAll(optMonitoringVOS);
}
return optMonitoringVOS; return optMonitoringVOS;
} }
......
package net.wanji.opt.servicev2.report; package net.wanji.opt.servicev2.report;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import net.wanji.opt.controllerv2.report.vo.CrossRunStateAnalysisResultResponseDTO;
import net.wanji.opt.vo2.report.CrossRidLaneResult; import net.wanji.opt.vo2.report.CrossRidLaneResult;
import java.util.List; import java.util.List;
public interface CrossRidLaneService { public interface CrossRidLaneService {
List<CrossRidLaneResult> getCrossInfoList(String crossIds); List<CrossRidLaneResult> getCrossInfoList(String crossIds);
CrossRunStateAnalysisResultResponseDTO getTotalitySituation(String crossIds, Integer year, Integer week);
} }
...@@ -2,12 +2,14 @@ package net.wanji.opt.servicev2.report.impl; ...@@ -2,12 +2,14 @@ package net.wanji.opt.servicev2.report.impl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.mapper.BaseCrossInfoMapper;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.opt.common.enums.CrossDirEnum; import net.wanji.opt.common.enums.CrossDirEnum;
import net.wanji.opt.common.enums.CrossTypeEnum; import net.wanji.opt.common.enums.CrossTypeEnum;
import net.wanji.opt.common.enums.LaneTurnEnum; import net.wanji.opt.common.enums.LaneTurnEnum;
import net.wanji.opt.controllerv2.report.vo.CrossRidLaneVO; import net.wanji.opt.controllerv2.report.vo.*;
import net.wanji.opt.controllerv2.report.vo.LaneDirNumVO;
import net.wanji.opt.dao.mapper.report.CrossRidLaneMapper; import net.wanji.opt.dao.mapper.report.CrossRidLaneMapper;
import net.wanji.opt.entity.report.CrossRidLaneDTO; import net.wanji.opt.entity.report.CrossRidLaneDTO;
import net.wanji.opt.servicev2.report.CrossRidLaneService; import net.wanji.opt.servicev2.report.CrossRidLaneService;
...@@ -26,11 +28,13 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService { ...@@ -26,11 +28,13 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService {
@Autowired @Autowired
private CrossRidLaneMapper crossRidLaneMapper; private CrossRidLaneMapper crossRidLaneMapper;
@Autowired
private BaseCrossInfoMapper baseCrossInfoMapper;
@Override @Override
public List<CrossRidLaneResult> getCrossInfoList(String crossIds) { public List<CrossRidLaneResult> getCrossInfoList(String crossIds) {
List<String> crossIdList = null; List<String> crossIdList = null;
if(ObjectUtil.isNotEmpty(crossIds)){ if (ObjectUtil.isNotEmpty(crossIds)) {
crossIdList = Arrays.stream(crossIds.split(",")) crossIdList = Arrays.stream(crossIds.split(","))
.map(String::trim) // 去除可能的空格 .map(String::trim) // 去除可能的空格
.filter(s -> !s.isEmpty()) // 过滤掉空字符串 .filter(s -> !s.isEmpty()) // 过滤掉空字符串
...@@ -40,8 +44,8 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService { ...@@ -40,8 +44,8 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService {
Map<String, List<CrossRidLaneDTO>> crossIdMap = crossRidLaneDTOList.stream().collect(Collectors.groupingBy(CrossRidLaneDTO::getCrossId)); Map<String, List<CrossRidLaneDTO>> crossIdMap = crossRidLaneDTOList.stream().collect(Collectors.groupingBy(CrossRidLaneDTO::getCrossId));
List<CrossRidLaneResult> crossRidLaneResultList = new ArrayList<>(); List<CrossRidLaneResult> crossRidLaneResultList = new ArrayList<>();
for (List<CrossRidLaneDTO> crossRidLaneDTOS : crossIdMap.values()) { for (List<CrossRidLaneDTO> crossRidLaneDTOS : crossIdMap.values()) {
Map<String, List<CrossRidLaneDTO>> laneNameMap = crossRidLaneDTOS.stream().collect(Collectors.groupingBy(x->{ Map<String, List<CrossRidLaneDTO>> laneNameMap = crossRidLaneDTOS.stream().collect(Collectors.groupingBy(x -> {
if(ObjectUtil.isNotEmpty(x.getLaneName())){ if (ObjectUtil.isNotEmpty(x.getLaneName())) {
String[] split = x.getLaneName().split(":"); String[] split = x.getLaneName().split(":");
return split[0]; return split[0];
} }
...@@ -59,10 +63,10 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService { ...@@ -59,10 +63,10 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService {
List<CrossRidLaneDTO> laneDTOS = laneNameMap.get(laneName); List<CrossRidLaneDTO> laneDTOS = laneNameMap.get(laneName);
CrossRidLaneVO crossRidLaneVO = new CrossRidLaneVO(); CrossRidLaneVO crossRidLaneVO = new CrossRidLaneVO();
crossRidLaneVO.setLaneName(laneName); crossRidLaneVO.setLaneName(laneName);
if(ObjectUtil.isEmpty(laneDTOS.get(0).getInDir())||ObjectUtil.isEmpty(laneDTOS.get(0).getOutDir())){ if (ObjectUtil.isEmpty(laneDTOS.get(0).getInDir()) || ObjectUtil.isEmpty(laneDTOS.get(0).getOutDir())) {
crossRidLaneVO.setLaneDir(getLaneDir(laneDTOS.get(0).getDir())); crossRidLaneVO.setLaneDir(getLaneDir(laneDTOS.get(0).getDir()));
}else { } else {
crossRidLaneVO.setLaneDir(CrossDirEnum.getDesc(laneDTOS.get(0).getInDir())+CrossDirEnum.getDesc(laneDTOS.get(0).getOutDir())+"走向"); crossRidLaneVO.setLaneDir(CrossDirEnum.getDesc(laneDTOS.get(0).getInDir()) + CrossDirEnum.getDesc(laneDTOS.get(0).getOutDir()) + "走向");
} }
crossRidLaneVO.setLaneNum(laneDTOS.size()); crossRidLaneVO.setLaneNum(laneDTOS.size());
Map<Integer, List<CrossRidLaneDTO>> dirLaneMap = laneDTOS.stream().collect(Collectors.groupingBy(CrossRidLaneDTO::getDir)); Map<Integer, List<CrossRidLaneDTO>> dirLaneMap = laneDTOS.stream().collect(Collectors.groupingBy(CrossRidLaneDTO::getDir));
...@@ -70,14 +74,14 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService { ...@@ -70,14 +74,14 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService {
for (Integer dir : dirLaneMap.keySet()) { for (Integer dir : dirLaneMap.keySet()) {
List<CrossRidLaneDTO> dirLaneDTOS = dirLaneMap.get(dir); List<CrossRidLaneDTO> dirLaneDTOS = dirLaneMap.get(dir);
LaneDirNumVO laneDirNumVO = new LaneDirNumVO(); LaneDirNumVO laneDirNumVO = new LaneDirNumVO();
laneDirNumVO.setLaneInDir(CrossDirEnum.getDesc(dir)+"进口"); laneDirNumVO.setLaneInDir(CrossDirEnum.getDesc(dir) + "进口");
laneDirNumVO.setLaneDirNum(dirLaneDTOS.size()); laneDirNumVO.setLaneDirNum(dirLaneDTOS.size());
Map<Integer, List<CrossRidLaneDTO>> turnMap = dirLaneDTOS.stream().collect(Collectors.groupingBy(CrossRidLaneDTO::getTurn)); Map<Integer, List<CrossRidLaneDTO>> turnMap = dirLaneDTOS.stream().collect(Collectors.groupingBy(CrossRidLaneDTO::getTurn));
String laneDirTurn = ""; String laneDirTurn = "";
for (Integer turn : turnMap.keySet()) { for (Integer turn : turnMap.keySet()) {
if("".equals(laneDirTurn)){ if ("".equals(laneDirTurn)) {
laneDirTurn = turnMap.get(turn).size() + LaneTurnEnum.getDesc(turn); laneDirTurn = turnMap.get(turn).size() + LaneTurnEnum.getDesc(turn);
}else { } else {
laneDirTurn = laneDirTurn + "," + turnMap.get(turn).size() + LaneTurnEnum.getDesc(turn); laneDirTurn = laneDirTurn + "," + turnMap.get(turn).size() + LaneTurnEnum.getDesc(turn);
} }
} }
...@@ -93,8 +97,292 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService { ...@@ -93,8 +97,292 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService {
return crossRidLaneResultList; return crossRidLaneResultList;
} }
@Override
public CrossRunStateAnalysisResultResponseDTO getTotalitySituation(String crossIds, Integer year, Integer week) {
List<String> crossIdList = null;
Integer yearWeek = Integer.valueOf("" + year + week);
Integer yearWeekLast = Integer.valueOf("" + year + (week - 1));
if (ObjectUtil.isNotEmpty(crossIds)) {
crossIdList = Arrays.stream(crossIds.split(","))
.map(String::trim) // 去除可能的空格
.filter(s -> !s.isEmpty()) // 过滤掉空字符串
.collect(Collectors.toList());
}
CrossRunStateAnalysisResultResponseDTO crossRunStateAnalysisResultResponseDTO = new CrossRunStateAnalysisResultResponseDTO();
//按周,路口id查询
List<CrossPeakAnalysis> list = crossRidLaneMapper.getTotalitySituation(crossIdList, yearWeek, null, null);
List<CrossPeakAnalysis> listLast = crossRidLaneMapper.getTotalitySituation(crossIdList, yearWeekLast, null, null);
if (ObjectUtil.isEmpty(list)) {
return null;
}
//最大车流路口
String maxFlowCrossId = "";
int maxFlowTotal = 0;
//最大交通指数路口
String maxTrafficIndexCrossId = "";
double maxTrafficIndex = 0;
for (CrossPeakAnalysis crossPeakAnalysis : list) {
if (crossPeakAnalysis.getDayTotalFlow() > maxFlowTotal) {
maxFlowTotal = crossPeakAnalysis.getDayTotalFlow();
maxFlowCrossId = crossPeakAnalysis.getCrossId();
}
}
BaseCrossInfoPO maxFlowTotalBaseCrossInfoPO = maxFlowTotalBaseCrossInfoPO = baseCrossInfoMapper.selectById(maxFlowCrossId);
crossRunStateAnalysisResultResponseDTO.setMaxFlowCrossName(maxFlowTotalBaseCrossInfoPO.getName());
for (CrossPeakAnalysis crossPeakAnalysis : list) {
if (crossPeakAnalysis.getPeakTrafficIndex() > maxTrafficIndex) {
maxTrafficIndex = crossPeakAnalysis.getDayTotalFlow();
maxTrafficIndexCrossId = crossPeakAnalysis.getCrossId();
}
}
BaseCrossInfoPO maxTrafficIndexBaseCrossInfoPO = baseCrossInfoMapper.selectById(maxTrafficIndexCrossId);
crossRunStateAnalysisResultResponseDTO.setMaxTrafficIndexCrossName(maxTrafficIndexBaseCrossInfoPO.getName());
//按工作日分组
Map<Integer, List<CrossPeakAnalysis>> dayTypeMap = list.stream().collect(Collectors.groupingBy(CrossPeakAnalysis::getDayType));
Map<Integer, List<CrossPeakAnalysis>> dayTypeMapLast = listLast.stream().collect(Collectors.groupingBy(CrossPeakAnalysis::getDayType));
double workTotalFlow = 0;
double workTotalFlowLast = 0;
int workDayAmPeakMaxHourFlow = 0;
int workDayAmPeakMaxHourFlowLast = 0;
int workDayPmPeakMaxHourFlow = 0;
int workDayPmPeakMaxHourFlowLast = 0;
int workDayFmPeakMaxHourFlow = 0;
int workDayFmPeakMaxHourFlowLast = 0;
double weekEndAvgFlow = 0;
double weekEndAvgFlowLast = 0;
double workDayAmPeakAvgTrafficIndex = 0;
double workDayAmPeakAvgTrafficIndexLast = 0;
double workDayPmPeakAvgTrafficIndex = 0;
double workDayPmPeakAvgTrafficIndexLast = 0;
if (ObjectUtil.isNotEmpty(dayTypeMap.get(1))) {
//工作日平均流量
workTotalFlow = dayTypeMap.get(1).stream().mapToInt(CrossPeakAnalysis::getDayTotalFlow).average().orElse(0.0);
//工作日高峰最大小时流量
Map<Integer, Integer> peakMaxHourFlowByPeak = dayTypeMap.get(1).stream().collect(
Collectors.groupingBy(CrossPeakAnalysis::getDayType, // 按 dayType 分组
Collectors.collectingAndThen( // 对分组后的数据进行进一步处理
Collectors.maxBy(Comparator.comparingInt(CrossPeakAnalysis::getPeakMaxHourFlow)), // 找到每组的最大值
optionalAnalysis -> optionalAnalysis.map(CrossPeakAnalysis::getPeakMaxHourFlow).orElse(0) // 提取最大值并提供默认值
)));
//工作日高峰平均交通指数
Map<Integer, Double> workDayPeakAvgTrafficIndexBypeak = dayTypeMap.get(1).stream().collect(
Collectors.groupingBy(
CrossPeakAnalysis::getDayType, // 按 dayType 分组
Collectors.averagingDouble(CrossPeakAnalysis::getPeakTrafficIndex)
));
workDayAmPeakMaxHourFlow = ObjectUtil.isEmpty(peakMaxHourFlowByPeak.get(1)) ? 0 : peakMaxHourFlowByPeak.get(1);
workDayPmPeakMaxHourFlow = ObjectUtil.isEmpty(peakMaxHourFlowByPeak.get(2)) ? 0 : peakMaxHourFlowByPeak.get(2);
workDayFmPeakMaxHourFlow = ObjectUtil.isEmpty(peakMaxHourFlowByPeak.get(3)) ? 0 : peakMaxHourFlowByPeak.get(3);
workDayAmPeakAvgTrafficIndex = ObjectUtil.isEmpty(workDayPeakAvgTrafficIndexBypeak.get(1)) ? 0 : workDayPeakAvgTrafficIndexBypeak.get(1);
workDayPmPeakAvgTrafficIndex = ObjectUtil.isEmpty(workDayPeakAvgTrafficIndexBypeak.get(2)) ? 0 : workDayPeakAvgTrafficIndexBypeak.get(2);
}
if (ObjectUtil.isNotEmpty(dayTypeMapLast.get(1))) {
//上周工作日平均流量
workTotalFlowLast = dayTypeMapLast.get(1).stream().mapToInt(CrossPeakAnalysis::getDayTotalFlow).average().orElse(0.0);
//上周工作日高峰最大小时流量
Map<Integer, Integer> peakMaxHourFlowByPeakLast = dayTypeMapLast.get(1).stream().collect(
Collectors.groupingBy(CrossPeakAnalysis::getDayType, // 按 dayType 分组
Collectors.collectingAndThen( // 对分组后的数据进行进一步处理
Collectors.maxBy(Comparator.comparingInt(CrossPeakAnalysis::getPeakMaxHourFlow)), // 找到每组的最大值
optionalAnalysis -> optionalAnalysis.map(CrossPeakAnalysis::getPeakMaxHourFlow).orElse(0) // 提取最大值并提供默认值
)));
//上周工作日高峰平均交通指数
Map<Integer, Double> workDayPeakAvgTrafficIndexBypeakLast = dayTypeMapLast.get(1).stream().collect(
Collectors.groupingBy(
CrossPeakAnalysis::getDayType, // 按 dayType 分组
Collectors.averagingDouble(CrossPeakAnalysis::getPeakTrafficIndex)
));
workDayAmPeakMaxHourFlowLast = ObjectUtil.isEmpty(peakMaxHourFlowByPeakLast.get(1)) ? 0 : peakMaxHourFlowByPeakLast.get(1);
workDayPmPeakMaxHourFlowLast = ObjectUtil.isEmpty(peakMaxHourFlowByPeakLast.get(2)) ? 0 : peakMaxHourFlowByPeakLast.get(2);
workDayFmPeakMaxHourFlowLast = ObjectUtil.isEmpty(peakMaxHourFlowByPeakLast.get(3)) ? 0 : peakMaxHourFlowByPeakLast.get(3);
workDayAmPeakAvgTrafficIndexLast = ObjectUtil.isEmpty(workDayPeakAvgTrafficIndexBypeakLast.get(1)) ? 0 : workDayPeakAvgTrafficIndexBypeakLast.get(1);
workDayPmPeakAvgTrafficIndexLast = ObjectUtil.isEmpty(workDayPeakAvgTrafficIndexBypeakLast.get(2)) ? 0 : workDayPeakAvgTrafficIndexBypeakLast.get(2);
}
if (ObjectUtil.isNotEmpty(dayTypeMap.get(2))) {
//周末车流量
weekEndAvgFlow = dayTypeMap.get(2).stream().mapToInt(CrossPeakAnalysis::getDayTotalFlow).average().orElse(0.0);
}
if (ObjectUtil.isNotEmpty(dayTypeMapLast.get(2))) {
//上周周末车流量
weekEndAvgFlowLast = dayTypeMapLast.get(2).stream().mapToInt(CrossPeakAnalysis::getDayTotalFlow).average().orElse(0.0);
}
//工作日平均车流差
double workTotalFlowSum = workTotalFlow - workTotalFlowLast;
//周末平均车流差
double weekEndAvgFlowSum = weekEndAvgFlow - weekEndAvgFlowLast;
int workDayAmPeakMaxHourFlowSum = workDayAmPeakMaxHourFlow - workDayAmPeakMaxHourFlowLast;
int workDayPmPeakMaxHourFlowSum = workDayPmPeakMaxHourFlow - workDayPmPeakMaxHourFlowLast;
int workDayFmPeakMaxHourFlowSum = workDayFmPeakMaxHourFlow - workDayFmPeakMaxHourFlowLast;
double workDayAmPeakAvgTrafficIndexSum = workDayAmPeakAvgTrafficIndex - workDayAmPeakAvgTrafficIndexLast;
double workDayPmPeakAvgTrafficIndexSum = workDayPmPeakAvgTrafficIndex - workDayPmPeakAvgTrafficIndexLast;
//工作日、周末车流
crossRunStateAnalysisResultResponseDTO.setWorkDayAvgFlow(String.valueOf(Math.round(workTotalFlow)) + "辆");
crossRunStateAnalysisResultResponseDTO.setWeekEndAvgFlow(String.valueOf(Math.round(weekEndAvgFlow)) + "辆");
crossRunStateAnalysisResultResponseDTO.setWorkDayAmPeakMaxHourFlow(String.valueOf(workDayAmPeakMaxHourFlow) + "辆");
crossRunStateAnalysisResultResponseDTO.setWorkDayPmPeakMaxHourFlow(String.valueOf(workDayPmPeakMaxHourFlow) + "辆");
crossRunStateAnalysisResultResponseDTO.setWorkDayFmPeakMaxHourFlow(String.valueOf(workDayFmPeakMaxHourFlow) + "辆");
crossRunStateAnalysisResultResponseDTO.setWorkDayAmPeakAvgTrafficIndex(String.valueOf(workDayAmPeakAvgTrafficIndex));
crossRunStateAnalysisResultResponseDTO.setWorkDayPmPeakAvgTrafficIndex(String.valueOf(workDayPmPeakAvgTrafficIndex));
if (workTotalFlowSum > 0) {
crossRunStateAnalysisResultResponseDTO.setAvgFlowLastWeekCompare("提升" + Math.round(workTotalFlowSum) + "辆");
} else {
crossRunStateAnalysisResultResponseDTO.setAvgFlowLastWeekCompare("下降" + Math.abs(Math.round(workTotalFlowSum)) + "辆");
}
if (weekEndAvgFlowSum > 0) {
crossRunStateAnalysisResultResponseDTO.setEndAvgFlowLastWeekCompare("提升" + weekEndAvgFlowSum + "辆");
} else {
crossRunStateAnalysisResultResponseDTO.setEndAvgFlowLastWeekCompare("下降" + Math.abs(weekEndAvgFlowSum) + "辆");
}
if (workDayAmPeakMaxHourFlowSum > 0) {
crossRunStateAnalysisResultResponseDTO.setAmPeakMaxHourFlowLastWeekCompare("提升" + workDayAmPeakMaxHourFlowSum + "辆");
} else {
crossRunStateAnalysisResultResponseDTO.setAmPeakMaxHourFlowLastWeekCompare("下降" + Math.abs(workDayAmPeakMaxHourFlowSum) + "辆");
}
if (workDayPmPeakMaxHourFlowSum > 0) {
crossRunStateAnalysisResultResponseDTO.setPmPeakMaxHourFlowLastWeekCompare("提升" + workDayPmPeakMaxHourFlowSum + "辆");
} else {
crossRunStateAnalysisResultResponseDTO.setPmPeakMaxHourFlowLastWeekCompare("下降" + Math.abs(workDayPmPeakMaxHourFlowSum) + "辆");
}
if (workDayFmPeakMaxHourFlowSum > 0) {
crossRunStateAnalysisResultResponseDTO.setFmPeakMaxHourFlowLastWeekCompare("提升" + workDayFmPeakMaxHourFlowSum + "辆");
} else {
crossRunStateAnalysisResultResponseDTO.setFmPeakMaxHourFlowLastWeekCompare("下降" + Math.abs(workDayFmPeakMaxHourFlowSum) + "辆");
}
if (workDayAmPeakAvgTrafficIndexSum > 0) {
if(workDayAmPeakAvgTrafficIndexLast == 0){
crossRunStateAnalysisResultResponseDTO.setAmPeakAvgTrafficIndexLastWeekCompare("提升100%");
}else {
crossRunStateAnalysisResultResponseDTO.setAmPeakAvgTrafficIndexLastWeekCompare("提升" + Math.round(workDayAmPeakAvgTrafficIndexSum * 100 / workDayAmPeakAvgTrafficIndexLast * 100) / 100.0 + "%");
}
} else {
if(workDayAmPeakAvgTrafficIndexLast == 0){
crossRunStateAnalysisResultResponseDTO.setAmPeakAvgTrafficIndexLastWeekCompare("下降0%");
}else {
crossRunStateAnalysisResultResponseDTO.setAmPeakAvgTrafficIndexLastWeekCompare("下降" + Math.abs(Math.round(workDayAmPeakAvgTrafficIndexSum * 100 / workDayAmPeakAvgTrafficIndexLast * 100) / 100.0) + "%");
}
}
if (workDayPmPeakAvgTrafficIndexSum > 0) {
if(workDayAmPeakAvgTrafficIndexLast == 0){
crossRunStateAnalysisResultResponseDTO.setPmPeakAvgTrafficIndexLastWeekCompare("提升100%");
}else {
crossRunStateAnalysisResultResponseDTO.setPmPeakAvgTrafficIndexLastWeekCompare("提升" + Math.round(workDayPmPeakAvgTrafficIndexSum * 100 / workDayAmPeakAvgTrafficIndexLast * 100) / 100.0 + "%");
}
} else {
if(workDayAmPeakAvgTrafficIndexLast == 0){
crossRunStateAnalysisResultResponseDTO.setPmPeakAvgTrafficIndexLastWeekCompare("下降0%");
}else {
crossRunStateAnalysisResultResponseDTO.setPmPeakAvgTrafficIndexLastWeekCompare("下降" + Math.abs(Math.round(workDayPmPeakAvgTrafficIndexSum * 100 / workDayPmPeakAvgTrafficIndexLast * 100) / 100.0) + "%");
}
}
Map<String, List<CrossPeakAnalysis>> crossIdMap = list.stream().collect(Collectors.groupingBy(CrossPeakAnalysis::getCrossId));
Map<String, List<CrossPeakAnalysis>> crossIdMapLast = listLast.stream().collect(Collectors.groupingBy(CrossPeakAnalysis::getCrossId));
List<CrossRunStateDetailAnalysisDataDTO> crossRunStateDetailAnalysisDataDTOS = new ArrayList<>();
if(ObjectUtil.isNotEmpty(crossIdMap)){
for (String crossId : crossIdMap.keySet()) {
CrossRunStateDetailAnalysisDataDTO crossRunStateDetailAnalysisDataDTO = new CrossRunStateDetailAnalysisDataDTO();
List<CrossPeakAnalysis> crossPeakAnalyses = crossIdMap.get(crossId);
List<CrossPeakAnalysis> crossPeakAnalysesLast = crossIdMapLast.get(crossId);
int thisWeekPeakMaxFlow = 0;
int lastWeekPeakMaxFlow = 0;
int thisWeekEndMaxFlow = 0;
int lastWeekEndMaxFlow = 0;
double thisWeekWorkDayAmTrafficIndex = 0;
int thisWeekWorkDayAmTrafficIndexCount = 0;
double lastWeekWorkDayAmTrafficIndex = 0;
int lastWeekWorkDayAmTrafficIndexCount = 0;
double thisWeekWorkDayPmTrafficIndex = 0;
int thisWeekWorkDayPmTrafficIndexCount = 0;
double lastWeekWorkDayPmTrafficIndex = 0;
int lastWeekWorkDayPmTrafficIndexCount = 0;
if(ObjectUtil.isNotEmpty(crossPeakAnalyses)){
for (CrossPeakAnalysis crossPeakAnalysis : crossPeakAnalyses) {
if (crossPeakAnalysis.getDayType() == 1) {
if (crossPeakAnalysis.getPeakMaxHourFlow() > thisWeekPeakMaxFlow) {
thisWeekPeakMaxFlow = crossPeakAnalysis.getPeakMaxHourFlow();
}
if (crossPeakAnalysis.getPeakType() == 1) {
thisWeekWorkDayAmTrafficIndexCount++;
thisWeekWorkDayAmTrafficIndex += crossPeakAnalysis.getPeakTrafficIndex();
}
if (crossPeakAnalysis.getPeakType() == 2) {
thisWeekWorkDayPmTrafficIndexCount++;
thisWeekWorkDayPmTrafficIndex += crossPeakAnalysis.getPeakTrafficIndex();
}
}
if (crossPeakAnalysis.getDayType() == 2) {
if (crossPeakAnalysis.getPeakMaxHourFlow() > thisWeekEndMaxFlow) {
thisWeekEndMaxFlow = crossPeakAnalysis.getPeakMaxHourFlow();
}
}
}
}
if(ObjectUtil.isNotEmpty(crossPeakAnalysesLast)){
for (CrossPeakAnalysis crossPeakAnalysis : crossPeakAnalysesLast) {
if (crossPeakAnalysis.getDayType() == 1) {
if (crossPeakAnalysis.getPeakMaxHourFlow() > lastWeekPeakMaxFlow) {
lastWeekEndMaxFlow = crossPeakAnalysis.getPeakMaxHourFlow();
}
if (crossPeakAnalysis.getPeakType() == 1) {
lastWeekWorkDayAmTrafficIndexCount++;
lastWeekWorkDayAmTrafficIndex += crossPeakAnalysis.getPeakTrafficIndex();
}
if (crossPeakAnalysis.getPeakType() == 2) {
lastWeekWorkDayPmTrafficIndexCount++;
lastWeekWorkDayPmTrafficIndex += crossPeakAnalysis.getPeakTrafficIndex();
}
}
if (crossPeakAnalysis.getDayType() == 2) {
if (crossPeakAnalysis.getPeakMaxHourFlow() > lastWeekEndMaxFlow) {
lastWeekEndMaxFlow = crossPeakAnalysis.getPeakMaxHourFlow();
}
}
}
}
crossRunStateDetailAnalysisDataDTO.setThisWeekPeakMaxFlow(thisWeekPeakMaxFlow);
crossRunStateDetailAnalysisDataDTO.setLastWeekPeakMaxFlow(lastWeekPeakMaxFlow);
crossRunStateDetailAnalysisDataDTO.setThisWeekEndMaxFlow(thisWeekEndMaxFlow);
crossRunStateDetailAnalysisDataDTO.setLastWeekEndMaxFlow(lastWeekEndMaxFlow);
if(thisWeekWorkDayAmTrafficIndexCount==0){
crossRunStateDetailAnalysisDataDTO.setThisWeekWorkDayAmTrafficIndex(0.0);
}else {
crossRunStateDetailAnalysisDataDTO.setThisWeekWorkDayAmTrafficIndex(thisWeekWorkDayAmTrafficIndex / thisWeekWorkDayAmTrafficIndexCount);
}
if(lastWeekWorkDayAmTrafficIndexCount==0){
crossRunStateDetailAnalysisDataDTO.setLastWeekWorkDayAmTrafficIndex(0.0);
}else {
crossRunStateDetailAnalysisDataDTO.setLastWeekWorkDayAmTrafficIndex(lastWeekWorkDayAmTrafficIndex / lastWeekWorkDayAmTrafficIndexCount);
}
if(thisWeekWorkDayPmTrafficIndexCount==0){
crossRunStateDetailAnalysisDataDTO.setThisWeekWorkDayPmTrafficIndex(0.0);
}else {
crossRunStateDetailAnalysisDataDTO.setThisWeekWorkDayPmTrafficIndex(thisWeekWorkDayPmTrafficIndex / thisWeekWorkDayPmTrafficIndexCount);
}
if(lastWeekWorkDayPmTrafficIndexCount==0){
crossRunStateDetailAnalysisDataDTO.setThisWeekWorkDayAmTrafficIndex(0.0);
}else {
crossRunStateDetailAnalysisDataDTO.setThisWeekWorkDayAmTrafficIndex(lastWeekWorkDayPmTrafficIndex / lastWeekWorkDayPmTrafficIndexCount);
}
crossRunStateDetailAnalysisDataDTOS.add(crossRunStateDetailAnalysisDataDTO);
}
}
crossRunStateAnalysisResultResponseDTO.setDataList(crossRunStateDetailAnalysisDataDTOS);
return crossRunStateAnalysisResultResponseDTO;
}
private String getLaneDir(Integer dir) { private String getLaneDir(Integer dir) {
switch (dir){ switch (dir) {
case 1: case 1:
return "南北走向"; return "南北走向";
case 2: case 2:
...@@ -129,7 +417,7 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService { ...@@ -129,7 +417,7 @@ public class CrossRidLaneServiceImpl implements CrossRidLaneService {
String longitude = parts[0]; // 经度 String longitude = parts[0]; // 经度
String latitude = parts[1]; // 纬度 String latitude = parts[1]; // 纬度
return longitude + "," +latitude; return longitude + "," + latitude;
} else { } else {
log.error("未找到匹配的 POINT 格式"); log.error("未找到匹配的 POINT 格式");
} }
......
...@@ -34,7 +34,7 @@ public interface StrategyPriorityService extends IService<StrategyPriorityDailyI ...@@ -34,7 +34,7 @@ public interface StrategyPriorityService extends IService<StrategyPriorityDailyI
void savePriority(List<StrategyPriorityGroup> dataList); void savePriority(List<StrategyPriorityGroup> dataList);
List<StrategyFactoryEntity> getPriorityData(String crossId); List<StrategyFactoryEntity> getPriorityData(String crossId,Integer greenId, Integer type) throws Exception;
void savePlanConfig(List<StrategyPriorityGroup> dailyPlanDetails) throws JsonProcessingException; void savePlanConfig(List<StrategyPriorityGroup> dailyPlanDetails) throws JsonProcessingException;
......
...@@ -81,13 +81,18 @@ import java.util.stream.Collectors; ...@@ -81,13 +81,18 @@ import java.util.stream.Collectors;
List<StrategyFactoryEntity> strategyList=strategyPriorityMapper.getCompanyList(); List<StrategyFactoryEntity> strategyList=strategyPriorityMapper.getCompanyList();
return strategyList; return strategyList;
} }
/*
* 策略优先级保存 路口 干线共用
* */
@Override @Override
@Transactional @Transactional
public void savePriority(List<StrategyPriorityGroup> dataList) { public void savePriority(List<StrategyPriorityGroup> dataList) {
try { try {
List<StrategyPriorityConfig> saveList = new ArrayList<>(); List<StrategyPriorityConfig> saveList = new ArrayList<>();
for (StrategyPriorityGroup group : dataList) { for (StrategyPriorityGroup group : dataList) {
//Type : 1;路口2:干线
Integer typePd=group.getType();
if(typePd==1) {
String label = group.getLabel(); String label = group.getLabel();
Integer labelCode = group.getLabelCode(); Integer labelCode = group.getLabelCode();
//1;路口2干线 //1;路口2干线
...@@ -120,6 +125,41 @@ import java.util.stream.Collectors; ...@@ -120,6 +125,41 @@ import java.util.stream.Collectors;
} }
} }
} }
}else if (typePd==2){
String label = group.getLabel();
Integer labelCode = group.getLabelCode();
//1;路口2干线
Integer type = group.getType();
//干线id
List<Integer> greenList = group.getGreenIds();
//选中多个干线存多条数据
for (Integer greenId : greenList) {
//先判断表里有没有数据,有的话删除t_strategy_priority_config
List<StrategyPriorityConfig> priorityConfig = strategyPriorityMapper.selectGreenPriorityTable(greenId);
if (priorityConfig.size() > 0) {
strategyPriorityMapper.deleteGreenPriorityConfig(greenId);
}
if (CollectionUtils.isNotEmpty(group.getData())) {
for (StrategyPriorityConfig item : group.getData()) {
StrategyPriorityConfig strategyPriorityConfig = new StrategyPriorityConfig();
//干线id
strategyPriorityConfig.setGreenId(greenId);
//分组id
strategyPriorityConfig.setGroupId(labelCode);
//分组名称
strategyPriorityConfig.setGroupName(label);
//策略编号
strategyPriorityConfig.setStrategyNo(item.getStrategyNo());
//优先级
strategyPriorityConfig.setPriority(item.getPriority());
//type
strategyPriorityConfig.setType(type);
saveList.add(strategyPriorityConfig);
}
}
}
}
} }
strategyPriorityMapper.savePriorityInsert(saveList); strategyPriorityMapper.savePriorityInsert(saveList);
} catch (Exception e) { } catch (Exception e) {
...@@ -128,17 +168,38 @@ import java.util.stream.Collectors; ...@@ -128,17 +168,38 @@ import java.util.stream.Collectors;
} }
} }
/*
* 策略优先级路口跟干线数据回显
* */
@Override @Override
@Transactional @Transactional
public List<StrategyFactoryEntity> getPriorityData(String crossId) { public List<StrategyFactoryEntity> getPriorityData(String crossId,Integer greenId, Integer type) throws Exception {
try { try {
List<StrategyFactoryEntity> priorityList =new ArrayList<>();
//type: 1路口 2干线
if (type==1) {
if (crossId.isEmpty()){
throw new IllegalArgumentException("crossId cannot be null");
}
//先获取策略编号
List<String> strategyNo = strategyPriorityMapper.getstrategyNo(crossId,type);
if (CollectionUtils.isEmpty(strategyNo)) {
return Collections.emptyList();
}
priorityList = strategyPriorityMapper.getPriorityConfigData(strategyNo, crossId,type);
}else if (type==2){
if (greenId==null){
throw new IllegalArgumentException("greenId cannot be null");
}
//先获取策略编号 //先获取策略编号
List<String> strategyNo = strategyPriorityMapper.getstrategyNo(crossId); List<String> strategyNo = strategyPriorityMapper.getGreenstrategyNo(greenId,type);
if (CollectionUtils.isEmpty(strategyNo)){ if (CollectionUtils.isEmpty(strategyNo)) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<StrategyFactoryEntity> priorityList = strategyPriorityMapper.getPriorityConfigData(strategyNo,crossId); priorityList = strategyPriorityMapper.getGreenPriorityConfigData(strategyNo, greenId,type);
}
return priorityList; return priorityList;
}catch (Exception e){ }catch (Exception e){
log.error("{} getPriorityData", this.getClass().getSimpleName(), e); log.error("{} getPriorityData", this.getClass().getSimpleName(), e);
...@@ -147,6 +208,9 @@ import java.util.stream.Collectors; ...@@ -147,6 +208,9 @@ import java.util.stream.Collectors;
} }
/*
* 策略管理日计划批量保存 干线跟路口
* */
@Override @Override
@Transactional @Transactional
public void savePlanConfig(List<StrategyPriorityGroup> dailyPlanDetails) throws JsonProcessingException { public void savePlanConfig(List<StrategyPriorityGroup> dailyPlanDetails) throws JsonProcessingException {
...@@ -155,12 +219,18 @@ import java.util.stream.Collectors; ...@@ -155,12 +219,18 @@ import java.util.stream.Collectors;
List<StrategyPriorityDailyInfo> savePlanList = new ArrayList<>(); List<StrategyPriorityDailyInfo> savePlanList = new ArrayList<>();
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
for (StrategyPriorityGroup group : dailyPlanDetails) { for (StrategyPriorityGroup group : dailyPlanDetails) {
//Type : 1;路口2:干线
Integer typePd=group.getType();
if (typePd==1) {
//路口ID //路口ID
List<String> crossList = group.getCrossIds(); List<String> crossList = group.getCrossIds();
//选中多个路口存多条数据 //选中多个路口存多条数据
for (String crossId : crossList) { for (String crossId : crossList) {
StrategyPriorityDailyInfo strategyPriorityDailyInfo = new StrategyPriorityDailyInfo(); StrategyPriorityDailyInfo strategyPriorityDailyInfo = new StrategyPriorityDailyInfo();
strategyPriorityDailyInfo.setCrossId(crossId); strategyPriorityDailyInfo.setCrossId(crossId);
//1;路口2干线
Integer type = group.getType();
strategyPriorityDailyInfo.setType(type);
//日计划编号 //日计划编号
Integer dailyPlanId = group.getDailyPlanId(); Integer dailyPlanId = group.getDailyPlanId();
strategyPriorityDailyInfo.setDailyPlanId(dailyPlanId); strategyPriorityDailyInfo.setDailyPlanId(dailyPlanId);
...@@ -178,10 +248,41 @@ import java.util.stream.Collectors; ...@@ -178,10 +248,41 @@ import java.util.stream.Collectors;
String dailyPlanDetailsJson = JSON.toJSONString(dailyPlanDetails1); String dailyPlanDetailsJson = JSON.toJSONString(dailyPlanDetails1);
strategyPriorityDailyInfo.setDailyPlanDetails(dailyPlanDetailsJson); strategyPriorityDailyInfo.setDailyPlanDetails(dailyPlanDetailsJson);
savePlanList.add(strategyPriorityDailyInfo);
}
}else if(typePd==2){
//干线ID
List<Integer> greenIdList = group.getGreenIds();
//选中多个路口存多条数据
for (Integer greenId : greenIdList) {
StrategyPriorityDailyInfo strategyPriorityDailyInfo = new StrategyPriorityDailyInfo();
strategyPriorityDailyInfo.setGreenId(greenId);
//1;路口2干线
Integer type = group.getType();
strategyPriorityDailyInfo.setType(type);
//日计划编号
Integer dailyPlanId = group.getDailyPlanId();
strategyPriorityDailyInfo.setDailyPlanId(dailyPlanId);
//执行时间
String weekExecute = group.getWeekExecute();
strategyPriorityDailyInfo.setWeekExecute(weekExecute);
//先判断表里有没有数据,有的话删除t_strategy_priority_daily_info
List<StrategyPriorityDailyInfo> planConfig = strategyPriorityMapper.selectGreenPlanTable(greenId);
if (planConfig.size() > 0) {
strategyPriorityMapper.deleteGreenPlanConfig(greenId);
}
//取出日计划详情
List<StrategyPriorityPlanDetails> dailyPlanDetails1 = group.getDailyPlanDetails();
String dailyPlanDetailsJson = JSON.toJSONString(dailyPlanDetails1);
strategyPriorityDailyInfo.setDailyPlanDetails(dailyPlanDetailsJson);
savePlanList.add(strategyPriorityDailyInfo); savePlanList.add(strategyPriorityDailyInfo);
} }
} }
}
strategyPriorityMapper.savePlanConfig(savePlanList); strategyPriorityMapper.savePlanConfig(savePlanList);
}catch (Exception e){ }catch (Exception e){
log.error("{} savePlanConfig", this.getClass().getSimpleName(), e); log.error("{} savePlanConfig", this.getClass().getSimpleName(), e);
throw e; throw e;
......
...@@ -36,7 +36,7 @@ import java.util.stream.Collectors; ...@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
*/ */
@Component @Component
@Slf4j @Slf4j
@Profile("docker") @Profile("test")
public class HisenseGreenChartTask { public class HisenseGreenChartTask {
@Resource @Resource
...@@ -97,7 +97,12 @@ public class HisenseGreenChartTask { ...@@ -97,7 +97,12 @@ public class HisenseGreenChartTask {
Integer sort = indexDTO.getSort(); Integer sort = indexDTO.getSort();
Integer indexDir = indexDTO.getInDir(); Integer indexDir = indexDTO.getInDir();
Integer totalDistance = indexDTO.getTotalDistance(); Integer totalDistance = indexDTO.getTotalDistance();
Double travelTime = getTravelTime(realTimeMap, greenId, indexDir, totalDistance);
String greenKey = CommonUtils.getStrJoin(String.valueOf(greenId), String.valueOf(indexDir));
GreenwaveRealtimePO greenwaveRealtimePO = realTimeMap.get(greenKey);
Double speed = Objects.isNull(greenwaveRealtimePO.getSpeed()) ? 0 : greenwaveRealtimePO.getSpeed() ;
// km/h速度换成m/s
Double travelTime = totalDistance / speed * 3.6;
List<Double> offsets = new ArrayList<>(); List<Double> offsets = new ArrayList<>();
List<Double> distances = new ArrayList<>(); List<Double> distances = new ArrayList<>();
// 正向红灯时间 // 正向红灯时间
...@@ -110,15 +115,19 @@ public class HisenseGreenChartTask { ...@@ -110,15 +115,19 @@ public class HisenseGreenChartTask {
List<GreenCrossDirDTO> backValue = value.stream().sorted(Comparator.comparingInt(GreenCrossDirDTO::getSort).reversed()).collect(Collectors.toList()); List<GreenCrossDirDTO> backValue = value.stream().sorted(Comparator.comparingInt(GreenCrossDirDTO::getSort).reversed()).collect(Collectors.toList());
List<Double> backOffsets = new ArrayList<>(); List<Double> backOffsets = new ArrayList<>();
List<Double> backDistances = new ArrayList<>(); List<Double> backDistances = new ArrayList<>();
Double backTravelTime = getTravelTime(realTimeMap, greenId, indexOutDir, totalDistance); String backGreenKey = CommonUtils.getStrJoin(String.valueOf(greenId), String.valueOf(indexOutDir));
GreenwaveRealtimePO backGreenwaveRealtimePO = realTimeMap.get(backGreenKey);
// km/h速度换成m/s
Double backSpeed = Objects.isNull(backGreenwaveRealtimePO.getSpeed()) ? 0 : backGreenwaveRealtimePO.getSpeed();
Double backTravelTime = totalDistance / backSpeed * 3.6;
Map<String, List<List<Double>>> backCrossRedTimesMap = new LinkedHashMap<>(); Map<String, List<List<Double>>> backCrossRedTimesMap = new LinkedHashMap<>();
Map<String, List<List<Double>>> backCrossGreenTimesMap = new LinkedHashMap<>(); Map<String, List<List<Double>>> backCrossGreenTimesMap = new LinkedHashMap<>();
getCrossRedTimeMap(mapper, greenDirGreenTimeMap, backValue, indexOutDir, backTravelTime, backOffsets, backDistances, backCrossRedTimesMap, backCrossGreenTimesMap); getCrossRedTimeMap(mapper, greenDirGreenTimeMap, backValue, indexOutDir, backTravelTime, backOffsets, backDistances, backCrossRedTimesMap, backCrossGreenTimesMap);
greenBeltChartDTO.setGreenId(greenId); greenBeltChartDTO.setGreenId(greenId);
greenBeltChartDTO.setDir(indexDir); greenBeltChartDTO.setDir(indexDir);
greenBeltChartDTO.setBackDir(indexOutDir); greenBeltChartDTO.setBackDir(indexOutDir);
greenBeltChartDTO.setSpeed(totalDistance / travelTime); greenBeltChartDTO.setSpeed(speed);
greenBeltChartDTO.setBackSpeed(totalDistance / backTravelTime); greenBeltChartDTO.setBackSpeed(backSpeed);
greenBeltChartDTO.setOffsets(offsets); greenBeltChartDTO.setOffsets(offsets);
greenBeltChartDTO.setBackOffsets(backOffsets); greenBeltChartDTO.setBackOffsets(backOffsets);
greenBeltChartDTO.setDistances(distances); greenBeltChartDTO.setDistances(distances);
...@@ -140,7 +149,7 @@ public class HisenseGreenChartTask { ...@@ -140,7 +149,7 @@ public class HisenseGreenChartTask {
// 正向 1 // 正向 1
getGreenwaveStartGroup(greenBeltChartDTOS, greenwaveStartGroup, greenId, value, 1); getGreenwaveStartGroup(greenBeltChartDTOS, greenwaveStartGroup, greenId, value, 1);
// 反向 2 // 反向 2
List<GreenCrossDirDTO> backValue = value.stream().sorted(Comparator.comparingInt(GreenCrossDirDTO::getSort)).collect(Collectors.toList()); List<GreenCrossDirDTO> backValue = value.stream().sorted(Comparator.comparingInt(GreenCrossDirDTO::getSort).reversed()).collect(Collectors.toList());
getGreenwaveStartGroup(greenBeltChartDTOS, backGreenwaveStartGroup, greenId, backValue, 2); getGreenwaveStartGroup(greenBeltChartDTOS, backGreenwaveStartGroup, greenId, backValue, 2);
greenBeltChartDTOS.forEach(item -> { greenBeltChartDTOS.forEach(item -> {
if (Objects.equals(greenId, item.getGreenId())) { if (Objects.equals(greenId, item.getGreenId())) {
...@@ -157,6 +166,12 @@ public class HisenseGreenChartTask { ...@@ -157,6 +166,12 @@ public class HisenseGreenChartTask {
greenChartSchemeHist.setGreenId(greenId); greenChartSchemeHist.setGreenId(greenId);
greenChartSchemeHist.setGreenChart(mapper.writeValueAsString(result)); greenChartSchemeHist.setGreenChart(mapper.writeValueAsString(result));
greenChartSchemeHist.setSchemeDetail(mapper.writeValueAsString(list)); greenChartSchemeHist.setSchemeDetail(mapper.writeValueAsString(list));
Date date = null;
if (!CollectionUtils.isEmpty(list)) {
SchemeGreenDirGreenTimeDTO dto = list.get(0);
date = dto.getDate();
}
greenChartSchemeHist.setQueryDate(date);
greenChartSchemeHistMapper.insert(greenChartSchemeHist); greenChartSchemeHistMapper.insert(greenChartSchemeHist);
} }
log.info("绿波图实体参数:{}", mapper.writeValueAsString(results)); log.info("绿波图实体参数:{}", mapper.writeValueAsString(results));
...@@ -261,27 +276,17 @@ public class HisenseGreenChartTask { ...@@ -261,27 +276,17 @@ public class HisenseGreenChartTask {
Double speed = greenBeltChartDTO.getSpeed(); Double speed = greenBeltChartDTO.getSpeed();
List<Double> distances = greenBeltChartDTO.getDistances(); List<Double> distances = greenBeltChartDTO.getDistances();
Double distance = distances.get(i); Double distance = distances.get(i);
travelTime = distance / speed; travelTime = distance / speed * 3.6;
} }
if (2 == type) { if (2 == type) {
Double speed = greenBeltChartDTO.getBackSpeed(); Double speed = greenBeltChartDTO.getBackSpeed();
List<Double> distances = greenBeltChartDTO.getBackDistances(); List<Double> distances = greenBeltChartDTO.getBackDistances();
Double distance = distances.get(i + 1); Double distance = distances.get(i + 1);
travelTime = distance / speed; travelTime = distance / speed * 3.6;
} }
return travelTime; return travelTime;
} }
@NotNull
private static Double getTravelTime(Map<String, GreenwaveRealtimePO> realTimeMap, Integer greenId, Integer indexDir,
Integer totalDistance) {
String greenKey = CommonUtils.getStrJoin(String.valueOf(greenId), String.valueOf(indexDir));
GreenwaveRealtimePO greenwaveRealtimePO = realTimeMap.get(greenKey);
// km/h速度换成m/s
Double speed = Objects.isNull(greenwaveRealtimePO.getSpeed()) ? 0 : greenwaveRealtimePO.getSpeed() / 3.6;
Double travelTime = totalDistance / speed;
return travelTime;
}
private static Map<String, List<List<Double>>> getCrossRedTimeMap(ObjectMapper mapper, HashMap<String, SchemeGreenDirGreenTimeDTO> greenDirGreenTimeMap, private static Map<String, List<List<Double>>> getCrossRedTimeMap(ObjectMapper mapper, HashMap<String, SchemeGreenDirGreenTimeDTO> greenDirGreenTimeMap,
List<GreenCrossDirDTO> value, Integer indexDir, Double travelTime, List<GreenCrossDirDTO> value, Integer indexDir, Double travelTime,
...@@ -378,8 +383,7 @@ public class HisenseGreenChartTask { ...@@ -378,8 +383,7 @@ public class HisenseGreenChartTask {
if (StringUtils.isBlank(str)) { if (StringUtils.isBlank(str)) {
continue; continue;
} }
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() { List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {});
});
// 遍历绿波路口协调方向 // 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) { if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(","); String[] greenDirArray = greenDirStr.split(",");
...@@ -410,6 +414,7 @@ public class HisenseGreenChartTask { ...@@ -410,6 +414,7 @@ public class HisenseGreenChartTask {
Integer schemeNo = ringPhaseInfoDTO.getSchemeNo(); Integer schemeNo = ringPhaseInfoDTO.getSchemeNo();
Integer cycleLen = ringPhaseInfoDTO.getCycleLen(); Integer cycleLen = ringPhaseInfoDTO.getCycleLen();
Integer offset = ringPhaseInfoDTO.getOffset(); Integer offset = ringPhaseInfoDTO.getOffset();
Date date = ringPhaseInfoDTO.getDate();
for (RingPhaseInfoDTO.DirTurn dirTurn : dirTurnInfoList) { for (RingPhaseInfoDTO.DirTurn dirTurn : dirTurnInfoList) {
Integer dir = dirTurn.getDir(); Integer dir = dirTurn.getDir();
Integer turn = dirTurn.getTurn(); Integer turn = dirTurn.getTurn();
...@@ -427,6 +432,7 @@ public class HisenseGreenChartTask { ...@@ -427,6 +432,7 @@ public class HisenseGreenChartTask {
schemeGreenDirGreenTimeDTO.setOffset(offset); schemeGreenDirGreenTimeDTO.setOffset(offset);
Integer endTime = start + greenTime + yellowTime; Integer endTime = start + greenTime + yellowTime;
schemeGreenDirGreenTimeDTO.setEnd(endTime); schemeGreenDirGreenTimeDTO.setEnd(endTime);
schemeGreenDirGreenTimeDTO.setDate(date);
schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO); schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO);
} else { // 如果是非协调方向, 相位时间作为开始时间 } else { // 如果是非协调方向, 相位时间作为开始时间
start += greenTime + yellowTime + redTime; start += greenTime + yellowTime + redTime;
......
package net.wanji.opt.task;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.GreenCrossDirDTO;
import net.wanji.opt.cache.GreenCrossDirInfoCache;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.dao.mapper.GreenChartSchemeRingPhaseMapper;
import net.wanji.opt.dto.RingPhaseInfoDTO;
import net.wanji.opt.dto.SchemeGreenDirGreenTimeDTO;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @date 2025/04/15 15:09
*/
@Component
@Slf4j
@Profile("test")
public class HisenseSchemeRingPhaseInfoTask {
@Resource
private RedisUtils redisUtils;
@Resource
private GreenChartSchemeRingPhaseMapper greenChartSchemeRingPhaseMapper;
@Scheduled(fixedRate = 1 * 60 * 1000, initialDelay = 1 * 60 * 1000)
public void getSchemeRingPhase() {
List<SchemeGreenDirGreenTimeDTO> schemeGreenDirGreenTimeDTOS = new ArrayList<>();
ObjectMapper mapper = JacksonUtils.getInstance();
try {
List<GreenCrossDirDTO> greenCrossDirCache = GreenCrossDirInfoCache.greenCrossDirCache;
if (!CollectionUtils.isEmpty(greenCrossDirCache)) {
for (GreenCrossDirDTO greenCrossDirDTO : greenCrossDirCache) {
Integer greenId = greenCrossDirDTO.getGreenId();
String greenCrossId = greenCrossDirDTO.getCrossId();
String greenDirStr = greenCrossDirDTO.getGreenDir();
// 海信环相位信息
String str = (String) redisUtils.getHash("utc-hisense-ring-phase", greenCrossId);
if (StringUtils.isBlank(str)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {});
// 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(",");
for (String s : greenDirArray) {
// 协调方向
Integer greenDir = Integer.valueOf(s);
if (!CollectionUtils.isEmpty(ringPhaseInfoDTOS)) {
Map<Integer, List<RingPhaseInfoDTO>> ringMap = ringPhaseInfoDTOS.stream().collect(Collectors.groupingBy(RingPhaseInfoDTO::getRingNo));
for (Map.Entry<Integer, List<RingPhaseInfoDTO>> entry : ringMap.entrySet()) {
Integer ringNo = entry.getKey();
if (Objects.equals(0, ringNo)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseList = entry.getValue();
List<RingPhaseInfoDTO> sort = ringPhaseList.stream().sorted(Comparator.comparingInt(RingPhaseInfoDTO::getSort)).collect(Collectors.toList());
Integer start = 0;
SchemeGreenDirGreenTimeDTO schemeGreenDirGreenTimeDTO = new SchemeGreenDirGreenTimeDTO();
for (RingPhaseInfoDTO ringPhaseInfoDTO : sort) {
List<RingPhaseInfoDTO.DirTurn> dirTurnInfoList = ringPhaseInfoDTO.getDirTurnInfoList();
if (CollectionUtils.isEmpty(dirTurnInfoList)) {
continue;
}
Integer phaseId = ringPhaseInfoDTO.getPhaseId();
Integer greenTime = ringPhaseInfoDTO.getGreenTime();
Integer yellowTime = ringPhaseInfoDTO.getYellowTime();
Integer redTime = ringPhaseInfoDTO.getRedTime();
Integer schemeNo = ringPhaseInfoDTO.getSchemeNo();
Integer cycleLen = ringPhaseInfoDTO.getCycleLen();
Integer offset = ringPhaseInfoDTO.getOffset();
Date date = ringPhaseInfoDTO.getDate();
for (RingPhaseInfoDTO.DirTurn dirTurn : dirTurnInfoList) {
Integer dir = dirTurn.getDir();
Integer turn = dirTurn.getTurn();
// 如果路口信息与绿波协调方向相同
// 如果是红灯,作为开始时间,结束时间是start + greenTime + yellowTime
if (Objects.equals(dir, greenDir) && Objects.equals(2, turn)) {
// 黄灯做绿灯处理
schemeGreenDirGreenTimeDTO.setCrossId(greenCrossId);
schemeGreenDirGreenTimeDTO.setSchemeNo(schemeNo);
schemeGreenDirGreenTimeDTO.setDir(dir);
schemeGreenDirGreenTimeDTO.setPhaseId(phaseId);
schemeGreenDirGreenTimeDTO.setStart(start);
schemeGreenDirGreenTimeDTO.setRingNo(ringNo);
schemeGreenDirGreenTimeDTO.setCycleLen(cycleLen);
schemeGreenDirGreenTimeDTO.setOffset(offset);
Integer endTime = start + greenTime + yellowTime;
schemeGreenDirGreenTimeDTO.setEnd(endTime);
schemeGreenDirGreenTimeDTO.setDate(date);
schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO);
} else { // 如果是非协调方向, 相位时间作为开始时间
start += greenTime + yellowTime + redTime;
}
}
}
}
}
}
}
}
//log.error("路口绿灯协调方向时间:{}", mapper.writeValueAsString(schemeGreenDirGreenTimeDTOS));
}
if (!CollectionUtils.isEmpty(schemeGreenDirGreenTimeDTOS)) {
for (SchemeGreenDirGreenTimeDTO schemeGreenDirGreenTimeDTO : schemeGreenDirGreenTimeDTOS) {
greenChartSchemeRingPhaseMapper.insert(schemeGreenDirGreenTimeDTO);
}
}
} catch (Exception e) {
log.error("方向环相位入库失败:{}", e);
//throw new RuntimeException(e);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.GreenChartSchemeRingPhaseMapper">
</mapper>
\ No newline at end of file
...@@ -28,4 +28,49 @@ ...@@ -28,4 +28,49 @@
</foreach> </foreach>
</if> </if>
</select> </select>
<select id="getTotalitySituation" resultType="net.wanji.opt.controllerv2.report.vo.CrossPeakAnalysis">
SELECT
cross_id,
<if test="dayType = null">
day_type,
</if>
<if test="peakType = null">
peak_type,
</if>
COALESCE(avg( day_total_flow ),0) AS day_total_flow ,
COALESCE(avg( day_max_hour_flow ),0) as day_max_hour_flow,
COALESCE(avg( peak_max_hour_flow ),0) as peak_max_hour_flow,
COALESCE(avg( peak_traffic_index ),0) as peak_traffic_index,
COALESCE(avg( peak_capacity ),0) as peak_capacity,
COALESCE(avg( peak_avg_deay_time ),0) as peak_avg_deay_time,
COALESCE(avg( peak_max_queue_length ),0) as peak_max_queue_length,
COALESCE(avg( peak_avg_stop_times ),0) as peak_avg_stop_times
FROM
t_analysis_report_cross_peak_detail
where 1 = 1
<if test="yearWeek != null">
and year_week = #{yearWeek}
</if>
<if test="dayType != null">
and day_type = #{dayType}
</if>
<if test="peakType != null">
and peak_type = #{peakType}
</if>
<if test="crossIdList != null">
and cross_id in
<foreach collection="crossIdList" item="crossId" separator="," open="(" close=")">
#{crossId}
</foreach>
</if>
GROUP BY
cross_id
<if test="dayType = null">
,day_type
</if>
<if test="peakType = null">
,peak_type
</if>
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -114,13 +114,15 @@ ...@@ -114,13 +114,15 @@
SELECT SELECT
DISTINCT DISTINCT
t4.`name` as waveName, t3.`name` as crossName, t4.`name` as waveName, t3.`name` as crossName,
t3.id as crossId, t2.daily_plan_details as dailyPlanDetails t3.id as crossId,
GROUP_CONCAT(t2.daily_plan_details SEPARATOR ', ') AS dailyPlanDetails
FROM FROM
t_base_cross_info t3 t_base_cross_info t3
LEFT JOIN t_strategy_priority_daily_info t2 on t3.id = t2.cross_id LEFT JOIN t_strategy_priority_daily_info t2 on t3.id = t2.cross_id
LEFT JOIN t_strategy_priority_config t1 on t3.id=t1.cross_id LEFT JOIN t_strategy_priority_config t1 on t3.id=t1.cross_id
LEFT JOIN t_greenwave_info t4 on t4.id = t1.green_id LEFT JOIN t_greenwave_info t4 on t4.id = t1.green_id
WHERE t3.is_signal='1' WHERE t3.is_signal='1'
GROUP BY t3.id
</select> </select>
<select id="getStrategyList" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity"> <select id="getStrategyList" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity">
SELECT SELECT
...@@ -153,10 +155,10 @@ ...@@ -153,10 +155,10 @@
<insert id="savePriorityInsert" parameterType="java.util.List"> <insert id="savePriorityInsert" parameterType="java.util.List">
INSERT INTO INSERT INTO
t_strategy_priority_config (cross_id,group_id,group_name,priority,strategy_no,type) t_strategy_priority_config (cross_id,group_id,group_name,priority,strategy_no,type,green_id)
VALUES VALUES
<foreach collection="list" item="item" separator=","> <foreach collection="list" item="item" separator=",">
(#{item.crossId},#{item.groupId},#{item.groupName},#{item.priority},#{item.strategyNo},#{item.type}) (#{item.crossId},#{item.groupId},#{item.groupName},#{item.priority},#{item.strategyNo},#{item.type},#{item.greenId})
</foreach> </foreach>
</insert> </insert>
...@@ -195,7 +197,32 @@ ...@@ -195,7 +197,32 @@
<if test="crossId!=null and crossId!=''"> <if test="crossId!=null and crossId!=''">
AND t1.cross_id=#{crossId} AND t1.cross_id=#{crossId}
</if> </if>
<if test="type!=null and type!=''">
AND t1.type=#{type}
</if>
</select>
<select id="getGreenPriorityConfigData" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity">
SELECT t2.status,
t2.method,t2.strategy_name,t2.strategy_no,
t2.mark,t2.company,t1.priority as priority,t1.id,
t1.group_id as labelCode ,t1.group_name as label,t1.cross_id as crossId
FROM
t_strategy_priority_config t1
LEFT JOIN t_strategy_factory_info t2 on t1.strategy_no=t2.strategy_no and t2.status='1'
WHERE
1=1
AND t1.strategy_no IN
<foreach item="item" collection="strategyNo" open="(" close=")" separator=",">
#{item}
</foreach>
<if test="greenId!=null and greenId!=''">
AND green_id=#{greenId}
</if>
<if test="type!=null and type!=''">
AND t1.type=#{type}
</if>
</select> </select>
<select id="getstrategyNo" resultType="java.lang.String"> <select id="getstrategyNo" resultType="java.lang.String">
SELECT SELECT
strategy_no strategy_no
...@@ -206,14 +233,31 @@ ...@@ -206,14 +233,31 @@
<if test="crossId!=null and crossId!=''"> <if test="crossId!=null and crossId!=''">
AND cross_id=#{crossId} AND cross_id=#{crossId}
</if> </if>
<if test="type!=null and type!=''">
AND type=#{type}
</if>
</select>
<select id="getGreenstrategyNo" resultType="java.lang.String">
SELECT
strategy_no
FROM
t_strategy_priority_config
WHERE
1=1
<if test="greenId!=null and greenId!=''">
AND green_id=#{greenId}
</if>
<if test="type!=null and type!=''">
AND type=#{type}
</if>
</select> </select>
<insert id="savePlanConfig" parameterType="java.util.List" > <insert id="savePlanConfig" parameterType="java.util.List" >
INSERT INTO INSERT INTO
t_strategy_priority_daily_info (daily_plan_id,week_execute,daily_plan_details,cross_id) t_strategy_priority_daily_info (daily_plan_id,week_execute,daily_plan_details,cross_id,type,green_id)
VALUES VALUES
<foreach collection="savePlanList" item="item" separator=","> <foreach collection="savePlanList" item="item" separator=",">
(#{item.dailyPlanId},#{item.weekExecute},#{item.dailyPlanDetails},#{item.crossId}) (#{item.dailyPlanId},#{item.weekExecute},#{item.dailyPlanDetails},#{item.crossId},#{item.type},#{item.greenId})
</foreach> </foreach>
</insert> </insert>
<select id="selectPlanTable" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo"> <select id="selectPlanTable" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo">
...@@ -227,11 +271,27 @@ ...@@ -227,11 +271,27 @@
and cross_id = #{crossId} and cross_id = #{crossId}
</if> </if>
</select> </select>
<select id="selectGreenPlanTable" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo">
select
id,daily_plan_id,cross_id
FROM
t_strategy_priority_daily_info
WHERE
1=1
<if test="greenId!=null and greenId!=''">
and green_id = #{greenId}
</if>
</select>
<delete id="deletePlanConfig"> <delete id="deletePlanConfig">
DELETE DELETE
FROM t_strategy_priority_daily_info FROM t_strategy_priority_daily_info
WHERE cross_id =#{crossId} WHERE cross_id =#{crossId}
</delete> </delete>
<delete id="deleteGreenPlanConfig">
DELETE
FROM t_strategy_priority_daily_info
WHERE green_id =#{greenId}
</delete>
<select id="getPlanConfigData" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo"> <select id="getPlanConfigData" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo">
SELECT SELECT
id,daily_plan_id,week_execute,daily_plan_details,cross_id id,daily_plan_id,week_execute,daily_plan_details,cross_id
...@@ -288,4 +348,21 @@ ...@@ -288,4 +348,21 @@
LEFT JOIN t_base_cross_info t3 on t1.cross_id = t3.id LEFT JOIN t_base_cross_info t3 on t1.cross_id = t3.id
LEFT JOIN t_greenwave_info t4 on t1.green_id = t4.id LEFT JOIN t_greenwave_info t4 on t1.green_id = t4.id
</select> </select>
<select id="selectGreenPriorityTable" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityConfig">
select
id,group_id,cross_id
FROM
t_strategy_priority_config
WHERE
1=1
<if test="greenId!=null and greenId!=''">
and green_id = #{greenId}
</if>
</select>
<delete id="deleteGreenPriorityConfig" parameterType="map">
DELETE
FROM t_strategy_priority_config
WHERE green_id =#{greenId}
</delete>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment