Commit f1f0d70a authored by wuxiaokai's avatar wuxiaokai

控制指令接口-下发相位参数

parent 75808894
...@@ -58,6 +58,11 @@ public class Constants { ...@@ -58,6 +58,11 @@ public class Constants {
*/ */
public static final String HK_CODE_KEY = "code"; public static final String HK_CODE_KEY = "code";
/**
* 海康返回成功码
*/
public static final String HK_SUCCESS_STRING_CODE = "0";
/** /**
* 失败-false * 失败-false
*/ */
......
package net.wanji.utc.config;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
/**
* @author wuxiaokai
* @date 2022/11/28 15:49:45
*/
@Configuration
public class ValidatorConfig {
/**
* Spring Validation默认会校验完所有字段,然后才抛出异常。可以通过一些简单的配置,开启Fail Fast模式,一旦校验失败就立即返回。
*/
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
// 快速失败模式
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
}
...@@ -7,17 +7,11 @@ import io.swagger.annotations.ApiOperation; ...@@ -7,17 +7,11 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result; import net.wanji.utc.common.Result;
import net.wanji.utc.service.control.ControlCommandService; import net.wanji.utc.service.control.ControlCommandService;
import net.wanji.utc.vo.ControlCommandVO; import net.wanji.utc.vo.*;
import net.wanji.utc.vo.PlanSendVO;
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.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
import static net.wanji.utc.common.constant.Constants.*; import static net.wanji.utc.common.constant.Constants.*;
/** /**
...@@ -73,17 +67,15 @@ public class ControlCommandController { ...@@ -73,17 +67,15 @@ public class ControlCommandController {
} }
/** /**
* 相位配时下发 * 相位配时下发-(下发相位参数)
* *
* @param code 信号机id
* @param timePlans 配时方案实体类
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常 * @throws InterruptedException 中断异常
*/ */
@ApiOperation(value = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发", notes = "相位配时下发-相位的绿灯、绿闪、行闪、黄灯、红灯配时下发") @ApiOperation(value = "相位配时下发-(下发相位参数)", notes = "相位配时下发-(下发相位参数)")
@PostMapping("/phaseTimingSend") @PostMapping("/phaseTimingSend")
public <T> Result<T> phaseTimingSend(@RequestParam String code, @RequestBody List<TimePlanVO> timePlans) throws Exception { public <T> Result<T> phaseTimingSend(@RequestBody PhaseTimingSendVO phaseTimingSendVO) throws Exception {
return hkControlCommandService.phaseTimingSend(code, timePlans); return hkControlCommandService.phaseTimingSend(phaseTimingSendVO);
} }
/** /**
...@@ -166,7 +158,16 @@ public class ControlCommandController { ...@@ -166,7 +158,16 @@ public class ControlCommandController {
*/ */
@ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁") @ApiOperation(value = "锁定控制-相位锁定/解锁", notes = "锁定控制-相位锁定/解锁")
@PostMapping("/lockControl") @PostMapping("/lockControl")
public <T> Result<T> lockControl(@RequestBody ControlCommandVO commandVO) throws Exception { public <T> Result<T> lockControl(@RequestBody @Validated ControlCommandVO commandVO) throws Exception {
return hkControlCommandService.lockControl(commandVO); return hkControlCommandService.lockControl(commandVO);
} }
/**
* 相位差下发
*/
@ApiOperation(value = "相位差下发", notes = "相位差下发")
@PostMapping("/phaseDiffSend")
public <T> Result<T> phaseDiffSend() {
return hkControlCommandService.phaseDiffSend();
}
} }
...@@ -15,6 +15,9 @@ import java.util.List; ...@@ -15,6 +15,9 @@ import java.util.List;
@Getter @Getter
public class DownloadPlanSpandsDTO { public class DownloadPlanSpandsDTO {
/**
* 此code是信号机code,不是路口code
*/
private String crossCode; private String crossCode;
private List<Pattern> patternList; private List<Pattern> patternList;
......
...@@ -3,6 +3,8 @@ package net.wanji.utc.handler; ...@@ -3,6 +3,8 @@ package net.wanji.utc.handler;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result; import net.wanji.utc.common.Result;
import net.wanji.utc.common.exception.ControlException; import net.wanji.utc.common.exception.ControlException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
...@@ -32,8 +34,30 @@ public class GlobalExceptionHandler { ...@@ -32,8 +34,30 @@ public class GlobalExceptionHandler {
*/ */
@ExceptionHandler(value = NullPointerException.class) @ExceptionHandler(value = NullPointerException.class)
public Result<String> exceptionHandler(HttpServletRequest req, NullPointerException e) { public Result<String> exceptionHandler(HttpServletRequest req, NullPointerException e) {
log.error("发生空指针异常!原因是:{}", e.getMessage()); Throwable cause = e.getCause();
return Result.error(INTERNAL_SERVER_ERROR.getResultCode(), e.getMessage()); String errorMessage;
if (cause != null) {
errorMessage = cause.getMessage();
} else {
StackTraceElement element = e.getStackTrace()[0];
errorMessage = element.getClassName() + " " + element.getLineNumber();
}
log.error("发生空指针异常!位置在:{}", errorMessage);
return Result.error(INTERNAL_SERVER_ERROR.getResultCode(), "发生空指针异常!位置在:" + errorMessage);
}
/**
* 参数异常
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result<String> exceptionHandler(HttpServletRequest req, MethodArgumentNotValidException e) {
FieldError fieldError = e.getBindingResult().getFieldError();
String errorMessage = INTERNAL_SERVER_ERROR.getResultMsg();
if (fieldError != null) {
errorMessage = fieldError.getDefaultMessage();
}
log.error("发生参数异常!原因是:{}", errorMessage);
return Result.error(INTERNAL_SERVER_ERROR.getResultCode(), "发生参数异常!原因是:" + errorMessage);
} }
/** /**
...@@ -41,7 +65,14 @@ public class GlobalExceptionHandler { ...@@ -41,7 +65,14 @@ public class GlobalExceptionHandler {
*/ */
@ExceptionHandler(value = Exception.class) @ExceptionHandler(value = Exception.class)
public Result<String> exceptionHandler(HttpServletRequest req, Exception e) { public Result<String> exceptionHandler(HttpServletRequest req, Exception e) {
log.error("未知异常!原因是:{}", e.getMessage()); Throwable cause = e.getCause();
return Result.error(INTERNAL_SERVER_ERROR.getResultCode(), e.getMessage()); String errorMessage;
if (cause != null) {
errorMessage = cause.getMessage();
} else {
errorMessage = e.getMessage();
}
log.error("未知异常!原因是:{}", errorMessage);
return Result.error(INTERNAL_SERVER_ERROR.getResultCode(), "未知异常!原因是:" + errorMessage);
} }
} }
package net.wanji.utc.service.control; package net.wanji.utc.service.control;
import net.wanji.utc.common.Result; import net.wanji.utc.common.Result;
import net.wanji.utc.vo.ControlCommandVO; import net.wanji.utc.vo.*;
import net.wanji.utc.vo.PlanSendVO;
import net.wanji.utc.vo.ScheduleSendVO;
import net.wanji.utc.vo.SchemeSendVO;
import net.wanji.utc.vo.timeplan.TimePlanVO;
import java.util.List;
/** /**
* 控制指令 service * 控制指令 service
...@@ -80,12 +74,10 @@ public interface ControlCommandService { ...@@ -80,12 +74,10 @@ public interface ControlCommandService {
/** /**
* 相位配时下发 * 相位配时下发
* *
* @param code 信号机id
* @param timePlans 批量下发的配时数据
* @return {@link Result}<{@link T}> * @return {@link Result}<{@link T}>
* @throws InterruptedException 中断异常 * @throws InterruptedException 中断异常
*/ */
<T> Result<T> phaseTimingSend(String code, List<TimePlanVO> timePlans) throws Exception; <T> Result<T> phaseTimingSend(PhaseTimingSendVO phaseTimingSendVO) throws Exception;
/** /**
* 相位差下发 * 相位差下发
......
...@@ -3,7 +3,6 @@ package net.wanji.utc.vo; ...@@ -3,7 +3,6 @@ package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import javax.validation.constraints.Max; import javax.validation.constraints.Max;
import javax.validation.constraints.Min; import javax.validation.constraints.Min;
...@@ -26,8 +25,8 @@ public class ControlCommandVO{ ...@@ -26,8 +25,8 @@ public class ControlCommandVO{
/** /**
* 1 锁定; 0 取消 * 1 锁定; 0 取消
*/ */
@ApiModelProperty(value = "1 锁定;0 取消") @ApiModelProperty(value = "1是;0否")
@NotNull(message = "控制类型不可为空,1 锁定;0 取消") @NotNull(message = "控制类型不可为空,1是;0否")
@Max(value = 1, message = "控制类型:1是;0否") @Max(value = 1, message = "控制类型:1是;0否")
@Min(value = 0, message = "控制类型:1是;0否") @Min(value = 0, message = "控制类型:1是;0否")
private Integer command; private Integer command;
......
package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 下发相位参数VO
*
* @author wuxiaokai
* @date 2022/12/9 11:08:51
*/
@Setter
@Getter
@ApiModel(value = "下发相位参数输入参数", description = "下发相位参数输入参数")
public class PhaseTimingSendVO {
@ApiModelProperty(value = "路口编号", notes = "路口编号")
private String crossCode;
@ApiModelProperty(value = "需要下发的相位列表", notes = "需要下发的相位列表")
private List<Phase> phaseList;
/**
* 相位
*/
@Setter
@Getter
public static class Phase {
/**
* 相位号
*/
@ApiModelProperty(value = "相位号", notes = "相位号")
private Integer phaseNo;
/**
* 相位描述
*/
@ApiModelProperty(value = "相位描述", notes = "相位描述")
private String desc;
/**
* 黄灯
*/
@ApiModelProperty(value = "黄灯", notes = "黄灯")
private Integer yellow;
/**
* 全红
*/
@ApiModelProperty(value = "全红", notes = "全红")
private Integer allred;
/**
* 绿闪
*/
@ApiModelProperty(value = "绿闪", notes = "")
private String greenFlash;
/**
* 红闪
*/
@ApiModelProperty(value = "红闪", notes = "")
private String redFlash;
/**
* 最小绿
*/
@ApiModelProperty(value = "最小绿", notes = "")
private String minGreen;
/**
* 最大绿
*/
@ApiModelProperty(value = "最大绿", notes = "")
private String maxGreen;
/**
* 相位关联的车道列表
*/
@ApiModelProperty(value = "相位关联的车道列表", notes = "相位关联的车道列表")
private List<Lane> lanes;
@Setter
@Getter
public static class Lane {
/**
* 车道号
*/
@ApiModelProperty(value = "车道号", notes = "车道号")
private Integer laneNo;
/**
* 方向
*/
@ApiModelProperty(value = "方向", notes = "方向")
private Integer direction;
/**
* 转向
*/
@ApiModelProperty(value = "转向", notes = "转向")
private Integer turn;
}
}
}
package net.wanji.utc.vo; package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -15,6 +16,7 @@ import java.util.List; ...@@ -15,6 +16,7 @@ import java.util.List;
*/ */
@Setter @Setter
@Getter @Getter
@ApiModel(value = "信号机计划下发输入参数", description = "信号机计划下发输入参数")
public class PlanSendVO { public class PlanSendVO {
@ApiModelProperty(value = "路口编号", notes = "路口编号") @ApiModelProperty(value = "路口编号", notes = "路口编号")
......
package net.wanji.utc.vo; package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -14,6 +15,7 @@ import java.util.List; ...@@ -14,6 +15,7 @@ import java.util.List;
*/ */
@Setter @Setter
@Getter @Getter
@ApiModel(value = "信号机时间表下发输入参数", description = "信号机时间表下发输入参数")
public class ScheduleSendVO { public class ScheduleSendVO {
@ApiModelProperty(value = "路口编号", notes = "路口编号") @ApiModelProperty(value = "路口编号", notes = "路口编号")
......
package net.wanji.utc.vo; package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -14,6 +15,7 @@ import java.util.List; ...@@ -14,6 +15,7 @@ import java.util.List;
*/ */
@Setter @Setter
@Getter @Getter
@ApiModel(value = "信号机方案下发输入参数", description = "信号机方案下发输入参数")
public class SchemeSendVO { public class SchemeSendVO {
@ApiModelProperty(value = "路口编号", notes = "路口编号") @ApiModelProperty(value = "路口编号", notes = "路口编号")
...@@ -138,41 +140,41 @@ public class SchemeSendVO { ...@@ -138,41 +140,41 @@ public class SchemeSendVO {
} }
@Setter //@Setter
@Getter //@Getter
public static class Lights { //public static class Lights {
//
/** // /**
* 灯组号 // * 灯组号
*/ // */
@ApiModelProperty(value = "灯组号", notes = "") // @ApiModelProperty(value = "灯组号", notes = "")
private String lightsNo; // private String lightsNo;
/** // /**
* 灯组名称 // * 灯组名称
*/ // */
@ApiModelProperty(value = "灯组名称", notes = "") // @ApiModelProperty(value = "灯组名称", notes = "")
private String name; // private String name;
/** // /**
* 灯组类型:1箭头;2圆饼,3行人 // * 灯组类型:1箭头;2圆饼,3行人
*/ // */
@ApiModelProperty(value = "灯组类型:1箭头2圆饼3行人", notes = "") // @ApiModelProperty(value = "灯组类型:1箭头2圆饼3行人", notes = "")
private String type; // private String type;
/** // /**
* 灯组方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北 // * 灯组方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北
*/ // */
@ApiModelProperty(value = "灯组方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北", notes = "") // @ApiModelProperty(value = "灯组方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北", notes = "")
private String dir; // private String dir;
/** // /**
* 灯组转向:1左转;2右转;3直行;4左掉头;5直左;6直右;7右掉头;8向左合流;9向右合流;10左转加掉头;11右转加掉头;12直行加左掉头;13直行加右掉头;14左转右转;15左直右;16左转右转加掉头;17左直掉头;18左直右掉头;20行人 // * 灯组转向:1左转;2右转;3直行;4左掉头;5直左;6直右;7右掉头;8向左合流;9向右合流;10左转加掉头;11右转加掉头;12直行加左掉头;13直行加右掉头;14左转右转;15左直右;16左转右转加掉头;17左直掉头;18左直右掉头;20行人
*/ // */
@ApiModelProperty(value = "灯组转向:1左转;2右转;3直行;4左掉头;5直左;6直右;7右掉头;8向左合流;9向右合流;10左转加掉头;11右转加掉头;12直行加左掉头;13直行加右掉头;14左转右转;15左直右;16左转右转加掉头;17左直掉头;18左直右掉头;20行人", notes = "") // @ApiModelProperty(value = "灯组转向:1左转;2右转;3直行;4左掉头;5直左;6直右;7右掉头;8向左合流;9向右合流;10左转加掉头;11右转加掉头;12直行加左掉头;13直行加右掉头;14左转右转;15左直右;16左转右转加掉头;17左直掉头;18左直右掉头;20行人", notes = "")
private String turn; // private String turn;
/** // /**
* 行人进出口:1进口;2出口,3进出口 // * 行人进出口:1进口;2出口,3进出口
*/ // */
@ApiModelProperty(value = "行人进出口:1进口2出口,3进出口", notes = "") // @ApiModelProperty(value = "行人进出口:1进口2出口,3进出口", notes = "")
private String inOutType; // private String inOutType;
} //}
} }
} }
......
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author wanji
* @version 1.0
* Created on 2019/7/15 10:28
* @description: [固定灯色灯组方案下发]
*/
@Data
@ApiModel(value = "FixedLightGroupVo", description = "固定灯色灯组实体")
public class FixedLightGroupVo {
//灯组编号
@ApiModelProperty(value = "灯组编号,逗号分隔")
private String lightGroupNo;
//固定灯色
@ApiModelProperty(value = "固定灯色")
private Integer color;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @author wanji
* @version 1.0
* @Description: [行人方向]
* Created on 2019/4/19 17:20
*/
@Data
@ApiModel(value = "Pdirection", description = "行人方向")
public class Pdirection {
//方向
private Integer direction;
private Integer second;
private Integer inoutType;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author wanji
* @version 1.0
* @Description: [相位数据实体]
* Created on 2019/4/19 16:56
*/
@Data
@ApiModel(value = "Phase", description = "相位数据实体")
public class Phase {
//相位编号
@ApiModelProperty(value = "相位编号")
private String phaseId;
//相位名称
@ApiModelProperty(value = "相位名称")
private String phaseName;
//相位描述
@ApiModelProperty(value = "相位描述")
private String phaseDesc;
//相位顺序号
@ApiModelProperty(value = "相位顺序号")
private Integer phaseOrderId;
//原版本相位时长(绿信比)
@ApiModelProperty(value = "原版本相位时长(绿信比)")
private Integer originalTime;
//相位时长(绿信比)
@ApiModelProperty(value = "相位时长(绿信比)")
private Integer phaseTime;
//最大绿时间
@ApiModelProperty(value = "最大绿时间")
private Integer maxgreenTime;
//最小绿时间
@ApiModelProperty(value = "最小绿时间")
private Integer mingreenTime;
//灯组编号
@ApiModelProperty(value = "灯组编号")
private String lightGroupNo;
//黄灯时间
@ApiModelProperty(value = "黄灯时间")
private Integer yellowTime;
//红灯时间
@ApiModelProperty(value = "红灯时间")
private Integer redTime;
//所有跟随相位,相位编号
@ApiModelProperty(value = "所有跟随相位,相位编号")
private String[] followPhases;
//步数据对象列表
@ApiModelProperty(value = "步数据对象列表")
private List<Step> steps;
//机动车方向
@ApiModelProperty(value = "机动车方向")
private List<Vdirection> vdirections;
//行人方向
@ApiModelProperty(value = "行人方向")
private List<Pdirection> pdirections;
}
package net.wanji.utc.vo.timeplan;
import lombok.Data;
import java.util.List;
/**
* @author wanji
* @version 1.0
* @Description: [环数据对象]
* Created on 2019/4/22 15:54
*/
@Data
public class Ring {
//环编号
private String ringNo;
//相位对象列表
private List<Phase> phases;
}
package net.wanji.utc.vo.timeplan;
import lombok.Data;
/**
* @author wanji
* @version 1.0
* @Description: [步数据对象]
* Created on 2019/4/22 15:56
*/
@Data
public class Step {
//步号:1,2,3,4,5,6
private Integer stepNo;
//步类型:1 green 2 greenflash 3 pedflash 4 yellow 5 red 6 off
private Integer stepType;
//步长
private Integer stepLen;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import java.util.List;
/**
* @author wanji
* @version 1.0
* @Description: [配时方案实体类]
* Created on 2019/4/22 15:40
*/
@Data
@ApiModel(value = "TimePlanVo", description = "配时方案实体类")
public class TimePlanVO extends BaseCrossInfo {
//配时方案编号
@ApiModelProperty(value = "配时方案编号", required = true)
private String timePlanId;
//配时方案描述
@ApiModelProperty(value = "配时方案描述")
private String timePlanDesc;
//相位方案编号
@ApiModelProperty(value = "相位方案编号")
private String phasePlanId;
//周期长度
@ApiModelProperty(value = "周期长度")
private Integer cycleLen;
//协调相位编号
@ApiModelProperty(value = "协调相位编号")
private String coordPhaseId;
//相位差
@ApiModelProperty(value = "相位差")
private Integer offset;
//环数量 1 一环 2 两环
@ApiModelProperty(value = "环数量 1 一环 2 两环")
private String ringCount;
//环数据对象列表
@ApiModelProperty(value = "环数据对象列表")
private List<Ring> rings;
//始终固定灯色的灯组(可选)
@ApiModelProperty(value = "始终固定灯色的灯组(可选)")
private List<FixedLightGroupVo> fixedLightGroups;
//是否启用信号机自适应功能(可选,默认为 false)
@ApiModelProperty(value = "是否启用信号机自适应功能(可选,默认为 false)")
private Boolean selfAdaptive;
//操作类型 1:下发 2:恢复 3:下发返回300特殊处理 4:恢复返回300特殊处理
@ApiModelProperty(value = "操作类型 1:下发 2:恢复 3:下发返回300特殊处理 4:恢复返回300特殊处理")
private Integer optType;
//顺序号
@ApiModelProperty(value = "顺序号")
private Integer orderId;
}
package net.wanji.utc.vo.timeplan;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @author wanji
* @version 1.0
* @Description: [机动车方向]
* Created on 2019/4/19 17:20
*/
@Data
@ApiModel(value = "Vdirection", description = "机动车方向")
public class Vdirection {
//方向, 方向:0 北 1 东北 2 东 3 东南 4 南 5 西南 6 西 7 西北
private Integer direction;
//车辆类型
private Integer turnType;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment