Commit 43eb29ac authored by dengjh's avatar dengjh

车辆管理:增加汽车预警信息模块

parent 8277a8de
package com.xinxincaravan.caravan.vehicle.biz;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.xinxincaravan.caravan.vehicle.common.RestResponse;
import com.xinxincaravan.caravan.vehicle.constant.RedisKey;
import com.xinxincaravan.caravan.vehicle.constant.VehicleMsgStatus;
import com.xinxincaravan.caravan.vehicle.constant.VehicleMsgType;
import com.xinxincaravan.caravan.vehicle.entity.Vehicle;
import com.xinxincaravan.caravan.vehicle.entity.VehicleWarningMsg;
import com.xinxincaravan.caravan.vehicle.entity.VehicleWarningRule;
import com.xinxincaravan.caravan.vehicle.mapper.VehicleMapper;
import com.xinxincaravan.caravan.vehicle.mapper.VehicleWarningMsgMapper;
import com.xinxincaravan.caravan.vehicle.mapper.VehicleWarningRuleMapper;
import com.xinxincaravan.caravan.vehicle.util.JSUtil;
import com.xinxincaravan.caravan.vehicle.vo.AddVehicleWarningMsgVo;
import com.xinxincaravan.caravan.vehicle.vo.PageDataVo;
import com.xinxincaravan.caravan.vehicle.vo.QueryVehicleWarningMsgVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.session.RowBounds;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class VehicleWarningMsgBiz extends BaseBiz<VehicleWarningMsgMapper, VehicleWarningMsg> {
private static final Integer CHECK_BATCH_SIZE_VEHICLE = 100;//每批次检查多少辆车
private static final String PARAM_NAME_4_JS_WARNEDIDANDMSG = "idAndMsg";
private static final String PARAM_NAME_4_JS_LAST_DAY_MILEAGE = "lastDayMileage";
private static final String PARAM_NAME_4_JS_NOW_STR = "nowStr";
private static final String PARAM_NAME_4_JS_VEHICLE = "vehicle";
private static final String PARAM_NAME_4_JS_CUR_RULE_ID = "curRuleId";
private static final String VEHICLE_CHECK_RULE_FUNCTION_PREFIX = "checkIfViolateRule";
private static final String VEHICLE_MSG_KEY_FUNCTION_PREFIX = "getMsgKey";
public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd");
@Autowired
private VehicleWarningRuleMapper vehicleWarningRuleMapper;
@Autowired
private VehicleMapper vehicleMapper;
@Autowired
private RedisTemplate customRedisTemplate;
/**
* 增加自定义预警消息
* @param addVehicleWarningMsgVo
* @return
* @throws Exception
*/
public RestResponse add(AddVehicleWarningMsgVo addVehicleWarningMsgVo) throws Exception{
VehicleWarningMsg vehicleWarningMsg = new VehicleWarningMsg();
BeanUtils.copyProperties(vehicleWarningMsg,addVehicleWarningMsgVo);
//新增的都是自定义类型的消息
vehicleWarningMsg.setType(VehicleMsgType.CUSTOM.getCode());
//新增消息默认未处理类型
vehicleWarningMsg.setStatus(VehicleMsgStatus.NOT_PROCESSED.getCode());
mapper.insertSelective(vehicleWarningMsg);
return RestResponse.suc();
}
/**
* 按页查询
* @param queryVehicleWarningMsgVo
* @return
*/
public PageDataVo<VehicleWarningMsg> getByPage(QueryVehicleWarningMsgVo queryVehicleWarningMsgVo){
PageHelper.startPage(queryVehicleWarningMsgVo.getPage(),queryVehicleWarningMsgVo.getLimit());
List<VehicleWarningMsg> vehicleWarningMsgs = mapper.getByPage(queryVehicleWarningMsgVo);
PageInfo<VehicleWarningMsg> vehicleWarningMsgPageInfo = new PageInfo<>(vehicleWarningMsgs);
return PageDataVo.pageInfo(vehicleWarningMsgPageInfo);
}
/**
* 处理预警消息(把状态置为已处理)
* @param id
* @return
*/
public RestResponse deal(Integer id){
VehicleWarningMsg params = new VehicleWarningMsg();
params.setId(id);
params.setStatus(VehicleMsgStatus.PROCESSED.getCode());
Integer effected = mapper.updateByPrimaryKeySelective(params);
return RestResponse.suc();
}
/**
* 检查车辆是否需要插入相关预警信息
*/
@Scheduled(cron = "0 0 0 * * ?")//每日0点触发
public void checkIfNeedWarn(){
//获取redis乐观锁,失败则不执行,确保只有一个线程执行
Boolean hasSuc = customRedisTemplate.opsForValue().setIfAbsent(RedisKey.LOCK_VEHICLE_WARNING_MSG,String.valueOf(DateTime.now().getMillis()));
if(hasSuc){//设置23小时后过期
customRedisTemplate.expire(RedisKey.LOCK_VEHICLE_WARNING_MSG,23, TimeUnit.HOURS);
}else{
log.info("[预警信息检查]乐观锁获取失败,该线程不执行任务。");
return;
}
log.info("[预警信息检查]任务开始。");
//获取所有检查规则
List<VehicleWarningRule> vehicleWarningRules = vehicleWarningRuleMapper.selectAll();
if(CollectionUtils.isEmpty(vehicleWarningRules)){
log.info("[预警信息检查]当前不存在任何预警规则,不执行预警信息检查");
return;
}
//按页获取车辆
Integer curPage = 1;
List<Vehicle> vehicles = null;
do{
RowBounds rowBounds = new RowBounds((curPage - 1)*CHECK_BATCH_SIZE_VEHICLE,CHECK_BATCH_SIZE_VEHICLE);
curPage++;
vehicles = vehicleMapper.selectByRowBounds(new Vehicle(),rowBounds);
if(CollectionUtils.isEmpty(vehicles)){
continue;
}
for(Vehicle vehicle : vehicles){ //逐个车辆执行检查
checkIfNeedWarnEachVehicle(vehicle,vehicleWarningRules);
}
}while(CollectionUtils.isEmpty(vehicles));
}
/**
* 对某辆车执行规则检查,查出规则判断函数中支持的参数,若需预警,则执行相关js表达式生成消息内容
* @param vehicle
* @param vehicleWarningRules
*/
private void checkIfNeedWarnEachVehicle(Vehicle vehicle, List<VehicleWarningRule> vehicleWarningRules){
//查出当前车辆曾经触发的预警规则列表
List<VehicleWarningMsg> vehicleWarningMsgs = mapper.getMsgByVehicle(vehicle.getId());
//转化相关list为map方便使用
Map<Integer,VehicleWarningMsg> idAndMsg = Maps.newHashMap();
//提取存在的msgKey
Set<String> existsKey = new HashSet<>();
if(!CollectionUtils.isEmpty(vehicleWarningRules)){
for(VehicleWarningMsg vehicleWarningMsg: vehicleWarningMsgs){
idAndMsg.put(vehicleWarningMsg.getId(),vehicleWarningMsg);
if(StringUtils.isNotBlank(vehicleWarningMsg.getMsgKey())){
existsKey.add(vehicleWarningMsg.getMsgKey());
}
}
}
Map<String,Object> params = Maps.newHashMap();
//填充对应参数
params.put(PARAM_NAME_4_JS_WARNEDIDANDMSG,idAndMsg);
params.put(PARAM_NAME_4_JS_NOW_STR,DateTime.now().toString(DATE_TIME_FORMATTER));
params.put(PARAM_NAME_4_JS_VEHICLE,vehicle);
//查出并写入车辆最近一次更新的里程数
Integer lastDayMileage = null;
if(vehicle.getMileageLastUpdate() != null) {
String mileageLastUpdateStr = String.valueOf(vehicle.getMileageLastUpdate());
Object lastDayMileageStrObj = customRedisTemplate.opsForValue().getAndSet(RedisKey.MILEAGE_LAST_DAY_PREFIX + vehicle.getId(),
mileageLastUpdateStr);
String lastDayMileageStr = lastDayMileageStrObj == null ? null : String.valueOf(lastDayMileageStrObj);
if (StringUtils.isNotBlank(lastDayMileageStr)) {
lastDayMileage = Integer.parseInt(lastDayMileageStr);
params.put(PARAM_NAME_4_JS_LAST_DAY_MILEAGE,lastDayMileage); //填充对应参数
}
}
for(VehicleWarningRule vehicleWarningRule:vehicleWarningRules){
//传入参数执行对应js函数
Object jsRet = JSUtil.evalJsFunction(VEHICLE_CHECK_RULE_FUNCTION_PREFIX + vehicleWarningRule.getId(),
vehicleWarningRule.getJsFunctionCheck(),params);
if(!(jsRet instanceof Boolean) || Boolean.FALSE.equals(jsRet)){
continue;
}
params.put(PARAM_NAME_4_JS_CUR_RULE_ID,vehicleWarningRule.getId());
VehicleWarningMsg vehicleWarningMsg = new VehicleWarningMsg();
if(StringUtils.isNotBlank(vehicleWarningRule.getJsFunctionMsgKey())){
//执行相应获取消息唯一键的js函数,用于去重,不存在则无需执行去重检查
String msgKey = String.valueOf(JSUtil.evalJsFunction(VEHICLE_MSG_KEY_FUNCTION_PREFIX + vehicleWarningRule.getId(),
vehicleWarningRule.getJsFunctionMsgKey(),params));
if(existsKey.contains(msgKey)){//注意此处若没有乐观锁保证该任务单线程执行,有并发问题
continue;//去除重复key消息
}
vehicleWarningMsg.setMsgKey(msgKey);
}
//若触发预警,执行js表达式获取相关msg
vehicleWarningMsg.setStatus(VehicleMsgStatus.NOT_PROCESSED.getCode());
vehicleWarningMsg.setType(vehicleWarningRule.getMsgType());
vehicleWarningMsg.setRuleId(vehicleWarningRule.getId());
vehicleWarningMsg.setVehicleId(vehicle.getId());
vehicleWarningMsg.setMsg(String.valueOf(
JSUtil.eval(vehicleWarningRule.getJsExpressionMsg(),params)
));
mapper.insertSelective(vehicleWarningMsg);
}
}
}
...@@ -51,4 +51,17 @@ public class RedisKey { ...@@ -51,4 +51,17 @@ public class RedisKey {
* 服务器上传文件序号 * 服务器上传文件序号
*/ */
public static final String UPLOAD_FILE_NO_PREFIX ="upload:file:no:"; public static final String UPLOAD_FILE_NO_PREFIX ="upload:file:no:";
/**
* 预警信息检查乐观锁
*/
public static final String LOCK_VEHICLE_WARNING_MSG ="lock:vehicle:warningMsg";
/**
* 车辆预警,前一天检查的里程数redisKey前缀
*/
public static final String MILEAGE_LAST_DAY_PREFIX ="mileage:last_day:";
} }
package com.xinxincaravan.caravan.vehicle.constant;
import com.google.common.collect.Maps;
import java.util.Map;
public enum VehicleMsgStatus {
NOT_PROCESSED(0,"未处理"),
PROCESSED(1,"已处理"),
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
private static Map<Integer,String> codeAndDesc = Maps.newHashMap();
static{
for(VehicleMsgStatus constantType : VehicleMsgStatus.values()){
codeAndDesc.put(constantType.getCode(),constantType.getDesc());
}
}
VehicleMsgStatus(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
}
package com.xinxincaravan.caravan.vehicle.constant;
import com.google.common.collect.Maps;
import java.util.Map;
public enum VehicleMsgType {
MAINTENANCE(1,"汽车保养提醒"),
REPAIR(2,"汽车维修提醒"),
CUSTOM(3,"自定义"),
;
/**
* 编码
*/
private Integer code;
/**
* 类型描述
*/
private String desc;
private static Map<Integer,String> codeAndDesc = Maps.newHashMap();
static{
for(VehicleMsgType constantType : VehicleMsgType.values()){
codeAndDesc.put(constantType.getCode(),constantType.getDesc());
}
}
VehicleMsgType(Integer code, String desc){
this.code=code;
this.desc=desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static Boolean exists(Integer code){
return codeAndDesc.containsKey(code);
}
}
package com.xinxincaravan.caravan.vehicle.entity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/**
*车辆相关预警消息
*
*/
@Data
public class VehicleWarningMsg {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
public Integer id;
/**
* 消息类型,详见VehicleMsgType
*/
public Integer type;
/**
* 消息类型,详见VehicleMsgStatus
*/
public Integer status;
/**
* 消息内容
*/
private String msg;
/**
* 对应规则ID
*/
private Integer ruleId;
/**
* 对应车辆ID
*/
private String vehicleId;
/**
* 消息key,用于去重
*/
private String msgKey;
/**
* 备注
*/
private String remark;
private Date createTime;
private Date updateTime;
}
package com.xinxincaravan.caravan.vehicle.entity;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/**
*车辆相关预警消息
*
*/
@Data
public class VehicleWarningRule {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
/**
* 消息类型,详见VehicleMsgType
*/
private Integer msgType;
/**
* js函数用于检查是否符合规则
*/
private String jsFunctionCheck;
/**
* js表达式用于拼接消息内容
*/
private String jsExpressionMsg;
/**
* js表达式用于生成消息唯一键
*/
private String jsFunctionMsgKey;
/**
* 备注
*/
private String remark;
private Date createTime;
private Date updateTime;
}
package com.xinxincaravan.caravan.vehicle.mapper;
import com.xinxincaravan.caravan.vehicle.entity.VehicleWarningMsg;
import com.xinxincaravan.caravan.vehicle.vo.PageDataVo;
import com.xinxincaravan.caravan.vehicle.vo.QueryVehicleWarningMsgVo;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
public interface VehicleWarningMsgMapper extends Mapper<VehicleWarningMsg> {
public List<VehicleWarningMsg> getByPage(QueryVehicleWarningMsgVo queryVehicleWarningMsgVo);
public List<VehicleWarningMsg> getMsgByVehicle(String vehicleId);
}
package com.xinxincaravan.caravan.vehicle.mapper;
import com.xinxincaravan.caravan.vehicle.entity.VehicleWarningRule;
import tk.mybatis.mapper.common.Mapper;
public interface VehicleWarningRuleMapper extends Mapper<VehicleWarningRule> {
}
package com.xinxincaravan.caravan.vehicle.rest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.github.wxiaoqi.security.auth.client.annotation.IgnoreClientToken;
import com.xinxincaravan.caravan.vehicle.biz.AccompanyingItemBiz;
import com.xinxincaravan.caravan.vehicle.biz.VehicleWarningMsgBiz;
import com.xinxincaravan.caravan.vehicle.common.BaseController;
import com.xinxincaravan.caravan.vehicle.common.CustomIllegalParamException;
import com.xinxincaravan.caravan.vehicle.common.RestResponse;
import com.xinxincaravan.caravan.vehicle.constant.ResCode.ResCode;
import com.xinxincaravan.caravan.vehicle.entity.AccompanyingItem;
import com.xinxincaravan.caravan.vehicle.entity.VehicleWarningMsg;
import com.xinxincaravan.caravan.vehicle.vo.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/vehicleWarningMsg")
@IgnoreClientToken
@Slf4j
public class VehicleWarningMsgController extends BaseController<VehicleWarningMsgBiz> {
@RequestMapping(value ="{id}",method = RequestMethod.GET)
private RestResponse<VehicleWarningMsg> get(@PathVariable Integer id) throws Exception{
return RestResponse.codeAndData(RestResponse.SUC_CODE,baseBiz.selectById(id));
}
@RequestMapping(value ="page",method = RequestMethod.GET)
private RestResponse<PageDataVo<VehicleWarningMsg>> getByPage(@RequestParam String queryVehicleWarningMsgVoJson) throws Exception{
QueryVehicleWarningMsgVo queryVehicleWarningMsgVo = null;
try {
queryVehicleWarningMsgVo = JSON.parseObject(queryVehicleWarningMsgVoJson, QueryVehicleWarningMsgVo.class);
return RestResponse.data(baseBiz.getByPage(queryVehicleWarningMsgVo));
} catch (JSONException ex) {
return RestResponse.code(ResCode.INVALID_REST_REQ_PARAM.getCode());
} catch (CustomIllegalParamException ex){
return RestResponse.code(ResCode.INVALID_REST_REQ_PARAM.getCode());
}
}
@RequestMapping(value ="",method = RequestMethod.POST)
private RestResponse<Integer> add(@RequestBody AddVehicleWarningMsgVo addVehicleWarningMsgVo) throws Exception{
return baseBiz.add(addVehicleWarningMsgVo);
}
@RequestMapping(value ="deal/{id}",method = RequestMethod.PUT)
private RestResponse deal(@PathVariable Integer id) throws Exception{
return baseBiz.deal(id);
}
}
package com.xinxincaravan.caravan.vehicle.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.Map;
public class JSUtil {
public static final ScriptEngineManager manager = new ScriptEngineManager();
public static final ThreadLocal<ScriptEngine> engine = new ThreadLocal<ScriptEngine>() {
@Override
protected ScriptEngine initialValue() {
return manager.getEngineByName("javascript");
}
};
public static final Logger logger = LoggerFactory.getLogger(Object.class);
/**
* 执行js函数(注意,js的脚本引擎不是线程安全的,不要使用全局变量)
* @param functionCode 函数代码,只包含块中内容
* @param params 参数params
* @return
*/
public static Object evalJsFunction(String functionName,String functionCode,Map<String,Object> params){
try{
engine.get().eval("function "+functionName +"(params){" +
functionCode +
"};");
if (engine.get() instanceof Invocable) {
Invocable in = (Invocable) engine.get();
return in.invokeFunction(functionName,params);
}
}catch(Exception e){
logger.error(e.getMessage());
}
return null;
}
/**
* 执行js表达式
* @param jsExpression js表达式
* @param params 参数,供表达式调用
* @return
*/
public static Object eval(String jsExpression, Map<String,Object> params){
try{
engine.get().eval("function evalJSExpression(params){" +
"return eval(\""+ jsExpression +"\");" +
"}");
if (engine.get() instanceof Invocable) {
Invocable in = (Invocable) engine.get();
return in.invokeFunction("evalJSExpression",params);
}
}catch(Exception e){
logger.error(e.getMessage());
}
return null;
}
}
package com.xinxincaravan.caravan.vehicle.vo;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/**
*车辆相关预警消息
*
*/
@Data
public class AddVehicleWarningMsgVo {
/**
* 消息内容
*/
private String msg;
/**
* 对应车辆ID
*/
private String vehicleId;
/**
* 备注
*/
private String remark;
}
package com.xinxincaravan.caravan.vehicle.vo;
import lombok.Data;
/**
*车辆相关预警消息
*
*/
@Data
public class QueryVehicleWarningMsgVo {
/**
* 对应车辆code
*/
private Integer vehicleCode;
/**
* 对应车牌号
*/
private String numberPlate;
/**
* 消息类型,详见VehicleMsgType
*/
public Integer type;
private Integer page;
private Integer limit;
}
package com.xinxincaravan.caravan.vehicle.vo;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/**
*车辆相关预警消息
*
*/
@Data
public class VehicleWarningMsgQueryVo {
public Integer id;
/**
* 消息类型,详见VehicleMsgType
*/
public Integer type;
/**
* 消息类型,详见VehicleMsgStatus
*/
public Integer status;
/**
* 消息内容
*/
private String msg;
/**
* 对应规则ID
*/
private Integer ruleId;
/**
* 对应车辆ID
*/
private String vehicleId;
/**
* 消息key,用于去重
*/
private String msgKey;
/**
* 备注
*/
private String remark;
/**
* 对应车辆code
*/
private Integer vehicleCode;
/**
* 对应车牌号
*/
private String numberPlate;
private Date createTime;
private Date updateTime;
}
<?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="com.xinxincaravan.caravan.vehicle.mapper.VehicleWarningMsgMapper">
<select id="getByPage" resultType="com.xinxincaravan.caravan.vehicle.vo.VehicleWarningMsgQueryVo"
parameterType="com.xinxincaravan.caravan.vehicle.vo.QueryVehicleWarningMsgVo">
select
vwn.id, vwn.type, vwn.`status`, vwn.msg, vwn.rule_id, vwn.msg_key, vwn.vehicle_id, vwn.create_time, vwn.update_time, vwn.remark, v.code as vehicleCode, v.number_plate
from vehicle_warning_msg vwn left join vehicle v on vwn.vehicle_id = v.id
where
vwn.`status` = 0
<if test="vehicleCode != null">
and v.code = #{vehicleCode}
</if>
<if test="numberPlate != null and numberPlate != '' ">
and v.number_plate = #{numberPlate}
</if>
<if test="type != null">
and type = #{type}
</if>
</select>
<select id="getMsgByVehicle" parameterType="String" resultType="com.xinxincaravan.caravan.vehicle.entity.VehicleWarningMsg" >
select id, type, status, msg, rule_id, msg_key, vehicle_id, create_time, update_time, remark from vehicle_warning_msg where vehicle_id = #{_parameter}
</select>
</mapper>
\ No newline at end of file
<?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="com.xinxincaravan.caravan.vehicle.mapper.VehicleWarningRuleMapper">
<select id="getByPage" parameterType="com.xinxincaravan.caravan.vehicle.vo.QueryVehicleWarningMsgVo" resultType="com.xinxincaravan.caravan.vehicle.entity.VehicleWarningMsg" >
</select>
</mapper>
\ No newline at end of file
package com.xinxincaravan.caravan.vehicle.biz;
import com.xinxincaravan.caravan.vehicle.VehicleApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={VehicleApplication.class,VehicleWarningMsgBizTest.class})
public class VehicleWarningMsgBizTest {
@Autowired
private VehicleWarningMsgBiz vehicleWarningMsgBiz;
@Test
public void checkIfNeedWarn() {
vehicleWarningMsgBiz.checkIfNeedWarn();
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment