Explorar o código

Merge branch 'suda' of http://192.168.1.43:3000/v2/zd-parents into suda

chaiyunlong %!s(int64=2) %!d(string=hai) anos
pai
achega
6856f1d22e
Modificáronse 100 ficheiros con 6693 adicións e 119 borrados
  1. 1 1
      ArcFace64.dat
  2. 11 1
      zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/face/feign/FaceCompare.java
  3. 10 0
      zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/face/feign/RemoteFaceService.java
  4. 6 0
      zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/face/feign/fallback/RemoteFaceFallbackFactory.java
  5. 8 11
      zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/speaker/entity/PlayBatchVo.java
  6. 24 0
      zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/xxp/feign/RemoteXxpService.java
  7. 25 0
      zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/xxp/feign/fallback/RemoteXxpFallBack.java
  8. 2 1
      zd-api/zd-algorithm-api/src/main/resources/META-INF/spring.factories
  9. 189 0
      zd-api/zd-api-system/zd-api-system.iml
  10. 61 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/entity/LabSubjectControllerVO.java
  11. 122 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/entity/LabSysUserInfo.java
  12. 236 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteDutyService.java
  13. 8 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java
  14. 13 6
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteStudentsService.java
  15. 153 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteDutyFailback.java
  16. 10 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLaboratoryFallbackFactory.java
  17. 13 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteStudentsFallbackFactory.java
  18. 31 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/ClassifyDetailVO.java
  19. 28 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/ClassifyVO.java
  20. 51 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/LabSecurityApplyVo.java
  21. 95 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/LabXxpClassifyVo.java
  22. 160 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/XxpInspectionVo.java
  23. 107 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/XxpUserAuthVo.java
  24. 2 1
      zd-api/zd-laboratory-api/src/main/java/resources/META-INF/spring.factories
  25. 5 0
      zd-api/zd-system-api/src/main/java/com/zd/system/api/feign/RemoteUserService.java
  26. 5 1
      zd-api/zd-system-api/src/main/java/com/zd/system/api/feign/factory/RemoteUserFallback.java
  27. 73 0
      zd-api/zd-system-api/src/main/java/com/zd/system/api/vo/SysLogoConfigVO.java
  28. 20 0
      zd-common/common-core/src/main/java/com/zd/common/core/redis/RedisService.java
  29. 20 0
      zd-common/common-core/src/main/java/com/zd/common/core/redis/RedisServiceImpl.java
  30. 27 0
      zd-common/common-core/src/main/java/com/zd/common/core/utils/DateUtils.java
  31. 6 0
      zd-model/src/main/java/com/zd/model/constant/ApplicationConstants.java
  32. 0 1
      zd-model/src/main/java/com/zd/model/domain/R.java
  33. 42 0
      zd-model/src/main/java/com/zd/model/domain/per/PerPrefix.java
  34. 20 0
      zd-model/src/main/java/com/zd/model/entity/SysUser.java
  35. 4 2
      zd-model/src/main/java/com/zd/model/page/PageDomain.java
  36. 82 20
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/controller/FaceApi.java
  37. 1 1
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/utils/FileUtil.java
  38. 16 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/controller/SignInCheckController.java
  39. 92 2
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/CheckService.java
  40. 66 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/bean/MediaStream.java
  41. 10 3
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
  42. 0 3
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/media/zlm/ZLMHttpHookListener.java
  43. 50 43
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/monitor/HardwareDeviceMonitor.java
  44. 9 11
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/service/impl/SpeakerServiceImpl.java
  45. 16 0
      zd-modules/zd-base/pom.xml
  46. 2 2
      zd-modules/zd-base/src/main/java/com/zd/base/ZdBaseApplicaion.java
  47. 34 0
      zd-modules/zd-base/src/main/java/com/zd/base/app/HexStrUtils.java
  48. 561 0
      zd-modules/zd-base/src/main/java/com/zd/base/app/controller/LabBoardApi.java
  49. 26 0
      zd-modules/zd-base/src/main/java/com/zd/base/app/domain/board/DutyPersonVo.java
  50. 191 0
      zd-modules/zd-base/src/main/java/com/zd/base/app/domain/board/LabXxpSubjectVo.java
  51. 2 0
      zd-modules/zd-bottle-parent/pom.xml
  52. 16 0
      zd-modules/zd-bottle-parent/zd-bottle/pom.xml
  53. 28 0
      zd-modules/zd-chemical/pom.xml
  54. 10 0
      zd-modules/zd-exam/pom.xml
  55. 40 0
      zd-modules/zd-modules-laboratory/pom.xml
  56. 24 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java
  57. 3 3
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabRiskPlanController.java
  58. 141 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSecurityApplyController.java
  59. 20 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSecuritySubjectmaterialController.java
  60. 16 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabStudentsInfoController.java
  61. 11 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubMangerV2Controller.java
  62. 16 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectAccessRecordController.java
  63. 37 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectController.java
  64. 14 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabWhitelistController.java
  65. 297 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpCardInfoController.java
  66. 256 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpClassifyController.java
  67. 179 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpClassifyDetailedController.java
  68. 224 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpDutyController.java
  69. 351 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpInspectionController.java
  70. 256 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpUserAuthController.java
  71. 122 3
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabSubject.java
  72. 53 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/SubDiyVO.java
  73. 244 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpCardInfo.java
  74. 160 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpClassify.java
  75. 145 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpClassifyDetail.java
  76. 61 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpClassifySubject.java
  77. 192 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpDuty.java
  78. 164 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpInspection.java
  79. 181 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpUserAuth.java
  80. 10 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSecurityApplyVO.java
  81. 12 2
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSecurityMaterialDataVO.java
  82. 12 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSecuritySubjectmaterialVO.java
  83. 11 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSubjectVO.java
  84. 190 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabXxpSubjectVo.java
  85. 17 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/XxpClassifyDetailVO.java
  86. 44 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/XxpDutyVO.java
  87. 34 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/XxpInspectionVO.java
  88. 14 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabCheckOptionMapper.java
  89. 2 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareMapper.java
  90. 1 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareStateMapper.java
  91. 30 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSecurityApplyMapper.java
  92. 8 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabStudentsInfoMapper.java
  93. 16 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSubjectAccessRecordMapper.java
  94. 45 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSubjectMapper.java
  95. 3 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabWhiteJoinSublistMapper.java
  96. 2 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabWhitelistMapper.java
  97. 88 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpCardInfoMapper.java
  98. 78 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpClassifyDetailedMapper.java
  99. 69 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpClassifyMapper.java
  100. 0 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpClassifySubjectMapper.java

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
ArcFace64.dat


+ 11 - 1
zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/face/feign/FaceCompare.java

@@ -8,11 +8,13 @@ import io.swagger.annotations.ApiModelProperty;
  * @Date: 2021/10/12/17:54
  * @Description:
  */
-@ApiModel("人脸对比提交参数")
+@ApiModel("提交参数")
 public class FaceCompare {
     @ApiModelProperty("userId")
     private Long userId;
 
+    @ApiModelProperty("实验室ID")
+    private Long labId;
 
     @ApiModelProperty("特征码")
     private byte[] data;
@@ -33,4 +35,12 @@ public class FaceCompare {
     public void setData(byte[] data) {
         this.data = data;
     }
+
+    public Long getLabId() {
+        return labId;
+    }
+
+    public void setLabId(Long labId) {
+        this.labId = labId;
+    }
 }

+ 10 - 0
zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/face/feign/RemoteFaceService.java

@@ -3,10 +3,12 @@ package com.zd.algorithm.api.face.feign;
 import com.zd.algorithm.api.face.feign.fallback.RemoteFaceFallbackFactory;
 import com.zd.model.constant.ApplicationConstants;
 import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -33,4 +35,12 @@ public interface RemoteFaceService {
      */
     @PostMapping(value = "/faceApi/compare")
     public R compare(@RequestBody FaceCompare faceCompare);
+
+    /**
+     * 多人人脸对比
+     * @param faceCompare
+     * @return
+     */
+    @PostMapping("/faceApi/multiCompare")
+    public ResultData multiFaceDetection(@RequestBody FaceCompare faceCompare);
 }

+ 6 - 0
zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/face/feign/fallback/RemoteFaceFallbackFactory.java

@@ -3,6 +3,7 @@ package com.zd.algorithm.api.face.feign.fallback;
 import com.zd.algorithm.api.face.feign.FaceCompare;
 import com.zd.algorithm.api.face.feign.RemoteFaceService;
 import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -38,6 +39,11 @@ public class RemoteFaceFallbackFactory implements FallbackFactory<RemoteFaceServ
             public R compare(FaceCompare faceCompare) {
                 return R.fail("人脸对比服务调用失败:" + throwable.getMessage());
             }
+
+            @Override
+            public ResultData multiFaceDetection(FaceCompare faceCompare) {
+                return ResultData.fail("多人脸对比服务调用失败:" + throwable.getMessage());
+            }
         };
     }
 }

+ 8 - 11
zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/speaker/entity/PlayBatchVo.java

@@ -1,9 +1,6 @@
 package com.zd.algorithm.api.speaker.entity;
 
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * @author 董高升
@@ -11,27 +8,27 @@ import org.slf4j.LoggerFactory;
  */
 public class PlayBatchVo {
     @ApiModelProperty(required = true, notes = "设备编号")
-    private String[] sns;
+    private String[] sn;
     @ApiModelProperty(required = true, notes = "方便对接时传递任务类型")
-    private String[] type;
+    private String type;
     @ApiModelProperty(required = true, notes = "任务名称")
     private String name;
     @ApiModelProperty(required = true, notes = "播放参数")
     private ParamVo params;
 
-    public String[] getSns() {
-        return sns;
+    public String[] getSn() {
+        return sn;
     }
 
-    public void setSns(String[] sns) {
-        this.sns = sns;
+    public void setSn(String[] sn) {
+        this.sn = sn;
     }
 
-    public String[] getType() {
+    public String getType() {
         return type;
     }
 
-    public void setType(String[] type) {
+    public void setType(String type) {
         this.type = type;
     }
 

+ 24 - 0
zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/xxp/feign/RemoteXxpService.java

@@ -0,0 +1,24 @@
+package com.zd.algorithm.api.xxp.feign;
+
+import com.zd.algorithm.api.alarm.feign.fallback.RemoteAlarmFallbackFactory;
+import com.zd.algorithm.api.xxp.feign.fallback.RemoteXxpFallBack;
+import com.zd.model.constant.ApplicationConstants;
+import com.zd.model.domain.ResultData;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(contextId = "remoteXxpService", value = ApplicationConstants.ALGORITHM_SERVICE, fallbackFactory = RemoteXxpFallBack.class)
+public interface RemoteXxpService {
+    /**
+     * 通过实验室id获取信息类目列表
+     * @param deviceIds
+     * @param dpi
+     * @param page
+     * @param count
+     * @return
+     */
+    @GetMapping("/api/play/startList")
+    ResultData selectSubjectCameraList(@RequestParam("deviceIds") String deviceIds, @RequestParam("dpi") Integer dpi, @RequestParam("page") int page, @RequestParam("count") int count);
+
+}

+ 25 - 0
zd-api/zd-algorithm-api/src/main/java/com/zd/algorithm/api/xxp/feign/fallback/RemoteXxpFallBack.java

@@ -0,0 +1,25 @@
+package com.zd.algorithm.api.xxp.feign.fallback;
+
+import com.zd.algorithm.api.xxp.feign.RemoteXxpService;
+import com.zd.model.domain.ResultData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RemoteXxpFallBack implements FallbackFactory<RemoteXxpService> {
+
+    private static final Logger log = LoggerFactory.getLogger(RemoteXxpFallBack.class);
+
+    @Override
+    public RemoteXxpService create(Throwable cause) {
+        return new RemoteXxpService(){
+            @Override
+            public ResultData selectSubjectCameraList(String deviceIds, Integer dpi, int page, int count) {
+                log.error("获取实验室摄像头编号信息失败:{}", cause.getMessage());
+                return ResultData.fail("获取实验室摄像头编号信息失败:" + cause.getMessage());
+            }
+        };
+    }
+}

+ 2 - 1
zd-api/zd-algorithm-api/src/main/resources/META-INF/spring.factories

@@ -6,5 +6,6 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.zd.algorithm.api.rfid.feign.fallback.RemoteRfidFallbackFactory,\
   com.zd.algorithm.api.smartlock.feign.fallback.RemoteSmartlockFallbackFactory,\
   com.zd.algorithm.api.speaker.feign.fallback.RemoteSpeakFallbackFactory,\
-  com.zd.algorithm.api.fire.feign.fallback.RemoteFireDeviceFallbackFactory
+  com.zd.algorithm.api.fire.feign.fallback.RemoteFireDeviceFallbackFactory,\
+  com.zd.algorithm.api.xxp.feign.fallback.RemoteXxpFallBack
 

+ 189 - 0
zd-api/zd-api-system/zd-api-system.iml

@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="zd-common-core" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.5.1" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-core:10.12" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:10.12" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-loadbalancer:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-loadbalancer:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.8" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor.addons:reactor-extra:3.4.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-cache:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: com.stoyanr:evictor:1.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.32" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.7" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.6" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.3.1" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.2.1" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.50" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.12.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.12.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.12.4" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.4" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.76" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:4.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:4.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.06" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.6.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.7.11" level="project" />
+    <orderEntry type="library" name="Maven: com.baidubce:bce-java-sdk:0.10.154" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.32" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.32" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.4" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.4" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:17.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.14" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.14" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.media:jersey-media-multipart:2.33" level="project" />
+    <orderEntry type="library" name="Maven: org.jvnet.mimepull:mimepull:1.9.14" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.connectors:jersey-apache-connector:2.33" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.core:jersey-client:2.33" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.ws.rs:jakarta.ws.rs-api:2.1.6" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.core:jersey-server:2.33" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.hk2.external:jakarta.inject:2.6.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.core:jersey-common:2.33" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.hk2:osgi-resource-locator:1.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.media:jersey-media-json-jackson:2.33" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jersey.ext:jersey-entity-filtering:2.33" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.12.4" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-client:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-annotations:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-common:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mortbay.jetty:jetty-util:6.1.26" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hbase:hbase-protocol:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:2.5.0" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.66.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-log4j12:1.7.32" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.htrace:htrace-core:3.1.0-incubating" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.9.13" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-core-asl:1.9.13" level="project" />
+    <orderEntry type="library" name="Maven: org.jruby.jcodings:jcodings:1.0.8" level="project" />
+    <orderEntry type="library" name="Maven: org.jruby.joni:joni:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.yammer.metrics:metrics-core:2.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-auth:2.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.directory.server:apacheds-kerberos-codec:2.0.0-M15" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.directory.server:apacheds-i18n:2.0.0-M15" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.directory.api:api-asn1-api:1.0.0-M20" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.directory.api:api-util:1.0.0-M20" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-common:2.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-annotations:2.5.1" level="project" />
+    <orderEntry type="module-library">
+      <library name="Maven: jdk.tools:jdk.tools:1.6">
+        <CLASSES>
+          <root url="jar://D:/Java/jdk1.8.0_181/lib/tools.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.2" level="project" />
+    <orderEntry type="library" name="Maven: xmlenc:xmlenc:0.52" level="project" />
+    <orderEntry type="library" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-net:commons-net:3.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-el:commons-el:1.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-configuration:commons-configuration:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-digester:commons-digester:1.8" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.7.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils-core:1.8.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.avro:avro:1.7.4" level="project" />
+    <orderEntry type="library" name="Maven: com.thoughtworks.paranamer:paranamer:2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.0.4.1" level="project" />
+    <orderEntry type="library" name="Maven: com.jcraft:jsch:0.1.55" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-mapreduce-client-core:2.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-yarn-common:2.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.hadoop:hadoop-yarn-api:2.5.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty:3.6.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.github.stephenc.findbugs:findbugs-annotations:1.3.9-1" level="project" />
+    <orderEntry type="library" name="Maven: junit:junit:4.13.2" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.59" level="project" />
+    <orderEntry type="library" name="Maven: com.belerweb:pinyin4j:2.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.20" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-bootstrap:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.10.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.68" level="project" />
+  </component>
+</module>

+ 61 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/entity/LabSubjectControllerVO.java

@@ -2,6 +2,7 @@ package com.zd.laboratory.api.entity;
 
 
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.zd.laboratory.api.vo.ClassifyVO;
 import com.zd.laboratory.api.vo.HardwareCVO;
 import com.zd.laboratory.api.vo.LabRiskVO;
 import com.zd.laboratory.api.vo.SenseValVO;
@@ -64,6 +65,26 @@ public class LabSubjectControllerVO extends LabSubjectEntity {
     @ApiModelProperty("预案数据")
     private List<LabRiskVO> riskPlanList;
 
+    private List<ClassifyVO>  classifyList;
+
+    @ApiModelProperty("实验室详情")
+    private String details;
+
+    /***
+     * 关联的硬件 1海康 2电子信息牌
+     */
+    private Integer hardwareType;
+
+    /***
+     * 是否配置海康门禁
+     */
+    private Integer hKCount;
+
+    /***
+     * 是否配置电子信息牌
+     */
+    private Integer cardInfoCount;
+
     /**
      * 实验室类型ID
      */
@@ -418,4 +439,44 @@ public class LabSubjectControllerVO extends LabSubjectEntity {
     public void setRiskPlanList(List<LabRiskVO> riskPlanList) {
         this.riskPlanList = riskPlanList;
     }
+
+    public List<ClassifyVO> getClassifyList() {
+        return classifyList;
+    }
+
+    public void setClassifyList(List<ClassifyVO> classifyList) {
+        this.classifyList = classifyList;
+    }
+
+    public String getDetails() {
+        return details;
+    }
+
+    public void setDetails(String details) {
+        this.details = details;
+    }
+
+    public Integer getHardwareType() {
+        return hardwareType;
+    }
+
+    public void setHardwareType(Integer hardwareType) {
+        this.hardwareType = hardwareType;
+    }
+
+    public Integer gethKCount() {
+        return hKCount;
+    }
+
+    public void sethKCount(Integer hKCount) {
+        this.hKCount = hKCount;
+    }
+
+    public Integer getCardInfoCount() {
+        return cardInfoCount;
+    }
+
+    public void setCardInfoCount(Integer cardInfoCount) {
+        this.cardInfoCount = cardInfoCount;
+    }
 }

+ 122 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/entity/LabSysUserInfo.java

@@ -0,0 +1,122 @@
+package com.zd.laboratory.api.entity;
+
+import com.zd.model.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+
+/**
+ * 学生信息对象 lab_students_info
+ *
+ * @author zhoupan
+ * @date 2021-09-10
+ */
+@ApiModel("用户信息")
+public class LabSysUserInfo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 学生ID(userId)
+     */
+    @Excel(name = "学生ID", readConverterExp = "u=serId")
+    @ApiModelProperty(value = "学生ID")
+    private Long userId;
+
+    /**
+     * 人脸特征
+     */
+    @ApiModelProperty(value = "人脸特征")
+    private byte[]  faceFeature;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    /**
+     * 用户类型
+     */
+    @ApiModelProperty(value = "用户类型")
+    private String userType;
+
+    /**
+     * 是否白名单
+     */
+    @ApiModelProperty(value = "是否白名单")
+    private Integer isWhite;
+
+
+    /**
+     * 是否值班人员
+     */
+    @ApiModelProperty(value = "是否值班人员")
+    private Integer isDutyUser;
+
+
+    /**
+     * 页面类型
+     */
+    @ApiModelProperty(value = "页面类型")
+    private Integer pageType;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public byte[] getFaceFeature() {
+        return faceFeature;
+    }
+
+    public void setFaceFeature(byte[] faceFeature) {
+        this.faceFeature = faceFeature;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public Integer getIsWhite() {
+        return isWhite;
+    }
+
+    public void setIsWhite(Integer isWhite) {
+        this.isWhite = isWhite;
+    }
+
+    public Integer getPageType() {
+        return pageType;
+    }
+
+    public void setPageType(Integer pageType) {
+        this.pageType = pageType;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Integer getIsDutyUser() {
+        return isDutyUser;
+    }
+
+    public void setIsDutyUser(Integer isDutyUser) {
+        this.isDutyUser = isDutyUser;
+    }
+}

+ 236 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteDutyService.java

@@ -0,0 +1,236 @@
+package com.zd.laboratory.api.feign;
+
+import com.zd.laboratory.api.feign.fallback.RemoteDutyFailback;
+import com.zd.laboratory.api.vo.XxpInspectionVo;
+import com.zd.laboratory.api.vo.XxpUserAuthVo;
+import com.zd.model.constant.ApplicationConstants;
+import com.zd.model.domain.ResultData;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 远程调用值班排班数据
+ * @author  donggaosheng
+ * @time 2023/03/24
+ */
+@FeignClient(contextId = "remoteDutyService", value = ApplicationConstants.LABORATORY_SERVICE, fallbackFactory = RemoteDutyFailback.class)
+public interface RemoteDutyService {
+    /**
+     * 通过实验室id当前时间查询值班人员
+     *
+     * @param labId
+     * @param dateTime
+     * @return
+     */
+    @GetMapping("/XxpDuty/api/selectDutyUser")
+    ResultData<List<Map<String, Object>>> selectDutyUser(@RequestParam("labId") Long labId, @RequestParam("dateTime") String dateTime);
+
+    /**
+     * 通过实验室id查询实验室信息
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/subject/getXxpSubjectInfo/{id}")
+    ResultData getXxpSubjectInfo(@PathVariable("id") Long id);
+
+    /***
+     * 通过实验室id获取信息类目列表
+     * @param id
+     * @return
+     */
+    @GetMapping("/XxpClassifyDet/classifyDetail/{id}")
+    ResultData classifyDetailSubjectById(@PathVariable("id") Long id);
+
+    /***
+     * 根据实验室id查询摄像头编号
+     * @param subId
+     * @return
+     */
+    @GetMapping("/hardware/getCameraBySubjectId")
+    ResultData getCameraBySubjectId(@RequestParam("subId") Long subId);
+
+    /**
+     * 根据实验室id获取实验室详情
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/subject/getSubjectDetails/{id}")
+    ResultData getSubjectDetails(@PathVariable("id") Long id);
+
+    /**
+     * 根据实验室id获取安全准入人员列表
+     *
+     * @param pageNumber
+     * @param pageSize
+     * @param subjectId
+     * @return
+     */
+    @GetMapping("/apply/app/securityApplyList")
+    ResultData securityApplyList(@RequestParam("subjectId") Long subjectId, @RequestParam("pageNumber") Integer pageNumber, @RequestParam("pageSize") Integer pageSize);
+
+    /**
+     * 根据实验室获取签到未签退人员
+     *
+     * @param subjectId
+     * @return
+     */
+    @RequestMapping("/record/selectSubjectSignList")
+    ResultData selectSubjectSignList(@RequestParam("subjectId") Long subjectId);
+
+    /**
+     * 获取实验室所有值班人员的信息
+     *
+     * @param labId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @RequestMapping("/XxpDuty/api/selectDutyUserList")
+    ResultData<List<Map<String, Object>>> selectDutyUserList(@RequestParam("labId") Long labId, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);
+
+    /**
+     * 根据实验室id和当前时间查询签到记录
+     *
+     * @param labId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @PostMapping("/XxpInspection/app/selectUserXxpInspectionList")
+    ResultData selectUserXxpInspectionList(@RequestParam("labId") Long labId, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);
+
+    /**
+     * 根据一体机编号查询实验室编号
+     *
+     * @param num
+     * @return
+     */
+    @RequestMapping("/onemachine/getSubjectIdByNum/{num}")
+    ResultData querySubInfoByNumber(@PathVariable("num") String num);
+
+
+    /**
+     * 获取信息牌首页实验室的信息
+     */
+    @RequestMapping(value = "/subject/getSubjectName/{id}")
+    ResultData getSubjectName(@PathVariable("id") Long id);
+
+
+    /**
+     * 根据一体机编号查询实验室编号
+     *
+     * @param num
+     * @return
+     */
+    @RequestMapping("/XxpCardInfo/XxpCardInfoByCard/{num}")
+    ResultData XxpCardInfoByCard(@PathVariable("num") String num);
+
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     *
+     * @param labId
+     * @return
+     */
+    @RequestMapping("/apply/app/securityFingerList")
+    ResultData securityFingerList(@RequestParam("labId") Long labId);
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     *
+     * @param labId
+     * @return
+     */
+    @RequestMapping("/apply/app/securityNumList")
+    ResultData securityNumList(@RequestParam("labId") Long labId, @RequestParam("cardNum") String cardNum);
+
+
+    /**
+     * 指纹录入
+     * num 一体机编号
+     *
+     * @param xxpUserAuthVo
+     * @return
+     */
+    @RequestMapping("/XxpUserAuth/addUserAuth")
+    ResultData addUserAuth(@RequestBody XxpUserAuthVo xxpUserAuthVo);
+
+
+    /**
+     * 根据用户id查询指纹信息
+     *
+     * @param userId
+     * @return
+     */
+    @RequestMapping("/XxpUserAuth/getFingerByUserId")
+    ResultData getFingerByUserId(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId);
+
+    /**
+     * 根据用户id查询指纹信息
+     *
+     * @param id
+     * @return
+     */
+    @RequestMapping("/XxpUserAuth/deleteFingerById")
+    ResultData deleteFingerById(@RequestParam("id") Long id);
+
+
+    /**
+     * 验证密码是否正确
+     *
+     * @param num   电子班牌号码
+     * @param pwd       用户密码
+     * @param labId 实验室id
+     * @param userId    用户id
+     * @return
+     */
+    @RequestMapping("/XxpCardInfo/pwdValidate")
+    ResultData pwdValidate(@RequestParam("num") String num, @RequestParam("pwd") String pwd, @RequestParam("labId") Long labId, @RequestParam("userId") Long userId);
+
+    /**
+     * 判断是不是实验室管理员或者安全责任人
+     *
+     * @param labId
+     * @param userId
+     * @return
+     */
+    @GetMapping(value = "/subject/isAdminOrSafeUser/{labId}/{userId}")
+    ResultData isAdminOrSafeUser(@PathVariable("labId") Long labId, @PathVariable("userId") Long userId);
+
+    /**
+     * 添加巡查记录
+     * @param xxpInspectionVo
+     * @return
+     */
+    @PostMapping(value = "/XxpInspection/addInspection")
+    ResultData addInspection(@RequestBody XxpInspectionVo xxpInspectionVo);
+
+    /**
+     * 签退
+     * @param labId
+     * @param userId
+     * @return
+     */
+    @PostMapping("/XxpInspection/updateInspection")
+    ResultData updateInspection(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId);
+
+
+    @PostMapping("/XxpInspection/isSignInType")
+    ResultData isSignInType(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId);
+
+    /**
+     * Ai检测判断是否已签到
+     * @param labId
+     * @param userId
+     * @return
+     */
+    @PostMapping("/XxpInspection/isSignInspection")
+    ResultData isSignInspection(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId);
+
+    }

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

@@ -499,4 +499,12 @@ public interface RemoteLaboratoryService {
     @ApiOperation(value = "根据实验室id查询实验室位置信息")
     @PostMapping("/buildFloorLayout/getPositionBySubId")
     ResultData getPositionBySubId(@RequestParam("subIds") String subIds);
+
+    @ApiOperation(value = "根据用户id查询用户关联的白名单实验室")
+    @GetMapping("/whitelist/subWhiteList")
+    ResultData getWhiteSubList(@RequestParam("userId") Long userId);
+
+    @ApiOperation(value = "根据用户id查询用户关联的未过期的安全准入实验室")
+    @GetMapping("/apply/getApplySubList")
+    ResultData getApplySubList(@RequestParam("userId") Long userId);
 }

+ 13 - 6
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteStudentsService.java

@@ -1,17 +1,18 @@
 package com.zd.laboratory.api.feign;
 
 import com.zd.laboratory.api.entity.LabStudentsInfo;
+import com.zd.laboratory.api.entity.LabSysUserInfo;
 import com.zd.laboratory.api.feign.fallback.RemoteStudentsFallbackFactory;
 import com.zd.model.constant.ApplicationConstants;
 import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * 文件服务
  *
@@ -25,7 +26,7 @@ public interface RemoteStudentsService {
      * @return 结果
      */
     @GetMapping(value = "/studentinfo/{joinStudentsId}")
-    public R<LabStudentsInfo> getInfo(@PathVariable("joinStudentsId") Long id);
+    R<LabStudentsInfo> getInfo(@PathVariable("joinStudentsId") Long id);
 
     /**
      * 提交学生卡
@@ -33,5 +34,11 @@ public interface RemoteStudentsService {
      * @return
      */
     @PostMapping (value = "/studentinfo/commit/crad",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    public R commitCard(@RequestPart("file") MultipartFile file);
+    R commitCard(@RequestPart("file") MultipartFile file);
+
+    @GetMapping(value = "/studentinfo/getFaceBySecuritySubjectId")
+    ResultData<List<LabSysUserInfo>> getFaceBySecuritySubjectId(@RequestParam("subjectId") Long subjectId);
+
+    @GetMapping("/user/getUserInfoByUserId")
+    public ResultData getUserInfoByUserId(@RequestParam("userId") Long userId);
 }

+ 153 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteDutyFailback.java

@@ -0,0 +1,153 @@
+package com.zd.laboratory.api.feign.fallback;
+
+import com.zd.laboratory.api.feign.RemoteDutyService;
+import com.zd.laboratory.api.vo.XxpInspectionVo;
+import com.zd.laboratory.api.vo.XxpUserAuthVo;
+import com.zd.model.domain.ResultData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 远程调用值班排班数据
+ * @author  donggaosheng
+ * @time 2023/03/24
+ */
+@Component
+public class RemoteDutyFailback implements FallbackFactory<RemoteDutyService> {
+
+    private static final Logger log = LoggerFactory.getLogger(RemoteDutyFailback.class);
+
+    @Override
+    public RemoteDutyService create(Throwable cause) {
+        log.error("用户服务调用失败:{}", cause.getMessage());
+        return new RemoteDutyService(){
+
+            @Override
+            public ResultData<List<Map<String, Object>>> selectDutyUser(Long labId, String dateTime) {
+                return ResultData.fail("获取值班人员列表失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData getXxpSubjectInfo(Long id) {
+                return ResultData.fail("获取信息牌首页实验室信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData classifyDetailSubjectById(Long id) {
+                return ResultData.fail("获取信息牌类目列表失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData getCameraBySubjectId(Long subId) {
+                return ResultData.fail("获取实验室摄像头编号信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData getSubjectDetails(Long id) {
+                return ResultData.fail("获取实验室详情信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData securityApplyList(Long subjectId,Integer pageNumber, Integer pageSize) {
+                return ResultData.fail("获取安全准入人员列表信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData selectSubjectSignList(Long subjectId) {
+                return ResultData.fail("获取签到人员列表信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData<List<Map<String, Object>>> selectDutyUserList(Long labId, String startTime, String endTime) {
+                return ResultData.fail("获取值班人员列表信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData selectUserXxpInspectionList(Long labId, String startTime, String endTime) {
+                return ResultData.fail("获取巡查记录列表信息失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData querySubInfoByNumber(String num) {
+                return ResultData.fail("根据一体机编号获取实验室失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData getSubjectName(Long id) {
+                return ResultData.fail("获取实验室名称失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData XxpCardInfoByCard(String num) {
+                return ResultData.fail("根据电子信息牌编号获取实验室失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData securityFingerList(Long labId) {
+                return ResultData.fail("电子信息牌获取准入人员的指纹信息列表:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData securityNumList(Long labId,String cardNum) {
+                return ResultData.fail("电子信息牌获取准入人员的指纹信息列表:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData addUserAuth(XxpUserAuthVo xxpUserAuthVo) {
+                return ResultData.fail("指纹录入失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData getFingerByUserId(Long labId,Long userId) {
+                return ResultData.fail("根据用户获取指纹列表失败:" + cause.getMessage());
+             }
+
+            @Override
+            public ResultData deleteFingerById(Long id) {
+                return ResultData.fail("删除指纹失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData pwdValidate(String num, String pwd, Long labId, Long userId) {
+                return ResultData.fail("密码对比失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData isAdminOrSafeUser(Long labId, Long userId) {
+                return ResultData.fail("判断是否是实验室安全责任人实验室负责人:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData addInspection(XxpInspectionVo xxpInspectionVo) {
+                return ResultData.fail("添加巡查记录失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData updateInspection(Long labId, Long userId) {
+                return ResultData.fail("修改巡查记录失败:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData isSignInType(Long labId, Long userId) {
+                return ResultData.fail("获取签到方式失败:" + cause.getMessage());
+            }
+
+            /**
+             * Ai检测判断是否已签到
+             *
+             * @param labId
+             * @param userId
+             * @return
+             */
+            @Override
+            public ResultData isSignInspection(Long labId, Long userId) {
+                return ResultData.fail("Ai检测判断是否已签到:" + cause.getMessage());
+            }
+        };
+    }
+}

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

@@ -460,6 +460,16 @@ public class RemoteLaboratoryFallbackFactory implements FallbackFactory<RemoteLa
             public ResultData getPositionBySubId(String subIds) {
                 return ResultData.fail("查询实验室位置信息失败!"+ cause.getMessage());
             }
+
+            @Override
+            public ResultData getWhiteSubList(Long userId) {
+                return ResultData.fail("根据用户id查询用户关联的白名单实验室失败!"+ cause.getMessage());
+            }
+
+            @Override
+            public ResultData getApplySubList(Long userId) {
+                return ResultData.fail("根据用户id查询用户关联的安全准入实验室失败!"+ cause.getMessage());
+            }
         };
     }
 }

+ 13 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteStudentsFallbackFactory.java

@@ -3,6 +3,7 @@ package com.zd.laboratory.api.feign.fallback;
 import com.zd.laboratory.api.entity.LabStudentsInfo;
 import com.zd.laboratory.api.feign.RemoteStudentsService;
 import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -10,6 +11,8 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * 文件服务降级处理
  *
@@ -31,6 +34,16 @@ public class RemoteStudentsFallbackFactory implements FallbackFactory<RemoteStud
             public R commitCard(MultipartFile file) {
                 return R.fail("学生卡上传调用失败:" + throwable.getMessage());
             }
+
+            @Override
+            public ResultData getFaceBySecuritySubjectId(Long subjectId) {
+                return ResultData.fail("根据实验室获取用户人脸信息失败"+throwable.getMessage());
+            }
+
+            @Override
+            public ResultData getUserInfoByUserId(Long userId) {
+                return ResultData.fail("获取用户基本信息失败"+throwable.getMessage());
+            }
         };
     }
 }

+ 31 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/ClassifyDetailVO.java

@@ -0,0 +1,31 @@
+package com.zd.laboratory.api.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: xxf
+ * @Date: 2023/03/29/11:14
+ * @Description:
+ */
+@Data
+public class ClassifyDetailVO {
+
+    /** 主键 */
+    private Long id;
+
+    /** 类目表主键 */
+
+    private Long infoClassifyId;
+
+    /** 信息名称  */
+    private String infoName;
+
+
+    /** 类型 1文字 2图片*/
+    private Integer infoType;
+
+    /** 内容 */
+    private String infoContent;
+
+
+}

+ 28 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/ClassifyVO.java

@@ -0,0 +1,28 @@
+package com.zd.laboratory.api.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: xxf
+ * @Date: 2023/03/29/11:06
+ * @Description:
+ */
+@Data
+public class ClassifyVO {
+
+    /** 主键 */
+    private Long id;
+
+    /** 类目名称 */
+    private String classifyName;
+
+    /** 类目类型 1文字 2图片 */
+    private Integer classifyType;
+
+    /**公共类目**/
+    private List<ClassifyDetailVO> publicList;
+    /***私有类目**/
+    private List<ClassifyDetailVO> privateList;
+}

+ 51 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/LabSecurityApplyVo.java

@@ -0,0 +1,51 @@
+package com.zd.laboratory.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author: donggaosheng
+ * @Date: 2023/03/27
+ * @Description: 用于展示一体机首页信息牌
+ */
+public class LabSecurityApplyVo {
+    @ApiModelProperty(value = "类目名称")
+    private String userName;
+    @ApiModelProperty(value = "工号卡号")
+    private String jobNumber;
+    @ApiModelProperty(value = "图像")
+    private String avatar;
+    @ApiModelProperty(value = "准入期限")
+    private String validEndTime;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getJobNumber() {
+        return jobNumber;
+    }
+
+    public void setJobNumber(String jobNumber) {
+        this.jobNumber = jobNumber;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getValidEndTime() {
+        return validEndTime;
+    }
+
+    public void setValidEndTime(String validEndTime) {
+        this.validEndTime = validEndTime;
+    }
+}

+ 95 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/LabXxpClassifyVo.java

@@ -0,0 +1,95 @@
+package com.zd.laboratory.api.vo;
+
+import com.zd.model.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Author: donggaosheng
+ * @Date: 2023/03/27
+ * @Description: 用于展示一体机首页信息牌
+ */
+public class LabXxpClassifyVo {
+    /** 类目名称 */
+    @ApiModelProperty(value = "类目名称")
+    private String classifyName;
+    /** 类目类型 1文字 2图片 */
+    @ApiModelProperty(value = "类目名称")
+    private Integer classifyType;
+    /** 排序 */
+    @Excel(name = "排序")
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    /** 是否特殊类目 1否 2 是   */
+    @ApiModelProperty(value = "是否特殊类目")
+    private Integer isSpecial;
+
+    /** 是否展示 1展示 2不展示   */
+    @ApiModelProperty(value = "是否展示")
+    private Integer isShow;
+
+    /** 类目颜色   */
+    @ApiModelProperty(value = "类目颜色 ")
+    private String showColour;
+
+    @ApiModelProperty(value = "类目内容")
+    private List<String> classifyList;
+
+    public String getClassifyName() {
+        return classifyName;
+    }
+
+    public void setClassifyName(String classifyName) {
+        this.classifyName = classifyName;
+    }
+
+    public Integer getClassifyType() {
+        return classifyType;
+    }
+
+    public void setClassifyType(Integer classifyType) {
+        this.classifyType = classifyType;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getIsSpecial() {
+        return isSpecial;
+    }
+
+    public void setIsSpecial(Integer isSpecial) {
+        this.isSpecial = isSpecial;
+    }
+
+    public Integer getIsShow() {
+        return isShow;
+    }
+
+    public void setIsShow(Integer isShow) {
+        this.isShow = isShow;
+    }
+
+    public String getShowColour() {
+        return showColour;
+    }
+
+    public void setShowColour(String showColour) {
+        this.showColour = showColour;
+    }
+
+    public List<String> getClassifyList() {
+        return classifyList;
+    }
+
+    public void setClassifyList(List<String> classifyList) {
+        this.classifyList = classifyList;
+    }
+}

+ 160 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/XxpInspectionVo.java

@@ -0,0 +1,160 @@
+package com.zd.laboratory.api.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import sun.util.resources.ga.LocaleNames_ga;
+
+import java.util.Date;
+
+/**
+ * 巡查表 对象 xxp_inspection
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("巡查信息")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpInspectionVo extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 人员id
+     */
+    @ApiModelProperty(value = "人员id",required = true)
+    private Long userId;
+
+    /**
+     * 人员姓名
+     */
+    @ApiModelProperty(value = "人员姓名")
+    private String userName;
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "实验室id")
+    @ApiModelProperty(value = "实验室id")
+    private Long  subjectId;
+
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "传参用实验室id")
+    @ApiModelProperty(value = "传参用实验室id")
+    private Long  labId;
+
+    /**
+     * 实验室名称
+     */
+    @Excel(name = "实验室名称")
+    @ApiModelProperty(value = "实验室名称")
+    private String subjectName;
+
+    /**
+     * 签到时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "签到时间 ")
+    private Date signIn;
+
+    /**
+     * 签退时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "签退时间 ")
+    private Date signOut;
+
+    /**
+     * 部门id
+     */
+    @ApiModelProperty(value = "部门id ")
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    @ApiModelProperty(value = "部门名称 ")
+    private String deptName;
+
+    /**
+     * 停留时间
+     */
+    @ApiModelProperty(value = "停留时间 ")
+    private String residenceTime;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 信息牌编号
+     */
+    private String num;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    @Override
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public String getDeptName() {
+        return deptName;
+    }
+
+    @Override
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+}

+ 107 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/vo/XxpUserAuthVo.java

@@ -0,0 +1,107 @@
+package com.zd.laboratory.api.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 信息牌人员权限表 对象 xxp_user_auth
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("信息牌人员权限")
+public class XxpUserAuthVo {
+    /**
+     * 人员id
+     */
+    @ApiModelProperty(value = "人员id", required = true)
+    private Long userId;
+
+    /**
+     * 人员姓名
+     */
+    @ApiModelProperty(value = "人员姓名", required = true)
+    private String userName;
+
+    /**
+     * 设备编号
+     */
+    @ApiModelProperty(value = "设备编号", required = true)
+    private String num;
+
+    /**
+     * 人员类型
+     */
+    @ApiModelProperty(value = "人员类型", required = true)
+    private String userType;
+
+    /**
+     * 指纹
+     */
+    @ApiModelProperty(value = "指纹 ", required = true)
+    private String finger;
+
+    /**
+     * 指纹位置
+     */
+    @ApiModelProperty(value = "指纹位置 ", required = true)
+    private String fingerKey;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getNum() {
+        return num;
+    }
+
+    public void setNum(String num) {
+        this.num = num;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public String getFinger() {
+        return finger;
+    }
+
+    public void setFinger(String finger) {
+        this.finger = finger;
+    }
+
+    public String getFingerKey() {
+        return fingerKey;
+    }
+
+    public void setFingerKey(String fingerKey) {
+        this.fingerKey = fingerKey;
+    }
+}
+
+
+
+
+

+ 2 - 1
zd-api/zd-laboratory-api/src/main/java/resources/META-INF/spring.factories

@@ -1,5 +1,6 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.zd.laboratory.api.feign.fallback.RemoteLaboratoryFallbackFactory,\
   com.zd.laboratory.api.feign.fallback.RemoteMessageContentFallbackFactory,\
-  com.zd.laboratory.api.feign.fallback.RemoteSubQueryFallbackFactory
+  com.zd.laboratory.api.feign.fallback.RemoteSubQueryFallbackFactory,\
+  com.zd.laboratory.api.feign.fallback.RemoteDutyFailback
 

+ 5 - 0
zd-api/zd-system-api/src/main/java/com/zd/system/api/feign/RemoteUserService.java

@@ -4,6 +4,7 @@ import com.zd.model.constant.ApplicationConstants;
 import com.zd.model.constant.SecurityConstants;
 import com.zd.model.domain.AjaxResult;
 import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
 import com.zd.model.entity.LoginUser;
 import com.zd.model.entity.SysUser;
 import com.zd.system.api.feign.factory.RemoteUserFallback;
@@ -195,4 +196,8 @@ public interface RemoteUserService {
      */
     @RequestMapping("/user/getUserByPhone/{phone}")
     R<SysUser> getUserByPhone(@PathVariable("phone") String phone);
+
+
+    @GetMapping("/user/getUserMapInfoByUserId")
+    ResultData getUserMapInfoByUserId(@RequestParam("userId") Long userId);
 }

+ 5 - 1
zd-api/zd-system-api/src/main/java/com/zd/system/api/feign/factory/RemoteUserFallback.java

@@ -2,6 +2,7 @@ package com.zd.system.api.feign.factory;
 
 import com.zd.model.domain.AjaxResult;
 import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
 import com.zd.model.entity.LoginUser;
 import com.zd.model.entity.SysUser;
 import com.zd.system.api.feign.RemoteUserService;
@@ -189,7 +190,10 @@ public class RemoteUserFallback implements FallbackFactory<RemoteUserService> {
                 return R.fail("根据电话查询用户信息失败:" + throwable.getMessage());
             }
 
-
+            @Override
+            public ResultData getUserMapInfoByUserId(Long userId) {
+                return ResultData.fail("查询用户信息失败:" + throwable.getMessage());
+            }
         };
     }
 }

+ 73 - 0
zd-api/zd-system-api/src/main/java/com/zd/system/api/vo/SysLogoConfigVO.java

@@ -57,6 +57,79 @@ public class SysLogoConfigVO extends BaseEntity
     @Excel(name = "首页banner")
     @ApiModelProperty(value = "首页banner")
     private String homepageBanner;
+
+    /** 用户身份,11是教职工,22是学生 */
+    @Excel(name = "用户身份,11是教职工,22是学生")
+    @ApiModelProperty(value = "用户身份,11是教职工,22是学生")
+    private String userType;
+
+    @ApiModelProperty(value = "智能锁配置1是有,0是无")
+    private Integer smartLock;
+
+    @ApiModelProperty(value = "气瓶标签配置 1是有,0是无")
+    private Integer airBottle;
+
+    @ApiModelProperty(value = "返回时间")
+    private Integer returnTime;
+
+    @ApiModelProperty(value = "注销时间")
+    private Integer logoutTime;
+
+    @ApiModelProperty(value = "是否启用信息牌 0不启用 1启用")
+    private Integer isStart;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public Integer getSmartLock() {
+        return smartLock;
+    }
+
+    public void setSmartLock(Integer smartLock) {
+        this.smartLock = smartLock;
+    }
+
+    public Integer getAirBottle() {
+        return airBottle;
+    }
+
+    public void setAirBottle(Integer airBottle) {
+        this.airBottle = airBottle;
+    }
+
+    public Integer getReturnTime() {
+        return returnTime;
+    }
+
+    public void setReturnTime(Integer returnTime) {
+        this.returnTime = returnTime;
+    }
+
+    public Integer getLogoutTime() {
+        return logoutTime;
+    }
+
+    public void setLogoutTime(Integer logoutTime) {
+        this.logoutTime = logoutTime;
+    }
+
+    public Integer getIsStart() {
+        return isStart;
+    }
+
+    public void setIsStart(Integer isStart) {
+        this.isStart = isStart;
+    }
+
     public void setId(Long id)
     {
         this.id = id;

+ 20 - 0
zd-common/common-core/src/main/java/com/zd/common/core/redis/RedisService.java

@@ -150,4 +150,24 @@ public interface RedisService {
      * @return 对象列表
      */
     public Collection<String> keys(final String pattern);
+
+    /**
+     * 加锁
+     * @param key
+     * @param second
+     */
+    boolean lock(String key, long second);
+
+    /**
+     * 解除
+     * @param key
+     * @return
+     */
+    boolean unLock(String key);
+
+    /**
+     * 是否存在锁
+     * @param key
+     */
+    boolean isExistLock(String key);
 }

+ 20 - 0
zd-common/common-core/src/main/java/com/zd/common/core/redis/RedisServiceImpl.java

@@ -1,5 +1,6 @@
 package com.zd.common.core.redis;
 
+import com.zd.model.constant.BaseConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.BoundSetOperations;
 import org.springframework.data.redis.core.HashOperations;
@@ -128,4 +129,23 @@ public class RedisServiceImpl implements RedisService {
     public Collection<String> keys(final String pattern) {
         return redisTemplate.keys(pattern);
     }
+
+    @Override
+    public boolean lock(String key, long second) {
+        return redisTemplate.opsForValue().setIfAbsent(BaseConstants.REDIS_LOCK + key, key, second, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public boolean unLock(String key) {
+        return redisTemplate.delete(BaseConstants.REDIS_LOCK + key);
+    }
+
+    @Override
+    public boolean isExistLock(String key) {
+        Object obj = redisTemplate.opsForValue().get(BaseConstants.REDIS_LOCK + key);
+        if (obj != null) {
+            return Boolean.TRUE;
+        }
+        return Boolean.FALSE;
+    }
 }

+ 27 - 0
zd-common/common-core/src/main/java/com/zd/common/core/utils/DateUtils.java

@@ -6,8 +6,10 @@ import org.apache.commons.lang3.time.DateFormatUtils;
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 时间工具类
@@ -146,4 +148,29 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         }
         return calendar.getTime();
     }
+
+
+    public static List<String> findDates(String beginTime, String endTime)
+            throws ParseException {
+        List<String> allDate = new ArrayList();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        Date dBegin = sdf.parse(beginTime);
+        Date dEnd = sdf.parse(endTime);
+        allDate.add(sdf.format(dBegin));
+        Calendar calBegin = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calBegin.setTime(dBegin);
+        Calendar calEnd = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calEnd.setTime(dEnd);
+        // 测试此日期是否在指定日期之后
+        while (dEnd.after(calBegin.getTime())) {
+            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+            calBegin.add(Calendar.DAY_OF_MONTH, 1);
+            allDate.add(sdf.format(calBegin.getTime()));
+        }
+        System.out.println("时间==" + allDate);
+        return allDate;
+    }
 }

+ 6 - 0
zd-model/src/main/java/com/zd/model/constant/ApplicationConstants.java

@@ -56,4 +56,10 @@ public interface ApplicationConstants {
      */
     String BOTTLE_SERVICE = "zd-bottle";
 
+
+    /**
+     * 气瓶服务
+     */
+    String XXP_SERVICE = "zd-xxp";
+
 }

+ 0 - 1
zd-model/src/main/java/com/zd/model/domain/R.java

@@ -2,7 +2,6 @@ package com.zd.model.domain;
 
 
 import com.zd.model.constant.HttpStatus;
-
 import java.io.Serializable;
 
 /**

+ 42 - 0
zd-model/src/main/java/com/zd/model/domain/per/PerPrefix.java

@@ -788,4 +788,46 @@ public class PerPrefix {
      * 实验室项目:灭火设备
      */
     public static final String ALGORITHM_FIREDEVICE = "algorithm:firedevice:";
+
+    /***
+     * 海康门禁
+     */
+    public static final String HAIKANG_DOOR= "haikang:door:";
+
+    /***
+     * 海康门禁用户
+     */
+    public static final String HAIKANG_USER= "haikang:user:";
+
+    /***
+     * 海康授权日志
+     */
+    public static final String HAIKANG_USERLOG= "haikang:userLog:";
+
+    /**
+     * 电子信息牌安全类目
+     */
+    public static final String LABORATORY_CLASSIFY = "laboratory:classify:";
+
+    /**
+     * 电子信息牌安全类目详情
+     */
+    public static final String LABORATORY_CLASSIFY_DET = "laboratory:classifyDet:";
+
+    /**
+     * 电子信息牌巡查
+     */
+    public static final String LABORATORY_XXP_INSPECTION = "laboratory:xxpIns:";
+    /**
+     * 电子信息牌值班
+     */
+    public static final String LABORATORY_DUTY = "laboratory:duty:";
+    /**
+     * 电子信息牌信息
+     */
+    public static final String LABORATORY_CARDINFO = "laboratory:cardInfo:";
+    /**
+     * 电子信息牌人员前线
+     */
+    public static final String LABORATORY_XXPUSERAUTH= "laboratory:xxpUserAuth:";
 }

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

@@ -282,6 +282,10 @@ public class SysUser extends BaseEntity implements Serializable {
      * */
     private List<Long> deptIds;
 
+    private List<Long> subjectIds;
+
+    private List<String> dateList;
+
     private boolean include = false;
 
     private List<Object> permitMenus = new ArrayList<>();
@@ -724,4 +728,20 @@ public class SysUser extends BaseEntity implements Serializable {
     public void setCardNumSimple(String cardNumSimple) {
         this.cardNumSimple = cardNumSimple;
     }
+
+    public List<Long> getSubjectIds() {
+        return subjectIds;
+    }
+
+    public void setSubjectIds(List<Long> subjectIds) {
+        this.subjectIds = subjectIds;
+    }
+
+    public List<String> getDateList() {
+        return dateList;
+    }
+
+    public void setDateList(List<String> dateList) {
+        this.dateList = dateList;
+    }
 }

+ 4 - 2
zd-model/src/main/java/com/zd/model/page/PageDomain.java

@@ -2,6 +2,8 @@ package com.zd.model.page;
 
 import org.apache.commons.lang3.StringUtils;
 
+import java.util.Optional;
+
 /**
  * 分页数据
  *
@@ -36,7 +38,7 @@ public class PageDomain {
     }
 
     public Integer getPageNum() {
-        return pageNum;
+        return Optional.ofNullable(pageNum).orElse(1);
     }
 
     public void setPageNum(Integer pageNum) {
@@ -44,7 +46,7 @@ public class PageDomain {
     }
 
     public Integer getPageSize() {
-        return pageSize;
+        return Optional.ofNullable(pageSize).orElse(10);
     }
 
     public void setPageSize(Integer pageSize) {

+ 82 - 20
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/controller/FaceApi.java

@@ -4,18 +4,21 @@ import com.arcsoft.face.FaceFeature;
 import com.arcsoft.face.FaceInfo;
 import com.arcsoft.face.toolkit.ImageInfo;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
-import com.zd.alg.face.handle.FaceEngineFactory;
 import com.zd.alg.face.service.FaceService;
 import com.zd.alg.face.utils.FileUtil;
 import com.zd.algorithm.api.face.feign.FaceCompare;
+import com.zd.common.core.utils.DateUtils;
+import com.zd.common.core.utils.StringUtils;
 import com.zd.common.swagger.config.Knife4jConfiguration;
 import com.zd.laboratory.api.entity.LabStudentsInfo;
+import com.zd.laboratory.api.entity.LabSysUserInfo;
+import com.zd.laboratory.api.feign.RemoteDutyService;
 import com.zd.laboratory.api.feign.RemoteStudentsService;
+import com.zd.model.constant.HttpStatus;
 import com.zd.model.domain.R;
 import com.zd.model.domain.ResultData;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.extern.flogger.Flogger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +27,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Author: zhoupan
@@ -45,49 +49,112 @@ public class FaceApi {
     @Autowired
     RemoteStudentsService remoteStudentsService;
 
+    @Autowired
+    RemoteDutyService remoteDutyService;
+
 
     @ApiOperation("根据照片文件获取特征码")
     @PostMapping("/faceFeature")
     public ResultData faceFeature(@RequestParam("file") MultipartFile file) throws IOException {
         ImageInfo imageInfo;
-        File file1=null;
+        File file1 = null;
         try {
-            file1= FileUtil.multipartFileToFile(file);
+            file1 = FileUtil.multipartFileToFile(file);
             imageInfo = faceService.getImageInfo(file1);
         } finally {
-            if(file1!=null)
-            {
+            if (file1 != null) {
                 file1.delete();
             }
         }
         List<FaceInfo> faceInfos = faceService.faceDetect(imageInfo);
+        if(null==faceInfos || faceInfos.size()==0){
+            return ResultData.fail("识别中");
+        }
         FaceFeature faceFeature = faceService.faceFeature(imageInfo, faceInfos);
         return ResultData.success(faceFeature.getFeatureData());
     }
+
     /**
      * 人脸比较
+     *
      * @return
      */
     @ApiOperation("人脸比较")
     @PostMapping("/compare")
-    public ResultData faceDetection(@RequestBody FaceCompare faceCompare)
-    {
+    public ResultData faceDetection(@RequestBody FaceCompare faceCompare) {
         logger.info("====人脸比较====");
         R<LabStudentsInfo> info = remoteStudentsService.getInfo(faceCompare.getUserId());
-        if(info.getCode()==200&&info.getData()!=null)
-        {
+        if (info.getCode() == 200 && info.getData() != null) {
             logger.info("====人脸data组装====");
             FaceFeature target = new FaceFeature(info.getData().getFaceFeature());
             FaceFeature source = new FaceFeature(faceCompare.getData());
             Boolean compore = faceService.compore(target, source);
-            logger.info("====compore===="+compore);
-            return ResultData.result(compore,()->"人脸对比不符!");
-        }else
-        {
-            return ResultData.fail("未获取到对比数据!:"+info.getMsg());
+            logger.info("====compore====" + compore);
+            return ResultData.result(compore, () -> "人脸对比不符!");
+        } else {
+            return ResultData.fail("未获取到对比数据!:" + info.getMsg());
+        }
+    }
+
+
+    /**
+     * 人脸比较
+     *
+     * @return
+     */
+    @ApiOperation("人脸比较")
+    @PostMapping("/multiCompare")
+    public ResultData multiFaceDetection(@RequestBody FaceCompare faceCompare) {
+        logger.info("====人脸比较====");
+        Integer isDutyUser=0;
+        ResultData<List<LabSysUserInfo>> infoList = remoteStudentsService.getFaceBySecuritySubjectId(faceCompare.getLabId());
+        if (infoList.getCode() == 200 && infoList.getData() != null) {
+            logger.info("====人脸data组装====");
+            for(LabSysUserInfo info:infoList.getData()){
+                FaceFeature target = new FaceFeature(info.getFaceFeature());
+                FaceFeature source = new FaceFeature(faceCompare.getData());
+                Boolean compore = faceService.compore(target, source);
+                if(compore){
+                    String userType=info.getUserType();
+                    Integer isWhite=info.getIsWhite();
+                    //如果是学生 或者白名单的老师 进二类页面
+                    if(userType.equals("22") || (userType.equals("11") && isWhite==0)){
+                        info.setPageType(2);
+                    }
+                    ResultData resultData =remoteDutyService.isAdminOrSafeUser(faceCompare.getLabId(),info.getUserId());
+                    //一类首页对应身份为白名单老师、实验室负责人、安全责任人
+                    if(Integer.parseInt(String.valueOf(resultData.getData()))>0 || (userType.equals("11") && isWhite==1)){
+                        info.setPageType(1);
+                    }
+                    info.setFaceFeature(null);
+                    String dateTime = DateUtils.getDate();
+                    ResultData dutyUserData = remoteDutyService.selectDutyUser(faceCompare.getLabId(),dateTime);
+                    //判断是否当天值班
+                    if(null==dutyUserData && dutyUserData.getCode()!= HttpStatus.SUCCESS){
+                        return ResultData.fail("获取值班人员识别!");
+                    }
+                    List<Map<String,Object>> dutyList= (List<Map<String, Object>>) dutyUserData.getData();
+                    for(Map<String,Object> dutyMap:dutyList){
+                        String userObj=String.valueOf(dutyMap.get("userId"));
+                        if(StringUtils.isNotEmpty(userObj) && StringUtils.isNotNull(userObj)){
+                            if(Long.parseLong(userObj)==info.getUserId()){
+                                isDutyUser=1;
+                                break;
+                            }
+                        }
+                    }
+                    info.setIsDutyUser(isDutyUser);
+                    logger.info("====compore====" +"对比成功用户ID:"+info.getUserId());
+                    return ResultData.success(info);
+                }
+            }
+            return ResultData.fail("未获取实验室安全准入人脸数据!");
+        } else {
+            return ResultData.fail("未获取实验室安全准入人脸数据!");
         }
     }
 
+
     //获取流文件
     private static void inputStreamToFile(InputStream ins, File file) {
         try {
@@ -103,9 +170,4 @@ public class FaceApi {
             e.printStackTrace();
         }
     }
-
-
-
-
-
 }

+ 1 - 1
zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/utils/FileUtil.java

@@ -18,7 +18,7 @@ public class FileUtil {
 
         String originalFilename = file.getOriginalFilename();
         String[] filename = originalFilename.split("\\.");
-        toFile=File.createTempFile(filename[0], filename[1]);
+        toFile=File.createTempFile(filename[0], "." +filename[1]);
         file.transferTo(toFile);
 //        toFile.deleteOnExit();//在jvm 退出时删除
         return toFile;

+ 16 - 0
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/controller/SignInCheckController.java

@@ -11,6 +11,7 @@ import com.zd.alg.forward.serivce.VideoCheckResultValidImpl;
 import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.Assert;
+import com.zd.common.core.utils.UUID;
 import com.zd.common.swagger.config.Knife4jConfiguration;
 import com.zd.model.constant.BaseConstants;
 import com.zd.model.constant.HttpStatus;
@@ -97,6 +98,21 @@ public class SignInCheckController {
     }
 
 
+
+    /**
+     * 进入项验证:合并
+     *
+     * @param file 带验证图片
+     */
+    @ApiOperation(value = "进入项验证:合并,codes格式:1,2,3")
+    @PostMapping("/checkInXxpAll")
+    public R checkInXxpAll(@ApiParam("图片文件") @RequestParam("file") MultipartFile file,
+                        @ApiParam("实验室ID") @RequestParam("subId") Long subId) {
+
+        String id= UUID.fastUUID().toString();
+        return checkService.checkAndCommitXxp(id, file, subId);
+    }
+
     /**
      * 进入项验证:mock方法
      *

+ 92 - 2
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/CheckService.java

@@ -186,7 +186,7 @@ public class CheckService {
                 List<Map<String, Object>> objects = (List<Map<String, Object>>) modelResult.get("objects");
                 logger.info("【调用算法服务】 算法请求日志打印:算法ID:{},请求结果:{}", code, algorithmData.getOrDefault("is_alert", ""));
                 //通过
-                if (algorithmData.getOrDefault("is_alert", "").toString().equals("false")) {
+                if (algorithmData.getOrDefault("is_alert", "").toString().equals("false") && !objects.isEmpty()) {
                     alarmNum++;
                 } else {
                     //不跳过
@@ -217,6 +217,96 @@ public class CheckService {
     }
 
     /**
+     * 合并检查 三合一套餐
+     */
+    public R checkAndCommitXxp(String id, MultipartFile file, Long subId) {
+        try {
+            int alarmNum = 0;
+            //根据实验室id查询检查项
+            R<Map<Object, Object>> subject = laboratoryService.getCheckInfo(subId);
+            if (subject.getCode() != HttpStatus.SUCCESS) {
+                return subject;
+            }
+            Map<Object, Object> map = subject.getData();
+            Object labCheckInObj = map.get("inspectCheckIn");
+            if (StringUtils.isNull(labCheckInObj)) {
+                return R.fail(700, "未配置检查项");
+            }
+            //上传原始图片
+            String orgImgUrl = "";
+            R<SysFile> r = remoteFileService.upload(file);
+            if (r.getCode() == HttpStatus.SUCCESS) {
+                orgImgUrl = r.getData().getUrl();
+            }
+            String labSkipped = "0";
+            String labCheckCount = "2";
+            Object labSkippedObj = map.get("inspectSkipped");
+            if (StringUtils.isNotNull(labSkippedObj)) {
+                labSkipped = String.valueOf(labSkippedObj);
+            }
+            Object labCheckCountObj = map.get("inspectCheckCount");
+            if (StringUtils.isNotNull(labCheckCountObj)) {
+                labCheckCount = String.valueOf(labCheckCountObj);
+            }
+            String labCheckIn = String.valueOf(labCheckInObj);
+            String[] checkItem = labCheckIn.split(",");
+            File toFile = multipartFileToFile(file);
+            for (String code : checkItem) {
+                //========= 获取算法INFO ===========
+                AlgorithmYml.CheckValid checkValid = algorithmYml.getCheckValid(Integer.valueOf(code));
+                //添加一条算法请求记录
+                R alg = insertRequestRecordLog(orgImgUrl, subId, checkValid);
+                logger.info("【调用算法服务】 添加算法调用日志,添加结果:"+JSONObject.toJSONString(alg));
+                MultiValueMap<String, Object> params = getStringObjectMultiValueMap(checkValid, String.valueOf(id));
+                HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(toFile,"image", params);
+                ImgPostResponse<AnalysisReturnData> send = HttpUtils.sendV5(restTemplateLocal, files, algorithmYml);
+                //算法记录更新
+                if (alg.getCode() == 200) {
+                    updateRequestRecordLogV5(alg.getData() != null?Long.valueOf(alg.getData()+""):null, send);
+                    logger.info("【调用算法服务V5】 更新算法调用日志记录");
+                }
+                //判断算法
+                if (send.getStatus_code() == 1000) {
+                    AnalysisReturnData data = send.getData();
+                    Map<String, Object> result = (Map<String, Object>) data.getResult();
+                    Map<String, Object> algorithmData = (Map<String, Object>) result.get("algorithm_data");
+                    Map<String, Object> modelResult = (Map<String, Object>) result.get("model_data");
+                    List<Map<String, Object>> objects = (List<Map<String, Object>>) modelResult.get("objects");
+                    logger.info("【调用算法服务】 算法请求日志打印:算法ID:{},请求结果:{}", code, algorithmData.getOrDefault("is_alert", ""));
+                    //通过
+                    if (algorithmData.getOrDefault("is_alert", "").toString().equals("false") && !objects.isEmpty()) {
+                        alarmNum++;
+                    } else {
+                        //不跳过
+                        if (StringUtils.isNotEmpty(labSkipped) && labSkipped.equals("1")) {
+                            //如果没有通过则次数加一
+                            //键为前缀+签到id +下划线+验证类型
+                            String key = BaseConstants.SINGIN_CHECK_JUMP_KEY + id + "_" + code;
+                            Long increment = redisTemplate.opsForValue().increment(key);
+                            redisService.expire(key, BaseConstants.SINGIN_OUT_TIME);
+                            if (increment != null && increment >= Integer.parseInt(labCheckCount)) {
+                                //黎晨这里让把跳过时状态码改为700,所以700的含义为检查失败并且跳过
+                                return R.fail(700, "符合跳过条件执行跳过");
+                            }
+                        }
+                        return R.fail(300, "算法识别未通过", code);
+                    }
+                } else {
+                    assert send != null;
+                    //logger.error("【调用算法服务】 算法服务调用失败,响应信息:"+ JSONObject.toJSONString(send));
+                    return R.fail("算法服务错误,请重试!");
+                }
+            }
+            if (alarmNum == checkItem.length) {
+                return R.ok();
+            }
+        } catch (Exception e) {
+            logger.error("【调用算法服务】 算法服务调用发生异常", e);
+        }
+        return R.fail();
+    }
+
+    /**
      * 算法V6平台参数
      * @param checkValid
      * @param extension
@@ -274,7 +364,7 @@ public class CheckService {
             Map<String, Object> algorithmData = (Map<String, Object>) result.get("algorithm_data");
             Map<String, Object> modelResult = (Map<String, Object>) result.get("model_data");
             List<Map<String, Object>> objects = (List<Map<String, Object>>) modelResult.get("objects");
-            if (algorithmData.getOrDefault("is_alert", "").toString().equals("false")) {
+            if (algorithmData.getOrDefault("is_alert", "").toString().equals("false") && !objects.isEmpty()) {
                 algorithm.setIsAlarm(0);
             } else {
                 algorithm.setIsAlarm(1);

+ 66 - 0
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/bean/MediaStream.java

@@ -0,0 +1,66 @@
+package com.zd.alg.iot.vmp.gb28181.bean;
+
+import com.zd.common.core.utils.StringUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+/**
+ * <p>媒体流参数模型类</p>
+ *
+ * @author linft
+ * @version 1.0
+ * @date 2/7/2023
+ */
+public class MediaStream {
+
+
+    /**
+     * 视频描述f参数
+     * @param dpi
+     * @return
+     */
+    public static String getMediaStreamF(Integer dpi){
+        if (dpi == null || StringUtils.isEmpty(mediaStreamFParams.get(dpi))) {
+            return mediaStreamFParams.get(720);
+        }
+        return mediaStreamFParams.get(dpi);
+    }
+
+    /**
+     * 按分辨率获取码流(主码流、子码流、第三码流)
+     * @param dpi
+     * @return
+     */
+    public static String getMediaStreamA(Integer dpi){
+        if (dpi != null) {
+            if (dpi > 720) {
+                return "stream:0";
+            } else if (dpi < 720){
+                return "stream:2";
+            }
+        }
+        return "stream:1";
+    }
+
+    /**
+     * GB/T28181视频流f参数
+     * f字段:f=v/码格式/分辨率/帧数/码率类型/码率大小 a/编码格式/码率大小/采样率
+     * v(video)后为视频参数
+     *  --编码格式:1-MPEG-4, 2-H.264, 3-SVAV, 4-3GP
+     *  --分辨率:1-QCIF(176×144), 2-CIF(352×288), 3-4CIF(704×576), 4-D1(720*576), 5-720P, 6-1080P/I
+     *  --帧数:0~99 (海康:0~25)
+     *  --码率类型:1-固定码率, 2-可变码率
+     *  --码率大小(Kbps): 0~100000 (海康:256~16384)
+     * a(aud) 后为音频参数
+     *  --编码格式:1-G.711, 2-G.723.1, 3-G729, 4-722.1
+     *  --码率大小:
+     *  --编码码率:1-5.3kbps, 2-6.3kbps, 3-8kbps, 4-16kbps
+     */
+    protected static Map<Integer,String> mediaStreamFParams = new HashMap<Integer,String>(){{
+        put(288,"v/2/2/20/1/256 a///");
+        put(480,"v/2/3/18/1/256 a///");
+        put(576,"v/2/4/18/1/512 a///");
+        put(720,"v/2/5/16/1/512 a///");
+        put(1080,"v/2/6/15/1/1024 a///");
+    }};
+}

+ 10 - 3
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java

@@ -3,6 +3,7 @@ package com.zd.alg.iot.vmp.gb28181.transmit.cmd.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.zd.alg.iot.vmp.conf.SipConfig;
 import com.zd.alg.iot.vmp.conf.UserSetup;
+import com.zd.alg.iot.vmp.gb28181.bean.MediaStream;
 import com.zd.alg.iot.vmp.service.IMediaServerService;
 import com.zd.alg.iot.vmp.service.bean.SSRCInfo;
 import com.zd.alg.iot.vmp.storager.IRedisCatchStorage;
@@ -407,9 +408,12 @@ public class SIPCommander implements ISIPCommander {
 					content.append("a=connection:new\r\n");
 				}
 			}
-
+			//验证1:获取码流
+			//content.append("a="+MediaStream.getMe diaStreamA(dpi)+"\r\n");
 			content.append("y="+ssrcInfo.getSsrc()+"\r\n");//ssrc
-
+			//验证2:设置编码格式、分辨率、帧数、码率类型、码率大小、编码格式、码率大小
+			content.append("f="+MediaStream.getMediaStreamF(null)+"\r\n");
+			logger.info("【RTSP实时视频流请求】 请求参数:\r\n"+content.toString());
 			String tm = Long.toString(System.currentTimeMillis());
 
 			CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
@@ -513,6 +517,8 @@ public class SIPCommander implements ISIPCommander {
 				}
 			}
 	        content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
+			//设置编码格式、分辨率、帧数、码率类型、码率大小、编码格式、码率大小
+			content.append("f="+MediaStream.getMediaStreamF(null)+"\r\n");
 			String tm = Long.toString(System.currentTimeMillis());
 			CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
 					: udpSipProvider.getNewCallId();
@@ -614,7 +620,8 @@ public class SIPCommander implements ISIPCommander {
 			content.append("a=downloadspeed:" + downloadSpeed + "\r\n");
 
 	        content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
-
+			//设置编码格式、分辨率、帧数、码率类型、码率大小、编码格式、码率大小
+			content.append("f="+MediaStream.getMediaStreamF(null)+"\r\n");
 			String tm = Long.toString(System.currentTimeMillis());
 
 			CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()

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

@@ -266,9 +266,7 @@ public class ZLMHttpHookListener {
 			if (mediaInfo != null) {
 				subscribe.response(mediaInfo, json);
 			}
-
 		}
-
 		// 流消失移除redis play
 		String app = json.getString("app");
 		String streamId = json.getString("stream");
@@ -304,7 +302,6 @@ public class ZLMHttpHookListener {
 				}
 			}
 		}
-
 		JSONObject ret = new JSONObject();
 		ret.put("code", 0);
 		ret.put("msg", "success");

+ 50 - 43
zd-modules/zd-algorithm/src/main/java/com/zd/alg/monitor/HardwareDeviceMonitor.java

@@ -52,57 +52,64 @@ public class HardwareDeviceMonitor {
 
     @Scheduled(cron = "0 */9 * * * ?")
     public void checkPowerUse() {
-        if (dingTalkNotice != null && dingTalkNotice) {
-            ResultData result = remoteLabHardwareService.statistics();
-            if (result != null && result.getCode() == HttpStatus.SUCCESS && result.getData() != null) {
-                String jsonStr = JSONObject.toJSONString(result.getData());
-                JSONObject json = JSONObject.parseObject(jsonStr);
-                Integer offline = json.getInteger("powerSupplyOffline");
-                log.info("【设备监听提醒】 继电器异常监控--掉线数量:" + offline);
-                if (offline != null && offline > 0) {
-                    //获取离线列表
-                    ResultData data = remoteLabHardwareService.list("SWITCH", "OFFLINE");
-                    log.info("【设备监听提醒】 继电器异常监控--获取异常列表:"+JSONObject.toJSONString(data));
-                    if (data != null && data.getCode() == HttpStatus.SUCCESS && data.getData() != null) {
-                        //log.info("【设备监听提醒】 异常设备列表信息:" + data.getData());
-                        String listStr = JSONObject.toJSONString(data.getData());
-                        List<Map<String, Object>> list = JSONObject.parseObject(listStr, List.class);
-                        if (list != null && list.size() > 0) {
-                            Map<String, String> map = new HashMap<>();
-                            for (Map m : list) {
-                                String code = (String) m.get("relayCode");
-                                if (!map.containsKey(code)) {
-                                    map.put(code, "---信息[名称:" +
-                                            "" + m.get("name") + ",所在学院:" + m.get("deptName") + ",所在实验室:" + m.get("subjectName") + "]\n");
-                                }
-                            }
-                            //封装消息
-                            if (!map.isEmpty()) {
-                                Set<String> code = map.keySet();
-                                StringBuffer buffer = new StringBuffer();
-                                buffer.append("系统接入继电器设备离线信息:\n");
-                                boolean isSend = Boolean.FALSE;
-                                for (String key : code) {
-                                    Integer num = redisService.getCacheObject(redisPrefix+key);
-                                    if (num != null && num > 2) {
-                                        buffer.append("继电器[" + key + "] " + map.get(key));
-                                        redisService.deleteObject(redisPrefix+key);
-                                        isSend = Boolean.TRUE;
-                                    } else {
-                                        int value = num == null ? 1:num+1;
-                                        redisService.setCacheObject(redisPrefix+key, value, expire, TimeUnit.MINUTES);
+        String lockKey = "electric-relay-monitor";
+        if (!redisService.isExistLock(lockKey)) {
+            //添加锁
+            redisService.lock(lockKey,180);
+            if (dingTalkNotice != null && dingTalkNotice) {
+                ResultData result = remoteLabHardwareService.statistics();
+                if (result != null && result.getCode() == HttpStatus.SUCCESS && result.getData() != null) {
+                    String jsonStr = JSONObject.toJSONString(result.getData());
+                    JSONObject json = JSONObject.parseObject(jsonStr);
+                    Integer offline = json.getInteger("powerSupplyOffline");
+                    log.info("【设备监听提醒】 继电器异常监控--掉线数量:" + offline);
+                    if (offline != null && offline > 0) {
+                        //获取离线列表
+                        ResultData data = remoteLabHardwareService.list("SWITCH", "OFFLINE");
+                        log.info("【设备监听提醒】 继电器异常监控--获取异常列表:" + JSONObject.toJSONString(data));
+                        if (data != null && data.getCode() == HttpStatus.SUCCESS && data.getData() != null) {
+                            //log.info("【设备监听提醒】 异常设备列表信息:" + data.getData());
+                            String listStr = JSONObject.toJSONString(data.getData());
+                            List<Map<String, Object>> list = JSONObject.parseObject(listStr, List.class);
+                            if (list != null && list.size() > 0) {
+                                Map<String, String> map = new HashMap<>();
+                                for (Map m : list) {
+                                    String code = (String) m.get("relayCode");
+                                    if (!map.containsKey(code)) {
+                                        map.put(code, "---信息[名称:" +
+                                                "" + m.get("name") + ",所在学院:" + m.get("deptName") + ",所在实验室:" + m.get("subjectName") + "]\n");
                                     }
                                 }
-                                //通知
-                                if (isSend) {
-                                    String resp = DingTalkAlert.sendAlert(buffer.toString());
-                                    log.info("【设备监听提醒】 继电器异常监控--钉钉通知响应:" + resp);
+                                //封装消息
+                                if (!map.isEmpty()) {
+                                    Set<String> code = map.keySet();
+                                    StringBuffer buffer = new StringBuffer();
+                                    buffer.append("系统接入继电器设备离线信息:\n");
+                                    boolean isSend = Boolean.FALSE;
+                                    for (String key : code) {
+                                        Integer num = redisService.getCacheObject(redisPrefix + key);
+                                        if (num != null && num > 2) {
+                                            buffer.append("继电器[" + key + "] " + map.get(key));
+                                            redisService.deleteObject(redisPrefix + key);
+                                            isSend = Boolean.TRUE;
+                                        } else {
+                                            int value = num == null ? 1 : num + 1;
+                                            redisService.setCacheObject(redisPrefix + key, value, expire, TimeUnit.MINUTES);
+                                        }
+                                    }
+                                    //通知
+                                    if (isSend) {
+                                        String resp = DingTalkAlert.sendAlert(buffer.toString());
+                                        log.info("【设备监听提醒】 继电器异常监控--钉钉通知响应:" + resp);
+                                    }
                                 }
                             }
                         }
                     }
                 }
             }
+            //释放锁
+            redisService.unLock(lockKey);
         }
     }
 }

+ 9 - 11
zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/service/impl/SpeakerServiceImpl.java

@@ -226,12 +226,10 @@ public class SpeakerServiceImpl implements ISpeakerService {
         return false;
     }
 
-    private List<UrlVo> getUrlList(String texts,Integer playNum) {
+    private List<UrlVo> getUrlList(String texts) {
         List<UrlVo> urlVoList = new ArrayList<>();
-        for(int i=0;i<playNum;i++){
-            UrlVo urlVo = new UrlVo(texts.substring(0, 1), texts);
-            urlVoList.add(urlVo);
-        }
+        UrlVo urlVo = new UrlVo(texts.substring(0, 1), texts);
+        urlVoList.add(urlVo);
         return urlVoList;
     }
 
@@ -275,7 +273,7 @@ public class SpeakerServiceImpl implements ISpeakerService {
     private void commonTextUrlVoice(String texts,List<PlayVo> playVoList,Integer playNum,Integer level) {
         for (PlayVo play : playVoList) {
             String deviceIp=play.getDeviceIp();
-            List<UrlVo> urlVoList = getUrlList(texts,playNum);
+            List<UrlVo> urlVoList = getUrlList(texts);
             if (null != play.getParams()) {
                 play.getParams().setTid(UUID.randomUUID().toString());
                 play.getParams().setUrls(urlVoList);
@@ -298,20 +296,20 @@ public class SpeakerServiceImpl implements ISpeakerService {
     private PlayBatchVo commonPatchTextUrlVoice(String texts,List<PlayVo> playVoList,Integer playNum,Integer level) {
         PlayBatchVo playBatchVo = new PlayBatchVo();
         BeanUtils.copyProperties(playVoList.get(0), playBatchVo);
-        List<UrlVo> urlVoList = getUrlList(texts,playNum);
+        List<UrlVo> urlVoList = getUrlList(texts);
         if (null != playBatchVo.getParams()) {
             playBatchVo.getParams().setTid(UUID.randomUUID().toString());
             playBatchVo.getParams().setUrls(urlVoList);
             playBatchVo.getParams().setUid(UUID.randomUUID().toString());
+            playBatchVo.getParams().setCount(playNum);
+            playBatchVo.getParams().setLevel(level);
         }
         List<String> snsList = new ArrayList<>();
-        List<String> reqList = new ArrayList<>();
         for (PlayVo playVo : playVoList) {
             snsList.add(playVo.getSn());
-            reqList.add("req");
         }
-        playBatchVo.setSns(snsList.toArray(new String[snsList.size()]));
-        playBatchVo.setType(reqList.toArray(new String[reqList.size()]));
+        playBatchVo.setSn(snsList.toArray(new String[snsList.size()]));
+        playBatchVo.setType("req");
         return playBatchVo;
     }
 

+ 16 - 0
zd-modules/zd-base/pom.xml

@@ -18,6 +18,16 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>javassist</artifactId>
+                    <groupId>org.javassist</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
@@ -44,6 +54,12 @@
         <dependency>
             <groupId>com.zd.swagger</groupId>
             <artifactId>common-swagger</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>

+ 2 - 2
zd-modules/zd-base/src/main/java/com/zd/base/ZdBaseApplicaion.java

@@ -15,8 +15,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @SpringBootApplication
 @EnableScheduling
 @ComponentScan(basePackages = BaseConstants.BASE_PACKAGE)
-public class ZdBaseApplicaion {
+public class ZdBaseApplication {
     public static void main(String[] args) {
-        ZdStartApplication.run(ApplicationConstants.BASE_SERVICE, ZdBaseApplicaion.class, args);
+        ZdStartApplication.run(ApplicationConstants.BASE_SERVICE, ZdBaseApplication.class, args);
     }
 }

+ 34 - 0
zd-modules/zd-base/src/main/java/com/zd/base/app/HexStrUtils.java

@@ -0,0 +1,34 @@
+package com.zd.base.app;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * hex 转换
+ * @author dgs
+ * @time 2023-04-11
+ */
+public class HexStrUtils {
+
+    private static String hexString = "0123456789ABCDEFabcdef";
+
+    public static String encode(String str) {
+        byte[] bytes = str.getBytes();
+        StringBuilder sb = new StringBuilder(bytes.length * 2);
+        //转换hex编码
+        for (byte b : bytes) {
+            sb.append(Integer.toHexString(b + 0x800).substring(1));
+        }
+        str = sb.toString();
+        return str;
+    }
+
+    //把hex编码转换为string
+    public static String decode(String bytes) {
+        bytes = bytes.toUpperCase();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length() / 2);
+        // 将每2位16进制整数组装成一个字节
+        for (int i = 0; i < bytes.length(); i += 2)
+            baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1))));
+        return new String(baos.toByteArray());
+    }
+}

+ 561 - 0
zd-modules/zd-base/src/main/java/com/zd/base/app/controller/LabBoardApi.java

@@ -0,0 +1,561 @@
+package com.zd.base.app.controller;
+
+import com.zd.algorithm.api.face.feign.FaceCompare;
+import com.zd.algorithm.api.face.feign.RemoteFaceService;
+import com.zd.algorithm.api.xxp.feign.RemoteXxpService;
+import com.zd.base.app.HexStrUtils;
+import com.zd.base.app.domain.board.DutyPersonVo;
+import com.zd.base.app.domain.board.LabXxpSubjectVo;
+import com.zd.common.core.utils.DateUtils;
+import com.zd.common.core.utils.FileConfigUtils;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.laboratory.api.feign.RemoteDutyService;
+import com.zd.laboratory.api.vo.XxpInspectionVo;
+import com.zd.laboratory.api.vo.XxpUserAuthVo;
+import com.zd.model.constant.HttpStatus;
+import com.zd.model.domain.R;
+import com.zd.model.domain.ResultData;
+import com.zd.system.api.feign.RemoteUserService;
+import com.zd.system.api.vo.SysLogoConfigVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @Author: donggaosheng
+ * @Date: 2023/03/24
+ * @Description:
+ */
+@RestController
+@RequestMapping("/app/board")
+@Api(tags = {"电子信息牌"})
+public class LabBoardApi {
+
+    private final Logger logger = LoggerFactory.getLogger(LabBoardApi.class);
+
+    @Autowired
+    private RemoteUserService remoteUserService;
+    @Autowired
+    private RemoteDutyService remoteDutyService;
+    @Autowired
+    private RemoteXxpService remoteXxpService;
+    @Autowired
+    private FileConfigUtils fileConfigUtils;
+    @Autowired
+    private RemoteFaceService remoteFaceService;
+
+    /**
+     * 查询电子信息牌头部信息
+     */
+    @ApiOperation(value = "电子信息牌头部信息")
+    @GetMapping(value = "/topInfo")
+    public ResultData topInfo(@RequestParam Long labId) {
+        R<SysLogoConfigVO> sysLogo = remoteUserService.getConfigLogo();
+        Map<String, Object> map = new HashMap<>();
+        if (sysLogo == null || sysLogo.getCode() != 200) {
+            return ResultData.fail(500, "获取logo失败!");
+        }
+        SysLogoConfigVO logoConfigVo = sysLogo.getData();
+        if (logoConfigVo == null) {
+            return ResultData.fail(500, "获取logo失败!");
+        }
+        map.put("schoolName", logoConfigVo.getSchoolName());
+        map.put("circularLogo", fileConfigUtils.getFileDomainApp()+logoConfigVo.getRectangleLogo());
+        ResultData resultData=remoteDutyService.getSubjectName(labId);
+        if (resultData == null || resultData.getCode() != 200) {
+            return ResultData.fail(500, "获取实验室名称失败!");
+        }
+        map.put("subjectName", resultData.getData());
+        map.put("currentTime", DateUtils.parseDateToStr("YYYY_MM_DD HH:MM:SS",new Date()));
+        return ResultData.success(map);
+    }
+
+    /**
+     * 查询电子信息牌中部信息
+     */
+    @ApiOperation(value = "电子信息牌中部信息")
+    @GetMapping(value = "/middleInfo")
+    public ResultData middleInfo(@RequestParam Long labId) {
+        //查询实验室负责人和安全负责人
+        LabXxpSubjectVo vo = new LabXxpSubjectVo();
+        ResultData resultData = remoteDutyService.getXxpSubjectInfo(labId);
+        if (null == resultData || resultData.getCode() != 200) {
+            return ResultData.fail("获取实验室信息失败!");
+        }
+        Map<String, Object> map = (Map<String, Object>) resultData.getData();
+        if (null == map) {
+            return ResultData.fail("获取实验室信息失败!");
+        }
+        vo.setAdminName(String.valueOf(map.getOrDefault("adminName", "")));
+        vo.setAdminPhone(String.valueOf(map.getOrDefault("adminPhone", "")));
+        vo.setFiledColor(String.valueOf(map.getOrDefault("filedColor", "")));
+        vo.setQrCodeUrl(String.valueOf(map.getOrDefault("qrCode", "")));
+        vo.setLevelName(String.valueOf(map.getOrDefault("levelName", "")));
+        vo.setTypeName(String.valueOf(map.getOrDefault("typeName", "")));
+        vo.setQrCodeUrl(String.valueOf(map.getOrDefault("qrCode", "")));
+        vo.setDeptName(String.valueOf(map.getOrDefault("deptName", "")));
+        String safeUser = String.valueOf(map.getOrDefault("safeUserNameAdminPhone", ""));
+        if (StringUtils.isNotEmpty(safeUser) && StringUtils.isNotNull(safeUser)) {
+            String splitStr[] = safeUser.split(",");
+            List<LabXxpSubjectVo.SafeUserVo> safeUserList = new ArrayList();
+            for (String split : splitStr) {
+                LabXxpSubjectVo.SafeUserVo safeUserVo = new LabXxpSubjectVo().new SafeUserVo();
+                if (StringUtils.isNotEmpty(split) && StringUtils.isNotNull(split)) {
+                    String[] nameAndPhone = split.split("@");
+                    safeUserVo.setSafeUserName(nameAndPhone[0]);
+                    safeUserVo.setSafeUserPhone(nameAndPhone[1]);
+                }
+                safeUserList.add(safeUserVo);
+            }
+            vo.setSafeUserVoList(safeUserList);
+        }
+        vo.setSubjectName(String.valueOf(map.getOrDefault("subjectName", "")));
+        vo.setInCheck((List<Map<String, String>>)map.get("checkIn"));
+        vo.setOutCheck((List<String>)map.get("checkOut"));
+        vo.setInspectInCheck((List<Map<String, String>>)map.get("inspectCheckIn"));
+        ResultData<LabXxpSubjectVo> xxpResultData= remoteDutyService.classifyDetailSubjectById(labId);
+        if(null==xxpResultData || xxpResultData.getCode()!=200){
+            return ResultData.fail("获取实验室信息类目失败!");
+        }
+        List<LabXxpSubjectVo> xxpSubjectVoList= (List<LabXxpSubjectVo>) xxpResultData.getData();
+        vo.setXxpSubjectVoList(xxpSubjectVoList);
+        return ResultData.success(vo);
+    }
+
+    /**
+     * 查询电子信息牌头部信息
+     */
+    @ApiOperation(value = "电子信息牌右侧信息")
+    @GetMapping(value = "/rightInfo")
+    public ResultData rightInfo(@RequestParam Long labId) {
+        Map<String, Object> map = new HashMap<>();
+        String dateTime = DateUtils.getDate();
+        ResultData<List<Map<String, Object>>> resultData = remoteDutyService.selectDutyUser(labId, dateTime);
+        if (null == resultData || resultData.getCode() != HttpStatus.SUCCESS) {
+            return ResultData.fail("值班人员获取失败!");
+        }
+        map.put("dutyUser", resultData.getData());
+        ResultData<List<Map<String, Object>>> signData = remoteDutyService.selectSubjectSignList(labId);
+        if(null==signData || signData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("签到人员获取失败!");
+        }
+        map.put("tentativeUser", signData.getData());
+        ResultData securityData=remoteDutyService.securityApplyList(labId,1,10);
+        if(null==securityData || securityData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("安全准入人员获取失败!");
+        }
+        map.put("securityUser", securityData.getData());
+        return ResultData.success(map);
+    }
+
+
+    @ApiOperation(value = "值班人员列表")
+    @GetMapping(value = "/dutyUserList")
+    public ResultData dutyUsrList(@RequestParam Long labId,@RequestParam String startTime) {
+        //处理当前实验,获取当前时间的这一周的开始时间和结束时间
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date newDate = sdf.parse(startTime);
+            List<Date> allDate = dateToWeek(newDate);
+            String startTimeStr = sdf.format(allDate.get(0));
+            String endTimeStr = sdf.format(allDate.get(6));
+            ResultData<List<Map<String, Object>>> dutyData=remoteDutyService.selectDutyUserList(labId,startTimeStr,endTimeStr);
+            if(null==dutyData || dutyData.getCode()!=HttpStatus.SUCCESS){
+                return ResultData.fail("值班人员列表获取失败!");
+            }
+            //处理人员信息,根据一周的日期分组
+            return ResultData.success(groupPersonInfo(allDate,dutyData.getData(),sdf));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return ResultData.fail("日期格式有误,请联系管理员!!");
+//        ResultData<List<Map<String, Object>>> dutyData=remoteDutyService.selectDutyUserList(labId,startTime,endTime);
+//        if(null==dutyData || dutyData.getCode()!=HttpStatus.SUCCESS){
+//            return ResultData.fail("值班人员列表获取失败!");
+//        }
+//        return ResultData.success(dutyData.getData());
+    }
+
+
+    @ApiOperation(value = "巡查人员列表")
+    @GetMapping(value = "/inspectUserList")
+    public ResultData inspectUserList(@RequestParam Long labId,@RequestParam String startTime) {
+        //处理当前实验,获取当前时间的这一周的开始时间和结束时间
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date newDate = sdf.parse(startTime);
+            List<Date> allDate = dateToWeek(newDate);
+            String startTimeStr = sdf.format(allDate.get(0));
+            String endTimeStr = sdf.format(allDate.get(6));
+            ResultData<List<Map<String, Object>>> dutyData=remoteDutyService.selectUserXxpInspectionList(labId,startTimeStr,endTimeStr);
+            if(null==dutyData || dutyData.getCode()!=HttpStatus.SUCCESS){
+                return ResultData.fail("巡查人员列表获取失败!");
+            }
+            //处理人员信息,根据一周的日期分组
+            return ResultData.success(groupPersonInfo(allDate,dutyData.getData(),sdf));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return ResultData.fail("日期格式有误,请联系管理员!!");
+//        ResultData<List<Map<String, Object>>> dutyData=remoteDutyService.selectUserXxpInspectionList(labId,startTime,endTime);
+//        if(null==dutyData || dutyData.getCode()!=HttpStatus.SUCCESS){
+//            return ResultData.fail("值班人员列表获取失败!");
+//        }
+//        return ResultData.success();
+    }
+
+    @ApiOperation(value = "实验室签到人员")
+    @GetMapping(value = "/signUserList")
+    public ResultData signUserList(@RequestParam Long labId) {
+        ResultData<List<Map<String, Object>>> signData = remoteDutyService.selectSubjectSignList(labId);
+        if(null==signData || signData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("签到人员获取失败!");
+        }
+        return ResultData.success(signData.getData());
+    }
+
+    @ApiOperation(value = "安全准入人员列表")
+    @GetMapping(value = "/securityUserList")
+    public ResultData securityUserList(@RequestParam Long labId,@RequestParam Integer pageNumber,@RequestParam Integer pageSize) {
+        ResultData securityData=remoteDutyService.securityApplyList(labId,pageNumber,pageSize);
+        if(null==securityData || securityData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("安全准入人员获取失败!");
+        }
+        return ResultData.success(securityData.getData());
+    }
+
+
+    /**
+     * 查询实验室简介信息
+     */
+    @ApiOperation(value = "实验室简介")
+    @GetMapping(value = "/labIntro")
+    public ResultData labIntro(@RequestParam Long labId) {
+        ResultData resultData= remoteDutyService.getSubjectDetails(labId);
+        return resultData;
+    }
+
+
+    /**
+     * 查询实验室视频监控列表信息
+     */
+    @ApiOperation(value = "视频监控")
+    @GetMapping(value = "/cameraBySubjectId")
+    public ResultData getCamera(@RequestParam Long labId) {
+        ResultData<String> resultData=remoteDutyService.getCameraBySubjectId(labId);
+        if(null==resultData || resultData.getCode()!=200){
+            return ResultData.fail("获取摄像头编号失败!");
+        }
+        ResultData data=remoteXxpService.selectSubjectCameraList(resultData.getData(),null,1,5000);
+        return data;
+    }
+
+
+    /**
+     * 查询实验室视频监控列表信息
+     */
+    @ApiOperation(value = "根据一体机编号获取实验室id")
+    @GetMapping(value = "/getSubjectIdByNum/{num}")
+    public ResultData getSubjectIdByNum(@PathVariable("num") String num) {
+        ResultData<String> resultData=remoteDutyService.querySubInfoByNumber(num);
+        R<SysLogoConfigVO> sysLogo = remoteUserService.getConfigLogo();
+        if(null==resultData || resultData.getCode()!=200){
+            return ResultData.fail("获取实验室编号失败!");
+        }
+        if (sysLogo == null || sysLogo.getCode() != 200) {
+            return ResultData.fail(500, "获取logo失败!");
+        }
+        Object subjectId=resultData.getData();
+        String isRelationGuard="2";
+        String authType="";
+        Map<String,Object> map= new HashMap<>();
+        if(StringUtils.isNull(subjectId)){
+            ResultData xxpMap=remoteDutyService.XxpCardInfoByCard(num);
+            Object obj=xxpMap.getData();
+            if (obj == null) {
+                return ResultData.fail("获取实验室编号失败!");
+            }
+            Map<String,Object> dataMap= (Map<String, Object>) xxpMap.getData();
+            subjectId=String.valueOf(dataMap.get("subjectId"));
+            isRelationGuard=String.valueOf(dataMap.get("isRelationGuard"));
+            authType=String.valueOf(dataMap.get("authType"));
+        }
+        map.put("labId",subjectId);
+        map.put("authType",authType);
+        map.put("isRelationGuard",isRelationGuard);
+        map.put("logoutTime",sysLogo.getData().getLogoutTime());
+        map.put("returnTime",sysLogo.getData().getReturnTime());
+        map.put("isStart",sysLogo.getData().getIsStart());
+        return ResultData.success(map);
+    }
+
+
+    //处理分组一周内的人员信息
+    public DutyPersonVo groupPersonInfo(List<Date> allDate,List<Map<String, Object>> personList,SimpleDateFormat sdf){
+        StringBuffer startTimeStr = new StringBuffer();
+        DutyPersonVo dutyPersonVo = new DutyPersonVo();
+        for(int i=0;i<allDate.size();i++){
+            if(i==0){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday1().add(a);
+                            }
+                        });
+            }else if(i==1){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday2().add(a);
+                            }
+                        });
+            }else if(i==2){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday3().add(a);
+                            }
+                        });
+            }else if(i==3){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday4().add(a);
+                            }
+                        });
+            }else if(i==4){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday5().add(a);
+                            }
+                        });
+            }else if(i==5){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday6().add(a);
+                            }
+                        });
+            }else if(i==6){
+                startTimeStr.append(sdf.format(allDate.get(i)));
+                Optional.ofNullable(personList).orElseGet(Collections::emptyList)
+                        .stream()
+                        .forEach(a->{
+                            if(startTimeStr.toString().equals(a.get("dutyTime"))){
+                                dutyPersonVo.getWeekday7().add(a);
+                            }
+                        });
+            }
+            startTimeStr.delete(0,startTimeStr.length());
+        }
+        return dutyPersonVo;
+    }
+
+    public List<Date> dateToWeek(Date mdate) {
+        List<Date> allDate = new ArrayList <>();
+        for(int i=0;i<7;i++){
+            Calendar   calendar = new GregorianCalendar();
+            calendar.setTime(mdate);
+            calendar.add(calendar.DATE,i); //把日期往后增加一天,整数  往后推,负数往前移动
+            allDate.add(calendar.getTime());//这个时间就是日期往后推一天的结果
+        }
+        return allDate;
+    }
+
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     * @param labId
+     * @return
+     */
+    @ApiOperation(value = "电子信息牌获取准入人员的指纹信息列表")
+    @GetMapping(value = "/getFingerList")
+    public ResultData getFingerList(@RequestParam("labId") Long labId) {
+        ResultData resultData=remoteDutyService.securityFingerList(labId);
+        return resultData;
+    }
+
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     * @param labId
+     * @return
+     */
+    @ApiOperation(value = "刷卡是否可以开门禁")
+    @GetMapping(value = "/getCardIsOpen")
+    public ResultData getCardIsOpen(@RequestParam("labId") Long labId,@RequestParam("cardNum") String cardNum) {
+        if(StringUtils.isNull(cardNum) || StringUtils.isEmpty(cardNum)){
+            return ResultData.fail("未识别到身份信息,请联系管理人员录入卡号信息");
+        }
+        logger.info("转换前cardNum:"+cardNum);
+        cardNum= HexStrUtils.decode(cardNum);
+        logger.info("转换后cardNum:"+cardNum);
+        ResultData resultData=remoteDutyService.securityNumList(labId,cardNum);
+        if(resultData==null && resultData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("未识别到身份信息,请联系管理人员录入卡号信息");
+        }
+        Object resultObj=resultData.getData();
+        if(null==resultObj){
+            return ResultData.fail("未识别到身份信息,请联系管理人员录入卡号信息");
+        }
+        return resultData;
+    }
+
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     * @param labId
+     * @return
+     */
+    @ApiOperation(value = "刷卡验证")
+    @GetMapping(value = "/cardValidate")
+    public ResultData cardValidate(@RequestParam("labId") Long labId,@RequestParam("cardNum") String cardNum) {
+        logger.info("转换前cardNum:"+cardNum);
+        if(StringUtils.isNull(cardNum) || StringUtils.isEmpty(cardNum)){
+            return ResultData.fail("未识别到身份信息,请联系管理人员录入卡号信息");
+        }
+        cardNum= HexStrUtils.decode(cardNum);
+        logger.info("转换后cardNum:"+cardNum);
+        ResultData resultData=remoteDutyService.securityNumList(labId,cardNum);
+        if(resultData==null && resultData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("未识别到身份信息,请联系管理人员录入卡号信息");
+        }
+        Object resultObj=resultData.getData();
+        if(null==resultObj){
+            return ResultData.fail("未识别到身份信息,请联系管理人员录入卡号信息");
+        }
+        return resultData;
+    }
+
+
+    /**
+     * 电子信息牌指纹录入
+     * @param xxpUserAuthVo
+     * @return
+     */
+    @ApiOperation(value = "指纹录入")
+    @PostMapping(value = "/addUserFinger")
+    public ResultData addUserFinger(@RequestBody XxpUserAuthVo xxpUserAuthVo) {
+        ResultData resultData=remoteDutyService.addUserAuth(xxpUserAuthVo);
+        return resultData;
+    }
+
+
+    /**
+     * 根据用户查询指纹列表
+     * @param userId
+     * @return
+     */
+    @ApiOperation(value = "根据用户查询指纹列表")
+    @GetMapping(value = "/getFingerByUserId")
+    public ResultData getFingerByUserId(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId){
+        ResultData resultData=remoteDutyService.getFingerByUserId(labId,userId);
+        return resultData;
+    }
+
+
+    /**
+     * 根据id删除指纹
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除指纹")
+    @GetMapping(value = "/deleteFingerById")
+    public ResultData deleteFingerById(@RequestParam Long id){
+        ResultData resultData=remoteDutyService.deleteFingerById(id);
+        if(null==resultData || resultData.getCode()!=HttpStatus.SUCCESS){
+             return ResultData.fail("删除指纹失败");
+        }
+        return ResultData.success();
+    }
+
+    /**
+     * 密码验证
+     * @param num
+     * @param pwd
+     * @param labId
+     * @param userId
+     * @return
+     */
+    @ApiOperation(value = "密码验证")
+    @GetMapping(value = "/pwdValidate")
+    public ResultData pwdValidate(@RequestParam("num") String num,@RequestParam("pwd") String pwd,@RequestParam("labId") Long labId,@RequestParam("userId") Long userId){
+        return remoteDutyService.pwdValidate(num,pwd,labId,userId);
+    }
+
+    /**
+     * 大海里找鱼
+     * @param faceCompare
+     * @return
+     */
+    @ApiOperation(value = "人脸识别")
+    @PostMapping(value = "/multiFaceDetection")
+    public ResultData multiFaceDetection(@RequestBody FaceCompare faceCompare){
+        return remoteFaceService.multiFaceDetection(faceCompare);
+    }
+
+
+    /**
+     * 人脸识别获取特征值
+     * @param file
+     * @return
+     */
+    @ApiOperation(value = "人脸识别获取特征值")
+    @PostMapping(value = "/faceFeature")
+    public R<byte[]> faceFeature(@RequestParam("file") MultipartFile file){
+        return remoteFaceService.upload(file);
+    }
+
+
+    /**
+     * 人脸识别获取特征值
+     * @param xxpInspectionVo
+     * @return
+     */
+    @ApiOperation(value = "巡查签到")
+    @PostMapping(value = "/XxpInspection/addInspection/signIn")
+    public ResultData addInspection(@RequestBody XxpInspectionVo xxpInspectionVo){
+        ResultData resultData= remoteDutyService.addInspection(xxpInspectionVo);
+        return resultData;
+    }
+
+
+    /**
+     * 人脸识别获取特征值
+     * @param labId
+     * @return
+     */
+    @ApiOperation(value = "巡查签退")
+    @PostMapping(value = "/XxpInspection/addInspection/signOut")
+    public ResultData updateInspection(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId){
+        return remoteDutyService.updateInspection(labId,userId);
+    }
+
+    @ApiOperation(value = "判断是巡查签到还是准入签到 1巡查 2准入")
+    @PostMapping(value = "/XxpInspection/isSignInType")
+    public ResultData isSignInType(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId) {
+        return remoteDutyService.isSignInType(labId,userId);
+    }
+
+}

+ 26 - 0
zd-modules/zd-base/src/main/java/com/zd/base/app/domain/board/DutyPersonVo.java

@@ -0,0 +1,26 @@
+package com.zd.base.app.domain.board;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Controller
+ *
+ * @author cyl
+ * @date 2023/3/30
+ */
+@ApiModel("返回一周的人员信息")
+@Data
+public class DutyPersonVo {
+    List <Map <String, Object>> weekday1 = new ArrayList <>();
+    List <Map <String, Object>> weekday2 = new ArrayList <>();
+    List <Map <String, Object>> weekday3 = new ArrayList <>();
+    List <Map <String, Object>> weekday4 = new ArrayList <>();
+    List <Map <String, Object>> weekday5 = new ArrayList <>();
+    List <Map <String, Object>> weekday6 = new ArrayList <>();
+    List <Map <String, Object>> weekday7 = new ArrayList <>();
+}

+ 191 - 0
zd-modules/zd-base/src/main/java/com/zd/base/app/domain/board/LabXxpSubjectVo.java

@@ -0,0 +1,191 @@
+package com.zd.base.app.domain.board;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: donggaosheng
+ * @Date: 2023/03/27
+ * @Description:
+ */
+@ApiModel("信息牌首页展示")
+public class LabXxpSubjectVo {
+    @ApiModelProperty("负责人名称")
+    private String adminName;
+
+    @ApiModelProperty("负责人手机号")
+    private String adminPhone;
+
+    @ApiModelProperty("安全分级名称")
+    private String levelName;
+
+    @ApiModelProperty("安全分级颜色编码")
+    private String filedColor;
+
+    @ApiModelProperty("安全分类名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "二维码地址")
+    private String qrCodeUrl;
+
+    @ApiModelProperty(value = "二维码地址")
+    private String deptName;
+
+    @ApiModelProperty(value = "楼栋+房间号")
+    private String subjectName;
+
+    @ApiModelProperty("进入检查项")
+    private List<Map<String,String>> inCheck;
+
+    @ApiModelProperty("巡查进入检查项")
+    private List<Map<String,String>> inspectInCheck;
+
+    @ApiModelProperty("离开检查项")
+    private List<String> outCheck;
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    @ApiModel("安全责任人列表")
+    public class SafeUserVo {
+        @ApiModelProperty("安全负责人id")
+        private Integer id;
+        @ApiModelProperty("安全负责人名称")
+        private String safeUserName;
+        @ApiModelProperty("安全负责人电话")
+        private String safeUserPhone;
+
+        public Integer getId() {
+            return id;
+        }
+
+        public void setId(Integer id) {
+            this.id = id;
+        }
+
+        public String getSafeUserName() {
+            return safeUserName;
+        }
+
+        public void setSafeUserName(String safeUserName) {
+            this.safeUserName = safeUserName;
+        }
+
+        public String getSafeUserPhone() {
+            return safeUserPhone;
+        }
+
+        public void setSafeUserPhone(String safeUserPhone) {
+            this.safeUserPhone = safeUserPhone;
+        }
+    }
+
+    @ApiModelProperty(value = "二维码地址")
+    private List<SafeUserVo> safeUserVoList;
+    @ApiModelProperty(value = "信息牌类目")
+    private List<LabXxpSubjectVo> xxpSubjectVoList;
+
+    public List<SafeUserVo> getSafeUserVoList() {
+        return safeUserVoList;
+    }
+
+    public void setSafeUserVoList(List<SafeUserVo> safeUserVoList) {
+        this.safeUserVoList = safeUserVoList;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getAdminPhone() {
+        return adminPhone;
+    }
+
+    public void setAdminPhone(String adminPhone) {
+        this.adminPhone = adminPhone;
+    }
+
+    public String getLevelName() {
+        return levelName;
+    }
+
+    public void setLevelName(String levelName) {
+        this.levelName = levelName;
+    }
+
+    public String getFiledColor() {
+        return filedColor;
+    }
+
+    public void setFiledColor(String filedColor) {
+        this.filedColor = filedColor;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String getQrCodeUrl() {
+        return qrCodeUrl;
+    }
+
+    public void setQrCodeUrl(String qrCodeUrl) {
+        this.qrCodeUrl = qrCodeUrl;
+    }
+
+    public List<LabXxpSubjectVo> getXxpSubjectVoList() {
+        return xxpSubjectVoList;
+    }
+
+    public void setXxpSubjectVoList(List<LabXxpSubjectVo> xxpSubjectVoList) {
+        this.xxpSubjectVoList = xxpSubjectVoList;
+    }
+
+    public List<Map<String, String>> getInCheck() {
+        return inCheck;
+    }
+
+    public void setInCheck(List<Map<String, String>> inCheck) {
+        this.inCheck = inCheck;
+    }
+
+    public List<Map<String, String>> getInspectInCheck() {
+        return inspectInCheck;
+    }
+
+    public void setInspectInCheck(List<Map<String, String>> inspectInCheck) {
+        this.inspectInCheck = inspectInCheck;
+    }
+
+    public List<String> getOutCheck() {
+        return outCheck;
+    }
+
+    public void setOutCheck(List<String> outCheck) {
+        this.outCheck = outCheck;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+}

+ 2 - 0
zd-modules/zd-bottle-parent/pom.xml

@@ -21,11 +21,13 @@
         <dependency>
             <groupId>com.zd.core</groupId>
             <artifactId>common-core</artifactId>
+            <version>3.1.0</version>
         </dependency>
 
         <dependency>
             <groupId>com.zd.swagger</groupId>
             <artifactId>common-swagger</artifactId>
+            <version>3.1.0</version>
         </dependency>
     </dependencies>
 </project>

+ 16 - 0
zd-modules/zd-bottle-parent/zd-bottle/pom.xml

@@ -17,6 +17,16 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>javassist</artifactId>
+                    <groupId>org.javassist</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- SpringCloud Alibaba Nacos Config -->
@@ -82,6 +92,12 @@
         <dependency>
             <groupId>com.zd.algorithm</groupId>
             <artifactId>zd-algorithm-api</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>jsqlparser</artifactId>
+                    <groupId>com.github.jsqlparser</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>

+ 28 - 0
zd-modules/zd-chemical/pom.xml

@@ -17,6 +17,16 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>commons-codec</artifactId>
+                    <groupId>commons-codec</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- SpringCloud Alibaba Nacos Config -->
@@ -35,16 +45,34 @@
         <dependency>
             <groupId>com.zd.swagger</groupId>
             <artifactId>common-swagger</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>javassist</artifactId>
+                    <groupId>org.javassist</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
             <groupId>com.zd.core</groupId>
             <artifactId>common-core</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>commons-codec</artifactId>
+                    <groupId>commons-codec</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
             <groupId>com.zd.algorithm</groupId>
             <artifactId>zd-algorithm-api</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>commons-io</artifactId>
+                    <groupId>commons-io</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>

+ 10 - 0
zd-modules/zd-exam/pom.xml

@@ -17,6 +17,16 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>javassist</artifactId>
+                    <groupId>org.javassist</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- SpringCloud Alibaba Nacos Config -->

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

@@ -17,6 +17,12 @@
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>javassist</artifactId>
+                    <groupId>org.javassist</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- SpringCloud Alibaba Nacos Config -->
@@ -34,12 +40,24 @@
         <dependency>
             <groupId>com.zd.core</groupId>
             <artifactId>common-core</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>mybatis-spring</artifactId>
+                    <groupId>org.mybatis</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- zd Common Swagger -->
         <dependency>
             <groupId>com.zd.swagger</groupId>
             <artifactId>common-swagger</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!--mqtt客户端链接服务-->
@@ -60,6 +78,12 @@
             <groupId>com.deepoove</groupId>
             <artifactId>poi-tl</artifactId>
             <version>1.10.2</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>xml-apis</artifactId>
+                    <groupId>xml-apis</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <!--jsonp解析html-->
         <dependency>
@@ -97,6 +121,22 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>mybatis</artifactId>
+                    <groupId>org.mybatis</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>jsqlparser</artifactId>
+                    <groupId>com.github.jsqlparser</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
         </dependency>
         <dependency>
             <groupId>io.netty</groupId>

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

@@ -15,12 +15,14 @@ import com.zd.common.core.web.controller.BaseController;
 import com.zd.laboratory.api.entity.FunctionStatus;
 import com.zd.laboratory.api.vo.HardwareCVO;
 import com.zd.laboratory.domain.LabHardware;
+import com.zd.laboratory.domain.XxpCardInfo;
 import com.zd.laboratory.domain.vo.HxpSmartTerminalByExcel;
 import com.zd.laboratory.domain.vo.LabHardwareVO;
 import com.zd.laboratory.domain.vo.LabSensorVO;
 import com.zd.laboratory.service.ILabHardwareService;
 import com.zd.laboratory.service.ILabSensorService;
 import com.zd.laboratory.service.ILabSubjectService;
+import com.zd.laboratory.service.IXxpCardInfoService;
 import com.zd.laboratory.service.impl.LabSubjectManagerService;
 import com.zd.laboratory.socket.command.Symbol;
 import com.zd.model.constant.HttpStatus;
@@ -75,6 +77,8 @@ public class LabHardwareController extends BaseController {
     RedisService redisService;
     @Resource
     private RemoteRfidService rfidService;
+    @Autowired
+    private IXxpCardInfoService xxpCardInfoService;
 
     /**
      * 查询硬件统计
@@ -274,15 +278,25 @@ public class LabHardwareController extends BaseController {
         ytjVo.setIds(ids);
         List<LabHardware> listkzsb=labHardwareService.selectNewLabHardwareByTypes(ytjVo);
 
+        ytjVo.setType(HardwareTypeEnum.HK_DOOR);
+        ytjVo.setIds(null);
+        List<LabHardwareVO> listHK = labHardwareService.selectLabHardwareList(ytjVo);
+
         //实验室详情
         //LabSubject labSubject =labSubjectService.selectLabSubjectById(subjectId);
 
+        XxpCardInfo xxpCardInfo = new XxpCardInfo();
+        xxpCardInfo.setSubjectId(subjectId);
+        List<XxpCardInfo>  listXxp =xxpCardInfoService.selectXxpCardInfoList(xxpCardInfo);
+
         map.put("listYtj",listYtj);//一体机
         //map.put("listDykg",listDykg);//控制设备-电源开关
         //map.put("listZntf",listZntf);//控制设备-智能通风
         map.put("listSpjk",listSpjk); //摄像头
         map.put("listCgq",listCgq); //传感器
         map.put("listkzsb",listkzsb); //控制设备
+        map.put("listHK",listHK);
+        map.put("listXxp",listXxp);//电子信息牌
         //map.put("labSubject",labSubject); //实验室详情
         return AjaxResult.success(map);
 
@@ -482,4 +496,14 @@ public class LabHardwareController extends BaseController {
         List<LabHardwareVO> list = labHardwareService.selectLabHardwareList(labHardware);
         return getDataTable(list);
     }
+
+
+    /**
+     * 查询硬件列表
+     */
+    @RequestMapping("/getCameraBySubjectId")
+    public ResultData getCameraBySubjectId(Long subId) {
+        String hardwardStr = labHardwareService.selectLabHardwareCameraBySubId(subId);
+        return ResultData.success(hardwardStr);
+    }
 }

+ 3 - 3
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabRiskPlanController.java

@@ -151,7 +151,7 @@ public class LabRiskPlanController extends BaseController {
     @PreAuthorize(hasPermi = PerPrefix.LABORATORY_PLAN + PerFun.LIST)
     @PostMapping("/lists")
     public TableDataInfo lists(@RequestBody RiskPlanVo riskPlanVo) {
-        startPage();
+        startPage(riskPlanVo.getPageNum(),riskPlanVo.getPageSize());
         List<LabRiskPlanDTO> list = labRiskPlanService.queryRiskPlanList(riskPlanVo);
         return getDataTable(list);
     }
@@ -170,7 +170,7 @@ public class LabRiskPlanController extends BaseController {
      */
     @PostMapping(value = "/getLabRiskPlanJoinSub")
     public TableDataInfo getLabRiskPlanJoinSub(@RequestBody LabRiskPlanSubVo labRiskPlanSubVo) {
-        startPage();
+        startPage(labRiskPlanSubVo.getPageNum(),labRiskPlanSubVo.getPageSize());
         List<LabSubjectVO> labRiskPlanJoinSubInfo = labRiskPlanService.getLabRiskPlanJoinSubInfo(labRiskPlanSubVo);
         return getDataTable(labRiskPlanJoinSubInfo);
     }
@@ -180,7 +180,7 @@ public class LabRiskPlanController extends BaseController {
      */
     @PostMapping(value = "/getLabRiskPlanNoJoinSub")
     public TableDataInfo getLabRiskPlanNoJoinSub(@RequestBody LabRiskPlanSubVo labRiskPlanSubVo) {
-        startPage();
+        startPage(labRiskPlanSubVo.getPageNum(),labRiskPlanSubVo.getPageSize());
         List<LabSubjectVO> labRiskPlanJoinSubInfo = labRiskPlanService.getLabRiskPlanNoJoinSub(labRiskPlanSubVo);
         return getDataTable(labRiskPlanJoinSubInfo);
     }

+ 141 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSecurityApplyController.java

@@ -5,6 +5,7 @@ import java.util.*;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
 
+import com.github.pagehelper.PageHelper;
 import com.zd.common.core.utils.*;
 import com.zd.laboratory.domain.LabWhitelist;
 import com.zd.laboratory.service.*;
@@ -31,6 +32,8 @@ import com.zd.system.api.feign.RemoteUserService;
 import com.zd.model.entity.SysUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -52,6 +55,8 @@ import java.net.URL;
 @RequestMapping("/apply")
 public class LabSecurityApplyController extends BaseController
 {
+    private final Logger logger = LoggerFactory.getLogger(LabSecurityApplyController.class);
+
     @Autowired
     private ILabSecurityApplyService labSecurityApplyService;
 
@@ -79,6 +84,22 @@ public class LabSecurityApplyController extends BaseController
     @Autowired
     private ILabWhitelistService labWhitelistService;
 
+    @Autowired
+    private IXxpDutyService xxpDutyService;
+
+
+    /**
+     * @param labSecurityApplyVO
+     * @return
+     */
+    @RequestMapping("/test")
+    public TableDataInfo<LabSecurityApplyVO> test(LabSecurityApplyVO labSecurityApplyVO)
+    {
+        startPage();
+        List<LabSecurityApplyVO> list = labSecurityApplyService.selectLabSecurityApplyList(labSecurityApplyVO);
+        return getDataTable(list);
+    }
+
     /**
      * 查询安全准入申请列表
      */
@@ -787,4 +808,124 @@ public class LabSecurityApplyController extends BaseController
         }
 
     }
+
+    /*****************************************************************************************/
+    /**
+     * 查询安全准入申请列表
+     */
+    @RequestMapping("/app/securityApplyList")
+    @ApiOperation(value = "查询安全准入申请列表")
+    public ResultData appList(Long subjectId,Integer pageNumber,Integer pageSize)
+    {
+        startPage(pageNumber,pageSize);
+        List<Map<String,Object>> list = labSecurityApplyService.selectLabSecurityApply(subjectId);
+        for(Map<String,Object> map:list){
+            if(StringUtils.isNotNull(map.get("avatar"))){
+                String avatar=fileConfigUtils.getFileDomainApp() + map.get("avatar");
+                map.put("avatar",avatar);
+            }
+        }
+        return ResultData.success(list);
+    }
+
+    /***
+     * 未过期的安全准入-值班使用
+     * @param userId
+     * @return
+     */
+    @RequestMapping("/getApplySubList")
+    @ApiOperation(value = "查询安全准入未过期列表")
+    public ResultData getUserApplySubList(Long userId)
+    {
+        LabSecurityApply securityApply = new LabSecurityApply();
+        securityApply.setUserId(userId);
+        List<LabSecurityApply> list = labSecurityApplyService.selectValidApply(securityApply);
+        return ResultData.success(list);
+    }
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     * @param labId
+     * @return
+     */
+    @RequestMapping("/app/securityFingerList")
+    public ResultData securityFingerList(Long labId) {
+        List<Map<String, Object>> list = labSecurityApplyService.selectSecurityFingerList(labId);
+        for (Map<String, Object> map : list) {
+            map.put("isDutyUser", 0);
+            Long userId = Long.parseLong(map.get("userId") + "");
+            String userType = String.valueOf(map.get("userType"));
+            String isWhite = String.valueOf(map.get("isWhite"));
+            //如果是学生 或者白名单的老师 进二类页面
+            if (userType.equals("22") || (userType.equals("11") && isWhite.equals("0"))) {
+                map.put("pageType", 2);
+            }
+            int number = iLabSubjectService.isAdminOrSafeUser(labId, userId);
+            //一类首页对应身份为白名单老师、实验室负责人、安全责任人
+            if (number > 0 || (userType.equals("11") && isWhite.equals("1"))) {
+                map.put("pageType", 1);
+            }
+            String dateTime = DateUtils.getDate();
+            List<Map<String, Object>> dutyList = xxpDutyService.selectDutyUser(labId, dateTime);
+            //判断是否当天值班
+            for (Map<String, Object> dutyMap : dutyList) {
+                String userObj = String.valueOf(dutyMap.get("userId"));
+                if (StringUtils.isNotEmpty(userObj) && StringUtils.isNotNull(userObj)) {
+                    if (Long.parseLong(userObj) == userId) {
+                        map.put("isDutyUser", 1);
+                        break;
+                    }
+                }
+            }
+        }
+        return ResultData.success(list);
+    }
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     * @param labId
+     * @return
+     */
+    @RequestMapping("/app/securityNumList")
+    public ResultData securityNumList(Long labId,String cardNum)
+    {
+        cardNum=cardNum.replaceAll("\\s*|\r|\n|\t","");
+        List<Map<String,Object>> list = labSecurityApplyService.selectSecurityCardList(labId);
+        for(Map<String,Object> map:list){
+            map.put("isDutyUser",0);
+            if(StringUtils.isNotNull(map.get("cardNum"))){
+                String decryptCard=DESUtils.decrypt(String.valueOf(map.get("cardNum")));
+                logger.info("decryptCard卡号解密:"+decryptCard);
+                if(cardNum.equals(decryptCard)){
+                    String userType=String.valueOf(map.get("userType"));
+                    Long userId=Long.parseLong(String.valueOf(map.get("userId")));
+                    String isWhite=String.valueOf(map.get("isWhite"));
+                    //如果是学生 或者白名单的老师 进二类页面
+                    if(userType.equals("22") || (userType.equals("11") && isWhite.equals("0"))){
+                        map.put("pageType",2);
+                    }
+                    int num=iLabSubjectService.isAdminOrSafeUser(labId,userId);
+                    //一类首页对应身份为白名单老师、实验室负责人、安全责任人
+                    if(num>0 || (userType.equals("11") && isWhite.equals("1"))){
+                        map.put("pageType",1);
+                    }
+                    String dateTime = DateUtils.getDate();
+                    //判断是否当天值班
+                    List<Map<String,Object>> dutyList=xxpDutyService.selectDutyUser(labId,dateTime);
+                    for(Map<String,Object> dutyMap:dutyList){
+                        String userObj=String.valueOf(dutyMap.get("userId"));
+                        if(StringUtils.isNotEmpty(userObj) && StringUtils.isNotNull(userObj)){
+                            if(Long.parseLong(userObj)==userId){
+                                map.put("isDutyUser",1);
+                                break;
+                            }
+                        }
+                    }
+                    map.remove("cardNum");
+                    map.remove("isWhite");
+                    return ResultData.success(map);
+                }
+            }
+        }
+        return ResultData.success();
+    }
 }

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

@@ -4,6 +4,9 @@ import java.util.*;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
 
+import com.zd.common.core.utils.StringUtils;
+import com.zd.laboratory.domain.XxpCardInfo;
+import com.zd.laboratory.service.IXxpCardInfoService;
 import com.zd.model.domain.per.PerFun;
 import com.zd.model.domain.per.PerPrefix;
 import com.zd.model.domain.ResultData;
@@ -54,6 +57,9 @@ public class LabSecuritySubjectmaterialController extends BaseController
     private ILabSecurityMaterialDataService labSecurityMaterialDataService;
 
     @Autowired
+    private IXxpCardInfoService xxpCardInfoService;
+
+    @Autowired
     private TokenService tokenService;
 
     /**
@@ -147,17 +153,30 @@ public class LabSecuritySubjectmaterialController extends BaseController
      * @return
      */
     @GetMapping("/listData")
-    public ResultData  listData() {
+    public ResultData  listData(LabSecurityMaterialDataVO materialDataVO) {
         Map<String,Object> map = new HashMap<String,Object>();
          List<LabSecurityMaterialDataVO> listTeacher= labSecurityMaterialDataService.selectTemplateTeacherList();
          List<LabSecurityMaterialDataVO> listStudent= labSecurityMaterialDataService.selectTemplateStudentList();
 
+         //查询实验室下的电子信息牌
+        XxpCardInfo cardInfo = new XxpCardInfo();;
+        if(StringUtils.isNotNull(materialDataVO.getSubjectId())){
+            cardInfo.setSubjectId(materialDataVO.getSubjectId());
+            List<XxpCardInfo> cardInfoList = xxpCardInfoService.selectXxpCardInfoList(cardInfo);
+            if(cardInfoList.size()>0){
+                cardInfo = cardInfoList.get(0);
+            }
+        }
+
+
+
         /* //教职工模板
         List<LabSecuritySubjectmaterialVO> listTeacher=  labSecuritySubjectmaterialService.selectTeacherList();
         //学生模板
         List<LabSecuritySubjectmaterialVO> listStudent=  labSecuritySubjectmaterialService.selectStudentList();*/
         map.put("listTeacher",listTeacher);
         map.put("listStudent",listStudent);
+        map.put("cardInfo",cardInfo);
         return ResultData.success(map);
     }
 

+ 16 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabStudentsInfoController.java

@@ -7,6 +7,8 @@ import com.zd.common.core.annotation.PreAuthorize;
 import com.zd.common.core.utils.SecurityUtils;
 import com.zd.common.core.utils.StringUtils;
 import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.api.entity.LabSysUserInfo;
+import com.zd.laboratory.api.feign.RemoteMessageContentService;
 import com.zd.laboratory.domain.dto.LabStudentsInfoAuditDTO;
 import com.zd.laboratory.domain.vo.LabStudentsInfoVO;
 import com.zd.laboratory.service.ILabStudentsInfoService;
@@ -14,6 +16,7 @@ import com.zd.model.domain.R;
 import com.zd.model.domain.ResultData;
 import com.zd.model.domain.per.PerFun;
 import com.zd.model.domain.per.PerPrefix;
+import com.zd.model.entity.SysFile;
 import com.zd.model.enums.AuditStatusEnum;
 import com.zd.model.page.TableDataInfo;
 import com.zd.system.api.entity.LabStudentsInfo;
@@ -46,6 +49,8 @@ public class LabStudentsInfoController extends BaseController {
 
     @Autowired
     private RemoteFaceService remoteFaceService;
+    @Autowired
+    private RemoteMessageContentService remoteMessageContentService;
 
     /**
      * 查询学生信息列表
@@ -204,4 +209,15 @@ public class LabStudentsInfoController extends BaseController {
         return ResultData.success(labStudentsInfoService.selectLabStudentsInfoByJoinStudentsId(SecurityUtils.getUserId()));
     }
 
+
+    /**
+     * 获取学生登录用户信息
+     */
+    @ApiOperation(value = "获取安全实验室安全人员的人脸信息")
+    @RequestMapping(value = "/getFaceBySecuritySubjectId")
+    public ResultData<List<LabSysUserInfo>> getFaceBySecuritySubjectId(Long subjectId) {
+        List<LabSysUserInfo> labSysUserInfoList= labStudentsInfoService.selectLabStudentsInfoBySubjectId(subjectId);
+        return ResultData.success(labSysUserInfoList);
+    }
+
 }

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

@@ -4,6 +4,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import com.zd.common.core.security.TokenService;
 import com.zd.common.core.web.controller.BaseController;
 import com.zd.common.swagger.config.Knife4jConfiguration;
+import com.zd.laboratory.api.vo.ClassifyVO;
 import com.zd.laboratory.domain.AdminWranCount;
 import com.zd.laboratory.domain.LabSubject;
 import com.zd.laboratory.domain.SubDiyVO;
@@ -11,6 +12,7 @@ import com.zd.laboratory.domain.dto.LabSubListQuery;
 import com.zd.laboratory.domain.vo.LabRiskPlanAbnormalLogVO;
 import com.zd.laboratory.service.ILabRiskPlanAbnormalLogService;
 import com.zd.laboratory.service.ILabSubjectService;
+import com.zd.laboratory.service.impl.LabSubjectManagerService;
 import com.zd.laboratory.service.impl.SubQueryManager;
 import com.zd.model.domain.ResultData;
 import com.zd.model.entity.SubQueryConfig;
@@ -44,6 +46,9 @@ public class LabSubMangerV2Controller extends BaseController {
     @Autowired
     private ILabRiskPlanAbnormalLogService labRiskPlanAbnormalLogService;
 
+    @Autowired
+    LabSubjectManagerService subjectManagerService;
+
     /**
      * 查询实验室控制数据列表- 数据权限(包括负责人) 小程序我的实验室
      */
@@ -80,6 +85,12 @@ public class LabSubMangerV2Controller extends BaseController {
     @PostMapping("/diy/{id}/common")
     public ResultData<List<SubDiyVO>> querySubCListVO(@PathVariable("id") Long id, @RequestBody SubQueryConfig subQueryConfig) {
         List<SubDiyVO> subDiyVOList = subQueryManager.querySubs(subQueryConfig, id);
+        if(subDiyVOList.size()>0){
+            //安全类目信息查询
+            subDiyVOList.get(0).setClassifyList(subjectManagerService.getSubClassify(id));
+            //实验室二维码
+            subDiyVOList.get(0).getSafeInfo().setQrCodeUrl(subDiyVOList.get(0).getRoom()==null?"":id + "-" + subDiyVOList.get(0).getRoom());
+        }
         return ResultData.success(subDiyVOList);
     }
 

+ 16 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectAccessRecordController.java

@@ -5,6 +5,8 @@ import java.io.IOException;
 import java.util.Map;
 import javax.servlet.http.HttpServletResponse;
 
+import com.zd.common.core.utils.FileConfigUtils;
+import com.zd.common.core.utils.StringUtils;
 import com.zd.model.domain.ResultData;
 import com.zd.model.domain.per.PerFun;
 import com.zd.model.domain.per.PerPrefix;
@@ -34,6 +36,8 @@ import com.zd.model.page.TableDataInfo;
 public class LabSubjectAccessRecordController extends BaseController {
     @Autowired
     private ILabSubjectAccessRecordService labSubjectAccessRecordService;
+    @Autowired
+    private FileConfigUtils fileConfigUtils;
 
     /**
      * 查询实验室进出记录列表
@@ -150,4 +154,16 @@ public class LabSubjectAccessRecordController extends BaseController {
         return ResultData.result(labSubjectAccessRecordService.leaveAgainSign(labSubjectAccessRecord));
     }
 
+    /*************************************************/
+    @RequestMapping("/selectSubjectSignList")
+    public ResultData selectSubjectSignList(Long subjectId) {
+        List<Map<String,Object>> mapSignList=labSubjectAccessRecordService.selectSubjectSignList(subjectId);
+        for(Map<String,Object> map:mapSignList){
+            if(StringUtils.isNotNull(map.get("avatar"))){
+               String avatar=fileConfigUtils.getFileDomainApp() + map.get("avatar");
+               map.put("avatar",avatar);
+            }
+        }
+        return ResultData.success(mapSignList);
+    }
 }

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

@@ -402,6 +402,11 @@ public class LabSubjectController extends BaseController {
         return ResultData.success(labSubjectService.multipleDetpBysubList(ids));
     }
 
+    @GetMapping("/cardInfo/subList")
+    public ResultData cardinfoSubList(LabSubject labSubject) {
+        return ResultData.success(labSubjectService.cardinfoSubList(labSubject));
+    }
+
     /**
      * 获取实验室气瓶数量详细信息
      */
@@ -432,4 +437,36 @@ public class LabSubjectController extends BaseController {
     public ResultData getFiedCount(LabSubjectVO labSubject) {
         return ResultData.success(labSubjectService.getFiedCount(labSubject));
     }
+
+    /**
+     * 获取信息牌首页实验室的信息
+     */
+    @RequestMapping(value = "/getXxpSubjectInfo/{id}")
+    public ResultData getXxpSubjectInfo(@PathVariable("id") Long id) {
+        return ResultData.success(labSubjectService.selectLabSubjectInfoId(id));
+    }
+
+    /**
+     * 获取信息牌首页实验室的信息
+     */
+    @RequestMapping(value = "/getSubjectDetails/{id}")
+    public ResultData getSubjectDetails(@PathVariable("id") Long id) {
+        return ResultData.success(labSubjectService.getSubjectDetailsById(id));
+    }
+
+    /**
+     * 获取信息牌首页实验室的信息
+     */
+    @RequestMapping(value = "/getSubjectName/{id}")
+    public ResultData getSubjectName(@PathVariable("id") Long id) {
+        return ResultData.success(labSubjectService.getSubjectNameById(id));
+    }
+
+    /**
+     * 获取信息牌首页实验室的信息
+     */
+    @RequestMapping(value = "/isAdminOrSafeUser/{labId}/{userId}")
+    public ResultData getSubjectName(@PathVariable("labId") Long labId,@PathVariable("userId") Long userId) {
+        return ResultData.success(labSubjectService.isAdminOrSafeUser(labId,userId));
+    }
 }

+ 14 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabWhitelistController.java

@@ -99,6 +99,20 @@ public class LabWhitelistController extends BaseController
     }
 
     /**
+     * 获取白名单信息-值班使用
+     * @param userId
+     * @return
+     */
+    @ApiOperation(value = "获取白名单详细信息-值班使用")
+    @GetMapping(value = "/subWhiteList")
+    public ResultData<List<LabWhitelistVO>> getWhiteSubList(Long userId)
+    {
+        LabWhitelistVO vo = new LabWhitelistVO();
+        vo.setUserId(userId);
+        return ResultData.success(labWhitelistService.selectWhiteSublist(vo));
+    }
+
+    /**
      * 新增白名单
      */
     @ApiOperation(value = "新增白名单")

+ 297 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpCardInfoController.java

@@ -0,0 +1,297 @@
+package com.zd.laboratory.controller;
+
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.annotation.PreAuthorize;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.redis.RedisService;
+import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.DateUtils;
+import com.zd.common.core.utils.ExcelUtil;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.domain.XxpCardInfo;
+import com.zd.laboratory.service.ILabSecurityApplyService;
+import com.zd.laboratory.service.ILabSubjectService;
+import com.zd.laboratory.service.IXxpCardInfoService;
+import com.zd.laboratory.service.IXxpDutyService;
+import com.zd.model.constant.CacheConstants;
+import com.zd.model.domain.ResultData;
+import com.zd.model.domain.per.PerFun;
+import com.zd.model.domain.per.PerPrefix;
+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 javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 电子信息牌Controller
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@RestController
+@Api(tags = "【电子信息牌】")
+@RequestMapping("/XxpCardInfo")
+public class LabXxpCardInfoController extends BaseController {
+    @Autowired
+    private IXxpCardInfoService xxpCardInfoService;
+    @Autowired
+    private ILabSecurityApplyService iLabSecurityApplyService;
+    @Autowired
+    private ILabSubjectService iLabSubjectService;
+    @Autowired
+    private IXxpDutyService iXxpDutyService;
+
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private RedisService redisService;
+
+    /**
+     * 查询电子信息牌列表
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.LIST)
+    @GetMapping("/list")
+    @ApiOperation(value = "查询电子信息牌列表")
+    public TableDataInfo<XxpCardInfo> list(XxpCardInfo xxpCardInfo) {
+        startPage("create_time", "descending");
+        List<XxpCardInfo> list = xxpCardInfoService.selectXxpCardInfoList(xxpCardInfo);
+        for (XxpCardInfo cardInfo:list){
+            //设备是否在线
+            if(StringUtils.isNotNull(redisService.getCacheObject(CacheConstants.HEARTBEAT+cardInfo.getCardNum()))){
+                cardInfo.setOperate(2);
+            }
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询电子信息牌列表-无权限
+     */
+    @GetMapping("/getlist")
+    @ApiOperation(value = "查询电子信息牌列表-无权限")
+    public TableDataInfo<XxpCardInfo> getlist(XxpCardInfo xxpCardInfo) {
+        startPage();
+        List<XxpCardInfo> list = xxpCardInfoService.selectXxpCardInfoList(xxpCardInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出电子信息牌列表
+     */
+    @ApiOperation(value = "导出电子信息牌列表")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.EXPORT)
+    @Log(title = "电子信息牌", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, XxpCardInfo xxpCardInfo) throws IOException {
+        List<XxpCardInfo> list = xxpCardInfoService.selectXxpCardInfoList(xxpCardInfo);
+        ExcelUtil<XxpCardInfo> util = new ExcelUtil<XxpCardInfo>(XxpCardInfo.class);
+        util.exportExcel(response, list, "电子信息牌数据");
+    }
+
+    /**
+     * 获取电子信息牌详细
+     */
+    @ApiOperation(value = "获取电子信息牌详细")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.QUERY)
+    @GetMapping(value = "/{id}")
+    public ResultData<XxpCardInfo> getInfo(@PathVariable("id") Long id) {
+        return ResultData.success(xxpCardInfoService.selectXxpCardInfoById(id));
+    }
+
+
+    /**
+     * 新增电子信息牌
+     */
+    @ApiOperation(value = "新增电子信息牌")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.ADD)
+    @Log(title = "电子信息牌", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody XxpCardInfo xxpCardInfo) {
+        return ResultData.result(xxpCardInfoService.insertXxpCardInfo(xxpCardInfo));
+    }
+
+    /**
+     * 新增电子信息牌-无权限
+     */
+    @ApiOperation(value = "新增电子信息牌-无权限")
+    @Log(title = "电子信息牌", businessType = BusinessType.INSERT)
+    @PostMapping("/addInfo")
+    public ResultData addInfo(@RequestBody XxpCardInfo xxpCardInfo) {
+        return ResultData.result(xxpCardInfoService.insertXxpCardInfo(xxpCardInfo));
+    }
+
+    /**
+     * 修改电子信息牌
+     */
+    @ApiOperation(value = "修改电子信息牌")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.EDIT)
+    @Log(title = "电子信息牌", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody XxpCardInfo xxpCardInfo) {
+        return ResultData.result(xxpCardInfoService.updateXxpCardInfo(xxpCardInfo));
+    }
+
+    /**
+     * 修改电子信息牌-无权限
+     */
+    @ApiOperation(value = "修改电子信息牌-无权限")
+    @Log(title = "电子信息牌", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public ResultData editCard(@RequestBody XxpCardInfo xxpCardInfo) {
+        return ResultData.result(xxpCardInfoService.updateXxpCardInfo(xxpCardInfo));
+    }
+
+    /**
+     * 删除电子信息牌
+     */
+    @ApiOperation(value = "删除电子信息牌")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.REMOVE)
+    @Log(title = "电子信息牌", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids) {
+        return ResultData.result(xxpCardInfoService.deleteXxpCardInfoByIds(ids));
+    }
+
+    /**
+     * 根据id删除
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除电子信息牌")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CARDINFO + PerFun.REMOVE)
+    @Log(title = "电子信息牌", businessType = BusinessType.DELETE)
+    @PostMapping("/{id}")
+    public ResultData remove(@PathVariable Long id) {
+        return ResultData.result(xxpCardInfoService.deleteXxpCardInfoById(id));
+    }
+
+    /**
+     * 根据id删除-无权限
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除-无权限")
+    @Log(title = "电子信息牌", businessType = BusinessType.DELETE)
+    @PostMapping("/del/{id}")
+    public ResultData del(@PathVariable Long id) {
+        return ResultData.result(xxpCardInfoService.deleteXxpCardInfoById(id));
+    }
+
+
+    /**
+     * 根据卡号获取电子信息牌信息
+     *
+     * @param cardNum
+     * @return
+     */
+    @RequestMapping("/XxpCardInfoByCard/{num}")
+    public ResultData XxpCardInfoByCard(@PathVariable("num") String cardNum) {
+        List<Map<String, Object>> list = xxpCardInfoService.selectXxpCardInfoByCard(cardNum);
+        if (list.size() > 0) {
+            return ResultData.success(list.get(0));
+        }
+        return ResultData.success();
+    }
+
+
+    /**
+     * 验证密码是否正确
+     *
+     * @param num 电子班牌号码
+     * @param pwd 用户密码
+     * @param labId 实验室id
+     * @param userId 用户id
+     * @return
+     */
+    @RequestMapping("/pwdValidate")
+    public ResultData pwdValidate(String num, String pwd,Long labId, Long userId) {
+        Integer isDutyUser=0;
+        Map<String,Object> map=iLabSecurityApplyService.selectCountLabSecurityUserId(labId,userId);
+        if(null==map){
+            return ResultData.fail("未获得实验室准入资格;");
+        }
+        int count = xxpCardInfoService.selectPwdCountByPwd(num, pwd);
+        if (count == 0) {
+            return ResultData.fail("密码输入错误,请重新输入;");
+        }
+        String userType=String.valueOf(map.get("userType"));
+        String isWhite=String.valueOf(map.get("isWhite"));
+        //如果是学生 或者白名单的老师 进二类页面
+        if(userType.equals("22") || (userType.equals("11") && isWhite.equals("0"))){
+            map.put("pageType",2);
+        }
+        int number=iLabSubjectService.isAdminOrSafeUser(labId,userId);
+        //一类首页对应身份为白名单老师、实验室负责人、安全责任人
+        if(number>0 || (userType.equals("11") && isWhite.equals("1"))){
+            map.put("pageType",1);
+        }
+        map.remove("isWhite");
+        String dateTime = DateUtils.getDate();
+        List<Map<String,Object>> list = iXxpDutyService.selectDutyUser(labId,dateTime);
+        //判断是否当天值班
+        for(Map<String,Object> dutyMap:list){
+            String userObj=String.valueOf(dutyMap.get("userId"));
+            if(StringUtils.isNotEmpty(userObj) && StringUtils.isNotNull(userObj)){
+                if(Long.parseLong(userObj)==userId){
+                    isDutyUser=1;
+                    break;
+                }
+            }
+        }
+        map.put("isDutyUser",isDutyUser);
+        return ResultData.success(map);
+    }
+
+
+
+    /**
+     * 验证用户签退走巡查签退还是准入签退
+     * @param labId 实验室id
+     * @param userId 用户id
+     * @return
+     */
+    @RequestMapping("/validateUser")
+    public ResultData validateUser(Long labId, Long userId) {
+        Integer isDutyUser=0;
+        Map<String,Object> map=iLabSecurityApplyService.selectCountLabSecurityUserId(labId,userId);
+        if(null==map){
+            return ResultData.fail("未获得实验室准入资格;");
+        }
+        String userType=String.valueOf(map.get("userType"));
+        String isWhite=String.valueOf(map.get("isWhite"));
+        //如果是学生 或者白名单的老师 进二类页面
+        if(userType.equals("22") || (userType.equals("11") && isWhite.equals("0"))){
+            map.put("pageType",2);
+        }
+        int number=iLabSubjectService.isAdminOrSafeUser(labId,userId);
+        //一类首页对应身份为白名单老师、实验室负责人、安全责任人
+        if(number>0 || (userType.equals("11") && isWhite.equals("1"))){
+            map.put("pageType",1);
+        }
+        map.remove("isWhite");
+        String dateTime = DateUtils.getDate();
+        List<Map<String,Object>> list = iXxpDutyService.selectDutyUser(labId,dateTime);
+        //判断是否当天值班
+        for(Map<String,Object> dutyMap:list){
+            String userObj=String.valueOf(dutyMap.get("userId"));
+            if(StringUtils.isNotEmpty(userObj) && StringUtils.isNotNull(userObj)){
+                if(Long.parseLong(userObj)==userId){
+                    isDutyUser=1;
+                    break;
+                }
+            }
+        }
+        map.put("isDutyUser",isDutyUser);
+        return ResultData.success(map);
+    }
+
+}

+ 256 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpClassifyController.java

@@ -0,0 +1,256 @@
+package com.zd.laboratory.controller;
+
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.annotation.PreAuthorize;
+import com.zd.common.core.exception.NoRollException;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.ExcelUtil;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.api.vo.ClassifyDetailVO;
+import com.zd.laboratory.api.vo.ClassifyVO;
+import com.zd.laboratory.domain.LabWhiteJoinSublist;
+import com.zd.laboratory.domain.LabWhitelist;
+import com.zd.laboratory.domain.XxpClassify;
+import com.zd.laboratory.domain.XxpClassifyDetail;
+import com.zd.laboratory.domain.vo.LabSubjectVO;
+import com.zd.laboratory.domain.vo.LabWhitelistVO;
+import com.zd.laboratory.domain.vo.XxpClassifyDetailVO;
+import com.zd.laboratory.service.IXxpClassifyDetailedService;
+import com.zd.laboratory.service.IXxpClassifyService;
+import com.zd.model.constant.HttpStatus;
+import com.zd.model.domain.ResultData;
+import com.zd.model.domain.per.PerFun;
+import com.zd.model.domain.per.PerPrefix;
+import com.zd.model.entity.SysUser;
+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.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 信息牌类目Controller
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@RestController
+@Api(tags = "【信息牌类目】")
+@RequestMapping("/XxpClassify")
+public class LabXxpClassifyController extends BaseController
+{
+    @Autowired
+    private IXxpClassifyService xxpClassifyService;
+
+    @Autowired
+    private IXxpClassifyDetailedService xxpClassifyDetailedService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 查询信息牌类目列表
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.LIST)
+    @GetMapping("/list")
+    @ApiOperation(value = "查询信息牌类目列表")
+    public TableDataInfo<XxpClassify> list(XxpClassify xxpClassify)
+    {
+        startPage();
+        List<XxpClassify> list = xxpClassifyService.selectXxpClassifyList(xxpClassify);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询信息牌类目列表-无权限-实验室编辑使用
+     */
+    @GetMapping("/listSub")
+    public TableDataInfo<XxpClassify> listSub(XxpClassifyDetailVO detailVO)
+    {
+        // 显示的
+        XxpClassify cfy = new XxpClassify();
+        //展示的数据
+        cfy.setIsShow(1);
+        List<XxpClassify> list = xxpClassifyService.selectXxpClassifyList(cfy);
+        XxpClassifyDetailVO  publicCd= new XxpClassifyDetailVO();
+        XxpClassifyDetailVO  privateCd = new XxpClassifyDetailVO();
+        XxpClassifyDetailVO  normalCd = new XxpClassifyDetailVO();
+        for (XxpClassify classify:list) {
+
+            //查询非公共所有配置
+            normalCd.setIsCollective(1);
+            normalCd.setInfoClassifyId(classify.getId());
+            List<XxpClassifyDetailVO> normalList = xxpClassifyDetailedService.selectXxpClassifyDetailedList(normalCd);
+            classify.setNormalDetailList(normalList);
+
+            if(StringUtils.isNotNull(detailVO.getSubjectId())){
+                //查询私有配置
+                privateCd.setInfoClassifyId(classify.getId());
+                privateCd.setIsCollective(1);
+                privateCd.setSubjectId(detailVO.getSubjectId());
+                List<XxpClassifyDetailVO> privateList = xxpClassifyDetailedService.selectXxpClassifyDetailedByPara(privateCd);
+                classify.setPrivateDetailList(privateList);
+            }
+
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出信息牌类目列表
+     */
+    @ApiOperation(value = "导出信息牌类目列表")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.EXPORT)
+    @Log(title = "信息牌类目", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, XxpClassify xxpClassify) throws IOException
+    {
+        List<XxpClassify> list = xxpClassifyService.selectXxpClassifyList(xxpClassify);
+        ExcelUtil<XxpClassify> util = new ExcelUtil<XxpClassify>(XxpClassify.class);
+        util.exportExcel(response, list, "信息牌类目数据");
+    }
+
+    /**
+     * 获取信息牌类目详细
+     */
+    @ApiOperation(value = "获取信息牌类目详细")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.QUERY)
+    @GetMapping(value = "/{id}")
+    public ResultData<XxpClassify> getInfo(@PathVariable("id") Long id)
+    {
+        return ResultData.success(xxpClassifyService.selectXxpClassifyById(id));
+    }
+
+
+    /**
+     * 新增信息牌类目
+     */
+    @ApiOperation(value = "新增信息牌类目")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.ADD)
+    @Log(title = "信息牌类目", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody XxpClassify xxpClassify)
+    {
+        return ResultData.result(xxpClassifyService.insertXxpClassify(xxpClassify));
+    }
+
+
+
+    /**
+     * 修改信息牌类目
+     */
+    @ApiOperation(value = "修改信息牌类目")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.EDIT)
+    @Log(title = "信息牌类目", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody XxpClassify xxpClassify)
+    {
+        return  ResultData.result(xxpClassifyService.updateXxpClassify(xxpClassify));
+    }
+
+    /**
+     * 删除信息牌类目
+     */
+    @ApiOperation(value = "删除信息牌类目")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.REMOVE)
+    @Log(title = "信息牌类目", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids)
+    {
+        return ResultData.result(xxpClassifyService.deleteXxpClassifyByIds(ids));
+    }
+
+    /**
+     * 根据id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除信息牌类目")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.REMOVE)
+    @Log(title = "信息牌类目", businessType = BusinessType.DELETE)
+    @PostMapping("/{id}")
+    public ResultData remove(@PathVariable Long id)
+    {
+        return ResultData.result(xxpClassifyService.deleteXxpClassifyById(id));
+    }
+
+    @ApiOperation(value = "是否有子类")
+    @GetMapping(value = "/delCheck")
+    public TableDataInfo<XxpClassifyDetailVO> delCheck(Long id)
+    {
+        return getDataTable(xxpClassifyService.delCheck(id));
+    }
+
+    /***
+     * 根据实验室id查询实验室安全类目
+     * @param subJectId
+     * @return
+     */
+    @ApiOperation(value = "根据实验室id查询实验室安全类目")
+    @GetMapping(value = "/getClassifyBySubId")
+    public List<ClassifyVO> getSubClassify(Long subJectId){
+        List<ClassifyVO> classifyVOList = new ArrayList<>();
+        try {
+            //查询所有有效类目配置
+            XxpClassify classify = new XxpClassify();
+            classify.setIsShow(1);
+            //classify.setIsSpecial(1);
+            classify.setRemark("sort");
+            List<XxpClassify> classifyList = xxpClassifyService.selectXxpClassifyList(classify);
+            for (XxpClassify xcf:classifyList) {
+                ClassifyVO classifyVO = new ClassifyVO();
+                classifyVO.setId(xcf.getId());
+                classifyVO.setClassifyName(xcf.getClassifyName());
+                classifyVO.setClassifyType(xcf.getClassifyType());
+                classifyVOList.add(classifyVO);
+
+                //查询公共配置
+                XxpClassifyDetailVO detailVO = new XxpClassifyDetailVO();
+                detailVO.setInfoClassifyId(xcf.getId());
+                detailVO.setIsCollective(1);
+                //类目下公共所有子项类目
+                List<XxpClassifyDetailVO> allDetailList= xxpClassifyDetailedService.selectXxpClassifyDetailedList(detailVO);
+                List<ClassifyDetailVO> showPublickList= new ArrayList<>();
+                for (XxpClassifyDetailVO vo:allDetailList ) {
+                    ClassifyDetailVO detailVO1 = new ClassifyDetailVO();
+                    detailVO1.setId(vo.getId());
+                    detailVO1.setInfoClassifyId(vo.getInfoClassifyId());
+                    detailVO1.setInfoName(vo.getInfoName());
+                    detailVO1.setInfoType(vo.getInfoType());
+                    detailVO1.setInfoContent(vo.getInfoContent());
+                    showPublickList.add(detailVO1);
+                }
+
+                if(StringUtils.isNotNull(subJectId)){
+                    detailVO.setSubjectId(subJectId);
+                    //实验室私有配置类目
+                    List<XxpClassifyDetailVO> detailVOList= xxpClassifyDetailedService.selectXxpClassifyDetailedByPara(detailVO);
+                    List<ClassifyDetailVO> showprivateList = new ArrayList<>();
+                    for (XxpClassifyDetailVO vo:detailVOList) {
+                        ClassifyDetailVO classifyDetailVO = new ClassifyDetailVO();
+                        classifyDetailVO.setId(vo.getId());
+                        classifyDetailVO.setInfoClassifyId(vo.getInfoClassifyId());
+                        classifyDetailVO.setInfoName(vo.getInfoName());
+                        classifyDetailVO.setInfoType(vo.getInfoType());
+                        classifyDetailVO.setInfoContent(vo.getInfoContent());
+                        showprivateList.add(classifyDetailVO);
+                    }
+                    classifyVO.setPrivateList(showprivateList);
+                }
+                classifyVO.setPublicList(showPublickList);
+            }
+        }catch (Exception e){
+            logger.info("查询实验室下的安全类目信息异常:"+e);
+        }
+        return classifyVOList;
+    }
+
+}

+ 179 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpClassifyDetailedController.java

@@ -0,0 +1,179 @@
+package com.zd.laboratory.controller;
+
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.annotation.PreAuthorize;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.ExcelUtil;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.api.vo.LabXxpClassifyVo;
+import com.zd.laboratory.domain.LabWhitelist;
+import com.zd.laboratory.domain.XxpClassify;
+import com.zd.laboratory.domain.XxpClassifyDetail;
+import com.zd.laboratory.domain.XxpClassifySubject;
+import com.zd.laboratory.domain.vo.XxpClassifyDetailVO;
+import com.zd.laboratory.service.IXxpClassifyDetailedService;
+import com.zd.laboratory.service.IXxpClassifySubjectService;
+import com.zd.laboratory.service.IXxpClassifyService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.domain.per.PerFun;
+import com.zd.model.domain.per.PerPrefix;
+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 javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 安全信息类目详情Controller
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@RestController
+@Api(tags = "【安全信息类目详情】")
+@RequestMapping("/XxpClassifyDet")
+public class LabXxpClassifyDetailedController extends BaseController
+{
+    @Autowired
+    private IXxpClassifyDetailedService classifyDetailedService;
+
+    @Autowired
+    private IXxpClassifyService iXxpClassifyService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private IXxpClassifySubjectService classifySubjectService;
+
+    /**
+     * 查询安全信息类目详情列表
+     */
+    //@PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.LIST)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.LIST)
+    @GetMapping("/list")
+    @ApiOperation(value = "查询安全信息类目详情列表")
+    public TableDataInfo<XxpClassifyDetailVO> list(XxpClassifyDetailVO classifyDetailed)
+    {
+        startPage();
+        classifyDetailed.setRemark("list");
+        List<XxpClassifyDetailVO> list = classifyDetailedService.selectXxpClassifyDetailedList(classifyDetailed);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出安全信息类目详情列表
+     */
+    @ApiOperation(value = "导出安全信息类目详情列表")
+   // @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.EXPORT)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.EXPORT)
+    @Log(title = "安全信息类目详情", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, XxpClassifyDetailVO classifyDetailed) throws IOException
+    {
+        List<XxpClassifyDetailVO> list = classifyDetailedService.selectXxpClassifyDetailedList(classifyDetailed);
+        ExcelUtil<XxpClassifyDetailVO> util = new ExcelUtil<XxpClassifyDetailVO>(XxpClassifyDetailVO.class);
+        util.exportExcel(response, list, "安全信息类目详情数据");
+    }
+
+    /**
+     * 获取安全信息类目详情详细信息
+     */
+    @ApiOperation(value = "获取安全信息类目详情详细信息")
+    //@PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.QUERY)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.QUERY)
+    @GetMapping(value = "/{id}")
+    public ResultData<XxpClassifyDetail> getInfo(@PathVariable("id") Long id)
+    {
+        return ResultData.success(classifyDetailedService.selectXxpClassifyDetailedById(id));
+    }
+
+
+    /**
+     * 新增安全信息类目详情
+     */
+    @ApiOperation(value = "新增安全信息类目详情")
+    //@PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.ADD)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.ADD)
+    @Log(title = "安全信息类目详情", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody XxpClassifyDetail classifyDetailed)
+    {
+        return ResultData.result(classifyDetailedService.insertXxpClassifyDetailed(classifyDetailed));
+    }
+
+
+
+    /**
+     * 修改安全信息类目详情
+     */
+    @ApiOperation(value = "修改安全信息类目详情")
+    //@PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.EDIT)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.EDIT)
+    @Log(title = "安全信息类目详情", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody XxpClassifyDetail classifyDetailed)
+    {
+        return  ResultData.result(classifyDetailedService.updateXxpClassifyDetailed(classifyDetailed));
+    }
+
+    /**
+     * 删除安全信息类目详情
+     */
+    @ApiOperation(value = "删除安全信息类目详情")
+    //@PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.REMOVE)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.REMOVE)
+    @Log(title = "安全信息类目详情", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids)
+    {
+        return ResultData.result(classifyDetailedService.deleteXxpClassifyDetailedByIds(ids));
+    }
+
+    /**
+     * 根据id删除关联关系
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除安全信息类目详情关联关系")
+   // @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY_DET + PerFun.REMOVE)
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_CLASSIFY + PerFun.REMOVE)
+    @Log(title = "安全信息类目详情", businessType = BusinessType.DELETE)
+    @PostMapping("/{id}")
+    public ResultData remove(@PathVariable Long id)
+    {
+        return ResultData.result(classifyDetailedService.deleteXxpClassifyDetailedById(id));
+    }
+
+
+
+    /**
+     * 根据实验室id查询信息牌数据
+     * @param id
+     * @return
+     */
+    @RequestMapping("/classifyDetail/{id}")
+    public ResultData getClassifyDetailed(@PathVariable Long id)
+    {
+        List<LabXxpClassifyVo> xxpClassifyVoList=classifyDetailedService.selectXxpClassify(id);
+        return ResultData.success(xxpClassifyVoList);
+    }
+
+    @PostMapping(value = "/addSub")
+    public ResultData addSub(@RequestBody XxpClassifySubject subject)
+    {
+        return ResultData.success(classifySubjectService.insertClassifySubject(subject));
+    }
+
+    @GetMapping(value = "/delSub")
+    public ResultData delSub(Long subjectId)
+    {
+        return ResultData.success(classifySubjectService.deleteBySubjectId(subjectId));
+    }
+
+}

+ 224 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpDutyController.java

@@ -0,0 +1,224 @@
+package com.zd.laboratory.controller;
+
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.annotation.PreAuthorize;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.DateUtils;
+import com.zd.common.core.utils.ExcelUtil;
+import com.zd.common.core.utils.FileConfigUtils;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.domain.XxpDuty;
+import com.zd.laboratory.domain.XxpInspection;
+import com.zd.laboratory.domain.vo.XxpDutyVO;
+import com.zd.laboratory.service.IXxpDutyService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.domain.per.PerFun;
+import com.zd.model.domain.per.PerPrefix;
+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 javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * 值班Controller
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@RestController
+@Api(tags = "【值班】")
+@RequestMapping("/XxpDuty")
+public class LabXxpDutyController extends BaseController
+{
+    @Autowired
+    private IXxpDutyService xxpDutyService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private FileConfigUtils fileConfigUtils;
+
+    /**
+     * 查询值班列表
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.LIST)
+    @GetMapping("/list")
+    @ApiOperation(value = "查询值班列表")
+    public TableDataInfo<XxpDuty> list(XxpDuty xxpDuty)
+    {
+        startPage();
+        List<XxpDuty> list = xxpDutyService.selectXxpDutyList(xxpDuty);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询值班列表(按实时间查询)
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.LIST)
+    @GetMapping("/listYmd")
+    @ApiOperation(value = "查询值班列表")
+    public TableDataInfo<XxpDutyVO> listGroup(XxpDuty xxpDuty)
+    {
+        //startPage();
+        List<XxpDutyVO> list = xxpDutyService.selectDutyYmdById(xxpDuty);
+        XxpDuty du  = new XxpDuty();
+        for (XxpDutyVO duty:list) {
+            du.setDeptId(xxpDuty.getDeptId());
+            du.setDutyTime(duty.getDutyTime());
+            XxpDutyVO vo= xxpDutyService.selectSubAndUserSum(du);
+            duty.setSubSum(vo.getSubSum());
+            duty.setUserSum(vo.getUserSum());
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出值班列表
+     */
+    @ApiOperation(value = "导出值班列表")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.EXPORT)
+    @Log(title = "值班", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, XxpDuty xxpDuty) throws IOException
+    {
+        List<XxpDuty> list = xxpDutyService.selectXxpDutyList(xxpDuty);
+        ExcelUtil<XxpDuty> util = new ExcelUtil<XxpDuty>(XxpDuty.class);
+        util.exportExcel(response, list, "值班数据");
+    }
+
+    /**
+     * 获取值班详细
+     */
+    @ApiOperation(value = "获取值班详细")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.QUERY)
+    @GetMapping(value = "/{id}")
+    public ResultData<XxpDuty> getInfo(@PathVariable("id") Long id)
+    {
+        return ResultData.success(xxpDutyService.selectXxpDutyById(id));
+    }
+
+
+    /**
+     * 根据时间获取值班详情
+     */
+    @ApiOperation(value = "根据时间获取值班详情")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.QUERY)
+    @GetMapping(value = "/getInfoByDate")
+    public TableDataInfo<XxpDutyVO> getInfoByDate(XxpDuty xxpDuty)
+    {
+        startPage();
+        List<XxpDutyVO> listVo = xxpDutyService.selectInfoByDate(xxpDuty);
+        XxpDuty newDuty = new XxpDuty();
+        for (XxpDutyVO duty:listVo) {
+            newDuty.setSubjectId(duty.getSubjectId());
+            newDuty.setDutyTime(xxpDuty.getDutyTime());
+            newDuty.setDeptId(xxpDuty.getDeptId());
+            List<XxpDuty> list =xxpDutyService.selectXxpDutyList(newDuty);
+            duty.setDutyList(list);
+        }
+        return getDataTable(listVo);
+    }
+
+    /**
+     * 新增值班
+     */
+    @ApiOperation(value = "新增值班")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.ADD)
+    @Log(title = "值班", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody XxpDutyVO xxpDutyVO)
+    {
+        return ResultData.result(xxpDutyService.insertXxpDuty(xxpDutyVO));
+    }
+
+
+
+    /**
+     * 修改值班
+     */
+    @ApiOperation(value = "修改值班")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.EDIT)
+    @Log(title = "值班", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody XxpDuty xxpDuty)
+    {
+        return  ResultData.result(xxpDutyService.updateXxpDuty(xxpDuty));
+    }
+
+    /**
+     * 删除值班
+     */
+    @ApiOperation(value = "删除值班")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.REMOVE)
+    @Log(title = "值班", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids)
+    {
+        return ResultData.result(xxpDutyService.deleteXxpDutyByIds(ids));
+    }
+
+    /**
+     * 根据id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除值班")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_DUTY + PerFun.REMOVE)
+    @Log(title = "值班", businessType = BusinessType.DELETE)
+    @PostMapping("/{id}")
+    public ResultData remove(@PathVariable Long id)
+    {
+        return ResultData.result(xxpDutyService.deleteXxpDutyById(id));
+    }
+
+
+    /*--------------------------------------------------------------------------------*/
+    @RequestMapping("/api/selectDutyUser")
+    @ApiOperation(value = "查询值班列表")
+    public ResultData<List<Map<String,Object>>> list(Long labId,String dateTime)
+    {
+        List<Map<String,Object>> list = xxpDutyService.selectDutyUser(labId,dateTime);
+        for(Map<String,Object> map:list){
+            if(StringUtils.isNotNull(map.get("avatar"))){
+                String avatar=fileConfigUtils.getFileDomainApp() + map.get("avatar");
+                map.put("avatar",avatar);
+            }
+        }
+        return ResultData.success(list);
+    }
+
+
+    @RequestMapping("/api/selectDutyUserList")
+    @ApiOperation(value = "查询值班人员列表")
+    public ResultData<List<Map<String,Object>>> selectDutyUserList(Long labId,String startTime,String endTime)
+    {
+        List<Map<String,Object>> list = xxpDutyService.selectDutyUserList(labId,startTime,endTime);
+        Optional.ofNullable(list).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    if(StringUtils.isNotNull(a.get("avatar"))){
+                        String url = fileConfigUtils.getFileDomainApp() + a.get("avatar");
+                        a.put("avatar",url);
+                    }
+                });
+        return ResultData.success(list);
+    }
+
+    /***
+     *
+     * 获取当前时间
+     */
+    @GetMapping(value = "/getDate")
+    public ResultData getDate()
+    {
+        return ResultData.success(DateUtils.getDate());
+    }
+}

+ 351 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpInspectionController.java

@@ -0,0 +1,351 @@
+package com.zd.laboratory.controller;
+
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.annotation.PreAuthorize;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.DateUtils;
+import com.zd.common.core.utils.ExcelUtil;
+import com.zd.common.core.utils.FileConfigUtils;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.api.vo.XxpInspectionVo;
+import com.zd.laboratory.domain.XxpCardInfo;
+import com.zd.laboratory.domain.XxpDuty;
+import com.zd.laboratory.domain.XxpInspection;
+import com.zd.laboratory.domain.vo.XxpInspectionVO;
+import com.zd.laboratory.service.ILabSubjectAccessRecordService;
+import com.zd.laboratory.service.IXxpCardInfoService;
+import com.zd.laboratory.service.IXxpInspectionService;
+import com.zd.model.constant.HttpStatus;
+import com.zd.model.domain.ResultData;
+import com.zd.model.domain.per.PerFun;
+import com.zd.model.domain.per.PerPrefix;
+import com.zd.model.page.TableDataInfo;
+import com.zd.system.api.feign.RemoteUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 巡查Controller
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@RestController
+@Api(tags = "【巡查】")
+@RequestMapping("/XxpInspection")
+public class LabXxpInspectionController extends BaseController
+{
+    @Autowired
+    private IXxpInspectionService xxpInspectionService;
+
+    @Autowired
+    private IXxpCardInfoService iXxpCardInfoService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private FileConfigUtils fileConfigUtils;
+
+    @Autowired
+    private RemoteUserService remoteUserService;
+
+    @Autowired
+    private ILabSubjectAccessRecordService iLabSubjectAccessRecordService;
+
+
+    /**
+     * 查询巡查列表
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.LIST)
+    @GetMapping("/list")
+    @ApiOperation(value = "查询巡查列表")
+    public TableDataInfo<XxpInspection> list(XxpInspection xxpInspection)
+    {
+        startPage();
+        List<XxpInspection> list = xxpInspectionService.selectXxpInspectionList(xxpInspection);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询巡查列表(根据时间段)
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.LIST)
+    @GetMapping("/listYmd")
+    @ApiOperation(value = "查询巡查列表")
+    public List<XxpInspectionVO> listYmd(XxpInspectionVO inspectionVO)
+    {
+        Map<String,XxpInspectionVO> allMap = new LinkedHashMap<>();
+        inspectionVO.setEndTime(DateUtils.getDate());
+        //startPage();
+        //获取时间段内签到人员总数
+        List<XxpInspectionVO> signinList = xxpInspectionService.selectListSigninCount(inspectionVO);
+        Optional.ofNullable(signinList).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    a.setNoSignedInCount(0);
+                    allMap.put(a.getDutyTime(),a);
+                });
+
+        //获取时间段内签到人员总数
+        List<XxpInspectionVO> notSigninLlist = xxpInspectionService.selectListNotSigninCount(inspectionVO);
+        Optional.ofNullable(notSigninLlist).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    if(allMap.get(a.getDutyTime())!=null){
+                        XxpInspectionVO newInspectionVo = allMap.get(a.getDutyTime());
+                        newInspectionVo.setNoSignedInCount(a.getNoSignedInCount());
+                        allMap.put(a.getDutyTime(),newInspectionVo);
+                    }else{
+                        a.setSignInCount(0);
+                        allMap.put(a.getDutyTime(),a);
+                    }
+
+                });
+        return Optional.ofNullable(allMap.entrySet()).orElseGet(Collections::emptySet)
+                .stream()
+                .map(a->a.getValue())
+                .collect(Collectors.toList());
+    }
+
+    /***
+     * 签到列表-正常
+     * @param xxpInspection
+     * @return
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.QUERY)
+    @GetMapping("/listStandard")
+    @ApiOperation(value = "查询巡查列表-正常")
+    public TableDataInfo<XxpInspection> listStandard(XxpInspection xxpInspection)
+    {
+        startPage();
+        List<XxpInspection> list = xxpInspectionService.selectListSignin(xxpInspection);
+        return getDataTable(list);
+    }
+
+
+    /***
+     * 签到列表-异常
+     * @param xxpDuty
+     * @return
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.QUERY)
+    @GetMapping("/listAbnormal")
+    @ApiOperation(value = "查询巡查列表-异常")
+    public TableDataInfo<XxpDuty> listAbnormal(XxpDuty xxpDuty)
+    {
+        startPage();
+        List<XxpDuty> list = xxpInspectionService.selectListAbnormal(xxpDuty);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出巡查列表
+     */
+    @ApiOperation(value = "导出巡查列表")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.EXPORT)
+    @Log(title = "巡查", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, XxpInspection xxpInspection) throws IOException
+    {
+        List<XxpInspection> list = xxpInspectionService.selectXxpInspectionList(xxpInspection);
+        ExcelUtil<XxpInspection> util = new ExcelUtil<XxpInspection>(XxpInspection.class);
+        util.exportExcel(response, list, "巡查数据");
+    }
+
+    /**
+     * 获取巡查详细
+     */
+    @ApiOperation(value = "获取巡查详细")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.QUERY)
+    @GetMapping(value = "/{id}")
+    public ResultData<XxpInspection> getInfo(@PathVariable("id") Long id)
+    {
+        return ResultData.success(xxpInspectionService.selectXxpInspectionById(id));
+    }
+
+
+    /**
+     * 新增巡查
+     */
+    @ApiOperation(value = "新增巡查")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.ADD)
+    @Log(title = "巡查", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody XxpInspection xxpInspection)
+    {
+        return ResultData.result(xxpInspectionService.insertXxpInspection(xxpInspection));
+    }
+
+
+
+    /**
+     * 修改巡查
+     */
+    @ApiOperation(value = "修改巡查")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.EDIT)
+    @Log(title = "巡查", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody XxpInspection xxpInspection)
+    {
+        return  ResultData.result(xxpInspectionService.updateXxpInspection(xxpInspection));
+    }
+
+    /**
+     * 删除巡查
+     */
+    @ApiOperation(value = "删除巡查")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.REMOVE)
+    @Log(title = "巡查", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids)
+    {
+        return ResultData.result(xxpInspectionService.deleteXxpInspectionByIds(ids));
+    }
+
+    /**
+     * 根据id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除巡查")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXP_INSPECTION + PerFun.REMOVE)
+    @Log(title = "巡查", businessType = BusinessType.DELETE)
+    @PostMapping("/{id}")
+    public ResultData remove(@PathVariable Long id)
+    {
+        return ResultData.result(xxpInspectionService.deleteXxpInspectionById(id));
+    }
+
+
+    /**
+     * 根据实验室id和当前时间查询签到记录
+     * @param labId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @ApiOperation(value = "根据实验室查询巡查记录")
+    @PostMapping("/app/selectUserXxpInspectionList")
+    public ResultData selectUserXxpInspectionList(Long labId,String startTime,String endTime )
+    {
+        List<Map<String,Object>> list = xxpInspectionService.selectUserXxpInspectionList(labId,startTime,endTime);
+        Optional.ofNullable(list).orElseGet(Collections::emptyList)
+                .stream()
+                .forEach(a->{
+                    if(StringUtils.isNotNull(a.get("avatar"))){
+                        String url = fileConfigUtils.getFileDomainApp() + a.get("avatar");
+                        a.put("avatar",url);
+                    }
+                });
+        return ResultData.success(list);
+    }
+
+
+    /**
+     * 新增巡查
+     */
+    @ApiOperation(value = "巡查签到")
+    @PostMapping("/addInspection")
+    public ResultData addInspection(@RequestBody XxpInspectionVo xxpInspectionVo) {
+        XxpCardInfo xxpCardInfo=iXxpCardInfoService.selectXxpInfoByCard(xxpInspectionVo.getNum());
+        if(null==xxpCardInfo){
+            return ResultData.fail("电子信息牌查询错误");
+        }
+        int num=xxpInspectionService.selectNoSignOut(xxpCardInfo.getSubjectId(),xxpInspectionVo.getUserId());
+        if(num>0){
+            return ResultData.fail("当前用户已经签到成功,不能重复签到!");
+        }
+        int numAccess=iLabSubjectAccessRecordService.getSignOutRecordNoOut(xxpCardInfo.getSubjectId(),xxpInspectionVo.getUserId());
+        if(numAccess>0){
+            return ResultData.fail("当前用户已经签到成功,不能重复签到!");
+        }
+        ResultData resultData=remoteUserService.getUserMapInfoByUserId(xxpInspectionVo.getUserId());
+        if(null==resultData ||resultData.getCode()!= HttpStatus.SUCCESS){
+            return ResultData.fail("获取用户信息失败");
+        }
+        Object userObj=resultData.getData();
+        if(null==userObj){
+            return ResultData.fail("获取用户信息失败");
+        }
+        Map<String,Object> map= (Map<String, Object>) userObj;
+        XxpInspection xxpInspection=new XxpInspection();
+        xxpInspection.setSubjectId(xxpCardInfo.getSubjectId());
+        xxpInspection.setSubjectName(xxpCardInfo.getSubjectName());
+        xxpInspection.setUserImg(String.valueOf(map.get("avatar")));
+        xxpInspection.setUserName(String.valueOf(map.get("userName")));
+        xxpInspection.setCreateBy(String.valueOf(map.get("userName")));
+        xxpInspection.setUserId(Long.parseLong(String.valueOf(map.get("userId"))));
+        xxpInspection.setDeptId(Long.parseLong(String.valueOf(map.get("deptId"))));
+        xxpInspection.setDeptName(String.valueOf(map.get("deptName")));
+        Date date=new Date();
+        xxpInspection.setCreateTime(date);
+        xxpInspection.setSignIn(date);
+        return ResultData.result(xxpInspectionService.insertXxpInspection(xxpInspection));
+    }
+
+
+    /**
+     * 新增巡查
+     */
+    @ApiOperation(value = "Ai检测判断是否已签到")
+    @PostMapping("/isSignInspection")
+    public ResultData isSignInspection(Long labId,Long userId) {
+        int num=xxpInspectionService.selectNoSignOut(labId,userId);
+        if(num>0){
+            return ResultData.fail("当前用户已经签到成功,不能重复签到!");
+        }
+        int numAccess=iLabSubjectAccessRecordService.getSignOutRecordNoOut(labId,userId);
+        if(numAccess>0){
+            return ResultData.fail("当前用户已经签到成功,不能重复签到!");
+        }
+        return ResultData.success();
+    }
+
+
+    /**
+     * 修改巡查
+     */
+    @ApiOperation(value = "巡查签出")
+    @PostMapping("/updateInspection")
+    public ResultData updateInspection(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId) {
+        logger.info("labId:"+labId+"userId:"+userId);
+        Integer num=xxpInspectionService.updateXxpInspectionSignOut(labId,userId);
+        if(num>0){
+            return ResultData.success();
+        }
+        return ResultData.fail("未查到签到记录!");
+    }
+
+
+    /**
+     * 判断是巡查签到还是准入签到
+     */
+    @ApiOperation(value = "判断是巡查签到还是准入签到 1巡查 2准入")
+    @PostMapping("/isSignInType")
+    public ResultData isSignInType(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId) {
+        int type=0;
+        int num=xxpInspectionService.selectNoSignOut(labId,userId);
+        if(num>0){
+            type=1;
+        }
+        int numAccess=iLabSubjectAccessRecordService.getSignOutRecordNoOut(labId,userId);
+        if(numAccess>0){
+            type=2;
+        }
+        if(type==0){
+            return ResultData.fail("未查到签到记录!");
+        }
+        return ResultData.success(type);
+    }
+
+}

+ 256 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabXxpUserAuthController.java

@@ -0,0 +1,256 @@
+package com.zd.laboratory.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zd.common.core.annotation.Log;
+import com.zd.common.core.annotation.PreAuthorize;
+import com.zd.common.core.log.BusinessType;
+import com.zd.common.core.redis.RedisService;
+import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.DateUtils;
+import com.zd.common.core.utils.DictUtils;
+import com.zd.common.core.utils.ExcelUtil;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.common.core.web.controller.BaseController;
+import com.zd.laboratory.api.vo.XxpUserAuthVo;
+import com.zd.laboratory.domain.LabSubject;
+import com.zd.laboratory.domain.XxpCardInfo;
+import com.zd.laboratory.domain.XxpUserAuth;
+import com.zd.laboratory.service.ILabSubjectService;
+import com.zd.laboratory.service.IXxpCardInfoService;
+import com.zd.laboratory.service.IXxpDutyService;
+import com.zd.laboratory.service.IXxpUserAuthService;
+import com.zd.model.domain.ResultData;
+import com.zd.model.domain.per.PerFun;
+import com.zd.model.domain.per.PerPrefix;
+import com.zd.model.page.TableDataInfo;
+import com.zd.system.api.entity.SysDictData;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * 信息牌人员权限 Controller
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@RestController
+@Api(tags = "【信息牌人员权限】")
+@RequestMapping("/XxpUserAuth")
+public class LabXxpUserAuthController extends BaseController
+{
+    @Autowired
+    private IXxpUserAuthService xxpUserAuthService;
+
+    @Autowired
+    private IXxpCardInfoService iXxpCardInfoService;
+
+    @Autowired
+    private ILabSubjectService iLabSubjectService;
+
+    @Autowired
+    private IXxpDutyService iXxpDutyService;
+
+    /**
+     * 查询列表
+     */
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.LIST)
+    @GetMapping("/list")
+    @ApiOperation(value = "查询列表")
+    public TableDataInfo<XxpUserAuth> list(XxpUserAuth xxpUserAuth)
+    {
+        startPage();
+        List<XxpUserAuth> list = xxpUserAuthService.selectXxpUserAuthList(xxpUserAuth);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询授权类型列表
+     */
+    @GetMapping("/authTypelist")
+    @ApiOperation(value = "查询授权类型列表")
+    public TableDataInfo<SysDictData> authTypelist()
+    {
+        List<SysDictData> dictDataList = DictUtils.getDictCache("xxp_auth_type");
+        return getDataTable(dictDataList);
+    }
+
+    /**
+     * 导出列表
+     */
+    @ApiOperation(value = "导出列表")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.EXPORT)
+    @Log(title = "信息牌人员权限", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, XxpUserAuth xxpUserAuth) throws IOException
+    {
+        List<XxpUserAuth> list = xxpUserAuthService.selectXxpUserAuthList(xxpUserAuth);
+        ExcelUtil<XxpUserAuth> util = new ExcelUtil<XxpUserAuth>(XxpUserAuth.class);
+        util.exportExcel(response, list, "巡查数据");
+    }
+
+    /**
+     * 获取详细
+     */
+    @ApiOperation(value = "获取详细")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.QUERY)
+    @GetMapping(value = "/{id}")
+    public ResultData<XxpUserAuth> getInfo(@PathVariable("id") Long id)
+    {
+        return ResultData.success(xxpUserAuthService.selectXxpUserAuthById(id));
+    }
+
+
+    /**
+     * 新增
+     */
+    @ApiOperation(value = "新增")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.ADD)
+    @Log(title = "信息牌人员权限", businessType = BusinessType.INSERT)
+    @PostMapping
+    public ResultData add(@RequestBody XxpUserAuth xxpUserAuth)
+    {
+        return ResultData.result(xxpUserAuthService.insertXxpUserAuth(xxpUserAuth));
+    }
+
+    /****
+     * 批量新增
+     * @param xxpUserAuth
+     * @return
+     */
+    @ApiOperation(value = "新增")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.ADD)
+    @Log(title = "信息牌人员权限", businessType = BusinessType.INSERT)
+    @PostMapping("/addAuth")
+    public ResultData addAuth(@RequestBody XxpUserAuth xxpUserAuth)
+    {
+        return ResultData.result(xxpUserAuthService.insertXxpUserAuthBatch(xxpUserAuth));
+    }
+
+    /**
+     * 修改巡查
+     */
+    @ApiOperation(value = "修改巡查")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.EDIT)
+    @Log(title = "信息牌人员权限", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public ResultData edit(@RequestBody XxpUserAuth xxpUserAuth)
+    {
+        return  ResultData.result(xxpUserAuthService.updateXxpUserAuth(xxpUserAuth));
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.REMOVE)
+    @Log(title = "信息牌人员权限", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public ResultData remove(@PathVariable Long[] ids)
+    {
+        return ResultData.result(xxpUserAuthService.deleteXxpUserAuthByIds(ids));
+    }
+
+    /**
+     * 根据id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "根据id删除巡查")
+    @PreAuthorize(hasPermi = PerPrefix.LABORATORY_XXPUSERAUTH + PerFun.REMOVE)
+    @Log(title = "信息牌人员权限", businessType = BusinessType.DELETE)
+    @PostMapping("/{id}")
+    public ResultData remove(@PathVariable Long id)
+    {
+        return ResultData.result(xxpUserAuthService.deleteXxpUserAuthById(id));
+    }
+
+    /**
+     * 电子信息牌指纹录入
+     * @param xxpUserAuthVo
+     * @return
+     */
+    @ApiOperation(value = "电子信息牌指纹录入")
+    @PostMapping("/addUserAuth")
+    public ResultData addUserAuth(@RequestBody XxpUserAuthVo xxpUserAuthVo)
+    {
+        XxpCardInfo xxpCardInfo=iXxpCardInfoService.selectXxpInfoByCard(xxpUserAuthVo.getNum());
+        if(null==xxpCardInfo){
+            return ResultData.fail("电子班牌查询错误");
+        }
+        XxpUserAuth xxpUserAuth=new XxpUserAuth();
+        xxpUserAuth.setUserId(xxpUserAuthVo.getUserId());
+        xxpUserAuth.setUserName(xxpUserAuthVo.getUserName());
+        xxpUserAuth.setUserType(xxpUserAuthVo.getUserType());
+        xxpUserAuth.setSubjectId(xxpCardInfo.getSubjectId());
+        xxpUserAuth.setSubjectName(xxpCardInfo.getSubjectName());
+        xxpUserAuth.setDeptId(xxpCardInfo.getCollegeId());
+        xxpUserAuth.setDeptName(xxpCardInfo.getCollege());
+        xxpUserAuth.setCreateBy(xxpUserAuthVo.getUserName());
+        xxpUserAuth.setCreateTime(new Date());
+        xxpUserAuth.setHardwareId(xxpCardInfo.getId());
+        xxpUserAuth.setFinger(xxpUserAuthVo.getFinger());
+        xxpUserAuth.setFingerKey(xxpUserAuthVo.getFingerKey());
+        return ResultData.result(xxpUserAuthService.insertXxpUserAppAuth(xxpUserAuth));
+    }
+
+
+    /**
+     * 根据用户id查询指纹信息
+     * @param userId
+     * @return
+     */
+    @GetMapping("/getFingerByUserId")
+    public ResultData getFingerByUserId(@RequestParam Long labId,@RequestParam Long userId)
+    {
+        List<Map<String,Object>> mapList= xxpUserAuthService.getFingerByUserId(userId);
+        for(Map<String,Object> map:mapList){
+            Integer isDutyUser=0;
+            String userType=String.valueOf(map.get("userType"));
+            String isWhite=String.valueOf(map.get("isWhite"));
+            //如果是学生 或者白名单的老师 进二类页面
+            if(userType.equals("22") || (userType.equals("11") && isWhite.equals("0"))){
+                map.put("pageType",2);
+            }
+            int number=iLabSubjectService.isAdminOrSafeUser(labId,userId);
+            //一类首页对应身份为白名单老师、实验室负责人、安全责任人
+            if(number>0 || (userType.equals("11") && isWhite.equals("1"))){
+                map.put("pageType",1);
+            }
+            String dateTime = DateUtils.getDate();
+            List<Map<String,Object>> list = iXxpDutyService.selectDutyUser(labId,dateTime);
+            //判断是否当天值班
+            for(Map<String,Object> dutyMap:list){
+                String userObj=String.valueOf(dutyMap.get("userId"));
+                if(StringUtils.isNotEmpty(userObj) && StringUtils.isNotNull(userObj)){
+                    if(Long.parseLong(userObj)==userId){
+                        isDutyUser=1;
+                        break;
+                    }
+                }
+            }
+            map.put("isDutyUser",isDutyUser);
+            map.remove("isWhite");
+        }
+        return ResultData.success(mapList);
+    }
+
+
+    /**
+     * 根据用户id查询指纹信息
+     * @param id
+     * @return
+     */
+    @GetMapping("/deleteFingerById")
+    public ResultData deleteFingerById(@RequestParam Long id)
+    {
+        return ResultData.result(xxpUserAuthService.deleteXxpUserAuthById(id));
+    }
+
+}

+ 122 - 3
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabSubject.java

@@ -48,7 +48,7 @@ public class LabSubject extends BaseEntity implements QCInterface {
      */
     @ApiModelProperty("实验室房间号")
     @Excel(name = "实验室房间号")
-    private String room = "";
+    private String room;
 
     private String roomName = "";
 
@@ -86,6 +86,13 @@ public class LabSubject extends BaseEntity implements QCInterface {
     @ApiModelProperty("创建人")
     @Excel(name = "创建人", readConverterExp = "用=于数据权限")
     private Long userId;
+
+
+    /**
+     * 创建人(用于数据权限)
+     */
+    @ApiModelProperty("创建人名称")
+    private Long userName;
     /**
      * 是否是实验室
      */
@@ -141,6 +148,16 @@ public class LabSubject extends BaseEntity implements QCInterface {
     //安全分类id
     private Long typeId;
 
+    /***
+     * 实验室安全类目关系集合
+     */
+    List<XxpClassifySubject> classifySubjectList;
+
+    /***
+     * 安全类目信息
+     */
+    List<XxpClassify> classifyList;
+
     /**
      * 是否查询安全用户
      */
@@ -195,8 +212,46 @@ public class LabSubject extends BaseEntity implements QCInterface {
 
     private String safeUserNames;
 
-    private Integer bottleTotal;//实验室气瓶总数
-    private Integer bottleUserTotal;//实验室单人气瓶总数
+    /**
+     * 实验室气瓶总数
+     */
+    private Integer bottleTotal;
+
+    /**
+     * 实验室单人气瓶总数
+     */
+    private Integer bottleUserTotal;
+
+    /***
+     *巡查人员,穿戴检查项
+     */
+    private String inspectCheckIn;
+
+    /***
+     *巡查人员,穿戴检查可跳过(0 否,1 是)
+     */
+    private Integer inspectSkipped;
+
+    /***
+     *巡查人员,穿戴检查识别上限
+     */
+    private Integer inspectCheckCount;
+
+    /***
+     *巡查人员,签到有效时间
+     */
+    private Integer inspectSignTime;
+
+    /***
+     *实验室详情
+     */
+    private String details;
+
+    /***
+     * 关联的硬件 1海康 2电子信息牌
+     */
+    private Integer hardwareType;
+
     private List<Long> deptIds;
 
     /**
@@ -528,4 +583,68 @@ public class LabSubject extends BaseEntity implements QCInterface {
     public void setRoomName(String roomName) {
         this.roomName = roomName;
     }
+
+    public String getInspectCheckIn() {
+        return inspectCheckIn;
+    }
+
+    public void setInspectCheckIn(String inspectCheckIn) {
+        this.inspectCheckIn = inspectCheckIn;
+    }
+
+    public Integer getInspectSkipped() {
+        return inspectSkipped;
+    }
+
+    public void setInspectSkipped(Integer inspectSkipped) {
+        this.inspectSkipped = inspectSkipped;
+    }
+
+    public Integer getInspectCheckCount() {
+        return inspectCheckCount;
+    }
+
+    public void setInspectCheckCount(Integer inspectCheckCount) {
+        this.inspectCheckCount = inspectCheckCount;
+    }
+
+    public Integer getInspectSignTime() {
+        return inspectSignTime;
+    }
+
+    public void setInspectSignTime(Integer inspectSignTime) {
+        this.inspectSignTime = inspectSignTime;
+    }
+
+    public String getDetails() {
+        return details;
+    }
+
+    public void setDetails(String details) {
+        this.details = details;
+    }
+
+    public List<XxpClassifySubject> getClassifySubjectList() {
+        return classifySubjectList;
+    }
+
+    public void setClassifySubjectList(List<XxpClassifySubject> classifySubjectList) {
+        this.classifySubjectList = classifySubjectList;
+    }
+
+    public List<XxpClassify> getClassifyList() {
+        return classifyList;
+    }
+
+    public void setClassifyList(List<XxpClassify> classifyList) {
+        this.classifyList = classifyList;
+    }
+
+    public Integer getHardwareType() {
+        return hardwareType;
+    }
+
+    public void setHardwareType(Integer hardwareType) {
+        this.hardwareType = hardwareType;
+    }
 }

+ 53 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/SubDiyVO.java

@@ -3,9 +3,11 @@ package com.zd.laboratory.domain;
 import cn.hutool.core.util.StrUtil;
 import com.zd.laboratory.api.entity.SensorFunctionStatus;
 import com.zd.laboratory.api.entity.SubAddrr;
+import com.zd.laboratory.api.vo.ClassifyVO;
 import com.zd.laboratory.api.vo.HardwareCVO;
 import com.zd.laboratory.api.vo.LabSubClassVO;
 import com.zd.laboratory.domain.vo.LabSubjectVO;
+import com.zd.laboratory.interfaces.SysProperties;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -30,6 +32,12 @@ public class SubDiyVO {
     private String name;
 
     /**
+     * 房间号
+     */
+    private String room;
+
+
+    /**
      * 实验室所属院系
      */
     private Long deptId;
@@ -109,6 +117,9 @@ public class SubDiyVO {
     @ApiModelProperty("安全分类名称")
     private String typeName;
 
+    @ApiModelProperty("安全类目信息")
+    private List<ClassifyVO>  classifyList;
+
     public int getSourceRiskCount() {
         return sourceRiskCount;
     }
@@ -290,6 +301,14 @@ public class SubDiyVO {
         this.fiedColor = fiedColor;
     }
 
+    public List<ClassifyVO> getClassifyList() {
+        return classifyList;
+    }
+
+    public void setClassifyList(List<ClassifyVO> classifyList) {
+        this.classifyList = classifyList;
+    }
+
     @ApiModel("安全信息")
     public static class SafeInfo{
         @ApiModelProperty("安全警示标示--字典")
@@ -307,6 +326,11 @@ public class SubDiyVO {
         @ApiModelProperty("二维码")
         private String qrCode;
 
+        @ApiModelProperty("二维码地址")
+        private String qrCodeUrl;
+
+        @ApiModelProperty("房间号")
+        private String room;
 
         @ApiModelProperty("实验室负责人名称")
         private String subAdminName;
@@ -428,5 +452,34 @@ public class SubDiyVO {
         public void setAdminNameAndPhone(String adminNameAndPhone) {
             this.adminNameAndPhone = adminNameAndPhone;
         }
+
+        public String getRoom() {
+            return room;
+        }
+
+        public void setRoom(String room) {
+            this.room = room;
+        }
+
+        public String getQrCodeUrl() {
+            return qrCodeUrl;
+        }
+
+        /**
+         * type = 5 实验室信息和安全检查二维码
+         *
+         * @param code = 实验室id + - + 实验室房间号
+         */
+        public void setQrCodeUrl(String code) {
+            this.qrCodeUrl = StrUtil.format(SysProperties.getLabInfoQrcode(), code, 5);
+        }
+    }
+
+    public String getRoom() {
+        return room;
+    }
+
+    public void setRoom(String room) {
+        this.room = room;
     }
 }

+ 244 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpCardInfo.java

@@ -0,0 +1,244 @@
+package com.zd.laboratory.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * 电子信息牌表 对象 xxp_card_info
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("巡查信息")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpCardInfo extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 设备名称
+     */
+    @Excel(name = " 设备名称")
+    @ApiModelProperty(value = "人员id")
+    private String cardName;
+
+    /**
+     * 设备编号
+     */
+    @Excel(name = "设备编号")
+    @ApiModelProperty(value = "设备编号")
+    private String cardNum;
+
+
+    /**
+     * 学院
+     */
+    @Excel(name = "学院")
+    @ApiModelProperty(value = "学院")
+    private String college;
+
+    /**
+     * 学院Id
+     */
+    @Excel(name = "学院Id")
+    @ApiModelProperty(value = "学院Id")
+    private Long collegeId;
+
+    /**
+     * 位置
+     */
+    @Excel(name = "位置")
+    @ApiModelProperty(value = "位置")
+    private String location;
+
+    /**
+     * 设备状态 1离线 2在线
+     */
+    @Excel(name = "设备状态")
+    @ApiModelProperty(value = "设备状态")
+    private Integer operate;
+
+    @Excel(name = "授权方式")
+    @ApiModelProperty(value = "授权方式")
+    private Integer authType;
+
+    @Excel(name = "授权密码")
+    @ApiModelProperty(value = "授权密码")
+    private String authPwd;
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "实验室id ")
+    @ApiModelProperty(value = "实验室id ")
+    private Long subjectId;
+
+    /**
+     * 实验室名称
+     */
+    @Excel(name = "实验室名称")
+    @ApiModelProperty(value = "实验室名称")
+    private String subjectName;
+
+    /**
+     * 部门id
+     */
+    @Excel(name = "部门id")
+    @ApiModelProperty(value = "部门id")
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    @Excel(name = "部门名称")
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+
+    /**
+     * 是否启用门锁 1启用 2禁用
+     */
+    @Excel(name = "是否启用门锁")
+    @ApiModelProperty(value = "是否启用门锁")
+    private Integer isStart;
+
+    /**
+     * 创建人id
+     */
+    @Excel(name = " 创建人id")
+    @ApiModelProperty(value = " 创建人id")
+    private Long userId;
+
+    /**
+     * 创建人
+     */
+    @Excel(name = " 创建人")
+    @ApiModelProperty(value = " 创建人")
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    @Excel(name = " 修改人")
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    @Override
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Override
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    @Override
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    @Override
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    @Override
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    @Override
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public String getDeptName() {
+        return deptName;
+    }
+
+    @Override
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Integer getAuthType() {        return authType;    }
+
+    public void setAuthType(Integer authType) {        this.authType = authType;    }
+}

+ 160 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpClassify.java

@@ -0,0 +1,160 @@
+package com.zd.laboratory.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.laboratory.domain.vo.XxpClassifyDetailVO;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 安全信息类目对象 xxp_classify
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("安全信息类目")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpClassify extends  BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 类目名称 */
+    @Excel(name = "类目名称")
+    @Length(message = "用户名长度不能超过50")
+    @ApiModelProperty(value = "类目名称")
+    private String classifyName;
+
+    /** 类目类型 1文字 2图片 */
+    @Excel(name = "类目类型")
+    @ApiModelProperty(value = "类目名称")
+    private Integer classifyType;
+
+
+    /** 排序 */
+    @Excel(name = "排序")
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+
+    /** 是否特殊类目 1否 2 是   */
+    @Excel(name = "是否特殊类目")
+    @ApiModelProperty(value = "是否特殊类目")
+    private Integer isSpecial;
+
+
+    /** 是否展示 1展示 2不展示   */
+    @Excel(name = "是否展示")
+    @ApiModelProperty(value = "是否展示")
+    private Integer isShow;
+
+    /** 类目颜色   */
+    @Excel(name = "类目颜色 ")
+    @ApiModelProperty(value = "类目颜色 ")
+    private String showColour;
+
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /** 修改人 */
+    @Excel(name = "修改人")
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+
+    /**
+     * 类目子项-实验室私有
+     */
+    List<XxpClassifyDetailVO> privateDetailList;
+
+    /**
+     * 非共有的所有子类
+     */
+    List<XxpClassifyDetailVO> normalDetailList;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    @Override
+    public String getCreateBy() {
+        return createBy;
+    }
+    @Override
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    @Override
+    public String getUpdateBy() {
+        return updateBy;
+    }
+    @Override
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+    @Override
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+    @Override
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}

+ 145 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpClassifyDetail.java

@@ -0,0 +1,145 @@
+package com.zd.laboratory.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+
+/**
+ * 安全信息类目详情 对象 xxp_classify_detailed
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("安全信息类目详情")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpClassifyDetail extends  BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    private Long id;
+
+    /** 类目表主键 */
+    @Excel(name = "类目表主键")
+    @Length(message = "长度不能超过20")
+    @ApiModelProperty(value = "类目表主键")
+    private Long infoClassifyId;
+
+    /** 信息名称  */
+    @Excel(name = "信息名称 ")
+    @ApiModelProperty(value = "信息名称 ")
+    private String infoName;
+
+
+    /** 类型 1文字 2图片*/
+    @Excel(name = "类型")
+    @ApiModelProperty(value = "类型 1文字 2图片")
+    private Integer infoType;
+
+    /** 内容 */
+    @Excel(name = "内容")
+    @ApiModelProperty(value = "内容")
+    private String infoContent;
+
+    /** 排序 */
+    @Excel(name = "排序 ")
+    @ApiModelProperty(value = "排序 ")
+    private Integer sort;
+
+
+    /** 是否共有 1非公共 2公共   */
+    @Excel(name = "是否共有")
+    @ApiModelProperty(value = "是否共有")
+    private Integer isCollective;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    /** 创建人 */
+    @Excel(name = "创建人")
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /** 修改人 */
+    @Excel(name = "修改人")
+    @ApiModelProperty(value = "修改人")
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    @Override
+    public String getCreateBy() {
+        return createBy;
+    }
+    @Override
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    @Override
+    public String getUpdateBy() {
+        return updateBy;
+    }
+    @Override
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+    @Override
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+    @Override
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}

+ 61 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpClassifySubject.java

@@ -0,0 +1,61 @@
+package com.zd.laboratory.domain;
+
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+
+/**
+ * 实验室安全类目关系表 xxp_classify_subject
+ *
+ * @author xxf
+ * @date 2023-03-27
+ */
+@ApiModel("实验室安全类目关系表")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpClassifySubject extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "实验室id")
+    @ApiModelProperty(value = "实验室id")
+    private Long subjectId;
+
+    /**
+     * 类目id
+     */
+    @Excel(name = "类目id")
+    @ApiModelProperty(value = "类目id")
+    private Long classifyId;
+
+    /**
+     * 详情id
+     */
+    @Excel(name = "详情id")
+    @ApiModelProperty(value = "详情id")
+    private Long classifyDetailId;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+}

+ 192 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpDuty.java

@@ -0,0 +1,192 @@
+package com.zd.laboratory.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+
+/**
+ * 值班表 对象 xxp_inspection
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("巡查信息")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpDuty extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 人员id
+     */
+    @Excel(name = "人员id")
+    @Length(message = "人员id长度不能超过20")
+    @ApiModelProperty(value = "人员id")
+    private Long userId;
+
+    /**
+     * 人员姓名
+     */
+    @Excel(name = "人员姓名")
+    @ApiModelProperty(value = "人员姓名")
+    private String userName;
+
+    /**
+     * 人员电话
+     */
+    @Excel(name = "人员电话")
+    @ApiModelProperty(value = "人员电话")
+    private String userPhone;
+
+    /**
+     * 头像
+     */
+    @Excel(name = "头像")
+    @ApiModelProperty(value = "头像")
+    private String userImg;
+
+    /**
+     * 人员类型 11老师 22学生
+     */
+    @Excel(name = "人员类型")
+    @ApiModelProperty(value = "人员类型")
+    private String userType;
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "实验室id")
+    @ApiModelProperty(value = "实验室id")
+    private Long subjectId;
+
+    /**
+     * 实验室名称
+     */
+    @Excel(name = "实验室名称")
+    @ApiModelProperty(value = "实验室名称")
+    private String subjectName;
+
+    /**
+     * 部门id
+     */
+    @Excel(name = "部门id ")
+    @ApiModelProperty(value = "部门id ")
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    @Excel(name = "部门名称 ")
+    @ApiModelProperty(value = "部门名称 ")
+    private String deptName;
+
+    /**
+     * 学院
+     */
+    @Excel(name = "学院")
+    @ApiModelProperty(value = "学院 ")
+    private String college;
+
+    /**
+     * 值班时间
+     */
+    @Excel(name = "值班时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "值班时间")
+    private Date dutyTime;
+
+    /**
+     * 创建人id
+     */
+    @Excel(name = "创建人id")
+    @ApiModelProperty(value = "创建人id")
+    private Long createById;
+
+    /**
+     * 创建人
+     */
+    @Excel(name = "创建人")
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    @Override
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public String getDeptName() {
+        return deptName;
+    }
+
+    @Override
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    @Override
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    @Override
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+}

+ 164 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpInspection.java

@@ -0,0 +1,164 @@
+package com.zd.laboratory.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+
+/**
+ * 巡查表 对象 xxp_inspection
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("巡查信息")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpInspection extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 人员id
+     */
+    @Excel(name = "人员id")
+    @Length(message = "人员id长度不能超过20")
+    @ApiModelProperty(value = "人员id")
+    private Long userId;
+
+    /**
+     * 人员姓名
+     */
+    @Excel(name = "人员姓名")
+    @ApiModelProperty(value = "人员姓名")
+    private String userName;
+
+
+    /**
+     * 人员姓名
+     */
+    @Excel(name = "人员图像")
+    @ApiModelProperty(value = "人员图像")
+    private String userImg;
+
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "实验室id")
+    @ApiModelProperty(value = "实验室id")
+    private Long subjectId;
+
+    /**
+     * 实验室名称
+     */
+    @Excel(name = "实验室名称")
+    @ApiModelProperty(value = "实验室名称")
+    private String subjectName;
+
+    /**
+     * 签到时间
+     */
+    @Excel(name = "签到时间 ")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "签到时间 ")
+    private Date signIn;
+
+    /**
+     * 签退时间
+     */
+    @Excel(name = "签退时间 ")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "签退时间 ")
+    private Date signOut;
+
+    /**
+     * 部门id
+     */
+    @Excel(name = "部门id ")
+    @ApiModelProperty(value = "部门id ")
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    @Excel(name = "部门名称 ")
+    @ApiModelProperty(value = "部门名称 ")
+    private String deptName;
+
+    /**
+     * 停留时间
+     */
+    @Excel(name = "停留时间 ")
+    @ApiModelProperty(value = "停留时间 ")
+    private String residenceTime;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    @Override
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public String getDeptName() {
+        return deptName;
+    }
+
+    @Override
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+}

+ 181 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/XxpUserAuth.java

@@ -0,0 +1,181 @@
+package com.zd.laboratory.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.model.annotation.Excel;
+import com.zd.model.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 信息牌人员权限表 对象 xxp_user_auth
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+@ApiModel("信息牌人员权限")
+@Data
+@Accessors(chain = true)
+@ToString(callSuper = true)
+public class XxpUserAuth extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 人员id
+     */
+    @Excel(name = "人员id")
+    @Length(message = "人员id长度不能超过20")
+    @ApiModelProperty(value = "人员id")
+    private Long userId;
+
+    /**
+     * 人员姓名
+     */
+    @Excel(name = "人员姓名")
+    @ApiModelProperty(value = "人员姓名")
+    private String userName;
+
+
+    /**
+     * 实验室id
+     */
+    @Excel(name = "实验室id")
+    @ApiModelProperty(value = "实验室id")
+    private Long subjectId;
+
+    /**
+     * 实验室名称
+     */
+    @Excel(name = "实验室名称")
+    @ApiModelProperty(value = "实验室名称")
+    private String subjectName;
+
+    /**
+     * 授权方式
+     */
+    @Excel(name = "授权方式")
+    @ApiModelProperty(value = "授权方式")
+    private String  authType;
+
+    /**
+     * 人员类型
+     */
+    @Excel(name = "人员类型")
+    @ApiModelProperty(value = "人员类型")
+    private String userType;
+
+    /**
+     * 部门id
+     */
+    @Excel(name = "部门id ")
+    @ApiModelProperty(value = "部门id ")
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    @Excel(name = "部门名称 ")
+    @ApiModelProperty(value = "部门名称 ")
+    private String deptName;
+
+    /**
+     * 指纹
+     */
+    @Excel(name = "指纹 ")
+    @ApiModelProperty(value = "指纹 ")
+    private String finger;
+
+    /**
+     * 密码
+     */
+    @Excel(name = "密码")
+    @ApiModelProperty(value = "密码")
+    private String userPassword;
+
+    /**
+     * 硬件id
+     */
+    @Excel(name = "硬件id")
+    @ApiModelProperty(value = "硬件id")
+    private Long hardwareId;
+
+
+    /**
+     * 手指标识
+     */
+    @Excel(name = "手指标识")
+    @ApiModelProperty(value = "手指标识")
+    private String fingerKey;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /***
+     * 开始时间
+     */
+    private String beginTime;
+
+    /***
+     * 结束时间
+     */
+    private String endTime;
+
+    List<XxpUserAuth> userAuthList;
+
+    @Override
+    public Long getUserId() {
+        return userId;
+    }
+
+    @Override
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    @Override
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public String getDeptName() {
+        return deptName;
+    }
+
+    @Override
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+
+}

+ 10 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSecurityApplyVO.java

@@ -48,6 +48,8 @@ public class LabSecurityApplyVO extends LabSecurityApply {
 
     private List<Long> subjectIds;//实验室id集合
 
+    private Integer valid;//0有效
+
     public String getLaboratoryDeptName() {        return laboratoryDeptName;    }
 
     public void setLaboratoryDeptName(String laboratoryDeptName) {        this.laboratoryDeptName = laboratoryDeptName;    }
@@ -122,4 +124,12 @@ public class LabSecurityApplyVO extends LabSecurityApply {
     public List<Long> getSubjectIds() {        return subjectIds;    }
 
     public void setSubjectIds(List<Long> subjectIds) {        this.subjectIds = subjectIds;    }
+
+    public Integer getValid() {
+        return valid;
+    }
+
+    public void setValid(Integer valid) {
+        this.valid = valid;
+    }
 }

+ 12 - 2
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSecurityMaterialDataVO.java

@@ -19,7 +19,11 @@ import java.util.Map;
  */
 @ApiModel("安全检查模板表")
 public class LabSecurityMaterialDataVO extends LabSecurityMaterialData {
-    //材料表集合
+
+    List<LabSecurityMaterialrelation>  listMr; //材料表集合
+
+    Long subjectId;//实验室id
+
     public List<LabSecurityMaterialrelation> getListMr() {
         return listMr;
     }
@@ -28,5 +32,11 @@ public class LabSecurityMaterialDataVO extends LabSecurityMaterialData {
         this.listMr = listMr;
     }
 
-    List<LabSecurityMaterialrelation>  listMr;
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
 }

+ 12 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSecuritySubjectmaterialVO.java

@@ -24,6 +24,10 @@ public class LabSecuritySubjectmaterialVO extends LabSecuritySubjectmaterial {
 
     private List<LabSecuritySubjectmaterial> publicList;//通用模板
 
+    private Integer authType;//授权方式
+
+    private String authPwd;//授权密码
+
     public Long getIscheck() {        return ischeck;    }
 
     public void setIscheck(Long ischeck) {        this.ischeck = ischeck;    }
@@ -69,4 +73,12 @@ public class LabSecuritySubjectmaterialVO extends LabSecuritySubjectmaterial {
     public void setPublicList(List<LabSecuritySubjectmaterial> publicList) {
         this.publicList = publicList;
     }
+
+    public Integer getAuthType() {        return authType;    }
+
+    public void setAuthType(Integer authType) {        this.authType = authType;    }
+
+    public String getAuthPwd() {        return authPwd;    }
+
+    public void setAuthPwd(String authPwd) {        this.authPwd = authPwd;    }
 }

+ 11 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSubjectVO.java

@@ -118,6 +118,9 @@ public class LabSubjectVO extends LabSubject {
     @ApiModelProperty(name = "位置")
     private String posi;
 
+    @ApiModelProperty(name = "电子信息牌Id")
+    private Integer xxpCardInfoId;
+
     public String getSenseState() {
         return senseState;
     }
@@ -399,4 +402,12 @@ public class LabSubjectVO extends LabSubject {
     public void setPosi(String posi) {
         this.posi = posi;
     }
+
+    public Integer getXxpCardInfoId() {
+        return xxpCardInfoId;
+    }
+
+    public void setXxpCardInfoId(Integer xxpCardInfoId) {
+        this.xxpCardInfoId = xxpCardInfoId;
+    }
 }

+ 190 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabXxpSubjectVo.java

@@ -0,0 +1,190 @@
+package com.zd.laboratory.domain.vo;
+
+import cn.hutool.core.util.StrUtil;
+import com.zd.laboratory.interfaces.SysProperties;
+import com.zd.model.qc.QCInterface;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Author: donggaosheng
+ * @Date: 2023/03/27
+ * @Description:
+ */
+@ApiModel("信息牌首页展示")
+public class LabXxpSubjectVo implements QCInterface {
+    @ApiModelProperty("负责人名称")
+    private String adminName;
+
+    @ApiModelProperty("负责人手机号")
+    private String adminPhone;
+
+    @ApiModelProperty("安全分级名称")
+    private String levelName;
+
+    @ApiModelProperty("安全分级颜色编码")
+    private String filedColor;
+
+    @ApiModelProperty("安全分类名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "二维码地址")
+    private String qrCodeUrl;
+
+    @ApiModel("安全责任人列表")
+    public class SafeUserVo {
+        @ApiModelProperty("安全负责人id")
+        private Integer id;
+        @ApiModelProperty("安全负责人名称")
+        private String safeUserName;
+        @ApiModelProperty("安全负责人电话")
+        private String safeUserPhone;
+
+        public Integer getId() {
+            return id;
+        }
+
+        public void setId(Integer id) {
+            this.id = id;
+        }
+
+        public String getSafeUserName() {
+            return safeUserName;
+        }
+
+        public void setSafeUserName(String safeUserName) {
+            this.safeUserName = safeUserName;
+        }
+
+        public String getSafeUserPhone() {
+            return safeUserPhone;
+        }
+
+        public void setSafeUserPhone(String safeUserPhone) {
+            this.safeUserPhone = safeUserPhone;
+        }
+    }
+
+    @ApiModelProperty(value = "二维码地址")
+    private List<SafeUserVo> safeUserVoList;
+
+    @ApiModel("信息牌列表展示")
+    public class XxpClassifyVo {
+        /**
+         * 类目类型 1文字 2图片
+         */
+        @ApiModelProperty(value = "类目类型")
+        private Integer classifyType;
+        @ApiModelProperty(value = "类目名称")
+        private String classifyName;
+        @ApiModelProperty(value = "信息名称 ")
+        private String infoName;
+        @ApiModelProperty(value = "是否特殊类目")
+        private Integer isSpecial;
+
+        /**
+         * 类目颜色
+         */
+        @ApiModelProperty(value = "类目颜色 ")
+        private String showColour;
+
+        public Integer getClassifyType() {
+            return classifyType;
+        }
+
+        public void setClassifyType(Integer classifyType) {
+            this.classifyType = classifyType;
+        }
+
+        public String getClassifyName() {
+            return classifyName;
+        }
+
+        public void setClassifyName(String classifyName) {
+            this.classifyName = classifyName;
+        }
+
+        public String getInfoName() {
+            return infoName;
+        }
+
+        public void setInfoName(String infoName) {
+            this.infoName = infoName;
+        }
+
+        public Integer getIsSpecial() {
+            return isSpecial;
+        }
+
+        public void setIsSpecial(Integer isSpecial) {
+            this.isSpecial = isSpecial;
+        }
+
+        public String getShowColour() {
+            return showColour;
+        }
+
+        public void setShowColour(String showColour) {
+            this.showColour = showColour;
+        }
+    }
+
+    public List<SafeUserVo> getSafeUserVoList() {
+        return safeUserVoList;
+    }
+
+    public void setSafeUserVoList(List<SafeUserVo> safeUserVoList) {
+        this.safeUserVoList = safeUserVoList;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getAdminPhone() {
+        return adminPhone;
+    }
+
+    public void setAdminPhone(String adminPhone) {
+        this.adminPhone = adminPhone;
+    }
+
+    public String getLevelName() {
+        return levelName;
+    }
+
+    public void setLevelName(String levelName) {
+        this.levelName = levelName;
+    }
+
+    public String getFiledColor() {
+        return filedColor;
+    }
+
+    public void setFiledColor(String filedColor) {
+        this.filedColor = filedColor;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public void setQrCodeUrl(String code) {
+        this.qrCodeUrl = StrUtil.format(SysProperties.getLabInfoQrcode(), code, 5);
+    }
+
+    @Override
+    public String getQrCodeUrl() {
+        return qrCodeUrl;
+    }
+}

+ 17 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/XxpClassifyDetailVO.java

@@ -0,0 +1,17 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.XxpClassifyDetail;
+import lombok.Data;
+
+/**
+ * @Author: xxf
+ * @Date: 2023/03/28/17:38
+ * @Description:
+ */
+@Data
+public class XxpClassifyDetailVO extends XxpClassifyDetail {
+    /***
+     * 实验室id
+     */
+    private Long subjectId;
+}

+ 44 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/XxpDutyVO.java

@@ -0,0 +1,44 @@
+package com.zd.laboratory.domain.vo;
+
+import com.zd.laboratory.domain.LabSubject;
+import com.zd.laboratory.domain.XxpDuty;
+import com.zd.model.entity.SysUser;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: xxf
+ * @Date: 2023/03/24/13:55
+ * @Description:
+ */
+@Data
+public class XxpDutyVO extends XxpDuty {
+
+    /**
+     * 值班日期
+     */
+    private List<String> dateList;
+
+    /**
+     * 实验室集合
+     */
+    private List<LabSubject> subjectList;
+
+    /**
+     * 人员集合
+     */
+    private List<SysUser> sysUserList;
+
+    /**
+     * 实验室总数
+     */
+    private Long subSum;
+
+    /***
+     * 人员总数
+     */
+    private Long userSum;
+
+    private List<XxpDuty> dutyList;
+}

+ 34 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/XxpInspectionVO.java

@@ -0,0 +1,34 @@
+package com.zd.laboratory.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zd.laboratory.domain.XxpInspection;
+import com.zd.model.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: xxf
+ * @Date: 2023/03/27/15:44
+ * @Description:
+ */
+@Data
+public class XxpInspectionVO extends XxpInspection {
+
+    /**
+     * 签到总数
+     */
+    private Integer signInCount;
+
+    /**
+     * 未签到总数
+     */
+    private Integer noSignedInCount;
+    /**
+     * 值班时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private String dutyTime;
+
+}

+ 14 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabCheckOptionMapper.java

@@ -66,4 +66,18 @@ public interface LabCheckOptionMapper
     int queryCheckOptionStatistics(LabCheckOptionStatisticsVo labCheckOptionStatisticsVo);
 
     List<LabCheckOptionStatisticsVo> queryCheckOptionStatisticDtails(LabCheckOptionStatisticsVo labCheckOptionStatisticsVo);
+
+    /***
+     * 大屏-安全隐患-按实验室统计-柱形图
+     * @param statisticsVo
+     * @return
+     */
+    List<LabCheckOptionStatisticsVo> selectSubjectListColumn(LabCheckOptionStatisticsVo statisticsVo);
+
+    /***
+     * 大屏-安全隐患-按实验室统计-列表
+     * @param statisticsVo
+     * @return
+     */
+    List<LabCheckOptionStatisticsVo> selectSubjectListList(LabCheckOptionStatisticsVo statisticsVo);
 }

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

@@ -170,4 +170,6 @@ public interface LabHardwareMapper {
     int selectCountByType(LabHardware labHardware);
 
     String querySubNameById(Long hardId);
+
+    String selectLabHardwareCameraBySubId(Long subId);
 }

+ 1 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareStateMapper.java

@@ -65,6 +65,7 @@ public interface LabHardwareStateMapper {
      */
     List<LabOnlineSubVO> onlineByBigView(LabSubjectVO labSubjectVO);
 
+
     List<SysUser> querySubOnlineUser(Map<String, Object> params);
 
     List<LabSubjectByUserNumVo> querySubsOnlineUser(List<Long> ids);

+ 30 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSecurityApplyMapper.java

@@ -141,4 +141,34 @@ public interface LabSecurityApplyMapper
      * @return
      */
     List<LabSecurityApply>  selectValidApply(LabSecurityApply labSecurityApply);
+
+    /**
+     * 查询实验室已通过的准入人员信息
+     * @param subjectId
+     * @return
+     */
+    List<Map<String, Object>> selectLabSecurityApply(Long subjectId);
+
+    /**
+     * 电子信息牌获取准入人员的指纹信息列表
+     * @param subjectId
+     * @return
+     */
+    List<Map<String,Object>> selectSecurityFingerList(Long subjectId);
+
+    /**
+     * 电子信息牌获取卡号列表
+     * @param subjectId
+     * @return
+     */
+    List<Map<String,Object>> selectSecurityCardList(Long subjectId);
+
+
+    /**
+     * 判断是否获得安全准入
+     *
+     * @param userId 用户的id
+     * @return 安全准入申请
+     */
+    Map<String, Object> selectCountLabSecurityUserId(@Param("subjectId") Long subjectId,@Param("userId") Long userId);
 }

+ 8 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabStudentsInfoMapper.java

@@ -1,5 +1,6 @@
 package com.zd.laboratory.mapper;
 
+import com.zd.laboratory.api.entity.LabSysUserInfo;
 import com.zd.laboratory.domain.vo.LabStudentsInfoVO;
 import com.zd.system.api.entity.LabStudentsInfo;
 
@@ -67,4 +68,11 @@ public interface LabStudentsInfoMapper {
      * @return 结果
      */
     public int deleteLabStudentsInfoByJoinStudentsIds(Long[] joinStudentsIds);
+
+    /**
+     * 查询学生信息
+     * @param subjectId 实验室id
+     * @return 学生信息
+     */
+    List<LabSysUserInfo> selectLabStudentsInfoBySubjectId(Long subjectId);
 }

+ 16 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSubjectAccessRecordMapper.java

@@ -163,6 +163,15 @@ public interface LabSubjectAccessRecordMapper {
      */
     public int getRecordNoOut(@Param("userId") Long userId,@Param("dateTime") String dateTime);
 
+    /**
+     * 查询当前用户没有签退的记录
+     * @param labId
+     * @param userId
+     * @param dateTime
+     * @return
+     */
+    int getSignOutRecordNoOut(@Param("labId") Long labId,@Param("userId") Long userId,@Param("dateTime") String dateTime);
+
     List<Map<String, Long>> selectJoinUsers(@Param("subs") List<Long> subs, @Param("date") Date date);
 
     List<LabSubjectAccessRecord> selectSubIdByUserId(Long userId);
@@ -173,4 +182,11 @@ public interface LabSubjectAccessRecordMapper {
      * @return
      */
     int updateLabSubjectAccessRecordById(LabSubjectAccessRecord accessRecord);
+
+    /**
+     * 根据实验室id查询签到人员列表
+     * @param subjectId
+     * @return
+     */
+    List<Map<String, Object>> selectSubjectSignList(Long subjectId);
 }

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

@@ -272,6 +272,13 @@ public interface LabSubjectMapper {
      */
     public List<LabSubject> multipleDetpBysubList(Long[] ids);
 
+    /***
+     * 实验室列表查询-信息牌使用
+     * @param labSubject
+     * @return
+     */
+    public List<LabSubject> cardinfoSubList(LabSubject labSubject);
+
     List<LabSubject> getByIds(List<Long> ids);
 
 
@@ -292,4 +299,42 @@ public interface LabSubjectMapper {
      */
     public List<LabClassifiedVo> getFiedCount(LabSubjectVO labSubject);
 
+
+    /**
+     * 查询信息牌实验室数据
+     * @param id
+     * @return
+     */
+    public Map<String,Object> selectXxpLabSubjectById(Long id);
+
+    /**
+     * 根据实验室id获取实验室详情
+     * @param id
+     * @return
+     */
+    String getSubjectDetailsById(Long id);
+
+    /**
+     * 根据实验室id获取实验室名称
+     * @param id
+     * @return
+     */
+    String getSubjectNameById(Long id);
+
+    /**
+     * 根据实验室编号查询实验室信息
+     * @param number
+     * @return
+     */
+    LabSubject selectLabSubjectByNum(String number);
+
+
+    /**
+     * 根据实验室id用户id查询是否是实验室管理员和安全管理员
+     * @param subjectId
+     * @param userId
+     * @return
+     */
+    Integer isAdminOrSafeUser(@Param("subjectId") Long subjectId,@Param("userId") Long userId);
+
 }

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

@@ -3,6 +3,7 @@ package com.zd.laboratory.mapper;
 import java.util.List;
 import com.zd.laboratory.domain.LabWhiteJoinSublist;
 import com.zd.laboratory.domain.vo.LabSubjectVO;
+import com.zd.laboratory.domain.vo.LabWhitelistVO;
 
 /**
  * 白名单关联的实验室Mapper接口
@@ -75,4 +76,6 @@ public interface LabWhiteJoinSublistMapper
      * @return
      */
     public int deleteLabWhiteJoinSublistByParameter(LabWhiteJoinSublist labWhiteJoinSublist);
+
+    public List<LabWhitelistVO> selectWhiteSublist(LabWhitelistVO whitelistVO);
 }

+ 2 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabWhitelistMapper.java

@@ -67,4 +67,6 @@ public interface LabWhitelistMapper
      * @return 结果
      */
     public int deleteLabWhitelistByIds(Long[] ids);
+
+    public List<LabWhitelistVO>  selectWhiteSublist(LabWhitelistVO whitelistVO);
 }

+ 88 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpCardInfoMapper.java

@@ -0,0 +1,88 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.XxpCardInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 巡查信息 Mapper接口
+ *
+ * @author xxf
+ * @date 2023-03-22
+ */
+public interface XxpCardInfoMapper
+{
+    /**
+     * 查询
+     *
+     * @param id 主键
+     * @return 巡查信息
+     */
+    public XxpCardInfo selectXxpCardInfoById(Long id);
+
+    /**
+     * 查询列表
+     *
+     * @param xxpCardInfo 巡查信息
+     * @return 白名单集合
+     */
+    public List<XxpCardInfo> selectXxpCardInfoList(XxpCardInfo xxpCardInfo);
+
+
+    /**
+     * 新增巡查信息
+     *
+     * @param xxpCardInfo 巡查信息
+     * @return 结果
+     */
+    public int insertXxpCardInfo(XxpCardInfo xxpCardInfo);
+
+    /**
+     * 修改
+     *
+     * @param xxpCardInfo 巡查信息
+     * @return 结果
+     */
+    public int updateXxpCardInfo(XxpCardInfo xxpCardInfo);
+
+    /**
+     * 删除
+     *
+     * @param id 主键
+     * @return 结果
+     */
+    public int deleteXxpCardInfoById(Long id);
+
+    /**
+     * 批量删除
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteXxpCardInfoByIds(Long[] ids);
+
+    /**
+     * 根据卡号查询是否有门禁
+     * @param cardNum
+     * @return
+     */
+    List<Map<String,Object>> selectXxpCardInfoByCard(String cardNum);
+
+
+    /**
+     * 根据电子信息牌查询
+     * @param cardNum
+     * @return
+     */
+    XxpCardInfo selectXxpInfoByCard(String cardNum);
+
+    /**
+     * 根据卡号和密码查询是否密码是否正确
+     * @param cardNum
+     * @param pwd
+     * @return
+     */
+    int selectPwdCountByPwd(@Param("cardNum") String cardNum, @Param("pwd") String pwd);
+}

+ 78 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpClassifyDetailedMapper.java

@@ -0,0 +1,78 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.XxpClassifyDetail;
+import com.zd.laboratory.domain.vo.XxpClassifyDetailVO;
+
+import java.util.List;
+
+/**
+ * 信息牌类目详情 Mapper接口
+ *
+ * @author zd
+ * @date 2023-03-22
+ */
+public interface XxpClassifyDetailedMapper
+{
+    /**
+     * 查询
+     *
+     * @param id 主键
+     * @return 信息牌类目
+     */
+    public XxpClassifyDetail selectXxpClassifyDetailedById(Long id);
+
+    /**
+     * 查询列表
+     *
+     * @param classifyDetailed 信息牌类目详情
+     * @return 集合
+     */
+    public List<XxpClassifyDetailVO> selectXxpClassifyDetailedList(XxpClassifyDetailVO classifyDetailed);
+
+
+    /**
+     * 新增信息牌类目详情
+     *
+     * @param classifyDetailed 信息牌类目详情
+     * @return 结果
+     */
+    public int insertXxpClassifyDetailed(XxpClassifyDetail classifyDetailed);
+
+    /**
+     * 修改
+     *
+     * @param classifyDetailed 信息牌类目详情
+     * @return 结果
+     */
+    public int updateXxpClassifyDetailed(XxpClassifyDetail classifyDetailed);
+
+    /**
+     * 删除
+     *
+     * @param id 主键
+     * @return 结果
+     */
+    public int deleteXxpClassifyDetailedById(Long id);
+
+    /**
+     * 批量删除
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteXxpClassifyDetailedByIds(Long[] ids);
+
+    /**
+     * 根据实验室id查询主要类别
+     * @param subjectId
+     * @return
+     */
+    public List<XxpClassifyDetail> selectXxpClassifyBySubjectId(Long subjectId);
+
+    /**
+     * 查询实验室下的类目配置
+     * @param classifyDetailVO
+     * @return
+     */
+    public List<XxpClassifyDetailVO> selectXxpClassifyDetailedByPara(XxpClassifyDetailVO classifyDetailVO);
+}

+ 69 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/XxpClassifyMapper.java

@@ -0,0 +1,69 @@
+package com.zd.laboratory.mapper;
+
+import com.zd.laboratory.domain.XxpClassify;
+import java.util.List;
+
+/**
+ * 信息牌类目 Mapper接口
+ *
+ * @author zd
+ * @date 2023-03-22
+ */
+public interface XxpClassifyMapper
+{
+    /**
+     * 查询
+     *
+     * @param id 主键
+     * @return 信息牌类目
+     */
+    public XxpClassify selectXxpClassifyById(Long id);
+
+    /**
+     * 查询列表
+     *
+     * @param xxpClassify 信息牌类目
+     * @return 白名单集合
+     */
+    public List<XxpClassify> selectXxpClassifyList(XxpClassify xxpClassify);
+
+
+    /**
+     * 新增信息牌类目
+     *
+     * @param xxpClassify 信息牌类目
+     * @return 结果
+     */
+    public int insertXxpClassify(XxpClassify xxpClassify);
+
+    /**
+     * 修改
+     *
+     * @param xxpClassify 信息牌类目
+     * @return 结果
+     */
+    public int updateXxpClassify(XxpClassify xxpClassify);
+
+    /**
+     * 删除
+     *
+     * @param id 主键
+     * @return 结果
+     */
+    public int deleteXxpClassifyById(Long id);
+
+    /**
+     * 批量删除
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteXxpClassifyByIds(Long[] ids);
+
+    /**
+     * 查询信息牌类目根据实验室id
+     * @param id
+     * @return
+     */
+    List<XxpClassify> selectXxpClassifySubjectById(Long id);
+}

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


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio