Commit 91d68503 authored by zhouleilei's avatar zhouleilei

1、新增 - 根据路口号和方案号查询环转阶段

2、同步代码
parent 984f84c3
......@@ -163,4 +163,12 @@ public interface FeignCommon {
@PostMapping("/signalStatus/lightStatusOneHist")
JsonViewObject selectLightStatusHist(@RequestBody CrossIdDateTimeDTO crossIdDateTimeDTO);
/**
* 根据路口号和方案号查询环转阶段
* @param crossIdDateTimeDTO
* @return
*/
@PostMapping("/staticInfo/selectCrossSchemeRingsToStages")
JsonViewObject selectCrossSchemeRingsToStages(@RequestBody CrossSchemeRingsDTO crossSchemeRingsDTO);
}
......@@ -12,6 +12,7 @@ import net.wanji.databus.dao.entity.CrossSchedulesPO;
import net.wanji.databus.dto.*;
import net.wanji.databus.po.CoordinationStatus;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.vo.CrossSchemeRingsToStagesPO;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import net.wanji.databus.po.CrossSchemeRings;
......@@ -149,4 +150,22 @@ public class StaticInfoController {
public JsonViewObject selectSchemeByParams(@RequestBody @Validated QueryByCrossIdAndTimeDTO queryByCrossIdAndTimeDTO) throws Exception {
return JsonViewObject.newInstance().success(staticInfoService.selectSchemeByParams(queryByCrossIdAndTimeDTO));
}
@AspectLog(description = "根据路口号和方案号查询环转阶段", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/selectCrossSchemeRingsToStages")
@ApiOperation(value = "根据路口号和方案号查询环转阶段", notes = "根据路口号和方案号查询环转阶段", response = CrossSchemeRings.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossSchemeRings.class)
})
public JsonViewObject selectCrossSchemeRingsToStages(@RequestBody @Validated CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception {
if (ObjectUtils.isEmpty(crossSchemeRingsDTO.getPattern())) {
return JsonViewObject.newInstance().fail("方案号不能为空");
}
CrossSchemeRingsToStagesPO crossSchemeRingsToStagesPO = staticInfoService.selectCrossSchemeRingsToStages(crossSchemeRingsDTO);
if (ObjectUtils.isEmpty(crossSchemeRingsToStagesPO)) {
return JsonViewObject.newInstance().fail("获取海信方案环图失败");
}
return JsonViewObject.newInstance().success(crossSchemeRingsToStagesPO);
}
}
......@@ -4,11 +4,12 @@ import net.wanji.databus.dao.entity.BaseCrossSchemePO;
import net.wanji.databus.dao.entity.CrossSchedulesPO;
import net.wanji.databus.dao.entity.CrossSchemeStageOptLogPO;
import net.wanji.databus.dto.*;
import net.wanji.databus.po.CoordinationStatus;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.CrossSchemeRings;
import net.wanji.databus.vo.CrossSchemeRingsToStagesPO;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import net.wanji.databus.po.CoordinationStatus;
import net.wanji.databus.po.CrossSchemeRings;
import java.util.List;
@SuppressWarnings("all")
......@@ -47,4 +48,11 @@ public interface StaticInfoService {
**/
BaseCrossSchemePO selectSchemeByParams(QueryByCrossIdAndTimeDTO queryByCrossIdAndTimeDTO) throws Exception;
/**
* @Description : 根据路口号和方案号查询环转阶段
* @Param crossId 路口编号
* @Param pattern 方案号
**/
CrossSchemeRingsToStagesPO selectCrossSchemeRingsToStages(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception;
}
......@@ -755,7 +755,7 @@ public class ControlCommandServiceImpl implements ControlCommandService {
* @Description 默认的相位时间
* @Param []
**/
private String getDefaultPhaseTime() {
public String getDefaultPhaseTime() {
StringBuilder str = new StringBuilder();
for (int i = 0; i < 16; i++) {
str.append("0").append(" ");
......
......@@ -17,6 +17,7 @@ import net.wanji.databus.dao.mapper.CrossSchemeStageOptLogMapper;
import net.wanji.databus.dao.mapper.ManufacturerInfoMapper;
import net.wanji.databus.dto.*;
import net.wanji.databus.po.*;
import net.wanji.databus.vo.CrossSchemeRingsToStagesPO;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import net.wanji.utc.hisense.cache.CrossInfoCache;
......@@ -78,6 +79,8 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Resource
private BaseCrossSchemeMapper baseCrossSchemeMapper;
public static Map<String, Integer> planMap = new HashMap<>();
@Resource
private StaticInfoServiceImpl staticInfoServiceImpl;
@Override
public List<CrossInfoPO> crossBasicInfo(CrossInfoDTO crossInfoDTO) throws Exception {
......@@ -1085,4 +1088,99 @@ public class StaticInfoServiceImpl implements StaticInfoService {
}
return baseCrossSchemePO;
}
@Override
public CrossSchemeRingsToStagesPO selectCrossSchemeRingsToStages(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception {
CrossSchemeRingsToStagesPO crossSchemeRingsToStagesPO = new CrossSchemeRingsToStagesPO();
String crossId = crossSchemeRingsDTO.getCrossId();
int pattern = Integer.valueOf(crossSchemeRingsDTO.getPattern());
crossSchemeRingsToStagesPO.setCrossId(crossId);
crossSchemeRingsToStagesPO.setSchemeId(String.valueOf(pattern));
//海信方案号
String schemeId = String.valueOf(pattern*3 - 2);
crossSchemeRingsDTO.setPattern(schemeId);
//查询方案环图请求
CrossSchemeRings crossSchemeRings = crossSchemeRingsHisen(crossSchemeRingsDTO);
if (ObjectUtil.isEmpty(crossSchemeRings)) {
return null;
}
String cycleLen = crossSchemeRings.getCycleLen();
String ringCount = crossSchemeRings.getRingCount();
crossSchemeRingsToStagesPO.setRingCount(ringCount);
crossSchemeRingsToStagesPO.setCycleLen(cycleLen);
crossSchemeRingsToStagesPO.setOffset(crossSchemeRings.getOffset());
List<CrossSchemeRings.Phase> phaseList = crossSchemeRings.getPhaseList();
CrossSchemeRings.Phase phase = phaseList.get(0);
String redTime = phase.getRedTime();
String greenTime = phase.getGreenTime();
String yellowTime = phase.getYellowTime();
crossSchemeRingsToStagesPO.setSplit(getPhaseTime(redTime,greenTime,yellowTime));
JSONObject cycleJSONObject = crossSchemeRings.getCycleList();
List<StagePhaseDTO> stagePhaseDTOList = null;
try {
//封装环和环上相位数据
Map<Integer, List<RingPhaseDTO>> ringPhasesMap = staticInfoServiceImpl.getRingPhasesMap(Integer.valueOf(ringCount), cycleJSONObject, phase);
//环封装阶段
stagePhaseDTOList = staticInfoServiceImpl.stagePhaseList(Integer.valueOf(cycleLen), Integer.valueOf(ringCount), ringPhasesMap);
} catch (Exception e) {
return null;
}
List<CrossSchemeRingsToStagesPO.Phase> phasePOlist = new ArrayList<>();
if (ObjectUtil.isNotEmpty(stagePhaseDTOList)) {
for (StagePhaseDTO stagePhaseDTO : stagePhaseDTOList) {
CrossSchemeRingsToStagesPO.Phase phasePO = new CrossSchemeRingsToStagesPO.Phase();
phasePO.setPhaseNo(String.valueOf(stagePhaseDTO.getStageId()));
phasePO.setPhaseTime(stagePhaseDTO.getStageTime());
CrossSchemeStageOptLogPO crossSchemeStageOptLogPO = new CrossSchemeStageOptLogPO();
crossSchemeStageOptLogPO.setCrossId(crossId);
crossSchemeStageOptLogPO.setPhaseNo(stagePhaseDTO.getStageId() + "");
crossSchemeStageOptLogPO.setPhaseTime(stagePhaseDTO.getStageTime());
List<RingPhaseDTO> ringPhaseList = stagePhaseDTO.getRingPhaseList();
List<Integer> list = new ArrayList<>();
for (RingPhaseDTO ringPhaseDTO : ringPhaseList) {
if (ObjectUtil.isNotEmpty(ringPhaseDTO)) {
list.add(ringPhaseDTO.getPhaseId());
}
}
if (ObjectUtil.isNotEmpty(list)) {
String phases = CollectionUtil.join(list, ",");
crossSchemeStageOptLogPO.setPhaseList(phases);
phasePO.setPhaseList(phases);
}
phasePOlist.add(phasePO);
}
}
crossSchemeRingsToStagesPO.setPhaseList(phasePOlist);
return crossSchemeRingsToStagesPO;
}
/**
* @Description 通过红灯、绿灯、黄灯时间,计算相位时间
* @Param [redTime, greenTime, yellowTime]
* @return java.lang.String
**/
public String getPhaseTime(String redTime,String greenTime,String yellowTime){
// 将字符串拆分为数组,处理可能的首尾空格
String[] redArray = redTime.trim().split("\\s+");
String[] greenArray = greenTime.trim().split("\\s+");
String[] yellowArray = yellowTime.trim().split("\\s+");
StringBuilder result = new StringBuilder();
for (int i = 0; i < 16; i++) {
// 将对应位置的数值求和
int sum = Integer.parseInt(redArray[i])
+ Integer.parseInt(greenArray[i])
+ Integer.parseInt(yellowArray[i]);
// 拼接结果,用空格分隔
if (i > 0) {
result.append(" ");
}
result.append(sum);
}
return result.toString();
}
}
......@@ -14,6 +14,7 @@ import java.util.List;
* @date 2023/06/20 15:07
*/
public class CommonUtils {
/**
* 将数组转化为16进制字符串
*
......
......@@ -14,6 +14,7 @@ import net.wanji.databus.dto.StepingPhaseDTO;
import net.wanji.databus.po.SaveToUtcPO;
import net.wanji.databus.vo.*;
import net.wanji.utc.service.control.ControlCommandStrategyService;
import net.wanji.utc.vo.SchemePhaseGreenTimeOptVO;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -259,4 +260,17 @@ public class ControlCommandController {
return controlCommandStrategyService.stepControlStrategy(stepingPhaseDTO.getCrossId(),stepingPhaseDTO.getCommand(),stepingPhaseDTO.getStepCount());
}
@AspectLog(description = "方案相位绿灯时间优化下发", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "方案相位绿灯时间优化下发", notes = "方案相位绿灯时间优化下发")
@PostMapping("/schemePhaseGreenTimeOpt")
public JsonViewObject schemePhaseGreenTimeOpt(@RequestBody @Validated SchemePhaseGreenTimeOptVO vo) throws Exception {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
jsonViewObject = controlCommandStrategyService.schemePhaseGreenTimeOpt(vo);
} catch (Exception e) {
return JsonViewObject.newInstance().fail("方案相位绿灯时间优化下发失败");
}
return jsonViewObject;
}
}
......@@ -195,6 +195,14 @@ public class StaticInfoController {
public JsonViewObject selectSchemeOptLogByParams(@Validated @RequestBody CrossSchemeQueryDTO crossSchemeQueryDTO) throws Exception {
return staticInfoService.selectSchemeOptLogByParams(crossSchemeQueryDTO);
}
@AspectLog(description = "根据路口号和方案号查询环转阶段", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/selectCrossSchemeRingsToStages", produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "根据路口号和方案号查询环转阶段", notes = "根据路口号和方案号查询环转阶段")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossSchedulesPO.class)
})
public JsonViewObject selectCrossSchemeRingsToStages(@Validated @RequestBody CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception {
return staticInfoService.selectCrossSchemeRingsToStages(crossSchemeRingsDTO);
}
}
package net.wanji.utc.dto.ring;
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;
/**
* 转换后万集的方向转向,不包含行人
*/
......
......@@ -5,6 +5,8 @@ import net.wanji.databus.dto.ExtendPhaseDTO;
import net.wanji.databus.dto.StepingPhaseDTO;
import net.wanji.databus.po.SaveToUtcPO;
import net.wanji.databus.vo.*;
import net.wanji.utc.vo.SchemePhaseGreenTimeOptVO;
import java.util.Date;
/**
......@@ -143,4 +145,12 @@ public interface ControlCommandStrategyService {
* @throws Exception
*/
JsonViewObject stepingPhase (StepingPhaseDTO stepingPhaseDTO) throws Exception;
/**
* 方案相位绿灯时间优化
* @param vo
* @return
* @throws Exception
*/
JsonViewObject schemePhaseGreenTimeOpt(SchemePhaseGreenTimeOptVO vo) throws Exception;
}
......@@ -18,6 +18,7 @@ import net.wanji.databus.po.BaseCrossLightsPO;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.SaveToUtcPO;
import net.wanji.databus.vo.*;
import net.wanji.feign.service.common.FeignCommon;
import net.wanji.utc.cache.CrossInfoCache;
import net.wanji.utc.cache.CrossPhaseDirTurnCache;
import net.wanji.utc.cache.CrossSchemePhaseTimeCountCache;
......@@ -30,6 +31,7 @@ import net.wanji.utc.service.control.ControlCommandStrategyService;
import net.wanji.utc.task.SignalCommandSyncTask;
import net.wanji.utc.task.SignalStatusTask;
import net.wanji.utc.util.StringUtils;
import net.wanji.utc.vo.SchemePhaseGreenTimeOptVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -679,4 +681,17 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
}
return jsonViewObject;
}
@Override
public JsonViewObject schemePhaseGreenTimeOpt(SchemePhaseGreenTimeOptVO vo) throws Exception {
String crossId = vo.getCrossId();
Integer schemeId = vo.getSchemeId();
Integer offset = vo.getOffset();
List<SchemePhaseGreenTimeOptVO.PhaseOptTime> phaseOptTimeList = vo.getPhaseOptTimeList();
// 获取方案环图中,将环图中相位转化为阶段中相位对应关系 需要磊磊存数据 t_scheme_ring_phase_mapping_info
// 将阶段中相位加减绿灯时间转化到环相位中
// 下发临时方案
return null;
}
}
......@@ -34,5 +34,6 @@ public interface StaticInfoService {
JsonViewObject schemeOptLog(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception;
JsonViewObject selectSchemeByParams(QueryByCrossIdAndTimeDTO queryByCrossIdAndTimeDTO) throws Exception;
JsonViewObject selectSchemeOptLogByParams(CrossSchemeQueryDTO crossSchemeQueryDT) throws Exception;
JsonViewObject selectCrossSchemeRingsToStages(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception;
}
......@@ -58,5 +58,5 @@ public interface WanJiCommonStaticInfoService {
JsonViewObject schemeOptLog(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception;
JsonViewObject selectSchemeByParams(QueryByCrossIdAndTimeDTO queryByCrossIdAndTimeDTO) throws Exception;
JsonViewObject selectSchemeOptLogByParams(CrossSchemeQueryDTO crossSchemeQueryDT) throws Exception;
JsonViewObject selectCrossSchemeRingsToStages(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception;
}
......@@ -251,4 +251,10 @@ public class StaticInfoServiceImpl implements StaticInfoService {
jsonViewObject = wanjiCommonStaticInfoService.selectSchemeOptLogByParams(crossSchemeQueryDT);
return jsonViewObject;
}
@Override
public JsonViewObject selectCrossSchemeRingsToStages(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
jsonViewObject = wanjiCommonStaticInfoService.selectCrossSchemeRingsToStages(crossSchemeRingsDTO);
return jsonViewObject; }
}
......@@ -401,6 +401,23 @@ public class WanJiCommonStaticInfoServiceImpl implements WanJiCommonStaticInfoSe
return JsonViewObject.newInstance().success(schemeOptLogPO);
}
@Override
public JsonViewObject selectCrossSchemeRingsToStages(CrossSchemeRingsDTO crossSchemeRingsDTO) throws Exception {
String manufacturerIdCode = crossInfoCache.getManufacturerCodeByCrossId(crossSchemeRingsDTO.getCrossId());
JsonViewObject jsonViewObject = null;
if ("HISENSE".equals(manufacturerIdCode)) {
FeignCommon utcFeignClientService = utcFeignClientCache.getUtcFeignClientService(manufacturerIdCode);
jsonViewObject = utcFeignClientService.selectCrossSchemeRingsToStages(crossSchemeRingsDTO);
} else {
//TODO 易华录及其它厂家
}
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
throw new Exception("根据时间和路口号查询方案号远程服务调用异常,异常信息" + jsonViewObject.getMessage());
}
return jsonViewObject;
}
/**
* @return net.wanji.databus.dao.entity.BaseCrossSchemePO
* @Description 获取方案号
......
......@@ -19,6 +19,7 @@ import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.service.control.ControlCommandService;
import net.wanji.utc.service.control.ControlCommandStrategyService;
import net.wanji.utc.util.StringUtils;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......@@ -34,6 +35,7 @@ import java.util.concurrent.ConcurrentHashMap;
*/
@Component
@Slf4j
@Profile("docker")
@SuppressWarnings("all")
public class CommandFaildTask {
@Resource
......
......@@ -6,8 +6,6 @@ import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.CrossLightsPO;
import net.wanji.databus.dao.entity.CrossPhaseLightsPO;
import net.wanji.databus.dto.CrossSchemeRingsDTO;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.CrossSchemeRings;
......@@ -172,6 +170,7 @@ public class HisenseSchemeRingTask {
ringPhaseInfoDTO.setDirTurnInfoList(dirTurnList);
ringPhaseInfoDTO.setChannel(channel);
ringPhaseInfoDTO.setConcurrent(concurrentList.get(i));
ringPhaseInfoDTO.setDate(new Date());
ringPhaseInfoDTOS.add(ringPhaseInfoDTO);
}
log.info("路口编号:{},当前环相位列表:{}", crossId, mapper.writeValueAsString(ringPhaseInfoDTOS));
......
......@@ -40,6 +40,7 @@ import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
......@@ -58,8 +59,9 @@ import java.util.concurrent.CopyOnWriteArrayList;
* @author Kent HAN
* @date 2022/11/21 9:01
*/
//@Component
@Component
@Slf4j
@Profile("docker")
@SuppressWarnings("all")
public class SignalStatusTask {
@Autowired
......
package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author duanruiming
* @date 2025/04/18 11:22
*/
@Data
@NoArgsConstructor
@ApiModel(value = "SchemePhaseGreenTimeOptVO", description = "方案相位绿灯时间优化下发请求体")
public class SchemePhaseGreenTimeOptVO {
@ApiModelProperty(name = "路口ID",notes = "")
private String crossId;
@ApiModelProperty(name = "原方案ID",notes = "")
private Integer schemeId;
@ApiModelProperty(value = "优化模式 0-信控调优平台优化")
private Integer optType;
@ApiModelProperty(value = "周期")
private Integer cycle;
@ApiModelProperty(value = "相位差")
private Integer offset;
@ApiModelProperty(value = "调整时间表格")
private List<PhaseOptTime> phaseOptTimeList;
@Data
@NoArgsConstructor
@ApiModel(value = "PhaseOptTime", description = "调整时间表格元素")
public static class PhaseOptTime {
@ApiModelProperty(value = "相位编号")
private String phaseNo;
@ApiModelProperty(value = "原绿灯时长")
private Integer oriGreenTime;
@ApiModelProperty(value = "调整后绿灯时长")
private Integer optGreenTime;
@ApiModelProperty(value = "调整时间")
private Integer optTime;
}
}
package net.wanji.databus.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @ClassName CrossSchemeOptLog
* @Description 方案
* @Author zhouleilei
* @Date 2024/11/23 14:23
*/
@Data
public class CrossSchemeRingsToStagesPO {
@ApiModelProperty(value = "路口编号")
private String crossId;
@ApiModelProperty(value = "方案号")
private String schemeId;
@ApiModelProperty(value = "环数")
private String ringCount;
@ApiModelProperty(value = "周期长,单位秒")
private String cycleLen;
@ApiModelProperty(value = "相位差")
private String offset;
@ApiModelProperty(value = "绿信比")
private String split;
@ApiModelProperty(value = "划分后的相位")
private List<Phase> phaseList;
@Data
public static class Phase {
@ApiModelProperty(value = "相位编号")
private String phaseNo;
@ApiModelProperty(value = "阶段对应的相位号")
private String phaseList;
@ApiModelProperty(value = "相位时长")
private Integer phaseTime;
}
}
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