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; package net.wanji.utc.hisense.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.ScheduleUtil; import net.wanji.common.utils.tool.ScheduleUtil;
import net.wanji.common.utils.tool.StringUtils; 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.entity.*;
import net.wanji.databus.dao.mapper.CrossInfoMapper; import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.dao.mapper.ManufacturerInfoMapper; import net.wanji.databus.dao.mapper.ManufacturerInfoMapper;
...@@ -19,12 +16,11 @@ import net.wanji.databus.po.CrossInfoPOExt; ...@@ -19,12 +16,11 @@ import net.wanji.databus.po.CrossInfoPOExt;
import net.wanji.databus.vo.PlanSectionVO; import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO; import net.wanji.databus.vo.SchemePhaseLightsVO;
import net.wanji.utc.hisense.cache.CrossInfoCache; import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.common.ChannelControlEnum; import net.wanji.utc.hisense.common.*;
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.constants.HttpConstants; import net.wanji.utc.hisense.common.constants.HttpConstants;
import net.wanji.utc.hisense.mapper.*; 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.CoordinationStatus;
import net.wanji.utc.hisense.pojo.result.CrossSchemeRings; import net.wanji.utc.hisense.pojo.result.CrossSchemeRings;
import net.wanji.utc.hisense.pojo.view.VIntersectionView; import net.wanji.utc.hisense.pojo.view.VIntersectionView;
...@@ -32,6 +28,7 @@ import net.wanji.utc.hisense.pojo.view.VNtcipChannelPhaseDTO; ...@@ -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.VNtcipTimeBaseDayplanDTO;
import net.wanji.utc.hisense.pojo.view.VNtcipTimeBaseScheduleView; import net.wanji.utc.hisense.pojo.view.VNtcipTimeBaseScheduleView;
import net.wanji.utc.hisense.service.StaticInfoService; import net.wanji.utc.hisense.service.StaticInfoService;
import net.wanji.utc.hisense.util.CommonUtils;
import net.wanji.utc.hisense.util.OkHttpClientUtil; import net.wanji.utc.hisense.util.OkHttpClientUtil;
import org.dom4j.Document; import org.dom4j.Document;
import org.dom4j.DocumentHelper; import org.dom4j.DocumentHelper;
...@@ -44,6 +41,7 @@ import org.springframework.util.CollectionUtils; ...@@ -44,6 +41,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -72,7 +70,6 @@ public class StaticInfoServiceImpl implements StaticInfoService { ...@@ -72,7 +70,6 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Resource @Resource
private VNtcipChannelViewMapper vNtcipChannelViewMapper; private VNtcipChannelViewMapper vNtcipChannelViewMapper;
@Override @Override
public List<CrossInfoPO> crossBasicInfo(CrossInfoDTO crossInfoDTO) throws Exception { public List<CrossInfoPO> crossBasicInfo(CrossInfoDTO crossInfoDTO) throws Exception {
Integer id = manufacturerInfoMapper.selectIdByCode(crossInfoDTO.getManufacturerCode()); Integer id = manufacturerInfoMapper.selectIdByCode(crossInfoDTO.getManufacturerCode());
...@@ -104,48 +101,321 @@ public class StaticInfoServiceImpl implements StaticInfoService { ...@@ -104,48 +101,321 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Override @Override
public SchemePhaseLightsVO schemePhaseLights(SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception { public SchemePhaseLightsVO schemePhaseLights(SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception {
String crossId = schemePhaseLightsDTO.getCrossId(); String crossId = schemePhaseLightsDTO.getCrossId();
Map<String, CrossInfoPO> crossInfoCache = CrossInfoCache.getCrossInfoCache(); SchemePhaseLightsVO phaseLightsVO = new SchemePhaseLightsVO();
CrossInfoPO crossInfoPO = crossInfoCache.get(crossId);
List<CrossLightsPO> crossLightsList = new ArrayList<>(); List<CrossLightsPO> crossLightsList = new ArrayList<>();
List<CrossPhasePO> crossPhaseList = new ArrayList<>(); List<CrossPhasePO> crossPhaseList = new ArrayList<>();
List<CrossPhaseLightsPO> crossPhaseLightsPOList = new ArrayList<>(); List<CrossPhaseLightsPO> crossPhaseLightsPOList = new ArrayList<>();
List<CrossSchemePO> crossSchemeList = 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)) { String offset = crossSchemeRings.getOffset();
for (VNtcipChannelPhaseDTO vNtcipChannelPhaseDTO : vNtcipChannelPhaseDTOS) { int cycle = Integer.valueOf(cycleLen);
// 1灯组信息 CrossSchemePO crossSchemePO = new CrossSchemePO();
// 通道号 //方案号
Integer nChannelControlType = vNtcipChannelPhaseDTO.getNChannelControlType(); int schemeNo = (Integer.valueOf(crossSchemeRings.getPattern()) + 2) / 3;
Integer nChannelNumber = vNtcipChannelPhaseDTO.getNChannelNumber(); crossSchemePO.setSchemeNo(schemeNo + "");
Integer nChannelDim = vNtcipChannelPhaseDTO.getNChannelDim(); crossSchemePO.setName("海信方案:" + schemeNo);
CrossLightsPO crossLightsPO = getCrossLights(crossId, nChannelControlType, nChannelNumber, nChannelDim); crossLightsList.add(crossLightsPO);; crossSchemePO.setCrossId(crossId);
crossLightsList.add(crossLightsPO);; 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(); * @return java.util.Map<java.lang.Integer, java.util.List < net.wanji.utc.hisense.pojo.dto.RingPhaseDTO>>
String format = String.format("%16s", Integer.toBinaryString(nPhaseConCurrency)).replace(' ', '0'); * @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); * @return null
crossPhaseLightsPOList.add(crossPhaseLightsPO); * @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 stageTime += firstPhaseTime;
CrossSchemePO crossSchemePO = new CrossSchemePO(); Set<Integer> keySet = minStageMap.keySet();
crossSchemePO.setCrossId(crossId); for (Integer integer : keySet) {
crossSchemePO.setSchemeNo(null); Integer no = minStageMap.get(integer);
crossSchemePO.setName(null); //更新ringPhasesMap状态
crossSchemePO.setCycle(null); ringPhasesMap.get(integer).get(no).setPhaseStatus(1);
crossSchemePO.setCoordPhase(null); }
crossSchemePO.setOffset(null); stagePhase.setStageId(count);
crossSchemePO.setSource(2); stagePhase.setRingPhaseList(stageList);
crossSchemePO.setStatus(0); 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 @NotNull
...@@ -160,6 +430,21 @@ public class StaticInfoServiceImpl implements StaticInfoService { ...@@ -160,6 +430,21 @@ public class StaticInfoServiceImpl implements StaticInfoService {
return crossPhaseLightsPO; 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) { private static CrossLightsPO getCrossLights(String crossId, Integer nChannelControlType, Integer nChannelNumber, Integer nChannelDim) {
CrossLightsPO crossLightsPO = new CrossLightsPO(); CrossLightsPO crossLightsPO = new CrossLightsPO();
crossLightsPO.setLightsNo(String.valueOf(nChannelNumber)); crossLightsPO.setLightsNo(String.valueOf(nChannelNumber));
...@@ -186,10 +471,10 @@ public class StaticInfoServiceImpl implements StaticInfoService { ...@@ -186,10 +471,10 @@ public class StaticInfoServiceImpl implements StaticInfoService {
String crossId = planSectionDTO.getCrossId(); String crossId = planSectionDTO.getCrossId();
//从缓存中拿路口信息 //从缓存中拿路口信息
CrossInfoPO crossInfoPO = CrossInfoCache.getCrossInfoCache().get(crossId); CrossInfoPO crossInfoPO = CrossInfoCache.getCrossInfoCache().get(crossId);
if (Optional.ofNullable(planSectionDTO).isPresent()){ if (Optional.ofNullable(planSectionDTO).isPresent()) {
String code = crossInfoPO.getCode(); String code = crossInfoPO.getCode();
List<VNtcipTimeBaseDayplanDTO> vNtcipTimeBaseDayplanDTOS = vNtcipTimeBaseDayplanMapper.listByCrossIdAndDayPlanId(code, planSectionDTO.getPlanNo()); List<VNtcipTimeBaseDayplanDTO> vNtcipTimeBaseDayplanDTOS = vNtcipTimeBaseDayplanMapper.listByCrossIdAndDayPlanId(code, planSectionDTO.getPlanNo());
if (!CollectionUtils.isEmpty(vNtcipTimeBaseDayplanDTOS)){ if (!CollectionUtils.isEmpty(vNtcipTimeBaseDayplanDTOS)) {
List<PlanSectionVO> list = new ArrayList<>(); List<PlanSectionVO> list = new ArrayList<>();
//根据时段表号分组 //根据时段表号分组
Map<Integer, List<VNtcipTimeBaseDayplanDTO>> collect = vNtcipTimeBaseDayplanDTOS.stream().collect(Collectors.groupingBy(VNtcipTimeBaseDayplanDTO::getNDayPlanNumber)); Map<Integer, List<VNtcipTimeBaseDayplanDTO>> collect = vNtcipTimeBaseDayplanDTOS.stream().collect(Collectors.groupingBy(VNtcipTimeBaseDayplanDTO::getNDayPlanNumber));
...@@ -206,28 +491,27 @@ public class StaticInfoServiceImpl implements StaticInfoService { ...@@ -206,28 +491,27 @@ public class StaticInfoServiceImpl implements StaticInfoService {
CrossSectionPO crossSectionPO = new CrossSectionPO(); CrossSectionPO crossSectionPO = new CrossSectionPO();
crossPlan.setCrossId(crossId); crossPlan.setCrossId(crossId);
//计划号-取的是时段表号 //计划号-取的是时段表号
crossPlan.setPlanNo(dayplanDTO.getNDayPlanNumber()+""); crossPlan.setPlanNo(dayplanDTO.getNDayPlanNumber() + "");
crossPlan.setName("海信信号机-时段表号:"+dayplanDTO.getNDayPlanNumber()); crossPlan.setName("海信信号机-时段表号:" + dayplanDTO.getNDayPlanNumber());
crossSectionPO.setCrossId(crossId); crossSectionPO.setCrossId(crossId);
//时段号 - 取的是时段序号 //时段号 - 取的是时段序号
crossSectionPO.setSectionNo(dayplanDTO.getNDayPlanEventNumber()+""); crossSectionPO.setSectionNo(dayplanDTO.getNDayPlanEventNumber() + "");
//TODO 开始时间 - 拼接小时和分钟 crossSectionPO.setStartTime(dayplanDTO.getNDayPlanHour() + ":" + dayplanDTO.getNDayPlanMinute());
crossSectionPO.setStartTime(dayplanDTO.getNDayPlanHour()+":"+dayplanDTO.getNDayPlanMinute()); if (i1 == dayplanDTOS.size() - 1) {
if (i1 == dayplanDTOS.size()-1){
crossSectionPO.setEndTime("23:59"); crossSectionPO.setEndTime("23:59");
}else { } else {
VNtcipTimeBaseDayplanDTO dto = dayplanDTOS.get(i1 + 1); VNtcipTimeBaseDayplanDTO dto = dayplanDTOS.get(i1 + 1);
crossSectionPO.setEndTime(dto.getNDayPlanHour()+":"+dto.getNDayPlanMinute()); crossSectionPO.setEndTime(dto.getNDayPlanHour() + ":" + dto.getNDayPlanMinute());
} }
// 计划ID - 取的是时段表号 // 计划ID - 取的是时段表号
crossSectionPO.setPlanId(dayplanDTO.getNDayPlanNumber()); crossSectionPO.setPlanId(dayplanDTO.getNDayPlanNumber());
//方案号 //方案号
Integer pattern = dayplanDTO.getNTimebaseAscPattern(); Integer pattern = dayplanDTO.getNTimebaseAscPattern();
if (pattern == 85){ if (pattern == 85) {
//黃闪 //黃闪
crossSectionPO.setControlMode(3); crossSectionPO.setControlMode(3);
}else { } else {
//定周期 //定周期
crossSectionPO.setControlMode(1); crossSectionPO.setControlMode(1);
} }
......
...@@ -2,6 +2,12 @@ package net.wanji.utc.hisense.util; ...@@ -2,6 +2,12 @@ package net.wanji.utc.hisense.util;
import cn.hutool.core.util.HexUtil; import cn.hutool.core.util.HexUtil;
import freemarker.template.utility.StringUtil; 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 * @author duanruiming
...@@ -120,8 +126,60 @@ public class CommonUtils { ...@@ -120,8 +126,60 @@ public class CommonUtils {
return dir; 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) { 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 { ...@@ -74,7 +74,7 @@ public class StaticInfoController {
}) })
public JsonViewObject schemePhaseLights(@RequestBody @Validated SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception { public JsonViewObject schemePhaseLights(@RequestBody @Validated SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception {
// 更新数据库 // 更新数据库
//staticInfoService.schemePhaseLights(schemePhaseLightsDTO); staticInfoService.schemePhaseLights(schemePhaseLightsDTO);
// 构造返回值 // 构造返回值
SchemePhaseLightsVO schemePhaseLightsVO = staticInfoService.buildSchemePhaseLightsResponse(schemePhaseLightsDTO); SchemePhaseLightsVO schemePhaseLightsVO = staticInfoService.buildSchemePhaseLightsResponse(schemePhaseLightsDTO);
JsonViewObject jsonViewObject = JsonViewObject.newInstance(); 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