|
|
@@ -1,6 +1,7 @@
|
|
|
package com.coffee.bus.hospital.config;
|
|
|
|
|
|
|
|
|
+import cn.hutool.extra.spring.SpringUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.coffee.bus.entity.BusDeviceAlarmEntity;
|
|
|
import com.coffee.bus.hospital.config.bean.FunctionAnalConfig;
|
|
|
@@ -12,13 +13,18 @@ import com.coffee.bus.service.LocalBusDeviceAlarmService;
|
|
|
import com.coffee.bus.service.LocalBusInfusionHistoryService;
|
|
|
import com.coffee.bus.utils.WsPublishUtils;
|
|
|
import com.coffee.common.cache.ConfigStorage;
|
|
|
+import com.coffee.common.cache.value.Value;
|
|
|
import com.coffee.common.entity.AbstractMsgId;
|
|
|
+import com.coffee.common.redis.RedisUtils;
|
|
|
import com.coffee.common.util.RedissonUtil;
|
|
|
import lombok.Builder;
|
|
|
import lombok.Data;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.redisson.api.RDelayedQueue;
|
|
|
+import org.redisson.client.protocol.ScoredEntry;
|
|
|
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.Date;
|
|
|
import java.util.Optional;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
@@ -40,6 +46,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
|
|
|
//最后一次取消镇痛不足报警任务对象
|
|
|
private NoneAnalEntity lastNoneAnal;
|
|
|
|
|
|
+
|
|
|
public HospitalFunctionAnalConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils,LocalBusDeviceAlarmService alarmService) {
|
|
|
super(configStorage, hospitalId, redissonUtil, infusionHistoryService, deviceRegistry, wsPublishUtils);
|
|
|
this.alarmService=alarmService;
|
|
|
@@ -56,7 +63,6 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
@Override
|
|
|
public void handler(BusDeviceRunningEntity source) {
|
|
|
FunctionAnalConfig config = this.getConfig().as(FunctionAnalConfig.class);
|
|
|
@@ -77,19 +83,16 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
|
|
|
* @return void
|
|
|
*/
|
|
|
private void judgeAnalPoor(BusDeviceRunningEntity source, FunctionAnalConfig analConfig){
|
|
|
- RDelayedQueue<AbstractMsgId> delayedQueue = redissonUtil.getDelayedQueue(getId().name(), e -> {
|
|
|
- if(e instanceof AnalEntity){
|
|
|
- this.handleAnalPoorAndJudgeFinish((AnalEntity) e);
|
|
|
- }
|
|
|
- });
|
|
|
+ String analSortKey="anal:sort:" + source.getDeviceId();
|
|
|
//如果有新的输注产生,则删除该设备镇痛不足任务
|
|
|
if(source.isNewInfusion()){
|
|
|
//镇痛不足设置为false
|
|
|
source.setWarnAnalgesicPoor(false);
|
|
|
- if(lastAnalWarn!=null){
|
|
|
- delayedQueue.remove(lastAnalWarn);
|
|
|
- }
|
|
|
+ //新输注清空缓存记录
|
|
|
+ redissonUtil.clearScoreSortSet(analSortKey);
|
|
|
}
|
|
|
+ redissonUtil.addScoreSortSet(analSortKey,source.getUploadTime().getTime(),source);
|
|
|
+
|
|
|
Integer insufficientTime = analConfig.getInsufficientTime();
|
|
|
Integer insufficientCount = analConfig.getInsufficientCount();
|
|
|
Boolean valid = analConfig.getValid();
|
|
|
@@ -97,6 +100,8 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
|
|
|
(insufficientCount==null||insufficientCount<=0)){
|
|
|
return;
|
|
|
}
|
|
|
+ Long endTime = source.getUploadTime().getTime();
|
|
|
+ Long startTime=endTime-TimeUnit.MINUTES.toMillis(insufficientTime);
|
|
|
|
|
|
lastAnalWarn = AnalEntity.builder()
|
|
|
.deviceId(source.getDeviceId())
|
|
|
@@ -111,7 +116,48 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
|
|
|
.timestamp(new Date())
|
|
|
.infusionId(source.getInfusionId())
|
|
|
.build();
|
|
|
- redissonUtil.offerQueue(delayedQueue,lastAnalWarn,lastAnalWarn.getTimeout(),lastAnalWarn.getUnit());
|
|
|
+
|
|
|
+ //获取该次输注过程中,以当前输注上传时间为结束时间,以判定时间区间为区间范围的时间窗口数据
|
|
|
+ Collection<ScoredEntry<Object>> scoreRange = redissonUtil.getRange(analSortKey, startTime.intValue(), endTime.intValue());
|
|
|
+ Optional<ScoredEntry<Object>> min = scoreRange.stream().max(Comparator.comparing(ScoredEntry::getScore));
|
|
|
+ if(!min.isPresent()){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //判定时间窗口内的首次输注记录
|
|
|
+ AnalEntity firstAnal = Value.simple(min.get().getValue()).as(AnalEntity.class);
|
|
|
+ if(firstAnal!=null){
|
|
|
+ try {
|
|
|
+ //实时判定PCA差值
|
|
|
+ int subCount=0;
|
|
|
+ if(Boolean.TRUE.equals(analConfig.getValid())){
|
|
|
+ subCount=Math.subtractExact(source.getPcaValidCount(), Optional.ofNullable(firstAnal.getPcaValidCount()).orElse(0));
|
|
|
+ }else {
|
|
|
+ subCount=Math.subtractExact(source.getPcaInvalidCount(), Optional.ofNullable(firstAnal.getPcaInvalidCount()).orElse(0));
|
|
|
+ }
|
|
|
+ if(subCount>analConfig.getInsufficientCount()){
|
|
|
+ log.info("设备:{}镇痛不足--实时判定",source.getDeviceId());
|
|
|
+ source.setWarnAnalgesicPoor(true);
|
|
|
+ //镇痛消失延迟队列
|
|
|
+ RDelayedQueue<AbstractMsgId> noneAnalDelayedQueue = redissonUtil.getDelayedQueue("none-" + getId(), e -> {
|
|
|
+ if(e instanceof NoneAnalEntity){
|
|
|
+ handleAnalFinish((NoneAnalEntity) e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ NoneAnalEntity.builder()
|
|
|
+ .deviceId(firstAnal.getDeviceId())
|
|
|
+ .tenantId(firstAnal.getTenantId())
|
|
|
+ .timeout(analConfig.getDisappearTime())
|
|
|
+ .unit(TimeUnit.MINUTES)
|
|
|
+ .infusionId(firstAnal.getInfusionId())
|
|
|
+ .historyId(firstAnal.getHistoryId())
|
|
|
+ .timestamp(new Date())
|
|
|
+ .build();
|
|
|
+ redissonUtil.offerQueue(noneAnalDelayedQueue,lastNoneAnal,lastNoneAnal.getTimeout(),lastNoneAnal.getUnit());
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ log.debug("镇痛不足缓存解析失败,设备号【{}】",source.getDeviceId(),e);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -143,7 +189,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
|
|
|
subCount=Math.subtractExact(infusionHistory.getPcaInvalidCount(), Optional.ofNullable(anal.getPcaInvalidCount()).orElse(0));
|
|
|
}
|
|
|
if(subCount>anal.getThreshold()){
|
|
|
- log.info("设备:{}镇痛不足",deviceId);
|
|
|
+ log.info("设备:{}镇痛不足--延迟判定",deviceId);
|
|
|
//触发阈值,设置为镇痛不足
|
|
|
if(!Boolean.TRUE.equals(infusionHistory.getWarnAnalgesicPoor())){
|
|
|
infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId,infusionHistory.getId())
|