Commit 43eb29ac authored by dengjh's avatar dengjh

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

parent 8277a8de
...@@ -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