Commit 2dde54a3 authored by zhouleilei's avatar zhouleilei

计划数据-计划信息、时段信息 静态数据查询

parent eac82065
package net.wanji.utc.hisense.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author zhouleilei
* @date 2024/11/15 23:29
*/
@Getter
@AllArgsConstructor
public enum HisensePersonEntranceAndExitEnum {
// '车道转向:1左转;2直行;3右转;4掉头;5直左;6直右;7左直右;8左右;9左转掉头;10直行掉头;
// 11右转掉头;12左直掉头;13直右掉头;14左直右掉头;15左右掉头', 0 默认没有匹配
PERSON_1(11, 1, "入口行人"),
PERSON_2(12, 2, "出口行人"),
PERSON_3(13, 3, "出入口行人");
private Integer hisensePerson;
private Integer wjPerson;
private String desc;
public static Integer getWjperson(Integer hisensePerson) {
for (HisensePersonEntranceAndExitEnum value : HisensePersonEntranceAndExitEnum.values()) {
if (Objects.equals(hisensePerson, value.getHisensePerson())) {
return value.getWjPerson();
}
}
return 0;
}
}
package net.wanji.utc.hisense.pojo.dto;
import lombok.Data;
/**
* @ClassName RingPhasesDTO
* @Description 获取方案环图,环对应相位的DTO
* @Author zhouleilei
* @Date 2024/11/14 17:05
*/
@Data
public class RingPhaseDTO {
//相位号
private Integer phaseId;
//相位时间
private Integer phaseTime;
//相位红灯时间
private Integer redTime;
//相位黄灯时间
private Integer yellowTime;
//相位绿灯时间
private Integer greenTime;
//最小绿时间
private Integer minGTime;
//最大绿时间
private Integer maxGTime;
//相位状态
private Integer phaseStatus;
}
\ No newline at end of file
package net.wanji.utc.hisense.pojo.dto;
import lombok.Data;
import java.util.List;
/**
* @ClassName StagePhaseDTO
* @Description 阶段相位对应表
* @Author zhouleilei
* @Date 2024/11/15 15:33
*/
@Data
public class StagePhaseDTO {
//阶段号
private Integer stageId;
//阶段时长
private Integer stageTime;
//阶段对应的相位列表
List<RingPhaseDTO> ringPhaseList;
}
package net.wanji.utc.hisense.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.ScheduleUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.CrossLightsPO;
import net.wanji.databus.dao.entity.CrossPlanPO;
import net.wanji.databus.dao.entity.CrossSchedulesPO;
import net.wanji.databus.dao.entity.CrossSectionPO;
import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.dao.mapper.ManufacturerInfoMapper;
......@@ -19,12 +16,11 @@ import net.wanji.databus.po.CrossInfoPOExt;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.common.ChannelControlEnum;
import net.wanji.utc.hisense.common.HisenseTurnEnum;
import net.wanji.utc.hisense.common.HiseseDirEnum;
import net.wanji.utc.hisense.common.OperationBaseDom;
import net.wanji.utc.hisense.common.*;
import net.wanji.utc.hisense.common.constants.HttpConstants;
import net.wanji.utc.hisense.mapper.*;
import net.wanji.utc.hisense.pojo.dto.RingPhaseDTO;
import net.wanji.utc.hisense.pojo.dto.StagePhaseDTO;
import net.wanji.utc.hisense.pojo.result.CoordinationStatus;
import net.wanji.utc.hisense.pojo.result.CrossSchemeRings;
import net.wanji.utc.hisense.pojo.view.VIntersectionView;
......@@ -32,6 +28,7 @@ import net.wanji.utc.hisense.pojo.view.VNtcipChannelPhaseDTO;
import net.wanji.utc.hisense.pojo.view.VNtcipTimeBaseDayplanDTO;
import net.wanji.utc.hisense.pojo.view.VNtcipTimeBaseScheduleView;
import net.wanji.utc.hisense.service.StaticInfoService;
import net.wanji.utc.hisense.util.CommonUtils;
import net.wanji.utc.hisense.util.OkHttpClientUtil;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
......@@ -44,6 +41,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
......@@ -72,7 +70,6 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Resource
private VNtcipChannelViewMapper vNtcipChannelViewMapper;
@Override
public List<CrossInfoPO> crossBasicInfo(CrossInfoDTO crossInfoDTO) throws Exception {
Integer id = manufacturerInfoMapper.selectIdByCode(crossInfoDTO.getManufacturerCode());
......@@ -104,48 +101,321 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Override
public SchemePhaseLightsVO schemePhaseLights(SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception {
String crossId = schemePhaseLightsDTO.getCrossId();
Map<String, CrossInfoPO> crossInfoCache = CrossInfoCache.getCrossInfoCache();
CrossInfoPO crossInfoPO = crossInfoCache.get(crossId);
SchemePhaseLightsVO phaseLightsVO = new SchemePhaseLightsVO();
List<CrossLightsPO> crossLightsList = new ArrayList<>();
List<CrossPhasePO> crossPhaseList = new ArrayList<>();
List<CrossPhaseLightsPO> crossPhaseLightsPOList = new ArrayList<>();
List<CrossSchemePO> crossSchemeList = new ArrayList<>();
//查询当前运行的方案
CoordinationStatus coordinationStatus = crossPlan(crossId);
if (Optional.ofNullable(coordinationStatus).isPresent()) {
CrossSchemeRingsDTO crossSchemeRingsDTO = new CrossSchemeRingsDTO();
crossSchemeRingsDTO.setCrossId(crossId);
crossSchemeRingsDTO.setPattern(coordinationStatus.getCoordPatternStatus());
//查询方案环图请求
CrossSchemeRings crossSchemeRings = crossSchemeRings(crossSchemeRingsDTO);
if (Optional.ofNullable(crossSchemeRings).isPresent()) {
//环数
int ringCount = Integer.parseInt(crossSchemeRings.getRingCount());
//周期长度
String cycleLen = crossSchemeRings.getCycleLen();
JSONObject cycleJSONObject = crossSchemeRings.getCycleList();
List<VNtcipChannelPhaseDTO> vNtcipChannelPhaseDTOS = vNtcipChannelViewMapper.selectChannelPhaseList(crossInfoPO.getCode());
if (!CollectionUtils.isEmpty(vNtcipChannelPhaseDTOS)) {
for (VNtcipChannelPhaseDTO vNtcipChannelPhaseDTO : vNtcipChannelPhaseDTOS) {
// 1灯组信息
// 通道号
Integer nChannelControlType = vNtcipChannelPhaseDTO.getNChannelControlType();
Integer nChannelNumber = vNtcipChannelPhaseDTO.getNChannelNumber();
Integer nChannelDim = vNtcipChannelPhaseDTO.getNChannelDim();
CrossLightsPO crossLightsPO = getCrossLights(crossId, nChannelControlType, nChannelNumber, nChannelDim); crossLightsList.add(crossLightsPO);;
crossLightsList.add(crossLightsPO);;
//相位差
String offset = crossSchemeRings.getOffset();
int cycle = Integer.valueOf(cycleLen);
CrossSchemePO crossSchemePO = new CrossSchemePO();
//方案号
int schemeNo = (Integer.valueOf(crossSchemeRings.getPattern()) + 2) / 3;
crossSchemePO.setSchemeNo(schemeNo + "");
crossSchemePO.setName("海信方案:" + schemeNo);
crossSchemePO.setCrossId(crossId);
crossSchemePO.setCycle(cycle);
//协调相位id先默认给1
crossSchemePO.setCoordPhase(1);
crossSchemePO.setOffset(Integer.valueOf(offset));
//来源默认信号机
crossSchemePO.setSource(1);
//默认给0
crossSchemePO.setIsDeleted(0);
//默认给0
crossSchemePO.setStatus(0);
crossSchemePO.setGmtCreate(null);
crossSchemePO.setGmtModified(null);
crossSchemeList.add(crossSchemePO);
List<CrossSchemeRings.Phase> phaseList = crossSchemeRings.getPhaseList();
CrossSchemeRings.Phase phase = phaseList.get(0);
//16 个相位的红灯时间(单位秒),中间用空格隔开,不存在的相位置 0。
String[] redTime = phase.getRedTime().split(" ");
//16 个相位的绿灯时间(单位秒),中间用空格隔开,不存在的相位置 0。
String[] greenTime = phase.getGreenTime().split(" ");
//16 个相位的黄灯时间(单位秒),中间用空格隔开,不存在的相位置 0。
String[] yellowTime = phase.getYellowTime().split(" ");
//16 个相位的最小绿时间(单位秒),中间用空格隔开,不存在的相位置 0。
String[] minGTime = phase.getMinGTime().split(" ");
//16 个相位的最大绿时间(单位秒),中间用空格隔开,不存在的相位置 0。
String[] maxGTime = phase.getMaxGTime().split(" ");
//封装环和环上相位数据
Map<Integer, List<RingPhaseDTO>> ringPhasesMap = getRingPhasesMap(ringCount, cycleJSONObject, redTime, greenTime, yellowTime,minGTime,maxGTime);
//16 个相位的放行方向,每个相位由 8 字节整型值存储(最多支持 7 个放行方向),每个字节表示一个放行方向,
String[] channelDim = phase.getChannelDim().split(" ");
//数据处理
getStagesByRings(cycle, ringCount, crossId, schemeNo, ringPhasesMap, crossLightsList, crossPhaseList, crossPhaseLightsPOList, channelDim);
}
}
phaseLightsVO.setCrossPhaseLightsPOList(crossPhaseLightsPOList);
phaseLightsVO.setCrossLightsList(crossLightsList);
phaseLightsVO.setCrossSchemeList(crossSchemeList);
phaseLightsVO.setCrossPhaseList(crossPhaseList);
return phaseLightsVO;
}
// 环相位信息
Integer nPhaseConCurrency = vNtcipChannelPhaseDTO.getNPhaseConCurrency();
String format = String.format("%16s", Integer.toBinaryString(nPhaseConCurrency)).replace(' ', '0');
/**
* @return java.util.Map<java.lang.Integer, java.util.List < net.wanji.utc.hisense.pojo.dto.RingPhaseDTO>>
* @Description 封装环和环上相位数据
* @Param ringCount 环的数量
* @Param cycleJSONObject 环数据
* @Param redTime 红
* @Param greenTime 绿
* @Param yellowTime 黄
**/
private Map<Integer, List<RingPhaseDTO>> getRingPhasesMap(int ringCount, JSONObject cycleJSONObject, String[] redTime, String[] greenTime, String[] yellowTime,String[] minGTime,String[] maxGTime) {
Map<Integer, List<RingPhaseDTO>> map = new HashMap<>();
for (int i = 1; i <= ringCount; i++) {
//取出环中的数据,并去掉空格和_,得到相位
String ringPhases = cycleJSONObject.getString("Cycle" + i)
.replaceAll(" ", "").replaceAll("_", "");
List<RingPhaseDTO> ringPhaseDTOS = new ArrayList<>();
char[] charArray = ringPhases.toCharArray();
for (int i1 = 0; i1 < charArray.length; i1++) {
RingPhaseDTO ringPhase = new RingPhaseDTO();
int phaseId = Character.getNumericValue(charArray[i1]);
int red = Integer.valueOf(redTime[phaseId - 1]);
int green = Integer.valueOf(greenTime[phaseId - 1]);
int yellow = Integer.valueOf(yellowTime[phaseId - 1]);
int minG = Integer.valueOf(minGTime[phaseId - 1]);
int maxG = Integer.valueOf(maxGTime[phaseId - 1]);
ringPhase.setPhaseId(phaseId);
ringPhase.setPhaseStatus(0);
ringPhase.setRedTime(red);
ringPhase.setGreenTime(green);
ringPhase.setYellowTime(yellow);
ringPhase.setMaxGTime(maxG);
ringPhase.setMinGTime(minG);
ringPhase.setPhaseTime(red + green + yellow);
ringPhaseDTOS.add(ringPhase);
}
map.put(i, ringPhaseDTOS);
}
return map;
}
// 2相位灯组信息
CrossPhaseLightsPO crossPhaseLightsPO = getCrossPhaseLightsPO(crossId, vNtcipChannelPhaseDTO, nChannelNumber);
crossPhaseLightsPOList.add(crossPhaseLightsPO);
/**
* @return null
* @Description 数据处理
* @Param ringPhaseMap 环包含的相位
* @Param phasesTime 各个相位的红绿黄时间和
**/
private void getStagesByRings(int cycle, int ringCount, String crossId, int schemeNo, Map<Integer, List<RingPhaseDTO>> ringPhasesMap, List<CrossLightsPO> crossLightsList, List<CrossPhasePO> crossPhaseList, List<CrossPhaseLightsPO> crossPhaseLightsPOList, String[] channelDim) {
//已经计算的阶段时长
int stageTime = 0;
//循环次数,也代表阶段号
int count = 1;
//阶段对应的相位
List<StagePhaseDTO> stagePhaseList = new ArrayList<>();
while (stageTime < cycle) {
int firstPhaseTime = 0;
RingPhaseDTO firstRingPhaseDTO = null;
//key为环号,value为该数据在List<RingPhaseDTO>的序号,为了更新List<RingPhaseDTO>的status
Map<Integer, Integer> minStageMap = new HashMap<>();
List<RingPhaseDTO> stageList = new ArrayList<>();
StagePhaseDTO stagePhase = new StagePhaseDTO();
//第一个阶段
if (count == 1) {
for (int i = 1; i <= ringCount; i++) {
//第i个环上的数据
List<RingPhaseDTO> ringPhaseDTOS = ringPhasesMap.get(i);
//第一个相位的数据
RingPhaseDTO ringPhaseDTO = ringPhaseDTOS.get(0);
Integer phaseTime = ringPhaseDTO.getPhaseTime();
if (firstPhaseTime == 0) {
firstPhaseTime = phaseTime;
firstRingPhaseDTO = ringPhaseDTO;
minStageMap.put(i, 0);
} else if (phaseTime <= firstPhaseTime) {
if (phaseTime < firstPhaseTime) {
//清空缓存
minStageMap.clear();
}
firstPhaseTime = phaseTime;
firstRingPhaseDTO = ringPhaseDTO;
minStageMap.put(i, 0);
}
//每个环的第一个相位一定在第一个阶段
stageList.add(ringPhaseDTO);
}
} else {
for (int i = 1; i <= ringCount; i++) {
//第i个环上的数据
List<RingPhaseDTO> ringPhaseDTOS = ringPhasesMap.get(i);
//如果该环上相位都没有执行,则取第0个相位,否则取状态最后一次出现的1的下一个相位
List<RingPhaseDTO> collect = ringPhaseDTOS.stream().filter(x -> x.getPhaseStatus() == 1).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(collect)) {
//取最后一位
RingPhaseDTO phaseDTO = collect.get(collect.size() - 1);
//状态最后一次出现的1的下一个相位
int index = ringPhaseDTOS.lastIndexOf(phaseDTO) + 1;
RingPhaseDTO ringPhaseDTO = ringPhaseDTOS.get(index);
//计算该相位及走过的所有时间
int totalTime = ringPhaseDTOS.stream().filter(x -> ringPhaseDTOS.indexOf(x) <= index).mapToInt(RingPhaseDTO::getPhaseTime).sum();
//totalTime - stageTime 为该相位剩余时间
Integer phaseTime = totalTime - stageTime;
if (firstPhaseTime == 0) {
firstPhaseTime = phaseTime;
firstRingPhaseDTO = ringPhaseDTO;
minStageMap.put(i, index);
} else {
if (phaseTime <= firstPhaseTime) {
if (phaseTime < firstPhaseTime) {
//清空缓存
minStageMap.clear();
}
firstPhaseTime = phaseTime;
firstRingPhaseDTO = ringPhaseDTO;
minStageMap.put(i, index);
}
}
stageList.add(ringPhaseDTO);
} else {
//在第一个相位
RingPhaseDTO ringPhaseDTO = ringPhaseDTOS.get(0);
//该相位一定会走
stageList.add(ringPhaseDTO);
//第一个相位的时间减去走过的时长,则为剩余时长,和其他时间做比较
Integer phaseTime = ringPhaseDTO.getPhaseTime() - stageTime;
if (firstPhaseTime == 0) {
//第一次进入循环
firstPhaseTime = phaseTime;
firstRingPhaseDTO = ringPhaseDTO;
minStageMap.put(i, 0);
} else if (phaseTime <= firstPhaseTime) {
if (phaseTime < firstPhaseTime) {
if (!minStageMap.isEmpty()) {
//清空缓存
minStageMap.clear();
}
}
firstPhaseTime = phaseTime;
firstRingPhaseDTO = ringPhaseDTO;
minStageMap.put(i, 0);
}
}
}
}
// 3
CrossSchemePO crossSchemePO = new CrossSchemePO();
crossSchemePO.setCrossId(crossId);
crossSchemePO.setSchemeNo(null);
crossSchemePO.setName(null);
crossSchemePO.setCycle(null);
crossSchemePO.setCoordPhase(null);
crossSchemePO.setOffset(null);
crossSchemePO.setSource(2);
crossSchemePO.setStatus(0);
stageTime += firstPhaseTime;
Set<Integer> keySet = minStageMap.keySet();
for (Integer integer : keySet) {
Integer no = minStageMap.get(integer);
//更新ringPhasesMap状态
ringPhasesMap.get(integer).get(no).setPhaseStatus(1);
}
stagePhase.setStageId(count);
stagePhase.setRingPhaseList(stageList);
stagePhase.setStageTime(firstPhaseTime);
stagePhaseList.add(stagePhase);
count++;
}
if (CollectionUtil.isNotEmpty(stagePhaseList)) {
//将结果组装到结果集
doView(cycle, ringCount, crossId, schemeNo, stagePhaseList, crossLightsList, crossPhaseList, crossPhaseLightsPOList, channelDim);
}
}
/**
* @return void
* @Description 组装结果集
* @Param [cycle, ringCount, crossId, schemeNo, crossLightsList, crossPhaseList, crossPhaseLightsPOList, channelDim]
**/
private void doView(int cycle, int ringCount, String crossId, int schemeNo, List<StagePhaseDTO> stagePhaseList, List<CrossLightsPO> crossLightsList, List<CrossPhasePO> crossPhaseList, List<CrossPhaseLightsPO> crossPhaseLightsPOList, String[] channelDim) {
AtomicInteger phaseNum = new AtomicInteger(0);
AtomicInteger lightNum = new AtomicInteger(0);
//遍历阶段
for (StagePhaseDTO stagePhaseDTO : stagePhaseList) {
Integer stageId = stagePhaseDTO.getStageId();
Integer stageTime = stagePhaseDTO.getStageTime();
//遍历相位
List<RingPhaseDTO> ringPhaseList = stagePhaseDTO.getRingPhaseList();
//相位
CrossPhasePO crossPhasePO = new CrossPhasePO();
crossPhasePO.setPhaseNo(stageId + "");
crossPhasePO.setName("相位" + stageId);
crossPhasePO.setSort(phaseNum.getAndIncrement());
crossPhasePO.setCrossId(crossId);
crossPhasePO.setPlanId(schemeNo);
crossPhasePO.setAccompanyPhaseNo("1");
crossPhasePO.setRingNo(1);
crossPhasePO.setGroupNo(1);
crossPhasePO.setPhaseType(1);
if (schemeNo == 85) {
//黃闪
crossPhasePO.setControlMode(7);
} else {
crossPhasePO.setControlMode(1);
}
crossPhasePO.setPhaseTime(stageTime);
crossPhasePO.setGreenTime(ringPhaseList.get(0).getGreenTime());
crossPhasePO.setGreenFlashTime(0);
crossPhasePO.setYellowFlashTime(0);
crossPhasePO.setRedFlashTime(0);
crossPhasePO.setPedFlashTime(0);
crossPhasePO.setYellowTime(ringPhaseList.get(0).getYellowTime());
crossPhasePO.setRedTime(ringPhaseList.get(0).getRedTime());
crossPhasePO.setMinGreenTime(ringPhaseList.get(0).getMinGTime());
crossPhasePO.setMaxGreenTime(ringPhaseList.get(0).getMaxGTime());
crossPhasePO.setGmtCreate(null);
crossPhasePO.setGmtModified(null);
crossPhaseList.add(crossPhasePO);
for (RingPhaseDTO phaseDTO : ringPhaseList) {
Integer phaseId = phaseDTO.getPhaseId();
long channe = Long.valueOf(channelDim[phaseId-1]);
String binaryString = Long.toBinaryString(channe);
//获取方向转向分组
List<String> binaryList = CommonUtils.groupStringFromRight(binaryString);
for (String readUtf8Line : binaryList) {
String dir = readUtf8Line.substring(0, 3); // 高三位 方向
String turn = readUtf8Line.substring(3); // 低五位 转向
Integer wjLightsDir = HiseseDirEnum.getWjLightsDir(Integer.parseInt(dir, 2));
Integer wjLightsTurn = HisenseTurnEnum.getWjLightsTurn(Integer.parseInt(turn, 2));
Integer wjPerson = HisensePersonEntranceAndExitEnum.getWjperson(Integer.parseInt(turn, 2));
//灯组
CrossLightsPO crossLightsPO = new CrossLightsPO();
lightNum.getAndIncrement();
crossLightsPO.setLightsNo(lightNum.get()+"");
crossLightsPO.setName("灯组"+lightNum.get());
//默认0
crossLightsPO.setType(0);
crossLightsPO.setDir(wjLightsDir);
crossLightsPO.setTurn(wjLightsTurn);
crossLightsPO.setCrossId(crossId);
crossLightsPO.setInOutType(wjPerson);
crossLightsPO.setGmtCreate(null);
crossLightsPO.setGmtModified(null);
crossLightsList.add(crossLightsPO);
//灯组与相位关系
CrossPhaseLightsPO crossPhaseLightsPO = new CrossPhaseLightsPO();
crossPhaseLightsPO.setLightsId(lightNum.get());
crossPhaseLightsPO.setPhaseId(phaseNum.get());
crossPhaseLightsPO.setCrossId(crossId);
crossPhaseLightsPO.setGmtCreate(null);
crossPhaseLightsPO.setGmtModified(null);
crossPhaseLightsPOList.add(crossPhaseLightsPO);
}
}
}
log.error("======" + crossLightsList);
return null;
}
@NotNull
......@@ -160,6 +430,21 @@ public class StaticInfoServiceImpl implements StaticInfoService {
return crossPhaseLightsPO;
}
public static void main(String[] args) {
int l = 6442253;
String binaryString = Integer.toBinaryString(l);
String dirTurn = String.format("%8s", Integer.toBinaryString(6442253)).replace(' ', '0');
if (StringUtils.isNotBlank(dirTurn)) {
String dir = dirTurn.substring(0, 3); // 高三位 方向
String turn = dirTurn.substring(3); // 低五位 转向
Integer wjLightsDir = HiseseDirEnum.getWjLightsDir(Integer.parseInt(dir, 2));
Integer wjLightsTurn = HisenseTurnEnum.getWjLightsTurn(Integer.parseInt(turn, 2));
System.out.println("wjLightsDir "+wjLightsDir);
System.out.println("wjLightsTurn "+wjLightsTurn);
}
}
private static CrossLightsPO getCrossLights(String crossId, Integer nChannelControlType, Integer nChannelNumber, Integer nChannelDim) {
CrossLightsPO crossLightsPO = new CrossLightsPO();
crossLightsPO.setLightsNo(String.valueOf(nChannelNumber));
......@@ -186,10 +471,10 @@ public class StaticInfoServiceImpl implements StaticInfoService {
String crossId = planSectionDTO.getCrossId();
//从缓存中拿路口信息
CrossInfoPO crossInfoPO = CrossInfoCache.getCrossInfoCache().get(crossId);
if (Optional.ofNullable(planSectionDTO).isPresent()){
if (Optional.ofNullable(planSectionDTO).isPresent()) {
String code = crossInfoPO.getCode();
List<VNtcipTimeBaseDayplanDTO> vNtcipTimeBaseDayplanDTOS = vNtcipTimeBaseDayplanMapper.listByCrossIdAndDayPlanId(code, planSectionDTO.getPlanNo());
if (!CollectionUtils.isEmpty(vNtcipTimeBaseDayplanDTOS)){
if (!CollectionUtils.isEmpty(vNtcipTimeBaseDayplanDTOS)) {
List<PlanSectionVO> list = new ArrayList<>();
//根据时段表号分组
Map<Integer, List<VNtcipTimeBaseDayplanDTO>> collect = vNtcipTimeBaseDayplanDTOS.stream().collect(Collectors.groupingBy(VNtcipTimeBaseDayplanDTO::getNDayPlanNumber));
......@@ -206,28 +491,27 @@ public class StaticInfoServiceImpl implements StaticInfoService {
CrossSectionPO crossSectionPO = new CrossSectionPO();
crossPlan.setCrossId(crossId);
//计划号-取的是时段表号
crossPlan.setPlanNo(dayplanDTO.getNDayPlanNumber()+"");
crossPlan.setName("海信信号机-时段表号:"+dayplanDTO.getNDayPlanNumber());
crossPlan.setPlanNo(dayplanDTO.getNDayPlanNumber() + "");
crossPlan.setName("海信信号机-时段表号:" + dayplanDTO.getNDayPlanNumber());
crossSectionPO.setCrossId(crossId);
//时段号 - 取的是时段序号
crossSectionPO.setSectionNo(dayplanDTO.getNDayPlanEventNumber()+"");
//TODO 开始时间 - 拼接小时和分钟
crossSectionPO.setStartTime(dayplanDTO.getNDayPlanHour()+":"+dayplanDTO.getNDayPlanMinute());
if (i1 == dayplanDTOS.size()-1){
crossSectionPO.setSectionNo(dayplanDTO.getNDayPlanEventNumber() + "");
crossSectionPO.setStartTime(dayplanDTO.getNDayPlanHour() + ":" + dayplanDTO.getNDayPlanMinute());
if (i1 == dayplanDTOS.size() - 1) {
crossSectionPO.setEndTime("23:59");
}else {
} else {
VNtcipTimeBaseDayplanDTO dto = dayplanDTOS.get(i1 + 1);
crossSectionPO.setEndTime(dto.getNDayPlanHour()+":"+dto.getNDayPlanMinute());
crossSectionPO.setEndTime(dto.getNDayPlanHour() + ":" + dto.getNDayPlanMinute());
}
// 计划ID - 取的是时段表号
crossSectionPO.setPlanId(dayplanDTO.getNDayPlanNumber());
//方案号
Integer pattern = dayplanDTO.getNTimebaseAscPattern();
if (pattern == 85){
if (pattern == 85) {
//黃闪
crossSectionPO.setControlMode(3);
}else {
} else {
//定周期
crossSectionPO.setControlMode(1);
}
......
......@@ -2,6 +2,12 @@ package net.wanji.utc.hisense.util;
import cn.hutool.core.util.HexUtil;
import freemarker.template.utility.StringUtil;
import net.wanji.common.utils.tool.ScheduleUtil;
import net.wanji.utc.hisense.common.HisenseTurnEnum;
import net.wanji.utc.hisense.common.HiseseDirEnum;
import java.util.ArrayList;
import java.util.List;
/**
* @author duanruiming
......@@ -120,8 +126,60 @@ public class CommonUtils {
return dir;
}
/**
* @Description 将字符串分成八个一组,不够的最前面补0
* @Param [input]
* @return java.util.List<java.lang.String>
**/
public static List<String> groupStringFromRight(String input) {
List<String> list = new ArrayList<>();
if (input == null || input.isEmpty()) {
return null;
}
// 计算需要多少个完整的8字符组
int fullGroups = input.length() / 8;
// 计算最后一个组中的字符数
int lastGroupSize = input.length() % 8;
StringBuilder result = new StringBuilder(input);
String str = "";
if (lastGroupSize > 0) {
// 计算需要补多少个0
int padding = 8 - lastGroupSize;
for (int i = 0; i < padding; i++) {
str = str+"0";
}
}
input = str+result.toString();
int size =input.length()/8;
for (int i = 0; i < size; i++) {
String substring = input.substring(i * 8, (i + 1) * 8);
list.add(substring);
}
return list;
}
public static void main(String[] args) {
System.err.println(get4BinaryInteger(4));
int l = 6442253;
String binaryString = Integer.toBinaryString(l);
List<String> readUtf8Lines = groupStringFromRight(binaryString);
System.out.println(readUtf8Lines.size());
for (String readUtf8Line : readUtf8Lines) {
System.out.println(readUtf8Line);
String dir = readUtf8Line.substring(0, 3); // 高三位 方向
String turn = readUtf8Line.substring(3); // 低五位 转向
System.out.println(ScheduleUtil.binaryIntToDecimalism(dir)+"_"+ScheduleUtil.binaryIntToDecimalism(turn));
Integer wjLightsDir = HiseseDirEnum.getWjLightsDir(Integer.parseInt(dir, 2));
Integer wjLightsTurn = HisenseTurnEnum.getWjLightsTurn(Integer.parseInt(turn, 2));
System.out.println("wjLightsDir "+wjLightsDir);
System.out.println("wjLightsTurn "+wjLightsTurn);
System.out.println("======================================");
}
}
}
......@@ -74,7 +74,7 @@ public class StaticInfoController {
})
public JsonViewObject schemePhaseLights(@RequestBody @Validated SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception {
// 更新数据库
//staticInfoService.schemePhaseLights(schemePhaseLightsDTO);
staticInfoService.schemePhaseLights(schemePhaseLightsDTO);
// 构造返回值
SchemePhaseLightsVO schemePhaseLightsVO = staticInfoService.buildSchemePhaseLightsResponse(schemePhaseLightsDTO);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
......
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