Parcourir la source

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

xuxiaofei il y a 3 ans
Parent
commit
b0fbef23d1
76 fichiers modifiés avec 4205 ajouts et 152 suppressions
  1. 1 1
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/conf/UserSetup.java
  2. 32 36
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/media/zlm/ZLMHttpHookListener.java
  3. 51 49
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/gb28181/play/PlayController.java
  4. 19 20
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/log/LogController.java
  5. 1 3
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/onvif/ONVIFController.java
  6. 1 3
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/server/ServerController.java
  7. 1 6
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/streamProxy/StreamProxyController.java
  8. 0 2
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/web/ApiCompatibleController.java
  9. 6 17
      zd-modules/zd-base/src/main/java/com/zd/base/files/ueditor/ConfigManager.java
  10. 8 9
      zd-modules/zd-exam/src/main/java/com/zd/exam/service/impl/ElResourcesServiceImpl.java
  11. 29 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/config/TimeWaitConfigUtils.java
  12. 113 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabBuildFloorController.java
  13. 86 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabBuildFloorLayoutController.java
  14. 109 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabExitLineVertexController.java
  15. 57 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabExitPointRelayController.java
  16. 43 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeContentController.java
  17. 43 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeGroupController.java
  18. 45 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeModeController.java
  19. 58 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeSendmodeController.java
  20. 11 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectController.java
  21. 42 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabBuildFloor.java
  22. 50 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabBuildFloorLayout.java
  23. 51 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabExitLineVertex.java
  24. 55 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabExitPointRelay.java
  25. 42 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeContent.java
  26. 35 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeGroup.java
  27. 31 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeMode.java
  28. 31 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeSendmode.java
  29. 40 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildFloorLayoutVo.java
  30. 25 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildFloorPage.java
  31. 22 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildFloorVo.java
  32. 33 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildList.java
  33. 32 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildListVo.java
  34. 41 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabExitLineEvacuationVo.java
  35. 43 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabExitLineJoinPointVO.java
  36. 59 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabExitLineVertexVo.java
  37. 30 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabFloorListVo.java
  38. 26 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabNewnoticeSendmodeVo.java
  39. 67 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabBuildFloorLayoutMapper.java
  40. 75 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabBuildFloorMapper.java
  41. 84 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabExitLineVertexMapper.java
  42. 49 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabExitPointRelayMapper.java
  43. 48 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeContentMapper.java
  44. 33 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeGroupMapper.java
  45. 24 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeModeMapper.java
  46. 43 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeSendmodeMapper.java
  47. 9 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSubjectMapper.java
  48. 59 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabBuildFloorLayoutService.java
  49. 79 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabBuildFloorService.java
  50. 79 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabExitLineVertexService.java
  51. 42 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabExitPointRelayService.java
  52. 28 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeContentService.java
  53. 25 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeGroupService.java
  54. 26 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeModeService.java
  55. 33 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeSendmodeService.java
  56. 8 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSubjectService.java
  57. 84 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabBuildFloorLayoutServiceImpl.java
  58. 171 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabBuildFloorServiceImpl.java
  59. 635 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitLineVertexServiceImpl.java
  60. 46 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitPointRelayServiceImpl.java
  61. 28 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeContentServiceImpl.java
  62. 30 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeGroupServiceImpl.java
  63. 30 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeModeServiceImpl.java
  64. 122 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeSendmodeServiceImpl.java
  65. 5 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectServiceImpl.java
  66. 5 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java
  67. 141 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorLayoutMapper.xml
  68. 137 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorMapper.xml
  69. 140 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabExitLineVertexMapper.xml
  70. 119 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabExitPointRelayMapper.xml
  71. 1 2
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml
  72. 100 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeContentMapper.xml
  73. 54 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeGroupMapper.xml
  74. 38 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeModeMapper.xml
  75. 76 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeSendmodeMapper.xml
  76. 30 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSubjectMapper.xml

+ 1 - 1
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/conf/UserSetup.java

@@ -17,7 +17,7 @@ public class UserSetup {
 
     private Boolean seniorSdp = Boolean.FALSE;
 
-    private Long playTimeout = 60000L;
+    private Long playTimeout = 3000L;
 
     private Boolean waitTrack = Boolean.FALSE;
 

+ 32 - 36
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/media/zlm/ZLMHttpHookListener.java

@@ -318,7 +318,7 @@ public class ZLMHttpHookListener {
 	@ResponseBody
 	@PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
 	public ResponseEntity<String> onStreamNoneReader(@RequestBody JSONObject json){
-
+		logger.info("on_stream_none_reader调用:"+json.toString());
 		if (logger.isDebugEnabled()) {
 			logger.debug("ZLM HOOK on_stream_none_reader API调用,参数:" + json.toString());
 		}
@@ -326,41 +326,37 @@ public class ZLMHttpHookListener {
 		String streamId = json.getString("stream");
 		String app = json.getString("app");
 
-//		if ("rtp".equals(app)){
-//			JSONObject ret = new JSONObject();
-//			ret.put("code", 0);
-//			ret.put("close", true);
-//			StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId);
-//			if (streamInfoForPlayCatch != null) {
-//				if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) {
-//					ret.put("close", false);
-//				} else {
-//					cmder.streamByeCmd(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId());
-//					redisCatchStorage.stopPlay(streamInfoForPlayCatch);
-//					storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId());
-//				}
-//			}else{
-//				StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlaybackByStreamId(streamId);
-//				if (streamInfoForPlayBackCatch != null) {
-//					cmder.streamByeCmd(streamInfoForPlayBackCatch.getDeviceID(), streamInfoForPlayBackCatch.getChannelId());
-//					redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch);
-//				}
-//			}
-//			MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
-//			if (mediaServerItem != null && "-1".equals(mediaServerItem.getStreamNoneReaderDelayMS())) {
-//				ret.put("close", false);
-//			}
-//			return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
-//		}else {
-//			JSONObject ret = new JSONObject();
-//			ret.put("code", 0);
-//			ret.put("close", false);
-//			return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
-//		}
-		JSONObject ret = new JSONObject();
-		ret.put("code", 0);
-		ret.put("close", false);
-		return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
+		if ("rtp".equals(app)){
+			JSONObject ret = new JSONObject();
+			ret.put("code", 0);
+			ret.put("close", true);
+			StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId);
+			if (streamInfoForPlayCatch != null) {
+				if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) {
+					ret.put("close", false);
+				} else {
+					cmder.streamByeCmd(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId());
+					redisCatchStorage.stopPlay(streamInfoForPlayCatch);
+					storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId());
+				}
+			}else{
+				StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlaybackByStreamId(streamId);
+				if (streamInfoForPlayBackCatch != null) {
+					cmder.streamByeCmd(streamInfoForPlayBackCatch.getDeviceID(), streamInfoForPlayBackCatch.getChannelId());
+					redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch);
+				}
+			}
+			MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
+			if (mediaServerItem != null && "-1".equals(mediaServerItem.getStreamNoneReaderDelayMS())) {
+				ret.put("close", false);
+			}
+			return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
+		}else {
+			JSONObject ret = new JSONObject();
+			ret.put("code", 0);
+			ret.put("close", false);
+			return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
+		}
 	}
 
 	/**

+ 51 - 49
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/gb28181/play/PlayController.java

@@ -74,14 +74,12 @@ public class PlayController {
 	@Autowired
 	private DeviceChannelMapper deviceChannelMapper;
 
-	@ApiOperation("开始点播")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
-			@ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class),
-	})
-	@GetMapping("/start/{deviceId}/{channelId}")
-	public DeferredResult<ResponseEntity<String>> play(@PathVariable String deviceId,
-													   @PathVariable String channelId) {
+    @ApiOperation("开始点播")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class)})
+    @GetMapping("/start/{deviceId}/{channelId}")
+    public DeferredResult<ResponseEntity<String>> play(@PathVariable String deviceId, @PathVariable String channelId) {
 
 		// 获取可用的zlm
 		Device device = storager.queryVideoDevice(deviceId);
@@ -91,47 +89,51 @@ public class PlayController {
 		return playResult.getResult();
 	}
 
-	@ApiOperation("带分页批量点播")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "deviceIds", value = "设备ID", dataTypeClass = String.class,allowMultiple = true),
-			@ApiImplicitParam(name = "page", value = "当前页", required = true, dataTypeClass = Integer.class),
-			@ApiImplicitParam(name = "count", value = "每页查询数量", required = true, dataTypeClass = Integer.class),
-	})
-	@GetMapping("/startList")
-	public Map<String,Object> play(String deviceIds, int page, int count) {
-		if(StringUtils.isEmpty(deviceIds)){
-			Map<String,Object> map=new HashMap<>();
-			map.put("code","500");
-			map.put("msg","设备编号不能为空!");
-			map.put("data",null);
-			return map;
-		}
-		List<DeferredResult<ResponseEntity<String>>> list=new ArrayList<DeferredResult<ResponseEntity<String>>>();
-		String deviceStr[]=deviceIds.split(",");
-		List<String> deviceList= Arrays.asList(deviceStr);
-		List<DeviceChannel> deviceChannelList= playService.queryChannelByDeviceId(deviceList,page,count);
-		for(DeviceChannel deviceChannel:deviceChannelList){
-			// 获取可用的zlm
-			Device device = storager.queryVideoDevice(deviceChannel.getDeviceId());
-			MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
-			PlayResult playResult = playService.play(newMediaServerItem, deviceChannel.getDeviceId(), deviceChannel.getChannelId(), null, null);
-			list.add(playResult.getResult());
-		}
-		Map<String,Object> map=new HashMap<>();
-		map.put("code","200");
-		map.put("msg","成功!");
-		map.put("data",list);
-		return map;
-	}
-
-
-	@ApiOperation("停止点播")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
-			@ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class),
-	})
-	@GetMapping("/stop/{deviceId}/{channelId}")
-	public DeferredResult<ResponseEntity<String>> playStop(@PathVariable String deviceId, @PathVariable String channelId) {
+    @ApiOperation("带分页批量点播")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deviceIds", value = "设备ID", dataTypeClass = String.class, allowMultiple = true),
+            @ApiImplicitParam(name = "page", value = "当前页", required = true, dataTypeClass = Integer.class),
+            @ApiImplicitParam(name = "count", value = "每页查询数量", required = true, dataTypeClass = Integer.class)})
+    @GetMapping("/startList")
+    public Map<String, Object> play(String deviceIds, int page, int count) {
+        if (deviceIds==null || ("").equals(deviceIds)) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("code", "500");
+            map.put("msg", "设备编号不能为空!");
+            map.put("data", null);
+            return map;
+        }
+        List<StreamInfo> list = new ArrayList<>();
+        String deviceStr[] = deviceIds.split(",");
+        List<String> deviceList = Arrays.asList(deviceStr);
+        List<DeviceChannel> deviceChannelList = playService.queryChannelByDeviceId(deviceList, page, count);
+        for (DeviceChannel deviceChannel : deviceChannelList) {
+            // 获取可用的zlm
+            Device device = storager.queryVideoDevice(deviceChannel.getDeviceId());
+            MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
+            PlayResult playResult = playService.play(newMediaServerItem, deviceChannel.getDeviceId(), deviceChannel.getChannelId(), null, null);
+            DeferredResult<ResponseEntity<String>> result=playResult.getResult();
+            ResponseEntity responseEntity =  (ResponseEntity)result.getResult();
+            if(responseEntity != null && responseEntity.getStatusCode()==HttpStatus.OK){
+                WVPResult wvpResult = (WVPResult)responseEntity.getBody();
+                if (wvpResult.getCode() == 0) {
+                    StreamInfo streamInfo = (StreamInfo)wvpResult.getData();
+                    list.add(streamInfo);
+                }
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("code", "200");
+        map.put("msg", "成功!");
+        map.put("data", list);
+        return map;
+    }
+
+
+    @ApiOperation("停止点播")
+    @ApiImplicitParams({@ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class)})
+    @GetMapping("/stop/{deviceId}/{channelId}")
+    public DeferredResult<ResponseEntity<String>> playStop(@PathVariable String deviceId, @PathVariable String channelId) {
 
 		logger.debug(String.format("设备预览/回放停止API调用,streamId:%s_%s", deviceId, channelId ));
 

+ 19 - 20
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/log/LogController.java

@@ -37,6 +37,23 @@ public class LogController {
     private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
     /**
+     *  清空日志
+     *
+     */
+    @ApiOperation("清空日志")
+    @DeleteMapping("/clear")
+    public ResponseEntity<WVPResult<String>> clear() {
+
+        int count = logService.clear();
+        WVPResult wvpResult = new WVPResult();
+        wvpResult.setCode(0);
+        wvpResult.setMsg("success");
+        wvpResult.setData(count);
+        return new ResponseEntity<WVPResult<String>>(wvpResult, HttpStatus.OK);
+    }
+
+
+    /**
      *  分页查询日志
      *
      * @param query 查询内容
@@ -50,12 +67,12 @@ public class LogController {
     @ApiOperation("分页查询报警")
     @GetMapping("/all")
     @ApiImplicitParams({
-            @ApiImplicitParam(name="query", value = "查询内容", dataTypeClass = String.class),
             @ApiImplicitParam(name="page", value = "当前页", required = true ,dataTypeClass = Integer.class),
             @ApiImplicitParam(name="count", value = "每页查询数量", required = true ,dataTypeClass = Integer.class),
+            @ApiImplicitParam(name="query", value = "查询内容", dataTypeClass = String.class),
             @ApiImplicitParam(name="type", value = "类型" ,dataTypeClass = String.class),
             @ApiImplicitParam(name="startTime", value = "查询内容" ,dataTypeClass = String.class),
-            @ApiImplicitParam(name="endTime", value = "查询内容" ,dataTypeClass = String.class),
+            @ApiImplicitParam(name="endTime", value = "查询内容" ,dataTypeClass = String.class)
     })
     public ResponseEntity<PageInfo<LogDto>> getAll(
             @RequestParam int page,
@@ -82,22 +99,4 @@ public class LogController {
         PageInfo<LogDto> allLog = logService.getAll(page, count, query, type, startTime, endTime);
         return new ResponseEntity<>(allLog, HttpStatus.OK);
     }
-
-    /**
-     *  清空日志
-     *
-     */
-    @ApiOperation("清空日志")
-    @DeleteMapping("/clear")
-    @ApiImplicitParams({})
-    public ResponseEntity<WVPResult<String>> clear() {
-
-        int count = logService.clear();
-        WVPResult wvpResult = new WVPResult();
-        wvpResult.setCode(0);
-        wvpResult.setMsg("success");
-        wvpResult.setData(count);
-        return new ResponseEntity<WVPResult<String>>(wvpResult, HttpStatus.OK);
-    }
-
 }

+ 1 - 3
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/onvif/ONVIFController.java

@@ -46,9 +46,7 @@ public class ONVIFController {
 
 
     @ApiOperation("搜索")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "timeout", value = "超时时间", required = true, dataTypeClass = Integer.class),
-    })
+    @ApiImplicitParam(name = "timeout", value = "超时时间", required = true, dataTypeClass = Integer.class)
     @GetMapping(value = "/search")
     public DeferredResult<ResponseEntity<WVPResult>> search(@RequestParam(required = false) Integer timeout) {
         DeferredResult<ResponseEntity<WVPResult>> result = new DeferredResult<>(timeout + 10L);

+ 1 - 3
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/server/ServerController.java

@@ -133,9 +133,7 @@ public class ServerController {
 
     @ApiOperation("配置信息")
     @GetMapping(value = "/config")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name="type", value = "配置类型(sip, base)", dataTypeClass = String.class),
-    })
+    @ApiImplicitParam(name = "type", value = "配置类型(sip, base)", dataTypeClass = String.class)
     @ResponseBody
     public WVPResult<JSONObject> getVersion(String type){
         WVPResult<JSONObject> result = new WVPResult<>();

+ 1 - 6
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/vmanager/streamProxy/StreamProxyController.java

@@ -60,9 +60,6 @@ public class StreamProxyController {
     }
 
     @ApiOperation("保存代理")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "param", value = "代理参数", dataTypeClass = StreamProxyItem.class),
-    })
     @PostMapping(value = "/save")
     @ResponseBody
     public WVPResult save(@RequestBody StreamProxyItem param){
@@ -77,9 +74,7 @@ public class StreamProxyController {
 
     @ApiOperation("获取ffmpeg.cmd模板")
     @GetMapping(value = "/ffmpeg_cmd/list")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "mediaServerId", value = "流媒体ID", dataTypeClass = String.class),
-    })
+    @ApiImplicitParam(name = "mediaServerId", value = "流媒体ID", dataTypeClass = String.class)
     @ResponseBody
     public WVPResult getFFmpegCMDs(@RequestParam String mediaServerId){
         logger.debug("获取节点[ {} ]ffmpeg.cmd模板", mediaServerId );

+ 0 - 2
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/web/ApiCompatibleController.java

@@ -14,8 +14,6 @@ import javax.servlet.http.HttpServletRequest;
 @RestController
 public class ApiCompatibleController {
 
-    private final static Logger logger = LoggerFactory.getLogger(ApiCompatibleController.class);
-
     @Autowired
     private IMediaService mediaService;
 

+ 6 - 17
zd-modules/zd-base/src/main/java/com/zd/base/files/ueditor/ConfigManager.java

@@ -2,21 +2,24 @@ package com.zd.base.files.ueditor;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import org.springframework.core.io.ClassPathResource;
 
 import java.io.*;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class ConfigManager {
-    private String rootPath;
     private String localPath;
     private JSONObject jsonConfig;
 
     private ConfigManager(String localPath) throws IOException {
-        this.rootPath = this.getClass().getClassLoader().getResource("ueditor").getPath();
+
+        String result = new BufferedReader(new InputStreamReader(new ClassPathResource("ueditor/config.json").getInputStream()))
+                .lines().collect(Collectors.joining(System.lineSeparator()));
+        jsonConfig = JSONObject.parseObject(result);
 
         this.localPath = localPath;
-        this.initEnv();
     }
 
     public static ConfigManager getInstance(String realPath) {
@@ -97,20 +100,6 @@ public class ConfigManager {
         return conf;
     }
 
-    private void initEnv() throws IOException {
-        String configContent = this.readFile(this.getConfigPath());
-        try {
-            JSONObject jsonConfig = JSONObject.parseObject(configContent);
-            this.jsonConfig = jsonConfig;
-        } catch (Exception e) {
-            this.jsonConfig = null;
-        }
-    }
-
-    private String getConfigPath() {
-        return this.rootPath + File.separator + "config.json";
-    }
-
     private String[] getArray(String key) {
         JSONArray jsonArray = this.jsonConfig.getJSONArray(key);
         String[] result = new String[jsonArray.size()];

+ 8 - 9
zd-modules/zd-exam/src/main/java/com/zd/exam/service/impl/ElResourcesServiceImpl.java

@@ -21,16 +21,15 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 import ws.schild.jave.EncoderException;
 import ws.schild.jave.MultimediaObject;
 import ws.schild.jave.info.MultimediaInfo;
 
-import java.net.*;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
-import java.util.Base64;
 import java.util.List;
 
 /**
@@ -158,11 +157,11 @@ public class ElResourcesServiceImpl implements IElResourcesService {
             SaveUtil.setCommonAttr(elResources);
             int num = elResourcesMapper.insertElResources(elResources);
 
-            try {
+            /*try {
                 previewKkFile(elResources.getPath());
             } catch (URISyntaxException e) {
                 e.printStackTrace();
-            }
+            }*/
             if(num == 0){
                 throw new ServiceException("添加失败!");
             }
@@ -172,14 +171,14 @@ public class ElResourcesServiceImpl implements IElResourcesService {
         return elResources;
     }
 
-    @Async
+    /*@Async
     public void previewKkFile(String filePath) throws URISyntaxException {
         logger.info("****调用kkFileService开始****");
         String kkFilePath=remoteKkFileService.getKkFilePath(new URI("http://127.0.0.1:8012"), URLEncoder.encode(Base64.getEncoder().encodeToString(filePath.getBytes())));
         if(StringUtils.isNotBlank(kkFilePath) && StringUtils.isNotNull(kkFilePath)){
             logger.info("!!!!调用kkFileService成功!!!!");
         }
-    }
+    }*/
 
 
     private void saveResources(ElResources elResources, MultipartFile file){
@@ -261,9 +260,9 @@ public class ElResourcesServiceImpl implements IElResourcesService {
         try {
             elResourcesMapper.updateElResources(elResources);
             if(type == 1){
-                previewKkFile(elResources.getPath());
+//                previewKkFile(elResources.getPath());
             }
-        } catch (URISyntaxException e) {
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return 1;

+ 29 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/config/TimeWaitConfigUtils.java

@@ -0,0 +1,29 @@
+package com.zd.laboratory.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.stereotype.Component;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/14
+ */
+@Configuration
+public class TimeWaitConfigUtils {
+    /**
+     * 解决继电器不能同时下发的睡眠时间
+     */
+    @Value("${sys.time.waitTime}")
+    private Long waitTime;
+
+    public Long getWaitTime() {
+        return waitTime;
+    }
+
+    public void setWaitTime(Long waitTime) {
+        this.waitTime = waitTime;
+    }
+}

+ 113 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabBuildFloorController.java

@@ -0,0 +1,113 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabBuildFloor;
+import com.zd.laboratory.domain.vo.LabBuildFloorPage;
+import com.zd.laboratory.domain.vo.LabBuildFloorVo;
+import com.zd.laboratory.service.ILabBuildFloorService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+@RestController
+@Api(tags = "【楼栋(楼层)】")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/buildFloor")
+public class LabBuildFloorController  extends BaseController<LabBuildFloor> {
+
+    @Autowired
+    private ILabBuildFloorService labBuildFloorService;
+
+    /**
+     * 查询楼栋(楼层)列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询楼栋(楼层)列表")
+    public TableDataInfo <LabBuildFloor> list(LabBuildFloor labBuildFloor) {
+        startPage();
+        List <LabBuildFloor> list = labBuildFloorService.selectLabBuildFloorList(labBuildFloor);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增楼栋(楼层)
+     */
+    @ApiOperation(value = "新增楼栋(楼层)")
+    @Log(title = "新增楼栋(楼层)", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody LabBuildFloor labBuildFloor) {
+        return ResultData.result(labBuildFloorService.insertLabBuildFloor(labBuildFloor));
+    }
+
+    /**
+     * 修改楼栋(楼层)
+     */
+    @ApiOperation(value = "修改楼栋(楼层)")
+    @Log(title = "楼栋(楼层)", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody LabBuildFloor labBuildFloor) {
+        return ResultData.result(labBuildFloorService.updateLabBuildFloor(labBuildFloor));
+    }
+
+    /**
+     * 查询楼栋(楼层)tree结构列表
+     */
+    @GetMapping("/getTreeList")
+    @ApiOperation(value = "查询楼栋(楼层)列表")
+    public ResultData <List<LabBuildFloorVo>> getTreeList(LabBuildFloor labBuildFloor) {
+        return ResultData.success(labBuildFloorService.getTreeList(labBuildFloor));
+    }
+
+
+    /**
+     * 查询楼栋(楼层)子集列表
+     */
+    @GetMapping("/getTreeSonList")
+    @ApiOperation(value = "查询楼栋(楼层)子集列表")
+    public TableDataInfo <LabBuildFloor> getTreeSonList(LabBuildFloor labBuildFloor) {
+//        //todo 如果选中的是楼层下的布局图,则需要分页,如果不是,不需要分页
+//        if(labBuildFloor.getType()==3){
+//            startPage();
+//        }
+        LabBuildFloorPage buildFloorPage = labBuildFloorService.getTreeSonList(labBuildFloor);
+        return getDataTable(buildFloorPage.getLabBuildList(),buildFloorPage.getTotal());
+    }
+
+
+    /**
+     * 删除楼栋(楼层)
+     */
+    @ApiOperation(value = "删除楼栋(楼层)")
+    @Log(title = "楼栋(楼层)", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids) {
+        return ResultData.result(labBuildFloorService.deleteLabBuildFloorByIds(ids));
+    }
+
+
+
+    /**
+     * 修改楼栋楼层sortNum
+     */
+    @ApiOperation(value = "修改楼栋楼层sortNum")
+    @Log(title = "楼栋(楼层)", businessType = BusinessType.UPDATE)
+    @PutMapping("/editSortNum")
+    public ResultData editSortNum(@RequestBody List<LabBuildFloor> labBuildFloorList) {
+        return ResultData.result(labBuildFloorService.updateSortNum(labBuildFloorList));
+    }
+}

+ 86 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabBuildFloorLayoutController.java

@@ -0,0 +1,86 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo;
+import com.zd.laboratory.service.ILabBuildFloorLayoutService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+@RestController
+@Api(tags = "【楼层布局图】")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/buildFloorLayout")
+public class LabBuildFloorLayoutController extends BaseController<LabBuildFloorLayout> {
+
+    @Autowired
+    private ILabBuildFloorLayoutService labBuildFloorLayoutService;
+
+    /**
+     * 查询布局图列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询布局图列表")
+    public TableDataInfo <LabBuildFloorLayout> list(LabBuildFloorLayout labBuildFloorLayout) {
+        startPage();
+        List <LabBuildFloorLayoutVo> list = labBuildFloorLayoutService.selectLabBuildFloorLayoutList(labBuildFloorLayout);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取布局图详细信息
+     */
+    @ApiOperation(value = "获取布局图详细信息")
+    @GetMapping(value = "/{id}")
+    public ResultData<LabBuildFloorLayoutVo> getInfo(@PathVariable("id") Long id) {
+        return ResultData.success(labBuildFloorLayoutService.selectLabBuildFloorLayoutById(id));
+    }
+
+    /**
+     * 新增布局图
+     */
+    @ApiOperation(value = "新增布局图")
+    @Log(title = "新增布局图", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody LabBuildFloorLayout labBuildFloorLayout) {
+        return ResultData.result(labBuildFloorLayoutService.insertLabBuildFloorLayout(labBuildFloorLayout));
+    }
+
+    /**
+     * 修改布局图
+     */
+    @ApiOperation(value = "修改布局图")
+    @Log(title = "布局图", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody LabBuildFloorLayout labBuildFloorLayout) {
+        return ResultData.result(labBuildFloorLayoutService.updateLabBuildFloorLayout(labBuildFloorLayout));
+    }
+
+    /**
+     * 删除布局图
+     */
+    @ApiOperation(value = "删除布局图")
+    @Log(title = "布局图", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids) {
+        return ResultData.result(labBuildFloorLayoutService.deleteLabBuildFloorLayoutByIds(ids));
+    }
+
+}

+ 109 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabExitLineVertexController.java

@@ -0,0 +1,109 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.LabExitLineEvacuationVo;
+import com.zd.laboratory.domain.vo.LabExitLineVertexVo;
+import com.zd.laboratory.service.ILabExitLineVertexService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+/**
+ * 逃生线路顶点Controller
+ *https://my.oschina.net/u/1247611/blog/159952
+ * @author zd
+ * @date 2022-11-3
+ */
+@RestController
+@Api(tags = "【逃生线路顶点】")
+//作者手动加入 ,在接口上加作者@ApiOperationSupport(author = "XXX")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/lineVertex")
+public class LabExitLineVertexController extends BaseController {
+    @Autowired
+    private ILabExitLineVertexService labExitLineVertexService;
+
+    /**
+     * 查询逃生线路主列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询逃生线路主列表")
+    public TableDataInfo<LabExitLineVertex> list(LabExitLineVertex labExitLineVertex) {
+        startPage();
+        List<LabExitLineVertex> list = labExitLineVertexService.selectLabExitLineVertexList(labExitLineVertex);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 获取逃生线路主详细信息
+     */
+    @ApiOperation(value = "获取逃生线路主详细信息")
+    @GetMapping(value = "/{id}")
+    public ResultData<LabExitLineVertex> getInfo(@PathVariable("id") Long id) {
+        return ResultData.success(labExitLineVertexService.selectLabExitLineVertexById(id));
+    }
+
+
+    /**
+     * 新增逃生线路主
+     */
+    @ApiOperation(value = "新增逃生线路主")
+    @Log(title = "逃生线路主", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody LabExitLineVertexVo lineVertexVo) {
+        return ResultData.result(labExitLineVertexService.insertLabExitLineVertex(lineVertexVo));
+    }
+
+
+    /**
+     * 计算线路最优方案
+     */
+    @GetMapping("/getCalculationLine")
+    @ApiOperation(value = "查询逃生线路主列表")
+    public ResultData getCalculationLine(LabExitLineVertex labExitLineVertex) {
+        return ResultData.success(labExitLineVertexService.getCalculationLine(labExitLineVertex));
+    }
+
+    /**
+     * 执行疏散线路最优方案
+     */
+    @PostMapping("/executeEvacuation")
+    @ApiOperation(value = "查询逃生线路主列表")
+    public ResultData executeEvacuation(@RequestBody LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        return ResultData.success(labExitLineVertexService.executeEvacuation(labExitLineEvacuationVo));
+    }
+
+
+    /**
+     * 修改逃生线路主
+     */
+    @ApiOperation(value = "修改逃生线路主")
+    @Log(title = "逃生线路主", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(LabExitLineVertex labExitLineVertex) {
+        return ResultData.result(labExitLineVertexService.updateLabExitLineVertex(labExitLineVertex));
+    }
+
+    /**
+     * 删除逃生线路主
+     */
+    @ApiOperation(value = "删除逃生线路主")
+    @Log(title = "逃生线路主", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids) {
+        return ResultData.result(labExitLineVertexService.deleteLabExitLineVertexByIds(ids));
+    }
+
+
+
+}

+ 57 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabExitPointRelayController.java

@@ -0,0 +1,57 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabExitPointRelay;
+import com.zd.laboratory.domain.vo.LabExitLineVertexVo;
+import com.zd.laboratory.service.ILabExitPointRelayService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/11
+ */
+@RestController
+@Api(tags = "【逃生灯关联的继电器】")
+//作者手动加入 ,在接口上加作者@ApiOperationSupport(author = "XXX")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/pointRelay")
+public class LabExitPointRelayController extends BaseController{
+
+    @Autowired
+    private ILabExitPointRelayService labExitPointRelayService;
+
+    /**
+     * 查询逃生灯关联的继电器列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询逃生灯关联的继电器列表")
+    public TableDataInfo <LabExitPointRelay> list(LabExitPointRelay labExitPointRelay) {
+        List <LabExitPointRelay> list = labExitPointRelayService.selectLabExitPointRelayList(labExitPointRelay);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 新增逃生线路主
+     */
+    @ApiOperation(value = "新增逃生灯关联的继电器")
+    @Log(title = "新增逃生灯关联的继电器", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody LabExitPointRelay labExitPointRelay) {
+        return ResultData.result(labExitPointRelayService.insertLabExitPointRelay(labExitPointRelay));
+    }
+
+}

+ 43 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeContentController.java

@@ -0,0 +1,43 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.service.ILabNewnoticeContentService;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.RestController;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@RestController
+@Api(tags = "新通知内容")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/newnoticeContent")
+public class LabNewnoticeContentController extends BaseController <LabNewnoticeContent> {
+
+    @Autowired
+    private ILabNewnoticeContentService labNewnoticeContentService;
+
+    /**
+     * 查询新通知内容列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询新通知内容列表")
+    public TableDataInfo <LabNewnoticeContent> list(LabNewnoticeContent labNewnoticeContent) {
+        startPage();
+        List <LabNewnoticeContent> list = labNewnoticeContentService.selectLabNewnoticeContentList(labNewnoticeContent);
+        return getDataTable(list);
+    }
+}

+ 43 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeGroupController.java

@@ -0,0 +1,43 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabNewnoticeGroup;
+import com.zd.laboratory.service.ILabNewnoticeGroupService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.RestController;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@RestController
+@Api(tags = "通知组")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/newnoticeGroup")
+public class LabNewnoticeGroupController extends BaseController <LabNewnoticeGroup> {
+
+    @Autowired
+    private ILabNewnoticeGroupService labNewnoticeGroupService;
+
+    /**
+     * 查询通知组列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询通知组列表")
+    public ResultData <List<LabNewnoticeGroup>> list(LabNewnoticeGroup LabNewnoticeGroup) {
+        List <LabNewnoticeGroup> list = labNewnoticeGroupService.selectLabNewnoticeGroupList(LabNewnoticeGroup);
+        return ResultData.success(list);
+    }
+}

+ 45 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeModeController.java

@@ -0,0 +1,45 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabNewnoticeMode;
+import com.zd.laboratory.domain.vo.LabExitLineVertexVo;
+import com.zd.laboratory.domain.vo.LabNewnoticeSendmodeVo;
+import com.zd.laboratory.service.ILabNewnoticeModeService;
+import com.zd.model.domain.ResultData;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@RestController
+@Api(tags = "发送类型")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/newnoticeMode")
+public class LabNewnoticeModeController extends BaseController <LabNewnoticeMode> {
+
+    @Autowired
+    private ILabNewnoticeModeService labNewnoticeModeService;
+
+    /**
+     * 查询发送方式列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询发送方式列表")
+    public ResultData <List<LabNewnoticeMode>> list(LabNewnoticeMode labNewnoticeMode) {
+        List <LabNewnoticeMode> list = labNewnoticeModeService.selectLabNewnoticeModeList(labNewnoticeMode);
+        return ResultData.success(list);
+    }
+
+}

+ 58 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabNewnoticeSendmodeController.java

@@ -0,0 +1,58 @@
+package com.zd.laboratory.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+import com.zd.laboratory.domain.vo.LabNewnoticeSendmodeVo;
+import com.zd.laboratory.service.ILabNewnoticeContentService;
+import com.zd.laboratory.service.ILabNewnoticeSendmodeService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@RestController
+@Api(tags = "发送方式")
+@ApiSupport(author = Knife4jConfiguration.Author.CYL)
+@RequestMapping("/newnoticeSendmode")
+public class LabNewnoticeSendmodeController extends BaseController <LabNewnoticeSendmode>{
+
+    @Autowired
+    private ILabNewnoticeSendmodeService labNewnoticeSendmodeService;
+
+    /**
+     * 查询发送方式列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "查询发送方式列表")
+    public TableDataInfo <LabNewnoticeSendmode> list(LabNewnoticeSendmode labNewnoticeSendmode) {
+        startPage();
+        List <LabNewnoticeSendmode> list = labNewnoticeSendmodeService.selectLabNewnoticeSendmodeList(labNewnoticeSendmode);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 新增发送方式
+     */
+    @ApiOperation(value = "新增发送方式")
+    @Log(title = "发送方式", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody List<LabNewnoticeSendmodeVo> labNewnoticeSendmodeVoList) {
+        return ResultData.result(labNewnoticeSendmodeService.insertLabNewnoticeSendmode(labNewnoticeSendmodeVoList));
+    }
+}

+ 11 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectController.java

@@ -120,6 +120,17 @@ public class LabSubjectController extends BaseController {
         return ResultData.success(list);
     }
 
+
+    @PostMapping("/list/listAdminByLayout")
+    public ResultData listAdminByLayout(@RequestBody LabSubject labSubject) {
+        //获取当前登录用户所属学校和学院的deptid
+        R<List<Long>> listdeptids = remoteUserService.getLogingUserDeptids();
+        List<Long> deptIds= listdeptids.getData();
+        labSubject.setDeptIds(deptIds);
+        List<LabSubject> list = labSubjectService.selectLabSubjectListByLayout(labSubject);
+        return ResultData.success(list);
+    }
+
     /**
      * 查询登录用户是否是实验室管理员(数据权限)
      */

+ 42 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabBuildFloor.java

@@ -0,0 +1,42 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+@ApiModel("楼栋(楼层)")
+@Data
+public class LabBuildFloor extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 楼栋或楼层名称 */
+    @ApiModelProperty(value = "楼栋或楼层名称")
+    private String name;
+
+    /** 结构类型,1是院校,2是楼栋,3是楼层 */
+    @ApiModelProperty(value = "结构类型,1是院校,2是楼栋,3是楼层")
+    private Integer type;
+
+    /** 楼栋或楼层图标 */
+    @ApiModelProperty(value = "楼栋或楼层图标")
+    private String imgUrl;
+
+    /** 上级楼栋id,如果有,就是楼层,没有就是楼栋 */
+    @ApiModelProperty(value = "上级楼栋id,如果有,就是楼层,没有就是楼栋")
+    private Long parentId;
+
+    /** 排序序号 */
+    @ApiModelProperty(value = "排序序号")
+    private Integer sortNo;
+}

+ 50 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabBuildFloorLayout.java

@@ -0,0 +1,50 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+@ApiModel("布局图")
+@Data
+public class LabBuildFloorLayout extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 楼栋id */
+    @ApiModelProperty(value = "楼栋id")
+    private Long buildId;
+
+    /** 楼层id */
+    @ApiModelProperty(value = "楼层id")
+    private Long floorId;
+
+    /** 实验室id */
+    @ApiModelProperty(value = "实验室id")
+    private Long subId;
+
+    /** 房间号 */
+    @ApiModelProperty(value = "房间号")
+    private String roomNum;
+
+    /** 房间名称 */
+    @ApiModelProperty(value = "房间名称")
+    private String roomName;
+
+    /** 房间类型,1是实验室,0是其他 */
+    @ApiModelProperty(value = "房间类型,1是实验室,0是其他")
+    private Integer roomType;
+
+    /** 点名称 */
+    @ApiModelProperty(value = "点名称")
+    private String pointName;
+}

+ 51 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabExitLineVertex.java

@@ -0,0 +1,51 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/3
+ */
+@ApiModel("逃生线路顶点")
+@Data
+public class LabExitLineVertex  extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 所属教学楼id */
+    @ApiModelProperty(value = "所属教学楼id")
+    private Long buildId;
+
+    /** 楼层id */
+    @ApiModelProperty(value = "楼层id")
+    private Long floorId;
+
+    /** 关系数据维护 */
+    @ApiModelProperty(value = "关系数据维护")
+    private String relationalData;
+
+    /** 页面布局相关数据 */
+    @ApiModelProperty(value = "页面布局相关数据")
+    private String layoutData;
+
+    /** 上传布局图地址 */
+    @ApiModelProperty(value = "上传布局图地址")
+    private String imgUrl;
+
+    /** 画布宽 */
+    @ApiModelProperty(value = "画布宽")
+    private Integer canvasWidth;
+
+    /** 画布高 */
+    @ApiModelProperty(value = "画布高")
+    private Integer canvasHeight;
+}

+ 55 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabExitPointRelay.java

@@ -0,0 +1,55 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/3
+ */
+@ApiModel("逃生灯关联的继电器")
+@Data
+public class LabExitPointRelay extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 所属教学楼id */
+    @ApiModelProperty(value = "所属教学楼id")
+    private Long buildId;
+
+    /** 楼层id */
+    @ApiModelProperty(value = "楼层id")
+    private Long floorId;
+
+    /** 点名称 */
+    @ApiModelProperty(value = "点名称")
+    private String pointName;
+
+    /** 继电器类型,1是老继电器,2是新继电器 */
+    @ApiModelProperty(value = "继电器类型,1是老继电器,2是新继电器")
+    private Integer relayType;
+
+    /** 继电器编号 */
+    @ApiModelProperty(value = "继电器编号")
+    private String relayCode;
+
+    /** 继电器路数 */
+    @ApiModelProperty(value = "继电器路数")
+    private Integer relayBit;
+
+    /** 配置名称 */
+    @ApiModelProperty(value = "配置名称")
+    private String configName;
+
+    /** 配置状态 */
+    @ApiModelProperty(value = "配置状态")
+    private String configStatus;
+}

+ 42 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeContent.java

@@ -0,0 +1,42 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@ApiModel("新通知内容")
+@Data
+public class LabNewnoticeContent extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 通知方式表id */
+    @ApiModelProperty(value = "通知方式表id")
+    private Long noticeModeId;
+
+    /** 通知类型:1是文字,2是变量 */
+    @ApiModelProperty(value = "通知类型:1是文字,2是变量")
+    private Integer noticeType;
+
+    /** 变量级别:1是一般变量,2是比较变量 */
+    @ApiModelProperty(value = "变量级别:1是一般变量,2是比较变量")
+    private Integer variableLevel;
+
+    /** 通知内容 */
+    @ApiModelProperty(value = "通知内容")
+    private String noticeContent;
+
+    /** 顺序序号 */
+    @ApiModelProperty(value = "顺序序号")
+    private Integer sortNum;
+}

+ 35 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeGroup.java

@@ -0,0 +1,35 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@ApiModel("通知组")
+@Data
+public class LabNewnoticeGroup extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 组名称 */
+    @ApiModelProperty(value = "组名称")
+    private String groupName;
+
+    /** 组值,区分类型 */
+    @ApiModelProperty(value = "组值,区分类型")
+    private Integer groupValue;
+
+    /** 发送方式,参考mode表,这里可能存在多个方式 */
+    @ApiModelProperty(value = "发送方式,参考mode表,这里可能存在多个方式")
+    private String sendMode;
+
+}

+ 31 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeMode.java

@@ -0,0 +1,31 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@ApiModel("发送类型")
+@Data
+public class LabNewnoticeMode extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 通知方式名称 */
+    @ApiModelProperty(value = "通知方式名称")
+    private String noticeModeName;
+
+    /** 通知方式值 */
+    @ApiModelProperty(value = "通知方式值")
+    private String noticeModeValue;
+
+}

+ 31 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabNewnoticeSendmode.java

@@ -0,0 +1,31 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@ApiModel("发送方式")
+@Data
+public class LabNewnoticeSendmode extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键id */
+    @ApiModelProperty(value = "${comment}")
+    private Long id;
+
+    /** 关联的组id */
+    @ApiModelProperty(value = "关联的组id")
+    private Long groupId;
+
+    /** 发送方式,参考mode表,这里可能存在多个方式 */
+    @ApiModelProperty(value = "发送方式,参考mode表,这里可能存在多个方式")
+    private String sendMode;
+
+}

+ 40 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildFloorLayoutVo.java

@@ -0,0 +1,40 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+@ApiModel("布局图")
+@Data
+public class LabBuildFloorLayoutVo extends LabBuildFloorLayout {
+    private static final long serialVersionUID = 1L;
+
+    /** 房间类型名称 */
+    @ApiModelProperty(value = "房间类型名称")
+    private String roomTypeName;
+
+    /** 楼栋名称 */
+    @ApiModelProperty(value = "楼栋名称")
+    private String buildName;
+
+    /** 楼层名称 */
+    @ApiModelProperty(value = "楼层名称")
+    private String floorName;
+
+    /** 实验室名称 */
+    @ApiModelProperty(value = "实验室名称")
+    private String subName;
+
+    /** 布局图数据信息 */
+    @ApiModelProperty(value = "布局图数据信息")
+    private LabExitLineVertex exitLineVertex;
+}

+ 25 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildFloorPage.java

@@ -0,0 +1,25 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import org.apache.poi.ss.formula.functions.T;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/17
+ */
+@ApiModel("楼栋(楼层)")
+@Data
+public class LabBuildFloorPage{
+
+    private Long total;
+
+    private List <LabBuildFloor> labBuildList = new LabBuildList<LabBuildFloor>();
+
+}

+ 22 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildFloorVo.java

@@ -0,0 +1,22 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/17
+ */
+@ApiModel("楼栋(楼层)")
+@Data
+public class LabBuildFloorVo extends LabBuildFloor {
+
+    private List <LabBuildFloorVo> buildFloorVoList = new ArrayList <>();
+
+}

+ 33 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildList.java

@@ -0,0 +1,33 @@
+package com.zd.laboratory.domain.vo;
+
+import com.github.pagehelper.PageInfo;
+import com.zd.laboratory.domain.LabBuildFloor;
+import com.zd.model.constant.HttpStatus;
+import com.zd.model.page.TableDataInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.awt.*;
+import java.util.ArrayList;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/17
+ */
+@ApiModel("楼栋(楼层)")
+@Data
+public class LabBuildList<T> extends ArrayList {
+
+    /**
+     * 处理泛型列表
+     */
+    public LabBuildList <T> getDataTable(java.util.List <? extends T> list) {
+        LabBuildList<T> rspData = new LabBuildList();
+        rspData.addAll(list);
+        return rspData;
+    }
+
+}

+ 32 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabBuildListVo.java

@@ -0,0 +1,32 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.awt.*;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/17
+ */
+@ApiModel("楼栋")
+@Data
+public class LabBuildListVo extends LabBuildFloor {
+
+    /** 楼层数 */
+    @ApiModelProperty(value = "楼层数")
+    private Integer floorNum;
+
+    /** 房间数 */
+    @ApiModelProperty(value = "房间数")
+    private Integer roomNum;
+
+    /** 院校名称 */
+    @ApiModelProperty(value = "院校名称")
+    private String groupName;
+
+}

+ 41 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabExitLineEvacuationVo.java

@@ -0,0 +1,41 @@
+package com.zd.laboratory.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/3
+ */
+@ApiModel("逃生线路顶点")
+@Data
+public class LabExitLineEvacuationVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 所属教学楼id */
+    @ApiModelProperty(value = "所属教学楼id")
+    private Long buildId;
+
+    /** 楼层id */
+    @ApiModelProperty(value = "楼层id")
+    private Long floorId;
+
+    /** 实验室id */
+    @ApiModelProperty(value = "实验室id")
+    private Long subId;
+
+    /** 起始点名称 */
+    @ApiModelProperty(value = "起始点名称")
+    private String startPointName;
+
+    /** 坏点集合 */
+    @ApiModelProperty(value = "坏点集合")
+    private List<String> badPointNames = new ArrayList <>();
+}

+ 43 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabExitLineJoinPointVO.java

@@ -0,0 +1,43 @@
+package com.zd.laboratory.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/11
+ */
+@ApiModel("逃生线路")
+@Data
+public class LabExitLineJoinPointVO {
+
+    /** 所属教学楼id */
+    @ApiModelProperty(value = "所属教学楼id")
+    private Long buildId;
+
+    @ApiModelProperty(value = "楼层id")
+    private Long floorId;
+
+    @ApiModelProperty(value = "点名称")
+    private String pointName;
+
+    @ApiModelProperty(value = "点距离")
+    private Integer pointDistance;
+
+    @ApiModelProperty(value = "起点名称")
+    private String startPointName;
+
+    @ApiModelProperty(value = "点属性")
+    private Integer pointAttribute;
+
+    @ApiModelProperty(value = "房间或者灯的名称,通过房间或者灯的pointName寻找这个key")
+    private String key;
+
+    private List <LabExitLineJoinPointVO> pointVOList = new ArrayList <>();
+}

+ 59 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabExitLineVertexVo.java

@@ -0,0 +1,59 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitPointRelay;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/3
+ */
+@ApiModel("逃生线路顶点")
+@Data
+public class LabExitLineVertexVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 所属教学楼id */
+    @ApiModelProperty(value = "所属教学楼id")
+    private Long buildId;
+
+    /** 楼层id */
+    @ApiModelProperty(value = "楼层id")
+    private Long floorId;
+
+    /** 关系数据维护 */
+    @ApiModelProperty(value = "关系数据维护")
+    private List <LabExitLineJoinPointVO> relationalData = new ArrayList <>();
+
+    /** 页面布局相关数据 */
+    @ApiModelProperty(value = "页面布局相关数据")
+    private String layoutData;
+
+    /** 逃生点和实验室绑定关系 */
+    @ApiModelProperty(value = "逃生点和实验室绑定关系")
+    private List<LabBuildFloorLayout> buildFloorLayouts = new ArrayList <>();
+
+    /** 点和继电器绑定关系 */
+    @ApiModelProperty(value = "逃生点和实验室绑定关系")
+    private List<LabExitPointRelay> exitPointRelayList = new ArrayList <>();
+
+    /** 布局图地址 */
+    @ApiModelProperty(value = "布局图地址")
+    private String imgUrl;
+
+    /** 画布宽 */
+    @ApiModelProperty(value = "画布宽")
+    private Integer canvasWidth;
+
+    /** 画布高 */
+    @ApiModelProperty(value = "画布高")
+    private Integer canvasHeight;
+}

+ 30 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabFloorListVo.java

@@ -0,0 +1,30 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/17
+ */
+@ApiModel("楼层")
+@Data
+public class LabFloorListVo extends LabBuildFloor {
+
+    /** 页面布局相关数据 */
+    @ApiModelProperty(value = "页面布局相关数据")
+    private String layoutData;
+
+    /** 院校名称 */
+    @ApiModelProperty(value = "院校名称")
+    private String groupName;
+
+    /** 楼栋名称 */
+    @ApiModelProperty(value = "楼栋名称")
+    private String buildName;
+
+}

+ 26 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabNewnoticeSendmodeVo.java

@@ -0,0 +1,26 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@ApiModel("发送方式VO")
+@Data
+public class LabNewnoticeSendmodeVo extends LabNewnoticeSendmode {
+    private static final long serialVersionUID = 1L;
+
+    /** 通知内容 */
+    @ApiModelProperty(value = "通知内容")
+    private List <LabNewnoticeContent> contentList = new ArrayList <>();
+}

+ 67 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabBuildFloorLayoutMapper.java

@@ -0,0 +1,67 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/18
+ */
+public interface LabBuildFloorLayoutMapper {
+
+    /**
+     * 查询布局图列表
+     *
+     * @param labBuildFloorLayout 布局图
+     * @return 布局图集合
+     */
+    public List <LabBuildFloorLayoutVo> selectLabBuildFloorLayoutList(LabBuildFloorLayout labBuildFloorLayout);
+
+
+    /**
+     * 查询布局图
+     *
+     * @param id 布局图主键
+     * @return 布局图信息
+     */
+    public LabBuildFloorLayoutVo selectLabBuildFloorLayoutById(Long id);
+
+    /**
+     * 新增布局图
+     *
+     * @param labBuildFloorLayout 布局图
+     * @return 结果
+     */
+    public int insertLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout);
+
+    /**
+     * 修改布局图
+     *
+     * @param labBuildFloorLayout 布局图
+     * @return 结果
+     */
+    public int updateLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout);
+
+
+    /**
+     * 删除布局图点和实验室id关系数据
+     *
+     * @param labBuildFloorLayout 布局图点和实验室id关系
+     * @return 结果
+     */
+    public int deleteLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout);
+
+
+    /**
+     * 删除布局图
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteLabBuildFloorLayoutByIds(Long[] ids);
+
+}

+ 75 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabBuildFloorMapper.java

@@ -0,0 +1,75 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo;
+import com.zd.laboratory.domain.vo.LabBuildListVo;
+import com.zd.laboratory.domain.vo.LabFloorListVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+public interface LabBuildFloorMapper {
+
+    /**
+     * 查询楼栋楼层列表
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 楼栋楼层集合
+     */
+    public List <LabBuildFloor> selectLabBuildFloorList(LabBuildFloor labBuildFloor);
+
+    /**
+     * 查询楼栋楼层
+     *
+     * @param id 楼栋楼层主键
+     * @return 楼栋楼层信息
+     */
+    public LabBuildFloor selectLabBuildFloorById(Long id);
+
+    /**
+     * 新增楼栋楼层
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 结果
+     */
+    public int insertLabBuildFloor(LabBuildFloor labBuildFloor);
+
+    /**
+     * 修改楼栋楼层
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 结果
+     */
+    public int updateLabBuildFloor(LabBuildFloor labBuildFloor);
+
+    /**
+     * 查询楼栋列表
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 楼栋楼层集合
+     */
+    public List <LabBuildListVo> getTreeBuildList(LabBuildFloor labBuildFloor);
+
+
+    /**
+     * 查询楼层列表
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 楼层集合
+     */
+    public List <LabFloorListVo> getTreeFloorList(LabBuildFloor labBuildFloor);
+
+
+    /**
+     * 删除布局图
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteLabBuildFloorByIds(Long[] ids);
+}

+ 84 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabExitLineVertexMapper.java

@@ -0,0 +1,84 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabExitLine;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.LabExitLineVO;
+
+import java.util.List;
+
+/**
+ * 逃生线路主Mapper接口
+ *
+ * @author zd
+ * @date 2022-01-25
+ */
+public interface LabExitLineVertexMapper
+{
+    /**
+     * 查询逃生线路主
+     *
+     * @param id 逃生线路主主键
+     * @return 逃生线路主
+     */
+    public LabExitLineVertex selectLabExitLineVertexById(Long id);
+
+    /**
+     * 查询逃生线路主列表
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 逃生线路主集合
+     */
+    public List<LabExitLineVertex> selectLabExitLineVertexList(LabExitLineVertex labExitLineVertex);
+
+
+    /**
+     * 新增逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 结果
+     */
+    public int insertLabExitLineVertex(LabExitLineVertex labExitLineVertex);
+
+    /**
+     * 修改逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 结果
+     */
+    public int updateLabExitLineVertex(LabExitLineVertex labExitLineVertex);
+
+    /**
+     * 删除逃生线路主
+     *
+     * @param id 逃生线路主主键
+     * @return 结果
+     */
+    public int deleteLabExitLineVertexById(Long id);
+
+    /**
+     * 批量删除逃生线路主
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteLabExitLineVertexByIds(Long[] ids);
+
+
+    /**
+     * 删除逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主主键
+     * @return 结果
+     */
+    public int deleteLabExitLineVertexByFloorId(LabExitLineVertex labExitLineVertex);
+
+
+
+    /**
+     * 查询布局图信息
+     *
+     * @param labExitLineVertex 布局图
+     * @return 布局图
+     */
+    public List<LabExitLineVertex> getExitLineVertexList(LabExitLineVertex labExitLineVertex);
+}

+ 49 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabExitPointRelayMapper.java

@@ -0,0 +1,49 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabExitPointRelay;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/11
+ */
+public interface LabExitPointRelayMapper {
+
+    /**
+     * 查询逃生灯关联的继电器列表
+     *
+     * @param labExitPointRelay 逃生灯关联的继电器
+     * @return 逃生灯关联的继电器集合
+     */
+    public List <LabExitPointRelay> selectLabExitPointRelayList(LabExitPointRelay labExitPointRelay);
+
+
+    /**
+     * 新增逃生灯关联的继电器
+     *
+     * @param labExitPointRelay 逃生灯关联的继电器
+     * @return 结果
+     */
+    public int insertLabExitPointRelay(LabExitPointRelay labExitPointRelay);
+
+
+    /**
+     * 修改逃生灯关联的继电器
+     *
+     * @param labExitPointRelay 逃生灯关联的继电器
+     * @return 结果
+     */
+    public int updateLabExitPointRelay(LabExitPointRelay labExitPointRelay);
+
+
+    /**
+     * 删除点和继电器绑定关系
+     *
+     * @param labExitPointRelay 点和继电器绑定关系
+     * @return 结果
+     */
+    public int deleteLabExitPointRelay(LabExitPointRelay labExitPointRelay);
+}

+ 48 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeContentMapper.java

@@ -0,0 +1,48 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+public interface LabNewnoticeContentMapper {
+
+    /**
+     * 查询新通知内容列表
+     *
+     * @param labNewnoticeContent 新通知内容
+     * @return 新通知内容集合
+     */
+    public List <LabNewnoticeContent> selectNewnoticeContentList(LabNewnoticeContent labNewnoticeContent);
+
+    /**
+     * 根据主键集合查询新通知内容列表
+     *
+     * @param ids 主键集合
+     * @return 新通知内容集合
+     */
+    List<LabNewnoticeContent> getListByIds(List<Long> ids);
+
+    /**
+     * 新增新通知内容
+     *
+     * @param labNewnoticeContent 新通知内容
+     * @return 结果
+     */
+    public int insertLabNewnoticeContent(LabNewnoticeContent labNewnoticeContent);
+
+
+    /**
+     * 批量删除新通知内容
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSendContentListByIds(List<Long> ids);
+}

+ 33 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeGroupMapper.java

@@ -0,0 +1,33 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.LabNewnoticeGroup;
+import com.zd.laboratory.domain.LabNewnoticeMode;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+public interface LabNewnoticeGroupMapper {
+
+    /**
+     * 查询通知组列表
+     *
+     * @param labNewnoticeGroup 通知组
+     * @return 通知组集合
+     */
+    public List <LabNewnoticeGroup> selectNewnoticeGroupList(LabNewnoticeGroup labNewnoticeGroup);
+
+
+    /**
+     * 修改通知组
+     *
+     * @param labNewnoticeGroup 通知组
+     * @return 结果
+     */
+    public int updateNewnoticeGroup(LabNewnoticeGroup labNewnoticeGroup);
+}

+ 24 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeModeMapper.java

@@ -0,0 +1,24 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabNewnoticeMode;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+public interface LabNewnoticeModeMapper {
+
+    /**
+     * 查询发送类型列表
+     *
+     * @param labNewnoticeMode 发送类型
+     * @return 发送类型集合
+     */
+    public List <LabNewnoticeMode> selectNewnoticeModeList(LabNewnoticeMode labNewnoticeMode);
+
+}

+ 43 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabNewnoticeSendmodeMapper.java

@@ -0,0 +1,43 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+public interface LabNewnoticeSendmodeMapper {
+
+    /**
+     * 查询发送方式列表
+     *
+     * @param labNewnoticeSendmode 发送方式
+     * @return 发送方式集合
+     */
+    public List <LabNewnoticeSendmode> selectNewnoticeSendModeList(LabNewnoticeSendmode labNewnoticeSendmode);
+
+
+
+    /**
+     * 新增发送方式
+     *
+     * @param labNewnoticeSendmode 发送方式
+     * @return 结果
+     */
+    public int insertLabNewnoticeSendmode(LabNewnoticeSendmode labNewnoticeSendmode);
+
+
+    /**
+     * 批量删除发送方式
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSendmodeListByIds(List<Long> ids);
+}

+ 9 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSubjectMapper.java

@@ -73,6 +73,15 @@ public interface LabSubjectMapper {
      * @return
      */
     public List<LabSubject> selectLabSubjectListByadminidNotnull(LabSubject labSubject);
+
+    /***
+     * 查询关联布局图的实验室
+     * @param labSubject
+     * @return
+     */
+    public List<LabSubject> selectLabSubjectListByLayout(LabSubject labSubject);
+
+
     /**
      * 查询实验室列表VO-数据权限
      *

+ 59 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabBuildFloorLayoutService.java

@@ -0,0 +1,59 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+public interface ILabBuildFloorLayoutService {
+
+    /**
+     * 查询布局图列表
+     *
+     * @param labBuildFloorLayout 布局图
+     * @return 布局图集合
+     */
+    public List <LabBuildFloorLayoutVo> selectLabBuildFloorLayoutList(LabBuildFloorLayout labBuildFloorLayout);
+
+    /**
+     * 查询布局图
+     *
+     * @param id 布局图主键
+     * @return 布局图信息
+     */
+    public LabBuildFloorLayoutVo selectLabBuildFloorLayoutById(Long id);
+
+    /**
+     * 新增布局图
+     *
+     * @param labBuildFloorLayout 布局图
+     * @return 结果
+     */
+    public int insertLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout);
+
+    /**
+     * 修改布局图
+     *
+     * @param labBuildFloorLayout 布局图
+     * @return 结果
+     */
+    public int updateLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout);
+
+
+    /**
+     * 批量删除逃生线路主
+     *
+     * @param ids 需要删除的逃生线路主主键集合
+     * @return 结果
+     */
+    public int deleteLabBuildFloorLayoutByIds(Long[] ids);
+
+
+}

+ 79 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabBuildFloorService.java

@@ -0,0 +1,79 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import com.zd.laboratory.domain.vo.LabBuildFloorPage;
+import com.zd.laboratory.domain.vo.LabBuildFloorVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+public interface ILabBuildFloorService {
+
+    /**
+     * 查询楼栋楼层列表
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 楼栋楼层集合
+     */
+    public List <LabBuildFloor> selectLabBuildFloorList(LabBuildFloor labBuildFloor);
+
+
+    /**
+     * 新增楼栋楼层
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 结果
+     */
+    public int insertLabBuildFloor(LabBuildFloor labBuildFloor);
+
+    /**
+     * 修改楼栋楼层
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 结果
+     */
+    public int updateLabBuildFloor(LabBuildFloor labBuildFloor);
+
+
+    /**
+     * 查询楼栋楼层tree列表
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 楼栋楼层集合
+     */
+    public List<LabBuildFloorVo> getTreeList(LabBuildFloor labBuildFloor);
+
+
+    /**
+     * 查询楼栋(楼层)子集列表
+     *
+     * @param labBuildFloor 楼栋楼层
+     * @return 楼栋楼层集合
+     */
+    public LabBuildFloorPage getTreeSonList(LabBuildFloor labBuildFloor);
+
+
+
+    /**
+     * 批量删除楼栋(楼层)
+     *
+     * @param ids 需要删除的主键集合
+     * @return 结果
+     */
+    public int deleteLabBuildFloorByIds(Long[] ids);
+
+
+    /**
+     * 修改楼栋楼层sortNum
+     *
+     * @param labBuildFloorList 楼栋楼层
+     * @return 结果
+     */
+    public int updateSortNum(List<LabBuildFloor> labBuildFloorList);
+
+}

+ 79 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabExitLineVertexService.java

@@ -0,0 +1,79 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabExitLine;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 逃生线路顶点Service接口
+ *
+ * @author zd
+ * @date 2022-11-3
+ */
+public interface ILabExitLineVertexService
+{
+    /**
+     * 查询逃生线路主
+     *
+     * @param id 逃生线路主主键
+     * @return 逃生线路主
+     */
+    public LabExitLineVertex selectLabExitLineVertexById(Long id);
+
+
+    /**
+     * 查询逃生线路主列表
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 逃生线路主集合
+     */
+    public List<LabExitLineVertex> selectLabExitLineVertexList(LabExitLineVertex labExitLineVertex);
+
+
+    /**
+     * 查询逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主主键
+     * @return 逃生线路主
+     */
+    public int getCalculationLine(LabExitLineVertex labExitLineVertex);
+
+
+    /**
+     * 查询逃生线路主
+     *
+     * @param labExitLineEvacuationVo 逃生线路主主键
+     * @return 逃生线路主
+     */
+    public Map <String,Object> executeEvacuation(LabExitLineEvacuationVo labExitLineEvacuationVo);
+
+    /**
+     * 新增逃生线路主
+     *
+     * @param lineVertexVo 逃生线路主
+     * @return 结果
+     */
+    public int insertLabExitLineVertex(LabExitLineVertexVo lineVertexVo);
+
+    /**
+     * 修改逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 结果
+     */
+    public int updateLabExitLineVertex(LabExitLineVertex labExitLineVertex);
+
+    /**
+     * 批量删除逃生线路主
+     *
+     * @param ids 需要删除的逃生线路主主键集合
+     * @return 结果
+     */
+    public int deleteLabExitLineVertexByIds(Long[] ids);
+
+
+}

+ 42 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabExitPointRelayService.java

@@ -0,0 +1,42 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.LabExitPointRelay;
+import com.zd.laboratory.domain.vo.LabExitLineVertexVo;
+
+import java.util.List;
+
+/**
+ * 逃生灯关联的继电器Service接口
+ *
+ * @author cyl
+ * @date 2022/11/11
+ */
+public interface ILabExitPointRelayService {
+
+    /**
+     * 查询逃生灯关联的继电器列表
+     *
+     * @param labExitPointRelay 逃生灯关联的继电器
+     * @return 逃生灯关联的继电器集合
+     */
+    public List <LabExitPointRelay> selectLabExitPointRelayList(LabExitPointRelay labExitPointRelay);
+
+
+    /**
+     * 新增逃生灯关联的继电器
+     *
+     * @param labExitPointRelay 逃生灯关联的继电器
+     * @return 结果
+     */
+    public int insertLabExitPointRelay(LabExitPointRelay labExitPointRelay);
+
+    /**
+     * 修改逃生灯关联的继电器
+     *
+     * @param labExitPointRelay 逃生灯关联的继电器
+     * @return 结果
+     */
+    public int updateLabExitPointRelay(LabExitPointRelay labExitPointRelay);
+
+}

+ 28 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeContentService.java

@@ -0,0 +1,28 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabBuildFloor;
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.domain.vo.LabBuildFloorPage;
+import com.zd.laboratory.domain.vo.LabBuildFloorVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+public interface ILabNewnoticeContentService {
+
+    /**
+     * 查询新通知内容列表
+     *
+     * @param labNewnoticeContent 新通知内容
+     * @return 新通知内容集合
+     */
+    public List <LabNewnoticeContent> selectLabNewnoticeContentList(LabNewnoticeContent labNewnoticeContent);
+
+
+
+}

+ 25 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeGroupService.java

@@ -0,0 +1,25 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabNewnoticeGroup;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+public interface ILabNewnoticeGroupService {
+
+    /**
+     * 查询通知组列表
+     *
+     * @param labNewnoticeGroup 通知组
+     * @return 通知组集合
+     */
+    public List <LabNewnoticeGroup> selectLabNewnoticeGroupList(LabNewnoticeGroup labNewnoticeGroup);
+
+
+
+}

+ 26 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeModeService.java

@@ -0,0 +1,26 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabNewnoticeMode;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+import com.zd.laboratory.domain.vo.LabExitLineVertexVo;
+import com.zd.laboratory.domain.vo.LabNewnoticeSendmodeVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+public interface ILabNewnoticeModeService {
+
+    /**
+     * 查询发送类型列表
+     *
+     * @param labNewnoticeMode 发送类型
+     * @return 发送类型集合
+     */
+    public List <LabNewnoticeMode> selectLabNewnoticeModeList(LabNewnoticeMode labNewnoticeMode);
+
+}

+ 33 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabNewnoticeSendmodeService.java

@@ -0,0 +1,33 @@
+package com.zd.laboratory.service;
+
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+import com.zd.laboratory.domain.vo.LabNewnoticeSendmodeVo;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+public interface ILabNewnoticeSendmodeService {
+
+    /**
+     * 查询发送方式列表
+     *
+     * @param labNewnoticeSendmode 发送方式
+     * @return 发送方式集合
+     */
+    public List <LabNewnoticeSendmode> selectLabNewnoticeSendmodeList(LabNewnoticeSendmode labNewnoticeSendmode);
+
+
+    /**
+     * 新增发送方式
+     *
+     * @param labNewnoticeSendmodeVoList 发送方式
+     * @return 结果
+     */
+    public int insertLabNewnoticeSendmode(List<LabNewnoticeSendmodeVo> labNewnoticeSendmodeVoList);
+
+}

+ 8 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSubjectService.java

@@ -224,6 +224,14 @@ public interface ILabSubjectService {
     public List<LabSubject> selectLabSubjectListByadminidNotnull(LabSubject labSubject);
 
 
+    /***
+     * 查询关联布局图的实验室
+     * @param labSubject
+     * @return
+     */
+    public List<LabSubject> selectLabSubjectListByLayout(LabSubject labSubject);
+
+
 
     /**
      * 查询实验室列表

+ 84 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabBuildFloorLayoutServiceImpl.java

@@ -0,0 +1,84 @@
+package com.zd.laboratory.service.impl;
+
+import com.zd.common.core.utils.DictUtils;
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo;
+import com.zd.laboratory.mapper.LabBuildFloorLayoutMapper;
+import com.zd.laboratory.mapper.LabExitLineVertexMapper;
+import com.zd.laboratory.service.ILabBuildFloorLayoutService;
+import com.zd.system.api.entity.SysDictData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/18
+ */
+@Service
+public class LabBuildFloorLayoutServiceImpl implements ILabBuildFloorLayoutService {
+
+    @Autowired
+    private LabBuildFloorLayoutMapper labBuildFloorLayoutMapper;
+
+    @Autowired
+    private LabExitLineVertexMapper labExitLineVertexMapper;
+
+    @Override
+    public List <LabBuildFloorLayoutVo> selectLabBuildFloorLayoutList(LabBuildFloorLayout labBuildFloorLayout) {
+        List<SysDictData> dictDatas = DictUtils.getDictCache("layout_room_type");
+        SysDictData sysDictData = new SysDictData();
+        sysDictData.setDictLabel("其他");
+        sysDictData.setDictValue("-99");
+        dictDatas.add(sysDictData);
+        Consumer<LabBuildFloorLayoutVo> consumer = c->Optional.ofNullable(dictDatas).orElseGet(Collections::emptyList)
+                .stream()
+                .filter(b->b.getDictValue().equals(c.getRoomType()+""))
+                .forEach(b->{
+                    c.setRoomTypeName(b.getDictLabel());
+                });
+        return Optional.ofNullable(labBuildFloorLayoutMapper.selectLabBuildFloorLayoutList(labBuildFloorLayout))
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .map(a->{
+                    consumer.accept(a);
+                    return a;
+                }).collect(Collectors.toList());
+    }
+
+    @Override
+    public LabBuildFloorLayoutVo selectLabBuildFloorLayoutById(Long id) {
+        LabBuildFloorLayoutVo floorLayoutVo = labBuildFloorLayoutMapper.selectLabBuildFloorLayoutById(id);
+        LabExitLineVertex labExitLineVertex = new LabExitLineVertex();
+        labExitLineVertex.setBuildId(floorLayoutVo.getBuildId());
+        labExitLineVertex.setFloorId(floorLayoutVo.getFloorId());
+        List<LabExitLineVertex> exitLineVertexList = labExitLineVertexMapper.selectLabExitLineVertexList(labExitLineVertex);
+        if(exitLineVertexList.size()>0){
+            floorLayoutVo.setExitLineVertex(exitLineVertexList.get(0));
+        }
+        return floorLayoutVo;
+    }
+
+    @Override
+    public int insertLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout) {
+        return labBuildFloorLayoutMapper.insertLabBuildFloorLayout(labBuildFloorLayout);
+    }
+
+    @Override
+    public int updateLabBuildFloorLayout(LabBuildFloorLayout labBuildFloorLayout) {
+        return labBuildFloorLayoutMapper.updateLabBuildFloorLayout(labBuildFloorLayout);
+    }
+
+    @Override
+    public int deleteLabBuildFloorLayoutByIds(Long[] ids) {
+        return labBuildFloorLayoutMapper.deleteLabBuildFloorLayoutByIds(ids);
+    }
+}

+ 171 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabBuildFloorServiceImpl.java

@@ -0,0 +1,171 @@
+package com.zd.laboratory.service.impl;
+
+import com.github.pagehelper.PageInfo;
+import com.zd.common.core.exception.ServiceException;
+import com.zd.common.core.utils.SaveUtil;
+import com.zd.laboratory.domain.LabBuildFloor;
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.vo.*;
+import com.zd.laboratory.mapper.LabBuildFloorLayoutMapper;
+import com.zd.laboratory.mapper.LabBuildFloorMapper;
+import com.zd.laboratory.mapper.LabExitLineVertexMapper;
+import com.zd.laboratory.service.ILabBuildFloorService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/15
+ */
+@Service
+public class LabBuildFloorServiceImpl implements ILabBuildFloorService {
+
+    @Autowired
+    private LabBuildFloorMapper labBuildFloorMapper;
+
+    @Autowired
+    private LabExitLineVertexMapper labExitLineVertexMapper;
+
+    @Autowired
+    private LabBuildFloorLayoutMapper labBuildFloorLayoutMapper;
+
+    @Override
+    public List <LabBuildFloor> selectLabBuildFloorList(LabBuildFloor labBuildFloor) {
+        return labBuildFloorMapper.selectLabBuildFloorList(labBuildFloor);
+    }
+
+    @Override
+    public int insertLabBuildFloor(LabBuildFloor labBuildFloor) {
+        //设置其他公共字段
+        SaveUtil.setCommonAttr(labBuildFloor);
+        return labBuildFloorMapper.insertLabBuildFloor(labBuildFloor);
+    }
+
+    @Override
+    public int updateLabBuildFloor(LabBuildFloor labBuildFloor) {
+        return labBuildFloorMapper.updateLabBuildFloor(labBuildFloor);
+    }
+
+    @Override
+    public List <LabBuildFloorVo> getTreeList(LabBuildFloor labBuildFloor) {
+        List <LabBuildFloor> labBuildFloors = labBuildFloorMapper.selectLabBuildFloorList(labBuildFloor);
+        LabBuildFloorVo buildFloorVo = new LabBuildFloorVo();
+
+        //todo 返回父级下的所有子集列表
+        Function <LabBuildFloorVo,List <LabBuildFloorVo>> function = x->Optional.ofNullable(labBuildFloors).orElseGet(Collections::emptyList)
+                .stream()
+                .filter(y->y.getParentId()==x.getId())
+                .map(y->{
+                    LabBuildFloorVo buildFloorVo1 = new LabBuildFloorVo();
+                    BeanUtils.copyProperties(y,buildFloorVo1);
+                    return buildFloorVo1;
+                })
+                .sorted(Comparator.comparing(LabBuildFloorVo::getSortNo))
+                .collect(Collectors.toList());
+        //todo 赛选过滤院校数据
+        Optional.ofNullable(labBuildFloors).orElseGet(Collections::emptyList)
+                .stream()
+                .filter(a->a.getType()==1)
+                .map(a->{
+                    LabBuildFloorVo buildFloorVo1 = new LabBuildFloorVo();
+                    BeanUtils.copyProperties(a,buildFloorVo1);
+                    buildFloorVo.getBuildFloorVoList().add(buildFloorVo1);
+                    return buildFloorVo1;
+                })
+                .collect(Collectors.toList())
+                .stream()
+                .map(b->{
+                    b.getBuildFloorVoList().addAll(function.apply(b));
+                    return b;
+                }).flatMap(c->c.getBuildFloorVoList().parallelStream())
+                .forEach(d->{
+                    d.getBuildFloorVoList().addAll(function.apply(d));
+                });
+        //todo 重新给组织结构排序,因为上面的是并发收集数据
+        List <LabBuildFloorVo> collect = Optional.ofNullable(buildFloorVo.getBuildFloorVoList()).orElseGet(Collections::emptyList)
+                .stream()
+                .sorted(Comparator.comparing(LabBuildFloorVo::getSortNo))
+                .collect(Collectors.toList());
+
+        return collect;
+    }
+
+    @Override
+    public LabBuildFloorPage getTreeSonList(LabBuildFloor labBuildFloor) {
+        LabBuildFloorPage labBuildFloorPage = new LabBuildFloorPage();
+        if(labBuildFloor.getType().intValue()==1){
+            labBuildFloor.setParentId(labBuildFloor.getId());
+            List <LabBuildListVo> buildListVoList = labBuildFloorMapper.getTreeBuildList(labBuildFloor);
+            labBuildFloorPage.setTotal(new PageInfo(buildListVoList).getTotal());
+            labBuildFloorPage.setLabBuildList(new LabBuildList<LabBuildListVo>().getDataTable(buildListVoList));
+        }else if(labBuildFloor.getType().intValue()==2){
+            labBuildFloor.setParentId(labBuildFloor.getId());
+            List <LabFloorListVo> floorListVoList = labBuildFloorMapper.getTreeFloorList(labBuildFloor);
+            labBuildFloorPage.setTotal(new PageInfo(floorListVoList).getTotal());
+            labBuildFloorPage.setLabBuildList(new LabBuildList<LabFloorListVo>().getDataTable(floorListVoList));
+        }else if(labBuildFloor.getType().intValue()==3){
+            LabExitLineVertex labExitLineVertex = new LabExitLineVertex();
+            labExitLineVertex.setBuildId(labBuildFloor.getParentId());
+            labExitLineVertex.setFloorId(labBuildFloor.getId());
+            List<LabExitLineVertex> exitLineList = labExitLineVertexMapper.getExitLineVertexList(labExitLineVertex);
+            if(exitLineList.size()<1){
+                exitLineList.add(labExitLineVertex);
+            }
+            labBuildFloorPage.setTotal(new PageInfo(exitLineList).getTotal());
+            labBuildFloorPage.setLabBuildList(new LabBuildList<LabExitLineVertex>().getDataTable(exitLineList));
+        }
+        return labBuildFloorPage;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteLabBuildFloorByIds(Long[] ids) {
+        LabBuildFloor buildFloor = labBuildFloorMapper.selectLabBuildFloorById(ids[0]);
+        if(buildFloor.getType()==3){
+            LabBuildFloorLayout labBuildFloorLayout = new LabBuildFloorLayout();
+            labBuildFloorLayout.setBuildId(buildFloor.getParentId());
+            labBuildFloorLayout.setFloorId(buildFloor.getId());
+            List <LabBuildFloorLayoutVo> layoutVoList = labBuildFloorLayoutMapper.selectLabBuildFloorLayoutList(labBuildFloorLayout);
+            if(layoutVoList.size()>0){
+                throw new ServiceException("当前节点下有绑定实验室数据,请确认移除实验室数据后再次操作!");
+            }
+            LabExitLineVertex labExitLineVertex = new LabExitLineVertex();
+            labExitLineVertex.setBuildId(buildFloor.getParentId());
+            labExitLineVertex.setFloorId(buildFloor.getId());
+            labExitLineVertexMapper.deleteLabExitLineVertexByFloorId(labExitLineVertex);
+            return labBuildFloorMapper.deleteLabBuildFloorByIds(ids);
+        }else{
+            LabBuildFloor labBuildFloor = new LabBuildFloor();
+            //这里查询当前数据的信息
+            labBuildFloor.setParentId(ids[0]);
+            List <LabBuildFloor> buildFloorList = labBuildFloorMapper.selectLabBuildFloorList(labBuildFloor);
+            if(buildFloorList.size()>0){
+                throw new ServiceException("当前节点下有子节点,请确认移除子节点后再次操作!");
+            }
+            return labBuildFloorMapper.deleteLabBuildFloorByIds(ids);
+        }
+    }
+
+    @Override
+    public int updateSortNum(List <LabBuildFloor> labBuildFloorList) {
+        Optional.ofNullable(labBuildFloorList)
+                .orElseGet(Collections::emptyList)
+                .parallelStream()
+                .forEach(a->{
+                    labBuildFloorMapper.updateLabBuildFloor(a);
+                });
+        return 1;
+    }
+}

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

@@ -0,0 +1,635 @@
+package com.zd.laboratory.service.impl;
+
+import cn.hutool.core.date.StopWatch;
+import com.alibaba.fastjson.JSONArray;
+import com.zd.algorithm.api.speaker.entity.ParamVo;
+import com.zd.algorithm.api.speaker.entity.PlayVo;
+import com.zd.algorithm.api.speaker.feign.RemoteSpeakService;
+import com.zd.common.core.utils.*;
+import com.zd.laboratory.config.TimeWaitConfigUtils;
+import com.zd.laboratory.domain.LabAudioSynthesis;
+import com.zd.laboratory.domain.LabBuildFloorLayout;
+import com.zd.laboratory.domain.LabExitLineVertex;
+import com.zd.laboratory.domain.LabExitPointRelay;
+import com.zd.laboratory.domain.vo.*;
+import com.zd.laboratory.mapper.*;
+import com.zd.laboratory.service.ILabBuildFloorLayoutService;
+import com.zd.laboratory.service.ILabExitLineVertexService;
+import com.zd.laboratory.socket.command.Symbol;
+import com.zd.laboratory.socket.service.SocketService;
+import com.zd.model.domain.R;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.LongAdder;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * 逃生线路顶点Service业务层处理
+ *
+ * @author zd
+ * @date 2022-11-3
+ */
+@Service
+public class LabExitLineVertexServiceImpl implements ILabExitLineVertexService {
+    private final static Logger logger = LoggerFactory.getLogger(LabExitLineVertexServiceImpl.class);
+
+    private int V; // 顶点的个数
+    private static int M = 65535;// 设置一个最大值
+
+    @Autowired
+    private LabExitLineVertexMapper labExitLineVertexMapper;
+
+    @Autowired
+    private LabExitPointRelayMapper labExitPointRelayMapper;
+
+    @Autowired
+    private SocketService socketService;
+
+    @Autowired
+    private LabAudioSynthesisMapper labAudioSynthesisMapper;
+
+    @Autowired
+    private RemoteSpeakService remoteSpeakService;
+
+    @Autowired
+    private TimeWaitConfigUtils timeWaitConfigUtils;
+
+    @Autowired
+    private LabBuildFloorLayoutMapper labBuildFloorLayoutMapper;
+
+
+    private static final Logger log = LoggerFactory.getLogger(LabExitLineVertexServiceImpl.class);
+
+    /**
+     * 查询逃生线路主
+     *
+     * @param id 逃生线路主主键
+     * @return 逃生线路主
+     */
+    @Override
+    public LabExitLineVertex selectLabExitLineVertexById(Long id) {
+        LabExitLineVertex labExitLineVO = labExitLineVertexMapper.selectLabExitLineVertexById(id);
+        return labExitLineVO;
+    }
+
+
+    /**
+     * 查询逃生线路主列表
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 逃生线路主
+     */
+    @Override
+    public List <LabExitLineVertex> selectLabExitLineVertexList(LabExitLineVertex labExitLineVertex) {
+        List <LabExitLineVertex> labExitLineVOList = labExitLineVertexMapper.selectLabExitLineVertexList(labExitLineVertex);
+
+        return labExitLineVOList;
+    }
+
+
+    /**
+     * 查询逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主主键
+     * @return 逃生线路主
+     */
+    @Override
+    public int getCalculationLine(LabExitLineVertex labExitLineVertex) {
+//        List<LabExitLineVertex> labExitLineVOList = labExitLineVertexMapper.selectLabExitLineVertexList(labExitLineVertex);
+//        if(labExitLineVOList.size()>0){
+//            String relationData = labExitLineVOList.get(0).getRelationalData();
+//            List <LabExitLineJoinPointVO> relationalData = JSONArray.parseArray(relationData, LabExitLineJoinPointVO.class);
+//            V=relationalData.size();
+//            ArrayList <Integer[][]> list=flody(relationalData);
+//            display_path(list,relationalData);
+//        }
+        return 1;
+    }
+
+
+    /**
+     * 查询逃生线路主
+     *
+     * @param labExitLineEvacuationVo 逃生线路Vo
+     * @return 逃生线路主
+     */
+    @Override
+    public Map <String, Object> executeEvacuation(LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        //todo 根据实验室id查询出对应的pointName数据
+        LabBuildFloorLayout labBuildFloorLayout = new LabBuildFloorLayout();
+        labBuildFloorLayout.setBuildId(labExitLineEvacuationVo.getBuildId());
+        labBuildFloorLayout.setFloorId(labExitLineEvacuationVo.getFloorId());
+        labBuildFloorLayout.setSubId(labExitLineEvacuationVo.getSubId());
+        List <LabBuildFloorLayoutVo> layoutVoList = labBuildFloorLayoutMapper.selectLabBuildFloorLayoutList(labBuildFloorLayout);
+        if(layoutVoList.size()>0){
+            LabBuildFloorLayoutVo floorLayoutVo = layoutVoList.get(0);
+            labExitLineEvacuationVo.getBadPointNames().add(floorLayoutVo.getPointName());
+
+            LabExitLineVertex labExitLineVertex = new LabExitLineVertex();
+            labExitLineVertex.setBuildId(labExitLineEvacuationVo.getBuildId());
+            labExitLineVertex.setFloorId(labExitLineEvacuationVo.getFloorId());
+            List <LabExitLineVertex> labExitLineVOList = labExitLineVertexMapper.selectLabExitLineVertexList(labExitLineVertex);
+            if (labExitLineVOList.size() > 0) {
+                String relationData = labExitLineVOList.get(0).getRelationalData();
+                List <LabExitLineJoinPointVO> newRelationalData = JSONArray.parseArray(relationData, LabExitLineJoinPointVO.class);
+                //todo 这里赛选出pointName 的对应的key 的真实pointName 这里赛选门对应的坏点和实验室对应的起点标记坏点
+                Optional.ofNullable(newRelationalData)
+                        .orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->Optional.ofNullable(labExitLineEvacuationVo.getBadPointNames())
+                        .orElseGet(Collections::emptyList)
+                        .stream()
+                        .filter(b->b.equals(a.getKey()))
+                        .forEach(b->{
+                            //调用坏点计算
+                            badPoints(newRelationalData, a.getPointName());
+                            if(a.getKey().equals(floorLayoutVo.getPointName())){
+                                labExitLineEvacuationVo.setStartPointName(a.getPointName());
+                            }
+                        }));
+
+                //设置顶点数
+                V = newRelationalData.size();
+                //floyd计算顶点到各个点的线路
+                ArrayList <Integer[][]> list = flody(newRelationalData);
+
+                //这里需要在通过floyd计算一次原始数据,作为发生预案的楼层,只有一个疏散口,那么所有的实验室,都向这个疏散口撤离。
+                List <LabExitLineJoinPointVO> oldRelationalData = JSONArray.parseArray(relationData, LabExitLineJoinPointVO.class);
+                //todo 这里只赛选门对应的坏点的数据,用作计算备用线路用
+                Optional.ofNullable(oldRelationalData)
+                        .orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->Optional.ofNullable(labExitLineEvacuationVo.getBadPointNames())
+                                .orElseGet(Collections::emptyList)
+                                .stream()
+                                .filter(b->b.equals(a.getKey()))
+                                .forEach(b->{
+                                    //调用坏点计算
+                                    badPoints(newRelationalData, a.getPointName());
+                                }));
+                ArrayList <Integer[][]> oldList = flody(oldRelationalData);
+                //计算楼层各个实验室的逃生线路
+                Map <String, Object> joinPointVOS = displayPath(list, newRelationalData, labExitLineEvacuationVo, oldList, oldRelationalData);
+                return joinPointVOS;
+            }
+        }
+
+        return null;
+    }
+
+
+    //todo 计算坏点(目前只有发生预案的实验室需要标记为坏点),需要把非坏点关联坏点点位全部改成无限大
+    public void badPoints(List <LabExitLineJoinPointVO> newRelationalData, String badPointName) {
+        //这里计算预案发生的实验室坏点
+        Optional.ofNullable(newRelationalData).orElseGet(Collections::emptyList)
+                .parallelStream()
+                .filter(a -> !a.getPointName().equals(badPointName))
+                .forEach(a -> Optional.ofNullable(a.getPointVOList()).orElseGet(Collections::emptyList)
+                        .stream()
+                        .filter(b -> b.getPointName().equals(badPointName))
+                        .forEach(b -> b.setPointDistance(M))
+                );
+    }
+
+    //todo  计算完成的路线,灯的数据
+    public Map <String, Object> displayPath(ArrayList <Integer[][]> list, List <LabExitLineJoinPointVO> linePointVOList, LabExitLineEvacuationVo labExitLineEvacuationVo, ArrayList <Integer[][]> oldList, List <LabExitLineJoinPointVO> oldRelationalData) {
+
+        logger.info("当前线程:{}", Thread.currentThread().getName());
+
+        StopWatch sw = new StopWatch("queryLinePoint_TIME");
+        sw.start("调用异步任务");
+        //2.异步线程结果
+        List <CompletableFuture <Map <String, Object>>> completableFutures = new ArrayList <>();
+
+        Integer[][] path = list.get(0);
+        Integer[] chain = new Integer[V];
+        logger.info("orign->dist" + " dist " + " path");
+        for (int i = 0; i < V; i++) {
+            for (int j = 0; j < V; j++) {
+                if (i != j) {//只是避免了vi->vi的输出
+                    if (linePointVOList.get(i).getPointAttribute() == 4 && linePointVOList.get(i).getPointVOList().get(j).getPointAttribute() == 1) {
+                        CompletableFuture <Map <String, Object>> setCompletableFuture = optimalRoute(linePointVOList, path, chain, i, j, oldList, oldRelationalData,labExitLineEvacuationVo);
+                        completableFutures.add(setCompletableFuture);
+                    }
+                }
+            }
+        }
+        sw.stop();
+        CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()])).join();
+        logger.info("子线程全部完成");
+
+        return filterLinePoint(completableFutures, labExitLineEvacuationVo.getStartPointName(), labExitLineEvacuationVo);
+    }
+
+    //todo 预案触发实验室的主线路到逃生点全部返回,其他实验室赛选过滤最优线路,如果和主线路有重叠或者逆向,需要移除重叠以后的数据点。
+    public Map <String, Object> filterLinePoint(List <CompletableFuture <Map <String, Object>>> completableFutures, final String startPointName, LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        //todo 断言名字是否相同
+        Predicate <String> checkPointName = x -> startPointName.equals(x);
+        List <List <LabExitLineJoinPointVO>> startPointList = new ArrayList <>();
+        Map <String, Integer> sortKeyMap = new LinkedHashMap <>();
+        Map <String, List <LabExitLineJoinPointVO>> otherPointMap = new LinkedHashMap <>();
+        Optional.ofNullable(completableFutures).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a -> {
+                    try {
+                        String pointName = (String) a.get().get("pointName");
+                        if(StringUtils.isNotNull(pointName)){
+                            if (checkPointName.test(pointName)) {
+                                startPointList.add((List <LabExitLineJoinPointVO>) a.get().get("joinPointVOS"));
+                            } else {
+                                LabExitLineJoinPointVO pointDistanceVo = (LabExitLineJoinPointVO) a.get().get("pointDistanceVo");
+                                if (sortKeyMap.get(pointName) == null || sortKeyMap.get(pointName) > pointDistanceVo.getPointDistance()) {
+                                    sortKeyMap.put(pointName, pointDistanceVo.getPointDistance());
+                                    otherPointMap.put(pointName, (List <LabExitLineJoinPointVO>) a.get().get("joinPointVOS"));
+                                }
+                            }
+                        }
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    } catch (ExecutionException e) {
+                        e.printStackTrace();
+                    }
+                });
+
+
+        //todo 将过滤好的otherPointMap转换成list
+        Function <Map <String, List <LabExitLineJoinPointVO>>, List <List <LabExitLineJoinPointVO>>> otherPointList =
+                a -> a.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList());
+
+        Map <String, Object> allPointMap = new LinkedHashMap <>();
+        joinLine(allPointMap, startPointList, labExitLineEvacuationVo).accept(otherPointList.apply(otherPointMap));
+        //todo 开启逃生灯绑定继电器的数据
+        openLightJoinRelay((Set <LabExitLineJoinPointVO>) allPointMap.get("lightPointSet"),labExitLineEvacuationVo);
+        return allPointMap;
+    }
+
+    /**
+     * 开启逃生灯关联的继电器
+     *
+     * @param oldLightPointSet 疏散线路的所有需要开启的灯
+     */
+    public void openLightJoinRelay(Set <LabExitLineJoinPointVO> oldLightPointSet,LabExitLineEvacuationVo labExitLineEvacuationVo){
+        //这里重新构建一个set,过滤主线路里面的一些重复数据
+        Set<LabExitLineJoinPointVO> lightPointList = Optional.ofNullable(oldLightPointSet).orElseGet(Collections::emptySet)
+                .stream().collect(Collectors.toSet());
+
+        LabExitPointRelay labExitPointRelay = new LabExitPointRelay();
+        labExitPointRelay.setBuildId(labExitLineEvacuationVo.getBuildId());
+        labExitPointRelay.setFloorId(labExitLineEvacuationVo.getFloorId());
+        List <LabExitPointRelay> labExitPointRelays = labExitPointRelayMapper.selectLabExitPointRelayList(labExitPointRelay);
+        //todo 这里需要两层for循环,比对点名称一样的,开启继电器开关
+        Consumer<LabExitPointRelay> consumer = a->Optional.ofNullable(lightPointList).orElseGet(Collections::emptySet)
+                .stream()
+                .filter(b->b.getKey().equals(a.getPointName()))
+                .forEach(b->{
+                    try {
+                        if(a.getRelayType().intValue()==1){
+                            //这里打卡继电器的开关
+                            socketService.sendCommand(Symbol.order.control, a.getRelayCode(), Symbol.command.open, a.getRelayBit());
+                            Thread.sleep(timeWaitConfigUtils.getWaitTime());
+                        }
+
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                });
+        Optional.ofNullable(labExitPointRelays).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->consumer.accept(a));
+        //todo 调用楼层的喇叭
+        openHorn(labExitLineEvacuationVo);
+    }
+
+    /**
+     * 开启喇叭播放音乐
+     *
+     * @param labExitLineEvacuationVo 楼栋和楼层的基础数据
+     */
+    public void openHorn(LabExitLineEvacuationVo labExitLineEvacuationVo){
+        try{
+            //这里查询预案下的合成音乐
+            LabAudioSynthesis labAudioSynthesis = new LabAudioSynthesis();
+            labAudioSynthesis.setSceneType(2);
+            List<LabAudioSynthesis> audioSyntheses = labAudioSynthesisMapper.selectLabAudioSynthesisList(labAudioSynthesis);
+            if(audioSyntheses.size()>0){
+                //预案调用喇叭
+                R deviceList = remoteSpeakService.getDeviceList(1,10,labExitLineEvacuationVo.getFloorId());
+                if(deviceList.getCode()==200){
+                    List<Map<String,Object>> mapList = (List <Map <String, Object>>) deviceList.getData();
+                    for(Map<String,Object> map:mapList){
+                        log.info("喇叭日志============================="+map);
+                        if(StringUtils.isNotNull(map.get("deviceSn")) && StringUtils.isNotNull(map.get("port"))){
+                            List<PlayVo> playVoList = new ArrayList<>();
+                            PlayVo playVo = new PlayVo();
+                            playVo.setSn(map.get("deviceSn")+"");
+                            playVo.setDeviceIp(map.get("deviceIp")+"");
+                            playVo.setPort(Integer.parseInt(map.get("port")+""));
+                            ParamVo paramVo=new ParamVo();
+                            paramVo.setVol(Integer.parseInt(map.get("deviceVol").toString()));
+                            playVo.setParams(paramVo);
+                            playVoList.add(playVo);
+                            remoteSpeakService.textParseUrlAppIps(audioSyntheses.get(0).getNewMusicUrl(),playVoList);
+                        }
+                    }
+                }
+            }
+        }catch (Exception e){
+            log.error("开启喇叭失败!!!!!:"+e);
+        }
+    }
+
+
+    /**
+     * 关联过滤线路
+     *
+     * @param allPointMap 所有线路map
+     * @param startPointList 预案发生的点关联的所有线路
+     * @return 逃生线路主
+     */
+    public Consumer <List <List <LabExitLineJoinPointVO>>> joinLine(Map <String, Object> allPointMap, List <List <LabExitLineJoinPointVO>> startPointList, LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        Set <LabExitLineJoinPointVO> linePointSet = new LinkedHashSet <>();
+        Set <LabExitLineJoinPointVO> lightPointSet = new LinkedHashSet <>();
+        List <List <LabExitLineJoinPointVO>> groupPointList = new ArrayList <>();
+
+        //todo 添加一个过滤只有灯点的消费者
+        Consumer <List <LabExitLineJoinPointVO>> lightPoint = a -> Optional.ofNullable(a).orElseGet(Collections::emptyList)
+                .stream()
+                .filter(b -> b.getPointAttribute() == 2).forEach(b -> lightPointSet.add(b));
+        //todo 预案点保存线路和灯
+        Consumer <List <List <LabExitLineJoinPointVO>>> consumer1 = a -> Optional.ofNullable(a)
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(b -> {
+                    linePointSet.addAll(b);
+                    //属性是2,说明只返回灯点
+                    lightPoint.accept(b);
+                    //todo 在添加一个完成线路点的集合
+                    suppleBuildAndFloor(b.stream().collect(Collectors.toSet()), labExitLineEvacuationVo);
+                    groupPointList.add(b);
+                });
+        consumer1.accept(startPointList);
+
+        //todo 加一个子线路的消费者,如果子线路和主线路重合,需要给删除的delAdder添加1,否则0
+        LongAdder delAdder = new LongAdder();
+        Consumer <LabExitLineJoinPointVO> checkSonPoint = x -> startPointList.stream().forEach(b -> {
+            Optional.ofNullable(b).orElseGet(Collections::emptyList)
+                    .stream()
+                    .forEach(d -> {
+                        boolean bb = d.getPointName().equals(x.getPointName());
+                        if (bb && delAdder.intValue() == 0) {
+                            delAdder.increment();
+                        }
+                    });
+        });
+        //todo 其他点保存线路和灯
+        Consumer <List <List <LabExitLineJoinPointVO>>> consumer2 = a -> Optional.ofNullable(a)
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(b -> {
+                    //todo 这里判断是否一直删除,boolean不能传入,暂时用这个校验
+                    delAdder.reset();
+                    Optional.ofNullable(b).orElseGet(Collections::emptyList)
+                            .stream()
+                            .forEach(t -> {
+                                checkSonPoint.accept(t);
+                                if (delAdder.intValue() == 0) {
+                                    linePointSet.add(t);
+                                    //属性是2,说明只返回灯点
+                                    if (t.getPointAttribute() == 2) {
+                                        lightPointSet.add(t);
+                                    }
+                                }
+                            });
+                    //todo 在添加一个完成线路点的集合
+                    suppleBuildAndFloor(b.stream().collect(Collectors.toSet()), labExitLineEvacuationVo);
+                    groupPointList.add(b);
+                });
+
+        allPointMap.put("groupPointList", groupPointList);
+        //补全线路下的所有灯的部门id和楼层id
+        suppleBuildAndFloor(linePointSet, labExitLineEvacuationVo);
+        //补全灯点的部门id和楼层id
+        suppleBuildAndFloor(lightPointSet, labExitLineEvacuationVo);
+        allPointMap.put("linePointSet", linePointSet);
+        allPointMap.put("lightPointSet", lightPointSet);
+
+        return consumer2;
+    }
+
+
+    //补全部门id和楼层id
+    public void suppleBuildAndFloor(Set <LabExitLineJoinPointVO> lineSet, LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        lineSet.forEach(a -> {
+            a.setBuildId(labExitLineEvacuationVo.getBuildId());
+            a.setFloorId(labExitLineEvacuationVo.getFloorId());
+            a.setPointVOList(null);
+        });
+    }
+
+
+    //todo 针对实验室计算出当前实验室的各种线路,过滤到最优线路
+    public CompletableFuture <Map <String, Object>> optimalRoute(List <LabExitLineJoinPointVO> linePointVOList, Integer[][] path, Integer[] chain, int i, int j, ArrayList <Integer[][]> oldList, List <LabExitLineJoinPointVO> oldRelationalData,LabExitLineEvacuationVo labExitLineEvacuationVo) {
+        //输出源到目的地
+        logger.info("\n   " + (linePointVOList.get(i).getPointName()) + "->" + (linePointVOList.get(i).getPointVOList().get(j).getPointName()) + "     ");
+        //保存两个点之间的途径点。
+        List <LabExitLineJoinPointVO> joinPointVOS = new ArrayList <>();
+        //todo 这里用map保存三个结果,一个是计算好的线路,一个是顶点名称,一个是计算的顶点到最优线路距离.
+        Map <String, Object> joinPointMap = new HashMap <>();
+        //输出最短路径的长度
+        if (linePointVOList.get(i).getPointVOList().get(j).getPointDistance() == M) {
+            logger.info(" NA ");
+            //todo 这里原来是NA,也就是说没有匹配到线路,如果线路出现坏点,并且没有其他备用线路,那么就选择坏点线路
+            if(!labExitLineEvacuationVo.getStartPointName().equals(linePointVOList.get(i).getPointName())){
+                getHistoryLinePoint(oldRelationalData, oldList.get(0), chain, i, j, joinPointVOS);
+            }
+        } else {
+            getHistoryLinePoint(linePointVOList, path, chain, i, j, joinPointVOS);
+        }
+
+        joinPointMap.put("joinPointVOS", joinPointVOS);
+        if(joinPointVOS.size()>0){
+            joinPointMap.put("pointName", linePointVOList.get(i).getPointName());
+            joinPointMap.put("pointDistanceVo", linePointVOList.get(i).getPointVOList().get(j));
+        }
+
+        return CompletableFuture.completedFuture(joinPointMap);
+    }
+
+    //获取历史途径的线路点
+    public void getHistoryLinePoint(List <LabExitLineJoinPointVO> linePointVOList, Integer[][] path, Integer[] chain, int i, int j, List <LabExitLineJoinPointVO> joinPointVOS) {
+        logger.info(linePointVOList.get(i).getPointVOList().get(j).getPointDistance() + "      ");
+        int count = 0;
+        int k = j;
+        do {
+            k = chain[count++] = path[i][k];
+        } while (i != k);
+        chain = reverse(chain, count);
+        //输出路径
+        joinPointVOS.add(linePointVOList.get(chain[0]));
+        logger.info(linePointVOList.get(chain[0]).getPointName() + "##" + linePointVOList.get(chain[0]).getPointAttribute());
+
+        for (k = 1; k < count; k++) {
+            joinPointVOS.add(linePointVOList.get(chain[k]));
+            logger.info("->" + (linePointVOList.get(chain[k]).getPointName()) + "##" + linePointVOList.get(chain[k]).getPointAttribute());
+
+        }
+        joinPointVOS.add(linePointVOList.get(j));
+        logger.info("->" + linePointVOList.get(j).getPointName() + "##" + linePointVOList.get(j).getPointAttribute());
+    }
+
+    /**
+     * 新增逃生线路主
+     *
+     * @param lineVertexVo 逃生线路主
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int insertLabExitLineVertex(LabExitLineVertexVo lineVertexVo) {
+        LabExitLineVertex labExitLineVertex = new LabExitLineVertex();
+        labExitLineVertex.setBuildId(lineVertexVo.getBuildId());
+        labExitLineVertex.setFloorId(lineVertexVo.getFloorId());
+        labExitLineVertex.setRelationalData(JSONArray.toJSONString(lineVertexVo.getRelationalData()));
+        labExitLineVertex.setLayoutData(lineVertexVo.getLayoutData());
+        labExitLineVertex.setImgUrl(lineVertexVo.getImgUrl());
+        labExitLineVertex.setCanvasWidth(lineVertexVo.getCanvasWidth());
+        labExitLineVertex.setCanvasHeight(lineVertexVo.getCanvasHeight());
+        labExitLineVertexMapper.deleteLabExitLineVertexByFloorId(labExitLineVertex);
+        //设置其他公共字段
+        SaveUtil.setCommonAttr(labExitLineVertex);
+        labExitLineVertexMapper.insertLabExitLineVertex(labExitLineVertex);
+
+        //todo 循环插入点和实验室id关系布局数据
+        Consumer<List<LabBuildFloorLayout>> consumer = a -> Optional.ofNullable(a)
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(b->{
+                    //补全楼栋楼层id
+                    b.setBuildId(lineVertexVo.getBuildId());
+                    b.setFloorId(lineVertexVo.getFloorId());
+                    //设置其他公共字段
+                    SaveUtil.setCommonAttr(b);
+                    labBuildFloorLayoutMapper.insertLabBuildFloorLayout(b);
+                });
+        //todo 删除布局图点和实验室id关系数据
+        LabBuildFloorLayout labBuildFloorLayout = new LabBuildFloorLayout();
+        labBuildFloorLayout.setBuildId(lineVertexVo.getBuildId());
+        labBuildFloorLayout.setFloorId(lineVertexVo.getFloorId());
+        labBuildFloorLayoutMapper.deleteLabBuildFloorLayout(labBuildFloorLayout);
+        //todo 消费者调用函数
+        consumer.accept(lineVertexVo.getBuildFloorLayouts());
+
+
+        //todo 删除点和继电器绑定关系
+        LabExitPointRelay exitPointRelay = new LabExitPointRelay();
+        exitPointRelay.setBuildId(lineVertexVo.getBuildId());
+        exitPointRelay.setFloorId(lineVertexVo.getFloorId());
+        labExitPointRelayMapper.deleteLabExitPointRelay(exitPointRelay);
+        //todo 点和继电器绑定关系
+        Optional.ofNullable(lineVertexVo.getExitPointRelayList())
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    //补全楼栋楼层id
+                    a.setBuildId(lineVertexVo.getBuildId());
+                    a.setFloorId(lineVertexVo.getFloorId());
+                    //设置其他公共字段
+                    SaveUtil.setCommonAttr(a);
+                    labExitPointRelayMapper.insertLabExitPointRelay(a);
+                });
+//        Consumer<List<LabExitJoinSubpoint>> consumer = a -> Optional.ofNullable(a)
+//                .orElseGet(Collections::emptyList)
+//                .stream()
+//                .forEach(b->{
+//                    //补全楼栋楼层id
+//                    b.setBuildId(lineVertexVo.getBuildId());
+//                    b.setFloorId(lineVertexVo.getFloorId());
+//                    //设置其他公共字段
+//                    SaveUtil.setCommonAttr(b);
+//                    labExitJoinSubpointMapper.insertLabExitJoinSubpoint(b);
+//                });
+//        //todo 删除楼层的点和实验室id关系数据
+//        LabExitJoinSubpoint labExitJoinSubpoint = new LabExitJoinSubpoint();
+//        labExitJoinSubpoint.setBuildId(lineVertexVo.getBuildId());
+//        labExitJoinSubpoint.setFloorId(lineVertexVo.getFloorId());
+//        labExitJoinSubpointMapper.deleteLabExitJoinSubpointByFloorId(labExitJoinSubpoint);
+//        //todo 消费者调用函数
+//        consumer.accept(lineVertexVo.getJoinSubpointList());
+        return 1;
+    }
+
+
+    /**
+     * 修改逃生线路主
+     *
+     * @param labExitLineVertex 逃生线路主
+     * @return 结果
+     */
+    @Override
+    public int updateLabExitLineVertex(LabExitLineVertex labExitLineVertex) {
+        labExitLineVertex.setUpdateTime(DateUtils.getNowDate());
+        labExitLineVertex.setUpdateBy(SecurityUtils.getUsername());
+        return labExitLineVertexMapper.updateLabExitLineVertex(labExitLineVertex);
+    }
+
+    /**
+     * 批量删除逃生线路主
+     *
+     * @param ids 需要删除的逃生线路主主键
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteLabExitLineVertexByIds(Long[] ids) {
+        return 1;
+    }
+
+
+    public ArrayList <Integer[][]> flody(List <LabExitLineJoinPointVO> dist) {
+        Integer[][] path = new Integer[V][V];//存储的是从i->j经过的最后一个节点
+        for (int i = 0; i < V; i++) {
+            for (int j = 0; j < V; j++) {
+                path[i][j] = i;
+            }
+        }
+        for (int k = 0; k < V; k++) {
+            for (int i = 0; i < V; i++) {
+                for (int j = 0; j < V; j++) {
+                    if (dist.get(i).getPointVOList().get(j).getPointDistance() > MAXSUM(dist.get(i).getPointVOList().get(k).getPointDistance(), dist.get(k).getPointVOList().get(j).getPointDistance())) {
+                        path[i][j] = path[k][j];//存储的是从i->j经过的最后一个节点
+                        dist.get(i).getPointVOList().get(j).setPointDistance(MAXSUM(dist.get(i).getPointVOList().get(k).getPointDistance(), dist.get(k).getPointVOList().get(j).getPointDistance()));
+                    }
+                }
+            }
+        }
+        ArrayList <Integer[][]> list = new ArrayList <Integer[][]>();
+        list.add(path);
+        return list;
+    }
+
+
+    public static Integer[] reverse(Integer[] chain, int count) {
+        int temp;
+        for (int i = 0, j = count - 1; i < j; i++, j--) {
+            temp = chain[i];
+            chain[i] = chain[j];
+            chain[j] = temp;
+        }
+        return chain;
+    }
+
+    public static int MAXSUM(int a, int b) {
+        return (a != M && b != M) ? (a + b) : M;
+    }
+
+}

+ 46 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabExitPointRelayServiceImpl.java

@@ -0,0 +1,46 @@
+package com.zd.laboratory.service.impl;
+
+import com.zd.laboratory.domain.LabExitPointRelay;
+import com.zd.laboratory.mapper.LabExitPointRelayMapper;
+import com.zd.laboratory.service.ILabExitPointRelayService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/11
+ */
+@Service
+public class LabExitPointRelayServiceImpl implements ILabExitPointRelayService {
+
+    @Autowired
+    private LabExitPointRelayMapper labExitPointRelayMapper;
+
+    @Override
+    public List <LabExitPointRelay> selectLabExitPointRelayList(LabExitPointRelay labExitPointRelay) {
+        return labExitPointRelayMapper.selectLabExitPointRelayList(labExitPointRelay);
+    }
+
+    @Override
+    public int insertLabExitPointRelay(LabExitPointRelay labExitPointRelay) {
+        List <LabExitPointRelay> labExitPointRelays = labExitPointRelayMapper.selectLabExitPointRelayList(labExitPointRelay);
+        int flag;
+        if(labExitPointRelays.size()>0){
+            flag = labExitPointRelayMapper.updateLabExitPointRelay(labExitPointRelay);
+        }else{
+            flag = labExitPointRelayMapper.insertLabExitPointRelay(labExitPointRelay);
+        }
+        return flag;
+    }
+
+    @Override
+    public int updateLabExitPointRelay(LabExitPointRelay labExitPointRelay) {
+        return labExitPointRelayMapper.updateLabExitPointRelay(labExitPointRelay);
+    }
+
+
+}

+ 28 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeContentServiceImpl.java

@@ -0,0 +1,28 @@
+package com.zd.laboratory.service.impl;
+
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.mapper.LabBuildFloorMapper;
+import com.zd.laboratory.mapper.LabNewnoticeContentMapper;
+import com.zd.laboratory.service.ILabNewnoticeContentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@Service
+public class LabNewnoticeContentServiceImpl implements ILabNewnoticeContentService {
+
+    @Autowired
+    private LabNewnoticeContentMapper labNewnoticeContentMapper;
+
+    @Override
+    public List <LabNewnoticeContent> selectLabNewnoticeContentList(LabNewnoticeContent labNewnoticeContent) {
+        return labNewnoticeContentMapper.selectNewnoticeContentList(labNewnoticeContent);
+    }
+}

+ 30 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeGroupServiceImpl.java

@@ -0,0 +1,30 @@
+package com.zd.laboratory.service.impl;
+
+import com.zd.laboratory.domain.LabNewnoticeGroup;
+import com.zd.laboratory.domain.LabNewnoticeMode;
+import com.zd.laboratory.mapper.LabNewnoticeGroupMapper;
+import com.zd.laboratory.mapper.LabNewnoticeModeMapper;
+import com.zd.laboratory.service.ILabNewnoticeGroupService;
+import com.zd.laboratory.service.ILabNewnoticeModeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@Service
+public class LabNewnoticeGroupServiceImpl implements ILabNewnoticeGroupService {
+
+    @Autowired
+    private LabNewnoticeGroupMapper labNewnoticeGroupMapper;
+
+    @Override
+    public List <LabNewnoticeGroup> selectLabNewnoticeGroupList(LabNewnoticeGroup labNewnoticeGroup) {
+        return labNewnoticeGroupMapper.selectNewnoticeGroupList(labNewnoticeGroup);
+    }
+}

+ 30 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeModeServiceImpl.java

@@ -0,0 +1,30 @@
+package com.zd.laboratory.service.impl;
+
+import com.zd.laboratory.domain.LabNewnoticeMode;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+import com.zd.laboratory.mapper.LabNewnoticeModeMapper;
+import com.zd.laboratory.mapper.LabNewnoticeSendmodeMapper;
+import com.zd.laboratory.service.ILabNewnoticeModeService;
+import com.zd.laboratory.service.ILabNewnoticeSendmodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@Service
+public class LabNewnoticeModeServiceImpl implements ILabNewnoticeModeService {
+
+    @Autowired
+    private LabNewnoticeModeMapper labNewnoticeModeMapper;
+
+    @Override
+    public List <LabNewnoticeMode> selectLabNewnoticeModeList(LabNewnoticeMode labNewnoticeMode) {
+        return labNewnoticeModeMapper.selectNewnoticeModeList(labNewnoticeMode);
+    }
+}

+ 122 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabNewnoticeSendmodeServiceImpl.java

@@ -0,0 +1,122 @@
+package com.zd.laboratory.service.impl;
+
+import com.zd.common.core.utils.SaveUtil;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.laboratory.domain.LabNewnoticeContent;
+import com.zd.laboratory.domain.LabNewnoticeGroup;
+import com.zd.laboratory.domain.LabNewnoticeSendmode;
+import com.zd.laboratory.domain.vo.LabNewnoticeSendmodeVo;
+import com.zd.laboratory.mapper.LabNewnoticeContentMapper;
+import com.zd.laboratory.mapper.LabNewnoticeGroupMapper;
+import com.zd.laboratory.mapper.LabNewnoticeSendmodeMapper;
+import com.zd.laboratory.service.ILabNewnoticeSendmodeService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.atomic.LongAdder;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2022/11/29
+ */
+@Service
+public class LabNewnoticeSendmodeServiceImpl implements ILabNewnoticeSendmodeService {
+
+    @Autowired
+    private LabNewnoticeSendmodeMapper labNewnoticeSendmodeMapper;
+
+    @Autowired
+    private LabNewnoticeContentMapper labNewnoticeContentMapper;
+
+    @Autowired
+    private LabNewnoticeGroupMapper labNewnoticeGroupMapper;
+
+    @Override
+    public List <LabNewnoticeSendmode> selectLabNewnoticeSendmodeList(LabNewnoticeSendmode labNewnoticeSendmode) {
+        return labNewnoticeSendmodeMapper.selectNewnoticeSendModeList(labNewnoticeSendmode);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int insertLabNewnoticeSendmode(List<LabNewnoticeSendmodeVo> labNewnoticeSendmodeVoList) {
+        //todo 删除发送方式的数据和发送内容的数据。
+        if(labNewnoticeSendmodeVoList.size()>0){
+            LabNewnoticeSendmodeVo newnoticeSendmodeVo = labNewnoticeSendmodeVoList.get(0);
+            List <LabNewnoticeSendmode> newnoticeSendmodeList = labNewnoticeSendmodeMapper.selectNewnoticeSendModeList(newnoticeSendmodeVo);
+            List<Long> sendModeIds = Optional.ofNullable(newnoticeSendmodeList)
+                    .orElseGet(Collections::emptyList)
+                    .stream()
+                    .map(a->{
+                        return a.getId();
+                    }).collect(Collectors.toList());
+            //删除发送方式数据
+            if(sendModeIds.size()>0){
+                labNewnoticeSendmodeMapper.deleteSendmodeListByIds(sendModeIds);
+
+                List <LabNewnoticeContent> newnoticeContentList = labNewnoticeContentMapper.getListByIds(sendModeIds);
+                List<Long> sendContentIds = Optional.ofNullable(newnoticeContentList)
+                        .orElseGet(Collections::emptyList)
+                        .stream()
+                        .map(a->{
+                            return a.getId();
+                        }).collect(Collectors.toList());
+                if(sendContentIds.size()>0){
+                    labNewnoticeContentMapper.deleteSendContentListByIds(sendContentIds);
+                }
+            }
+
+
+
+
+            //todo 字符串保存发送方式
+            StringBuffer buffer = new StringBuffer();
+            //todo 这里插入发送方式的数据
+            Optional.ofNullable(labNewnoticeSendmodeVoList)
+                    .orElseGet(Collections::emptyList)
+                    .stream()
+                    .forEach(t->{
+                        buffer.append(t.getSendMode()).append(",");
+                        LabNewnoticeSendmode labNewnoticeSendmode = new LabNewnoticeSendmode();
+                        BeanUtils.copyProperties(t,labNewnoticeSendmode);
+                        //设置其他公共字段
+                        SaveUtil.setCommonAttr(labNewnoticeSendmode);
+                        labNewnoticeSendmodeMapper.insertLabNewnoticeSendmode(labNewnoticeSendmode);
+
+                        //todo 这里需要插入发送内容的数据
+                        LongAdder count = new LongAdder();
+                        Optional.ofNullable(t.getContentList())
+                                .orElseGet(Collections::emptyList)
+                                .stream()
+                                .forEach(a->{
+                                    count.increment();
+                                    a.setNoticeModeId(labNewnoticeSendmode.getId());
+                                    a.setSortNum(count.intValue());
+                                    //设置其他公共字段
+                                    SaveUtil.setCommonAttr(a);
+                                    labNewnoticeContentMapper.insertLabNewnoticeContent(a);
+                                });
+                    });
+            //todo 修改组通知的选项卡数据
+            if(StringUtils.isNotNull(newnoticeSendmodeVo)){
+                LabNewnoticeGroup labNewnoticeGroup = new LabNewnoticeGroup();
+                labNewnoticeGroup.setId(newnoticeSendmodeVo.getGroupId());
+                labNewnoticeGroup.setSendMode(buffer.substring(0,buffer.length()-1));
+                SaveUtil.setCommonAttr(labNewnoticeGroup);
+                labNewnoticeGroupMapper.updateNewnoticeGroup(labNewnoticeGroup);
+            }
+        }
+
+
+
+        return 1;
+    }
+}

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

@@ -440,6 +440,11 @@ public class LabSubjectServiceImpl implements ILabSubjectService {
         return labSubjectMapper.selectLabSubjectListByadminidNotnull(labSubject);
     }
 
+    @Override
+    public List <LabSubject> selectLabSubjectListByLayout(LabSubject labSubject) {
+        return labSubjectMapper.selectLabSubjectListByLayout(labSubject);
+    }
+
 
     /**
      * 查询实验室列表

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

@@ -8,16 +8,17 @@ import com.zd.laboratory.socket.constant.SocketTypes;
 import com.zd.laboratory.socket.service.BaseRouter;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.socket.vo.TransmissionVo;
-import com.zd.laboratory.utils.CRCCHECK;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.net.Socket;
 import java.net.SocketException;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * @author dgs
@@ -113,7 +114,7 @@ public class TCPServer implements Runnable {
         try {
             data = data.replace(" ", "").toUpperCase();
             cacheMap.put(data, socket.getOutputStream());
-            log.warn("化学品智能柜锁连接,采集器编号:" + data);
+            log.info("化学品智能柜锁连接,采集器编号:" + data);
         }catch (Exception e){
             log.error(e.toString());
         }

+ 141 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorLayoutMapper.xml

@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabBuildFloorLayoutMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabBuildFloorLayout" id="LabBuildFloorLayoutResult">
+        <result property="id"    column="id"    />
+        <result property="buildId"    column="build_id"    />
+        <result property="floorId"    column="floor_id"    />
+        <result property="subId"    column="sub_id"    />
+        <result property="roomNum"    column="room_num"    />
+        <result property="roomName"    column="room_name"    />
+        <result property="roomType"    column="room_type"    />
+        <result property="pointName"    column="point_name"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabBuildFloorLayoutVo">
+        select t.id,
+        (select bf.name from lab_build_floor bf where bf.id = t.build_id) buildName,
+        (select bf.name from lab_build_floor bf where bf.id = t.floor_id) floorName,
+        t.build_id, t.floor_id, t.sub_id, t.room_num, t.room_name, t.room_type, t.point_name, t.user_id,
+        t.create_by, t.create_time, t.update_by, t.update_time, t.remark,
+        (select st.name from lab_subject st where st.id = t.sub_id) subName
+        from lab_build_floor_layout as t
+    </sql>
+
+    <sql id="selectLabBuildFloorLayoutListVo">
+        select t.id, t.build_id, t.floor_id, t.sub_id, t.room_num, t.room_name, t.room_type, t.point_name, t.user_id,
+        (SELECT su.nick_name FROM sys_user su WHERE su.user_id = t.`user_id`) create_by,
+        t.create_time, t.update_by, t.update_time, t.remark,
+        (select st.name from lab_subject st where st.id = t.sub_id) subName from lab_build_floor_layout as t
+    </sql>
+
+    <select id="selectLabBuildFloorLayoutList" parameterType="com.zd.laboratory.domain.LabBuildFloorLayout" resultType="com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo">
+        <include refid="selectLabBuildFloorLayoutListVo"/>
+        <where>
+            <if test="searchValue != null  and searchValue != '' ">
+                and (
+                  t.room_num like concat('%', #{searchValue}, '%') or
+                  t.room_name like concat('%', #{searchValue}, '%')
+                )
+            </if>
+            <if test="roomType != null "> and t.room_type = #{roomType}</if>
+            <if test="buildId != null "> and t.build_id = #{buildId}</if>
+            <if test="floorId != null "> and t.floor_id = #{floorId}</if>
+            <if test="subId != null "> and t.sub_id = #{subId}</if>
+        </where>
+    </select>
+    <select id="selectLabBuildFloorLayoutById" resultType="com.zd.laboratory.domain.vo.LabBuildFloorLayoutVo">
+        <include refid="selectLabBuildFloorLayoutVo"/>
+        where id = #{id}
+    </select>
+
+
+    <insert id="insertLabBuildFloorLayout" parameterType="com.zd.laboratory.domain.LabBuildFloorLayout" useGeneratedKeys="true" keyProperty="id">
+        insert into lab_build_floor_layout
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+
+            <if test="buildId != null">build_id,</if>
+
+            <if test="floorId != null">floor_id,</if>
+
+            <if test="subId != null">sub_id,</if>
+
+            <if test="roomNum != null">room_num,</if>
+
+            <if test="roomName != null">room_name,</if>
+
+            <if test="roomType != null">room_type,</if>
+
+            <if test="pointName != null">point_name,</if>
+
+            <if test="userId != null">user_id,</if>
+
+            <if test="createBy != null">create_by,</if>
+
+            <if test="createTime != null">create_time,</if>
+
+            <if test="updateBy != null">update_by,</if>
+
+            <if test="updateTime != null">update_time,</if>
+
+            <if test="remark != null">remark,</if>
+
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="buildId != null">#{buildId},</if>
+            <if test="floorId != null">#{floorId},</if>
+            <if test="subId != null">#{subId},</if>
+            <if test="roomNum != null">#{roomNum},</if>
+            <if test="roomName != null">#{roomName},</if>
+            <if test="roomType != null">#{roomType},</if>
+            <if test="pointName != null">#{pointName},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+    <update id="updateLabBuildFloorLayout" parameterType="com.zd.laboratory.domain.LabBuildFloorLayout">
+        update lab_build_floor_layout
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="buildId != null">build_id = #{buildId},</if>
+            <if test="floorId != null">floor_id = #{floorId},</if>
+            <if test="subId != null">sub_id = #{subId},</if>
+            <if test="roomNum != null">room_num = #{roomNum},</if>
+            <if test="roomName != null">room_name = #{roomName},</if>
+            <if test="roomType != null">room_type = #{roomType},</if>
+            <if test="pointName != null">point_name = #{pointName},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteLabBuildFloorLayout" parameterType="com.zd.laboratory.domain.LabBuildFloorLayout">
+        delete from lab_build_floor_layout where build_id = #{buildId} and floor_id = #{floorId}
+    </delete>
+
+    <delete id="deleteLabBuildFloorLayoutByIds">
+        delete from lab_build_floor_layout where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 137 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorMapper.xml

@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabBuildFloorMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabBuildFloor" id="LabBuildFloorResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="type"    column="type"    />
+        <result property="imgUrl"    column="img_url"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="sortNo"    column="sort_no"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabBuildFloorVo">
+        select id,`name`,`type`, img_url, parent_id, sort_no, user_id, create_by, create_time, update_by, update_time, remark from lab_build_floor
+    </sql>
+
+    <sql id="selectLabBuildFloorListVo">
+        select t.id,t.`name`,t.`type`, t.img_url, t.parent_id, t.sort_no, t.user_id, t.create_by, t.create_time, t.update_by, t.update_time, t.remark from lab_build_floor as t
+    </sql>
+
+    <select id="selectLabBuildFloorList" parameterType="com.zd.laboratory.domain.LabBuildFloor" resultMap="LabBuildFloorResult">
+        <include refid="selectLabBuildFloorVo"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="parentId != null "> and parent_id = #{parentId}</if>
+        </where>
+    </select>
+
+    <select id="getTreeBuildList" parameterType="com.zd.laboratory.domain.LabBuildFloor" resultType="com.zd.laboratory.domain.vo.LabBuildListVo">
+      select t.id,t.`name`,t.`type`, t.img_url, t.parent_id, t.sort_no, t.user_id, t.create_by,
+       t.create_time, t.update_by, t.update_time, t.remark,
+        IFNULL((SELECT COUNT(1) FROM lab_build_floor f WHERE f.parent_id = t.`id`),0) floorNum,
+        IFNULL((SELECT COUNT(1) FROM lab_build_floor bf INNER JOIN lab_build_floor_layout bfl
+        ON bf.id = bfl.floor_id  AND bf.parent_id = bfl.build_id WHERE bf.parent_id = t.`id`),0) roomNum,
+        (select bf.name from lab_build_floor bf where bf.id = t.parent_id) groupName
+       from lab_build_floor as t
+        <where>
+            <if test="parentId != null "> and t.parent_id = #{parentId}</if>
+        </where>
+       order by t.sort_no asc
+    </select>
+
+    <select id="getTreeFloorList" resultType="com.zd.laboratory.domain.vo.LabFloorListVo">
+        select t.id,t.`name`,t.`type`, t.img_url, t.parent_id, t.sort_no, t.user_id, t.create_by,
+        t.create_time, t.update_by, t.update_time, t.remark,
+        (select lbf.name from lab_build_floor lbf where lbf.id = (select bf.parent_id from lab_build_floor bf where bf.id = t.parent_id)) groupName,
+        (select bf.name from lab_build_floor bf where bf.id = t.parent_id) buildName,
+        elv.layout_data layoutData
+        FROM lab_build_floor AS t LEFT JOIN lab_exit_line_vertex elv ON t.`id` = elv.`floor_id` AND t.`parent_id` = elv.`build_id`
+        <where>
+            <if test="parentId != null "> and t.parent_id = #{parentId}</if>
+        </where>
+        order by t.sort_no asc
+    </select>
+    <select id="selectLabBuildFloorById" resultType="com.zd.laboratory.domain.LabBuildFloor">
+        <include refid="selectLabBuildFloorVo"/>
+        where id = #{id}
+    </select>
+
+
+    <insert id="insertLabBuildFloor" parameterType="com.zd.laboratory.domain.LabBuildFloor" useGeneratedKeys="true" keyProperty="id">
+        insert into lab_build_floor
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+
+            <if test="name != null">name,</if>
+
+            <if test="type != null">type,</if>
+
+            <if test="imgUrl != null">img_url,</if>
+
+            <if test="parentId != null">parent_id,</if>
+
+            <if test="sortNo != null">sort_no,</if>
+
+            <if test="userId != null">user_id,</if>
+
+            <if test="createBy != null">create_by,</if>
+
+            <if test="createTime != null">create_time,</if>
+
+            <if test="updateBy != null">update_by,</if>
+
+            <if test="updateTime != null">update_time,</if>
+
+            <if test="remark != null">remark,</if>
+
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="type != null">#{type},</if>
+            <if test="imgUrl != null">#{imgUrl},</if>
+            <if test="parentId != null">#{parentId},</if>
+            <if test="sortNo != null">#{sortNo},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+    <update id="updateLabBuildFloor" parameterType="com.zd.laboratory.domain.LabBuildFloor">
+        update lab_build_floor
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="imgUrl != null">img_url = #{imgUrl},</if>
+            <if test="parentId != null">parent_id = #{parentId},</if>
+            <if test="sortNo != null">sort_no = #{sortNo},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteLabBuildFloorByIds">
+        delete from lab_build_floor where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 140 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabExitLineVertexMapper.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabExitLineVertexMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabExitLineVertex" id="LabExitLineVertexResult">
+        <result property="id"    column="id"    />
+        <result property="buildId"    column="build_id"    />
+        <result property="floorId"    column="floor_id"    />
+        <result property="relationalData"    column="relational_data"    />
+        <result property="layoutData"    column="layout_data"    />
+        <result property="imgUrl"    column="img_url"    />
+        <result property="canvasWidth"    column="canvas_width"    />
+        <result property="canvasHeight"    column="canvas_height"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabExitLineVertexVo">
+        select id,build_id, floor_id, relational_data, layout_data, img_url, canvas_width, canvas_height, user_id, create_by, create_time,
+        update_by, update_time, remark from lab_exit_line_vertex
+    </sql>
+    <sql id="selectLabExitLineListVo">
+        select t.id,t.build_id, t.floor_id, t.relational_data, t.layout_data, t.img_url, t.canvas_width, t.canvas_height, t.user_id, t.create_by, t.create_time,
+        t.update_by, t.update_time, t.remark from lab_exit_line_vertex as t
+    </sql>
+    <select id="selectLabExitLineVertexList" parameterType="com.zd.laboratory.domain.LabExitLineVertex" resultMap="LabExitLineVertexResult">
+        <include refid="selectLabExitLineVertexVo"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="buildId != null "> and build_id = #{buildId}</if>
+            <if test="floorId != null "> and floor_id = #{floorId}</if>
+        </where>
+    </select>
+
+
+    <select id="selectLabExitLineVertexById"  resultType="com.zd.laboratory.domain.LabExitLineVertex">
+        <include refid="selectLabExitLineVertexVo"/>
+        where id = #{id}
+    </select>
+
+
+    <select id="getExitLineVertexList" parameterType="com.zd.laboratory.domain.LabExitLineVertex" resultMap="LabExitLineVertexResult">
+        <include refid="selectLabExitLineVertexVo"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="buildId != null "> and build_id = #{buildId}</if>
+            <if test="floorId != null "> and floor_id = #{floorId}</if>
+        </where>
+    </select>
+
+    <insert id="insertLabExitLineVertex" parameterType="com.zd.laboratory.domain.LabExitLineVertex" useGeneratedKeys="true" keyProperty="id">
+        insert into lab_exit_line_vertex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+
+    <if test="buildId != null">build_id,</if>
+
+    <if test="floorId != null">floor_id,</if>
+
+    <if test="relationalData != null">relational_data,</if>
+
+    <if test="layoutData != null">layout_data,</if>
+
+    <if test="imgUrl != null">img_url,</if>
+
+    <if test="canvasWidth != null">canvas_width,</if>
+
+    <if test="canvasHeight != null">canvas_height,</if>
+
+    <if test="userId != null">user_id,</if>
+
+    <if test="createBy != null">create_by,</if>
+
+    <if test="createTime != null">create_time,</if>
+
+    <if test="updateBy != null">update_by,</if>
+
+    <if test="updateTime != null">update_time,</if>
+
+    <if test="remark != null">remark,</if>
+
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+    <if test="buildId != null">#{buildId},</if>
+    <if test="floorId != null">#{floorId},</if>
+    <if test="relationalData != null">#{relationalData},</if>
+    <if test="layoutData != null">#{layoutData},</if>
+    <if test="imgUrl != null">#{imgUrl},</if>
+    <if test="canvasWidth != null">#{canvasWidth},</if>
+    <if test="canvasHeight != null">#{canvasHeight},</if>
+    <if test="userId != null">#{userId},</if>
+    <if test="createBy != null">#{createBy},</if>
+    <if test="createTime != null">#{createTime},</if>
+    <if test="updateBy != null">#{updateBy},</if>
+    <if test="updateTime != null">#{updateTime},</if>
+    <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateLabExitLineVertex" parameterType="com.zd.laboratory.domain.LabExitLineVertex">
+        update lab_exit_line_vertex
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="buildId != null">build_id = #{buildId},</if>
+            <if test="floorId != null">floor_id = #{floorId},</if>
+            <if test="relationalData != null">relational_data = #{relationalData},</if>
+            <if test="layoutData != null">layout_data = #{layoutData},</if>
+            <if test="imgUrl != null">img_url = #{imgUrl},</if>
+            <if test="canvasWidth != null">canvas_width = #{canvasWidth},</if>
+            <if test="canvasHeight != null">canvas_height = #{canvasHeight},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteLabExitLineVertexById" >
+        delete from lab_exit_line_vertex where id = #{id}
+    </delete>
+
+    <delete id="deleteLabExitLineVertexByIds">
+        delete from lab_exit_line_vertex where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+
+    <delete id="deleteLabExitLineVertexByFloorId" parameterType="com.zd.laboratory.domain.LabExitLineVertex">
+        delete from lab_exit_line_vertex where build_id = #{buildId} and floor_id = #{floorId}
+    </delete>
+</mapper>

+ 119 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabExitPointRelayMapper.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabExitPointRelayMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabExitPointRelay" id="LabExitPointRelayResult">
+        <result property="id"    column="id"    />
+        <result property="buildId"    column="build_id"    />
+        <result property="floorId"    column="floor_id"    />
+        <result property="pointName"    column="point_name"    />
+        <result property="relayType"    column="relay_type"    />
+        <result property="relayCode"    column="relay_code"    />
+        <result property="relayBit"    column="relay_bit"    />
+        <result property="configName"    column="config_name"    />
+        <result property="configStatus"    column="config_status"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabExitPointRelayVo">
+        select id,build_id, floor_id, point_name, relay_type, relay_code, relay_bit, config_name, config_status, user_id, create_by, create_time, update_by, update_time, remark from lab_exit_point_relay
+    </sql>
+    <sql id="selectLabExitLineListVo">
+        select t.id,t.build_id, t.floor_id, t.point_name, t.relay_type, t.relay_code, t.relay_bit, t.config_name, t.config_status, t.user_id, t.create_by, t.create_time, t.update_by, t.update_time, t.remark from lab_exit_point_relay as t
+    </sql>
+
+    <select id="selectLabExitPointRelayList" parameterType="com.zd.laboratory.domain.LabExitPointRelay" resultMap="LabExitPointRelayResult">
+        <include refid="selectLabExitPointRelayVo"/>
+        <where>
+            <if test="id != null "> and id = #{id}</if>
+            <if test="buildId != null "> and build_id = #{buildId}</if>
+            <if test="floorId != null "> and floor_id = #{floorId}</if>
+            <if test="pointName != null "> and point_name = #{pointName}</if>
+        </where>
+    </select>
+
+
+    <insert id="insertLabExitPointRelay" parameterType="com.zd.laboratory.domain.LabExitPointRelay" useGeneratedKeys="true" keyProperty="id">
+        insert into lab_exit_point_relay
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+
+            <if test="buildId != null">build_id,</if>
+
+            <if test="floorId != null">floor_id,</if>
+
+            <if test="pointName != null">point_name,</if>
+
+            <if test="relayType != null">relay_type,</if>
+
+            <if test="relayCode != null">relay_code,</if>
+
+            <if test="relayBit != null">relay_bit,</if>
+
+            <if test="configName != null">config_name,</if>
+
+            <if test="configStatus != null">config_status,</if>
+
+            <if test="userId != null">user_id,</if>
+
+            <if test="createBy != null">create_by,</if>
+
+            <if test="createTime != null">create_time,</if>
+
+            <if test="updateBy != null">update_by,</if>
+
+            <if test="updateTime != null">update_time,</if>
+
+            <if test="remark != null">remark,</if>
+
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="buildId != null">#{buildId},</if>
+            <if test="floorId != null">#{floorId},</if>
+            <if test="pointName != null">#{pointName},</if>
+            <if test="relayType != null">#{relayType},</if>
+            <if test="relayCode != null">#{relayCode},</if>
+            <if test="relayBit != null">#{relayBit},</if>
+            <if test="configName != null">#{configName},</if>
+            <if test="configStatus != null">#{configStatus},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+
+    <update id="updateLabExitPointRelay" parameterType="com.zd.laboratory.domain.LabExitPointRelay">
+        update lab_exit_point_relay
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="buildId != null">build_id = #{buildId},</if>
+            <if test="floorId != null">floor_id = #{floorId},</if>
+            <if test="pointName != null">point_name = #{pointName},</if>
+            <if test="relayType != null">relay_type = #{relayType},</if>
+            <if test="relayCode != null">relay_code = #{relayCode},</if>
+            <if test="relayBit != null">relay_bit = #{relayBit},</if>
+            <if test="configName != null">config_name = #{configName},</if>
+            <if test="configStatus != null">config_status = #{configStatus},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where point_name = #{pointName}
+    </update>
+
+    <delete id="deleteLabExitPointRelay" parameterType="com.zd.laboratory.domain.LabExitPointRelay">
+        delete from lab_exit_point_relay where build_id = #{buildId} and floor_id = #{floorId}
+    </delete>
+</mapper>

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

@@ -134,7 +134,6 @@
         </where>
     </select>
 
-
     <select id="selectLabHardwareList" parameterType="com.zd.laboratory.domain.LabHardware"
             resultMap="LabHardwareVOResult">
         <include refid="selectLabHardwareVo"/>
@@ -155,7 +154,7 @@
                 and (xx.hardware_num like concat('%',#{searchValue},'%')
                 or
                 xx.subject_name like concat('%',#{searchValue},'%')
-                <if test="type == @com.zd.common.core.enums.HardwareTypeEnum@AI_CABINETLOCK ">
+                <if test="type == @com.zd.model.enums.HardwareTypeEnum@AI_CABINETLOCK ">
                     or
                     xx.name like concat('%',#{searchValue},'%')
                     or

+ 100 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeContentMapper.xml

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabNewnoticeContentMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabNewnoticeContent" id="LabNewnoticeContentResult">
+        <result property="id"    column="id"    />
+        <result property="noticeModeId"    column="notice_mode_id"    />
+        <result property="noticeType"    column="notice_type"    />
+        <result property="variableLevel"    column="variable_level"    />
+        <result property="noticeContent"    column="notice_content"    />
+        <result property="sortNum"    column="sort_num"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabNewnoticeContentVo">
+        select id,`notice_mode_id`,`notice_type`, variable_level, notice_content, sort_num, user_id, create_by,
+        create_time, update_by, update_time, remark from lab_newnotice_content
+    </sql>
+
+    <sql id="selectLabNewnoticeContentListVo">
+        select t.id,t.`notice_mode_id`,t.`notice_type`, t.variable_level, t.notice_content, t.sort_num, t.user_id,
+        t.create_by, t.create_time, t.update_by, t.update_time, t.remark from lab_newnotice_content as t
+    </sql>
+
+    <select id="selectNewnoticeContentList" parameterType="com.zd.laboratory.domain.LabNewnoticeContent" resultMap="LabNewnoticeContentResult">
+        <include refid="selectLabNewnoticeContentListVo"/>
+        <where>
+            <if test="id != null "> and t.id = #{id}</if>
+            <if test="noticeModeId != null "> and t.notice_mode_id = #{noticeModeId}</if>
+        </where>
+    </select>
+
+
+    <select id="getListByIds" resultMap="LabNewnoticeContentResult">
+        <include refid="selectLabNewnoticeContentListVo"/>
+        where
+          t.`notice_mode_id` in
+            <foreach item="id" collection="list" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+    </select>
+
+    <insert id="insertLabNewnoticeContent"  parameterType="com.zd.laboratory.domain.LabNewnoticeContent" useGeneratedKeys="true" keyProperty="id">
+        insert into lab_newnotice_content
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+
+            <if test="noticeModeId != null">notice_mode_id,</if>
+
+            <if test="noticeType != null">notice_type,</if>
+
+            <if test="variableLevel != null">variable_level,</if>
+
+            <if test="noticeContent != null">notice_content,</if>
+
+            <if test="sortNum != null">sort_num,</if>
+
+            <if test="userId != null">user_id,</if>
+
+            <if test="createBy != null">create_by,</if>
+
+            <if test="createTime != null">create_time,</if>
+
+            <if test="updateBy != null">update_by,</if>
+
+            <if test="updateTime != null">update_time,</if>
+
+            <if test="remark != null">remark,</if>
+
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="noticeModeId != null">#{noticeModeId},</if>
+            <if test="noticeType != null">#{noticeType},</if>
+            <if test="variableLevel != null">#{variableLevel},</if>
+            <if test="noticeContent != null">#{noticeContent},</if>
+            <if test="sortNum != null">#{sortNum},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+        </trim>
+
+    </insert>
+
+    <delete id="deleteSendContentListByIds">
+        delete from lab_newnotice_content where id in
+        <foreach item="id" collection="list" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 54 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeGroupMapper.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabNewnoticeGroupMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabNewnoticeGroup" id="LabNewnoticeGroupResult">
+        <result property="id"    column="id"    />
+        <result property="groupName"    column="group_name"    />
+        <result property="groupValue"    column="group_value"    />
+        <result property="sendMode"    column="send_mode"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabNewnoticeGroupVo">
+        select id,`group_name`,`group_value`,send_mode ,user_id, create_by,
+        create_time, update_by, update_time, remark from lab_newnotice_group
+    </sql>
+
+    <sql id="selectLabNewnoticeGroupListVo">
+        select t.id,t.`group_name`,t.`group_value`,send_mode ,t.user_id,
+        t.create_by, t.create_time, t.update_by, t.update_time, t.remark from lab_newnotice_group as t
+    </sql>
+
+    <select id="selectNewnoticeGroupList" parameterType="com.zd.laboratory.domain.LabNewnoticeGroup" resultMap="LabNewnoticeGroupResult">
+        <include refid="selectLabNewnoticeGroupListVo"/>
+        <where>
+            <if test="id != null "> and t.id = #{id}</if>
+        </where>
+        order by t.create_time asc
+    </select>
+
+    <update id="updateNewnoticeGroup" parameterType="com.zd.laboratory.domain.LabNewnoticeGroup">
+        update lab_newnotice_group
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="groupName != null">group_name = #{groupName},</if>
+            <if test="groupValue != null">group_value = #{groupValue},</if>
+            <if test="sendMode != null">send_mode = #{sendMode},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+</mapper>

+ 38 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeModeMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabNewnoticeModeMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabNewnoticeMode" id="LabNewnoticeModeResult">
+        <result property="id"    column="id"    />
+        <result property="noticeModeName"    column="notice_mode_name"    />
+        <result property="noticeModeValue"    column="notice_mode_value"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabNewnoticeModeVo">
+        select id,`notice_mode_name`,`notice_mode_value`, user_id, create_by,
+        create_time, update_by, update_time, remark from lab_newnotice_mode
+    </sql>
+
+    <sql id="selectLabNewnoticeModeListVo">
+        select t.id,t.`notice_mode_name`,t.`notice_mode_value`, t.user_id,
+        t.create_by, t.create_time, t.update_by, t.update_time, t.remark from lab_newnotice_mode as t
+    </sql>
+
+    <select id="selectNewnoticeModeList" parameterType="com.zd.laboratory.domain.LabNewnoticeMode" resultMap="LabNewnoticeModeResult">
+        <include refid="selectLabNewnoticeModeListVo"/>
+        <where>
+            <if test="id != null "> and t.id = #{id}</if>
+        </where>
+        order by t.create_time asc
+    </select>
+
+
+</mapper>

+ 76 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabNewnoticeSendmodeMapper.xml

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zd.laboratory.mapper.LabNewnoticeSendmodeMapper">
+
+    <resultMap type="com.zd.laboratory.domain.LabNewnoticeSendmode" id="LabNewnoticeSendmodeResult">
+        <result property="id"    column="id"    />
+        <result property="groupId"    column="group_id"    />
+        <result property="sendMode"    column="send_mode"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectLabNewnoticeSendModeVo">
+        select id,`group_id`,`send_mode`, user_id, create_by,
+        create_time, update_by, update_time, remark from lab_newnotice_sendmode
+    </sql>
+
+    <sql id="selectLabNewnoticeSendModeListVo">
+        select t.id,t.`group_id`,t.`send_mode`, t.user_id,
+        t.create_by, t.create_time, t.update_by, t.update_time, t.remark from lab_newnotice_sendmode as t
+    </sql>
+
+    <select id="selectNewnoticeSendModeList" parameterType="com.zd.laboratory.domain.LabNewnoticeSendmode" resultMap="LabNewnoticeSendmodeResult">
+        <include refid="selectLabNewnoticeSendModeListVo"/>
+        <where>
+            <if test="id != null "> and t.id = #{id}</if>
+            <if test="groupId != null "> and t.group_id = #{groupId}</if>
+        </where>
+    </select>
+
+    <insert id="insertLabNewnoticeSendmode" parameterType="com.zd.laboratory.domain.LabNewnoticeSendmode" useGeneratedKeys="true" keyProperty="id">
+        insert into lab_newnotice_sendmode
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+
+            <if test="groupId != null">group_id,</if>
+
+            <if test="sendMode != null">send_mode,</if>
+
+            <if test="userId != null">user_id,</if>
+
+            <if test="createBy != null">create_by,</if>
+
+            <if test="createTime != null">create_time,</if>
+
+            <if test="updateBy != null">update_by,</if>
+
+            <if test="updateTime != null">update_time,</if>
+
+            <if test="remark != null">remark,</if>
+
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="groupId != null">#{groupId},</if>
+            <if test="sendMode != null">#{sendMode},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+        </trim>
+    </insert>
+
+    <delete id="deleteSendmodeListByIds">
+        delete from lab_newnotice_sendmode where id in
+        <foreach item="id" collection="list" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 30 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSubjectMapper.xml

@@ -875,4 +875,34 @@
         </where>
 
     </select>
+    <select id="selectLabSubjectListByLayout" parameterType="com.zd.laboratory.domain.LabSubject" resultMap="LabSubjectResult">
+        select
+        id, name, floor_id,layout_id,build_id,sub_dept,level, check_out,check_in,room,dept_id,
+        (SELECT d.dept_name FROM sys_dept d WHERE s.dept_id = d.dept_id) dept_name,
+        admin_id, is_del, create_time, user_id,
+        create_by, update_time, update_by, remark, sub_dept,
+        check_out, check_in, safe_user_id, safe_signs, hazard_category, risk_measure,
+        outfire, qr_code,safe_user_id, skipped, check_count,sign_time,
+        (SELECT GROUP_CONCAT(ur.nick_name) FROM sys_user ur WHERE FIND_IN_SET(ur.user_id, s.`safe_user_id`)) AS safeUserNames,
+        (select d.dept_name from sys_dept d where s.build_id = d.dept_id) build_name,
+        (select b.name from lab_building b where b.id = s.floor_id) floorName,
+        (SELECT l.room FROM lab_subject_layout l WHERE l.id = s.layout_id ) roomName,
+        (select GROUP_CONCAT(phonenumber) from sys_user where find_in_set(user_id, s.safe_user_id)) safeUserPhone
+        from lab_subject s
+        <where>
+            s.`id` NOT IN(SELECT bfl.`sub_id` FROM lab_build_floor_layout bfl)
+            <if test="deptIds != null and deptIds.size()>0"> <!-- 部门集合id-->
+                and s.dept_id in
+                <foreach item="item" collection="deptIds" separator="," open="(" close=")" index="">'${item}'</foreach>
+            </if>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="floorId != null "> and floor_id = #{floorId}</if>
+            <if test="room != null  and room != ''"> and room = #{room}</if>
+            <if test="deptId != null "> and ( dept_id in (SELECT dt.dept_id FROM sys_dept dt WHERE find_in_set(#{deptId} ,ancestors )) or dept_id = #{deptId} )</if>
+            <if test="deptName != null  and deptName != ''"> and dept_name like concat('%', #{deptName}, '%')</if>
+            <if test="adminId != null "> and admin_id = #{adminId}</if>
+            <if test="isDel != null "> and is_del = #{isDel}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+        </where>
+    </select>
 </mapper>