Jelajahi Sumber

add 完善日志
update 将低输注判定 延迟判定改为实时判定

A17404李放 3 tahun lalu
induk
melakukan
0c9e490044

+ 8 - 0
nb-system/src/main/java/com/nb/bus/entity/BusDeviceRunningEntity.java

@@ -134,6 +134,14 @@ public class BusDeviceRunningEntity extends CommonDeviceParam<String,String> {
     @TableField(exist = false)
     @TableField(exist = false)
     @JsonIgnoreProperties
     @JsonIgnoreProperties
     private String formatPatientCode;
     private String formatPatientCode;
+
+    /**
+     * 该次数据是否可能会产生低输注
+     */
+    @TableField(exist = false)
+    @JsonIgnoreProperties
+    private boolean maybeLowInfusion;
+
     /**
     /**
      * @author 龙三郎
      * @author 龙三郎
      * 根据阿里云传回数据的items,设置输注的属性
      * 根据阿里云传回数据的items,设置输注的属性

+ 1 - 1
nb-system/src/main/java/com/nb/bus/hospital/config/HospitalFunctionAnalConfigHandler.java

@@ -115,7 +115,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
         Collection<Object> valueRange = redissonUtil.getValueRange(analSortKey, startTime, true, endTime, true);
         Collection<Object> valueRange = redissonUtil.getValueRange(analSortKey, startTime, true, endTime, true);
         if(CollUtil.isEmpty(valueRange)){
         if(CollUtil.isEmpty(valueRange)){
             //缓存中只保留7天的历史数据
             //缓存中只保留7天的历史数据
-            log.warn("消息【{}】,设备【{}】判定低输注时,从缓存获取得分数据为空,设备信息【{}】",source.getMsgId(),source.getId(), JSONUtil.toJsonStr(source));
+            log.warn("消息【{}】,设备【{}】判定镇痛不足时,从缓存获取得分数据为空,设备信息【{}】",source.getMsgId(),source.getId(), JSONUtil.toJsonStr(source));
             return;
             return;
         }
         }
         List<AnalEntity> anals = valueRange.stream().map(Value::simple).map(value -> value.as(AnalEntity.class)).collect(Collectors.toList());
         List<AnalEntity> anals = valueRange.stream().map(Value::simple).map(value -> value.as(AnalEntity.class)).collect(Collectors.toList());

+ 31 - 77
nb-system/src/main/java/com/nb/bus/hospital/config/HospitalFunctionExtraConfigHandler.java

@@ -10,10 +10,10 @@ import com.nb.bus.enums.DeviceStatusEnum;
 import com.nb.bus.enums.DeviceTypeEnum;
 import com.nb.bus.enums.DeviceTypeEnum;
 import com.nb.bus.hospital.enums.ConfigHandlerEnums;
 import com.nb.bus.hospital.enums.ConfigHandlerEnums;
 import com.nb.bus.registry.constant.DeviceKeyConstant;
 import com.nb.bus.registry.constant.DeviceKeyConstant;
+import com.nb.bus.registry.device.DeviceOperator;
 import com.nb.bus.registry.device.DeviceRegistry;
 import com.nb.bus.registry.device.DeviceRegistry;
 import com.nb.bus.service.LocalBusDeviceAlarmService;
 import com.nb.bus.service.LocalBusDeviceAlarmService;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
-import com.nb.bus.service.LocalBusPatientService;
 import com.nb.bus.utils.WsPublishUtils;
 import com.nb.bus.utils.WsPublishUtils;
 import com.nb.common.cache.ConfigStorage;
 import com.nb.common.cache.ConfigStorage;
 import com.nb.common.entity.AbstractMsgId;
 import com.nb.common.entity.AbstractMsgId;
@@ -21,9 +21,9 @@ import com.nb.common.util.RedissonUtil;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.intellij.lang.annotations.Flow;
 import org.redisson.api.RDelayedQueue;
 import org.redisson.api.RDelayedQueue;
-import java.util.Date;
+
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 
 /**
 /**
@@ -41,15 +41,12 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
     private HospitalFinishMonitorConfigHandler monitorConfigHandler;
     private HospitalFinishMonitorConfigHandler monitorConfigHandler;
     private HospitalAutoUndoConfigHandler autoUndoConfigHandler;
     private HospitalAutoUndoConfigHandler autoUndoConfigHandler;
     private LocalBusDeviceAlarmService alarmService;
     private LocalBusDeviceAlarmService alarmService;
-    //最后一次低输注警报延迟任务
-    private LowInfusionEntity lastLowInfusionWarn;
 
 
     public HospitalFunctionExtraConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusInfusionHistoryService infusionHistoryService,
     public HospitalFunctionExtraConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusInfusionHistoryService infusionHistoryService,
                                               DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils,
                                               DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils,
                                               HospitalFinishMonitorConfigHandler monitorConfigHandler,
                                               HospitalFinishMonitorConfigHandler monitorConfigHandler,
                                               HospitalAutoUndoConfigHandler autoUndoConfigHandler,
                                               HospitalAutoUndoConfigHandler autoUndoConfigHandler,
-                                              LocalBusDeviceAlarmService alarmService,
-                                              LocalBusPatientService patientService) {
+                                              LocalBusDeviceAlarmService alarmService) {
         super(configStorage, hospitalId, redissonUtil, infusionHistoryService, deviceRegistry, wsPublishUtils);
         super(configStorage, hospitalId, redissonUtil, infusionHistoryService, deviceRegistry, wsPublishUtils);
         this.monitorConfigHandler=monitorConfigHandler;
         this.monitorConfigHandler=monitorConfigHandler;
         this.autoUndoConfigHandler=autoUndoConfigHandler;
         this.autoUndoConfigHandler=autoUndoConfigHandler;
@@ -76,7 +73,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         if (config.getNoSignal()!=null&&config.getNoSignal()>0) {
         if (config.getNoSignal()!=null&&config.getNoSignal()>0) {
             judgeNoSignal(source,config.getNoSignal());
             judgeNoSignal(source,config.getNoSignal());
         }
         }
-        if (config.getLowInfusion()!=null&&config.getLowInfusion()>0&&!DeviceStatusEnum.StartUp.equals(source.getRunState())) {
+        if (config.getLowInfusion()!=null&&config.getLowInfusion()>=0&&!DeviceStatusEnum.StartUp.equals(source.getRunState())) {
             judgeLowInfusion(source,config.getLowInfusion());
             judgeLowInfusion(source,config.getLowInfusion());
         }
         }
     }
     }
@@ -165,72 +162,41 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
      * @author lifang
      * @author lifang
      * @date 2022/5/19 15:52
      * @date 2022/5/19 15:52
      * @param source
      * @param source
-     * @param interval
+     * @param interval 毫秒级
      * @return void
      * @return void
      */
      */
     private void judgeLowInfusion(BusDeviceRunningEntity source,int interval){
     private void judgeLowInfusion(BusDeviceRunningEntity source,int interval){
-        RDelayedQueue<AbstractMsgId> lowInfusionDelay = redissonUtil.getDelayedQueue(getId() +"-lowFusion", e -> {
-            if(e instanceof  LowInfusionEntity){
-                handleLowInfusion((LowInfusionEntity)e);
-            }
-        });
         //仅智能泵存在
         //仅智能泵存在
         if(DeviceTypeEnum.intelligent.equals(source.getType())){
         if(DeviceTypeEnum.intelligent.equals(source.getType())){
+            DeviceOperator operator = deviceRegistry.getOperator(source.getDeviceId());
             if (source.getFlowDownLimit()!=null&&source.getContinueDose().compareTo(source.getFlowDownLimit())<1) {
             if (source.getFlowDownLimit()!=null&&source.getContinueDose().compareTo(source.getFlowDownLimit())<1) {
-                if(log.isDebugEnabled()){
-                    log.debug("设备【{}】,持续量【{}】,下限【{}】,触发【低输注】延迟任务",source.getDeviceId(),source.getContinueDose(),source.getFlowDownLimit());
+                if(log.isDebugEnabled()) {
+                    log.debug("消息【{}】,设备【{}】,持续量【{}】,下限【{}】,触发【低输注】判定", source.getMsgId(),source.getDeviceId(), source.getContinueDose(), source.getFlowDownLimit());
                 }
                 }
-                //输注量超过阈值,进行低输注判定
-                lastLowInfusionWarn= LowInfusionEntity.builder()
-                        .deviceId(source.getDeviceId())
-                        .timeout(interval)
-                        .unit(TimeUnit.MINUTES)
-                        .tenantId(source.getTenantId())
-                        .historyId(source.getHistoryId())
-                        .infusionId(source.getInfusionId())
-                        .timestamp(new Date())
-                        .build();
-                redissonUtil.offerQueue(lowInfusionDelay,lastLowInfusionWarn,lastLowInfusionWarn.getTimeout(),lastLowInfusionWarn.getUnit());
-            }
-        }else {
-            //输注量未超过阈值,取消低输注状态
-            if(lastLowInfusionWarn!=null){
-                log.info("设备【{}】不满足低输注状态,取消【低输注】延迟任务【{}】",lastLowInfusionWarn.getId());
-                lowInfusionDelay.remove(lastLowInfusionWarn);
-            }
-            if(FlowStatusEnum.Lowest.equals(source.getWarnFlow())){
-                source.setWarnFlow(null);
-            }
-        }
-    }
+                if(interval==0){
+                    //实时判定
+                    source.setWarnFlow(FlowStatusEnum.Lowest);
+                }else if(!source.isNewInfusion()) {
+                    //非实时判定时,对于新输注的第一条数据不做判定
+                    Date nonLowInfusionTime = operator
+                            .getNonLowInfusionTime();
+                    if(nonLowInfusionTime==null){
+                        //非低输注时间为空表示该此输注过程中所有的数据都为低输注判定数据,则判定时间按照输注开始时间进行计算
+                        nonLowInfusionTime=source.getStartTime();
+                    }
+                    if((source.getUploadTime().getTime()-TimeUnit.MINUTES.toMillis(interval))>nonLowInfusionTime.getTime()){
+                        //当前上传时间-低输注判定间隔 > 最后一次 非低输注状态,则当前状态判定为低输注状态
+                        source.setWarnFlow(FlowStatusEnum.Lowest);
+                    }
 
 
-    /**
-     * 描述: 低输注状态处理
-     * @author lifang
-     * @date 2022/5/19 16:08
-     * @param source
-     * @return void
-     */
-    private void handleLowInfusion(LowInfusionEntity source) {
-        String deviceId = source.getDeviceId();
-        BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(source.getInfusionId());
-        if (Boolean.TRUE.equals(infusionHistory.getFinished())) {
-            //泵已换绑医院,无需再处理
-            return;
+                }
+                source.setMaybeLowInfusion(true);
+            }else {
+                if(FlowStatusEnum.Lowest.equals(source.getWarnFlow())){
+                    source.setWarnFlow(null);
+                }
+            }
         }
         }
-        infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId, infusionHistory.getId())
-                .set(BusInfusionHistoryEntity::getWarnFlow, FlowStatusEnum.Lowest));
-        //报警/提醒缓存重置
-        deviceRegistry.getOperator(deviceId)
-                .getCache()
-                .remove(DeviceKeyConstant.ALARM);
-        //低输注报警
-        Date uploadTime=new Date(source.getTimestamp().getTime()+source.getUnit().toMillis(source.getTimeout()));
-        BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.lowInfusion(source.getDeviceId(),source.getInfusionId(),source.getHistoryId(),source.getTenantId(),uploadTime);
-        alarmService.save(alarm);
-        //发布推送
-        wsPublishUtils.publishPatientMonitor(infusionHistory.getPatientId(), infusionHistory.getTenantId());
-
     }
     }
 
 
     @Data
     @Data
@@ -246,16 +212,4 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         private Date uploadTime;
         private Date uploadTime;
         private Date timestamp;
         private Date timestamp;
     }
     }
-
-    @Data
-    @Builder
-    static class LowInfusionEntity extends AbstractMsgId   {
-        private String deviceId;
-        private Integer timeout;
-        private TimeUnit unit;
-        private String historyId;
-        private String tenantId;
-        private String infusionId;
-        private Date timestamp;
-    }
 }
 }

+ 2 - 2
nb-system/src/main/java/com/nb/bus/hospital/config/bean/FunctionExtraConfig.java

@@ -16,8 +16,8 @@ import java.io.Serializable;
 @ApiModel("其他配置中的其他配置")
 @ApiModel("其他配置中的其他配置")
 @Data
 @Data
 public class FunctionExtraConfig implements Serializable {
 public class FunctionExtraConfig implements Serializable {
-    @ApiModelProperty("低输注时间设置")
+    @ApiModelProperty("低输注时间设置 (分钟)")
     private Integer lowInfusion;
     private Integer lowInfusion;
-    @ApiModelProperty("不在服务区时间设置")
+    @ApiModelProperty("不在服务区时间设置 (分钟)")
     private Integer noSignal;
     private Integer noSignal;
 }
 }

+ 2 - 0
nb-system/src/main/java/com/nb/bus/registry/constant/DeviceKeyConstant.java

@@ -36,4 +36,6 @@ public class DeviceKeyConstant {
     public static final String APPEND_DOSE="append_dose";
     public static final String APPEND_DOSE="append_dose";
 
 
     public static final String UPLOAD="upload";
     public static final String UPLOAD="upload";
+
+    public static final String NON_INFUSION_TIME="non_infusion_time";
 }
 }

+ 30 - 0
nb-system/src/main/java/com/nb/bus/registry/device/ClusterDeviceOperator.java

@@ -6,6 +6,7 @@ import com.nb.bus.entity.BusDeviceAlarmEntity;
 import com.nb.bus.entity.BusDeviceEntity;
 import com.nb.bus.entity.BusDeviceEntity;
 import com.nb.bus.entity.BusInfusionHistoryEntity;
 import com.nb.bus.entity.BusInfusionHistoryEntity;
 import com.nb.bus.entity.BusInfusionModifyEntity;
 import com.nb.bus.entity.BusInfusionModifyEntity;
+import com.nb.bus.enums.DeviceTypeEnum;
 import com.nb.bus.registry.constant.DeviceKeyConstant;
 import com.nb.bus.registry.constant.DeviceKeyConstant;
 import com.nb.bus.service.LocalBusDeviceService;
 import com.nb.bus.service.LocalBusDeviceService;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
@@ -327,6 +328,35 @@ public class ClusterDeviceOperator implements DeviceOperator {
         return value.as(BigDecimal.class);
         return value.as(BigDecimal.class);
     }
     }
 
 
+    @Override
+    public Date getNonLowInfusionTime() {
+        Value value = getValue(DeviceKeyConstant.APPEND_DOSE);
+        if(value==null){
+            BusInfusionHistoryEntity lastInfusion = getLastInfusion();
+            if(lastInfusion==null){
+                value=Value.simple(null);
+                setNonLowInfusionTime(null);
+                return value.asDate();
+            }
+            if(DeviceTypeEnum.intelligent.equals(lastInfusion.getType())){
+                if (lastInfusion.getFlowDownLimit()!=null&&lastInfusion.getContinueDose().compareTo(lastInfusion.getFlowDownLimit())<1) {
+                    value=Value.simple(lastInfusion.getLastUploadTime());
+                }else {
+                    value=Value.simple(null);
+                }
+                setNonLowInfusionTime(value.asDate());
+                return value.asDate();
+            }
+            value=Value.simple(null);
+        }
+        return value.asDate();
+    }
+
+    @Override
+    public void setNonLowInfusionTime(Date nonLowInfusionTime) {
+        put(DeviceKeyConstant.NON_INFUSION_TIME,wrapperValue(nonLowInfusionTime));
+    }
+
     @Override
     @Override
     public void clear() {
     public void clear() {
         mapCache.clear();
         mapCache.clear();

+ 12 - 0
nb-system/src/main/java/com/nb/bus/registry/device/DeviceOperator.java

@@ -201,5 +201,17 @@ public interface DeviceOperator extends Operator {
      */
      */
     BigDecimal getTotalAppendDose();
     BigDecimal getTotalAppendDose();
 
 
+    /**
+     * 获取上次非低输注状态时间,若时间为null,则上一条数据为非低输注状态
+     *
+     */
+    Date getNonLowInfusionTime();
+
+    /**
+     * 设置最新的非低输注状态时间
+     *
+     */
+    void setNonLowInfusionTime(Date nonLowInfusionTime);
+
     void clear();
     void clear();
 }
 }

+ 3 - 0
nb-system/src/main/java/com/nb/bus/websocket/listener/DeviceInfoListener.java

@@ -158,6 +158,9 @@ public class DeviceInfoListener {
                 if (Boolean.TRUE.equals(device.isResetClinic())) {
                 if (Boolean.TRUE.equals(device.isResetClinic())) {
                     wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
                     wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
                 }
                 }
+                if(!device.isMaybeLowInfusion()){
+                    deviceOperator.setNonLowInfusionTime(device.getUploadTime());
+                }
                 wsPublishUtils.publishMonitorStateCount(device.getTenantId());
                 wsPublishUtils.publishMonitorStateCount(device.getTenantId());
                 if(device.isNewInfusion()){
                 if(device.isNewInfusion()){
                     CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getFormatPatientCode(),10,false)
                     CompletableFuture.runAsync(()->patientService.getPatientInfoFromHis(device.getTenantId(),device.getFormatPatientCode(),10,false)