diff --git a/jsowell-admin/src/main/java/com/jsowell/service/CameraService.java b/jsowell-admin/src/main/java/com/jsowell/service/CameraService.java index 5cc66478f..703100e29 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/CameraService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/CameraService.java @@ -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 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 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 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 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"); } /** diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java index 8450cee0d..316a6ec79 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/thirdparty/camera/CameraController.java @@ -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(); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/Camera2GroundLockCommand.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/Camera2GroundLockCommand.java new file mode 100644 index 000000000..be38f9af1 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/camera/Camera2GroundLockCommand.java @@ -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; +}