mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 02:55:04 +08:00
update
This commit is contained in:
@@ -16,6 +16,7 @@ import com.jsowell.common.util.sign.MD5Util;
|
||||
import com.jsowell.netty.server.mqtt.BootNettyMqttChannelInboundHandler;
|
||||
import com.jsowell.pile.domain.PileCameraInfo;
|
||||
import com.jsowell.pile.dto.GenerateOccupyOrderDTO;
|
||||
import com.jsowell.pile.dto.camera.Camera2GroundLockCommand;
|
||||
import com.jsowell.pile.dto.camera.CameraHeartBeatDTO;
|
||||
import com.jsowell.pile.dto.camera.CameraIdentifyResultsDTO;
|
||||
import com.jsowell.pile.service.IMemberBasicInfoService;
|
||||
@@ -71,7 +72,7 @@ public class CameraService {
|
||||
private IMemberBasicInfoService memberBasicInfoService;
|
||||
|
||||
|
||||
public void receiveIdentifyResults(JSONObject jsonObject) {
|
||||
public void receiveIdentifyResults(JSONObject jsonObject) throws InterruptedException {
|
||||
// 区分入场和出场
|
||||
Integer parking_state = jsonObject.getJSONObject("parking").getInteger("parking_state");
|
||||
if (parking_state == 1) {
|
||||
@@ -102,30 +103,73 @@ public class CameraService {
|
||||
*
|
||||
* @param jsonObject
|
||||
*/
|
||||
private void vehicleEntry(JSONObject jsonObject, String parkingState) {
|
||||
private void vehicleEntry(JSONObject jsonObject, String parkingState) throws InterruptedException {
|
||||
// 先将车牌图片信息存入缓存
|
||||
// boolean result = saveCarPicture2Redis(jsonObject, parkingState);
|
||||
|
||||
// 将信息存数据库
|
||||
boolean result = saveInfo2DataBase(jsonObject);
|
||||
if (!result) {
|
||||
logger.error("车辆入场,将信息存入数据库 error, 源数据:{}", jsonObject);
|
||||
return;
|
||||
}
|
||||
// 根据车牌号找出绑定小程序的用户
|
||||
// 解析 jsonObject
|
||||
// 车牌信息
|
||||
CameraIdentifyResultsDTO.ProductH.Plate plate = JSONObject.parseObject(jsonObject.getJSONObject("product_h").getJSONObject("plate").toJSONString(),
|
||||
CameraIdentifyResultsDTO.ProductH.Plate.class);
|
||||
if (plate == null) {
|
||||
return;
|
||||
}
|
||||
// 设备信息
|
||||
CameraIdentifyResultsDTO.DeviceInfo deviceInfo = JSONObject.parseObject(jsonObject.getJSONObject("device_info").toJSONString(),
|
||||
CameraIdentifyResultsDTO.DeviceInfo.class);
|
||||
if (deviceInfo == null) {
|
||||
return;
|
||||
}
|
||||
// 停车位信息
|
||||
CameraIdentifyResultsDTO.ProductH.Parking parking = JSONObject.parseObject(jsonObject.getJSONObject("product_h").getJSONObject("parking").toJSONString(),
|
||||
CameraIdentifyResultsDTO.ProductH.Parking.class);
|
||||
if (parking == null) {
|
||||
return;
|
||||
}
|
||||
// 获取背景图片
|
||||
JSONArray bgImgs = jsonObject.getJSONArray("bg_img");
|
||||
List<CameraIdentifyResultsDTO.BgImg> bgImgList = bgImgs.toList(CameraIdentifyResultsDTO.BgImg.class);
|
||||
if (CollectionUtils.isEmpty(bgImgList)) {
|
||||
return;
|
||||
}
|
||||
// Base64 解密
|
||||
String plateNumber = cn.hutool.core.codec.Base64.decodeStr(plate.getPlate());
|
||||
String zoneName = cn.hutool.core.codec.Base64.decodeStr(parking.getZoneName());
|
||||
// 将解密后的值重新 set 进对象中,便于存储数据库
|
||||
plate.setPlate(plateNumber);
|
||||
parking.setZoneName(zoneName);
|
||||
|
||||
// 将信息存数据库
|
||||
boolean result = saveInfo2DataBase(bgImgList, plate, deviceInfo, parking);
|
||||
if (!result) {
|
||||
logger.error("车辆入场,将信息存入数据库 error, 源数据:{}", jsonObject);
|
||||
return;
|
||||
}
|
||||
// 先判断该车牌是否有挂起未支付的占桩订单
|
||||
|
||||
// 如果有占桩订单,则先提醒“需支付占桩订单”
|
||||
|
||||
|
||||
// 根据车牌号找出绑定小程序的用户
|
||||
List<MemberVO> memberList = memberBasicInfoService.getMemberInfoByPlateNumber(plateNumber);
|
||||
if (CollectionUtils.isNotEmpty(memberList)) {
|
||||
// 如果是有小程序的用户,则先降地锁,然后生成一笔占桩订单
|
||||
// 发送降锁指令
|
||||
Camera2GroundLockCommand command = Camera2GroundLockCommand.builder()
|
||||
.sn(deviceInfo.getSn())
|
||||
.msgType("GroundlockOption")
|
||||
.msgPrefix("GO")
|
||||
.topic("/remoteCommand")
|
||||
.zoneId(parking.getZoneId())
|
||||
.option(3) // 3-降锁后不自动升锁
|
||||
.force(0) // 强制操作 0:否 1:是
|
||||
|
||||
.build();
|
||||
String msgId = sendGroundLockMsg(command);
|
||||
// 判断降锁是否成功
|
||||
|
||||
// 降锁成功,生成占桩订单
|
||||
|
||||
// 生成占桩订单
|
||||
} else {
|
||||
// 如果没有小程序账号,再根据此车牌是否有挂起的占桩订单
|
||||
|
||||
@@ -144,34 +188,9 @@ public class CameraService {
|
||||
// orderPileOccupyService.generateOccupyPileOrder()
|
||||
}
|
||||
|
||||
private boolean saveInfo2DataBase(JSONObject jsonObject) {
|
||||
// 车牌信息
|
||||
CameraIdentifyResultsDTO.ProductH.Plate plate = JSONObject.parseObject(jsonObject.getJSONObject("product_h").getJSONObject("plate").toJSONString(),
|
||||
CameraIdentifyResultsDTO.ProductH.Plate.class);
|
||||
if (plate == null) {
|
||||
return false;
|
||||
}
|
||||
// 停车位信息
|
||||
CameraIdentifyResultsDTO.ProductH.Parking parking = JSONObject.parseObject(jsonObject.getJSONObject("product_h").getJSONObject("parking").toJSONString(),
|
||||
CameraIdentifyResultsDTO.ProductH.Parking.class);
|
||||
if (parking == null) {
|
||||
return false;
|
||||
}
|
||||
// 设备信息
|
||||
CameraIdentifyResultsDTO.DeviceInfo deviceInfo = JSONObject.parseObject(jsonObject.getJSONObject("device_info").toJSONString(),
|
||||
CameraIdentifyResultsDTO.DeviceInfo.class);
|
||||
if (deviceInfo == null) {
|
||||
return false;
|
||||
}
|
||||
// 获取背景图片
|
||||
JSONArray bgImgs = jsonObject.getJSONArray("bg_img");
|
||||
List<CameraIdentifyResultsDTO.BgImg> bgImgList = bgImgs.toList(CameraIdentifyResultsDTO.BgImg.class);
|
||||
if (CollectionUtils.isEmpty(bgImgList)) {
|
||||
return false;
|
||||
}
|
||||
// Base64解密
|
||||
String plateNumber = cn.hutool.core.codec.Base64.decodeStr(plate.getPlate());
|
||||
String zoneName = cn.hutool.core.codec.Base64.decodeStr(parking.getZoneName());
|
||||
private boolean saveInfo2DataBase(List<CameraIdentifyResultsDTO.BgImg> bgImgList, CameraIdentifyResultsDTO.ProductH.Plate plate,
|
||||
CameraIdentifyResultsDTO.DeviceInfo deviceInfo, CameraIdentifyResultsDTO.ProductH.Parking parking) {
|
||||
String zoneName = parking.getZoneName();
|
||||
|
||||
for (CameraIdentifyResultsDTO.BgImg bgImg : bgImgList) {
|
||||
// 上传到阿里云OSS,获取图片上传成功后的地址
|
||||
@@ -185,7 +204,7 @@ public class CameraService {
|
||||
.deviceName(deviceInfo.getDevName())
|
||||
.deviceIp(deviceInfo.getIp())
|
||||
.deviceSn(deviceInfo.getSn())
|
||||
.plateNumber(plateNumber)
|
||||
.plateNumber(plate.getPlate())
|
||||
.parkingState(String.valueOf(parking.getParkingState()))
|
||||
.zoneId(parking.getZoneId())
|
||||
.zoneName(zoneName)
|
||||
@@ -237,7 +256,19 @@ public class CameraService {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 发送地锁升降指令
|
||||
*/
|
||||
private String sendGroundLockMsg(Camera2GroundLockCommand command) throws InterruptedException {
|
||||
|
||||
JSONObject msgData = new JSONObject();
|
||||
msgData.put("option", command.getOption());
|
||||
msgData.put("zone_id", command.getZoneId());
|
||||
msgData.put("force", command.getForce());
|
||||
|
||||
String msgId = sendMsg2Topic(command.getSn(), command.getMsgType(), command.getMsgPrefix(), command.getTopic(), msgData);
|
||||
return msgId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -247,15 +278,17 @@ public class CameraService {
|
||||
* @param msgPrefix 消息前缀
|
||||
* @param topic 主题
|
||||
* @param msgData 消息内容
|
||||
*
|
||||
* @throws InterruptedException
|
||||
* @return msg_id 相当于此消息的唯一标识,用于辨识返回报文
|
||||
*/
|
||||
public void sendMsg2Topic(String sn, String msgType, String msgPrefix, String topic, JSONObject msgData) throws InterruptedException {
|
||||
public String sendMsg2Topic(String sn, String msgType, String msgPrefix, String topic, JSONObject msgData) throws InterruptedException {
|
||||
JSONObject jsonObject = spliceStr(sn, msgType, msgPrefix);
|
||||
// 通过sn查找出对应的channelId
|
||||
String mqttConnectRedisKey = CacheConstants.MQTT_CONNECT_SN + sn;
|
||||
Object cacheObject = redisCache.getCacheObject(mqttConnectRedisKey);
|
||||
if (cacheObject == null) {
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
String channelId = (String) cacheObject;
|
||||
if (msgData != null) {
|
||||
@@ -265,6 +298,7 @@ public class CameraService {
|
||||
logger.info("给相机发送远程命令,sn:{}, 消息类型:{}, 主题:{}, 最终发送数据:{}", sn, msgType, topic, jsonObject.toJSONString());
|
||||
// 发送消息
|
||||
handler.sendMsg(channelId, topic, jsonObject.toJSONString());
|
||||
return jsonObject.getString("msg_id");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -52,8 +52,12 @@ public class CameraController extends BaseController {
|
||||
public CameraCommonResult receiveIdentifyResults(@RequestBody JSONObject jsonObject) {
|
||||
logger.info("相机系统接收识别结果 params:{}", jsonObject);
|
||||
CameraCommonResult result = new CameraCommonResult();
|
||||
// 调用service方法处理
|
||||
cameraService.receiveIdentifyResults(jsonObject);
|
||||
try {
|
||||
// 调用service方法处理
|
||||
cameraService.receiveIdentifyResults(jsonObject);
|
||||
} catch (Exception e) {
|
||||
logger.error("相机系统接收识别结果 error,", e);
|
||||
}
|
||||
return result.successResponse();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.jsowell.pile.dto.camera;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 相机向地锁发送指令
|
||||
*
|
||||
* @author Lemon
|
||||
* @Date 2024/1/6 11:06:23
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class Camera2GroundLockCommand {
|
||||
private String sn;
|
||||
private String msgType;
|
||||
private String msgPrefix;
|
||||
private String topic;
|
||||
private Integer option;
|
||||
private Integer zoneId;
|
||||
private Integer force;
|
||||
}
|
||||
Reference in New Issue
Block a user