Ver código fonte

化学品柜锁功能对接开发

liubo 3 anos atrás
pai
commit
4e2a61401c
18 arquivos alterados com 380 adições e 47 exclusões
  1. 11 0
      zd-api/zd-api-system/src/main/java/com/zd/system/api/factory/RemoteSubQueryFallbackFactory.java
  2. 92 0
      zd-api/zd-api-system/src/main/java/com/zd/system/api/laboratory/CabinetV2Lock.java
  3. 12 0
      zd-api/zd-api-system/src/main/java/com/zd/system/api/laboratory/RemoteSubQueryService.java
  4. 12 0
      zd-common/zd-common-core/src/main/java/com/zd/common/core/utils/ReUtil.java
  5. 11 12
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/controller/HxpAIOController.java
  6. 3 3
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/mapper/HxpCabinetMapper.java
  7. 3 2
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/IHxpCabinetService.java
  8. 76 12
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpCabinetServiceImpl.java
  9. 4 2
      zd-modules/zd-chemical/src/main/resources/mapper/chemical/HxpCabinetMapper.xml
  10. 64 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  11. 6 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/config/MqttConfig.java
  12. 19 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/entiy/MessageBody.java
  13. 5 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/constant/SocketTypes.java
  14. 18 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java
  15. 32 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/service/SocketService.java
  16. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/CRCCHECK.java
  17. 4 14
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/HexUtils.java
  18. 7 0
      zd-modules/zd-netty/src/main/java/com/zd/netty/handler/SocketHandler.java

+ 11 - 0
zd-api/zd-api-system/src/main/java/com/zd/system/api/factory/RemoteSubQueryFallbackFactory.java

@@ -2,6 +2,7 @@ package com.zd.system.api.factory;
 
 import com.zd.common.core.domain.R;
 import com.zd.system.api.domain.SubQueryConfig;
+import com.zd.system.api.laboratory.CabinetV2Lock;
 import com.zd.system.api.laboratory.RemoteSubQueryService;
 import com.zd.system.api.laboratory.domain.CabinetLock;
 import com.zd.system.api.laboratory.domain.LabSubject;
@@ -61,6 +62,16 @@ public class RemoteSubQueryFallbackFactory implements FallbackFactory<RemoteSubQ
             public R cabinetLock(CabinetLock cabinetLock) {
                 return R.fail("柜锁操作失败:" + cause.getMessage());
             }
+
+            @Override
+            public R cabinetV2OpenLock(CabinetV2Lock cabinetV2Lock) {
+                return R.fail("柜锁开锁失败:" + cause.getMessage());
+            }
+
+            @Override
+            public R cabinetV2CloseLock(CabinetV2Lock cabinetV2Lock) {
+                return R.fail("柜锁关锁失败:" + cause.getMessage());
+            }
         };
     }
 }

+ 92 - 0
zd-api/zd-api-system/src/main/java/com/zd/system/api/laboratory/CabinetV2Lock.java

@@ -0,0 +1,92 @@
+package com.zd.system.api.laboratory;
+
+public class CabinetV2Lock {
+
+    /**
+     * 硬件ID
+     */
+    private String hardwareId;
+
+    /**
+     * 摄像头IP 地址
+     */
+    private String ipAddress;
+
+    /**
+     * 柜锁bit ID
+     */
+    private String lockId;
+
+    /**
+     * 柜锁名称
+     */
+    private String lockName;
+
+    /**
+     * 机柜名称
+     */
+    private String cabinetName;
+
+    /**
+     * 采集器编号
+     */
+    private String relayCode;
+
+    private boolean success = false;
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    public String getLockName() {
+        return lockName;
+    }
+
+    public void setLockName(String lockName) {
+        this.lockName = lockName;
+    }
+
+    public String getCabinetName() {
+        return cabinetName;
+    }
+
+    public void setCabinetName(String cabinetName) {
+        this.cabinetName = cabinetName;
+    }
+
+    public String getHardwareId() {
+        return hardwareId;
+    }
+
+    public void setHardwareId(String hardwareId) {
+        this.hardwareId = hardwareId;
+    }
+
+    public String getLockId() {
+        return lockId;
+    }
+
+    public void setLockId(String lockId) {
+        this.lockId = lockId;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getRelayCode() {
+        return relayCode;
+    }
+
+    public void setRelayCode(String relayCode) {
+        this.relayCode = relayCode;
+    }
+}

+ 12 - 0
zd-api/zd-api-system/src/main/java/com/zd/system/api/laboratory/RemoteSubQueryService.java

@@ -51,4 +51,16 @@ public interface RemoteSubQueryService {
 
     @PostMapping("/device/remote/cabinetLock")
     R cabinetLock(@RequestBody @Valid CabinetLock cabinetLock);
+
+    /**
+     * 柜锁开锁 V2
+     */
+    @PostMapping("/device/remote/V2/openLock")
+    R cabinetV2OpenLock(@RequestBody @Valid CabinetV2Lock cabinetV2Lock);
+
+    /**
+     * 柜锁关锁锁 V2
+     */
+    @PostMapping("/device/remote/V2/closeLock")
+    R cabinetV2CloseLock(@RequestBody @Valid CabinetV2Lock cabinetV2Lock);
 }

+ 12 - 0
zd-common/zd-common-core/src/main/java/com/zd/common/core/utils/ReUtil.java

@@ -145,4 +145,16 @@ public class ReUtil {
         return builder.toString();
     }
 
+    public static byte[] hexStringToByteArray(String hexString) {
+        hexString = hexString.replaceAll(" ", "");
+        int len = hexString.length();
+        byte[] bytes = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
+            bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
+                    .digit(hexString.charAt(i + 1), 16));
+        }
+        return bytes;
+    }
+
 }

+ 11 - 12
zd-modules/zd-chemical/src/main/java/com/zd/chemical/controller/HxpAIOController.java

@@ -13,6 +13,7 @@ import com.zd.common.core.web.page.TableDataInfo;
 import com.zd.common.log.annotation.Log;
 import com.zd.common.log.enums.BusinessType;
 import com.zd.common.security.service.TokenService;
+import com.zd.system.api.laboratory.CabinetV2Lock;
 import com.zd.system.api.model.LoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -385,16 +386,14 @@ public class HxpAIOController extends BaseController {
                 List<HxpUserecord> userecordList;
                 switch (qType) {
                     case 1:
-                        // 领用化学品
-                        userecordList = hxpUserecordService.selectHxpUserecordList(hxpUserecord);
-                        if(userecordList.size() > 0){
-                            return R.fail("该化学品领用中,还未归还!");
-                        }
-                        break;
                     case 3:
                         // 化学品出库
                         userecordList = hxpUserecordService.selectHxpUserecordList(hxpUserecord);
                         if(userecordList.size() > 0){
+                            if(qType == 1){
+                                // 领用化学品
+                                return R.fail("该化学品领用中,还未归还!");
+                            }
                             return R.fail("化学品领用中,请先完成归还后再操作出库。");
                         }
                         break;
@@ -496,7 +495,7 @@ public class HxpAIOController extends BaseController {
     @PostMapping("/openLock")
     @Log(title = "柜锁开锁", businessType = BusinessType.INSERT)
     @ApiOperation(value = "柜锁开锁")
-    public R<Map<String, Object>> openLock(@RequestBody @Valid AioCabinetLockVo aioCabinetLockVo) {
+    public R<CabinetV2Lock> openLock(@RequestBody @Valid AioCabinetLockVo aioCabinetLockVo) {
         if(LockTypeEnum.SYSTEM == aioCabinetLockVo.getLockType()){
             if(aioCabinetLockVo.getLockId() == null){
                 return R.fail("柜锁参数不能为空!");
@@ -505,8 +504,8 @@ public class HxpAIOController extends BaseController {
             return R.fail("柜锁参数不能为空 !");
         }
         aioCabinetLockVo.setSubId(getSubIdByTerminalNum());
-        Map<String, Object> list = hxpCabinetService.openLock(aioCabinetLockVo);
-        return R.ok(list);
+        CabinetV2Lock cabinetV2Lock = hxpCabinetService.openLock(aioCabinetLockVo);
+        return R.ok(cabinetV2Lock);
     }
 
     /**
@@ -515,7 +514,7 @@ public class HxpAIOController extends BaseController {
     @PostMapping("/closeLock")
     @Log(title = "柜锁关锁", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "柜锁关锁")
-    public R<Map<String, Object>> closeLock(@RequestBody @Valid AioCabinetLockVo aioCabinetLockVo) {
+    public R<CabinetV2Lock> closeLock(@RequestBody @Valid AioCabinetLockVo aioCabinetLockVo) {
         if(LockTypeEnum.SYSTEM == aioCabinetLockVo.getLockType()){
             if(aioCabinetLockVo.getLockId() == null){
                 return R.fail("柜锁参数不能为空!");
@@ -524,8 +523,8 @@ public class HxpAIOController extends BaseController {
             return R.fail("柜锁参数不能为空 !");
         }
         aioCabinetLockVo.setSubId(getSubIdByTerminalNum());
-        Map<String, Object> list = hxpCabinetService.closeLock(aioCabinetLockVo);
-        return R.ok(list);
+        CabinetV2Lock cabinetV2Lock = hxpCabinetService.closeLock(aioCabinetLockVo);
+        return R.ok(cabinetV2Lock);
     }
 
     /**--------------------------------------人脸验证----------------------------------------*/

+ 3 - 3
zd-modules/zd-chemical/src/main/java/com/zd/chemical/mapper/HxpCabinetMapper.java

@@ -1,10 +1,10 @@
 package com.zd.chemical.mapper;
 
 import java.util.List;
-import java.util.Map;
 
 import com.zd.chemical.domain.HxpCabinet;
 import com.zd.chemical.domain.vo.*;
+import com.zd.system.api.laboratory.CabinetV2Lock;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -94,7 +94,7 @@ public interface HxpCabinetMapper
 
     Integer selectLockIdByJoinId(Long joinId);
 
-    Map<String, Object> selectByJoinId(Long lockId);
+    CabinetV2Lock selectByJoinId(Long lockId);
 
-    Map<String, Object> selectIpAddressByLockId(@Param("subId") Long subId, @Param("lockId") Integer lockId);
+    CabinetV2Lock selectIpAddressByLockId(@Param("subId") Long subId, @Param("lockId") Integer lockId);
 }

+ 3 - 2
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/IHxpCabinetService.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.zd.chemical.domain.HxpCabinet;
 import com.zd.chemical.domain.vo.*;
+import com.zd.system.api.laboratory.CabinetV2Lock;
 
 /**
  * 化学品机柜管理信息Service接口
@@ -75,7 +76,7 @@ public interface IHxpCabinetService
 
     AioSubInfoVo querySubInfo(Long subId);
 
-    Map<String, Object> openLock(AioCabinetLockVo aioCabinetLockVo);
+    CabinetV2Lock openLock(AioCabinetLockVo aioCabinetLockVo);
 
-    Map<String, Object> closeLock(AioCabinetLockVo aioCabinetLockVo);
+    CabinetV2Lock closeLock(AioCabinetLockVo aioCabinetLockVo);
 }

+ 76 - 12
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpCabinetServiceImpl.java

@@ -22,6 +22,7 @@ import com.zd.common.security.utils.SaveUtil;
 
 import com.zd.common.swagger.config.AppListener;
 import com.zd.system.api.camera.RemoteCameraService;
+import com.zd.system.api.laboratory.CabinetV2Lock;
 import com.zd.system.api.laboratory.RemoteLaboratoryService;
 import com.zd.system.api.laboratory.RemoteSubQueryService;
 import com.zd.system.api.laboratory.domain.CabinetLock;
@@ -240,23 +241,86 @@ public class HxpCabinetServiceImpl implements IHxpCabinetService {
     }
 
     @Override
-    public Map<String, Object> openLock(AioCabinetLockVo aioCabinetLockVo) {
-        Map<String, Object> result = doLock(aioCabinetLockVo, 1);
-        result.put("success", true);
-        return result;
+    public CabinetV2Lock openLock(AioCabinetLockVo aioCabinetLockVo) {
+        // 第一版开锁流程
+        // Map<String, Object> result = doLock(aioCabinetLockVo, 1);
+
+        CabinetV2Lock cabinetV2Lock = doLockTwo(aioCabinetLockVo, 1);
+        return cabinetV2Lock;
     }
 
     @Override
-    public Map<String, Object> closeLock(AioCabinetLockVo aioCabinetLockVo) {
-        Map<String, Object> result = doLock(aioCabinetLockVo, 2);
-        result.put("success", true);
+    public CabinetV2Lock closeLock(AioCabinetLockVo aioCabinetLockVo) {
+        // 一版关锁流程
+        // Map<String, Object> result = doLock(aioCabinetLockVo, 2);
+
+        CabinetV2Lock result = doLockTwo(aioCabinetLockVo, 2);
         return result;
     }
 
+    private CabinetV2Lock doLockTwo(AioCabinetLockVo aioCabinetLockVo, int type) {
+        CabinetV2Lock result;
+        if(LockTypeEnum.SYSTEM.equals(aioCabinetLockVo.getLockType()) && aioCabinetLockVo.getLockId() != null){
+            result = hxpCabinetMapper.selectIpAddressByLockId(aioCabinetLockVo.getSubId(), aioCabinetLockVo.getLockId());
+        }else {
+            result = hxpCabinetMapper.selectByJoinId(aioCabinetLockVo.getJoinId());
+        }
+
+        boolean success = false;
+        if (type == 1) {
+            // 开锁
+            // 1. 执行开锁命令
+            R r = remoteSubQueryService.cabinetV2OpenLock(result);
+            // 2. 判断执行状态
+            if(r.getCode() == HttpStatus.SUCCESS){
+                success = true;
+                // 3. 调用录像功能
+
+            }
+        }else if(type == 2){
+            // 关锁
+            R r = remoteSubQueryService.cabinetV2CloseLock(result);
+            // 判断执行状态
+            if(r.getCode() == HttpStatus.SUCCESS){
+                success = true;
+                // 结束录像获取地址
+
+            }
+        }
+
+        // 添加记录
+        if(success){
+            if(type == 1){
+                HxpCabinetlockLog hxpCabinetlockLog = new HxpCabinetlockLog();
+                hxpCabinetlockLog.setCabinetlockId(Long.parseLong(result.getHardwareId()));
+                hxpCabinetlockLog.setUnLockTime(DateUtils.getNowDate());
+                hxpCabinetlockLog.setOperationType(aioCabinetLockVo.getLockType().getCode());
+                hxpCabinetlockLog.setCreateTime(DateUtils.getNowDate());
+                hxpCabinetlockLog.setCreateBy(SecurityUtils.getUsername());
+                cabinetlockLogService.insertHxpCabinetlockLog(hxpCabinetlockLog);
+
+            }else if(type == 2){
+                // 关锁之后要存储录像
+                /*HxpCabinetlockLog hxpCabinetlockLog = cabinetlockLogMapper.selectByLockId(aioCabinetLockVo.getSubId(), lockId);
+                if(hxpCabinetlockLog != null){
+                    hxpCabinetlockLog.setCloseLockTime(DateUtils.getNowDate());
+                    hxpCabinetlockLog.setCloseLockVideo(closeLockVideo);
+                    cabinetlockLogService.updateHxpCabinetlockLog(hxpCabinetlockLog);
+                }else {
+                    logger.error("柜锁关闭修改操作记录失败:" + aioCabinetLockVo.getSubId() + "---------" + lockId);
+                }*/
+            }
+        }
+
+        result.setSuccess(success);
+
+        return result;
+
+    }
 
 
-    private Map<String, Object> doLock(AioCabinetLockVo aioCabinetLockVo, int type){
-        Map<String, Object> result;
+    private CabinetV2Lock doLock(AioCabinetLockVo aioCabinetLockVo, int type){
+        CabinetV2Lock result;
         if(LockTypeEnum.SYSTEM.equals(aioCabinetLockVo.getLockType()) && aioCabinetLockVo.getLockId() != null){
             result = hxpCabinetMapper.selectIpAddressByLockId(aioCabinetLockVo.getSubId(), aioCabinetLockVo.getLockId());
         }else {
@@ -265,7 +329,7 @@ public class HxpCabinetServiceImpl implements IHxpCabinetService {
         }
 
         try {
-            Integer lockId = Integer.parseInt(result.get("lockId")+ "");
+            Integer lockId = Integer.parseInt(result.getLockId());
             if(lockId == null){
                 logger.error("柜锁参数未设置,执行跳过");
                 return result;
@@ -284,7 +348,7 @@ public class HxpCabinetServiceImpl implements IHxpCabinetService {
             remoteSubQueryService.cabinetLock(cabinetLock);
 
             // 开始录像
-            String ipAddress = result.get("ipAddress") + "";
+            String ipAddress = result.getIpAddress();
             String closeLockVideo = "";
             boolean success = false;
             if(org.apache.commons.lang3.StringUtils.isNotBlank(ipAddress)){
@@ -304,7 +368,7 @@ public class HxpCabinetServiceImpl implements IHxpCabinetService {
             // 添加记录
             if(type == 1){
                 HxpCabinetlockLog hxpCabinetlockLog = new HxpCabinetlockLog();
-                hxpCabinetlockLog.setCabinetlockId(Long.parseLong(result.get("hardwareId")+""));
+                hxpCabinetlockLog.setCabinetlockId(Long.parseLong(result.getHardwareId()));
                 hxpCabinetlockLog.setUnLockTime(DateUtils.getNowDate());
                 hxpCabinetlockLog.setOperationType(aioCabinetLockVo.getLockType().getCode());
                 hxpCabinetlockLog.setCreateTime(DateUtils.getNowDate());

+ 4 - 2
zd-modules/zd-chemical/src/main/resources/mapper/chemical/HxpCabinetMapper.xml

@@ -159,21 +159,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select lock_id from lab_hardware where id = (select cabinetlock_id from hxp_chemical_join_cabinet where id = #{joinId})
     </select>
 
-    <select id="selectByJoinId" resultType="java.util.Map">
+    <select id="selectByJoinId" resultType="com.zd.system.api.laboratory.CabinetV2Lock">
         select
             h.id hardwareId,
             h.ip_address as ipAddress,
             h.lock_id as lockId,
             h.name as lockName,
+            h.relay_code relayCode,
             ca.cabinet_name as cabinetName
         from hxp_chemical_join_cabinet jo inner join lab_hardware h on h.id = jo.cabinetlock_id
             inner join hxp_cabinet ca on ca.id = jo.cabinet_id
         where jo.id = #{joinId}
     </select>
 
-    <select id="selectIpAddressByLockId" resultType="java.util.Map">
+    <select id="selectIpAddressByLockId" resultType="com.zd.system.api.laboratory.CabinetV2Lock">
         select
             h.id hardwareId,
+            h.relay_code relayCode,
             h.lock_id as lockId
         from lab_hardware h
         where h.subject_id = #{subId} and lock_id = #{lockId}

+ 64 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java

@@ -1,7 +1,12 @@
 package com.zd.laboratory.controller.device;
 
 import com.zd.common.core.domain.R;
+import com.zd.common.core.utils.ReUtil;
+import com.zd.common.redis.service.RedisService;
+import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.service.SocketService;
+import com.zd.laboratory.utils.CRCCHECK;
+import com.zd.system.api.laboratory.CabinetV2Lock;
 import com.zd.system.api.laboratory.domain.CabinetLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -10,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 设备远程控制接口
@@ -20,6 +28,8 @@ public class DeviceRemoteController {
 
     @Autowired
     private SocketService socketService;
+    @Autowired
+    private RedisService redisService;
 
 
     @PostMapping("/cabinetLock")
@@ -32,4 +42,58 @@ public class DeviceRemoteController {
         return R.ok();
     }
 
+    @PostMapping("/V2/openLock")
+    public R cabinetV2OpenLock(@RequestBody CabinetV2Lock cabinetV2Lock){
+        String instruct = CRCCHECK.getOpenLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+        String relayCode = cabinetV2Lock.getRelayCode();
+        OutputStream ops = TCPServer.cacheMap.get(relayCode);
+
+        try {
+            ops.write(ReUtil.hexStringToByteArray(instruct));
+
+            Thread.sleep(300);
+
+            ops.write(ReUtil.hexStringToByteArray(CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()))));
+
+            Thread.sleep(100);
+            Integer status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
+            if(status != null && status == 1){
+                return R.ok();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail("柜锁连接失败!");
+        }
+        return R.fail();
+    }
+
+    /**
+     * 柜锁关锁锁 V2
+     */
+    @PostMapping("/V2/closeLock")
+    public R cabinetV2CloseLock(@RequestBody CabinetV2Lock cabinetV2Lock){
+        String instruct = CRCCHECK.getCloseLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+        String relayCode = cabinetV2Lock.getRelayCode();
+        OutputStream ops = TCPServer.cacheMap.get(relayCode);
+
+        try {
+            ops.write(ReUtil.hexStringToByteArray(instruct));
+
+            Thread.sleep(300);
+
+            ops.write(ReUtil.hexStringToByteArray(CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()))));
+
+            Thread.sleep(100);
+            Integer status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
+            if(status != null && status == 0){
+                return R.ok();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail("柜锁连接失败!");
+        }
+        return R.fail();
+    }
+
+
 }

+ 6 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/config/MqttConfig.java

@@ -6,6 +6,7 @@ import com.zd.common.core.utils.SpringUtils;
 import com.zd.laboratory.event.LabMessageEvent;
 import com.zd.laboratory.event.SensorNewStatusEvent;
 import com.zd.laboratory.mqtt.constants.MqttConstants;
+import com.zd.laboratory.mqtt.entiy.MessageBody;
 import com.zd.laboratory.mqtt.service.TerminalRouter;
 import com.zd.laboratory.utils.HexUtils;
 import org.apache.commons.lang.StringUtils;
@@ -251,6 +252,11 @@ public class MqttConfig {
 
                     }
                 }
+
+                // TODO
+                MessageBody messageBody = JSONObject.parseObject(messageStr, MessageBody.class);
+
+//                mqttResHandler.deal(JSONUtil.toBean(msg,com.ffy.mqtt.model.Message.class));
                 List<LabMessageEvent> labMessageEvents = labMessMap.get(receivedTopic);
                 if(CollUtil.isEmpty(labMessageEvents)){
                     return ;

+ 19 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/entiy/MessageBody.java

@@ -20,6 +20,8 @@ public class MessageBody<T> {
 
     Integer type;
 
+    Long messageId;
+
     public MessageBody() {
         //获取当前时间
         LocalDateTime newTime = LocalDateTime.now();
@@ -42,6 +44,15 @@ public class MessageBody<T> {
         this.type = type;
     }
 
+    public MessageBody(String msg, Integer type, Long messageId) {
+        LocalDateTime newTime = LocalDateTime.now();
+        String format = formatter.format(newTime);
+        this.sendDate = format;
+        this.msg = msg;
+        this.type = type;
+        this.messageId = messageId;
+    }
+
     public Integer getType() {
         return type;
     }
@@ -73,4 +84,12 @@ public class MessageBody<T> {
     public void setMsg(String msg) {
         this.msg = msg;
     }
+
+    public Long getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(Long messageId) {
+        this.messageId = messageId;
+    }
 }

+ 5 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/constant/SocketTypes.java

@@ -15,4 +15,9 @@ public class SocketTypes {
      * 继电器数据
      */
     public static final String  RELAY_PREFIX = "fe dc";
+
+    /**
+     * 柜锁数据
+     */
+    public static final String LOCK_PREFIX = "28";
 }

+ 18 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java

@@ -6,15 +6,16 @@ import com.zd.laboratory.socket.constant.JXCTPacket;
 import com.zd.laboratory.socket.constant.SocketTypes;
 import com.zd.laboratory.socket.service.BaseRouter;
 import com.zd.laboratory.socket.service.SocketService;
+import com.zd.laboratory.utils.CRCCHECK;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.net.Socket;
 import java.net.SocketException;
-import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * @author dgs
@@ -96,10 +97,26 @@ public class TCPServer implements Runnable {
             socketService.setSensorData(data);
         }else if(data.startsWith(SocketTypes.RELAY_PREFIX)){
             analyticRelayData(data);
+        }else if(data.startsWith(SocketTypes.LOCK_PREFIX)){
+            // 柜锁第一次连接上报采集器编号绑定连接
+            cabinetLockData(data);
+        }else {
+            // 柜锁发送指令回调未携带采集器编号
+            socketService.setCabinetLockData(socket, data);
         }
 
     }
 
+    private void cabinetLockData(String data) {
+        try {
+            data = data.replace(" ", "").toUpperCase();
+            cacheMap.put(data, socket.getOutputStream());
+            log.warn("化学品智能柜锁连接,采集器编号:" + data);
+        }catch (Exception e){
+            log.error(e.toString());
+        }
+    }
+
     private void analyticRelayData(String data) {
         try {
             /*final byte b[] = new byte[512];

+ 32 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/service/SocketService.java

@@ -21,7 +21,9 @@ import com.zd.laboratory.mqtt.service.impl.SubMessageSendManager;
 import com.zd.laboratory.service.ISensorConfigService;
 import com.zd.laboratory.socket.command.Control;
 import com.zd.laboratory.socket.command.Symbol;
+import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.vo.TransmissionVo;
+import com.zd.laboratory.utils.CRCCHECK;
 import com.zd.laboratory.utils.FunctionMapperUtil;
 import com.zd.laboratory.utils.HexUtils;
 import org.apache.commons.collections4.CollectionUtils;
@@ -36,14 +38,17 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
 import javax.validation.constraints.NotNull;
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
+import java.net.Socket;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
 @Service(value = "socketService")
 @EnableAsync
@@ -437,4 +442,31 @@ public class SocketService {
             return null;
         }
     }
+
+    public void setCabinetLockData(Socket socket, String data) {
+
+        if(data.replace(" ", "").length() != 12){
+            log.info("柜锁回调指令非状态指令!");
+            return;
+        }
+
+        AtomicReference<String> relayCode = new AtomicReference<>("");
+        TCPServer.cacheMap.entrySet().forEach(a -> {
+            try {
+                if(a.getValue() == socket.getOutputStream()){
+                    relayCode.set(a.getKey());
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        });
+
+        // 柜锁bit 位
+        long bit = CRCCHECK.getBitByCommand(data);
+        // 1开锁状态 0关锁状态
+        int status = CRCCHECK.getLockStatus(data);
+
+        log.info("柜锁回调:" + relayCode.get() + ":" + bit + ",回调结果" + (status == 1 ? "开启": "关闭"));
+        redisService.setCacheObject(relayCode.get() + ":" + bit, status, 60L, TimeUnit.SECONDS);
+    }
 }

+ 1 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/CRCCHECK.java

@@ -103,7 +103,7 @@ public class CRCCHECK {
      * @param bit
      * @return
      */
-    private static String getCommand(Integer bit){
+    public static String getCommand(Integer bit){
         String cls=Integer.toHexString(bit).toUpperCase();
         String changeCls="";
         if(cls.length()>1){

+ 4 - 14
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/HexUtils.java

@@ -1,5 +1,7 @@
 package com.zd.laboratory.utils;
 
+import com.zd.common.core.utils.ReUtil;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -204,22 +206,10 @@ public class HexUtils {
         stb.append(hextoString(javaStr));
         System.out.println(stb.toString());
 
-        return hexStringToByteArray(stb.toString());
+        return ReUtil.hexStringToByteArray(stb.toString());
 //        return stb.toString().getBytes(StandardCharsets.UTF_8);
     }
 
-    public static byte[] hexStringToByteArray(String hexString) {
-        hexString = hexString.replaceAll(" ", "");
-        int len = hexString.length();
-        byte[] bytes = new byte[len / 2];
-        for (int i = 0; i < len; i += 2) {
-            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
-            bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
-                    .digit(hexString.charAt(i + 1), 16));
-        }
-        return bytes;
-    }
-
     /**
      *读当前位置指令
      * @param id
@@ -285,7 +275,7 @@ public class HexUtils {
         String javaStr=abc.substring(0,2);
         stb.append(hextoString(javaStr));
         System.out.println(stb.toString());
-        return hexStringToByteArray(stb.toString());
+        return ReUtil.hexStringToByteArray(stb.toString());
     }
 
 }

+ 7 - 0
zd-modules/zd-netty/src/main/java/com/zd/netty/handler/SocketHandler.java

@@ -12,6 +12,7 @@ import io.netty.util.concurrent.GlobalEventExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -24,6 +25,8 @@ public class SocketHandler extends ChannelInboundHandlerAdapter {
 
     private static final Logger log = LoggerFactory.getLogger(SocketHandler.class);
 
+    private static ConcurrentHashMap<String, ChannelHandlerContext> map = new ConcurrentHashMap<>();
+
     private static final String RFID_CODE="RFID:";
 
     /**
@@ -84,11 +87,15 @@ public class SocketHandler extends ChannelInboundHandlerAdapter {
         String s = channel.id().asShortText();
         log.info("新的客户端链接:{}" , s);
         clients.add(channel);
+        String uuid = ctx.channel().id().asLongText();
+        map.put(uuid, ctx);
     }
 
     @Override
     public void handlerRemoved(ChannelHandlerContext ctx) {
         clients.remove(ctx.channel());
+        String uuid = ctx.channel().id().asLongText();
+        map.remove(uuid);
     }
 
     @Override