Compare commits
9 Commits
dev_lz
...
d4f20f7a67
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4f20f7a67 | ||
|
|
118729ccb2 | ||
|
|
17eb0c69ff | ||
|
|
985ec252c6 | ||
|
|
4c41f6f77e | ||
|
|
90003d79c5 | ||
|
|
7871c2ac70 | ||
|
|
778ab69fbc | ||
|
|
c403b07aeb |
@@ -0,0 +1,35 @@
|
|||||||
|
package org.dromara.mica.mqtt.server.config;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.TaskScheduler;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务线程池配置
|
||||||
|
* 解决默认定时任务线程池(大小为1)被阻塞导致所有定时任务无法执行的问题
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Configuration
|
||||||
|
@EnableScheduling
|
||||||
|
public class SchedulerConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public TaskScheduler taskScheduler() {
|
||||||
|
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
|
||||||
|
// 增加线程池大小,避免单线程阻塞影响所有定时任务
|
||||||
|
scheduler.setPoolSize(5);
|
||||||
|
scheduler.setThreadNamePrefix("mqtt-scheduler-");
|
||||||
|
// 等待所有任务完成后再关闭
|
||||||
|
scheduler.setWaitForTasksToCompleteOnShutdown(true);
|
||||||
|
// 等待时间
|
||||||
|
scheduler.setAwaitTerminationSeconds(60);
|
||||||
|
// 设置异常处理器,确保异常被记录但不中断定时任务
|
||||||
|
scheduler.setErrorHandler(throwable -> {
|
||||||
|
log.error("定时任务执行异常", throwable);
|
||||||
|
});
|
||||||
|
return scheduler;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,13 +49,53 @@ public class ServerController {
|
|||||||
return service.set_time(body);
|
return service.set_time(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/openFloodgate/{sn}")
|
//手动触发抬杆
|
||||||
public boolean openFloodgate(@PathVariable String sn){
|
@PostMapping("/openFloodgate")
|
||||||
|
public boolean openFloodgate(@RequestBody JSONObject js) {
|
||||||
|
String sn = js.getString("sn");
|
||||||
return service.openFloodgate(sn);
|
return service.openFloodgate(sn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/lock/{sn}")
|
@PostMapping("/set_io_lock_status")
|
||||||
public boolean lock(@PathVariable String sn){
|
public JSONObject lock(@RequestBody JSONObject js) {
|
||||||
return service.locked(sn);
|
String sn = js.getString("sn");
|
||||||
|
Integer status = js.getInteger("status");
|
||||||
|
Integer ioout = js.getInteger("ioout");
|
||||||
|
boolean publish = service.locked(sn, status,ioout);
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
if (publish) {
|
||||||
|
jsonObject.put("code", 200);
|
||||||
|
} else {
|
||||||
|
jsonObject.put("code", 500);
|
||||||
|
}
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
//常开
|
||||||
|
@PostMapping("/set_io_lock_open")
|
||||||
|
public JSONObject lockOpen(@RequestBody JSONObject js) {
|
||||||
|
String sn = js.getString("sn");
|
||||||
|
boolean publish = service.lockOpen(sn);
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
if (publish) {
|
||||||
|
jsonObject.put("code", 200);
|
||||||
|
} else {
|
||||||
|
jsonObject.put("code", 500);
|
||||||
|
}
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
//常关
|
||||||
|
@PostMapping("/set_io_lock_close")
|
||||||
|
public JSONObject lockClose(@RequestBody JSONObject js) {
|
||||||
|
String sn = js.getString("sn");
|
||||||
|
boolean publish = service.lockClose(sn);
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
if (publish) {
|
||||||
|
jsonObject.put("code", 200);
|
||||||
|
} else {
|
||||||
|
jsonObject.put("code", 500);
|
||||||
|
}
|
||||||
|
return jsonObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.dromara.mica.mqtt.server.entity;
|
package org.dromara.mica.mqtt.server.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -16,7 +18,8 @@ public class CarInfo implements Serializable {
|
|||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/** customer_id */
|
/** customer_id */
|
||||||
private Long id;
|
@TableId(type = IdType.AUTO)
|
||||||
|
private Long customerId;
|
||||||
|
|
||||||
/** 白名单生效时间 */
|
/** 白名单生效时间 */
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
package org.dromara.mica.mqtt.server.entity;
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
|
||||||
import lombok.Data;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author lz
|
|
||||||
* @date 2026-02-24
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@TableName("car_park")
|
|
||||||
public class CarPark implements Serializable {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 主键ID
|
|
||||||
*/
|
|
||||||
@TableId(type = IdType.AUTO) // 自增主键
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 车场名称
|
|
||||||
*/
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 所属空间
|
|
||||||
*/
|
|
||||||
private Long spaceId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 车位总数
|
|
||||||
*/
|
|
||||||
private Long carsNum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 余位数
|
|
||||||
*/
|
|
||||||
private Long surplusNum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 备注
|
|
||||||
*/
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建者
|
|
||||||
*/
|
|
||||||
private Long createUser;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
@TableField(fill = FieldFill.INSERT) // 插入时自动填充
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新者
|
|
||||||
*/
|
|
||||||
private Long updateUser;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新时间
|
|
||||||
*/
|
|
||||||
@TableField(fill = FieldFill.INSERT_UPDATE) // 插入/更新时自动填充
|
|
||||||
private Date updateTime;
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.dromara.mica.mqtt.server.entity;
|
package org.dromara.mica.mqtt.server.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -22,12 +24,13 @@ public class CarParkItem implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* id
|
* id
|
||||||
*/
|
*/
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备id
|
* 设备id
|
||||||
*/
|
*/
|
||||||
private Long equipmentId;
|
private String equipmentId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 停车场id
|
* 停车场id
|
||||||
@@ -44,4 +47,14 @@ public class CarParkItem implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String area;
|
private String area;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车位数量
|
||||||
|
*/
|
||||||
|
private Integer carsNum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 满车位自动锁杆:0:不锁,1:锁
|
||||||
|
*/
|
||||||
|
private Integer autoLock;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,11 +36,6 @@ public class CarParkRecord implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Long customerId;
|
private Long customerId;
|
||||||
|
|
||||||
/*
|
|
||||||
* 车牌号
|
|
||||||
* */
|
|
||||||
private String plate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否下发(0未下发1已下发)
|
* 是否下发(0未下发1已下发)
|
||||||
*/
|
*/
|
||||||
@@ -51,9 +46,4 @@ public class CarParkRecord implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String clientId;
|
private String clientId;
|
||||||
|
|
||||||
/*
|
|
||||||
* 设备序列号
|
|
||||||
* */
|
|
||||||
private String sequence;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.dromara.mica.mqtt.server.entity;
|
package org.dromara.mica.mqtt.server.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -22,6 +24,7 @@ public class CarPassGather implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* id
|
* id
|
||||||
*/
|
*/
|
||||||
|
@TableId(type = IdType.AUTO )
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.dromara.mica.mqtt.server.entity;
|
package org.dromara.mica.mqtt.server.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
|
||||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
@@ -24,6 +24,7 @@ public class CarPassRecord implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* id
|
* id
|
||||||
*/
|
*/
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package org.dromara.mica.mqtt.server.entity;
|
package org.dromara.mica.mqtt.server.entity;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@@ -16,6 +18,7 @@ public class Equipment implements Serializable {
|
|||||||
|
|
||||||
|
|
||||||
/** 设备Id */
|
/** 设备Id */
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/** 所属产品Id */
|
/** 所属产品Id */
|
||||||
@@ -45,8 +48,4 @@ public class Equipment implements Serializable {
|
|||||||
/** 设备状态(0在线 1离线) */
|
/** 设备状态(0在线 1离线) */
|
||||||
private String flag;
|
private String flag;
|
||||||
|
|
||||||
/* 车辆设备字段 杆是否被锁住 0:未上锁 1: 已上锁 */
|
|
||||||
private String locked;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
|
|||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.dromara.mica.mqtt.core.annotation.MqttServerFunction;
|
import org.dromara.mica.mqtt.core.annotation.MqttServerFunction;
|
||||||
@@ -20,6 +21,7 @@ import org.dromara.mica.mqtt.server.service.ICarParkItemService;
|
|||||||
import org.dromara.mica.mqtt.server.service.ICarParkRecordService;
|
import org.dromara.mica.mqtt.server.service.ICarParkRecordService;
|
||||||
import org.dromara.mica.mqtt.server.service.ICarPassGatherService;
|
import org.dromara.mica.mqtt.server.service.ICarPassGatherService;
|
||||||
import org.dromara.mica.mqtt.server.service.ICarPassRecordService;
|
import org.dromara.mica.mqtt.server.service.ICarPassRecordService;
|
||||||
|
import org.dromara.mica.mqtt.server.service.impl.ServerService;
|
||||||
import org.dromara.mica.mqtt.server.utils.AESUtil;
|
import org.dromara.mica.mqtt.server.utils.AESUtil;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -29,6 +31,7 @@ import org.tio.utils.hutool.StrUtil;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@@ -56,9 +59,15 @@ public class CarMessageListener {
|
|||||||
@Autowired
|
@Autowired
|
||||||
ICarPassGatherService carPassGatherService;
|
ICarPassGatherService carPassGatherService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ServerService service;
|
||||||
|
|
||||||
|
|
||||||
private static String key = "1234567898765432";
|
private static String key = "1234567898765432";
|
||||||
|
|
||||||
|
//xa、jl、td、xj
|
||||||
private String jinjiangUrl = "http://127.0.0.1:6609/";
|
private String jinjiangUrl = "http://127.0.0.1:6609/";
|
||||||
|
//zr
|
||||||
// private String jinjiangUrl = "http://192.168.155.42:6609/";
|
// private String jinjiangUrl = "http://192.168.155.42:6609/";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -97,7 +106,7 @@ public class CarMessageListener {
|
|||||||
carParkRecord.setClientId(whiteListOperatorPO.getId());
|
carParkRecord.setClientId(whiteListOperatorPO.getId());
|
||||||
//新增修改和删除车牌得回执信息一致,通过id区分
|
//新增修改和删除车牌得回执信息一致,通过id区分
|
||||||
if (whiteListOperatorPO.getId().contains("del_")) {
|
if (whiteListOperatorPO.getId().contains("del_")) {
|
||||||
carParkRecord.setSync("3");
|
carParkRecord.setSync("2");
|
||||||
} else {
|
} else {
|
||||||
carParkRecord.setSync("1");
|
carParkRecord.setSync("1");
|
||||||
}
|
}
|
||||||
@@ -114,6 +123,17 @@ public class CarMessageListener {
|
|||||||
public void ivs_result(String topic, Map<String, String> topicVars, byte[] message) throws Exception {
|
public void ivs_result(String topic, Map<String, String> topicVars, byte[] message) throws Exception {
|
||||||
String sn = topicVars.get("sn");
|
String sn = topicVars.get("sn");
|
||||||
log.info("接收到车辆识别消息 -> Topic: {}", topic);
|
log.info("接收到车辆识别消息 -> Topic: {}", topic);
|
||||||
|
|
||||||
|
//如果开启了锁杆,且车位满了
|
||||||
|
CarParkItem carParkItem = carParkItemService.selectBySn(sn);
|
||||||
|
long count = carPassGatherService.count(new QueryWrapper<CarPassGather>().eq("park_id", carParkItem.getParkId()));
|
||||||
|
if (StrUtil.equals(carParkItem.getWay(), "0") //入场
|
||||||
|
&& carParkItem.getAutoLock() == 1 //开启了锁杆
|
||||||
|
&& count >= carParkItem.getCarsNum()) { //车位满了
|
||||||
|
log.info("车位满了,不记录入场数据");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String data = new String(message, StandardCharsets.UTF_8);
|
String data = new String(message, StandardCharsets.UTF_8);
|
||||||
JSONObject jsonObject = JSONObject.parseObject(data);
|
JSONObject jsonObject = JSONObject.parseObject(data);
|
||||||
JSONObject payload = jsonObject.getJSONObject("payload");
|
JSONObject payload = jsonObject.getJSONObject("payload");
|
||||||
@@ -152,18 +172,24 @@ public class CarMessageListener {
|
|||||||
if (null != imgRsp && imgRsp.getInteger("code") == 200) {
|
if (null != imgRsp && imgRsp.getInteger("code") == 200) {
|
||||||
record.setUrl(imgRsp.getJSONObject("data").getString("url"));
|
record.setUrl(imgRsp.getJSONObject("data").getString("url"));
|
||||||
}
|
}
|
||||||
// record.setPassTime(DateUtil.date(plateResult.getLong("start_time")));
|
if (plateResult.containsKey("start_time")) {
|
||||||
record.setPassTime(new Date());
|
log.info("拿到了时间:{}", plateResult.getLong("start_time"));
|
||||||
|
record.setPassTime(DateUtil.date(plateResult.getLong("start_time")));
|
||||||
|
} else {
|
||||||
|
log.info("没有拿到时间,默认当前时间");
|
||||||
|
record.setPassTime(DateUtil.date(new Date()));
|
||||||
|
}
|
||||||
record.setSn(sn);
|
record.setSn(sn);
|
||||||
record.setUniqueNo(id);
|
record.setUniqueNo(id);
|
||||||
|
record.setParkId(carParkItem.getParkId());
|
||||||
record.setTriggerType(plateResult.getString("triggerType"));
|
record.setTriggerType(plateResult.getString("triggerType"));
|
||||||
record.setType(carBrand.getString("type"));
|
record.setType(carBrand.getString("type"));
|
||||||
carPassRecordService.save(record);
|
carPassRecordService.save(record);
|
||||||
|
|
||||||
//保存/删除在场数据
|
//保存/删除在场数据
|
||||||
CarParkItem carParkItem = carParkItemService.selectBySn(sn);
|
boolean isExist = carPassGatherService.exists(new QueryWrapper<CarPassGather>().eq("license", license).eq("park_id", carParkItem.getParkId()));
|
||||||
//入场新增数据
|
//入场新增数据
|
||||||
if (StrUtil.equals(carParkItem.getWay(), "0")) {
|
if (StrUtil.equals(carParkItem.getWay(), "0") && !isExist) {
|
||||||
CarPassGather carPassGather = new CarPassGather();
|
CarPassGather carPassGather = new CarPassGather();
|
||||||
carPassGather.setLicense(license);
|
carPassGather.setLicense(license);
|
||||||
carPassGather.setParkId(carParkItem.getParkId());
|
carPassGather.setParkId(carParkItem.getParkId());
|
||||||
@@ -171,8 +197,23 @@ public class CarMessageListener {
|
|||||||
carPassGather.setJoinTime(record.getPassTime());
|
carPassGather.setJoinTime(record.getPassTime());
|
||||||
carPassGather.setSn(sn);
|
carPassGather.setSn(sn);
|
||||||
carPassGatherService.save(carPassGather);
|
carPassGatherService.save(carPassGather);
|
||||||
} else {//出场删除数据
|
|
||||||
|
//最后一辆车进场
|
||||||
|
if (carParkItem.getAutoLock() == 1 && (count + 1) >= carParkItem.getCarsNum()) {
|
||||||
|
List<String> snList = carParkItemService.selectSnByParkId(carParkItem.getParkId());
|
||||||
|
for (String s : snList) {
|
||||||
|
service.locked(s, 2, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (StrUtil.equals(carParkItem.getWay(), "1") && isExist) {//出场删除数据
|
||||||
carPassGatherService.deleteByLicense(license);
|
carPassGatherService.deleteByLicense(license);
|
||||||
|
//出去一辆车,有空位
|
||||||
|
if (carParkItem.getAutoLock() == 1 && count == carParkItem.getCarsNum()) {
|
||||||
|
List<String> snList = carParkItemService.selectSnByParkId(carParkItem.getParkId());
|
||||||
|
for (String s : snList) {
|
||||||
|
service.locked(s, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,8 +266,13 @@ public class CarMessageListener {
|
|||||||
if (null != imgRsp && imgRsp.getInteger("code") == 200) {
|
if (null != imgRsp && imgRsp.getInteger("code") == 200) {
|
||||||
record.setUrl(imgRsp.getJSONObject("data").getString("url"));
|
record.setUrl(imgRsp.getJSONObject("data").getString("url"));
|
||||||
}
|
}
|
||||||
// record.setPassTime(DateUtil.date(plateResult.getLong("start_time")));
|
if (plateResult.containsKey("start_time")) {
|
||||||
record.setPassTime(new Date());
|
log.info("拿到了离线时间:{}", plateResult.getLong("start_time"));
|
||||||
|
record.setPassTime(DateUtil.date(plateResult.getLong("start_time")));
|
||||||
|
} else {
|
||||||
|
log.info("没有拿到离线时间,默认当前时间");
|
||||||
|
record.setPassTime(DateUtil.date(new Date()));
|
||||||
|
}
|
||||||
record.setSn(sn);
|
record.setSn(sn);
|
||||||
record.setUniqueNo(id);
|
record.setUniqueNo(id);
|
||||||
record.setTriggerType(plateResult.getString("triggerType"));
|
record.setTriggerType(plateResult.getString("triggerType"));
|
||||||
@@ -244,6 +290,7 @@ public class CarMessageListener {
|
|||||||
public void gpio_out(String topic, byte[] message) {
|
public void gpio_out(String topic, byte[] message) {
|
||||||
log.info("IO输出事件监听消息 -> Topic: {}, message: {}", topic, new String(message));
|
log.info("IO输出事件监听消息 -> Topic: {}, message: {}", topic, new String(message));
|
||||||
String data = new String(message, StandardCharsets.UTF_8);
|
String data = new String(message, StandardCharsets.UTF_8);
|
||||||
|
|
||||||
log.info("IO输出事件监听:{}", data);
|
log.info("IO输出事件监听:{}", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,9 +304,23 @@ public class CarMessageListener {
|
|||||||
public void set_io_lock_status(String topic, byte[] message) {
|
public void set_io_lock_status(String topic, byte[] message) {
|
||||||
log.info("IO锁定事件监听消息 -> Topic: {}, message: {}", topic, new String(message));
|
log.info("IO锁定事件监听消息 -> Topic: {}, message: {}", topic, new String(message));
|
||||||
String data = new String(message, StandardCharsets.UTF_8);
|
String data = new String(message, StandardCharsets.UTF_8);
|
||||||
log.info("IO锁定事件监听:{}", data);
|
JSONObject jsonObject = JSONObject.parseObject(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发布获取IO锁定状态监听
|
||||||
|
*
|
||||||
|
* @param topic
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
@MqttServerFunction("device/${sn}/message/down/get_io_lock_status/reply")
|
||||||
|
public void get_io_lock_status(String topic, byte[] message) {
|
||||||
|
log.info("发布获取IO锁定状态监听消息 -> Topic: {}, message: {}", topic, new String(message));
|
||||||
|
String data = new String(message, StandardCharsets.UTF_8);
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订阅离线数据数量
|
* 订阅离线数据数量
|
||||||
*
|
*
|
||||||
@@ -272,11 +333,4 @@ public class CarMessageListener {
|
|||||||
String data = new String(message, StandardCharsets.UTF_8);
|
String data = new String(message, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
@MqttServerFunction("device/${sn}/message/down/set_time/reply")
|
|
||||||
public void set_time(String topic, byte[] message) {
|
|
||||||
log.info("订阅离线数据数量 -> Topic: {}, message: {}", topic, new String(message));
|
|
||||||
String data = new String(message, StandardCharsets.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,4 +10,5 @@ import java.util.List;
|
|||||||
public interface CarInfoMapper extends BaseMapper<CarInfo> {
|
public interface CarInfoMapper extends BaseMapper<CarInfo> {
|
||||||
|
|
||||||
List<CarInfo> selectCarInfoList(CarInfo car);
|
List<CarInfo> selectCarInfoList(CarInfo car);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ import java.util.List;
|
|||||||
@Mapper
|
@Mapper
|
||||||
public interface CarParkItemMapper extends BaseMapper<CarParkItem> {
|
public interface CarParkItemMapper extends BaseMapper<CarParkItem> {
|
||||||
|
|
||||||
@Select("SELECT p.id,p.park_id parkId,p.way,p.equipment_id equipmentId,p.area FROM car_park_item p left join sys_equipment e on p.equipment_id = e.id where e.sequence = #{sn} and e.product_id = 4 limit 1")
|
@Select("SELECT p.id,p.park_id parkId,k.auto_lock autoLock,k.cars_num carsNum,p.way,p.equipment_id equipmentId,p.area FROM car_park_item p left join sys_equipment e on p.equipment_id = e.id LEFT JOIN car_park k on p.park_id = k.id where e.sequence = #{sn} and e.product_id = 4 limit 1")
|
||||||
CarParkItem selectBySn(@Param("sn") String sn);
|
CarParkItem selectBySn(@Param("sn") String sn);
|
||||||
|
|
||||||
|
@Select("SELECT e.sequence FROM car_park_item p left join sys_equipment e on p.equipment_id = e.id where p.park_id = #{parkId} and p.way = 0 and e.product_id = 4")
|
||||||
|
List<String> selectSnByParkId(@Param("parkId") String parkId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
package org.dromara.mica.mqtt.server.mapper;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPark;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface CarParkMapper extends BaseMapper<CarPark> {
|
|
||||||
}
|
|
||||||
@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface CarParkRecordMapper extends BaseMapper<CarParkRecord> {
|
public interface CarParkRecordMapper extends BaseMapper<CarParkRecord> {
|
||||||
List<CarParkRecord> selectWithEquipmentSequence();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,8 @@ package org.dromara.mica.mqtt.server.mapper;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassGather;
|
import org.dromara.mica.mqtt.server.entity.CarPassGather;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface CarPassGatherMapper extends BaseMapper<CarPassGather> {
|
public interface CarPassGatherMapper extends BaseMapper<CarPassGather> {
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,11 @@ public class RedisService {
|
|||||||
*/
|
*/
|
||||||
public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit)
|
public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit)
|
||||||
{
|
{
|
||||||
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
|
try {
|
||||||
|
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Redis setCacheObject error: key={}", key, e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -127,7 +131,12 @@ public class RedisService {
|
|||||||
*/
|
*/
|
||||||
public Boolean hasKey(String key)
|
public Boolean hasKey(String key)
|
||||||
{
|
{
|
||||||
return redisTemplate.hasKey(key);
|
try {
|
||||||
|
return redisTemplate.hasKey(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Redis hasKey error: key={}", key, e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -138,8 +147,13 @@ public class RedisService {
|
|||||||
*/
|
*/
|
||||||
public <T> T getCacheObject(final String key)
|
public <T> T getCacheObject(final String key)
|
||||||
{
|
{
|
||||||
ValueOperations<String, T> operation = redisTemplate.opsForValue();
|
try {
|
||||||
return operation.get(key);
|
ValueOperations<String, T> operation = redisTemplate.opsForValue();
|
||||||
|
return operation.get(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Redis getCacheObject error: key={}", key, e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,7 +3,11 @@ package org.dromara.mica.mqtt.server.service;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarParkItem;
|
import org.dromara.mica.mqtt.server.entity.CarParkItem;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface ICarParkItemService extends IService<CarParkItem> {
|
public interface ICarParkItemService extends IService<CarParkItem> {
|
||||||
|
|
||||||
CarParkItem selectBySn(String sn);
|
CarParkItem selectBySn(String sn);
|
||||||
|
|
||||||
|
List<String> selectSnByParkId(String parkId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,9 @@ package org.dromara.mica.mqtt.server.service;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface ICarParkRecordService extends IService<CarParkRecord> {
|
public interface ICarParkRecordService extends IService<CarParkRecord> {
|
||||||
|
|
||||||
int updateByClientId(CarParkRecord carParkRecord);
|
int updateByClientId(CarParkRecord carParkRecord);
|
||||||
|
|
||||||
void delByClientId(CarParkRecord carParkRecord);
|
void delByClientId(CarParkRecord carParkRecord);
|
||||||
|
|
||||||
List<CarParkRecord> listSn();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,8 @@ package org.dromara.mica.mqtt.server.service;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassGather;
|
import org.dromara.mica.mqtt.server.entity.CarPassGather;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassRecord;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface ICarPassGatherService extends IService<CarPassGather> {
|
public interface ICarPassGatherService extends IService<CarPassGather> {
|
||||||
|
|
||||||
void deleteByLicense(String license);
|
void deleteByLicense(String license);
|
||||||
|
|
||||||
void deleteBatchByLicences(List<CarPassRecord> carPassRecords);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,6 @@ package org.dromara.mica.mqtt.server.service;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassRecord;
|
import org.dromara.mica.mqtt.server.entity.CarPassRecord;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface ICarPassRecordService extends IService<CarPassRecord> {
|
public interface ICarPassRecordService extends IService<CarPassRecord> {
|
||||||
|
|
||||||
/*
|
|
||||||
* 批量设置通行记录为历史数据
|
|
||||||
* */
|
|
||||||
public void batchUpdate(List<CarPassRecord> carPassRecords);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||||||
import org.dromara.mica.mqtt.server.entity.Equipment;
|
import org.dromara.mica.mqtt.server.entity.Equipment;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface IEquipmentService extends IService<Equipment> {
|
public interface IEquipmentService extends IService<Equipment> {
|
||||||
|
|
||||||
@@ -13,8 +12,4 @@ public interface IEquipmentService extends IService<Equipment> {
|
|||||||
List<Equipment> selectAllSnFlag();
|
List<Equipment> selectAllSnFlag();
|
||||||
|
|
||||||
void updateFlag(String sn, String flag);
|
void updateFlag(String sn, String flag);
|
||||||
|
|
||||||
List<Equipment> selectAllOnline();
|
|
||||||
|
|
||||||
Map<Long,String> selectIdSnMap();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package org.dromara.mica.mqtt.server.service.impl;
|
package org.dromara.mica.mqtt.server.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarParkItem;
|
import org.dromara.mica.mqtt.server.entity.CarParkItem;
|
||||||
import org.dromara.mica.mqtt.server.mapper.CarParkItemMapper;
|
import org.dromara.mica.mqtt.server.mapper.CarParkItemMapper;
|
||||||
@@ -8,6 +7,8 @@ import org.dromara.mica.mqtt.server.service.ICarParkItemService;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CarParkItemServiceImpl extends ServiceImpl<CarParkItemMapper, CarParkItem> implements ICarParkItemService {
|
public class CarParkItemServiceImpl extends ServiceImpl<CarParkItemMapper, CarParkItem> implements ICarParkItemService {
|
||||||
|
|
||||||
@@ -18,4 +19,9 @@ public class CarParkItemServiceImpl extends ServiceImpl<CarParkItemMapper, CarPa
|
|||||||
public CarParkItem selectBySn(String sn) {
|
public CarParkItem selectBySn(String sn) {
|
||||||
return carParkItemMapper.selectBySn(sn);
|
return carParkItemMapper.selectBySn(sn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> selectSnByParkId(String parkId) {
|
||||||
|
return carParkItemMapper.selectSnByParkId(parkId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,19 @@
|
|||||||
package org.dromara.mica.mqtt.server.service.impl;
|
package org.dromara.mica.mqtt.server.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
||||||
import org.dromara.mica.mqtt.server.mapper.CarParkRecordMapper;
|
import org.dromara.mica.mqtt.server.mapper.CarParkRecordMapper;
|
||||||
import org.dromara.mica.mqtt.server.mapper.EquipmentMapper;
|
|
||||||
import org.dromara.mica.mqtt.server.service.ICarParkRecordService;
|
import org.dromara.mica.mqtt.server.service.ICarParkRecordService;
|
||||||
import org.dromara.mica.mqtt.server.service.IEquipmentService;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CarParkRecordServiceImpl extends ServiceImpl<CarParkRecordMapper, CarParkRecord> implements ICarParkRecordService {
|
public class CarParkRecordServiceImpl extends ServiceImpl<CarParkRecordMapper, CarParkRecord> implements ICarParkRecordService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
CarParkRecordMapper carParkRecordMapper;
|
CarParkRecordMapper carParkRecordMapper;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
IEquipmentService equipmentService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int updateByClientId(CarParkRecord carParkRecord) {
|
public int updateByClientId(CarParkRecord carParkRecord) {
|
||||||
int id = carParkRecordMapper.update(carParkRecord, new QueryWrapper<CarParkRecord>().eq("client_id", carParkRecord.getClientId()));
|
int id = carParkRecordMapper.update(carParkRecord, new QueryWrapper<CarParkRecord>().eq("client_id", carParkRecord.getClientId()));
|
||||||
@@ -33,10 +24,4 @@ public class CarParkRecordServiceImpl extends ServiceImpl<CarParkRecordMapper, C
|
|||||||
public void delByClientId(CarParkRecord carParkRecord) {
|
public void delByClientId(CarParkRecord carParkRecord) {
|
||||||
carParkRecordMapper.delete(new QueryWrapper<CarParkRecord>().eq("client_id", carParkRecord.getClientId()));
|
carParkRecordMapper.delete(new QueryWrapper<CarParkRecord>().eq("client_id", carParkRecord.getClientId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<CarParkRecord> listSn() {
|
|
||||||
List<CarParkRecord> list = carParkRecordMapper.selectWithEquipmentSequence();
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,13 @@
|
|||||||
package org.dromara.mica.mqtt.server.service.impl;
|
package org.dromara.mica.mqtt.server.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassGather;
|
import org.dromara.mica.mqtt.server.entity.CarPassGather;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassRecord;
|
|
||||||
import org.dromara.mica.mqtt.server.mapper.CarPassGatherMapper;
|
import org.dromara.mica.mqtt.server.mapper.CarPassGatherMapper;
|
||||||
import org.dromara.mica.mqtt.server.service.ICarPassGatherService;
|
import org.dromara.mica.mqtt.server.service.ICarPassGatherService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CarPassGatherServiceImpl extends ServiceImpl<CarPassGatherMapper, CarPassGather> implements ICarPassGatherService {
|
public class CarPassGatherServiceImpl extends ServiceImpl<CarPassGatherMapper, CarPassGather> implements ICarPassGatherService {
|
||||||
|
|
||||||
@@ -24,15 +18,4 @@ public class CarPassGatherServiceImpl extends ServiceImpl<CarPassGatherMapper, C
|
|||||||
public void deleteByLicense(String license) {
|
public void deleteByLicense(String license) {
|
||||||
carPassGatherMapper.delete(new LambdaQueryWrapper<CarPassGather>().eq(CarPassGather::getLicense, license));
|
carPassGatherMapper.delete(new LambdaQueryWrapper<CarPassGather>().eq(CarPassGather::getLicense, license));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteBatchByLicences(List<CarPassRecord> carPassRecords) {
|
|
||||||
if(ObjectUtil.isEmpty(carPassRecords) && carPassRecords.size() == 0) {
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
List<String> licenses = carPassRecords.stream().map(CarPassRecord::getLicense).collect(Collectors.toList());
|
|
||||||
LambdaQueryWrapper<CarPassGather> wrapper = Wrappers.lambdaQuery();
|
|
||||||
wrapper.in(CarPassGather::getLicense, licenses);
|
|
||||||
carPassGatherMapper.delete(wrapper);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.dromara.mica.mqtt.server.service.impl;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.apache.ibatis.executor.BatchResult;
|
|
||||||
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
||||||
import org.dromara.mica.mqtt.server.entity.CarPassRecord;
|
import org.dromara.mica.mqtt.server.entity.CarPassRecord;
|
||||||
import org.dromara.mica.mqtt.server.mapper.CarParkRecordMapper;
|
import org.dromara.mica.mqtt.server.mapper.CarParkRecordMapper;
|
||||||
@@ -12,20 +11,10 @@ import org.dromara.mica.mqtt.server.service.ICarPassRecordService;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class CarPassRecordServiceImpl extends ServiceImpl<CarPassRecordMapper, CarPassRecord> implements ICarPassRecordService {
|
public class CarPassRecordServiceImpl extends ServiceImpl<CarPassRecordMapper, CarPassRecord> implements ICarPassRecordService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
CarPassRecordMapper carPassRecordMapper;
|
CarPassRecordMapper carPassRecordMapper;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void batchUpdate(List<CarPassRecord> carPassRecords) {
|
|
||||||
carPassRecords.stream().forEach(carPassRecord -> {
|
|
||||||
carPassRecord.setDataType("1");
|
|
||||||
});
|
|
||||||
carPassRecordMapper.updateById(carPassRecords);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,7 @@ import org.dromara.mica.mqtt.server.service.IEquipmentService;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class EquipmentServiceImpl extends ServiceImpl<EquipmentMapper, Equipment> implements IEquipmentService {
|
public class EquipmentServiceImpl extends ServiceImpl<EquipmentMapper, Equipment> implements IEquipmentService {
|
||||||
@@ -35,16 +32,4 @@ public class EquipmentServiceImpl extends ServiceImpl<EquipmentMapper, Equipment
|
|||||||
equipment.setFlag(flag);
|
equipment.setFlag(flag);
|
||||||
equipmentMapper.update(equipment, new QueryWrapper<Equipment>().eq("sequence", sn).eq("product_id", 4L));
|
equipmentMapper.update(equipment, new QueryWrapper<Equipment>().eq("sequence", sn).eq("product_id", 4L));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Equipment> selectAllOnline() {
|
|
||||||
return equipmentMapper.selectList(new QueryWrapper<Equipment>().eq("product_id", 4L).eq("flag","0").eq("open_need","1"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<Long, String> selectIdSnMap() {
|
|
||||||
List<Equipment> list = equipmentMapper.selectList(new QueryWrapper<Equipment>().eq("product_id", 4L));
|
|
||||||
Map<Long, String> map = list.stream().collect(Collectors.toMap(Equipment::getId, Equipment::getSequence));
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,9 @@ package org.dromara.mica.mqtt.server.service.impl;
|
|||||||
|
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.mica.mqtt.server.entity.Equipment;
|
|
||||||
import org.dromara.mica.mqtt.server.pojo.DeviceIOLockRequestPO;
|
import org.dromara.mica.mqtt.server.pojo.DeviceIOLockRequestPO;
|
||||||
import org.dromara.mica.mqtt.server.pojo.OpenFloodgatePO;
|
import org.dromara.mica.mqtt.server.pojo.OpenFloodgatePO;
|
||||||
import org.dromara.mica.mqtt.server.service.IEquipmentService;
|
|
||||||
import org.dromara.mica.mqtt.server.utils.UuidUtil;
|
import org.dromara.mica.mqtt.server.utils.UuidUtil;
|
||||||
import org.dromara.mica.mqtt.spring.server.MqttServerTemplate;
|
import org.dromara.mica.mqtt.spring.server.MqttServerTemplate;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -26,9 +23,6 @@ public class ServerService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private MqttServerTemplate server;
|
private MqttServerTemplate server;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IEquipmentService equipmentService;
|
|
||||||
|
|
||||||
public boolean publish(JSONObject js) {
|
public boolean publish(JSONObject js) {
|
||||||
String sn = js.getString("sn");
|
String sn = js.getString("sn");
|
||||||
String topic = js.getString("topic");
|
String topic = js.getString("topic");
|
||||||
@@ -63,14 +57,13 @@ public class ServerService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean set_time(String body) {
|
public boolean set_time(String body) {
|
||||||
boolean result = server.publish("61e70b04-8e68be6a","device/61e70b04-8e68be6a/message/down/set_time", body.getBytes(StandardCharsets.UTF_8));
|
boolean result = server.publish("61e70b04-8e68be6a","device/61e70b04-8e68be6a/message/up/offline_record", body.getBytes(StandardCharsets.UTF_8));
|
||||||
log.info("发布离线数据数量body:{},result:{}", body, result);
|
log.info("发布离线数据数量body:{},result:{}", body, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean openFloodgate(String sn) {
|
public boolean openFloodgate(String sn) {
|
||||||
// Equipment equipment = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getName,name));
|
|
||||||
// String sn = equipment.getSequence();
|
|
||||||
String operUrl = "device/%s/message/down/gpio_out";
|
String operUrl = "device/%s/message/down/gpio_out";
|
||||||
String topic = String.format(operUrl, sn);
|
String topic = String.format(operUrl, sn);
|
||||||
OpenFloodgatePO openFloodgatePO = new OpenFloodgatePO();
|
OpenFloodgatePO openFloodgatePO = new OpenFloodgatePO();
|
||||||
@@ -82,14 +75,12 @@ public class ServerService {
|
|||||||
long timestamp = now.atZone(ZoneId.systemDefault()).toEpochSecond();
|
long timestamp = now.atZone(ZoneId.systemDefault()).toEpochSecond();
|
||||||
openFloodgatePO.setTimestamp(timestamp);
|
openFloodgatePO.setTimestamp(timestamp);
|
||||||
openFloodgatePO.setPayload(this.buildPayloadOpen());
|
openFloodgatePO.setPayload(this.buildPayloadOpen());
|
||||||
boolean result = server.publish(sn,topic, openFloodgatePO.toString().getBytes(StandardCharsets.UTF_8));
|
boolean result = server.publish(sn,topic, JSON.toJSONString(openFloodgatePO).getBytes(StandardCharsets.UTF_8));
|
||||||
log.info("抬杠设备编码:{},result:{},请求体{}", sn,result,openFloodgatePO);
|
log.info("抬杠设备编码:{},result:{},请求体{}", sn,result,openFloodgatePO);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean locked(String sn) {
|
public boolean locked(String sn, Integer status, Integer ioout) {
|
||||||
// Equipment equipment = equipmentService.getOne(new LambdaQueryWrapper<Equipment>().eq(Equipment::getName,name));
|
|
||||||
// String sn = equipment.getSequence();
|
|
||||||
String operUrl = "device/%s/message/down/set_io_lock_status";
|
String operUrl = "device/%s/message/down/set_io_lock_status";
|
||||||
String topic = String.format(operUrl, sn);
|
String topic = String.format(operUrl, sn);
|
||||||
DeviceIOLockRequestPO deviceIOLockRequestPO = new DeviceIOLockRequestPO();
|
DeviceIOLockRequestPO deviceIOLockRequestPO = new DeviceIOLockRequestPO();
|
||||||
@@ -97,9 +88,8 @@ public class ServerService {
|
|||||||
deviceIOLockRequestPO.setId(uuid);
|
deviceIOLockRequestPO.setId(uuid);
|
||||||
deviceIOLockRequestPO.setSn(sn);
|
deviceIOLockRequestPO.setSn(sn);
|
||||||
deviceIOLockRequestPO.setName("set_io_lock_status");
|
deviceIOLockRequestPO.setName("set_io_lock_status");
|
||||||
deviceIOLockRequestPO.setPayload(this.buildPayloadLocked());
|
deviceIOLockRequestPO.setPayload(this.buildPayloadLocked(status, ioout));
|
||||||
boolean result = server.publish(sn,topic, deviceIOLockRequestPO.toString().getBytes(StandardCharsets.UTF_8));
|
boolean result = server.publish(sn,topic, JSON.toJSONString(deviceIOLockRequestPO).getBytes(StandardCharsets.UTF_8));
|
||||||
log.info("抬杠解锁:{},result:{},请求体:{}", sn,result,deviceIOLockRequestPO);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,13 +104,65 @@ public class ServerService {
|
|||||||
return payload;
|
return payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject buildPayloadLocked() {
|
private JSONObject buildPayloadLocked(Integer status, Integer ioout) {
|
||||||
JSONObject payload = new JSONObject();
|
JSONObject payload = new JSONObject();
|
||||||
payload.put("type","set_io_lock_status");
|
payload.put("type", "set_io_lock_status");
|
||||||
JSONObject body = new JSONObject();
|
JSONObject body = new JSONObject();
|
||||||
body.put("ioout",1);
|
//io口,摄像头接线口
|
||||||
body.put("status",0);
|
body.put("ioout", ioout);
|
||||||
|
//0解锁 1高电平锁定(保持常抬) 2低电平锁定(保持常关)
|
||||||
|
body.put("status", status);
|
||||||
payload.put("body", body);
|
payload.put("body", body);
|
||||||
return payload;
|
return payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean lockOpen(String sn) {
|
||||||
|
String operUrl = "device/%s/message/down/set_io_lock_status";
|
||||||
|
String topic = String.format(operUrl, sn);
|
||||||
|
|
||||||
|
//通道1解锁
|
||||||
|
DeviceIOLockRequestPO deviceIOLockRequestPO = new DeviceIOLockRequestPO();
|
||||||
|
String uuid = "lockOpen_" + UuidUtil.getUuid();
|
||||||
|
deviceIOLockRequestPO.setId(uuid);
|
||||||
|
deviceIOLockRequestPO.setSn(sn);
|
||||||
|
deviceIOLockRequestPO.setName("set_io_lock_status");
|
||||||
|
deviceIOLockRequestPO.setPayload(this.buildPayloadLocked(0, 1));
|
||||||
|
boolean result = server.publish(sn,topic, JSON.toJSONString(deviceIOLockRequestPO).getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
//通道0 锁定
|
||||||
|
|
||||||
|
DeviceIOLockRequestPO po = new DeviceIOLockRequestPO();
|
||||||
|
po.setId("lockOpen_" + UuidUtil.getUuid());
|
||||||
|
po.setSn(sn);
|
||||||
|
po.setName("set_io_lock_status");
|
||||||
|
po.setPayload(this.buildPayloadLocked(1, 0));
|
||||||
|
boolean result2 = server.publish(sn,topic, JSON.toJSONString(po).getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
return (result && result2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean lockClose(String sn) {
|
||||||
|
String operUrl = "device/%s/message/down/set_io_lock_status";
|
||||||
|
String topic = String.format(operUrl, sn);
|
||||||
|
|
||||||
|
//通道0解锁
|
||||||
|
DeviceIOLockRequestPO deviceIOLockRequestPO = new DeviceIOLockRequestPO();
|
||||||
|
String uuid = "lockOpen_" + UuidUtil.getUuid();
|
||||||
|
deviceIOLockRequestPO.setId(uuid);
|
||||||
|
deviceIOLockRequestPO.setSn(sn);
|
||||||
|
deviceIOLockRequestPO.setName("set_io_lock_status");
|
||||||
|
deviceIOLockRequestPO.setPayload(this.buildPayloadLocked(0, 0));
|
||||||
|
boolean result = server.publish(sn,topic, JSON.toJSONString(deviceIOLockRequestPO).getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
//通道1 锁定
|
||||||
|
|
||||||
|
DeviceIOLockRequestPO po = new DeviceIOLockRequestPO();
|
||||||
|
po.setId("lockOpen_" + UuidUtil.getUuid());
|
||||||
|
po.setSn(sn);
|
||||||
|
po.setName("set_io_lock_status");
|
||||||
|
po.setPayload(this.buildPayloadLocked(1, 1));
|
||||||
|
boolean result2 = server.publish(sn,topic, JSON.toJSONString(po).getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
return (result && result2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,28 +30,32 @@ public class HeartbeatOnLineTask {
|
|||||||
|
|
||||||
@Scheduled(fixedRate = 15 * 1000)
|
@Scheduled(fixedRate = 15 * 1000)
|
||||||
public void run() {
|
public void run() {
|
||||||
log.info("===========心跳检测=============");
|
// 添加异常捕获,防止单个任务异常导致定时任务线程阻塞
|
||||||
//查询车辆摄像头的编码和在线状态
|
try {
|
||||||
List<Equipment> equipment = equipmentService.selectAllSnFlag();
|
log.info("===========心跳检测=============");
|
||||||
|
//查询车辆摄像头的编码和在线状态
|
||||||
|
List<Equipment> equipment = equipmentService.selectAllSnFlag();
|
||||||
|
|
||||||
for (Equipment equip : equipment) {
|
for (Equipment equip : equipment) {
|
||||||
//缓存中有该设备心跳key
|
//缓存中有该设备心跳key
|
||||||
if (redisService.hasKey(CacheConstants.EQUIPMENT_HEARTBEAT + equip.getSequence())) {
|
if (redisService.hasKey(CacheConstants.EQUIPMENT_HEARTBEAT + equip.getSequence())) {
|
||||||
String flag = redisService.getCacheObject(CacheConstants.EQUIPMENT_HEARTBEAT + equip.getSequence());
|
String flag = redisService.getCacheObject(CacheConstants.EQUIPMENT_HEARTBEAT + equip.getSequence());
|
||||||
//有心跳,但是和数据库设备在线状态不一致
|
//有心跳,但是和数据库设备在线状态不一致
|
||||||
if (!StrUtil.equals(flag, equip.getFlag())) {
|
if (!StrUtil.equals(flag, equip.getFlag())) {
|
||||||
log.info("设备:{},flag:{}", equip.getSequence(), flag);
|
log.info("设备:{},flag:{}", equip.getSequence(), flag);
|
||||||
equipmentService.updateFlag(equip.getSequence(), flag);
|
equipmentService.updateFlag(equip.getSequence(), flag);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//没有心跳上传,且设备在线,将设备置为离线
|
//没有心跳上传,且设备在线,将设备置为离线
|
||||||
if (StrUtil.equals(FlagEnums.ONLINE.getCode(), equip.getFlag())) {
|
if (StrUtil.equals(FlagEnums.ONLINE.getCode(), equip.getFlag())) {
|
||||||
log.info("设备:{},无心跳离线", equip.getSequence());
|
log.info("设备:{},无心跳离线", equip.getSequence());
|
||||||
equipmentService.updateFlag(equip.getSequence(), FlagEnums.OFFLINE.getCode());
|
equipmentService.updateFlag(equip.getSequence(), FlagEnums.OFFLINE.getCode());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 捕获所有异常并记录日志,确保定时任务能继续执行
|
||||||
|
log.error("HeartbeatOnLineTask 定时任务执行异常", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,17 +4,15 @@ import cn.hutool.core.date.DatePattern;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.mica.mqtt.core.server.MqttServer;
|
import org.dromara.mica.mqtt.core.server.MqttServer;
|
||||||
import org.dromara.mica.mqtt.server.constant.CacheConstants;
|
import org.dromara.mica.mqtt.server.constant.CacheConstants;
|
||||||
import org.dromara.mica.mqtt.server.entity.*;
|
import org.dromara.mica.mqtt.server.entity.CarInfo;
|
||||||
import org.dromara.mica.mqtt.server.mapper.CarParkMapper;
|
import org.dromara.mica.mqtt.server.entity.CarParkRecord;
|
||||||
import org.dromara.mica.mqtt.server.mapper.CarPassRecordMapper;
|
|
||||||
import org.dromara.mica.mqtt.server.pojo.DeviceIOLockRequestPO;
|
|
||||||
import org.dromara.mica.mqtt.server.pojo.WhiteListOperatorPO;
|
import org.dromara.mica.mqtt.server.pojo.WhiteListOperatorPO;
|
||||||
import org.dromara.mica.mqtt.server.redis.RedisService;
|
import org.dromara.mica.mqtt.server.redis.RedisService;
|
||||||
import org.dromara.mica.mqtt.server.service.*;
|
import org.dromara.mica.mqtt.server.service.ICarInfoService;
|
||||||
|
import org.dromara.mica.mqtt.server.service.ICarParkRecordService;
|
||||||
import org.dromara.mica.mqtt.server.utils.UuidUtil;
|
import org.dromara.mica.mqtt.server.utils.UuidUtil;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
@@ -26,8 +24,6 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 车牌下发设备定时任务
|
* 车牌下发设备定时任务
|
||||||
@@ -45,24 +41,6 @@ public class PlatePublishTask {
|
|||||||
@Autowired
|
@Autowired
|
||||||
ICarParkRecordService carParkRecordService;
|
ICarParkRecordService carParkRecordService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
CarPassRecordMapper carPassRecordMapper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
ICarPassRecordService carPassRecordService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
ICarPassGatherService carPassGatherService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
CarParkMapper carParkMapper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
IEquipmentService equipmentService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
ICarParkItemService carParkItemService;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
RedisService redisService;
|
RedisService redisService;
|
||||||
|
|
||||||
@@ -72,238 +50,98 @@ public class PlatePublishTask {
|
|||||||
*/
|
*/
|
||||||
@Scheduled(fixedDelay = 8 * 1000)
|
@Scheduled(fixedDelay = 8 * 1000)
|
||||||
public void run() {
|
public void run() {
|
||||||
log.info("===== 白名单定时任务开始执行 =====");
|
// 添加异常捕获,防止单个任务异常导致定时任务线程阻塞
|
||||||
String whiteUrl = "device/%s/message/down/white_list_operator";
|
try {
|
||||||
|
String whiteUrl = "device/%s/message/down/white_list_operator";
|
||||||
|
|
||||||
|
//新增&编辑车牌
|
||||||
//删除车牌
|
CarInfo carInfo = new CarInfo();
|
||||||
List<CarParkRecord> carInfos = carParkRecordService.listSn();
|
carInfo.setDelFlag("0");
|
||||||
if (CollUtil.isNotEmpty(carInfos)) {
|
carInfo.setSync("0");
|
||||||
//需要下发的设备
|
List<CarInfo> carInfoList = carInfoService.selectCarInfoList(carInfo);
|
||||||
List<String> snList = carInfos.stream().map(CarParkRecord::getSequence).toList();
|
if (CollUtil.isNotEmpty(carInfoList)) {
|
||||||
for (String sn : snList) {
|
//向设备下发车辆信息
|
||||||
if (!redisService.hasKey(CacheConstants.EQUIPMENT_HEARTBEAT + sn)) {
|
for (CarInfo car : carInfoList) {
|
||||||
log.error("删除车牌,设备:{},无心跳", sn);
|
//如果该设备没有心跳,不下发车牌信息
|
||||||
continue;
|
if (!redisService.hasKey(CacheConstants.EQUIPMENT_HEARTBEAT + car.getSn())) {
|
||||||
}
|
continue;
|
||||||
//车辆授权列表
|
|
||||||
List<CarParkRecord> carParkRecords = new ArrayList<>();
|
|
||||||
String topic = String.format(whiteUrl, sn);
|
|
||||||
WhiteListOperatorPO po = new WhiteListOperatorPO();
|
|
||||||
String uuid = "del_" + UuidUtil.getUuid();
|
|
||||||
po.setId(uuid);
|
|
||||||
po.setSn(sn);
|
|
||||||
po.setName("white_list_operator");
|
|
||||||
//构造内层数据
|
|
||||||
List<String> plates = new ArrayList<>();
|
|
||||||
for (CarParkRecord carParkRecord : carInfos) {
|
|
||||||
plates.add(carParkRecord.getPlate());
|
|
||||||
if (StrUtil.equals(carParkRecord.getSequence(), sn)) {
|
|
||||||
carParkRecord.setClientId(uuid);
|
|
||||||
carParkRecords.add(carParkRecord);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String topic = String.format(whiteUrl, car.getSn());
|
||||||
|
WhiteListOperatorPO po = new WhiteListOperatorPO();
|
||||||
|
String uuid = "add_" + UuidUtil.getUuid();
|
||||||
|
po.setId(uuid);
|
||||||
|
po.setSn(car.getSn());
|
||||||
|
po.setName("white_list_operator");
|
||||||
|
//构造数据
|
||||||
|
po.setPayload(buildPayload(car));
|
||||||
|
|
||||||
|
//更新car_park_record表的clientId,用于回执消息更新下发状态
|
||||||
|
//必须在发送前更新,不然会导致发送后,还没更新完数据库,回执已经收到,无法更新数据,导致持续下发车牌
|
||||||
|
CarParkRecord carParkRecord = new CarParkRecord();
|
||||||
|
carParkRecord.setId(car.getCarParkRecordId());
|
||||||
|
carParkRecord.setClientId(uuid);
|
||||||
|
carParkRecordService.updateById(carParkRecord);
|
||||||
|
|
||||||
|
//发布车牌到设备(协议只能单条发布)
|
||||||
|
boolean publish = mqttServer.publish(car.getSn(), topic, JSON.toJSONString(po).getBytes(StandardCharsets.UTF_8));
|
||||||
|
log.info("定时任务下发车牌topic:{},报文数据:{},发送结果:{}", topic, JSON.toJSONString(po), publish);
|
||||||
}
|
}
|
||||||
po.setPayload(buildPayloadDel(plates));
|
}
|
||||||
//更新车辆授权信息
|
|
||||||
if (CollUtil.isNotEmpty(carParkRecords)) {
|
//删除车牌
|
||||||
carParkRecordService.saveOrUpdateBatch(carParkRecords);
|
CarInfo carDel = new CarInfo();
|
||||||
|
carDel.setDelFlag("2");
|
||||||
|
carDel.setSync("1");
|
||||||
|
List<CarInfo> carInfos = carInfoService.selectCarInfoList(carDel);
|
||||||
|
if (CollUtil.isNotEmpty(carInfos)) {
|
||||||
|
//需要下发的设备
|
||||||
|
List<String> snList = carInfos.stream().map(CarInfo::getSn).distinct().toList();
|
||||||
|
for (String sn : snList) {
|
||||||
|
if (!redisService.hasKey(CacheConstants.EQUIPMENT_HEARTBEAT + sn)) {
|
||||||
|
log.error("删除车牌,设备:{},无心跳", sn);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//车辆授权列表
|
||||||
|
List<CarParkRecord> carParkRecords = new ArrayList<>();
|
||||||
|
|
||||||
|
String topic = String.format(whiteUrl, sn);
|
||||||
|
WhiteListOperatorPO po = new WhiteListOperatorPO();
|
||||||
|
String uuid = "del_" + UuidUtil.getUuid();
|
||||||
|
po.setId(uuid);
|
||||||
|
po.setSn(sn);
|
||||||
|
po.setName("white_list_operator");
|
||||||
|
|
||||||
|
|
||||||
|
//构造内层数据
|
||||||
|
List<String> plates = new ArrayList<>();
|
||||||
|
for (CarInfo car : carInfos) {
|
||||||
|
plates.add(car.getPlate());
|
||||||
|
|
||||||
|
if (StrUtil.equals(car.getSn(), sn)) {
|
||||||
|
CarParkRecord carParkRecord = new CarParkRecord();
|
||||||
|
carParkRecord.setClientId(uuid);
|
||||||
|
carParkRecord.setId(car.getCarParkRecordId());
|
||||||
|
carParkRecords.add(carParkRecord);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
po.setPayload(buildPayloadDel(plates));
|
||||||
|
|
||||||
|
//更新车辆授权信息
|
||||||
|
if (CollUtil.isNotEmpty(carParkRecords)) {
|
||||||
|
carParkRecordService.saveOrUpdateBatch(carParkRecords);
|
||||||
|
}
|
||||||
|
//发布车牌到设备
|
||||||
|
boolean publish = mqttServer.publish(sn, topic, JSON.toJSONString(po).getBytes(StandardCharsets.UTF_8));
|
||||||
|
log.info("定时任务删除车牌topic:{},报文数据:{},发送结果:{}", topic, JSON.toJSONString(po), publish);
|
||||||
|
|
||||||
}
|
}
|
||||||
//发布车牌到设备
|
|
||||||
boolean publish = mqttServer.publish(sn, topic, JSON.toJSONString(po).getBytes(StandardCharsets.UTF_8));
|
|
||||||
log.info("定时任务删除车牌topic:{},报文数据:{},发送结果:{}", topic, JSON.toJSONString(po), publish);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 捕获所有异常并记录日志,确保定时任务能继续执行
|
||||||
|
log.error("PlatePublishTask 定时任务执行异常", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
//新增&编辑车牌
|
|
||||||
CarInfo carInfo = new CarInfo();
|
|
||||||
// carInfo.setDelFlag("0");
|
|
||||||
carInfo.setSync("0");
|
|
||||||
List<CarInfo> carInfoList = carInfoService.selectCarInfoList(carInfo);
|
|
||||||
if (CollUtil.isNotEmpty(carInfoList)) {
|
|
||||||
//向设备下发车辆信息
|
|
||||||
for (CarInfo car : carInfoList) {
|
|
||||||
//如果该设备没有心跳,不下发车牌信息
|
|
||||||
if (!redisService.hasKey(CacheConstants.EQUIPMENT_HEARTBEAT + car.getSn())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String topic = String.format(whiteUrl, car.getSn());
|
|
||||||
WhiteListOperatorPO po = new WhiteListOperatorPO();
|
|
||||||
String uuid = "add_" + UuidUtil.getUuid();
|
|
||||||
po.setId(uuid);
|
|
||||||
po.setSn(car.getSn());
|
|
||||||
po.setName("white_list_operator");
|
|
||||||
//构造数据
|
|
||||||
po.setPayload(buildPayload(car));
|
|
||||||
|
|
||||||
//更新car_park_record表的clientId,用于回执消息更新下发状态
|
|
||||||
//必须在发送前更新,不然会导致发送后,还没更新完数据库,回执已经收到,无法更新数据,导致持续下发车牌
|
|
||||||
CarParkRecord carParkRecord = new CarParkRecord();
|
|
||||||
carParkRecord.setId(car.getCarParkRecordId());
|
|
||||||
carParkRecord.setSequence(car.getSn());
|
|
||||||
carParkRecord.setClientId(uuid);
|
|
||||||
carParkRecordService.updateById(carParkRecord);
|
|
||||||
//发布车牌到设备(协议只能单条发布)
|
|
||||||
boolean publish = mqttServer.publish(car.getSn(), topic, JSON.toJSONString(po).getBytes(StandardCharsets.UTF_8));
|
|
||||||
log.info("定时任务下发车牌topic:{},报文数据:{},发送结果:{}", topic, JSON.toJSONString(po), publish);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.info("白名单定时任务处理结束");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 定时任务 处理通行记录对车位的影响
|
|
||||||
* */
|
|
||||||
@Scheduled(cron = "0/30 * * * * ?")
|
|
||||||
private void handlePassRecord(){
|
|
||||||
log.info("==========开始对通行记录进行处理==========");
|
|
||||||
String lockStatusUrl = "device/%s/message/down/set_io_lock_status";
|
|
||||||
//存放需要上锁的车场id和设备
|
|
||||||
List<Long> lockedParkList = new ArrayList<>();
|
|
||||||
List<Equipment> lockedEquipmentList;
|
|
||||||
//存放需要解锁的车场id和设备
|
|
||||||
List<Long> unlockParkList = new ArrayList<>();
|
|
||||||
List<Equipment> unlockEquipmentList;
|
|
||||||
|
|
||||||
//获取全部车场对应的剩余车位信息
|
|
||||||
List<CarPark> carParks = carParkMapper.selectList(Wrappers.lambdaQuery());
|
|
||||||
//获取车场对应的当前剩余车位
|
|
||||||
Map<Long,Long> parkIdSpaceMap = carParks.stream().collect(Collectors.toMap(item -> item.getId(), item -> item.getSurplusNum(),(v1,v2)->v1));
|
|
||||||
//处理非历史数据的离场通行记录
|
|
||||||
//获取需要处理的出场记录
|
|
||||||
List<CarPassRecord> carOutPassRecord = carPassRecordMapper.selectList(
|
|
||||||
Wrappers.lambdaQuery(CarPassRecord.class)
|
|
||||||
.eq(CarPassRecord::getDirection, "1")
|
|
||||||
.eq(CarPassRecord::getDataType, "0")
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, List<CarPassRecord>> outRecordByParkId = carOutPassRecord.stream()
|
|
||||||
.filter(record -> record.getParkId() != null)
|
|
||||||
.collect(Collectors.groupingBy(CarPassRecord::getParkId));
|
|
||||||
|
|
||||||
// 遍历每个车场的出场记录,更新剩余车位
|
|
||||||
outRecordByParkId.forEach((parkId, outRecords) -> {
|
|
||||||
// 获取该车场当前剩余车位(默认0,避免空指针)
|
|
||||||
Long currentSurplus = parkIdSpaceMap.getOrDefault(Long.valueOf(parkId), 0L);
|
|
||||||
Long newSurplus = currentSurplus + outRecords.size();
|
|
||||||
parkIdSpaceMap.put(Long.valueOf(parkId), newSurplus);
|
|
||||||
log.info("车场ID:{},处理出场记录{}条,剩余车位从{}更新为{}", parkId, outRecords.size(), currentSurplus, newSurplus);
|
|
||||||
});
|
|
||||||
//将出场的车辆从在场记录中删除
|
|
||||||
carPassGatherService.deleteBatchByLicences(carOutPassRecord);
|
|
||||||
//将处理过的通行记录标记为历史数据
|
|
||||||
carPassRecordService.batchUpdate(carOutPassRecord);
|
|
||||||
carParks.stream().forEach(park -> {
|
|
||||||
Long currentSurplus = parkIdSpaceMap.get(park.getId());
|
|
||||||
Long oldSurplus = park.getSurplusNum(); // 原来的剩余车位
|
|
||||||
if (currentSurplus > 0 && oldSurplus <= 0) unlockParkList.add(park.getId());
|
|
||||||
});
|
|
||||||
//先获取全部需解锁的车场对应的绑定列表 只需要管理入场设备
|
|
||||||
if (unlockParkList.size() > 0) {
|
|
||||||
List<CarParkItem> parkItemList = carParkItemService.list(Wrappers.lambdaQuery(CarParkItem.class).in(CarParkItem::getParkId, unlockParkList).eq(CarParkItem::getWay,"0"));
|
|
||||||
List<Long> ids = parkItemList.stream().map(CarParkItem::getEquipmentId).collect(Collectors.toList());
|
|
||||||
unlockEquipmentList = equipmentService.list(Wrappers.lambdaQuery(Equipment.class).in(Equipment::getId, ids).eq(Equipment::getFlag, "0").eq(Equipment::getLocked, "1"));
|
|
||||||
|
|
||||||
//存放成功上锁的设备
|
|
||||||
List<Equipment> successList = new ArrayList<>();
|
|
||||||
for (Equipment equipment : unlockEquipmentList) {
|
|
||||||
String topic = String.format(lockStatusUrl, equipment.getSequence());
|
|
||||||
DeviceIOLockRequestPO deviceIOLockRequestPO = new DeviceIOLockRequestPO();
|
|
||||||
String uuid = "unlock_" + UuidUtil.getUuid();
|
|
||||||
deviceIOLockRequestPO.setId(uuid);
|
|
||||||
deviceIOLockRequestPO.setSn(equipment.getSequence());
|
|
||||||
deviceIOLockRequestPO.setName("set_io_lock_status");
|
|
||||||
JSONObject payload = this.buildPayLoadUnLock();
|
|
||||||
deviceIOLockRequestPO.setPayload(payload);
|
|
||||||
boolean publish = mqttServer.publish(equipment.getSequence(), topic, JSON.toJSONString(deviceIOLockRequestPO).getBytes(StandardCharsets.UTF_8));
|
|
||||||
if (publish) successList.add(equipment);
|
|
||||||
log.info("定时任务设备解锁topic:{},报文数据:{},发送结果:{}", topic, JSON.toJSONString(deviceIOLockRequestPO), publish);
|
|
||||||
}
|
|
||||||
if (successList.size() > 0) {
|
|
||||||
successList.stream().forEach(equipment -> {
|
|
||||||
equipment.setLocked("0");
|
|
||||||
});
|
|
||||||
equipmentService.updateBatchById(successList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//处理非历史数据的进场通行记录
|
|
||||||
//存放新增的在场记录
|
|
||||||
List<CarPassGather> insertList = new ArrayList<>();
|
|
||||||
//存放已经处理的进场通行记录到待处理集合
|
|
||||||
List<CarPassRecord> handedList = new ArrayList<>();
|
|
||||||
List<CarPassRecord> carIntoPassRecord = carPassRecordMapper.selectList(
|
|
||||||
Wrappers.lambdaQuery(CarPassRecord.class)
|
|
||||||
.eq(CarPassRecord::getDirection, "0")
|
|
||||||
.eq(CarPassRecord::getDataType, "0")
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, List<CarPassRecord>> insertRecordByParkId = carIntoPassRecord.stream()
|
|
||||||
.filter(record -> record.getParkId() != null)
|
|
||||||
.collect(Collectors.groupingBy(CarPassRecord::getParkId));
|
|
||||||
|
|
||||||
insertRecordByParkId.forEach((parkId, insertRecords) -> {
|
|
||||||
for (CarPassRecord record : insertRecords) {
|
|
||||||
Long currentSurplus = parkIdSpaceMap.getOrDefault(Long.valueOf(parkId), 0L);
|
|
||||||
if (currentSurplus <= 0) continue;
|
|
||||||
//更新当前车位数
|
|
||||||
Long currentSpace = currentSurplus-1;
|
|
||||||
parkIdSpaceMap.put(Long.valueOf(parkId), currentSpace);
|
|
||||||
//将处理过的进场通行记录加入待处理集合
|
|
||||||
handedList.add(record);
|
|
||||||
//生成新地在场记录,并加入待处理集合
|
|
||||||
CarPassGather carPassGather = new CarPassGather();
|
|
||||||
carPassGather.setParkId(parkId);
|
|
||||||
carPassGather.setLicense(record.getLicense());
|
|
||||||
carPassGather.setSn(record.getSn());
|
|
||||||
carPassGather.setJoinTime(record.getPassTime());
|
|
||||||
insertList.add(carPassGather);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//将待处理的通行记录标记为历史数据
|
|
||||||
carPassRecordService.batchUpdate(handedList);
|
|
||||||
//将新生成的在场记录添加到表中
|
|
||||||
carPassGatherService.saveBatch(insertList);
|
|
||||||
//更新车场的车位信息
|
|
||||||
carParks.stream().forEach(park -> {
|
|
||||||
Long currentSurplus = parkIdSpaceMap.get(park.getId());
|
|
||||||
Long oldSurplus = park.getSurplusNum();
|
|
||||||
park.setSurplusNum(currentSurplus);
|
|
||||||
// 从有车位变为无车位才需要上锁
|
|
||||||
if (currentSurplus <= 0 && oldSurplus > 0) lockedParkList.add(park.getId());
|
|
||||||
});
|
|
||||||
carParkMapper.updateById(carParks);
|
|
||||||
if (lockedParkList.size() > 0) {
|
|
||||||
//先获取全部需上锁的车场对应的绑定列表 只需要管理进场设备
|
|
||||||
List<CarParkItem> parkItemList1 = carParkItemService.list(Wrappers.lambdaQuery(CarParkItem.class).in(CarParkItem::getParkId, lockedParkList).eq(CarParkItem::getWay,"0"));
|
|
||||||
List<Long> ids1 = parkItemList1.stream().map(CarParkItem::getEquipmentId).collect(Collectors.toList());
|
|
||||||
lockedEquipmentList = equipmentService.list(Wrappers.lambdaQuery(Equipment.class).in(Equipment::getId, ids1).eq(Equipment::getFlag, "0").eq(Equipment::getLocked, "0"));
|
|
||||||
//存放成功解锁的设备
|
|
||||||
List<Equipment> successList = new ArrayList<>();
|
|
||||||
for (Equipment equipment : lockedEquipmentList) {
|
|
||||||
String topic = String.format(lockStatusUrl, equipment.getSequence());
|
|
||||||
DeviceIOLockRequestPO deviceIOLockRequestPO = new DeviceIOLockRequestPO();
|
|
||||||
String uuid = "locked_" + UuidUtil.getUuid();
|
|
||||||
deviceIOLockRequestPO.setId(uuid);
|
|
||||||
deviceIOLockRequestPO.setSn(equipment.getSequence());
|
|
||||||
deviceIOLockRequestPO.setName("set_io_lock_status");
|
|
||||||
JSONObject payload = this.buildPayloadLocked();
|
|
||||||
deviceIOLockRequestPO.setPayload(payload);
|
|
||||||
boolean publish = mqttServer.publish(equipment.getSequence(), topic, JSON.toJSONString(deviceIOLockRequestPO).getBytes(StandardCharsets.UTF_8));
|
|
||||||
if (publish) successList.add(equipment);
|
|
||||||
log.info("定时任务设备上锁topic:{},报文数据:{},发送结果:{}", topic, JSON.toJSONString(deviceIOLockRequestPO), publish);
|
|
||||||
}
|
|
||||||
if (successList.size() > 0) {
|
|
||||||
successList.stream().forEach(equipment -> {
|
|
||||||
equipment.setLocked("1");
|
|
||||||
});
|
|
||||||
equipmentService.updateBatchById(successList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.info("==========通行记录处理结束==========");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -348,25 +186,4 @@ public class PlatePublishTask {
|
|||||||
return payload;
|
return payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
//上锁
|
|
||||||
private JSONObject buildPayloadLocked() {
|
|
||||||
JSONObject payload = new JSONObject();
|
|
||||||
payload.put("type","set_io_lock_status");
|
|
||||||
JSONObject body = new JSONObject();
|
|
||||||
body.put("ioout",1);
|
|
||||||
body.put("status",2);
|
|
||||||
payload.put("body", body);
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
//解锁
|
|
||||||
private JSONObject buildPayLoadUnLock(){
|
|
||||||
JSONObject payload = new JSONObject();
|
|
||||||
payload.put("type","set_io_lock_status");
|
|
||||||
JSONObject body = new JSONObject();
|
|
||||||
body.put("ioout",1);
|
|
||||||
body.put("status",0);
|
|
||||||
payload.put("body", body);
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,33 @@
|
|||||||
spring:
|
spring:
|
||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://127.0.0.1:3306/xa_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
url: jdbc:mysql://127.0.0.1:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
|
||||||
username: root
|
username: root
|
||||||
password: root
|
password: root
|
||||||
|
# Druid 连接池配置
|
||||||
|
druid:
|
||||||
|
max-active: 20
|
||||||
|
max-wait: 60000
|
||||||
|
min-idle: 5
|
||||||
|
initial-size: 5
|
||||||
|
validation-query: SELECT 1
|
||||||
|
test-while-idle: true
|
||||||
|
test-on-borrow: false
|
||||||
|
test-on-return: false
|
||||||
|
time-between-eviction-runs-millis: 60000
|
||||||
|
min-evictable-idle-time-millis: 300000
|
||||||
data:
|
data:
|
||||||
redis:
|
redis:
|
||||||
|
# host: 127.0.0.1
|
||||||
host: 192.168.2.30
|
host: 192.168.2.30
|
||||||
password: redis2025
|
password: redis2025
|
||||||
database: 5
|
database: 5
|
||||||
port: 6379
|
port: 6379
|
||||||
|
# Redis 超时配置,防止连接阻塞
|
||||||
|
timeout: 5000ms
|
||||||
|
lettuce:
|
||||||
|
pool:
|
||||||
|
max-active: 8
|
||||||
|
max-idle: 8
|
||||||
|
min-idle: 2
|
||||||
|
max-wait: 5000ms
|
||||||
|
|||||||
@@ -2,27 +2,51 @@ spring:
|
|||||||
datasource:
|
datasource:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
#xa
|
#xa
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/xa_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
# url: jdbc:mysql://127.0.0.1:3306/xa_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
|
||||||
# username: root
|
# username: root
|
||||||
# password: Xahg2024.
|
# password: Xahg2024.
|
||||||
#jl
|
#jl
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/jl_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
# url: jdbc:mysql://127.0.0.1:3306/jl_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
|
||||||
# username: root
|
# username: root
|
||||||
# password: JL202509jj
|
# password: JL202509jj
|
||||||
#td
|
#td
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
# url: jdbc:mysql://127.0.0.1:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
|
||||||
# username: root
|
# username: root
|
||||||
# password: td@JJ2024
|
# password: td@JJ2024
|
||||||
#zr
|
#zr
|
||||||
url: jdbc:mysql://192.168.155.42:3306/zr_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
# url: jdbc:mysql://192.168.155.42:3306/zr_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
|
||||||
|
# username: root
|
||||||
|
# password: zr202407.J
|
||||||
|
#xj
|
||||||
|
url: jdbc:mysql://127.0.0.1:3306/xj_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
|
||||||
username: root
|
username: root
|
||||||
password: zr202407.J
|
password: XjJN2024!
|
||||||
|
# Druid 连接池配置
|
||||||
|
druid:
|
||||||
|
max-active: 20
|
||||||
|
max-wait: 60000
|
||||||
|
min-idle: 5
|
||||||
|
initial-size: 5
|
||||||
|
validation-query: SELECT 1
|
||||||
|
test-while-idle: true
|
||||||
|
test-on-borrow: false
|
||||||
|
test-on-return: false
|
||||||
|
time-between-eviction-runs-millis: 60000
|
||||||
|
min-evictable-idle-time-millis: 300000
|
||||||
data:
|
data:
|
||||||
redis:
|
redis:
|
||||||
#zr
|
#zr
|
||||||
host: 192.168.155.42
|
# host: 192.168.155.42
|
||||||
#xa、jl、td
|
# xa、jl、td、xj
|
||||||
# host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 6379
|
port: 6379
|
||||||
password:
|
password:
|
||||||
database: 1
|
database: 1
|
||||||
|
# Redis 超时配置,防止连接阻塞
|
||||||
|
timeout: 5000ms
|
||||||
|
lettuce:
|
||||||
|
pool:
|
||||||
|
max-active: 8
|
||||||
|
max-idle: 8
|
||||||
|
min-idle: 2
|
||||||
|
max-wait: 5000ms
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ spring:
|
|||||||
name: mica-mqtt-server
|
name: mica-mqtt-server
|
||||||
# 环境 dev|test|prod
|
# 环境 dev|test|prod
|
||||||
profiles:
|
profiles:
|
||||||
# active: dev
|
active: dev
|
||||||
active: prod
|
# active: prod
|
||||||
messages:
|
messages:
|
||||||
encoding: UTF-8
|
encoding: UTF-8
|
||||||
basename: i18n/messages
|
basename: i18n/messages
|
||||||
@@ -127,3 +127,8 @@ logging:
|
|||||||
server: info # t-io 服务端默认日志
|
server: info # t-io 服务端默认日志
|
||||||
org.tio: info # t-io 服务端默认日志
|
org.tio: info # t-io 服务端默认日志
|
||||||
org.dromara.mica.mqtt: info # mica-mqtt 日志
|
org.dromara.mica.mqtt: info # mica-mqtt 日志
|
||||||
|
org.dromara.mica.mqtt.server.task: debug # 定时任务日志级别
|
||||||
|
|
||||||
|
# 定时任务线程池配置
|
||||||
|
scheduler:
|
||||||
|
pool-size: 5
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<mapper namespace="org.dromara.mica.mqtt.server.mapper.CarInfoMapper">
|
<mapper namespace="org.dromara.mica.mqtt.server.mapper.CarInfoMapper">
|
||||||
|
|
||||||
<resultMap type="org.dromara.mica.mqtt.server.entity.CarInfo" id="CarInfoResult">
|
<resultMap type="org.dromara.mica.mqtt.server.entity.CarInfo" id="CarInfoResult">
|
||||||
<result property="id" column="id" />
|
<result property="customerId" column="customer_id" />
|
||||||
<result property="enableTime" column="enable_time" />
|
<result property="enableTime" column="enable_time" />
|
||||||
<result property="overdueTime" column="overdue_time" />
|
<result property="overdueTime" column="overdue_time" />
|
||||||
<result property="enable" column="enable" />
|
<result property="enable" column="enable" />
|
||||||
@@ -24,19 +24,19 @@
|
|||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<sql id="selectCarInfoVo">
|
<sql id="selectCarInfoVo">
|
||||||
select ci.id, ci.enable_time, ci.overdue_time, ci.enable, ci.plate, ci.time_seg_enable, ci.seg_time,
|
select ci.customer_id, ci.enable_time, ci.overdue_time, ci.enable, ci.plate, ci.time_seg_enable, ci.seg_time,
|
||||||
ci.need_alarm, ci.vehicle_code, ci.vehicle_comment, ci.people_id, ci.del_flag, ci.sync, ci.remark,
|
ci.need_alarm, ci.vehicle_code, ci.vehicle_comment, ci.people_id, ci.del_flag, ci.sync, ci.remark,
|
||||||
ci.create_user, ci.create_time, ci.update_user, ci.update_time, ci.overclock_card
|
ci.create_by, ci.create_time, ci.update_by, ci.update_time, ci.overclock_card
|
||||||
from car_info ci
|
from car_info ci
|
||||||
left join car_park cp on ci.park_id=cp.id
|
left join car_park cp on ci.park_id=cp.id
|
||||||
left join sys_people p on ci.people_id=p.id
|
left join sys_people p on ci.people_id=p.id
|
||||||
left join car_park_record cpr on cpr.customer_id=ci.id
|
left join car_park_record cpr on cpr.customer_id=ci.customer_id
|
||||||
left join sys_equipment se on cpr.equipment_id=se.id
|
left join sys_equipment se on cpr.equipment_id=se.id
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectCarInfoList" parameterType="org.dromara.mica.mqtt.server.entity.CarInfo" resultMap="CarInfoResult">
|
<select id="selectCarInfoList" parameterType="org.dromara.mica.mqtt.server.entity.CarInfo" resultMap="CarInfoResult">
|
||||||
SELECT
|
SELECT
|
||||||
ci.id,
|
ci.customer_id,
|
||||||
ci.enable_time,
|
ci.enable_time,
|
||||||
ci.overdue_time,
|
ci.overdue_time,
|
||||||
ci.`enable`,
|
ci.`enable`,
|
||||||
@@ -50,9 +50,9 @@
|
|||||||
ci.del_flag,
|
ci.del_flag,
|
||||||
ci.sync,
|
ci.sync,
|
||||||
ci.remark,
|
ci.remark,
|
||||||
ci.create_user,
|
ci.create_by,
|
||||||
ci.create_time,
|
ci.create_time,
|
||||||
ci.update_user,
|
ci.update_by,
|
||||||
ci.update_time,
|
ci.update_time,
|
||||||
ci.overclock_card,
|
ci.overclock_card,
|
||||||
se.sequence,
|
se.sequence,
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
FROM car_info ci
|
FROM car_info ci
|
||||||
LEFT JOIN car_park cp ON ci.park_id = cp.id
|
LEFT JOIN car_park cp ON ci.park_id = cp.id
|
||||||
LEFT JOIN sys_people p ON ci.people_id = p.id
|
LEFT JOIN sys_people p ON ci.people_id = p.id
|
||||||
LEFT JOIN car_park_record cpr ON cpr.customer_id = ci.id
|
LEFT JOIN car_park_record cpr ON cpr.customer_id = ci.customer_id
|
||||||
LEFT JOIN sys_equipment se ON cpr.equipment_id = se.id
|
LEFT JOIN sys_equipment se ON cpr.equipment_id = se.id
|
||||||
<where>
|
<where>
|
||||||
<if test="enableTime != null "> and ci.enable_time = #{enableTime}</if>
|
<if test="enableTime != null "> and ci.enable_time = #{enableTime}</if>
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
<?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="org.dromara.mica.mqtt.server.mapper.CarParkRecordMapper">
|
|
||||||
<resultMap id="CarParkRecordWithEquipmentResultMap" type="org.dromara.mica.mqtt.server.entity.CarParkRecord">
|
|
||||||
<id property="id" column="id" />
|
|
||||||
<result property="equipmentId" column="equipment_id" />
|
|
||||||
<result property="parkId" column="park_id" />
|
|
||||||
<result property="plate" column="plate" />
|
|
||||||
<result property="customerId" column="customer_id" />
|
|
||||||
<result property="sync" column="sync" />
|
|
||||||
<result property="clientId" column="client_id" />
|
|
||||||
<!-- 关联的设备sequence字段 -->
|
|
||||||
<result property="sequence" column="sequence" />
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<select id="selectWithEquipmentSequence" resultMap="CarParkRecordWithEquipmentResultMap">
|
|
||||||
SELECT
|
|
||||||
cpr.id,
|
|
||||||
cpr.equipment_id,
|
|
||||||
cpr.park_id,
|
|
||||||
cpr.plate,
|
|
||||||
cpr.customer_id,
|
|
||||||
cpr.sync,
|
|
||||||
cpr.client_id,
|
|
||||||
eq.sequence AS sequence
|
|
||||||
FROM car_park_record cpr
|
|
||||||
LEFT JOIN sys_equipment eq ON cpr.equipment_id = eq.id
|
|
||||||
where
|
|
||||||
cpr.sync = '2'
|
|
||||||
ORDER BY cpr.id DESC
|
|
||||||
</select>
|
|
||||||
</mapper>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?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="org.dromara.mica.mqtt.server.mapper.CarPassGatherMapper">
|
|
||||||
|
|
||||||
</mapper>
|
|
||||||
Reference in New Issue
Block a user