Commit c886e08d authored by zhoushiguang's avatar zhoushiguang
parents a209c4b5 56c487f0
......@@ -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.CrossRunStatePeakAnalysisResult;
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.CrossRidLaneService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
......@@ -35,6 +39,9 @@ import java.util.List;
@Api(value="CrossRunStateController", description="", tags = "路口分析报告-周报")
public class CrossRunStateController {
@Autowired
private CrossRidLaneService crossRidLaneService;
@ApiOperation(httpMethod="GET",value="2.1-交通运行总体情况", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = true, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"),
......@@ -45,10 +52,11 @@ public class CrossRunStateController {
@ApiResponses({
@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();
try {
CrossRunStateAnalysisResultResponseDTO responseDTO = crossRidLaneService.getTotalitySituation(crossIds,year,week);
jsonViewObject.success(responseDTO);
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
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 {
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({
@ApiImplicitParam(name = "dataList", value = "优先级配置数据", required = false, dataType = "String"),
})
......@@ -127,15 +127,18 @@ public class StrategyPriorityController {
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({
@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")
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();
try {
List<StrategyFactoryEntity>list=strategyPriorityService.getPriorityData(crossId);
List<StrategyFactoryEntity>list=strategyPriorityService.getPriorityData(crossId,greenId,type);
jsonView.success(list);
} catch (Exception e) {
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;
import net.wanji.opt.controllerv2.report.vo.CrossPeakAnalysis;
import net.wanji.opt.entity.report.CrossRidLaneDTO;
import org.apache.ibatis.annotations.Param;
......@@ -7,4 +8,6 @@ import java.util.List;
public interface CrossRidLaneMapper {
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
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);
......@@ -92,5 +92,17 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily
List<StrategyParameterConfig> getParamConfigData(String crossId);
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;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
......@@ -49,6 +51,9 @@ public class RingPhaseInfoDTO {
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;
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 java.util.Date;
/**
* @author duanruiming
* @date 2025/04/01 15:38
*/
@Data
@TableName("t_green_chart_scheme_ring_phase_hist")
public class SchemeGreenDirGreenTimeDTO {
@TableField(value = "cross_id")
private String crossId;
@TableField(value = "scheme_no")
private Integer schemeNo;
private Integer offset;
@TableField(value = "cycle_len")
private Integer cycleLen;
@TableField(value = "ring_no")
private Integer ringNo;
@TableField(value = "phase_id")
private Integer phaseId;
private Integer start;
private Integer end;
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 {
@TableField("scheme_detail")
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")
@TableField("create_time")
private Date createTime;
......
......@@ -61,6 +61,11 @@ public class StrategyPriorityDailyInfo implements Serializable {
*/
@TableField(exist = false)
private Integer greenId;
/**
* 类型 1:路口 2干线
*/
@TableField(exist = false)
private Integer type;
......
......@@ -40,4 +40,11 @@ public class StrategyPriorityGroup {
private StrategySchedulingParam schedulingParamters;
//1:路口,2干线
private Integer type;
//干线 ID
private Integer greenId;
//干线 IDs
private List<Integer> greenIds;
}
......@@ -117,7 +117,7 @@ public class EvaluationInfoServiceImpl extends ServiceImpl<CrossDataHistMapper,
private static double calculatePercentage(double analyseValue, double contrastValue) {
// 防止除零错误
if (contrastValue == 0) {
return 0;
return (int)analyseValue*100;
}
// 计算变化值(分析值 - 对比值)
......
......@@ -48,6 +48,7 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
......@@ -87,8 +88,8 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
@Resource
private GreenChartSchemeHistMapper greenChartSchemeHistMapper;
private static List<OptMonitoringVO> greenListCache = new ArrayList<>(10);
private static List<OptMonitoringVO> crossListCache = new ArrayList<>(80);
private static List<OptMonitoringVO> greenListCache = new CopyOnWriteArrayList<>();
private static List<OptMonitoringVO> crossListCache = new CopyOnWriteArrayList<>();
@Override
......@@ -243,8 +244,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
}
}
});
greenListCache.clear();
greenListCache.addAll(optMonitoringVOS);
if (!CollectionUtils.isEmpty(greenListCache)) {
greenListCache.clear();
greenListCache.addAll(optMonitoringVOS);
}
return optMonitoringVOS;
}
......@@ -287,8 +290,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
}
}
});
crossListCache.clear();
crossListCache.addAll(optMonitoringVOS);
if (!CollectionUtils.isEmpty(crossListCache)) {
crossListCache.clear();
crossListCache.addAll(optMonitoringVOS);
}
return optMonitoringVOS;
}
......
package net.wanji.opt.servicev2.report;
import com.alibaba.fastjson.JSONObject;
import net.wanji.opt.controllerv2.report.vo.CrossRunStateAnalysisResultResponseDTO;
import net.wanji.opt.vo2.report.CrossRidLaneResult;
import java.util.List;
public interface CrossRidLaneService {
List<CrossRidLaneResult> getCrossInfoList(String crossIds);
CrossRunStateAnalysisResultResponseDTO getTotalitySituation(String crossIds, Integer year, Integer week);
}
......@@ -34,7 +34,7 @@ public interface StrategyPriorityService extends IService<StrategyPriorityDailyI
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;
......
......@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
*/
@Component
@Slf4j
@Profile("docker")
@Profile("test")
public class HisenseGreenChartTask {
@Resource
......@@ -97,7 +97,12 @@ public class HisenseGreenChartTask {
Integer sort = indexDTO.getSort();
Integer indexDir = indexDTO.getInDir();
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> distances = new ArrayList<>();
// 正向红灯时间
......@@ -110,15 +115,19 @@ public class HisenseGreenChartTask {
List<GreenCrossDirDTO> backValue = value.stream().sorted(Comparator.comparingInt(GreenCrossDirDTO::getSort).reversed()).collect(Collectors.toList());
List<Double> backOffsets = 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>>> backCrossGreenTimesMap = new LinkedHashMap<>();
getCrossRedTimeMap(mapper, greenDirGreenTimeMap, backValue, indexOutDir, backTravelTime, backOffsets, backDistances, backCrossRedTimesMap, backCrossGreenTimesMap);
greenBeltChartDTO.setGreenId(greenId);
greenBeltChartDTO.setDir(indexDir);
greenBeltChartDTO.setBackDir(indexOutDir);
greenBeltChartDTO.setSpeed(totalDistance / travelTime);
greenBeltChartDTO.setBackSpeed(totalDistance / backTravelTime);
greenBeltChartDTO.setSpeed(speed);
greenBeltChartDTO.setBackSpeed(backSpeed);
greenBeltChartDTO.setOffsets(offsets);
greenBeltChartDTO.setBackOffsets(backOffsets);
greenBeltChartDTO.setDistances(distances);
......@@ -140,7 +149,7 @@ public class HisenseGreenChartTask {
// 正向 1
getGreenwaveStartGroup(greenBeltChartDTOS, greenwaveStartGroup, greenId, value, 1);
// 反向 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);
greenBeltChartDTOS.forEach(item -> {
if (Objects.equals(greenId, item.getGreenId())) {
......@@ -157,6 +166,12 @@ public class HisenseGreenChartTask {
greenChartSchemeHist.setGreenId(greenId);
greenChartSchemeHist.setGreenChart(mapper.writeValueAsString(result));
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);
}
log.info("绿波图实体参数:{}", mapper.writeValueAsString(results));
......@@ -261,27 +276,17 @@ public class HisenseGreenChartTask {
Double speed = greenBeltChartDTO.getSpeed();
List<Double> distances = greenBeltChartDTO.getDistances();
Double distance = distances.get(i);
travelTime = distance / speed;
travelTime = distance / speed * 3.6;
}
if (2 == type) {
Double speed = greenBeltChartDTO.getBackSpeed();
List<Double> distances = greenBeltChartDTO.getBackDistances();
Double distance = distances.get(i + 1);
travelTime = distance / speed;
travelTime = distance / speed * 3.6;
}
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,
List<GreenCrossDirDTO> value, Integer indexDir, Double travelTime,
......@@ -378,8 +383,7 @@ public class HisenseGreenChartTask {
if (StringUtils.isBlank(str)) {
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)) {
String[] greenDirArray = greenDirStr.split(",");
......@@ -410,6 +414,7 @@ public class HisenseGreenChartTask {
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();
......@@ -427,6 +432,7 @@ public class HisenseGreenChartTask {
schemeGreenDirGreenTimeDTO.setOffset(offset);
Integer endTime = start + greenTime + yellowTime;
schemeGreenDirGreenTimeDTO.setEnd(endTime);
schemeGreenDirGreenTimeDTO.setDate(date);
schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO);
} else { // 如果是非协调方向, 相位时间作为开始时间
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 @@
</foreach>
</if>
</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>
\ No newline at end of file
......@@ -114,13 +114,15 @@
SELECT
DISTINCT
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
t_base_cross_info t3
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_greenwave_info t4 on t4.id = t1.green_id
WHERE t3.is_signal='1'
GROUP BY t3.id
</select>
<select id="getStrategyList" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity">
SELECT
......@@ -153,10 +155,10 @@
<insert id="savePriorityInsert" parameterType="java.util.List">
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
<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>
</insert>
......@@ -195,7 +197,32 @@
<if test="crossId!=null and crossId!=''">
AND t1.cross_id=#{crossId}
</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 id="getstrategyNo" resultType="java.lang.String">
SELECT
strategy_no
......@@ -206,14 +233,31 @@
<if test="crossId!=null and crossId!=''">
AND cross_id=#{crossId}
</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>
<insert id="savePlanConfig" parameterType="java.util.List" >
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
<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>
</insert>
<select id="selectPlanTable" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo">
......@@ -227,11 +271,27 @@
and cross_id = #{crossId}
</if>
</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
FROM t_strategy_priority_daily_info
WHERE cross_id =#{crossId}
</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,daily_plan_id,week_execute,daily_plan_details,cross_id
......@@ -288,4 +348,21 @@
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
</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>
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