瀏覽代碼

update 缓存方式

A17404李放 3 年之前
父節點
當前提交
b19cb3aef5
共有 38 個文件被更改,包括 610 次插入562 次删除
  1. 1 1
      nb-admin/src/main/resources/application-dev.yml
  2. 2 2
      nb-admin/src/main/resources/application-prod.yml
  3. 1 1
      nb-admin/src/main/resources/application.yml
  4. 0 0
      nb-admin/src/main/resources/logback-spring.xml
  5. 1 0
      nb-admin/src/test/java/com/coffee/admin/BusPatientTest.java
  6. 6 0
      nb-common/pom.xml
  7. 2 1
      nb-common/src/main/java/com/coffee/common/cache/value/Value.java
  8. 4 3
      nb-common/src/main/java/com/coffee/common/config/CacheHttpServletRequestWrapper.java
  9. 8 2
      nb-common/src/main/java/com/coffee/common/config/CachingContentFilter.java
  10. 3 3
      nb-common/src/main/java/com/coffee/common/config/websocket/WebSocketConstant.java
  11. 2 2
      nb-framework/src/main/java/com/coffee/framework/config/mybatisplus/handler/CreateAndUpdateMetaObjectHandler.java
  12. 1 2
      nb-system/src/main/java/com/coffee/aliyun/AliyunConsumerGroupService.java
  13. 9 0
      nb-system/src/main/java/com/coffee/bus/entity/BusAppConfig.java
  14. 1 1
      nb-system/src/main/java/com/coffee/bus/entity/common/DeviceProperties.java
  15. 31 0
      nb-system/src/main/java/com/coffee/bus/enums/AppEnum.java
  16. 0 2
      nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
  17. 4 2
      nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalPatientCodeHandler.java
  18. 1 0
      nb-system/src/main/java/com/coffee/bus/mapper/BusPatientMapper.java
  19. 5 24
      nb-system/src/main/java/com/coffee/bus/registry/Operator.java
  20. 1 12
      nb-system/src/main/java/com/coffee/bus/registry/constant/DeviceKeyConstant.java
  21. 1 6
      nb-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java
  22. 126 93
      nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java
  23. 32 43
      nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
  24. 21 76
      nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java
  25. 72 43
      nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
  26. 4 9
      nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java
  27. 15 24
      nb-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java
  28. 0 3
      nb-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  29. 12 1
      nb-system/src/main/java/com/coffee/bus/service/LocalBusEvaluationService.java
  30. 35 3
      nb-system/src/main/java/com/coffee/bus/service/LocalBusHospitalConfigService.java
  31. 12 6
      nb-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  32. 98 91
      nb-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java
  33. 3 3
      nb-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java
  34. 2 2
      nb-system/src/main/java/com/coffee/bus/web/handler/CheckRequestHandler.java
  35. 2 2
      nb-system/src/main/java/com/coffee/bus/websocket/PatientUpdateHandler.java
  36. 88 89
      nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  37. 1 7
      nb-system/src/main/resources/mapper/bus/BusDeviceAlarmMapper.xml
  38. 3 3
      nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 1 - 1
nb-admin/src/main/resources/application-dev.yml

@@ -120,6 +120,6 @@ aliyun:
   # iotInstanceId:企业版实例请填写实例ID,公共实例请填空字符串""。
   iotInstanceId: ""
   server-subscription:
-    enable: true  # 是否开启阿里云物联网服务端订阅
+    enable: false  # 是否开启阿里云物联网服务端订阅
   product:
     productKey: a1ALlsBa2ZK

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

@@ -28,7 +28,7 @@ spring:
     druid:
       # 主库数据源
       master:
-        url: jdbc:mysql://192.168.100.32:3306/nbnetpump?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
+        url: jdbc:mysql://47.101.214.91:7001/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: true  # 是否开启阿里云物联网服务端订阅
+    enable: false  # 是否开启阿里云物联网服务端订阅
   product:
     productKey: he1f6YdSWHW

+ 1 - 1
nb-admin/src/main/resources/application.yml

@@ -51,7 +51,7 @@ logging:
   level:
     com.coffee: @logging.level@
     org.springframework: debug
-  config: classpath:logback.xml
+  config: classpath:logback-spring.xml
   file:
     path: ./logs
 

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


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

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

+ 6 - 0
nb-common/pom.xml

@@ -19,6 +19,12 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.undertow</groupId>
+            <artifactId>undertow-servlet</artifactId>
+            <optional>true</optional>
+            <scope>compile</scope>
         </dependency>
          <!--websocket 模块-->
         <!--<dependency>-->

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

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

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

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

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

@@ -1,5 +1,6 @@
 package com.coffee.common.config;
 
+import io.undertow.servlet.spec.HttpServletRequestImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -28,8 +29,13 @@ public class CachingContentFilter implements Filter {
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                          FilterChain chain) throws IOException, ServletException {
 
-        HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) servletRequest);
-        chain.doFilter(requestWrapper, servletResponse);
+        if(((HttpServletRequestImpl) servletRequest).getHeader("Content-Type").contains("multipart/form-data")){
+            chain.doFilter(servletRequest,servletResponse);
+        }else {
+            HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) servletRequest);
+            chain.doFilter(requestWrapper, servletResponse);
+        }
+
     }
 
     @Override

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

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

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

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

@@ -1,6 +1,7 @@
 package com.coffee.aliyun;
 
 import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.coffee.aliyun.utils.Constants;
@@ -208,6 +209,4 @@ public class AliyunConsumerGroupService {
 
 
 
-
-
 }

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

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

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

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

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

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

+ 0 - 2
nb-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java

@@ -152,8 +152,6 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
                 .set(BusInfusionHistoryEntity::getRunState, DeviceStatusEnum.NoSignal));
         //报警/提醒缓存重置
         if(update){
-            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());

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

@@ -44,9 +44,11 @@ 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.setPatientCode(formatPatientCode(config,source.getPatientCode(),source.getTenantId()));
+//        source.setPatientCode(formatPatientCode(config,source.getPatientCode(),source.getTenantId()));
+        source.setFormatPatientCode(formatPatientCode(config,source.getPatientCode(),source.getTenantId()));
     }
 
     /**
@@ -74,7 +76,7 @@ public class HospitalPatientCodeHandler  extends AbstractHospitalConfigHandler<F
             while (CharSequenceUtil.length(append)<subSize){
                 append.append(fillChar);
             }
-            appendChars=append.substring(0,subSize-1);
+            appendChars=append.substring(0,subSize);
         }
         if(Boolean.TRUE.equals(fillLeft)){
             code=appendChars+code;

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

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

+ 5 - 24
nb-system/src/main/java/com/coffee/bus/registry/Operator.java

@@ -3,6 +3,7 @@ package com.coffee.bus.registry;
 
 import com.coffee.common.cache.ConfigStorage;
 import com.coffee.common.cache.value.Value;
+import org.redisson.api.RMapCache;
 import org.springframework.util.ReflectionUtils;
 
 import java.lang.reflect.Field;
@@ -17,34 +18,14 @@ import java.util.*;
  */
 public interface Operator {
 
-    ConfigStorage getConfig();
+    RMapCache<String, Value> getCache();
 
-    List<String> getAllKeys();
-
-    default void set(String key,Object value){
-        if (value.getClass().isEnum()) {
-            Field ordinal = ReflectionUtils.findField(value.getClass(), "ordinal");
-            ordinal.setAccessible(true);
-            getConfig().setConfig(key, ReflectionUtils.getField(ordinal,value));
-        }
-
-        getConfig().setConfig(key,value);
-    };
-
-    default Map<String, Value> getAll() {
-        Map<String, Value> result = getConfig().getKeys(getAllKeys());
-        List<String> keys = new LinkedList<>();
-        result.forEach((k,v)->{
-            if(v==null||v.get()==null){
-                keys.add(k);
-            }
-        });
-        keys.forEach(result::remove);
-        return result;
+    default Value wrapperValue(Object value){
+        return Value.simple(value);
     }
 
     default Value getValue(String name){
-        return parseValue(getConfig().getConfig(name));
+        return parseValue(getCache().get(name));
     }
 
     default Value parseValue(Value value){

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

@@ -8,26 +8,15 @@ package com.coffee.bus.registry.constant;
  * @createTime 2022年04月09日 13:38:00
  */
 public class DeviceKeyConstant {
-    public static final String DEVICE_ID="deviceId";
-
-    public static final String ALIAS="alias";
 
     public static final String ENABLE="enable";
 
     public static final String TENANT_ID="tenantId";
 
-    public static final String USING_ID="usingId";
-
     public static final String START_TIME="startTime";
 
-    public static final String MODIFY_TIME="modifyTime";
-
     public static final String PATIENT_CODE="patientCode";
 
-    public static final String STATUS="status";
-
-    public static final String MASTER="master";
-
     public static final String CLASSIFY="classification";
 
     public static final String ALARM="alarm";
@@ -38,5 +27,5 @@ public class DeviceKeyConstant {
 
     public static final String CONTINUE_DOSE="continue_dose";
 
-    public static final String UPLOAD_TIME="upload_time";
+    public static final String IS_EXIST="is_exist";
 }

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

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

+ 126 - 93
nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java

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

+ 32 - 43
nb-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java

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

+ 21 - 76
nb-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java

@@ -3,6 +3,7 @@ package com.coffee.bus.registry.device;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.registry.Operator;
+import com.coffee.common.cache.value.Value;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -16,30 +17,36 @@ import java.util.Date;
  */
 public interface DeviceOperator extends Operator {
 
-
     /**
-     * 设置设备号
-     * @param deviceId
+     * 默认过期时间 24小时
      */
-    void setDeviceId(String deviceId);
+     long DEFAULT_TTL=2;
+
 
-    /**
-     * 获取设备号
-     * @return
-     */
-    String getDeviceId();
+
+     /**
+      * 描述:设备是否存在
+      * @author lifang
+      * @date 2022/6/30 21:38
+      * @param
+      * @return boolean
+      */
+     void setExist(Boolean exist);
 
     /**
-     * 设置别名
-     * @param alias
+     * 描述:设备是否存在
+     * @author lifang
+     * @date 2022/6/30 21:38
+     * @param
+     * @return boolean
      */
-    void setAlias(String alias);
+    boolean getExist();
 
     /**
-     * 获取设备别名
+     * 获取设备
      * @return
      */
-    String getAlias();
+    String getDeviceId();
 
     /**
      * 设置设备是否启用
@@ -65,19 +72,6 @@ public interface DeviceOperator extends Operator {
      */
     String getTenantId();
 
-    /**
-     * 设置设备运行id
-     * @see BusDeviceRunningEntity
-     * @param usingId
-     */
-    void setUsingId(String usingId);
-
-    /**
-     * 获取设备运行id
-     * @return
-     */
-    String getUsingId();
-
     /**
      * 设置设备开机时间
      * @param startTime
@@ -90,18 +84,6 @@ public interface DeviceOperator extends Operator {
      */
     Date getStartTime();
 
-    /**
-     * 设置设备开机时间
-     * @param startTime
-     */
-    void setModifyTime(Date startTime);
-
-    /**
-     * 获取设备开机时间
-     * @return
-     */
-    Date getModifyTime();
-
     /**
      * 设置设备当前绑定泵号
      * @param patientCode
@@ -114,30 +96,6 @@ public interface DeviceOperator extends Operator {
      */
     String getPatientCode();
 
-    /**
-     * 获取设备当前状态
-     * @return
-     */
-    DeviceStatusEnum getStatus();
-
-    /**
-     * 设置设备当前状态
-     * @param status
-     */
-    void setStatus(DeviceStatusEnum status);
-
-    /**
-     * 设置设备当前是否为主泵
-     * @param master
-     */
-    void setMaster(boolean master);
-
-    /**
-     * 获取设备当前是否为主泵
-     * @return
-     */
-    boolean getMaster();
-
     /**
      * 设置当前设备输注id
      * @param infusionId
@@ -186,19 +144,6 @@ public interface DeviceOperator extends Operator {
      */
     String getClassification();
 
-    /**
-     * 获取设备最新上传数据时间
-     * @return
-     */
-    Date getUploadTime();
-
-
-    /**
-     * 设置设备最新上传数据时间
-     * @param uploadTime
-     */
-    void setUploadTime(Date uploadTime);
-
 
     /**
      * 获取设备上传流速

+ 72 - 43
nb-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java

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

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

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

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

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

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

@@ -82,9 +82,6 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
         if(deviceOperator==null){
             return;
         }
-        if(CharSequenceUtil.isNotEmpty(entity.getAlias())){
-            deviceOperator.setAlias(entity.getAlias());
-        }
         if(entity.getEnable()!=null){
             deviceOperator.setEnable(entity.getEnable());
         }

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

@@ -11,10 +11,13 @@ import com.coffee.bus.mapper.BusEvaluationMapper;
 import com.coffee.bus.service.dto.EvalQuery;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.crud.BaseService;
+import com.coffee.common.exception.CustomException;
+import org.hibernate.validator.constraints.Length;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.Optional;
 
@@ -42,7 +45,15 @@ 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

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

@@ -1,9 +1,14 @@
 package com.coffee.bus.service;
 
+import cn.dev33.satoken.spring.SpringMVCUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusHospitalConfigEntity;
+import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.enums.ConfigEnum;
+import com.coffee.bus.hospital.HospitalManager;
 import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.hospital.config.bean.*;
 import com.coffee.bus.mapper.BusHospitalConfigMapper;
@@ -14,7 +19,10 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -34,6 +42,10 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     @Lazy
     private HospitalManagerRegister managerRegister;
 
+    @Autowired
+    @Lazy
+    private LocalBusPatientService patientService;
+
     @Autowired
     @Lazy
     private WsPublishUtils wsPublishUtils;
@@ -46,6 +58,7 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     @Override
     public void validateBeforeUpdate(BusHospitalConfigEntity entity) {
 
+
     }
 
     @Override
@@ -58,9 +71,7 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
         BusHospitalConfigEntity configEntity = this.getById(entity.getId());
         managerRegister.refresh(configEntity.getTenantId(),false,true);
         if (entity.getType().equals(ConfigEnum.patientCode)) {
-            CompletableFuture.runAsync(()->{
-//                wsPublishUtils.publishPatientAdd();
-            });
+            updatePatientCode(configEntity.getTenantId());
         }
     }
 
@@ -68,6 +79,9 @@ public class LocalBusHospitalConfigService extends BaseService<BusHospitalConfig
     public void postUpdate(BusHospitalConfigEntity entity) {
         BusHospitalConfigEntity configEntity = this.getById(entity.getId());
         managerRegister.refresh(configEntity.getTenantId(),false,true);
+        if (entity.getType().equals(ConfigEnum.patientCode)) {
+            updatePatientCode(configEntity.getTenantId());
+        }
     }
 
     /**
@@ -188,4 +202,22 @@ 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);
+        });
+    }
 }

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

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

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

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

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

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

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

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

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

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

+ 88 - 89
nb-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -80,75 +80,80 @@ 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("设备数据中分包标识不能为空");
-            }
-            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());
+            try {
+                log.info("接收到设备消息:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
+                BusDeviceRunningEntity device = infoEvent.getContent();
+                String classification = device.getClassification();
+                if(StrUtil.isBlank(classification)){
+                    log.error("设备号:[{}]分包标识号为空,无法更新开始时间");
+                    throw new RuntimeException("设备数据中分包标识不能为空");
                 }
-                wsPublishUtils.publishMonitorStateCount(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);
                 if(device.isNewInfusion()){
-                    CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getPatientCode(),10,false)
-                            ,executor)
-                            .exceptionally(t->{
-                                log.error("新的输注产生后,拉取病号【{}】信息失败,失败原因:",device.getPatientCode(),t);
-                                return null;
-                            });
+                    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);
                 }
-                return null;
-            });
 
-            //所有事务处理完成后更新缓存信息
-            cacheOperation.forEach(Supplier::get);
-            log.info("设备数据处理结束:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
-            log.info("设备数据处理耗时:{}",(System.currentTimeMillis()-startTime));
+                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());
+                    }
+                    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));
+            }catch (Exception e){
+                e.printStackTrace();
+                throw e;
+            }
+
         }
     }
 
@@ -241,20 +246,18 @@ public class DeviceInfoListener {
                             if(log.isDebugEnabled()){
                                 log.debug("住院号病人信息,【{}】,输注设备被占用,切换设备",JSONUtil.toJsonStr(lastPatient));
                             }
-                            patientRegistry
-                                    .getOperator(lastInfusion.getTenantId(),lastPatient.getOriginCode())
-                                    .setBindDeviceId(normalInfusion.getDeviceId());
-                            suppliers.add(()->{
-                                wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientId(),lastInfusion.getTenantId());
-                                return null;
-                            });
+                            if(lastPatient!=null){
+                                patientRegistry
+                                        .getOperator(lastInfusion.getTenantId(),lastPatient.getOriginCode())
+                                        .setBindDeviceId(normalInfusion.getDeviceId());
+                                suppliers.add(()->{
+                                    wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientId(),lastInfusion.getTenantId());
+                                    return null;
+                                });
+                            }
                         }
                     }
                 }
-//                if(clinicFinished){
-//                    clinicService.resetClinic(device.getClinicId());
-//                    device.setResetClinic(true);
-//                }
                 device.setMaster(true);
                 suppliers.add(()->{
                     currentPatientOperator.setBindDeviceId(deviceId);
@@ -282,9 +285,10 @@ public class DeviceInfoListener {
      */
     private BusInfusionHistoryEntity handleInfusionHistory(BusDeviceRunningEntity device, DeviceOperator deviceOperator, List<Supplier<?>> cacheOperation) {
         boolean newInfusion=isNewInFusion(device.getDeviceId(),device.getClassification());
+        device.setNewInfusion(newInfusion);
         if(newInfusion){
-            BusDeviceEntity deviceEntity = deviceService.getByDeviceId(device.getDeviceId());
-            device.setTenantId(deviceEntity.getTenantId());
+//            BusDeviceEntity deviceEntity = deviceService.getByDeviceId(device.getDeviceId());
+            device.setTenantId(deviceOperator.getTenantId());
         }
         PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode(),MapUtil.of("startTime", device.getStartTime()));
         device.setClinicId(patientOperator.getClinicId());
@@ -300,7 +304,6 @@ public class DeviceInfoListener {
             infusionHistory.setId(IdWorker.getIdStr());
             infusionHistory.setFinished(false);
             infusionHistory.setStartTime(device.getUploadTime());
-            device.setNewInfusion(true);
             //结束其余输注信息
             infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
                     .eq(BusInfusionHistoryEntity::getDeviceId,device.getDeviceId())
@@ -309,10 +312,12 @@ public class DeviceInfoListener {
                     .set(BusInfusionHistoryEntity::getFinished,true));
         }else {
             device.setNewInfusion(false);
-            infusionHistory.setStartTime(device.getStartTime());
+//            infusionHistory.setStartTime(device.getStartTime());
             infusionHistory.setId(originInfusionId);
             BusInfusionHistoryEntity originInfusion = infusionHistoryService.getById(originInfusionId);
-            device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
+            if(originInfusion!=null){
+                device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
+            }
         }
         device.setInfusionId(infusionHistory.getId());
         cacheOperation.add(()->{
@@ -323,6 +328,7 @@ public class DeviceInfoListener {
                 deviceOperator.setTenantId(device.getTenantId());
                 deviceOperator.setContinueDose(device.getContinueDose());
             }
+            patientOperator.setExist(true);
             return null;
         });
         return infusionHistory;
@@ -354,7 +360,6 @@ public class DeviceInfoListener {
             cacheOperation.add(()->{
                 if(device.isInfusionModify()){
                     deviceOperator.setInfusionParam(signHex);
-                    deviceOperator.setModifyTime(device.getUploadTime());
                 }
                 return null;
             });
@@ -366,19 +371,13 @@ public class DeviceInfoListener {
                 infusionModifyService.save(modify);
             }
             device.setInfusionModifyId(modify.getId());
-            //已输注为主对无泵进行判断
-//            if (DeviceStatusEnum.Shutdown.equals(device.getRunState())) {
-//                //设备关机后,查看用户是否存在其他正在进行的输注
-//                infusionHistoryService.deviceShutDown(device.getInfusionId(),device.getPatientCode(),device.getTenantId());
-//            }
         }
         //判断临床是否已结束,若临床已结束,则采用当前输注作为主输注开启临床
         if(clinicFinished){
             clinicService.resetClinic(device.getClinicId());
             patientService.update(new UpdateWrapper<BusPatientEntity>()
                     .lambda()
-                    .eq(BusPatientEntity::getCode,device.getPatientCode())
-                    .eq(BusPatientEntity::getTenantId,device.getTenantId())
+                    .eq(BusPatientEntity::getId,device.getPatientId())
                     .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
             PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
             device.setMaster(true);

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

@@ -78,15 +78,9 @@
             </if>
         </where>
         ) AS da
-        left JOIN (
+        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>

+ 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 FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
-            join  (select * from bus_infusion_history where is_undo=0 and finished=0) as i on i.patient_code=p.code
+            FROM (SELECT `name`,gender,infusion_id,CODE,id FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
+            join  (select * from bus_infusion_history where is_undo=0 and finished=0) as i on i.patient_id=p.id
             join (select device_id,alias from bus_device) as d on d.device_id=i.device_id
-            join  (SELECT * FROM bus_clinic WHERE finished=0 and monitor_type=1) AS c ON  c.`patient_code`=p.code;
+            join  (SELECT * FROM bus_clinic WHERE finished=0 and monitor_type=1) AS c ON  c.`patient_id`=p.id;
         </select>
 
     <select id="selectNoneDevice" resultMap="deviceNone">