فهرست منبع

feat 临床下改为输注为主 去除deviceRunning表 泵绑定改为输注绑定

A17404李放 3 سال پیش
والد
کامیت
fcbfd8c299
45فایلهای تغییر یافته به همراه725 افزوده شده و 1407 حذف شده
  1. 0 7
      coffee-admin/src/main/test/java/com/coffee/admin/BusDeviceRegisterTest.java
  2. 0 66
      coffee-system/src/main/java/com/coffee/bus/config/mybaits/WardHandler.java
  3. 0 10
      coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceController.java
  4. 0 104
      coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceRunningController.java
  5. 24 57
      coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java
  6. 1 1
      coffee-system/src/main/java/com/coffee/bus/controller/vo/GetPatientInfoVo.java
  7. 23 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceAlarmEntity.java
  8. 18 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java
  9. 0 1
      coffee-system/src/main/java/com/coffee/bus/entity/BusFormulaEntity.java
  10. 6 45
      coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionHistoryEntity.java
  11. 3 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionModifyEntity.java
  12. 1 1
      coffee-system/src/main/java/com/coffee/bus/entity/BusPatientEntity.java
  13. 22 3
      coffee-system/src/main/java/com/coffee/bus/entity/PatientDeviceRepeatDomain.java
  14. 9 7
      coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManager.java
  15. 5 7
      coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManagerRegister.java
  16. 1 8
      coffee-system/src/main/java/com/coffee/bus/hospital/config/AbstractHospitalConfigHandler.java
  17. 54 37
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalAutoUndoConfigHandler.java
  18. 38 49
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFinishMonitorConfigHandler.java
  19. 50 43
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionAnalConfigHandler.java
  20. 41 39
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
  21. 2 0
      coffee-system/src/main/java/com/coffee/bus/mapper/BusPatientMapper.java
  22. 1 2
      coffee-system/src/main/java/com/coffee/bus/registry/Operator.java
  23. 6 7
      coffee-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java
  24. 1 2
      coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java
  25. 27 38
      coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
  26. 1 1
      coffee-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java
  27. 1 2
      coffee-system/src/main/java/com/coffee/bus/registry/device/DeviceRegistry.java
  28. 0 74
      coffee-system/src/main/java/com/coffee/bus/registry/device/bean/DeviceCacheInfo.java
  29. 5 74
      coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
  30. 18 37
      coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java
  31. 6 65
      coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java
  32. 2 4
      coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientRegistry.java
  33. 0 72
      coffee-system/src/main/java/com/coffee/bus/registry/patient/bean/PatientCacheInfo.java
  34. 26 19
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java
  35. 0 184
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java
  36. 1 4
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  37. 119 10
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  38. 53 11
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java
  39. 7 3
      coffee-system/src/main/java/com/coffee/bus/service/dto/ManualUndoConfig.java
  40. 0 2
      coffee-system/src/main/java/com/coffee/bus/service/dto/PatientDeviceRepeatResult.java
  41. 2 4
      coffee-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java
  42. 2 0
      coffee-system/src/main/java/com/coffee/bus/websocket/WebSocketCloseHandler.java
  43. 117 277
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  44. 5 3
      coffee-system/src/main/resources/mapper/bus/BusClinicMapper.xml
  45. 27 23
      coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 0 - 7
coffee-admin/src/main/test/java/com/coffee/admin/BusDeviceRegisterTest.java

@@ -1,8 +1,5 @@
 package com.coffee.admin;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.coffee.bus.controller.BusDeviceRunningController;
 import com.coffee.bus.entity.BusDeviceEntity;
 import com.coffee.bus.service.LocalBusDeviceService;
 import org.junit.Test;
@@ -11,8 +8,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.Date;
-
 /**
  * @author lifang
  * @version 1.0.0
@@ -26,8 +21,6 @@ public class BusDeviceRegisterTest {
     @Autowired
     private LocalBusDeviceService registeredService;
 
-    @Autowired
-    private BusDeviceRunningController netPumpController;
     @Test
     public void save(){
         BusDeviceEntity deviceEntity = new BusDeviceEntity();

+ 0 - 66
coffee-system/src/main/java/com/coffee/bus/config/mybaits/WardHandler.java

@@ -1,66 +0,0 @@
-package com.coffee.bus.config.mybaits;
-
-import cn.hutool.extra.spring.SpringUtil;
-import com.coffee.bus.service.constant.LocalBusConMixService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.type.*;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import java.sql.CallableStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import static org.springframework.web.context.request.RequestAttributes.SCOPE_REQUEST;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName WardHandler.java
- * @Description 病区处理器
- * @createTime 2022年05月26日 21:06:00
- */
-@Slf4j
-@MappedTypes({String.class})
-@MappedJdbcTypes(JdbcType.VARCHAR)
-public class WardHandler extends StringTypeHandler {
-    private LocalBusConMixService conMixService;
-
-
-    @Override
-    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        init();
-        return conMixService.getWard(getTenantId(),rs.getString(columnName));
-    }
-
-    @Override
-    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        init();
-        return conMixService.getWard(getTenantId(),rs.getString(columnIndex));
-    }
-
-    @Override
-    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        init();
-        return conMixService.getWard(getTenantId(),cs.getString(columnIndex));
-    }
-
-    private String getTenantId(){
-        //判断是否为request请求
-        ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        if(request==null){
-            return "";
-        }
-        Object tenantId = request.getAttribute("tenantId", SCOPE_REQUEST);
-        if(tenantId==null){
-            return "";
-        }
-        return  String.valueOf(tenantId);
-    }
-
-    private void init(){
-        if(conMixService==null){
-            conMixService= SpringUtil.getBean(LocalBusConMixService.class);
-        }
-    }
-}

+ 0 - 10
coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceController.java

@@ -8,12 +8,9 @@ import com.baomidou.mybatisplus.core.mapper.Mapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.coffee.bus.controller.vo.DeviceBindVo;
 import com.coffee.bus.entity.BusDeviceEntity;
-import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.enums.DeviceAlarmEnum;
-import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.exception.BusinessException;
 import com.coffee.bus.exception.ErrorStatus;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusDeviceService;
 import com.coffee.bus.service.dto.DeviceQuery;
 import com.coffee.bus.service.dto.DeviceResult;
@@ -27,16 +24,9 @@ import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.context.request.async.DeferredResult;
 
 import java.io.Serializable;
 import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.stream.Collectors;
 
 /**
  * @author lifang

+ 0 - 104
coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceRunningController.java

@@ -1,104 +0,0 @@
-package com.coffee.bus.controller;
-
-import cn.dev33.satoken.SaManager;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpLogic;
-import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.mapper.Mapper;
-import com.coffee.bus.controller.vo.DeviceRunningMockVo;
-import com.coffee.bus.controller.vo.NoPumpConfigVo;
-import com.coffee.bus.entity.BusDeviceRunningEntity;
-import com.coffee.bus.enums.DeviceAlarmEnum;
-import com.coffee.bus.enums.DeviceStatusEnum;
-import com.coffee.bus.listener.event.bean.DeviceInfoEvent;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
-import com.coffee.bus.utils.MockUtils;
-import com.coffee.common.crud.BaseService;
-import com.coffee.common.crud.controller.BaseQueryController;
-import com.coffee.common.result.R;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import org.springframework.boot.SpringApplication;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName BusHospitalController.java
- * @Description TODO
- * @createTime 2022年03月19日 09:28:00
- */
-@RestController
-@AllArgsConstructor
-@RequestMapping("/bus/device/running")
-@Api(tags = "设备运行状态管理",description = "统一权限前缀(device:running),例如新增device:running:add")
-public class BusDeviceRunningController implements BaseQueryController<BusDeviceRunningEntity, String> {
-    private final LocalBusDeviceRunningService netPumpService;
-
-    @GetMapping("/alarm/dict")
-    @ApiOperation(value = "设备报警状态枚举,无权限配置, alarm字段表示该状态是否为报警状态")
-    public R alarm(){
-        return R.success(DeviceAlarmEnum.values());
-    }
-
-    @GetMapping("/status/dict")
-    @ApiOperation(value = "设备运行状态枚举,无权限配置")
-    public R status(){
-        return R.success(DeviceStatusEnum.values());
-    }
-
-    @PostMapping("/nopump")
-    @SaCheckPermission("device:running:add")
-    @ApiOperation(value = "新增无泵数据,权限为device:running:add")
-    public R saveNoPump(@RequestBody NoPumpConfigVo noPump){
-        return R.success();
-    }
-
-    @PostMapping("/count/clinic")
-    @ApiOperation(value = "查询临床下泵的数量",notes = "根据病号+临床id+医院id 查询一个病人下是否绑定了多个泵,以此来作为泵重复的依据,权限标识为【空】")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "病号",name = "code"),
-            @ApiImplicitParam(value = "临床id",name = "clinicId")
-    })
-    public R repeatCount(@RequestParam("code") String patientCode,@RequestParam("clinicId") String clinic){
-        return R.success(netPumpService.count(new QueryWrapper<BusDeviceRunningEntity>()
-                .lambda()
-                .eq(BusDeviceRunningEntity::getPatientCode,patientCode)
-                .eq(BusDeviceRunningEntity::getClinicId,clinic)));
-    }
-
-    @PostMapping("/mock")
-    @ApiOperation(value = "模拟设备运行数据",notes = "在进行数据模拟前,请确保该泵存在于bus_device表中,若不存在,请添加后再模拟数据,当出现泵重复状态时,权限标识为【无】")
-    public R<BusDeviceRunningEntity> mock(@RequestBody DeviceRunningMockVo mockVo){
-        BusDeviceRunningEntity mock = MockUtils.mock(mockVo.getDeviceId(), mockVo.getPatientCode(), mockVo.getClassification(), mockVo.getType());
-        SpringUtil.publishEvent(new DeviceInfoEvent(this,mockVo,mockVo.getDeviceId()));
-        return R.success(mock);
-    }
-
-
-    
-
-
-    /**
-     * 权限控制前缀
-     * @return
-     */
-    @Override
-    public String getPermissionPrefix() {
-        return "device:running";
-    }
-
-    @Override
-    public StpLogic getStpLogin() {
-        return SaManager.getStpLogic("");
-    }
-
-    @Override
-    public BaseService<? extends Mapper<BusDeviceRunningEntity>, BusDeviceRunningEntity, String> getService() {
-        return netPumpService;
-    }
-}

+ 24 - 57
coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java

@@ -6,7 +6,6 @@ import cn.dev33.satoken.stp.StpLogic;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.mapper.Mapper;
 import com.coffee.bus.controller.vo.GetPatientInfoVo;
@@ -16,14 +15,11 @@ import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.enums.PatientAlarmEnum;
 import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.*;
 import com.coffee.bus.service.dto.*;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.crud.BaseService;
 import com.coffee.common.crud.controller.BaseQueryController;
-import com.coffee.common.entity.GenericEntity;
 import com.coffee.common.exception.CustomException;
 import com.coffee.common.result.R;
 import io.swagger.annotations.*;
@@ -49,8 +45,6 @@ import java.util.stream.Collectors;
 public class BusPatientController  implements BaseQueryController<BusPatientEntity,String> {
     private final LocalBusPatientService patientService;
 
-    private final LocalBusDeviceRunningService deviceRunningService;
-
     private final LocalBusClinicService clinicService;
 
     private final PatientRegistry patientRegistry;
@@ -98,15 +92,12 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
         if(CollectionUtil.isEmpty(patientCodes)){
             throw new CustomException("请选择一个病患");
         }
-
-        return R.success(CollectionUtil.isNotEmpty(deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>()
+        return R.success(infusionService.count(new QueryWrapper<BusInfusionHistoryEntity>()
                 .lambda()
-                .select(BusDeviceRunningEntity::getDeviceId,BusDeviceRunningEntity::getPatientCode,BusDeviceRunningEntity::getRunState,BusDeviceRunningEntity::getAlarm)
-                .eq(BusDeviceRunningEntity::getMaster,true)
-                .eq(BusDeviceRunningEntity::getMonitorType,true)
-                .nested(i->i.ne(BusDeviceRunningEntity::getRunState,DeviceStatusEnum.Shutdown)
-                        .ne(BusDeviceRunningEntity::getRunState,DeviceStatusEnum.NoSignal))
-                .in(BusDeviceRunningEntity::getPatientCode,patientCodes))));
+                .nested(i->i.ne(BusInfusionHistoryEntity::getRunState,DeviceStatusEnum.Shutdown)
+                        .ne(BusInfusionHistoryEntity::getRunState,DeviceStatusEnum.NoSignal))
+                .in(BusInfusionHistoryEntity::getPatientCode,patientCodes)
+                .eq(BusInfusionHistoryEntity::getFinished,false))!=0);
     }
 
     @PostMapping("/do/{monitorType}/finished")
@@ -140,36 +131,22 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
             if (CollectionUtil.isEmpty(clinicIds)) {
                 throw new CustomException("未选择临床信息");
             }
-            patientCodes=clinicService.list(new QueryWrapper<BusClinicEntity>().lambda()
-                    .in(BusClinicEntity::getId,clinicIds))
-                    .stream().map(BusClinicEntity::getPatientCode).collect(Collectors.toList());
-            if (CollectionUtil.isEmpty(patientCodes)) {
-                throw new CustomException("临床信息不存在");
-            }
-        }
-        List<BusDeviceRunningEntity> runningInfos = deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>()
-                .lambda()
-                .select(BusDeviceRunningEntity::getDeviceId,BusDeviceRunningEntity::getPatientCode,BusDeviceRunningEntity::getClinicId)
-                .in(BusDeviceRunningEntity::getPatientCode, patientCodes)
-                .eq(BusDeviceRunningEntity::getTenantId, tenantId));
-        Map<String, List<BusDeviceRunningEntity>> runningByCode=new HashMap<>();
-        if(CollectionUtil.isNotEmpty(runningInfos)){
-            runningByCode=runningInfos.stream().collect(Collectors.groupingBy(BusDeviceRunningEntity::getPatientCode));
         }
+        List<BusPatientEntity> patients = patientService.list(new QueryWrapper<BusPatientEntity>().lambda().in(BusPatientEntity::getCode, patientCodes));
         List<ManualUndoConfig> undoConfigs=new ArrayList<>();
-
-        for (String patientCode : patientCodes) {
-            PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(tenantId,patientCode);
+        for (BusPatientEntity patient : patients) {
             undoConfigs.add(
-                    ManualUndoConfig.of(runningByCode.getOrDefault(patientCode,new ArrayList<>()).stream().map(BusDeviceRunningEntity::getDeviceId).collect(Collectors.toList()),
-                            patientCode,operator.getClinicId(),
+                    ManualUndoConfig.of(
+                            Collections.singletonList(patient.getInfusionId()),
+                            patient.getCode(),
+                            patient.getClinicId(),
                             tenantId,
                             true,
                             monitorFinishedVo.getUndo())
             );
         }
         //病患绑定的有设备,对设备进行撤泵操作,且结束临床
-        deviceRunningService.batchUndo(undoConfigs,true);
+        infusionService.batchUndo(undoConfigs,true);
         return R.success(true);
     }
 
@@ -216,7 +193,7 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     @SaCheckPermission("device:patient:shift")
     @ApiOperation(value = "主泵切换的操作,只切换,不结束",notes = "当出现泵重复状态时,若用户想要进行主泵的切换,调用该接口进行操作,主泵切换完成后,会将副泵自动撤泵,权限标识为【device:patient:shift】")
     public R shift(@RequestBody@Validated DeviceShiftConfig shiftConfig){
-        deviceRunningService.shift(shiftConfig);
+        patientService.shift(shiftConfig);
         wsPublishUtils.publishPatientMonitor(shiftConfig.getPatientCode(),shiftConfig.getTenantId());
         return R.success();
     }
@@ -227,31 +204,21 @@ public class BusPatientController  implements BaseQueryController<BusPatientEnti
     public R shift(@RequestBody@Validated ManualUndoConfig undoConfig, @RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
         undoConfig.setTenantId(tenantId);
         //泵切换完成后,对病号报警解除
-        deviceRunningService.undo(undoConfig,false);
+        infusionService.undo(undoConfig,false);
+        PatientOperator operator = patientRegistry.getOperator(undoConfig.getTenantId(), undoConfig.getPatientCode());
         //判断当前病号下是否还存在副泵
-        List<BusDeviceRunningEntity> runningInfo = deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>().lambda()
-                .eq(BusDeviceRunningEntity::getPatientCode, undoConfig.getPatientCode())
-                .eq(BusDeviceRunningEntity::getTenantId, undoConfig.getTenantId())
-                .eq(BusDeviceRunningEntity::getIsUndo, false));
+        long count = infusionService.count(new QueryWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getClinicId, operator.getClinicId())
+                .eq(BusInfusionHistoryEntity::getFinished,false)
+                .eq(BusInfusionHistoryEntity::getIsUndo,false));
         //处理缓存信息
-        PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(undoConfig.getTenantId(), undoConfig.getPatientCode());
-        if(runningInfo.size()>1){
-            //仅撤泵,病号报警不解除
-            Optional<BusDeviceRunningEntity> master = runningInfo.stream().filter(running -> Boolean.TRUE.equals(running.getMaster())).findAny();
-            if(master.isPresent()){
-                operator.setBindDeviceId(master.get().getDeviceId());
-            }else {
-                operator.setBindDeviceId(null);
-            }
-            return R.success();
+        if(count==1){
+            patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
+                    .eq(BusPatientEntity::getCode,undoConfig.getPatientCode())
+                    .eq(BusPatientEntity::getTenantId,undoConfig.getTenantId())
+                    .set(BusPatientEntity::getAlarm, PatientAlarmEnum.NONE));
+            wsPublishUtils.publishDeviceRepeat(undoConfig.getTenantId());
         }
-        patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
-                .eq(BusPatientEntity::getCode,undoConfig.getPatientCode())
-                .eq(BusPatientEntity::getTenantId,undoConfig.getTenantId())
-                .set(BusPatientEntity::getAlarm, PatientAlarmEnum.NONE));
-
         wsPublishUtils.publishPatientMonitor(undoConfig.getPatientCode(),undoConfig.getTenantId());
-        wsPublishUtils.publishDeviceRepeat(undoConfig.getTenantId());
         return R.success();
     }
 

+ 1 - 1
coffee-system/src/main/java/com/coffee/bus/controller/vo/GetPatientInfoVo.java

@@ -17,5 +17,5 @@ public class GetPatientInfoVo {
     @ApiModelProperty("病号")
     private String patientCode;
     @ApiModelProperty("超时时间,单位:秒;默认10s,当超时时间为-1时,若没有拉取到数据则立即返回")
-    private long timeout;
+    private long timeout=10;
 }

+ 23 - 2
coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceAlarmEntity.java

@@ -16,6 +16,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
+import org.tio.utils.crypto.Md5;
+
 import java.util.Date;
 
 /**
@@ -114,7 +116,26 @@ public class BusDeviceAlarmEntity extends TenantGenericEntity<String,String> {
         return entity;
     }
 
-    public String signParm(Sign sign){
+    public static BusDeviceAlarmEntity parseRunning(BusInfusionHistoryEntity source){
+        BusDeviceAlarmEntity entity = new BusDeviceAlarmEntity();
+        entity.setDeviceId(source.getDeviceId());
+        entity.setUploadTime(source.getLastUploadTime());
+        if (source.getAlarm() != null && !DeviceAlarmEnum.None.equals(source.getAlarm())) {
+            entity.setAlarm(true);
+        }
+        entity.setHistoryId(source.getId());
+        entity.setInfusionId(source.getId());
+        entity.setRunState(source.getRunState());
+        entity.setAlarmState(source.getAlarm());
+        entity.setWarnWillFinished(source.getWarnWillFinished());
+        entity.setWarnAnalgesicPoor(source.getWarnAnalgesicPoor());
+        entity.setWarnLowBattery(source.getWarnLowBattery());
+        entity.setWarnFlow(source.getWarnFlow());
+        entity.setTenantId(source.getTenantId());
+        return entity;
+    }
+
+    public String signParm(){
         JSONObject param = new JSONObject(true);
         param.putOpt("runState",String.valueOf(this.getRunState()));
         param.putOpt("alarmState",String.valueOf(this.getAlarmState()));
@@ -122,7 +143,7 @@ public class BusDeviceAlarmEntity extends TenantGenericEntity<String,String> {
         param.putOpt("warnAnalgesicPoor",String.valueOf(this.getWarnAnalgesicPoor()));
         param.putOpt("warnLowBattery",String.valueOf(this.getWarnLowBattery()));
         param.putOpt("warnFlow",String.valueOf(this.getWarnFlow()));
-        return sign.signHex(param.toString());
+        return Md5.getMD5(param.toString());
     }
 
     public static boolean alarmOrWarn(CommonDeviceParam history){

+ 18 - 0
coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java

@@ -99,6 +99,24 @@ public class BusDeviceRunningEntity extends CommonDeviceParam<String,String> {
     @TableField(exist = false)
     @JsonIgnoreProperties
     private boolean newInfusion;
+    /**
+     * 当前运行状态输注信息是否发生了变化,只在设备上传解析过程中使用,其他地方无用处
+     */
+    @TableField(exist = false)
+    @JsonIgnoreProperties
+    private boolean infusionModify;
+    /**
+     * 患者id
+     */
+    @TableField(exist = false)
+    @JsonIgnoreProperties
+    private String patientId;
+    /**
+     * 重新开启临床信息
+     */
+    @TableField(exist = false)
+    @JsonIgnoreProperties
+    private boolean resetClinic;
     /**
      * @author 龙三郎
      * 根据阿里云传回数据的items,设置输注的属性

+ 0 - 1
coffee-system/src/main/java/com/coffee/bus/entity/BusFormulaEntity.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.coffee.bus.service.dto.FormulaDrugDetailDomain;
-import com.coffee.bus.service.dto.FormulaDrugDomain;
 import com.coffee.common.entity.TenantGenericEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 6 - 45
coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionHistoryEntity.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.annotation.*;
 import com.coffee.aliyun.utils.*;
 import com.coffee.bus.entity.common.CommonDeviceParam;
+import com.coffee.bus.enums.DeviceStatusEnum;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import io.swagger.annotations.ApiModel;
@@ -79,54 +80,14 @@ public class BusInfusionHistoryEntity extends CommonDeviceParam<String,String> {
     public static BusInfusionHistoryEntity parseRunningInfo(BusDeviceRunningEntity running){
         BusInfusionHistoryEntity entity = new BusInfusionHistoryEntity();
         BeanUtil.copyProperties(running,entity);
-//        entity.setDeviceId(running.getDeviceId());
         entity.setClinicId(running.getClinicId());
-//        entity.setPatientCode(running.getPatientCode());
-//        entity.setType(running.getType());
-//        entity.setWard(running.getWard());
-//        entity.setBedNo(running.getBedNo());
-//        entity.setClassification(running.getClassification());
         entity.setStartTime(running.getStartTime());
-//        entity.setTenantId(running.getTenantId());
-
-//        entity.setTotalDose(running.getTotalDose());
-//        entity.setFirstDose(running.getFirstDose());
-//        entity.setRemainDose(running.getRemainDose());
-//        entity.setInputDose(running.getInputDose());
-//        entity.setContinueDose(running.getContinueDose());
-//        entity.setAppendDose(running.getAppendDose());
-//        entity.setMaxDose(running.getMaxDose());
-//        entity.setSelfControlLockTime(running.getSelfControlLockTime());
-//        entity.setSelfControlCount(running.getSelfControlCount());
-//        entity.setPcaValidCount(running.getPcaValidCount());
-//        entity.setPcaInvalidCount(running.getPcaInvalidCount());
-//        entity.setPcaTotalCount(running.getPcaTotalCount());
-//        entity.setDataNumber(running.getDataNumber());
-//        /**
-//         * 脉冲泵参数
-//         */
-//        entity.setPulseDose(running.getPulseDose());
-//        entity.setPulseFirstLockTime(running.getPulseFirstLockTime());
-//        entity.setPulseLockTime(running.getPulseLockTime());
-//
-//        /**
-//         * 智能泵参数
-//         */
-//        entity.setFlowAdjustRate(running.getFlowAdjustRate());
-//        entity.setFlowCount(running.getFlowCount());
-//        entity.setFlowDownCycle(running.getFlowDownCycle());
-//        entity.setFlowUpCycle(running.getFlowUpCycle());
-//        entity.setFlowDownLimit(running.getFlowDownLimit());
-//        entity.setFlowUpLimit(running.getFlowUpLimit());
-//
+        entity.setPatientId(running.getPatientId());
         entity.setLastUploadTime(running.getUploadTime());
-//        entity.setRunState(running.getRunState());
-//        entity.setWarnAnalgesicPoor(running.getWarnAnalgesicPoor());
-//        entity.setWarnLowBattery(running.getWarnAnalgesicPoor());
-//        entity.setWarnWillFinished(running.getWarnAnalgesicPoor());
-//        entity.setAlarm(running.getAlarm());
-
-        //若当前临床信息不存在,则将时间戳置为 3000/01/01 01:01:01
+        if(DeviceStatusEnum.Shutdown.equals(running.getRunState())){
+            entity.setFinished(true);
+        }
+        //若当前临床信息不存在,则将时间戳置为 1971/01/01 01:01:01
         entity.setClinicStartTime(defaultClinicStartTime());
         return entity;
     }

+ 3 - 2
coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionModifyEntity.java

@@ -14,6 +14,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import lombok.experimental.Accessors;
+import org.tio.utils.crypto.Md5;
 
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMin;
@@ -198,7 +199,7 @@ public class BusInfusionModifyEntity extends TenantGenericEntity<String,String>
         return entity;
     }
 
-    public String signParam(Sign sign){
+    public String signParam(){
         //保证参数有序
         JSONObject param = new JSONObject(true);
 
@@ -239,6 +240,6 @@ public class BusInfusionModifyEntity extends TenantGenericEntity<String,String>
                 break;
             default:break;
         }
-        return sign.signHex(param.toString());
+        return Md5.getMD5(param.toString());
     }
 }

+ 1 - 1
coffee-system/src/main/java/com/coffee/bus/entity/BusPatientEntity.java

@@ -33,7 +33,7 @@ public class BusPatientEntity extends TenantGenericEntity<String,String> {
     private String code;
 
     @ApiModelProperty(value = "病人名称")
-    @Length(max = 255,message = "医生岗位长度不得超过255个字节")
+    @Length(max = 255,message = "病人名称长度不得超过255个字节")
     private String name;
 
     @ApiModelProperty(value = "性别")

+ 22 - 3
coffee-system/src/main/java/com/coffee/bus/entity/PatientDeviceRepeatDomain.java

@@ -1,9 +1,11 @@
 package com.coffee.bus.entity;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.coffee.bus.enums.DeviceAlarmEnum;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.enums.DeviceTypeEnum;
 import com.coffee.common.enums.SexEnum;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -34,8 +36,6 @@ public class PatientDeviceRepeatDomain {
     private String bedNo;
     @ApiModelProperty("手术名称")
     private String clinicName;
-    @ApiModelProperty("设备运行Id")
-    private String deviceRunningId;
     @ApiModelProperty("设备名称")
     private String deviceId;
     @ApiModelProperty("设备别名")
@@ -47,8 +47,27 @@ public class PatientDeviceRepeatDomain {
     @ApiModelProperty("输注开始时间")
     private Date infusionStartTime;
     @ApiModelProperty("是否为主泵")
-    private Boolean master;
+
+    private boolean master;
     @ApiModelProperty("手术id")
     private String clinicId;
 
+
+    @ApiModelProperty("主泵输注id")
+    @JsonIgnore
+    private String masterInfusionId;
+
+    @ApiModelProperty("输注id")
+    @JsonIgnore
+    private String infusionId;
+
+    public void setMasterInfusionId(String masterInfusionId) {
+        this.masterInfusionId = masterInfusionId;
+        this.master= ObjectUtil.equal(masterInfusionId,infusionId);
+    }
+
+    public void setInfusionId(String infusionId) {
+        this.infusionId = infusionId;
+        this.master= ObjectUtil.equal(masterInfusionId,infusionId);
+    }
 }

+ 9 - 7
coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManager.java

@@ -7,6 +7,7 @@ import com.coffee.bus.bean.Script;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusHospitalConfigEntity;
 import com.coffee.bus.entity.BusHospitalEntity;
+import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.hospital.config.HospitalAutoUndoConfigHandler;
 import com.coffee.bus.hospital.config.HospitalFinishMonitorConfigHandler;
 import com.coffee.bus.hospital.config.HospitalFunctionAnalConfigHandler;
@@ -61,21 +62,22 @@ public class HospitalManager {
 
     private LocalBusDeviceAlarmService alarmService;
 
+    private LocalBusPatientService patientService;
+
     private LocalBusHospitalLogService hospitalLogService;
     public HospitalManager(String hospitalId,
                            LocalBusHospitalService hospitalService,
                            LocalBusHospitalConfigService hospitalConfigService,
                            LocalBusClinicService clinicService,
-                           LocalBusDeviceRunningService deviceRunningService,
                            LocalBusInfusionHistoryService infusionHistoryService,
-                           PatientRegistry patientRegistry,
                            DeviceRegistry deviceRegistry,
                            WsPublishUtils wsPublishUtils,
                            ScriptManager scriptManager,
                            ConfigStorageManager configStorageManager,
                            RedissonUtil redissonUtil,
                            LocalBusDeviceAlarmService alarmService,
-                           LocalBusHospitalLogService hospitalLogService) {
+                           LocalBusHospitalLogService hospitalLogService,
+                           LocalBusPatientService patientService) {
         this.hospitalId = hospitalId;
         this.hospitalService = hospitalService;
         this.hospitalConfigService = hospitalConfigService;
@@ -85,10 +87,10 @@ public class HospitalManager {
         this.storage=configStorageManager.getStorage(hospitalId);
         this.alarmService=alarmService;
         this.hospitalLogService=hospitalLogService;
-        this.autoUndoConfigHandler=new HospitalAutoUndoConfigHandler(storage,hospitalId,redissonUtil,deviceRunningService,infusionHistoryService,deviceRegistry,wsPublishUtils,patientRegistry);
-        this.finishMonitorConfigHandler=new HospitalFinishMonitorConfigHandler(storage,hospitalId,redissonUtil,deviceRunningService,infusionHistoryService,deviceRegistry,wsPublishUtils,patientRegistry);
-        this.analConfigHandler=new HospitalFunctionAnalConfigHandler(storage,hospitalId,redissonUtil,deviceRunningService,infusionHistoryService,deviceRegistry,wsPublishUtils,patientRegistry,alarmService);
-        this.extraConfigHandler=new HospitalFunctionExtraConfigHandler(storage,hospitalId,redissonUtil,deviceRunningService,infusionHistoryService,deviceRegistry,wsPublishUtils,patientRegistry,finishMonitorConfigHandler,autoUndoConfigHandler,alarmService);
+        this.autoUndoConfigHandler=new HospitalAutoUndoConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils);
+        this.finishMonitorConfigHandler=new HospitalFinishMonitorConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils);
+        this.analConfigHandler=new HospitalFunctionAnalConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils,alarmService);
+        this.extraConfigHandler=new HospitalFunctionExtraConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils,finishMonitorConfigHandler,autoUndoConfigHandler,alarmService,patientService);
         init(configStorageManager);
     }
 

+ 5 - 7
coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManagerRegister.java

@@ -26,9 +26,7 @@ public class HospitalManagerRegister {
     private LocalBusHospitalService hospitalService;
     private LocalBusHospitalConfigService hospitalConfigService;
     private LocalBusClinicService clinicService;
-    private LocalBusDeviceRunningService deviceRunningService;
     private LocalBusInfusionHistoryService infusionHistoryService;
-    private PatientRegistry patientRegistry;
     private DeviceRegistry deviceRegistry;
     private WsPublishUtils wsPublishUtils;
     private ScriptManager scriptManager;
@@ -36,13 +34,12 @@ public class HospitalManagerRegister {
     private RedissonUtil redissonUtil;
     private LocalBusDeviceAlarmService alarmService;
     private LocalBusHospitalLogService hospitalLogService;
-    public HospitalManagerRegister( LocalBusHospitalService hospitalService, LocalBusHospitalConfigService hospitalConfigService, LocalBusClinicService clinicService, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, PatientRegistry patientRegistry, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, ScriptManager scriptManager, ConfigStorageManager configStorageManager,LocalBusDeviceAlarmService alarmService,LocalBusHospitalLogService hospitalLogService, RedissonUtil redissonUtil) {
+    private LocalBusPatientService patientService;
+    public HospitalManagerRegister( LocalBusHospitalService hospitalService, LocalBusHospitalConfigService hospitalConfigService, LocalBusClinicService clinicService, LocalBusInfusionHistoryService infusionHistoryService,  DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, ScriptManager scriptManager, ConfigStorageManager configStorageManager,LocalBusDeviceAlarmService alarmService,LocalBusHospitalLogService hospitalLogService, RedissonUtil redissonUtil,LocalBusPatientService patientService) {
         this.hospitalService = hospitalService;
         this.hospitalConfigService = hospitalConfigService;
         this.clinicService = clinicService;
-        this.deviceRunningService = deviceRunningService;
         this.infusionHistoryService = infusionHistoryService;
-        this.patientRegistry = patientRegistry;
         this.deviceRegistry = deviceRegistry;
         this.wsPublishUtils = wsPublishUtils;
         this.scriptManager = scriptManager;
@@ -50,17 +47,18 @@ public class HospitalManagerRegister {
         this.redissonUtil = redissonUtil;
         this.alarmService=alarmService;
         this.hospitalLogService=hospitalLogService;
+        this.patientService=patientService;
     }
 
     public void register(String hospitalId){
         managerMap.computeIfAbsent(hospitalId,k->
-                new HospitalManager(k,hospitalService,hospitalConfigService,clinicService,deviceRunningService,infusionHistoryService,patientRegistry,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil,alarmService,hospitalLogService)
+                new HospitalManager(k,hospitalService,hospitalConfigService,clinicService,infusionHistoryService,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil,alarmService,hospitalLogService,patientService)
         );
     };
 
     public HospitalManager get(String hospitalId){
         return  managerMap.computeIfAbsent(hospitalId,k->
-                new HospitalManager(k,hospitalService,hospitalConfigService,clinicService,deviceRunningService,infusionHistoryService,patientRegistry,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil,alarmService,hospitalLogService)
+                new HospitalManager(k,hospitalService,hospitalConfigService,clinicService,infusionHistoryService,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil,alarmService,hospitalLogService,patientService)
         );
     }
 

+ 1 - 8
coffee-system/src/main/java/com/coffee/bus/hospital/config/AbstractHospitalConfigHandler.java

@@ -2,7 +2,6 @@ package com.coffee.bus.hospital.config;
 
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.cache.ConfigStorage;
@@ -20,29 +19,23 @@ import lombok.Getter;
 public abstract class AbstractHospitalConfigHandler<E,T> implements HospitalConfigHandler<E,T> {
     protected final RedissonUtil redissonUtil;
 
-    protected final  LocalBusDeviceRunningService deviceRunningService;
-
     protected  final LocalBusInfusionHistoryService infusionHistoryService;
 
     protected final  DeviceRegistry deviceRegistry;
 
     protected final  WsPublishUtils wsPublishUtils;
 
-    protected final  PatientRegistry patientRegistry;
-
     protected final ConfigStorage configStorage;
     @Getter
     protected String hospitalId;
 
-    public AbstractHospitalConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, PatientRegistry patientRegistry) {
+    public AbstractHospitalConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils) {
         this.hospitalId=hospitalId;
         this.configStorage=configStorage;
         this.redissonUtil = redissonUtil;
-        this.deviceRunningService = deviceRunningService;
         this.infusionHistoryService = infusionHistoryService;
         this.deviceRegistry = deviceRegistry;
         this.wsPublishUtils = wsPublishUtils;
-        this.patientRegistry = patientRegistry;
     }
 
 

+ 54 - 37
coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalAutoUndoConfigHandler.java

@@ -1,14 +1,12 @@
 package com.coffee.bus.hospital.config;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.hospital.config.bean.FunctionAutoUndoConfig;
 import com.coffee.bus.hospital.config.bean.FunctionFinishMonitorConfig;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.hospital.enums.ConfigHandlerEnums;
 import com.coffee.bus.registry.device.DeviceRegistry;
-import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.service.dto.ManualUndoConfig;
 import com.coffee.bus.service.dto.UndoDeviceConfig;
@@ -35,8 +33,10 @@ import java.util.concurrent.TimeUnit;
 public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandler<FunctionAutoUndoConfig, BusDeviceRunningEntity>{
 
 
-    public HospitalAutoUndoConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, PatientRegistry patientRegistry) {
-        super(configStorage, hospitalId, redissonUtil, deviceRunningService, infusionHistoryService, deviceRegistry, wsPublishUtils, patientRegistry);
+    private UndoEntity lastAutoUndo;
+    private UndoEntity lastNoSignalUndo;
+    public HospitalAutoUndoConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils) {
+        super(configStorage, hospitalId, redissonUtil, infusionHistoryService, deviceRegistry, wsPublishUtils);
     }
 
     @Override
@@ -55,11 +55,21 @@ public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandle
         if(config==null||!Boolean.TRUE.equals(config.isEnable())|| Objects.isNull(config.getShutDownInterval())){
             return;
         }
-        judgeShutdown(source,config);
+        judgeShutdownAutoUndo(source,config);
+
+
+        if(null!=lastNoSignalUndo){
+            RDelayedQueue noSignalUndoDelay = redissonUtil.getDelayedQueue(getId() +"-noSignalUndo", e -> {
+                if(e instanceof UndoEntity){
+                    this.handleAutoUndo((UndoEntity) e);
+                }
+            });
+            noSignalUndoDelay.remove(lastNoSignalUndo);
+        }
     }
 
     /**
-     * 描述: 不在服务区处理
+     * 描述: 不在服务区到撤泵处理
      * @author lifang
      * @date 2022/5/23 23:24
      * @param device
@@ -67,85 +77,90 @@ public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandle
      * @param tenantId
      * @return void
      */
-    public void judgeNoSignal(String device,String patientCode,String tenantId){
+    public void judgeNoSignalAutoUndo(String device, String patientCode, String tenantId, String infusionId){
         FunctionFinishMonitorConfig config = this.getConfig().as(FunctionFinishMonitorConfig.class);
         if(config==null||!Boolean.TRUE.equals(config.isEnable())|| Objects.isNull(config.getNoSignalInterval())){
             return;
         }
         RDelayedQueue noSignalUndoDelay = redissonUtil.getDelayedQueue(getId() +"-noSignalUndo", e -> {
             if(e instanceof UndoEntity){
-                this.handleShutdown((UndoEntity) e);
+                this.handleAutoUndo((UndoEntity) e);
             }
         });
         UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
         undoDeviceConfig.setUndoBy(config.getUndoBy());
-        HospitalFinishMonitorConfigHandler.FinishMonitorEntity finishMonitor = HospitalFinishMonitorConfigHandler.FinishMonitorEntity.builder()
+        lastNoSignalUndo =UndoEntity.builder()
                 .deviceId(device)
                 .patientCode(patientCode)
                 .config(undoDeviceConfig)
                 .timeout(config.getNoSignalInterval())
                 .unit(TimeUnit.SECONDS)
                 .tenantId(tenantId)
+                .infusionId(infusionId)
                 .timestamp(new Date())
                 .build();
-        noSignalUndoDelay.offer(finishMonitor,finishMonitor.getTimeout(),finishMonitor.getUnit());
+        noSignalUndoDelay.offer(lastNoSignalUndo,lastNoSignalUndo.getTimeout(),lastNoSignalUndo.getUnit());
     }
 
     /**
-     * 描述: 处理关机到撤泵时间
+     * 描述: 处理关机到撤泵时间(副泵)
      * @author lifang
      * @date 2022/5/19 16:51
      * @param source
      * @param config
      * @return void
      */
-    private void judgeShutdown(BusDeviceRunningEntity source,   FunctionAutoUndoConfig config ){
-        RDelayedQueue shutdownUndoDelay = redissonUtil.getDelayedQueue(getId() +"-shutdownUndo", e -> {
+    private void judgeShutdownAutoUndo(BusDeviceRunningEntity source, FunctionAutoUndoConfig config ){
+        //自动撤泵(副泵)
+        RDelayedQueue autoUndoDevice = redissonUtil.getDelayedQueue(getId() +"-autoUndoDevice", e -> {
             if(e instanceof UndoEntity){
-                this.handleShutdown((UndoEntity) e);
+                this.handleAutoUndo((UndoEntity) e);
             }
         });
-        //清空延迟队列消息
-        shutdownUndoDelay.clear();
         UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
         undoDeviceConfig.setUndoBy(config.getUndoBy());
-        //清空延迟队列消息
-        shutdownUndoDelay.clear();
-        if(DeviceStatusEnum.Shutdown.equals(source.getType())){
-            UndoEntity finishMonitor = UndoEntity.builder()
+        if(DeviceStatusEnum.Shutdown.equals(source.getRunState())){
+            lastAutoUndo = UndoEntity.builder()
                     .deviceId(source.getDeviceId())
                     .patientCode(source.getPatientCode())
                     .config(undoDeviceConfig)
+                    .clinicId(source.getClinicId())
+                    .infusionId(source.getInfusionId())
                     .timeout(config.getShutDownInterval())
                     .unit(TimeUnit.SECONDS)
                     .tenantId(source.getTenantId())
                     .timestamp(new Date())
                     .build();
-            shutdownUndoDelay.offer(finishMonitor,config.getShutDownInterval(),finishMonitor.getUnit());
+            autoUndoDevice.offer(lastAutoUndo,config.getShutDownInterval(),lastAutoUndo.getUnit());
+        }else{
+            if(lastAutoUndo!=null){
+                autoUndoDevice.remove(lastAutoUndo);
+            }
         }
 
 
     }
 
-    private void handleShutdown(UndoEntity source){
-        String deviceId = source.getDeviceId();
-        String patientCode = source.getPatientCode();
-        String tenantId = source.getTenantId();
-        //只有副泵会自动撤泵
-        BusDeviceRunningEntity entity = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda()
-                .eq(BusDeviceRunningEntity::getDeviceId, deviceId)
-                .eq(BusDeviceRunningEntity::getPatientCode, patientCode)
-                .eq(BusDeviceRunningEntity::getMaster, false)
-                .eq(BusDeviceRunningEntity::getTenantId, tenantId));
-        if(entity!=null){
+    /**
+     * 描述: 关机/不在服务区自动撤泵处理(副泵)
+     * @author lifang
+     * @date 2022/5/30 17:44
+     * @param source
+     * @return void
+     */
+    private void handleAutoUndo(UndoEntity source){
+        String infusionId = source.getInfusionId();
+        BusInfusionHistoryEntity lastInfusion = infusionHistoryService.lastInfusion(source.getDeviceId());
+        if (lastInfusion.getId().equals(infusionId)) {
+            //只有副泵会自动撤泵
             ManualUndoConfig manualUndoConfig = new ManualUndoConfig();
-            manualUndoConfig.setDeviceIds(Collections.singletonList(deviceId));
-            manualUndoConfig.setPatientCode(patientCode);
-            manualUndoConfig.setClinicId(entity.getClinicId());
+            manualUndoConfig.setInfusionIds(Collections.singletonList(source.getInfusionId()));
+            manualUndoConfig.setPatientCode(source.getPatientCode());
+            manualUndoConfig.setClinicId(source.getClinicId());
             manualUndoConfig.setMonitorType(true);
             manualUndoConfig.setUndo(source.getConfig());
             manualUndoConfig.setTenantId(source.getTenantId());
-            deviceRunningService.undo(manualUndoConfig,false);
+            infusionHistoryService.undo(manualUndoConfig,false);
         }
     }
 
@@ -155,6 +170,8 @@ public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandle
     static class UndoEntity extends AbstractMsgId {
         private String deviceId;
         private String patientCode;
+        private String clinicId;
+        private String infusionId;
         private UndoDeviceConfig config;
         private Integer timeout;
         private TimeUnit unit;

+ 38 - 49
coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFinishMonitorConfigHandler.java

@@ -1,16 +1,11 @@
 package com.coffee.bus.hospital.config;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
 import com.coffee.bus.hospital.config.bean.FunctionFinishMonitorConfig;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.hospital.enums.ConfigHandlerEnums;
 import com.coffee.bus.registry.device.DeviceRegistry;
-import com.coffee.bus.registry.patient.PatientOperator;
-import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.service.dto.ManualUndoConfig;
 import com.coffee.bus.service.dto.UndoDeviceConfig;
@@ -22,12 +17,10 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RDelayedQueue;
-
+import java.util.Collections;
 import java.util.Date;
-import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -40,8 +33,10 @@ import java.util.stream.Collectors;
 public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHandler<FunctionFinishMonitorConfig, BusDeviceRunningEntity>{
 
 
-    public HospitalFinishMonitorConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, PatientRegistry patientRegistry) {
-        super(configStorage, hospitalId, redissonUtil, deviceRunningService, infusionHistoryService, deviceRegistry, wsPublishUtils, patientRegistry);
+    private FinishMonitorEntity lastShutDownFinish;
+    private FinishMonitorEntity lastNosignalFinish;
+    public HospitalFinishMonitorConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil,LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils) {
+        super(configStorage, hospitalId, redissonUtil, infusionHistoryService, deviceRegistry, wsPublishUtils);
     }
 
     @Override
@@ -61,11 +56,19 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
             log.warn("id:{},配置名称:{},不存在",hospitalId,getId());
             return;
         }
-        judgeShutdown(source,config);
+        judgeShutdownAutoFinish(source,config);
 
+        if(lastNosignalFinish!=null){
+            RDelayedQueue<AbstractMsgId> noSignalFinishDelay = redissonUtil.getDelayedQueue(getId() +"-noSignalFinish", e -> {
+                if(e instanceof FinishMonitorEntity){
+                    this.handleFinishMonitor((FinishMonitorEntity) e);
+                }
+            });
+            noSignalFinishDelay.remove(lastNosignalFinish);
+        }
     }
 
-    public void judgeNoSignal(String device,String patientCode,String tenantId){
+    public void judgeNoSignalAutoFinish(String device, String patientCode, String tenantId, String infusionId){
         FunctionFinishMonitorConfig config = this.getConfig().as(FunctionFinishMonitorConfig.class);
         if(config==null||!Boolean.TRUE.equals(config.isEnable())|| Objects.isNull(config.getNoSignalInterval())){
             return;
@@ -77,17 +80,18 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
         });
         UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
         undoDeviceConfig.setUndoBy(config.getUndoBy());
-        FinishMonitorEntity finishMonitor = FinishMonitorEntity.builder()
+        lastNosignalFinish = FinishMonitorEntity.builder()
                 .deviceId(device)
                 .patientCode(patientCode)
                 .config(undoDeviceConfig)
+                .infusionId(infusionId)
                 .timeout(config.getNoSignalInterval())
                 .unit(TimeUnit.DAYS)
                 .tenantId(tenantId)
                 .timestamp(new Date())
                 .build();
 
-        redissonUtil.offerQueue(noSignalFinishDelay,finishMonitor,finishMonitor.getTimeout(),finishMonitor.getUnit());
+        redissonUtil.offerQueue(noSignalFinishDelay,lastNosignalFinish,lastNosignalFinish.getTimeout(),lastNosignalFinish.getUnit());
     }
 
     /**
@@ -98,7 +102,7 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
      * @param config
      * @return void
      */
-    private void judgeShutdown(BusDeviceRunningEntity source,FunctionFinishMonitorConfig config){
+    private void judgeShutdownAutoFinish(BusDeviceRunningEntity source, FunctionFinishMonitorConfig config){
         RDelayedQueue<AbstractMsgId> shutdownFinishDelay = redissonUtil.getDelayedQueue(getId() +"-ShutdownFinish", e -> {
             if(e instanceof FinishMonitorEntity){
                 this.handleFinishMonitor((FinishMonitorEntity) e);
@@ -106,10 +110,12 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
         });
         UndoDeviceConfig undoDeviceConfig = new UndoDeviceConfig();
         undoDeviceConfig.setUndoBy(config.getUndoBy());
-        //清空延迟队列消息
-        redissonUtil.clearQueue(shutdownFinishDelay);
-        if(DeviceStatusEnum.Shutdown.equals(source.getType())){
-            FinishMonitorEntity finishMonitor = FinishMonitorEntity.builder()
+        //删除延迟队列消息
+        if(lastShutDownFinish!=null){
+            shutdownFinishDelay.remove(lastShutDownFinish);
+        }
+        if(DeviceStatusEnum.Shutdown.equals(source.getRunState())){
+            lastShutDownFinish = FinishMonitorEntity.builder()
                     .deviceId(source.getDeviceId())
                     .patientCode(source.getPatientCode())
                     .config(undoDeviceConfig)
@@ -118,16 +124,8 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
                     .tenantId(source.getTenantId())
                     .timestamp(new Date())
                     .build();
-            redissonUtil.offerQueue(shutdownFinishDelay,finishMonitor,config.getShutDownInterval(),finishMonitor.getUnit());
+            redissonUtil.offerQueue(shutdownFinishDelay,lastShutDownFinish,config.getShutDownInterval(),lastShutDownFinish.getUnit());
         }
-
-        //不在服务区延迟队列清空
-        RDelayedQueue<AbstractMsgId> noSignalFinishDelay = redissonUtil.getDelayedQueue(getId() +"-noSignalFinish", e -> {
-            if(e instanceof FinishMonitorEntity){
-                this.handleFinishMonitor((FinishMonitorEntity) e);
-            }
-        });
-        redissonUtil.clearQueue(noSignalFinishDelay);
     }
 
     /**
@@ -138,28 +136,17 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
      * @return void
      */
     private void handleFinishMonitor(FinishMonitorEntity source){
-        String deviceId = source.getDeviceId();
         String patientCode = source.getPatientCode();
-        String tenantId = source.getTenantId();
         UndoDeviceConfig config = source.getConfig();
-        BusDeviceRunningEntity entity = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId)
-                .eq(BusDeviceRunningEntity::getPatientCode, patientCode)
-                .eq(BusDeviceRunningEntity::getMaster,true)
-                .eq(BusDeviceRunningEntity::getTenantId, tenantId));
-        if(entity!=null){
-            ManualUndoConfig manualUndoConfig = new ManualUndoConfig();
-            config.setUndoTime(new Date());
-            manualUndoConfig.setTenantId(source.getTenantId());
-            manualUndoConfig.setUndo(config);
-            manualUndoConfig.setMonitorType(true);
-            manualUndoConfig.setClinicId(entity.getClinicId());
-            manualUndoConfig.setPatientCode(patientCode);
-            List<BusDeviceRunningEntity> devices = deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId)
-                    .eq(BusDeviceRunningEntity::getPatientCode, patientCode)
-                    .eq(BusDeviceRunningEntity::getTenantId, tenantId));
-            manualUndoConfig.setDeviceIds(devices.stream().map(BusDeviceRunningEntity::getDeviceId).collect(Collectors.toList()));
-            deviceRunningService.undo(manualUndoConfig,true);
-        }
+        ManualUndoConfig manualUndoConfig = new ManualUndoConfig();
+        config.setUndoTime(new Date());
+        manualUndoConfig.setTenantId(source.getTenantId());
+        manualUndoConfig.setUndo(config);
+        manualUndoConfig.setMonitorType(true);
+        manualUndoConfig.setClinicId(source.getClinicId());
+        manualUndoConfig.setPatientCode(patientCode);
+        manualUndoConfig.setInfusionIds(Collections.singletonList(source.getInfusionId()));
+        infusionHistoryService.undo(manualUndoConfig,true);
     }
 
     @Data
@@ -168,6 +155,8 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
         private String deviceId;
         private String patientCode;
         private UndoDeviceConfig config;
+        private String clinicId;
+        private String infusionId;
         private Integer timeout;
         private TimeUnit unit;
         private String tenantId;

+ 50 - 43
coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionAnalConfigHandler.java

@@ -1,7 +1,6 @@
 package com.coffee.bus.hospital.config;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.coffee.bus.entity.BusDeviceAlarmEntity;
 import com.coffee.bus.hospital.config.bean.FunctionAnalConfig;
@@ -9,9 +8,7 @@ import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.hospital.enums.ConfigHandlerEnums;
 import com.coffee.bus.registry.device.DeviceRegistry;
-import com.coffee.bus.registry.patient.PatientRegistry;
 import com.coffee.bus.service.LocalBusDeviceAlarmService;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.cache.ConfigStorage;
@@ -37,9 +34,14 @@ import java.util.concurrent.TimeUnit;
 public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHandler<FunctionAnalConfig,BusDeviceRunningEntity> {
 
     private LocalBusDeviceAlarmService alarmService;
+    //最后一次镇痛不足报警任务对象
+    private AnalEntity lastAnalWarn;
 
-    public HospitalFunctionAnalConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, PatientRegistry patientRegistry,LocalBusDeviceAlarmService alarmService) {
-        super(configStorage, hospitalId, redissonUtil, deviceRunningService, infusionHistoryService, deviceRegistry, wsPublishUtils, patientRegistry);
+    //最后一次取消镇痛不足报警任务对象
+    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;
     }
 
@@ -62,7 +64,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
             log.warn("id:{},配置名称:{},不存在",hospitalId,getId());
             return;
         }
-        handlerAnal(source,config);
+        judgeAnalPoor(source,config);
     }
 
     /**
@@ -74,17 +76,19 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
      * @param analConfig
      * @return void
      */
-    private void handlerAnal(BusDeviceRunningEntity source,FunctionAnalConfig analConfig){
+    private void judgeAnalPoor(BusDeviceRunningEntity source, FunctionAnalConfig analConfig){
         RDelayedQueue<AbstractMsgId>  delayedQueue = redissonUtil.getDelayedQueue(getId().name(), e -> {
             if(e instanceof AnalEntity){
-                this.judgeAnalPoor((AnalEntity) e);
+                this.handleAnalPoorAndJudgeFinish((AnalEntity) e);
             }
         });
-        //如果有新的输注产生,则清空延迟队列
+        //如果有新的输注产生,则删除该设备镇痛不足任务
         if(source.isNewInfusion()){
             //镇痛不足设置为false
             source.setWarnAnalgesicPoor(false);
-            redissonUtil.clearQueue(delayedQueue);
+            if(lastAnalWarn!=null){
+                delayedQueue.remove(lastAnalWarn);
+            }
         }
         Integer insufficientTime = analConfig.getInsufficientTime();
         Integer insufficientCount = analConfig.getInsufficientCount();
@@ -94,7 +98,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
             return;
         }
 
-        AnalEntity anal = AnalEntity.builder()
+        lastAnalWarn = AnalEntity.builder()
                 .deviceId(source.getDeviceId())
                 .pcaValidCount(source.getPcaValidCount())
                 .pcaInvalidCount(source.getPcaInvalidCount())
@@ -107,61 +111,61 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
                 .timestamp(new Date())
                 .infusionId(source.getInfusionId())
                 .build();
-        redissonUtil.offerQueue(delayedQueue,anal,anal.getTimeout(),anal.getUnit());
+        redissonUtil.offerQueue(delayedQueue,lastAnalWarn,lastAnalWarn.getTimeout(),lastAnalWarn.getUnit());
     }
 
 
     /**
-     * 描述: 判断延迟任务是否触发镇痛不足
+     * 描述: 处理镇痛不足情况以及判断镇痛不足消失
      * @author lifang
      * @date 2022/5/19 9:14
      * @param
      * @return void
      */
-    private void judgeAnalPoor(AnalEntity anal){
+    private void handleAnalPoorAndJudgeFinish(AnalEntity anal){
         //镇痛消失延迟队列
         RDelayedQueue<AbstractMsgId> noneAnalDelayedQueue = redissonUtil.getDelayedQueue("none-" + getId(), e -> {
             if(e instanceof NoneAnalEntity){
-                handleNoneAnal((NoneAnalEntity) e);
+                handleAnalFinish((NoneAnalEntity) e);
             }
         });
         String deviceId = anal.getDeviceId();
-        BusDeviceRunningEntity runningInfo = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId).eq(BusDeviceRunningEntity::getTenantId, anal.getTenantId()));
-        if(runningInfo==null){
+        BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(anal.getInfusionId());
+        if(Boolean.TRUE.equals(infusionHistory.getFinished())){
             //泵已换绑医院,无需再处理
             return;
         }
         //PCA差值
         int subCount=0;
         if(anal.isJudgeByValid()){
-            subCount=Math.subtractExact(runningInfo.getPcaValidCount(), Optional.ofNullable(anal.getPcaValidCount()).orElse(0));
+            subCount=Math.subtractExact(infusionHistory.getPcaValidCount(), Optional.ofNullable(anal.getPcaValidCount()).orElse(0));
         }else {
-            subCount=Math.subtractExact(runningInfo.getPcaInvalidCount(), Optional.ofNullable(anal.getPcaInvalidCount()).orElse(0));
+            subCount=Math.subtractExact(infusionHistory.getPcaInvalidCount(), Optional.ofNullable(anal.getPcaInvalidCount()).orElse(0));
         }
         if(subCount>anal.getThreshold()){
             log.info("设备:{}镇痛不足",deviceId);
             //触发阈值,设置为镇痛不足
-            if(!Boolean.TRUE.equals(runningInfo.getWarnAnalgesicPoor())){
-                deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getId,runningInfo.getId())
-                        .set(BusDeviceRunningEntity::getWarnAnalgesicPoor,true));
-                infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId,runningInfo.getInfusionId())
+            if(!Boolean.TRUE.equals(infusionHistory.getWarnAnalgesicPoor())){
+                infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId,infusionHistory.getId())
                         .set(BusInfusionHistoryEntity::getWarnAnalgesicPoor,true));
                 //报警/提醒缓存重置
                 deviceRegistry.getOperator(deviceId).setAlarmOrWarn(null);
-                if(Boolean.TRUE.equals(runningInfo.getMaster())){
-                    //发布推送
-                    wsPublishUtils.publishPatientMonitor(runningInfo.getPatientCode(),runningInfo.getTenantId());
-                }
+
+                //发布推送
+                wsPublishUtils.publishPatientMonitor(infusionHistory.getPatientCode(),infusionHistory.getTenantId());
+
                 //记录镇痛不足报警
                 Date uploadTime=new Date(anal.getTimestamp().getTime()+anal.getUnit().toMillis(anal.getTimeout()));
                 BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.insufficient(anal.getDeviceId(),anal.getInfusionId(),anal.getHistoryId(),anal.getTenantId(),uploadTime);
                 alarmService.save(alarm);
             }
-            redissonUtil.clearQueue(noneAnalDelayedQueue);
+            if(lastNoneAnal!=null){
+                noneAnalDelayedQueue.remove(lastNoneAnal);
+            }
         }else {
             //没有触发阈值,发入镇痛消失处理
             FunctionAnalConfig config = this.getConfig().as(FunctionAnalConfig.class);
-            NoneAnalEntity noneAnal = NoneAnalEntity.builder()
+            lastNoneAnal = NoneAnalEntity.builder()
                     .deviceId(anal.getDeviceId())
                     .tenantId(anal.getTenantId())
                     .timeout(config.getDisappearTime())
@@ -170,34 +174,37 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
                     .historyId(anal.getHistoryId())
                     .timestamp(new Date())
                     .build();
-            redissonUtil.offerQueue(noneAnalDelayedQueue,noneAnal,noneAnal.getTimeout(),noneAnal.getUnit());
+            redissonUtil.offerQueue(noneAnalDelayedQueue,lastNoneAnal,lastNoneAnal.getTimeout(),lastNoneAnal.getUnit());
         }
     }
 
 
-    private void handleNoneAnal(NoneAnalEntity noneAnal){
+    /**
+     * 描述: 镇痛消失处理
+     * @author lifang
+     * @date 2022/5/30 21:09
+     * @param noneAnal
+     * @return void
+     */
+    private void handleAnalFinish(NoneAnalEntity noneAnal){
         String deviceId = noneAnal.getDeviceId();
-        BusDeviceRunningEntity runningInfo = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId).eq(BusDeviceRunningEntity::getTenantId, noneAnal.getTenantId()));
-        if(runningInfo==null){
+        BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(noneAnal.getInfusionId());
+        if(Boolean.TRUE.equals(infusionHistory.getFinished())){
             //泵已换绑医院,无需再处理
             return;
         }
-        //将设备由镇痛不足取消成功
-        if (deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getId, runningInfo.getId())
-                .eq(BusDeviceRunningEntity::getWarnAnalgesicPoor, true)
-                .set(BusDeviceRunningEntity::getWarnAnalgesicPoor, false))) {
+        //镇痛不足取消
+        if(Boolean.TRUE.equals(infusionHistory.getWarnAnalgesicPoor())){
             log.info("设备:{}取消镇痛不足",deviceId);
-            infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId,runningInfo.getInfusionId())
+            infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
+                    .eq(BusInfusionHistoryEntity::getId,infusionHistory.getId())
                     .set(BusInfusionHistoryEntity::getWarnAnalgesicPoor,false));
             deviceRegistry.getOperator(deviceId).setAlarmOrWarn(null);
-            if(Boolean.TRUE.equals(runningInfo.getMaster())){
-                //发布推送
-                wsPublishUtils.publishPatientMonitor(runningInfo.getPatientCode(),runningInfo.getTenantId());
-            }
+            //发布推送
+            wsPublishUtils.publishPatientMonitor(infusionHistory.getPatientCode(),infusionHistory.getTenantId());
         }
 
 
-
     }
     @Data
     @Builder

+ 41 - 39
coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java

@@ -10,10 +10,9 @@ import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.enums.DeviceTypeEnum;
 import com.coffee.bus.hospital.enums.ConfigHandlerEnums;
 import com.coffee.bus.registry.device.DeviceRegistry;
-import com.coffee.bus.registry.patient.PatientRegistry;
 import com.coffee.bus.service.LocalBusDeviceAlarmService;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
+import com.coffee.bus.service.LocalBusPatientService;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.cache.ConfigStorage;
 import com.coffee.common.entity.AbstractMsgId;
@@ -42,12 +41,23 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
     private HospitalFinishMonitorConfigHandler monitorConfigHandler;
     private HospitalAutoUndoConfigHandler autoUndoConfigHandler;
     private LocalBusDeviceAlarmService alarmService;
-    public HospitalFunctionExtraConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, PatientRegistry patientRegistry
-    , HospitalFinishMonitorConfigHandler monitorConfigHandler,HospitalAutoUndoConfigHandler autoUndoConfigHandler,LocalBusDeviceAlarmService alarmService) {
-        super(configStorage, hospitalId, redissonUtil, deviceRunningService, infusionHistoryService, deviceRegistry, wsPublishUtils, patientRegistry);
+    private LocalBusPatientService patientService;
+    //最后一次不在服务区警报延迟任务
+    private NoSignalEntity lastNoSignalWarn;
+    //最后一次低输注警报延迟任务
+    private LowInfusionEntity lastLowInfusionWarn;
+
+    public HospitalFunctionExtraConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusInfusionHistoryService infusionHistoryService,
+                                              DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils,
+                                              HospitalFinishMonitorConfigHandler monitorConfigHandler,
+                                              HospitalAutoUndoConfigHandler autoUndoConfigHandler,
+                                              LocalBusDeviceAlarmService alarmService,
+                                              LocalBusPatientService patientService) {
+        super(configStorage, hospitalId, redissonUtil, infusionHistoryService, deviceRegistry, wsPublishUtils);
         this.monitorConfigHandler=monitorConfigHandler;
         this.autoUndoConfigHandler=autoUndoConfigHandler;
         this.alarmService=alarmService;
+        this.patientService=patientService;
     }
 
     @Override
@@ -87,14 +97,16 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         if(DeviceStatusEnum.Shutdown.equals(source.getRunState())){
             return;
         }
-        RDelayedQueue<AbstractMsgId> delayedQueue = redissonUtil.getDelayedQueue(getId() +"-signal", e -> {
+        RDelayedQueue<AbstractMsgId> delayedQueue = redissonUtil.getDelayedQueue(getId() +"-nosignal", e -> {
             if(e instanceof  NoSignalEntity){
                 this.handleNoSignal((NoSignalEntity) e);
             }
         });
         //清空延迟队列消息
-        redissonUtil.clearQueue(delayedQueue);
-        NoSignalEntity noSignal = NoSignalEntity.builder()
+        if(lastNoSignalWarn!=null){
+            delayedQueue.remove(lastNoSignalWarn);
+        }
+        lastNoSignalWarn = NoSignalEntity.builder()
                 .deviceId(source.getDeviceId())
                 .patientCode(source.getPatientCode())
                 .tenantId(source.getTenantId())
@@ -105,7 +117,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
                 .unit(TimeUnit.MINUTES)
                 .build();
         //将该次消息视为最后一次消息放入队列中
-        redissonUtil.offerQueue(delayedQueue,noSignal,noSignal.getTimeout(),noSignal.getUnit());
+        redissonUtil.offerQueue(delayedQueue,lastNoSignalWarn,lastNoSignalWarn.getTimeout(),lastNoSignalWarn.getUnit());
     }
 
     /**
@@ -117,10 +129,9 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
      */
     private void handleNoSignal(NoSignalEntity source){
         String deviceId = source.getDeviceId();
-        String tenantId = source.getTenantId();
-        BusDeviceRunningEntity runningInfo = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId).eq(BusDeviceRunningEntity::getTenantId, tenantId));
-        if (runningInfo == null) {
-            //泵已换绑医院,无需再处理
+        BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(source.getInfusionId());
+        if (Boolean.TRUE.equals(infusionHistory.getFinished())) {
+            //输注已结束
             return;
         }
         //不在服务区报警信息保存
@@ -128,20 +139,17 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.noSignalOf(source.getDeviceId(),source.getInfusionId(),source.getHistoryId(),source.getTenantId(),uploadTime);
         alarmService.save(alarm);
 
-        deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getId, runningInfo.getId())
-                .set(BusDeviceRunningEntity::getRunState, DeviceStatusEnum.NoSignal));
-        infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId, runningInfo.getInfusionId())
+        infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId, infusionHistory.getId())
                 .set(BusInfusionHistoryEntity::getRunState, DeviceStatusEnum.NoSignal));
         //报警/提醒缓存重置
         deviceRegistry.getOperator(deviceId)
                 .setStatus(DeviceStatusEnum.NoSignal);
-        if (Boolean.TRUE.equals(runningInfo.getMaster())) {
-            //发布推送
-            wsPublishUtils.publishPatientMonitor(runningInfo.getPatientCode(), runningInfo.getTenantId());
-        }
+
+        wsPublishUtils.publishPatientMonitor(infusionHistory.getPatientCode(), infusionHistory.getTenantId());
+
         //不在服务区
-        monitorConfigHandler.judgeNoSignal(deviceId,source.getPatientCode(),source.getTenantId());
-        autoUndoConfigHandler.judgeNoSignal(deviceId,source.getPatientCode(),source.getTenantId());
+        monitorConfigHandler.judgeNoSignalAutoFinish(deviceId,source.getPatientCode(),source.getTenantId(),source.getInfusionId());
+        autoUndoConfigHandler.judgeNoSignalAutoUndo(deviceId,source.getPatientCode(),source.getTenantId(),source.getInfusionId());
     }
 
 
@@ -154,7 +162,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
      * @return void
      */
     private void judgeLowInfusion(BusDeviceRunningEntity source,int interval){
-        RDelayedQueue<AbstractMsgId> delayedQueue = redissonUtil.getDelayedQueue(getId() +"-lowFusion", e -> {
+        RDelayedQueue<AbstractMsgId> lowInfusionDelay = redissonUtil.getDelayedQueue(getId() +"-lowFusion", e -> {
             if(e instanceof  LowInfusionEntity){
                 handleLowInfusion((LowInfusionEntity)e);
             }
@@ -163,7 +171,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         if(DeviceTypeEnum.intelligent.equals(source.getType())){
             if (source.getFlowDownLimit()!=null&&source.getFlowDownLimit().compareTo(BigDecimal.valueOf(0.1))<1) {
                 //输注量超过阈值,进行低输注判定
-                LowInfusionEntity lowInfusionEntity = LowInfusionEntity.builder()
+                lastLowInfusionWarn= LowInfusionEntity.builder()
                         .deviceId(source.getDeviceId())
                         .timeout(interval)
                         .unit(TimeUnit.MINUTES)
@@ -172,15 +180,14 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
                         .infusionId(source.getInfusionId())
                         .timestamp(new Date())
                         .build();
-                redissonUtil.offerQueue(delayedQueue,lowInfusionEntity,lowInfusionEntity.getTimeout(),lowInfusionEntity.getUnit());
+                redissonUtil.offerQueue(lowInfusionDelay,lastLowInfusionWarn,lastLowInfusionWarn.getTimeout(),lastLowInfusionWarn.getUnit());
             }
-
-
-
         }else {
             //输注量未超过阈值,取消低输注状态
+            if(lastLowInfusionWarn!=null){
+                lowInfusionDelay.remove(lastLowInfusionWarn);
+            }
             source.setWarnLowBattery(false);
-            redissonUtil.clearQueue(delayedQueue);
         }
     }
 
@@ -193,15 +200,12 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
      */
     private void handleLowInfusion(LowInfusionEntity source) {
         String deviceId = source.getDeviceId();
-        String tenantId = source.getTenantId();
-        BusDeviceRunningEntity runningInfo = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId).eq(BusDeviceRunningEntity::getTenantId, tenantId));
-        if (runningInfo == null) {
+        BusInfusionHistoryEntity infusionHistory = infusionHistoryService.getById(source.getInfusionId());
+        if (Boolean.TRUE.equals(infusionHistory.getFinished())) {
             //泵已换绑医院,无需再处理
             return;
         }
-        deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getId, runningInfo.getId())
-                .set(BusDeviceRunningEntity::getWarnLowBattery, true));
-        infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId, runningInfo.getInfusionId())
+        infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getId, infusionHistory.getId())
                 .set(BusInfusionHistoryEntity::getWarnLowBattery, true));
         //报警/提醒缓存重置
         deviceRegistry.getOperator(deviceId).setAlarmOrWarn(null);
@@ -209,11 +213,9 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
         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.getPatientCode(), infusionHistory.getTenantId());
 
-        if (Boolean.TRUE.equals(runningInfo.getMaster())) {
-            //发布推送
-            wsPublishUtils.publishPatientMonitor(runningInfo.getPatientCode(), runningInfo.getTenantId());
-        }
     }
 
     @Data

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

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

+ 1 - 2
coffee-system/src/main/java/com/coffee/bus/registry/Operator.java

@@ -15,7 +15,7 @@ import java.util.*;
  * @Description TODO
  * @createTime 2022年04月07日 16:07:00
  */
-public interface Operator<T> {
+public interface Operator {
 
     ConfigStorage getConfig();
 
@@ -51,7 +51,6 @@ public interface Operator<T> {
         if(value==null||value.get()==null){
             return value;
         }
-//        return Value.simple(value.as(SimpleValueWrapper.class).get());
         return value;
     }
 }

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

@@ -10,18 +10,17 @@ package com.coffee.bus.registry.constant;
 public class PatientKeyConstant {
     public static final String CODE="code";
 
-    public static final String GENDER="gender";
-
-    public static final String NAME="name";
-
     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 DEVICES="devices";
 
-    public static final String WARD="ward";
+    public static final String PATIENT_ID="patient_id";
 
-    public static final String BED_NO="bedNo";
+    public static final String INFUSION_ID="infusion_id";
 }

+ 1 - 2
coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceOperator.java

@@ -3,7 +3,6 @@ package com.coffee.bus.registry.device;
 
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.registry.constant.DeviceKeyConstant;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
 import com.coffee.common.cache.ConfigStorage;
 import lombok.AllArgsConstructor;   
 
@@ -17,7 +16,7 @@ import java.util.*;
  * @createTime 2022年04月06日 15:27:00
  */
 @AllArgsConstructor
-public class ClusterDeviceOperator implements DeviceOperator<DeviceCacheInfo> {
+public class ClusterDeviceOperator implements DeviceOperator {
 
     private final ConfigStorage configStorage;
 

+ 27 - 38
coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java

@@ -2,16 +2,9 @@ package com.coffee.bus.registry.device;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.coffee.bus.entity.BusDeviceAlarmEntity;
-import com.coffee.bus.entity.BusDeviceEntity;
-import com.coffee.bus.entity.BusDeviceRunningEntity;
-import com.coffee.bus.entity.BusInfusionModifyEntity;
+import com.coffee.bus.entity.*;
 import com.coffee.bus.registry.RegistryConstant;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
-import com.coffee.bus.service.LocalBusDeviceService;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
-import com.coffee.bus.service.LocalBusInfusionModifyService;
+import com.coffee.bus.service.*;
 import com.coffee.bus.websocket.listener.DeviceInfoListener;
 import com.coffee.common.cache.manager.ClusterConfigStorageManager;
 import lombok.AllArgsConstructor;
@@ -27,12 +20,12 @@ import org.springframework.stereotype.Service;
 @AllArgsConstructor
 @Service
 public class ClusterDeviceRegistry implements DeviceRegistry {
-    private final LocalBusDeviceRunningService pumpService;
+    private final LocalBusInfusionHistoryService infusionHistoryService;
     private final LocalBusDeviceService deviceService;
     private final ClusterConfigStorageManager configStorageManager;
     private final LocalBusInfusionModifyService infusionModifyService;
     @Override
-    public DeviceOperator<DeviceCacheInfo> getOperator(String deviceId) {
+    public DeviceOperator getOperator(String deviceId) {
         if(StrUtil.isEmpty(deviceId)){
             return null;
         }
@@ -40,7 +33,7 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
         ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator( configStorageManager.getStorage(key));
         if(StrUtil.isNullOrUndefined(deviceOperator.getDeviceId())){
             //从数据库中获取数据
-            BusDeviceRunningEntity runningInfo = pumpService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, deviceId));
+            BusInfusionHistoryEntity lastInfusion=infusionHistoryService.lastInfusion(deviceId);
             BusDeviceEntity device = deviceService.getOne(new QueryWrapper<BusDeviceEntity>().lambda()
                     .eq(BusDeviceEntity::getDeviceId, deviceId));
             if(device==null){
@@ -51,35 +44,31 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
             deviceOperator.setEnable(device.getEnable());
             deviceOperator.setDeviceId(deviceId);
             deviceOperator.setTenantId(device.getTenantId());
-            if(runningInfo==null){
-                deviceOperator.setAlias(device.getAlias());
-            }else {
-                //设备运行信息
-                deviceOperator.setUsingId(runningInfo.getId());
-                deviceOperator.setClassification(runningInfo.getClassification());
-                deviceOperator.setAlias(runningInfo.getAlias());
-                deviceOperator.setUndo(runningInfo.getIsUndo());
-                if(StrUtil.isNotEmpty(runningInfo.getInfusionId())){
-                    deviceOperator.setInfusionId(runningInfo.getInfusionId());
-                    BusInfusionModifyEntity infusionModify = infusionModifyService.getOne(new QueryWrapper<BusInfusionModifyEntity>().lambda().eq(BusInfusionModifyEntity::getInfusionId, runningInfo.getInfusionId()).orderByDesc(BusInfusionModifyEntity::getModifyTime).last("LIMIT 1"));
-                    if(infusionModify!=null){
-                        deviceOperator.setInfusionParam(infusionModify.signParam(DeviceInfoListener.sign));
-                    }
-                }
-                if (BusDeviceAlarmEntity.alarmOrWarn(runningInfo)) {
-                    deviceOperator.setAlarmOrWarn(BusDeviceAlarmEntity.parseRunning(runningInfo).signParm(DeviceInfoListener.sign));
+            deviceOperator.setAlias(device.getAlias());
+            //设备运行信息
+            if(lastInfusion!=null){
+                deviceOperator.setClassification(lastInfusion.getClassification());
+                deviceOperator.setUndo(lastInfusion.getIsUndo());
+                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());
                 }
-                deviceOperator.setMaster(runningInfo.getMaster());
-                deviceOperator.setStartTime(runningInfo.getStartTime());
-                deviceOperator.setStatus(runningInfo.getRunState());
-                //判断泵是否医院绑定发生变化
-                if(device.getTenantId().equals(runningInfo.getTenantId())){
-                    pumpService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
-                            .eq(BusDeviceRunningEntity::getDeviceId,deviceId).set(BusDeviceRunningEntity::getTenantId,device.getTenantId()));
+                if (BusDeviceAlarmEntity.alarmOrWarn(lastInfusion)) {
+                    deviceOperator.setAlarmOrWarn(BusDeviceAlarmEntity.parseRunning(lastInfusion).signParm());
                 }
-
+                deviceOperator.setStartTime(lastInfusion.getStartTime());
+                deviceOperator.setStatus(lastInfusion.getRunState());
+            }else {
+                //todo 更新设备类型
             }
-            //数据同步到缓存中
+
+
+//            //判断泵是否医院绑定发生变化
+//            if(device.getTenantId().equals(runningInfo.getTenantId())){
+//                deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
+//                        .eq(BusDeviceRunningEntity::getDeviceId,deviceId).set(BusDeviceRunningEntity::getTenantId,device.getTenantId()));
+//            }
             return deviceOperator;
         }
         return deviceOperator;

+ 1 - 1
coffee-system/src/main/java/com/coffee/bus/registry/device/DeviceOperator.java

@@ -14,7 +14,7 @@ import java.util.Date;
  * @Description 设备操作符
  * @createTime 2022年04月06日 15:16:00
  */
-public interface DeviceOperator<T> extends Operator<T> {
+public interface DeviceOperator extends Operator {
 
 
     /**

+ 1 - 2
coffee-system/src/main/java/com/coffee/bus/registry/device/DeviceRegistry.java

@@ -1,7 +1,6 @@
 package com.coffee.bus.registry.device;
 
 import com.coffee.bus.registry.Registry;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
 
 /**
  * @author lifang
@@ -16,7 +15,7 @@ public interface DeviceRegistry extends Registry {
      * @param deviceId
      * @return
      */
-    DeviceOperator<DeviceCacheInfo> getOperator(String deviceId);
+    DeviceOperator getOperator(String deviceId);
 
     /**
      * 删除设备信息

+ 0 - 74
coffee-system/src/main/java/com/coffee/bus/registry/device/bean/DeviceCacheInfo.java

@@ -1,74 +0,0 @@
-package com.coffee.bus.registry.device.bean;
-
-import com.coffee.bus.entity.BusDeviceRunningEntity;
-import com.coffee.bus.enums.DeviceStatusEnum;
-import com.coffee.bus.registry.CacheInfo;
-import com.coffee.bus.registry.RegistryConstant;
-import lombok.Builder;
-import lombok.Data;
-//import com.coffee.common.cache.*;
-import java.util.Date;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName DeviceInfo.java
- * @Description 注册设备基本信息
- * @createTime 2022年04月01日 17:06:00
- */
-@Data
-@Builder
-public class DeviceCacheInfo implements CacheInfo {
-    @Override
-    public String getKey() {
-        return RegistryConstant.Device+deviceId;
-    }
-    /**********经销商泵管理信息**********/
-    /**
-     * 设备id
-     */
-    private String deviceId;
-    /**
-     * 设备别名
-     */
-    private String alias;
-
-    /**
-     * 是否启用
-     */
-    private Boolean enable;
-
-    /**
-     * 设备所属医院
-     */
-    private String tenantId;
-    /**********经销商泵管理状态**********/
-
-    /**********泵正在运行状态**********/
-
-    /**
-     * 运行泵主键id
-     * @see BusDeviceRunningEntity
-     */
-    private String usingId;
-
-    private Date startTime;
-
-    private DeviceStatusEnum status;
-
-    /**********泵正在运行状态**********/
-
-    /**********泵正在运行状态**********/
-
-    private String patientCode;
-
-    /**
-     * 泵当前标记位(分包标识)
-     */
-    private String classification;
-    /**
-     * 当前泵是否为主泵
-     */
-    private Boolean master;
-    /**********泵正在运行状态**********/
-}

+ 5 - 74
coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java

@@ -1,15 +1,9 @@
 package com.coffee.bus.registry.patient;
 
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.json.JSONUtil;
 import com.coffee.bus.registry.constant.PatientKeyConstant;
-import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.common.cache.ConfigStorage;
-import com.coffee.common.enums.SexEnum;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -18,7 +12,7 @@ import java.util.stream.Collectors;
  * @Description 病号操作符
  * @createTime 2022年04月07日 15:25:00
  */
-public class ClusterPatientOperator implements PatientOperator<PatientCacheInfo> {
+public class ClusterPatientOperator implements PatientOperator {
     private final ConfigStorage configStorage;
 
     public ClusterPatientOperator(ConfigStorage configStorage) {
@@ -41,30 +35,6 @@ public class ClusterPatientOperator implements PatientOperator<PatientCacheInfo>
         return getValue(PatientKeyConstant.CODE).as(String.class);
     }
 
-    @Override
-    public void setGender(SexEnum gender) {
-        if(gender==null){
-            configStorage.setConfig(PatientKeyConstant.GENDER,null);
-        }else {
-            configStorage.setConfig(PatientKeyConstant.GENDER,gender.ordinal());
-        }
-    }
-
-    @Override
-    public SexEnum getGender() {
-        return getValue(PatientKeyConstant.GENDER).as(SexEnum.class);
-    }
-
-    @Override
-    public void setName(String name) {
-        configStorage.setConfig(PatientKeyConstant.NAME,name);
-    }
-
-    @Override
-    public String getName() {
-        return getValue(PatientKeyConstant.NAME).as(String.class);
-    }
-
     @Override
     public void setTenantId(String tenantId) {
         configStorage.setConfig(PatientKeyConstant.TENANT_ID,tenantId);
@@ -85,26 +55,6 @@ public class ClusterPatientOperator implements PatientOperator<PatientCacheInfo>
         return getValue(PatientKeyConstant.CLINIC_ID).as(String.class);
     }
 
-    @Override
-    public void setWard(String ward) {
-        configStorage.setConfig(PatientKeyConstant.WARD,ward);
-    }
-
-    @Override
-    public String getWard() {
-        return getValue(PatientKeyConstant.WARD).as(String.class);
-    }
-
-    @Override
-    public void setBedNo(String bedNo) {
-        configStorage.setConfig(PatientKeyConstant.BED_NO,bedNo);
-    }
-
-    @Override
-    public String getBedNo() {
-        return getValue(PatientKeyConstant.BED_NO).as(String.class);
-    }
-
     @Override
     public void setStartTime(Date startTime) {
         configStorage.setConfig(PatientKeyConstant.START_TIME,startTime);
@@ -126,26 +76,13 @@ public class ClusterPatientOperator implements PatientOperator<PatientCacheInfo>
     }
 
     @Override
-    public Set<DeviceTimeSmallInfo> getAllDevice() {
-        Set<Map<String,Object>> set = getValue(PatientKeyConstant.DEVICES).as(HashSet.class);
-        if(CollectionUtil.isNotEmpty(set)){
-            return set.stream()
-                    .map(JSONUtil::toJsonStr)
-                    .map(json-> JSONUtil.toBean(json,DeviceTimeSmallInfo.class))
-                    .collect(Collectors.toSet());
-        }
-        return new HashSet<>();    }
-
-    @Override
-    public void setAllDevice(Collection<DeviceTimeSmallInfo> devices) {
-        configStorage.setConfig(PatientKeyConstant.DEVICES,devices);
+    public String getPatientId() {
+        return getValue(PatientKeyConstant.PATIENT_ID).asString();
     }
 
     @Override
-    public void add(Collection<DeviceTimeSmallInfo> devices) {
-        Set<DeviceTimeSmallInfo> deviceList = getValue(PatientKeyConstant.DEVICES).as(HashSet.class);
-        deviceList.addAll(devices);
-        configStorage.setConfig(PatientKeyConstant.DEVICES,deviceList);
+    public void setPatientId(String patientId) {
+        configStorage.setConfig(PatientKeyConstant.PATIENT_ID,patientId);
     }
 
     @Override
@@ -157,12 +94,6 @@ public class ClusterPatientOperator implements PatientOperator<PatientCacheInfo>
     public void clearClinic() {
         configStorage.remove(Arrays.asList(PatientKeyConstant.CLINIC_ID,PatientKeyConstant.START_TIME,PatientKeyConstant.FINISHED));
     }
-
-    @Override
-    public void clearDevice() {
-        configStorage.remove(Arrays.asList(PatientKeyConstant.BIND_DEVICE_ID,PatientKeyConstant.DEVICES));
-    }
-
     @Override
     public List<String> getAllKeys(){
         return Arrays.asList("code","gender","surgeyName","tenantId","clinicId","startTime","finished","bindDeviceId","devices");

+ 18 - 37
coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java

@@ -1,18 +1,13 @@
 package com.coffee.bus.registry.patient;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.coffee.bus.entity.BusClinicEntity;
-import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.registry.RegistryConstant;
-import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.LocalBusClinicService;
-import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.service.LocalBusPatientService;
 import com.coffee.common.cache.manager.ClusterConfigStorageManager;
@@ -24,7 +19,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 /**
@@ -42,17 +36,16 @@ public class ClusterPatientRegistry implements PatientRegistry {
     private final ClusterConfigStorageManager configStorageManager;
     private final LocalBusClinicService clinicService;
     private final LocalBusInfusionHistoryService infusionService;
-    private final LocalBusDeviceRunningService deviceRunningService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode){
+    public PatientOperator getOperator(String hospitalId, String patientCode){
         return this.getOperator(hospitalId,patientCode,new HashMap<>());
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode, Map<String, Object> params) {
+    public PatientOperator getOperator(String hospitalId, String patientCode, Map<String, Object> params) {
         if(StrUtil.isEmpty(hospitalId)||StrUtil.isEmpty(patientCode)){
             return null;
         }
@@ -78,54 +71,42 @@ public class ClusterPatientRegistry implements PatientRegistry {
                 patient=new BusPatientEntity();
                 patient.setCode(patientCode);
                 patient.setTenantId(hospitalId);
-                //异步拉取his信息
-                clinicService.asyncFromHis(hospitalId,patientCode);
             }else {
-                clinic = clinicService.recentClinicByPatientCode(hospitalId, patientCode);
+                clinic = clinicService.getById(patient.getClinicId());
             }
 
             patientOperator.setCode(patientCode);
             patientOperator.setTenantId(hospitalId);
-            patientOperator.setName(patient.getName());
-            patientOperator.setGender(patient.getGender());
 
             //填充临床信息
-            patient.setName(clinic.getSurgeryName());
             patient.setClinicId(clinic.getId());
 
-            patientOperator.setWard(clinic.getWard());
-            patientOperator.setBedNo(clinic.getBedNo());
             patientOperator.setClinicId(clinic.getId());
-            //填充输注信息
-            BusInfusionHistoryEntity recentInfusion = infusionService.recentInfusionByPatientCode(hospitalId, patientCode);
-            if(recentInfusion!=null){
-                patient.setInfusionId(recentInfusion.getId());
-                clinic.setMonitorStartTime(recentInfusion.getStartTime());
-                //监护已结束
-                if(Boolean.TRUE.equals(recentInfusion.getIsUndo())){
-                    clinic.setEndTime(recentInfusion.getUndoTime());
-                    clinic.setFinished(true);
-                }
-            }
-            //填充主副泵信息
-            List<BusDeviceRunningEntity> runningList = deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getPatientCode, patientCode).eq(BusDeviceRunningEntity::getTenantId, hospitalId));
-            if (CollectionUtil.isNotEmpty(runningList)) {
-                Optional<BusDeviceRunningEntity> first = runningList.stream().filter(running -> Boolean.TRUE.equals(running.getMaster())).findFirst();
-                if(first.isPresent()){
-                    patientOperator.setBindDeviceId(first.get().getDeviceId());
-                }
-            }
             if(insert){
                 try {
                     log.info("医院[{}]新增病号数据[{}]",hospitalId,patientCode);
-                    patientService.save(patient);
                     clinicService.save(clinic);
+                    patient.setClinicId(clinic.getId());
+                    patientService.save(patient);
                 }catch (DuplicateKeyException e){
                     log.warn("病号重复插入,医院id:[{}],病号:[{}]",hospitalId,patientCode);
                 }
             }else {
+                //填充输注信息
+                BusInfusionHistoryEntity recentInfusion = infusionService.lastInfusionByPatientCode(hospitalId, patientCode);
+                if(recentInfusion!=null){
+                    patient.setInfusionId(recentInfusion.getId());
+                    clinic.setMonitorStartTime(recentInfusion.getStartTime());
+                    //监护已结束
+                    if(Boolean.TRUE.equals(recentInfusion.getIsUndo())){
+                        clinic.setEndTime(recentInfusion.getUndoTime());
+                        clinic.setFinished(true);
+                    }
+                    patientOperator.setBindDeviceId(recentInfusion.getDeviceId());
+                }
                 clinicService.updateById(clinic);
             }
+            patientOperator.setPatientId(patient.getId());
         }
         return patientOperator;
     }

+ 6 - 65
coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java

@@ -13,7 +13,7 @@ import java.util.*;
  * @Description 病人信息操作符
  * @createTime 2022年04月07日 14:26:00
  */
-public interface PatientOperator<T> extends Operator<T> {
+public interface PatientOperator extends Operator {
 
     /**
      * 设置病号
@@ -27,30 +27,6 @@ public interface PatientOperator<T> extends Operator<T> {
      */
     String getCode();
 
-    /**
-     * 设置性别
-     * @param gender
-     */
-    void setGender(SexEnum gender);
-
-    /**
-     * 获取性别
-     * @return
-     */
-    SexEnum getGender();
-
-    /**
-     * 设置病人名称
-     * @param name
-     */
-    void setName(String name);
-
-    /**
-     * 获取病人名称
-     * @return
-     */
-    String getName();
-
     /**
      * 设置医院id
      * @param tenantId
@@ -75,30 +51,6 @@ public interface PatientOperator<T> extends Operator<T> {
      */
     String getClinicId();
 
-    /**
-     * 设置当前临床病区
-     * @param ward
-     */
-    void setWard(String ward);
-
-    /**
-     * 获取当前临床病区
-     * @return
-     */
-    String getWard();
-
-    /**
-     * 设置当前临床床号
-     * @param bedNo
-     */
-    void setBedNo(String bedNo);
-
-    /**
-     * 获取当前临床床号
-     * @return
-     */
-    String getBedNo();
-
     /**
      * 设置临床开始时间
      * @param startTime
@@ -124,22 +76,16 @@ public interface PatientOperator<T> extends Operator<T> {
     String getBindDeviceId();
 
     /**
-     * 获取当前病号临床绑定所有泵信息
+     * 获取当前病号数据库主键id
      * @return
      */
-    Set<DeviceTimeSmallInfo> getAllDevice();
-
-    /**
-     * 设置当前病号临床绑定所有泵信息
-     * @param devices
-     */
-    void setAllDevice(Collection<DeviceTimeSmallInfo> devices);
+    String getPatientId();
 
     /**
-     * 为当前临床添加泵信息
-     * @param devices
+     * 获取当前病号数据库主键id
+     *
      */
-    void add(Collection<DeviceTimeSmallInfo> devices);
+    void setPatientId(String patientId);
 
     /**
      * 情空所有信息
@@ -150,9 +96,4 @@ public interface PatientOperator<T> extends Operator<T> {
      * 清空病号临床信息
      */
     void clearClinic();
-
-    /**
-     * 情空病号泵信息
-     */
-    void clearDevice();
 }

+ 2 - 4
coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientRegistry.java

@@ -1,8 +1,6 @@
 package com.coffee.bus.registry.patient;
 
 import com.coffee.bus.registry.Registry;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Map;
 
@@ -20,10 +18,10 @@ public interface PatientRegistry extends Registry {
      * @param patientCode
      * @return
      */
-    PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode);
+    PatientOperator getOperator(String hospitalId, String patientCode);
 
 
-    PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode, Map<String, Object> params);
+    PatientOperator getOperator(String hospitalId, String patientCode, Map<String, Object> params);
 
     /**
      * 删除病人信息

+ 0 - 72
coffee-system/src/main/java/com/coffee/bus/registry/patient/bean/PatientCacheInfo.java

@@ -1,72 +0,0 @@
-package com.coffee.bus.registry.patient.bean;
-
-import com.coffee.bus.registry.CacheInfo;
-import com.coffee.bus.registry.RegistryConstant;
-import com.coffee.common.enums.SexEnum;
-import lombok.Builder;
-import lombok.Data;
-
-import java.util.*;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName PatientBasicInfo.java
- * @Description 病人当前状态
- * @createTime 2022年04月02日 16:19:00
- */
-@Data
-@Builder
-public class PatientCacheInfo implements CacheInfo {
-
-    /******病人信息***********/
-    private String code;
-    private SexEnum gender;
-    private String name;
-    private String tenantId;
-    /******病人信息***********/
-
-
-
-    /******临床信息***********/
-    private String clinicId;
-    private Date startTime;
-    private Boolean isFinished;
-    /******临床信息***********/
-
-
-    /******泵信息***********/
-    /**
-     * 当前绑定泵id
-     */
-    private String bindDeviceId;
-
-    /**
-     * 当前病人所绑定的泵信息,用于处理泵重复以及无泵状态信息
-     */
-    private Set<DeviceTimeSmallInfo> devices;
-
-    @Override
-    public String getKey() {
-        return RegistryConstant.Patient+tenantId+"-"+code;
-    }
-
-    private PatientCacheInfo() {
-
-    }
-
-    /******泵信息***********/
-
-
-    private PatientCacheInfo(String code, SexEnum gender, String name, String tenantId, String clinicId, Date startTime, Boolean isFinished, String bindDeviceId, Set<DeviceTimeSmallInfo> devices) {
-        this.code = code;
-        this.gender = gender;
-        this.name = name;
-        this.tenantId = tenantId;
-        this.clinicId = clinicId;
-        this.startTime = startTime;
-        this.isFinished = isFinished;
-        this.bindDeviceId = bindDeviceId;
-        this.devices = devices;
-    }
-}

+ 26 - 19
coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java

@@ -11,7 +11,6 @@ import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.mapper.BusClinicMapper;
 import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.dto.ClinicQuery;
 import com.coffee.bus.service.dto.ClinicResult;
 import com.coffee.bus.service.dto.ClinicStatsReturnResult;
@@ -43,9 +42,7 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
     @Autowired
     @Lazy
     private LocalBusInfusionHistoryService infusionHistoryService;
-    @Autowired
-    @Lazy
-    private LocalBusDeviceRunningService deviceRunningService;
+
     @Autowired
     @Lazy
     private LocalBusPatientService patientService;
@@ -160,11 +157,6 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
         Assert.hasText(source.getPatientCode(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数patientCode不能为空");
         Assert.hasText(source.getTenantId(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数tenantId不能为空");
         Assert.notNull(source.getStartTime(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数startTime不能为空");
-        //处理当前运行的信息
-        deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
-                .eq(BusDeviceRunningEntity::getPatientCode,source.getPatientCode())
-                .eq(BusDeviceRunningEntity::getTenantId,source.getTenantId())
-                .set(BusDeviceRunningEntity::getClinicId,source.getId()));
 
         //处理当前的输注信息
         infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
@@ -178,6 +170,7 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
                 .eq(BusPatientEntity::getCode,source.getPatientCode())
                 .eq(BusPatientEntity::getTenantId,source.getTenantId())
                 .set(BusPatientEntity::getClinicId,source.getId()));
+
         //处理
         List<BusClinicEntity> clinics = this.list(new QueryWrapper<BusClinicEntity>().lambda()
                 .eq(BusClinicEntity::getPatientCode, source.getPatientCode())
@@ -201,19 +194,10 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
         }
         this.updateBatchById(clinics);
 
-        PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(source.getTenantId(), source.getPatientCode());
+        PatientOperator operator = patientRegistry.getOperator(source.getTenantId(), source.getPatientCode());
         operator.setClinicId(source.getId());
         wsPublishUtils.publishPatientMonitor(source.getPatientCode(),source.getTenantId());
     }
-    /**
-     * 从his同步病人数据-异步
-     * @param hospitalId
-     * @param patientCode
-     */
-    @Async
-    public void asyncFromHis(String hospitalId, String patientCode) {
-
-    }
 
     public ClinicStatsReturnResult stats(ClinicStatsVo statsVo) {
         return ClinicStatsReturnResult.of(this.baseMapper.stats(statsVo));
@@ -222,4 +206,27 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
     public IPage<ClinicResult> pageQuery(ClinicQuery query){
         return this.baseMapper.pageQuery(query.getPage(),query);
     }
+
+    /**
+     * 描述: 临床是否结束
+     * @author lifang
+     * @date 2022/5/30 16:25
+     * @param clinicId
+     * @return boolean
+     */
+    public boolean isFinished(String clinicId) {
+        return this.getById(clinicId).getFinished();
+    }
+
+    /**
+     * 描述: 重新开启临床
+     * @author lifang
+     * @date 2022/5/30 16:27
+     * @param clinicId
+     * @return void
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void resetClinic(String clinicId) {
+        this.update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,clinicId).set(BusClinicEntity::getFinished,false));
+    }
 }

+ 0 - 184
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java

@@ -1,184 +0,0 @@
-package com.coffee.bus.service;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.coffee.bus.entity.BusPatientEntity;
-import com.coffee.bus.registry.device.DeviceOperator;
-import com.coffee.bus.registry.device.DeviceRegistry;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
-import com.coffee.bus.registry.patient.PatientOperator;
-import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
-import com.coffee.bus.service.dto.UndoDeviceConfig;
-import com.coffee.bus.service.dto.DeviceShiftConfig;
-import com.coffee.bus.service.dto.ManualUndoConfig;
-import com.coffee.bus.entity.BusClinicEntity;
-import com.coffee.bus.entity.BusDeviceRunningEntity;
-import com.coffee.bus.entity.BusInfusionHistoryEntity;
-import com.coffee.bus.mapper.BusDeviceRunningMapper;
-import com.coffee.bus.utils.WsPublishUtils;
-import com.coffee.common.crud.BaseService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName LocalBusHospitalService.java
- * @Description TODO
- * @createTime 2022年03月19日 09:27:00
- */
-@Service
-public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMapper, BusDeviceRunningEntity,String> {
-    @Autowired
-    @Lazy
-    private LocalBusInfusionHistoryService infusionHistoryService;
-    @Autowired
-    @Lazy
-    private PatientRegistry patientRegistry;
-    @Autowired
-    @Lazy
-    private LocalBusPatientService patientService;
-    @Autowired
-    @Lazy
-    private LocalBusClinicService clinicService;
-    @Autowired
-    @Lazy
-    private DeviceRegistry deviceRegistry;
-
-    @Autowired
-    @Lazy
-    private WsPublishUtils wsPublishUtils;
-    @Override
-    public void validateBeforeSave(BusDeviceRunningEntity entity) {
-
-    }
-
-    @Override
-    public void validateBeforeUpdate(BusDeviceRunningEntity entity) {
-
-    }
-
-    @Override
-    public void validateBeforeDelete(String id) {
-
-    }
-
-    /**
-     * 描述: 获取设备别名
-     * @author lifang
-     * @date 2022/5/16 17:32
-     * @param deviceId
-     * @return String
-     */
-    public String getAliasName(String deviceId){
-        if(StrUtil.isBlank(deviceId)){
-            return null;
-        }
-        return deviceRegistry.getOperator(deviceId).getAlias();
-    }
-    /**
-     * 批量撤泵
-     * @param undoConfigs 批量撤泵配置
-     * @param  finishClinic 撤泵后是否结束相关临床
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void batchUndo(List<ManualUndoConfig> undoConfigs,boolean finishClinic){
-        undoConfigs.forEach(undoConfig -> this.undo(undoConfig,false));
-        //批量结束临床
-        if(finishClinic){
-            Map<String, List<ManualUndoConfig>> configsMap = undoConfigs.stream().collect(Collectors.groupingBy(ManualUndoConfig::getTenantId));
-            configsMap.forEach((k,v)-> {
-                clinicService.finish(v.stream().map(ManualUndoConfig::getClinicId).collect(Collectors.toList()),v.get(0).getUndo().getUndoTime() ,k);
-            });
-        }
-    }
-    /**
-     * 结束病患监控操作
-     * @param manualUndoConfig
-     * @param  finishClinic 撤泵后是否结束相关临床
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void undo(ManualUndoConfig manualUndoConfig,boolean finishClinic) {
-        List<String> deviceIds = manualUndoConfig.getDeviceIds();
-        if(CollectionUtil.isNotEmpty(deviceIds)){
-            /****************将撤泵记录存入到泵的使用历史记录中***************/
-            List<BusDeviceRunningEntity> devices = this.list(new QueryWrapper<BusDeviceRunningEntity>().lambda().in(BusDeviceRunningEntity::getDeviceId,deviceIds));
-            if(CollectionUtil.isEmpty(devices)){
-                return;
-            }
-            //对所有运行中的泵进行撤泵操作
-            this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().in(BusDeviceRunningEntity::getDeviceId,deviceIds).set(BusDeviceRunningEntity::getIsUndo,true));
-            //无泵监护,不需要监护输注数据
-            if(Boolean.TRUE.equals(manualUndoConfig.getMonitorType())){
-                //输注结束,更新撤泵信息
-                Set<String> infusionIds = devices.stream().map(BusDeviceRunningEntity::getInfusionId).collect(Collectors.toSet());
-                UndoDeviceConfig undo = manualUndoConfig.getUndo();
-                infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
-                        .in(BusInfusionHistoryEntity::getId,infusionIds)
-                        .set(BusInfusionHistoryEntity::getIsUndo,true)
-                        .set(BusInfusionHistoryEntity::getUndoBy,undo.getUndoBy())
-                        .set(BusInfusionHistoryEntity::getUndoTime,undo.getUndoTime())
-                        .set(BusInfusionHistoryEntity::getDestroyer,undo.getDestroyer())
-                        .set(BusInfusionHistoryEntity::getWitnesses,undo.getWitnesses()));
-                //将缓存设置为已撤泵状态
-                deviceIds.stream().map(deviceRegistry::getOperator)
-                        .forEach(operator->operator.setUndo(true));
-            }
-        }
-        //结束临床
-        if(finishClinic){
-            clinicService.finish(manualUndoConfig.getClinicId(),manualUndoConfig.getTenantId());
-        }
-
-    }
-
-    /**
-     * 切换主泵
-     * @param shiftConfig 切换配置
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void shift(DeviceShiftConfig shiftConfig) {
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(shiftConfig.getTenantId(), shiftConfig.getPatientCode());
-        String bindDeviceId = patientOperator.getBindDeviceId();
-        List<String> replicaDeviceIds = shiftConfig.getReplicaDeviceIds();
-        String masterDeviceId = shiftConfig.getMasterDeviceId();
-        if (masterDeviceId.equals(bindDeviceId)) {
-            //主泵未发生切换
-            return;
-        }
-        //切换副泵
-        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
-                .in(BusDeviceRunningEntity::getDeviceId,replicaDeviceIds).set(BusDeviceRunningEntity::getMaster,false));
-        //切换主泵
-        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
-                .eq(BusDeviceRunningEntity::getDeviceId,masterDeviceId).set(BusDeviceRunningEntity::getMaster,true));
-
-        DeviceOperator<DeviceCacheInfo> masterOperator = deviceRegistry.getOperator(masterDeviceId);
-        String currentInfusionId = masterOperator.getInfusionId();
-
-        //病患绑定主泵信息
-        patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
-                .eq(BusPatientEntity::getCode,shiftConfig.getPatientCode())
-                .eq(BusPatientEntity::getTenantId,shiftConfig.getTenantId())
-                .set(BusPatientEntity::getInfusionId,currentInfusionId));
-
-        //刷新缓存信息
-        replicaDeviceIds.stream().map(deviceRegistry::getOperator).forEach(deviceOperator->{
-            deviceOperator.setMaster(false);
-            //切换后也标注为暂时撤泵,即后续该泵发来的数据不再做主副泵切换的判断
-            deviceOperator.setUndo(true);
-        });
-
-        masterOperator.setMaster(true);
-        patientOperator.setBindDeviceId(shiftConfig.getMasterDeviceId());
-    }
-
-}

+ 1 - 4
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java

@@ -8,12 +8,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.coffee.aliyun.sdk.AliyunIotSdk;
 import com.coffee.bus.bean.AliIotConfig;
-import com.coffee.bus.entity.BusHospitalEntity;
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.entity.BusDeviceEntity;
 import com.coffee.bus.mapper.BusDeviceMapper;
 import com.coffee.bus.registry.device.DeviceOperator;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
 import com.coffee.bus.service.dto.DeviceQuery;
 import com.coffee.bus.service.dto.DeviceResult;
 import com.coffee.common.crud.BaseService;
@@ -27,7 +25,6 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
@@ -270,7 +267,7 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
      */
     @Transactional(rollbackFor = Exception.class)
     public void shift(List<String> deviceIds, String afterTenantId) {
-        List<DeviceOperator<DeviceCacheInfo>> operators = deviceIds.stream()
+        List<DeviceOperator> operators = deviceIds.stream()
                 .map(deviceRegistry::getOperator)
                 .collect(Collectors.toList());
         this.update(new UpdateWrapper<BusDeviceEntity>().lambda()

+ 119 - 10
coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java

@@ -1,19 +1,24 @@
 package com.coffee.bus.service;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.coffee.aliyun.utils.Constants;
 import com.coffee.aliyun.utils.Items;
 import com.coffee.aliyun.utils.PumpParams;
-import com.coffee.bus.entity.BusClinicEntity;
-import com.coffee.bus.entity.BusDeviceEntity;
-import com.coffee.bus.entity.BusInfusionHistoryEntity;
-import com.coffee.bus.entity.BusPatientEntity;
+import com.coffee.bus.entity.*;
+import com.coffee.bus.enums.PatientAlarmEnum;
 import com.coffee.bus.listener.event.infusion.InfusionCreateEvent;
 import com.coffee.bus.listener.event.infusion.InfusionUpdateEvent;
 import com.coffee.bus.mapper.BusInfusionHistoryMapper;
+import com.coffee.bus.registry.device.DeviceRegistry;
+import com.coffee.bus.registry.patient.PatientOperator;
+import com.coffee.bus.registry.patient.PatientRegistry;
+import com.coffee.bus.service.dto.ManualUndoConfig;
+import com.coffee.bus.service.dto.UndoDeviceConfig;
 import com.coffee.common.crud.BaseService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -21,10 +26,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import javax.validation.constraints.NotNull;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author 龙三郎
@@ -43,6 +47,10 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
     @Lazy
     private LocalBusPatientService patientService;
 
+    @Autowired
+    @Lazy
+    private PatientRegistry patientRegistry;
+
     @Autowired
     @Lazy
     private LocalBusClinicService clinicService;
@@ -131,11 +139,14 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
                 .eq(BusInfusionHistoryEntity::getClassification,classification));
     }
 
-    public BusInfusionHistoryEntity recentInfusionByPatientCode(String hospitalId, String patientCode) {
+    public BusInfusionHistoryEntity lastInfusionByPatientCode(String hospitalId, String patientCode) {
         return this
                 .getOne(new QueryWrapper<BusInfusionHistoryEntity>()
                         .lambda()
-                        .eq(BusInfusionHistoryEntity::getTenantId,hospitalId).eq(BusInfusionHistoryEntity::getPatientCode,patientCode).last("limit 1"));
+                        .eq(BusInfusionHistoryEntity::getTenantId,hospitalId)
+                        .eq(BusInfusionHistoryEntity::getPatientCode,patientCode)
+                        .orderByDesc(BusInfusionHistoryEntity::getStartTime)
+                        .last("limit 1"));
     }
 
 
@@ -185,6 +196,73 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
 
     }
 
+    /**
+     * 批量撤泵
+     * @param undoConfigs 批量撤泵配置
+     * @param  finishClinic 撤泵后是否结束相关临床
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void batchUndo(List<ManualUndoConfig> undoConfigs,boolean finishClinic){
+        if(!finishClinic){
+            undoConfigs.forEach(undoConfig -> this.undo(undoConfig,false));
+        }else {
+            //批量结束临床
+            Map<String, List<ManualUndoConfig>> configsMap = undoConfigs.stream().collect(Collectors.groupingBy(ManualUndoConfig::getTenantId));
+            configsMap.forEach((tenantId,undoConfig)-> {
+                clinicService.finish(undoConfig.stream().map(ManualUndoConfig::getClinicId).collect(Collectors.toList()),undoConfig.get(0).getUndo().getUndoTime() ,tenantId);
+            });
+        }
+    }
+
+    /**
+     * 结束病患监控操作
+     * @param manualUndoConfig
+     * @param  finishClinic 撤泵后是否结束相关临床
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void undo(ManualUndoConfig manualUndoConfig, boolean finishClinic) {
+        if(finishClinic){
+            List<String> infusionIds = manualUndoConfig.getInfusionIds();
+            if(CollectionUtil.isNotEmpty(infusionIds)){
+                /****************将撤泵记录存入到泵的使用历史记录中***************/
+                //无泵监护,不需要监护输注数据
+                if(Boolean.TRUE.equals(manualUndoConfig.getMonitorType())){
+                    if(!finishClinic){
+                        BusPatientEntity patient = patientService.getOne(new QueryWrapper<BusPatientEntity>().lambda()
+                                .eq(BusPatientEntity::getCode, manualUndoConfig.getPatientCode())
+                                .eq(StrUtil.isNotEmpty(manualUndoConfig.getTenantId()), BusPatientEntity::getTenantId, manualUndoConfig.getTenantId()));
+                        //去除主泵id
+                        infusionIds=infusionIds.stream().filter(id->!id.equals(patient.getInfusionId())).collect(Collectors.toList());
+                    }
+                    //输注结束,更新撤泵信息
+                    if(CollectionUtil.isNotEmpty(infusionIds)){
+                        UndoDeviceConfig undo = manualUndoConfig.getUndo();
+                        this.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
+                                .in(BusInfusionHistoryEntity::getId,infusionIds)
+                                .set(BusInfusionHistoryEntity::getIsUndo,true)
+                                .set(BusInfusionHistoryEntity::getUndoBy,undo.getUndoBy())
+                                .set(BusInfusionHistoryEntity::getUndoTime,undo.getUndoTime())
+                                .set(BusInfusionHistoryEntity::getDestroyer,undo.getDestroyer())
+                                .set(BusInfusionHistoryEntity::getWitnesses,undo.getWitnesses()));
+                    }
+                }
+            }
+        }else {
+            UndoDeviceConfig undo = manualUndoConfig.getUndo();
+            this.update(new UpdateWrapper<BusInfusionHistoryEntity>()
+                    .lambda()
+                    .eq(BusInfusionHistoryEntity::getFinished,false)
+                    .eq(BusInfusionHistoryEntity::getPatientCode,manualUndoConfig.getPatientCode())
+                    .eq(StrUtil.isNotEmpty(manualUndoConfig.getTenantId()),BusInfusionHistoryEntity::getTenantId,manualUndoConfig.getTenantId())
+                    .set(BusInfusionHistoryEntity::getIsUndo,true)
+                    .set(BusInfusionHistoryEntity::getUndoBy,undo.getUndoBy())
+                    .set(BusInfusionHistoryEntity::getDestroyer,undo.getDestroyer())
+                    .set(BusInfusionHistoryEntity::getUndoTime,undo.getUndoTime())
+                    .set(BusInfusionHistoryEntity::getUndoTime,undo.getUndoTime()));
+            clinicService.finish(manualUndoConfig.getClinicId(),manualUndoConfig.getTenantId());
+        }
+    }
+
     /**
      * 描述: 获取所给临床id的最新输注信息
      * @author lifang
@@ -195,4 +273,35 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
     public BusInfusionHistoryEntity currentInClinic(String clinicId) {
         return this.baseMapper.currentInClinic(clinicId);
     }
+
+    public BusInfusionHistoryEntity lastInfusion(String deviceId) {
+        return this.getOne(new QueryWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getDeviceId,deviceId).orderByDesc(BusInfusionHistoryEntity::getStartTime).last("limit 1"));
+    }
+
+    /**
+     * 描述: 处理非正常关机的输注信息
+     * @author lifang
+     * @date 2022/5/31 9:11
+     * @param abnormalInfusion
+     * @return void
+     */
+    public BusInfusionHistoryEntity handleAbnormalInfusion(BusInfusionHistoryEntity abnormalInfusion) {
+        List<BusInfusionHistoryEntity> infusionHistories = this.list(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
+                .eq(BusInfusionHistoryEntity::getFinished, false)
+                .eq(BusInfusionHistoryEntity::getPatientCode, abnormalInfusion.getPatientCode())
+                .eq(BusInfusionHistoryEntity::getTenantId, abnormalInfusion.getTenantId()));
+        BusInfusionHistoryEntity lastInfusion=null;
+        if(CollectionUtil.isNotEmpty(infusionHistories)){
+            lastInfusion = infusionHistories.stream().max(Comparator.comparing(BusInfusionHistoryEntity::getStartTime)).orElse(null);
+        }
+        int size = CollectionUtil.size(infusionHistories);
+        patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
+                .eq(BusPatientEntity::getCode,abnormalInfusion.getPatientCode())
+                .eq(BusPatientEntity::getTenantId,abnormalInfusion.getTenantId())
+                .set(lastInfusion!=null,BusPatientEntity::getInfusionId,lastInfusion.getId())
+                .set(size==0,BusPatientEntity::getAlarm, PatientAlarmEnum.DEVICE_NONE)
+                .set(size==1,BusPatientEntity::getAlarm, PatientAlarmEnum.NONE)
+                .set(size>1,BusPatientEntity::getAlarm, PatientAlarmEnum.DEVICE_REPEAT));
+        return lastInfusion;
+    }
 }

+ 53 - 11
coffee-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java

@@ -2,13 +2,13 @@ package com.coffee.bus.service;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.entity.PatientDeviceRepeatDomain;
 import com.coffee.bus.enums.DeviceAlarmEnum;
@@ -16,11 +16,11 @@ import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.enums.PatientAlarmEnum;
 import com.coffee.bus.hospital.his.HisScriptSession;
 import com.coffee.bus.hospital.his.HisScriptSessionManager;
+import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.service.dto.*;
 import com.coffee.bus.mapper.BusPatientMapper;
 import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.crud.BaseService;
 import com.coffee.common.enums.SexEnum;
@@ -65,6 +65,14 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     @Lazy
     private WsPublishUtils wsPublishUtils;
 
+    @Autowired
+    @Lazy
+    private LocalBusInfusionHistoryService infusionHistoryService;
+
+    @Autowired
+    @Lazy
+    private DeviceRegistry deviceRegistry;
+
     private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
 
     @Override
@@ -125,6 +133,10 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         return patientAlarmCount(null,alarm);
     }
 
+    public long monitorTotalCount(String tenantId){
+        return this.baseMapper.monitorTotalCount(tenantId);
+    }
+
     /**
      * 获取给定医院下所有的挂载多个设备的病人信息
      *
@@ -147,13 +159,12 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
             );
             List<PatientDeviceRepeatResult.DeviceRunningSmallInfo> deviceRunningSmallInfos = Optional.ofNullable(repeatResult.getDevices()).orElse(new ArrayList<>());
             deviceRunningSmallInfos.add(PatientDeviceRepeatResult.DeviceRunningSmallInfo.of(
-                    deviceRepeat.getDeviceRunningId(),
                     deviceRepeat.getDeviceId(),
                     deviceRepeat.getDeviceAlias(),
                     deviceRepeat.getDeviceRunState(),
                     deviceRepeat.getDeviceAlarm(),
                     deviceRepeat.getInfusionStartTime(),
-                    deviceRepeat.getMaster()
+                    deviceRepeat.isMaster()
             ));
             repeatResult.setDevices(deviceRunningSmallInfos);
         });
@@ -177,7 +188,7 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         return result.getRecords();
     }
 
-    /**
+    /**t
      * 根据医院和住院号获取一个患者
      * @param tenantId
      * @param patientCode
@@ -208,7 +219,7 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         clinicService.saveOrUpdate(clinic);
         //后更新病人信息
         BusPatientEntity patient = BusPatientEntity.of(clinic);
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(patient.getTenantId(), patient.getCode());
+        PatientOperator patientOperator = patientRegistry.getOperator(patient.getTenantId(), patient.getCode());
         if (StrUtil.isEmpty(patientOperator.getCode())) {
             this.save(patient);
             patientOperator.setCode(patient.getCode());
@@ -219,9 +230,6 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
             this.updateById(patient);
         }
         patientOperator.setClinicId(patient.getClinicId());
-        patientOperator.setName(patient.getName());
-        patientOperator.setBedNo(clinic.getBedNo());
-        patientOperator.setWard(clinic.getWard());
 
         CompletableFuture.runAsync(()->{
             wsPublishUtils.publishPatientMonitor(patient.getCode(),patient.getTenantId());
@@ -272,7 +280,8 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
                 if(DeviceStatusEnum.Running.equals(monitor.getDeviceRunState())){
                     result.setRunningCount(result.getRunningCount()+1);
                 }
-                if(monitor.getDeviceRunState()!=null&&(DeviceStatusEnum.Shutdown.equals(monitor.getDeviceRunState())||DeviceStatusEnum.NoSignal.equals(monitor.getDeviceRunState()))){
+                if((Boolean.TRUE.equals(monitor.getInfusionFinished()))||
+                        (DeviceStatusEnum.Shutdown.equals(monitor.getDeviceRunState())||DeviceStatusEnum.NoSignal.equals(monitor.getDeviceRunState()))){
                     result.setWaitingFinish(result.getWaitingFinish()+1);
                 }
                 //报警数量
@@ -348,4 +357,37 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         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) {
+        PatientOperator patientOperator = patientRegistry.getOperator(shiftConfig.getTenantId(), shiftConfig.getPatientCode());
+        String bindDeviceId = patientOperator.getBindDeviceId();
+        List<String> replicaDeviceIds = shiftConfig.getReplicaDeviceIds();
+        String masterDeviceId = shiftConfig.getMasterDeviceId();
+        if (masterDeviceId.equals(bindDeviceId)) {
+            //主泵未发生切换
+            return;
+        }
+        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);
+            //切换后也标注为暂时撤泵,即后续该泵发来的数据不再做主副泵切换的判断
+            deviceOperator.setUndo(true);
+        });
+
+        patientOperator.setBindDeviceId(shiftConfig.getMasterDeviceId());
+    }
 }

+ 7 - 3
coffee-system/src/main/java/com/coffee/bus/service/dto/ManualUndoConfig.java

@@ -24,9 +24,13 @@ import java.util.*;
 @NoArgsConstructor
 public class ManualUndoConfig implements Serializable {
 
-    @ApiModelProperty("进行撤泵的所有运行数据id")
-    @NotNull(message = "撤泵泵号不能为空")
-    private List<String> deviceIds;
+//    @ApiModelProperty("进行撤泵的所有运行数据id")
+//    @NotNull(message = "撤泵输注号不能为空")
+//    private List<String> deviceIds;
+
+    @ApiModelProperty("进行撤泵的输注id")
+    @NotNull(message = "撤泵输注号不能为空")
+    private List<String> infusionIds;
 
     @ApiModelProperty("撤泵病号")
     private String patientCode;

+ 0 - 2
coffee-system/src/main/java/com/coffee/bus/service/dto/PatientDeviceRepeatResult.java

@@ -55,8 +55,6 @@ public class PatientDeviceRepeatResult  implements Serializable {
     @Data
     @AllArgsConstructor(staticName = "of")
     public static class DeviceRunningSmallInfo  implements Serializable {
-        @ApiModelProperty("设备运行Id")
-        private String deviceRunningId;
         @ApiModelProperty("设备名称")
         private String deviceId;
         @ApiModelProperty("设备别名")

+ 2 - 4
coffee-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java

@@ -132,10 +132,8 @@ public class WsPublishUtils implements Serializable{
     @Async
     public void publishMonitorTotalCount(String tenantId){
         Assert.hasText(tenantId,"医院id不能为空");
-        JSONObject message = new JSONObject().putOpt("count", clinicService.count(new QueryWrapper<BusClinicEntity>().lambda()
-                .eq(BusClinicEntity::getMonitorType,true)
-                .eq(BusClinicEntity::getTenantId,tenantId)
-                .eq(BusClinicEntity::getFinished,false)));
+        JSONObject message = new JSONObject().putOpt("count",
+                patientService.monitorTotalCount(tenantId));
         this.publish(WebSocketConstant.getMonitorTotalCount(tenantId).getTopic(),
                 TopicMessage.of(message,tenantId)
         );

+ 2 - 0
coffee-system/src/main/java/com/coffee/bus/websocket/WebSocketCloseHandler.java

@@ -7,6 +7,7 @@ import com.coffee.bus.hospital.his.HisScriptSessionManager;
 import com.coffee.common.Constants;
 import com.coffee.common.config.websocket.DefaultMessageListener;
 import com.coffee.common.config.websocket.handler.Subscribe;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.tio.core.ChannelContext;
 
@@ -21,6 +22,7 @@ import java.util.Map;
  */
 @Component
 public class WebSocketCloseHandler extends Subscribe {
+    @Autowired
     private HisScriptSessionManager scriptSessionManager;
     @Override
     public String getId() {

+ 117 - 277
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -1,26 +1,21 @@
 package com.coffee.bus.websocket.listener;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.crypto.SignUtil;
-import cn.hutool.crypto.asymmetric.Sign;
-import cn.hutool.crypto.asymmetric.SignAlgorithm;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.coffee.bus.entity.*;
+import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.enums.PatientAlarmEnum;
 import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.listener.event.bean.DeviceInfoEvent;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
 import com.coffee.bus.registry.device.DeviceOperator;
 import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.*;
 import com.coffee.bus.utils.WsPublishUtils;
 import lombok.AllArgsConstructor;
@@ -28,9 +23,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
+import org.tio.utils.crypto.Md5;
+
 import java.util.*;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 
 /**
@@ -45,8 +41,6 @@ import java.util.function.Supplier;
 @AllArgsConstructor
 public class DeviceInfoListener {
 
-    private final LocalBusDeviceRunningService deviceRunningService;
-
     private final DeviceRegistry deviceRegistry;
 
     private final LocalBusDeviceAlarmService alarmService;
@@ -57,8 +51,6 @@ public class DeviceInfoListener {
 
     private final LocalBusInfusionModifyService infusionModifyService;
 
-    public static final Sign sign = SignUtil.sign(SignAlgorithm.MD5withRSA);
-
     private final LocalBusDeviceHistoryService historyService;
 
     private final LocalBusPatientService patientService;
@@ -82,58 +74,38 @@ public class DeviceInfoListener {
     @EventListener
     @Transactional(rollbackFor = Exception.class)
     public void deviceInfoDetail(DeviceInfoEvent infoEvent){
-        //保证统一设备数据顺序处理,若数据发送过快,为防止冲突,请在此加锁处理 todo
+        //保证统一设备数据顺序处理,若数据发送过快,为防止冲突,请在此加锁处理
         synchronized (infoEvent.getDeviceId()){
             log.info("接收到设备消息:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
-            long startTime = System.currentTimeMillis();
-            /****************处理泵数据 todo 后续交由上游处理****************/
             BusDeviceRunningEntity device = infoEvent.getContent();
-//            device=device.startUpHandle();
-            device.setMonitorType(true);
-
-            //1、判断该设备是否已和医院绑定并开启使用
-            String deviceId = device.getDeviceId();
-            device.setUploadTime(device.getUploadTime()==null?new Date():device.getUploadTime());
-            DeviceOperator<DeviceCacheInfo> deviceOperator = deviceRegistry.getOperator(deviceId);
-            device.setMaster(deviceOperator.getMaster());
-            device.setIsUndo(deviceOperator.getUndo());
-            device.setTenantId(deviceOperator.getTenantId());
-
-            //数据准确性判断
             String classification = device.getClassification();
-            //默认为主泵,后续判断若不满足主泵条件,则替换为副泵
-            if(classification==null){
+            if(StrUtil.isBlank(classification)){
                 log.error("设备号:[{}]分包标识号为空,无法更新开始时间");
                 throw new RuntimeException("设备数据中分包标识不能为空");
             }
+            long startTime = System.currentTimeMillis();
+            //对设备数据的一些参数进行初始化设置
+            init(device);
 
-            log.info("接收到设备数据:[{}]", JSONUtil.toJsonStr(infoEvent.getContent()));
+            String deviceId = device.getDeviceId();
+            DeviceOperator deviceOperator = deviceRegistry.getOperator(deviceId);
             //缓存操作
             List<Supplier<?>> cacheOperation=new ArrayList<>();
-            //处理设备运行数据,     判断是否为注册后第一次开机,判断是否为新的输注信息
-            boolean first = handleRunningInfo(device, deviceOperator,cacheOperation);
-
             //处理输注参数
-            handleInfusion(device, deviceOperator, cacheOperation);
+            BusInfusionHistoryEntity infusionHistory = handleInfusionHistory(device, deviceOperator, cacheOperation);
+            //处理输注修改参数
+            handleInfusionModify(device,deviceOperator,cacheOperation);
             //处理历史运行数据
             BusDeviceHistoryEntity history=handleRunningHistory(device);
             //处理报警、提醒信息
             handleAlarmOrWarn(history,deviceOperator,cacheOperation);
             //医院相关配置处理
             handleHospitalConfig(device,cacheOperation);
-            if(first){
-                deviceService.update(new UpdateWrapper<BusDeviceEntity>().lambda().eq(BusDeviceEntity::getDeviceId,deviceId).set(BusDeviceEntity::getType,device.getType()));
-                //首次上传数据,开启病号监控时长
-                clinicService.update(new UpdateWrapper<BusClinicEntity>()
-                        .lambda()
-                        .eq(BusClinicEntity::getId,device.getClinicId())
-                        .set(BusClinicEntity::getWard,device.getWard())
-                        .set(BusClinicEntity::getBedNo,device.getBedNo())
-                        .set(BusClinicEntity::getMonitorStartTime,device.getStartTime())
-                );
-                deviceRunningService.save(device);
+
+            if(device.isNewInfusion()){
+                infusionHistoryService.save(infusionHistory);
             }else {
-                deviceRunningService.updateById(device);
+                infusionHistoryService.updateById(infusionHistory);
             }
 
             cacheOperation.add(()->{
@@ -141,6 +113,13 @@ public class DeviceInfoListener {
                     wsPublishUtils.publishPatientMonitor(device.getPatientCode(),device.getTenantId());
                     wsPublishUtils.publishMonitorStateCount(device.getTenantId());
                 }
+                if (Boolean.TRUE.equals(device.isInfusionModify())) {
+                    wsPublishUtils.publishDeviceNone(device.getTenantId());
+                    wsPublishUtils.publishDeviceRepeat(device.getTenantId());
+                }
+                if (Boolean.TRUE.equals(device.isResetClinic())) {
+                    wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
+                }
                 return null;
             });
 
@@ -150,56 +129,19 @@ public class DeviceInfoListener {
         }
     }
 
+    private void init(BusDeviceRunningEntity device) {
+        String deviceId = device.getDeviceId();
 
-    /**
-     * 设备运行数据处理,返回是否为第一次接受数据消息
-     * @param device 接收到的设备信息
-     * @param deviceOperator 设备缓存信息操作符
-     * @return 是否为第一次接收数据消息
-     */
-    private boolean handleRunningInfo( BusDeviceRunningEntity device,DeviceOperator<DeviceCacheInfo> deviceOperator,List<Supplier<?>> suppliers){
-        //判断此条数据的分包标识是否发生了改变
-        String originClassify = deviceOperator.getClassification();
-        String classification = device.getClassification();
-        String usingId = deviceOperator.getUsingId();
-        if(!classification.equals(originClassify)){
-            device.setNewInfusion(true);
-            //启动新的输注,则撤泵标识取消
-            device.setIsUndo(false);
-            //分包标识发生了改变,设备开机时间重新计算
-            device.setStartTime(device.getUploadTime());
-        }
-        boolean first=false;
-        if(StrUtil.isNullOrUndefined(usingId)){
-            //设备首次运行,记录开机时间
-            device.setId(String.valueOf(IdWorker.getId()));
-            device.setStartTime(device.getUploadTime());
-            first=true;
-        }else {
-            device.setId(usingId);
-            if(!device.isNewInfusion()){
-                device.setStartTime(deviceOperator.getStartTime());
-            }
-        }
-        suppliers.add(()->{
-            //更新设备缓存数据
-            if(device.isNewInfusion()){
-                deviceOperator.setUndo(false);
-            }
-            deviceOperator.setClassification(device.getClassification());
-            deviceOperator.setTenantId(device.getTenantId());
-            deviceOperator.setUsingId(device.getId());
-            deviceOperator.setStatus(device.getRunState());
-            deviceOperator.setStartTime(device.getStartTime());
-            deviceOperator.setMaster(device.getMaster());
-            deviceOperator.setPatientCode(device.getPatientCode());
-            //新输注异步更新
-            hospitalManagerRegister.get(device.getTenantId())
-                    .getScriptSession()
-                    .asyncGetPatientInfo(device.getPatientCode(),10, TimeUnit.SECONDS,false);
-            return null;
-        });
-        return first;
+        DeviceOperator deviceOperator = deviceRegistry.getOperator(deviceId);
+        device.setMonitorType(true);
+        device.setUploadTime(device.getUploadTime()==null?new Date():device.getUploadTime());
+
+        device.setTenantId(deviceOperator.getTenantId());
+
+    }
+
+    private boolean isNewInFusion(String deviceId, String classification){
+        return ObjectUtil.notEqual(classification,deviceRegistry.getOperator(deviceId).getClassification());
     }
 
     /**
@@ -207,147 +149,56 @@ public class DeviceInfoListener {
      * @param device 接收到的设备数据
      * @return 是否发生了换泵操作
      */
-    private void handlePatient(BusDeviceRunningEntity device,List<Supplier<?>> suppliers){
+    private void handlePatient(BusDeviceRunningEntity device,boolean clinicFinished,List<Supplier<?>> suppliers){
+        device.setMaster(true);
         String deviceId = device.getDeviceId();
-        DeviceOperator<DeviceCacheInfo> currentDeviceOperator = deviceRegistry.getOperator(deviceId);
-        PatientOperator<PatientCacheInfo> currentPatientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
-        String bindDeviceId = currentPatientOperator.getBindDeviceId();
-        //当前病号所绑定的泵发生了改变,对当前病号进行处理
-        if(StrUtil.isNullOrUndefined(bindDeviceId)){
-            //当前的病号之前为无泵状态,无泵 -》 有泵 做处理  修改缓存信息
-            log.warn("病号:【{}】临床发生由无泵转为有泵",device.getPatientCode());
-            patientService.update(new UpdateWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode,device.getPatientCode())
-                    .eq(BusPatientEntity::getTenantId,device.getTenantId())
-                    .set(device.isNewInfusion(),BusPatientEntity::getInfusionId,device.getInfusionId())
-                    .set(BusPatientEntity::getAlarm, PatientAlarmEnum.NONE)
-            );
-            device.setMaster(true);
-            suppliers.add(()->{
-                wsPublishUtils.publishDeviceNone(device.getTenantId());
-                return null;
-            });
-        }else if(ObjectUtil.notEqual(deviceId,bindDeviceId)){
-            handleConflictCurrentPatient(device,suppliers);
-        }else {
-            //主泵未发生变化,只修改绑定的输注信息
+        PatientOperator currentPatientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
+        if(device.isInfusionModify()){
             if(device.isNewInfusion()){
-                patientService.update(new UpdateWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode,device.getPatientCode())
+                //只有在新开启输注时进行判断,1、判断当前输注的病号是否存在其他正在进行的输注 2、判断该设备上一次输注绑定的病号是否没有任何输注
+                long runningInfusionCount = infusionHistoryService.count(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
+                        .eq(BusInfusionHistoryEntity::getFinished, false)
+                        .eq(BusInfusionHistoryEntity::getPatientCode, device.getPatientCode())
+                        .eq(BusInfusionHistoryEntity::getTenantId, device.getTenantId()));
+                patientService.update(new UpdateWrapper<BusPatientEntity>()
+                        .lambda()
+                        .eq(BusPatientEntity::getCode,device.getPatientCode())
                         .eq(BusPatientEntity::getTenantId,device.getTenantId())
-                        .set(device.isNewInfusion(),BusPatientEntity::getInfusionId,device.getInfusionId()));
-            }
-            device.setMaster(true);
-        }
-        //更新泵所绑定当前病人缓存信息
-        suppliers.add(()->{
-            if(Boolean.TRUE.equals(device.getMaster())){
-                currentDeviceOperator.setMaster(true);
-                currentPatientOperator.setBindDeviceId(deviceId);
-            }
-            return null;
-        });
-        String originPatientCode=currentDeviceOperator.getPatientCode();
-        //当前泵所绑定病号发生了改变,对之前所绑定病号进行处理
-        if(!StrUtil.isNullOrUndefined(originPatientCode)&&!device.getPatientCode().equals(originPatientCode)){
-            handleConflictOriginPatient(deviceId,device.getTenantId(),originPatientCode,suppliers);
-        }
-    }
-
-    /**
-     * 病患信息处理,当泵所绑定病号发生变化时,处理泵原来所绑定病号信息
-     */
-    private void handleConflictOriginPatient(String deviceId, String hospitalId, String patientCode, List<Supplier<?>> suppliers){
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(hospitalId, patientCode);
-        //过滤掉已换绑的泵,获取剩余所绑定的泵数据
-        List<BusDeviceRunningEntity> currentBindDevices = deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getTenantId, hospitalId)
-                .eq(BusDeviceRunningEntity::getTenantId, hospitalId)
-                .ne(BusDeviceRunningEntity::getDeviceId, deviceId));
-        if(CollectionUtil.isEmpty(currentBindDevices)){
-            log.warn("病号:【{}】临床发生无泵报警",patientCode);
-            patientService.update(new UpdateWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode,patientCode)
-                    .eq(BusPatientEntity::getTenantId,hospitalId)
-                    .set(BusPatientEntity::getAlarm, PatientAlarmEnum.DEVICE_NONE)
-            );
-            suppliers.add(()->{
-                //发起无泵报警,处理原先泵的无泵信息
-                patientOperator.setBindDeviceId(null);
-                wsPublishUtils.publishDeviceNone(hospitalId);
-                wsPublishUtils.publishPatientMonitor(patientCode,hospitalId);
-                //发起无泵报警后,将该病人最后一条输注作为显示信息实时传输给前端
-                return null;
-            });
-        }else {
-            //将开始时间最大的泵设置为主泵
-            Optional<BusDeviceRunningEntity> master = currentBindDevices.stream().max((o1,o2)->
-                    o1.getStartTime().equals(o2.getStartTime())?0:o1.getStartTime().before(o2.getStartTime()) ? -1 : 1
-            );
-            UpdateWrapper<BusPatientEntity> update = new UpdateWrapper<>();
-            if(master.isPresent()){
-                log.warn("病号:[{}],主泵变为[{}]",patientCode,master.get().getDeviceId());
-                deviceRunningService
-                        .update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
-                                .eq(BusDeviceRunningEntity::getDeviceId,master.get().getDeviceId())
-                                .set(BusDeviceRunningEntity::getMaster,true));
-                DeviceOperator<DeviceCacheInfo> operator = deviceRegistry.getOperator(master.get().getDeviceId());
-                //更换输注信息
-                update.lambda().eq(BusPatientEntity::getCode, patientCode)
-                        .eq(BusPatientEntity::getTenantId, hospitalId)
-                        .set(BusPatientEntity::getInfusionId, operator.getInfusionId());
+                        .set(BusPatientEntity::getInfusionId,device.getInfusionId())
+                        .set(runningInfusionCount>0,BusPatientEntity::getAlarm,PatientAlarmEnum.DEVICE_REPEAT)
+                        .set(runningInfusionCount==0,BusPatientEntity::getAlarm,PatientAlarmEnum.NONE));
+                BusInfusionHistoryEntity lastInfusion = infusionHistoryService.lastInfusion(deviceId);
+                if(ObjectUtil.notEqual(device.getPatientCode(),lastInfusion.getPatientCode())&&!DeviceStatusEnum.Shutdown.equals(lastInfusion.getRunState())){
+                    //处理非正常关机的输注信息,返回处理后的该病号绑定的正常输注信息
+                    BusInfusionHistoryEntity normalInfusion = infusionHistoryService.handleAbnormalInfusion(lastInfusion);
+                    if(normalInfusion!=null){
+                        patientRegistry.getOperator(lastInfusion.getTenantId(), lastInfusion.getPatientCode()).setBindDeviceId(normalInfusion.getDeviceId());
+                        suppliers.add(()->{
+                            wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientCode(),lastInfusion.getTenantId());
+                            return null;
+                        });
+                    }
+                }
+                if(clinicFinished){
+                    clinicService.resetClinic(device.getClinicId());
+                }
+                device.setMaster(true);
                 suppliers.add(()->{
-                    String newMasterId = master.get().getDeviceId();
-                    patientOperator.setBindDeviceId(newMasterId);
-                    //更换输注信息后,将最新的输注信息传输实时传输给前端
-                    wsPublishUtils.publishPatientMonitor(patientCode,hospitalId);
-                    wsPublishUtils.publishDeviceRepeat(hospitalId);
+                    currentPatientOperator.setBindDeviceId(deviceId);
                     return null;
                 });
-                if(CollectionUtil.size(currentBindDevices)==1){
-                    //泵重复—>正常
-                    update.lambda()
-                            .set(BusPatientEntity::getAlarm, null);
-                }
-                patientService.update(update);
-
-            }
-        }
-    }
-
-    /**
-     * 发生冲突时,病患信息处理,当泵所绑定病号发生变化时,处理泵现在所绑定病号信息
-     * @param device 设备运行数据
-     */
-    private void handleConflictCurrentPatient(BusDeviceRunningEntity device, List<Supplier<?>> suppliers){
-        String deviceId = device.getDeviceId();
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
-        String bindDeviceId = patientOperator.getBindDeviceId();
-        if(ObjectUtil.notEqual(deviceId,bindDeviceId)){
-            //泵号发生改变,获取病号绑定的泵信息,判断绑定的泵开始时间,将开始时间稍后的泵设置为主泵
-            DeviceOperator<DeviceCacheInfo> patientCurrentBindDevice = deviceRegistry.getOperator(bindDeviceId);
-            Date modifyTime = patientCurrentBindDevice.getModifyTime();
-            if (modifyTime==null||modifyTime.before(device.getModifyTime())) {
-                log.warn("病号:[{}],之前主泵为:[{}],现在主泵为:[{}]",device.getPatientCode(),bindDeviceId,deviceId);
-                //设置当前上传信息的泵为主泵,将旧泵设置为副泵,并更新病人绑定泵的消息
+            }else if(!clinicFinished){
+                //临床未结束,切换当前输注信息为主输注
+                patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
+                        .eq(BusPatientEntity::getCode,device.getPatientCode())
+                        .eq(BusPatientEntity::getTenantId,device.getTenantId())
+                        .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
                 device.setMaster(true);
-                deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>()
-                        .lambda()
-                        .eq(BusDeviceRunningEntity::getPatientCode,device.getPatientCode())
-                        .eq(BusDeviceRunningEntity::getTenantId,device.getTenantId())
-                        .set(BusDeviceRunningEntity::getMaster,false));
-            }else {
-                device.setMaster(false);
+                suppliers.add(()->{
+                    currentPatientOperator.setBindDeviceId(deviceId);
+                    return null;
+                });
             }
-            log.warn("病号:{}发生了泵重复",device.getPatientCode());
-            patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
-                    .eq(BusPatientEntity::getCode,device.getPatientCode())
-                    .eq(BusPatientEntity::getTenantId,device.getTenantId())
-                    .set(Boolean.TRUE.equals(device.getMaster()),BusPatientEntity::getInfusionId,device.getInfusionId())
-                    .set(BusPatientEntity::getAlarm,PatientAlarmEnum.DEVICE_REPEAT));
-            suppliers.add(()->{
-                if(Boolean.TRUE.equals(device.getMaster())){
-                    patientCurrentBindDevice.setMaster(false);
-                }
-                wsPublishUtils.publishDeviceRepeat(device.getTenantId());
-                return null;
-            });
         }
     }
 
@@ -357,76 +208,66 @@ public class DeviceInfoListener {
      * @param deviceOperator 设备数据操作符
      * @param cacheOperation 缓存操作
      */
-    private BusInfusionHistoryEntity handleInfusionHistory(BusDeviceRunningEntity device, DeviceOperator<DeviceCacheInfo> deviceOperator, List<Supplier<?>> cacheOperation) {
+    private BusInfusionHistoryEntity handleInfusionHistory(BusDeviceRunningEntity device, DeviceOperator deviceOperator, List<Supplier<?>> cacheOperation) {
+        PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode(),MapUtil.of("startTime", device.getStartTime()));
+        device.setClinicId(patientOperator.getClinicId());
+        device.setPatientId(patientOperator.getPatientId());
         BusInfusionHistoryEntity infusionHistory = BusInfusionHistoryEntity.parseRunningInfo(device);
         String originInfusionId = deviceOperator.getInfusionId();
-        if (device.isNewInfusion()) {
-            //检测数据库是否存在该输注信息
-            infusionHistory.setId(String.valueOf(IdWorker.getId()));
+        if(ObjectUtil.equal(device.getDeviceId(),patientOperator.getBindDeviceId())){
+            device.setMaster(true);
+        }
+        if (isNewInFusion(device.getDeviceId(),device.getClassification())) {
+            //结束其余输注信息
+            infusionHistory.setId(IdWorker.getIdStr());
+            infusionHistory.setFinished(false);
+            device.setNewInfusion(true);
             infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
-                    .eq(BusInfusionHistoryEntity::getDeviceId,device.getDeviceId())
+                    .eq(BusInfusionHistoryEntity::getPatientCode,device.getPatientCode())
+                    .eq(BusInfusionHistoryEntity::getTenantId,device.getTenantId())
                     .eq(BusInfusionHistoryEntity::getFinished,false)
                     .set(BusInfusionHistoryEntity::getFinished,true));
-            infusionHistoryService.save(infusionHistory);
         }else {
             infusionHistory.setId(originInfusionId);
-            infusionHistoryService.updateById(infusionHistory);
         }
         device.setInfusionId(infusionHistory.getId());
         cacheOperation.add(()->{
-            deviceOperator.setInfusionId(device.getInfusionId());
+            if(device.isNewInfusion()){
+                deviceOperator.setInfusionId(device.getInfusionId());
+                deviceOperator.setClassification(device.getClassification());
+            }
             return null;
         });
         return infusionHistory;
     }
 
     /**
-     * 处理输注信息
-     * @param device 设备运行数据
-     * @param deviceOperator 设备操作符
-     * @param cacheOperation 缓存操作
+     * 描述: 处理输注参数
+     * @author lifang
+     * @date 2022/5/30 14:04
+     * @param device
+     * @param deviceOperator
+     * @param cacheOperation
      */
-    private BusInfusionHistoryEntity handleInfusion(BusDeviceRunningEntity device, DeviceOperator<DeviceCacheInfo> deviceOperator, List<Supplier<?>> cacheOperation) {
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode(),MapUtil.of("startTime", device.getStartTime()));
-        device.setClinicId(patientOperator.getClinicId());
-
-        BusInfusionHistoryEntity infusionHistory = handleInfusionHistory(device, deviceOperator, cacheOperation);
+    private void handleInfusionModify(BusDeviceRunningEntity device, DeviceOperator deviceOperator, List<Supplier<?>> cacheOperation){
         BusInfusionModifyEntity busInfusionModify = BusInfusionModifyEntity.parseRunningInfo(device);
-        String signHex = busInfusionModify.signParam(sign);
+
+        String signHex = busInfusionModify.signParam();
         String infusionParam = deviceOperator.getInfusionParam();
-        //输注参数已发生变化
         if(ObjectUtil.notEqual(signHex,infusionParam)){
-            BusClinicEntity clinic = clinicService.getById(device.getClinicId());
+            device.setInfusionModify(true);
+            boolean clinicFinished = clinicService.isFinished(device.getClinicId());
             infusionModifyService.save(busInfusionModify);
             device.setInfusionModifyId(busInfusionModify.getId());
             device.setModifyTime(busInfusionModify.getModifyTime());
-            //参数发生变化后,进行判断
-            if(clinic!=null&&Boolean.TRUE.equals(clinic.getFinished())&&device.isNewInfusion()){
-                //若临床已结束,则只有新的输注能够进行泵冲突处理
-                handlePatient(device,cacheOperation);
-                clinicService
-                        .update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,patientOperator.getClinicId())
-                                .set(BusClinicEntity::getFinished,false));
-                cacheOperation.add(()->{
-                    //重启临床
-                    wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
-                    return null;
-                });
-            } else if(clinic!=null&&!Boolean.TRUE.equals(clinic.getFinished())){
-                handlePatient(device,cacheOperation);
-            }
+            handlePatient(device,clinicFinished,cacheOperation);
             cacheOperation.add(()->{
                 deviceOperator.setInfusionParam(signHex);
                 deviceOperator.setModifyTime(device.getUploadTime());
                 return null;
             });
+            device.setIsUndo(false);
         }else {
-//            String bindDeviceId = patientOperator.getBindDeviceId();
-//            if (device.getDeviceId().equals(bindDeviceId)) {
-//                device.setMaster(true);
-//            }else {
-//                device.setMaster(false);
-//            }
             //填充当前参数修改记录id
             BusInfusionModifyEntity modify =infusionModifyService.recentModify(device.getClinicId(),device.getTenantId());
             if(modify==null){
@@ -435,7 +276,6 @@ public class DeviceInfoListener {
             }
             device.setInfusionModifyId(modify.getId());
         }
-        return infusionHistory;
     }
 
 
@@ -473,33 +313,33 @@ public class DeviceInfoListener {
             //获取上一状态下的报警信息
             String lastAlarmSign = deviceOperator.getAlarmOrWarn();
             BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.parseHistory(history);
-            String alarmSign = alarm.signParm(sign);
+            String alarmSign = alarm.signParm();
 
             if(StrUtil.isBlank(lastAlarmSign)||!alarmSign.equals(lastAlarmSign)){
                 //报警及提示发生变化,判断具体变化是由报警引起还是由提示引起
-                BusDeviceRunningEntity lastRunning = deviceRunningService.getOne(new QueryWrapper<BusDeviceRunningEntity>().lambda().eq(BusDeviceRunningEntity::getDeviceId, history.getDeviceId()));
+                BusInfusionHistoryEntity lastInfusion = infusionHistoryService.lastInfusion(history.getDeviceId());
 
                 int change=5;
-                if(ObjectUtil.isNotNull(lastRunning)){
+                if(ObjectUtil.isNotNull(lastInfusion)){
                     //防止重复插入
-                    if(ObjectUtil.equal(lastRunning.getAlarm(),history.getAlarm())){
+                    if(ObjectUtil.equal(lastInfusion.getAlarm(),history.getAlarm())){
                         alarm.setAlarm(false);
                         alarm.setAlarmState(null);
                         --change;
                     }
-                    if (ObjectUtil.equal(lastRunning.getWarnAnalgesicPoor(), history.getWarnAnalgesicPoor())) {
+                    if (ObjectUtil.equal(lastInfusion.getWarnAnalgesicPoor(), history.getWarnAnalgesicPoor())) {
                         alarm.setWarnAnalgesicPoor(false);
                         --change;
                     }
-                    if (ObjectUtil.equal(lastRunning.getWarnFlow(), history.getWarnFlow())) {
+                    if (ObjectUtil.equal(lastInfusion.getWarnFlow(), history.getWarnFlow())) {
                         alarm.setWarnFlow(null);
                         --change;
                     }
-                    if (ObjectUtil.equal(lastRunning.getWarnLowBattery(), history.getWarnLowBattery())) {
+                    if (ObjectUtil.equal(lastInfusion.getWarnLowBattery(), history.getWarnLowBattery())) {
                         alarm.setWarnLowBattery(false);
                         --change;
                     }
-                    if (ObjectUtil.equal(lastRunning.getWarnWillFinished(), history.getWarnWillFinished())) {
+                    if (ObjectUtil.equal(lastInfusion.getWarnWillFinished(), history.getWarnWillFinished())) {
                         alarm.setWarnWillFinished(false);
                         --change;
                     }

+ 5 - 3
coffee-system/src/main/resources/mapper/bus/BusClinicMapper.xml

@@ -106,8 +106,11 @@
                 <if test="query.patientCode!=null">
                     and patient_code like concat('%',#{query.patientCode},'%')
                 </if>
-                <if test="query.ward!=null">
-                    and ward=#{query.ward}
+                <if test="query.ward != null and query.ward.size > 0">
+                    and ward in
+                    <foreach item="w" index="index" collection="query.ward" open="(" separator="," close=")">
+                        #{w, jdbcType=VARCHAR}
+                    </foreach>
                 </if>
                 <if test="query.bedNo!=null">
                     and bed_no like concat('%',#{query.bedNo},'%')
@@ -118,7 +121,6 @@
             </where>
 
             ) as c
-            left join  bus_patient  as p on c.id=p.clinic_id
             left join  (select clinic_id,count(1) as infusion_count from bus_infusion_history GROUP BY clinic_id) as i on i.clinic_id=c.id
             left join (select clinic_id,count(1) as eval_count from bus_evaluation  GROUP BY clinic_id) as eval on eval.clinic_id=c.id
             order by c.monitor_start_time desc

+ 27 - 23
coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -10,14 +10,14 @@
             <result column="ward" property="ward"/>
             <result column="bed_no" property="bedNo"/>
             <result column="clinic_name" property="clinicName"/>
-            <result column="device_running_id" property="deviceRunningId"/>
             <result column="device_id" property="deviceId"/>
             <result column="device_alias" property="deviceAlias"/>
             <result column="device_run_state" property="deviceRunState"/>
             <result column="clinic_id" property="clinicId"/>
             <result column="device_alarm" property="deviceAlarm" />
             <result column="infusion_start_time" property="infusionStartTime"/>
-            <result column="master" property="master"/>
+            <result column="infusion_id" property="infusionId"/>
+            <result column="master_infusion_id" property="masterInfusionId"/>
         </resultMap>
 
         <resultMap id="monitorResult" type="com.coffee.bus.service.dto.PatientMonitorResult">
@@ -34,7 +34,7 @@
             <result column="clinic_id" property="clinicId"/>
             <result column="patient_gender" property="gender"/>
             <result column="infusion_finished" property="infusionFinished"/>
-            <result column="ward" property="ward" typeHandler="com.coffee.bus.config.mybaits.WardHandler"/>
+            <result column="ward" property="ward"/>
             <result column="bed_no" property="bedNo"/>
             <result column="total_dose" property="totalDose"/>
             <result column="first_dose" property="firstDose"/>
@@ -101,6 +101,7 @@
         <select id="selectRepeatDevice" resultMap="repeatDeviceResult">
                      SELECT
              p.code as code,
+             p.infusion_id as master_infusion_id,
              c.patient_gender  as gender,
              c.`patient_name` as name,
              c.patient_age as age,
@@ -108,17 +109,15 @@
              c.bed_no,
              c.id as clinic_id,
              c.`surgery_name` as clinic_name,
-             r.id as device_running_id,
-             r.device_id as device_id,
+             i.device_id as device_id,
+             i.id as infusion_id,
              d.alias as device_alias,
-             r.run_state as device_run_state,
-             r.alarm as device_alarm,
-             r.start_time as infusion_start_time,
-             r.master
-            FROM (SELECT `name`,gender,CODE FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
-            join (SELECT * from bus_device_running where monitor_type=1 ) as r on p.CODE=r.patient_code
-            join  (select * from bus_infusion_history where is_undo=0) as i on i.id=r.infusion_id
-            join (select device_id,alias from bus_device) as d on d.device_id=r.device_id
+             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
+            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 ) AS c ON  c.`patient_code`=p.code;
         </select>
 
@@ -157,8 +156,6 @@
             i.clinic_id as clinic_id,
             i.classification as classification,
             i.data_number as data_number,
-            i.ward as ward,
-            i.bed_no as bed_no,
             i.total_dose as total_dose,
             i.first_dose as first_dose,
             i.remain_dose as remain_dose,
@@ -203,7 +200,9 @@
             c.ana_type as ana_type,
             c.anal_type as anal_type,
             c.surgery_doctor as surgery_doctor,
-            c.surgery_name as surgery_name
+            c.surgery_name as surgery_name,
+            c.ward as ward,
+            c.bed_no as bed_no
             from
             (select * from bus_patient
             <where>
@@ -213,7 +212,7 @@
             </where>
             )
             as p
-            left join
+            join
             (select * from bus_infusion_history
             <where>
                 is_undo='0'
@@ -288,7 +287,7 @@
                     and monitor_start_time &gt; #{query.timeRange[0]} and  monitor_start_time &lt; #{query.timeRange[1]}
                 </if>
             </where>
-            ) c on i.clinic_id=c.id
+            ) c on p.clinic_id=c.id
             <if test="query.bedNo!=null || query.name!=null || query.code!=null || query.anaDoctor!=null || query.surgeName!=null ||query.gender!=null ||query.anaType!=null">
                 <where>
                     (1=0
@@ -296,7 +295,7 @@
                         or i.bed_no LIKE concat('%', #{query.bedNo}, '%')
                     </if>
                     <if test="query.name!=null">
-                        or p.`name` LIKE concat('%', #{query.name}, '%')
+                        or c.`name` LIKE concat('%', #{query.name}, '%')
                     </if>
                     <if test="query.code!=null">
                         or p.`code` LIKE concat('%', #{query.code}, '%')
@@ -308,7 +307,7 @@
                         or c.`surgery_name` like concat('%',#{query.surgeName}, '%')
                     </if>
                     <if test="query.gender!=null">
-                        or p.gender LIKE concat('%', #{query.gender}, '%')
+                        or c.gender LIKE concat('%', #{query.gender}, '%')
                     </if>
                     <if test="query.anaType!=null">
                         or c.ana_type LIKE concat('%', #{query.anaType}, '%')
@@ -325,8 +324,7 @@
             p.`code` as patient_code,
             i.device_id as device_id,
             i.clinic_id as clinic_id,
-            i.ward as ward,
-            i.bed_no as bed_no,
+            i.classification as classification,
             i.total_dose as total_dose,
             i.first_dose as first_dose,
             i.remain_dose as remain_dose,
@@ -360,6 +358,8 @@
             i.remark as remark,
             i.type as device_type,
             d.alias as device_alias,
+            c.ward as ward,
+            c.bed_no as bed_no,
             c.finished as finished,
             c.`patient_name` as patient_name,
             c.patient_gender as gender,
@@ -386,7 +386,7 @@
             join
               bus_infusion_history as i on p.infusion_id=i.id
             join (select device_id,alias from bus_device) as d on d.device_id=i.device_id
-            left join bus_clinic c on i.clinic_id=c.id
+            left join bus_clinic c on p.clinic_id=c.id
             limit 1
         </select>
 
@@ -406,4 +406,8 @@
                 </if>
             </where>
         </select>
+
+    <select id="monitorTotalCount" resultType="long">
+        select count(1) from (select * from bus_patient where tenant_id=#{tenantId}) as p JOIN (select * from bus_clinic where finished=0 and tenant_id=#{tenantId}) as c on p.clinic_id=c.id
+    </select>
     </mapper>