Commit 75808894 authored by wuxiaokai's avatar wuxiaokai

控制指令接口-锁定控制/步进控制/全红控制/黄闪控制/关灯控制

parent e28421f3
......@@ -155,6 +155,11 @@
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.1.Final</version>
</dependency>
</dependencies>
<build>
......
package net.wanji.utc;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Collections;
/**
* @author wuxiaokai
* @date 2022/4/14 10:50:34
*/
public class MybatisPlusGenerator {
private static final String PROJECT_PATH = System.getProperty("user.dir");
private static final String OUTPUT_DIR = "signal-utc-service/src/main/java";
private static final String AUTHOR = "wj";
private static final String URL = "jdbc:mysql://10.100.1.74:3306/t_signal_utc?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&useSSL=false&useCursorFetch=true";
private static final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
private static final String USERNAME = "root";
private static final String PASSWORD = "Wanji300552";
private static final String[] TABLES = {
"t_cross_info",
"t_cross_lights",
"t_cross_phase",
"t_cross_phase_lights",
"t_cross_plan",
"t_cross_schedules",
"t_cross_scheme",
"t_cross_section",
"t_manufacturer_api_info",
"t_manufacturer_info",
"t_signal_status_log",
"t_system_operate_log"
};
private static final String TEMPLATE_PATH = "/templates/mapper.xml.ftl";
private static final String MAPPER_PATH = "signal-utc-service/src/main/resources/mapper/";
private static final String PARENT = "net.wanji.utc";
public static void main(String[] args) {
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
.globalConfig(builder -> {
builder.author(AUTHOR) // 设置作者
// .enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir(OUTPUT_DIR) // 指定输出目录
.disableOpenDir();//禁止打开输出目录
})
.packageConfig(builder -> {
builder.parent(PARENT)// 设置父包名
//.moduleName(null) // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, MAPPER_PATH)); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude(TABLES) // 设置需要生成的表名
//.addTablePrefix(null) // 设置过滤表前缀
//Service 策略配置
.serviceBuilder()
.formatServiceFileName("%sService")//格式化 service 接口文件名称
.formatServiceImplFileName("%sServiceImpl")//格式化 service 实现类文件名称
//Entity 策略配置
.entityBuilder()
.enableChainModel()//开启链式模型
.enableLombok()//开启Lombok模型
.enableTableFieldAnnotation()//开启生成实体时生成字段注解
//.logicDeleteColumnName("deleted")//默认删除属性名称(数据库)
//.logicDeletePropertyName("deleted")//默认删除属性名称(实体)
//.versionColumnName("version")//乐观锁属性名(数据库)
//.versionPropertyName("version")//乐观锁属性名(实体)
//.addTableFills(new Column("create_Time", FieldFill.INSERT))//添加表字段填充(自动填充)
//.addTableFills(new Column("update_Time", FieldFill.INSERT_UPDATE))//添加表字段填充(自动填充)
//controller 策略配置
.controllerBuilder()
.enableRestStyle();//开启生成@RestController 控制器
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
package net.wanji.utc.common.constant;
import net.wanji.utc.common.commonentity.HttpRequest;
import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.po.ManufacturerApiInfoPO;
import net.wanji.utc.vo.CrossLanesVo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
......
package net.wanji.utc.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result;
import net.wanji.utc.service.control.ControlCommandService;
import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.ControlCommandVO;
import net.wanji.utc.vo.PlanSendVO;
import net.wanji.utc.vo.SchemeSendVO;
import net.wanji.utc.vo.ScheduleSendVO;
import net.wanji.utc.vo.SchemeSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
......@@ -44,22 +47,6 @@ public class ControlCommandController {
return hkControlCommandService.schemeSend(schemeSendVO);
}
/**
* todo
* 相位配时下发?
* 下发信号机方案?
*
* @param code 信号机id
* @param timePlans 配时方案实体类
* @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常
*/
@ApiOperation(value = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发", notes = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发")
@PostMapping("/phaseTimingSend")
public <T> Result<T> phaseTimingSend(@RequestParam String code, @RequestBody List<TimePlanVO> timePlans) throws InterruptedException {
return hkControlCommandService.phaseTimingSend(code, timePlans);
}
/**
* 下发信号机计划
*
......@@ -73,42 +60,69 @@ public class ControlCommandController {
}
/**
* 全红控制
* 时间表下发
*
* @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 code 信号机id
* @param command 指令
* @param timePlans 配时方案实体类
* @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常
*/
@ApiOperation(value = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发", notes = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发")
@PostMapping("/phaseTimingSend")
public <T> Result<T> phaseTimingSend(@RequestParam String code, @RequestBody List<TimePlanVO> timePlans) throws Exception {
return hkControlCommandService.phaseTimingSend(code, timePlans);
}
/**
* 全红控制
*
* @param commandVO 控制指令VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
@ApiOperation(value = "全红控制-路口全红控制/恢复", notes = "全红控制-路口全红控制/恢复")
@PostMapping("/allRedControl")
public <T> Result<T> allRedControl(@RequestParam String code, @RequestParam Integer command) throws Exception {
return hkControlCommandService.setSignalControl(code, command, ALL_RED_CONTROL);
public <T> Result<T> allRedControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return hkControlCommandService.setSignalControl(commandVO.getCrossCode(), commandVO.getCommand(), ALL_RED_CONTROL);
}
/**
* 黄闪控制
*
* @param code 信号id
* @param command 命令
* @param commandVO 控制指令VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
@ApiOperation(value = "黄闪控制-路口黄闪控制/恢复", notes = "黄闪控制-路口黄闪控制/恢复")
@PostMapping("/yellowLightControl")
public <T> Result<T> yellowLightControl(@RequestParam String code, @RequestParam Integer command) throws Exception {
return hkControlCommandService.setSignalControl(code, command, YELLOW_LIGHT_CONTROL);
public <T> Result<T> yellowLightControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return hkControlCommandService.setSignalControl(commandVO.getCrossCode(), commandVO.getCommand(), YELLOW_LIGHT_CONTROL);
}
/**
* 关灯控制
*
* @param code 信号id
* @param command 命令
* @param commandVO 控制指令VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
@ApiOperation(value = "关灯控制-路口关灯控制/开灯", notes = "关灯控制-路口关灯控制/开灯")
@PostMapping("/closeLightControl")
public <T> Result<T> closeLightControl(@RequestParam String code, @RequestParam Integer command) throws Exception {
return hkControlCommandService.setSignalControl(code, command, CLOSE_LIGHT_CONTROL);
public <T> Result<T> closeLightControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return hkControlCommandService.setSignalControl(commandVO.getCrossCode(), commandVO.getCommand(), CLOSE_LIGHT_CONTROL);
}
/**
......@@ -120,6 +134,10 @@ public class ControlCommandController {
* @return {@link Result}<{@link T}>
*/
@ApiOperation(value = "步进控制-步进控制/恢复", notes = "步进控制-步进控制/恢复")
@ApiImplicitParams({
@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 <T> Result<T> stepControl(@RequestParam String code,
@RequestParam Integer command,
......@@ -139,29 +157,16 @@ public class ControlCommandController {
return hkControlCommandService.recoverSchedule(code);
}
/**
* 时间表下发
*
* @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 phaseLock 相位锁定实体类
* @param commandVO 控制指令VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
@ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁")
@PostMapping("/lockControl")
public <T> Result<T> lockControl(@RequestBody PhaseLockVO phaseLock) throws Exception {
return hkControlCommandService.lockControl(phaseLock);
public <T> Result<T> lockControl(@RequestBody ControlCommandVO commandVO) throws Exception {
return hkControlCommandService.lockControl(commandVO);
}
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 路口基础表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_info")
public class TCrossInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 路口ID
*/
@TableId("id")
private String id;
/**
* 路口名称
*/
@TableField("name")
private String name;
/**
* 信号机编号
*/
@TableField("code")
private String code;
/**
* 厂商ID
*/
@TableField("manufacturer_id")
private Integer manufacturerId;
/**
* 信号机IP
*/
@TableField("ip")
private String ip;
/**
* 信号机端口
*/
@TableField("port")
private Integer port;
/**
* 经纬度
*/
@TableField("location")
private String location;
/**
* 版本号
*/
@TableField("version")
private String version;
/**
* 型号
*/
@TableField("po")
private String model;
/**
* 安装时间
*/
@TableField("install_time")
private LocalDateTime installTime;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 路口灯组表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_lights")
public class TCrossLights implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 灯组ID
*/
@TableId("id")
private Integer id;
/**
* 灯组号
*/
@TableField("no")
private String no;
/**
* 灯组名称
*/
@TableField("name")
private String name;
/**
* 灯组类型:1箭头,2圆饼,3行人
*/
@TableField("type")
private Integer type;
/**
* 灯组方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北
*/
@TableField("dir")
private Integer dir;
/**
* 灯组转向:1左转;2右转;3直行;4左掉头;5直左;6直右;7右掉头;8向左合流;9向右合流;10左转加掉头;11右转加掉头;12直行加左掉头;13直行加右掉头;14左转右转;15左直右;16左转右转加掉头;17左直掉头;18左直右掉头;20行人
*/
@TableField("turn")
private Integer turn;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 行人进出口:1进口,2出口,3进出口
*/
@TableField("in_out_type")
private Integer inOutType;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 路口相位表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_phase")
public class TCrossPhase implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 相位ID
*/
@TableId("id")
private Integer id;
/**
* 相位号
*/
@TableField("no")
private String no;
/**
* 相位名称
*/
@TableField("name")
private String name;
/**
* 相位序号
*/
@TableField("sort")
private Integer sort;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 方案ID
*/
@TableField("plan_id")
private Integer planId;
/**
* 环号
*/
@TableField("ring_no")
private Integer ringNo;
/**
* 控制模式:1定周期;2绿灯;3黄灯;4红灯;5关灯;6绿闪;7黄闪;8红闪
*/
@TableField("control_mode")
private Integer controlMode;
/**
* 相位时间
*/
@TableField("phase_time")
private Integer phaseTime;
/**
* 绿灯时间
*/
@TableField("green_time")
private Integer greenTime;
/**
* 绿闪时间
*/
@TableField("green_flash_time")
private Integer greenFlashTime;
/**
* 行闪时间
*/
@TableField("ped_flash_time")
private Integer pedFlashTime;
/**
* 黄灯时间
*/
@TableField("yellow_time")
private Integer yellowTime;
/**
* 红灯时间
*/
@TableField("red_time")
private Integer redTime;
/**
* 最小绿灯时间
*/
@TableField("min_green_time")
private Integer minGreenTime;
/**
* 最大绿灯时间
*/
@TableField("max_green_time")
private Integer maxGreenTime;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 相位灯组关系表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_phase_lights")
public class TCrossPhaseLights implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId("id")
private Integer id;
/**
* 灯组ID
*/
@TableField("lights_id")
private Integer lightsId;
/**
* 相位ID
*/
@TableField("phase_id")
private Integer phaseId;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 路口计划表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_plan")
public class TCrossPlan implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 计划ID
*/
@TableId("id")
private Integer id;
/**
* 计划号
*/
@TableField("no")
private String no;
/**
* 计划名称
*/
@TableField("name")
private String name;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 时间表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_schedules")
public class TCrossSchedules implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 日期ID
*/
@TableId("id")
private Integer id;
/**
* 日期名称
*/
@TableField("name")
private String name;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 计划ID
*/
@TableField("plan_id")
private Integer planId;
/**
* 星期:1周一,2周二,3周三,4周四,5周五,6周六,7周日,0特殊日期
*/
@TableField("week")
private Integer week;
/**
* 特殊日期
*/
@TableField("special_date")
private LocalDateTime specialDate;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 信号方案表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_scheme")
public class TCrossScheme implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 方案ID
*/
@TableId("id")
private Integer id;
/**
* 方案号
*/
@TableField("no")
private String no;
/**
* 方案名称
*/
@TableField("name")
private String name;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 周期
*/
@TableField("cycle")
private Integer cycle;
/**
* 协调相位ID
*/
@TableField("coord_phase")
private Integer coordPhase;
/**
* 相位差
*/
@TableField("offset")
private Integer offset;
/**
* 数据来源:1信号机;2平台
*/
@TableField("source")
private Integer source;
/**
* 删除标识:1删除;0未删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 路口时段表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_cross_section")
public class TCrossSection implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 时段ID
*/
@TableId("id")
private Integer id;
/**
* 时段号
*/
@TableField("no")
private String no;
/**
* 开始时间
*/
@TableField("start_time")
private String startTime;
/**
* 结束时间
*/
@TableField("end_time")
private String endTime;
/**
* 路口ID
*/
@TableField("cross_id")
private String crossId;
/**
* 计划ID
*/
@TableField("plan_id")
private Integer planId;
/**
* 控制模式:1定周期;2绿波协调;3黄闪;4全红;5关灯;6单点自适应;7全感应;8半感应;9
*/
@TableField("control_mode")
private Integer controlMode;
/**
* 方案ID
*/
@TableField("sceme_id")
private Integer scemeId;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 厂商平台接口表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_manufacturer_api_info")
public class TManufacturerApiInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 接口ID
*/
@TableId("id")
private Integer id;
/**
* 接口代码
*/
@TableField("code")
private String code;
/**
* 接口名称
*/
@TableField("name")
private String name;
/**
* 接口类型:1、静态;2、动态;3、控制
*/
@TableField("type")
private Integer type;
/**
* 请求方式:GET、POST
*/
@TableField("method")
private String method;
/**
* 接口地址
*/
@TableField("address")
private String address;
/**
* 厂商ID
*/
@TableField("manufacturer_id")
private Integer manufacturerId;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 厂商基础表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_manufacturer_info")
public class TManufacturerInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 厂商ID
*/
@TableId("id")
private Integer id;
/**
* 厂商代码
*/
@TableField("code")
private String code;
/**
* 厂商名称
*/
@TableField("name")
private String name;
/**
* 厂商简称
*/
@TableField("nick_name")
private String nickName;
/**
* 平台地址
*/
@TableField("address")
private String address;
/**
* 维护单位
*/
@TableField("maintenance_unit")
private String maintenanceUnit;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private LocalDateTime gmtModified;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 信号机状态日志表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_signal_status_log")
public class TSignalStatusLog implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 日志ID
*/
@TableId("id")
private Integer id;
/**
* 信号机ID
*/
@TableField("signal_id")
private String signalId;
/**
* 信号状态:0离线;1在线
*/
@TableField("status")
private Integer status;
/**
* 故障类型:0正常;1检测器故障;2时钟故障;3电源故障;4驱动模块故障;5信号灯故障;6箱门开启;7方案错误;8绿冲突;9红全熄;10行人红熄;
*/
@TableField("fault_type")
private Integer faultType;
/**
* 控制类型:1时间表;2全红;3黄闪;4锁定;5中心优化;6MEC优化;7现场手动
*/
@TableField("control_type")
private Integer controlType;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
}
package net.wanji.utc.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 系统操作日志表
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_system_operate_log")
public class TSystemOperateLog implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 日志ID
*/
@TableId("id")
private Integer id;
/**
* 访问地址
*/
@TableField("url")
private String url;
/**
* 调用方IP
*/
@TableField("ip")
private String ip;
/**
* 操作用户
*/
@TableField("opt_user")
private String optUser;
/**
* 操作类型:1添加;2删除;3修改;4查询
*/
@TableField("opt_type")
private Integer optType;
/**
* 请求参数
*/
@TableField("args")
private String args;
/**
* 响应状态
*/
@TableField("status")
private String status;
/**
* 响应结果
*/
@TableField("result")
private String result;
/**
* 创建时间
*/
@TableField("gmt_create")
private LocalDateTime gmtCreate;
}
package net.wanji.utc.service.control;
import net.wanji.utc.common.Result;
import net.wanji.utc.vo.PhaseLockVO;
import net.wanji.utc.vo.ControlCommandVO;
import net.wanji.utc.vo.PlanSendVO;
import net.wanji.utc.vo.SchemeSendVO;
import net.wanji.utc.vo.ScheduleSendVO;
import net.wanji.utc.vo.SchemeSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import java.util.List;
......@@ -41,11 +41,11 @@ public interface ControlCommandService {
/**
* 锁定控制
*
* @param phaseLock 相位锁定实体类
* @param commandVO 控制指令VO
* @return {@link Result}<{@link T}>
* @throws Exception 异常
*/
<T> Result<T> lockControl(PhaseLockVO phaseLock) throws Exception;
<T> Result<T> lockControl(ControlCommandVO commandVO) throws Exception;
/**
* 步进控制
......@@ -85,7 +85,7 @@ public interface ControlCommandService {
* @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常
*/
<T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws InterruptedException;
<T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws Exception;
/**
* 相位差下发
......
......@@ -27,16 +27,12 @@ import net.wanji.utc.vo.*;
import net.wanji.utc.vo.timeplan.Phase;
import net.wanji.utc.vo.timeplan.Ring;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import static net.wanji.utc.common.ResultEnum.BODY_NOT_MATCH;
......@@ -50,9 +46,6 @@ import static net.wanji.utc.common.constant.Constants.*;
@Service("hkControlCommandService")
public class HKControlCommandServiceImpl implements ControlCommandService {
@Value("${signal.manufacturer.hk.artemisPath}")
private String artemisPath;
@Resource
private HkLightsStatusService hkLightsStatusService;
......@@ -385,57 +378,65 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
}
@Override
public <T> Result<T> lockControl(PhaseLockVO phaseLock) throws Exception {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(phaseLock.getCode());
public <T> Result<T> lockControl(ControlCommandVO commandVO) throws Exception {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(commandVO.getCrossCode());
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)) {
return updateManualLock(phaseLock.getCode(), phaseLock.getLockTime());
} else {
return controlSignal(phaseLock.getCode(), UNLOCK_RUNNING_CONTROL);
}
} else {
// todo else
return null;
}
}
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(crossInfoPo.getManufacturerId());
if (manufacturerInfoPO.getCode().equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
if (commandVO.getCommand().equals(TRUE)) {
Map<String, Object> param = new HashMap<String, Object>() {
private static final long serialVersionUID = 7462850358909460605L;
private <T> Result<T> updateManualLock(String code, Integer lockTime) throws Exception {
Map<String, Object> param = new HashMap<String, Object>() {{
put("crossCode", code);
{
put("crossCode", commandVO.getCrossCode());
put("controlType", LOCK_RUNNING_CONTROL);
}};
}
};
// 控制命令为灯态锁定时,设置相关车道参数信息
// 获取当前运行方案的相位id
List<SignalRunring> runrings = getSignalInfoVos(code).get(0).getRunrings();
//HK 为单环
List<SignalRunring> runrings = getSignalInfoVos(commandVO.getCrossCode()).get(0).getRunrings();
// HK 为单环
Integer phaseId = Integer.valueOf(runrings.get(0).getPhaseId());
//获取某一路口下海康相位和车道关系
Map<Integer, JSONArray> laneArrayMap = new HashMap<>();
getPhaseRelationLanes(code, laneArrayMap, new HashMap<>());
// 获取某一路口下海康相位和车道关系
Map<Integer, JSONArray> laneArrayMap = getPhaseRelationLanes(commandVO.getCrossCode());
param.put("laneInfos", laneArrayMap.get(phaseId));
param.put("controlNo", 0);
//控制时长,单位 s,0 则持续控制
param.put("duration", lockTime * 60);
return setSignalControl(param);
// 控制时长,单位 s,0 则持续控制
param.put("duration", 0);
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
PathUtil.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("相位锁定失败");
} else {
return controlSignal(commandVO.getCrossCode(), UNLOCK_RUNNING_CONTROL);
}
} else {
// todo else
return null;
}
}
/**
* 获取某一路口下海康相位和车道关系
*
* @param crossCode 信号机唯一编号
* @param laneArrayMap 相位与车道集合
* @param laneNoMap 转向和方向与车道关系集合
* @return {@link Map}<{@link Integer}, {@link JSONArray}> 相位与车道集合
* @throws Exception 异常
*/
private void getPhaseRelationLanes(String crossCode, Map<Integer, JSONArray> laneArrayMap, Map<String, Integer> laneNoMap) throws Exception {
private Map<Integer, JSONArray> getPhaseRelationLanes(String crossCode) throws Exception {
Map<String, String> path = PathUtil.getPathMapByApiCode("queryPhaseRlatLanes");
Map<String, String> queryMap = new HashMap<>();
queryMap.put("crossCode", crossCode);
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, null, queryMap, null, "application/json", null);
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, null, queryMap,
null, "application/json", null);
JSONObject object = JSON.parseObject(strResult);
Map<Integer, JSONArray> laneArrayMap = new HashMap<>();
if (HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY))) {
JSONObject data = object.getJSONObject("data");
JSONArray phaseList = data.getJSONArray("phaseList");
......@@ -445,14 +446,9 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
JSONArray laneList = lanesObject.getJSONArray("lanes");
// 存入相位与车道集合
laneArrayMap.put(phaseNo, laneList);
/*for (int j = 0; j < laneList.size(); j++) {
JSONObject laneObject = laneList.getJSONObject(j);
String key = laneObject.getString("direction") + SEPARATOR_UNDER_LINE + laneObject.getString("turn");
// 存入方向和转向对应的车道编号
laneNoMap.put(key, laneObject.getInteger("laneNo"));
}*/
}
}
return laneArrayMap;
}
@Override
......@@ -461,10 +457,51 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(crossInfoPo.getManufacturerId());
if (manufacturerInfoPO.getCode().equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
if (command.equals(TRUE)) {
return updateManualStep(code, stepNum);
Map<String, Object> param = new HashMap<String, Object>() {
private static final long serialVersionUID = -4365720940762732691L;
{
put("crossCode", code);
put("controlType", STEP_CONTROL);
}
};
int controlNo = 0;
if (0 != stepNum) {
//根据当前实时灯态获取运行的相位
LightsStatusVO lightsStatusVO = getSignalInfoVos(code).get(0);
//暂时按单环处理
String phaseId = lightsStatusVO.getRunrings().get(0).getPhaseId();
//获取方案数据列表
List<CrossPhasePO> baseCrossPhasePlanList = crossPhaseMapper.selectByCrossIdAndPlanId(lightsStatusVO.getCode(), lightsStatusVO.getPhasePlanId());
Map<String, List<CrossPhasePO>> groupByPhase = baseCrossPhasePlanList.stream().collect(Collectors.groupingBy(CrossPhasePO::getPhaseNo));
//根据相位获取当前相序
int newPhaseOrderId = 0;
for (String key : groupByPhase.keySet()) {
CrossPhasePO crossPhase = groupByPhase.get(key).get(0);
if (crossPhase.getPhaseNo().equals(phaseId)) {
newPhaseOrderId = (crossPhase.getSort() + stepNum) % groupByPhase.size();
}
}
//根据相序获取相位
for (String key : groupByPhase.keySet()) {
CrossPhasePO crossPhase = groupByPhase.get(key).get(0);
if (newPhaseOrderId == crossPhase.getSort()) {
controlNo = Integer.parseInt(crossPhase.getPhaseNo());
}
}
}
param.put("controlNo", controlNo);
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
PathUtil.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();
} else {
return controlSignal(code, CANCEL_STEP_CONTROL);
}
......@@ -480,8 +517,8 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(crossInfoPo.getManufacturerId());
if (manufacturerInfoPO.getCode().equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
Integer runningMode = command.equals(TRUE) ? commandType : NORMAL_RUNNING_CONTROL;
return controlSignal(code, runningMode);
} else {
......@@ -496,8 +533,8 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPo.getManufacturerId();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(crossInfoPo.getManufacturerId());
if (manufacturerInfoPO.getCode().equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
return controlSignal(code, NORMAL_RUNNING_CONTROL);
} else {
// todo else
......@@ -506,7 +543,7 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
}
@Override
public <T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws InterruptedException {
public <T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws Exception {
CrossInfoPO crossInfoPo = crossInfoMapper.selectByCode(code);
if (crossInfoPo == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
......@@ -542,8 +579,7 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
private boolean phaseTimingSend(TimePlanVO timePlan) {
try {
//获取某一路口下海康相位和车道关系
Map<Integer, JSONArray> laneArrayMap = new HashMap<>();
getPhaseRelationLanes(timePlan.getCode(), laneArrayMap, new HashMap<>());
Map<Integer, JSONArray> laneArrayMap = getPhaseRelationLanes(timePlan.getCode());
//拼接参数
JSONObject bodyObjectParam = new JSONObject();
JSONArray patternArrayParam = new JSONArray();
......@@ -594,55 +630,6 @@ public class HKControlCommandServiceImpl implements ControlCommandService {
return null;
}
private <T> Result<T> updateManualStep(String signalId, Integer stepNum) {
JSONObject bodyObjectParam = new JSONObject();
bodyObjectParam.put("crossCode", signalId);
bodyObjectParam.put("controlType", STEP_CONTROL);
int controlNo = 0;
if (0 != stepNum) {
//根据当前实时灯态获取运行的相位
LightsStatusVO lightsStatusVO = getSignalInfoVos(signalId).get(0);
//暂时按单环处理
String phaseId = lightsStatusVO.getRunrings().get(0).getPhaseId();
//获取方案数据列表
List<CrossPhasePO> baseCrossPhasePlanList = crossPhaseMapper.selectByCrossIdAndPlanId(lightsStatusVO.getCode(), lightsStatusVO.getPhasePlanId());
Map<String, List<CrossPhasePO>> groupByPhase = baseCrossPhasePlanList.stream().collect(Collectors.groupingBy(CrossPhasePO::getPhaseNo));
//根据相位获取当前相序
int newPhaseOrderId = 0;
for (String key : groupByPhase.keySet()) {
CrossPhasePO crossPhase = groupByPhase.get(key).get(0);
if (crossPhase.getPhaseNo().equals(phaseId)) {
newPhaseOrderId = (crossPhase.getSort() + stepNum) % groupByPhase.size();
}
}
//根据相序获取相位
for (String key : groupByPhase.keySet()) {
CrossPhasePO crossPhase = groupByPhase.get(key).get(0);
if (newPhaseOrderId == crossPhase.getSort()) {
controlNo = Integer.parseInt(crossPhase.getPhaseNo());
}
}
}
bodyObjectParam.put("controlNo", controlNo);
return setSignalControl(bodyObjectParam);
}
private <T> Result<T> setSignalControl(Map<String, Object> param) {
try {
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig,
PathUtil.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 code 信号机编号
* @param runningMode 0-多时段控制模式 1-关灯、2-黄闪、3-全红、11-取消步进控制、12-灯态锁定、13-灯态解锁
......
......@@ -5,31 +5,30 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* 相位锁定实体类
* 控制指令VO
*
* @author wuxiaokai
* @date 2022/11/15 15:05:57
*/
@Data
@ApiModel(value = "PhaseLockVO", description = "相位锁定实体类")
public class PhaseLockVO extends BaseCrossInfo {
@ApiModel(value = "ControlCommandVO", description = "相位锁定实体类")
public class ControlCommandVO{
/**
* 相位编号
*/
@ApiModelProperty(value = "相位编号")
private String phaseId;
@ApiModelProperty(value = "路口编号", notes = "路口编号")
@NotNull(message = "路口编号不可为空")
private String crossCode;
/**
* 1 锁定; 0 取消
*/
@ApiModelProperty(value = "1 锁定;0 取消")
@NotNull(message = "控制类型不可为空,1 锁定;0 取消")
@Max(value = 1, message = "控制类型:1是;0否")
@Min(value = 0, message = "控制类型:1是;0否")
private Integer command;
/**
* 相位锁定时间, 999 永久锁定,必须手动取消。0~999 过了这个这个时间,自动取消锁定。
*/
@ApiModelProperty(value = "相位锁定时间,999 永久锁定,必须手动取消;0~999,自动取消")
private Integer lockTime;
}
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