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

Merge commit '96643b8d7c9d5addf383064d112c70e0d5cbaf32' into pre

linfutong пре 2 година
родитељ
комит
b409ca253c
54 измењених фајлова са 920 додато и 222 уклоњено
  1. 27 0
      release/sql/db_sql_v2.1-hotfix.sql
  2. 1 1
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/constant/RiskPlanConstants.java
  3. 3 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java
  4. 5 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLaboratoryFallbackFactory.java
  5. 59 0
      zd-common/common-core/src/main/java/com/zd/common/core/alert/DingTalkAlert.java
  6. 1 1
      zd-model/src/main/java/com/zd/model/domain/R.java
  7. 40 5
      zd-model/src/main/java/com/zd/model/entity/Algorithm.java
  8. 1 1
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/face/utils/FileUtil.java
  9. 103 29
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/CheckService.java
  10. 4 9
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/monitor/HardwareDeviceMonitor.java
  11. 1 1
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/controller/SpeakerController.java
  12. 15 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/service/ISpeakerService.java
  13. 31 0
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/service/impl/SpeakerServiceImpl.java
  14. 5 0
      zd-modules/zd-base/pom.xml
  15. 2 2
      zd-modules/zd-base/src/main/java/com/zd/base/BaseApplicaion.java
  16. 1 1
      zd-modules/zd-base/src/main/java/com/zd/base/app/controller/SysUserApi.java
  17. 2 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java
  18. 11 19
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  19. 6 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabRiskPlanLevel.java
  20. 11 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/LabSubjectAccessRecordVo.java
  21. 10 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/vo/ViolationNewVo.java
  22. 13 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/ApkFileUpLoadMapper.java
  23. 2 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareMapper.java
  24. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabSubjectAccessRecordMapper.java
  25. 13 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mqtt/service/impl/SubMessageSendManager.java
  26. 5 5
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/PushMsgService.java
  27. 104 43
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java
  28. 33 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/controller/ApkFileUpLoadController.java
  29. 10 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/controller/OneMachineController.java
  30. 18 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/domain/ApkUpload.java
  31. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/AlgorithmService.java
  32. 13 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ApkFileUpLoadService.java
  33. 2 14
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/AlgorithmServiceImpl.java
  34. 27 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/ApkFileUpLoadServiceImpl.java
  35. 4 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabMessageContentServiceImpl.java
  36. 6 9
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabRiskPlanServiceImpl.java
  37. 3 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSecurityApplyServiceImpl.java
  38. 111 10
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectAccessRecordServiceImpl.java
  39. 6 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabViolationServiceImpl.java
  40. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabWarnPushMessageServiceImpl.java
  41. 18 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/command/Control.java
  42. 5 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/constant/SocketTypes.java
  43. 0 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/service/SocketService.java
  44. 66 23
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/AlgorithmMapper.xml
  45. 55 9
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/ApkFileUploadMapper.xml
  46. 2 1
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorLayoutMapper.xml
  47. 1 1
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabBuildFloorMapper.xml
  48. 1 1
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabCheckRecordDetailsMapper.xml
  49. 20 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml
  50. 3 4
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanAbnormalLogMapper.xml
  51. 4 2
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanMapper.xml
  52. 18 2
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSubjectAccessRecordMapper.xml
  53. 8 5
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabViolationMapper.xml
  54. 1 1
      zd-modules/zd-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

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

@@ -16,3 +16,30 @@ ALTER TABLE sys_user MODIFY COLUMN nick_name VARCHAR(100);
 /*     添加时间:2023-2-28                 ****/
 /************************************************/
 alter table lab_check_record_details modify column jcx_id varchar(50) COMMENT '检查项id';
+
+/************************************************/
+/*     更新表: lab_algorithm    ****/
+/*     字段: original_img  ****/
+/*     添加人:xxf                    ****/
+/*     添加时间:2023-3-6                 ****/
+/************************************************/
+ALTER TABLE lab_algorithm ADD original_img varchar(255) DEFAULT NULL COMMENT '原始图';
+
+/************************************************/
+/*     更新表: lab_algorithm    ****/
+/*     字段: original_img  ****/
+/*     添加人:xxf                    ****/
+/*     添加时间:2023-3-8                ****/
+/************************************************/
+ALTER TABLE lab_algorithm ADD resp_code bigint(20) DEFAULT NULL COMMENT '算法请求状态码';
+ALTER TABLE lab_algorithm ADD resp_data varchar(2000) DEFAULT NULL COMMENT '算法请求返回实体';
+ALTER TABLE lab_algorithm ADD update_time datetime DEFAULT NULL COMMENT '更新时间';
+
+/************************************************/
+/*     更新表: apk_upload    ****/
+/*     字段: file_data  ****/
+/*     添加人:xxf                    ****/
+/*     添加时间:2023-3-10                 ****/
+/************************************************/
+ALTER TABLE apk_upload ADD file_data varchar(255) DEFAULT NULL COMMENT '文件信息';
+ALTER TABLE apk_upload ADD apk_info varchar(800) DEFAULT NULL COMMENT '信息说明';

+ 1 - 1
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/constant/RiskPlanConstants.java

@@ -31,6 +31,6 @@ public interface RiskPlanConstants {
     /**
      * 消息推送公司名称
      */
-    String LAB_SAFETY_MANAGEMENT_SYSTEM = "【实验室安全系统】";
+    String LAB_SAFETY_MANAGEMENT_SYSTEM = "【实验室安全智能】";
 
 }

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

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

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

@@ -261,6 +261,11 @@ public class RemoteLaboratoryFallbackFactory implements FallbackFactory<RemoteLa
             }
 
             @Override
+            public R update(Algorithm algorithm) {
+                return R.fail("修改算法失败:" + cause.getMessage());
+            }
+
+            @Override
             public R getCheckInfo(Long id) {
                 return R.fail("获取实验室检查项失败:" + cause.getMessage());
             }

+ 59 - 0
zd-common/common-core/src/main/java/com/zd/common/core/alert/DingTalkAlert.java

@@ -0,0 +1,59 @@
+package com.zd.common.core.alert;
+
+import com.zd.common.core.utils.HttpUtils;
+import com.zd.common.core.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>钉钉告警</p>
+ *
+ * @author linft
+ * @version 1.0
+ * @date 3/2/2023
+ */
+@Component
+public class DingTalkAlert {
+
+    /**
+     * 告警类应用
+     */
+    private static String SUBJECT = "设备监控";
+
+    private static Boolean dingTalkNotice;
+    private static String dingTalkSubject;
+    private static String dingTalkUrl;
+
+    @Value("${monitor.alert.dingTalkNotice}")
+    public void setDingTalkNotice(Boolean dingTalkNotice) {
+        this.dingTalkNotice = dingTalkNotice;
+    }
+
+    @Value("${monitor.alert.dingTalkSubject}")
+    public void setDingTalkSubject(String dingTalkSubject) {
+        this.dingTalkSubject = dingTalkSubject;
+    }
+
+    @Value("${monitor.alert.dingTalkUrl}")
+    public void setDingTalkUrl(String dingTalkUrl) {
+        this.dingTalkUrl = dingTalkUrl;
+    }
+
+    /**
+     * 发送告警
+     * @param content 告警内容描述
+     * @return
+     */
+    public static String sendAlert(String content) {
+        if (dingTalkNotice != null && dingTalkNotice && StringUtils.isNotEmpty(dingTalkUrl)) {
+            StringBuffer buffer = new StringBuffer();
+            buffer.append("【" + dingTalkSubject +"--"+ SUBJECT + "】\n");
+            buffer.append(content);
+            //封装请求内容
+            String msg = "{\"msgtype\": \"text\",\"text\": {\"content\":\"" + buffer.toString() + "\"}}";
+            return HttpUtils.sendPost(dingTalkUrl, msg, "application/json", null);
+        }
+        return "告警未启动或参数未配置!";
+    }
+
+}

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

@@ -36,7 +36,7 @@ public class R<T> implements Serializable {
     }
 
     public static <T> R<T> ok(T data) {
-        return restResult(data, SUCCESS, null);
+        return restResult(data, SUCCESS, "操作成功");
     }
 
     public static <T> R<T> ok(T data, Integer count) {

+ 40 - 5
zd-model/src/main/java/com/zd/model/entity/Algorithm.java

@@ -8,6 +8,7 @@ import java.util.Date;
 
 /**
  * 算法结果
+ *
  * @Author: zhoupan
  * @Date: 2021/11/26/15:33
  * @Description:
@@ -26,7 +27,16 @@ public class Algorithm {
     private String parseResultMsg;
     @ApiModelProperty("是否报警")
     private Integer isAlarm;
+    @ApiModelProperty("原始图片")
+    private String originalImg;
+    @ApiModelProperty("算法请求状态码")
+    private Long respCode;
 
+    @ApiModelProperty("算法请求返回的json串")
+    private String respData;
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
     /**
      * 只有签到检查存在
      */
@@ -39,7 +49,7 @@ public class Algorithm {
 
     private String algorithmName;
 
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
 
@@ -99,7 +109,6 @@ public class Algorithm {
         this.algorithmType = algorithmType;
     }
 
-
     public String getAlgorithmResult() {
         return algorithmResult;
     }
@@ -108,9 +117,8 @@ public class Algorithm {
         this.algorithmResult = algorithmResult;
     }
 
-
     public int getStatus() {
-       return status;
+        return status;
     }
 
     public void setStatus(int status) {
@@ -118,7 +126,6 @@ public class Algorithm {
     }
 
     public String getAlgorithmName() {
-
         return algorithmName;
     }
 
@@ -133,4 +140,32 @@ public class Algorithm {
     public void setIsAlarm(Integer isAlarm) {
         this.isAlarm = isAlarm;
     }
+
+    public String getOriginalImg() {
+        return originalImg;
+    }
+
+    public void setOriginalImg(String originalImg) {
+        this.originalImg = originalImg;
+    }
+
+    public Long getRespCode() {
+        return respCode;
+    }
+
+    public void setRespCode(Long respCode) {
+        this.respCode = respCode;
+    }
+
+    public String getRespData() {
+        return respData;
+    }
+
+    public void setRespData(String respData) {
+        this.respData = respData;
+    }
+
+    public Date getUpdateTime() {        return updateTime;    }
+
+    public void setUpdateTime(Date updateTime) {        this.updateTime = updateTime;    }
 }

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

+ 103 - 29
zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/CheckService.java

@@ -111,6 +111,13 @@ public class CheckService {
             if (StringUtils.isNull(labCheckInObj)) {
                 return R.fail(700, "未配置检查项");
             }
+            //上传原始图片
+            String orgImgUrl = "";
+            R<SysFile> r = remoteFileService.upload(file);
+            //logger.info("【调用算法服务】 原文件上传结果:"+JSONObject.toJSONString(r));
+            if (r.getCode() == 200) {
+                orgImgUrl = r.getData().getUrl();
+            }
             String labSkipped = "0";
             String labCheckCount = "2";
             Object labSkippedObj = map.get("skipped");
@@ -129,28 +136,32 @@ public class CheckService {
                 AlgorithmYml.CheckValid checkValid = algorithmYml.getCheckValid(Integer.valueOf(code));
                 MultiValueMap<String, Object> params = getStringObjectMultiValueMap(checkValid, String.valueOf(id));
                 HttpEntity<MultiValueMap<String, Object>> files = getHttpEntityMap(toFile, params);
-                logger.info("===============4=================");
+                //添加一条算法请求记录
+                R alg = insertRequestRecordLog(orgImgUrl, subId, checkValid);
+                logger.info("【调用算法服务】 添加算法调用日志,添加结果:"+JSONObject.toJSONString(alg));
                 ImgPostResponse<AnalysisReturnData> send = HttpUtils.sendV5(restTemplateLocal, files, algorithmYml);
+                //算法记录更新
+                if (alg.getCode() == 200) {
+                    try {
+                        updateRequestRecordLog(alg.getData() != null?Long.valueOf(alg.getData()+""):null, send);
+                        logger.info("【调用算法服务】 更新算法调用日志");
+                    } catch (Exception e) {
+                        logger.error("【调用算法服务】 更新日志异常,异常信息",e);
+                    }
+                }
+                //判断算法
                 if (send == null || send.getStatus_code() != 1000) {
                     assert send != null;
-                    logger.error("==================4.1==================="+send.getStatus_code()+"==========="+send.getMessage());
+                    logger.error("【调用算法服务】 算法服务调用失败,响应信息:"+ JSONObject.toJSONString(send));
                     return R.fail("算法服务错误,请重试!");
                 }
-                logger.info("===============5=================");
-                R algorithm = saveAlgorithmV5(send, checkValid);
-                if (algorithm.getCode() != 200) {
-                    logger.error("==============="+algorithm.getCode()+"=================");
-                    return algorithm;
-                }
-                logger.info("===============6=================");
                 AnalysisReturnData data = send.getData();
                 Map<String, Object> result = (Map<String, Object>) data.getResult();
-                logger.info("=========================7==============="+result.toString());
                 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", ""));
-                //通过
+                logger.info("【调用算法服务】 算法请求日志打印:算法ID:{},请求结果:{}", code, algorithmData.getOrDefault("is_alert", ""));
+                //通过
                 if (algorithmData.getOrDefault("is_alert", "").toString().equals("false") && !objects.isEmpty()) {
                     alarmNum++;
                 } else {
@@ -176,13 +187,81 @@ public class CheckService {
                 return R.ok();
             }
         } catch (Exception e) {
-            logger.error("e.getMessage:"+e.getMessage());
-            e.printStackTrace();
+            logger.error("【算法服务异常】异常信息",e);
         }
         return R.fail();
     }
 
     /**
+     * 添加日志记录
+     * @param fileUrl
+     * @param subId
+     * @param checkValid
+     * @return
+     */
+    private R<Long> insertRequestRecordLog(String fileUrl, Long subId, AlgorithmYml.CheckValid checkValid) {
+        Algorithm algorithm = new Algorithm();
+        algorithm.setOriginalImg(fileUrl);
+        algorithm.setSubId(subId);
+        algorithm.setAlgorithmType("image");
+        algorithm.setAlgorithmName(checkValid.getAlgorithmName());
+        //logger.info("【算法服务】 添加日志记录实体:"+JSONObject.toJSONString(algorithm));
+        return laboratoryService.saveAlgorithmData(algorithm);
+    }
+
+
+    /**
+     * 算法调用日志更新
+     * @param id
+     * @param send
+     */
+    private void updateRequestRecordLog(Long id,ImgPostResponse<AnalysisReturnData> send) {
+        Algorithm algorithm = new Algorithm();
+        algorithm.setId(id);
+        //请求成功
+        if (send != null && send.getStatus_code() == 1000) {
+            AnalysisReturnData data =  send.getData();
+            //识别后的图片
+            String picture = data.getRet_image();
+            String header = "data:image/jpeg;base64,"+picture;
+            MultipartFile multipartFile = Base64DecodedMultipartFile.base64ToMultipart(header);
+            R<SysFile> sysFileR = remoteFileService.upload(multipartFile);
+            String imageUrl = sysFileR.getData().getUrl();
+            algorithm.setAlgorithmResult(imageUrl);
+            //识别id
+            algorithm.setSignId(Long.parseLong(data.getCid()));
+            //是否报警
+            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");
+            if(algorithmData.getOrDefault("is_alert", "").toString().equals("false") && objects.size()>0){
+                algorithm.setIsAlarm(0);
+            }else{
+                algorithm.setIsAlarm(1);
+            }
+            algorithm.setStatus(1);
+        } else {
+            algorithm.setStatus(0);
+        }
+        //存原始数据
+        AnalysisReturnData respData = send != null?send.getData():null;
+        if (respData != null) {
+            respData.setRet_image("Removed to save respBody");
+            respData.setSrc_image("Removed to save respBody");
+            ImgPostResponse<AnalysisReturnData> response = new ImgPostResponse<>();
+            response.setData(respData);
+            response.setStatus_code(send.getStatus_code());
+            response.setMessage(send.getMessage());
+            algorithm.setRespData(JSONObject.toJSONString(response));
+            algorithm.setRespCode(send.getStatus_code());
+        }
+        algorithm.setUpdateTime(new Date());
+        //logger.info("【算法服务】 更新日志实体信息:"+JSONObject.toJSONString(algorithm));
+        laboratoryService.update(algorithm);
+    }
+
+    /**
      * @param id 进出记录ID
      */
     public R checkAndCommit(String code, MultipartFile file, Long id) {
@@ -239,20 +318,8 @@ public class CheckService {
             apply = R.fail("算法服务返回数据错误,请联系管理员!");
             return apply;
         } finally {
-//            //无论成功失败,插入记录数据,异步请求远程接口
+           //无论成功失败,插入记录数据,异步请求远程接口
             send(code, id, f, apply.getMsg());
-//            //保存识别记录
-//            String r = send == null ? null : send.toJSONString();
-//           sendSginAccessLogService.saveAlgorithmResult(cereataAlgorithm(r, "image", f, apply.getMsg(), id, fail.getData()));
-//            //持久化
-//            Map<String, Object> data = (Map<String, Object>) send.get("data");
-//           /* Object srcImage =  data.get("src_image");
-//            String srcImg = this.generateImage(srcImage.toString(),algorithmYml.getImgTemp());*/
-//            data.put("src_img", fileR.getData().getUrl());
-//            data.put("type", "image");
-//            data.put("algorithmName", checkValid.getAlgorithmName());
-////            restTemplateLocal.postForEntity("http://192.168.1.17:9218/algorithm/save",data,String.class).getBody();
-//            laboratoryService.saveData(Covert(data));
         }
         //=========算法服务返回结果验证结束
         logger.info(apply.toString());
@@ -263,7 +330,6 @@ public class CheckService {
         return apply;
     }
 
-
     /**
      * 三合一
      *
@@ -299,12 +365,16 @@ public class CheckService {
 
     public Algorithm CovertV5(Map<String, Object> data) {
         Algorithm algorithm = new Algorithm();
+        algorithm.setId(Long.valueOf(data.get("id").toString()));
         algorithm.setAlgorithmType(data.get("type").toString());
         algorithm.setAlgorithmResult(data.get("src_img").toString());
         algorithm.setSubId(Long.valueOf(data.get("aid").toString()));
         algorithm.setSignId(Long.valueOf(data.get("cid").toString()));
         algorithm.setAlgorithmName(data.get("algorithmName").toString());
         algorithm.setIsAlarm(Integer.parseInt(data.get("isAlarm").toString()));
+        algorithm.setOriginalImg(data.get("originalImg").toString());
+        algorithm.setRespData(data.get("requestData").toString());
+        algorithm.setUpdateTime(new Date());
         algorithm.setStatus(0);
         return algorithm;
     }
@@ -567,7 +637,7 @@ public class CheckService {
      * @param send
      * @param checkValid
      */
-    private R saveAlgorithmV5(ImgPostResponse<AnalysisReturnData> send,AlgorithmYml.CheckValid checkValid){
+    private R saveAlgorithmV5(Long id,MultipartFile file,ImgPostResponse<AnalysisReturnData> send,AlgorithmYml.CheckValid checkValid){
         String picture = send.getData().getRet_image();
         String header = "data:image/jpeg;base64,"+picture;
         MultipartFile multipartFile = Base64DecodedMultipartFile.base64ToMultipart(header);
@@ -589,9 +659,13 @@ public class CheckService {
         map.put("aid", data.getAid());
         map.put("cid", data.getCid());
         map.put("src_img", imageUrl);
+        //map.put("originalImg", originalUrl);
         map.put("type", "image");
         map.put("algorithmName", checkValid.getAlgorithmName());
+        map.put("id",id);
+        map.put("requestData", JSONObject.toJSONString(send));
         logger.info("=======================map.tostring()"+map.toString());
         return laboratoryService.saveAlgorithmData(CovertV5(map));
+       // return laboratoryService.update(CovertV5(map));
     }
 }

+ 4 - 9
zd-modules/zd-algorithm/src/main/java/com/zd/alg/monitor/HardwareDeviceMonitor.java

@@ -2,6 +2,7 @@ package com.zd.alg.monitor;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.zd.common.core.alert.DingTalkAlert;
 import com.zd.common.core.redis.RedisService;
 import com.zd.common.core.utils.HttpUtils;
 import com.zd.common.core.utils.StringUtils;
@@ -39,12 +40,6 @@ public class HardwareDeviceMonitor {
     @Value("${monitor.alert.dingTalkNotice}")
     private Boolean dingTalkNotice;
 
-    @Value("${monitor.alert.dingTalkSubject}")
-    private String dingTalkSubject;
-
-    @Value("${monitor.alert.dingTalkUrl}")
-    private String dingTalkUrl;
-
     private String redisPrefix = "HARDWARE_DEVICE_MONITOR:";
 
     private long expire = 30L;
@@ -57,7 +52,7 @@ public class HardwareDeviceMonitor {
 
     @Scheduled(cron = "0 */9 * * * ?")
     public void checkPowerUse() {
-        if (dingTalkNotice != null && dingTalkNotice && StringUtils.isNotEmpty(dingTalkUrl)) {
+        if (dingTalkNotice != null && dingTalkNotice) {
             log.info("【设备监听提醒】 开始执行检查..............");
             ResultData result = remoteLabHardwareService.statistics();
             if (result != null && result.getCode() == HttpStatus.SUCCESS && result.getData() != null) {
@@ -86,7 +81,7 @@ public class HardwareDeviceMonitor {
                             if (!map.isEmpty()) {
                                 Set<String> code = map.keySet();
                                 StringBuffer buffer = new StringBuffer();
-                                buffer.append("【"+dingTalkSubject+"-设备掉线提醒】离线继电器信息:\n");
+                                buffer.append("系统接入继电器设备离线信息:\n");
                                 boolean isSend = Boolean.FALSE;
                                 for (String key : code) {
                                     Integer num = redisService.getCacheObject(redisPrefix+key);
@@ -102,7 +97,7 @@ public class HardwareDeviceMonitor {
                                 //通知
                                 if (isSend) {
                                     String msg = "{\"msgtype\": \"text\",\"text\": {\"content\":\"" + buffer.toString() + "\"}}";
-                                    String rs = HttpUtils.sendPost(dingTalkUrl, msg, "application/json", null);
+                                    DingTalkAlert.sendAlert(msg);
                                     //log.info("【设备监听提醒】 钉钉通知响应:" + rs);
                                 }
                             }

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

@@ -214,7 +214,7 @@ public class SpeakerController {
         }
         text=text.replace("https","http");
         text=text.replace("http://lab.sxitdlc.com/labAppTest/","http://192.168.1.43/labSystem/");
-        iSpeakerService.textParseVoiceAppIps(text,playVo,1,10000);
+        iSpeakerService.textParseVoiceAppIps(text,playVo,1,1000);
         Map<String,Object> map=new HashMap<>();
         map.put("text",text);
         String date=DateUtils.parseDateToStr("HH:MM",new Date());

+ 15 - 0
zd-modules/zd-algorithm/src/main/java/com/zd/alg/speaker/service/ISpeakerService.java

@@ -106,4 +106,19 @@ public interface ISpeakerService {
      * @param ip 设备ip
      */
     boolean stopPlayMusic(String sn,String ip);
+
+
+
+    /**
+     * 情况音乐队列
+     * @param sns 设备sn
+     */
+    boolean clearPlayMusic(String[] sns);
+
+
+    /**
+     * 情况音乐队列
+     * @param sns 设备sn
+     */
+    boolean stopPriorityMusic(String[] sns);
 }

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

@@ -187,6 +187,9 @@ public class SpeakerServiceImpl implements ISpeakerService {
 //        }
         String deviceIp =playVoList.get(0).getDeviceIp();
         PlayBatchVo playBatchVo=commonPatchTextUrlVoice(texts,playVoList,playNum,level);
+        //清空原来队列
+        //stopPriorityMusic(playBatchVo.getSns());
+        //clearPlayMusic(playBatchVo.getSns());
         boolean isTrue = invokePost(JSONObject.toJSON(playBatchVo).toString(), deviceIp,1, playVoList.get(0).getPort());
         if (isTrue) {
             textParseVoiceAppIps(texts,playVoList,playNum,level);
@@ -212,6 +215,34 @@ public class SpeakerServiceImpl implements ISpeakerService {
         return tokenRefresh(responseStr);
     }
 
+    @Override
+    public boolean clearPlayMusic(String[] sns) {
+        String remoteUrlIp = remoteAddress.getProtocol() + "://" + remoteAddress.getTtsIp() + ":" + remoteAddress.getRemotePort() + "/api/sendtodevice";
+        String token = getToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("sns", sns);
+        jsonObject.put("type", "req");
+        jsonObject.put("name", "songs_queue_clear");
+        logger.info("********************" + jsonObject.toString() + "********************");
+        String responseStr = okHttpRequest.doPostJson(remoteUrlIp, token, jsonObject.toString());
+        logger.info("responseStr:+++++++++++++++++++++++++++" + responseStr + "+++++++++++++++++++++++++");
+        return tokenRefresh(responseStr);
+    }
+
+    @Override
+    public boolean stopPriorityMusic(String[] sns) {
+        String remoteUrlIp = remoteAddress.getProtocol() + "://" + remoteAddress.getTtsIp() + ":" + remoteAddress.getRemotePort() + "/api/sendtodevice";
+        String token = getToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("sns", sns);
+        jsonObject.put("type", "req");
+        jsonObject.put("name", "priority_task_stop");
+        logger.info("********************" + jsonObject.toString() + "********************");
+        String responseStr = okHttpRequest.doPostJson(remoteUrlIp, token, jsonObject.toString());
+        logger.info("responseStr:+++++++++++++++++++++++++++" + responseStr + "+++++++++++++++++++++++++");
+        return tokenRefresh(responseStr);
+    }
+
     /**
      * 认证失败刷新token
      * @param requestStr

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

@@ -24,6 +24,11 @@
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
         <!-- SpringCloud Alibaba Sentinel -->
         <!--<dependency>
             <groupId>com.alibaba.cloud</groupId>

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

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

+ 1 - 1
zd-modules/zd-base/src/main/java/com/zd/base/app/controller/SysUserApi.java

@@ -75,7 +75,7 @@ public class SysUserApi {
      */
     @PostMapping("/genSign")
     @ApiOperation(value = "小程序电子签名抠图生成图片")
-    public R<String> getPsPictureSign(@RequestParam("file") MultipartFile file){
+    public R<String> getPsPictureSign(MultipartFile file){
         try {
             // 抠图工具类 169为灰色
             return R.ok(ImageUtils.transparent(file.getInputStream(), 152));

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

@@ -53,7 +53,8 @@ public class AlgorithmController extends BaseController {
     @PostMapping("/saveAlgorithm")
     public ResultData saveAlgorithmData(@RequestBody Algorithm algorithm) {
         logger.info("===================记录添加========================");
-        return  ResultData.success(algorithmService.saveData(algorithm));
+        Object flg =algorithmService.saveData(algorithm);
+        return  ResultData.success(Integer.valueOf(flg.toString())>0?algorithm.getId():Integer.valueOf(flg.toString()));
     }
 
 

+ 11 - 19
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java

@@ -5,7 +5,7 @@ import com.zd.common.core.utils.ReUtil;
 import com.zd.laboratory.api.entity.CabinetLock;
 import com.zd.laboratory.api.entity.CabinetV2Lock;
 import com.zd.laboratory.mqtt.service.impl.CommonSend;
-import com.zd.laboratory.netty.PushMsgService;
+import com.zd.laboratory.netty.NettyPushMsgService;
 import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.utils.CRCCHECK;
@@ -36,8 +36,6 @@ public class DeviceRemoteController {
     private RedisService redisService;
     @Autowired
     private CommonSend commonSend;
-    @Autowired
-    private PushMsgService pushMsgService;
 
     @Value("${sys.lockTimer:30}")
     private Integer lockTimer;
@@ -55,15 +53,6 @@ public class DeviceRemoteController {
 
     @PostMapping("/V2/openLock")
     public ResultData cabinetV2OpenLock(@RequestBody CabinetV2Lock cabinetV2Lock){
-
-        /*try {
-            Thread.sleep(lockTimer * 1000);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        return ResultData.success("开锁成功");*/
-
-        // socket 方式发送
         String instruct = CRCCHECK.getOpenLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
         String relayCode = cabinetV2Lock.getRelayCode();
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
@@ -71,10 +60,13 @@ public class DeviceRemoteController {
         try {
 //            ops.write(ReUtil.hexStringToByteArray(instruct));
 //            ops.flush();
-            pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
-            logger.info("柜锁开锁指令:" + instruct);
+            for (int i = 0; i < 5; i++) {
+                NettyPushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
+                logger.info("柜锁开锁指令:" + instruct);
+
+                Thread.sleep(1000);
+            }
 
-            Thread.sleep(2000);
 //            ops.write(ReUtil.hexStringToByteArray(instruct));
 //            ops.flush();
 //
@@ -89,10 +81,10 @@ public class DeviceRemoteController {
 
 //                ops.write(ReUtil.hexStringToByteArray(instruct));
 //                ops.flush();
-                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
-                timer-=2;
+                NettyPushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
+                timer-=3;
 
-                Thread.sleep(1900);
+                Thread.sleep(3000);
                 status = redisService.getCacheObject(relayCode + ":" + cabinetV2Lock.getLockId());
                 logger.info("柜锁开锁锁状态查询:" + instruct + ",开锁结果:" + status);
                 if(status != null && status == 1){
@@ -174,7 +166,7 @@ public class DeviceRemoteController {
 
 //                ops.write(ReUtil.hexStringToByteArray(instruct));
 //                ops.flush();
-                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
+                NettyPushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
                 timer-=2;
 
                 Thread.sleep(1900);

+ 6 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabRiskPlanLevel.java

@@ -148,6 +148,12 @@ public class LabRiskPlanLevel implements Serializable {
     private String topName;
 
     /**
+     * 院校实验室名称预案名称:值
+     */
+    @TableField(exist = false)
+    private String content;
+
+    /**
      * 楼层id
      */
     @TableField(exist = false)

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

@@ -82,6 +82,9 @@ public class LabSubjectAccessRecordVo extends LabSubjectAccessRecord {
     @ApiModelProperty(value = "进出记录的ids")
     private Long[] accessIds;
 
+    @ApiModelProperty(value = "违规名称")
+    private String violationName;
+
     private List<LabPhotoInspection> photoList = new ArrayList<>();
 
     public String getNickName() {
@@ -149,6 +152,14 @@ public class LabSubjectAccessRecordVo extends LabSubjectAccessRecord {
         this.accessIds = accessIds;
     }
 
+    public String getViolationName() {
+        return violationName;
+    }
+
+    public void setViolationName(String violationName) {
+        this.violationName = violationName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

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

@@ -110,6 +110,8 @@ public class ViolationNewVo {
 
     private Long deductionVal;
 
+    private String treatmentMessage;
+
     public Long getCreact_id() {
         return creact_id;
     }
@@ -302,4 +304,12 @@ public class ViolationNewVo {
     public void setViolationReasons(String violationReasons) {
         this.violationReasons = violationReasons;
     }
+
+    public String getTreatmentMessage() {
+        return treatmentMessage;
+    }
+
+    public void setTreatmentMessage(String treatmentMessage) {
+        this.treatmentMessage = treatmentMessage;
+    }
 }

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

@@ -33,4 +33,17 @@ public interface ApkFileUpLoadMapper {
      */
     public int deleteApkUploadByIds(Long id);
 
+    /***
+     * 根据id查询详情
+     * @param id
+     * @return
+     */
+    public ApkUploadVo getById(Long id);
+
+    /****
+     * 修改
+     * @param apkUploadVo
+     * @return
+     */
+    public int upload(ApkUploadVo apkUploadVo);
 }

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

@@ -58,6 +58,8 @@ public interface LabHardwareMapper {
      */
     List<LabHardware> selectLabHardwareStatusByRelay(LabHardware labHardware);
 
+    List<LabHardwareVO> selectHardwareAndSubInfoByRelay(LabHardware labHardware);
+
     /**
      * 查询硬件列表
      *

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

@@ -137,6 +137,13 @@ public interface LabSubjectAccessRecordMapper {
     public int outTimeRecord();
 
     /**
+     * 查询违规记录列表
+     *
+     * @return 结果
+     */
+    public List<LabSubjectAccessRecordVo> selOutTimeRecord();
+
+    /**
      * 个人工作台 实验室进出统计
      */
     Map<String, Object> queryRecordStatistics(LabSubjectAccessRecordVo labSubjectAccessRecord);

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

@@ -5,8 +5,10 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.zd.algorithm.api.speaker.feign.RemoteSpeakService;
 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.SpringUtils;
+import com.zd.laboratory.api.entity.SensorFunctionStatus;
 import com.zd.laboratory.api.vo.SubFunction;
 import com.zd.laboratory.domain.LabHardware;
 import com.zd.laboratory.event.LabMessageEvent;
@@ -27,6 +29,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 实验室消息发送管理 -- 对外使用该类进行操作
@@ -49,6 +52,9 @@ public class SubMessageSendManager {
     @Autowired
     private RemoteSpeakService remoteSpeakService;
 
+    @Autowired
+    private RedisService redisService;
+
     /**
      * 发送疏散线路通知
      *
@@ -116,8 +122,14 @@ public class SubMessageSendManager {
             return;
         }
         MessageBody messageBody = getMessageBody(subFunction);
+        logger.error("消息推送一体机开始");
         //仅发送一次
-        commonSend.send(getFunctionSubTopic(subId), messageBody, SendMode.ONCE);
+        if (redisService.getCacheObject("onePcSub"+subId)==null){
+            logger.error("消息推送中.......");
+            redisService.setCacheObject("onePcSub"+subId,subId,15L, TimeUnit.SECONDS);
+            commonSend.send(getFunctionSubTopic(subId), messageBody, SendMode.ONCE);
+        }
+
     }
 
     /**

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

@@ -2,16 +2,16 @@ package com.zd.laboratory.netty;
 
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
-import org.springframework.stereotype.Service;
 
-@Service
-public class PushMsgService {
+import java.io.IOException;
 
-    public void push(String relayCode, byte[] bytes) {
+public class NettyPushMsgService {
+
+    public static void push(String relayCode, byte[] bytes) throws IOException {
         // 客户端ID
         ChannelHandlerContext channelHandlerContext = ChannelMap.getChannel(relayCode);
         if (null == channelHandlerContext) {
-            throw new RuntimeException("柜锁已离线");
+            throw new IOException("netty推送设备失败:" + relayCode);
         }
         channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(bytes));
     }

+ 104 - 43
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java

@@ -1,15 +1,27 @@
 package com.zd.laboratory.netty;
 
+import com.zd.common.core.alert.DingTalkAlert;
 import com.zd.common.core.redis.RedisService;
-import com.zd.common.core.utils.ReUtil;
+import com.zd.common.core.utils.DateUtils;
 import com.zd.common.core.utils.SpringUtils;
+import com.zd.laboratory.domain.LabAbnormal;
+import com.zd.laboratory.domain.LabHardware;
+import com.zd.laboratory.domain.vo.LabHardwareVO;
+import com.zd.laboratory.mapper.LabAbnormalMapper;
+import com.zd.laboratory.mapper.LabHardwareMapper;
+import com.zd.laboratory.socket.constant.JXCTPacket;
+import com.zd.laboratory.socket.constant.SocketTypes;
 import com.zd.laboratory.socket.runner.TCPServer;
+import com.zd.laboratory.socket.service.BaseRouter;
 import com.zd.laboratory.utils.CRCCHECK;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandler;
 import lombok.extern.slf4j.Slf4j;
 
-import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -17,69 +29,70 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 public class NettyServerHandler implements ChannelInboundHandler {
-
+    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
     /**
-    * 读取客户端发送的消息
-    */
+     * 读取客户端发送的消息
+     */
     @Override
     public void channelRead(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
         byte[] msg  = (byte[]) o;
         String data = TCPServer.bytesToHexString(msg).toUpperCase();
         log.info("netty服务端接受消息为:" + data);
-        if(data.equals("6862")){
-            return;
-        }
-
-        log.info("netty服务端接受消息转10进制为:" + ByteBuffer.wrap(msg).getLong());
-//        if(data.startsWith(SocketTypes.LOCK_PREFIX)){
-//        if(data.startsWith("33")){
 
-        String relayCode = data.substring(0, 108);
-//        33 31 20 33 30 20 36 33 20 33 36 20 36 34 20 33 37 20 33 36 20 33 33 20 33 31 20 33 35 20 33 31 20 33 35 20 33 30 20 36 33 20 33 33 20 33 35 20 33 32 20 33 37 20
-
-//        05 05 00 01 ee 00 d0 2e
+        if(data.startsWith(SocketTypes.RELAY_PREFIX.replaceAll(" ", "").toUpperCase())){
 
+            analyticRelayData(data, channelHandlerContext);
+        }else if(data.startsWith(SocketTypes.SZZQ_PREFIX)){
+            // 采集器规范定义 hex发送  结构  31 11 01 01  后两位递增方式增加
+            String relayCode = data.substring(0, 8);
             // 将通道加入ChannelMap
-            ChannelMap.getChannelMap().put(data, channelHandlerContext);
-//        }else {
-//            if(data.length() != 12){
-//                log.info("netty柜锁回调指令非状态指令!" + data);
-//                return;
-//            }
-
-//            AtomicReference<String> relayCode = new AtomicReference<>("");
-//            ChannelMap.getChannelMap().entrySet().forEach(a -> {
-//                if(a.getValue() == channelHandlerContext){
-//                    relayCode.set(a.getKey());
-//                }
-//            });
+            if(relayCode.length() == data.length()){
+                ChannelMap.getChannelMap().put(data, channelHandlerContext);
 
-            if(data.length() > relayCode.length()) {
+            }else if(data.length() > relayCode.length()) {
                 data = data.replaceAll(relayCode, "");
                 // 柜锁bit 位
                 long bit = CRCCHECK.getBitByCommand(data);
                 // 1开锁状态 0关锁状态
                 int status = CRCCHECK.getLockStatus(data);
 
-                log.info("netty柜锁回调:" + relayCode + ":" + bit + ",回调结果" + (status == 1 ? "开启": "关闭") + ",指令:" + data);
+                String openData = CRCCHECK.getOpenLockOrder((int)bit).replace(" ", "").toUpperCase();
+                if(data.equals(openData)){
+                    log.info("netty柜锁指令回调:" + relayCode + ":" + bit + ",指令:" + data);
+                    return;
+                }
+
+                log.info("netty柜锁状态回调:" + relayCode + ":" + bit + ",回调结果" + (status == 1 ? "开启": "关闭") + ",指令:" + data);
 
                 RedisService redisService = SpringUtils.getBean(RedisService.class);
                 redisService.setCacheObject(relayCode + ":" + bit, status, 3 * 60L, TimeUnit.SECONDS);
             }
+        }
+    }
+
+    private void analyticRelayData(String data, ChannelHandlerContext channelHandlerContext) {
+        JXCTPacket packet = new JXCTPacket(data);
+        BaseRouter baseRouter = BaseRouter.routerMap.get(packet.order);
+        if (baseRouter == null) {
+            log.info("netty继电器上报不识别指令:" + packet.order);
+            return;
+        }
+
+        log.info("netty继电器状态上报:" + packet.toString());
+        ChannelMap.getChannelMap().put(packet.deviceNumber, channelHandlerContext);
+        baseRouter.routePacket(packet);
 
     }
 
+
     /**
-    * @description: 读取消息后开始的操作
-    */
+     * @description: 读取消息后开始的操作
+     */
     @Override
     public void channelReadComplete(ChannelHandlerContext channelHandlerContext) throws Exception {
-        String instruct = CRCCHECK.getOpenLockOrder(1);
 
-        byte[] bytes = ReUtil.hexStringToByteArray(instruct);
-//        log.info("netty服务端数据发送数据:" + instruct);
-//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(bytes);
-//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(instruct);
+//        log.info("netty服务端数据发送数据:" + NettyServer.inetPort);
+//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(NettyServer.inetPort);
 //        channelFuture.addListener(new ChannelFutureListener() {
 //            @Override
 //            public void operationComplete(ChannelFuture channelFuture) throws Exception {
@@ -93,8 +106,8 @@ public class NettyServerHandler implements ChannelInboundHandler {
     }
 
     /**
-    * @description: 异常发生时
-    */
+     * @description: 异常发生时
+     */
     @Override
     public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception {
         throwable.printStackTrace();
@@ -139,11 +152,59 @@ public class NettyServerHandler implements ChannelInboundHandler {
     @Override
     public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {
         log.info("netty客户端断开连接" + channelHandlerContext.toString());
-        ChannelMap.getChannelMap().entrySet().forEach(a -> {
-            if(a.getValue() == channelHandlerContext.channel()){
+
+        for (Map.Entry<String, ChannelHandlerContext> a : ChannelMap.getChannelMap().entrySet()) {
+
+            if(a.getValue() == channelHandlerContext){
                 ChannelMap.getChannelMap().remove(a.getKey());
+                log.info("netty客户端断开连接清除key: " + a.getKey());
+
+                executorService.schedule(new Runnable() {
+                    @Override
+                    public void run() {
+
+                        String relayCode = a.getKey();
+
+                        if(ChannelMap.getChannelMap().get(relayCode) != null){
+                            return;
+                        }
+
+                        LabHardwareMapper labHardwareMapper = SpringUtils.getBean(LabHardwareMapper.class);
+
+                        LabHardware labHardware = new LabHardware();
+                        labHardware.setRelayCode(relayCode);
+
+                        List<LabHardwareVO> list = labHardwareMapper.selectHardwareAndSubInfoByRelay(labHardware);
+
+                        if(list.size() == 0){
+                            return;
+                        }
+
+                        LabAbnormalMapper labAbnormalMapper = SpringUtils.getBean(LabAbnormalMapper.class);
+                        for (LabHardwareVO hardwareVO : list) {
+                            LabAbnormal labAbnormal = new LabAbnormal();
+                            labAbnormal.setName(hardwareVO.getName());
+                            labAbnormal.setType(1);
+                            labAbnormal.setAbnormalReason("netty断开链接超过三分钟");
+                            labAbnormal.setHardwareId(hardwareVO.getId());
+                            labAbnormal.setDeptId(hardwareVO.getDeptId());
+                            labAbnormal.setDeptName(hardwareVO.getDeptName());
+                            labAbnormal.setCreateBy("系统");
+                            labAbnormal.setCreateTime(DateUtils.getNowDate());
+                            labAbnormalMapper.insertLabAbnormal(labAbnormal);
+
+
+                            String content = hardwareVO.getDeptName() + hardwareVO.getSubjectName() + hardwareVO.getName()
+                                    + "netty连接已掉线三分钟未连接!请确认处理!";
+                            DingTalkAlert.sendAlert(content);
+                        }
+
+                    }
+                }, 180, TimeUnit.SECONDS);
+
+                break;
             }
-        });
+        }
     }
 
 

+ 33 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/controller/ApkFileUpLoadController.java

@@ -96,6 +96,28 @@ public class ApkFileUpLoadController extends BaseController {
         return getDataTable(list);
     }
 
+    @PreAuthorize(hasPermi = "laboratory:apkupload:list")
+    @GetMapping("/apkUploadList")
+    @ApiOperation("查询apk上传的版本信息")
+    public TableDataInfo apkUploadList(ApkUploadVo apkLogVo) {
+        startPage("create_time", "descending");
+        List<ApkUploadVo> list = apkFileUpLoadService.selectApkFileUpLoadList(apkLogVo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation(value = "查询apk版本详情")
+    @PreAuthorize(hasPermi = "laboratory:apkupload:query")
+    @GetMapping("/getById")
+    public ResultData getById(Long id) {
+        return ResultData.success(apkFileUpLoadService.getById(id));
+    }
+
+    @Log(title = "修改APK包")
+    @PreAuthorize(hasPermi = "laboratory:apkupload:edit")
+    @PostMapping("/editApk")
+    public ResultData editApk(ApkUploadVo apkUploadVo) {
+        return ResultData.success(apkFileUpLoadService.upload(apkUploadVo));
+    }
 
     /**
      * log新增升级日志
@@ -159,4 +181,15 @@ public class ApkFileUpLoadController extends BaseController {
     public ResultData remove(@PathVariable Long apkId) {
         return ResultData.result(apkFileUpLoadService.deleteApkUploadByIds(apkId));
     }
+
+    /**
+     * 删除apk上传的包信息
+     */
+    @ApiOperation(value = "删除apk上传的包信息")
+    @PreAuthorize(hasPermi = "laboratory:apkupload:remove")
+    @Log(title = "删除apk上传的包信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/apkupload/{apkId}")
+    public ResultData delete(@PathVariable Long apkId) {
+        return ResultData.result(apkFileUpLoadService.deleteApkUploadByIds(apkId));
+    }
 }

+ 10 - 4
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/controller/OneMachineController.java

@@ -225,10 +225,10 @@ public class OneMachineController extends BaseController {
         }else {
             url=fileConfigUtils.getRemoteUrl()+sysUser.getAvatar();
         }*/
-        //通过配置动态加载域名
-        String url = fileConfigUtils.getFileDomainApp() + sysUser.getAvatar();
-        String imgUrl = UrlFormatUtils.getHttpsORHttpUrl(url);
-        sysUser.setAvatar(imgUrl);
+//        //通过配置动态加载域名
+//        String url = fileConfigUtils.getFileDomainApp() + sysUser.getAvatar();
+//        String imgUrl = UrlFormatUtils.getHttpsORHttpUrl(url);
+//        sysUser.setAvatar(imgUrl);
 
         //判断当天是否已签到,没有签出
 //        int num=labSubjectAccessRecordService.getRecordNoOut(userResult.getData().getUserId());
@@ -330,6 +330,12 @@ public class OneMachineController extends BaseController {
         if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
             throw new ServiceException("用户卡号:" + username + " 不存在");
         }
+        //查询用户使用资格
+        SysUser user = userResult.getData();
+        //通过配置动态加载域名
+        String url = fileConfigUtils.getFileDomainApp() + user.getAvatar();
+        String imgUrl = UrlFormatUtils.getHttpsORHttpUrl(url);
+        user.setAvatar(imgUrl);
         return userResult;
     }
 

+ 18 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/domain/ApkUpload.java

@@ -33,6 +33,12 @@ public class ApkUpload extends BaseEntity {
     @ApiModelProperty("1是一体机2学习内容")
     private Integer onepcType;
 
+    @ApiModelProperty("信息描述")
+    private String apkInfo;
+
+    @ApiModelProperty("文件信息")
+    private String fileData;
+
     public Long getId() {
         return id;
     }
@@ -80,4 +86,16 @@ public class ApkUpload extends BaseEntity {
     public void setOnepcType(Integer onepcType) {
         this.onepcType = onepcType;
     }
+
+    public String getApkInfo() {        return apkInfo;    }
+
+    public void setApkInfo(String apkInfo) {        this.apkInfo = apkInfo;    }
+
+    public String getFileData() {
+        return fileData;
+    }
+
+    public void setFileData(String fileData) {
+        this.fileData = fileData;
+    }
 }

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

@@ -12,8 +12,8 @@ import java.util.List;
  * @Description:
  */
 public interface AlgorithmService {
-    public List<AlgorithmVO> queryList(AlgorithmVO algorithm);
 
+    List<AlgorithmVO> queryList(AlgorithmVO algorithm);
 
     Object saveData(Algorithm algorithm);
 

+ 13 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ApkFileUpLoadService.java

@@ -94,4 +94,17 @@ public interface ApkFileUpLoadService {
      */
     public int deleteApkUploadByIds(Long apkId);
 
+    /***
+     * 根据id查询详情
+     * @param apkId
+     * @return
+     */
+    public ApkUploadVo getById(Long apkId);
+
+    /****
+     * 修改
+     * @param apkUploadVo
+     * @return
+     */
+    public int upload(ApkUploadVo apkUploadVo);
 }

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

@@ -53,38 +53,26 @@ public class AlgorithmServiceImpl implements AlgorithmService {
             if(algorithmResult!=null) {
                 list.add(algorithmResult);
             }
-            //数据太大了需要分批次处理
-            //首先需要解决 sql 插入的大小限制
-            //"max_allowed_packet = 1M"
-
         }
         while (list.size()>size);
         save(list);
-
     }
 
     /**
      * 批量保存
      * @param list
      */
-    public void save(List<Algorithm> list)
-    {
-        if(CollUtil.isNotEmpty(list))
-        {
+    public void save(List<Algorithm> list) {
+        if (CollUtil.isNotEmpty(list)) {
             algorithmMapper.insertBatchAlgorithm(list);
-
         }
-
     }
 
-
     @Override
     public List<AlgorithmVO> queryList(AlgorithmVO algorithm) {
-
         return algorithmMapper.queryList(algorithm);
     }
 
-
     @Override
     public Object saveData(Algorithm algorithm) {
         List<Algorithm> list = new ArrayList<>();

+ 27 - 4
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/ApkFileUpLoadServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.zd.common.core.exception.ServiceException;
 import com.zd.common.core.annotation.Log;
 import com.zd.common.core.security.TokenService;
+import com.zd.common.core.utils.StringUtils;
 import com.zd.laboratory.domain.LabHardware;
 import com.zd.laboratory.domain.vo.LabHardwareVO;
 import com.zd.laboratory.mapper.ApkFileUpLoadMapper;
@@ -23,10 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * Controller
@@ -186,4 +184,29 @@ public class ApkFileUpLoadServiceImpl implements ApkFileUpLoadService {
     public int deleteApkUploadByIds(Long apkId) {
         return apkFileUpLoadMapper.deleteApkUploadByIds(apkId);
     }
+
+    /***
+     * 根据id查询详情
+     * @param apkId
+     * @return
+     */
+    @Override
+    public ApkUploadVo getById(Long apkId) {
+        return apkFileUpLoadMapper.getById(apkId);
+    }
+
+    /****
+     * 修改
+     * @param apkUploadVo
+     * @return
+     */
+    @Override
+    public int upload(ApkUploadVo apkUploadVo) {
+        if(StringUtils.isNull(apkUploadVo.getId())){
+            throw new ServiceException("主键为空!");
+        }
+        apkUploadVo.setUpdateTime(new Date());
+        apkUploadVo.setUpdateBy(tokenService.getLoginUser().getSysUser().getNickName());
+        return apkFileUpLoadMapper.upload(apkUploadVo);
+    }
 }

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

@@ -98,6 +98,7 @@ public class LabMessageContentServiceImpl implements ILabMessageContentService {
 
 
     private final String smsFormat = "{}: {},发生风险预案,{}";
+    private final String smsFormatString = "【实验室安全智能】{}发生{}{}";
 
     /**
      * 查询消息发布
@@ -203,7 +204,9 @@ public class LabMessageContentServiceImpl implements ILabMessageContentService {
             deptName = subAddrrs.get(0).getBuildName();
         }
 
-        String format = StrUtil.format(smsFormat, deptName, subject.getName(), StrUtil.isBlank(labRiskPlanLevel.getMessage()) ? labRiskPlanLevel.getRiskName() : labRiskPlanLevel.getMessage());
+//        String format = StrUtil.format(smsFormat, deptName, subject.getName(), StrUtil.isBlank(labRiskPlanLevel.getMessage()) ? labRiskPlanLevel.getRiskName() : labRiskPlanLevel.getMessage());
+        String format = StrUtil.format(smsFormatString, labRiskPlanLevel.getTopName(), labRiskPlanLevel.getRiskName(), StrUtil.isBlank(labRiskPlanLevel.getMessage()) ? "" : labRiskPlanLevel.getMessage());
+        logger.info("new format = {}",format);
         String phone = null;
         String userids = null;
         try {

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

@@ -771,10 +771,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
                 R r = remoteCameraService.stopRecord(labHardware.getIpAddress());
                 log.info("录制视频结束返回结果打印={}", JSON.toJSONString(r));
                 if (r.getCode() == HttpStatus.SUCCESS) {
-                    com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(r.getData()));
-                    if (jsonObject.getInteger("code") == HttpStatus.SUCCESS) {
-                        recordVideo = jsonObject.getString("data");
-                    }
+                    recordVideo = String.valueOf(r.getData());
                 } else {
                     log.info("结束录制视频失败!");
                 }
@@ -921,7 +918,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
                     String funNum1 = sensorFunctionStatusListMap.get(SenseType.getByCode(rps.getSensorType())).get(0).getFunNum();
                     if (funNum1.equals(sensorFunc.getFunNum())) {
                         getJsonStr(riskPlanJson, sensorFunc);
-                        labRiskPlanLevel.setTopName(labRiskPlanLevel.getTopName() + "-" + sensorFunc.getDescribe() + ":" + sensorFunc.getVal());
+                        labRiskPlanLevel.setContent(labRiskPlanLevel.getTopName() + "-" + sensorFunc.getDescribe() + ":" + sensorFunc.getVal());
                         sb.append(sensorFunc.getDescribe()).append("、");
                     }
                 }
@@ -958,7 +955,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
             //向一体机推送语音播报
             String str = StringUtils.isBlank(labRiskPlanLevel.getVoicebroadcast()) ? "" : labRiskPlanLevel.getVoicebroadcast();
             try {
-                messageSendService.sendOnepcSubNews(subFunction.getSubId(), 2, RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getTopName() + str);
+                messageSendService.sendOnepcSubNews(subFunction.getSubId(), 2, RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getContent() + str);
             } catch (Exception e) {
                 log.error("向一体机推送语音播报异常:" + e);
             }
@@ -967,12 +964,12 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
             messageSendService.sendWranFunctionToSub(subFunction.getSubId());
 
             //向一体机发送预警消息展示
-            insertMachineContent(subFunction.getSubId(), RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getTopName() + str);
+            insertMachineContent(subFunction.getSubId(), RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getContent() + str);
 
             //首页消息通知
             messageSendService.SendBigViewUpdate(BigViewDataType.SUB_WRAN_MESSAGE);
 
-            //发送大屏左下角预警消息
+            //发送大屏左下角预警消息 (电话短信)
             labMessageContentService.sendWranMessage(subFunction.getSubId(), labRiskPlanLevel, groupId);
 
             //首页预案流程通知
@@ -1274,7 +1271,7 @@ public class LabRiskPlanServiceImpl extends ServiceImpl<LabRiskPlanMapper, LabRi
         LabWarnPushMessage labWarnPushMessage = new LabWarnPushMessage();
         labWarnPushMessage.setRiskGroup(groupId);
         String string = StringUtils.isBlank(labRiskPlanLevel.getInformation()) ? "" : labRiskPlanLevel.getInformation();
-        labWarnPushMessage.setContext(RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getTopName() + string);
+        labWarnPushMessage.setContext(RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getContent() + string);
         labWarnPushMessage.setPushType(WarnMessageTypeEnum.voice);
         labWarnPushMessage.setWarnId(labRiskPlanLevel.getRiskPlanId());
         labWarnPushMessage.setSubId(subjectId);

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

@@ -28,6 +28,7 @@ import com.zd.model.domain.per.PerPrefix;
 import com.zd.model.entity.LoginUser;
 import com.zd.model.entity.SysUser;
 import com.zd.system.api.feign.RemoteUserService;
+import org.json.JSONString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -228,7 +229,7 @@ public class LabSecurityApplyServiceImpl implements ILabSecurityApplyService
 
         //获取登录用户信息
         SysUser sysUser = tokenService.getLoginUser().getSysUser();
-
+        log.info("安全准入申请,登录用户信息1:"+ JSONObject.toJSONString(sysUser));
         //学生信息非空校验
         if(StringUtils.isBlank(labSecurityApplyVO.getSysUser().getNickName())
                 || StringUtils.isBlank(labSecurityApplyVO.getSysUser().getPhonenumber())
@@ -268,6 +269,7 @@ public class LabSecurityApplyServiceImpl implements ILabSecurityApplyService
 
         //获取登录用户信息
         //SysUser sysUser = tokenService.getLoginUser().getSysUser();
+        log.info("安全准入申请,登录用户信息2:"+ JSONObject.toJSONString(sysUser));
         labSecurityApplyVO.setUserId(sysUser.getUserId());
         labSecurityApplyVO.setUserName(sysUser.getNickName());
         labSecurityApplyVO.setUserType(sysUser.getUserType());

+ 111 - 10
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectAccessRecordServiceImpl.java

@@ -1,5 +1,14 @@
 package com.zd.laboratory.service.impl;
 
+import com.zd.algorithm.api.smartlock.feign.fallback.RemoteSmartlockFallbackFactory;
+import com.zd.common.core.utils.StringUtils;
+import com.zd.exam.api.feign.RemoteExamService;
+import com.zd.laboratory.domain.*;
+import com.zd.laboratory.domain.vo.ElPassConfigdetailVO;
+import com.zd.laboratory.domain.vo.ViolationNewVo;
+import com.zd.laboratory.mapper.LabNegativeListRecordsMapper;
+import com.zd.laboratory.mapper.LabViolationScoreSiteMapper;
+import com.zd.laboratory.service.ILabBlacklistService;
 import com.zd.model.constant.SecurityConstants;
 import com.zd.model.domain.R;
 import com.zd.model.domain.ResultData;
@@ -9,8 +18,6 @@ import com.zd.common.core.utils.DateUtils;
 import com.zd.common.core.utils.SecurityUtils;
 import com.zd.common.core.annotation.DataScope;
 import com.zd.common.core.security.TokenService;
-import com.zd.laboratory.domain.LabOnepc;
-import com.zd.laboratory.domain.LabSubjectAccessRecord;
 import com.zd.laboratory.domain.vo.LabSubjectAccessRecordVo;
 import com.zd.laboratory.mapper.LabSubjectAccessRecordMapper;
 import com.zd.laboratory.mapper.LabViolationMapper;
@@ -21,14 +28,13 @@ import com.zd.laboratory.service.ILabPhotoInspectionService;
 import com.zd.laboratory.service.ILabSubjectAccessRecordService;
 import com.zd.system.api.feign.RemoteUserService;
 import com.zd.model.entity.SysUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * 实验室进出记录Service业务层处理
@@ -57,6 +63,23 @@ public class LabSubjectAccessRecordServiceImpl implements ILabSubjectAccessRecor
     @Autowired
     private RemoteUserService userService;
 
+    @Autowired
+    private LabViolationScoreSiteMapper scoreSiteMapper;
+
+    @Autowired
+    private RemoteExamService remoteExamService;
+
+    @Autowired
+    private LabNegativeListRecordsMapper negativeListRecordsMapper;
+
+    @Autowired
+    private LabViolationServiceImpl labViolationServiceImpl;
+
+    @Autowired
+    private ILabBlacklistService blacklistService;
+
+    private static final Logger log = LoggerFactory.getLogger(LabSubjectAccessRecordServiceImpl.class);
+
     /**
      * 查询实验室进出记录
      *
@@ -213,14 +236,92 @@ public class LabSubjectAccessRecordServiceImpl implements ILabSubjectAccessRecor
      * @return 结果
      */
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public int outTimeRecord() {
-        labSubjectAccessRecordMapper.outTimeRecord();
-        int i = labSubjectAccessRecordMapper.outTimeChangeStatus();
-        if(i>0)
+        //查询超过24小时违规人员列表
+        List<LabSubjectAccessRecordVo> subAccessRecordList = labSubjectAccessRecordMapper.selOutTimeRecord();
+
+//        labSubjectAccessRecordMapper.outTimeRecord();
+        int i = 0;
+        if(subAccessRecordList.size()>0)
         {
+            i = labSubjectAccessRecordMapper.outTimeChangeStatus();
             subMessageSendManager.SendBigViewUpdate(BigViewDataType.SUB_ONLINE);
+
+            List<LabViolationScoreSite> scoreSiteList = scoreSiteMapper.selectLabViolationScore();
+            Map<String,String> allMapScore = new HashMap <>();
+            Optional.ofNullable(scoreSiteList).orElseGet(Collections::emptyList)
+                    .stream()
+                    .forEach(a->{
+                        allMapScore.put(a.getViolationName(),a.getViolationVal());
+                    });
+
+
+            Optional.ofNullable(subAccessRecordList).orElseGet(Collections::emptyList)
+                    .parallelStream()
+                    .forEach(a->{
+                        try{
+                            //校验规则
+                            Map<String, Object> p = new HashMap<>();
+                            p.put("userId", a.getJoinUserId());
+                            R<Object> r = remoteExamService.findByUserId(p);
+                            List<Map> list = (List<Map>) r.getData();
+                            if (list != null && list.size() > 0) {
+                                Integer creditScore = Integer.valueOf(list.get(0).get("creditScore").toString())-Integer.parseInt(allMapScore.get(a.getViolationName()));
+                                //这里查询积分规则详情数据
+                                Map<String,Object> markconfigMap = new HashMap<>();
+                                R<Object> data = remoteExamService.getPointsConfig(markconfigMap);
+                                int flag=0;
+                                if (data!=null) {
+                                    String code = data.getCode() + "";
+                                    if (code.equals("200")) {
+                                        Map<String, Object> pointsConfig = (Map<String, Object>) data.getData();
+                                        //获取积分详情列表
+                                        List<Map<String, Object>> pointsConfigDetail = (List<Map<String, Object>>) pointsConfig.get("configDetailList");
+                                        ElPassConfigdetailVO result = blacklistService.getIntegralMatchingRules(pointsConfigDetail,Integer.valueOf(creditScore));
+
+                                        ViolationNewVo vo = new ViolationNewVo();
+                                        vo.setUserId(a.getJoinUserId());
+                                        vo.setDeptId(a.getDeptId());
+                                        vo.setCreact_id(-2L);
+                                        vo.setReason("-1");
+                                        vo.setViolationReasons(a.getViolationName());
+                                        vo.setDeductionVal(Long.parseLong(allMapScore.get(a.getViolationName())));
+                                        vo.setCreditScore(Long.parseLong(allMapScore.get(a.getViolationName())));
+
+                                        vo.setLaboratoryId(a.getSubjectId());
+                                        vo.setLaboratoryName(a.getSubjectName());
+                                        vo.setUserName(a.getNickName());
+                                        if(StringUtils.isNotNull(result)){
+                                            vo.setWarningStatus(result.getWarningStatus());
+                                            vo.setInterviewStatus(result.getInterviewStatus());
+                                            vo.setTestStatus(result.getTestStatus());
+                                            vo.setLearnStatus(result.getLearnStatus());
+                                            vo.setPracticeStatus(result.getPracticeStatus());
+                                            vo.setHandleDay(result.getHandleDay());
+                                            vo.setTreatmentMessage(a.getViolationName());
+                                            vo.setLearnHour(result.getLearnHour());
+                                            vo.setLearnMinute(result.getLearnMinute());
+                                            if(StringUtils.isNotNull(result.getNumberTopics())){
+                                                vo.setNumberTopics(Integer.parseInt(result.getNumberTopics()+""));
+                                            }else{
+                                                vo.setNumberTopics(null);
+                                            }
+                                            if(StringUtils.isNotNull(result.getNumberAccuracy())){
+                                                vo.setNumberAccuracy(Integer.parseInt(result.getNumberAccuracy()+""));
+                                            }else{
+                                                vo.setNumberAccuracy(null);
+                                            }
+                                        }
+                                        labViolationServiceImpl.addViolationHistory(vo);
+                                    }
+                                }
+                            }
+                        }catch (Exception e){
+                            log.error("执行违规失败"+e);
+                        }
+                    });
         }
+
         return i;
     }
 

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

@@ -466,7 +466,12 @@ public class LabViolationServiceImpl implements ILabViolationService {
             map.put("deductPoints", scoreSite.getViolationVal());
         }
         map.put("pointsType", "1");
-        map.put("reason", "手动新增违规记录");
+        if(StringUtils.isNotNull(vo.getTreatmentMessage())){
+            map.put("reason", vo.getTreatmentMessage());
+        }else{
+            map.put("reason", "手动新增违规记录");
+        }
+
         remoteExamService.deductionPoints(map);
         LabViolation labViolation = labViolationMapper.selectByUserId(vo.getUserId());
         LabNegativeListRecords records = negativeListRecordsMapper.findByUserId(vo.getUserId());

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

@@ -82,7 +82,7 @@ public class LabWarnPushMessageServiceImpl implements ILabWarnPushMessageService
                 LabWarnPushMessage labWarnPushMessage = new LabWarnPushMessage();
                 labWarnPushMessage.setRiskGroup(groupId);
                 String str= StringUtils.isBlank(labRiskPlanLevel.getMessage()) ? "" : labRiskPlanLevel.getMessage();
-                labWarnPushMessage.setContext(RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getTopName() + str);
+                labWarnPushMessage.setContext(RiskPlanConstants.LAB_SAFETY_MANAGEMENT_SYSTEM + labRiskPlanLevel.getContent() + str);
                 labWarnPushMessage.setPushType(WarnMessageTypeEnum.SMS);
                 labWarnPushMessage.setWarnId(labRiskPlanLevel.getRiskPlanId());
                 labWarnPushMessage.setSubId(subId);

+ 18 - 4
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/command/Control.java

@@ -1,8 +1,11 @@
 package com.zd.laboratory.socket.command;
 
+import com.zd.laboratory.netty.ChannelMap;
+import com.zd.laboratory.netty.NettyPushMsgService;
 import com.zd.laboratory.socket.constant.JXCTPacket;
 import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.util.SocketUtils;
+import io.netty.channel.ChannelHandlerContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,9 +80,14 @@ public class Control {
         if (bit > (relayCount - 1) || state > 1 || state < 0) {
             return "指令错误";
         }
-        OutputStream ops = TCPServer.cacheMap.get(deviceNumber);
-        if (ops == null) {
-            return "设备不在线";
+        OutputStream ops = null;
+        ChannelHandlerContext channelHandlerContext = ChannelMap.getChannelMap().get(deviceNumber);
+        if (channelHandlerContext == null) {
+
+            ops = TCPServer.cacheMap.get(deviceNumber);
+            if(ops == null){
+                return "设备不在线";
+            }
         }
         //控制位
         StringBuilder bitBuilder = new StringBuilder();
@@ -108,7 +116,13 @@ public class Control {
         log.info(deviceNumber + " 下发控制:" + bitBuilder + "  hex:" + packet.toString());
         byte[] sendBody = packet.encode();
         try {
-            ops.write(sendBody);
+            if(channelHandlerContext == null){
+                log.info("socket方式下发继电器控制");
+                ops.write(sendBody);
+            }else {
+                log.info("netty方式下发继电器控制");
+                NettyPushMsgService.push(deviceNumber, sendBody);
+            }
         } catch (IOException e) {
             log.error("下发失败:" + e.toString());
             TCPServer.cacheMap.remove(deviceNumber);

+ 5 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/constant/SocketTypes.java

@@ -20,4 +20,9 @@ public class SocketTypes {
      * 柜锁数据
      */
     public static final String LOCK_PREFIX = "28";
+
+    /**
+     * 深圳智嵌采集器器
+     */
+    public static final String SZZQ_PREFIX = "3111";
 }

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

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

+ 66 - 23
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/AlgorithmMapper.xml

@@ -1,64 +1,107 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zd.laboratory.mapper.AlgorithmMapper">
 
     <select id="queryList" resultType="com.zd.model.entity.AlgorithmVO" parameterType="com.zd.model.entity.AlgorithmVO">
-        select la.*,su.nick_name as userName,ls.`name` as subName from   lab_algorithm la
-              left join lab_subject_access_record lsar
-                        ON lsar.id = la.sign_id
-              left join sys_user su
-                        on su.user_id= lsar.join_user_id
-              left join lab_subject ls
-                        on ls.id= lsar.subject_id
+        select la.id,la.algorithm_type,la.algorithm_result,la.parse_result,
+        la.parse_result_msg,la.original_img,la.resp_code,
+        la.sign_id,la.sub_id,la.create_time,la.status,la.algorithm_name,
+        la.is_alarm, la.update_time, DATE_FORMAT(la.update_time,'%Y-%m-%d %H:%i:%s') outTime,la.resp_data,
+        su.nick_name as userName,ls.`name` as subName from lab_algorithm la
+        left join lab_subject_access_record lsar
+        ON lsar.id = la.sign_id
+        left join sys_user su
+        on su.user_id= lsar.join_user_id
+        left join lab_subject ls
+        on ls.id= lsar.subject_id
         <where>
-            <if test="algorithmType != null "> and a.hardware_id = #{hardwareId}</if>
-            <if test="inTime!=null"> and la.create_time BETWEEN #{inTime} AND #{outTime}</if>
-            <if test="status!=-1"> and la.status =#{status}</if>
-            <if test="isAlarm!=null"> and la.is_alarm =#{isAlarm}</if>
+            <if test="algorithmType != null ">and a.hardware_id = #{hardwareId}</if>
+            <if test="inTime!=null">and la.create_time BETWEEN #{inTime} AND #{outTime}</if>
+            <if test="status!=-1">and la.status =#{status}</if>
+            <if test="isAlarm!=null">and la.is_alarm =#{isAlarm}</if>
         </where>
-         ORDER BY la.id desc
+        ORDER BY la.id desc
     </select>
 
-    <select id="getId"  resultType="com.zd.model.entity.Algorithm">
-        select * from lab_algorithm where id=#{id}
+    <select id="getId" resultType="com.zd.model.entity.Algorithm">
+        select la.id,
+               la.algorithm_type,
+               la.algorithm_result,
+               la.parse_result,
+               la.parse_result_msg,
+               la.original_img,
+               la.resp_code,
+               la.sign_id,
+               la.sub_id,
+               la.create_time,
+               la.status,
+               la.algorithm_name,
+               la.is_alarm
+        from lab_algorithm la
+        where id = #{id}
     </select>
 
-    <insert id="insertBatchAlgorithm" parameterType="com.zd.model.entity.Algorithm" >
+    <insert id="insertBatchAlgorithm" parameterType="com.zd.model.entity.Algorithm" useGeneratedKeys="true"
+            keyProperty="id">
         insert into lab_algorithm
         <trim prefix="(" suffix=")" suffixOverrides=",">
             algorithm_type,
             algorithm_result,
+            original_img,
+            resp_code,
+            resp_data,
             parse_result,
             parse_result_msg,
             sign_id,
             is_alarm,
             sub_id,
             algorithm_name
-         </trim>
+        </trim>
         values
         <foreach collection="list" item="item" separator=",">
             <trim prefix="(" suffix=")" suffixOverrides=",">
                 #{item.algorithmType},
                 #{item.algorithmResult},
+                #{item.originalImg},
+                #{item.respCode},
+                #{item.respData},
                 #{item.parseResult},
                 #{item.parseResultMsg},
                 #{item.signId},
                 #{item.isAlarm},
                 #{item.subId},
-               #{item.algorithmName}
-             </trim>
+                #{item.algorithmName}
+            </trim>
         </foreach>
 
     </insert>
 
     <update id="update" parameterType="com.zd.model.entity.Algorithm">
-        update lab_algorithm set algorithm_type=#{algorithmType},algorithm_name=#{algorithmName} where id=#{id}
+        update lab_algorithm
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="algorithmType != null">algorithm_type = #{algorithmType},</if>
+            <if test="algorithmResult != null">algorithm_result = #{algorithmResult},</if>
+            <if test="parseResult != null">parse_result = #{parseResult},</if>
+            <if test="parseResultMsg != null">parse_result_msg = #{parseResultMsg},</if>
+            <if test="originalImg != null">original_img = #{originalImg},</if>
+            <if test="respCode != null">resp_code = #{respCode},</if>
+            <if test="respData != null">resp_data = #{respData},</if>
+            <if test="signId != null">sign_id = #{signId},</if>
+            <if test="subId != null">sub_id = #{subId},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="algorithmName != null">algorithm_name = #{algorithmName},</if>
+            <if test="isAlarm != null">is_alarm = #{isAlarm},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
     </update>
 
-    <delete id="del"  >
-        delete from lab_algorithm where id=#{id}
+    <delete id="del">
+        delete
+        from lab_algorithm
+        where id = #{id}
     </delete>
 
 </mapper>

+ 55 - 9
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/ApkFileUploadMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zd.laboratory.mapper.ApkFileUpLoadMapper">
 
     <resultMap type="com.zd.laboratory.onemachine.domain.ApkUpload" id="ApkUploadResult">
@@ -11,21 +11,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="version" column="version"/>
         <result property="versionName" column="version_name"/>
         <result property="onepcType" column="onepc_type"/>
+        <result property="apkInfo" column="apk_info"/>
         <result property="createTime" column="create_time"/>
         <result property="createBy" column="create_by"/>
         <result property="updateTime" column="update_time"/>
         <result property="updateBy" column="update_by"/>
         <result property="remark" column="remark"/>
+        <result property="fileData" column="fileData"/>
     </resultMap>
 
-    <select id="selectApkFileUpLoadList" parameterType="com.zd.laboratory.onemachine.domain.ApkUploadVo" resultType="com.zd.laboratory.onemachine.domain.ApkUploadVo">
+    <select id="selectApkFileUpLoadList" parameterType="com.zd.laboratory.onemachine.domain.ApkUploadVo"
+            resultType="com.zd.laboratory.onemachine.domain.ApkUploadVo">
         select ul.*,ul.id apkId from apk_upload ul
         <where>
-            <if test="onepcType != null "> and ul.onepc_type = #{onepcType} </if>
+            <if test="onepcType != null ">and ul.onepc_type = #{onepcType}</if>
+            <if test="versionName != null ">and ul.version_name like concat("%", #{versionName}, "%")</if>
         </where>
     </select>
 
-    <insert id="insertApkFileUpLoad" parameterType="com.zd.laboratory.onemachine.domain.ApkUpload" useGeneratedKeys="true" keyProperty="id">
+    <insert id="insertApkFileUpLoad" parameterType="com.zd.laboratory.onemachine.domain.ApkUpload"
+            useGeneratedKeys="true" keyProperty="id">
         insert into apk_upload
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="apkName != null">apk_name,</if>
@@ -33,28 +38,69 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="version != null">version,</if>
             <if test="versionName != null">version_name,</if>
             <if test="onepcType != null">onepc_type,</if>
+            <if test="apkInfo != null">apk_info,</if>
             <if test="createTime != null">create_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="updateBy != null">update_by,</if>
             <if test="remark != null">remark,</if>
-         </trim>
+            <if test="fileData != null">file_data,</if>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="apkName != null">#{apkName},</if>
             <if test="apkFileUpload != null">#{apkFileUpload},</if>
             <if test="version != null">#{version},</if>
             <if test="versionName != null">#{versionName},</if>
             <if test="onepcType != null">#{onepcType},</if>
+            <if test="apkInfo != null">#{apkInfo},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
             <if test="remark != null">#{remark},</if>
-         </trim>
+            <if test="fileData != null">#{fileData},</if>
+        </trim>
     </insert>
 
-    <delete id="deleteApkUploadByIds" >
-        delete from apk_upload where id = #{id}
+    <delete id="deleteApkUploadByIds">
+        delete
+        from apk_upload
+        where id = #{id}
     </delete>
 
+    <select id="getById" resultType="com.zd.laboratory.onemachine.domain.ApkUploadVo">
+        select id,
+               apk_name,
+               apk_file_upload,
+               version,
+               version_name,
+               onepc_type,
+               apk_info,
+               create_by,
+               create_time,
+               update_by,
+               update_time,
+               remark,
+               file_data
+        from apk_upload
+        where id = #{id}
+    </select>
+
+    <update id="upload" parameterType="com.zd.laboratory.onemachine.domain.ApkUploadVo">
+        update apk_upload
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="apkName != null">apk_name = #{apkName},</if>
+            <if test="apkFileUpload != null">apk_file_upload = #{apkFileUpload},</if>
+            <if test="version != null">version = #{version},</if>
+            <if test="versionName != null">version_name = #{versionName},</if>
+            <if test="onepcType != null">onepc_type = #{onepcType},</if>
+            <if test="apkInfo != null">apk_info = #{apkInfo},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="fileData != null">file_data = #{fileData},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
 </mapper>

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

@@ -57,7 +57,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="searchValue != null  and searchValue != '' ">
                 and (
                   t.room_num like concat('%', #{searchValue}, '%') or
-                  t.room_name like concat('%', #{searchValue}, '%')
+                  t.room_name like concat('%', #{searchValue}, '%') OR
+                  sb.name LIKE CONCAT('%', #{searchValue}, '%')
                 )
             </if>
             <if test="roomType != null "> and t.room_type = #{roomType}</if>

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

@@ -98,7 +98,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <where>
                 (s.admin_id = #{adminId} or find_in_set(#{adminId}, s.safe_user_id))
                 <if test="id != null "> and t.id = #{id}</if>
-                <if test="parentId != null "> and t.id = #{parentId}</if>
+                <if test="parentId != null "> and t.parent_id = #{parentId}</if>
                 <if test="type != null "> and t.`type` = #{type}</if>
             </where>
         </if>

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

@@ -526,7 +526,7 @@
         select
             rd.yh_ms, co.id as optionId, co.code as optionCode, r.zgjz_time
         from
-             lab_check_record_details rd left join lab_check_option co on rd.jcx_id = co.id
+             lab_check_record_details rd left join lab_check_option co on rd.jcx_sstk_num = co.code
                 left join lab_check_record r on rd.check_id = r.id
         where
             rd.check_id = #{checkId}

+ 20 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml

@@ -133,6 +133,26 @@
         </where>
     </select>
 
+    <select id="selectHardwareAndSubInfoByRelay" parameterType="com.zd.laboratory.domain.LabHardware"
+            resultType="com.zd.laboratory.domain.vo.LabHardwareVO">
+        select
+        h.id,
+        h.name,
+        h.subject_id,
+        s.name as subjectName,
+        h.hardware_num,
+        s.dept_id,
+        d.dept_name,
+        h.relay_code
+        from
+        lab_hardware h left join lab_subject s on h.subject_id = s.id
+        left join sys_dept d on s.dept_id = d.dept_id
+        <where>
+            <if test="relayCode != null ">and relay_code = #{relayCode}</if>
+            <if test="hardwareNum != null">and hardware_num = #{hardwareNum}</if>
+        </where>
+    </select>
+
     <select id="selectLabHardwareList" parameterType="com.zd.laboratory.domain.LabHardware"
             resultMap="LabHardwareVOResult">
         <include refid="selectLabHardwareVo"/>

+ 3 - 4
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanAbnormalLogMapper.xml

@@ -113,10 +113,9 @@
     </select>
 
     <select id="queryHappenChart" resultType="java.util.Map">
-
-        select risk_plan_id as riskPlanId,  l.name as riskPlanName, count(1) as count
+        select g.group_name as riskPlanName, count(1) as count
         from lab_risk_plan_abnormal_log p
-            left join lab_risk_plan l on p.risk_plan_id = l.id
+            LEFT JOIN lab_risk_plan_abnormal_group g ON p.group_id = g.id
             left join lab_subject s on p.subject_id = s.id
         <where>
             p.risk_status = 1
@@ -134,7 +133,7 @@
             <!-- 数据范围过滤 -->
             ${params.dataScope}
         </where>
-        GROUP BY p.risk_plan_id
+        GROUP BY g.group_name
         ORDER BY count desc
     </select>
 

+ 4 - 2
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanMapper.xml

@@ -536,10 +536,12 @@
     </select>
     <select id="selectLabRiskPlanByRiskPlanId" resultType="com.zd.laboratory.domain.LabRiskPlan">
             SELECT DISTINCT
-                (CONCAT( d.dept_class_name, d.`dept_name`, s.`name` )) topName,
+<!--                (CONCAT( d.dept_class_name,'-',d.`dept_name`,'-',s.`name` )) topName,-->
+                (CONCAT( d.dept_class_name,'-',s.`name`,'-',lbfl.room_num )) topName,
                 s.`floor_id` floorId
             FROM lab_subject s
-                INNER JOIN sys_dept d ON d.dept_id = s.build_id
+                LEFT JOIN sys_dept d ON d.dept_id = s.build_id
+                LEFT JOIN lab_build_floor_layout lbfl ON lbfl.sub_id = s.id
             WHERE
 	            s.`id` = #{subId}
      </select>

+ 18 - 2
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSubjectAccessRecordMapper.xml

@@ -49,6 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="accessStatus" column="access_status"/>
         <result property="intervalTime" column="interval_time"/>
         <result property="subjectName" column="subject_name"/>
+        <result property="violationName" column="violationName"/>
     </resultMap>
 
     <sql id="selectLabSubjectAccessRecordVo">
@@ -466,8 +467,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <insert id="outTimeRecord">
-        INSERT INTO lab_violation (join_user_id,violation_type,violation_content,subject_id,create_time,dept_id,dept_name,user_id,create_by)
-        SELECT ar.`join_user_id`,1,
+        INSERT INTO lab_violation (user_id,join_user_id,violation_type,violation_content,subject_id,create_time,dept_id,dept_name,user_id,create_by)
+        SELECT ar.`join_user_id`,ar.`join_user_id`,1,
         (SELECT t.dict_label FROM sys_dict_data t WHERE t.dict_type='lab_violation_rules' AND t.dict_value=1),
         ar.`subject_id`,
         NOW(),
@@ -481,4 +482,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <update id="outTimeChangeStatus">
         UPDATE lab_subject_access_record ar INNER JOIN lab_subject st ON ar.`subject_id` = st.`id` SET ar.access_status=3 WHERE ar.`out_time` IS NULL AND TIMESTAMPDIFF(HOUR,ar.in_time,NOW())>=st.sign_time AND ar.access_status=1 and ar.init_flag = 0
     </update>
+
+    <select id="selOutTimeRecord" resultMap="labAccessDetail">
+    SELECT ar.`join_user_id`,1,
+        (SELECT t.dict_label FROM sys_dict_data t WHERE t.dict_type='lab_violation_rules' AND t.dict_value=1) violationName,
+        ar.`subject_id`,
+        st.`name` subject_name,
+        NOW(),
+        ar.`dept_id`,
+        ar.`dept_name`,
+        ar.`user_id`,
+        (SELECT su.nick_name FROM  sys_user su WHERE su.`user_id` = ar.`join_user_id`) nick_name,
+        ar.`create_by`
+         FROM lab_subject_access_record ar inner join lab_subject st on ar.`subject_id` = st.`id`
+         WHERE ar.`out_time` IS NULL AND TIMESTAMPDIFF(HOUR,ar.in_time,NOW())>=st.sign_time AND ar.access_status=1 and ar.init_flag = 0
+    </select>
 </mapper>

+ 8 - 5
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabViolationMapper.xml

@@ -617,12 +617,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                  u.`avatar` as avatar,
                  u.`nick_name` as userName,
                  d.`dept_name` as deptName,
-                 IFNULL(v.`status`,1) as status,
+                 CASE WHEN b.`id` IS NOT NULL THEN 3 ELSE CASE WHEN r.`id` IS NOT NULL THEN 2 ELSE 1 END END AS status,
                  (SELECT COUNT(1) FROM lab_negativelist_history he WHERE he.user_id = u.`user_id`) as violatioNum,
                  IFNULL(v.`negative_list_num`,0) as negativeListCount,
                  IFNULL((SELECT COUNT(1) FROM lab_blackdetail b INNER JOIN lab_blacklist t ON b.black_id = t.id WHERE t.`join_user_id` = u.user_id GROUP BY b.black_id),0) as blackListNum,
-                 r.`credit_score` as totalPoints ,
-                 r.`bonus_points` as bonusPoints,
+                 t.`credit_score` as totalPoints ,
+                 t.`bonus_points` as bonusPoints,
                  (SELECT CONCAT(TRUNCATE(IFNULL(SUM(duration), 0)/3600, 0),'小时',TRUNCATE((IFNULL(SUM(duration), 0)%3600/60), 0),'分钟') FROM el_chapter_learn_record lr WHERE lr.join_user_id = u.`user_id`) studyLen
         FROM
             sys_user u
@@ -630,8 +630,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                            ON v.`join_user_id` = u.`user_id`
                 left JOIN sys_dept d
                            ON u.`dept_id` = d.`dept_id`
-                left JOIN `el_points_record` r
-                           ON u.`user_id`=r.`join_user_id` WHERE u.user_id=#{userid} GROUP BY u.`user_id`
+                left JOIN `el_points_record` t
+                           ON u.`user_id`=t.`join_user_id`
+                LEFT JOIN lab_negative_list_records r ON r.user_id = t.`join_user_id` AND r.is_negative=1
+                LEFT JOIN lab_blacklist b ON b.join_user_id = t.`join_user_id` AND b.blacklist_status = 1
+                        WHERE u.user_id=#{userid} GROUP BY u.`user_id`
     </select>
 
     <update id="updateblackStatus">

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

@@ -356,7 +356,7 @@
 	</select>
 
     <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
-		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} limit 1
+		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag=0  limit 1
 	</select>
 
     <select id="checkPhoneUniqueNotOwn" parameterType="com.zd.model.entity.SysUser" resultMap="SysUserResult">