Bladeren bron

代码合并

linfutong 2 jaren geleden
bovenliggende
commit
a5f3cdc02a
28 gewijzigde bestanden met toevoegingen van 546 en 143 verwijderingen
  1. 1 1
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/constant/RiskPlanConstants.java
  2. 3 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java
  3. 5 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteLaboratoryFallbackFactory.java
  4. 40 5
      zd-model/src/main/java/com/zd/model/entity/Algorithm.java
  5. 103 30
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/forward/serivce/CheckService.java
  6. 2 2
      zd-modules/zd-base/src/main/java/com/zd/base/BaseApplicaion.java
  7. 1 1
      zd-modules/zd-base/src/main/java/com/zd/base/app/controller/SysUserApi.java
  8. 2 2
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java
  9. 4 6
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  10. 6 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/domain/LabRiskPlanLevel.java
  11. 13 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/ApkFileUpLoadMapper.java
  12. 5 5
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/PushMsgService.java
  13. 29 18
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java
  14. 33 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/controller/ApkFileUpLoadController.java
  15. 18 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/onemachine/domain/ApkUpload.java
  16. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/AlgorithmService.java
  17. 13 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ApkFileUpLoadService.java
  18. 2 14
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/AlgorithmServiceImpl.java
  19. 27 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/ApkFileUpLoadServiceImpl.java
  20. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabAbnormalServiceImpl.java
  21. 6 9
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabRiskPlanServiceImpl.java
  22. 86 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectAccessRecordServiceImpl.java
  23. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabWarnPushMessageServiceImpl.java
  24. 18 4
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/command/Control.java
  25. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/constant/SocketTypes.java
  26. 66 23
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/AlgorithmMapper.xml
  27. 55 9
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/ApkFileUploadMapper.xml
  28. 4 2
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabRiskPlanMapper.xml

+ 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());
             }

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

+ 103 - 30
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,17 +365,20 @@ 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;
     }
 
-
     /**
      * @param algorithmResult
      * @param type
@@ -567,7 +636,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 +658,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));
     }
 }

+ 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 - 2
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java

@@ -52,8 +52,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()));
     }
 
 

+ 4 - 6
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;
@@ -63,7 +61,7 @@ public class DeviceRemoteController {
 //            ops.write(ReUtil.hexStringToByteArray(instruct));
 //            ops.flush();
             for (int i = 0; i < 5; i++) {
-                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
+                NettyPushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
                 logger.info("柜锁开锁指令:" + instruct);
 
                 Thread.sleep(1000);
@@ -83,7 +81,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-=3;
 
                 Thread.sleep(3000);
@@ -125,7 +123,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)

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

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

+ 29 - 18
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java

@@ -3,15 +3,16 @@ 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.DateUtils;
-import com.zd.common.core.utils.ReUtil;
 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;
@@ -30,20 +31,20 @@ import java.util.concurrent.TimeUnit;
 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;
-        }
-        // 采集器规范定义 hex发送  结构  31 11 01 01  后两位递增方式增加
-        String relayCode = data.substring(0, 8);
 
-        if(relayCode.startsWith(SocketTypes.SZZQ_PREFIX)){
+        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
             if(relayCode.length() == data.length()){
                 ChannelMap.getChannelMap().put(data, channelHandlerContext);
@@ -67,21 +68,31 @@ public class NettyServerHandler implements ChannelInboundHandler {
                 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 {
@@ -95,8 +106,8 @@ public class NettyServerHandler implements ChannelInboundHandler {
     }
 
     /**
-    * @description: 异常发生时
-    */
+     * @description: 异常发生时
+     */
     @Override
     public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception {
         throwable.printStackTrace();

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

+ 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;
@@ -21,10 +22,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
@@ -177,4 +175,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);
+    }
 }

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

@@ -197,7 +197,7 @@ public class LabAbnormalServiceImpl implements ILabAbnormalService {
     @Override
     public void insertRelayAbnormal(String expiredKey) {
 
-        logger.warn("继电器上报超时:" + expiredKey + " --  上报时长超过10分钟");
+        logger.error("继电器上报超时:" + expiredKey + " --  上报时长超过10分钟");
 
         LabHardware labHardware = new LabHardware();
         labHardware.setRelayCode(expiredKey);

+ 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 = JSON.toJSONString(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);

+ 86 - 4
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectAccessRecordServiceImpl.java

@@ -1,5 +1,6 @@
 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.*;
@@ -27,6 +28,8 @@ 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;
@@ -75,6 +78,8 @@ public class LabSubjectAccessRecordServiceImpl implements ILabSubjectAccessRecor
     @Autowired
     private ILabBlacklistService blacklistService;
 
+    private static final Logger log = LoggerFactory.getLogger(LabSubjectAccessRecordServiceImpl.class);
+
     /**
      * 查询实验室进出记录
      *
@@ -231,13 +236,90 @@ 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;
     }

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

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

@@ -22,7 +22,7 @@ public class SocketTypes {
     public static final String LOCK_PREFIX = "28";
 
     /**
-     * 深圳智嵌采集器
+     * 深圳智嵌采集器
      */
     public static final String SZZQ_PREFIX = "3111";
 }

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

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