Commit 95eb7b4a authored by wuxiaokai's avatar wuxiaokai

控制指令接口-全红控制

parent e8a16e03
package net.wanji.utc.common;
/**
* @author wuxiaokai
* @date 2022/11/15 13:15:57
*/
public interface BaseInfoInterface {
/**
* 错误码
*/
Integer getResultCode();
/**
* 错误描述
*/
String getResultMsg();
}
package net.wanji.utc.common;
import java.io.Serializable;
import static net.wanji.utc.common.ResultEnum.INTERNAL_SERVER_ERROR;
import static net.wanji.utc.common.ResultEnum.SUCCESS;
/**
* @author wuxiaokai
* @date 2022/11/15 13:13:36
*/
public class Result<T> implements Serializable {
private static final long serialVersionUID = -8491397399858539755L;
private Integer state;
private String message;
private T content;
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
public Result() {
}
public Result(Integer state, String message, T content) {
this.state = state;
this.message = message;
this.content = content;
}
public static <T> Result<T> response(Integer state, String message) {
return response(state, message, null);
}
public static <T> Result<T> response(Integer state, String message, T content) {
return new Result<>(state, message, content);
}
public static <T> Result<T> success() {
return Result.response(SUCCESS.getResultCode(), SUCCESS.getResultMsg(), null);
}
public static <T> Result<T> success(T content) {
return Result.response(SUCCESS.getResultCode(), SUCCESS.getResultMsg(), content);
}
public static <T> Result<T> error(Integer state, String message, T content) {
return Result.response(state, message, content);
}
public static <T> Result<T> error(Integer state, String message) {
return Result.response(state, message, null);
}
public static <T> Result<T> error(ResultEnum resultEnum, String message) {
return Result.response(resultEnum.getResultCode(), message, null);
}
public static <T> Result<T> error(ResultEnum resultEnum) {
return Result.response(resultEnum.getResultCode(), resultEnum.getResultMsg(), null);
}
public static <T> Result<T> error(String message) {
return Result.response(INTERNAL_SERVER_ERROR.getResultCode(), message, null);
}
}
package net.wanji.utc.common;
/**
* @author wuxiaokai
* @date 2022/11/15 13:15:30
*/
public enum ResultEnum implements BaseInfoInterface {
// 数据操作错误定义
SUCCESS(200, "成功!"),
BODY_NOT_MATCH(400, "请求的数据格式不符!"),
SIGNATURE_NOT_MATCH(401, "请求的数字签名不匹配!"),
NOT_FOUND(404, "未找到该资源!"),
PARAM_VERIFY_FAILS(405, "未找到该资源!"),
INTERNAL_SERVER_ERROR(500, "服务器内部错误!"),
SERVER_BUSY(503, "服务器正忙,请稍后再试!");
/**
* 错误码
*/
private Integer resultCode;
/**
* 错误描述
*/
private String resultMsg;
ResultEnum(Integer resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
}
@Override
public Integer getResultCode() {
return resultCode;
}
@Override
public String getResultMsg() {
return resultMsg;
}
}
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.ApiInfoPO;
import net.wanji.utc.vo.CrossLanesVo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class Constants {
/**
* 厂商接口地址
*/
private static ConcurrentHashMap<String, ApiInfoPO> manufacturerUrlMap = new ConcurrentHashMap<>();
/**
* 存储海康信号机车道关系到内存
*/
private static ConcurrentHashMap<String, List<CrossLanesVo>> telesemeLaneRealMap = new ConcurrentHashMap<>();
/**
* 系统缩写
*/
......@@ -30,6 +44,52 @@ public class Constants {
*/
public static final String HK_CODE_KEY = "code";
/**
* 失败-false
*/
public static final int FALSE = 0;
/**
* 成功-true
*/
public static final int TRUE = 1;
/**
* 相位(灯态)锁定
*/
public static final Integer LOCK_RUNNING_MODE = 12;
/**
* 相位(灯态)解锁: 0-多时段控制模式
*/
public static final Integer UNLOCK_RUNNING_MODE = 13;
/**
* 恢复正常方案: 0-多时段控制模式
*/
public static final Integer NORMAL_RUNNING_MODE = 0;
/**
* 关灯
*/
public static final Integer OFF_LIGHT_MODE = 1;
/**
* 黄闪
*/
public static final Integer YELLOW_RUNNING_MODE = 2;
/**
* 手动全红
*/
public static final Integer RED_RUNNING_MODE = 3;
/**
* 定周期控制
*/
public static final Integer FIXED_CYCLE_MODE = 4;
/**
* 步进控制
*/
public static final Integer STEP_UPDATE_MODE = 10;
/**
* 取消步进
*/
public static final Integer CANCEL_STEP_MODE = 11;
public static ApiInfoPO getManufacturerUrlMap(String key) {
return manufacturerUrlMap.get(key);
}
......@@ -37,4 +97,29 @@ public class Constants {
public static void putManufacturerUrlMap(String key, ApiInfoPO value) {
manufacturerUrlMap.put(key, value);
}
public static ConcurrentHashMap<String, List<CrossLanesVo>> getTelesemeLaneRealMap() {
return telesemeLaneRealMap;
}
public static void setTelesemeLaneRealMap(ConcurrentHashMap<String, List<CrossLanesVo>> telesemeLaneRealMap) {
Constants.telesemeLaneRealMap = telesemeLaneRealMap;
}
private static String artemisPath;
@Value("${signal.manufacturer.hk.artemisPath}")
public static void setArtemisPath(String artemisPath) {
Constants.artemisPath = artemisPath;
}
/**
* 根据code获取三方 url
*/
public static Map<String, String> getPathMapByApiCode(String apiCode) {
Map<String, String> res = new HashMap<>();
HttpRequest httpRequest = new HttpRequest(BasicEnum.ManufacturerEnum.HK.getAbbr(), apiCode);
res.put("http://", artemisPath + httpRequest.getUrl());
return res;
}
}
\ No newline at end of file
package net.wanji.utc.common.exception;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import net.wanji.utc.common.BaseInfoInterface;
/**
* @author wuxiaokai
* @date 2022/11/21 9:38:54
*/
@Setter
@Getter
public class ControlException extends RuntimeException {
private static final long serialVersionUID = 9081671784110014059L;
/**
* 错误码
*/
protected Integer errorCode;
/**
* 错误信息
*/
protected String errorMsg;
public ControlException() {
super();
}
public ControlException(BaseInfoInterface errorInfoInterface) {
super(errorInfoInterface.getResultMsg());
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
public ControlException(BaseInfoInterface errorInfoInterface, Throwable cause) {
super(errorInfoInterface.getResultMsg(), cause);
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
public ControlException(String errorMsg) {
super(errorMsg);
this.errorMsg = errorMsg;
}
public ControlException(Integer errorCode, String errorMsg) {
super(errorMsg);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public ControlException(Integer errorCode, String errorMsg, Throwable cause) {
super(errorMsg, cause);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
@Override
public Throwable fillInStackTrace() {
return this;
}
}
package net.wanji.utc.controller;
import net.wanji.utc.common.Result;
import net.wanji.utc.common.exception.ControlException;
import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.mapper.CrossInfoMapper;
import net.wanji.utc.po.CrossInfoPO;
import net.wanji.utc.service.ControlCommandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import static net.wanji.utc.common.ResultEnum.BODY_NOT_MATCH;
/**
* 控制指令接口
*
* @author wuxiaokai
* @date 2022/11/15 13:21:10
*/
@RestController
@RequestMapping("/controlCommand")
public class ControlCommandController {
@Value("${signal.mock}")
private boolean mock;
@Autowired
private CrossInfoMapper crossInfoMapper;
@Autowired
private ControlCommandService hkControlCommandService;
@PostMapping("/allRedControl")
public <T> Result<T> allRedControl(@RequestParam String signalId, @RequestParam Integer command) {
if (mock) return Result.success();
CrossInfoPO crossInfoPO = crossInfoMapper.selectByCode(signalId);
if (crossInfoPO == null) {
throw new ControlException(BODY_NOT_MATCH.getResultCode(), "参数错误,信号机ID不正确。");
}
Integer manufacturerId = crossInfoPO.getManufacturerId();
Result<T> result = new Result<>();
if (manufacturerId.equals(BasicEnum.ManufacturerEnum.HK.getCode())) {
result = hkControlCommandService.allRedControl(signalId, null, null, command);
} else {
// todo else
}
return result;
}
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 路口基础表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-info")
public class TCrossInfoController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 路口灯组表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-lights")
public class TCrossLightsController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 路口相位表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-phase")
public class TCrossPhaseController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 相位灯组关系表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-phase-lights")
public class TCrossPhaseLightsController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 路口计划表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-plan")
public class TCrossPlanController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 时间表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-schedules")
public class TCrossSchedulesController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 信号方案表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-scheme")
public class TCrossSchemeController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 路口时段表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-cross-section")
public class TCrossSectionController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 厂商平台接口表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-manufacturer-api-info")
public class TManufacturerApiInfoController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 厂商基础表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-manufacturer-info")
public class TManufacturerInfoController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 信号机状态日志表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-signal-status-log")
public class TSignalStatusLogController {
}
package net.wanji.utc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 系统操作日志表 前端控制器
* </p>
*
* @author wj
* @since 2022-11-15
*/
@RestController
@RequestMapping("/t-system-operate-log")
public class TSystemOperateLogController {
}
package net.wanji.utc.handler;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result;
import net.wanji.utc.common.exception.ControlException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
/**
* @author wuxiaokai
* @date 2022/11/21 9:06:40
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理自定义的业务异常
*/
@ExceptionHandler(value = ControlException.class)
public Result<String> exceptionHandler(HttpServletRequest req, ControlException e) {
log.error("发生业务异常!原因是:{}", e.getErrorMsg());
return Result.error(e.getErrorCode(), e.getErrorMsg());
}
/**
* 处理空指针的异常
*/
@ExceptionHandler(value = NullPointerException.class)
public Result<String> exceptionHandler(HttpServletRequest req, NullPointerException e) {
log.error("发生空指针异常!原因是:", e);
return Result.error("");
}
/**
* 处理其他异常
*/
@ExceptionHandler(value = Exception.class)
public Result<String> exceptionHandler(HttpServletRequest req, Exception e) {
log.error("未知异常!原因是:", e);
return Result.error("");
}
}
......@@ -17,4 +17,6 @@ public interface CrossInfoMapper {
List<String> selectCrossCodesByIds(@Param("entities") List<String> crossIdList);
String selectIdByCode(@Param("crossCode")String crossCode);
CrossInfoPO selectByCode(@Param("code") String code);
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 路口基础表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossInfoMapper extends BaseMapper<TCrossInfo> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossLights;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 路口灯组表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossLightsMapper extends BaseMapper<TCrossLights> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossPhaseLights;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 相位灯组关系表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossPhaseLightsMapper extends BaseMapper<TCrossPhaseLights> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossPhase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 路口相位表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossPhaseMapper extends BaseMapper<TCrossPhase> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossPlan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 路口计划表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossPlanMapper extends BaseMapper<TCrossPlan> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossSchedules;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 时间表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossSchedulesMapper extends BaseMapper<TCrossSchedules> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossScheme;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 信号方案表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossSchemeMapper extends BaseMapper<TCrossScheme> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TCrossSection;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 路口时段表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossSectionMapper extends BaseMapper<TCrossSection> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TManufacturerApiInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 厂商平台接口表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TManufacturerApiInfoMapper extends BaseMapper<TManufacturerApiInfo> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TManufacturerInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 厂商基础表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TManufacturerInfoMapper extends BaseMapper<TManufacturerInfo> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TSignalStatusLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 信号机状态日志表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TSignalStatusLogMapper extends BaseMapper<TSignalStatusLog> {
}
package net.wanji.utc.mapper;
import net.wanji.utc.entity.TSystemOperateLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 系统操作日志表 Mapper 接口
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TSystemOperateLogMapper extends BaseMapper<TSystemOperateLog> {
}
package net.wanji.utc.service;
import net.wanji.utc.common.Result;
import net.wanji.utc.vo.PhaseLock;
/**
* 控制指令 service
*
* @author wuxiaokai
* @date 2022/11/15 14:02:36
*/
public interface ControlCommandService {
/**
* 方案下发
*/
<T> Result<T> schemeSend();
/**
* 计划下发
*/
<T> Result<T> planSend();
/**
* 时间表下发
*/
<T> Result<T> scheduleSend();
/**
* 锁定控制
*
* @param signalId 信号机编号
* @param locks 相位锁定实体类
* @return {@link Result}<{@link T}>
*/
<T> Result<T> lockControl(String signalId, PhaseLock... locks);
/**
* 步进控制
*
* @param signalId 信号机编号
* @param sourceType 厂家简称 QS/SCATS/HS/HK
* @param signalType 信号机类型 QS/SCATS/HS/HK
* @param command 1 开始步进 0 取消步进
* @param stepNum 0 顺序步进 n 跳过n个相位
* @return {@link Result}<{@link T}>
*/
<T> Result<T> stepControl(String signalId, String sourceType, String signalType, Integer command, Integer stepNum);
/**
* 全红控制
*
* @param signalId 信号机编号
* @param sourceType 厂家简称
* @param signalType 信号机类型
* @param command 1 全红控制 0 取消全红
* @return {@link Result}<{@link T}>
*/
<T> Result<T> allRedControl(String signalId, String sourceType, String signalType, Integer command);
/**
* 黄闪控制
*
* @param signalId 信号机编号
* @param sourceType 厂家简称
* @param signalType 信号机类型
* @param command 1 黄闪控制 0 取消黄闪
* @return {@link Result}<{@link T}>
*/
<T> Result<T> yellowLightControl(String signalId, String sourceType, String signalType, Integer command);
/**
* 关灯控制
*
* @param signalId 信号机编号
* @param sourceType 厂家简称
* @param signalType 信号机类型
* @param command 1 开灯 0 关灯
* @return {@link Result}<{@link T}>
*/
<T> Result<T> closeLightControl(String signalId, String sourceType, String signalType, Integer command);
/**
* 恢复时间表
*
* @param signalId 信号机编号
* @param sourceType 厂家简称 QS/SCATS/HS/HK
* @param signalType 信号机类型 QS/SCATS/HS/HK
* @param command 1 恢复
* @return {@link Result}<{@link T}>
*/
<T> Result<T> recoverSchedule(String signalId, String sourceType, String signalType, Integer command);
/**
* 相位配时下发
*/
<T> Result<T> phaseTimingSend();
/**
* 相位差下发
*/
<T> Result<T> phaseDiffSend();
}
package net.wanji.utc.service;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.vo.signal.SignalLightStateVo;
import java.util.List;
/**
* @author meng.wang
* @version 1.0
* Created on 2020/09/10
* @description: [海康信号灯厂商接口service]
*/
public interface HkGetSignalMethodService {
/**
* @description: 获取路口信号机的实时灯态数据
* @param baseSignals 信号机列表
* @return SignalInfoVo 信号机状态
* @author meng.wang
* @date 2020/09/10
*/
List<SignalLightStateVo> queryHkSignalInfo(List<BaseCrossInfo> baseSignals);
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 路口基础表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossInfoService extends IService<TCrossInfo> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossLights;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 路口灯组表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossLightsService extends IService<TCrossLights> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossPhaseLights;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 相位灯组关系表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossPhaseLightsService extends IService<TCrossPhaseLights> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossPhase;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 路口相位表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossPhaseService extends IService<TCrossPhase> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossPlan;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 路口计划表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossPlanService extends IService<TCrossPlan> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossSchedules;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 时间表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossSchedulesService extends IService<TCrossSchedules> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossScheme;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 信号方案表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossSchemeService extends IService<TCrossScheme> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TCrossSection;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 路口时段表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TCrossSectionService extends IService<TCrossSection> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TManufacturerApiInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 厂商平台接口表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TManufacturerApiInfoService extends IService<TManufacturerApiInfo> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TManufacturerInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 厂商基础表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TManufacturerInfoService extends IService<TManufacturerInfo> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TSignalStatusLog;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 信号机状态日志表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TSignalStatusLogService extends IService<TSignalStatusLog> {
}
package net.wanji.utc.service;
import net.wanji.utc.entity.TSystemOperateLog;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 系统操作日志表 服务类
* </p>
*
* @author wj
* @since 2022-11-15
*/
public interface TSystemOperateLogService extends IService<TSystemOperateLog> {
}
package net.wanji.utc.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.common.Result;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import net.wanji.utc.common.constant.Constants;
import net.wanji.utc.common.exception.ControlException;
import net.wanji.utc.common.typeenum.BasicEnum;
import net.wanji.utc.service.ControlCommandService;
import net.wanji.utc.service.HkGetSignalMethodService;
import net.wanji.utc.vo.PhaseLock;
import net.wanji.utc.vo.signal.SignalLightStateVo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static net.wanji.utc.common.constant.Constants.*;
/**
* @author wuxiaokai
* @date 2022/11/21 9:51:47
*/
@Slf4j
@Service("hkControlCommandService")
public class HKControlCommandServiceImpl implements ControlCommandService {
@Resource
private HkGetSignalMethodService hkGetSignalMethodService;
@Resource
private ArtemisConfig artemisConfig;
@Override
public <T> Result<T> schemeSend() {
return null;
}
@Override
public <T> Result<T> planSend() {
return null;
}
@Override
public <T> Result<T> scheduleSend() {
return null;
}
@Override
public <T> Result<T> lockControl(String signalId, PhaseLock... locks) {
return null;
}
@Override
public <T> Result<T> stepControl(String signalId, String sourceType, String signalType, Integer command, Integer stepNum) {
return null;
}
@Override
public <T> Result<T> allRedControl(String signalId, String sourceType, String signalType, Integer command) {
Integer runningMode = command.equals(Constants.TRUE) ? RED_RUNNING_MODE : NORMAL_RUNNING_MODE;
return updateManual(signalId, runningMode);
}
@Override
public <T> Result<T> yellowLightControl(String signalId, String sourceType, String signalType, Integer command) {
return null;
}
@Override
public <T> Result<T> closeLightControl(String signalId, String sourceType, String signalType, Integer command) {
return null;
}
@Override
public <T> Result<T> recoverSchedule(String signalId, String sourceType, String signalType, Integer command) {
return null;
}
@Override
public <T> Result<T> phaseTimingSend() {
return null;
}
@Override
public <T> Result<T> phaseDiffSend() {
return null;
}
/**
* @param signalId 信号机编号
* @param runningMode 0-多时段控制模式 1-关灯、2-黄闪、3-全红、11-取消步进控制、12-灯态锁定、13-灯态解锁
*/
private <T> Result<T> updateManual(String signalId, Integer runningMode) {
//执行恢复时间表方案命令
if (NORMAL_RUNNING_MODE.equals(runningMode) || CANCEL_STEP_MODE.equals(runningMode)) {
//根据实时灯态获取当前运行模式
SignalLightStateVo signalInfoVo = getSignalInfoVos(signalId).get(0);
//如果当前模式已经是定周期,就不在执行恢复时间表方案指令
if (FIXED_CYCLE_MODE.equals(Integer.valueOf(signalInfoVo.getRunMode()))) {
throw new ControlException("当前控制模式是定周期控制,请勿下发恢复命令");
}
}
JSONObject bodyObjectParam = new JSONObject();
bodyObjectParam.put("crossCode", signalId);
bodyObjectParam.put("controlType", runningMode);
bodyObjectParam.put("controlNo", 0);
//控制时长,单位 s,0 则持续控制
bodyObjectParam.put("duration", 0);
return setSignalControl(bodyObjectParam);
}
private <T> Result<T> setSignalControl(JSONObject bodyObjectParam) {
try {
Map<String, String> path = Constants.getPathMapByApiCode("updateLockPhase");
String strResult = ArtemisHttpUtil.doPostStringArtemis(artemisConfig, path, bodyObjectParam.toJSONString(), null, null, "application/json", null);
JSONObject object = JSON.parseObject(strResult);
if (HK_SUCCESS_CODE.equals(object.getInteger(HK_CODE_KEY))) {
return Result.success();
}
} catch (Exception e) {
log.error("系统繁忙,服务器端内部错误!", e);
}
return Result.error("下发指令失败");
}
/**
* 根据信号机获取灯态列表
*/
private List<SignalLightStateVo> getSignalInfoVos(String signalId) {
List<BaseCrossInfo> baseSignals = new ArrayList<>();
BaseCrossInfo baseSignal = new BaseCrossInfo();
baseSignal.setTelesemeId(signalId);
baseSignal.setManufacturerAbbr(BasicEnum.ManufacturerEnum.HK.getAbbr());
baseSignals.add(baseSignal);
return hkGetSignalMethodService.queryHkSignalInfo(baseSignals);
}
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossInfo;
import net.wanji.utc.mapper.TCrossInfoMapper;
import net.wanji.utc.service.TCrossInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 路口基础表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossInfoServiceImpl extends ServiceImpl<TCrossInfoMapper, TCrossInfo> implements TCrossInfoService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossLights;
import net.wanji.utc.mapper.TCrossLightsMapper;
import net.wanji.utc.service.TCrossLightsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 路口灯组表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossLightsServiceImpl extends ServiceImpl<TCrossLightsMapper, TCrossLights> implements TCrossLightsService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossPhaseLights;
import net.wanji.utc.mapper.TCrossPhaseLightsMapper;
import net.wanji.utc.service.TCrossPhaseLightsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 相位灯组关系表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossPhaseLightsServiceImpl extends ServiceImpl<TCrossPhaseLightsMapper, TCrossPhaseLights> implements TCrossPhaseLightsService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossPhase;
import net.wanji.utc.mapper.TCrossPhaseMapper;
import net.wanji.utc.service.TCrossPhaseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 路口相位表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossPhaseServiceImpl extends ServiceImpl<TCrossPhaseMapper, TCrossPhase> implements TCrossPhaseService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossPlan;
import net.wanji.utc.mapper.TCrossPlanMapper;
import net.wanji.utc.service.TCrossPlanService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 路口计划表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossPlanServiceImpl extends ServiceImpl<TCrossPlanMapper, TCrossPlan> implements TCrossPlanService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossSchedules;
import net.wanji.utc.mapper.TCrossSchedulesMapper;
import net.wanji.utc.service.TCrossSchedulesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 时间表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossSchedulesServiceImpl extends ServiceImpl<TCrossSchedulesMapper, TCrossSchedules> implements TCrossSchedulesService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossScheme;
import net.wanji.utc.mapper.TCrossSchemeMapper;
import net.wanji.utc.service.TCrossSchemeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 信号方案表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossSchemeServiceImpl extends ServiceImpl<TCrossSchemeMapper, TCrossScheme> implements TCrossSchemeService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TCrossSection;
import net.wanji.utc.mapper.TCrossSectionMapper;
import net.wanji.utc.service.TCrossSectionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 路口时段表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TCrossSectionServiceImpl extends ServiceImpl<TCrossSectionMapper, TCrossSection> implements TCrossSectionService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TManufacturerApiInfo;
import net.wanji.utc.mapper.TManufacturerApiInfoMapper;
import net.wanji.utc.service.TManufacturerApiInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 厂商平台接口表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TManufacturerApiInfoServiceImpl extends ServiceImpl<TManufacturerApiInfoMapper, TManufacturerApiInfo> implements TManufacturerApiInfoService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TManufacturerInfo;
import net.wanji.utc.mapper.TManufacturerInfoMapper;
import net.wanji.utc.service.TManufacturerInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 厂商基础表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TManufacturerInfoServiceImpl extends ServiceImpl<TManufacturerInfoMapper, TManufacturerInfo> implements TManufacturerInfoService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TSignalStatusLog;
import net.wanji.utc.mapper.TSignalStatusLogMapper;
import net.wanji.utc.service.TSignalStatusLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 信号机状态日志表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TSignalStatusLogServiceImpl extends ServiceImpl<TSignalStatusLogMapper, TSignalStatusLog> implements TSignalStatusLogService {
}
package net.wanji.utc.service.impl;
import net.wanji.utc.entity.TSystemOperateLog;
import net.wanji.utc.mapper.TSystemOperateLogMapper;
import net.wanji.utc.service.TSystemOperateLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 系统操作日志表 服务实现类
* </p>
*
* @author wj
* @since 2022-11-15
*/
@Service
public class TSystemOperateLogServiceImpl extends ServiceImpl<TSystemOperateLogMapper, TSystemOperateLog> implements TSystemOperateLogService {
}
package net.wanji.utc.vo;
import lombok.Data;
import lombok.ToString;
/**
* @author hfx
* @version 1.0
* @Description: [路口车道对象实体]
* Created on 2019/4/19 10:08
*/
@Data
@ToString
public class CrossLanesVo {
/**
* 通道号
*/
private Integer channelNo;
/**
* 车道号
*/
private Integer laneNo;
/**
* 方向
*/
private Integer direction;
/**
* 转向
*/
private Integer turn;
/**
* 灯组类型
*/
private Integer lampGroupType;
}
package net.wanji.utc.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 相位锁定实体类
*
* @author wuxiaokai
* @date 2022/11/15 15:05:57
*/
@Data
@ApiModel(value = "PhaseLock", description = "相位锁定实体类")
public class PhaseLock {
/**
* 相位编号
*/
@ApiModelProperty(value = "相位编号")
private String phaseId;
/**
* 1 锁定; 0 取消
*/
@ApiModelProperty(value = "1 锁定;0 取消")
private Integer command;
/**
* 相位锁定时间, 999 永久锁定,必须手动取消。0~999 过了这个这个时间,自动取消锁定。
*/
@ApiModelProperty(value = "相位锁定时间,999 永久锁定,必须手动取消;0~999,自动取消")
private Integer lockTime;
}
package net.wanji.utc.vo.signal;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.utc.common.baseentity.BaseCrossInfo;
import java.util.List;
import java.util.Map;
/**
* 信号灯态基础信息实体
*/
@Data
public class SignalLightStateVo extends BaseCrossInfo {
/**
* 运行模式
*/
@ApiModelProperty(value = "运行模式 `2=手动锁定当前相位`,`3=手动全红`,`4=手动黄闪`,`5=手动关灯`," +
"`6=全红闪控制`,`7=全黄控制`,`8=正常按计划运行`,`9=手动步进控制`,`10=自动步进控制`,`11=恢复时间表`,`255=临时控制方案`")
private String runMode;
/**
* 控制模式
*/
@ApiModelProperty(value = "控制模式")
private String controlMode;
/**
* 相位方案号
*/
@ApiModelProperty(value = "相位方案号")
private String phasePlanId;
/**
* 相位配时方案
*/
@ApiModelProperty(value = "相位配时方案")
private String timePlanId;
/**
* 方案开始时间
*/
@ApiModelProperty(value = "方案开始时间")
private String planStartTime;
/**
* 方案运行时间
*/
@ApiModelProperty(value = "方案运行时间")
private Integer runTime;
/**
* 相位周期剩余时长
*/
@ApiModelProperty(value = "相位周期剩余时长")
private Integer cycleCountDown;
/**
* 相位周期时长
*/
@ApiModelProperty(value = "相位周期时长")
private Integer cycleLen;
/**
* 运行环数组
*/
private List<SignalRingVo> rings;
/**
* 当前相位号
*/
@ApiModelProperty(value = "当前相位号")
private String phaseId;
/**
* 当前方案号
*/
@ApiModelProperty(value = "当前方案号")
private String planId;
/**
* 灯组状态
*/
@ApiModelProperty(value = "灯组状态")
private Map<String, Object> dirLampGroupMap;
/**
* 相位对象:key:相位编号,value:绿灯时长
*/
@ApiModelProperty(value = "相位对象:key相位编号,value绿灯时长")
private Map<String, Object> phaseMap;
public void setCycleCountDown(Integer cycleCountDown) {
if (null == cycleCountDown) {
this.cycleCountDown = -1;
} else {
this.cycleCountDown = cycleCountDown;
}
}
public Integer getCycleCountDown() {
if (null == cycleCountDown) {
return -1;
}
return cycleCountDown;
}
}
package net.wanji.utc.vo.signal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 信号机运行环数实体
*/
@Data
@ApiModel(value = "SignalRingVo", description = "信号机运行环数实体")
public class SignalRingVo {
//绿灯1
@ApiModelProperty(value = "绿灯1时长")
private Integer oneTime;
//绿灯2
@ApiModelProperty(value = "绿灯2时长")
private Integer twoTime;
//绿灯3
@ApiModelProperty(value = "绿灯3时长")
private Integer threeTime;
//黄灯4
@ApiModelProperty(value = "黄灯4时长")
private Integer fourTime;
//红灯5
@ApiModelProperty(value = "红灯5时长")
private Integer fiveTime;
//环号
@ApiModelProperty(value = "环号")
private String ringNo;
//当前相位编号
@ApiModelProperty(value = "当前相位编号")
private String phaseId;
//相位时长
@ApiModelProperty(value = "相位时长")
private Integer phaseLen;
//相位剩余时长
@ApiModelProperty(value = "相位剩余时长")
private Integer phaseLeft;
//当前步号
@ApiModelProperty(value = "当前步号")
private Integer stepNo;
//当前步类型
@ApiModelProperty(value = "当前步类型")
private Integer stepType;
//当前步长
@ApiModelProperty(value = "当前步长")
private Integer stepLen;
//当前步剩余时间
@ApiModelProperty(value = "当前步剩余时间")
private Integer stepLeft;
//下一相位id
@ApiModelProperty(value = "下一相位id")
private String nextPhaseId;
//相位顺序号
@ApiModelProperty(value = "相位顺序号")
private Integer phaseOrderId;
/**
* 当前灯色
*/
@ApiModelProperty(value = "当前灯色")
private Integer lampStatus;
/**
* 当前说明
* 11 灭灯
* 21 红灯
* 22 黄灯
* 23 绿灯
* 31 红黄
*/
@ApiModelProperty(value = "当前灯色")
private String lampStatusName;
}
......@@ -34,6 +34,8 @@ spring:
# 信号平台
signal:
# true测试不执行方案下发 重点
mock: false
# 厂商接口
manufacturer:
hk:
......
......@@ -46,4 +46,11 @@
from t_cross_info
where code = #{crossCode}
</select>
<select id="selectByCode" resultMap="BaseResultMap">
select
id,name,code,manufacturer_id,ip,port,location,version,model,install_time,gmt_create,gmt_modified
from t_cross_info
where id = #{code}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossInfoMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossLightsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossPhaseLightsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossPhaseMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossPlanMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossSchedulesMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossSchemeMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TCrossSectionMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TManufacturerApiInfoMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TManufacturerInfoMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TSignalStatusLogMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.utc.mapper.TSystemOperateLogMapper">
</mapper>
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