Kaynağa Gözat

Revert "update 缓存方式"

This reverts commit b19cb3aef5e81937205e92ff5fea990ff21b4151.

# Conflicts:
#	nb-admin/src/main/resources/application.yml
#	nb-common/pom.xml
#	nb-common/src/main/java/com/coffee/common/config/CachingContentFilter.java
#	nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
#	nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalPatientCodeHandler.java
#	nb-system/src/main/java/com/coffee/bus/registry/Operator.java
#	nb-system/src/main/java/com/coffee/bus/registry/constant/DeviceKeyConstant.java
#	nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java
#	nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
#	nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java
#	nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
#	nb-system/src/main/java/com/coffee/bus/service/LocalBusHospitalConfigService.java
#	nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
#	nb-system/src/main/resources/mapper/bus/BusDeviceAlarmMapper.xml
A17404李放 3 yıl önce
ebeveyn
işleme
2ba8aeb006
36 değiştirilmiş dosya ile 590 ekleme ve 820 silme
  1. 2 2
      nb-admin/src/main/resources/application-prod.yml
  2. 2 10
      nb-admin/src/main/resources/application.yml
  3. 0 0
      nb-admin/src/main/resources/logback.xml
  4. 0 1
      nb-admin/src/test/java/com/coffee/admin/BusPatientTest.java
  5. 4 0
      nb-common/pom.xml
  6. 1 2
      nb-common/src/main/java/com/coffee/common/cache/value/Value.java
  7. 3 4
      nb-common/src/main/java/com/coffee/common/config/CacheHttpServletRequestWrapper.java
  8. 4 8
      nb-common/src/main/java/com/coffee/common/config/CachingContentFilter.java
  9. 3 3
      nb-common/src/main/java/com/coffee/common/config/websocket/WebSocketConstant.java
  10. 2 2
      nb-framework/src/main/java/com/coffee/framework/config/mybatisplus/handler/CreateAndUpdateMetaObjectHandler.java
  11. 0 9
      nb-system/src/main/java/com/coffee/bus/entity/BusAppConfig.java
  12. 1 1
      nb-system/src/main/java/com/coffee/bus/entity/common/DeviceProperties.java
  13. 0 31
      nb-system/src/main/java/com/coffee/bus/enums/AppEnum.java
  14. 23 21
      nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
  15. 2 4
      nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalPatientCodeHandler.java
  16. 0 1
      nb-system/src/main/java/com/coffee/bus/mapper/BusPatientMapper.java
  17. 23 17
      nb-system/src/main/java/com/coffee/bus/registry/Operator.java
  18. 12 9
      nb-system/src/main/java/com/coffee/bus/registry/constant/DeviceKeyConstant.java
  19. 6 1
      nb-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java
  20. 82 217
      nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java
  21. 47 6
      nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
  22. 71 61
      nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java
  23. 44 73
      nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
  24. 9 4
      nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java
  25. 24 15
      nb-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java
  26. 3 0
      nb-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  27. 1 12
      nb-system/src/main/java/com/coffee/bus/service/LocalBusEvaluationService.java
  28. 3 40
      nb-system/src/main/java/com/coffee/bus/service/LocalBusHospitalConfigService.java
  29. 6 12
      nb-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  30. 91 98
      nb-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java
  31. 3 3
      nb-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java
  32. 2 2
      nb-system/src/main/java/com/coffee/bus/web/handler/CheckRequestHandler.java
  33. 2 2
      nb-system/src/main/java/com/coffee/bus/websocket/PatientAddHandler.java
  34. 96 139
      nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  35. 15 7
      nb-system/src/main/resources/mapper/bus/BusDeviceAlarmMapper.xml
  36. 3 3
      nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

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

@@ -28,7 +28,7 @@ spring:
     druid:
       # 主库数据源
       master:
-        url: jdbc:mysql://47.101.214.91:7001/nbnetpump?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
+        url: jdbc:mysql://192.168.100.32:3306/nbnetpump?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
         username: root
         password: 123456
       # 从库数据源
@@ -120,6 +120,6 @@ aliyun:
   # iotInstanceId:企业版实例请填写实例ID,公共实例请填空字符串""。
   iotInstanceId: "iot-060a0bgd"
   server-subscription:
-    enable: false  # 是否开启阿里云物联网服务端订阅
+    enable: true  # 是否开启阿里云物联网服务端订阅
   product:
     productKey: he1f6YdSWHW

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

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

+ 0 - 0
nb-admin/src/main/resources/logback-spring.xml → nb-admin/src/main/resources/logback.xml


+ 0 - 1
nb-admin/src/test/java/com/coffee/admin/BusPatientTest.java

@@ -197,7 +197,6 @@ public class BusPatientTest {
         infusionHistoryService.updateBatchById(list);
     }
 
-
     public static void main(String[] args) {
         System.out.println(getName());
     }

+ 4 - 0
nb-common/pom.xml

@@ -15,6 +15,10 @@
         <dependency>
             <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 模块-->
         <!--<dependency>-->

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

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

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

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

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

@@ -1,11 +1,12 @@
 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;
 
 /**
@@ -26,14 +27,9 @@ 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_UPDATE ="patient-update";
+    public static final String PATIENT_ADD ="patient-add";
 
     public static final String DEVICE_REPEAT ="device-repeat";
 
@@ -86,8 +86,8 @@ public class WebSocketConstant {
      * @param tenantId 设备所属医院
      * @return
      */
-    public static TopicWrapper getPatientUpdate(String tenantId){
-        return getTopic(PATIENT_UPDATE,null,null,tenantId);
+    public static TopicWrapper getPatientAdd(String tenantId){
+        return getTopic(PATIENT_ADD,null,null,tenantId);
     }
 
 

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

@@ -42,14 +42,14 @@ 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) ? "1" : loginUser.getSysUser().getId().toString());
+                this.strictInsertFill(metaObject, CREATE_BY, String.class, Objects.isNull(loginUser) ? null : 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) ? "1" : loginUser.getSysUser().getId().toString());
+                this.strictUpdateFill(metaObject, UPDATE_BY, String.class, Objects.isNull(loginUser) ? null : loginUser.getSysUser().getId().toString());
             }
             if (metaObject.hasGetter(TENANT_ID) && metaObject.getValue(TENANT_ID) == null) {
                 ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

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

@@ -5,7 +5,6 @@ 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;
@@ -37,14 +36,6 @@ 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 = "病区")

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

@@ -1,31 +0,0 @@
-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;
-}

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

@@ -1,6 +1,5 @@
 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;
@@ -9,7 +8,6 @@ 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;
@@ -22,8 +20,9 @@ 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;
 
 /**
@@ -41,6 +40,9 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
     private HospitalFinishMonitorConfigHandler monitorConfigHandler;
     private HospitalAutoUndoConfigHandler autoUndoConfigHandler;
     private LocalBusDeviceAlarmService alarmService;
+    private LocalBusPatientService patientService;
+    //最后一次不在服务区警报延迟任务
+    private NoSignalEntity lastNoSignalWarn;
     //最后一次低输注警报延迟任务
     private LowInfusionEntity lastLowInfusionWarn;
 
@@ -54,6 +56,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         this.monitorConfigHandler=monitorConfigHandler;
         this.autoUndoConfigHandler=autoUndoConfigHandler;
         this.alarmService=alarmService;
+        this.patientService=patientService;
     }
 
     @Override
@@ -98,8 +101,11 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
                 this.handleNoSignal((NoSignalEntity) e);
             }
         });
-
-       NoSignalEntity lastNoSignalWarn = NoSignalEntity.builder()
+        //清空延迟队列消息
+        if(lastNoSignalWarn!=null){
+            delayedQueue.remove(lastNoSignalWarn);
+        }
+        lastNoSignalWarn = NoSignalEntity.builder()
                 .deviceId(source.getDeviceId())
                 .patientCode(source.getPatientCode())
                 .tenantId(source.getTenantId())
@@ -123,39 +129,35 @@ 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())) {
             //输注已结束
-            if(log.isDebugEnabled()){
-                log.debug("不在服务区消息【{}】由于输注已结束,不在继续处理该消息,消息【{}】",source.getId(),source);
-            }
+            log.debug("不在服务区消息【{}】由于输注已结束,不在继续处理该消息,消息【{}】",source.getId(),source);
             return;
         }
-        //不在服务区报警信息保存
-        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);
+        if(!infusionHistory.getLastUploadTime().equals(source.getUploadTime())){
+            //有数据更新,取消不在服务区判定
+            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);
         alarmService.save(alarm);
 
         boolean update = infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
                 .eq(BusInfusionHistoryEntity::getId, infusionHistory.getId())
-                .eq(BusInfusionHistoryEntity::getLastUploadTime, source.getUploadTime())
+                .lt(BusInfusionHistoryEntity::getLastUploadTime, uploadTime)
                 .set(BusInfusionHistoryEntity::getRunState, DeviceStatusEnum.NoSignal));
         //报警/提醒缓存重置
         if(update){
-            log.info("消息【】处理成功,输注【】变为【不在服务区】状态",source.getId(),source.getInfusionId());
+            deviceRegistry.getOperator(deviceId)
+                    .setStatus(DeviceStatusEnum.NoSignal);
             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());
         }
     }
 

+ 2 - 4
nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalPatientCodeHandler.java

@@ -44,11 +44,9 @@ public class HospitalPatientCodeHandler  extends AbstractHospitalConfigHandler<F
         FunctionPatientCodeConfig config = this.getConfig().as(FunctionPatientCodeConfig.class);
         if(config==null||!Boolean.TRUE.equals(config.getEnable())|| Objects.isNull(config.getFillChar())){
             log.warn("id:{},配置名称:{},不存在",hospitalId,getId());
-            source.setFormatPatientCode(source.getPatientCode());
             return;
         }
-//        source.setIdentityCode(formatPatientCode(config,source.getIdentityCode(),source.getTenantId()));
-        source.setFormatPatientCode(formatPatientCode(config,source.getPatientCode(),source.getTenantId()));
+        source.setPatientCode(formatPatientCode(config,source.getPatientCode(),source.getTenantId()));
     }
 
     /**
@@ -76,7 +74,7 @@ public class HospitalPatientCodeHandler  extends AbstractHospitalConfigHandler<F
             while (CharSequenceUtil.length(append)<subSize){
                 append.append(fillChar);
             }
-            appendChars=append.substring(0,subSize);
+            appendChars=append.substring(0,subSize-1);
         }
         if(Boolean.TRUE.equals(fillLeft)){
             code=appendChars+code;

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

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

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

@@ -3,13 +3,10 @@ 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
@@ -20,19 +17,34 @@ import java.util.concurrent.TimeUnit;
  */
 public interface Operator {
 
-    /**
-     * 默认过期时间 24小时
-     */
-    long DEFAULT_TTL=2;
+    ConfigStorage getConfig();
 
-    RMap<String, Value> getCache();
+    List<String> getAllKeys();
 
-    default Value wrapperValue(Object value){
-        return Value.simple(value);
+    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 getValue(String name){
-        return parseValue(getCache().get(name));
+        return parseValue(getConfig().getConfig(name));
     }
 
     default Value parseValue(Value value){
@@ -41,10 +53,4 @@ public interface Operator {
         }
         return value;
     }
-
-    default void put(String key,Value value){
-//        getCache()
-//                .put(key,value,DEFAULT_TTL, TimeUnit.HOURS);
-        getCache().put(key,value);
-    }
 }

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

@@ -8,16 +8,25 @@ 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 INFUSION_TENANT_ID="infusion_tenantId";
+    public static final String USING_ID="usingId";
 
     public static final String START_TIME="startTime";
 
-    public static final String PATIENT_CODE="identityCode";
+    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 CLASSIFY="classification";
 
@@ -29,11 +38,5 @@ public class DeviceKeyConstant {
 
     public static final String CONTINUE_DOSE="continue_dose";
 
-    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";
+    public static final String UPLOAD_TIME="upload_time";
 }

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

@@ -8,14 +8,19 @@ package com.coffee.bus.registry.constant;
  * @createTime 2022年04月13日 15:45:00
  */
 public class PatientKeyConstant {
-    public static final String IS_EXIST="is_exist";
+    public static final String CODE="code";
 
+    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";
 }

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

@@ -1,341 +1,206 @@
 package com.coffee.bus.registry.device;
 
 
-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.enums.DeviceStatusEnum;
 import com.coffee.bus.registry.constant.DeviceKeyConstant;
-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 com.coffee.common.cache.ConfigStorage;
+import lombok.AllArgsConstructor;
+
 import java.math.BigDecimal;
 import java.util.Date;
-
+import java.util.*;
 /**
  * @author lifang
  * @version 1.0.0
  * @ClassName ClusterDeviceOperator.java
- * @Description
+ * @Description TODO
  * @createTime 2022年04月06日 15:27:00
  */
+@AllArgsConstructor
 public class ClusterDeviceOperator implements DeviceOperator {
 
-    private final String deviceId;
-    private final RMap<String, Value> mapCache;
-    private final LocalBusDeviceService deviceService;
-    private final LocalBusInfusionHistoryService infusionHistoryService;
+    private final ConfigStorage 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 ConfigStorage getConfig() {
+        return configStorage;
     }
 
     @Override
-    public RMap<String, Value> getCache() {
-        return mapCache;
+    public void setDeviceId(String deviceId) {
+        configStorage.setConfig(DeviceKeyConstant.DEVICE_ID,deviceId);
     }
 
-
     @Override
-    public void setExist(Boolean exist) {
-        put(DeviceKeyConstant.IS_EXIST,wrapperValue(exist));
+    public String getDeviceId() {
+        return getValue(DeviceKeyConstant.DEVICE_ID).asString();
     }
 
     @Override
-    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();
+    public void setAlias(String alias) {
+        configStorage.setConfig(DeviceKeyConstant.ALIAS,alias);
     }
 
     @Override
-    public String getDeviceId() {
-        return this.deviceId;
+    public String getAlias() {
+        return getValue(DeviceKeyConstant.ALIAS).asString();
     }
 
     @Override
     public void setEnable(Boolean enable) {
-        put(DeviceKeyConstant.ENABLE,wrapperValue(enable) );
+        configStorage.setConfig(DeviceKeyConstant.ENABLE,enable);
     }
 
     @Override
     public boolean getEnable() {
-        Value value = getValue(DeviceKeyConstant.ENABLE);
-        if(value==null){
-            BusDeviceEntity device = getDevice();
-            value=Value.simple(device.getEnable());
-            setEnable(device.getEnable());
-        }
-        return value.asBoolean();
+        return getValue(DeviceKeyConstant.ENABLE).asBoolean();
     }
 
     @Override
     public void setTenantId(String tenantId) {
-        put(DeviceKeyConstant.TENANT_ID,wrapperValue(tenantId) );
+        configStorage.setConfig(DeviceKeyConstant.TENANT_ID,tenantId);
     }
 
     @Override
     public String getTenantId() {
-        Value value = getValue(DeviceKeyConstant.TENANT_ID);
-        if(value==null){
-            BusDeviceEntity device = getDevice();
-            value=Value.simple(device.getTenantId());
-            setTenantId(device.getTenantId());
-        }
-        return value.asString();
+        return getValue(DeviceKeyConstant.TENANT_ID).asString();
     }
 
     @Override
-    public void setInfusionTenantId(String tenantId) {
-        put(DeviceKeyConstant.INFUSION_TENANT_ID,wrapperValue(tenantId) );
+    public void setUsingId(String usingId) {
+        configStorage.setConfig(DeviceKeyConstant.USING_ID,usingId);
     }
 
     @Override
-    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();
+    public String getUsingId() {
+        return getValue(DeviceKeyConstant.USING_ID).asString();
     }
 
-
     @Override
     public void setStartTime(Date startTime) {
-        put(DeviceKeyConstant.START_TIME,wrapperValue(startTime) );
+        configStorage.setConfig(DeviceKeyConstant.START_TIME,startTime);
     }
 
     @Override
     public Date getStartTime() {
-        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());
-
-        }
-        return value.asDate();
+        return getValue(DeviceKeyConstant.START_TIME).asDate();
     }
 
     @Override
-    public void setPatientCode(String patientCode) {
-        put(DeviceKeyConstant.PATIENT_CODE,wrapperValue(patientCode) );
+    public void setModifyTime(Date startTime) {
+        configStorage.setConfig(DeviceKeyConstant.MODIFY_TIME,startTime);
     }
 
     @Override
-    public String getPatientCode() {
-        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();
+    public Date getModifyTime() {
+        return getValue(DeviceKeyConstant.MODIFY_TIME).asDate();
     }
 
     @Override
-    public void setAlarmOrWarn(String alarm) {
-        put(DeviceKeyConstant.ALARM,wrapperValue(alarm) );
+    public void setPatientCode(String patientCode) {
+        configStorage.setConfig(DeviceKeyConstant.PATIENT_CODE,patientCode);
     }
 
     @Override
-    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();
+    public String getPatientCode() {
+        return getValue(DeviceKeyConstant.PATIENT_CODE).asString();
     }
 
     @Override
-    public void setInfusionId(String infusionId) {
-        put(DeviceKeyConstant.INFUSION_ID,wrapperValue(infusionId) );
+    public DeviceStatusEnum getStatus() {
+        return getValue(DeviceKeyConstant.STATUS).as(DeviceStatusEnum.class);
     }
 
     @Override
-    public String getInfusionId() {
-        Value value = getValue(DeviceKeyConstant.INFUSION_ID);
-        if(value==null){
-            BusDeviceEntity device = getDevice();
-            value=Value.simple(device.getInfusionId());
-            setInfusionId(device.getInfusionId());
+    public void setStatus(DeviceStatusEnum status) {
+        if(status==null){
+            configStorage.setConfig(DeviceKeyConstant.STATUS,null);
+        }else {
+            configStorage.setConfig(DeviceKeyConstant.STATUS,status.ordinal());
         }
-        return value.as(String.class);
+
     }
 
     @Override
-    public void setInfusionParam(String infusionParam) {
-        put(DeviceKeyConstant.INFUSION_PARAM,wrapperValue(infusionParam) );
+    public void setMaster(boolean master) {
+        configStorage.setConfig(DeviceKeyConstant.MASTER,master);
     }
 
     @Override
-    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);
+    public boolean getMaster() {
+        return getValue(DeviceKeyConstant.MASTER).asBoolean();
     }
 
-
     @Override
-    public void setClassification(String classification) {
-        put(DeviceKeyConstant.CLASSIFY,wrapperValue(classification));
+    public void setAlarmOrWarn(String alarm) {
+        configStorage.setConfig(DeviceKeyConstant.ALARM,alarm);
     }
 
     @Override
-    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();
+    public String getAlarmOrWarn() {
+        return getValue(DeviceKeyConstant.ALARM).asString();
     }
 
-
     @Override
-    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);
+    public void setInfusionId(String infusionId) {
+        configStorage.setConfig(DeviceKeyConstant.INFUSION_ID,infusionId);
+    }
 
+    @Override
+    public String getInfusionId() {
+        return getValue(DeviceKeyConstant.INFUSION_ID).as(String.class);
     }
 
     @Override
-    public void setContinueDose(BigDecimal continueDose) {
-        put(DeviceKeyConstant.CONTINUE_DOSE,wrapperValue(continueDose) );
+    public void setInfusionParam(String infusionParam) {
+        configStorage.setConfig(DeviceKeyConstant.INFUSION_PARAM,infusionParam);
     }
 
     @Override
-    public void setLastPcaValidCount(Integer pcaValidCount) {
-        put(DeviceKeyConstant.VALID_PCA,wrapperValue(pcaValidCount) );
+    public String getInfusionParam() {
+        return getValue(DeviceKeyConstant.INFUSION_PARAM).as(String.class);
     }
 
+
     @Override
-    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();
+    public void setClassification(String classification) {
+        configStorage.setConfig(DeviceKeyConstant.CLASSIFY,classification);
     }
 
     @Override
-    public void setTotalAppendDose(BigDecimal totalAppendDose) {
-        put(DeviceKeyConstant.APPEND_DOSE,wrapperValue(totalAppendDose) );
+    public String getClassification() {
+        return  getValue(DeviceKeyConstant.CLASSIFY).asString();
     }
 
     @Override
     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();
+        return getValue(DeviceKeyConstant.UPLOAD_TIME).asDate();
     }
 
     @Override
     public void setUploadTime(Date uploadTime) {
-        put(DeviceKeyConstant.UPLOAD,wrapperValue(uploadTime) );
+        configStorage.setConfig(DeviceKeyConstant.UPLOAD_TIME,uploadTime);
     }
 
     @Override
-    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);
+    public BigDecimal getContinueDose() {
+        return getValue(DeviceKeyConstant.CONTINUE_DOSE).as(BigDecimal.class);
+
     }
 
     @Override
-    public void clear() {
-        mapCache.clear();
+    public void setContinueDose(BigDecimal continueDose) {
+        configStorage.setConfig(DeviceKeyConstant.CONTINUE_DOSE,continueDose);
     }
 
-    private BusDeviceEntity getDevice(){
-        return deviceService.getByDeviceId(this.deviceId);
+    @Override
+    public void clear() {
+        configStorage.clear();
     }
 
-    private BusInfusionHistoryEntity getLastInfusion(){
-        return infusionHistoryService.lastInfusion(deviceId);
-    }
 
+    @Override
+    public List<String> getAllKeys(){
+        return Arrays.asList("deviceId","alias","enable","tenantId","usingId","startTime","patientCode","status","master","classification");
+    }
 }

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

@@ -1,10 +1,12 @@
 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;
@@ -19,8 +21,11 @@ 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
@@ -29,16 +34,52 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
             return null;
         }
         String key=getId()+deviceId;
-        ClusterDeviceOperator deviceOperator = operatorMap.computeIfAbsent(key,k->new ClusterDeviceOperator( deviceId));
-        if(!deviceOperator.getExist()){
-            log.warn("设备号【{}】不存在,设备处理失败",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;
         }
         return deviceOperator;
     }
 
     @Override
     public void remove(String deviceId) {
-        ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator(deviceId);
+        String key=getId()+deviceId;
+        ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator(configStorageManager.getStorage(key));
         deviceOperator.clear();
     }
 

+ 71 - 61
nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java

@@ -3,7 +3,6 @@ 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,23 +17,11 @@ import java.util.Date;
 public interface DeviceOperator extends Operator {
 
 
-     /**
-      * 描述:设备是否存在
-      * @author lifang
-      * @date 2022/6/30 21:38
-      * @param
-      * @return boolean
-      */
-     void setExist(Boolean exist);
-
     /**
-     * 描述:设备是否存在
-     * @author lifang
-     * @date 2022/6/30 21:38
-     * @param
-     * @return boolean
+     * 设置设备号
+     * @param deviceId
      */
-    boolean getExist();
+    void setDeviceId(String deviceId);
 
     /**
      * 获取设备号
@@ -42,6 +29,18 @@ public interface DeviceOperator extends Operator {
      */
     String getDeviceId();
 
+    /**
+     * 设置别名
+     * @param alias
+     */
+    void setAlias(String alias);
+
+    /**
+     * 获取设备别名
+     * @return
+     */
+    String getAlias();
+
     /**
      * 设置设备是否启用
      * @param enable
@@ -55,30 +54,30 @@ public interface DeviceOperator extends Operator {
     boolean getEnable();
 
     /**
-     * 设置设备绑定的医院id
+     * 设置医院id
      * @param tenantId
      */
     void setTenantId(String tenantId);
 
     /**
-     * 获取设备绑定的医院id
+     * 获取医院id
      * @return
      */
     String getTenantId();
 
-
-
     /**
-     * 设置设备当前输注绑定的医院id
-     * @param tenantId
+     * 设置设备运行id
+     * @see BusDeviceRunningEntity
+     * @param usingId
      */
-    void setInfusionTenantId(String tenantId);
+    void setUsingId(String usingId);
 
     /**
-     * 获取设备当前输注绑定的医院id
+     * 获取设备运行id
      * @return
      */
-    String getInfusionTenantId();
+    String getUsingId();
+
     /**
      * 设置设备开机时间
      * @param startTime
@@ -91,6 +90,18 @@ public interface DeviceOperator extends Operator {
      */
     Date getStartTime();
 
+    /**
+     * 设置设备开机时间
+     * @param startTime
+     */
+    void setModifyTime(Date startTime);
+
+    /**
+     * 获取设备开机时间
+     * @return
+     */
+    Date getModifyTime();
+
     /**
      * 设置设备当前绑定泵号
      * @param patientCode
@@ -103,6 +114,30 @@ 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
@@ -151,58 +186,33 @@ public interface DeviceOperator extends Operator {
      */
     String getClassification();
 
-
     /**
-     * 获取设备上传流速
+     * 获取设备最新上传数据时间
      * @return
      */
-    BigDecimal getContinueDose();
-
-
-    /**
-     * 设置设备流速
-     * @param continueDose
-     */
-    void setContinueDose(BigDecimal continueDose);
-
+    Date getUploadTime();
 
-    /**
-     * 设置此次输注过程中的总有效PCA次数
-     * @param pcaValidCount
-     */
-    void setLastPcaValidCount(Integer pcaValidCount);
 
     /**
-     * 获取此次输注过程中的总有效PCA次数
-     *
+     * 设置设备最新上传数据时间
+     * @param uploadTime
      */
-    Integer getLastPcaValidCount();
-
+    void setUploadTime(Date uploadTime);
 
-    /**
-     * 设置此次输注过程中的总追加量
-     * @param totalAppendDose
-     */
-    void setTotalAppendDose(BigDecimal totalAppendDose);
 
     /**
-     * 获取该设备最后一次设备上传时间
-     *
+     * 获取设备上传流速
+     * @return
      */
-    Date getUploadTime();
+    BigDecimal getContinueDose();
 
 
     /**
-     * 设置该设备最后一次设备上传时间
-     * @param uploadTime
+     * 设置设备流速
+     * @param continueDose
      */
-    void setUploadTime(Date uploadTime);
+    void setContinueDose(BigDecimal continueDose);
 
-    /**
-     * 获取此次输注过程中的总追加量
-     *
-     */
-    BigDecimal getTotalAppendDose();
 
     void clear();
 }

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

@@ -1,19 +1,9 @@
 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.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;
+import com.coffee.common.cache.ConfigStorage;
+
+import java.util.*;
 
 /**
  * @author lifang
@@ -23,112 +13,93 @@ import org.redisson.api.RMapCache;
  * @createTime 2022年04月07日 15:25:00
  */
 public class ClusterPatientOperator implements PatientOperator {
-    private final String patientCode;
-    private final String hospitalId;
-    private final RMap<String, Value> mapCache;
-    private final LocalBusPatientService patientService;
-    private final LocalBusInfusionHistoryService infusionHistoryService;
+    private final 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);
+    public ClusterPatientOperator(ConfigStorage configStorage) {
+        this.configStorage = configStorage;
     }
 
-
     @Override
-    public RMap<String, Value> getCache() {
-        return mapCache;
+    public ConfigStorage getConfig() {
+        return configStorage;
     }
 
-    @Override
-    public void setExist(Boolean exist) {
-        put(PatientKeyConstant.IS_EXIST,wrapperValue(exist));
-    }
 
     @Override
-    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();
+    public void setCode(String code) {
+        configStorage.setConfig(PatientKeyConstant.CODE,code);
     }
 
     @Override
     public String getCode() {
-        return this.patientCode;
+        return getValue(PatientKeyConstant.CODE).as(String.class);
     }
 
-
+    @Override
+    public void setTenantId(String tenantId) {
+        configStorage.setConfig(PatientKeyConstant.TENANT_ID,tenantId);
+    }
 
     @Override
     public String getTenantId() {
-        return this.hospitalId;
+        return getValue(PatientKeyConstant.TENANT_ID).as(String.class);
     }
 
     @Override
     public void setClinicId(String clinicId) {
-        put(PatientKeyConstant.CLINIC_ID,wrapperValue(clinicId));
+        configStorage.setConfig(PatientKeyConstant.CLINIC_ID,clinicId);
     }
 
     @Override
     public String getClinicId() {
-        Value value = getValue(PatientKeyConstant.CLINIC_ID);
-        if(value==null){
-            BusPatientEntity patient = getPatient();
-            value=Value.simple(patient.getClinicId());
-            setClinicId(patient.getClinicId());
-        }
-        return value.asString();
+        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);
     }
 
     @Override
     public void setBindDeviceId(String deviceId) {
-        put(PatientKeyConstant.BIND_DEVICE_ID,wrapperValue(deviceId));
+        configStorage.setConfig(PatientKeyConstant.BIND_DEVICE_ID,deviceId);
     }
 
     @Override
     public String getBindDeviceId() {
-        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();
+        return getValue(PatientKeyConstant.BIND_DEVICE_ID).asString();
     }
 
     @Override
     public String getPatientId() {
-        Value value = getValue(PatientKeyConstant.PATIENT_ID);
-        if(value==null){
-            BusPatientEntity patient = getPatient();
-            value=Value.simple(patient.getId());
-            setPatientId(patient.getId());
-        }
-        return value.asString();
+        return getValue(PatientKeyConstant.PATIENT_ID).asString();
     }
 
     @Override
     public void setPatientId(String patientId) {
-        put(PatientKeyConstant.PATIENT_ID,wrapperValue(patientId));
+        configStorage.setConfig(PatientKeyConstant.PATIENT_ID,patientId);
     }
 
     @Override
     public void clear() {
-        mapCache.clear();
+        configStorage.clear();
     }
 
-    private BusPatientEntity getPatient(){
-        return patientService.findByOriginCode(patientCode, hospitalId);
+    @Override
+    public void clearClinic() {
+        configStorage.remove(Arrays.asList(PatientKeyConstant.CLINIC_ID,PatientKeyConstant.START_TIME,PatientKeyConstant.FINISHED));
     }
+    @Override
+    public List<String> getAllKeys(){
+        return Arrays.asList("code","gender","surgeyName","tenantId","clinicId","startTime","finished","bindDeviceId","devices");
+    }
+
+    //该病人是否为新增病人
+    private boolean newPatient;
+
 }

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

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

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

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

+ 3 - 0
nb-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java

@@ -82,6 +82,9 @@ 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());
         }

+ 1 - 12
nb-system/src/main/java/com/coffee/bus/service/LocalBusEvaluationService.java

@@ -11,13 +11,10 @@ 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;
 
@@ -45,15 +42,7 @@ 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());
-        }
-         
+
     }
 
     @Override

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

@@ -1,14 +1,9 @@
 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;
@@ -19,10 +14,7 @@ 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;
@@ -42,10 +34,6 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     @Lazy
     private HospitalManagerRegister managerRegister;
 
-    @Autowired
-    @Lazy
-    private LocalBusPatientService patientService;
-
     @Autowired
     @Lazy
     private WsPublishUtils wsPublishUtils;
@@ -58,7 +46,6 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     @Override
     public void validateBeforeUpdate(BusHospitalConfigEntity entity) {
 
-
     }
 
     @Override
@@ -71,7 +58,9 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
         BusHospitalConfigEntity configEntity = this.getById(entity.getId());
         managerRegister.refresh(configEntity.getTenantId(),false,true);
         if (entity.getType().equals(ConfigEnum.patientCode)) {
-            updatePatientCode(configEntity.getTenantId());
+            CompletableFuture.runAsync(()->{
+//                wsPublishUtils.publishPatientAdd();
+            });
         }
     }
 
@@ -79,9 +68,6 @@ 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());
-        }
     }
 
     /**
@@ -202,27 +188,4 @@ 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);
-            }
-        });
-    }
 }

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

@@ -56,11 +56,6 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
     @Lazy
     private LocalBusClinicService clinicService;
 
-
-    @Autowired
-    @Lazy
-    private LocalBusInfusionModifyService modifyService;
-
     @Override
     public void validateBeforeSave(BusInfusionHistoryEntity entity) {
 
@@ -361,6 +356,12 @@ 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);
@@ -377,11 +378,4 @@ 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"));
-    }
 }

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

@@ -1,6 +1,5 @@
 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;
@@ -75,6 +74,10 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     @Lazy
     private LocalBusPatientService patientService;
 
+    @Autowired
+    @Lazy
+    private DeviceRegistry deviceRegistry;
+
     @Autowired
     @Lazy
     private LocalBusHospitalService hospitalService;
@@ -83,10 +86,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);
         }
     }
@@ -105,63 +108,60 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     public void postSave(BusPatientEntity entity) {
         super.postSave(entity);
         //新增病人后推送主题,延迟推送,保证处理逻辑已全部完成
-        executorService.schedule(() -> {
+        executorService.schedule(()->{
+                    wsPublishUtils.publishPatientAdd(entity.getCode(),entity.getTenantId());
                     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) {
-        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 long monitorTotalCount(String tenantId){
+        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,7 +189,6 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     /**
      * 获取无设备绑定的临床手术信息
-     *
      * @return
      */
     public List<PatientDeviceNoneResult> noneDevice() {
@@ -198,27 +197,25 @@ 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);
@@ -228,18 +225,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("该住院号信息不存在,请刷新后重试");
         }
         //先更新手术信息
@@ -252,64 +249,62 @@ 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;
         }
     }
 
     /**
      * 描述: 设备状态数量统计
-     *
-     * @param tenantId 医院id 用户请求时传输null
-     * @return MonitorStatusStatsCountResult
      * @author lifang
      * @date 2022/5/8 21:52
+     * @param tenantId 医院id 用户请求时传输null
+     * @return MonitorStatusStatsCountResult
      */
     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);
                 }
             });
         }
@@ -318,39 +313,38 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     /**
      * 描述: 按照时间对输注监控进行统计
-     *
-     * @param tenantId 医院id
-     * @return MonitorTimeStatsCountResult
      * @author lifang
      * @date 2022/5/8 22:40
+     * @param tenantId 医院id
+     * @return MonitorTimeStatsCountResult
      */
     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;
@@ -358,63 +352,62 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
 
     /**
      * 描述: 判断所给时间是否在存在于某一时间段内
-     *
-     * @param time   时间
-     * @param offset 时间偏移量,单位:天 以当天时间为基准进行偏移
-     * @return boolean
      * @author lifang
      * @date 2022/5/8 22:47
+     * @param time 时间
+     * @param offset 时间偏移量,单位:天 以当天时间为基准进行偏移
+     * @return boolean
      */
-    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()));
+                .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);
+        });
 
         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) {
-        return findByFormatCode(patientCode, null);
+    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 findByOriginCode(String patientCode, String tenantId) {
-        return this.getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getOriginCode, patientCode)
-                .eq(StrUtil.isNotBlank(tenantId), BusPatientEntity::getTenantId, tenantId));
+    public BusPatientEntity findByFormatCode(String patientCode){
+        return findByFormatCode(patientCode,null);
     }
 }

+ 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 publishPatientUpdate(String tenantId){
+    public void publishPatientAdd(String patientCode,String tenantId){
         Assert.hasText(tenantId,"医院id不能为空");
-        JSONObject message = new JSONObject().putOpt("result", 1);
-        this.publish(WebSocketConstant.getPatientUpdate(tenantId).getTopic(),
+        JSONObject message = new JSONObject().putOpt("patientCode", patientCode);
+        this.publish(WebSocketConstant.getPatientAdd(tenantId).getTopic(),
                 TopicMessage.of(message,tenantId));
     }
     /**

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

@@ -5,7 +5,6 @@ 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;
@@ -35,10 +34,11 @@ 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 (request instanceof CacheHttpServletRequestWrapper && method.equals(HttpMethod.POST.name())) {
+        if (method.equals(HttpMethod.POST.name())) {
             //检查参数是否齐全
             String sign = request.getHeader("Sign");
             String timestamp = request.getHeader("Timestamp");

+ 2 - 2
nb-system/src/main/java/com/coffee/bus/websocket/PatientUpdateHandler.java → nb-system/src/main/java/com/coffee/bus/websocket/PatientAddHandler.java

@@ -13,11 +13,11 @@ import org.tio.core.ChannelContext;
  * @createTime 2022年03月25日 14:21:00
  */
 @Component
-public class PatientUpdateHandler extends Subscribe {
+public class PatientAddHandler extends Subscribe {
 
     @Override
     public String getId() {
-        return WebSocketConstant.PATIENT_UPDATE;
+        return WebSocketConstant.PATIENT_ADD;
     }
 
     @Override

+ 96 - 139
nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -13,24 +13,22 @@ 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 org.slf4j.Logger;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
+import java.util.*;
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 import java.util.function.Supplier;
@@ -43,10 +41,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;
@@ -68,7 +66,6 @@ public class DeviceInfoListener {
     private final LocalBusDeviceService deviceService;
 
     private final Executor executor;
-
     private final HospitalManagerRegister hospitalManagerRegister;
 
     /**
@@ -83,74 +80,75 @@ public class DeviceInfoListener {
     public void deviceInfoDetail(DeviceInfoEvent infoEvent){
         //保证统一设备数据顺序处理,若数据发送过快,为防止冲突,请在此加锁处理
         synchronized (infoEvent.getDeviceId()){
-                log.info("接收到设备消息:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
-                BusDeviceRunningEntity device = infoEvent.getContent();
-                String classification = device.getClassification();
-                if(StrUtil.isBlank(classification)){
-                    log.error("设备号:[{}]分包标识号为空,无法更新开始时间");
-                    throw new RuntimeException("设备数据中分包标识不能为空");
+            log.info("接收到设备消息:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
+            BusDeviceRunningEntity device = infoEvent.getContent();
+            String classification = device.getClassification();
+            if(StrUtil.isBlank(classification)){
+                log.error("设备号:[{}]分包标识号为空,无法更新开始时间");
+                throw new RuntimeException("设备数据中分包标识不能为空");
+            }
+            long startTime = System.currentTimeMillis();
+
+
+            //对设备数据的一些参数进行初始化设置
+            init(device);
+
+            String deviceId = device.getDeviceId();
+            DeviceOperator deviceOperator = deviceRegistry.getOperator(deviceId);
+            //缓存操作
+            List<Supplier<?>> cacheOperation=new ArrayList<>();
+            //格式化病号
+            formatPatientCode(device);
+
+            //处理输注参数
+            BusInfusionHistoryEntity infusionHistory = handleInfusionHistory(device, deviceOperator, cacheOperation);
+            //处理输注修改参数
+            handleInfusionModify(device,deviceOperator,cacheOperation);
+            //处理历史运行数据
+            BusDeviceHistoryEntity history=handleRunningHistory(device);
+            //处理报警、提醒信息
+            handleAlarmOrWarn(history,deviceOperator,cacheOperation);
+            //根据功能配置进行最后的一些状态处理
+            handleHospitalConfigLast(device,infusionHistory);
+            if(device.isNewInfusion()){
+                deviceService.update(new UpdateWrapper<BusDeviceEntity>()
+                        .lambda()
+                        .eq(BusDeviceEntity::getDeviceId,device.getDeviceId())
+                        .set(BusDeviceEntity::getInfusionId,device.getInfusionId())
+                        .set(BusDeviceEntity::getType,device.getType())
+                );
+                infusionHistoryService.save(infusionHistory);
+            }else {
+                infusionHistoryService.updateById(infusionHistory);
+            }
+
+            cacheOperation.add(()->{
+                wsPublishUtils.publishPatientMonitor(device.getPatientId(),device.getTenantId());
+                if (Boolean.TRUE.equals(device.isResetUndo())||Boolean.TRUE.equals(device.isInfusionModify())) {
+                    if (Boolean.TRUE.equals(device.isInfusionModify())) {
+                        wsPublishUtils.publishDeviceNone(device.getTenantId());
+                    }
+                    wsPublishUtils.publishDeviceRepeat(device.getTenantId());
+                }
+                if (Boolean.TRUE.equals(device.isResetClinic())) {
+                    wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
                 }
-                long startTime = System.currentTimeMillis();
-
-                //对设备数据的一些参数进行初始化设置
-                init(device);
-
-                String deviceId = device.getDeviceId();
-                DeviceOperator deviceOperator = deviceRegistry.getOperator(deviceId);
-                //缓存操作
-                List<Supplier<?>> cacheOperation=new ArrayList<>();
-                //格式化病号
-                formatPatientCode(device);
-
-                //处理输注参数
-                BusInfusionHistoryEntity infusionHistory = handleInfusionHistory(device, deviceOperator, cacheOperation);
-                //处理输注修改参数
-                handleInfusionModify(device,deviceOperator,cacheOperation);
-                //处理历史运行数据
-                BusDeviceHistoryEntity history=handleRunningHistory(device);
-                //处理报警、提醒信息
-                handleAlarmOrWarn(history,deviceOperator,cacheOperation);
-                //根据功能配置进行最后的一些状态处理
-                handleHospitalConfigLast(device,infusionHistory);
+                wsPublishUtils.publishMonitorStateCount(device.getTenantId());
                 if(device.isNewInfusion()){
-                    deviceService.update(new UpdateWrapper<BusDeviceEntity>()
-                            .lambda()
-                            .eq(BusDeviceEntity::getDeviceId,device.getDeviceId())
-                            .set(BusDeviceEntity::getInfusionId,device.getInfusionId())
-                    );
-                    infusionHistoryService.save(infusionHistory);
-                }else {
-                    infusionHistoryService.updateById(infusionHistory);
+                    CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getPatientCode(),10,false)
+                            ,executor)
+                            .exceptionally(t->{
+                                log.error("新的输注产生后,拉取病号【{}】信息失败,失败原因:",device.getPatientCode(),t);
+                                return null;
+                            });
                 }
+                return null;
+            });
 
-                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())) {
-                            wsPublishUtils.publishDeviceNone(device.getTenantId());
-                        }
-                        wsPublishUtils.publishDeviceRepeat(device.getTenantId());
-                    }
-                    if (Boolean.TRUE.equals(device.isResetClinic())) {
-                        wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
-                    }
-                    wsPublishUtils.publishMonitorStateCount(device.getTenantId());
-                    if(device.isNewInfusion()){
-                        CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getFormatPatientCode(),10,false)
-                                ,executor)
-                                .exceptionally(t->{
-                                    log.error("新的输注产生后,拉取病号【{}】信息失败,失败原因:",device.getFormatPatientCode(),t);
-                                    return null;
-                                });
-                    }
-                    return null;
-                });
-
-                //所有事务处理完成后更新缓存信息
-                cacheOperation.forEach(Supplier::get);
-                log.info("设备数据处理结束:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
-                log.info("设备数据处理耗时:{}",(System.currentTimeMillis()-startTime));
+            //所有事务处理完成后更新缓存信息
+            cacheOperation.forEach(Supplier::get);
+            log.info("设备数据处理结束:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
+            log.info("设备数据处理耗时:{}",(System.currentTimeMillis()-startTime));
         }
     }
 
@@ -193,7 +191,8 @@ public class DeviceInfoListener {
         device.setMonitorType(true);
         device.setUploadTime(device.getUploadTime()==null?new Date():device.getUploadTime());
 
-        device.setTenantId(deviceOperator.getInfusionTenantId());
+        device.setStartTime(deviceOperator.getStartTime());
+        device.setTenantId(deviceOperator.getTenantId());
         //将设备撤泵标志去除
         device.setIsUndo(false);
 
@@ -242,18 +241,20 @@ public class DeviceInfoListener {
                             if(log.isDebugEnabled()){
                                 log.debug("住院号病人信息,【{}】,输注设备被占用,切换设备",JSONUtil.toJsonStr(lastPatient));
                             }
-                            if(lastPatient!=null){
-                                patientRegistry
-                                        .getOperator(lastInfusion.getTenantId(),lastPatient.getOriginCode())
-                                        .setBindDeviceId(normalInfusion.getDeviceId());
-                                suppliers.add(()->{
-                                    wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientId(),lastInfusion.getTenantId());
-                                    return 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);
@@ -281,19 +282,15 @@ 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){
-            device.setStartTime(device.getUploadTime());
-        }else {
-            device.setStartTime(deviceOperator.getStartTime());
+            BusDeviceEntity deviceEntity = deviceService.getByDeviceId(device.getDeviceId());
+            device.setTenantId(deviceEntity.getTenantId());
         }
         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())){
@@ -303,6 +300,7 @@ 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())
@@ -311,12 +309,10 @@ 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);
-            if(originInfusion!=null){
-                device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
-            }
+            device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
         }
         device.setInfusionId(infusionHistory.getId());
         cacheOperation.add(()->{
@@ -327,57 +323,11 @@ 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
@@ -404,6 +354,7 @@ public class DeviceInfoListener {
             cacheOperation.add(()->{
                 if(device.isInfusionModify()){
                     deviceOperator.setInfusionParam(signHex);
+                    deviceOperator.setModifyTime(device.getUploadTime());
                 }
                 return null;
             });
@@ -415,13 +366,19 @@ 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::getId,device.getPatientId())
+                    .eq(BusPatientEntity::getCode,device.getPatientCode())
+                    .eq(BusPatientEntity::getTenantId,device.getTenantId())
                     .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
             PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
             device.setMaster(true);

+ 15 - 7
nb-system/src/main/resources/mapper/bus/BusDeviceAlarmMapper.xml

@@ -40,9 +40,6 @@
             <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 (
@@ -54,6 +51,9 @@
             <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
@@ -76,13 +76,21 @@
             <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
-        JOIN (
+        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}
+            </if>
+        </where>
         )AS d ON da.device_id = d.device_id
         GROUP BY
         da.tenant_id,

+ 3 - 3
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,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
+            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
             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_id`=p.id;
+            join  (SELECT * FROM bus_clinic WHERE finished=0 and monitor_type=1) AS c ON  c.`patient_code`=p.code;
         </select>
 
     <select id="selectNoneDevice" resultMap="deviceNone">