Commit f1afad27 authored by wuxiaokai's avatar wuxiaokai

控制指令接口-相位配时下发

parent 473b1826
......@@ -10,14 +10,16 @@ import net.wanji.utc.mapper.CrossInfoMapper;
import net.wanji.utc.po.CrossInfoPO;
import net.wanji.utc.service.ControlCommandService;
import net.wanji.utc.util.ListUtil;
import net.wanji.utc.vo.PhaseLock;
import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.plansend.PlanSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import static net.wanji.utc.common.ResultEnum.BODY_NOT_MATCH;
......@@ -49,7 +51,9 @@ public class ControlCommandController {
@ApiOperation(value = "方案下发-基础方案下发", notes = "方案下发-基础方案下发")
@PostMapping("/schemeSend")
public <T> Result<T> schemeSend(@RequestParam String signalId, @RequestParam Integer command) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.allRedControl(signalId, null, null, command);
......@@ -59,6 +63,40 @@ public class ControlCommandController {
}
}
/**
* 相位配时下发
*
* @param signalId 信号id
* @param timePlans 配时方案实体类
* @return {@link Result}<{@link T}>
*/
@ApiOperation(value = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发", notes = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发")
@PostMapping("/phaseTimingSend")
public <T> Result<T> phaseTimingSend(@RequestParam String signalId, @RequestBody List<TimePlanVO> timePlans) {
if (mock) {
return Result.success();
}
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(signalId);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
if (ListUtil.isEmpty(timePlans)) {
throw new ControlException("参数错误,下发方案信息为空。");
}
//开启适配服务
for (TimePlanVO timePlanVo : timePlans) {
timePlanVo.setCode(crossInfoPo.getCode());
timePlanVo.setManufacturerAbbr(crossInfoPo.getManufacturerId() + "");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.phaseTimingSend(timePlans);
} else {
// todo else
return null;
}
}
/**
* 计划下发
*
......@@ -69,15 +107,17 @@ public class ControlCommandController {
@ApiOperation(value = "计划下发-计划信息、时段信息", notes = "计划下发-计划信息、时段信息")
@PostMapping("/planSend")
public <T> Result<T> planSend(@RequestParam String signalId, @RequestBody PlanSendVO planSendVO) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
try {
CrossInfoPO crossInfoPO = crossInfoMapper.selectByCode(signalId);
if (crossInfoPO == null) {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(signalId);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
planSendVO.setCode(crossInfoPO.getCode());
planSendVO.setManufacturerAbbr(crossInfoPO.getManufacturerId() + "");
Integer manufacturerId = crossInfoPO.getManufacturerId();
planSendVO.setCode(crossInfoPo.getCode());
planSendVO.setManufacturerAbbr(crossInfoPo.getManufacturerId() + "");
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.planSend(planSendVO);
} else {
......@@ -101,7 +141,9 @@ public class ControlCommandController {
@ApiOperation(value = "全红控制-路口全红控制/恢复", notes = "全红控制-路口全红控制/恢复")
@PostMapping("/allRedControl")
public <T> Result<T> allRedControl(@RequestParam String signalId, @RequestParam Integer command) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.allRedControl(signalId, null, null, command);
......@@ -121,7 +163,9 @@ public class ControlCommandController {
@ApiOperation(value = "黄闪控制-路口黄闪控制/恢复", notes = "黄闪控制-路口黄闪控制/恢复")
@PostMapping("/yellowLightControl")
public <T> Result<T> yellowLightControl(@RequestParam String signalId, @RequestParam Integer command) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.yellowLightControl(signalId, null, null, command);
......@@ -141,7 +185,9 @@ public class ControlCommandController {
@ApiOperation(value = "关灯控制-路口关灯控制/开灯", notes = "关灯控制-路口关灯控制/开灯")
@PostMapping("/closeLightControl")
public <T> Result<T> closeLightControl(@RequestParam String signalId, @RequestParam Integer command) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.closeLightControl(signalId, null, null, command);
......@@ -164,7 +210,9 @@ public class ControlCommandController {
public <T> Result<T> stepControl(@RequestParam String signalId,
@RequestParam Integer command,
@RequestParam int stepNum) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.stepControl(signalId, null, null, command, stepNum);
......@@ -183,7 +231,9 @@ public class ControlCommandController {
@ApiOperation(value = "恢复时间表-恢复路口时间表执行", notes = "恢复时间表-恢复路口时间表执行")
@PostMapping("/scheduleSend")
public <T> Result<T> scheduleSend(@RequestParam String signalId) {
if (mock) return Result.success();
if (mock) {
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.scheduleSend(signalId, null, null, null);
......@@ -201,7 +251,7 @@ public class ControlCommandController {
*/
@ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁")
@PostMapping("/lockControl")
public <T> Result<T> lockControl(@RequestParam String signalId, @RequestBody PhaseLock phaseLock) {
public <T> Result<T> lockControl(@RequestParam String signalId, @RequestBody PhaseLockVO phaseLock) {
if (mock) {
return Result.success();
}
......@@ -220,10 +270,10 @@ public class ControlCommandController {
}
private Integer check(String signalId) {
CrossInfoPO crossInfoPO = crossInfoMapper.selectByCode(signalId);
if (crossInfoPO == null) {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(signalId);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
return crossInfoPO.getManufacturerId();
return crossInfoPo.getManufacturerId();
}
}
package net.wanji.utc.service;
import net.wanji.utc.common.Result;
import net.wanji.utc.vo.PhaseLock;
import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.plansend.PlanSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import java.util.List;
......@@ -21,6 +22,10 @@ public interface ControlCommandService {
/**
* 计划下发
*
* @param planSendVO 计划下发VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
<T> Result<T> planSend(PlanSendVO planSendVO) throws Exception;
......@@ -32,11 +37,11 @@ public interface ControlCommandService {
/**
* 锁定控制
*
* @param signalId 信号机编号
* @param phaseLock 相位锁定实体类
* @param signalId 信号机编号
* @param phaseLock 相位锁定实体类
* @return {@link Result}<{@link T}>
*/
<T> Result<T> lockControl(String signalId, PhaseLock phaseLock) throws Exception;
<T> Result<T> lockControl(String signalId, PhaseLockVO phaseLock) throws Exception;
/**
* 步进控制
......@@ -96,8 +101,11 @@ public interface ControlCommandService {
/**
* 相位配时下发
*
* @param timePlans 批量下发的配时数据
* @return {@link Result}<{@link T}>
*/
<T> Result<T> phaseTimingSend();
<T> Result<T> phaseTimingSend(List<TimePlanVO> timePlans);
/**
* 相位差下发
......
......@@ -8,20 +8,21 @@ import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.common.constant.Constants;
import net.wanji.utc.common.exception.ControlException;
import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.entity.SignalRunring;
import net.wanji.utc.mapper.CrossPhaseMapper;
import net.wanji.utc.po.CrossPhasePO;
import net.wanji.utc.service.ControlCommandService;
import net.wanji.utc.service.HkGetSignalMethodService;
import net.wanji.utc.vo.PhaseLock;
import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.plansend.PlanSendVO;
import net.wanji.utc.vo.plansend.SectionPlan;
import net.wanji.utc.vo.plansend.TimeSlice;
import net.wanji.utc.vo.signal.SignalLightStateVo;
import net.wanji.utc.vo.signal.SignalRingVo;
import net.wanji.utc.vo.timeplan.Phase;
import net.wanji.utc.vo.timeplan.Ring;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
......@@ -68,7 +69,7 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
}
@Override
public <T> Result<T> lockControl(String signalId, PhaseLock phaseLock) throws Exception{
public <T> Result<T> lockControl(String signalId, PhaseLockVO phaseLock) throws Exception {
if (phaseLock.getCommand().equals(TRUE)) {
return updateManualLock(signalId, phaseLock.getLockTime());
} else {
......@@ -91,7 +92,6 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
* 控制命令为灯态锁定时,设置相关车道参数信息
*
* @param signalId, 信号机id
* @param obj
*/
private void setSignalControlLaneInfos(String signalId, JSONObject obj) throws Exception {
//获取当前运行方案的相位id
......@@ -140,7 +140,7 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
@Override
public <T> Result<T> stepControl(String signalId, String sourceType, String signalType, Integer command, Integer stepNum) {
if (command.equals(TRUE)) {
return updateManualStep(signalId, STEP_CONTROL, stepNum);
return updateManualStep(signalId, stepNum);
} else {
return controlSignal(signalId, CANCEL_STEP_CONTROL);
}
......@@ -170,8 +170,70 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
}
@Override
public <T> Result<T> phaseTimingSend() {
return null;
public <T> Result<T> phaseTimingSend(List<TimePlanVO> timePlans) {
try {
for (TimePlanVO timePlanVo : timePlans) {
if (!phaseTimingSend(timePlanVo)) {
//发送失败
log.error("批量下发配时方案信息到路口信号机或信号系统中异常!");
throw new ControlException("批量下发配时方案信息到路口信号机或信号系统中异常!");
}
//暂停1秒
Thread.sleep(1000);
}
return Result.success();
} catch (InterruptedException e) {
log.error("批量配时方案下发-->线程等待异常!{}", e.getMessage());
throw new ControlException("批量配时方案下发-->线程等待异常!");
}
}
private boolean phaseTimingSend(TimePlanVO timePlan) {
try {
//获取某一路口下海康相位和车道关系
Map<Integer, JSONArray> laneArrayMap = new HashMap<>();
getPhaseRelationLanes(timePlan.getCode(), laneArrayMap, new HashMap<>());
//拼接参数
JSONObject bodyObjectParam = new JSONObject();
JSONArray patternArrayParam = new JSONArray();
JSONObject patternObjectParam = new JSONObject();
patternObjectParam.put("patternNo", timePlan.getTimePlanId());
patternObjectParam.put("offSet", timePlan.getOffset());
patternObjectParam.put("cycle", timePlan.getCycleLen());
List<Ring> ringList = timePlan.getRings();
JSONArray ringsArrayParam = new JSONArray();
for (Ring ring : ringList) {
List<Phase> phaseList = ring.getPhases();
JSONArray phaseArrayParam = new JSONArray();
for (Phase phase : phaseList) {
JSONObject phaseObjectParam = new JSONObject();
phaseObjectParam.put("phaseNo", phase.getPhaseId());
phaseObjectParam.put("phaseName", phase.getPhaseName());
phaseObjectParam.put("phaseLength", phase.getPhaseTime());
phaseObjectParam.put("phaseSequence", phase.getPhaseOrderId());
//车道列表参数,适配海康车道参数
if (laneArrayMap.containsKey(Integer.valueOf(phase.getPhaseId()))) {
phaseObjectParam.put("lanes", laneArrayMap.get(Integer.valueOf(phase.getPhaseId())));
}
phaseArrayParam.add(phaseObjectParam);
}
JSONObject ringObjectParam = new JSONObject();
ringObjectParam.put("ringNo", ring.getRingNo());
ringObjectParam.put("phaseList", phaseArrayParam);
ringsArrayParam.add(ringObjectParam);
}
patternObjectParam.put("rings", ringsArrayParam);
patternArrayParam.add(patternObjectParam);
bodyObjectParam.put("crossCode", timePlan.getCode());
bodyObjectParam.put("patternList", patternArrayParam);
//获取下发配时方案的url
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, getPathMapByApiCode("updateTimePlans"), bodyObjectParam.toJSONString(), null, null, "application/json", null);
JSONObject object = JSON.parseObject(strResult);
return HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY));
} catch (Exception e) {
log.error("系统繁忙,服务器端内部错误!", e);
throw new ControlException("系统繁忙,服务器端内部错误!");
}
}
@Override
......@@ -179,10 +241,10 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
return null;
}
private <T> Result<T> updateManualStep(String signalId, Integer runningMode, Integer stepNum) {
private <T> Result<T> updateManualStep(String signalId, Integer stepNum) {
JSONObject bodyObjectParam = new JSONObject();
bodyObjectParam.put("crossCode", signalId);
bodyObjectParam.put("controlType", runningMode);
bodyObjectParam.put("controlType", STEP_CONTROL);
int controlNo = 0;
if (0 != stepNum) {
//根据当前实时灯态获取运行的相位
......
......@@ -11,8 +11,8 @@ import lombok.Data;
* @date 2022/11/15 15:05:57
*/
@Data
@ApiModel(value = "PhaseLock", description = "相位锁定实体类")
public class PhaseLock {
@ApiModel(value = "PhaseLockVO", description = "相位锁定实体类")
public class PhaseLockVO {
/**
* 相位编号
......
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author hfx
* @version 1.0
* Created on 2019/7/15 10:28
* @description: [固定灯色灯组方案下发]
*/
@Data
@ApiModel(value = "FixedLightGroupVo", description = "固定灯色灯组实体")
public class FixedLightGroupVo {
//灯组编号
@ApiModelProperty(value = "灯组编号,逗号分隔")
private String lightGroupNo;
//固定灯色
@ApiModelProperty(value = "固定灯色")
private Integer color;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @author hfx
* @version 1.0
* @Description: [行人方向]
* Created on 2019/4/19 17:20
*/
@Data
@ApiModel(value = "Pdirection", description = "行人方向")
public class Pdirection {
//方向
private Integer direction;
private Integer second;
private Integer inoutType;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author hfx
* @version 1.0
* @Description: [相位数据实体]
* Created on 2019/4/19 16:56
*/
@Data
@ApiModel(value = "Phase", description = "相位数据实体")
public class Phase {
//相位编号
@ApiModelProperty(value = "相位编号")
private String phaseId;
//相位名称
@ApiModelProperty(value = "相位名称")
private String phaseName;
//相位描述
@ApiModelProperty(value = "相位描述")
private String phaseDesc;
//相位顺序号
@ApiModelProperty(value = "相位顺序号")
private Integer phaseOrderId;
//原版本相位时长(绿信比)
@ApiModelProperty(value = "原版本相位时长(绿信比)")
private Integer originalTime;
//相位时长(绿信比)
@ApiModelProperty(value = "相位时长(绿信比)")
private Integer phaseTime;
//最大绿时间
@ApiModelProperty(value = "最大绿时间")
private Integer maxgreenTime;
//最小绿时间
@ApiModelProperty(value = "最小绿时间")
private Integer mingreenTime;
//灯组编号
@ApiModelProperty(value = "灯组编号")
private String lightGroupNo;
//黄灯时间
@ApiModelProperty(value = "黄灯时间")
private Integer yellowTime;
//红灯时间
@ApiModelProperty(value = "红灯时间")
private Integer redTime;
//所有跟随相位,相位编号
@ApiModelProperty(value = "所有跟随相位,相位编号")
private String[] followPhases;
//步数据对象列表
@ApiModelProperty(value = "步数据对象列表")
private List<Step> steps;
//机动车方向
@ApiModelProperty(value = "机动车方向")
private List<Vdirection> vdirections;
//行人方向
@ApiModelProperty(value = "行人方向")
private List<Pdirection> pdirections;
}
package net.wanji.utc.vo.timeplan;
import lombok.Data;
import java.util.List;
/**
* @author hfx
* @version 1.0
* @Description: [环数据对象]
* Created on 2019/4/22 15:54
*/
@Data
public class Ring {
//环编号
private String ringNo;
//相位对象列表
private List<Phase> phases;
}
package net.wanji.utc.vo.timeplan;
import lombok.Data;
/**
* @author hfx
* @version 1.0
* @Description: [步数据对象]
* Created on 2019/4/22 15:56
*/
@Data
public class Step {
//步号:1,2,3,4,5,6
private Integer stepNo;
//步类型:1 green 2 greenflash 3 pedflash 4 yellow 5 red 6 off
private Integer stepType;
//步长
private Integer stepLen;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import java.util.List;
/**
* @author hfx
* @version 1.0
* @Description: [配时方案实体类]
* Created on 2019/4/22 15:40
*/
@Data
@ApiModel(value = "TimePlanVo", description = "配时方案实体类")
public class TimePlanVO extends BaseCrossInfo {
//配时方案编号
@ApiModelProperty(value = "配时方案编号", required = true)
private String timePlanId;
//配时方案描述
@ApiModelProperty(value = "配时方案描述")
private String timePlanDesc;
//相位方案编号
@ApiModelProperty(value = "相位方案编号")
private String phasePlanId;
//周期长度
@ApiModelProperty(value = "周期长度")
private Integer cycleLen;
//协调相位编号
@ApiModelProperty(value = "协调相位编号")
private String coordPhaseId;
//相位差
@ApiModelProperty(value = "相位差")
private Integer offset;
//环数量 1 一环 2 两环
@ApiModelProperty(value = "环数量 1 一环 2 两环")
private String ringCount;
//环数据对象列表
@ApiModelProperty(value = "环数据对象列表")
private List<Ring> rings;
//始终固定灯色的灯组(可选)
@ApiModelProperty(value = "始终固定灯色的灯组(可选)")
private List<FixedLightGroupVo> fixedLightGroups;
//是否启用信号机自适应功能(可选,默认为 false)
@ApiModelProperty(value = "是否启用信号机自适应功能(可选,默认为 false)")
private Boolean selfAdaptive;
//操作类型 1:下发 2:恢复 3:下发返回300特殊处理 4:恢复返回300特殊处理
@ApiModelProperty(value = "操作类型 1:下发 2:恢复 3:下发返回300特殊处理 4:恢复返回300特殊处理")
private Integer optType;
//顺序号
@ApiModelProperty(value = "顺序号")
private Integer orderId;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @author hfx
* @version 1.0
* @Description: [机动车方向]
* Created on 2019/4/19 17:20
*/
@Data
@ApiModel(value = "Vdirection", description = "机动车方向")
public class Vdirection {
//方向, 方向:0 北 1 东北 2 东 3 东南 4 南 5 西南 6 西 7 西北
private Integer direction;
//车辆类型
private Integer turnType;
}
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