Commit ab51b615 authored by duanruiming's avatar duanruiming

Merge remote-tracking branch 'origin/jinan-signal-opt-v1-20250304' into...

Merge remote-tracking branch 'origin/jinan-signal-opt-v1-20250304' into jinan-signal-opt-v1-20250304
parents f1dd07e5 efbe7832
...@@ -12,6 +12,7 @@ import net.wanji.web.dto.*; ...@@ -12,6 +12,7 @@ import net.wanji.web.dto.*;
import net.wanji.web.po.RingPhasePO; import net.wanji.web.po.RingPhasePO;
import net.wanji.web.service.impl.PlanSendServiceImpl; import net.wanji.web.service.impl.PlanSendServiceImpl;
import net.wanji.web.vo.PhaseListByTimeVO; import net.wanji.web.vo.PhaseListByTimeVO;
import net.wanji.web.vo.PhaseListVO;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -134,6 +135,21 @@ public class PlanSendController { ...@@ -134,6 +135,21 @@ public class PlanSendController {
} }
@AspectLog(description = "根据当前时间返回相位列表(单环)-新增黃闪模式", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "根据当前时间返回相位列表(单环)-新增黃闪模式", notes = "根据当前时间返回相位列表(单环)-新增黃闪模式")
@PostMapping("/phaseListByTimeSingleRingControlMode")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SaveSchemeConfigDTO.PhaseListElement.class),
})
public JsonViewObject phaseListByTimeSingleRingControlMode(@RequestBody CrossIdAndTimeDTO crossIdAndTimeDTO) {
PhaseListVO phaseListVO
= planSendService.phaseListByTimeSingleRingControlMode(crossIdAndTimeDTO);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(phaseListVO);
}
@AspectLog(description = "根据当前时间返回相位列表-方案优化对比", operationType = BaseEnum.OperationTypeEnum.UPDATE) @AspectLog(description = "根据当前时间返回相位列表-方案优化对比", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "根据当前时间返回相位列表-方案优化对比)", notes = "根据当前时间返回相位列表-方案优化对比") @ApiOperation(value = "根据当前时间返回相位列表-方案优化对比)", notes = "根据当前时间返回相位列表-方案优化对比")
@PostMapping("/phaseListByTimeSingleRingNew") @PostMapping("/phaseListByTimeSingleRingNew")
...@@ -147,6 +163,19 @@ public class PlanSendController { ...@@ -147,6 +163,19 @@ public class PlanSendController {
return jsonViewObject.success(ringPhasePO); return jsonViewObject.success(ringPhasePO);
} }
@AspectLog(description = "根据当前时间返回相位列表-方案优化对比-新增黃闪模式", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "根据当前时间返回相位列表-方案优化对比-新增黃闪模式)", notes = "根据当前时间返回相位列表-方案优化对比-新增黃闪模式")
@PostMapping("/phaseListByTimeSingleRingNewControlMode")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SaveSchemeConfigDTO.PhaseListElement.class),
})
public JsonViewObject phaseListByTimeSingleRingNewControlMode(@RequestBody CrossIdAndTimeDTO crossIdAndTimeDTO) {
RingPhasePO ringPhasePO = planSendService.phaseListByTimeSingleRingNew(crossIdAndTimeDTO);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(ringPhasePO);
}
@AspectLog(description = "根据路口号和时间(据当前时间半小时)返回相位列表-方案优化对比", operationType = BaseEnum.OperationTypeEnum.UPDATE) @AspectLog(description = "根据路口号和时间(据当前时间半小时)返回相位列表-方案优化对比", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "根据路口号和时间(据当前时间半小时)返回相位列表-方案优化对比)", notes = "根据路口号和时间(据当前时间半小时)返回相位列表-方案优化对比") @ApiOperation(value = "根据路口号和时间(据当前时间半小时)返回相位列表-方案优化对比)", notes = "根据路口号和时间(据当前时间半小时)返回相位列表-方案优化对比")
@PostMapping("/phaseListByTimeRingNew") @PostMapping("/phaseListByTimeRingNew")
......
package net.wanji.web.po; package net.wanji.web.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import net.wanji.web.dto.SaveSchemeConfigDTO; import net.wanji.web.dto.SaveSchemeConfigDTO;
...@@ -13,9 +14,16 @@ import java.util.List; ...@@ -13,9 +14,16 @@ import java.util.List;
*/ */
@Data @Data
public class RingPhasePO { public class RingPhasePO {
//优化前的方案列表 @ApiModelProperty(value = "路口编号")
private String crossId;
@ApiModelProperty(value = "控制模式:1定周期;2绿波协调;3黄闪;4全红;5关灯;6单点自适应;7全感应;8半感应;9行人过街")
private Integer controlMode;
@ApiModelProperty(value = "优化前的方案列表")
private List<SaveSchemeConfigDTO.PhaseListElement> oriPhaseList; private List<SaveSchemeConfigDTO.PhaseListElement> oriPhaseList;
//优化后的方案列表
@ApiModelProperty(value = "优化后的方案列表")
private List<SaveSchemeConfigDTO.PhaseListElement> optPhaseList; private List<SaveSchemeConfigDTO.PhaseListElement> optPhaseList;
} }
...@@ -5,6 +5,7 @@ import net.wanji.databus.bo.CrossIdBO; ...@@ -5,6 +5,7 @@ import net.wanji.databus.bo.CrossIdBO;
import net.wanji.web.dto.*; import net.wanji.web.dto.*;
import net.wanji.web.po.RingPhasePO; import net.wanji.web.po.RingPhasePO;
import net.wanji.web.vo.PhaseListByTimeVO; import net.wanji.web.vo.PhaseListByTimeVO;
import net.wanji.web.vo.PhaseListVO;
import java.util.List; import java.util.List;
...@@ -35,6 +36,7 @@ public interface PlanSendService { ...@@ -35,6 +36,7 @@ public interface PlanSendService {
RingPhasePO phaseListByTimeSingleRingNew(CrossIdAndTimeDTO crossIdAndTimeDTO); RingPhasePO phaseListByTimeSingleRingNew(CrossIdAndTimeDTO crossIdAndTimeDTO);
RingPhasePO phaseListByTimeRingNew(CrossIdAndTimeDTO crossIdAndTimeDTO); RingPhasePO phaseListByTimeRingNew(CrossIdAndTimeDTO crossIdAndTimeDTO);
List<SaveSchemeConfigDTO.PhaseListElement> phaseListByTimeSingleRing(CrossIdAndTimeDTO crossIdAndTimeDTO); List<SaveSchemeConfigDTO.PhaseListElement> phaseListByTimeSingleRing(CrossIdAndTimeDTO crossIdAndTimeDTO);
PhaseListVO phaseListByTimeSingleRingControlMode(CrossIdAndTimeDTO crossIdAndTimeDTO);
/** /**
* 下发数据到utc数据库 * 下发数据到utc数据库
......
...@@ -27,6 +27,7 @@ import net.wanji.web.service.PlanSendService; ...@@ -27,6 +27,7 @@ import net.wanji.web.service.PlanSendService;
import net.wanji.web.service.scheme.impl.RunningPlanServiceImpl; import net.wanji.web.service.scheme.impl.RunningPlanServiceImpl;
import net.wanji.web.service.scheme.impl.SchemeConfigServiceImpl; import net.wanji.web.service.scheme.impl.SchemeConfigServiceImpl;
import net.wanji.web.vo.PhaseListByTimeVO; import net.wanji.web.vo.PhaseListByTimeVO;
import net.wanji.web.vo.PhaseListVO;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
...@@ -479,6 +480,8 @@ public class PlanSendServiceImpl implements PlanSendService { ...@@ -479,6 +480,8 @@ public class PlanSendServiceImpl implements PlanSendService {
} }
} }
} }
//解决车道重复问题
crossLaneLightsPOS = distinctLaneLights(crossLaneLightsPOS,crossLightsPOS);
baseCrossLaneLightsMapper.deleteByCrossId(crossId); baseCrossLaneLightsMapper.deleteByCrossId(crossId);
baseCrossLaneLightsMapper.insertBatch(crossLaneLightsPOS); baseCrossLaneLightsMapper.insertBatch(crossLaneLightsPOS);
...@@ -517,6 +520,75 @@ public class PlanSendServiceImpl implements PlanSendService { ...@@ -517,6 +520,75 @@ public class PlanSendServiceImpl implements PlanSendService {
return jsonViewObject.success(); return jsonViewObject.success();
} }
/**
* @Description 解决车道重复问题
* @Param [crossLaneLightsPOS, crossLightsPOS]
* @return java.util.List<net.wanji.databus.po.CrossLaneLightsPO>
**/
private List<CrossLaneLightsPO> distinctLaneLights(List<CrossLaneLightsPO> crossLaneLightsPOS,List<BaseCrossLightsPO> crossLightsPOS){
if (CollectionUtil.isEmpty(crossLightsPOS) || CollectionUtil.isEmpty(crossLaneLightsPOS)){
return crossLaneLightsPOS;
}
//存储灯组id和类型
Map<Integer, Integer> lightMap = new HashMap<>();
for (BaseCrossLightsPO crossLightsPO : crossLightsPOS) {
lightMap.put(crossLightsPO.getId(),crossLightsPO.getType());
}
List<CrossLaneLightsPO> resultList = new ArrayList<>();
//根据车道id分组
Map<String, List<CrossLaneLightsPO>> laneMap = crossLaneLightsPOS.stream().collect(Collectors.groupingBy(CrossLaneLightsPO::getLaneId));
Set<String> lineIds = laneMap.keySet();
for (String lineId : lineIds) {
List<CrossLaneLightsPO> laneList = laneMap.get(lineId);
//判断是否重复
if (laneList.size() > 1){
CrossLaneLightsPO result = null;
CrossLaneLightsPO type2Candidate = null;
CrossLaneLightsPO type5Candidate = null;
CrossLaneLightsPO minTypeCandidate = null;
for (CrossLaneLightsPO po : laneList) {
//灯组类型:机动车(1圆饼灯;2左转灯;3直行灯;4右转灯;5掉头灯;)
//优先级原则,左转灯优先级最高,掉头其次,其它的保留type值小的,比如:圆饼直行保留圆饼
int type = lightMap.get(po.getLightsId());
if (type == 2) {
if (type2Candidate == null) {
type2Candidate = po;
}
} else if (type == 5) {
// 仅当type2不存在时,才考虑type5
if (type2Candidate == null && type5Candidate == null) {
type5Candidate = po;
}
} else {
// 仅当type2和type5都不存在时,才比较最小type
if (type2Candidate == null && type5Candidate == null) {
if (minTypeCandidate == null || type < lightMap.get(minTypeCandidate.getLightsId())) {
minTypeCandidate = po;
}
}
}
}
// 确定最终结果
if (type2Candidate != null) {
result = type2Candidate;
} else if (type5Candidate != null) {
result = type5Candidate;
} else {
result = minTypeCandidate;
}
resultList.add(result);
}else {
resultList.addAll(laneList);
}
}
resultList = resultList.stream().sorted(Comparator.comparing(CrossLaneLightsPO::getLaneId)).collect(Collectors.toList());
return resultList;
}
public void syncSchedules(String crossId, SchemePhaseLightsVO schemePhaseLightsVO) throws Exception { public void syncSchedules(String crossId, SchemePhaseLightsVO schemePhaseLightsVO) throws Exception {
ObjectMapper mapper = JacksonUtils.getInstance(); ObjectMapper mapper = JacksonUtils.getInstance();
// 计划信息 // 计划信息
...@@ -704,6 +776,7 @@ public class PlanSendServiceImpl implements PlanSendService { ...@@ -704,6 +776,7 @@ public class PlanSendServiceImpl implements PlanSendService {
@Override @Override
public RingPhasePO phaseListByTimeSingleRingNew(CrossIdAndTimeDTO crossIdAndTimeDTO) { public RingPhasePO phaseListByTimeSingleRingNew(CrossIdAndTimeDTO crossIdAndTimeDTO) {
RingPhasePO ringPhasePO = new RingPhasePO(); RingPhasePO ringPhasePO = new RingPhasePO();
ringPhasePO.setCrossId(crossIdAndTimeDTO.getCrossId());
List<SaveSchemeConfigDTO.PhaseListElement> oriPhaseList = new ArrayList<>(); List<SaveSchemeConfigDTO.PhaseListElement> oriPhaseList = new ArrayList<>();
List<SaveSchemeConfigDTO.PhaseListElement> optPhaseList = new ArrayList<>(); List<SaveSchemeConfigDTO.PhaseListElement> optPhaseList = new ArrayList<>();
QueryByCrossIdAndTimeDTO queryByCrossIdAndTimeDTO = new QueryByCrossIdAndTimeDTO(); QueryByCrossIdAndTimeDTO queryByCrossIdAndTimeDTO = new QueryByCrossIdAndTimeDTO();
...@@ -722,6 +795,7 @@ public class PlanSendServiceImpl implements PlanSendService { ...@@ -722,6 +795,7 @@ public class PlanSendServiceImpl implements PlanSendService {
int schemeId = Integer.valueOf(content.getSchemeNo()); int schemeId = Integer.valueOf(content.getSchemeNo());
//黃闪 //黃闪
if (schemeId == 85){ if (schemeId == 85){
ringPhasePO.setControlMode(3);
return ringPhasePO; return ringPhasePO;
} }
/*CrossIdBO crossIdBO = new CrossIdBO(); /*CrossIdBO crossIdBO = new CrossIdBO();
...@@ -791,6 +865,7 @@ public class PlanSendServiceImpl implements PlanSendService { ...@@ -791,6 +865,7 @@ public class PlanSendServiceImpl implements PlanSendService {
} }
} }
} }
ringPhasePO.setControlMode(1);
ringPhasePO.setOriPhaseList(oriPhaseList); ringPhasePO.setOriPhaseList(oriPhaseList);
ringPhasePO.setOptPhaseList(optPhaseList); ringPhasePO.setOptPhaseList(optPhaseList);
return ringPhasePO; return ringPhasePO;
...@@ -942,6 +1017,35 @@ public class PlanSendServiceImpl implements PlanSendService { ...@@ -942,6 +1017,35 @@ public class PlanSendServiceImpl implements PlanSendService {
return phaseListByTime; return phaseListByTime;
} }
@Override
public PhaseListVO phaseListByTimeSingleRingControlMode(CrossIdAndTimeDTO crossIdAndTimeDTO) {
PhaseListVO phaseListVO = new PhaseListVO();
phaseListVO.setCrossId(crossIdAndTimeDTO.getCrossId());
List<SaveSchemeConfigDTO.PhaseListElement> phaseListByTime = new ArrayList<>();
PhaseListByTimeVO phaseListByTimeVO = phaseListByTime(crossIdAndTimeDTO);
SaveSchemeConfigDTO.PhaseScheme phaseScheme = phaseListByTimeVO.getPhaseScheme();
if (phaseScheme != null) {
String schemeNo = phaseScheme.getSchemeNo();
if (Objects.equals(schemeNo, "85")){
phaseListVO.setControlMode(3);
return phaseListVO;
}else {
phaseListVO.setControlMode(1);
}
List<SaveSchemeConfigDTO.RingListElement> ringList = phaseScheme.getRingList();
SaveSchemeConfigDTO.RingListElement ringListElement = ringList.get(0);
List<SaveSchemeConfigDTO.GroupListElement> groupList = ringListElement.getGroupList();
for (SaveSchemeConfigDTO.GroupListElement groupListElement : groupList) {
List<SaveSchemeConfigDTO.PhaseListElement> phaseList = groupListElement.getPhaseList();
phaseListByTime.addAll(phaseList);
}
}
phaseListVO.setPhaseListByTime(phaseListByTime);
return phaseListVO;
}
private PhaseListByTimeVO getPhaseListByTimeVO(String planName, Date datetime, RunningPlanDTO runningPlanDTO, private PhaseListByTimeVO getPhaseListByTimeVO(String planName, Date datetime, RunningPlanDTO runningPlanDTO,
CrossIdBO crossIdBO) { CrossIdBO crossIdBO) {
PhaseListByTimeVO phaseListByTimeVO = new PhaseListByTimeVO(); PhaseListByTimeVO phaseListByTimeVO = new PhaseListByTimeVO();
......
package net.wanji.web.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import net.wanji.web.dto.SaveSchemeConfigDTO;
import java.util.List;
@NoArgsConstructor
@Data
@ApiModel(value = "PhaseListVO", description = "根据当前时间返回相位列表(单环)-新增黃闪模式")
public class PhaseListVO {
@ApiModelProperty(value = "路口编号")
private String crossId;
@ApiModelProperty(value = "控制模式:1定周期;2绿波协调;3黄闪;4全红;5关灯;6单点自适应;7全感应;8半感应;9行人过街")
private Integer controlMode;
@ApiModelProperty(value = "相位等信息")
private List<SaveSchemeConfigDTO.PhaseListElement> phaseListByTime;
}
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