Explorar o código

fix 单元测试时 取消多租户限制
fix 阿里云设备更新时数据覆盖问题
update 病人缓存初始化时增加输注信息、临床信息
add 设备数据与参数修改数据绑定

18339543638 %!s(int64=3) %!d(string=hai) anos
pai
achega
72f672a45f
Modificáronse 23 ficheiros con 282 adicións e 137 borrados
  1. 1 1
      coffee-admin/Dockerfile
  2. 1 1
      coffee-admin/src/test/java/com/coffee/admin/BusDeviceTest.java
  3. 5 0
      coffee-framework/pom.xml
  4. 2 1
      coffee-framework/src/main/java/com/coffee/framework/config/mybatisplus/MybatisPlusConfig.java
  5. 2 2
      coffee-system/src/main/java/com/coffee/aliyun/AliyunIotSubscribeClient.java
  6. 8 4
      coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java
  7. 2 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusConMixEntity.java
  8. 5 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceHistoryEntity.java
  9. 7 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java
  10. 12 3
      coffee-system/src/main/java/com/coffee/bus/entity/BusPatientEntity.java
  11. 1 0
      coffee-system/src/main/java/com/coffee/bus/mapper/BusInfusionHistoryMapper.java
  12. 2 0
      coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
  13. 29 11
      coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java
  14. 0 2
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java
  15. 12 4
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java
  16. 7 6
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  17. 8 0
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  18. 45 1
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java
  19. 30 0
      coffee-system/src/main/java/com/coffee/bus/service/dto/PatientDeviceNoneResult.java
  20. 0 29
      coffee-system/src/main/java/com/coffee/bus/websocket/handler/DeviceInfoHook.java
  21. 30 40
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  22. 13 1
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/HisInfoListener.java
  23. 60 31
      coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 1 - 1
coffee-admin/Dockerfile

@@ -1,6 +1,6 @@
 FROM docker.io/java:8
 
-COPY target/coffee-admin.jar /pump.jar
+ADD target/coffee-admin.jar /pump.jar
 RUN bash -c "touch /pump.jar"
 #ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/pump.jar"]
 ENTRYPOINT ["java", "-jar", "/pump.jar"]

+ 1 - 1
coffee-admin/src/test/java/com/coffee/admin/BusDeviceTest.java

@@ -29,7 +29,7 @@ public class BusDeviceTest {
         device.setDeviceId("12345678910");
         device.setCreateBy("auto");
         device.setCreateTime(new Date());
-        deviceService.save(device);
+        deviceService.saveByDeviceId(device);
 
     }
 

+ 5 - 0
coffee-framework/pom.xml

@@ -37,6 +37,11 @@
             <groupId>com.alibaba</groupId>
             <artifactId>druid-spring-boot-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <!-- 系统模块 -->
         <dependency>
             <groupId>com.coffee</groupId>

+ 2 - 1
coffee-framework/src/main/java/com/coffee/framework/config/mybatisplus/MybatisPlusConfig.java

@@ -29,6 +29,7 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -138,7 +139,7 @@ public class MybatisPlusConfig {
             public boolean ignoreTable(String tableName) {
                 ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                 //非用户请求,即来自程序自身,则忽略
-                if(request==null){
+                if(request==null||request.getRequest() instanceof MockHttpServletRequest){
                     return true;
                 }
                 StringBuffer url = request.getRequest().getRequestURL();

+ 2 - 2
coffee-system/src/main/java/com/coffee/aliyun/AliyunIotSubscribeClient.java

@@ -1,5 +1,6 @@
 package com.coffee.aliyun;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.binary.Base64;
@@ -58,8 +59,7 @@ public class AliyunIotSubscribeClient {
         } catch (UnknownHostException e) {
             e.printStackTrace();
         }
-        String ip = addr.getHostAddress();
-        this.clientId = consumerGroupId + ip;
+        this.clientId = IdWorker.getIdStr();
     }
 
     private String accessKey;

+ 8 - 4
coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java

@@ -141,7 +141,10 @@ public class BusPatientController  {
     @SaCheckPermission("device:patient:edit")
     @ApiOperation(value = "病人当前监控时间重启",notes = "当结束临床后有新的输注信息产生,那么病人监控会重新显示,此时监控时间不会重新计算,需先调用该接口,权限标识为【device:patient:edit】")
     public R reset(@PathVariable("patientCode")String patientCode){
-        return R.success(patientService.update(new UpdateWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode,patientCode).set(BusPatientEntity::getTmpFinished,false)));
+        return R.success(patientService.update(new UpdateWrapper<BusPatientEntity>()
+                .lambda()
+                .eq(BusPatientEntity::getCode,patientCode)
+                .set(BusPatientEntity::getTmpFinished,false)));
     }
 
 
@@ -188,8 +191,9 @@ public class BusPatientController  {
     //todo
     @PostMapping("/edit")
     @SaCheckPermission("device:patient:edit")
-    @ApiOperation(value = "编辑病人信息及病人当前手术信息",notes = "编辑病人信息及病人当前手术信息,权限标识为【device:patient:edit】")
-    public R edit(){
+    @ApiOperation(value = "编辑病人当前手术信息",notes = "编辑病人信息及病人当前手术信息,权限标识为【device:patient:edit】")
+    public R edit(@RequestBody BusClinicEntity clinic){
+        patientService.manualEdit(clinic);
         return R.success();
     }
 
@@ -204,7 +208,7 @@ public class BusPatientController  {
                     .eq(BusPatientEntity::getCode, patientCode).last("limit 1"));
             BusInfusionHistoryEntity infusion = infusionService.getById(patient.getInfusionId());
             result.setPatient(patient);
-            result.setInfusion( infusion);
+            result.setInfusion(infusion);
             if(StrUtil.isNotEmpty(infusion.getClinicId())){
                 result.setClinic(clinicService.getById(infusion.getClinicId()));
             }

+ 2 - 0
coffee-system/src/main/java/com/coffee/bus/entity/BusConMixEntity.java

@@ -36,4 +36,6 @@ public class BusConMixEntity extends TenantGenericEntity<String,String> {
 
     @ApiModelProperty(value = "混合常量类型",example = "ward,surgery,asa,anaesthesia,anal,drugCate,entrust")
     private ConstantMixEnum type;
+
+    private String code;
 }

+ 5 - 0
coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceHistoryEntity.java

@@ -47,6 +47,10 @@ public class BusDeviceHistoryEntity extends TenantGenericEntity<String,String> {
     @JsonIgnoreProperties
     private String infusionId;
 
+    @ApiModelProperty(value = "输注修改记录id")
+    @JsonIgnoreProperties
+    private String infusionModifyId;
+
 
     @ApiModelProperty(value = "总量",readOnly = true)
     @Max(value = 999,message = "总量最大值不得超过999")
@@ -195,6 +199,7 @@ public class BusDeviceHistoryEntity extends TenantGenericEntity<String,String> {
         entity.setClassification(running.getClassification());
         entity.setTenantId(running.getTenantId());
         entity.setInfusionId(running.getInfusionId());
+        entity.setInfusionModifyId(running.getInfusionModifyId());
 
         entity.setTotalDose(running.getTotalDose());
         entity.setFirstDose(running.getFirstDose());

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

@@ -214,4 +214,11 @@ public class BusDeviceRunningEntity extends TenantGenericEntity<String,String> {
     @ApiModelProperty(value = "数据上传时间",readOnly = true,hidden = true)
     @JsonIgnoreProperties(allowSetters = true)
     private Date uploadTime;
+
+    /**
+     * 当前运行状态所绑定的输注修改记录id,只在设备上传解析过程中使用,其他地方无用处
+     */
+    @TableField(exist = false)
+    @JsonIgnoreProperties
+    private String infusionModifyId;
 }

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

@@ -1,8 +1,6 @@
 package com.coffee.bus.entity;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.coffee.bus.bean.HisInfo;
 import com.coffee.bus.enums.PatientAlarmEnum;
@@ -54,7 +52,7 @@ public class BusPatientEntity extends TenantGenericEntity<String,String> {
     private Boolean tmpFinished;
 
     @TableField
-    @ApiModelProperty("当前病人监护结束时间")
+    @ApiModelProperty("病人最后一次手动监护结束时间")
     private Date monitorEndTime;
 
     @TableField
@@ -73,4 +71,15 @@ public class BusPatientEntity extends TenantGenericEntity<String,String> {
         patient.setTenantId(hisInfo.getHospitalId());
         return patient;
     }
+
+    public static BusPatientEntity of(BusClinicEntity clinic){
+        BusPatientEntity patient = new BusPatientEntity();
+        patient.setCode(clinic.getPatientCode());
+        patient.setName(clinic.getName());
+        patient.setGender(clinic.getPatientGender());
+        patient.setClinicId(clinic.getId());
+        patient.setTmpFinished(clinic.getFinished());
+        patient.setTenantId(clinic.getTenantId());
+        return patient;
+    }
 }

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

@@ -3,6 +3,7 @@ package com.coffee.bus.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * @author 龙三郎

+ 2 - 0
coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java

@@ -46,12 +46,14 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
                 //设备不存在,即缓存操作不存在
                 return null;
             }
+            //设备注册信息
             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.setAlarm(runningInfo.getAlarm());

+ 29 - 11
coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java

@@ -1,20 +1,18 @@
 package com.coffee.bus.registry.patient;
 
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.coffee.bus.entity.BusClinicEntity;
+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.PatientCacheInfo;
 import com.coffee.bus.service.LocalBusClinicService;
+import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.service.LocalBusPatientService;
 import com.coffee.common.cache.manager.ClusterConfigStorageManager;
-import com.coffee.common.cache.value.Value;
-import com.coffee.common.redis.RedisUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.python.antlr.ast.Str;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,6 +33,7 @@ public class ClusterPatientRegistry implements PatientRegistry {
     private final LocalBusPatientService patientService;
     private final ClusterConfigStorageManager configStorageManager;
     private final LocalBusClinicService clinicService;
+    private final LocalBusInfusionHistoryService infusionService;
     @Override
     @Transactional(rollbackFor = Exception.class)
     public PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode) {
@@ -50,31 +49,50 @@ public class ClusterPatientRegistry implements PatientRegistry {
             patient = patientService.getOne(new QueryWrapper<BusPatientEntity>()
                     .lambda().eq(BusPatientEntity::getCode, patientCode)
                     .eq(BusPatientEntity::getTenantId, hospitalId));
+            boolean insert=false;
             if(patient==null){
+                insert=true;
                 patient=new BusPatientEntity();
                 patient.setCode(patientCode);
+                patient.setClinicId("-1");
                 patient.setTenantId(hospitalId);
-                try {
-                    log.info("医院[{}]新增病号数据[{}]",hospitalId,patientCode);
-                    patientService.save(patient);
-                }catch (DuplicateKeyException e){
-                    log.warn("病号重复插入,医院id:[{}],病号:[{}]",hospitalId,patientCode);
-                }
             }
             patientOperator.setCode(patientCode);
             patientOperator.setTenantId(hospitalId);
             patientOperator.setName(patient.getName());
             patientOperator.setGender(patient.getGender());
+
             BusClinicEntity clinic = clinicService.recentClinicByPatientCode(hospitalId, patientCode);
             //不存在临床或临床已结束
             if(clinic==null||Boolean.TRUE.equals(clinic.getFinished())){
                 clinicService.asyncFromHis(hospitalId,patientCode);
             }else {
+                //填充临床信息
+                patient.setName(clinic.getName());
+                patient.setTmpFinished(clinic.getFinished());
+                patient.setClinicId(clinic.getId());
+                patient.setTmpFinished(clinic.getFinished());
+
                 patientOperator.setWard(clinic.getWard());
                 patientOperator.setBedNo(clinic.getBedNo());
                 patientOperator.setClinicId(clinic.getId());
+                patientOperator.setFinished(clinic.getFinished());
+            }
+            //填充输注信息
+            BusInfusionHistoryEntity infusion = infusionService.recentInfusionByPatientCode(hospitalId, patientCode);
+            if(infusion!=null){
+                patient.setInfusionId(infusion.getId());
+                patient.setMonitorStartTime(infusion.getStartTime());
+                patient.setMonitorEndTime(infusion.getUndoTime());
+            }
+            if(insert){
+                try {
+                    log.info("医院[{}]新增病号数据[{}]",hospitalId,patientCode);
+                    patientService.save(patient);
+                }catch (DuplicateKeyException e){
+                    log.warn("病号重复插入,医院id:[{}],病号:[{}]",hospitalId,patientCode);
+                }
             }
-            //将临床数据拉入缓存,获取最新的临床信息 todo
         }
         return patientOperator;
     }

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

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.coffee.bus.entity.BusClinicEntity;
 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.common.crud.BaseService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 12 - 4
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java

@@ -36,10 +36,18 @@ import java.util.stream.Collectors;
  */
 @Service
 public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMapper, BusDeviceRunningEntity,String> {
-    private final LocalBusInfusionHistoryService infusionHistoryService;
-    private final PatientRegistry patientRegistry;
-    private final LocalBusPatientService patientService;
-    private final LocalBusClinicService clinicService;
+    @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;

+ 7 - 6
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java

@@ -2,6 +2,7 @@ package com.coffee.bus.service;
 
 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.BusClinicEntity;
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.entity.BusDeviceEntity;
@@ -91,17 +92,17 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
     public void saveByDeviceId(BusDeviceEntity entity) {
         // 查询设备是否存在,无视逻辑删除
         BusDeviceEntity old = deviceMapper.selectOneByDeviceId(entity.getDeviceId());
-        // 设备存在,且处于删除状态,首先去掉逻辑删除标志
+        // 设备存在,且处于删除状态,首先去掉逻辑删除标志 ?? 逻辑删除后设备数据是否不再接收
         if (Objects.nonNull(old) && old.getIsDelete() == 1){
             deviceMapper.notDelete(entity.getDeviceId());
         }
         // 设备存在
         if (Objects.nonNull(old)){
-            // 添加时间
-            entity.setCreateTime(new Date());
-            // 更新设备
-            this.update(entity,new QueryWrapper<BusDeviceEntity>().lambda()
-                    .eq(BusDeviceEntity::getDeviceId,entity.getDeviceId()));
+            // 更新设备 ? 这里阿里云参数还会变化吗? 是不是需要每一次都更新,不可全部都更新,会影响其他数据为null
+            this.update(new UpdateWrapper<BusDeviceEntity>()
+                            .lambda()
+                            .eq(BusDeviceEntity::getDeviceId,entity.getDeviceId())
+                            .set(BusDeviceEntity::getConfig,entity.getConfig()));
         }else {
             // 添加设备
             this.save(entity);

+ 8 - 0
coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java

@@ -1,5 +1,6 @@
 package com.coffee.bus.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.mapper.BusInfusionHistoryMapper;
 import com.coffee.common.crud.BaseService;
@@ -28,4 +29,11 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
     public void validateBeforeDelete(String id) {
 
     }
+
+    public BusInfusionHistoryEntity recentInfusionByPatientCode(String hospitalId, String patientCode) {
+        return this
+                .getOne(new QueryWrapper<BusInfusionHistoryEntity>()
+                .lambda()
+                .eq(BusInfusionHistoryEntity::getTenantId,hospitalId).eq(BusInfusionHistoryEntity::getPatientCode,patientCode).last("limit 1"));
+    }
 }

+ 45 - 1
coffee-system/src/main/java/com/coffee/bus/service/LocalBusPatientService.java

@@ -1,20 +1,31 @@
 package com.coffee.bus.service;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.coffee.bus.entity.BusClinicEntity;
 import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.entity.PatientDeviceRepeatDomain;
 import com.coffee.bus.entity.PatientMonitorDomain;
+import com.coffee.bus.mapper.BusClinicMapper;
 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.service.dto.PatientDeviceNoneResult;
 import com.coffee.bus.service.dto.PatientDeviceRepeatResult;
 import com.coffee.bus.service.dto.PatientMonitorQuery;
 import com.coffee.common.crud.BaseService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -26,9 +37,14 @@ import java.util.*;
  * @createTime 2022年03月19日 09:27:00
  */
 @Service
-@AllArgsConstructor
 @Slf4j
 public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPatientEntity,String> {
+    @Autowired
+    @Lazy
+    private LocalBusClinicService clinicService;
+    @Autowired
+    @Lazy
+    private PatientRegistry patientRegistry;
     @Override
     public void validateBeforeSave(BusPatientEntity entity) {
 
@@ -103,4 +119,32 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         IPage<PatientMonitorDomain> result = this.baseMapper.selectMonitor(page,query);
         return result.getRecords();
     }
+
+    /**
+     * 病人手动更新当前监控的临床信息
+     * @param clinic
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void manualEdit(BusClinicEntity clinic) {
+        //先更新手术信息
+        clinicService.saveOrUpdate(clinic);
+        //后更新病人信息
+        BusPatientEntity patient = BusPatientEntity.of(clinic);
+        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(patient.getTenantId(), patient.getCode());
+        if (StrUtil.isEmpty(patientOperator.getCode())) {
+            this.save(patient);
+            patientOperator.setCode(patient.getCode());
+            patientOperator.setTenantId(patient.getTenantId());
+        }else {
+            BusPatientEntity existPatient = this.getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode, patient.getCode()).last("limit 1"));
+            patient.setId(existPatient.getId());
+            this.updateById(patient);
+        }
+        patientOperator.setClinicId(patient.getClinicId());
+        patientOperator.setName(patient.getName());
+        patientOperator.setBedNo(clinic.getBedNo());
+        patientOperator.setWard(clinic.getWard());
+
+
+    }
 }

+ 30 - 0
coffee-system/src/main/java/com/coffee/bus/service/dto/PatientDeviceNoneResult.java

@@ -1,5 +1,7 @@
 package com.coffee.bus.service.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler;
 import com.coffee.bus.enums.DeviceAlarmEnum;
 import com.coffee.bus.enums.DeviceEnum;
 import com.coffee.common.enums.SexEnum;
@@ -25,6 +27,7 @@ public class PatientDeviceNoneResult {
     private String name;
 
     @ApiModelProperty("病患性别")
+    @TableField(typeHandler = MybatisEnumTypeHandler.class)
     private SexEnum gender;
 
     @ApiModelProperty("病号")
@@ -44,4 +47,31 @@ public class PatientDeviceNoneResult {
 
     @ApiModelProperty("麻醉医生")
     private String anaDoctor;
+
+    @ApiModelProperty("体重")
+    private String weight;
+
+    @ApiModelProperty("身高")
+    private String height;
+
+    @ApiModelProperty("麻醉方式")
+    private String anaType;
+
+    @ApiModelProperty("镇痛方式")
+    private String analType;
+
+    @ApiModelProperty("手术医生")
+    private String surgeryDoctor;
+
+    @ApiModelProperty("手术名称")
+    private String surgeryName;
+
+    @ApiModelProperty("配方")
+    private String formula;
+
+    @ApiModelProperty("临床是否结束")
+    private Boolean finished;
+
+    @ApiModelProperty("配置人员")
+    private String configPerson;
 }

+ 0 - 29
coffee-system/src/main/java/com/coffee/bus/websocket/handler/DeviceInfoHook.java

@@ -1,29 +0,0 @@
-package com.coffee.bus.websocket.handler;
-
-import com.coffee.bus.entity.BusDeviceRunningEntity;
-import com.coffee.bus.registry.device.DeviceOperator;
-import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
-
-import java.util.List;
-import java.util.function.Supplier;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName DeviceInfoHandler.java
- * @Description 设备信息处理钩子函数
- * @createTime 2022年04月24日 15:45:00
- */
-public interface DeviceInfoHook {
-
-    /**
-     * 输注参数发生变化
-     * @param device 设备数据
-     * @param deviceOperator 设备操作符
-     * @param delayOperation  延迟操作
-     * @param newInfusion 是否为新的输注
-     */
-    void infusionParamModify(BusDeviceRunningEntity device, DeviceOperator<DeviceCacheInfo> deviceOperator,  List<Supplier<?>> delayOperation,boolean newInfusion);
-
-
-}

+ 30 - 40
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -9,6 +9,7 @@ import cn.hutool.crypto.SignUtil;
 import cn.hutool.crypto.asymmetric.Sign;
 import cn.hutool.crypto.asymmetric.SignAlgorithm;
 import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -26,7 +27,6 @@ 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.websocket.handler.DeviceInfoHook;
 import com.coffee.common.config.websocket.WebSocketConstant;
 import com.coffee.common.enums.SexEnum;
 import lombok.AllArgsConstructor;
@@ -78,7 +78,6 @@ public class DeviceInfoListener {
 
     private final LocalBusClinicService clinicService;
 
-    private final List<DeviceInfoHook> deviceInfoHooks;
     /**
      * 监听上传的数据信息,
      * 若设备详情发生变化,则及时通知相应的ws通道
@@ -113,49 +112,30 @@ public class DeviceInfoListener {
                 throw new RuntimeException("设备数据中分包标识不能为空");
             }
 
-
             log.info("接收到设备数据:[{}]",infoEvent.getContent().toString());
             AtomicBoolean newInfusion=new AtomicBoolean(false);
-            AtomicBoolean valid = new AtomicBoolean(true);
             //缓存操作
             List<Supplier<?>> cacheOperation=new ArrayList<>();
             //处理设备运行数据,     判断是否为注册后第一次开机,判断是否为新的输注信息
             boolean first = handleRunningInfo(device, deviceOperator,newInfusion,cacheOperation);
-
-            //临床已结束,且设备非主设备
-            if(!valid.get()){
-                log.error("设备[{}]所绑定临床已结束且未关机,将数据[{}]丢弃",device.getDeviceId(),device.toString());
-                return;
-            }else {
-                //todo 重启临床数据
-            }
-
             //处理输注参数
             handleInfusion(device,deviceOperator,newInfusion,cacheOperation);
-
             //处理历史运行数据
             BusDeviceHistoryEntity history=handleRunningHistory(device);
             //处理报警信息
             handleAlarm(history,deviceOperator,cacheOperation);
-
-            //如果是主泵信息且产生了新的输注,则与当前病号进行绑定
-            if(Boolean.TRUE.equals(device.getMaster())&&newInfusion.get()){
-                patientService.update(new UpdateWrapper<BusPatientEntity>()
-                        .lambda()
-                        .eq(BusPatientEntity::getCode,device.getPatientCode())
-                        .eq(BusPatientEntity::getTenantId,device.getTenantId())
-                        .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
-            }
-
             //todo 流速图处理
             if(first){
+                //首次上传数据,开启病号监控时长
+                patientService.update(new UpdateWrapper<BusPatientEntity>()
+                        .lambda().eq(BusPatientEntity::getCode,device.getPatientCode())
+                        .eq(BusPatientEntity::getTenantId,device.getTenantId()).set(BusPatientEntity::getMonitorStartTime,device.getStartTime()));
                 deviceUsingService.save(device);
             }else {
                 deviceUsingService.updateById(device);
             }
             //医院相关配置处理
             handleHospitalConfig(device,cacheOperation);
-            /****************处理泵与患者关系****************/
 
             //则推送设备上报消息
             String topic = WebSocketConstant.getDeviceInfoDetailTopic(null, device.getId(), device.getTenantId());
@@ -183,22 +163,12 @@ public class DeviceInfoListener {
         device.setIsUndo(deviceOperator.getUndo());
         //todo 这部分操作交由上游处理
         device.setTenantId(deviceOperator.getTenantId());
-
-//        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
-//        Boolean finished = patientOperator.getFinished();
         if(!classification.equals(originClassify)){
             newInfusion.set(true);
             //启动新的输注,则撤泵标识取消
             device.setIsUndo(false);
             //分包标识发生了改变,设备开机时间重新计算
             device.setStartTime(new Date());
-            //todo 处理临床数据
-//            if(Boolean.TRUE.equals(finished)){
-//                将临床重新开启
-//                clinicService
-//                        .update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,patientOperator.getClinicId())
-//                                .set(BusClinicEntity::getFinished,false));
-//            }
         }
         boolean first=false;
         if(StrUtil.isNullOrUndefined(usingId)){
@@ -396,18 +366,38 @@ public class DeviceInfoListener {
         String infusionParam = deviceOperator.getInfusionParam();
         //输注参数已发生变化
         if(ObjectUtil.notEqual(signHex,infusionParam)){
-            //输注参数改变
             infusionModifyService.save(busInfusionModify);
-            //输注参数变化后重启临床并且主副泵判断 todo
-            if (CollectionUtil.isNotEmpty(deviceInfoHooks)) {
-                deviceInfoHooks.forEach(hook->hook.infusionParamModify(device,deviceOperator,cacheOperation,newInfusion.get()));
+            device.setInfusionModifyId(busInfusionModify.getId());
+            //参数发生变化后,进行判断
+            PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(device.getTenantId(),device.getPatientCode());
+
+            if(Boolean.TRUE.equals(patientOperator.getFinished())){
+                //若临床已结束,则只有新的输注能够进行泵冲突处理
+                if(newInfusion.get()){
+                    handlePatient(device,cacheOperation);
+                    clinicService
+                            .update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,patientOperator.getClinicId())
+                                    .set(BusClinicEntity::getFinished,false));
+                    cacheOperation.add(()->{
+                        //重启临床
+                        patientOperator.setFinished(false);
+                        return null;
+                    });
+                }
+            }else {
+                handlePatient(device,cacheOperation);
             }
-            handlePatient(device,cacheOperation);
             //todo 输注参数发生变化
             cacheOperation.add(()->{
                 deviceOperator.setInfusionParam(signHex);
                 return null;
             });
+        }else {
+            //填充当前参数修改记录id
+            BusInfusionModifyEntity modify = infusionModifyService.getOne(new QueryWrapper<BusInfusionModifyEntity>().lambda()
+                    .select(BusInfusionModifyEntity::getId)
+                    .eq(BusInfusionModifyEntity::getInfusionId, device.getInfusionId()).orderByDesc(BusInfusionModifyEntity::getModifyTime).last("limit 1"));
+            device.setInfusionModifyId(modify.getId());
         }
     }
 

+ 13 - 1
coffee-system/src/main/java/com/coffee/bus/websocket/listener/HisInfoListener.java

@@ -99,6 +99,7 @@ public class HisInfoListener {
         //同一手术信息病号、床号是否发生了变化
         Boolean changed=null;
         if(existClinic==null){
+            //找到该次病人首次监控开始时间
             //手术信息不存在
             clinicService.save(clinic);
             //常量信息异步处理,失败了无需关注
@@ -203,13 +204,24 @@ public class HisInfoListener {
     private void changedRunningClinic(BusClinicEntity clinic,PatientOperator<PatientCacheInfo> patientOperator){
         String originClinic = patientOperator.getClinicId();
         if(!clinic.getId().equals(originClinic)){
+            BusInfusionHistoryEntity infusion =
+                    infusionHistoryService.getOne(new QueryWrapper<BusInfusionHistoryEntity>().lambda().eq(BusInfusionHistoryEntity::getClinicId, clinic.getId())
+                            .orderByDesc(BusInfusionHistoryEntity::getStartTime).last("limit 1"));
             //临床信息发生变化
             if(patientOperator.getFinished()){
                 patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
                         .eq(BusPatientEntity::getCode,clinic.getPatientCode())
                         .eq(BusPatientEntity::getTenantId,clinic.getTenantId())
-                        .set(BusPatientEntity::getTmpFinished,false));
+                        .set(BusPatientEntity::getTmpFinished,false)
+                        .set(BusPatientEntity::getMonitorStartTime,infusion.getStartTime()));
                 patientOperator.setFinished(false);
+            }else {
+                //重新计算病人该次临床的开始时间
+                patientService
+                        .update(new UpdateWrapper<BusPatientEntity>().lambda()
+                                .eq(BusPatientEntity::getCode,clinic.getPatientCode())
+                                .eq(BusPatientEntity::getTenantId,clinic.getTenantId())
+                                .set(BusPatientEntity::getMonitorStartTime,infusion.getStartTime()));
             }
         }
         patientOperator.setClinicId(clinic.getId());

+ 60 - 31
coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -68,37 +68,66 @@
         <result column="monitor_start_time" property="monitorStartTime"/>
     </resultMap>
 
+    <resultMap id="deviceNone" type="com.coffee.bus.service.dto.PatientDeviceNoneResult">
+        <result column="name" property="name"/>
+        <result column="gender" property="gender" typeHandler="com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler"/>
+        <result column="code" property="code"/>
+        <result column="age" property="age"/>
+        <result column="ward" property="ward"/>
+        <result column="bed_no" property="bedNo"/>
+        <result column="clinic_name" property="clinicName"/>
+        <result column="weight" property="weight"/>
+        <result column="height" property="height"/>
+        <result column="ana_doctor" property="anaDoctor"/>
+        <result column="ana_type" property="anaType"/>
+        <result column="anal_type" property="analType"/>
+        <result column="surgery_doctor" property="surgeryDoctor"/>
+        <result column="surgery_name" property="surgeryName"/>
+        <result column="formula" property="formula"/>
+        <result column="finished" property="finished"/>
+        <result column="config_person" property="configPerson"/>
+    </resultMap>
     <select id="selectRepeatDevice" resultMap="repeatDeviceResult">
-         SELECT
- p.name,
- p.gender,
- p.code,
- c.patient_age as age,
- c.ward,
- c.bed_no,
- c.`name` as clinic_name,
- d.id as device_running_id,
- d.device_id as device_id,
- d.alias as device_alias,
- d.run_state as device_run_state,
- d.alarm as device_alarm,
- d.start_time as infusion_start_time,
- d.master
-FROM (SELECT `name`,gender,CODE FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
-left join (SELECT * from bus_device_running where monitor_type=1 ) as d on p.CODE=d.patient_code
-left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code`=p.code;
+                 SELECT
+         p.name,
+         p.gender,
+         p.code,
+         c.patient_age as age,
+         c.ward,
+         c.bed_no,
+         c.`name` as clinic_name,
+         d.id as device_running_id,
+         d.device_id as device_id,
+         d.alias as device_alias,
+         d.run_state as device_run_state,
+         d.alarm as device_alarm,
+         d.start_time as infusion_start_time,
+         d.master
+        FROM (SELECT `name`,gender,CODE FROM bus_patient WHERE bus_patient.`alarm`=1) AS p
+        left join (SELECT * from bus_device_running where monitor_type=1 ) as d on p.CODE=d.patient_code
+        left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code`=p.code;
     </select>
-    <select id="selectNoneDevice" resultType="com.coffee.bus.service.dto.PatientDeviceNoneResult">
-SELECT
- p.name,
- p.gender,
- p.code,
- c.patient_age as age,
- c.ward,
- c.bed_no,
- c.`name` as clinic_name
-FROM (SELECT `name`,gender,CODE,tenant_id FROM bus_patient WHERE bus_patient.`alarm`=2 ) AS p
-left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code`=p.code;
+    <select id="selectNoneDevice" resultMap="deviceNone">
+        SELECT
+         p.name,
+         p.gender,
+         p.code,
+         c.patient_age as age,
+         c.ward,
+         c.bed_no,
+         c.`name` as clinic_name,
+         c.weight as weight,
+         c.height as height,
+         c.ana_doctor as ana_doctor,
+         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.formula as formula,
+         c.finished as finished,
+         c.config_person as config_person
+        FROM (SELECT `name`,gender,CODE,tenant_id FROM bus_patient WHERE bus_patient.`alarm`=2 ) AS p
+        left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code`=p.code;
     </select>
 
     <select id="selectMonitor" resultMap="monitorResult" parameterType="com.coffee.bus.service.dto.PatientMonitorQuery">
@@ -187,7 +216,7 @@ left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code
                 </choose>
                 <if test="query.warnAnalgesicPoor != false">or warn_analgesic_poor=1 </if>
                 <if test="query.warnLowBattery != false"> or warn_low_battery=1 </if>
-              )
+                )
             </if>
         </where>
         ) as i on p.infusion_id=i.id
@@ -195,7 +224,7 @@ left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code
         <where>
             <if test="query.blurry != null">
                 p.`name` like concat('%', #{query.blurry}, '%') or p.`code` like concat('%', #{query.blurry}, '%') or i.ward LIKE concat('%', #{query.blurry}, '%') OR i.bed_no LIKE concat('%', #{query.blurry}, '%')
-              </if>
+            </if>
         </where>
 
     </select>