hanzhiwei пре 2 година
родитељ
комит
c7e1b02b8d
15 измењених фајлова са 297 додато и 164 уклоњено
  1. 30 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/dto/LabHardwareDto.java
  2. 12 8
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLabHardwareService.java
  3. 5 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java
  4. 2 1
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLabHardwareFallbackFactory.java
  5. 5 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLaboratoryFallbackFactory.java
  6. 50 37
      zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/impl/AlarmRecordServiceImpl.java
  7. 108 95
      zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java
  8. 26 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/config/MybatisPlusConfig.java
  9. 12 7
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java
  10. 24 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubMangerController.java
  11. 2 2
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/event/RedisExpiredPhotographListener.java
  12. 3 3
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareMapper.java
  13. 3 2
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabHardwareService.java
  14. 2 2
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabHardwareServiceImpl.java
  15. 13 7
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml

+ 30 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/dto/LabHardwareDto.java

@@ -0,0 +1,30 @@
+package com.zd.laboratory.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Description 硬件信息DTO类
+ * @Author hzw
+ * @Date 2023/6/27 20:15
+ * @Version 2.0
+ */
+@Data
+public class LabHardwareDto implements Serializable {
+
+    private static final long serialVersionUID = 3991708930026430449L;
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+
+    /** ip地址 */
+    @ApiModelProperty(value = "ip地址")
+    private String ipAddress;
+
+}

+ 12 - 8
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLabHardwareService.java

@@ -1,11 +1,13 @@
 package com.zd.laboratory.api.feign;
 
+import com.zd.laboratory.api.dto.LabHardwareDto;
 import com.zd.laboratory.api.feign.fallback.RemoteSubQueryFallbackFactory;
 import com.zd.model.constant.ApplicationConstants;
 import com.zd.model.domain.ResultData;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * <p>类注释说明</p>
@@ -26,15 +28,17 @@ public interface RemoteLabHardwareService {
     ResultData list(@RequestParam("type") String type, @RequestParam("operate") String operate);
 
     /**
-     * 根据类型查询摄像头信息
+     * 根据类型查询硬件信息
      * @Param [subId 实验室id,
      *          type 设备类型(0,一体机 1,电源开关 2 智能通风,3,语音对讲,4,视频监控5,智能终端 6,智能门锁 ,7,RFID识别器,8,智能报警器,9,智能柜锁,11 海康门禁),
-     *          subType 子类型 摄像头类型:(0火焰算法 1穿戴识别 2违规带离抓拍)]
+     *          pcType '一体机类型:(管控一体机0  学习考试一体机1)   智能通风:(排风扇0, 通风橱1)
+     *          subType 子类型 摄像头类型:(0普通摄像头 1抓拍摄像头 2违规带离摄像头)]
      * @Return com.zd.laboratory.domain.LabHardware
      **/
-    @ApiOperation(value = "根据类型查询摄像头信息")
-    @GetMapping("/hardware/findCameraByType")
-    ResultData findCameraByType(@RequestParam("subId") Long subId,
-                                @RequestParam("type") Integer type,
-                                @RequestParam("subType") String subType);
+    @ApiOperation(value = "根据类型查询硬件信息")
+    @GetMapping("/hardware/findHardwareByType")
+    ResultData<LabHardwareDto> findHardwareByType(@RequestParam("subId") Long subId,
+                                                  @RequestParam("type") Integer type,
+                                                  @RequestParam(value = "pcType",required = false) Integer pcType,
+                                                  @RequestParam(value = "subType",required = false) String subType);
 }

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

@@ -19,6 +19,7 @@ import com.zd.model.entity.TotalByID;
 import com.zd.model.enums.HardwareOperate;
 import com.zd.model.page.TableDataInfo;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
@@ -567,4 +568,8 @@ public interface RemoteLaboratoryService {
     @GetMapping("/warningConfig/getByType")
     @ApiOperation("根据类型查询报警配置信息-预警类型(1算法识别 2化学品 3气瓶)")
     ResultData<WarningConfigDto> getByType(@RequestParam("type") Integer type);
+
+    @ApiOperation("控制设备打开关闭")
+    @PostMapping("/subject/manger/controlDevice/{id}/{command}")
+    ResultData controlDevice(@PathVariable("id") @ApiParam("设备ID") Long id ,@PathVariable("command") Integer command);
 }

+ 2 - 1
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLabHardwareFallbackFactory.java

@@ -1,5 +1,6 @@
 package com.zd.laboratory.api.feign.fallback;
 
+import com.zd.laboratory.api.dto.LabHardwareDto;
 import com.zd.laboratory.api.feign.RemoteLabHardwareService;
 import com.zd.model.domain.ResultData;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -30,7 +31,7 @@ public class RemoteLabHardwareFallbackFactory implements FallbackFactory<RemoteL
             }
 
             @Override
-            public ResultData findCameraByType(Long subId, Integer type, String subType) {
+            public ResultData<LabHardwareDto> findHardwareByType(Long subId, Integer type, Integer pcType, String subType) {
                 return ResultData.fail("请求失败!");
             }
         };

+ 5 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLaboratoryFallbackFactory.java

@@ -546,6 +546,11 @@ public class RemoteLaboratoryFallbackFactory implements FallbackFactory<RemoteLa
             public ResultData<WarningConfigDto> getByType(Integer type) {
                 return ResultData.fail("获取告警通知配置失败!"+ cause.getMessage());
             }
+
+            @Override
+            public ResultData controlDevice(Long id, Integer command) {
+                return ResultData.fail("控制设备失败!"+ cause.getMessage());
+            }
         };
     }
 }

+ 50 - 37
zd-modules/zd-airbottle/src/main/java/com/zd/airbottle/service/impl/AlarmRecordServiceImpl.java

@@ -21,6 +21,7 @@ import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.SpringUtils;
 import com.zd.common.core.utils.StringUtils;
 import com.zd.laboratory.api.dto.CheckSubjectDto;
+import com.zd.laboratory.api.dto.LabHardwareDto;
 import com.zd.laboratory.api.dto.WarningConfigDto;
 import com.zd.laboratory.api.dto.WarningNoticeLogDto;
 import com.zd.laboratory.api.entity.LabMessageContent;
@@ -93,9 +94,6 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
     private IQpAirBottleService qpAirBottleService;
 
     @Autowired
-    private IQpUsegasApplyService qpUsegasApplyService;
-
-    @Autowired
     private IQpQualificationApplyService qualificationApplyService;
 
     @Autowired
@@ -136,7 +134,7 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
         String electronicTag = alarmRecord.getElectronicTag();
         QpBottleStorageRVo storageRVo = storageService.getByElectronicTag(electronicTag);
         if (storageRVo != null) {
-            if (storageRVo.getStorageStatus() == 1){
+            if (storageRVo.getStorageStatus() == 1) {
                 // 查询配置
                 ResultData<WarningConfigDto> byType = laboratoryService.getByType(3);
                 if (HttpStatus.SUCCESS != byType.getCode()) {
@@ -180,11 +178,30 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
                 if (HttpStatus.SUCCESS != resultData.getCode()) {
                     return 0;
                 }
-                Long logId = (Long)resultData.getData();
-                if(illegalRemoval != null){
-                    String text = "【实验室安全系统】-实验人员违规X气携带气瓶离开房间,发生时间:"+ LocalDateTimeUtil.format(LocalDateTime.now(),"yyyy-MM-dd HH:mm:ss") +",请尽快确认。点击查看:"+"http://";
+                Long logId = (Long) resultData.getData();
+
+                //rfid门禁机报警
+                R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
+                log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
+
+                //摄像头录像
+                ResultData<LabHardwareDto> cameraHardware = remoteLabHardwareService.findHardwareByType(storageRVo.getSubjectId(), 4, null, "2");
+                if (HttpStatus.SUCCESS == cameraHardware.getCode()) {
+                    String ip = String.valueOf(cameraHardware.getData().getIpAddress());
+                    startVideo(ip);
+                    scheduledExecutorService.schedule(new TimerTask() {
+                        @Override
+                        public void run() {
+                            stopVideo(ip, logId);
+                        }
+                    }, 30, TimeUnit.SECONDS);
+                }
+                //按照配置预警
+                if (illegalRemoval != null) {
+                    String text = "【实验室安全系统】-实验人员违规X气携带气瓶离开房间,发生时间:" + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss") + ",请尽快确认。点击查看:" + "http://";
+
+                    //系统通知
                     if (illegalRemoval.contains("1")) {
-                        //系统通知
                         LabMessageContent labMessageContent = new LabMessageContent();
                         labMessageContent.setSendMode(2);
                         labMessageContent.setSendRange(3);
@@ -196,38 +213,37 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
                         remoteMessageContentService.sendMessage(labMessageContent);
 
                     }
+
+                    //短信通知
                     if (illegalRemoval.contains("2")) {
-                        //短信通知
-                        String[] strings = Stream.of(phones.toString().split(","))
-                                .filter(a -> StrUtil.isNotBlank(a))
-                                .collect(Collectors.joining(","))
-                                .split(",");
+
+                        String[] strings = Stream.of(phones.toString().split(",")).filter(a -> StrUtil.isNotBlank(a)).collect(Collectors.joining(",")).split(",");
 
                         if (strings != null) {
-                            AlarmEntrty alarmEntrty = new AlarmEntrty(Routes.NoticePush, strings,SendTypes.SMS.toString(),text);
+                            AlarmEntrty alarmEntrty = new AlarmEntrty(Routes.NoticePush, strings, SendTypes.SMS.toString(), text);
                             remoteAlarmService.send(alarmEntrty);
                             log.info("气瓶发送短信打电话消息推送完成!");
                         }
                     }
+
+                    //声光报警
                     if (hardwareRfidDto != null && illegalRemoval.contains("3")) {
-                        //声光报警
-                        R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
-                        log.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
-                    }
-                    // TODO 报警的同时传入摄像头ip
-                    ResultData result = remoteLabHardwareService.findCameraByType(storageRVo.getSubjectId(), 4, "2");
-                    if (HttpStatus.SUCCESS == result.getCode()) {
-                        String ip = String.valueOf(result.getData());
-                        startVideo(ip);
-                        scheduledExecutorService.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                stopVideo(ip,logId);
-                            }
-                        }, 30, TimeUnit.SECONDS);
+                        ResultData<LabHardwareDto> hardwareByType = remoteLabHardwareService.findHardwareByType(storageRVo.getSubjectId(), 8, null, null);
+                        if (HttpStatus.SUCCESS == hardwareByType.getCode()) {
+                            warningNoticeLogDto.setVoiceBroadcast(1);
+                            Long id = hardwareByType.getData().getId();
+                            laboratoryService.controlDevice(id, 1);
+                            scheduledExecutorService.schedule(new TimerTask() {
+                                @Override
+                                public void run() {
+                                    laboratoryService.controlDevice(id, 0);
+                                }
+                            }, 30, TimeUnit.SECONDS);
+                        }
                     }
+                    laboratoryService.updateWarningNoticeLog(warningNoticeLogDto);
                 }
-            }else {
+            } else {
                 return 0;
             }
             Long id = storageRVo.getId();
@@ -239,14 +255,11 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
             // 发送报警消息
             sendAlarm(storageRVo);
             redisService.setCacheObject(key, electronicTag, 300L, TimeUnit.SECONDS);
-            alarmRecord.setAlarmTime(Calendar.getInstance().getTime())
-                    .setMasterId(id)
-                    .setType(1)
-                    .setProductType(1);
+            alarmRecord.setAlarmTime(Calendar.getInstance().getTime()).setMasterId(id).setType(1).setProductType(1);
             return alarmRecordMapper.insertAlarmRecord(alarmRecord);
-        }else {
-            if (hardwareRfidDto!=null){
-                log.info("==================>{},{}",alarmRecord.getElectronicTag(),"标签无数据");
+        } else {
+            if (hardwareRfidDto != null) {
+                log.info("==================>{},{}", alarmRecord.getElectronicTag(), "标签无数据");
             }
         }
         return 0;

+ 108 - 95
zd-modules/zd-chemical/src/main/java/com/zd/chemical/service/impl/HxpStockServiceImpl.java

@@ -29,6 +29,7 @@ import com.zd.common.core.utils.DictUtils;
 import com.zd.common.core.utils.SaveUtil;
 import com.zd.common.core.utils.SecurityUtils;
 import com.zd.laboratory.api.dto.CheckSubjectDto;
+import com.zd.laboratory.api.dto.LabHardwareDto;
 import com.zd.laboratory.api.dto.WarningConfigDto;
 import com.zd.laboratory.api.dto.WarningNoticeLogDto;
 import com.zd.laboratory.api.entity.LabMessageContent;
@@ -355,18 +356,17 @@ public class HxpStockServiceImpl implements IHxpStockService {
     @Override
     public synchronized boolean RFIDCheck(InventoryTag tag) {
         String rfidCode = tag.getEpc();
-        if(StringUtils.isBlank(rfidCode)){
+        if (StringUtils.isBlank(rfidCode)) {
             return false;
         }
         Date d = cacheMap.get(rfidCode);
-        if(d != null && DateUtil.compare(DateUtil.offsetSecond(d, interval), DateUtils.getNowDate()) > 0){
+        if (d != null && DateUtil.compare(DateUtil.offsetSecond(d, interval), DateUtils.getNowDate()) > 0) {
             return false;
         }
 
-
         logger.info("RFID 实时检测 RFIDCheck(标签编号): " + rfidCode);
         HxpStock hxpStock = hxpStockMapper.selectByRfidCode(rfidCode);
-        if(hxpStock == null){
+        if (hxpStock == null) {
             logger.info("RFID 实时检测 (标签未绑定化学品): " + rfidCode);
             return false;
         }
@@ -374,10 +374,10 @@ public class HxpStockServiceImpl implements IHxpStockService {
 
         // 查询该库存数据是否处于领用状态
         HxpUserecord hxpUserecord = hxpUserecordMapper.selectByStockId(hxpStock.getId());
-        if(hxpUserecord != null){
+        if (hxpUserecord != null) {
             logger.info("RFID 化学品正常使用中: " + JSONUtil.toJsonStr(hxpUserecord));
             return false;
-        }else {
+        } else {
             logger.info("RFID 检测到违规触发报警: " + JSONUtil.toJsonStr(hxpStock));
             //触发RFID警报
             HardwareRfidDto hardwareRfidDto = tag.getHardwareRfidDto();
@@ -391,116 +391,129 @@ public class HxpStockServiceImpl implements IHxpStockService {
                 WarningConfigDto warningConfigDto = byType.getData();
                 String illegalRemoval = warningConfigDto.getIllegalRemoval();
 
-                WarningNoticeLogDto warningNoticeLogDto = new WarningNoticeLogDto();
-                warningNoticeLogDto.setKeyId(hxpStock.getId());
-                warningNoticeLogDto.setName(hxpStock.getChemicalName());
-                warningNoticeLogDto.setWarningType(2);
-                warningNoticeLogDto.setWarningSubType(1);
-                warningNoticeLogDto.setWarningContent("化学品违规带离");
-                warningNoticeLogDto.setWarningTime(LocalDateTime.now());
-                warningNoticeLogDto.setWarningWay(illegalRemoval);
-                warningNoticeLogDto.setMargin(hxpStock.getOutUsages());
-                warningNoticeLogDto.setDeposit(hxpStock.getCabinetName());
-                warningNoticeLogDto.setSpecification(hxpChemicalJoinCabinet.getChemicalAmount() + hxpChemicalJoinCabinet.getChemicalAmountUnit());
+            WarningNoticeLogDto warningNoticeLogDto = new WarningNoticeLogDto();
+            warningNoticeLogDto.setKeyId(hxpStock.getId());
+            warningNoticeLogDto.setName(hxpStock.getChemicalName());
+            warningNoticeLogDto.setWarningType(2);
+            warningNoticeLogDto.setWarningSubType(1);
+            warningNoticeLogDto.setWarningContent("化学品违规带离");
+            warningNoticeLogDto.setWarningTime(LocalDateTime.now());
+            warningNoticeLogDto.setWarningWay(illegalRemoval);
+            warningNoticeLogDto.setMargin(hxpStock.getOutUsages());
+            warningNoticeLogDto.setDeposit(hxpStock.getCabinetName());
+            warningNoticeLogDto.setSpecification(hxpChemicalJoinCabinet.getChemicalAmount() + hxpChemicalJoinCabinet.getChemicalAmountUnit());
 
-                //查询到实验室负责人id 安全责任人id
-                ResultData<List<CheckSubjectDto>> subjectInfoList = remoteLaboratoryService.findSubjectInfoList(String.valueOf(hxpStock.getSubId()));
-                StringBuffer userIdStr = new StringBuffer();
-                StringBuffer phones = new StringBuffer();
-                if (HttpStatus.SUCCESS == subjectInfoList.getCode()) {
-                    List<CheckSubjectDto> data = subjectInfoList.getData();
-                    CheckSubjectDto i = data.get(0);
-                    warningNoticeLogDto.setSubId(i.getSubId());
-                    warningNoticeLogDto.setSubName(i.getSubjectName());
-                    warningNoticeLogDto.setBuildName(i.getBuildName());
-                    warningNoticeLogDto.setFloorId(i.getFloorId());
-                    warningNoticeLogDto.setFloorName(i.getFloorName());
-                    warningNoticeLogDto.setRoomNum(i.getRoomNumber());
-                    userIdStr.append(i.getSafeUserId()).append(",").append(i.getAdminId());
-                    phones.append(i.getAdminPhone()).append(",").append(i.getSafeUserPhone());
-                }
-                ResultData resultData = remoteLaboratoryService.addWarningNoticeLog(warningNoticeLogDto);
-                if (HttpStatus.SUCCESS != resultData.getCode()) {
-                    return false;
-                }
-                Long logId = (Long)resultData.getData();
-                if(illegalRemoval != null){
-                    ResultData urlScheme = remoteMessageService.getUrlScheme(logId);
-                    if(urlScheme.getCode() != HttpStatus.SUCCESS){
-                        logger.error("获取urlScheme失败!");
+            //查询到实验室负责人id 安全责任人id
+            ResultData<List<CheckSubjectDto>> subjectInfoList = remoteLaboratoryService.findSubjectInfoList(String.valueOf(hxpStock.getSubId()));
+            StringBuffer userIdStr = new StringBuffer();
+            StringBuffer phones = new StringBuffer();
+            if (HttpStatus.SUCCESS == subjectInfoList.getCode()) {
+                List<CheckSubjectDto> data = subjectInfoList.getData();
+                CheckSubjectDto i = data.get(0);
+                warningNoticeLogDto.setSubId(i.getSubId());
+                warningNoticeLogDto.setSubName(i.getSubjectName());
+                warningNoticeLogDto.setBuildName(i.getBuildName());
+                warningNoticeLogDto.setFloorId(i.getFloorId());
+                warningNoticeLogDto.setFloorName(i.getFloorName());
+                warningNoticeLogDto.setRoomNum(i.getRoomNumber());
+                userIdStr.append(i.getSafeUserId()).append(",").append(i.getAdminId());
+                phones.append(i.getAdminPhone()).append(",").append(i.getSafeUserPhone());
+            }
+            ResultData resultData = remoteLaboratoryService.addWarningNoticeLog(warningNoticeLogDto);
+            if (HttpStatus.SUCCESS != resultData.getCode()) {
+                return false;
+            }
+            Long logId = (Long) resultData.getData();
+            //rfid报警通知
+            R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
+            logger.info("==================>{},{}", alarm.getCode(), alarm.getMsg());
+            //视频录制
+            ResultData<LabHardwareDto> cameraHardware = remoteLabHardwareService.findHardwareByType(hxpStock.getSubId(), 4, null, "2");
+            if (HttpStatus.SUCCESS == cameraHardware.getCode()) {
+                String ip = cameraHardware.getData().getIpAddress();
+                startVideo(ip);
+                scheduledExecutorService.schedule(new TimerTask() {
+                    @Override
+                    public void run() {
+                        stopVideo(ip, logId);
                     }
-                    String text = "【实验室安全系统】"+warningNoticeLogDto.getSubName()+"-实验人员违规携带"+warningNoticeLogDto.getName()+"离开房间,发生时间:"+LocalDateTimeUtil.format(LocalDateTime.now(),"yyyy-MM-dd HH:mm:ss")+",请尽快确认。点击查看:https://lab.zjznai.com/labAppTest/earlyWarning/index.html?id="+logId +"&urlScheme="+urlScheme.getData();
-                    if (illegalRemoval.contains("1")) {
-                        //系统通知
-                        LabMessageContent labMessageContent = new LabMessageContent();
-                        labMessageContent.setSendMode(2);
-                        labMessageContent.setSendRange(3);
-                        labMessageContent.setMessClass(1);
-                        labMessageContent.setMessType(13);
-                        labMessageContent.setSubIds(String.valueOf(hxpStock.getSubId()));
-                        labMessageContent.setUserIds(userIdStr.toString());
-                        labMessageContent.setContent(text);
-                        remoteMessageContentService.sendMessage(labMessageContent);
+                }, 30, TimeUnit.SECONDS);
+            }
 
-                    }
-                    if (illegalRemoval.contains("2")) {
-                        //短信通知
-                        String[] strings = Stream.of(phones.toString().split(","))
-                                .filter(a -> StrUtil.isNotBlank(a))
-                                .collect(Collectors.joining(","))
-                                .split(",");
+            //按照配置预警
+            if (illegalRemoval != null) {
+                ResultData urlScheme = remoteMessageService.getUrlScheme(logId);
+                if (urlScheme.getCode() != HttpStatus.SUCCESS) {
+                    logger.error("获取urlScheme失败!");
+                }
+                String text = "【实验室安全系统】" + warningNoticeLogDto.getSubName() + "-实验人员违规携带" + warningNoticeLogDto.getName() + "离开房间,发生时间:" + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss") + ",请尽快确认。点击查看:https://lab.zjznai.com/labAppTest/earlyWarning/index.html?id=" + logId + "&urlScheme=" + urlScheme.getData();
+                //系统通知
+                if (illegalRemoval.contains("1")) {
+                    LabMessageContent labMessageContent = new LabMessageContent();
+                    labMessageContent.setSendMode(2);
+                    labMessageContent.setSendRange(3);
+                    labMessageContent.setMessClass(1);
+                    labMessageContent.setMessType(13);
+                    labMessageContent.setSubIds(String.valueOf(hxpStock.getSubId()));
+                    labMessageContent.setUserIds(userIdStr.toString());
+                    labMessageContent.setContent(text);
+                    remoteMessageContentService.sendMessage(labMessageContent);
 
-                        if (strings != null) {
-                            AlarmEntrty alarmEntrty = new AlarmEntrty(Routes.NoticePush, strings, SendTypes.SMS.toString(),text);
-                            remoteAlarmService.send(alarmEntrty);
-                            logger.info("化学品违规带离发送短信打电话消息推送完成!");
-                        }
-                    }
-                    if (hardwareRfidDto!=null && illegalRemoval.contains("3")) {
-                        //声光报警
-                        R<Boolean> alarm = remoteRfidService.alarm(hardwareRfidDto);
-                        logger.info("==================>{},{}",alarm.getCode(),alarm.getMsg());
+                }
+
+                //短信通知
+                if (illegalRemoval.contains("2")) {
+                    String[] strings = Stream.of(phones.toString().split(",")).filter(a -> StrUtil.isNotBlank(a)).collect(Collectors.joining(",")).split(",");
+                    if (strings != null) {
+                        AlarmEntrty alarmEntrty = new AlarmEntrty(Routes.NoticePush, strings, SendTypes.SMS.toString(), text);
+                        remoteAlarmService.send(alarmEntrty);
+                        logger.info("化学品违规带离发送短信打电话消息推送完成!");
                     }
-                    ResultData result = remoteLabHardwareService.findCameraByType(hxpStock.getSubId(), 4, "2");
-                    if (HttpStatus.SUCCESS == result.getCode()) {
-                        String ip = String.valueOf(result.getData());
-                        startVideo(ip);
+                }
+                if (hardwareRfidDto != null && illegalRemoval.contains("3")) {
+                    ResultData<LabHardwareDto> hardwareByType = remoteLabHardwareService.findHardwareByType(hxpStock.getSubId(), 8, null, null);
+                    if (HttpStatus.SUCCESS == hardwareByType.getCode()) {
+                        warningNoticeLogDto.setVoiceBroadcast(1);
+                        Long id = hardwareByType.getData().getId();
+                        remoteLaboratoryService.controlDevice(id, 1);
                         scheduledExecutorService.schedule(new TimerTask() {
                             @Override
                             public void run() {
-                                stopVideo(ip,logId);
+                                remoteLaboratoryService.controlDevice(id, 0);
                             }
                         }, 30, TimeUnit.SECONDS);
                     }
                 }
+                remoteLaboratoryService.updateWarningNoticeLog(warningNoticeLogDto);
+            }
             // 如果非领用状态,做报警台账
             // 0.检测实验室声光报警器是否使用- 使用则直接调用触发- 否则跳过
-            Map<String,Object> subInfo = hxpUserecordMapper.selectSubInfoById(hxpStock.getSubId());
+            Map<String, Object> subInfo = hxpUserecordMapper.selectSubInfoById(hxpStock.getSubId());
             String subName = "";
             String safeUserId = "";
-            if(subInfo != null){
-                subName = subInfo.get("name")==null?"":String.valueOf(subInfo.get("name"));
-                safeUserId = subInfo.get("safeUserId")==null?"":String.valueOf(subInfo.get("safeUserId"));
+            if (subInfo != null) {
+                subName = subInfo.get("name") == null ? "" : String.valueOf(subInfo.get("name"));
+                safeUserId = subInfo.get("safeUserId") == null ? "" : String.valueOf(subInfo.get("safeUserId"));
             }
 
             String terminalNum;
             HxpAlarmRecord hxpAlarmRecord;
             Integer dealTime = 0;
             List<Map<String, Object>> terminalList = hxpSmartTerminalMapper.selectTerminalBySubId(8, hxpStock.getSubId());
-            if(CollectionUtils.isEmpty(terminalList)){
-                logger.info("实验室【"+subName+"】ID" + hxpStock.getSubId() +"未设置或启用声光报警器!");
-            }else {
+            if (CollectionUtils.isEmpty(terminalList)) {
+                logger.info("实验室【" + subName + "】ID" + hxpStock.getSubId() + "未设置或启用声光报警器!");
+            } else {
                 Map<String, Object> smartTerminal = terminalList.get(0);
                 terminalNum = String.valueOf(smartTerminal.get("hardwareNum"));
                 dealTime = (Integer) smartTerminal.get("dealTime");
                 // 执行声光报警器动作触发
-                remoteLaboratoryService.controlByInside(Long.parseLong(smartTerminal.get("id")+"") , "01");
+                remoteLaboratoryService.controlByInside(Long.parseLong(smartTerminal.get("id") + ""), "01");
                 isAlarm = true;
 
 
                 // 默认一个实验室只触发一个报警器
                 hxpAlarmRecord = new HxpAlarmRecord();
-                hxpAlarmRecord.setAlarmContent("未领用即携带化学品离开实验室【"+subName+"】," + "化学品("+hxpStock.getChemicalName()+"), 请尽快确认!");
+                hxpAlarmRecord.setAlarmContent("未领用即携带化学品离开实验室【" + subName + "】," + "化学品(" + hxpStock.getChemicalName() + "), 请尽快确认!");
                 hxpAlarmRecord.setAlarmType(2);
                 hxpAlarmRecord.setHasValid(1);
                 hxpAlarmRecord.setAlarmMode(2);
@@ -514,7 +527,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
 
                 Long recordId = hxpAlarmRecord.getId();
                 // 控制响铃时长
-                if(smartTerminal.get("ringTime") != null){
+                if (smartTerminal.get("ringTime") != null) {
                     ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
                     executorService.schedule(new Runnable() {
                         @Override
@@ -527,7 +540,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
                             hxpAlarmRecord1.setHandlingUserId(-2L);
                             hxpAlarmRecordMapper.updateHxpAlarmRecord(hxpAlarmRecord1);
 
-                            remoteLaboratoryService.controlByInside(Long.parseLong(smartTerminal.get("id")+"") , "00");
+                            remoteLaboratoryService.controlByInside(Long.parseLong(smartTerminal.get("id") + ""), "00");
                         }
                     }, Long.parseLong(smartTerminal.get("ringTime") + ""), TimeUnit.SECONDS);
                 }
@@ -535,7 +548,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
 
 
             // 报警通知演示临时通知给实验室管理员  phones
-            Long recordId = sendPhoneAlarm(hxpStock.getId(),hxpStock.getSubId(), subName, hxpStock.getChemicalName(), subInfo.get("phones") + "");
+            Long recordId = sendPhoneAlarm(hxpStock.getId(), hxpStock.getSubId(), subName, hxpStock.getChemicalName(), subInfo.get("phones") + "");
 
             cacheMap.put(rfidCode, DateUtils.getNowDate());
 
@@ -543,11 +556,11 @@ public class HxpStockServiceImpl implements IHxpStockService {
             Map<String, Object> msgData = new HashMap<>();
             msgData.put("sendRange", 3);
             msgData.put("messClass", -1);
-            msgData.put("content", "系统检测到:化学品【" + hxpStock.getChemicalName() + "】,未领用被带离实验室【"+subName+"】,请您确认!");
+            msgData.put("content", "系统检测到:化学品【" + hxpStock.getChemicalName() + "】,未领用被带离实验室【" + subName + "】,请您确认!");
 
             List<Map<String, Object>> userMsgList = new ArrayList<>();
 
-            if(StringUtils.isNotBlank(safeUserId)){
+            if (StringUtils.isNotBlank(safeUserId)) {
                 String[] userIds = safeUserId.split(",");
                 Map<String, Object> userMsg;
                 for (String userId : userIds) {
@@ -563,18 +576,18 @@ public class HxpStockServiceImpl implements IHxpStockService {
 
             // 需求变动内容:未领用即携带化学品离开房间报警时,如实验室安全责任人通过化学品终端或PC管理后台操作处理,状态更改为已处理,报警流程终止
             // 保证逻辑严谨,数据必须进行强关联
-            if(recordId != null){
+            if (recordId != null) {
                 // 1.查询标签所属实验室院系报警配置流程处理
                 List<HxpAlarmConfig> hxpAlarmConfigList = hxpAlarmConfigMapper.selectBySubId(3, hxpStock.getSubId());
                 // 2.最多五个步骤分别执行
-                if(CollectionUtils.isNotEmpty(hxpAlarmConfigList)){
-                    logger.info("实验室【"+subName+"】ID" + hxpStock.getSubId() +"执行用户短信通知!");
+                if (CollectionUtils.isNotEmpty(hxpAlarmConfigList)) {
+                    logger.info("实验室【" + subName + "】ID" + hxpStock.getSubId() + "执行用户短信通知!");
 
                     Date date = DateUtil.offsetMinute(DateUtils.getNowDate(), Optional.ofNullable(dealTime).orElse(1));
 
                     for (HxpAlarmConfig hxpAlarmConfig : hxpAlarmConfigList) {
                         hxpAlarmRecord = new HxpAlarmRecord();
-                        hxpAlarmRecord.setAlarmContent("未领用即携带化学品离开实验室【"+subName+"】," + "化学品("+hxpStock.getChemicalName()+"),请尽快确认!");
+                        hxpAlarmRecord.setAlarmContent("未领用即携带化学品离开实验室【" + subName + "】," + "化学品(" + hxpStock.getChemicalName() + "),请尽快确认!");
                         hxpAlarmRecord.setAlarmType(2);
                         hxpAlarmRecord.setAlarmMode(3);
                         hxpAlarmRecord.setHasValid(0);
@@ -592,7 +605,7 @@ public class HxpStockServiceImpl implements IHxpStockService {
                         hxpAlarmRecordMapper.insertHxpAlarmRecord(hxpAlarmRecord);
                     }
                 }
-            }else {
+            } else {
                 logger.error("通知升级功能异常");
             }
 

+ 26 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/config/MybatisPlusConfig.java

@@ -0,0 +1,26 @@
+package com.zd.laboratory.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * <p>MybatisPlus配置</p>
+ *
+ * @author: linft
+ * @date: 2023/4/14
+ * @since:
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        //分页插件
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 12 - 7
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java

@@ -12,6 +12,7 @@ import com.zd.common.core.utils.ExcelUtil;
 import com.zd.common.core.utils.SecurityUtils;
 import com.zd.common.core.utils.TransferUtils;
 import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.api.dto.LabHardwareDto;
 import com.zd.laboratory.api.entity.FunctionStatus;
 import com.zd.laboratory.api.vo.HardwareCVO;
 import com.zd.laboratory.domain.LabHardware;
@@ -510,18 +511,22 @@ public class LabHardwareController extends BaseController {
     }
 
     /**
-     * 根据类型查询摄像头信息
+     * 根据类型查询硬件信息
      * @Param [subId 实验室id,
      *          type 设备类型(0,一体机 1,电源开关 2 智能通风,3,语音对讲,4,视频监控5,智能终端 6,智能门锁 ,7,RFID识别器,8,智能报警器,9,智能柜锁,11 海康门禁),
-     *          pcType 摄像头类型:(0普通摄像头 1抓拍摄像头 2违规带离摄像头)]
+     *          pcType '一体机类型:(管控一体机0  学习考试一体机1)   智能通风:(排风扇0, 通风橱1)
+     *          subType 子类型 摄像头类型:(0普通摄像头 1抓拍摄像头 2违规带离摄像头)]
      * @Return com.zd.model.domain.ResultData
      **/
-    @RequestMapping("/findCameraByType")
-    public ResultData findCameraByType(@RequestParam("subId") Long subId,
+    @RequestMapping("/findHardwareByType")
+    public ResultData<LabHardwareDto> findCameraByType(@RequestParam("subId") Long subId,
                                        @RequestParam("type") Integer type,
-                                       @RequestParam("subType") String subType) {
-        LabHardware labHardware = labHardwareService.findCameraByType(subId, type, subType);
-        return ResultData.success(labHardware.getIpAddress());
+                                       @RequestParam(value = "pcType",required = false) Integer pcType,
+                                       @RequestParam(value = "subType",required = false) String subType) {
+        LabHardwareDto labHardwareDto = new LabHardwareDto();
+        LabHardware labHardware = labHardwareService.findHardwareByType(subId, type, pcType, subType);
+        BeanUtils.copyProperties(labHardware, labHardwareDto);
+        return ResultData.success(labHardwareDto);
     }
 
     /***

+ 24 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubMangerController.java

@@ -8,6 +8,7 @@ import com.zd.common.core.web.controller.BaseController;
 import com.zd.common.swagger.config.Knife4jConfiguration;
 import com.zd.laboratory.api.entity.LabSubjectControllerVO;
 import com.zd.laboratory.domain.dto.LabSubListQuery;
+import com.zd.laboratory.domain.vo.LabHardwareVO;
 import com.zd.laboratory.domain.vo.LabSubjectVO;
 import com.zd.laboratory.event.OnecStatusEvent;
 import com.zd.laboratory.mapper.LabSubjectAccessRecordMapper;
@@ -23,6 +24,7 @@ import com.zd.model.domain.per.PerFun;
 import com.zd.model.domain.per.PerPrefix;
 import com.zd.model.entity.TotalByID;
 import com.zd.model.enums.HardwareOperate;
+import com.zd.model.enums.HardwareTypeEnum;
 import com.zd.model.page.TableDataInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -32,6 +34,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -138,6 +141,27 @@ public class LabSubMangerController extends BaseController {
         return ResultData.success(list);
     }
 
+    /**
+     * 控制设备打开关闭
+     *
+     * @return
+     */
+    @ApiOperation("控制设备打开关闭")
+    @PostMapping("/controlDevice/{id}/{command}")
+    public ResultData controlDevice(@PathVariable("id") @ApiParam("设备ID") Long id ,@PathVariable("command") Integer command) {
+        //通过设备编号获取设备详细信息
+        LabHardwareVO labHardwareVO = labHardwareService.selectLabHardwareById(id);
+        Symbol.command com = Symbol.command.open;
+        if(command == null || command == 0){
+            com = Symbol.command.close;
+        }
+        if(Objects.nonNull(labHardwareVO) && HardwareTypeEnum.AI_ALARM.equals(labHardwareVO.getType())){
+            return alarmControl(id, com);
+        }
+        return ResultData.fail("电源控制失败!");
+    }
+
+
 
     /**
      * 控制设备开关

+ 2 - 2
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/event/RedisExpiredPhotographListener.java

@@ -120,7 +120,7 @@ public class RedisExpiredPhotographListener extends KeyExpirationEventMessageLis
             String[] keyStr = key.split("~");
             WarningNoticeLog warningNoticeLog = JSON.parseObject(JSON.toJSONString(JSON.parseObject(keyStr[1]).getJSONObject(BaseConstants.PHOTOGRAPH_QUEUE)), WarningNoticeLog.class);
             //调用拍摄照片接口
-            LabHardware labHardware = labHardwareService.findCameraByType(warningNoticeLog.getSubId(), 4, "1");
+            LabHardware labHardware = labHardwareService.findHardwareByType(warningNoticeLog.getSubId(), 4, null,"1");
             if (labHardware != null && StringUtils.isNotBlank(labHardware.getIpAddress())) {
                 //拼装StreamUrl
                 String streamUrl = StrUtil.format(streamUrlFormat,labHardware.getIpAddress());
@@ -233,7 +233,7 @@ public class RedisExpiredPhotographListener extends KeyExpirationEventMessageLis
                         }
                     }
                     if (warningConfig.getVoiceNotcie() != null && count1 > warningConfig.getVoiceNotcie()) {
-                        //短信通知
+                        //语音播报
                         log.info("打开喇叭-远程调用查询喇叭列表,实验室id={}", warningNoticeLog.getSubId());
                         Integer count = labSparseHardwareService.selectSpeakerCount();
                         R deviceList = remoteSpeakService.getDeviceList(1, count + 10, -99L, warningNoticeLog.getSubId());

+ 3 - 3
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareMapper.java

@@ -174,9 +174,9 @@ public interface LabHardwareMapper {
     String selectLabHardwareCameraBySubId(Long subId);
 
     /**
-     * 根据类型查询摄像头信息
-     * @Param [subId, type, subType]
+     * 根据类型查询硬件信息
+     * @Param [subId, type, pcType, subType]
      * @Return com.zd.laboratory.domain.LabHardware
      **/
-    LabHardware findCameraByType(@Param("subId") Long subId, @Param("type") Integer type, @Param("subType") String subType);
+    LabHardware findHardwareByType(@Param("subId") Long subId, @Param("type") Integer type, @Param("pcType") Integer pcType, @Param("subType") String subType);
 }

+ 3 - 2
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabHardwareService.java

@@ -182,11 +182,12 @@ public interface ILabHardwareService {
     String selectLabHardwareCameraBySubId(Long subId);
 
     /**
-     * 根据类型查询摄像头信息
+     * 根据类型查询硬件信息
      * @Param [subId 实验室id,
      *          type 设备类型(0,一体机 1,电源开关 2 智能通风,3,语音对讲,4,视频监控5,智能终端 6,智能门锁 ,7,RFID识别器,8,智能报警器,9,智能柜锁,11 海康门禁),
+     *          pcType '一体机类型:(管控一体机0  学习考试一体机1)   智能通风:(排风扇0, 通风橱1)
      *          subType 子类型 摄像头类型:(0普通摄像头 1抓拍摄像头 2违规带离摄像头)]
      * @Return com.zd.laboratory.domain.LabHardware
      **/
-    LabHardware findCameraByType(Long subId, Integer type, String subType);
+    LabHardware findHardwareByType(Long subId, Integer type, Integer pcType, String subType);
 }

+ 2 - 2
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabHardwareServiceImpl.java

@@ -854,7 +854,7 @@ public class LabHardwareServiceImpl implements ILabHardwareService {
     }
 
     @Override
-    public LabHardware findCameraByType(Long subId, Integer type, String subType) {
-        return labHardwareMapper.findCameraByType(subId,type,subType);
+    public LabHardware findHardwareByType(Long subId, Integer type, Integer pcType, String subType) {
+        return labHardwareMapper.findHardwareByType(subId,type,pcType,subType);
     }
 }

+ 13 - 7
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml

@@ -600,14 +600,20 @@
         SELECT GROUP_CONCAT(lh.hardware_num) FROM lab_hardware lh where lh.subject_id = #{subId} and lh.type = 4 and lh.device_status=1
     </select>
 
-    <select id="findCameraByType" resultMap="LabHardwareResult">
+    <select id="findHardwareByType" resultMap="LabHardwareResult">
         SELECT lh.*
         FROM lab_hardware lh
-        where lh.ip_address is not null
-        and lh.subject_id = #{subId}
-        and lh.type = #{type}
-        and FIND_IN_SET(#{subType},lh.sub_type)
-        order by create_time desc
-        limit 1
+        <where>
+            lh.subject_id = #{subId}
+            and lh.type = #{type}
+            <if test="pcType != null">
+                and lh.pc_type = #{pcType}
+            </if>
+            <if test="subType != null">
+                and FIND_IN_SET(#{subType},lh.sub_type)
+            </if>
+            order by create_time desc
+            limit 1
+        </where>
     </select>
 </mapper>