Просмотр исходного кода

Merge remote-tracking branch 'origin/dev' into dev

donggaosheng лет назад: 2
Родитель
Сommit
20a91a1020
54 измененных файлов с 898 добавлено и 296 удалено
  1. 18 0
      release/sql/db_sql_v2.1-hotfix.sql
  2. 1 1
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java
  3. 1 1
      zd-api/zd-system-api/src/main/java/com/zd/system/api/entity/SysUserStudent.java
  4. 10 0
      zd-common/common-core/src/main/java/com/zd/common/core/utils/DESUtils.java
  5. 1 1
      zd-model/src/main/java/com/zd/model/entity/SysUser.java
  6. 10 10
      zd-model/src/main/resources/logback.xml
  7. 3 1
      zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/impl/AlarmRecordServiceImpl.java
  8. 4 10
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/FireImageService.java
  9. 0 3
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java
  10. 5 6
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/mqtt/MqttConfig.java
  11. 9 44
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/rfid/sdk/RfidClientImpl.java
  12. 12 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/rfid/service/impl/HardwareRfidServiceImpl.java
  13. 1 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/controller/SpeakerController.java
  14. 4 5
      zd-modules/zd-base/src/main/java/com/zd/base/files/bigupload/controller/UploadController.java
  15. 1 1
      zd-modules/zd-chemical/src/main/resources/mapper/chemical/HxpCabinetlockLogMapper.xml
  16. 4 0
      zd-modules/zd-modules-laboratory/pom.xml
  17. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java
  18. 12 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSparseHardwareController.java
  19. 118 21
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  20. 0 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/event/RedisExpiredAndAddListener.java
  21. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSparseHardwareMapper.java
  22. 0 57
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/TestController.java
  23. 33 10
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/config/MqttConfig.java
  24. 0 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/controller/MqttController.java
  25. 1 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/service/impl/SubMessageSendManager.java
  26. 0 36
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/test/MqttTest.java
  27. 31 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/ChannelMap.java
  28. 29 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/MessageCodec.java
  29. 48 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClient.java
  30. 76 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClientHandler.java
  31. 73 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServer.java
  32. 150 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java
  33. 18 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/PushMsgService.java
  34. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSparseHardwareService.java
  35. 14 5
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/HaiKangDoorService.java
  36. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitLineVertexServiceImpl.java
  37. 6 6
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabRiskPlanServiceImpl.java
  38. 5 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSparseHardwareServiceImpl.java
  39. 5 3
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectManagerService.java
  40. 3 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/SocketRunner.java
  41. 7 9
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java
  42. 4 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/service/SocketService.java
  43. 12 6
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorMapper.xml
  44. 1 2
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanAbnormalGroupMapper.xml
  45. 8 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSparseHardwareMapper.xml
  46. 27 4
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysStudentController.java
  47. 25 1
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysTeacherController.java
  48. 4 1
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysUserController.java
  49. 8 0
      zd-modules/zd-modules-system/src/main/java/com/zd/system/mapper/SysUserMapper.java
  50. 8 0
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/ISysTeacherService.java
  51. 2 3
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysStudentServiceImpl.java
  52. 52 2
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysTeacherServiceImpl.java
  53. 18 1
      zd-modules/zd-modules-system/src/main/resources/mapper/system/SysUserMapper.xml
  54. 0 38
      zd.iml

+ 18 - 0
release/sql/db_sql_v2.1-hotfix.sql

@@ -0,0 +1,18 @@
+
+/************************************************/
+/*     更新表: sys_user    ****/
+/*     字段: nick_name  ****/
+/*     添加人:cyl                    ****/
+/*     添加时间:2023-2-23                 ****/
+/************************************************/
+ALTER TABLE sys_user MODIFY COLUMN nick_name VARCHAR(100);
+
+
+
+/************************************************/
+/*     更新表: lab_check_record_details    ****/
+/*     字段: jcx_id  ****/
+/*     添加人:xxf                    ****/
+/*     添加时间:2023-2-28                 ****/
+/************************************************/
+alter table lab_check_record_details modify column jcx_id varchar(50) COMMENT '检查项id';

+ 1 - 1
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java

@@ -262,7 +262,7 @@ public interface RemoteLaboratoryService {
     public R saveData(Algorithm algorithm);
     public R saveData(Algorithm algorithm);
 
 
     @PostMapping("/algorithm/saveAlgorithm")
     @PostMapping("/algorithm/saveAlgorithm")
-    public R saveAlgorithmData(Algorithm algorithm);
+    public R saveAlgorithmData(@RequestBody Algorithm algorithm);
 
 
     /**
     /**
      * 小程序查询实验室列表(用户端,管理端)
      * 小程序查询实验室列表(用户端,管理端)

+ 1 - 1
zd-api/zd-system-api/src/main/java/com/zd/system/api/entity/SysUserStudent.java

@@ -176,7 +176,7 @@ public class SysUserStudent extends BaseEntity {
         this.deptId = deptId;
         this.deptId = deptId;
     }
     }
 
 
-    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+    @Size(min = 0, max = 50, message = "用户昵称长度不能超过50个字符")
     public String getNickName() {
     public String getNickName() {
         return nickName;
         return nickName;
     }
     }

+ 10 - 0
zd-common/common-core/src/main/java/com/zd/common/core/utils/DESUtils.java

@@ -181,6 +181,16 @@ public class DESUtils {
             }
             }
         }
         }
         long num = Long.parseLong(cardNum,16);
         long num = Long.parseLong(cardNum,16);
+
+        //部分卡16进制没有上报补0,所以这里先统一认为是10位卡处理
+        if((placeholder+num).length()<10){
+            String numstr = "";
+            for(long i=(placeholder+num).length();i<10;i++){
+                numstr += "0";
+            }
+            return numstr+num;
+        }
+
         return placeholder+num;
         return placeholder+num;
     }
     }
 
 

+ 1 - 1
zd-model/src/main/java/com/zd/model/entity/SysUser.java

@@ -375,7 +375,7 @@ public class SysUser extends BaseEntity implements Serializable {
         this.deptId = deptId;
         this.deptId = deptId;
     }
     }
 
 
-    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+    @Size(min = 0, max = 50, message = "用户昵称长度不能超过50个字符")
     public String getNickName() {
     public String getNickName() {
         return nickName;
         return nickName;
     }
     }

+ 10 - 10
zd-model/src/main/resources/logback.xml

@@ -57,30 +57,30 @@
         </filter>
         </filter>
     </appender>
     </appender>
 
 
-    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <!--<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${log.path}/${spring.application.name}-debug.log</file>
         <file>${log.path}/${spring.application.name}-debug.log</file>
-        <!-- 循环政策:基于时间创建日志文件 -->
+        &lt;!&ndash; 循环政策:基于时间创建日志文件 &ndash;&gt;
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志文件名格式 -->
+            &lt;!&ndash; 日志文件名格式 &ndash;&gt;
             <fileNamePattern>${log.path}/${spring.application.name}-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
             <fileNamePattern>${log.path}/${spring.application.name}-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
+            &lt;!&ndash; 日志最大的历史 60天 &ndash;&gt;
             <maxHistory>7</maxHistory>
             <maxHistory>7</maxHistory>
         </rollingPolicy>
         </rollingPolicy>
         <encoder>
         <encoder>
             <pattern>${log.pattern}</pattern>
             <pattern>${log.pattern}</pattern>
         </encoder>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!-- 过滤的级别 -->
+            &lt;!&ndash; 过滤的级别 &ndash;&gt;
             <level>debug</level>
             <level>debug</level>
-            <!-- 匹配时的操作:接收(记录) -->
+            &lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;
             <onMatch>ACCEPT</onMatch>
             <onMatch>ACCEPT</onMatch>
-            <!-- 不匹配时的操作:拒绝(不记录) -->
+            &lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;
             <onMismatch>DENY</onMismatch>
             <onMismatch>DENY</onMismatch>
         </filter>
         </filter>
-    </appender>
+    </appender>-->
 
 
     <!-- 系统模块日志级别控制  -->
     <!-- 系统模块日志级别控制  -->
-    <logger name="com.zd" level="debug"/>
+    <logger name="com.zd" level="info"/>
     <!-- Spring日志级别控制  -->
     <!-- Spring日志级别控制  -->
     <logger name="org.springframework" level="warn"/>
     <logger name="org.springframework" level="warn"/>
 
 
@@ -92,6 +92,6 @@
     <root level="info">
     <root level="info">
         <appender-ref ref="file_info"/>
         <appender-ref ref="file_info"/>
         <appender-ref ref="file_error"/>
         <appender-ref ref="file_error"/>
-        <appender-ref ref="file_debug"/>
+<!--        <appender-ref ref="file_debug"/>-->
     </root>
     </root>
 </configuration>
 </configuration>

+ 3 - 1
zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/impl/AlarmRecordServiceImpl.java

@@ -102,10 +102,12 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
         String electronicTag = alarmRecord.getElectronicTag();
         String electronicTag = alarmRecord.getElectronicTag();
         QpBottleStorageRVo storageRVo = storageService.getByElectronicTag(electronicTag);
         QpBottleStorageRVo storageRVo = storageService.getByElectronicTag(electronicTag);
         if (storageRVo != null) {
         if (storageRVo != null) {
-            if (hardwareRfidDto!=null){
+            if (hardwareRfidDto!=null && storageRVo.getStorageStatus() == 1){
                 //RFID设备报警
                 //RFID设备报警
                 R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
                 R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
                 log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
                 log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
+            }else {
+                return 0;
             }
             }
             Long id = storageRVo.getId();
             Long id = storageRVo.getId();
             String key = RFID_CODE + electronicTag + id;
             String key = RFID_CODE + electronicTag + id;

+ 4 - 10
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/FireImageService.java

@@ -63,23 +63,17 @@ public class FireImageService {
     public void camera(){
     public void camera(){
         try {
         try {
             String streamUrl = fireProperties.getStreamUrl();
             String streamUrl = fireProperties.getStreamUrl();
-            if (streamUrl == null) {
-                log.error("=========调用产生异常:未配置流媒体地址============");
-                return;
+            if (streamUrl != null && !"".equals(streamUrl)) {
+                catchImage(streamUrl);
             }
             }
-            catchImage();
+            //log.error("=========调用产生异常:未配置流媒体地址============");
         } catch (ServiceException | IOException e) {
         } catch (ServiceException | IOException e) {
             //异常回调,防止系统因异常问题被杀死
             //异常回调,防止系统因异常问题被杀死
             log.error("=========调用产生异常:{}============", e.getMessage());
             log.error("=========调用产生异常:{}============", e.getMessage());
         }
         }
     }
     }
 
 
-    public void catchImage() throws IOException {
-        String streamUrl = fireProperties.getStreamUrl();
-        if (streamUrl == null) {
-            throw new ServiceException("未配置流媒体地址");
-        }
-
+    public void catchImage(String streamUrl) throws IOException {
         try (FFmpegFrameGrabber grabber = VideoUtils.createGrabber(streamUrl)) {
         try (FFmpegFrameGrabber grabber = VideoUtils.createGrabber(streamUrl)) {
             grabber.start();
             grabber.start();
             String fileName = "test";
             String fileName = "test";

+ 0 - 3
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java

@@ -1,7 +1,6 @@
 package com.zd.alg.iot.vmp.gb28181.event.offline;
 package com.zd.alg.iot.vmp.gb28181.event.offline;
 
 
 import com.zd.alg.iot.vmp.gb28181.event.EventPublisher;
 import com.zd.alg.iot.vmp.gb28181.event.EventPublisher;
-import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +17,6 @@ import com.zd.alg.iot.vmp.common.VideoManagerConstants;
  * @date:   2020年5月6日 上午11:35:46
  * @date:   2020年5月6日 上午11:35:46
  */
  */
 @Component
 @Component
-@Slf4j
 public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
 public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
 
 
     private Logger logger = LoggerFactory.getLogger(KeepliveTimeoutListener.class);
     private Logger logger = LoggerFactory.getLogger(KeepliveTimeoutListener.class);
@@ -37,7 +35,6 @@ public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
      */
      */
     @Override
     @Override
     public void onMessage(Message message, byte[] pattern) {
     public void onMessage(Message message, byte[] pattern) {
-
         //  获取失效的key
         //  获取失效的key
         String expiredKey = message.toString();
         String expiredKey = message.toString();
         if(!expiredKey.startsWith(VideoManagerConstants.KEEPLIVEKEY_PREFIX)){
         if(!expiredKey.startsWith(VideoManagerConstants.KEEPLIVEKEY_PREFIX)){

+ 5 - 6
zd-modules/zd-algorithm/src/main/java/com/zd/alg/mqtt/MqttConfig.java

@@ -31,10 +31,7 @@ import org.springframework.messaging.MessageChannel;
 import org.springframework.messaging.MessageHandler;
 import org.springframework.messaging.MessageHandler;
 import org.springframework.messaging.MessagingException;
 import org.springframework.messaging.MessagingException;
 
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 
 /**
 /**
  * mqtt配置
  * mqtt配置
@@ -132,7 +129,8 @@ public class MqttConfig {
     @Bean
     @Bean
     @ServiceActivator(inputChannel = MQTT_OUTBOUND_CHANNEL)
     @ServiceActivator(inputChannel = MQTT_OUTBOUND_CHANNEL)
     public MessageHandler mqttOutbound() {
     public MessageHandler mqttOutbound() {
-        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(producerClientId, mqttClientFactory());
+        int num = new Random().nextInt(998)+1;
+        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(producerClientId+"_"+num, mqttClientFactory());
         messageHandler.setAsync(true);
         messageHandler.setAsync(true);
         messageHandler.setDefaultTopic(defaultTopic);
         messageHandler.setDefaultTopic(defaultTopic);
         return messageHandler;
         return messageHandler;
@@ -144,7 +142,8 @@ public class MqttConfig {
     @Bean
     @Bean
     public MessageProducer inbound() {
     public MessageProducer inbound() {
         // 可同时消费(订阅)多个Topic
         // 可同时消费(订阅)多个Topic
-        adapter = new MqttPahoMessageDrivenChannelAdapter(consumerClientId, mqttClientFactory(), StringUtils.split(defaultTopic, ","));
+        int num = new Random().nextInt(98)+1;
+        adapter = new MqttPahoMessageDrivenChannelAdapter(consumerClientId+num, mqttClientFactory(), StringUtils.split(defaultTopic, ","));
         adapter.setCompletionTimeout(5000);
         adapter.setCompletionTimeout(5000);
         adapter.setConverter(new DefaultPahoMessageConverter());
         adapter.setConverter(new DefaultPahoMessageConverter());
         adapter.setQos(2);
         adapter.setQos(2);

+ 9 - 44
zd-modules/zd-algorithm/src/main/java/com/zd/alg/rfid/sdk/RfidClientImpl.java

@@ -35,6 +35,8 @@ public class RfidClientImpl implements IService {
     private static final Map<String, GClient> clientMap = new ConcurrentHashMap<>();
     private static final Map<String, GClient> clientMap = new ConcurrentHashMap<>();
     private static final Map<String, GServer> serverMap = new ConcurrentHashMap<>();
     private static final Map<String, GServer> serverMap = new ConcurrentHashMap<>();
     private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
     private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
+    private static final Integer cacheTime  = 30;
+    private static final Integer alarmTime  = 30;
     @Resource
     @Resource
     private RedisTemplate<String, HardwareRfid> redisTemplate;
     private RedisTemplate<String, HardwareRfid> redisTemplate;
     @Autowired
     @Autowired
@@ -49,8 +51,11 @@ public class RfidClientImpl implements IService {
     @Override
     @Override
     public void start(HardwareRfid hardwareRfid) {
     public void start(HardwareRfid hardwareRfid) {
         GServer server = new GServer();
         GServer server = new GServer();
-        int port = getPort(hardwareRfid.getIpAddress());
-        if (server.open(port)) {
+        if (hardwareRfid.getPort() == null) {
+            log.info("【RFID门禁机】端口号为空!");
+            return;
+        }
+        if (server.open(hardwareRfid.getPort())) {
             log.info("【RFID门禁机】开始监听");
             log.info("【RFID门禁机】开始监听");
             subscribeServerHandler(hardwareRfid, server);
             subscribeServerHandler(hardwareRfid, server);
         } else {
         } else {
@@ -155,18 +160,14 @@ public class RfidClientImpl implements IService {
                     int antId = logBaseEpcInfo.getAntId();
                     int antId = logBaseEpcInfo.getAntId();
                     String epc = logBaseEpcInfo.getEpc();
                     String epc = logBaseEpcInfo.getEpc();
                     if (Boolean.FALSE.equals(redisTemplate.hasKey(logBaseEpcInfo.getEpc() + antId))) {
                     if (Boolean.FALSE.equals(redisTemplate.hasKey(logBaseEpcInfo.getEpc() + antId))) {
-                        log.info("打印进入日志!");
                         //不存在缓存,设置间隔30s调用
                         //不存在缓存,设置间隔30s调用
-                        redisTemplate.opsForValue().set(logBaseEpcInfo.getEpc() + antId, hardwareRfid, 30, TimeUnit.SECONDS);
-                        log.info("打印进入日志!1111111111111");
+                        redisTemplate.opsForValue().set(logBaseEpcInfo.getEpc() + antId, hardwareRfid, cacheTime, TimeUnit.SECONDS);
                         scheduledExecutorService.execute(() -> {
                         scheduledExecutorService.execute(() -> {
-                            log.info("打印日志发送前日志");
                             InventoryTag tag = new InventoryTag();
                             InventoryTag tag = new InventoryTag();
                             BeanUtils.copyProperties(logBaseEpcInfo, tag);
                             BeanUtils.copyProperties(logBaseEpcInfo, tag);
                             HardwareRfidDto hardwareRfidDto = new HardwareRfidDto();
                             HardwareRfidDto hardwareRfidDto = new HardwareRfidDto();
                             BeanUtils.copyProperties(hardwareRfid, hardwareRfidDto);
                             BeanUtils.copyProperties(hardwareRfid, hardwareRfidDto);
                             tag.setHardwareRfidDto(hardwareRfidDto);
                             tag.setHardwareRfidDto(hardwareRfidDto);
-                            log.info("调用发送方法!发送内容 tag = {}",tag.toString());
                             sendService.send(tag);
                             sendService.send(tag);
                         });
                         });
                     } else {
                     } else {
@@ -455,7 +456,7 @@ public class RfidClientImpl implements IService {
             GClient client = clientMap.get(hardwareNum);
             GClient client = clientMap.get(hardwareNum);
             synchronized (this) {
             synchronized (this) {
                 //设置开始报警、报警时长
                 //设置开始报警、报警时长
-                return changeGpo(client, 1, 30);
+                return changeGpo(client, 1, alarmTime);
             }
             }
         }
         }
         return false;
         return false;
@@ -473,40 +474,4 @@ public class RfidClientImpl implements IService {
             }
             }
         }, delayTime, TimeUnit.SECONDS);
         }, delayTime, TimeUnit.SECONDS);
     }
     }
-
-    /**
-     * 去掉端口号,只获取ip
-     */
-    private static String getIp(HardwareRfid hardwareRfid) {
-        String ipAddress;
-        if (Objects.isNull(hardwareRfid) || StringUtils.isBlank(hardwareRfid.getIpAddress())) {
-            log.error("RFID配置ip为空!");
-        }
-        String[] ipPort = hardwareRfid.getIpAddress().split(":");
-        if (ipPort.length > 1) {
-            ipAddress = ipPort[0];
-        } else {
-            ipAddress = hardwareRfid.getIpAddress();
-        }
-        return ipAddress;
-    }
-
-    /**
-     * 获取端口号 未配置端口号默认给到8160
-     *
-     * @Param [ipPort]
-     * @Return int
-     **/
-    private static int getPort(String ipPort) {
-        //默认给到8160
-        int port = 8160;
-        if (null == ipPort || "".equals(ipPort)) {
-            return port;
-        }
-        String[] split = ipPort.split(":");
-        if (split.length > 1) {
-            port = Integer.valueOf(split[1]);
-        }
-        return port;
-    }
 }
 }

+ 12 - 0
zd-modules/zd-algorithm/src/main/java/com/zd/alg/rfid/service/impl/HardwareRfidServiceImpl.java

@@ -49,9 +49,15 @@ public class HardwareRfidServiceImpl extends ServiceImpl<HardwareRfidMapper, Har
 
 
     @Override
     @Override
     public ResultData saveHardwareRfid(HardwareRfid hardwareRfid) {
     public ResultData saveHardwareRfid(HardwareRfid hardwareRfid) {
+        if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getDeviceName, hardwareRfid.getDeviceName())) > 0) {
+            return ResultData.fail("设备名称已存在!");
+        }
         if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getHardwareNum, hardwareRfid.getHardwareNum())) > 0) {
         if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getHardwareNum, hardwareRfid.getHardwareNum())) > 0) {
             return ResultData.fail("设备编码已存在!");
             return ResultData.fail("设备编码已存在!");
         }
         }
+        if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getPort, hardwareRfid.getPort())) > 0) {
+            return ResultData.fail("端口号已存在!");
+        }
         tokenService.getLoginUser().getSysUser();
         tokenService.getLoginUser().getSysUser();
         hardwareRfid.setCreateBy(SecurityUtils.getUsername());
         hardwareRfid.setCreateBy(SecurityUtils.getUsername());
         hardwareRfid.setUserId(SecurityUtils.getUserId());
         hardwareRfid.setUserId(SecurityUtils.getUserId());
@@ -63,9 +69,15 @@ public class HardwareRfidServiceImpl extends ServiceImpl<HardwareRfidMapper, Har
         if (hardwareRfid.getId() == null) {
         if (hardwareRfid.getId() == null) {
             return ResultData.fail("设备id不存在!");
             return ResultData.fail("设备id不存在!");
         }
         }
+        if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getDeviceName, hardwareRfid.getDeviceName()).ne(HardwareRfid::getId, hardwareRfid.getId())) > 0) {
+            return ResultData.fail("设备名称已存在!");
+        }
         if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getHardwareNum, hardwareRfid.getHardwareNum()).ne(HardwareRfid::getId, hardwareRfid.getId())) > 0) {
         if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getHardwareNum, hardwareRfid.getHardwareNum()).ne(HardwareRfid::getId, hardwareRfid.getId())) > 0) {
             return ResultData.fail("设备编码已存在!");
             return ResultData.fail("设备编码已存在!");
         }
         }
+        if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getPort, hardwareRfid.getPort()).ne(HardwareRfid::getId, hardwareRfid.getId())) > 0) {
+            return ResultData.fail("端口号已存在!");
+        }
         hardwareRfid.setUpdateBy(SecurityUtils.getUsername());
         hardwareRfid.setUpdateBy(SecurityUtils.getUsername());
         return ResultData.result(baseMapper.updateById(hardwareRfid));
         return ResultData.result(baseMapper.updateById(hardwareRfid));
     }
     }

+ 1 - 0
zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/controller/SpeakerController.java

@@ -256,6 +256,7 @@ public class SpeakerController {
     @GetMapping("/stopPlayMusic")
     @GetMapping("/stopPlayMusic")
     @ApiOperation(value = "文字转语音小程序播放地址", notes = "文字转语音小程序播放地址")
     @ApiOperation(value = "文字转语音小程序播放地址", notes = "文字转语音小程序播放地址")
     public AjaxResult stopPlayMusic(@RequestParam(required = true) String sn,@RequestParam(required = true) String ip) {
     public AjaxResult stopPlayMusic(@RequestParam(required = true) String sn,@RequestParam(required = true) String ip) {
+        logger.info("关闭喇叭打印,sn={},ip={}",sn,ip);
         boolean isTrue=iSpeakerService.stopPlayMusic(sn,ip);
         boolean isTrue=iSpeakerService.stopPlayMusic(sn,ip);
         return AjaxResult.success(isTrue);
         return AjaxResult.success(isTrue);
     }
     }

+ 4 - 5
zd-modules/zd-base/src/main/java/com/zd/base/files/bigupload/controller/UploadController.java

@@ -23,7 +23,7 @@ public class UploadController {
     private IUploadService uploadService;
     private IUploadService uploadService;
 
 
     /**
     /**
-     * 检查分片是否存��
+     * 检查分片是否存
      *
      *
      * @return
      * @return
      */
      */
@@ -39,9 +39,9 @@ public class UploadController {
     }
     }
 
 
     /**
     /**
-     * 检查分片是否存��
+     * 检查分片是否存
      * @param identifier  文件秘钥
      * @param identifier  文件秘钥
-     * @param filename 文件��
+     * @param filename 文件
      * @param totalChunks 分片总数
      * @param totalChunks 分片总数
      * @return
      * @return
      */
      */
@@ -51,7 +51,7 @@ public class UploadController {
                                               @RequestParam("totalChunks") Integer totalChunks) {
                                               @RequestParam("totalChunks") Integer totalChunks) {
         FileChunkResultDTO fileChunkCheckDTO;
         FileChunkResultDTO fileChunkCheckDTO;
         try {
         try {
-            log.info("apk文件上传入参 identifier {}��filename {}, totalChunks {}", identifier, filename, totalChunks);
+            log.info("apk文件上传入参 identifier {}, filename {}, totalChunks {}", identifier, filename, totalChunks);
             FileChunkDTO chunkDTO = new FileChunkDTO();
             FileChunkDTO chunkDTO = new FileChunkDTO();
             chunkDTO.setIdentifier(identifier);
             chunkDTO.setIdentifier(identifier);
             chunkDTO.setFilename(filename);
             chunkDTO.setFilename(filename);
@@ -63,7 +63,6 @@ public class UploadController {
         }
         }
     }
     }
 
 
-
     /**
     /**
      * 上传文件分片
      * 上传文件分片
      *
      *

+ 1 - 1
zd-modules/zd-chemical/src/main/resources/mapper/chemical/HxpCabinetlockLogMapper.xml

@@ -147,7 +147,7 @@
             <if test="operationType != null">#{operationType},</if>
             <if test="operationType != null">#{operationType},</if>
             <if test="unLockVideo != null">#{unLockVideo},</if>
             <if test="unLockVideo != null">#{unLockVideo},</if>
             <if test="closeLockVideo != null">#{closeLockVideo},</if>
             <if test="closeLockVideo != null">#{closeLockVideo},</if>
-            <if test="userIds != null">#{user_ids},</if>
+            <if test="userIds != null">#{userIds},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="stockId != null">#{stockId},</if>
             <if test="stockId != null">#{stockId},</if>

+ 4 - 0
zd-modules/zd-modules-laboratory/pom.xml

@@ -111,6 +111,10 @@
             <artifactId>thumbnailator</artifactId>
             <artifactId>thumbnailator</artifactId>
             <version>0.4.8</version>
             <version>0.4.8</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 1 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java

@@ -51,7 +51,7 @@ public class AlgorithmController extends BaseController {
     }
     }
 
 
     @PostMapping("/saveAlgorithm")
     @PostMapping("/saveAlgorithm")
-    public ResultData saveAlgorithmData(Algorithm algorithm) {
+    public ResultData saveAlgorithmData(@RequestBody Algorithm algorithm) {
         logger.info("===================记录添加========================");
         logger.info("===================记录添加========================");
         return  ResultData.success(algorithmService.saveData(algorithm));
         return  ResultData.success(algorithmService.saveData(algorithm));
     }
     }

+ 12 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSparseHardwareController.java

@@ -95,10 +95,21 @@ public class LabSparseHardwareController extends BaseController {
     @RequestMapping(value = "/getSpeaker/{floorId}/{subId}")
     @RequestMapping(value = "/getSpeaker/{floorId}/{subId}")
     public ResultData<List<Map<String,Object>>> getSpeakerBySub(
     public ResultData<List<Map<String,Object>>> getSpeakerBySub(
             @PathVariable("floorId") Long floorId, @PathVariable("subId") Long subId) {
             @PathVariable("floorId") Long floorId, @PathVariable("subId") Long subId) {
-
+        if (floorId == -99L && subId != null) {
+            return ResultData.success(labSparseHardwareService.selectSpeakerBySubId(subId));
+        }
         return ResultData.success(labSparseHardwareService.selectSpeakerByFloorId(floorId, subId));
         return ResultData.success(labSparseHardwareService.selectSpeakerByFloorId(floorId, subId));
     }
     }
 
 
+    /**
+     * 根据实验室id获取喇叭列表
+     */
+    @ApiOperation(value = "根据实验室id获取喇叭列表")
+    @RequestMapping(value = "/getSpeakerBySubId/{subId}")
+    public ResultData<List<Map<String,Object>>> getSpeakerBySubId(@PathVariable("subId") Long subId) {
+        return ResultData.success(labSparseHardwareService.selectSpeakerBySubId(subId));
+    }
+
 
 
     /**
     /**
      * 新增疏散硬件
      * 新增疏散硬件

+ 118 - 21
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java

@@ -4,6 +4,8 @@ import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.ReUtil;
 import com.zd.common.core.utils.ReUtil;
 import com.zd.laboratory.api.entity.CabinetLock;
 import com.zd.laboratory.api.entity.CabinetLock;
 import com.zd.laboratory.api.entity.CabinetV2Lock;
 import com.zd.laboratory.api.entity.CabinetV2Lock;
+import com.zd.laboratory.mqtt.service.impl.CommonSend;
+import com.zd.laboratory.netty.PushMsgService;
 import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.utils.CRCCHECK;
 import com.zd.laboratory.utils.CRCCHECK;
@@ -32,6 +34,10 @@ public class DeviceRemoteController {
     private SocketService socketService;
     private SocketService socketService;
     @Autowired
     @Autowired
     private RedisService redisService;
     private RedisService redisService;
+    @Autowired
+    private CommonSend commonSend;
+    @Autowired
+    private PushMsgService pushMsgService;
 
 
     @Value("${sys.lockTimer:30}")
     @Value("${sys.lockTimer:30}")
     private Integer lockTimer;
     private Integer lockTimer;
@@ -49,39 +55,93 @@ public class DeviceRemoteController {
 
 
     @PostMapping("/V2/openLock")
     @PostMapping("/V2/openLock")
     public ResultData cabinetV2OpenLock(@RequestBody CabinetV2Lock cabinetV2Lock){
     public ResultData cabinetV2OpenLock(@RequestBody CabinetV2Lock cabinetV2Lock){
+
+        /*try {
+            Thread.sleep(lockTimer * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return ResultData.success("开锁成功");*/
+
+        // socket 方式发送
         String instruct = CRCCHECK.getOpenLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
         String instruct = CRCCHECK.getOpenLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
         String relayCode = cabinetV2Lock.getRelayCode();
         String relayCode = cabinetV2Lock.getRelayCode();
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
 
 
         try {
         try {
-            ops.write(ReUtil.hexStringToByteArray(instruct));
-            ops.flush();
+//            ops.write(ReUtil.hexStringToByteArray(instruct));
+//            ops.flush();
+            pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
             logger.info("柜锁开锁指令:" + instruct);
             logger.info("柜锁开锁指令:" + instruct);
 
 
-            instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
-            Thread.sleep(500);
+            Thread.sleep(2000);
+//            ops.write(ReUtil.hexStringToByteArray(instruct));
+//            ops.flush();
+//
+//            Thread.sleep(1500);
+//            ops.write(ReUtil.hexStringToByteArray(instruct));
+//            ops.flush();
 
 
+            instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
             int timer = lockTimer;
             int timer = lockTimer;
             Integer status;
             Integer status;
             while (timer > 1){
             while (timer > 1){
 
 
-                ops.write(ReUtil.hexStringToByteArray(instruct));
-                ops.flush();
-                timer--;
+//                ops.write(ReUtil.hexStringToByteArray(instruct));
+//                ops.flush();
+                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
+                timer-=2;
 
 
-                Thread.sleep(900);
+                Thread.sleep(1900);
                 status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
                 status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
                 logger.info("柜锁开锁锁状态查询:" + instruct + ",开锁结果:" + status);
                 logger.info("柜锁开锁锁状态查询:" + instruct + ",开锁结果:" + status);
                 if(status != null && status == 1){
                 if(status != null && status == 1){
                     return ResultData.success("开锁成功");
                     return ResultData.success("开锁成功");
                 }
                 }
             }
             }
+
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
             logger.error("柜锁连接失败:" + e.getMessage());
             logger.error("柜锁连接失败:" + e.getMessage());
             return ResultData.fail("柜锁连接失败!");
             return ResultData.fail("柜锁连接失败!");
         }
         }
         return ResultData.fail("开锁失败");
         return ResultData.fail("开锁失败");
+
+        //  mqtt 方式
+        /*String instruct = CRCCHECK.getOpenLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+        logger.info("柜锁MQTT开锁发送:" + instruct);
+        commonSend.send(socketService.getSteerSubscriptPrefix() + "/" + cabinetV2Lock.getRelayCode(),
+                ReUtil.hexStringToByteArray(instruct));
+
+        instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+        int timer = lockTimer;
+        Integer status;
+        byte[] bytes = ReUtil.hexStringToByteArray(instruct);
+
+        try {
+            Thread.sleep(3000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        while (timer > 1){
+
+            commonSend.send(socketService.getSteerSubscriptPrefix() + "/" + cabinetV2Lock.getRelayCode(),
+                    bytes);
+            timer-=2;
+
+            try {
+                Thread.sleep(1900);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            status = redisService.getCacheObject(cabinetV2Lock.getRelayCode() + ":" + cabinetV2Lock.getLockId());
+            logger.info("柜锁MQTT开锁状态查询:" + instruct + ",开锁结果:" + status);
+            if(status != null && status == 1){
+                return ResultData.success("开锁成功");
+            }
+        }
+        return ResultData.fail("开锁失败");*/
     }
     }
 
 
     /**
     /**
@@ -89,7 +149,15 @@ public class DeviceRemoteController {
      */
      */
     @PostMapping("/V2/closeLock")
     @PostMapping("/V2/closeLock")
     public ResultData cabinetV2CloseLock(@RequestBody CabinetV2Lock cabinetV2Lock){
     public ResultData cabinetV2CloseLock(@RequestBody CabinetV2Lock cabinetV2Lock){
-        String instruct = CRCCHECK.getCloseLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+        /*try {
+            Thread.sleep(5 * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return ResultData.success("关锁成功");*/
+
+        // socket 方式发送
+//        String instruct = CRCCHECK.getCloseLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
         String relayCode = cabinetV2Lock.getRelayCode();
         String relayCode = cabinetV2Lock.getRelayCode();
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
 
 
@@ -99,20 +167,24 @@ public class DeviceRemoteController {
             logger.info("柜锁关锁指令:" + instruct);
             logger.info("柜锁关锁指令:" + instruct);
             Thread.sleep(1000);*/
             Thread.sleep(1000);*/
 
 
-            instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
-            ops.write(ReUtil.hexStringToByteArray(instruct));
-            ops.flush();
+            String instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+            int timer = lockTimer;
+            Integer status;
+//            while (timer > 1){
 
 
-            /*Thread.sleep(600);
-            ops.write(ReUtil.hexStringToByteArray(instruct));
-            ops.flush();*/
+//                ops.write(ReUtil.hexStringToByteArray(instruct));
+//                ops.flush();
+                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
+                timer-=2;
+
+                Thread.sleep(1900);
+                status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
+                logger.info("柜锁关锁状态查询:" + instruct + ",关锁结果" + status);
+                if(status != null && status == 0){
+                    return ResultData.success("关锁成功");
+                }
+//            }
 
 
-            Thread.sleep(1600);
-            Integer status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
-            logger.info("柜锁关锁状态查询:" + instruct + ",关锁结果" + status);
-            if(status != null && status == 0){
-                return ResultData.success("关锁成功");
-            }
 //            return ResultData.success("关锁成功");
 //            return ResultData.success("关锁成功");
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
@@ -120,5 +192,30 @@ public class DeviceRemoteController {
             return ResultData.fail("柜锁连接失败!");
             return ResultData.fail("柜锁连接失败!");
         }
         }
         return ResultData.fail("关锁失败:请手动按压柜锁,确认已关闭!");
         return ResultData.fail("关锁失败:请手动按压柜锁,确认已关闭!");
+
+        // mqtt 方式
+        /*String instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
+        int timer = lockTimer;
+        Integer status;
+        byte[] bytes = ReUtil.hexStringToByteArray(instruct);
+        while (timer > 1){
+
+            commonSend.send(socketService.getSteerSubscriptPrefix() + "/" + cabinetV2Lock.getRelayCode(),
+                    bytes);
+            timer--;
+
+            try {
+                Thread.sleep(900);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            status = redisService.getCacheObject(cabinetV2Lock.getRelayCode() + ":" + cabinetV2Lock.getLockId());
+            logger.info("柜锁MQTT关锁状态查询:" + instruct + ",开锁结果:" + status);
+            if(status != null && status == 1){
+                return ResultData.success("关锁成功");
+            }
+        }
+
+        return ResultData.fail("关锁失败");*/
     }
     }
 }
 }

+ 0 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/event/RedisExpiredAndAddListener.java

@@ -32,7 +32,6 @@ import java.util.stream.Collectors;
  * @Description:
  * @Description:
  */
  */
 @Component
 @Component
-@Slf4j
 public class RedisExpiredAndAddListener extends KeyExpirationEventMessageListener {
 public class RedisExpiredAndAddListener extends KeyExpirationEventMessageListener {
 
 
     //监听的主题  现在只监听0号数据库
     //监听的主题  现在只监听0号数据库

+ 7 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSparseHardwareMapper.java

@@ -83,6 +83,13 @@ public interface LabSparseHardwareMapper
     List<Map<String,Object>> selectListByFloorId(@Param("floorId") Long floorId, @Param("subId") Long subId, @Param("type") int type);
     List<Map<String,Object>> selectListByFloorId(@Param("floorId") Long floorId, @Param("subId") Long subId, @Param("type") int type);
 
 
     /**
     /**
+     * 根据实验室id查询喇叭列表
+     * @param subId
+     * @return
+     */
+    List<Map<String,Object>> selectListBySubId(@Param("subId") Long subId);
+
+    /**
      * 根据楼层查询设备列表
      * 根据楼层查询设备列表
      * @param floorId
      * @param floorId
      * @return
      * @return

+ 0 - 57
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/TestController.java

@@ -1,57 +0,0 @@
-package com.zd.laboratory.mqtt;
-
-import com.zd.laboratory.mqtt.enums.BigViewDataType;
-import com.zd.laboratory.mqtt.service.impl.SubMessageSendManager;
-import io.swagger.annotations.Api;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author zpp
- * @date 2019/8/26 18:19
- */
-@RestController
-@ResponseBody
-@Api(tags = "mqtt测试")
-@RequestMapping("/mqtt")
-public class TestController {
-
-    @Autowired
-    private SubMessageSendManager messageSendService;
-
-    @GetMapping("/send")
-    public String send(){
-        messageSendService.SendBigViewUpdate(BigViewDataType.SUB_ONLINE);
-        return "success";
-    }
-
-//    @GetMapping("/sendry/{msg}")
-//    public String sends(@PathVariable String msg){
-//        String topic="reming/heartssss";
-//        JSONObject jsonObject=new JSONObject();
-//        jsonObject.put("name","张三");
-//        jsonObject.put("sex","男");
-//        jsonObject.put("phone","13324654152");
-//        mqttProducer.send(topic,0,jsonObject.toJSONString());
-//        return "success";
-//    }
-
-
-
-    //Integer trackX,Integer trackY,String macNo
-
-//    @GetMapping("/pay")
-//    public String pay(@RequestParam (value = "orderNo") String orderNo,
-//                      @RequestParam (value = "trackX") Integer trackX,
-//                      @RequestParam (value = "trackY") Integer trackY,
-//                      @RequestParam (value = "macNo") String macNo,
-//                      @RequestParam (value = "type") Integer type,
-//                       @RequestParam (value = "number") Integer number
-//    ){
-//        messageSendService.SendPaySuccess(orderNo,trackX,trackY,macNo,type,number);
-//        return "success";
-//    }
-}

+ 33 - 10
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/config/MqttConfig.java

@@ -11,8 +11,8 @@ import com.zd.laboratory.event.LabMessageEvent;
 import com.zd.laboratory.event.SensorNewStatusEvent;
 import com.zd.laboratory.event.SensorNewStatusEvent;
 import com.zd.laboratory.mqtt.service.TerminalRouter;
 import com.zd.laboratory.mqtt.service.TerminalRouter;
 import com.zd.laboratory.mqtt.service.impl.CommonSend;
 import com.zd.laboratory.mqtt.service.impl.CommonSend;
+import com.zd.laboratory.utils.CRCCHECK;
 import com.zd.laboratory.utils.FireLaborUtil;
 import com.zd.laboratory.utils.FireLaborUtil;
-import com.zd.laboratory.utils.HexUtils;
 import com.zd.model.constant.CacheConstants;
 import com.zd.model.constant.CacheConstants;
 import com.zd.model.constant.MqttConstants;
 import com.zd.model.constant.MqttConstants;
 import com.zd.model.domain.R;
 import com.zd.model.domain.R;
@@ -35,7 +35,8 @@ import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.*;
 import org.springframework.messaging.*;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
-import java.nio.charset.StandardCharsets;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -202,8 +203,9 @@ public class MqttConfig {
     @Bean
     @Bean
     @ServiceActivator(inputChannel = MQTT_OUTBOUND_CHANNEL)
     @ServiceActivator(inputChannel = MQTT_OUTBOUND_CHANNEL)
     public MessageHandler mqttOutbound() {
     public MessageHandler mqttOutbound() {
+        int num = new Random().nextInt(998)+1;
         MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
         MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
-                producerClientId,
+                producerClientId +"_"+ num,
                 mqttClientFactory());
                 mqttClientFactory());
         messageHandler.setAsync(true);
         messageHandler.setAsync(true);
         messageHandler.setDefaultTopic(defaultTopic);
         messageHandler.setDefaultTopic(defaultTopic);
@@ -217,8 +219,9 @@ public class MqttConfig {
      */
      */
     @Bean
     @Bean
     public MessageProducer inbound() {
     public MessageProducer inbound() {
+        int num = new Random().nextInt(98)+1;
         // 可同时消费(订阅)多个Topic
         // 可同时消费(订阅)多个Topic
-        adapter = new MqttPahoMessageDrivenChannelAdapter(consumerClientId, mqttClientFactory(), StringUtils.split(defaultTopic, ","));
+        adapter = new MqttPahoMessageDrivenChannelAdapter(consumerClientId+num, mqttClientFactory(), StringUtils.split(defaultTopic, ","));
         adapter.setCompletionTimeout(5000);
         adapter.setCompletionTimeout(5000);
         adapter.setConverter(new DefaultPahoMessageConverter());
         adapter.setConverter(new DefaultPahoMessageConverter());
         adapter.setQos(2);
         adapter.setQos(2);
@@ -279,13 +282,25 @@ public class MqttConfig {
             public void handleMessage(Message<?> message) throws MessagingException {
             public void handleMessage(Message<?> message) throws MessagingException {
                 MessageHeaders messageHeaders = message.getHeaders();
                 MessageHeaders messageHeaders = message.getHeaders();
                 String receivedTopic = (String) messageHeaders.get(MqttHeaders.RECEIVED_TOPIC);
                 String receivedTopic = (String) messageHeaders.get(MqttHeaders.RECEIVED_TOPIC);
-                //logger.info("[通道] - [{}]", receivedTopic);
-                //logger.info("[消息] - [{}]", message.getPayload());
+//                logger.info("[通道] - [{}],[{}]", receivedTopic,message.getPayload());
                 String messageStr = message.getPayload().toString();
                 String messageStr = message.getPayload().toString();
                 if (receivedTopic.startsWith(devicePrefix)) {
                 if (receivedTopic.startsWith(devicePrefix)) {
                     if (receivedTopic.contains("788D4C6C6187ABC")) {
                     if (receivedTopic.contains("788D4C6C6187ABC")) {
                         logger.info("[原始消息] - [{}]", message.getPayload());
                         logger.info("[原始消息] - [{}]", message.getPayload());
                     }
                     }
+                    if ((message.getPayload() instanceof byte[])) {
+                        messageStr = "";
+                        try {
+                            ByteArrayInputStream bis  = new ByteArrayInputStream((byte[]) message.getPayload());
+                            byte[] buffer = new byte[1024];
+                            int len = -1;
+                            while((len = bis.read(buffer)) != -1){
+                                messageStr+= new String(buffer);
+                            }
+                        } catch (IOException e) {
+                           logger.error("传感器数据转换异常!");
+                        }
+                    }
                     String topicEnd = receivedTopic.substring(receivedTopic.lastIndexOf("/") + 1);
                     String topicEnd = receivedTopic.substring(receivedTopic.lastIndexOf("/") + 1);
                     JSONObject jsonObject = JSONObject.parseObject(messageStr);
                     JSONObject jsonObject = JSONObject.parseObject(messageStr);
                     jsonObject.put("deviceNo", topicEnd);
                     jsonObject.put("deviceNo", topicEnd);
@@ -303,10 +318,18 @@ public class MqttConfig {
                     TerminalRouter.routerMap.get("HxpTerminalService").offLine(codeNum);
                     TerminalRouter.routerMap.get("HxpTerminalService").offLine(codeNum);
                 } else if (receivedTopic.startsWith(steerPublishPrefix)) {
                 } else if (receivedTopic.startsWith(steerPublishPrefix)) {
 //                    messageStr = byte2Hex(message.getPayload().toString().getBytes(StandardCharsets.UTF_8));
 //                    messageStr = byte2Hex(message.getPayload().toString().getBytes(StandardCharsets.UTF_8));
-                    char[] str = message.getPayload().toString().toCharArray();
-                    logger.info("柜锁mqtt消费:" + messageStr);
-                    String replaceMess = messageStr.replace(" ", "");
+//                    char[] str = message.getPayload().toString().toCharArray();
+
+
+                    // 柜锁bit 位
+                    long bit = CRCCHECK.getBitByCommand(messageStr);
+                    // 1开锁状态 0关锁状态
+                    int status = CRCCHECK.getLockStatus(messageStr);
+                    logger.info("柜锁MQTT状态回调:" + receivedTopic.replaceAll(steerPublishPrefix +"/", "") + ":" + bit + ",回调结果" + (status == 1 ? "开启": "关闭") + ",指令:" + messageStr);
+                    redisService.setCacheObject(receivedTopic.replaceAll(steerPublishPrefix +"/", "") + ":" + bit, status, 3 * 60L, TimeUnit.SECONDS);
+
                     //坨机写指令返回数据
                     //坨机写指令返回数据
+                    /*String replaceMess = messageStr.replace(" ", "");
                     if (replaceMess.length() == 12) {
                     if (replaceMess.length() == 12) {
                         String command = replaceMess.substring(8, 10);
                         String command = replaceMess.substring(8, 10);
                         //表示坨机成功
                         //表示坨机成功
@@ -331,7 +354,7 @@ public class MqttConfig {
                             String relayCode = prefix[prefix.length - 1];
                             String relayCode = prefix[prefix.length - 1];
                             TerminalRouter.routerMap.get("HxpLockService").offLine(relayCode);
                             TerminalRouter.routerMap.get("HxpLockService").offLine(relayCode);
                         }
                         }
-                    }
+                    }*/
                 } else if (receivedTopic.startsWith(MqttConstants.TOPIC_FIRE_DEVICE_RECEIVE)) {
                 } else if (receivedTopic.startsWith(MqttConstants.TOPIC_FIRE_DEVICE_RECEIVE)) {
                     logger.info("消息处理器1开始处理=====");
                     logger.info("消息处理器1开始处理=====");
                     logger.info("topic:" + receivedTopic);
                     logger.info("topic:" + receivedTopic);

+ 0 - 4
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/controller/MqttController.java

@@ -1,16 +1,12 @@
 package com.zd.laboratory.mqtt.controller;
 package com.zd.laboratory.mqtt.controller;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.zd.model.enums.HardwareOperate;
 import com.zd.model.enums.HardwareOperate;
 import com.zd.common.core.utils.SpringUtils;
 import com.zd.common.core.utils.SpringUtils;
 import com.zd.model.domain.ResultData;
 import com.zd.model.domain.ResultData;
-import com.zd.laboratory.domain.LabHardware;
-import com.zd.laboratory.event.RelayHardwareStatusEvent;
 import com.zd.laboratory.event.VideoHardwareStatusEvent;
 import com.zd.laboratory.event.VideoHardwareStatusEvent;
 import com.zd.laboratory.mapper.LabHardwareMapper;
 import com.zd.laboratory.mapper.LabHardwareMapper;
 import com.zd.laboratory.mqtt.MqttProducer;
 import com.zd.laboratory.mqtt.MqttProducer;
 import com.zd.laboratory.mqtt.entiy.EquipmentStatus;
 import com.zd.laboratory.mqtt.entiy.EquipmentStatus;
-import com.zd.laboratory.service.ILabHardwareService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 

+ 1 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/service/impl/SubMessageSendManager.java

@@ -208,6 +208,7 @@ public class SubMessageSendManager {
 //        subFunction.setFunctionStatuses(newFunctionStatuses);
 //        subFunction.setFunctionStatuses(newFunctionStatuses);
         //todo 到这里结束
         //todo 到这里结束
         //发送事件
         //发送事件
+        logger.info("采集器数据接收={}",JSON.toJSONString(subFunction));
         //本来使用mqtt接收,因为mqtt 每个客户端接受到都会处理,
         //本来使用mqtt接收,因为mqtt 每个客户端接受到都会处理,
         List<LabMessageEvent> labMessageEvents = mqttConfig.getLabMessMap().get(MqttConstants.TOPIC_LAB_FUNCTION_DATA);
         List<LabMessageEvent> labMessageEvents = mqttConfig.getLabMessMap().get(MqttConstants.TOPIC_LAB_FUNCTION_DATA);
         if (CollUtil.isNotEmpty(labMessageEvents)) {
         if (CollUtil.isNotEmpty(labMessageEvents)) {

+ 0 - 36
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/test/MqttTest.java

@@ -1,36 +0,0 @@
-package com.zd.laboratory.mqtt.test;
-
-import com.zd.laboratory.config.HardwareFunctionStatusConfig;
-import com.zd.laboratory.mqtt.service.impl.SubMessageSendManager;
-import org.springframework.boot.context.event.ApplicationStartedEvent;
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.annotation.Profile;
-import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
-import org.springframework.stereotype.Component;
-
-/**
- * @Author: zhoupan
- * @Date: 2021/10/08/13:09
- * @Description:
- */
-
-@Profile("dev")
-@Component
-public class MqttTest implements ApplicationListener<ApplicationStartedEvent> {
-
-
-
-    @Override
-    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
-//        MqttPahoMessageDrivenChannelAdapter messageProducer = (MqttPahoMessageDrivenChannelAdapter)applicationStartedEvent.getApplicationContext().getBeanFactory().getBean("inbound");
-//        //添加主题
-//        messageProducer.addTopic(MqttConstants.LAB_FUNCTION_DATA+-1L);
-//
-//        SubMessageSendManager bean = applicationStartedEvent.getApplicationContext().getBeanFactory().getBean(SubMessageSendManager.class);
-//        HardwareFunctionStatusConfig function = applicationStartedEvent.getApplicationContext().getBeanFactory().getBean(HardwareFunctionStatusConfig.class);
-//        //发送一个测试测点数据
-//        bean.sendFunctionUpdate(-1L,function.getSensorFunctionStatuses());
-
-
-    }
-}

+ 31 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/ChannelMap.java

@@ -0,0 +1,31 @@
+package com.zd.laboratory.netty;
+
+import io.netty.channel.ChannelHandlerContext;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ChannelMap {
+
+    /**
+     * 存放客户端标识ID(消息ID)与channel的对应关系
+     */
+    private static volatile ConcurrentHashMap<String, ChannelHandlerContext> channelMap = null;
+
+    private ChannelMap() {
+    }
+
+    public static ConcurrentHashMap<String, ChannelHandlerContext> getChannelMap() {
+        if (null == channelMap) {
+            synchronized (ChannelMap.class) {
+                if (null == channelMap) {
+                    channelMap = new ConcurrentHashMap<>();
+                }
+            }
+        }
+        return channelMap;
+    }
+
+    public static ChannelHandlerContext getChannel(String id) {
+        return getChannelMap().get(id);
+    }
+}

+ 29 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/MessageCodec.java

@@ -0,0 +1,29 @@
+package com.zd.laboratory.netty;
+
+import com.zd.common.core.utils.ReUtil;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageCodec;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+@Slf4j
+public class MessageCodec extends MessageToMessageCodec<ByteBuf, String> {
+
+    @Override
+    protected void encode(ChannelHandlerContext channelHandlerContext, String msg, List<Object> list) throws Exception {
+        log.info("netty消息正在编码 " + msg);
+        list.add(Unpooled.copiedBuffer(ReUtil.hexStringToByteArray(msg)));
+//        list.add(ReUtil.hexStringToByteArray(msg));
+    }
+
+    @Override
+    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
+        log.info("netty消息正在解码" + byteBuf.readableBytes());
+        byte[] bytes = new byte[byteBuf.readableBytes()];
+        byteBuf.readBytes(bytes);
+        list.add(bytes);
+    }
+}

+ 48 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClient.java

@@ -0,0 +1,48 @@
+package com.zd.laboratory.netty;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class NettyClient {
+
+    /**
+     * Netty客户端
+     */
+    public static void main(String[] args) throws InterruptedException {
+        //1. 创建线程组
+        EventLoopGroup group = new NioEventLoopGroup();
+        //2. 创建客户端启动助手
+        Bootstrap bootstrap = new Bootstrap();
+        //3. 设置线程组
+        bootstrap.group(group)
+                .channel(NioSocketChannel.class)//4. 设置客户端通道实现为NIO
+                .handler(new ChannelInitializer<SocketChannel>() {//5. 创建一个通道初始化对象
+                    @Override
+                    protected void initChannel(SocketChannel socketChannel) throws Exception {
+
+                        //6、向pipeline中添加自定的的解码编码handler
+//                        socketChannel.pipeline().addLast(new MessageDecoder());
+//                        socketChannel.pipeline().addLast(new MessageEncoder());
+                        //6、向pipeline中添加编解码器
+                        socketChannel.pipeline().addLast(new com.zd.laboratory.netty.MessageCodec());
+
+                        //6. 向pipeline中添加自定义业务处理handler
+                        socketChannel.pipeline().addLast(new NettyClientHandler());
+                    }
+                });
+
+        //7. 启动客户端,等待连接服务端,同时将异步改为同步
+        ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", NettyServer.inetPort);
+        log.info("netty客户端已启动。。。 端口号: " + NettyServer.inetPort);
+        //8. 关闭通道和关闭连接池
+        channelFuture.channel().closeFuture().sync();
+        group.shutdownGracefully();
+    }
+}

+ 76 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClientHandler.java

@@ -0,0 +1,76 @@
+package com.zd.laboratory.netty;
+
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class NettyClientHandler implements ChannelInboundHandler {
+    @Override
+    public void channelRegistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelUnregistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    /**
+      * @description: 客户端发送消息
+    */
+    @Override
+    public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {
+        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush("你好,我是客户端");
+        channelFuture.addListener(new ChannelFutureListener() {
+            @Override
+            public void operationComplete(ChannelFuture channelFuture) throws Exception {
+                if(channelFuture.isSuccess()){
+                    log.info("客户端数据发送成功");
+                }else{
+                    log.info("客户端数据发送失败");
+                }
+            }
+        });
+    }
+    @Override
+    public void channelInactive(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    /**
+      * @description: 读取消息
+    */
+    @Override
+    public void channelRead(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+        String msg = (String) o;
+        log.info("客户端接受消息:"+msg);
+    }
+    @Override
+    public void channelReadComplete(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+    @Override
+    public void userEventTriggered(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+
+    }
+    @Override
+    public void channelWritabilityChanged(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+    @Override
+    public void handlerAdded(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+    @Override
+    public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception {
+
+    }
+}

+ 73 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServer.java

@@ -0,0 +1,73 @@
+package com.zd.laboratory.netty;
+
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+@Slf4j
+@Order(-999)
+public class NettyServer {
+    public static int inetPort = 12323;
+
+    /**
+     * Netty 服务端
+     */
+    @PostConstruct
+    public void start() throws InterruptedException {
+
+        //1. 创建bossGroup线程组: 处理网络事件--连接事件,不设置线程数默认为2*处理器线程数
+        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
+
+        //2. 创建workerGroup线程组: 处理网络事件--读写事件,不设置线程数默认为2*处理器线程数
+        EventLoopGroup workerGroup = new NioEventLoopGroup();
+
+        //3. 创建服务端启动助手
+        ServerBootstrap bootstrap = new ServerBootstrap();
+
+        //4. 设置bossGroup线程组和workerGroup线程组
+        bootstrap.group(bossGroup,workerGroup)
+                .channel(NioServerSocketChannel.class)//5. 设置服务端通道实现为NIO
+                .option(ChannelOption.SO_BACKLOG,128)//6、参数设置-设置线程队列中等待链接个数
+                .childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE)//6、参数设置-设置活跃状态,其中child设置的是workerGroup
+                .childHandler(new ChannelInitializer<SocketChannel>() {//7. 创建一个通道初始化对象
+                    @Override
+                    protected void initChannel(SocketChannel socketChannel) throws Exception {
+
+                        //8、向piple中添加编解码器
+                        socketChannel.pipeline().addLast(new MessageCodec());
+                        //8. 向pipeline中添加自定义业务处理handler
+                        socketChannel.pipeline().addLast(new NettyServerHandler());
+                    }
+                });
+
+        //9. 启动服务端并绑定端口
+        ChannelFuture channelFuture = bootstrap.bind(inetPort).sync();
+        channelFuture.addListener(new ChannelFutureListener() {
+            @Override
+            public void operationComplete(ChannelFuture channelFuture) throws Exception {
+                if(channelFuture.isSuccess()){
+                    log.info("netty绑定端口成功");
+                }else{
+                    log.info("netty绑定端口失败");
+                }
+            }
+        });
+        log.info("服务器启动成功");
+        //10. 关闭通道(并不是真正意义上的关闭通道,而是监听通道的关闭状态)和关闭链接
+        /*try {
+            channelFuture.channel().closeFuture().sync();
+            bossGroup.shutdownGracefully();
+            workerGroup.shutdownGracefully();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }*/
+    }
+}

+ 150 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java

@@ -0,0 +1,150 @@
+package com.zd.laboratory.netty;
+
+import com.zd.common.core.redis.RedisService;
+import com.zd.common.core.utils.ReUtil;
+import com.zd.common.core.utils.SpringUtils;
+import com.zd.laboratory.socket.runner.TCPServer;
+import com.zd.laboratory.utils.CRCCHECK;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 服务器端handler
+ */
+@Slf4j
+public class NettyServerHandler implements ChannelInboundHandler {
+
+    /**
+    * 读取客户端发送的消息
+    */
+    @Override
+    public void channelRead(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+        byte[] msg  = (byte[]) o;
+        String data = TCPServer.bytesToHexString(msg).toUpperCase();
+        log.info("netty服务端接受消息为:" + data);
+        if(data.equals("6862")){
+            return;
+        }
+
+        log.info("netty服务端接受消息转10进制为:" + ByteBuffer.wrap(msg).getLong());
+//        if(data.startsWith(SocketTypes.LOCK_PREFIX)){
+//        if(data.startsWith("33")){
+
+        String relayCode = data.substring(0, 108);
+//        33 31 20 33 30 20 36 33 20 33 36 20 36 34 20 33 37 20 33 36 20 33 33 20 33 31 20 33 35 20 33 31 20 33 35 20 33 30 20 36 33 20 33 33 20 33 35 20 33 32 20 33 37 20
+
+//        05 05 00 01 ee 00 d0 2e
+
+            // 将通道加入ChannelMap
+            ChannelMap.getChannelMap().put(data, channelHandlerContext);
+//        }else {
+//            if(data.length() != 12){
+//                log.info("netty柜锁回调指令非状态指令!" + data);
+//                return;
+//            }
+
+//            AtomicReference<String> relayCode = new AtomicReference<>("");
+//            ChannelMap.getChannelMap().entrySet().forEach(a -> {
+//                if(a.getValue() == channelHandlerContext){
+//                    relayCode.set(a.getKey());
+//                }
+//            });
+
+            if(data.length() > relayCode.length()) {
+                data = data.replaceAll(relayCode, "");
+                // 柜锁bit 位
+                long bit = CRCCHECK.getBitByCommand(data);
+                // 1开锁状态 0关锁状态
+                int status = CRCCHECK.getLockStatus(data);
+
+                log.info("netty柜锁回调:" + relayCode + ":" + bit + ",回调结果" + (status == 1 ? "开启": "关闭") + ",指令:" + data);
+
+                RedisService redisService = SpringUtils.getBean(RedisService.class);
+                redisService.setCacheObject(relayCode + ":" + bit, status, 3 * 60L, TimeUnit.SECONDS);
+            }
+
+    }
+
+    /**
+    * @description: 读取消息后开始的操作
+    */
+    @Override
+    public void channelReadComplete(ChannelHandlerContext channelHandlerContext) throws Exception {
+        String instruct = CRCCHECK.getOpenLockOrder(1);
+
+        byte[] bytes = ReUtil.hexStringToByteArray(instruct);
+//        log.info("netty服务端数据发送数据:" + instruct);
+//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(bytes);
+//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(instruct);
+//        channelFuture.addListener(new ChannelFutureListener() {
+//            @Override
+//            public void operationComplete(ChannelFuture channelFuture) throws Exception {
+//                if(channelFuture.isSuccess()){
+//                    log.info("服务端数据发送成功");
+//                }else{
+//                    log.info("服务端数据发送失败");
+//                }
+//            }
+//        });
+    }
+
+    /**
+    * @description: 异常发生时
+    */
+    @Override
+    public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception {
+        throwable.printStackTrace();
+        channelHandlerContext.close();
+    }
+
+    @Override
+    public void channelRegistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelUnregistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void userEventTriggered(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+
+    }
+
+    @Override
+    public void channelWritabilityChanged(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void handlerAdded(ChannelHandlerContext channelHandlerContext) throws Exception {
+        log.info("netty客户端开始连接" + channelHandlerContext.toString());
+    }
+
+    @Override
+    public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {
+        log.info("netty客户端断开连接" + channelHandlerContext.toString());
+        ChannelMap.getChannelMap().entrySet().forEach(a -> {
+            if(a.getValue() == channelHandlerContext.channel()){
+                ChannelMap.getChannelMap().remove(a.getKey());
+            }
+        });
+    }
+
+
+}

+ 18 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/PushMsgService.java

@@ -0,0 +1,18 @@
+package com.zd.laboratory.netty;
+
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PushMsgService {
+
+    public void push(String relayCode, byte[] bytes) {
+        // 客户端ID
+        ChannelHandlerContext channelHandlerContext = ChannelMap.getChannel(relayCode);
+        if (null == channelHandlerContext) {
+            throw new RuntimeException("柜锁已离线");
+        }
+        channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(bytes));
+    }
+}

+ 7 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSparseHardwareService.java

@@ -76,6 +76,13 @@ public interface ILabSparseHardwareService
     List<Map<String,Object>> selectSpeakerByFloorId(Long floorId, Long subId);
     List<Map<String,Object>> selectSpeakerByFloorId(Long floorId, Long subId);
 
 
     /**
     /**
+     * 根据实验室id查询喇叭列表
+     * @param subId
+     * @return
+     */
+    List<Map<String,Object>> selectSpeakerBySubId(Long subId);
+
+    /**
      * 查询所有喇叭的数量
      * 查询所有喇叭的数量
      * @Param []
      * @Param []
      * @Return java.lang.Integer
      * @Return java.lang.Integer

+ 14 - 5
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/HaiKangDoorService.java

@@ -644,11 +644,20 @@ public class HaiKangDoorService {
         labHaikangUser.setJoinUserId(userId);
         labHaikangUser.setJoinUserId(userId);
         List<LabHaikangUser> userList = labHaikangUserMapper.queryAll(labHaikangUser);
         List<LabHaikangUser> userList = labHaikangUserMapper.queryAll(labHaikangUser);
 
 
-        for (LabWhiteJoinSublist labWhiteJoinSublist : labWhiteJoinSubList) {
-            for (LabHaikangUser haikangUser : userList) {
-                if(haikangUser.getSubId().equals(labWhiteJoinSublist.getSubjectId())){
-                    userList.remove(haikangUser);
-                    labWhiteJoinSubList.remove(labWhiteJoinSublist);
+
+        for (int i = 0; i < labWhiteJoinSubList.size(); i++) {
+
+            boolean isdel = false;
+            for (int j = 0; j < userList.size(); j++) {
+
+                if(userList.get(j).getSubId().equals(labWhiteJoinSubList.get(i).getSubjectId())){
+                    userList.remove(userList.get(j));
+                    j--;
+                    if(!isdel){
+                        labWhiteJoinSubList.remove(labWhiteJoinSubList.get(i));
+                        i--;
+                        isdel = true;
+                    }
                 }
                 }
                 if(userList.size() == 0){
                 if(userList.size() == 0){
                     break;
                     break;

+ 1 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitLineVertexServiceImpl.java

@@ -428,7 +428,7 @@ public class LabExitLineVertexServiceImpl implements ILabExitLineVertexService {
                     for(Map<String,Object> map:mapList){
                     for(Map<String,Object> map:mapList){
                         if (StringUtils.isNotNull(map.get("deviceSn")) && StringUtils.isNotNull(map.get("port"))) {
                         if (StringUtils.isNotNull(map.get("deviceSn")) && StringUtils.isNotNull(map.get("port"))) {
                             log.info("关闭喇叭-疏散调用喇叭播放音乐!url={},deviceSn={}", audioSyntheses.get(0).getNewMusicUrl(), map.get("deviceSn"));
                             log.info("关闭喇叭-疏散调用喇叭播放音乐!url={},deviceSn={}", audioSyntheses.get(0).getNewMusicUrl(), map.get("deviceSn"));
-                            R r = remoteSpeakService.stopPlayMusic(map.get("deviceSn") + "", audioSyntheses.get(0).getNewMusicUrl());
+                            R r = remoteSpeakService.stopPlayMusic(map.get("deviceSn") + "", String.valueOf(map.get("deviceIp")));
                             log.info("关闭喇叭-疏散调用喇叭播放音乐返回信息:{}", JSON.toJSONString(r));
                             log.info("关闭喇叭-疏散调用喇叭播放音乐返回信息:{}", JSON.toJSONString(r));
                         } else {
                         } else {
                             log.info("关闭喇叭deviceSn/port为空!");
                             log.info("关闭喇叭deviceSn/port为空!");

+ 6 - 6
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabRiskPlanServiceImpl.java

@@ -800,7 +800,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
      * @Param [subjectid 实验室id, floorId 楼层id, riskPlanId 预案id]
      * @Param [subjectid 实验室id, floorId 楼层id, riskPlanId 预案id]
      * @Return void
      * @Return void
      **/
      **/
-    private void closeLoudSpeaker(Long subjectid, Long floorId, Long riskPlanId) {
+    private void closeLoudSpeaker(Long subjectId, Long floorId, Long riskPlanId) {
         //预案关闭喇叭
         //预案关闭喇叭
         try {
         try {
             //这里查询预案下的合成音乐
             //这里查询预案下的合成音乐
@@ -809,17 +809,17 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
             List<LabAudioSynthesis> audioSyntheses = labAudioSynthesisMapper.selectLabAudioSynthesisList(labAudioSynthesis);
             List<LabAudioSynthesis> audioSyntheses = labAudioSynthesisMapper.selectLabAudioSynthesisList(labAudioSynthesis);
             log.info("关闭喇叭-查询的音乐列表信息 audioSyntheses= {}", JSON.toJSONString(audioSyntheses));
             log.info("关闭喇叭-查询的音乐列表信息 audioSyntheses= {}", JSON.toJSONString(audioSyntheses));
             if (audioSyntheses != null && audioSyntheses.size() > 0) {
             if (audioSyntheses != null && audioSyntheses.size() > 0) {
-                log.info("关闭喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectid);
+                log.info("关闭喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectId);
                 Integer count = labSparseHardwareService.selectSpeakerCount();
                 Integer count = labSparseHardwareService.selectSpeakerCount();
                 log.info("查询喇叭总数:{}",count);
                 log.info("查询喇叭总数:{}",count);
-                R deviceList = remoteSpeakService.getDeviceList(1, count + 10, floorId, subjectid);
+                R deviceList = remoteSpeakService.getDeviceList(1, count + 10, -99L, subjectId);
                 log.info("关闭喇叭-远程调用喇叭列表返回内容: deviceList={}", JSON.toJSONString(deviceList));
                 log.info("关闭喇叭-远程调用喇叭列表返回内容: deviceList={}", JSON.toJSONString(deviceList));
                 if (deviceList.getCode() == 200) {
                 if (deviceList.getCode() == 200) {
                     List<Map<String, Object>> mapList = (List<Map<String, Object>>) deviceList.getData();
                     List<Map<String, Object>> mapList = (List<Map<String, Object>>) deviceList.getData();
                     for (Map<String, Object> map : mapList) {
                     for (Map<String, Object> map : mapList) {
                         if (StringUtils.isNotNull(map.get("deviceSn")) && StringUtils.isNotNull(map.get("port"))) {
                         if (StringUtils.isNotNull(map.get("deviceSn")) && StringUtils.isNotNull(map.get("port"))) {
-                            log.info("关闭喇叭-远程调用喇叭播放音乐!url={},deviceSn={}", audioSyntheses.get(0).getNewMusicUrl(), map.get("deviceSn"));
-                            R r = remoteSpeakService.stopPlayMusic(map.get("deviceSn") + "", audioSyntheses.get(0).getNewMusicUrl());
+                            log.info("关闭喇叭-远程调用喇叭播放音乐!deviceSn={},deviceIp={}",map.get("deviceSn"), map.get("deviceIp"));
+                            R r = remoteSpeakService.stopPlayMusic(String.valueOf(map.get("deviceSn")), String.valueOf(map.get("deviceIp")));
                             log.info("关闭喇叭-远程调用喇叭播放音乐返回信息:{}", JSON.toJSONString(r));
                             log.info("关闭喇叭-远程调用喇叭播放音乐返回信息:{}", JSON.toJSONString(r));
                         } else {
                         } else {
                             log.info("关闭喇叭deviceSn/port为空!");
                             log.info("关闭喇叭deviceSn/port为空!");
@@ -1010,7 +1010,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
                 log.info("打开喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectId);
                 log.info("打开喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectId);
                 Integer count = labSparseHardwareService.selectSpeakerCount();
                 Integer count = labSparseHardwareService.selectSpeakerCount();
                 log.info("查询喇叭总数:{}",count);
                 log.info("查询喇叭总数:{}",count);
-                R deviceList = remoteSpeakService.getDeviceList(1, count + 10, floorId, subjectId);
+                R deviceList = remoteSpeakService.getDeviceList(1, count + 10, -99L, subjectId);
                 log.info("打开喇叭-远程调用喇叭列表返回内容: deviceList={}", JSON.toJSONString(deviceList));
                 log.info("打开喇叭-远程调用喇叭列表返回内容: deviceList={}", JSON.toJSONString(deviceList));
                 if (deviceList.getCode() == 200) {
                 if (deviceList.getCode() == 200) {
                     List<PlayVo> playVoList = new ArrayList<>();
                     List<PlayVo> playVoList = new ArrayList<>();

+ 5 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSparseHardwareServiceImpl.java

@@ -117,6 +117,11 @@ public class LabSparseHardwareServiceImpl implements ILabSparseHardwareService {
     }
     }
 
 
     @Override
     @Override
+    public List<Map<String,Object>> selectSpeakerBySubId(Long subId) {
+        return labSparseHardwareMapper.selectListBySubId(subId);
+    }
+
+    @Override
     public Integer selectSpeakerCount() {
     public Integer selectSpeakerCount() {
         return labSparseHardwareMapper.selectSpeakerCount();
         return labSparseHardwareMapper.selectSpeakerCount();
     }
     }

+ 5 - 3
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectManagerService.java

@@ -18,6 +18,7 @@ import com.zd.laboratory.api.vo.HardwareCVO;
 import com.zd.laboratory.api.vo.LabSubClassVO;
 import com.zd.laboratory.api.vo.LabSubClassVO;
 import com.zd.laboratory.api.vo.SenseValVO;
 import com.zd.laboratory.api.vo.SenseValVO;
 import com.zd.laboratory.config.HardwareFunctionStatusConfig;
 import com.zd.laboratory.config.HardwareFunctionStatusConfig;
+import com.zd.laboratory.config.TimeWaitConfigUtils;
 import com.zd.laboratory.domain.*;
 import com.zd.laboratory.domain.*;
 import com.zd.laboratory.domain.dto.LabSubListQuery;
 import com.zd.laboratory.domain.dto.LabSubListQuery;
 import com.zd.laboratory.domain.vo.*;
 import com.zd.laboratory.domain.vo.*;
@@ -115,20 +116,21 @@ public class LabSubjectManagerService {
     private SocketService socketService;
     private SocketService socketService;
     @Autowired
     @Autowired
     private ILabControlService labControlService;
     private ILabControlService labControlService;
-
+    @Autowired
+    private TimeWaitConfigUtils timeWaitConfigUtils;
 
 
     public LabSubjectManagerService(List<ControlService> controlServices) {
     public LabSubjectManagerService(List<ControlService> controlServices) {
         controlServiceMap = controlServices.stream().collect(Collectors.toMap(a -> a.comTypeEnums(), Function.identity()));
         controlServiceMap = controlServices.stream().collect(Collectors.toMap(a -> a.comTypeEnums(), Function.identity()));
 
 
     }
     }
 
 
-    @Async("labExecutor")
+//    @Async("labExecutor")
     public void operationHardware(FunctionStatus status, List<LabHardware> hardwareList) {
     public void operationHardware(FunctionStatus status, List<LabHardware> hardwareList) {
         try {
         try {
             logger.info("异步线程处理硬件信息:id={},name={}",Thread.currentThread().getId(),Thread.currentThread().getName());
             logger.info("异步线程处理硬件信息:id={},name={}",Thread.currentThread().getId(),Thread.currentThread().getName());
             for (LabHardware hard : hardwareList) {
             for (LabHardware hard : hardwareList) {
                 ResultData result = excutingComm(hard, status);
                 ResultData result = excutingComm(hard, status);
-                Thread.sleep(1000);
+                Thread.sleep(timeWaitConfigUtils.getWaitTime());
             }
             }
         } catch (InterruptedException e) {
         } catch (InterruptedException e) {
             logger.error("异步处理硬件异常!",e);
             logger.error("异步处理硬件异常!",e);

+ 3 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/SocketRunner.java

@@ -3,6 +3,7 @@ package com.zd.laboratory.socket.runner;
 
 
 import cn.hutool.core.collection.ConcurrentHashSet;
 import cn.hutool.core.collection.ConcurrentHashSet;
 import com.zd.laboratory.socket.properties.SocketProperties;
 import com.zd.laboratory.socket.properties.SocketProperties;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.core.annotation.Order;
 import org.springframework.core.annotation.Order;
@@ -22,6 +23,7 @@ import java.util.concurrent.*;
 
 
 @Component
 @Component
 @Order(Integer.MAX_VALUE)
 @Order(Integer.MAX_VALUE)
+@Slf4j
 public class SocketRunner implements CommandLineRunner {
 public class SocketRunner implements CommandLineRunner {
 
 
     //地址
     //地址
@@ -55,6 +57,7 @@ public class SocketRunner implements CommandLineRunner {
             while (true) {
             while (true) {
                 socket = server.accept();
                 socket = server.accept();
                 pool.execute(new TCPServer(socket));
                 pool.execute(new TCPServer(socket));
+                log.info("SocketRunner---------pool: " + pool.toString());
             }
             }
 
 
         } catch (IOException e) {
         } catch (IOException e) {

+ 7 - 9
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java

@@ -11,10 +11,7 @@ import com.zd.laboratory.socket.vo.TransmissionVo;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 
 
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.io.*;
 import java.net.Socket;
 import java.net.Socket;
 import java.net.SocketException;
 import java.net.SocketException;
 import java.util.Map;
 import java.util.Map;
@@ -48,7 +45,7 @@ public class TCPServer implements Runnable {
         }*/
         }*/
         // 设置连接超时90秒
         // 设置连接超时90秒
         try {
         try {
-            socket.setSoTimeout(200000);
+            socket.setSoTimeout(212000);
             log.info("客户 - " + socket.getRemoteSocketAddress() + " -> 机连接成功");
             log.info("客户 - " + socket.getRemoteSocketAddress() + " -> 机连接成功");
             while (true) {
             while (true) {
                 handle();
                 handle();
@@ -73,16 +70,17 @@ public class TCPServer implements Runnable {
     private void handle() throws IOException {
     private void handle() throws IOException {
 
 
         StringBuilder ret = new StringBuilder();
         StringBuilder ret = new StringBuilder();
+        InputStream in = socket.getInputStream();
 
 
         // 解析二进制数据
         // 解析二进制数据
-        BufferedInputStream bs = new BufferedInputStream(socket.getInputStream());
+//        BufferedInputStream bs = new BufferedInputStream(socket.getInputStream());
 
 
-        DataInputStream dis = new DataInputStream(bs);
+//        DataInputStream dis = new DataInputStream(bs);
 
 
         byte[] bytes = new byte[1];
         byte[] bytes = new byte[1];
-        while (dis.read(bytes) != -1){
+        while (in.read(bytes) != -1){
             ret.append(bytesToHexString(bytes) + " ");
             ret.append(bytesToHexString(bytes) + " ");
-            if(dis.available() == 0){
+            if(in.available() == 0){
                 break;
                 break;
             }
             }
         }
         }

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

@@ -73,6 +73,10 @@ public class SocketService {
     @Autowired
     @Autowired
     private CommonSend commonSend;
     private CommonSend commonSend;
 
 
+    public String getSteerSubscriptPrefix() {
+        return steerSubscriptPrefix;
+    }
+
     @PostConstruct
     @PostConstruct
     private void queryRelays(){
     private void queryRelays(){
         relays = labRelayMapper.selectLabRelayList(new LabRelay());
         relays = labRelayMapper.selectLabRelayList(new LabRelay());

+ 12 - 6
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorMapper.xml

@@ -84,19 +84,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           left join lab_subject s on l.sub_id = s.id
           left join lab_subject s on l.sub_id = s.id
           left join lab_subject_access_record sar ON sar.subject_id = s.id
           left join lab_subject_access_record sar ON sar.subject_id = s.id
           and sar.access_status  = 1 AND sar.init_flag = 0
           and sar.access_status  = 1 AND sar.init_flag = 0
+          <where>
+            <if test="id != null "> and t.id = #{id}</if>
+            <if test="parentId != null "> and t.id = #{parentId}</if>
+            <if test="type != null "> and t.`type` = #{type}</if>
+          </where>
         </if>
         </if>
         <if test="type == 3 ">
         <if test="type == 3 ">
             left join lab_build_floor_layout l on t.id = l.floor_id
             left join lab_build_floor_layout l on t.id = l.floor_id
             left join lab_subject s on l.sub_id = s.id
             left join lab_subject s on l.sub_id = s.id
             left join lab_subject_access_record sar ON sar.subject_id = s.id
             left join lab_subject_access_record sar ON sar.subject_id = s.id
             and sar.access_status  = 1 AND sar.init_flag = 0
             and sar.access_status  = 1 AND sar.init_flag = 0
+            <where>
+                (s.admin_id = #{adminId} or find_in_set(#{adminId}, s.safe_user_id))
+                <if test="id != null "> and t.id = #{id}</if>
+                <if test="parentId != null "> and t.id = #{parentId}</if>
+                <if test="type != null "> and t.`type` = #{type}</if>
+            </where>
         </if>
         </if>
-        <where>
-            (s.admin_id = #{adminId} or find_in_set(#{adminId}, s.safe_user_id))
-            <if test="id != null "> and t.id = #{id}</if>
-            <if test="parentId != null "> and t.parent_id = #{parentId}</if>
-            <if test="type != null "> and t.`type` = #{type}</if>
-        </where>
+
         GROUP BY t.id
         GROUP BY t.id
     </select>
     </select>
 
 

+ 1 - 2
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanAbnormalGroupMapper.xml

@@ -35,8 +35,7 @@
           (SELECT CONCAT(s.name,s.room) FROM lab_subject s WHERE s.id = subject_id) subject_name,
           (SELECT CONCAT(s.name,s.room) FROM lab_subject s WHERE s.id = subject_id) subject_name,
           (SELECT s.build_id FROM lab_subject s WHERE s.id = subject_id) build_id,
           (SELECT s.build_id FROM lab_subject s WHERE s.id = subject_id) build_id,
           (SELECT d.dept_name FROM lab_subject s,sys_dept d WHERE s.id = gp.subject_id AND s.build_id = d.dept_id) buildName,
           (SELECT d.dept_name FROM lab_subject s,sys_dept d WHERE s.id = gp.subject_id AND s.build_id = d.dept_id) buildName,
-          (SELECT b.name FROM lab_building b,lab_subject s WHERE b.id = s.floor_id AND s.id = gp.subject_id) floorName,
-          (SELECT b.id FROM lab_building b,lab_subject s WHERE b.id = s.floor_id AND s.id = gp.subject_id) floorId,
+          (SELECT b.floor_id FROM lab_build_floor_layout b,lab_subject s WHERE b.sub_id = s.id AND s.id = gp.subject_id) floorId,
           (SELECT l.room FROM lab_subject_layout l,lab_subject s WHERE l.id = s.layout_id AND s.id = gp.subject_id) roomName,
           (SELECT l.room FROM lab_subject_layout l,lab_subject s WHERE l.id = s.layout_id AND s.id = gp.subject_id) roomName,
           (select distinct max(al.risk_plan_id) from lab_risk_plan_abnormal_log al where gp.`id` = al.group_id and al.risk_status=1) riskPlanId
           (select distinct max(al.risk_plan_id) from lab_risk_plan_abnormal_log al where gp.`id` = al.group_id and al.risk_status=1) riskPlanId
         FROM
         FROM

+ 8 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSparseHardwareMapper.xml

@@ -114,6 +114,14 @@
             or (subject_id = #{subId} and device_type = 2)
             or (subject_id = #{subId} and device_type = 2)
         </if>
         </if>
     </select>
     </select>
+
+    <select id="selectListBySubId" resultType="java.util.Map">
+        SELECT t.hardware_num as hardwareNum,t.`name`,t.operate,t.port,t.device_vol as deviceVol FROM lab_sparse_hardware t LEFT JOIN lab_build_floor d ON t.floor_id = d.id
+        WHERE t.`type`= 2
+        AND device_type = 2
+        AND subject_id = #{subId}
+    </select>
+
     <select id="selectCameraByFloorId" resultType="java.lang.String">
     <select id="selectCameraByFloorId" resultType="java.lang.String">
        SELECT  t.hardware_num FROM  lab_sparse_hardware t LEFT JOIN lab_build_floor d ON t.floor_id = d.id
        SELECT  t.hardware_num FROM  lab_sparse_hardware t LEFT JOIN lab_build_floor d ON t.floor_id = d.id
        WHERE t.floor_id=#{floorId} AND t.`type`=1
        WHERE t.floor_id=#{floorId} AND t.`type`=1

+ 27 - 4
zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysStudentController.java

@@ -34,10 +34,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -243,6 +240,8 @@ public class SysStudentController extends BaseController {
         } else if (StringUtils.isNotEmpty(user.getEmail())
         } else if (StringUtils.isNotEmpty(user.getEmail())
                 && UserConstants.NOT_UNIQUE.equals(sysStudentService.checkEmailUnique(user))) {
                 && UserConstants.NOT_UNIQUE.equals(sysStudentService.checkEmailUnique(user))) {
             return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
             return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }else if (UserConstants.NOT_UNIQUE.equals(sysTeacherService.checkUserNameUniqueNotOwn(user.getUserId(),user.getUserName()))) {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,账号已存在");
         }
         }
         if(StringUtils.isNotEmpty(user.getCardNum())){
         if(StringUtils.isNotEmpty(user.getCardNum())){
 //            Long carNum10 = Long.parseLong(user.getCardNum());
 //            Long carNum10 = Long.parseLong(user.getCardNum());
@@ -383,4 +382,28 @@ public class SysStudentController extends BaseController {
         return AjaxResult.success(collect);
         return AjaxResult.success(collect);
 
 
     }
     }
+
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER_STUDENT+ PerFun.CHECK)
+    @PostMapping("/batchSelect/{ids}")
+    public AjaxResult batchSelect(SysUser user,@PathVariable(value = "ids",required = false) Long... ids){
+        if(ids!=null&&ids.length>0)
+        {
+            user = new SysUser();
+            user.setIds(Arrays.asList(ids));
+        }
+        user.setUserType(USER_TYPE);
+        List<SysUser> list = sysStudentService.selectUserList(user);
+        Optional.ofNullable(list).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    a.setCardNum(DESUtils.decrypt(a.getCardNumSimple()));
+                });
+        return AjaxResult.success(list);
+    }
+
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER_STUDENT+ PerFun.CHECK)
+    @PutMapping({"/updateCardNum"})
+    public AjaxResult updateCardNum(@RequestBody List<SysUser> userList) {
+        return AjaxResult.success(sysTeacherService.updateCardNum(userList));
+    }
 }
 }

+ 25 - 1
zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysTeacherController.java

@@ -98,7 +98,7 @@ public class SysTeacherController extends BaseController {
         }
         }
         user.setUserType(USER_TYPE);
         user.setUserType(USER_TYPE);
         List<SysUser> list = sysTeacherService.selectUserList(user);
         List<SysUser> list = sysTeacherService.selectUserList(user);
-        teacherService.queryTeacherSuBCount(list);
+//        teacherService.queryTeacherSuBCount(list);
 
 
         List<SysUserTeaCherByExport> teacherList = new ArrayList<>();
         List<SysUserTeaCherByExport> teacherList = new ArrayList<>();
         for (SysUser sysUser : list) {
         for (SysUser sysUser : list) {
@@ -306,4 +306,28 @@ public class SysTeacherController extends BaseController {
         }
         }
         return ajax;
         return ajax;
     }
     }
+
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER_TEACHER+ PerFun.CHECK)
+    @PostMapping({"/batchSelect/{ids}"})
+    public AjaxResult batchSelect(SysUser user,@PathVariable(value = "ids",required = false) Long... ids) {
+        if(ids!=null&&ids.length>0)
+        {
+            user = new SysUser();
+            user.setIds(Arrays.asList(ids));
+        }
+        user.setUserType(USER_TYPE);
+        List<SysUser> list = sysTeacherService.selectUserList(user);
+        Optional.ofNullable(list).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    a.setCardNum(DESUtils.decrypt(a.getCardNumSimple()));
+                });
+        return AjaxResult.success(list);
+    }
+
+    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER_TEACHER+ PerFun.CHECK)
+    @PutMapping({"/updateCardNum"})
+    public AjaxResult updateCardNum(@RequestBody List<SysUser> userList) {
+        return AjaxResult.success(sysTeacherService.updateCardNum(userList));
+    }
 }
 }

+ 4 - 1
zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysUserController.java

@@ -138,10 +138,13 @@ public class SysUserController extends BaseController {
      */
      */
 //    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.LIST)
 //    @PreAuthorize(hasPermi = PerPrefix.SYSTEM_USER+ PerFun.LIST)
     @GetMapping("/selectlist")
     @GetMapping("/selectlist")
-    public ResultData selectlist(String nickName) {
+    public ResultData selectlist(String nickName,String userType) {
         if (StrUtil.isBlank(nickName)) return ResultData.success(new ArrayList<>());
         if (StrUtil.isBlank(nickName)) return ResultData.success(new ArrayList<>());
         SysUser user = new SysUser();
         SysUser user = new SysUser();
         user.setNickName(nickName);
         user.setNickName(nickName);
+        if(StringUtils.isNotNull(userType)){
+            user.setUserType(userType);
+        }
         List<SysUser> list = userService.selectUserList(user);
         List<SysUser> list = userService.selectUserList(user);
         List<SelectUserVO> collect = null;
         List<SelectUserVO> collect = null;
         //转化
         //转化

+ 8 - 0
zd-modules/zd-modules-system/src/main/java/com/zd/system/mapper/SysUserMapper.java

@@ -168,6 +168,14 @@ public interface SysUserMapper {
      * @return
      * @return
      */
      */
     public List<String> queryPhoneByIds(Long... ids);
     public List<String> queryPhoneByIds(Long... ids);
+
+    /**
+     * 根据ID查询电话号码
+     * @param cardNums
+     * @return
+     */
+    public List<SysUser> queryCardNumByIds(String[] cardNums);
+
     /**
     /**
      * 查询人数通过部门ID
      * 查询人数通过部门ID
      *
      *

+ 8 - 0
zd-modules/zd-modules-system/src/main/java/com/zd/system/service/ISysTeacherService.java

@@ -318,4 +318,12 @@ public interface ISysTeacherService {
      * @return 结果
      * @return 结果
      */
      */
     int editUserByDept(List <SysUser> userList);
     int editUserByDept(List <SysUser> userList);
+
+
+    /**
+     * 修改用户信息
+     * @param userList 用户信息列表
+     * @return 结果
+     */
+    Map <String, Object> updateCardNum(List<SysUser> userList);
 }
 }

+ 2 - 3
zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysStudentServiceImpl.java

@@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
-
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
 
 
@@ -912,13 +911,13 @@ public class SysStudentServiceImpl implements ISysStudentService {
             }
             }
             user.getFailRemark().append("姓名不能为空、");
             user.getFailRemark().append("姓名不能为空、");
         }else{
         }else{
-            if(user.getNickName().length()>8){
+            if(user.getNickName().length()>50){
                 if(checkBox){
                 if(checkBox){
                     user.getFailRemark().append("失败:");
                     user.getFailRemark().append("失败:");
                     failSysUserList.add(user);
                     failSysUserList.add(user);
                     checkBox = false;
                     checkBox = false;
                 }
                 }
-                user.getFailRemark().append("姓名最多个字符、");
+                user.getFailRemark().append("姓名最多五十个字符、");
             }
             }
         }
         }
 
 

+ 52 - 2
zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysTeacherServiceImpl.java

@@ -30,6 +30,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
+import java.util.concurrent.atomic.LongAdder;
+import java.util.function.Consumer;
 
 
 /**
 /**
  * 用户 业务层处理
  * 用户 业务层处理
@@ -432,6 +434,54 @@ public class SysTeacherServiceImpl implements ISysTeacherService {
         return 1;
         return 1;
     }
     }
 
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map <String, Object> updateCardNum(List <SysUser> userList) {
+        LongAdder count = new LongAdder();
+        String[] cardNums = new String[userList.size()];
+        //todo 将所有的卡号转换成加密后的卡号
+        Optional.ofNullable(userList).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    //处理卡号加密
+                    passCardNum(a,0);
+                    cardNums[count.intValue()] = a.getCardNumSimple();
+                    count.increment();
+                });
+        //todo 将所有的加密后卡号,查询校验是否有除自己以外的卡号重复
+        List<SysUser> resutUserList = userMapper.queryCardNumByIds(cardNums);
+
+        List<String> repeatList = new ArrayList <>();
+
+        Consumer<SysUser> consumer = a->Optional.ofNullable(userList).orElseGet(Collections::emptyList)
+                .stream()
+                .filter(b->b.getCardNumSimple().equals(a.getCardNumSimple())&&b.getUserId().longValue()!=a.getUserId().longValue())
+                .forEach(b->{
+                    repeatList.add(DESUtils.decrypt(a.getCardNumSimple()));
+                });
+
+        Optional.ofNullable(resutUserList).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    consumer.accept(a);
+                });
+
+        Map<String,Object> allMap = new HashMap <>();
+        if(repeatList.size()>0){
+            allMap.put("repeatCard",-1);
+            allMap.put("repeatList",repeatList);
+        }else{
+            //todo 批量修改卡号
+            Optional.ofNullable(userList).orElseGet(Collections::emptyList)
+                    .stream()
+                    .forEach(a->{
+                        userMapper.updateTeacherUser(a);
+                    });
+            allMap.put("repeatCard",0);
+        }
+
+        return allMap;
+    }
 
 
 
 
     /**
     /**
@@ -711,13 +761,13 @@ public class SysTeacherServiceImpl implements ISysTeacherService {
             }
             }
             user.getFailRemark().append("姓名不能为空、");
             user.getFailRemark().append("姓名不能为空、");
         }else{
         }else{
-            if(user.getNickName().length()>8){
+            if(user.getNickName().length()>50){
                 if(checkBox){
                 if(checkBox){
                     user.getFailRemark().append("失败:");
                     user.getFailRemark().append("失败:");
                     failSysUserList.add(user);
                     failSysUserList.add(user);
                     checkBox = false;
                     checkBox = false;
                 }
                 }
-                user.getFailRemark().append("姓名最多个字符、");
+                user.getFailRemark().append("姓名最多五十个字符、");
             }
             }
         }
         }
 
 

+ 18 - 1
zd-modules/zd-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -107,7 +107,7 @@
         u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         u.major_id, u.grade, u.tutor_user_id, u.position, p.post_name as positionName,
         u.major_id, u.grade, u.tutor_user_id, u.position, p.post_name as positionName,
         u.nature,(select sc.class_name from sys_class sc where sc.id = u.grade) gradeName,
         u.nature,(select sc.class_name from sys_class sc where sc.id = u.grade) gradeName,
-        u.card_num,u.wechat_id,u.nationality,u.addr,u.work_status,
+        u.card_num,u.card_num_simple,u.wechat_id,u.nationality,u.addr,u.work_status,
         u.date_birth,d.dept_name, d.leader,u.department,
         u.date_birth,d.dept_name, d.leader,u.department,
         u.education, u.user_type,sm.`major_name` major,
         u.education, u.user_type,sm.`major_name` major,
         ut.nick_name tutorUserName,u.is_check,date_format(u.create_time, '%Y-%m-%d') createTimeStr
         ut.nick_name tutorUserName,u.is_check,date_format(u.create_time, '%Y-%m-%d') createTimeStr
@@ -133,6 +133,14 @@
         <if test="cardNum != null and cardNum != ''">
         <if test="cardNum != null and cardNum != ''">
             AND u.card_num = #{cardNum}
             AND u.card_num = #{cardNum}
         </if>
         </if>
+        <if test="cardNumSimple != null and cardNumSimple != ''">
+            <if test="cardNumSimple == 1">
+                AND u.card_num_simple is not null
+            </if>
+            <if test="cardNumSimple == 0">
+                AND u.card_num_simple is null
+            </if>
+        </if>
         <if test="userType != null and userType != ''">
         <if test="userType != null and userType != ''">
             AND u.user_type = #{userType}
             AND u.user_type = #{userType}
         </if>
         </if>
@@ -660,6 +668,15 @@
         </foreach>
         </foreach>
         and length(phonenumber)=11
         and length(phonenumber)=11
     </select>
     </select>
+
+    <select id="queryCardNumByIds" resultType="com.zd.model.entity.SysUser">
+        select  * from sys_user
+        where card_num_simple in
+        <foreach collection="array" item="cardNums" open="(" separator="," close=")">
+            #{cardNums}
+        </foreach>
+    </select>
+
     <select id="queryCountByDeptIds" resultType="com.zd.model.entity.TotalByID">
     <select id="queryCountByDeptIds" resultType="com.zd.model.entity.TotalByID">
 
 
         select dept_id as id, count(dept_id ) as total from sys_user
         select dept_id as id, count(dept_id ) as total from sys_user

+ 0 - 38
zd.iml

@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" version="4">
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output url="file://$MODULE_DIR$/target/classes" />
-    <output-test url="file://$MODULE_DIR$/target/test-classes" />
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/target" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-bootstrap:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.4" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.4" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.32" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.32" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.10.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.68" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.68" level="project" />
-  </component>
-</module>