浏览代码

提交错误,回推版本

A17404李放 3 年之前
父节点
当前提交
23b0612802
共有 34 个文件被更改,包括 784 次插入551 次删除
  1. 10 2
      nb-admin/src/main/resources/application.yml
  2. 10 14
      nb-common/pom.xml
  3. 2 1
      nb-common/src/main/java/com/coffee/common/cache/value/Value.java
  4. 4 3
      nb-common/src/main/java/com/coffee/common/config/CacheHttpServletRequestWrapper.java
  5. 8 4
      nb-common/src/main/java/com/coffee/common/config/CachingContentFilter.java
  6. 3 3
      nb-common/src/main/java/com/coffee/common/config/websocket/WebSocketConstant.java
  7. 6 4
      nb-common/src/main/java/com/coffee/common/exception/ExecuteResult.java
  8. 3 3
      nb-framework/src/main/java/com/coffee/framework/config/mybatisplus/handler/CreateAndUpdateMetaObjectHandler.java
  9. 1 0
      nb-system/src/main/java/com/coffee/aliyun/AliyunConsumerGroupService.java
  10. 9 0
      nb-system/src/main/java/com/coffee/bus/entity/BusAppConfig.java
  11. 1 1
      nb-system/src/main/java/com/coffee/bus/entity/common/DeviceProperties.java
  12. 31 0
      nb-system/src/main/java/com/coffee/bus/enums/AppEnum.java
  13. 21 23
      nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
  14. 6 3
      nb-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSession.java
  15. 1 0
      nb-system/src/main/java/com/coffee/bus/mapper/BusPatientMapper.java
  16. 17 23
      nb-system/src/main/java/com/coffee/bus/registry/Operator.java
  17. 9 12
      nb-system/src/main/java/com/coffee/bus/registry/constant/DeviceKeyConstant.java
  18. 1 6
      nb-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java
  19. 217 82
      nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java
  20. 6 47
      nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
  21. 60 70
      nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java
  22. 73 44
      nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
  23. 4 9
      nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java
  24. 15 24
      nb-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java
  25. 5 8
      nb-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  26. 11 0
      nb-system/src/main/java/com/coffee/bus/service/LocalBusEvaluationService.java
  27. 40 3
      nb-system/src/main/java/com/coffee/bus/service/LocalBusHospitalConfigService.java
  28. 12 6
      nb-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  29. 98 91
      nb-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java
  30. 3 3
      nb-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java
  31. 2 2
      nb-system/src/main/java/com/coffee/bus/web/handler/CheckRequestHandler.java
  32. 78 35
      nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  33. 12 20
      nb-system/src/main/resources/mapper/bus/BusDeviceAlarmMapper.xml
  34. 5 5
      nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 10 - 2
nb-admin/src/main/resources/application.yml

@@ -1,4 +1,8 @@
 spring:
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 15MB
   application:
     name: coffee-service.
   profiles:
@@ -50,10 +54,14 @@ sa-token:
 logging:
   level:
     com.coffee: @logging.level@
-    org.springframework: debug
-  config: classpath:logback.xml
+  config: classpath:logback-spring.xml
   file:
     path: ./logs
+  logback:
+    rollingpolicy:
+      max-file-size: 10MB
+  charset:
+    console: UTF-8
 
 mybatis-plus:
   mapperPackage: com.coffee.**.mapper

+ 10 - 14
nb-common/pom.xml

@@ -16,22 +16,18 @@
             <groupId>org.t-io</groupId>
             <artifactId>tio-websocket-spring-boot-starter</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-         <!--websocket 模块-->
+        <!--websocket 模块-->
         <!--<dependency>-->
-            <!--<groupId>org.springframework.boot</groupId>-->
-            <!--<artifactId>spring-boot-starter-websocket</artifactId>-->
-            <!--<exclusions>-->
-                <!--<exclusion>-->
-                    <!--<groupId>org.springframework.boot</groupId>-->
-                    <!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
-                <!--</exclusion>-->
-            <!--</exclusions>-->
+        <!--<groupId>org.springframework.boot</groupId>-->
+        <!--<artifactId>spring-boot-starter-websocket</artifactId>-->
+        <!--<exclusions>-->
+        <!--<exclusion>-->
+        <!--<groupId>org.springframework.boot</groupId>-->
+        <!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
+        <!--</exclusion>-->
+        <!--</exclusions>-->
         <!--</dependency>-->
-         <!--websocket 模块-->
+        <!--websocket 模块-->
         <!-- web 模块 -->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>

+ 2 - 1
nb-common/src/main/java/com/coffee/common/cache/value/Value.java

@@ -2,9 +2,10 @@ package com.coffee.common.cache.value;
 
 import cn.hutool.core.util.ObjectUtil;
 
+import java.io.Serializable;
 import java.util.Date;
 
-public interface Value {
+public interface Value extends Serializable {
     default String asString() {
         if(ObjectUtil.isNull(get())){
             return null;

+ 4 - 3
nb-common/src/main/java/com/coffee/common/config/CacheHttpServletRequestWrapper.java

@@ -1,6 +1,7 @@
 package com.coffee.common.config;
 
-import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ReflectUtil;
 import org.springframework.util.StreamUtils;
 
 import javax.servlet.ReadListener;
@@ -22,7 +23,6 @@ public class CacheHttpServletRequestWrapper extends HttpServletRequestWrapper {
     public CacheHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
         super(request);
         this.bodyString = StreamUtils.copyToString(request.getInputStream(), Charset.defaultCharset());
-
         body = bodyString.getBytes(Charset.defaultCharset());
     }
 
@@ -75,8 +75,9 @@ public class CacheHttpServletRequestWrapper extends HttpServletRequestWrapper {
             }
         };
     }
+
     @Override
     public Collection<Part> getParts() throws IOException, ServletException {
-        return ((HttpServletRequest)super.getRequest()).getParts();
+        return super.getParts();
     }
 }

+ 8 - 4
nb-common/src/main/java/com/coffee/common/config/CachingContentFilter.java

@@ -1,12 +1,11 @@
 package com.coffee.common.config;
 
+import cn.hutool.core.text.CharSequenceUtil;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.servlet.*;
 import javax.servlet.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 /**
@@ -27,9 +26,14 @@ public class CachingContentFilter implements Filter {
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                          FilterChain chain) throws IOException, ServletException {
+        String header = ((HttpServletRequest) servletRequest).getHeader("Content-Type");
+        if(CharSequenceUtil.isNotBlank(header)&&header.contains("multipart/form-data")){
+            chain.doFilter(servletRequest,servletResponse);
+        }else {
+            HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) servletRequest);
+            chain.doFilter(requestWrapper, servletResponse);
+        }
 
-        HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) servletRequest);
-        chain.doFilter(requestWrapper, servletResponse);
     }
 
     @Override

+ 3 - 3
nb-common/src/main/java/com/coffee/common/config/websocket/WebSocketConstant.java

@@ -20,7 +20,7 @@ public class WebSocketConstant {
      */
     public static final String MONITOR_TOTAL_COUNT ="monitor-total-count";
 
-    public static final String PATIENT_ADD ="patient-add";
+    public static final String PATIENT_UPDATE ="patient-update";
 
     public static final String DEVICE_REPEAT ="device-repeat";
 
@@ -86,8 +86,8 @@ public class WebSocketConstant {
      * @param tenantId 设备所属医院
      * @return
      */
-    public static TopicWrapper getPatientAdd(String tenantId){
-        return getTopic(PATIENT_ADD,null,null,tenantId);
+    public static TopicWrapper getPatientUpdate(String tenantId){
+        return getTopic(PATIENT_UPDATE,null,null,tenantId);
     }
 
 

+ 6 - 4
nb-common/src/main/java/com/coffee/common/exception/ExecuteResult.java

@@ -10,13 +10,15 @@ import lombok.Data;
 import javax.script.ScriptException;
 import java.util.function.Supplier;
 @Data
-@ApiModel("脚本执行结果")
+@ApiModel("执行结果")
 public class ExecuteResult {
-    @ApiModelProperty("脚本是否执行成功")
+    @ApiModelProperty("消息是否执行成功")
+    private String msgId;
+    @ApiModelProperty("是否执行成功")
     private boolean success;
-    @ApiModelProperty("脚本输入参数")
+    @ApiModelProperty("输入参数")
     private String input;
-    @ApiModelProperty("脚本输出")
+    @ApiModelProperty("输出")
     private JSON result;
     @ApiModelProperty("错误消息")
     private String message;

+ 3 - 3
nb-framework/src/main/java/com/coffee/framework/config/mybatisplus/handler/CreateAndUpdateMetaObjectHandler.java

@@ -42,20 +42,20 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
             }
             if (metaObject.hasGetter(CREATE_BY) && metaObject.getValue(CREATE_BY) == null) {
                 LoginUser loginUser = SecurityUtil.getLoginUser();
-                this.strictInsertFill(metaObject, CREATE_BY, String.class, Objects.isNull(loginUser) ? null : loginUser.getSysUser().getId().toString());
+                this.strictInsertFill(metaObject, CREATE_BY, String.class, Objects.isNull(loginUser) ? "1" : loginUser.getSysUser().getId().toString());
             }
             if (metaObject.hasGetter(UPDATE_TIME) && metaObject.getValue(UPDATE_TIME) == null) {
                 this.strictUpdateFill(metaObject, UPDATE_TIME, Date.class, new Date());
             }
             if (metaObject.hasGetter(UPDATE_BY) && metaObject.getValue(UPDATE_BY) == null) {
                 LoginUser loginUser = SecurityUtil.getLoginUser();
-                this.strictUpdateFill(metaObject, UPDATE_BY, String.class, Objects.isNull(loginUser) ? null : loginUser.getSysUser().getId().toString());
+                this.strictUpdateFill(metaObject, UPDATE_BY, String.class, Objects.isNull(loginUser) ? "1" : loginUser.getSysUser().getId().toString());
             }
             if (metaObject.hasGetter(TENANT_ID) && metaObject.getValue(TENANT_ID) == null) {
                 ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                 String tenantId ="1";
                 if(request!=null){
-                     tenantId = String.valueOf(request.getAttribute("tenantId", SCOPE_REQUEST));
+                    tenantId = String.valueOf(request.getAttribute("tenantId", SCOPE_REQUEST));
                 }
                 this.strictInsertFill(metaObject, TENANT_ID, String.class, tenantId);
             }

+ 1 - 0
nb-system/src/main/java/com/coffee/aliyun/AliyunConsumerGroupService.java

@@ -177,6 +177,7 @@ public class AliyunConsumerGroupService {
             }else if (topic.matches("[\\w\\/]*event/property/post$")){//设备属性上报
                 // 设备属性集合
                 Items items = new Items(content.getJSONObject("items"));
+                log.info("上传设备属性:【{}】",items);
                 BusDeviceRunningEntity deviceRunning = new BusDeviceRunningEntity();
                 deviceRunning.updateFieldsByItems(deviceName,items);
                 deviceInfoListener.deviceInfoDetail(new DeviceInfoEvent(this,deviceRunning,deviceName));

+ 9 - 0
nb-system/src/main/java/com/coffee/bus/entity/BusAppConfig.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.coffee.bus.enums.AppEnum;
 import com.coffee.common.entity.GenericEntity;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -36,6 +37,14 @@ public class BusAppConfig extends GenericEntity<String> implements Serializable
     @ApiModelProperty("安装包名称")
     private String name;
 
+
+    /**
+     * app名称
+     */
+    @NotNull(message = "安装包类型不能为空")
+    @ApiModelProperty("安装包类型")
+    private AppEnum type;
+
     /**
      * 存储id
      */

+ 1 - 1
nb-system/src/main/java/com/coffee/bus/entity/common/DeviceProperties.java

@@ -38,7 +38,7 @@ public class DeviceProperties<K,T>  extends TenantGenericEntity<K,T> {
     @TableField(updateStrategy = FieldStrategy.NEVER)
     private DeviceTypeEnum type;
 
-    @ApiModelProperty(value = "住院号")
+    @ApiModelProperty(value = "设备上传住院号")
     private String patientCode;
 
     @ApiModelProperty(value = "病区")

+ 31 - 0
nb-system/src/main/java/com/coffee/bus/enums/AppEnum.java

@@ -0,0 +1,31 @@
+package com.coffee.bus.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AppEnum.java
+ * @Description TODO
+ * @createTime 2022年07月01日 09:51:00
+ */
+@AllArgsConstructor
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum AppEnum implements IEnum<Integer> {
+
+
+    android(1,"安卓安装包"),
+    apple(2,"苹果安装包"),
+    pad(3,"安卓平板安装包")
+    ;
+    @Getter
+    @ApiModelProperty("报警编码")
+    private Integer value;
+    @Getter
+    @ApiModelProperty("报警内容")
+    private String text;
+}

+ 21 - 23
nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java

@@ -1,5 +1,6 @@
 package com.coffee.bus.hospital.config;
 
+import cn.hutool.core.date.DateUnit;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.coffee.bus.entity.BusDeviceAlarmEntity;
 import com.coffee.bus.hospital.config.bean.FunctionExtraConfig;
@@ -8,6 +9,7 @@ import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.enums.DeviceTypeEnum;
 import com.coffee.bus.hospital.enums.ConfigHandlerEnums;
+import com.coffee.bus.registry.device.DeviceOperator;
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.service.LocalBusDeviceAlarmService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
@@ -20,9 +22,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RDelayedQueue;
-
-import java.math.BigDecimal;
 import java.util.Date;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -40,9 +41,6 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
     private HospitalFinishMonitorConfigHandler monitorConfigHandler;
     private HospitalAutoUndoConfigHandler autoUndoConfigHandler;
     private LocalBusDeviceAlarmService alarmService;
-    private LocalBusPatientService patientService;
-    //最后一次不在服务区警报延迟任务
-    private NoSignalEntity lastNoSignalWarn;
     //最后一次低输注警报延迟任务
     private LowInfusionEntity lastLowInfusionWarn;
 
@@ -56,7 +54,6 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         this.monitorConfigHandler=monitorConfigHandler;
         this.autoUndoConfigHandler=autoUndoConfigHandler;
         this.alarmService=alarmService;
-        this.patientService=patientService;
     }
 
     @Override
@@ -101,11 +98,8 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
                 this.handleNoSignal((NoSignalEntity) e);
             }
         });
-        //清空延迟队列消息
-        if(lastNoSignalWarn!=null){
-            delayedQueue.remove(lastNoSignalWarn);
-        }
-        lastNoSignalWarn = NoSignalEntity.builder()
+
+        NoSignalEntity lastNoSignalWarn = NoSignalEntity.builder()
                 .deviceId(source.getDeviceId())
                 .patientCode(source.getPatientCode())
                 .tenantId(source.getTenantId())
@@ -129,35 +123,39 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
      */
     private void handleNoSignal(NoSignalEntity source){
         String deviceId = source.getDeviceId();
+        Date lastUploadTime =  deviceRegistry.getOperator(source.getDeviceId()).getUploadTime();
+        if(!lastUploadTime.equals(source.getUploadTime())){
+            return;
+        }
         BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(source.getInfusionId());
         if (Boolean.TRUE.equals(infusionHistory.getFinished())) {
             //输注已结束
-            log.debug("不在服务区消息【{}】由于输注已结束,不在继续处理该消息,消息【{}】",source.getId(),source);
-            return;
-        }
-        if(!infusionHistory.getLastUploadTime().equals(source.getUploadTime())){
-            //有数据更新,取消不在服务区判定
-            log.debug("不在服务区消息【{}】由于有新数据产生,不在继续处理该消息,消息【{}】",source.getId(),source);
+            if(log.isDebugEnabled()){
+                log.debug("不在服务区消息【{}】由于输注已结束,不在继续处理该消息,消息【{}】",source.getId(),source);
+            }
             return;
         }
         //不在服务区报警信息保存
-        Date uploadTime=new Date(source.getTimestamp().getTime()+source.getUnit().toMillis(source.getTimeout()));
-        BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.noSignalOf(source.getDeviceId(),source.getInfusionId(),source.getHistoryId(),source.getTenantId(),uploadTime);
-        log.debug("消息【{}】处理,保存不在服务区报警",source);
+        Date alarmTime=new Date(source.getTimestamp().getTime()+source.getUnit().toMillis(source.getTimeout()));
+        BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.noSignalOf(source.getDeviceId(),source.getInfusionId(),source.getHistoryId(),source.getTenantId(),alarmTime);
+        if(log.isDebugEnabled()){
+            log.debug("消息【{}】处理,保存不在服务区报警",source);
+        }
         alarmService.save(alarm);
 
         boolean update = infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
                 .eq(BusInfusionHistoryEntity::getId, infusionHistory.getId())
-                .lt(BusInfusionHistoryEntity::getLastUploadTime, uploadTime)
+                .eq(BusInfusionHistoryEntity::getLastUploadTime, source.getUploadTime())
                 .set(BusInfusionHistoryEntity::getRunState, DeviceStatusEnum.NoSignal));
         //报警/提醒缓存重置
         if(update){
-            deviceRegistry.getOperator(deviceId)
-                    .setStatus(DeviceStatusEnum.NoSignal);
+            log.info("消息【】处理成功,输注【】变为【不在服务区】状态",source.getId(),source.getInfusionId());
             wsPublishUtils.publishPatientMonitor(infusionHistory.getPatientId(), infusionHistory.getTenantId());
             //不在服务区
             monitorConfigHandler.judgeNoSignalAutoFinish(infusionHistory.getPatientId(),deviceId,source.getPatientCode(),source.getTenantId(),source.getInfusionId(),source.getUploadTime());
             autoUndoConfigHandler.judgeNoSignalAutoUndo(deviceId,source.getPatientCode(),source.getTenantId(),source.getInfusionId());
+        }else {
+            log.info("消息【】处理失败,输注【】变为【不在服务区】状态失败",source.getInfusionId());
         }
     }
 

+ 6 - 3
nb-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSession.java

@@ -34,6 +34,8 @@ import org.tio.core.ChannelContext;
 import org.tio.core.Tio;
 import org.tio.core.utils.TioUtils;
 import org.tio.websocket.common.WsResponse;
+
+import javax.crypto.MacSpi;
 import java.util.*;
 import java.util.concurrent.*;
 
@@ -188,7 +190,7 @@ public class HisScriptSession {
      * @param patientCode
      * @return BusClinicEntity 开始时间最大的手术信息
      */
-    public BusClinicEntity handle(String text,String patientCode){
+    public BusClinicEntity handle(String msgId,String text,String patientCode){
         ScriptParse script = scriptManager.lookUpHospital(hospitalId);
         if(script==null){
             log.warn("没有获取到医院{}的解析脚本信息,不处理该条数据",hospitalId);
@@ -198,6 +200,7 @@ public class HisScriptSession {
             return null;
         }
         ExecuteResult exec = script.exec(text);
+        exec.setMsgId(msgId);
         JSON result=null;
         List<BusClinicEntity> sources=new ArrayList<>();
         try {
@@ -311,7 +314,7 @@ public class HisScriptSession {
                     return;
                 }
                 //正常响应
-                handle(Value.simple(hisResponse.getContext()).asString(), hisResponse.getPatientCode());
+                handle(messageId,Value.simple(hisResponse.getContext()).asString(), hisResponse.getPatientCode());
             }else {
                 Date responseTimestamp = hisResponse.getTimestamp();
                 Date requestTimestamp = hisRequest.getTimestamp();
@@ -329,7 +332,7 @@ public class HisScriptSession {
                         }
                         //正常响应
                         try {
-                            BusClinicEntity clinic = handle(Value.simple(hisResponse.getContext()).asString(), hisResponse.getPatientCode());
+                            BusClinicEntity clinic = handle(messageId,Value.simple(hisResponse.getContext()).asString(), hisResponse.getPatientCode());
                             if(clinic==null){
                                 result.setResult(R.fail(String.format("病号【[%s]】病人数据查询为空",hisResponse.getPatientCode())));
                             }else {

+ 1 - 0
nb-system/src/main/java/com/coffee/bus/mapper/BusPatientMapper.java

@@ -47,5 +47,6 @@ public interface BusPatientMapper extends BaseMapper<BusPatientEntity> {
 
     long selectAlarmCount(@Param("tenantId") String tenantId,@Param("alarmValue") int alarmValue);
 
+    @Deprecated
     long monitorTotalCount(@Param("tenantId") String tenantId);
 }

+ 17 - 23
nb-system/src/main/java/com/coffee/bus/registry/Operator.java

@@ -3,10 +3,13 @@ package com.coffee.bus.registry;
 
 import com.coffee.common.cache.ConfigStorage;
 import com.coffee.common.cache.value.Value;
+import org.redisson.api.RMap;
+import org.redisson.api.RMapCache;
 import org.springframework.util.ReflectionUtils;
 
 import java.lang.reflect.Field;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lifang
@@ -17,34 +20,19 @@ import java.util.*;
  */
 public interface Operator {
 
-    ConfigStorage getConfig();
+    /**
+     * 默认过期时间 24小时
+     */
+    long DEFAULT_TTL=2;
 
-    List<String> getAllKeys();
+    RMap<String, Value> getCache();
 
-    default void set(String key,Object value){
-        if (value.getClass().isEnum()) {
-            Field ordinal = ReflectionUtils.findField(value.getClass(), "ordinal");
-            ordinal.setAccessible(true);
-            getConfig().setConfig(key, ReflectionUtils.getField(ordinal,value));
-        }
-
-        getConfig().setConfig(key,value);
-    };
-
-    default Map<String, Value> getAll() {
-        Map<String, Value> result = getConfig().getKeys(getAllKeys());
-        List<String> keys = new LinkedList<>();
-        result.forEach((k,v)->{
-            if(v==null||v.get()==null){
-                keys.add(k);
-            }
-        });
-        keys.forEach(result::remove);
-        return result;
+    default Value wrapperValue(Object value){
+        return Value.simple(value);
     }
 
     default Value getValue(String name){
-        return parseValue(getConfig().getConfig(name));
+        return parseValue(getCache().get(name));
     }
 
     default Value parseValue(Value value){
@@ -53,4 +41,10 @@ public interface Operator {
         }
         return value;
     }
+
+    default void put(String key,Value value){
+//        getCache()
+//                .put(key,value,DEFAULT_TTL, TimeUnit.HOURS);
+        getCache().put(key,value);
+    }
 }

+ 9 - 12
nb-system/src/main/java/com/coffee/bus/registry/constant/DeviceKeyConstant.java

@@ -8,25 +8,16 @@ package com.coffee.bus.registry.constant;
  * @createTime 2022年04月09日 13:38:00
  */
 public class DeviceKeyConstant {
-    public static final String DEVICE_ID="deviceId";
-
-    public static final String ALIAS="alias";
 
     public static final String ENABLE="enable";
 
     public static final String TENANT_ID="tenantId";
 
-    public static final String USING_ID="usingId";
+    public static final String INFUSION_TENANT_ID="infusion_tenantId";
 
     public static final String START_TIME="startTime";
 
-    public static final String MODIFY_TIME="modifyTime";
-
-    public static final String PATIENT_CODE="patientCode";
-
-    public static final String STATUS="status";
-
-    public static final String MASTER="master";
+    public static final String PATIENT_CODE="identityCode";
 
     public static final String CLASSIFY="classification";
 
@@ -38,5 +29,11 @@ public class DeviceKeyConstant {
 
     public static final String CONTINUE_DOSE="continue_dose";
 
-    public static final String UPLOAD_TIME="upload_time";
+    public static final String IS_EXIST="is_exist";
+
+    public static final String VALID_PCA="valid_pca";
+
+    public static final String APPEND_DOSE="append_dose";
+
+    public static final String UPLOAD="upload";
 }

+ 1 - 6
nb-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java

@@ -8,19 +8,14 @@ package com.coffee.bus.registry.constant;
  * @createTime 2022年04月13日 15:45:00
  */
 public class PatientKeyConstant {
-    public static final String CODE="code";
+    public static final String IS_EXIST="is_exist";
 
-    public static final String TENANT_ID="tenantId";
 
     public static final String CLINIC_ID="clinicId";
 
-    public static final String START_TIME="startTime";
-
-    public static final String FINISHED="finished";
 
     public static final String BIND_DEVICE_ID="bindDeviceId";
 
     public static final String PATIENT_ID="patient_id";
 
-    public static final String INFUSION_ID="infusion_id";
 }

+ 217 - 82
nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java

@@ -1,206 +1,341 @@
 package com.coffee.bus.registry.device;
 
 
-import com.coffee.bus.enums.DeviceStatusEnum;
+import cn.hutool.extra.spring.SpringUtil;
+import com.coffee.bus.entity.BusDeviceAlarmEntity;
+import com.coffee.bus.entity.BusDeviceEntity;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
+import com.coffee.bus.entity.BusInfusionModifyEntity;
 import com.coffee.bus.registry.constant.DeviceKeyConstant;
-import com.coffee.common.cache.ConfigStorage;
-import lombok.AllArgsConstructor;
-
+import com.coffee.bus.service.LocalBusDeviceService;
+import com.coffee.bus.service.LocalBusInfusionHistoryService;
+import com.coffee.common.cache.value.Value;
+import com.coffee.common.util.RedissonUtil;
+import org.redisson.api.RMap;
 import java.math.BigDecimal;
 import java.util.Date;
-import java.util.*;
+
 /**
  * @author lifang
  * @version 1.0.0
  * @ClassName ClusterDeviceOperator.java
- * @Description TODO
+ * @Description
  * @createTime 2022年04月06日 15:27:00
  */
-@AllArgsConstructor
 public class ClusterDeviceOperator implements DeviceOperator {
 
-    private final ConfigStorage configStorage;
+    private final String deviceId;
+    private final RMap<String, Value> mapCache;
+    private final LocalBusDeviceService deviceService;
+    private final LocalBusInfusionHistoryService infusionHistoryService;
 
-    @Override
-    public ConfigStorage getConfig() {
-        return configStorage;
+    public ClusterDeviceOperator(String deviceId) {
+        String key="device:"+deviceId;
+        deviceService= SpringUtil.getBean(LocalBusDeviceService.class);
+        infusionHistoryService=SpringUtil.getBean(LocalBusInfusionHistoryService.class);
+        this.deviceId=deviceId;
+        mapCache = SpringUtil.getBean(RedissonUtil.class).getRedissonClient().getMapCache(key);
     }
 
     @Override
-    public void setDeviceId(String deviceId) {
-        configStorage.setConfig(DeviceKeyConstant.DEVICE_ID,deviceId);
+    public RMap<String, Value> getCache() {
+        return mapCache;
     }
 
+
     @Override
-    public String getDeviceId() {
-        return getValue(DeviceKeyConstant.DEVICE_ID).asString();
+    public void setExist(Boolean exist) {
+        put(DeviceKeyConstant.IS_EXIST,wrapperValue(exist));
     }
 
     @Override
-    public void setAlias(String alias) {
-        configStorage.setConfig(DeviceKeyConstant.ALIAS,alias);
+    public boolean getExist() {
+        Value value = getValue(DeviceKeyConstant.IS_EXIST);
+        if(value==null){
+            BusDeviceEntity device = getDevice();
+            value=Value.simple(device!=null);
+            setExist(device!=null);
+        }
+        return value.asBoolean();
     }
 
     @Override
-    public String getAlias() {
-        return getValue(DeviceKeyConstant.ALIAS).asString();
+    public String getDeviceId() {
+        return this.deviceId;
     }
 
     @Override
     public void setEnable(Boolean enable) {
-        configStorage.setConfig(DeviceKeyConstant.ENABLE,enable);
+        put(DeviceKeyConstant.ENABLE,wrapperValue(enable) );
     }
 
     @Override
     public boolean getEnable() {
-        return getValue(DeviceKeyConstant.ENABLE).asBoolean();
+        Value value = getValue(DeviceKeyConstant.ENABLE);
+        if(value==null){
+            BusDeviceEntity device = getDevice();
+            value=Value.simple(device.getEnable());
+            setEnable(device.getEnable());
+        }
+        return value.asBoolean();
     }
 
     @Override
     public void setTenantId(String tenantId) {
-        configStorage.setConfig(DeviceKeyConstant.TENANT_ID,tenantId);
+        put(DeviceKeyConstant.TENANT_ID,wrapperValue(tenantId) );
     }
 
     @Override
     public String getTenantId() {
-        return getValue(DeviceKeyConstant.TENANT_ID).asString();
+        Value value = getValue(DeviceKeyConstant.TENANT_ID);
+        if(value==null){
+            BusDeviceEntity device = getDevice();
+            value=Value.simple(device.getTenantId());
+            setTenantId(device.getTenantId());
+        }
+        return value.asString();
     }
 
     @Override
-    public void setUsingId(String usingId) {
-        configStorage.setConfig(DeviceKeyConstant.USING_ID,usingId);
+    public void setInfusionTenantId(String tenantId) {
+        put(DeviceKeyConstant.INFUSION_TENANT_ID,wrapperValue(tenantId) );
     }
 
     @Override
-    public String getUsingId() {
-        return getValue(DeviceKeyConstant.USING_ID).asString();
+    public String getInfusionTenantId() {
+        Value value = getValue(DeviceKeyConstant.INFUSION_TENANT_ID);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                //当输注不存在时,采用设备绑定的医院id
+                String tenantId = getTenantId();
+                value=Value.simple(tenantId);
+                setInfusionTenantId(tenantId);
+            }else {
+                value=Value.simple(lastInfusion.getTenantId());
+                setInfusionTenantId(lastInfusion.getTenantId());
+            }
+        }
+        return value.asString();
     }
 
+
     @Override
     public void setStartTime(Date startTime) {
-        configStorage.setConfig(DeviceKeyConstant.START_TIME,startTime);
+        put(DeviceKeyConstant.START_TIME,wrapperValue(startTime) );
     }
 
     @Override
     public Date getStartTime() {
-        return getValue(DeviceKeyConstant.START_TIME).asDate();
-    }
-
-    @Override
-    public void setModifyTime(Date startTime) {
-        configStorage.setConfig(DeviceKeyConstant.MODIFY_TIME,startTime);
-    }
+        Value value = getValue(DeviceKeyConstant.START_TIME);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getStartTime());
+            }
+            setStartTime(lastInfusion==null?null:lastInfusion.getStartTime());
 
-    @Override
-    public Date getModifyTime() {
-        return getValue(DeviceKeyConstant.MODIFY_TIME).asDate();
+        }
+        return value.asDate();
     }
 
     @Override
     public void setPatientCode(String patientCode) {
-        configStorage.setConfig(DeviceKeyConstant.PATIENT_CODE,patientCode);
+        put(DeviceKeyConstant.PATIENT_CODE,wrapperValue(patientCode) );
     }
 
     @Override
     public String getPatientCode() {
-        return getValue(DeviceKeyConstant.PATIENT_CODE).asString();
+        Value value = getValue(DeviceKeyConstant.PATIENT_CODE);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getPatientCode());
+            }
+            setPatientCode(lastInfusion==null?null:lastInfusion.getPatientCode());
+        }
+        return value.asString();
     }
 
     @Override
-    public DeviceStatusEnum getStatus() {
-        return getValue(DeviceKeyConstant.STATUS).as(DeviceStatusEnum.class);
+    public void setAlarmOrWarn(String alarm) {
+        put(DeviceKeyConstant.ALARM,wrapperValue(alarm) );
     }
 
     @Override
-    public void setStatus(DeviceStatusEnum status) {
-        if(status==null){
-            configStorage.setConfig(DeviceKeyConstant.STATUS,null);
-        }else {
-            configStorage.setConfig(DeviceKeyConstant.STATUS,status.ordinal());
-        }
+    public String getAlarmOrWarn() {
+        Value value = getValue(DeviceKeyConstant.ALARM);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+                setAlarmOrWarn(null);
+            }else {
+                String signParm = BusDeviceAlarmEntity.parseRunning(lastInfusion).signParm();
+                value=Value.simple(signParm);
+                setAlarmOrWarn(signParm);
+            }
 
+        }
+        return value.asString();
     }
 
     @Override
-    public void setMaster(boolean master) {
-        configStorage.setConfig(DeviceKeyConstant.MASTER,master);
+    public void setInfusionId(String infusionId) {
+        put(DeviceKeyConstant.INFUSION_ID,wrapperValue(infusionId) );
     }
 
     @Override
-    public boolean getMaster() {
-        return getValue(DeviceKeyConstant.MASTER).asBoolean();
+    public String getInfusionId() {
+        Value value = getValue(DeviceKeyConstant.INFUSION_ID);
+        if(value==null){
+            BusDeviceEntity device = getDevice();
+            value=Value.simple(device.getInfusionId());
+            setInfusionId(device.getInfusionId());
+        }
+        return value.as(String.class);
     }
 
     @Override
-    public void setAlarmOrWarn(String alarm) {
-        configStorage.setConfig(DeviceKeyConstant.ALARM,alarm);
+    public void setInfusionParam(String infusionParam) {
+        put(DeviceKeyConstant.INFUSION_PARAM,wrapperValue(infusionParam) );
     }
 
     @Override
-    public String getAlarmOrWarn() {
-        return getValue(DeviceKeyConstant.ALARM).asString();
+    public String getInfusionParam() {
+        Value value = getValue(DeviceKeyConstant.INFUSION_PARAM);
+        if(value==null){
+            BusInfusionModifyEntity lastModify = infusionHistoryService.lastModify(getInfusionId());
+            if(lastModify!=null){
+                String signParam = lastModify.signParam();
+                value=Value.simple(signParam);
+                setInfusionParam(signParam);
+            }else {
+                value=Value.simple("");
+            }
+
+        }
+        return value.as(String.class);
     }
 
+
     @Override
-    public void setInfusionId(String infusionId) {
-        configStorage.setConfig(DeviceKeyConstant.INFUSION_ID,infusionId);
+    public void setClassification(String classification) {
+        put(DeviceKeyConstant.CLASSIFY,wrapperValue(classification));
     }
 
     @Override
-    public String getInfusionId() {
-        return getValue(DeviceKeyConstant.INFUSION_ID).as(String.class);
+    public String getClassification() {
+        Value value = getValue(DeviceKeyConstant.CLASSIFY);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getClassification());
+            }
+            setClassification(lastInfusion==null?null:lastInfusion.getClassification());
+        }
+        return value.asString();
     }
 
+
     @Override
-    public void setInfusionParam(String infusionParam) {
-        configStorage.setConfig(DeviceKeyConstant.INFUSION_PARAM,infusionParam);
+    public BigDecimal getContinueDose() {
+        Value value = getValue(DeviceKeyConstant.CONTINUE_DOSE);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getContinueDose());
+            }
+            setContinueDose(lastInfusion==null?null:lastInfusion.getContinueDose());
+        }
+        return value.as(BigDecimal.class);
+
     }
 
     @Override
-    public String getInfusionParam() {
-        return getValue(DeviceKeyConstant.INFUSION_PARAM).as(String.class);
+    public void setContinueDose(BigDecimal continueDose) {
+        put(DeviceKeyConstant.CONTINUE_DOSE,wrapperValue(continueDose) );
     }
 
-
     @Override
-    public void setClassification(String classification) {
-        configStorage.setConfig(DeviceKeyConstant.CLASSIFY,classification);
+    public void setLastPcaValidCount(Integer pcaValidCount) {
+        put(DeviceKeyConstant.VALID_PCA,wrapperValue(pcaValidCount) );
     }
 
     @Override
-    public String getClassification() {
-        return  getValue(DeviceKeyConstant.CLASSIFY).asString();
+    public Integer getLastPcaValidCount() {
+        Value value = getValue(DeviceKeyConstant.VALID_PCA);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getPcaValidCount());
+            }
+            setLastPcaValidCount(lastInfusion==null?null:lastInfusion.getPcaValidCount());
+        }
+        return value.asInt();
     }
 
     @Override
-    public Date getUploadTime() {
-        return getValue(DeviceKeyConstant.UPLOAD_TIME).asDate();
+    public void setTotalAppendDose(BigDecimal totalAppendDose) {
+        put(DeviceKeyConstant.APPEND_DOSE,wrapperValue(totalAppendDose) );
     }
 
     @Override
-    public void setUploadTime(Date uploadTime) {
-        configStorage.setConfig(DeviceKeyConstant.UPLOAD_TIME,uploadTime);
+    public Date getUploadTime() {
+        Value value = getValue(DeviceKeyConstant.UPLOAD);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getLastUploadTime());
+            }
+            setUploadTime(lastInfusion==null?null:lastInfusion.getLastUploadTime());
+        }
+        return value.asDate();
     }
 
     @Override
-    public BigDecimal getContinueDose() {
-        return getValue(DeviceKeyConstant.CONTINUE_DOSE).as(BigDecimal.class);
-
+    public void setUploadTime(Date uploadTime) {
+        put(DeviceKeyConstant.UPLOAD,wrapperValue(uploadTime) );
     }
 
     @Override
-    public void setContinueDose(BigDecimal continueDose) {
-        configStorage.setConfig(DeviceKeyConstant.CONTINUE_DOSE,continueDose);
+    public BigDecimal getTotalAppendDose() {
+        Value value = getValue(DeviceKeyConstant.APPEND_DOSE);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+            }else {
+                value=Value.simple(lastInfusion.getTotalAppendDose());
+            }
+            setTotalAppendDose(lastInfusion==null?null:lastInfusion.getTotalAppendDose());
+        }
+        return value.as(BigDecimal.class);
     }
 
     @Override
     public void clear() {
-        configStorage.clear();
+        mapCache.clear();
     }
 
+    private BusDeviceEntity getDevice(){
+        return deviceService.getByDeviceId(this.deviceId);
+    }
 
-    @Override
-    public List<String> getAllKeys(){
-        return Arrays.asList("deviceId","alias","enable","tenantId","usingId","startTime","patientCode","status","master","classification");
+    private BusInfusionHistoryEntity getLastInfusion(){
+        return infusionHistoryService.lastInfusion(deviceId);
     }
+
 }

+ 6 - 47
nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java

@@ -1,12 +1,10 @@
 package com.coffee.bus.registry.device;
 
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.coffee.bus.entity.*;
 import com.coffee.bus.registry.RegistryConstant;
 import com.coffee.bus.service.*;
-import com.coffee.common.cache.manager.ClusterConfigStorageManager;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.Map;
@@ -21,11 +19,8 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 @AllArgsConstructor
 @Service
+@Slf4j
 public class ClusterDeviceRegistry implements DeviceRegistry {
-    private final LocalBusInfusionHistoryService infusionHistoryService;
-    private final LocalBusDeviceService deviceService;
-    private final ClusterConfigStorageManager configStorageManager;
-    private final LocalBusInfusionModifyService infusionModifyService;
 
     private static Map<String,ClusterDeviceOperator> operatorMap=new ConcurrentHashMap<>();
     @Override
@@ -34,52 +29,16 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
             return null;
         }
         String key=getId()+deviceId;
-        ClusterDeviceOperator deviceOperator = operatorMap.computeIfAbsent(key,k->new ClusterDeviceOperator( configStorageManager.getStorage(k)));
-        if(StrUtil.isNullOrUndefined(deviceOperator.getDeviceId())){
-            //从数据库中获取数据
-            BusInfusionHistoryEntity lastInfusion=infusionHistoryService.lastInfusion(deviceId);
-            BusDeviceEntity device = deviceService.getOne(new QueryWrapper<BusDeviceEntity>().lambda()
-                    .eq(BusDeviceEntity::getDeviceId, deviceId));
-            if(device==null){
-                //设备不存在,即缓存操作不存在
-                return null;
-            }
-            //设备注册信息
-            deviceOperator.setEnable(device.getEnable());
-            deviceOperator.setDeviceId(deviceId);
-            deviceOperator.setTenantId(device.getTenantId());
-            deviceOperator.setAlias(device.getAlias());
-            //设备运行信息
-            if(lastInfusion!=null){
-                deviceOperator.setClassification(lastInfusion.getClassification());
-                deviceOperator.setInfusionId(lastInfusion.getId());
-                BusInfusionModifyEntity infusionModify = infusionModifyService.getOne(new QueryWrapper<BusInfusionModifyEntity>().lambda().eq(BusInfusionModifyEntity::getInfusionId, lastInfusion.getId()).orderByDesc(BusInfusionModifyEntity::getModifyTime).last("LIMIT 1"));
-                if(infusionModify!=null){
-                    deviceOperator.setInfusionParam(infusionModify.signParam());
-                }
-                if (BusDeviceAlarmEntity.alarmOrWarn(lastInfusion)) {
-                    deviceOperator.setAlarmOrWarn(BusDeviceAlarmEntity.parseRunning(lastInfusion).signParm());
-                }
-                deviceOperator.setStartTime(lastInfusion.getStartTime());
-                deviceOperator.setStatus(lastInfusion.getRunState());
-                deviceOperator.setContinueDose(lastInfusion.getContinueDose());
-            }
-
-
-//            //判断泵是否医院绑定发生变化
-//            if(device.getTenantId().equals(runningInfo.getTenantId())){
-//                deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
-//                        .eq(BusDeviceRunningEntity::getDeviceId,deviceId).set(BusDeviceRunningEntity::getTenantId,device.getTenantId()));
-//            }
-            return deviceOperator;
+        ClusterDeviceOperator deviceOperator = operatorMap.computeIfAbsent(key,k->new ClusterDeviceOperator( deviceId));
+        if(!deviceOperator.getExist()){
+            log.warn("设备号【{}】不存在,设备处理失败",deviceId);
         }
         return deviceOperator;
     }
 
     @Override
     public void remove(String deviceId) {
-        String key=getId()+deviceId;
-        ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator(configStorageManager.getStorage(key));
+        ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator(deviceId);
         deviceOperator.clear();
     }
 

+ 60 - 70
nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java

@@ -3,6 +3,7 @@ package com.coffee.bus.registry.device;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.registry.Operator;
+import com.coffee.common.cache.value.Value;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -18,28 +19,28 @@ public interface DeviceOperator extends Operator {
 
 
     /**
-     * 设置设备号
-     * @param deviceId
+     * 描述:设备是否存在
+     * @author lifang
+     * @date 2022/6/30 21:38
+     * @param
+     * @return boolean
      */
-    void setDeviceId(String deviceId);
+    void setExist(Boolean exist);
 
     /**
-     * 获取设备号
-     * @return
+     * 描述:设备是否存在
+     * @author lifang
+     * @date 2022/6/30 21:38
+     * @param
+     * @return boolean
      */
-    String getDeviceId();
+    boolean getExist();
 
     /**
-     * 设置别名
-     * @param alias
-     */
-    void setAlias(String alias);
-
-    /**
-     * 获取设备别名
+     * 获取设备号
      * @return
      */
-    String getAlias();
+    String getDeviceId();
 
     /**
      * 设置设备是否启用
@@ -54,53 +55,41 @@ public interface DeviceOperator extends Operator {
     boolean getEnable();
 
     /**
-     * 设置医院id
+     * 设置设备绑定的医院id
      * @param tenantId
      */
     void setTenantId(String tenantId);
 
     /**
-     * 获取医院id
+     * 获取设备绑定的医院id
      * @return
      */
     String getTenantId();
 
-    /**
-     * 设置设备运行id
-     * @see BusDeviceRunningEntity
-     * @param usingId
-     */
-    void setUsingId(String usingId);
 
-    /**
-     * 获取设备运行id
-     * @return
-     */
-    String getUsingId();
 
     /**
-     * 设置设备开机时间
-     * @param startTime
+     * 设置设备当前输注绑定的医院id
+     * @param tenantId
      */
-    void setStartTime(Date startTime);
+    void setInfusionTenantId(String tenantId);
 
     /**
-     * 获取设备开机时间
+     * 获取设备当前输注绑定的医院id
      * @return
      */
-    Date getStartTime();
-
+    String getInfusionTenantId();
     /**
      * 设置设备开机时间
      * @param startTime
      */
-    void setModifyTime(Date startTime);
+    void setStartTime(Date startTime);
 
     /**
      * 获取设备开机时间
      * @return
      */
-    Date getModifyTime();
+    Date getStartTime();
 
     /**
      * 设置设备当前绑定泵号
@@ -114,30 +103,6 @@ public interface DeviceOperator extends Operator {
      */
     String getPatientCode();
 
-    /**
-     * 获取设备当前状态
-     * @return
-     */
-    DeviceStatusEnum getStatus();
-
-    /**
-     * 设置设备当前状态
-     * @param status
-     */
-    void setStatus(DeviceStatusEnum status);
-
-    /**
-     * 设置设备当前是否为主泵
-     * @param master
-     */
-    void setMaster(boolean master);
-
-    /**
-     * 获取设备当前是否为主泵
-     * @return
-     */
-    boolean getMaster();
-
     /**
      * 设置当前设备输注id
      * @param infusionId
@@ -186,33 +151,58 @@ public interface DeviceOperator extends Operator {
      */
     String getClassification();
 
+
     /**
-     * 获取设备最新上传数据时间
+     * 获取设备上传流速
      * @return
      */
-    Date getUploadTime();
+    BigDecimal getContinueDose();
 
 
     /**
-     * 设置设备最新上传数据时间
-     * @param uploadTime
+     * 设置设备流速
+     * @param continueDose
      */
-    void setUploadTime(Date uploadTime);
+    void setContinueDose(BigDecimal continueDose);
 
 
     /**
-     * 获取设备上传流速
-     * @return
+     * 设置此次输注过程中的总有效PCA次数
+     * @param pcaValidCount
      */
-    BigDecimal getContinueDose();
+    void setLastPcaValidCount(Integer pcaValidCount);
+
+    /**
+     * 获取此次输注过程中的总有效PCA次数
+     *
+     */
+    Integer getLastPcaValidCount();
 
 
     /**
-     * 设置设备流速
-     * @param continueDose
+     * 设置此次输注过程中的总追加量
+     * @param totalAppendDose
      */
-    void setContinueDose(BigDecimal continueDose);
+    void setTotalAppendDose(BigDecimal totalAppendDose);
+
+    /**
+     * 获取该设备最后一次设备上传时间
+     *
+     */
+    Date getUploadTime();
 
 
+    /**
+     * 设置该设备最后一次设备上传时间
+     * @param uploadTime
+     */
+    void setUploadTime(Date uploadTime);
+
+    /**
+     * 获取此次输注过程中的总追加量
+     *
+     */
+    BigDecimal getTotalAppendDose();
+
     void clear();
 }

+ 73 - 44
nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java

@@ -1,9 +1,19 @@
 package com.coffee.bus.registry.patient;
 
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
+import com.coffee.bus.entity.BusPatientEntity;
+import com.coffee.bus.registry.constant.DeviceKeyConstant;
 import com.coffee.bus.registry.constant.PatientKeyConstant;
-import com.coffee.common.cache.ConfigStorage;
-
-import java.util.*;
+import com.coffee.bus.service.LocalBusInfusionHistoryService;
+import com.coffee.bus.service.LocalBusPatientService;
+import com.coffee.common.cache.value.Value;
+import com.coffee.common.util.RedissonUtil;
+import org.redisson.api.LocalCachedMapOptions;
+import org.redisson.api.RLocalCachedMap;
+import org.redisson.api.RMap;
+import org.redisson.api.RMapCache;
 
 /**
  * @author lifang
@@ -13,93 +23,112 @@ import java.util.*;
  * @createTime 2022年04月07日 15:25:00
  */
 public class ClusterPatientOperator implements PatientOperator {
-    private final ConfigStorage configStorage;
+    private final String patientCode;
+    private final String hospitalId;
+    private final RMap<String, Value> mapCache;
+    private final LocalBusPatientService patientService;
+    private final LocalBusInfusionHistoryService infusionHistoryService;
 
-    public ClusterPatientOperator(ConfigStorage configStorage) {
-        this.configStorage = configStorage;
+    public ClusterPatientOperator(String patientCode,String hospitalId) {
+        this.patientCode=patientCode;
+        this.hospitalId=hospitalId;
+        patientService=SpringUtil.getBean(LocalBusPatientService.class);
+        infusionHistoryService=SpringUtil.getBean(LocalBusInfusionHistoryService.class);
+        mapCache = SpringUtil.getBean(RedissonUtil.class).getRedissonClient().getMapCache(hospitalId+":"+patientCode);
     }
 
+
     @Override
-    public ConfigStorage getConfig() {
-        return configStorage;
+    public RMap<String, Value> getCache() {
+        return mapCache;
     }
 
-
     @Override
-    public void setCode(String code) {
-        configStorage.setConfig(PatientKeyConstant.CODE,code);
+    public void setExist(Boolean exist) {
+        put(PatientKeyConstant.IS_EXIST,wrapperValue(exist));
     }
 
     @Override
-    public String getCode() {
-        return getValue(PatientKeyConstant.CODE).as(String.class);
+    public boolean getExist() {
+        Value value = getValue(DeviceKeyConstant.IS_EXIST);
+        if(value==null){
+            BusPatientEntity  patient = patientService.findByOriginCode(patientCode, hospitalId);
+            value=Value.simple(patient!=null);
+            setExist(patient!=null);
+        }
+        return value.asBoolean();
     }
 
     @Override
-    public void setTenantId(String tenantId) {
-        configStorage.setConfig(PatientKeyConstant.TENANT_ID,tenantId);
+    public String getCode() {
+        return this.patientCode;
     }
 
+
+
     @Override
     public String getTenantId() {
-        return getValue(PatientKeyConstant.TENANT_ID).as(String.class);
+        return this.hospitalId;
     }
 
     @Override
     public void setClinicId(String clinicId) {
-        configStorage.setConfig(PatientKeyConstant.CLINIC_ID,clinicId);
+        put(PatientKeyConstant.CLINIC_ID,wrapperValue(clinicId));
     }
 
     @Override
     public String getClinicId() {
-        return getValue(PatientKeyConstant.CLINIC_ID).as(String.class);
-    }
-
-    @Override
-    public void setStartTime(Date startTime) {
-        configStorage.setConfig(PatientKeyConstant.START_TIME,startTime);
-    }
-
-    @Override
-    public Date getStartTime() {
-        return getValue(PatientKeyConstant.START_TIME).as(Date.class);
+        Value value = getValue(PatientKeyConstant.CLINIC_ID);
+        if(value==null){
+            BusPatientEntity patient = getPatient();
+            value=Value.simple(patient.getClinicId());
+            setClinicId(patient.getClinicId());
+        }
+        return value.asString();
     }
 
     @Override
     public void setBindDeviceId(String deviceId) {
-        configStorage.setConfig(PatientKeyConstant.BIND_DEVICE_ID,deviceId);
+        put(PatientKeyConstant.BIND_DEVICE_ID,wrapperValue(deviceId));
     }
 
     @Override
     public String getBindDeviceId() {
-        return getValue(PatientKeyConstant.BIND_DEVICE_ID).asString();
+        Value value = getValue(PatientKeyConstant.BIND_DEVICE_ID);
+        if(value==null){
+            BusPatientEntity patient = getPatient();
+            if(patient==null|| CharSequenceUtil.isEmpty(patient.getInfusionId())){
+                return null;
+            }
+            BusInfusionHistoryEntity infusion = infusionHistoryService.getById(patient.getInfusionId());
+            value=Value.simple(infusion.getDeviceId());
+            setBindDeviceId(infusion.getDeviceId());
+        }
+        return value.asString();
     }
 
     @Override
     public String getPatientId() {
-        return getValue(PatientKeyConstant.PATIENT_ID).asString();
+        Value value = getValue(PatientKeyConstant.PATIENT_ID);
+        if(value==null){
+            BusPatientEntity patient = getPatient();
+            value=Value.simple(patient.getId());
+            setPatientId(patient.getId());
+        }
+        return value.asString();
     }
 
     @Override
     public void setPatientId(String patientId) {
-        configStorage.setConfig(PatientKeyConstant.PATIENT_ID,patientId);
+        put(PatientKeyConstant.PATIENT_ID,wrapperValue(patientId));
     }
 
     @Override
     public void clear() {
-        configStorage.clear();
+        mapCache.clear();
     }
 
-    @Override
-    public void clearClinic() {
-        configStorage.remove(Arrays.asList(PatientKeyConstant.CLINIC_ID,PatientKeyConstant.START_TIME,PatientKeyConstant.FINISHED));
+    private BusPatientEntity getPatient(){
+        return patientService.findByOriginCode(patientCode, hospitalId);
     }
-    @Override
-    public List<String> getAllKeys(){
-        return Arrays.asList("code","gender","surgeyName","tenantId","clinicId","startTime","finished","bindDeviceId","devices");
-    }
-
-    //该病人是否为新增病人
-    private boolean newPatient;
-
 }

+ 4 - 9
nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java

@@ -33,7 +33,6 @@ import java.util.*;
 @Slf4j
 public class ClusterPatientRegistry implements PatientRegistry {
     private final LocalBusPatientService patientService;
-    private final ClusterConfigStorageManager configStorageManager;
     private final LocalBusClinicService clinicService;
     private final LocalBusInfusionHistoryService infusionService;
 
@@ -49,11 +48,9 @@ public class ClusterPatientRegistry implements PatientRegistry {
         if(StrUtil.isEmpty(hospitalId)||StrUtil.isEmpty(patientCode)){
             return null;
         }
-        String key=getId()+hospitalId+":"+patientCode;
-        ClusterPatientOperator patientOperator = new ClusterPatientOperator(configStorageManager.getStorage(key));
+        ClusterPatientOperator patientOperator = new ClusterPatientOperator(patientCode,hospitalId);
         //设备上传病号
-        String code = patientOperator.getCode();
-        if(StrUtil.isNullOrUndefined(code)){
+        if(!patientOperator.getExist()){
             //将新数据存入数据库
             BusPatientEntity patient = null;
             patient = patientService.getOne(new QueryWrapper<BusPatientEntity>()
@@ -80,9 +77,6 @@ public class ClusterPatientRegistry implements PatientRegistry {
                 clinic = clinicService.getById(patient.getClinicId());
             }
 
-            patientOperator.setCode(patientCode);
-            patientOperator.setTenantId(hospitalId);
-
             //填充临床信息
             patient.setClinicId(clinic.getId());
 
@@ -112,6 +106,7 @@ public class ClusterPatientRegistry implements PatientRegistry {
                 clinicService.updateById(clinic);
             }
             patientOperator.setPatientId(patient.getId());
+            patientOperator.setExist(true);
         }
         return patientOperator;
     }
@@ -120,7 +115,7 @@ public class ClusterPatientRegistry implements PatientRegistry {
     @Override
     public void remove(String hospitalId, String patientCode) {
         String key=getId()+hospitalId+":"+patientCode;
-        ClusterPatientOperator patientOperator = new ClusterPatientOperator( configStorageManager.getStorage(key));
+        ClusterPatientOperator patientOperator = new ClusterPatientOperator( patientCode,hospitalId);
         patientOperator.clear();
     }
 

+ 15 - 24
nb-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java

@@ -16,22 +16,28 @@ import java.util.*;
 public interface PatientOperator extends Operator {
 
     /**
-     * 设置病号
-     * @param patientCode
+     * 描述:设备是否存在
+     * @author lifang
+     * @date 2022/6/30 21:38
+     * @param
+     * @return boolean
      */
-    void setCode(String patientCode);
+    void setExist(Boolean exist);
 
     /**
-     * 获取病号
-     * @return
+     * 描述:设备是否存在
+     * @author lifang
+     * @date 2022/6/30 21:38
+     * @param
+     * @return boolean
      */
-    String getCode();
+    boolean getExist();
 
     /**
-     * 设置医院id
-     * @param tenantId
+     * 获取病号
+     * @return
      */
-    void setTenantId(String tenantId);
+    String getCode();
 
     /**
      * 获取医院id
@@ -51,17 +57,6 @@ public interface PatientOperator extends Operator {
      */
     String getClinicId();
 
-    /**
-     * 设置临床开始时间
-     * @param startTime
-     */
-    void setStartTime(Date startTime);
-
-    /**
-     * 获取临床开始时间
-     * @return
-     */
-    Date getStartTime();
 
     /**
      * 设置当前病号绑定主泵号
@@ -92,8 +87,4 @@ public interface PatientOperator extends Operator {
      */
     void clear();
 
-    /**
-     * 清空病号临床信息
-     */
-    void clearClinic();
 }

+ 5 - 8
nb-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java

@@ -82,9 +82,6 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
         if(deviceOperator==null){
             return;
         }
-        if(CharSequenceUtil.isNotEmpty(entity.getAlias())){
-            deviceOperator.setAlias(entity.getAlias());
-        }
         if(entity.getEnable()!=null){
             deviceOperator.setEnable(entity.getEnable());
         }
@@ -256,11 +253,11 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
                 log.info("更新设备数量:【{}】",CollUtil.size(existDevices));
                 this.updateBatchById(existDevices);
             })
-            .whenComplete((i,e)->{
-                if(e!=null){
-                    log.error("同步设备失败",e);
-                }
-            });
+                    .whenComplete((i,e)->{
+                        if(e!=null){
+                            log.error("同步设备失败",e);
+                        }
+                    });
         }
     }
 

+ 11 - 0
nb-system/src/main/java/com/coffee/bus/service/LocalBusEvaluationService.java

@@ -11,10 +11,13 @@ import com.coffee.bus.mapper.BusEvaluationMapper;
 import com.coffee.bus.service.dto.EvalQuery;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.crud.BaseService;
+import com.coffee.common.exception.CustomException;
+import org.hibernate.validator.constraints.Length;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.Optional;
 
@@ -42,6 +45,14 @@ public class LocalBusEvaluationService extends BaseService<BusEvaluationMapper,
 
     @Override
     public void validateBeforeSave(BusEvaluationEntity entity) {
+        if(StrUtil.isEmpty(entity.getPatientId())){
+            String clinicId = entity.getClinicId();
+            BusClinicEntity clinic = clinicService.getById(clinicId);
+            if(clinic==null){
+                throw new CustomException("临床id不能为空");
+            }
+            entity.setPatientId(clinic.getPatientId());
+        }
 
     }
 

+ 40 - 3
nb-system/src/main/java/com/coffee/bus/service/LocalBusHospitalConfigService.java

@@ -1,9 +1,14 @@
 package com.coffee.bus.service;
 
+import cn.dev33.satoken.spring.SpringMVCUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusHospitalConfigEntity;
+import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.enums.ConfigEnum;
+import com.coffee.bus.hospital.HospitalManager;
 import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.hospital.config.bean.*;
 import com.coffee.bus.mapper.BusHospitalConfigMapper;
@@ -14,7 +19,10 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -34,6 +42,10 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     @Lazy
     private HospitalManagerRegister managerRegister;
 
+    @Autowired
+    @Lazy
+    private LocalBusPatientService patientService;
+
     @Autowired
     @Lazy
     private WsPublishUtils wsPublishUtils;
@@ -46,6 +58,7 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     @Override
     public void validateBeforeUpdate(BusHospitalConfigEntity entity) {
 
+
     }
 
     @Override
@@ -58,9 +71,7 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
         BusHospitalConfigEntity configEntity = this.getById(entity.getId());
         managerRegister.refresh(configEntity.getTenantId(),false,true);
         if (entity.getType().equals(ConfigEnum.patientCode)) {
-            CompletableFuture.runAsync(()->{
-//                wsPublishUtils.publishPatientAdd();
-            });
+            updatePatientCode(configEntity.getTenantId());
         }
     }
 
@@ -68,6 +79,9 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     public void postUpdate(BusHospitalConfigEntity entity) {
         BusHospitalConfigEntity configEntity = this.getById(entity.getId());
         managerRegister.refresh(configEntity.getTenantId(),false,true);
+        if (entity.getType().equals(ConfigEnum.patientCode)) {
+            updatePatientCode(configEntity.getTenantId());
+        }
     }
 
     /**
@@ -188,4 +202,27 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
         result.setManual(manualUndoConfig);
         return JSONUtil.parseObj(result);
     }
+
+    private void updatePatientCode(String tenantId){
+        if(StrUtil.isNullOrUndefined(tenantId)){
+            return;
+        }
+        List<BusPatientEntity> patients = patientService.list();
+        CompletableFuture.runAsync(()->{
+            HospitalManager hospitalManager = managerRegister.get(tenantId);
+            BusDeviceRunningEntity tmp = new BusDeviceRunningEntity();
+            for (BusPatientEntity patient : patients) {
+                tmp.setPatientCode(patient.getOriginCode());
+                hospitalManager.formatPatientCode(tmp);
+                patient.setCode(StrUtil.isBlank(tmp.getFormatPatientCode())?patient.getOriginCode():tmp.getFormatPatientCode());
+            }
+            patientService.updateBatchById(patients);
+            wsPublishUtils.publishPatientUpdate(tenantId);
+        })
+                .whenComplete((i,e)->{
+                    if(e!=null){
+                        log.error("病号格式化失败,",e);
+                    }
+                });
+    }
 }

+ 12 - 6
nb-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java

@@ -56,6 +56,11 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
     @Lazy
     private LocalBusClinicService clinicService;
 
+
+    @Autowired
+    @Lazy
+    private LocalBusInfusionModifyService modifyService;
+
     @Override
     public void validateBeforeSave(BusInfusionHistoryEntity entity) {
 
@@ -356,12 +361,6 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
         return lastInfusion;
     }
 
-    public BusInfusionHistoryEntity findInfusion(String deviceId, String classification) {
-        return this.getOne(new QueryWrapper<BusInfusionHistoryEntity>()
-                .lambda()
-                .eq(BusInfusionHistoryEntity::getDeviceId,deviceId).eq(BusInfusionHistoryEntity::getClassification,classification)
-                .last("limit 1"));
-    }
 
     public IPage<CombineResult> queryPage(CombineQuery query, Page<CombineResult> page) {
         return this.baseMapper.queryPage(query,page);
@@ -378,4 +377,11 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
     public List<CombineEvalResult> queryStatsEval(CombineQuery query) {
         return this.baseMapper.queryStatsEval(query);
     }
+
+    public BusInfusionModifyEntity lastModify(String infusionId){
+        return modifyService.getOne(new QueryWrapper<BusInfusionModifyEntity>()
+                .lambda().eq(BusInfusionModifyEntity::getInfusionId,infusionId)
+                .orderByDesc(BusInfusionModifyEntity::getModifyTime)
+                .last("limit 1"));
+    }
 }

+ 98 - 91
nb-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java

@@ -1,5 +1,6 @@
 package com.coffee.bus.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -74,10 +75,6 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     @Lazy
     private LocalBusPatientService patientService;
 
-    @Autowired
-    @Lazy
-    private DeviceRegistry deviceRegistry;
-
     @Autowired
     @Lazy
     private LocalBusHospitalService hospitalService;
@@ -86,10 +83,10 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     @Override
     public void validateBeforeSave(BusPatientEntity entity) {
-        if(entity.getGender()==null){
+        if (entity.getGender() == null) {
             entity.setGender(SexEnum.UNKNOW);
         }
-        if(entity.getAlarm()==null){
+        if (entity.getAlarm() == null) {
             entity.setAlarm(PatientAlarmEnum.NONE);
         }
     }
@@ -108,60 +105,63 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     public void postSave(BusPatientEntity entity) {
         super.postSave(entity);
         //新增病人后推送主题,延迟推送,保证处理逻辑已全部完成
-        executorService.schedule(()->{
-                    wsPublishUtils.publishPatientAdd(entity.getCode(),entity.getTenantId());
+        executorService.schedule(() -> {
                     wsPublishUtils.publishMonitorTotalCount(entity.getTenantId());
                 }
-                ,2, TimeUnit.SECONDS);
+                , 2, TimeUnit.SECONDS);
     }
 
     /**
      * 获取病人信息
+     *
      * @param hospitalId  医院id
      * @param patientCode 病号
-     * @param sync 是否为同步操作
+     * @param sync        是否为同步操作
      */
-    public DeferredResult<R<BusClinicEntity>> getPatientInfoFromHis(String hospitalId, String patientCode, long timeout,boolean sync){
+    public DeferredResult<R<BusClinicEntity>> getPatientInfoFromHis(String hospitalId, String patientCode, long timeout, boolean sync) {
         BusHospitalEntity hospital = hospitalService.getById(hospitalId);
         HospitalManager hospitalManager = hospitalManagerRegister.get(hospitalId);
         HisScriptSession hisScriptSession = hospitalManager.getScriptSession();
         HisStrategyEnum strategy = hospital.getStrategy();
-        if(null==strategy||HisStrategyEnum.NONE.equals(strategy)){
+        if (null == strategy || HisStrategyEnum.NONE.equals(strategy)) {
             throw new CustomException("医院未对接his,请到【信息维护】->【HIS对接】配置his策略");
         }
-        log.info("医院【{}】,开始拉取病号【{}】信息,拉取方式【{}】",hospitalId,patientCode,sync?"同步":"异步");
-        return sync?hisScriptSession.syncGetPatientInfo(patientCode,timeout,TimeUnit.SECONDS):hisScriptSession.asyncGetPatientInfo(patientCode,timeout,TimeUnit.SECONDS,true);
+        log.info("医院【{}】,开始拉取病号【{}】信息,拉取方式【{}】", hospitalId, patientCode, sync ? "同步" : "异步");
+        return sync ? hisScriptSession.syncGetPatientInfo(patientCode, timeout, TimeUnit.SECONDS) : hisScriptSession.asyncGetPatientInfo(patientCode, timeout, TimeUnit.SECONDS, true);
     }
 
     /**
      * 描述: 对病人报警数量进行统计
-     * @author lifang
-     * @date 2022/5/20 16:42
+     *
      * @param tenantId
      * @param alarm
      * @return long
+     * @author lifang
+     * @date 2022/5/20 16:42
      */
-    public long patientAlarmCount(String tenantId,PatientAlarmEnum alarm){
-        return this.baseMapper.selectAlarmCount(tenantId,alarm.getValue());
+    public long patientAlarmCount(String tenantId, PatientAlarmEnum alarm) {
+        return this.baseMapper.selectAlarmCount(tenantId, alarm.getValue());
     }
 
-    public long patientAlarmCount(PatientAlarmEnum alarm){
-        return patientAlarmCount(null,alarm);
+    public long patientAlarmCount(PatientAlarmEnum alarm) {
+        return patientAlarmCount(null, alarm);
     }
 
-    public long monitorTotalCount(String tenantId){
-        return this.baseMapper.monitorTotalCount(tenantId);
+    public long monitorTotalCount(String tenantId) {
+        PatientMonitorQuery patientMonitorQuery = new PatientMonitorQuery();
+        patientMonitorQuery.setTenantId(tenantId);
+        return CollUtil.size(this.baseMapper.selectMonitor(Page.of(0,500,false),patientMonitorQuery).getRecords());
+//        return this.baseMapper.monitorTotalCount(tenantId);
     }
 
     /**
      * 获取给定医院下所有的挂载多个设备的病人信息
-     *
      */
     public List<PatientDeviceRepeatResult> repeatDevice() {
         List<PatientDeviceRepeatDomain> patientDeviceRepeats = this.baseMapper.selectRepeatDevice();
         Map<String, PatientDeviceRepeatResult> resultMap = new HashMap<>();
-        patientDeviceRepeats.forEach(deviceRepeat->{
-            PatientDeviceRepeatResult repeatResult = resultMap.computeIfAbsent(deviceRepeat.getCode()+deviceRepeat.getClinicId(),k->
+        patientDeviceRepeats.forEach(deviceRepeat -> {
+            PatientDeviceRepeatResult repeatResult = resultMap.computeIfAbsent(deviceRepeat.getCode() + deviceRepeat.getClinicId(), k ->
                     PatientDeviceRepeatResult.of(
                             deviceRepeat.getName(),
                             deviceRepeat.getGender(),
@@ -189,6 +189,7 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     /**
      * 获取无设备绑定的临床手术信息
+     *
      * @return
      */
     public List<PatientDeviceNoneResult> noneDevice() {
@@ -197,25 +198,27 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     public List<PatientMonitorResult> selectAll(PatientMonitorQuery query) {
         Page<PatientMonitorResult> page = new Page<>(0, 500, false);
-        IPage<PatientMonitorResult> result = this.baseMapper.selectMonitor(page,query);
-        if(CollectionUtil.isNotEmpty(result.getRecords())){
+        IPage<PatientMonitorResult> result = this.baseMapper.selectMonitor(page, query);
+        if (CollectionUtil.isNotEmpty(result.getRecords())) {
             result.getRecords().forEach(PatientMonitorResult::handleWarn);
         }
         return result.getRecords();
     }
 
-    /**t
+    /**
+     * t
      * 根据医院和住院号获取一个患者
+     *
      * @param tenantId
      * @param patientCode
      * @return
      */
     public BusPatientEntity getOneByHospitalAndPatientCode(String tenantId, String patientCode) {
         BusPatientEntity patient = this.getOne(new QueryWrapper<BusPatientEntity>().lambda()
-                .eq(BusPatientEntity::getTenantId,tenantId)
-                .eq(BusPatientEntity::getCode,patientCode));
+                .eq(BusPatientEntity::getTenantId, tenantId)
+                .eq(BusPatientEntity::getCode, patientCode));
         // 如果患者不存在则新增一个患者
-        if (Objects.isNull(patient)){
+        if (Objects.isNull(patient)) {
             patient = new BusPatientEntity();
             patient.setTenantId(tenantId);
             patient.setCode(patientCode);
@@ -225,18 +228,18 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     }
 
     /**
-     *
      * 病人手动更新当前监控的临床信息
+     *
      * @param clinic
      */
     @Transactional(rollbackFor = Exception.class)
     public void manualEdit(BusClinicEntity clinic) {
         BusClinicEntity originClinicInfo = clinicService.getById(clinic.getId());
-        if(originClinicInfo==null){
+        if (originClinicInfo == null) {
             throw new CustomException("该住院号临床信息不存在,请刷新后重试");
         }
         BusPatientEntity originPatientInfo = patientService.getById(originClinicInfo.getPatientId());
-        if(originPatientInfo==null){
+        if (originPatientInfo == null) {
             throw new CustomException("该住院号信息不存在,请刷新后重试");
         }
         //先更新手术信息
@@ -249,62 +252,64 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         this.updateById(patient);
         patientOperator.setClinicId(patient.getClinicId());
 
-        CompletableFuture.runAsync(()->{
-            wsPublishUtils.publishPatientMonitor(originPatientInfo.getId(),patient.getTenantId());
+        CompletableFuture.runAsync(() -> {
+            wsPublishUtils.publishPatientMonitor(originPatientInfo.getId(), patient.getTenantId());
         });
     }
 
     /**
      * 根据病号查询临床监控记录
-     * @author lifang
+     *
      * @param patientId 病号id
-     * @param tenantId 医院id
+     * @param tenantId  医院id
      * @return
+     * @author lifang
      */
-    public PatientMonitorResult lookMonitorByPatientCode(String patientId,String tenantId) {
+    public PatientMonitorResult lookMonitorByPatientCode(String patientId, String tenantId) {
         try {
             return this.baseMapper.findByPatientId(tenantId, patientId);
         } catch (Exception e) {
-            log.error("根据病号查询临床失败,",e.getMessage());
+            log.error("根据病号查询临床失败,", e.getMessage());
             return null;
         }
     }
 
     /**
      * 描述: 设备状态数量统计
-     * @author lifang
-     * @date 2022/5/8 21:52
+     *
      * @param tenantId 医院id 用户请求时传输null
      * @return MonitorStatusStatsCountResult
+     * @author lifang
+     * @date 2022/5/8 21:52
      */
     public MonitorStatusStatsCountResult statusStats(String tenantId) {
         PatientMonitorQuery query = new PatientMonitorQuery();
         query.setTenantId(tenantId);
         List<PatientMonitorResult> patientMonitorResults = this.selectAll(query);
         MonitorStatusStatsCountResult result = new MonitorStatusStatsCountResult();
-        if(CollectionUtil.isNotEmpty(patientMonitorResults)){
-            patientMonitorResults.forEach(monitor->{
+        if (CollectionUtil.isNotEmpty(patientMonitorResults)) {
+            patientMonitorResults.forEach(monitor -> {
                 //运行数量
-                if(!Boolean.TRUE.equals(monitor.getInfusionFinished())&&
-                        DeviceStatusEnum.Running.equals(monitor.getDeviceRunState())){
-                    result.setRunningCount(result.getRunningCount()+1);
+                if (!Boolean.TRUE.equals(monitor.getInfusionFinished()) &&
+                        DeviceStatusEnum.Running.equals(monitor.getDeviceRunState())) {
+                    result.setRunningCount(result.getRunningCount() + 1);
                 }
-                if((Boolean.TRUE.equals(monitor.getInfusionFinished()))||
-                        (DeviceStatusEnum.Shutdown.equals(monitor.getDeviceRunState())||DeviceStatusEnum.NoSignal.equals(monitor.getDeviceRunState()))){
-                    result.setWaitingFinish(result.getWaitingFinish()+1);
+                if ((Boolean.TRUE.equals(monitor.getInfusionFinished())) ||
+                        (DeviceStatusEnum.Shutdown.equals(monitor.getDeviceRunState()) || DeviceStatusEnum.NoSignal.equals(monitor.getDeviceRunState()))) {
+                    result.setWaitingFinish(result.getWaitingFinish() + 1);
                 }
                 //报警数量
-                if(!Boolean.TRUE.equals(monitor.getInfusionFinished())&&
-                        monitor.getDeviceAlarm()!=null&&!monitor.getDeviceAlarm().equals(DeviceAlarmEnum.None)){
-                    result.setAlarmCount(result.getAlarmCount()+1);
+                if (!Boolean.TRUE.equals(monitor.getInfusionFinished()) &&
+                        monitor.getDeviceAlarm() != null && !monitor.getDeviceAlarm().equals(DeviceAlarmEnum.None)) {
+                    result.setAlarmCount(result.getAlarmCount() + 1);
                 }
                 //提醒数量
-                if(!Boolean.TRUE.equals(monitor.getInfusionFinished())&&
+                if (!Boolean.TRUE.equals(monitor.getInfusionFinished()) &&
                         (Boolean.TRUE.equals(monitor.getWarnAnalgesicPoor())
-                                ||Boolean.TRUE.equals(monitor.getWarnLowBattery())
-                                ||Boolean.TRUE.equals(monitor.getWarnWillFinished())
-                                ||monitor.getWarnFlow()!=null)){
-                    result.setWarnCount(result.getWarnCount()+1);
+                                || Boolean.TRUE.equals(monitor.getWarnLowBattery())
+                                || Boolean.TRUE.equals(monitor.getWarnWillFinished())
+                                || monitor.getWarnFlow() != null)) {
+                    result.setWarnCount(result.getWarnCount() + 1);
                 }
             });
         }
@@ -313,38 +318,39 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     /**
      * 描述: 按照时间对输注监控进行统计
-     * @author lifang
-     * @date 2022/5/8 22:40
+     *
      * @param tenantId 医院id
      * @return MonitorTimeStatsCountResult
+     * @author lifang
+     * @date 2022/5/8 22:40
      */
     public MonitorTimeStatsCountResult timeStats(String tenantId) {
         PatientMonitorQuery query = new PatientMonitorQuery();
         query.setTenantId(tenantId);
         List<PatientMonitorResult> patientMonitorResults = this.selectAll(query);
         MonitorTimeStatsCountResult result = new MonitorTimeStatsCountResult();
-        patientMonitorResults.forEach(monitor->{
+        patientMonitorResults.forEach(monitor -> {
             Date startTime = monitor.getMonitorStartTime();
-            if(startTime==null){
+            if (startTime == null) {
                 return;
             }
             if (includeTimes(startTime, 0)) {
-                result.setToday(result.getToday()+1);
+                result.setToday(result.getToday() + 1);
                 return;
             }
             if (includeTimes(startTime, -1)) {
-                result.setOneDay(result.getOneDay()+1);
+                result.setOneDay(result.getOneDay() + 1);
                 return;
             }
             if (includeTimes(startTime, -2)) {
-                result.setTwoDay(result.getTwoDay()+1);
+                result.setTwoDay(result.getTwoDay() + 1);
                 return;
             }
             if (includeTimes(startTime, -3)) {
-                result.setThreeDay(result.getThreeDay()+1);
+                result.setThreeDay(result.getThreeDay() + 1);
                 return;
             }
-            result.setBeyondThreeDay(result.getBeyondThreeDay()+1);
+            result.setBeyondThreeDay(result.getBeyondThreeDay() + 1);
         });
 
         return result;
@@ -352,62 +358,63 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     /**
      * 描述: 判断所给时间是否在存在于某一时间段内
-     * @author lifang
-     * @date 2022/5/8 22:47
-     * @param time 时间
+     *
+     * @param time   时间
      * @param offset 时间偏移量,单位:天 以当天时间为基准进行偏移
      * @return boolean
+     * @author lifang
+     * @date 2022/5/8 22:47
      */
-    private boolean includeTimes(Date time,int offset){
-        if(time==null){
+    private boolean includeTimes(Date time, int offset) {
+        if (time == null) {
             return false;
         }
         LocalDateTime dateTime = LocalDateTime.now().plusDays(offset);
         LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(dateTime);
         LocalDateTime endTime = LocalDateTimeUtil.endOfDay(dateTime);
-        return beginTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()<time.getTime()
-                && time.getTime()<endTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
+        return beginTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() < time.getTime()
+                && time.getTime() < endTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
     }
 
     /**
      * 切换主泵
+     *
      * @param shiftConfig 切换配置
      */
     @Transactional(rollbackFor = Exception.class)
     public void shift(DeviceShiftConfig shiftConfig) {
         String formatCode = shiftConfig.getPatientCode();
         BusPatientEntity patient = patientService.getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode, formatCode));
-        if(patient==null){
-            throw new CustomException(String.format("住院号【%s】不存在,请刷新后重试",shiftConfig.getPatientCode()));
+        if (patient == null) {
+            throw new CustomException(String.format("住院号【%s】不存在,请刷新后重试", shiftConfig.getPatientCode()));
         }
         shiftConfig.setPatientId(patient.getId());
         PatientOperator patientOperator = patientRegistry.getOperator(shiftConfig.getTenantId(), shiftConfig.getPatientCode());
-        List<String> replicaDeviceIds = shiftConfig.getReplicaDeviceIds();
+
         String masterDeviceId = shiftConfig.getMasterDeviceId();
 
         BusInfusionHistoryEntity masterInfusion = infusionHistoryService.lastInfusion(masterDeviceId);
 
         //病患绑定主泵信息
         this.update(new UpdateWrapper<BusPatientEntity>().lambda()
-                .eq(BusPatientEntity::getCode,shiftConfig.getPatientCode())
-                .eq(BusPatientEntity::getTenantId,shiftConfig.getTenantId())
-                .set(BusPatientEntity::getInfusionId,masterInfusion.getId()));
-
-        //刷新缓存信息
-        replicaDeviceIds.stream()
-                .map(deviceRegistry::getOperator).forEach(deviceOperator->{
-            deviceOperator.setMaster(false);
-        });
+                .eq(BusPatientEntity::getCode, shiftConfig.getPatientCode())
+                .eq(BusPatientEntity::getTenantId, shiftConfig.getTenantId())
+                .set(BusPatientEntity::getInfusionId, masterInfusion.getId()));
 
         patientOperator.setBindDeviceId(shiftConfig.getMasterDeviceId());
     }
 
-    public BusPatientEntity findByFormatCode(String patientCode, String tenantId){
-        return this.getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode,patientCode)
-                .eq(StrUtil.isNotBlank(tenantId),BusPatientEntity::getTenantId,tenantId));
+    public BusPatientEntity findByFormatCode(String patientCode, String tenantId) {
+        return this.getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode, patientCode)
+                .eq(StrUtil.isNotBlank(tenantId), BusPatientEntity::getTenantId, tenantId));
+    }
+
+    public BusPatientEntity findByFormatCode(String patientCode) {
+        return findByFormatCode(patientCode, null);
     }
 
-    public BusPatientEntity findByFormatCode(String patientCode){
-        return findByFormatCode(patientCode,null);
+    public BusPatientEntity findByOriginCode(String patientCode, String tenantId) {
+        return this.getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getOriginCode, patientCode)
+                .eq(StrUtil.isNotBlank(tenantId), BusPatientEntity::getTenantId, tenantId));
     }
 }

+ 3 - 3
nb-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java

@@ -84,10 +84,10 @@ public class WsPublishUtils implements Serializable{
      * @return void
      */
     @Async
-    public void publishPatientAdd(String patientCode,String tenantId){
+    public void publishPatientUpdate(String tenantId){
         Assert.hasText(tenantId,"医院id不能为空");
-        JSONObject message = new JSONObject().putOpt("patientCode", patientCode);
-        this.publish(WebSocketConstant.getPatientAdd(tenantId).getTopic(),
+        JSONObject message = new JSONObject().putOpt("result", 1);
+        this.publish(WebSocketConstant.getPatientUpdate(tenantId).getTopic(),
                 TopicMessage.of(message,tenantId));
     }
     /**

+ 2 - 2
nb-system/src/main/java/com/coffee/bus/web/handler/CheckRequestHandler.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.json.JSONObject;
 import com.coffee.bus.web.RequestCheckProperties;
+import com.coffee.common.config.CacheHttpServletRequestWrapper;
 import com.coffee.common.exception.RequestParmErrorException;
 import com.coffee.common.exception.RequestSignErrorException;
 import com.coffee.common.exception.RequestTimeOutException;
@@ -34,11 +35,10 @@ import java.util.concurrent.TimeUnit;
 @AllArgsConstructor
 public class CheckRequestHandler  implements HandlerInterceptor {
     private final RequestCheckProperties properties;
-    private final RedisUtils redisUtils;
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         String method = request.getMethod();
-        if (method.equals(HttpMethod.POST.name())) {
+        if (request instanceof CacheHttpServletRequestWrapper && method.equals(HttpMethod.POST.name())) {
             //检查参数是否齐全
             String sign = request.getHeader("Sign");
             String timestamp = request.getHeader("Timestamp");

+ 78 - 35
nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -13,22 +13,24 @@ import com.coffee.bus.enums.DeviceTypeEnum;
 import com.coffee.bus.enums.FlowStatusEnum;
 import com.coffee.bus.enums.PatientAlarmEnum;
 import com.coffee.bus.hospital.HospitalManagerRegister;
-import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.listener.event.bean.DeviceInfoEvent;
 import com.coffee.bus.registry.device.DeviceOperator;
+import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
 import com.coffee.bus.service.*;
 import com.coffee.bus.utils.WsPublishUtils;
 import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 import java.util.function.Supplier;
@@ -41,10 +43,10 @@ import java.util.function.Supplier;
  * @createTime 2022年03月27日 11:21:00
  */
 @Component
-@Slf4j
 @AllArgsConstructor
 public class DeviceInfoListener {
 
+    private static final Logger log = org.slf4j.LoggerFactory.getLogger(DeviceInfoListener.class);
     private final DeviceRegistry deviceRegistry;
 
     private final LocalBusDeviceAlarmService alarmService;
@@ -66,6 +68,7 @@ public class DeviceInfoListener {
     private final LocalBusDeviceService deviceService;
 
     private final Executor executor;
+
     private final HospitalManagerRegister hospitalManagerRegister;
 
     /**
@@ -89,7 +92,6 @@ public class DeviceInfoListener {
             }
             long startTime = System.currentTimeMillis();
 
-
             //对设备数据的一些参数进行初始化设置
             init(device);
 
@@ -115,7 +117,6 @@ public class DeviceInfoListener {
                         .lambda()
                         .eq(BusDeviceEntity::getDeviceId,device.getDeviceId())
                         .set(BusDeviceEntity::getInfusionId,device.getInfusionId())
-                        .set(BusDeviceEntity::getType,device.getType())
                 );
                 infusionHistoryService.save(infusionHistory);
             }else {
@@ -123,6 +124,7 @@ public class DeviceInfoListener {
             }
 
             cacheOperation.add(()->{
+                deviceOperator.setUploadTime(device.getUploadTime());
                 wsPublishUtils.publishPatientMonitor(device.getPatientId(),device.getTenantId());
                 if (Boolean.TRUE.equals(device.isResetUndo())||Boolean.TRUE.equals(device.isInfusionModify())) {
                     if (Boolean.TRUE.equals(device.isInfusionModify())) {
@@ -135,10 +137,10 @@ public class DeviceInfoListener {
                 }
                 wsPublishUtils.publishMonitorStateCount(device.getTenantId());
                 if(device.isNewInfusion()){
-                    CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getPatientCode(),10,false)
+                    CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getFormatPatientCode(),10,false)
                             ,executor)
                             .exceptionally(t->{
-                                log.error("新的输注产生后,拉取病号【{}】信息失败,失败原因:",device.getPatientCode(),t);
+                                log.error("新的输注产生后,拉取病号【{}】信息失败,失败原因:",device.getFormatPatientCode(),t);
                                 return null;
                             });
                 }
@@ -191,8 +193,7 @@ public class DeviceInfoListener {
         device.setMonitorType(true);
         device.setUploadTime(device.getUploadTime()==null?new Date():device.getUploadTime());
 
-        device.setStartTime(deviceOperator.getStartTime());
-        device.setTenantId(deviceOperator.getTenantId());
+        device.setTenantId(deviceOperator.getInfusionTenantId());
         //将设备撤泵标志去除
         device.setIsUndo(false);
 
@@ -241,20 +242,18 @@ public class DeviceInfoListener {
                             if(log.isDebugEnabled()){
                                 log.debug("住院号病人信息,【{}】,输注设备被占用,切换设备",JSONUtil.toJsonStr(lastPatient));
                             }
-                            patientRegistry
-                                    .getOperator(lastInfusion.getTenantId(),lastPatient.getOriginCode())
-                                    .setBindDeviceId(normalInfusion.getDeviceId());
-                            suppliers.add(()->{
-                                wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientId(),lastInfusion.getTenantId());
-                                return null;
-                            });
+                            if(lastPatient!=null){
+                                patientRegistry
+                                        .getOperator(lastInfusion.getTenantId(),lastPatient.getOriginCode())
+                                        .setBindDeviceId(normalInfusion.getDeviceId());
+                                suppliers.add(()->{
+                                    wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientId(),lastInfusion.getTenantId());
+                                    return null;
+                                });
+                            }
                         }
                     }
                 }
-//                if(clinicFinished){
-//                    clinicService.resetClinic(device.getClinicId());
-//                    device.setResetClinic(true);
-//                }
                 device.setMaster(true);
                 suppliers.add(()->{
                     currentPatientOperator.setBindDeviceId(deviceId);
@@ -282,15 +281,19 @@ public class DeviceInfoListener {
      */
     private BusInfusionHistoryEntity handleInfusionHistory(BusDeviceRunningEntity device, DeviceOperator deviceOperator, List<Supplier<?>> cacheOperation) {
         boolean newInfusion=isNewInFusion(device.getDeviceId(),device.getClassification());
+        device.setNewInfusion(newInfusion);
         if(newInfusion){
-            BusDeviceEntity deviceEntity = deviceService.getByDeviceId(device.getDeviceId());
-            device.setTenantId(deviceEntity.getTenantId());
+            device.setStartTime(device.getUploadTime());
+        }else {
+            device.setStartTime(deviceOperator.getStartTime());
         }
         PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode(),MapUtil.of("startTime", device.getStartTime()));
         device.setClinicId(patientOperator.getClinicId());
         device.setPatientId(patientOperator.getPatientId());
-        //智能泵处理
+        //处理智能泵数据
         handleIntelligent(device,deviceOperator);
+        //处理追加量数据
+        handleAppendDose(device,deviceOperator,cacheOperation);
         BusInfusionHistoryEntity infusionHistory = BusInfusionHistoryEntity.parseRunningInfo(device);
         String originInfusionId = deviceOperator.getInfusionId();
         if(ObjectUtil.equal(device.getDeviceId(),patientOperator.getBindDeviceId())){
@@ -300,7 +303,6 @@ public class DeviceInfoListener {
             infusionHistory.setId(IdWorker.getIdStr());
             infusionHistory.setFinished(false);
             infusionHistory.setStartTime(device.getUploadTime());
-            device.setNewInfusion(true);
             //结束其余输注信息
             infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
                     .eq(BusInfusionHistoryEntity::getDeviceId,device.getDeviceId())
@@ -309,10 +311,12 @@ public class DeviceInfoListener {
                     .set(BusInfusionHistoryEntity::getFinished,true));
         }else {
             device.setNewInfusion(false);
-            infusionHistory.setStartTime(device.getStartTime());
+//            infusionHistory.setStartTime(device.getStartTime());
             infusionHistory.setId(originInfusionId);
             BusInfusionHistoryEntity originInfusion = infusionHistoryService.getById(originInfusionId);
-            device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
+            if(originInfusion!=null){
+                device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
+            }
         }
         device.setInfusionId(infusionHistory.getId());
         cacheOperation.add(()->{
@@ -323,11 +327,57 @@ public class DeviceInfoListener {
                 deviceOperator.setTenantId(device.getTenantId());
                 deviceOperator.setContinueDose(device.getContinueDose());
             }
+            patientOperator.setExist(true);
             return null;
         });
         return infusionHistory;
     }
 
+    /**
+     * 描述: 处理追加量数据
+     * @author lifang
+     * @date 2022/7/1 11:05
+     * @param device
+     * @param deviceOperator
+     * @return void
+     */
+    private void handleAppendDose(BusDeviceRunningEntity device, DeviceOperator deviceOperator, List<Supplier<?>> cacheOperation) {
+        BigDecimal appendDose = device.getAppendDose();
+        device.setTotalAppendDose(BigDecimal.ZERO);
+        if(device.isNewInfusion()){
+            //仅计算此次输注过程中的追加量
+            if(appendDose!=null){
+                device.setTotalAppendDose(appendDose.multiply(BigDecimal.valueOf(Optional.ofNullable(device.getPcaValidCount()).orElse(0))));
+            }
+        }else{
+            if(device.getPcaValidCount()==null||device.getPcaValidCount()==0){
+                device.setTotalAppendDose(BigDecimal.ZERO);
+            }else {
+                Integer lastPcaValidCount = deviceOperator.getLastPcaValidCount();
+                //当pca值变小是则以当前值为准重新计算
+                int compare = CompareUtil.compare(device.getPcaValidCount(),lastPcaValidCount);
+                BigDecimal totalAppendDose = deviceOperator.getTotalAppendDose();
+                if(compare==0){
+                    device.setTotalAppendDose(totalAppendDose);
+                }else if(compare>0){
+                    BigDecimal appendTotalDose=appendDose.multiply(BigDecimal.valueOf(device.getPcaValidCount()-lastPcaValidCount));
+                    totalAppendDose=totalAppendDose.add(appendTotalDose);
+                    device.setTotalAppendDose(totalAppendDose);
+                }else {
+                    device.setTotalAppendDose(appendDose.multiply(BigDecimal.valueOf(Optional.ofNullable(device.getPcaValidCount()).orElse(0))));
+                }
+            }
+
+        }
+
+        cacheOperation.add(()->{
+            deviceOperator.setLastPcaValidCount(Optional.ofNullable(device.getPcaValidCount()).orElse(0));
+            deviceOperator.setTotalAppendDose(Optional.ofNullable(device.getTotalAppendDose()).orElse(BigDecimal.ZERO));
+            return null;
+        });
+
+    }
+
     /**
      * 描述: 处理输注参数
      * @author lifang
@@ -354,7 +404,6 @@ public class DeviceInfoListener {
             cacheOperation.add(()->{
                 if(device.isInfusionModify()){
                     deviceOperator.setInfusionParam(signHex);
-                    deviceOperator.setModifyTime(device.getUploadTime());
                 }
                 return null;
             });
@@ -366,19 +415,13 @@ public class DeviceInfoListener {
                 infusionModifyService.save(modify);
             }
             device.setInfusionModifyId(modify.getId());
-            //已输注为主对无泵进行判断
-//            if (DeviceStatusEnum.Shutdown.equals(device.getRunState())) {
-//                //设备关机后,查看用户是否存在其他正在进行的输注
-//                infusionHistoryService.deviceShutDown(device.getInfusionId(),device.getPatientCode(),device.getTenantId());
-//            }
         }
         //判断临床是否已结束,若临床已结束,则采用当前输注作为主输注开启临床
         if(clinicFinished){
             clinicService.resetClinic(device.getClinicId());
             patientService.update(new UpdateWrapper<BusPatientEntity>()
                     .lambda()
-                    .eq(BusPatientEntity::getCode,device.getPatientCode())
-                    .eq(BusPatientEntity::getTenantId,device.getTenantId())
+                    .eq(BusPatientEntity::getId,device.getPatientId())
                     .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
             PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
             device.setMaster(true);

+ 12 - 20
nb-system/src/main/resources/mapper/bus/BusDeviceAlarmMapper.xml

@@ -27,10 +27,10 @@
 
     <select id="selectWarnCount" parameterType="com.coffee.bus.service.dto.DeviceAlarmQuery" resultType="com.coffee.bus.service.dto.DeviceWarnCountResult">
         SELECT
-            da.tenant_id,
-            SUM(CASE warn_will_finished WHEN 1 THEN 1 ELSE 0 END) as 'warn_will_finished',
-                SUM(CASE warn_low_battery WHEN 1 THEN 1 ELSE 0 END) as 'warn_low_battery',
-                SUM(CASE warn_analgesic_poor WHEN 1 THEN 1 ELSE 0 END) as 'warn_analgesic_poor'
+        da.tenant_id,
+        SUM(CASE warn_will_finished WHEN 1 THEN 1 ELSE 0 END) as 'warn_will_finished',
+        SUM(CASE warn_low_battery WHEN 1 THEN 1 ELSE 0 END) as 'warn_low_battery',
+        SUM(CASE warn_analgesic_poor WHEN 1 THEN 1 ELSE 0 END) as 'warn_analgesic_poor'
         FROM
         (select * from bus_device_alarm
         <where>
@@ -40,6 +40,9 @@
             <if test="query.uploadTimeMax!=null">
                 and upload_time &lt;= #{query.uploadTimeMax}
             </if>
+            <if test="query.type != null">
+                AND device_type = #{query.type}
+            </if>
         </where>
         ) AS da
         left JOIN (
@@ -51,13 +54,10 @@
             <if test="query.uploadTimeMax != null">
                 AND update_time &lt;= #{query.uploadTimeMax}
             </if>
-            <if test="query.type != null">
-                AND type = #{query.type}
-            </if>
         </where>
         ) AS d ON da.device_id = d.device_id
         GROUP BY
-            da.tenant_id
+        da.tenant_id
     </select>
 
 
@@ -76,21 +76,13 @@
             <if test="query.uploadTimeMax!=null">
                 and upload_time &lt;= #{query.uploadTimeMax}
             </if>
-        </where>
-        ) AS da
-        left JOIN (
-        select * from bus_device
-        <where>
-            <if test="query.uploadTimeMin != null">
-                and update_time &gt;= #{query.uploadTimeMin}
-            </if>
-            <if test="query.uploadTimeMax != null">
-                AND update_time &lt;= #{query.uploadTimeMax}
-            </if>
             <if test="query.type != null">
-                AND type = #{query.type}
+                AND device_type = #{query.type}
             </if>
         </where>
+        ) AS da
+        JOIN (
+        select * from bus_device
         )AS d ON da.device_id = d.device_id
         GROUP BY
         da.tenant_id,

+ 5 - 5
nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -117,10 +117,10 @@
              i.run_state as device_run_state,
              i.alarm as device_alarm,
              i.start_time as infusion_start_time
-            FROM (SELECT `name`,gender,infusion_id,CODE FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
-            join  (select * from bus_infusion_history where is_undo=0 and finished=0) as i on i.patient_code=p.code
+            FROM (SELECT `name`,gender,infusion_id,CODE,id FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
+            join  (select * from bus_infusion_history where is_undo=0 and finished=0) as i on i.patient_id=p.id
             join (select device_id,alias from bus_device) as d on d.device_id=i.device_id
-            join  (SELECT * FROM bus_clinic WHERE finished=0 and monitor_type=1) AS c ON  c.`patient_code`=p.code;
+            join  (SELECT * FROM bus_clinic WHERE finished=0 and monitor_type=1) AS c ON  c.`patient_id`=p.id;
         </select>
 
     <select id="selectNoneDevice" resultMap="deviceNone">
@@ -284,7 +284,7 @@
         </where>
         ) as i on p.infusion_id=i.id
         left join (select device_id,alias
-         from bus_device
+        from bus_device
         <where>
             <if test="query.tenantId!=null">
                 and tenant_id=#{query.tenantId}
@@ -428,7 +428,7 @@
             </if>
         </where>
         ) as c on p.id=c.patient_id
---         ) as c on p.code=c.patient_code
+        --         ) as c on p.code=c.patient_code
         <where>
             <if test="alarmValue!=null">
                 and p.alarm=#{alarmValue}