Commit 15e5e3d1 authored by duanruiming's avatar duanruiming

[add] 添加海信模块

parent 2153be0a
This diff is collapsed.
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>1.0</id>
<formats>
<format>tar.gz</format>
<format>dir</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- for bin -->
<fileSet>
<directory>src/main/bin</directory>
<includes>
<include>*.*</include>
</includes>
<directoryMode>775</directoryMode>
<outputDirectory>bin/</outputDirectory>
</fileSet>
<!-- for configs -->
<fileSet>
<directory>src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>*.xml</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
<!-- for jar -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<!-- for lib -->
<dependencySets>
<dependencySet>
<outputDirectory>lib/</outputDirectory>
<scope>runtime</scope>
<excludes>
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
package net.wanji.utc.hisense;
import net.wanji.utc.hisense.netty.NettyClient;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author duanruiming
* @date 2023/05/08 13:37
*/
@SpringBootApplication(scanBasePackages = {"net.wanji.utc.hisense", "net.wanji.databus", "net.wanji.common"})
@MapperScan(basePackages = {"net.wanji.databus.dao.mapper"})
@EnableTransactionManagement
@EnableScheduling
@SuppressWarnings("all")
public class HisenseApplication implements CommandLineRunner {
@Value("${portParam.localPort}")
int localPort;
@Value("${portParam.remotePort}")
int remoteProt;
public static void main(String[] args) {
SpringApplication.run(HisenseApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
NettyClient.connection(localPort, remoteProt);
}
}
package net.wanji.utc.hisense.cache;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.dao.mapper.ManufacturerInfoMapper;
import net.wanji.databus.po.CrossInfoPO;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
/**
* @author duanruiming
* @date 2023/05/09 14:30
*/
@Slf4j
@Component
@SuppressWarnings("unchecked")
public class CrossInfoCache implements ApplicationRunner {
@Resource
private CrossInfoMapper crossInfoMapper;
@Resource
private ManufacturerInfoMapper manufacturerInfoMapper;
private static final Map<String, CrossInfoPO> crossInfoMap = new HashMap<>();
public Map<String, CrossInfoPO> getCrossInfoCache() {
if (!crossInfoMap.isEmpty()) {
return crossInfoMap;
}
return Collections.EMPTY_MAP;
}
public static CrossInfoPO getCrossInfoByIp(String ip) {
if (!crossInfoMap.isEmpty()) {
for (Map.Entry<String, CrossInfoPO> entry : crossInfoMap.entrySet()) {
CrossInfoPO crossInfoPO = entry.getValue();
if (StringUtils.equalsIgnoreCase(crossInfoPO.getIp(), ip)) {
return crossInfoPO;
}
}
}
return null;
}
@Override
public void run(ApplicationArguments args) throws Exception {
init();
}
private void init() {
Integer manufacturerId = manufacturerInfoMapper.selectIdByCode(BaseEnum.VendorTypeEnum.DT.getNick());
List<CrossInfoPO> CrossInfoPOS = crossInfoMapper.selectAll();
for (CrossInfoPO crossInfoPO : CrossInfoPOS) {
if (Objects.nonNull(manufacturerId) && Objects.equals(manufacturerId, crossInfoPO.getManufacturerId())) {
crossInfoMap.put(crossInfoPO.getId(), crossInfoPO);
}
}
}
}
package net.wanji.utc.hisense.cache;
import net.wanji.utc.hisense.pojo.convert.PhaseInfoPojo;
import net.wanji.utc.hisense.pojo.convert.PhaseStageInfoPojo;
import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
import net.wanji.utc.hisense.pojo.convert.SchemeInfoPojo;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author duanruiming
* @date 2023/06/19 15:28
*/
@Component
public class SignalDataCache {
public static final Map<String, List<SchemeInfoPojo>> schemeInfoCache = new HashMap<>();
public static final Map<String, List<PhaseStageInfoPojo>> phaseStageInfoCache = new HashMap<>();
public static final Map<String, List<PhaseInfoPojo>> phaseInfoCache = new HashMap<>();
// 海信推送灯态数据
public static final Map<String, RunningLightsStatusPojo> runningStateInfoCache = new HashMap<>();
}
package net.wanji.utc.hisense.cache.netty;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import net.wanji.databus.po.CrossInfoPO;
import java.util.HashMap;
import java.util.Map;
/**
* @author duanruiming
* @date 2023/05/08 14:07
*/
public class NettyMessageCache {
public static final Map<String, MessageResultPojo> NETTY_RESULT_TIMEOUT_MAP = new HashMap<>();
/**
* key: ip/port:command
*/
public static final Map<String, CrossInfoPO> COMMAND_RESULT_SIGN_MAP = new HashMap<>();
}
package net.wanji.utc.hisense.common.enums;
import lombok.Getter;
import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/05/08 10:17
*/
@Getter
public enum CommandResultSignEnum {
GET_RUNNING_STATE_INFO(RunningLightsStatusPojo.class, "getRunningStateInfoService");
private final Object resultPojo;
private final String className;
CommandResultSignEnum(Class<?> resultPojo, String className) {
this.className = className;
this.resultPojo = resultPojo;
}
public static String getResultPojo(Object pojo) {
for (CommandResultSignEnum value : CommandResultSignEnum.values()) {
if (Objects.equals(value.getResultPojo(), RunningLightsStatusPojo.class)) {
return value.getClassName();
}
}
return null;
}
}
package net.wanji.utc.hisense.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/06/19 10:07
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum ControlModelEnum {
FIXED_CYCLE(1, 2, "定周期"),
GREEN_WAVE(2, 0, "绿波协调"),
YELLOW_CONTROL(3, 1, "黄闪"),
RED_CONTROL(4, 7, "全红"),
CLOSED_CONTROL(5, 6, "关灯"),
SELF_CONTROL(6, 13, "单点自适应 -> 协调优化"),
FULL_INDUCTION(7, 3, "全感应 -> 本地感应"),
HALF_INDUCTION(8, 3, "半感应");
private Integer wjControl;
private Integer hisenseControlHex;
private String message;
public static Integer getWjControlMode(Integer hisenseControlHex) {
for (ControlModelEnum value : ControlModelEnum.values()) {
if (Objects.equals(hisenseControlHex, value.getHisenseControlHex())) {
return value.getWjControl();
}
}
return null;
}
}
package net.wanji.utc.hisense.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/06/19 10:07
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum ControlTypeEnum {
FIXED_CYCLE(1, 6, "定周期-->时段表控制"),
ALL_RED(2, 3, "全红"),
YELLOW_CONTROL(3, 3, "黄闪"),
LOCK_CONTROL(4, 3, "锁定 --> 中心手动控制"),
CLOSED_CONTROL(5, 2, "中心优化"),
SELF_CONTROL(6, 0, "MEC优化"),
FULL_INDUCTION(7, 5, "现场手动-->面板手动"),
LOWER_LEVEL(8, 4, "降级");
private Integer wjControl;
private Integer hisenseControlHex;
private String message;
public static Integer getWjControlType(Integer hisenseControlHex) {
for (ControlTypeEnum value : ControlTypeEnum.values()) {
if (Objects.equals(hisenseControlHex, value.getHisenseControlHex())) {
return value.getWjControl();
}
}
return null;
}
}
package net.wanji.utc.hisense.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
/**
* @author duanruiming
* @date 2023/06/19 16:27
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum PhaseLightColorEnum {
LIGHT_OFF("0", "off", "关灯"),
LIGHT_RED("2", "red", "红灯"),
LIGHT_GREEN("1", "green", "绿灯"),
LIGHT_GREEN_FLASH("21", "green", "绿闪"),
LIGHT_YELLOW("4", "yellow", "黄灯"),
LIGHT_YELLOW_FLASH("31", "yellow", "黄闪"),
LIGHT_RED_YELLOW("6", "redYellow", "红黄灯");
private String dtLightColor;
private String wjLightColor;
private String message;
public static String getWjLightColor(String dtLightColor) {
for (PhaseLightColorEnum value : PhaseLightColorEnum.values()) {
if (StringUtils.equals(dtLightColor, value.getDtLightColor())) {
return value.getWjLightColor();
}
}
return null;
}
}
package net.wanji.utc.hisense.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/06/21 9:31
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum SectionControlModeEnum {
FIXED_CYCLE(1, "21", "定周期"),
GREEN_WAVE(2, "13", "绿灯"),
YELLOW_CONTROL(3, "31", "黄灯"),
RED_CONTROL(4, "32", "红灯"),
CLOSED_CONTROL(5, "33", "关灯"),
SELF_CONTROL(6, "14", "绿闪"),
FULL_INDUCTION(7, "31", "黄闪"),
HALF_INDUCTION(8, "32", "红闪");
private Integer wjControl;
private String dtControlHex;
private String message;
public static Integer getDtControlMode(Integer wjControlHex) {
for (ControlModelEnum value : ControlModelEnum.values()) {
if (Objects.equals(wjControlHex, value.getWjControl())) {
return value.getHisenseControlHex();
}
}
return null;
}
}
package net.wanji.utc.hisense.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.wanji.utc.hisense.service.controller.ControlCommandService;
import net.wanji.utc.hisense.service.controller.SignalStatusService;
import net.wanji.utc.hisense.service.controller.StaticInfoService;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/05/09 10:35
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum SignalInterfaceTypeEnum {
CONTROL("control", ControlCommandService.class, "控制类型接口"),
STATUS("status",SignalStatusService.class, "状态类型接口"),
STATIC("static",StaticInfoService.class, "静态类型接口");
private String code;
private Object type;
private String desc;
/**
* 通过编号获取接口类型
*
* @param code
* @return
*/
public Object getInterfaceType(String code) {
for (SignalInterfaceTypeEnum value : SignalInterfaceTypeEnum.values()) {
if (Objects.equals(code, value.getCode())) {
return value.getType();
}
}
return null;
}
}
package net.wanji.utc.hisense.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包路径
.apis(RequestHandlerSelectors.basePackage("net.wanji.utc.hisense.controller"))
.paths(PathSelectors.any())
.build();
}
//构建 api文档的详细信息函数,注意这里的注解引用的是哪个
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("万集科技-城市交通信号OpenAPI")
//创建人
.contact(new Contact("test", "#", "test@wanji.net.cn"))
//版本号
.version("0.2.1")
//描述
.description("城市交通信号厂商调用服务API")
.build();
}
}
\ No newline at end of file
package net.wanji.utc.hisense.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import net.wanji.utc.hisense.service.controller.ControlCommandService;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.vo.*;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author duanruiming
* @date 2023/05/08 10:45
*/
@Api(value = "信号指令服务", tags = "信号指令服务")
@RequestMapping("/controlCommand")
@RestController
@RequiredArgsConstructor
public class ControlCommandController {
private final ControlCommandService controlCommandService;
/**
* 信号机方案下发
*
* @param schemeSendVO 方案下发VO
* @return
*/
@AspectLog(description = "信号机方案下发-基础方案下发", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "信号机方案下发-基础方案下发", notes = "信号机方案下发-基础方案下发")
@PostMapping("/schemeSend")
public JsonViewObject schemeSend(@RequestBody @Validated SchemeSendVO schemeSendVO) throws Exception {
return controlCommandService.schemeSend(schemeSendVO);
}
/**
* 下发信号机计划
*
* @param planSendVO 计划下发VO
* @return
*/
@AspectLog(description = "计划下发-计划信息、时段信息", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "计划下发-计划信息、时段信息", notes = "计划下发-计划信息、时段信息")
@PostMapping("/planSend")
public JsonViewObject planSend(@RequestBody @Validated PlanSendVO planSendVO) throws Exception {
return controlCommandService.planSend(planSendVO);
}
/**
* 时间表下发
*
* @param scheduleSendVO 时间表下发VO
* @return
* @throws Exception 异常
*/
@AspectLog(description = "时间表下发-时间表信息", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "时间表下发-时间表信息", notes = "时间表下发-时间表信息")
@PostMapping("/scheduleSend")
public JsonViewObject scheduleSend(@RequestBody @Validated ScheduleSendVO scheduleSendVO) throws Exception {
return controlCommandService.scheduleSend(scheduleSendVO);
}
/**
* 相位配时下发-(下发相位参数)
*
* @return
* @throws InterruptedException 中断异常
*/
@AspectLog(description = "相位配时下发-(下发相位参数)", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "相位配时下发-(下发相位参数)", notes = "相位配时下发-(下发相位参数)")
@PostMapping("/phaseTimingSend")
public JsonViewObject phaseTimingSend(@RequestBody @Validated PhaseTimingSendVO phaseTimingSendVO) throws Exception {
return controlCommandService.phaseTimingSend(phaseTimingSendVO);
}
/**
* 全红控制
*
* @param commandVO 控制指令VO
* @return
* @throws Exception 异常
*/
@AspectLog(description = "全红控制-路口全红控制/恢复", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "全红控制-路口全红控制/恢复", notes = "全红控制-路口全红控制/恢复")
@PostMapping("/allRedControl")
public JsonViewObject allRedControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return controlCommandService.setSignalControl(commandVO);
}
/**
* 黄闪控制
*
* @param commandVO 控制指令VO
* @return
* @throws Exception 异常
*/
@AspectLog(description = "黄闪控制-路口黄闪控制/恢复", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "黄闪控制-路口黄闪控制/恢复", notes = "黄闪控制-路口黄闪控制/恢复")
@PostMapping("/yellowLightControl")
public JsonViewObject yellowLightControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return controlCommandService.setSignalControl(commandVO);
}
/**
* 关灯控制
*
* @param commandVO 控制指令VO
* @return
* @throws Exception 异常
*/
@AspectLog(description = "关灯控制-路口关灯控制/开灯", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "关灯控制-路口关灯控制/开灯", notes = "关灯控制-路口关灯控制/开灯")
@PostMapping("/closeLightControl")
public JsonViewObject closeLightControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return controlCommandService.setSignalControl(commandVO);
}
/**
* 步进控制
*
* @param crossCode 信号id
* @param command 命令
* @param stepNum 一步num
* @return
*/
@AspectLog(description = "步进控制-步进控制/恢复", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "步进控制-步进控制/恢复", notes = "步进控制-步进控制/恢复")
@ApiImplicitParams({
@ApiImplicitParam(name = "crossCode", value = "13位路口编号", paramType = "query", required = true, dataType = "String"),
@ApiImplicitParam(name = "command", value = "1 开始步进 0 取消步进", paramType = "query", required = true, dataType = "int"),
@ApiImplicitParam(name = "stepNum", value = "0 顺序步进 n 跳过n个相位", paramType = "query", required = true, dataType = "int"),
})
@PostMapping("/stepControl")
public JsonViewObject stepControl(@RequestParam String crossCode,
@RequestParam Integer command,
@RequestParam int stepNum) throws Exception {
return controlCommandService.stepControl(crossCode, command, stepNum);
}
/**
* 恢复时间表
*
* @param crossCode
* @return
*/
@AspectLog(description = "恢复时间表-恢复路口时间表执行", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "恢复时间表-恢复路口时间表执行", notes = "恢复时间表-恢复路口时间表执行")
@PostMapping("/recoverSchedule")
public JsonViewObject recoverSchedule(@RequestParam String crossCode) throws Exception {
return controlCommandService.recoverSchedule(crossCode);
}
/**
* 锁定控制
*
* @param commandVO 控制指令VO
* @return
* @throws Exception 异常
*/
@AspectLog(description = "锁定控制-相位锁定/解锁", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁")
@PostMapping("/lockControl")
public JsonViewObject lockControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return controlCommandService.lockControl(commandVO);
}
/**
* 相位差下发
*/
@AspectLog(description = "相位差下发", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "相位差下发", notes = "相位差下发")
@PostMapping("/phaseDiffSend")
public JsonViewObject phaseDiffSend(String crossCode) {
return controlCommandService.phaseDiffSend();
}
}
package net.wanji.utc.hisense.controller;
/**
* @author Kent HAN
* @date 2022/12/1 15:07
*/
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import net.wanji.utc.hisense.service.controller.SignalStatusService;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.po.SignalStatusLogPO;
import net.wanji.databus.vo.LightsStatusVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* 运行状态、告警、灯态信息接口
*
* @date 2022/11/15 9:38
*/
@Api(value = "运行状态、告警、灯态信息接口", tags = "运行状态、告警、灯态信息接口")
@RequestMapping("/signalStatus")
@RestController
@RequiredArgsConstructor
public class SignalStatusController {
private final SignalStatusService signalStatusService;
@AspectLog(description = "运行状态、告警数据", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/runningStatusAlarm", produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "运行状态、告警数据", notes = "运行状态、告警数据", response = SignalStatusLogPO.class,
produces = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SignalStatusLogPO.class)
})
public JsonViewObject runningStatusAlarm(String crossId) {
List<SignalStatusLogPO> signalStatusLogPOList = signalStatusService.runningStatusAlarm(crossId);
return JsonViewObject.newInstance().success(signalStatusLogPOList);
}
@AspectLog(description = "灯态数据", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/lightStatus", produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "灯态数据", notes = "灯态数据", response = LightsStatusVO.class,
produces = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = LightsStatusVO.class)
})
public JsonViewObject lightStatus(String crossId) {
List<LightsStatusVO> lightsStatusVOList = signalStatusService.lightStatus(crossId);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(lightsStatusVOList);
}
}
package net.wanji.utc.hisense.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import net.wanji.utc.hisense.service.controller.StaticInfoService;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.dao.entity.CrossSchedulesPO;
import net.wanji.databus.dto.CrossSchedulesDTO;
import net.wanji.databus.dto.PlanSectionDTO;
import net.wanji.databus.dto.SchemePhaseLightsDTO;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* 静态信息接口
*
* @date 2022/11/15 9:38
*/
@Api(value = "静态信息接口", tags = "静态信息接口")
@RequestMapping("/staticInfo")
@RestController
@RequiredArgsConstructor
public class StaticInfoController {
private final StaticInfoService staticInfoService;
@AspectLog(description = "方案数据-方案信息、相位信息、灯组信息", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/schemePhaseLights",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiOperation(value = "方案数据-方案信息、相位信息、灯组信息", notes = "方案数据-方案信息、相位信息、灯组信息",
response = SchemePhaseLightsVO.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SchemePhaseLightsVO.class)
})
public JsonViewObject schemePhaseLights(@RequestBody @Validated SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception {
SchemePhaseLightsVO schemePhaseLightsVO = staticInfoService.schemePhaseLights(schemePhaseLightsDTO);
return JsonViewObject.newInstance().success(schemePhaseLightsVO);
}
@AspectLog(description = "计划数据-计划信息、时段信息", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/planSection",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiOperation(value = "计划数据-计划信息、时段信息", notes = "计划数据-计划信息、时段信息", response = PlanSectionVO.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = PlanSectionVO.class)
})
public JsonViewObject planSection(@RequestBody @Validated PlanSectionDTO planSectionDTO) throws Exception {
List<PlanSectionVO> planSectionVOS = staticInfoService.planSection(planSectionDTO);
return JsonViewObject.newInstance().success(planSectionVOS);
}
@AspectLog(description = "时间表数据", operationType = BaseEnum.OperationTypeEnum.QUERY)
@PostMapping(value = "/crossSchedules",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiOperation(value = "时间表数据", notes = "时间表数据", response = CrossSchedulesPO.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossSchedulesPO.class)
})
public JsonViewObject crossSchedules(@RequestBody @Validated CrossSchedulesDTO crossSchedulesDTO) throws Exception {
List<CrossSchedulesPO> crossSchedulesPOS = staticInfoService.crossSchedules(crossSchedulesDTO);
return JsonViewObject.newInstance().success(crossSchedulesPOS);
}
}
package net.wanji.utc.hisense.netty;
import cn.hutool.core.util.HexUtil;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.cache.netty.NettyMessageCache;
import net.wanji.utc.hisense.netty.codec.MessageDecoder;
import net.wanji.utc.hisense.netty.codec.MessageEnCoder;
import net.wanji.utc.hisense.netty.handler.NettyServerHandler;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.net.InetSocketAddress;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class NettyClient {
private static ChannelFuture udpChannelFuture = null;
@Resource(name = "commonThreadPoolExecutor")
private ThreadPoolTaskExecutor commonThreadPoolExecutor;
/**
* 建立连接
*/
public static void connection(int localPort, int remotePort) throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535))
.localAddress(new InetSocketAddress(localPort))
.remoteAddress(new InetSocketAddress(remotePort))
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
protected void initChannel(NioDatagramChannel datagramChannel) {
datagramChannel.pipeline()
.addLast("decoder", new MessageDecoder())
.addLast("encoder", new MessageEnCoder())
.addLast(new NettyServerHandler());
}
});
ChannelFuture channelFuture = bootstrap.bind().sync();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
group.shutdownGracefully();
channelFuture.channel().closeFuture().syncUninterruptibly();
log.warn("udp服务关闭!");
}));
log.info("udp服务正在运行,端口:{}", localPort);
NettyClient.udpChannelFuture = channelFuture;
}
public static void sendMessage(String ip, Integer port, String msg) {
byte[] bytes = HexUtil.decodeHex(msg);
try {
if (udpChannelFuture == null) {
return;
}
udpChannelFuture.channel()
.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(bytes), new InetSocketAddress(ip, port))).sync();
log.debug("发送信号机:{}/{}命令消息:{}", ip, port, msg);
} catch (InterruptedException e) {
log.error("sendMsg is error", e);
}
}
public static MessageResultPojo sendMessage(String ip, Integer port, String msg, String command, int timeout) {
try {
if (timeout > 0) {
CountDownLatch countDownLatch = new CountDownLatch(1);
String key = StringUtils.join("/", ip, ":", port, "/", command);
long now = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
MessageResultPojo messageResultPojo = new MessageResultPojo(command, countDownLatch, now, timeout, null);
NettyMessageCache.NETTY_RESULT_TIMEOUT_MAP.put(key, messageResultPojo);
NettyMessageCache.COMMAND_RESULT_SIGN_MAP.put(key, CrossInfoCache.getCrossInfoByIp(ip));
sendMessage(ip, port, msg);
countDownLatch.await(timeout, TimeUnit.MILLISECONDS);
return NettyMessageCache.NETTY_RESULT_TIMEOUT_MAP.remove(key);
}
} catch (InterruptedException e) {
log.error("sendMsg is error", e);
}
return null;
}
@Scheduled(fixedRate = 300)
public void checkWaitTimeout() {
long now = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
NettyMessageCache.NETTY_RESULT_TIMEOUT_MAP.forEach((k, v) -> {
commonThreadPoolExecutor.execute(() -> {
if (now - v.getStartTime() > v.getWaitMillisecond()) {
log.warn("wait {}ms [{}] timeout", v.getWaitMillisecond(), k);
v.getCountDownLatch().countDown();
}
});
});
}
}
\ No newline at end of file
package net.wanji.utc.hisense.netty.codec;
import cn.hutool.core.util.HexUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.util.List;
/**
* @author duanruiming
* @date 2023/05/08 10:07
*/
public class MessageDecoder extends ByteToMessageDecoder {
/*
*自定义解码器
*/
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
byte[] bytes = new byte[in.readableBytes()];
in.readBytes(bytes);
out.add(HexUtil.encodeHexStr(bytes));
}
}
package net.wanji.utc.hisense.netty.codec;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import net.wanji.common.utils.licenseUtils.AESUtils;
/**
* @author duanruiming
* @date 2023/05/08 10:08
*/
public class MessageEnCoder extends MessageToByteEncoder<String> {
/**
* 自定义编码器
*
* @param ctx
* @param msg
* @param out
* @throws Exception
*/
@Override
protected void encode(ChannelHandlerContext ctx, String msg, ByteBuf out) throws Exception {
out.writeBytes(AESUtils.parseHexStr2Byte(msg));
}
}
package net.wanji.utc.hisense.netty.commandsign;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
/**
* @author duanruiming
* @date 2023/05/08 10:14
*/
public class CommandResultSign {
public static Object getHexSign(String data) {
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(data, RunningLightsStatusPojo.class);
}
}
package net.wanji.utc.hisense.netty.handler;
import cn.hutool.core.util.HexUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.spring.ServiceBeanContext;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.cache.netty.NettyMessageCache;
import net.wanji.utc.hisense.common.enums.CommandResultSignEnum;
import net.wanji.utc.hisense.netty.commandsign.CommandResultSign;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.net.InetSocketAddress;
import java.util.Objects;
@Slf4j
@Component
public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
@Resource
private CrossInfoCache crossInfoCache;
/**
* 读取消息
*
* @param ctx
* @param packet
* @throws Exception
*/
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
ByteBuf content = packet.content();
InetSocketAddress remote = packet.sender();
int i = content.readableBytes();
byte[] b = new byte[i];
content.readBytes(b);
String data = HexUtil.encodeHexStr(b);
Object resultPojo = CommandResultSign.getHexSign(data);
String className = CommandResultSignEnum.getResultPojo(resultPojo);
CommandResponseFactory commandResponseFactory = (CommandResponseFactory) ServiceBeanContext.getBean(className);
String key = StringUtils.join("/", remote.getHostString(), ":", remote.getPort(), "/", resultPojo.getClass().getSimpleName());
CommandPojo commandPojo = getCommandPojo(key, resultPojo);
Object hexResult = commandResponseFactory.getCommandResponse(commandPojo);
if (Objects.nonNull(hexResult)) {
setResultData(key, hexResult);
}
}
private void setResultData(String key, Object hexResult) {
MessageResultPojo resultPojo = NettyMessageCache.NETTY_RESULT_TIMEOUT_MAP.get(key);
if (resultPojo != null) {
resultPojo.setHexMessageResult(hexResult);
resultPojo.getCountDownLatch().countDown();
}
}
private CommandPojo getCommandPojo(String key, Object data) {
CrossInfoPO crossInfo = NettyMessageCache.COMMAND_RESULT_SIGN_MAP.get(key);
CommandPojo commandPojo = new CommandPojo();
commandPojo.setCrossId(crossInfo.getId());
commandPojo.setSignalId(crossInfo.getCode());
commandPojo.setSignalIp(crossInfo.getIp());
commandPojo.setPort(crossInfo.getPort());
commandPojo.setResponseMsg(data);
return commandPojo;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
}
}
package net.wanji.utc.hisense.netty.pojo;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/05/12 13:41
*/
@Data
public class CommandPojo {
private String crossId;
private String signalId;
private String signalIp;
private Integer port;
private Object responseMsg;
}
package net.wanji.utc.hisense.netty.response;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
/**
* @author duanruiming
* @date 2023/05/10 10:07
*/
public interface CommandResponseFactory {
Object getCommandResponse(CommandPojo commandPojo);
}
package net.wanji.utc.hisense.netty.response.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.hisense.cache.CrossInfoCache;
import net.wanji.utc.hisense.common.constants.Constants;
import net.wanji.utc.hisense.netty.NettyClient;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import net.wanji.databus.po.CrossInfoPO;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @author duanruiming
* @date 2023/05/12 11:00
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class HeartBeatService implements CommandResponseFactory {
private final CrossInfoCache crossInfoCache;
private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
@Scheduled(fixedRate = 30 * 1000, initialDelay = 10 * 1000)
public void heartbeat() {
Map<String, CrossInfoPO> crossInfoMap = crossInfoCache.getCrossInfoCache();
for (Map.Entry<String, CrossInfoPO> entry : crossInfoMap.entrySet()) {
CrossInfoPO crossInfoPO = entry.getValue();
String ip = crossInfoPO.getIp();
Integer port = crossInfoPO.getPort();
threadPoolTaskExecutor.execute(() -> {
String heartBeatRequest = Constants.buildMessage(Constants.COMMAND_HEART_BEAT_QUERY);
MessageResultPojo resultPojo = NettyClient.sendMessage(ip, port, heartBeatRequest, Constants.COMMAND_HEART_BEAT_REPLY, 300);
});
}
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:08
*/
@Service
public class GetAlarmInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:05
*/
@Service
public class GetBaseInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:07
*/
@Service
public class GetDailyPlanInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:06
*/
@Service
public class GetDetectorInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:05
* @description 上载设备信息
*/
@Service
public class GetDeviceInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:08
*/
@Service
public class GetFaultInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:06
*/
@Service
public class GetLightsGroupInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/06/16 9:45
*/
@Service
public class GetLightsStatusInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:06
*/
@Service
public class GetPhaseInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:07
*/
@Service
public class GetPhaseSecurityInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.cache.SignalDataCache;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
import org.springframework.stereotype.Service;
/**
* 海信平台每隔5s推送灯态
*
* @author duanruiming
* @date 2023/05/12 16:07
*/
@Service
public class GetRunningStateInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
SignalDataCache.runningStateInfoCache.put(commandPojo.getCrossId(), (RunningLightsStatusPojo) commandPojo.getResponseMsg());
return commandPojo;
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:07
*/
@Service
public class GetSchedulesInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:07
*/
@Service
public class GetSchemeInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:06
*/
@Service
public class GetStageInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/06/19 14:27
*/
@Service
public class GetStageStatusService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.get;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:08
*/
@Service
public class GetTrafficDataInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:13
*/
@Service
public class SetAlarmInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:10
*/
@Service
public class SetBaseInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:13
*/
@Service
public class SetControlInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:11
*/
@Service
public class SetDailyPlanInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:10
*/
@Service
public class SetDetectorInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:09
*/
@Service
public class SetDeviceInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:13
*/
@Service
public class SetFaultInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:10
*/
@Service
public class SetLightsGroupInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:10
*/
@Service
public class SetPhaseInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:11
*/
@Service
public class SetPhaseSecurityInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:11
*/
@Service
public class SetSchedulesInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:11
*/
@Service
public class SetSchemeInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:10
*/
@Service
public class SetStageInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.netty.response.impl.set;
import net.wanji.utc.hisense.netty.pojo.CommandPojo;
import net.wanji.utc.hisense.netty.response.CommandResponseFactory;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/12 16:12
*/
@Service
public class SetTrafficDataInfoService implements CommandResponseFactory {
@Override
public Object getCommandResponse(CommandPojo commandPojo) {
return commandPojo.getResponseMsg();
}
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/06/14 17:31
*/
@Data
public class DailyPlanInfoPojo {
private Integer dailyPlanId;
private Integer controlCrossId;
private List<String> startTimeChain;
private List<Integer> schemeIdChain;
private List<Integer> controlModelChain;
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/06/16 8:43
*/
@Data
public class FaultInfoPojo {
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/06/14 10:35
*/
@Data
public class LightsInfoPojo {
private Integer lightId;
// 1-机动车 2-非机动车 3-行人 4-车道 5-可变交通标志 6-公交车灯具 7-有轨电车专用灯 8-特殊灯
private Integer type;
public static Integer getLightsDir(Integer lightId) {
// 万集 灯组放行方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北
Integer dir = null;
if (lightId <= 4) {
dir = 1;
} else if (lightId <= 8) {
dir = 3;
} else if (lightId <= 12) {
dir = 5;
} else if (lightId <= 16) {
dir = 7;
}
return dir;
}
// 万集 灯组转向:1左转;2右转;3直行;4左掉头;5直左;6直右;7右掉头;8向左合流;9向右合流;10左转加掉头;11右转加掉头;
// 12直行加左掉头;13直行加右掉头;14左转右转;15左直右;16左转右转加掉头;17左直掉头;18左直右掉头;20行人
public static Integer getTurnDir(Integer lightId, Integer type) {
Integer turnDir = null;
if (type == 3) {
turnDir = 20;
return turnDir;
}
if (lightId % 4 == 1 && type ==1) {
turnDir = 1;
} else {
turnDir = 6;
}
return turnDir;
}
public static void main(String[] args) {
System.err.println(1 % 4 == 1);
}
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/06/13 14:21
* @description 相位信息转换实体
*/
@Data
@NoArgsConstructor
public class PhaseInfoPojo {
private Integer phaseId;
private Integer lightsId;
private Integer greenTime;
private Integer greenFlashTime;
private Integer yellowTime;
private Integer yellowFlashTime;
private Integer redTime;
private Integer minGreenTime;
private Integer maxGreenTime;
private Integer maxGreenTime2;
private Integer extendGreenTime;
public static PhaseInfoPojo getPhaseInfoPojoByPhaseId(Integer phaseId, List<PhaseInfoPojo> phaseInfoPojos) {
for (PhaseInfoPojo phaseInfoPojo : phaseInfoPojos) {
if (Objects.equals(phaseInfoPojo.getPhaseId(), phaseId)) {
return phaseInfoPojo;
}
}
return null;
}
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/06/14 11:25
*/
@Data
public class PhaseStageInfoPojo {
private Integer phaseStageId;
private List<Integer> phaseList;
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/06/19 14:29
*/
@Data
public class PhaseStageStatusPojo {
private Integer phaseStageId;
// 10 未放行 20 正在放行 30 过渡
private String phaseStageStatus;
private Integer runningTime;
private Integer remainTime;
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 海信运行状态实体
* @author duanruiming
* @date 2023/06/29 9:08
*/
@Data
public class RunningLightsStatusPojo {
// 路口编号
private String CID;
// 周期长
private Integer CC;
// 周期倒计时
private Integer CCCD;
// 当前控制模式
private Integer CCM;
// 当前控制方式
private Integer CCT;
private List<Channel> CHANNEL;
// 当前运行方案号
private Integer PLN;
// 信号机参数版本
private Integer PV;
// 系统时间戳,毫秒级
private Date TS;
private List<Phase> PHASE;
@Data
public static class Phase {
// 相位灯态 1-绿灯 2-红灯 4-黄灯
private Integer LS;
// 相位倒计时
private Integer PCD;
// 相位号
private Integer PHN;
// 相位绿信比
private Integer PS;
}
@Data
public static class Channel {
// 32个通道信息 1-绿灯 2-红灯 4-黄灯
private List<Integer> SCS;
}
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/06/16 10:00
*/
@Data
public class RunningStatusPojo {
private Integer controlCrossId;
private String controlMode;
private Integer schemeId;
private Integer phaseStageId;
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/06/15 15:07
*/
@Data
public class ScheduleInfoPojo {
private Integer scheduleId;
private Integer controlCrossId;
private Integer priority;
private List<Integer> week;
private List<Integer> month;
private List<Integer> day;
private Integer dailyPlanId;
}
package net.wanji.utc.hisense.pojo.convert;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author duanruiming
* @date 2023/06/14 15:39
*/
@Data
public class SchemeInfoPojo {
private Integer schemeId;
// 所属方案序号 一台信号机控制多路口时使用
private Integer controlCrossId;
// 单位s
private Integer cycle;
// 方案协调序号 需要协调的相位序号
private Integer harmonizeId;
private Integer offset;
private List<Integer> phaseStageChain;
private List<Integer> phaseStageTimeChain;
// 10 固定出现 20 检测器按需出现
private List<Integer> phaseStageTypeChain;
@Data
public static class SchemeStagePojo {
private Integer schemeId;
private Integer phaseStageId;
private Integer phaseStageTime;
private Integer phaseStageType;
}
public static List<SchemeStagePojo> getStageInfoList(SchemeInfoPojo schemeInfoPojo) {
if (Objects.nonNull(schemeInfoPojo)) {
List<SchemeStagePojo> schemeStagePojos = new ArrayList<>();
for (int i = 0; i < schemeInfoPojo.getPhaseStageChain().size(); i++) {
SchemeStagePojo schemeStagePojo = new SchemeStagePojo();
schemeStagePojo.setSchemeId(schemeInfoPojo.getSchemeId());
schemeStagePojo.setPhaseStageId(schemeInfoPojo.getPhaseStageChain().get(i));
schemeStagePojo.setPhaseStageTime(schemeInfoPojo.getPhaseStageTimeChain().get(i));
schemeStagePojo.setPhaseStageType(schemeInfoPojo.getPhaseStageTypeChain().get(i));
schemeStagePojos.add(schemeStagePojo);
}
return schemeStagePojos;
}
return null;
}
}
package net.wanji.utc.hisense.pojo.netty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.concurrent.CountDownLatch;
/**
* @author duanruiming
* @date 2023/05/08 14:14
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MessageResultPojo {
/**
* 命令标识
*/
private String sign;
/**
* 计数对象
*/
private CountDownLatch countDownLatch;
/**
* 消息请求时间
*/
private long startTime;
/**
* 灯态毫秒时长
*/
private int waitMillisecond;
/**
* netty响应消息16进制字符串
*/
private Object hexMessageResult;
}
package net.wanji.utc.hisense.service;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.mapper.CrossInfoMapper;
import net.wanji.databus.dao.mapper.ManufacturerInfoMapper;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.po.ManufacturerInfoPO;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/08 16:12
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CommonService {
private final CrossInfoMapper crossInfoMapper;
private final ManufacturerInfoMapper manufacturerInfoMapper;
/**
* 通过路口编号获取厂商编码
*
* @param crossId
* @return
*/
@NonNull
public String getManufacturerCodeByCrossId(String crossId) {
CrossInfoPO crossInfoPO = crossInfoMapper.selectByPrimaryKey(crossId);
Integer manufacturerId = crossInfoPO.getManufacturerId();
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(manufacturerId);
return manufacturerInfoPO.getCode();
}
}
package net.wanji.utc.hisense.service.controller;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.vo.*;
/**
* @author duanruiming
* @date 2023/05/08 10:42
*/
public interface ControlCommandService {
/**
* 方案下发
*/
JsonViewObject schemeSend(SchemeSendVO schemeSendVO) throws Exception;
/**
* 计划下发
*
* @param planSendVO 计划下发VO
* @return
*/
JsonViewObject planSend(PlanSendVO planSendVO) throws Exception;
/**
* 时间表下发
*
* @param scheduleSendVO 时间表下发VO
* @return
*/
JsonViewObject scheduleSend(ScheduleSendVO scheduleSendVO) throws Exception;
/**
* 锁定控制
*
* @param commandVO 控制指令VO
* @return
* @throws Exception 异常
*/
JsonViewObject lockControl(ControlCommandVO commandVO) throws Exception;
/**
* 步进控制
*
* @param code 信号机编号
* @param command 1 开始步进 0 取消步进
* @param stepNum 0 顺序步进 n 跳过n个相位
* @return
* @throws Exception 异常
*/
JsonViewObject stepControl(String code, Integer command, Integer stepNum) throws Exception;
/**
* 设置信号机控制模式
*
* @param commandVO 信号机编号
* @return
* @throws Exception 异常
*/
JsonViewObject setSignalControl(ControlCommandVO commandVO) throws Exception;
/**
* 恢复时间表
*
* @param code 信号机编号
* @return
*/
JsonViewObject recoverSchedule(String code) throws Exception;
/**
* 相位配时下发
*
* @return
* @throws InterruptedException 中断异常
*/
JsonViewObject phaseTimingSend(PhaseTimingSendVO phaseTimingSendVO) throws Exception;
/**
* 相位差下发
*/
JsonViewObject phaseDiffSend();
/**
* 删除信号机配置参数
* 删除信号机配置参数-目前支持相位、方案、计划、日期
*
* @param delBaseConfigPO
* @return
*/
// JsonViewObject delBaseConfig(DelBaseConfigPOfigPO delBaseConfigPO) throws Exception;
}
package net.wanji.utc.hisense.service.controller;
import net.wanji.databus.po.SignalStatusLogPO;
import net.wanji.databus.vo.LightsStatusVO;
import java.util.List;
/**
* @author Kent HAN
* @date 2022/11/21 9:09
*/
public interface SignalStatusService {
/**
* todo 提供给其他平台,需要确认以厂商还是以路口形式推送数据
*
* @param crossId
* @return
*/
List<SignalStatusLogPO> runningStatusAlarm(String crossId);
List<LightsStatusVO> lightStatus(String crossId);
}
package net.wanji.utc.hisense.service.controller;
import net.wanji.databus.dao.entity.CrossSchedulesPO;
import net.wanji.databus.dto.CrossInfoDTO;
import net.wanji.databus.dto.CrossSchedulesDTO;
import net.wanji.databus.dto.PlanSectionDTO;
import net.wanji.databus.dto.SchemePhaseLightsDTO;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import java.util.List;
public interface StaticInfoService {
List<CrossInfoPO> crossBasicInfo(CrossInfoDTO crossInfoDTO) throws Exception;
SchemePhaseLightsVO schemePhaseLights(SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception;
List<PlanSectionVO> planSection(PlanSectionDTO planSectionDTO) throws Exception;
List<CrossSchedulesPO> crossSchedules(CrossSchedulesDTO crossSchedulesDTO) throws Exception;
}
package net.wanji.utc.hisense.service.controller.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.vo.*;
import net.wanji.utc.hisense.service.controller.ControlCommandService;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/08 10:43
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class ControlCommandServiceImpl implements ControlCommandService {
@Override
public JsonViewObject schemeSend(SchemeSendVO schemeSendVO) throws Exception {
return null;
}
@Override
public JsonViewObject planSend(PlanSendVO planSendVO) throws Exception {
return null;
}
@Override
public JsonViewObject scheduleSend(ScheduleSendVO scheduleSendVO) throws Exception {
return null;
}
@Override
public JsonViewObject lockControl(ControlCommandVO commandVO) throws Exception {
return null;
}
@Override
public JsonViewObject stepControl(String code, Integer command, Integer stepNum) throws Exception {
return null;
}
@Override
public JsonViewObject setSignalControl(ControlCommandVO commandVO) throws Exception {
return null;
}
@Override
public JsonViewObject recoverSchedule(String code) throws Exception {
return null;
}
@Override
public JsonViewObject phaseTimingSend(PhaseTimingSendVO phaseTimingSendVO) throws Exception {
return null;
}
@Override
public JsonViewObject phaseDiffSend() {
return null;
}
}
package net.wanji.utc.hisense.service.controller.impl;
import net.wanji.databus.po.SignalStatusLogPO;
import net.wanji.databus.vo.LightsStatusVO;
import net.wanji.utc.hisense.cache.SignalDataCache;
import net.wanji.utc.hisense.common.enums.ControlModelEnum;
import net.wanji.utc.hisense.common.enums.PhaseLightColorEnum;
import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
import net.wanji.utc.hisense.service.controller.SignalStatusService;
import net.wanji.utc.hisense.util.CommonUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
/**
* @author duanruiming
* @date 2023/05/08 17:28
*/
@Service
public class SignalStatusServiceImpl implements SignalStatusService {
@Override
public List<SignalStatusLogPO> runningStatusAlarm(String crossId) {
return null;
}
@Override
public List<LightsStatusVO> lightStatus(String crossId) {
List<LightsStatusVO> lightsStatusVOS = new ArrayList<>();
Map<String, RunningLightsStatusPojo> runningStateInfoCache = SignalDataCache.runningStateInfoCache;
if (!runningStateInfoCache.isEmpty()) {
RunningLightsStatusPojo runningLightsStatusPojo = runningStateInfoCache.get(crossId);
LightsStatusVO lightsStatusVO = new LightsStatusVO();
lightsStatusVO.setCrossId(crossId);
String runMode = String.valueOf(ControlModelEnum.getWjControlMode(runningLightsStatusPojo.getCCT()));
lightsStatusVO.setRunMode(runMode);
lightsStatusVO.setCycleLen(runningLightsStatusPojo.getCC());
// 相位剩余时长
List<RunningLightsStatusPojo.Phase> phaseList = runningLightsStatusPojo.getPHASE();
Integer phaseId = 0;
Integer phaseCountDown = 0;
for (RunningLightsStatusPojo.Phase phase : phaseList) {
Integer ls = phase.getLS();
if (Objects.equals(ls, 1)) { // 当前相位绿灯
phaseId = phase.getPHN();
phaseCountDown = phase.getPCD();
}
}
lightsStatusVO.setCycleCountDown(phaseCountDown);
lightsStatusVO.setPhaseId(String.valueOf(phaseId));
lightsStatusVO.setSchemeId(String.valueOf(runningLightsStatusPojo.getPLN()));
List<RunningLightsStatusPojo.Channel> channelList = runningLightsStatusPojo.getCHANNEL();
Map<String, Object> dirLampGroupMap = new HashMap<>();
if (!CollectionUtils.isEmpty(channelList)) {
for (RunningLightsStatusPojo.Channel channel : channelList) {
List<Integer> scs = channel.getSCS();
if (!CollectionUtils.isEmpty(scs)) {
for (int i = 0; i < scs.size(); i++) {
Map<Integer, String> turnColorMap = new HashMap<>();
String lightsColor = String.valueOf(scs.get(i));
String wjLightColor = PhaseLightColorEnum.getWjLightColor(lightsColor);
Integer turn = CommonUtils.getTurnByLightsId(i);
turnColorMap.put(turn, wjLightColor);
String dir = String.valueOf(CommonUtils.getDirByLightsId(i));
if (dirLampGroupMap.isEmpty() || Objects.isNull(dirLampGroupMap.get(dir))) {
dirLampGroupMap.put(dir, turnColorMap);
} else {
Map<Integer, String> currentTurnColorMap = (Map<Integer, String>) dirLampGroupMap.get(dir);
currentTurnColorMap.put(turn, wjLightColor);
dirLampGroupMap.put(dir, currentTurnColorMap);
}
}
}
}
}
lightsStatusVO.setDirLampGroupMap(dirLampGroupMap);
lightsStatusVOS.add(lightsStatusVO);
}
return lightsStatusVOS;
}
}
package net.wanji.utc.hisense.service.controller.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.entity.CrossSchedulesPO;
import net.wanji.databus.dto.CrossInfoDTO;
import net.wanji.databus.dto.CrossSchedulesDTO;
import net.wanji.databus.dto.PlanSectionDTO;
import net.wanji.databus.dto.SchemePhaseLightsDTO;
import net.wanji.databus.po.CrossInfoPO;
import net.wanji.databus.vo.PlanSectionVO;
import net.wanji.databus.vo.SchemePhaseLightsVO;
import net.wanji.utc.hisense.service.controller.StaticInfoService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author duanruiming
* @date 2023/05/08 17:29
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class StaticInfoServiceImpl implements StaticInfoService {
@Override
public List<CrossInfoPO> crossBasicInfo(CrossInfoDTO crossInfoDTO) throws Exception {
return null;
}
@Override
public SchemePhaseLightsVO schemePhaseLights(SchemePhaseLightsDTO schemePhaseLightsDTO) throws Exception {
return null;
}
@Override
public List<PlanSectionVO> planSection(PlanSectionDTO planSectionDTO) throws Exception {
return null;
}
@Override
public List<CrossSchedulesPO> crossSchedules(CrossSchedulesDTO crossSchedulesDTO) throws Exception {
return null;
}
}
package net.wanji.utc.hisense.service.protocol;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/08 10:25
*/
public interface ProtocolConversion<R, T> {
/**
* 协议解析为实体类
*
* @param crossInfo
* @return
*/
R protocolConvertEntity(CrossInfoPO crossInfo);
String entityConvertProtocol(T t);
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:29
*/
public class DailyPlanProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:24
*/
public class DetectorProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:20
*/
public class LightsGroupProtocolConvertionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.netty.NettyClient;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/09 17:35
*/
public class PhaseProtocolConversionService implements ProtocolConversion<Object, Object> {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
MessageResultPojo resultPojo = NettyClient.sendMessage("ip", 80, "aadd", "1122", 300);
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:27
*/
public class PhaseSecurityProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:30
*/
public class ScheduleProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:29
*/
public class SchemeProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.hisense.netty.NettyClient;
import net.wanji.utc.hisense.pojo.netty.MessageResultPojo;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
import org.springframework.stereotype.Service;
/**
* @author duanruiming
* @date 2023/05/16 17:16
*/
@Service
@Slf4j
public class SignalDeviceProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
MessageResultPojo resultPojo = NettyClient.sendMessage("10.102.1.204", 5050, "0x7e00120001010000000101011001000501030000005CB40x7d", "20", 300);
log.info("设备基本信息: {}", resultPojo);
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.base;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/11 18:25
*/
public class StageProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.control;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/12 10:14
*/
public class ControlProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.service.protocol.impl.status;
import net.wanji.utc.hisense.service.protocol.ProtocolConversion;
import net.wanji.databus.po.CrossInfoPO;
/**
* @author duanruiming
* @date 2023/05/12 10:16
*/
public class RunningStateProtocolConversionService implements ProtocolConversion {
@Override
public Object protocolConvertEntity(CrossInfoPO crossInfo) {
return null;
}
@Override
public String entityConvertProtocol(Object o) {
return null;
}
}
package net.wanji.utc.hisense.util;
import cn.hutool.core.util.HexUtil;
/**
* @author duanruiming
* @date 2023/05/12 15:26
*/
public class CRC16Utils {
/**
* 获取CRC16校验结果 【报文长度+报文体】
*
* @param body
* @return
*/
public static String getCRC16HexStr(String body) {
byte[] bytes = HexUtil.decodeHex(body);
int result = crc16(bytes);
return HexUtil.toHex(result);
}
/**
* 多项式1005 初始值0000 异或值0000 不反转
*
* @param bytes
* @return
*/
public static int crc16(byte[] bytes) {
int crc = 0x0000;
for (byte b : bytes) {
crc ^= (b << 8);
for (int i = 0; i < 8; i++) {
if ((crc & 0x8000) != 0) {
crc = (crc << 1) ^ 0x1005;
} else {
crc = (crc << 1);
}
}
}
return crc & 0xFFFF;
}
}
package net.wanji.utc.hisense.util;
import cn.hutool.core.util.HexUtil;
import freemarker.template.utility.StringUtil;
/**
* @author duanruiming
* @date 2023/06/20 15:07
*/
public class CommonUtils {
/**
* 将数组转化为16进制字符串
*
* @param array
* @return
*/
public static String getHex4Array(int[] array) {
StringBuilder sb = new StringBuilder();
for (int i : array) {
sb.append(i);
}
Integer binary = Integer.valueOf(sb.reverse().toString(), 2);
return HexUtil.toHex(binary);
}
/**
* 将时间转化为16进制 00:00 --> 061E0
*
* @param time
* @return
*/
public static String getHourMinuteHex(String time) {
StringBuffer sb = new StringBuffer();
String[] split = time.split(":");
String hour = String.format("%02x", Integer.valueOf(split[0]));
String minute = String.format("%02x", Integer.valueOf(split[1]));
return sb.append(hour).append(minute).toString();
}
/**
* 将相位转化为64位数组,在转化为16位的16进制
*
* @param param
* @return
*/
public static String getBinary(Integer param) {
int[] array = new int[64];
array[param - 1] = 1;
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < array.length / 8; i++) {
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 8; j++) {
sb.append(array[i * 8 + j]);
}
String hex = String.format("%02x", Integer.parseInt(sb.reverse().toString(), 2));
resultSb.insert(0, hex);
}
return StringUtil.leftPad(resultSb.toString(), 16, "0");
}
/**
* 将单个参数转化为4位二进制
*
* @param param
* @return
*/
public static Integer get4BinaryInteger(Integer param) {
int[] array = new int[4];
int index = param % 4;
if (param % 4 != 0) {
array[4 - index] = 1;
} else {
array[0] = 1;
}
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 4; j++) {
sb.append(array[j]);
}
return Integer.parseInt(sb.toString(), 2);
}
/**
* 通过灯组编号获取灯组转向, 1 左转 2 直右 3 右 4 行人
*
* @param lightId
* @return
*/
public static Integer getTurnByLightsId(Integer lightId) {
Integer turn = null;
if (lightId % 4 == 0) {
turn = 1;
}
if (lightId % 4 == 1) {
turn = 2;
}
if (lightId % 4 == 2) {
turn = 3;
}
if (lightId % 4 == 3) {
turn = 20;
}
return turn;
}
public static Integer getDirByLightsId(Integer lightsId) {
Integer dir = null;
if (lightsId < 4) {
dir = 1;
}
if (lightsId >= 4 && lightsId < 8) {
dir = 3;
}
if (lightsId >= 8 && lightsId < 12) {
dir = 5;
}
if (lightsId >= 12 && lightsId < 16) {
dir = 7;
}
return dir;
}
public static void main(String[] args) {
System.err.println(get4BinaryInteger(4));
}
}
spring:
cloud:
nacos:
config:
server-addr: 10.102.1.182:8848
file-extension: yaml
group: signal
namespace: signal
username: nacos
password: nacos
application:
# dubbo启动需要程序名称
name: utc-dt
main:
allow-circular-references: true
spring:
profiles:
active: dev
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="encoding" value="UTF-8"/>
<property name="normal-pattern"
value="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n"/>
<property name="LOG_PATH" value="./logs"/>
<!-- 配置打印DEBUG级别日志的环境. 多个使用逗号隔开. -->
<springProfile name="dev,test">
<!-- 如果需要,请自行开启spring或其他组件的debug级别 -->
<logger name="net.wanji.com" level="info"/>
</springProfile>
<!-- 配置打印INFO级别日志的环境 -->
<springProfile name="prod">
<logger name="net.wanji.utc.hisense" level="info" />
</springProfile>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
${normal-pattern}
</pattern>
</layout>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/dt/info.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>${normal-pattern}</pattern>
<charset>${encoding}</charset>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_PATH}/dt/%d{yyyy-MM-dd}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<MaxHistory>30</MaxHistory>
<totalSizeCap >10GB</totalSizeCap >
<maxFileSize>200MB</maxFileSize>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/dt/error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>>
<encoder>
<pattern>${normal-pattern}</pattern>
<charset>${encoding}</charset>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_PATH}/dt/%d{yyyy-MM-dd}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<MaxHistory>30</MaxHistory>
<totalSizeCap >10GB</totalSizeCap >
<maxFileSize>200MB</maxFileSize>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
\ No newline at end of file
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