Commit b6203261 authored by hanbing's avatar hanbing

获取方案信息逻辑修改

parent 4261c952
......@@ -2,20 +2,19 @@ package net.wanji.utc.entity.cache;
import lombok.Data;
import java.util.List;
/**
* @author Kent HAN
* @date 2022/11/18 9:12
*/
@Data
public class PhaseCache {
private Integer ringNo; // 环号
private Integer phaseNo; // 相位号
private String phaseName; // "北向进口通行"
private Integer phaseSequence; // 相位序
private Integer phaseLength; // 相位时间
private Integer schemeId; // 方案ID
private Integer phaseId; // 相位ID
private List<Integer> laneNoList; // 车道号列表
private Integer phaseNo; // 相位号
private String desc; // "北向进口通行"
private Integer yellow; // 黄灯时间
private Integer allred; // 红灯时间
private Integer greenFlash; // 绿闪时间
private Integer redFlash; // 红闪时间
private Integer minGreen; // 最小绿灯时间
private Integer maxGreen; // 最大绿灯时间
}
......@@ -10,9 +10,11 @@ import java.util.List;
* @date 2022/11/18 10:44
*/
public interface CrossPhaseMapper {
void deleteOne(@Param("crossId") String crossId, @Param("phaseNo") String phaseNo);
void deleteBatch(@Param("crossId") String crossId, @Param("schemeId") String schemeId);
void insertOne(CrossPhasePO crossPhasePO);
List<CrossPhasePO> selectByCrossIdAndPlanId(@Param("crossId") String crossId, @Param("planId") String planId);
List<Integer> selectIdsByPhaseNo(@Param("phaseNo") Integer phaseNo);
}
......@@ -16,6 +16,6 @@ public interface CrossSchemeMapper {
void deleteOne(@Param("crossId") String crossId, @Param("patternNo") String patternNo);
CrossSchemePO selectByCrossIdAndSchemeNo(@Param("crossId")String crossId,
@Param("schemeNo")Integer schemeNo);
CrossSchemePO selectByCrossIdAndSchemeNo(@Param("crossId") String crossId,
@Param("schemeNo") Integer schemeNo);
}
......@@ -5,15 +5,14 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import net.wanji.utc.common.commonentity.HttpRequest;
import net.wanji.utc.common.constant.Constants;
import net.wanji.utc.common.typeenum.*;
import net.wanji.utc.entity.cache.PhaseCache;
import net.wanji.utc.mapper.*;
import net.wanji.utc.po.*;
import net.wanji.utc.service.staticinfo.HkSchemePhaseLightsService;
import net.wanji.utc.util.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
......@@ -26,11 +25,6 @@ import java.util.*;
*/
@Service
public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsService {
// 相位信息缓存,key-相位号,value-相位信息对象
public static Map<Integer, PhaseCache> phaseCacheMap = new HashMap<>();
@Value("${signal.manufacturer.hk.artemisPath}")
private String artemisPath;
@Autowired
private ArtemisConfig artemisConfig;
@Autowired
......@@ -44,10 +38,13 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
@Override
public void hkSchemePhaseLights(String crossId, String crossCode) throws Exception {
List<CrossSchemePO> crossSchemePOList = new ArrayList<>();
// 请求3.1.3接口,获取并处理方案数据
Map<String, String> path = getPathMapByApiCode("uploadPatternCodeList");
// 匹配用缓存
Map<Integer, PhaseCache> phaseNoMap = new HashMap<>();
Map<Integer, PhaseCache> laneNoMap = new HashMap<>();
// 请求3.1.11接口,获取并缓存全量相位数据
handlePhaseData(crossCode, phaseNoMap, laneNoMap);
// 请求3.1.3接口,获取并处理方案列表
Map<String, String> path = PathUtil.getPathMapByApiCode("uploadPatternCodeList");
Map<String, String> queryMap = new HashMap<>();
queryMap.put("crossCode", crossCode);
String Result = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, null, queryMap,
......@@ -59,21 +56,16 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
JSONObject obj = data.getJSONObject(i);
Integer patternNo = obj.getInteger("patternNo");
String patternName = obj.getString("patternName");
// 请求3.1.4接口,获取并处理方案数据
handleSchemeData(crossId, crossCode, crossSchemePOList, patternNo, patternName);
handleSchemeData(crossId, crossCode, patternNo, patternName, phaseNoMap);
}
}
// 请求3.1.11接口,获取并处理相位数据
handlePhaseData(crossId, crossCode);
// 请求3.1.2接口,获取并处理灯组数据
List<CrossPhaseLightsPO> crossPhaseLightsPOList = handleLightsData(crossId, crossCode);
// 更新相位-灯组关系
crossPhaseLightsMapper.deleteByCrossId(crossId);
crossPhaseLightsMapper.insertBatch(crossPhaseLightsPOList);
handleLightsData(crossId, crossCode, laneNoMap);
}
private List<CrossPhaseLightsPO> handleLightsData(String crossId, String crossCode) throws Exception {
Map<String, String> path = getPathMapByApiCode("getCrossInfo");
private void handleLightsData(String crossId, String crossCode, Map<Integer, PhaseCache> laneNoMap)
throws Exception {
Map<String, String> path = PathUtil.getPathMapByApiCode("getCrossInfo");
List<CrossPhaseLightsPO> crossPhaseLightsPOList = new ArrayList<>();
JSONObject requestContent = new JSONObject();
// 海康固定入参字段名
......@@ -100,8 +92,8 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
CrossLightsPO crossLightsPO = new CrossLightsPO();
String lightsNo = laneObj.getString("channelNo");
crossLightsPO.setLightsNo(lightsNo);
String elementId = laneObj.getString("elementId");
crossLightsPO.setName(elementId);
String laneNo = laneObj.getString("laneNo");
crossLightsPO.setName(laneNo);
Integer lampGroupType = laneObj.getInteger("lampGroupType");
Integer type = HkLightsTypeEnum.getCodeByHkCode(lampGroupType);
crossLightsPO.setType(type);
......@@ -114,19 +106,19 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
crossLightsPO.setCrossId(crossId);
crossLightsPO.setInOutType(3); // 海康都是进出口
// 插入数据返回自增ID
crossLightsMapper.deleteOne(crossId, elementId);
crossLightsMapper.deleteOne(crossId, laneNo);
crossLightsMapper.insertOne(crossLightsPO);
Integer crossLightsPOId = crossLightsPO.getId();
// 匹配缓存信息,构造相位灯组关系对象列表
Integer laneNo = laneObj.getInteger("laneNo");
Collection<PhaseCache> phaseCaches = phaseCacheMap.values();
for (PhaseCache phaseCache : phaseCaches) {
List<Integer> laneNoList = phaseCache.getLaneNoList();
for (Integer laneNoInCache : laneNoList) {
if (Objects.equals(laneNo, laneNoInCache)) {
PhaseCache phaseCache = laneNoMap.get(Integer.parseInt(laneNo));
if (phaseCache != null) {
Integer phaseNo = phaseCache.getPhaseNo();
List<Integer> ids = crossPhaseMapper.selectIdsByPhaseNo(phaseNo);
if (ids != null) {
for (Integer id : ids) {
CrossPhaseLightsPO crossPhaseLightsPO = new CrossPhaseLightsPO();
crossPhaseLightsPO.setLightsId(crossLightsPOId);
crossPhaseLightsPO.setPhaseId(phaseCache.getPhaseId());
crossPhaseLightsPO.setPhaseId(id);
crossPhaseLightsPO.setCrossId(crossId);
crossPhaseLightsPOList.add(crossPhaseLightsPO);
}
......@@ -135,11 +127,14 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
}
}
}
return crossPhaseLightsPOList;
// 更新相位-灯组关系
crossPhaseLightsMapper.deleteByCrossId(crossId);
crossPhaseLightsMapper.insertBatch(crossPhaseLightsPOList);
}
private void handlePhaseData(String crossId, String crossCode) throws Exception {
Map<String, String> path = getPathMapByApiCode("getPhaseRlatLanes");
private void handlePhaseData(String crossCode, Map<Integer, PhaseCache> phaseNoMap,
Map<Integer, PhaseCache> laneNoMap) throws Exception {
Map<String, String> path = PathUtil.getPathMapByApiCode("getPhaseRlatLanes");
Map<String, String> queryMap = new HashMap<>();
queryMap.put("crossCode", crossCode);
String Result = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, null, queryMap,
......@@ -148,45 +143,43 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
if(Constants.HK_SUCCESS_CODE.equals(object.getInteger(Constants.HK_CODE_KEY))) {
JSONObject data = object.getJSONObject("data");
JSONArray list = data.getJSONArray("phaseList");
for (int k = 0; k < list.size(); k++) {
CrossPhasePO crossPhasePO = new CrossPhasePO();
JSONObject phase = list.getJSONObject(k);
Integer phaseNo = phase.getInteger("phaseNo");
// 从缓存中获取数据
PhaseCache phaseCache = phaseCacheMap.get(phaseNo);
crossPhasePO.setPhaseNo(phaseCache.getPhaseNo().toString());
crossPhasePO.setName(phaseCache.getPhaseName());
crossPhasePO.setSort(phaseCache.getPhaseSequence());
crossPhasePO.setCrossId(crossId);
crossPhasePO.setPlanId(phaseCache.getSchemeId());
crossPhasePO.setRingNo(phaseCache.getRingNo());
crossPhasePO.setControlMode(1); // 海康均为定周期
Integer phaseLength = phaseCache.getPhaseLength();
crossPhasePO.setPhaseTime(phaseLength);
for (int i = 0; i < list.size(); i++) {
PhaseCache phaseCache = new PhaseCache();
JSONObject phase = list.getJSONObject(i);
// 从接口返回对象中获取数据
Integer greenFlash = phase.getInteger("greenFlash");
crossPhasePO.setGreenFlashTime(greenFlash);
Integer phaseNo = phase.getInteger("phaseNo");
phaseCache.setPhaseNo(phaseNo);
String desc = phase.getString("desc");
phaseCache.setDesc(desc);
Integer yellow = phase.getInteger("yellow");
crossPhasePO.setYellowTime(yellow);
phaseCache.setYellow(yellow);
Integer allred = phase.getInteger("allred");
crossPhasePO.setRedTime(allred);
int green = phaseLength - greenFlash - yellow - allred;
crossPhasePO.setGreenTime(green);
phaseCache.setAllred(allred);
Integer greenFlash = phase.getInteger("greenFlash");
phaseCache.setGreenFlash(greenFlash);
Integer redFlash = phase.getInteger("redFlash");
phaseCache.setRedFlash(redFlash);
Integer minGreen = phase.getInteger("minGreen");
crossPhasePO.setMinGreenTime(minGreen);
phaseCache.setMinGreen(minGreen);
Integer maxGreen = phase.getInteger("maxGreen");
crossPhasePO.setMaxGreenTime(maxGreen);
// 插入数据返回自增ID,更新缓存
crossPhaseMapper.deleteOne(crossId, phaseNo.toString());
crossPhaseMapper.insertOne(crossPhasePO);
Integer crossPhasePOId = crossPhasePO.getId();
phaseCache.setPhaseId(crossPhasePOId);
phaseCache.setMaxGreen(maxGreen);
phaseNoMap.put(phaseNo, phaseCache);
// 构造车道Map
JSONArray lanes = phase.getJSONArray("lanes");
for (int j = 0; j < lanes.size(); j++) {
JSONObject lane = lanes.getJSONObject(j);
Integer laneNo = lane.getInteger("laneNo");
laneNoMap.put(laneNo, phaseCache);
}
}
}
}
private void handleSchemeData(String crossId, String crossCode, List<CrossSchemePO> crossSchemePOList, Integer patternNo, String patternName) throws Exception {
Map<String, String> path = getPathMapByApiCode("getCrossPlanDetail");
private void handleSchemeData(String crossId, String crossCode, Integer patternNo, String patternName,
Map<Integer, PhaseCache> phaseNoMap) throws Exception {
// 请求3.1.4接口,获取并处理方案详情
Map<String, String> path = PathUtil.getPathMapByApiCode("getCrossPlanDetail");
Map<String, String> queryMap = new HashMap<>();
queryMap.put("crossCode", crossCode);
queryMap.put("patternNo", patternNo.toString());
......@@ -195,11 +188,11 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
JSONObject object = JSON.parseObject(Result);
if(Constants.HK_SUCCESS_CODE.equals(object.getInteger(Constants.HK_CODE_KEY))) {
JSONArray data = object.getJSONArray("data");
for (int j = 0; j < data.size(); j++) {
JSONObject obj = data.getJSONObject(j);
Integer cycle = obj.getInteger("cycle");
Integer coordPhase = obj.getInteger("coordPhase");
Integer offset = obj.getInteger("offset");
for (int i = 0; i < data.size(); i++) {
JSONObject scheme = data.getJSONObject(i);
Integer cycle = scheme.getInteger("cycle");
Integer coordPhase = scheme.getInteger("coordPhase");
Integer offset = scheme.getInteger("offset");
// 构造数据库记录
CrossSchemePO crossSchemePO = new CrossSchemePO();
crossSchemePO.setSchemeNo(patternNo.toString());
......@@ -210,51 +203,50 @@ public class HkSchemePhaseLightsServiceImpl implements HkSchemePhaseLightsServic
crossSchemePO.setOffset(offset);
crossSchemePO.setSource(2);
crossSchemePO.setIsDeleted(0);
crossSchemePOList.add(crossSchemePO);
// 插入数据返回自增ID
// 插入方案数据返回自增ID
CrossSchemePO crossSchemePO1 = crossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, patternNo);
if (crossSchemePO1 != null) {
Integer schemeId = crossSchemePO1.getId();
crossPhaseMapper.deleteBatch(crossId, schemeId.toString());
crossSchemeMapper.deleteOne(crossId, patternNo.toString());
}
crossSchemeMapper.insertOne(crossSchemePO);
Integer schemePOId = crossSchemePO.getId();
// 缓存相位信息
putPhaseCache(obj, schemePOId);
}
}
}
private void putPhaseCache(JSONObject obj, Integer schemePOId) {
phaseCacheMap.clear();
JSONArray phases = obj.getJSONArray("phaseInfos");
for (int i = 0; i < phases.size(); i++) {
JSONObject phase = phases.getJSONObject(i);
PhaseCache phaseCache = new PhaseCache();
Integer ringNo = phase.getInteger("ringNo");
phaseCache.setRingNo(ringNo);
// 生成相位数据
JSONArray phases = scheme.getJSONArray("phaseInfos");
for (int j = 0; j < phases.size(); j++) {
CrossPhasePO crossPhasePO = new CrossPhasePO();
JSONObject phase = phases.getJSONObject(j);
Integer phaseNo = phase.getInteger("phaseNo");
phaseCache.setPhaseNo(phaseNo);
PhaseCache phaseCache = phaseNoMap.get(phaseNo);
crossPhasePO.setPhaseNo(phaseNo.toString());
String phaseName = phase.getString("phaseName");
phaseCache.setPhaseName(phaseName);
crossPhasePO.setName(phaseName);
Integer phaseSequence = phase.getInteger("phaseSequence");
phaseCache.setPhaseSequence(phaseSequence);
crossPhasePO.setSort(phaseSequence);
crossPhasePO.setCrossId(crossId);
crossPhasePO.setPlanId(schemePOId);
Integer ringNo = phase.getInteger("ringNo");
crossPhasePO.setRingNo(ringNo);
crossPhasePO.setControlMode(1); // 海康均为定周期
Integer phaseLength = phase.getInteger("phaseLength");
phaseCache.setPhaseLength(phaseLength);
phaseCache.setSchemeId(schemePOId);
// 获取车道列表
JSONArray lanes = phase.getJSONArray("lanes");
List<Integer> laneNoList = new ArrayList<>();
for (int j = 0; j < lanes.size(); j++) {
JSONObject lane = lanes.getJSONObject(j);
Integer laneNo = lane.getInteger("laneNo");
laneNoList.add(laneNo);
crossPhasePO.setPhaseTime(phaseLength);
Integer greenFlash = phaseCache.getGreenFlash();
Integer yellow = phaseCache.getYellow();
Integer allred = phaseCache.getAllred();
int green = phaseLength - greenFlash - yellow - allred;
crossPhasePO.setGreenTime(green);
crossPhasePO.setGreenFlashTime(greenFlash);
crossPhasePO.setYellowTime(yellow);
crossPhasePO.setRedTime(allred);
crossPhasePO.setMinGreenTime(phaseCache.getMinGreen());
crossPhasePO.setMaxGreenTime(phaseCache.getMaxGreen());
// 插入数据
crossPhaseMapper.insertOne(crossPhasePO);
}
phaseCache.setLaneNoList(laneNoList);
phaseCacheMap.put(phaseNo, phaseCache);
}
}
private Map<String, String> getPathMapByApiCode(String apiCode) {
Map<String, String> res = new HashMap<>();
HttpRequest httpRequest = new HttpRequest(BasicEnum.ManufacturerEnum.HK.getCode(), apiCode);
res.put("http://", artemisPath + httpRequest.getUrl());
return res;
}
}
......@@ -27,9 +27,9 @@
values (#{phaseNo},#{name},#{sort},#{crossId},#{planId},#{ringNo},#{controlMode},#{phaseTime},#{greenTime},#{greenFlashTime},#{pedFlashTime},#{yellowTime},#{redTime},#{minGreenTime},#{maxGreenTime})
</insert>
<delete id="deleteOne">
<delete id="deleteBatch">
delete from t_cross_phase
where cross_id = #{crossId} and phase_no = #{phaseNo}
where cross_id = #{crossId} and plan_id = #{schemeId}
</delete>
<sql id="baseColumn">
......@@ -43,4 +43,9 @@
from t_cross_phase where cross_id = #{crossId} and planId = #{planId}
</select>
<select id="selectIdsByPhaseNo" resultType="java.lang.Integer">
select id from t_cross_phase
where phase_no = #{phaseNo}
</select>
</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