Преглед изворни кода

Merge commit '787b4591826aa36d48a77ba01e01b434fa6e8fbe' into pre

linfutong пре 2 година
родитељ
комит
bfc08e0151
41 измењених фајлова са 443 додато и 235 уклоњено
  1. 8 0
      release/sql/db_sql_v2.1-hotfix.sql
  2. 1 1
      zd-api/zd-system-api/src/main/java/com/zd/system/api/entity/SysUserStudent.java
  3. 1 1
      zd-model/src/main/java/com/zd/model/entity/SysUser.java
  4. 23 0
      zd-model/src/main/resources/logback.xml
  5. 3 1
      zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/impl/AlarmRecordServiceImpl.java
  6. 8 8
      zd-modules/zd-airbottle/src/main/resources/mapper/airbottle/QpAirGoogsMapper.xml
  7. 4 10
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/FireImageService.java
  8. 5 6
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/mqtt/MqttConfig.java
  9. 9 44
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/rfid/sdk/RfidClientImpl.java
  10. 12 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/rfid/service/impl/HardwareRfidServiceImpl.java
  11. 1 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/controller/SpeakerController.java
  12. 2 1
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java
  13. 1 1
      zd-modules/zd-chemical/src/main/resources/mapper/chemical/HxpCabinetlockLogMapper.xml
  14. 2 2
      zd-modules/zd-exam/src/main/java/com/zd/exam/controller/ElPointsRecordController.java
  15. 12 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSparseHardwareController.java
  16. 107 16
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  17. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSparseHardwareMapper.java
  18. 0 57
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/TestController.java
  19. 33 10
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/config/MqttConfig.java
  20. 0 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/controller/MqttController.java
  21. 1 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/service/impl/SubMessageSendManager.java
  22. 0 36
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/test/MqttTest.java
  23. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSparseHardwareService.java
  24. 14 5
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/HaiKangDoorService.java
  25. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitLineVertexServiceImpl.java
  26. 6 6
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabRiskPlanServiceImpl.java
  27. 5 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSparseHardwareServiceImpl.java
  28. 5 3
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectManagerService.java
  29. 5 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java
  30. 4 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/service/SocketService.java
  31. 5 7
      zd-modules/zd-modules-laboratory/src/main/resources/bootstrap.yml
  32. 1 2
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanAbnormalGroupMapper.xml
  33. 8 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSparseHardwareMapper.xml
  34. 25 4
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysStudentController.java
  35. 25 1
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysTeacherController.java
  36. 4 1
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysUserController.java
  37. 8 0
      zd-modules/zd-modules-system/src/main/java/com/zd/system/mapper/SysUserMapper.java
  38. 8 0
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/ISysTeacherService.java
  39. 2 2
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysStudentServiceImpl.java
  40. 52 2
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysTeacherServiceImpl.java
  41. 18 1
      zd-modules/zd-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

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

@@ -0,0 +1,8 @@
+
+/************************************************/
+/*     更新表: sys_user    ****/
+/*     字段: nick_name  ****/
+/*     添加人:cyl                    ****/
+/*     添加时间:2023-2-23                 ****/
+/************************************************/
+ALTER TABLE sys_user MODIFY COLUMN nick_name VARCHAR(100);

+ 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;
     }
 
-    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+    @Size(min = 0, max = 50, message = "用户昵称长度不能超过50个字符")
     public String getNickName() {
         return nickName;
     }

+ 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;
     }
 
-    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+    @Size(min = 0, max = 50, message = "用户昵称长度不能超过50个字符")
     public String getNickName() {
         return nickName;
     }

+ 23 - 0
zd-model/src/main/resources/logback.xml

@@ -57,6 +57,28 @@
         </filter>
     </appender>
 
+    <!--<appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/${spring.application.name}-debug.log</file>
+        &lt;!&ndash; 循环政策:基于时间创建日志文件 &ndash;&gt;
+        <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>
+            &lt;!&ndash; 日志最大的历史 60天 &ndash;&gt;
+            <maxHistory>7</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            &lt;!&ndash; 过滤的级别 &ndash;&gt;
+            <level>debug</level>
+            &lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;
+            <onMatch>ACCEPT</onMatch>
+            &lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>-->
+
     <!-- 系统模块日志级别控制  -->
     <logger name="com.zd" level="info"/>
     <!-- Spring日志级别控制  -->
@@ -70,5 +92,6 @@
     <root level="info">
         <appender-ref ref="file_info"/>
         <appender-ref ref="file_error"/>
+<!--        <appender-ref ref="file_debug"/>-->
     </root>
 </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();
         QpBottleStorageRVo storageRVo = storageService.getByElectronicTag(electronicTag);
         if (storageRVo != null) {
-            if (hardwareRfidDto!=null){
+            if (hardwareRfidDto!=null && storageRVo.getStorageStatus() == 1){
                 //RFID设备报警
                 R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
                 log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
+            }else {
+                return 0;
             }
             Long id = storageRVo.getId();
             String key = RFID_CODE + electronicTag + id;

+ 8 - 8
zd-modules/zd-airbottle/src/main/resources/mapper/airbottle/QpAirGoogsMapper.xml

@@ -48,18 +48,18 @@
     <select id="selectQpAirGoogsList" parameterType="com.zd.airbottle.domain.QpAirGoogs" resultMap="QpAirGoogsResult">
         <include refid="selectQpAirGoogsListVo"/>
         <where>
-            <if test="goodsName != null  and goodsName != ''">and goods_name like concat('%', #{goodsName}, '%')</if>
-            <if test="searchValue != null  and searchValue != ''">and goods_name like concat('%', #{searchValue}, '%')
+            <if test="goodsName != null  and goodsName != ''">and t.goods_name like concat('%', #{goodsName}, '%')</if>
+            <if test="searchValue != null  and searchValue != ''">and t.goods_name like concat('%', #{searchValue}, '%')
             </if>
-            <if test="typeId != null ">and type_id = #{typeId}</if>
-            <if test="userId != null ">and user_id = #{userId}</if>
-            <if test="deptId != null ">and dept_id = #{deptId}</if>
-            <if test="deptName != null ">and dept_name = #{deptName}</if>
+            <if test="typeId != null ">and t.type_id = #{typeId}</if>
+            <if test="userId != null ">and t.user_id = #{userId}</if>
+            <if test="deptId != null ">and t.dept_id = #{deptId}</if>
+            <if test="deptName != null ">and t.dept_name = #{deptName}</if>
             <if test="startTime != null  and endTime">
-                and date_format( create_time, '%Y-%m-%d' ) BETWEEN #{startTime} AND #{endTime}
+                and date_format( t.create_time, '%Y-%m-%d' ) BETWEEN #{startTime} AND #{endTime}
             </if>
             <if test="ids !=null and ids.size>0">
-                and id in
+                and t.id in
                 <foreach item="id" collection="ids" open="(" separator="," close=")">
                     #{id}
                 </foreach>

+ 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(){
         try {
             String streamUrl = fireProperties.getStreamUrl();
-            if (streamUrl == null) {
-                log.error("=========调用产生异常:未配置流媒体地址============");
-                return;
+            if (streamUrl != null && !"".equals(streamUrl)) {
+                catchImage(streamUrl);
             }
-            catchImage();
+            //log.error("=========调用产生异常:未配置流媒体地址============");
         } catch (ServiceException | IOException e) {
             //异常回调,防止系统因异常问题被杀死
             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)) {
             grabber.start();
             String fileName = "test";

+ 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.MessagingException;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * mqtt配置
@@ -132,7 +129,8 @@ public class MqttConfig {
     @Bean
     @ServiceActivator(inputChannel = MQTT_OUTBOUND_CHANNEL)
     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.setDefaultTopic(defaultTopic);
         return messageHandler;
@@ -144,7 +142,8 @@ public class MqttConfig {
     @Bean
     public MessageProducer inbound() {
         // 可同时消费(订阅)多个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.setConverter(new DefaultPahoMessageConverter());
         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, GServer> serverMap = new ConcurrentHashMap<>();
     private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
+    private static final Integer cacheTime  = 30;
+    private static final Integer alarmTime  = 30;
     @Resource
     private RedisTemplate<String, HardwareRfid> redisTemplate;
     @Autowired
@@ -49,8 +51,11 @@ public class RfidClientImpl implements IService {
     @Override
     public void start(HardwareRfid hardwareRfid) {
         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门禁机】开始监听");
             subscribeServerHandler(hardwareRfid, server);
         } else {
@@ -155,18 +160,14 @@ public class RfidClientImpl implements IService {
                     int antId = logBaseEpcInfo.getAntId();
                     String epc = logBaseEpcInfo.getEpc();
                     if (Boolean.FALSE.equals(redisTemplate.hasKey(logBaseEpcInfo.getEpc() + antId))) {
-                        log.info("打印进入日志!");
                         //不存在缓存,设置间隔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(() -> {
-                            log.info("打印日志发送前日志");
                             InventoryTag tag = new InventoryTag();
                             BeanUtils.copyProperties(logBaseEpcInfo, tag);
                             HardwareRfidDto hardwareRfidDto = new HardwareRfidDto();
                             BeanUtils.copyProperties(hardwareRfid, hardwareRfidDto);
                             tag.setHardwareRfidDto(hardwareRfidDto);
-                            log.info("调用发送方法!发送内容 tag = {}",tag.toString());
                             sendService.send(tag);
                         });
                     } else {
@@ -455,7 +456,7 @@ public class RfidClientImpl implements IService {
             GClient client = clientMap.get(hardwareNum);
             synchronized (this) {
                 //设置开始报警、报警时长
-                return changeGpo(client, 1, 30);
+                return changeGpo(client, 1, alarmTime);
             }
         }
         return false;
@@ -473,40 +474,4 @@ public class RfidClientImpl implements IService {
             }
         }, 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
     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) {
             return ResultData.fail("设备编码已存在!");
         }
+        if (baseMapper.selectCount(new LambdaQueryWrapper<HardwareRfid>().eq(HardwareRfid::getPort, hardwareRfid.getPort())) > 0) {
+            return ResultData.fail("端口号已存在!");
+        }
         tokenService.getLoginUser().getSysUser();
         hardwareRfid.setCreateBy(SecurityUtils.getUsername());
         hardwareRfid.setUserId(SecurityUtils.getUserId());
@@ -63,9 +69,15 @@ public class HardwareRfidServiceImpl extends ServiceImpl<HardwareRfidMapper, Har
         if (hardwareRfid.getId() == null) {
             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) {
             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());
         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")
     @ApiOperation(value = "文字转语音小程序播放地址", notes = "文字转语音小程序播放地址")
     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);
         return AjaxResult.success(isTrue);
     }

+ 2 - 1
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java

@@ -341,6 +341,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
         logger.info("RFID 实时检测 RFIDCheck(标签编号): " + rfidCode);
         HxpStock hxpStock = hxpStockMapper.selectByRfidCode(rfidCode);
         if(hxpStock == null){
+            logger.info("RFID 实时检测 (标签未绑定化学品): " + rfidCode);
             return false;
         }
 
@@ -464,7 +465,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
                 List<HxpAlarmConfig> hxpAlarmConfigList = hxpAlarmConfigMapper.selectBySubId(3, hxpStock.getSubId());
                 // 2.最多五个步骤分别执行
                 if(CollectionUtils.isNotEmpty(hxpAlarmConfigList)){
-                    logger.error("实验室【"+subName+"】ID" + hxpStock.getSubId() +"执行用户短信通知!");
+                    logger.info("实验室【"+subName+"】ID" + hxpStock.getSubId() +"执行用户短信通知!");
 
                     Date date = DateUtil.offsetMinute(DateUtils.getNowDate(), Optional.ofNullable(dealTime).orElse(1));
 

+ 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="unLockVideo != null">#{unLockVideo},</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="createBy != null">#{createBy},</if>
             <if test="stockId != null">#{stockId},</if>

+ 2 - 2
zd-modules/zd-exam/src/main/java/com/zd/exam/controller/ElPointsRecordController.java

@@ -247,7 +247,7 @@ public class ElPointsRecordController extends BaseController {
     /**
      * 兑换机服务接口
      */
-    @PostMapping("/exchangeMachineService")
+    @RequestMapping("/exchangeMachineService")
     public Map<String,String> exchangeMachineService(@RequestParam Map<String,String> machineMap) {
         return pointsRecordService.exchangeMachineService(machineMap);
     }
@@ -255,7 +255,7 @@ public class ElPointsRecordController extends BaseController {
     /**
      * 兑换机消费奖励分兑换接口
      */
-    @PostMapping("/exchangePoints")
+    @RequestMapping("/exchangePoints")
     public AjaxResult exchangePoints(@RequestBody String objJson) {
         return AjaxResult.success(pointsRecordService.exchangePoints(objJson));
     }

+ 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}")
     public ResultData<List<Map<String,Object>>> getSpeakerBySub(
             @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));
     }
 
+    /**
+     * 根据实验室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));
+    }
+
 
     /**
      * 新增疏散硬件

+ 107 - 16
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java

@@ -4,6 +4,7 @@ import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.ReUtil;
 import com.zd.laboratory.api.entity.CabinetLock;
 import com.zd.laboratory.api.entity.CabinetV2Lock;
+import com.zd.laboratory.mqtt.service.impl.CommonSend;
 import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.utils.CRCCHECK;
@@ -32,6 +33,8 @@ public class DeviceRemoteController {
     private SocketService socketService;
     @Autowired
     private RedisService redisService;
+    @Autowired
+    private CommonSend commonSend;
 
     @Value("${sys.lockTimer:30}")
     private Integer lockTimer;
@@ -49,6 +52,15 @@ public class DeviceRemoteController {
 
     @PostMapping("/V2/openLock")
     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 relayCode = cabinetV2Lock.getRelayCode();
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
@@ -58,30 +70,73 @@ public class DeviceRemoteController {
             ops.flush();
             logger.info("柜锁开锁指令:" + instruct);
 
-            instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
-            Thread.sleep(500);
+            Thread.sleep(1000);
+//            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;
             Integer status;
             while (timer > 1){
 
                 ops.write(ReUtil.hexStringToByteArray(instruct));
                 ops.flush();
-                timer--;
+                timer-=2;
 
-                Thread.sleep(900);
+                Thread.sleep(1900);
                 status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
                 logger.info("柜锁开锁锁状态查询:" + instruct + ",开锁结果:" + status);
                 if(status != null && status == 1){
                     return ResultData.success("开锁成功");
                 }
             }
+
         } catch (Exception e) {
             e.printStackTrace();
             logger.error("柜锁连接失败:" + e.getMessage());
             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 +144,15 @@ public class DeviceRemoteController {
      */
     @PostMapping("/V2/closeLock")
     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();
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
 
@@ -99,20 +162,23 @@ public class DeviceRemoteController {
             logger.info("柜锁关锁指令:" + instruct);
             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();
+                timer-=2;
 
-            Thread.sleep(1600);
-            Integer status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
-            logger.info("柜锁关锁状态查询:" + instruct + ",关锁结果" + status);
-            if(status != null && status == 0){
-                return ResultData.success("关锁成功");
+                Thread.sleep(1900);
+                status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
+                logger.info("柜锁关锁状态查询:" + instruct + ",关锁结果" + status);
+                if(status != null && status == 0){
+                    return ResultData.success("关锁成功");
+                }
             }
+
 //            return ResultData.success("关锁成功");
         } catch (Exception e) {
             e.printStackTrace();
@@ -120,5 +186,30 @@ public class DeviceRemoteController {
             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("关锁失败");*/
     }
 }

+ 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);
 
     /**
+     * 根据实验室id查询喇叭列表
+     * @param subId
+     * @return
+     */
+    List<Map<String,Object>> selectListBySubId(@Param("subId") Long subId);
+
+    /**
      * 根据楼层查询设备列表
      * @param floorId
      * @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.mqtt.service.TerminalRouter;
 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.HexUtils;
 import com.zd.model.constant.CacheConstants;
 import com.zd.model.constant.MqttConstants;
 import com.zd.model.domain.R;
@@ -35,7 +35,8 @@ import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.*;
 
 import javax.annotation.Resource;
-import java.nio.charset.StandardCharsets;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -202,8 +203,9 @@ public class MqttConfig {
     @Bean
     @ServiceActivator(inputChannel = MQTT_OUTBOUND_CHANNEL)
     public MessageHandler mqttOutbound() {
+        int num = new Random().nextInt(998)+1;
         MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
-                producerClientId,
+                producerClientId +"_"+ num,
                 mqttClientFactory());
         messageHandler.setAsync(true);
         messageHandler.setDefaultTopic(defaultTopic);
@@ -217,8 +219,9 @@ public class MqttConfig {
      */
     @Bean
     public MessageProducer inbound() {
+        int num = new Random().nextInt(98)+1;
         // 可同时消费(订阅)多个Topic
-        adapter = new MqttPahoMessageDrivenChannelAdapter(consumerClientId, mqttClientFactory(), StringUtils.split(defaultTopic, ","));
+        adapter = new MqttPahoMessageDrivenChannelAdapter(consumerClientId+num, mqttClientFactory(), StringUtils.split(defaultTopic, ","));
         adapter.setCompletionTimeout(5000);
         adapter.setConverter(new DefaultPahoMessageConverter());
         adapter.setQos(2);
@@ -279,13 +282,25 @@ public class MqttConfig {
             public void handleMessage(Message<?> message) throws MessagingException {
                 MessageHeaders messageHeaders = message.getHeaders();
                 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();
                 if (receivedTopic.startsWith(devicePrefix)) {
                     if (receivedTopic.contains("788D4C6C6187ABC")) {
                         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);
                     JSONObject jsonObject = JSONObject.parseObject(messageStr);
                     jsonObject.put("deviceNo", topicEnd);
@@ -303,10 +318,18 @@ public class MqttConfig {
                     TerminalRouter.routerMap.get("HxpTerminalService").offLine(codeNum);
                 } else if (receivedTopic.startsWith(steerPublishPrefix)) {
 //                    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) {
                         String command = replaceMess.substring(8, 10);
                         //表示坨机成功
@@ -331,7 +354,7 @@ public class MqttConfig {
                             String relayCode = prefix[prefix.length - 1];
                             TerminalRouter.routerMap.get("HxpLockService").offLine(relayCode);
                         }
-                    }
+                    }*/
                 } else if (receivedTopic.startsWith(MqttConstants.TOPIC_FIRE_DEVICE_RECEIVE)) {
                     logger.info("消息处理器1开始处理=====");
                     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;
 
-import com.alibaba.fastjson.JSONObject;
 import com.zd.model.enums.HardwareOperate;
 import com.zd.common.core.utils.SpringUtils;
 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.mapper.LabHardwareMapper;
 import com.zd.laboratory.mqtt.MqttProducer;
 import com.zd.laboratory.mqtt.entiy.EquipmentStatus;
-import com.zd.laboratory.service.ILabHardwareService;
 import org.springframework.beans.factory.annotation.Autowired;
 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);
         //todo 到这里结束
         //发送事件
+        logger.info("采集器数据接收={}",JSON.toJSONString(subFunction));
         //本来使用mqtt接收,因为mqtt 每个客户端接受到都会处理,
         List<LabMessageEvent> labMessageEvents = mqttConfig.getLabMessMap().get(MqttConstants.TOPIC_LAB_FUNCTION_DATA);
         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());
-
-
-    }
-}

+ 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);
 
     /**
+     * 根据实验室id查询喇叭列表
+     * @param subId
+     * @return
+     */
+    List<Map<String,Object>> selectSpeakerBySubId(Long subId);
+
+    /**
      * 查询所有喇叭的数量
      * @Param []
      * @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);
         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){
                     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){
                         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());
+                            R r = remoteSpeakService.stopPlayMusic(map.get("deviceSn") + "", String.valueOf(map.get("deviceIp")));
                             log.info("关闭喇叭-疏散调用喇叭播放音乐返回信息:{}", JSON.toJSONString(r));
                         } else {
                             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]
      * @Return void
      **/
-    private void closeLoudSpeaker(Long subjectid, Long floorId, Long riskPlanId) {
+    private void closeLoudSpeaker(Long subjectId, Long floorId, Long riskPlanId) {
         //预案关闭喇叭
         try {
             //这里查询预案下的合成音乐
@@ -809,17 +809,17 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
             List<LabAudioSynthesis> audioSyntheses = labAudioSynthesisMapper.selectLabAudioSynthesisList(labAudioSynthesis);
             log.info("关闭喇叭-查询的音乐列表信息 audioSyntheses= {}", JSON.toJSONString(audioSyntheses));
             if (audioSyntheses != null && audioSyntheses.size() > 0) {
-                log.info("关闭喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectid);
+                log.info("关闭喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectId);
                 Integer count = labSparseHardwareService.selectSpeakerCount();
                 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));
                 if (deviceList.getCode() == 200) {
                     List<Map<String, Object>> mapList = (List<Map<String, Object>>) deviceList.getData();
                     for (Map<String, Object> map : mapList) {
                         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));
                         } else {
                             log.info("关闭喇叭deviceSn/port为空!");
@@ -1010,7 +1010,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
                 log.info("打开喇叭-远程调用查询喇叭列表,楼层id={},实验室id={}", floorId, subjectId);
                 Integer count = labSparseHardwareService.selectSpeakerCount();
                 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));
                 if (deviceList.getCode() == 200) {
                     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
+    public List<Map<String,Object>> selectSpeakerBySubId(Long subId) {
+        return labSparseHardwareMapper.selectListBySubId(subId);
+    }
+
+    @Override
     public Integer 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.SenseValVO;
 import com.zd.laboratory.config.HardwareFunctionStatusConfig;
+import com.zd.laboratory.config.TimeWaitConfigUtils;
 import com.zd.laboratory.domain.*;
 import com.zd.laboratory.domain.dto.LabSubListQuery;
 import com.zd.laboratory.domain.vo.*;
@@ -115,20 +116,21 @@ public class LabSubjectManagerService {
     private SocketService socketService;
     @Autowired
     private ILabControlService labControlService;
-
+    @Autowired
+    private TimeWaitConfigUtils timeWaitConfigUtils;
 
     public LabSubjectManagerService(List<ControlService> controlServices) {
         controlServiceMap = controlServices.stream().collect(Collectors.toMap(a -> a.comTypeEnums(), Function.identity()));
 
     }
 
-    @Async("labExecutor")
+//    @Async("labExecutor")
     public void operationHardware(FunctionStatus status, List<LabHardware> hardwareList) {
         try {
             logger.info("异步线程处理硬件信息:id={},name={}",Thread.currentThread().getId(),Thread.currentThread().getName());
             for (LabHardware hard : hardwareList) {
                 ResultData result = excutingComm(hard, status);
-                Thread.sleep(1000);
+                Thread.sleep(timeWaitConfigUtils.getWaitTime());
             }
         } catch (InterruptedException e) {
             logger.error("异步处理硬件异常!",e);

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

@@ -48,9 +48,10 @@ public class TCPServer implements Runnable {
         }*/
         // 设置连接超时90秒
         try {
-            socket.setSoTimeout(200000);
+            socket.setSoTimeout(212000);
             log.info("客户 - " + socket.getRemoteSocketAddress() + " -> 机连接成功");
             while (true) {
+                Thread.sleep(1L);
                 handle();
             }
         } catch (SocketException e) {
@@ -58,6 +59,8 @@ public class TCPServer implements Runnable {
             log.error("Socket异常: " + e.getMessage());
         } catch (IOException e) {
             log.error("Socket异常: " + e.getMessage());
+        } catch (InterruptedException e) {
+            log.error("Socket异常: " + e.getMessage());
         } finally {
             try {
                 if (!socket.isClosed()) {
@@ -73,6 +76,7 @@ public class TCPServer implements Runnable {
     private void handle() throws IOException {
 
         StringBuilder ret = new StringBuilder();
+//        InputStream in = socket.getInputStream();
 
         // 解析二进制数据
         BufferedInputStream bs = new BufferedInputStream(socket.getInputStream());

+ 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
     private CommonSend commonSend;
 
+    public String getSteerSubscriptPrefix() {
+        return steerSubscriptPrefix;
+    }
+
     @PostConstruct
     private void queryRelays(){
         relays = labRelayMapper.selectLabRelayList(new LabRelay());

+ 5 - 7
zd-modules/zd-modules-laboratory/src/main/resources/bootstrap.yml

@@ -12,15 +12,13 @@ mybatis:
   # 配置项
   configuration:
     # 配置日志打印
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: com.zd.common.core.utils.MySlf4jImpl #开启sql打印到info
     # Mybatis开启驼峰映射
     mapUnderscoreToCamelCase: true
 mybatis-plus:
   type-handlers-package: com.zd.model.enums
-  configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
+#  configuration:
+#    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志到控制台
+#    log-impl: com.zd.common.core.utils.MySlf4jImpl
 
-##日志
-logging:
-  level:
-    root: info

+ 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 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 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 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

+ 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)
         </if>
     </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  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

+ 25 - 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 java.io.IOException;
 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.stream.Collectors;
 
@@ -383,4 +380,28 @@ public class SysStudentController extends BaseController {
         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);
         List<SysUser> list = sysTeacherService.selectUserList(user);
-        teacherService.queryTeacherSuBCount(list);
+//        teacherService.queryTeacherSuBCount(list);
 
         List<SysUserTeaCherByExport> teacherList = new ArrayList<>();
         for (SysUser sysUser : list) {
@@ -306,4 +306,28 @@ public class SysTeacherController extends BaseController {
         }
         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)
     @GetMapping("/selectlist")
-    public ResultData selectlist(String nickName) {
+    public ResultData selectlist(String nickName,String userType) {
         if (StrUtil.isBlank(nickName)) return ResultData.success(new ArrayList<>());
         SysUser user = new SysUser();
         user.setNickName(nickName);
+        if(StringUtils.isNotNull(userType)){
+            user.setUserType(userType);
+        }
         List<SysUser> list = userService.selectUserList(user);
         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
      */
     public List<String> queryPhoneByIds(Long... ids);
+
+    /**
+     * 根据ID查询电话号码
+     * @param cardNums
+     * @return
+     */
+    public List<SysUser> queryCardNumByIds(String[] cardNums);
+
     /**
      * 查询人数通过部门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 结果
      */
     int editUserByDept(List <SysUser> userList);
+
+
+    /**
+     * 修改用户信息
+     * @param userList 用户信息列表
+     * @return 结果
+     */
+    Map <String, Object> updateCardNum(List<SysUser> userList);
 }

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

@@ -912,13 +912,13 @@ public class SysStudentServiceImpl implements ISysStudentService {
             }
             user.getFailRemark().append("姓名不能为空、");
         }else{
-            if(user.getNickName().length()>8){
+            if(user.getNickName().length()>50){
                 if(checkBox){
                     user.getFailRemark().append("失败:");
                     failSysUserList.add(user);
                     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.util.*;
+import java.util.concurrent.atomic.LongAdder;
+import java.util.function.Consumer;
 
 /**
  * 用户 业务层处理
@@ -432,6 +434,54 @@ public class SysTeacherServiceImpl implements ISysTeacherService {
         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("姓名不能为空、");
         }else{
-            if(user.getNickName().length()>8){
+            if(user.getNickName().length()>50){
                 if(checkBox){
                     user.getFailRemark().append("失败:");
                     failSysUserList.add(user);
                     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.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.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.education, u.user_type,sm.`major_name` major,
         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 != ''">
             AND u.card_num = #{cardNum}
         </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 != ''">
             AND u.user_type = #{userType}
         </if>
@@ -660,6 +668,15 @@
         </foreach>
         and length(phonenumber)=11
     </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 dept_id as id, count(dept_id ) as total from sys_user