Commit 44654fad authored by wuxiaokai's avatar wuxiaokai

控制指令接口-优化

parent f1afad27
...@@ -23,13 +23,13 @@ public class HttpRequest { ...@@ -23,13 +23,13 @@ public class HttpRequest {
public HttpRequest(String manufacturerAbbr, String apiCode) { public HttpRequest(String manufacturerAbbr, String apiCode) {
// 获取请求地址 // 获取请求地址
ApiInfoPO apiInfoPO = Constants.getManufacturerUrlMap(manufacturerAbbr + ApiInfoPO apiInfoPo = Constants.getManufacturerUrlMap(manufacturerAbbr +
Constants.SEPARATOR_UNDER_LINE + apiCode); Constants.SEPARATOR_UNDER_LINE + apiCode);
if (apiInfoPO == null) { if (apiInfoPo == null) {
throw new NoSuchApiException("没有此接口信息,请在t_manufacturer_api_info表中添加"); throw new NoSuchApiException("没有此接口信息,请在t_manufacturer_api_info表中添加");
} }
url = apiInfoPO.getAddress(); url = apiInfoPo.getAddress();
httpMethod = HttpMethod.valueOf(apiInfoPO.getMethod()); httpMethod = HttpMethod.valueOf(apiInfoPo.getMethod());
headers = buildHeader(); headers = buildHeader();
} }
......
...@@ -4,25 +4,18 @@ import io.swagger.annotations.Api; ...@@ -4,25 +4,18 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result; import net.wanji.utc.common.Result;
import net.wanji.utc.common.exception.ControlException; import net.wanji.utc.service.control.ControlCommandService;
import net.wanji.utc.common.typeenum.BasicEnum;
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.PhaseLockVO; import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.plansend.PlanSendVO; import net.wanji.utc.vo.PlanSendVO;
import net.wanji.utc.vo.schedulesend.ScheduleSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO; import net.wanji.utc.vo.timeplan.TimePlanVO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List; import java.util.List;
import static net.wanji.utc.common.ResultEnum.BODY_NOT_MATCH; import static net.wanji.utc.common.constant.Constants.*;
/** /**
* 控制指令接口 * 控制指令接口
...@@ -39,241 +32,139 @@ public class ControlCommandController { ...@@ -39,241 +32,139 @@ public class ControlCommandController {
@Value("${signal.mock}") @Value("${signal.mock}")
private boolean mock; private boolean mock;
@Resource
private CrossInfoMapper crossInfoMapper;
@Autowired @Autowired
private ControlCommandService hkControlCommandService; private ControlCommandService hkControlCommandService;
/** /**
* 信号机方案下发
* *
* @param planSendVO 方案下发VO
* @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "方案下发-基础方案下发", notes = "方案下发-基础方案下发") @ApiOperation(value = "方案下发-基础方案下发", notes = "方案下发-基础方案下发")
@PostMapping("/schemeSend") @PostMapping("/schemeSend")
public <T> Result<T> schemeSend(@RequestParam String signalId, @RequestParam Integer command) { public <T> Result<T> schemeSend(@RequestBody PlanSendVO planSendVO) throws Exception {
if (mock) { return hkControlCommandService.planSend(planSendVO);
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.allRedControl(signalId, null, null, command);
} else {
// todo else
return null;
}
} }
/** /**
* 相位配时下发 * todo
* 相位配时下发?
* 下发信号机方案?
* *
* @param signalId 信号id * @param code 信号机id
* @param timePlans 配时方案实体类 * @param timePlans 配时方案实体类
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常
*/ */
@ApiOperation(value = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发", notes = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发") @ApiOperation(value = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发", notes = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发")
@PostMapping("/phaseTimingSend") @PostMapping("/phaseTimingSend")
public <T> Result<T> phaseTimingSend(@RequestParam String signalId, @RequestBody List<TimePlanVO> timePlans) { public <T> Result<T> phaseTimingSend(@RequestParam String code, @RequestBody List<TimePlanVO> timePlans) throws InterruptedException {
if (mock) { return hkControlCommandService.phaseTimingSend(code, timePlans);
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;
}
} }
/** /**
* 计划下发 * 下发信号机计划
* *
* @param signalId 信号id
* @param planSendVO 计划下发VO * @param planSendVO 计划下发VO
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "计划下发-计划信息、时段信息", notes = "计划下发-计划信息、时段信息") @ApiOperation(value = "计划下发-计划信息、时段信息", notes = "计划下发-计划信息、时段信息")
@PostMapping("/planSend") @PostMapping("/planSend")
public <T> Result<T> planSend(@RequestParam String signalId, @RequestBody PlanSendVO planSendVO) { public <T> Result<T> planSend(@RequestBody PlanSendVO planSendVO) throws Exception {
if (mock) {
return Result.success();
}
try {
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();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.planSend(planSendVO); return hkControlCommandService.planSend(planSendVO);
} else {
// todo else
return null;
}
} catch (Exception ex) {
log.error("计划下发-计划信息、时段信息异常:{}", ex.getMessage());
throw new ControlException("计划下发-计划信息、时段信息异常");
}
} }
/** /**
* 全红控制 * 全红控制
* *
* @param signalId 信号机id * @param code 信号机id
* @param command 指令 * @param command 指令
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "全红控制-路口全红控制/恢复", notes = "全红控制-路口全红控制/恢复") @ApiOperation(value = "全红控制-路口全红控制/恢复", notes = "全红控制-路口全红控制/恢复")
@PostMapping("/allRedControl") @PostMapping("/allRedControl")
public <T> Result<T> allRedControl(@RequestParam String signalId, @RequestParam Integer command) { public <T> Result<T> allRedControl(@RequestParam String code, @RequestParam Integer command) throws Exception {
if (mock) { return hkControlCommandService.setSignalControl(code, command, ALL_RED_CONTROL);
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.allRedControl(signalId, null, null, command);
} else {
// todo else
return null;
}
} }
/** /**
* 黄闪控制 * 黄闪控制
* *
* @param signalId 信号id * @param code 信号id
* @param command 命令 * @param command 命令
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "黄闪控制-路口黄闪控制/恢复", notes = "黄闪控制-路口黄闪控制/恢复") @ApiOperation(value = "黄闪控制-路口黄闪控制/恢复", notes = "黄闪控制-路口黄闪控制/恢复")
@PostMapping("/yellowLightControl") @PostMapping("/yellowLightControl")
public <T> Result<T> yellowLightControl(@RequestParam String signalId, @RequestParam Integer command) { public <T> Result<T> yellowLightControl(@RequestParam String code, @RequestParam Integer command) throws Exception {
if (mock) { return hkControlCommandService.setSignalControl(code, command, YELLOW_LIGHT_CONTROL);
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.yellowLightControl(signalId, null, null, command);
} else {
// todo else
return null;
}
} }
/** /**
* 关灯控制 * 关灯控制
* *
* @param signalId 信号id * @param code 信号id
* @param command 命令 * @param command 命令
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "关灯控制-路口关灯控制/开灯", notes = "关灯控制-路口关灯控制/开灯") @ApiOperation(value = "关灯控制-路口关灯控制/开灯", notes = "关灯控制-路口关灯控制/开灯")
@PostMapping("/closeLightControl") @PostMapping("/closeLightControl")
public <T> Result<T> closeLightControl(@RequestParam String signalId, @RequestParam Integer command) { public <T> Result<T> closeLightControl(@RequestParam String code, @RequestParam Integer command) throws Exception {
if (mock) { return hkControlCommandService.setSignalControl(code, command, CLOSE_LIGHT_CONTROL);
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.closeLightControl(signalId, null, null, command);
} else {
// todo else
return null;
}
} }
/** /**
* 步进控制 * 步进控制
* *
* @param signalId 信号id * @param code 信号id
* @param command 命令 * @param command 命令
* @param stepNum 一步num * @param stepNum 一步num
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "步进控制-步进控制/恢复", notes = "步进控制-步进控制/恢复") @ApiOperation(value = "步进控制-步进控制/恢复", notes = "步进控制-步进控制/恢复")
@PostMapping("/stepControl") @PostMapping("/stepControl")
public <T> Result<T> stepControl(@RequestParam String signalId, public <T> Result<T> stepControl(@RequestParam String code,
@RequestParam Integer command, @RequestParam Integer command,
@RequestParam int stepNum) { @RequestParam int stepNum) throws Exception {
if (mock) { return hkControlCommandService.stepControl(code, command, stepNum);
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.stepControl(signalId, null, null, command, stepNum);
} else {
// todo else
return null;
}
} }
/** /**
* 恢复时间表 * 恢复时间表
* *
* @param signalId 信号id * @param code 信号id
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
@ApiOperation(value = "恢复时间表-恢复路口时间表执行", notes = "恢复时间表-恢复路口时间表执行") @ApiOperation(value = "恢复时间表-恢复路口时间表执行", notes = "恢复时间表-恢复路口时间表执行")
@PostMapping("/scheduleSend") @PostMapping("/recoverSchedule")
public <T> Result<T> scheduleSend(@RequestParam String signalId) { public <T> Result<T> recoverSchedule(@RequestParam String code) throws Exception {
if (mock) { return hkControlCommandService.recoverSchedule(code);
return Result.success();
}
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.scheduleSend(signalId, null, null, null);
} else {
// todo else
return null;
} }
/**
* 时间表下发
*
* @param scheduleSendVO 时间表下发VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
@ApiOperation(value = "时间表下发-时间表信息", notes = "时间表下发-时间表信息")
@PostMapping("/scheduleSend")
public <T> Result<T> scheduleSend(@RequestBody ScheduleSendVO scheduleSendVO) throws Exception {
return hkControlCommandService.scheduleSend(scheduleSendVO);
} }
/** /**
* 锁定控制 * 锁定控制
* *
* @param signalId 信号id * @param phaseLock 相位锁定实体类
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws Exception 异常
*/ */
@ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁") @ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁")
@PostMapping("/lockControl") @PostMapping("/lockControl")
public <T> Result<T> lockControl(@RequestParam String signalId, @RequestBody PhaseLockVO phaseLock) { public <T> Result<T> lockControl(@RequestBody PhaseLockVO phaseLock) throws Exception {
if (mock) { return hkControlCommandService.lockControl(phaseLock);
return Result.success();
}
try {
Integer manufacturerId = check(signalId);
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return hkControlCommandService.lockControl(signalId, phaseLock);
} else {
// todo else
return null;
}
} catch (Exception ex) {
log.error("锁定控制-相位锁定/解锁异常:{}", ex.getMessage());
throw new ControlException("锁定控制-相位锁定/解锁异常");
}
}
private Integer check(String signalId) {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(signalId);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
return crossInfoPo.getManufacturerId();
} }
} }
package net.wanji.utc.service;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.vo.signal.SignalLightStateVo;
import java.util.List;
/**
* @author meng.wang
* @version 1.0
* Created on 2020/09/10
* @description: [海康信号灯厂商接口service]
*/
public interface HkGetSignalMethodService {
/**
* @description: 获取路口信号机的实时灯态数据
* @param baseSignals 信号机列表
* @return SignalInfoVo 信号机状态
* @author meng.wang
* @date 2020/09/10
*/
List<SignalLightStateVo> queryHkSignalInfo(List<BaseCrossInfo> baseSignals);
}
package net.wanji.utc.service; package net.wanji.utc.service.control;
import net.wanji.utc.common.Result; import net.wanji.utc.common.Result;
import net.wanji.utc.vo.PhaseLockVO; import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.plansend.PlanSendVO; import net.wanji.utc.vo.PlanSendVO;
import net.wanji.utc.vo.schedulesend.ScheduleSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO; import net.wanji.utc.vo.timeplan.TimePlanVO;
import java.util.List; import java.util.List;
...@@ -25,87 +26,65 @@ public interface ControlCommandService { ...@@ -25,87 +26,65 @@ public interface ControlCommandService {
* *
* @param planSendVO 计划下发VO * @param planSendVO 计划下发VO
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws Exception 异常
*/ */
<T> Result<T> planSend(PlanSendVO planSendVO) throws Exception; <T> Result<T> planSend(PlanSendVO planSendVO) throws Exception;
/** /**
* 时间表下发 * 时间表下发
*
* @param scheduleSendVO 时间表下发VO
* @return {@link Result}<{@link T}>
*/ */
<T> Result<T> scheduleSend(String signalId, String sourceType, String signalType, Integer command); <T> Result<T> scheduleSend(ScheduleSendVO scheduleSendVO) throws Exception;
/** /**
* 锁定控制 * 锁定控制
* *
* @param signalId 信号机编号
* @param phaseLock 相位锁定实体类 * @param phaseLock 相位锁定实体类
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws Exception 异常
*/ */
<T> Result<T> lockControl(String signalId, PhaseLockVO phaseLock) throws Exception; <T> Result<T> lockControl(PhaseLockVO phaseLock) throws Exception;
/** /**
* 步进控制 * 步进控制
* *
* @param signalId 信号机编号 * @param code 信号机编号
* @param sourceType 厂家简称 QS/SCATS/HS/HK
* @param signalType 信号机类型 QS/SCATS/HS/HK
* @param command 1 开始步进 0 取消步进 * @param command 1 开始步进 0 取消步进
* @param stepNum 0 顺序步进 n 跳过n个相位 * @param stepNum 0 顺序步进 n 跳过n个相位
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws Exception 异常
*/ */
<T> Result<T> stepControl(String signalId, String sourceType, String signalType, Integer command, Integer stepNum); <T> Result<T> stepControl(String code, Integer command, Integer stepNum) throws Exception;
/**
* 全红控制
*
* @param signalId 信号机编号
* @param sourceType 厂家简称
* @param signalType 信号机类型
* @param command 1 全红控制 0 取消全红
* @return {@link Result}<{@link T}>
*/
<T> Result<T> allRedControl(String signalId, String sourceType, String signalType, Integer command);
/**
* 黄闪控制
*
* @param signalId 信号机编号
* @param sourceType 厂家简称
* @param signalType 信号机类型
* @param command 1 黄闪控制 0 取消黄闪
* @return {@link Result}<{@link T}>
*/
<T> Result<T> yellowLightControl(String signalId, String sourceType, String signalType, Integer command);
/** /**
* 关灯控制 * 设置信号机控制模式
* *
* @param signalId 信号机编号 * @param code 信号机编号
* @param sourceType 厂家简称 * @param command 指令 1 开 0 关
* @param signalType 信号机类型 * @param commandType 命令类型
* @param command 1 开灯 0 关灯
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws Exception 异常
*/ */
<T> Result<T> closeLightControl(String signalId, String sourceType, String signalType, Integer command); <T> Result<T> setSignalControl(String code, Integer command, Integer commandType) throws Exception;
/** /**
* 恢复时间表 * 恢复时间表
* *
* @param signalId 信号机编号 * @param code 信号机编号
* @param sourceType 厂家简称 QS/SCATS/HS/HK
* @param signalType 信号机类型 QS/SCATS/HS/HK
* @param command 1 恢复
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
*/ */
<T> Result<T> recoverSchedule(String signalId, String sourceType, String signalType, Integer command); <T> Result<T> recoverSchedule(String code) throws Exception;
/** /**
* 相位配时下发 * 相位配时下发
* *
* @param code 信号机id
* @param timePlans 批量下发的配时数据 * @param timePlans 批量下发的配时数据
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常
*/ */
<T> Result<T> phaseTimingSend(List<TimePlanVO> timePlans); <T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws InterruptedException;
/** /**
* 相位差下发 * 相位差下发
......
...@@ -10,16 +10,19 @@ import net.wanji.utc.common.Result; ...@@ -10,16 +10,19 @@ import net.wanji.utc.common.Result;
import net.wanji.utc.common.baseentity.BaseCrossInfo; import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.common.exception.ControlException; import net.wanji.utc.common.exception.ControlException;
import net.wanji.utc.common.typeenum.BasicEnum; import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.entity.SignalRunring;
import net.wanji.utc.mapper.CrossInfoMapper;
import net.wanji.utc.mapper.CrossPhaseMapper; import net.wanji.utc.mapper.CrossPhaseMapper;
import net.wanji.utc.po.CrossInfoPO;
import net.wanji.utc.po.CrossPhasePO; import net.wanji.utc.po.CrossPhasePO;
import net.wanji.utc.service.ControlCommandService; import net.wanji.utc.service.control.ControlCommandService;
import net.wanji.utc.service.HkGetSignalMethodService; import net.wanji.utc.service.runninginfo.HkLightsStatusService;
import net.wanji.utc.util.FieldUtil;
import net.wanji.utc.util.ListUtil;
import net.wanji.utc.vo.LightsStatusVO;
import net.wanji.utc.vo.PhaseLockVO; import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.plansend.PlanSendVO; import net.wanji.utc.vo.PlanSendVO;
import net.wanji.utc.vo.plansend.SectionPlan; import net.wanji.utc.vo.schedulesend.ScheduleSendVO;
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.Phase;
import net.wanji.utc.vo.timeplan.Ring; import net.wanji.utc.vo.timeplan.Ring;
import net.wanji.utc.vo.timeplan.TimePlanVO; import net.wanji.utc.vo.timeplan.TimePlanVO;
...@@ -29,6 +32,7 @@ import javax.annotation.Resource; ...@@ -29,6 +32,7 @@ import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static net.wanji.utc.common.ResultEnum.BODY_NOT_MATCH;
import static net.wanji.utc.common.constant.Constants.*; import static net.wanji.utc.common.constant.Constants.*;
/** /**
...@@ -40,7 +44,7 @@ import static net.wanji.utc.common.constant.Constants.*; ...@@ -40,7 +44,7 @@ import static net.wanji.utc.common.constant.Constants.*;
public class HKControlCommandServiceImpl implements ControlCommandService { public class HKControlCommandServiceImpl implements ControlCommandService {
@Resource @Resource
private HkGetSignalMethodService hkGetSignalMethodService; private HkLightsStatusService hkLightsStatusService;
@Resource @Resource
private ArtemisConfig artemisConfig; private ArtemisConfig artemisConfig;
...@@ -48,6 +52,9 @@ public class HKControlCommandServiceImpl implements ControlCommandService { ...@@ -48,6 +52,9 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
@Resource @Resource
private CrossPhaseMapper crossPhaseMapper; private CrossPhaseMapper crossPhaseMapper;
@Resource
private CrossInfoMapper crossInfoMapper;
@Override @Override
public <T> Result<T> schemeSend() { public <T> Result<T> schemeSend() {
return null; return null;
...@@ -55,54 +62,170 @@ public class HKControlCommandServiceImpl implements ControlCommandService { ...@@ -55,54 +62,170 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
@Override @Override
public <T> Result<T> planSend(PlanSendVO planSendVO) throws Exception { public <T> Result<T> planSend(PlanSendVO planSendVO) throws Exception {
if (sendPlanInfo(planSendVO)) { CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(planSendVO.getCode());
if (sendTimeInfo(planSendVO)) { if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
// 厂商ID
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
Map<String, Object> fieldMap = FieldUtil.fieldMethod(planSendVO);
// 下发时段方案
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
getPathMapByApiCode("downloadTimeSpands"),
JSON.toJSONString(fieldMap), null, null, "application/json", null);
JSONObject obj = JSON.parseObject(strResult);
if (obj.getInteger(HK_CODE_KEY).equals(HK_SUCCESS_CODE)) {
return Result.success(); return Result.success();
} }
}
return Result.error("下发指令失败"); return Result.error("下发指令失败");
} else {
// todo else
return null;
}
} }
@Override @Override
public <T> Result<T> scheduleSend(String signalId, String sourceType, String signalType, Integer command) { public <T> Result<T> scheduleSend(ScheduleSendVO param) throws Exception {
return controlSignal(signalId, NORMAL_RUNNING_CONTROL); CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(param.getCode());
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
param.setManufacturerAbbr(String.valueOf(manufacturerId));
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return downloadSchedule(param);
} else {
// todo else
return null;
}
}
private <T> Result<T> downloadSchedule(ScheduleSendVO param) throws Exception {
JSONArray jsonBody = new JSONArray();
jsonBody.add(param.getCode());
// 通过获取当前运行的日期数据,获取最新的日期方案id
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
getPathMapByApiCode("uploadDate"),
jsonBody.toString(), null, null, "application/json", null);
JSONObject obj = JSON.parseObject(strResult);
//日期 id
int id = 0;
if (obj.getInteger(HK_CODE_KEY).equals(HK_SUCCESS_CODE)) {
// 获取日期列表
JSONArray schedulesArray = obj.getJSONArray("data").getJSONObject(0).getJSONArray("schedules");
JSONObject scheduleObj = schedulesArray.getJSONObject(schedulesArray.size() - 1);
id = scheduleObj.getInteger("id");
}
//拼接参数
JSONArray schedulesArrayParam = new JSONArray();
// 获取传入的星期数组
JSONArray weeks = JSON.parseArray(JSON.toJSONString(param.getWeeks()));
// 获取传入的特殊日期数组
JSONArray specialDays = JSON.parseArray(JSON.toJSONString(param.getSpecialDays()));
if (null != weeks) {
//去重,获取所有的运行方案号
Set<String> set = new HashSet<>();
for (int i = 0; i < weeks.size(); i++) {
String sectionPlanId = weeks.getJSONObject(i).getString("sectionplanid");
set.add(sectionPlanId);
}
if (null != specialDays) {
for (int i = 0; i < specialDays.size(); i++) {
String sectionPlanId = specialDays.getJSONObject(i).getString("sectionplanid");
set.add(sectionPlanId);
}
}
int num = 0;
for (String planNo : set) {
JSONObject schedulesObjectParam = new JSONObject();
List<Integer> weeksListParam = new ArrayList<>();
// 遍历星期列表,拼接星期集合参数
for (int i = 0; i < weeks.size(); i++) {
JSONObject week = weeks.getJSONObject(i);
String weekNum = week.getString("weeknum");
String sectionplanid = week.getString("sectionplanid");
if (planNo.equals(sectionplanid)) {
weeksListParam.add(Integer.valueOf(weekNum));
}
}
// 遍历特殊日期列表,拼接特殊日期集合参数
if (null != specialDays) {
List<String> specialDaysListParam = new ArrayList<>();
for (int i = 0; i < specialDays.size(); i++) {
JSONObject specialDay = specialDays.getJSONObject(i);
String datestr = specialDay.getString("datestr");
String sectionplanid = specialDay.getString("sectionplanid");
if (planNo.equals(sectionplanid)) {
specialDaysListParam.add(datestr);
}
}
schedulesObjectParam.put("dates", specialDaysListParam);
//0 说明 dates 内的日期是日期集合,1 说明是dates 内的数据是日期范围
schedulesObjectParam.put("isPeriod", 0);
}
//scheduleNo 日期号 ,支持返回【1~128】
if (id + set.size() > 128) {
schedulesObjectParam.put("scheduleNo", 128 - set.size() - (++num));
} else {
schedulesObjectParam.put("scheduleNo", id + (++num));
}
schedulesObjectParam.put("planNo", planNo);
schedulesObjectParam.put("weeks", weeksListParam);
schedulesArrayParam.add(schedulesObjectParam);
}
}
JSONObject bodyObjectParam = new JSONObject();
bodyObjectParam.put("crossCode", param.getCode());
bodyObjectParam.put("schedules", schedulesArrayParam);
// 下发路口运行计划方案
String updateResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
getPathMapByApiCode("downloadSchedule"),
bodyObjectParam.toJSONString(), null, null, "application/json", null);
JSONObject updateObject = JSON.parseObject(updateResult);
if (updateObject.getInteger(HK_CODE_KEY).equals(HK_SUCCESS_CODE)) {
return Result.success();
}
return Result.error("下发指令失败");
} }
@Override @Override
public <T> Result<T> lockControl(String signalId, PhaseLockVO phaseLock) throws Exception { public <T> Result<T> lockControl(PhaseLockVO phaseLock) throws Exception {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(phaseLock.getCode());
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
if (phaseLock.getCommand().equals(TRUE)) { if (phaseLock.getCommand().equals(TRUE)) {
return updateManualLock(signalId, phaseLock.getLockTime()); return updateManualLock(phaseLock.getCode(), phaseLock.getLockTime());
} else { } else {
return controlSignal(signalId, UNLOCK_RUNNING_CONTROL); return controlSignal(phaseLock.getCode(), UNLOCK_RUNNING_CONTROL);
} }
} else {
// todo else
return null;
} }
private <T> Result<T> updateManualLock(String signalId, Integer lockTime) throws Exception {
JSONObject param = new JSONObject();
param.put("crossCode", signalId);
param.put("controlType", LOCK_RUNNING_CONTROL);
setSignalControlLaneInfos(signalId, param);
param.put("controlNo", 0);
//控制时长,单位 s,0 则持续控制
param.put("duration", lockTime * 60);
return setSignalControl(param);
} }
/** private <T> Result<T> updateManualLock(String code, Integer lockTime) throws Exception {
* 控制命令为灯态锁定时,设置相关车道参数信息 Map<String, Object> param = new HashMap<String, Object>() {{
* put("crossCode", code);
* @param signalId, 信号机id put("controlType", LOCK_RUNNING_CONTROL);
*/ }};
private void setSignalControlLaneInfos(String signalId, JSONObject obj) throws Exception { // 控制命令为灯态锁定时,设置相关车道参数信息
//获取当前运行方案的相位id // 获取当前运行方案的相位id
List<SignalLightStateVo> signalInfos = getSignalInfoVos(signalId); List<SignalRunring> runrings = getSignalInfoVos(code).get(0).getRunrings();
List<SignalRingVo> runrings = signalInfos.get(0).getRings();
//HK 为单环 //HK 为单环
Integer phaseId = Integer.valueOf(runrings.get(0).getPhaseId()); Integer phaseId = Integer.valueOf(runrings.get(0).getPhaseId());
//获取某一路口下海康相位和车道关系 //获取某一路口下海康相位和车道关系
Map<Integer, JSONArray> laneArrayMap = new HashMap<>(); Map<Integer, JSONArray> laneArrayMap = new HashMap<>();
getPhaseRelationLanes(signalId, laneArrayMap, new HashMap<>()); getPhaseRelationLanes(code, laneArrayMap, new HashMap<>());
obj.put("laneInfos", laneArrayMap.get(phaseId)); param.put("laneInfos", laneArrayMap.get(phaseId));
param.put("controlNo", 0);
//控制时长,单位 s,0 则持续控制
param.put("duration", lockTime * 60);
return setSignalControl(param);
} }
/** /**
...@@ -127,64 +250,97 @@ public class HKControlCommandServiceImpl implements ControlCommandService { ...@@ -127,64 +250,97 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
JSONArray laneList = lanesObject.getJSONArray("lanes"); JSONArray laneList = lanesObject.getJSONArray("lanes");
// 存入相位与车道集合 // 存入相位与车道集合
laneArrayMap.put(phaseNo, laneList); laneArrayMap.put(phaseNo, laneList);
for (int j = 0; j < laneList.size(); j++) { /*for (int j = 0; j < laneList.size(); j++) {
JSONObject laneObject = laneList.getJSONObject(j); JSONObject laneObject = laneList.getJSONObject(j);
String key = laneObject.getString("direction") + SEPARATOR_UNDER_LINE + laneObject.getString("turn"); String key = laneObject.getString("direction") + SEPARATOR_UNDER_LINE + laneObject.getString("turn");
// 存入方向和转向对应的车道编号 // 存入方向和转向对应的车道编号
laneNoMap.put(key, laneObject.getInteger("laneNo")); laneNoMap.put(key, laneObject.getInteger("laneNo"));
} }*/
} }
} }
} }
@Override @Override
public <T> Result<T> stepControl(String signalId, String sourceType, String signalType, Integer command, Integer stepNum) { public <T> Result<T> stepControl(String code, Integer command, Integer stepNum) throws Exception {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(code);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
if (command.equals(TRUE)) { if (command.equals(TRUE)) {
return updateManualStep(signalId, stepNum); return updateManualStep(code, stepNum);
} else { } else {
return controlSignal(signalId, CANCEL_STEP_CONTROL); return controlSignal(code, CANCEL_STEP_CONTROL);
} }
} else {
// todo else
return null;
} }
@Override
public <T> Result<T> allRedControl(String signalId, String sourceType, String signalType, Integer command) {
Integer runningMode = command.equals(TRUE) ? ALL_RED_CONTROL : NORMAL_RUNNING_CONTROL;
return controlSignal(signalId, runningMode);
} }
@Override @Override
public <T> Result<T> yellowLightControl(String signalId, String sourceType, String signalType, Integer command) { public <T> Result<T> setSignalControl(String code, Integer command, Integer commandType) throws Exception {
Integer runningMode = command.equals(TRUE) ? YELLOW_LIGHT_CONTROL : NORMAL_RUNNING_CONTROL; CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(code);
return controlSignal(signalId, runningMode); if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
Integer runningMode = command.equals(TRUE) ? commandType : NORMAL_RUNNING_CONTROL;
return controlSignal(code, runningMode);
} else {
// todo else
return null;
} }
@Override
public <T> Result<T> closeLightControl(String signalId, String sourceType, String signalType, Integer command) {
Integer runningMode = command.equals(TRUE) ? CLOSE_LIGHT_CONTROL : NORMAL_RUNNING_CONTROL;
return controlSignal(signalId, runningMode);
} }
@Override @Override
public <T> Result<T> recoverSchedule(String signalId, String sourceType, String signalType, Integer command) { public <T> Result<T> recoverSchedule(String code) throws Exception {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(code);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return controlSignal(code, NORMAL_RUNNING_CONTROL);
} else {
// todo else
return null; return null;
} }
}
@Override @Override
public <T> Result<T> phaseTimingSend(List<TimePlanVO> timePlans) { public <T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws InterruptedException {
try { CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(code);
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())) {
for (TimePlanVO timePlanVo : timePlans) { for (TimePlanVO timePlanVo : timePlans) {
if (!phaseTimingSend(timePlanVo)) { if (!phaseTimingSend(timePlanVo)) {
//发送失败 //发送失败
log.error("批量下发配时方案信息到路口信号机或信号系统中异常!"); log.error("批量下发配时方案信息到路口信号机或信号系统中异常!");
throw new ControlException("批量下发配时方案信息到路口信号机或信号系统中异常!"); throw new ControlException("批量下发配时方案信息到路口信号机或信号系统中异常!");
} }
if (timePlans.size() > 1) {
//暂停1秒 //暂停1秒
Thread.sleep(1000); Thread.sleep(1000);
} }
}
return Result.success(); return Result.success();
} catch (InterruptedException e) { } else {
log.error("批量配时方案下发-->线程等待异常!{}", e.getMessage()); // todo else
throw new ControlException("批量配时方案下发-->线程等待异常!"); return null;
} }
} }
...@@ -227,9 +383,11 @@ public class HKControlCommandServiceImpl implements ControlCommandService { ...@@ -227,9 +383,11 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
bodyObjectParam.put("crossCode", timePlan.getCode()); bodyObjectParam.put("crossCode", timePlan.getCode());
bodyObjectParam.put("patternList", patternArrayParam); bodyObjectParam.put("patternList", patternArrayParam);
//获取下发配时方案的url //获取下发配时方案的url
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, getPathMapByApiCode("updateTimePlans"), bodyObjectParam.toJSONString(), null, null, "application/json", null); String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
JSONObject object = JSON.parseObject(strResult); getPathMapByApiCode("updateTimePlans"),
return HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY)); bodyObjectParam.toJSONString(), null, null, "application/json", null);
JSONObject obj = JSON.parseObject(strResult);
return HK_SUCCESS_CODE.equals(obj.getInteger(HK_CODE_KEY));
} catch (Exception e) { } catch (Exception e) {
log.error("系统繁忙,服务器端内部错误!", e); log.error("系统繁忙,服务器端内部错误!", e);
throw new ControlException("系统繁忙,服务器端内部错误!"); throw new ControlException("系统繁忙,服务器端内部错误!");
...@@ -248,12 +406,11 @@ public class HKControlCommandServiceImpl implements ControlCommandService { ...@@ -248,12 +406,11 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
int controlNo = 0; int controlNo = 0;
if (0 != stepNum) { if (0 != stepNum) {
//根据当前实时灯态获取运行的相位 //根据当前实时灯态获取运行的相位
SignalLightStateVo signalInfoVo = getSignalInfoVos(signalId).get(0); LightsStatusVO lightsStatusVO = getSignalInfoVos(signalId).get(0);
//暂时按单环处理 //暂时按单环处理
SignalRingVo signalRunring = signalInfoVo.getRings().get(0); String phaseId = lightsStatusVO.getRunrings().get(0).getPhaseId();
String phaseId = signalRunring.getPhaseId();
//获取方案数据列表 //获取方案数据列表
List<CrossPhasePO> baseCrossPhasePlanList = crossPhaseMapper.selectByCrossIdAndPlanId(signalInfoVo.getCode(), signalInfoVo.getPhasePlanId()); List<CrossPhasePO> baseCrossPhasePlanList = crossPhaseMapper.selectByCrossIdAndPlanId(lightsStatusVO.getCode(), lightsStatusVO.getPhasePlanId());
Map<String, List<CrossPhasePO>> groupByPhase = baseCrossPhasePlanList.stream().collect(Collectors.groupingBy(CrossPhasePO::getPhaseNo)); Map<String, List<CrossPhasePO>> groupByPhase = baseCrossPhasePlanList.stream().collect(Collectors.groupingBy(CrossPhasePO::getPhaseNo));
//根据相位获取当前相序 //根据相位获取当前相序
int newPhaseOrderId = 0; int newPhaseOrderId = 0;
...@@ -275,184 +432,71 @@ public class HKControlCommandServiceImpl implements ControlCommandService { ...@@ -275,184 +432,71 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
return setSignalControl(bodyObjectParam); return setSignalControl(bodyObjectParam);
} }
private <T> Result<T> setSignalControl(Map<String, Object> param) {
try {
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
getPathMapByApiCode("SetSignalControl"),
JSON.toJSONString(param), null, null, "application/json", null);
JSONObject obj = JSON.parseObject(strResult);
if (HK_SUCCESS_CODE.equals(obj.getInteger(HK_CODE_KEY))) {
return Result.success();
}
return Result.error();
} catch (Exception e) {
log.error("系统繁忙,服务器端内部错误!", e);
throw new ControlException("系统繁忙,服务器端内部错误!");
}
}
/** /**
* @param signalId 信号机编号 * @param code 信号机编号
* @param runningMode 0-多时段控制模式 1-关灯、2-黄闪、3-全红、11-取消步进控制、12-灯态锁定、13-灯态解锁 * @param runningMode 0-多时段控制模式 1-关灯、2-黄闪、3-全红、11-取消步进控制、12-灯态锁定、13-灯态解锁
*/ */
private <T> Result<T> controlSignal(String signalId, Integer runningMode) { private <T> Result<T> controlSignal(String code, Integer runningMode) throws Exception {
//执行恢复时间表方案命令 //执行恢复时间表方案命令
if (NORMAL_RUNNING_CONTROL.equals(runningMode) || CANCEL_STEP_CONTROL.equals(runningMode)) { if (NORMAL_RUNNING_CONTROL.equals(runningMode) || CANCEL_STEP_CONTROL.equals(runningMode)) {
//根据实时灯态获取当前运行模式 //根据实时灯态获取当前运行模式
SignalLightStateVo signalInfoVo = getSignalInfoVos(signalId).get(0); List<BaseCrossInfo> baseSignals = new ArrayList<>();
BaseCrossInfo baseSignal = new BaseCrossInfo();
baseSignal.setCode(code);
baseSignal.setManufacturerAbbr(BasicEnum.ManufacturerEnum.HK.getAbbr());
baseSignals.add(baseSignal);
LightsStatusVO lightsStatusVO = hkLightsStatusService.getHkLightsStatus(baseSignals).get(0);
//如果当前模式已经是定周期,就不在执行恢复时间表方案指令 //如果当前模式已经是定周期,就不在执行恢复时间表方案指令
if (FIXED_CYCLE_MODE.equals(Integer.valueOf(signalInfoVo.getRunMode()))) { if (FIXED_CYCLE_MODE.equals(Integer.valueOf(lightsStatusVO.getRunMode()))) {
throw new ControlException("当前控制模式是定周期控制,请勿下发恢复命令"); throw new ControlException("当前控制模式是定周期控制,请勿下发恢复命令");
} }
} }
Map<String, Object> param = new HashMap<String, Object>() {
private static final long serialVersionUID = -3468722905882654820L;
JSONObject bodyObjectParam = new JSONObject(); {
bodyObjectParam.put("crossCode", signalId); put("crossCode", code);
bodyObjectParam.put("controlType", runningMode); put("controlType", runningMode);
bodyObjectParam.put("controlNo", 0); put("controlNo", 0);
//控制时长,单位 s,0 则持续控制 //控制时长,单位 s,0 则持续控制
bodyObjectParam.put("duration", 0); put("duration", 0);
return setSignalControl(bodyObjectParam);
} }
};
private <T> Result<T> setSignalControl(JSONObject bodyObjectParam) { String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
try { getPathMapByApiCode("SetSignalControl"),
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, getPathMapByApiCode("updateLockPhase"), bodyObjectParam.toJSONString(), null, null, "application/json", null); JSON.toJSONString(param), null, null, "application/json", null);
JSONObject object = JSON.parseObject(strResult); JSONObject object = JSON.parseObject(strResult);
if (HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY))) { if (HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY))) {
return Result.success(); return Result.success();
} }
} catch (Exception e) {
log.error("系统繁忙,服务器端内部错误!", e);
}
return Result.error("下发指令失败"); return Result.error("下发指令失败");
} }
/** /**
* 根据信号机获取灯态列表 * 根据信号机获取灯态列表
*/ */
private List<SignalLightStateVo> getSignalInfoVos(String signalId) { private List<LightsStatusVO> getSignalInfoVos(String code) {
List<BaseCrossInfo> baseSignals = new ArrayList<>(); List<BaseCrossInfo> baseSignals = new ArrayList<>();
BaseCrossInfo baseSignal = new BaseCrossInfo(); BaseCrossInfo baseSignal = new BaseCrossInfo();
baseSignal.setCode(signalId); baseSignal.setCode(code);
baseSignal.setManufacturerAbbr(BasicEnum.ManufacturerEnum.HK.getAbbr()); baseSignal.setManufacturerAbbr(BasicEnum.ManufacturerEnum.HK.getAbbr());
baseSignals.add(baseSignal); baseSignals.add(baseSignal);
return hkGetSignalMethodService.queryHkSignalInfo(baseSignals); return hkLightsStatusService.getHkLightsStatus(baseSignals);
}
/**
* 下发时段信息
*
* @param planSendVO 计划下发VO
* @return boolean
*/
private boolean sendTimeInfo(PlanSendVO planSendVO) throws Exception {
//拼接参数
JSONObject bodyObjectParam = new JSONObject();
// 拼接参数 海康后续修改不传入 controlType ,controlType 取值默认为原始值
List<SectionPlan> sectionPlans = planSendVO.getSectionPlans();
for (SectionPlan plan : sectionPlans) {
//拼接参数,信号机方案对象
JSONObject signalObjectParam = new JSONObject();
//拼接参数,信号列表
JSONArray signalArrayParam = new JSONArray();
//拼接参数,方案列表
JSONArray planArrayParam = new JSONArray();
//拼接参数,时段列表
JSONArray sectionArrayParam = new JSONArray();
List<TimeSlice> timeSlices = plan.getTimeSlices();
for (TimeSlice timeSlice : timeSlices) {
JSONObject section = new JSONObject();
section.put("timeSecNo", timeSlice.getTimeSliceId());
section.put("patternNo", timeSlice.getTimePlanId());
section.put("beginTime", timeSlice.getStartTime());
sectionArrayParam.add(section);
}
JSONObject planObjectParam = new JSONObject();
planObjectParam.put("planNo", plan.getSectionPlanId());
planObjectParam.put("planName", plan.getSectionPlanDesc());
planObjectParam.put("sectionList", sectionArrayParam);
planArrayParam.add(planObjectParam);
signalObjectParam.put("crossCode", planSendVO.getCode());
signalObjectParam.put("planList", planArrayParam);
signalArrayParam.add(signalObjectParam);
bodyObjectParam.put("data", signalArrayParam);
}
// 下发时段方案
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, getPathMapByApiCode("updateSectionPlans"), bodyObjectParam.toJSONString(), null, null, "application/json", null);
JSONObject object = JSON.parseObject(strResult);
return object.getInteger(HK_CODE_KEY).equals(HK_SUCCESS_CODE);
}
/**
* 下发计划信息
*
* @param planSendVO 计划下发VO
* @return boolean
* @throws Exception 异常
*/
private boolean sendPlanInfo(PlanSendVO planSendVO) throws Exception {
JSONArray body = new JSONArray();
body.add(planSendVO.getCode());
Map<String, String> path = getPathMapByApiCode("queryRunPlan");
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, body.toString(), null, null, "application/json", null);
JSONObject jsonObj = JSON.parseObject(strResult);
//日期 id
int id = 1;
if (jsonObj.getInteger(HK_CODE_KEY).equals(HK_SUCCESS_CODE)) {
// 获取日期列表
JSONArray schedulesArray = jsonObj.getJSONArray("data").getJSONObject(0).getJSONArray("schedules");
JSONObject scheduleObj = schedulesArray.getJSONObject(schedulesArray.size() - 1);
id = scheduleObj.getInteger("id");
}
//拼接参数
JSONObject bodyObjectParam = new JSONObject();
JSONArray schedulesArrayParam = new JSONArray();
// 获取传入的星期数组
JSONArray weeks = JSON.parseArray(JSON.toJSONString(planSendVO.getWeeks()));
// 获取传入的特殊日期数组
JSONArray specialDays = JSON.parseArray(JSON.toJSONString(planSendVO.getSpecialDays()));
if (null != weeks) {
//去重,获取所有的运行方案号
Set<String> set = new HashSet<>();
for (int i = 0; i < weeks.size(); i++) {
String sectionPlanId = weeks.getJSONObject(i).getString("sectionPlanId");
set.add(sectionPlanId);
}
if (null != specialDays) {
for (int i = 0; i < specialDays.size(); i++) {
String sectionPlanId = specialDays.getJSONObject(i).getString("sectionPlanId");
set.add(sectionPlanId);
}
}
int num = 0;
for (String planNo : set) {
JSONObject schedulesObjectParam = new JSONObject();
List<Integer> weeksListParam = new ArrayList<>();
// 遍历星期列表,拼接星期集合参数
for (int i = 0; i < weeks.size(); i++) {
JSONObject week = weeks.getJSONObject(i);
String weekNum = week.getString("weekNum");
String sectionPlanId = week.getString("sectionPlanId");
if (planNo.equals(sectionPlanId)) {
weeksListParam.add(Integer.valueOf(weekNum));
}
}
// 遍历特殊日期列表,拼接特殊日期集合参数
if (null != specialDays) {
List<String> specialDaysListParam = new ArrayList<>();
for (int i = 0; i < specialDays.size(); i++) {
JSONObject specialDay = specialDays.getJSONObject(i);
String dateStr = specialDay.getString("dateStr");
String sectionPlanId = specialDay.getString("sectionPlanId");
if (planNo.equals(sectionPlanId)) {
specialDaysListParam.add(dateStr);
}
}
schedulesObjectParam.put("dates", specialDaysListParam);
//0 说明 dates 内的日期是日期集合,1 说明是dates 内的数据是日期范围
schedulesObjectParam.put("isPeriod", 0);
}
//scheduleNo 日期号 ,支持返回【1~128】
if (id + set.size() > 128) {
schedulesObjectParam.put("scheduleNo", 128 - set.size() - (++num));
} else {
schedulesObjectParam.put("scheduleNo", id + (++num));
}
schedulesObjectParam.put("planNo", planNo);
schedulesObjectParam.put("weeks", weeksListParam);
schedulesArrayParam.add(schedulesObjectParam);
}
}
bodyObjectParam.put("crossCode", planSendVO.getCode());
bodyObjectParam.put("schedules", schedulesArrayParam);
// 下发路口运行计划方案
String updateResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, getPathMapByApiCode("updateRunPlan"), bodyObjectParam.toJSONString(), null, null, "application/json", null);
JSONObject updateObject = JSON.parseObject(updateResult);
return updateObject.getInteger(HK_CODE_KEY).equals(HK_SUCCESS_CODE);
} }
} }
package net.wanji.utc.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.common.constant.Constants;
import net.wanji.utc.service.HkGetSignalMethodService;
import net.wanji.utc.vo.CrossLanesVo;
import net.wanji.utc.vo.signal.SignalLightStateVo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static net.wanji.utc.common.constant.Constants.HK_CODE_KEY;
import static net.wanji.utc.common.constant.Constants.HK_SUCCESS_CODE;
/**
* @author hfx
* Created on 2020/09/10
* @description: [海康信号灯厂商接口service实现]
*/
@Slf4j
@Service
public class HkGetSignalMethodServiceImpl implements HkGetSignalMethodService {
@Resource
private ArtemisConfig artemisConfig;
/**
* 获取路口信号机的实时灯态数据
*/
@Override
@SuppressWarnings("unchecked")
public List<SignalLightStateVo> queryHkSignalInfo(List<BaseCrossInfo> baseSignals) {
List<SignalLightStateVo> result = new ArrayList<>();
SignalLightStateVo infoVo;
try {
Map<String, String> path = Constants.getPathMapByApiCode("querySignalInfo");
for (BaseCrossInfo entity : baseSignals) {
JSONObject jsonBody = new JSONObject();
jsonBody.put("pageNo", 1);
jsonBody.put("pageSize", 20);
JSONObject searchObj = new JSONObject();
JSONArray crossCodes = new JSONArray();
crossCodes.add(entity.getCode());
searchObj.put("crossCodes", crossCodes);
jsonBody.put("searchObj", searchObj);
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, jsonBody.toJSONString(), null, null, "application/json", null);
JSONObject object = JSON.parseObject(strResult);
//根据路口ID 找到对应通道号上的灯组方向
List<CrossLanesVo> crossDetailInfo = Constants.getTelesemeLaneRealMap().get(entity.getCode());
if (HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY))) {
JSONObject data = object.getJSONObject("data");
JSONArray list = data.getJSONArray("list");
for (int i = 0; i < list.size(); i++) {
infoVo = new SignalLightStateVo();
JSONObject jsonObject = list.getJSONObject(i);
String patternNo = jsonObject.getString("patternNo"); // 方案编号
JSONArray rings = jsonObject.getJSONArray("rings"); // 环列表
JSONArray channelState = jsonObject.getJSONArray("channelState"); // 灯组列表
infoVo.setRunMode(jsonObject.getString("controlType")); // 运行模式
infoVo.setPhasePlanId(patternNo); // 相位方案号
int cycleLen = jsonObject.getIntValue("cycle"); // 周期时长
int curRunTime = jsonObject.getIntValue("curRunTime"); // 当前运行时长
int cycleCountDown = cycleLen - curRunTime; // 周期剩余时长
infoVo.setCode(entity.getCode());
infoVo.setManufacturerAbbr(entity.getManufacturerAbbr());
infoVo.setCycleCountDown(cycleCountDown);
infoVo.setCycleLen(cycleLen);
Map<String, Object> dirLampGroupMap = new HashMap<>();
Map<String, Object> phaseMap = new HashMap<>();
// 循环构建灯组对象(从路口详情接口中获取灯组关系)
for (int k = 0; k < channelState.size(); k++) {
JSONObject cobj = channelState.getJSONObject(k);
int channelNo = cobj.getIntValue("channelNo");
String color = transferHKLampGroup(cobj.getIntValue("state"));
for (CrossLanesVo vo : crossDetailInfo) {
if (vo.getChannelNo() == channelNo) {
String direction = handleDirection(vo.getDirection().toString());
String trun = handleTurnTypeByDt(vo.getTurn());
if (dirLampGroupMap.get(direction) != null) {
Map<String, String> mstr = (Map<String, String>) dirLampGroupMap.get(direction);
mstr.put(trun, color);
dirLampGroupMap.put(direction, mstr);
} else {
Map<String, String> lamp = new HashMap<>();
lamp.put(trun, color);
dirLampGroupMap.put(direction, lamp);
}
}
}
}
//循环相位列表
for (int j = 0; j < rings.size(); j++) {
JSONObject jsonObj = rings.getJSONObject(j);
JSONArray phaseList = jsonObj.getJSONArray("phaseList");
for (int k = 0; k < phaseList.size(); k++) {
JSONObject phase = phaseList.getJSONObject(k);
String phaseNo = phase.getString("phaseNo");
Integer vehicleStatus = phase.getInteger("vehicleStatus");
Integer phaseLength = phase.getInteger("phaseLength");
Integer red = phase.getInteger("red");
Integer yellow = phase.getInteger("yellow");
Integer green = phaseLength - yellow - red;
phaseMap.put(phaseNo, green);
if (2 != vehicleStatus) {
infoVo.setPhaseId(phaseNo);
}
}
}
infoVo.setDirLampGroupMap(dirLampGroupMap);
infoVo.setPhaseMap(phaseMap);
result.add(infoVo);
}
}
}
} catch (Exception e) {
log.error("系统繁忙,服务器端内部错误!", e);
}
return result;
}
/**
* 灯组颜色转换
*/
private String transferHKLampGroup(int state) {
String color;
switch (state) {
case 1:
color = "green";
break;
case 2:
case 6:
color = "red";
break;
case 3:
color = "yellow";
break;
case 4:
color = "greenFlash";
break;
case 5:
color = "yellowFlash";
break;
case 7:
color = "lightsOut";
break;
case 8:
color = "redFlash";
break;
default:
color = "";
break;
}
return color;
}
/**
* 处理方向
* 车道进口方向,方向:北 1 ,东北 2 ,东 3 ,东南 4 ,南 5 ,西南 6 ,西 7 ,西北 8
*
* @param direction 海康方向: 0 其他,1 由南向北,2 由北向南,3 由东向西,4 由西向东,5 西南向东北,6 西北向东南,7 东南向西北,8 东北向西南,9 北行人,10 南行人,11 西行人,12 东行人
*/
private String handleDirection(String direction) {
String nDirection;
switch (direction) {
case "1":
case "10":
nDirection = "5";
break;
case "2":
case "9":
nDirection = "1";
break;
case "3":
case "12":
nDirection = "3";
break;
case "4":
case "11":
nDirection = "7";
break;
case "5":
nDirection = "6";
break;
case "6":
nDirection = "8";
break;
case "7":
nDirection = "4";
break;
case "8":
nDirection = "2";
break;
//其他
default:
nDirection = "0";
}
return nDirection;
}
/**
* 灯态车道转向
* 处理转向 1.左转、2.直行、3.右转、4.掉头、5.向左合流、6.向右合流、7.右掉头、8.左转直行、9.直行右转、
* 10.左转掉头、11.右转掉头、12.直行掉头、13.直行右掉头、14.左转右转、15.左转直行右转、16.左转右转掉头、17.左转右转右掉头、18.左转直行掉
*
* @param movement 海康转向: 1 直行,2 左转,3 右转,4 掉头,5 直左,6 直右,7 行人,8 左右,9 通行(左直右),10 左转掉头
*/
private String handleTurnTypeByDt(int movement) {
//处理海康转向 5,6,7,8,9,10 暂时不处理
String turnType;
switch (movement) {
case 1:
turnType = "2";
break;
case 2:
turnType = "1";
break;
case 3:
turnType = "3";
break;
case 4:
turnType = "4";
break;
case 5:
turnType = "8";
break;
case 6:
turnType = "9";
break;
case 8:
turnType = "14";
break;
case 9:
turnType = "15";
break;
case 10:
turnType = "10";
break;
default:
turnType = "0";
}
return turnType;
}
}
package net.wanji.utc.util;
import com.alibaba.fastjson.JSON;
import net.wanji.utc.vo.PlanSendVO;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author wuxiaokai
* @date 2022/11/24 15:37:26
*/
public class FieldUtil {
/**
* 将对象的属性转成 key - Value
*/
@SuppressWarnings("unchecked")
public static <T> Map<String, Object> fieldMethod(T t) throws IllegalAccessException {
if (t == null) {
return null;
}
Field[] fields = t.getClass().getDeclaredFields();
Map<String, Object> map = new HashMap<>(fields.length);
for (Field field : fields) {
field.setAccessible(true);
if (field.getType().equals(List.class)) {
List<Object> list = (List<Object>) field.get(t);
List<Map<String, Object>> list2 = new ArrayList<>(list.size());
for (Object o : list) {
Map<String, Object> map1 = fieldMethod(o);
list2.add(map1);
}
map.put(field.getName(), list2);
} else {
map.put(field.getName(), field.get(t));
}
}
return map;
}
}
...@@ -3,6 +3,7 @@ package net.wanji.utc.vo; ...@@ -3,6 +3,7 @@ package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
/** /**
* 相位锁定实体类 * 相位锁定实体类
...@@ -12,7 +13,7 @@ import lombok.Data; ...@@ -12,7 +13,7 @@ import lombok.Data;
*/ */
@Data @Data
@ApiModel(value = "PhaseLockVO", description = "相位锁定实体类") @ApiModel(value = "PhaseLockVO", description = "相位锁定实体类")
public class PhaseLockVO { public class PhaseLockVO extends BaseCrossInfo {
/** /**
* 相位编号 * 相位编号
......
package net.wanji.utc.vo;
import lombok.Getter;
import lombok.Setter;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import java.util.List;
/**
* @author wuxiaokai
* @date 2022/11/24 15:55:08
*/
@Setter
@Getter
public class PlanSendVO extends BaseCrossInfo {
private List<Data> data;
@Setter
@Getter
private static class Data {
private String crossCode;
private List<Plan> planList;
@Setter
@Getter
private static class Plan {
private String planNo;
private List<Section> sectionList;
@Setter
@Getter
private static class Section {
private String timeSecNo;
private String patternNo;
private String beginTime;
}
}
}
}
package net.wanji.utc.vo.schedulesend;
import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.vo.plansend.SpecialDay;
import net.wanji.utc.vo.plansend.Week;
import java.util.List;
/**
* 时间表下发VO
*
* @author wuxiaokai
* @date 2022/11/23 14:11:09
*/
@Data
public class ScheduleSendVO extends BaseCrossInfo {
/**
* 星期
*/
private List<Week> weeks;
/**
* 特殊日期
*/
private List<SpecialDay> specialDays;
}
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
select select
id,name,code,manufacturer_id,ip,port,location,version,model,install_time,gmt_create,gmt_modified id,name,code,manufacturer_id,ip,port,location,version,model,install_time,gmt_create,gmt_modified
from t_cross_info from t_cross_info
where id = #{code} where code = #{code}
</select> </select>
<select id="selectByManufacturerId" resultMap="BaseResultMap"> <select id="selectByManufacturerId" resultMap="BaseResultMap">
......
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