Prechádzať zdrojové kódy

update 枚举类型处理类变为EnumTypeHandler
add his接收手术信息处理

18339543638 3 rokov pred
rodič
commit
6cfb2672e0
32 zmenil súbory, kde vykonal 416 pridanie a 337 odobranie
  1. 42 5
      coffee-system/src/main/java/com/coffee/bus/controller/BusConstantController.java
  2. 7 1
      coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceRunningController.java
  3. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusClinicEntity.java
  4. 4 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusConAlarmEntity.java
  5. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusConMixEntity.java
  6. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceAlarmEntity.java
  7. 3 3
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceEntity.java
  8. 4 4
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceHistoryEntity.java
  9. 6 5
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java
  10. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusHospitalConfigEntity.java
  11. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusHospitalLogEntity.java
  12. 12 4
      coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionHistoryEntity.java
  13. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionModifyEntity.java
  14. 2 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusPatientEntity.java
  15. 3 18
      coffee-system/src/main/java/com/coffee/bus/enums/DeviceStatusEnum.java
  16. 33 0
      coffee-system/src/main/java/com/coffee/bus/listener/event/bean/HisEvent.java
  17. 0 35
      coffee-system/src/main/java/com/coffee/bus/listener/event/bean/HistoryInfoEvent.java
  18. 1 1
      coffee-system/src/main/java/com/coffee/bus/registry/Registry.java
  19. 4 0
      coffee-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java
  20. 2 13
      coffee-system/src/main/java/com/coffee/bus/registry/device/ClusterDeviceRegistry.java
  21. 3 9
      coffee-system/src/main/java/com/coffee/bus/registry/device/DeviceRegistry.java
  22. 20 0
      coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
  23. 2 7
      coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java
  24. 23 0
      coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java
  25. 4 10
      coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientRegistry.java
  26. 1 25
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java
  27. 10 0
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java
  28. 2 2
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  29. 1 0
      coffee-system/src/main/java/com/coffee/bus/service/constant/AbstractConstantService.java
  30. 25 10
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  31. 190 0
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/HisInfoListener.java
  32. 0 169
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/HistoryInfoListener.java

+ 42 - 5
coffee-system/src/main/java/com/coffee/bus/controller/BusConstantController.java

@@ -1,7 +1,12 @@
 package com.coffee.bus.controller;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.coffee.bus.entity.BusConAlarmEntity;
+import com.coffee.bus.entity.BusConDoctor;
+import com.coffee.bus.entity.BusConMixEntity;
 import com.coffee.bus.enums.ConstantEnum;
 import com.coffee.bus.service.constant.AbstractConstantService;
 import com.coffee.common.entity.QueryParamEntity;
@@ -29,6 +34,25 @@ public class BusConstantController {
     private HashMap<ConstantEnum, AbstractConstantService> constantHashMap=new HashMap<>();
 
 
+    @ApiOperation("该接口仅用来展示 常量-医生 的数据接口,无任何实际意义")
+    @PostMapping("/doctor")
+    private R doctor(@RequestBody BusConDoctor doctor){
+        return R.success();
+    }
+
+    @ApiOperation("该接口仅用来展示 常量-混合 的数据接口,无任何实际意义")
+    @PostMapping("/mix")
+    private R mix(@RequestBody BusConMixEntity doctor){
+        return R.success();
+    }
+
+
+    @ApiOperation("该接口仅用来展示 常量-报警 的数据接口,无任何实际意义")
+    @PostMapping("/alarm")
+    private R alarm(@RequestBody BusConAlarmEntity doctor){
+        return R.success();
+    }
+
     @Autowired
     public BusConstantController(List<AbstractConstantService> constantList) {
         constantList.stream().collect(Collectors.groupingBy(AbstractConstantService::getName)).forEach((k, vs)->{
@@ -71,16 +95,29 @@ public class BusConstantController {
                 .removeById(key)? R.success():R.fail("删除失败");
     }
 
-    @PostMapping("/_batch")
-    @ApiOperation(value = "批量新增数据")
+    @PostMapping("/save/{type}")
+    @ApiOperation(value = "新增数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type",value = "常量类型",required = true,allowableValues = "doctor,alarm,mix",allowMultiple = true,dataTypeClass = ConstantEnum.class)
+    })
+    public R add(@PathVariable("type") ConstantEnum type,@RequestBody JSONObject payload) {
+        AbstractConstantService constantService = constantHashMap.get(type);
+        if(constantService==null){
+            return R.success("常量类型{"+type+"}不存在");
+        }
+        return constantService.save( payload.toBean(constantService.getEntityClass()))?R.success():R.fail("数据新增失败");
+    }
+
+    @PostMapping("/update/{type}")
+    @ApiOperation(value = "更新数据")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "type",value = "常量类型",required = true,allowableValues = "ward,doctor,surgery,asa,anaesthesia,anal,alarm,drugCate,entrust",allowMultiple = true,dataTypeClass = ConstantEnum.class)
+            @ApiImplicitParam(name = "type",value = "常量类型",required = true,allowableValues = "doctor,alarm,mix",allowMultiple = true,dataTypeClass = ConstantEnum.class)
     })
-    public R add(@PathVariable("type") ConstantEnum type,@RequestBody List<?> payload) {
+    public R update(@PathVariable("type") ConstantEnum type,@RequestBody JSONObject payload) {
         AbstractConstantService constantService = constantHashMap.get(type);
         if(constantService==null){
             return R.success("常量类型{"+type+"}不存在");
         }
-        return constantService.saveBatch(payload)?R.success():R.fail("数据新增失败");
+        return constantService.updateById( payload.toBean(constantService.getEntityClass()))?R.success():R.fail("数据更新失败");
     }
 }

+ 7 - 1
coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceRunningController.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.Mapper;
 import com.coffee.bus.controller.vo.ManualUndoConfig;
 import com.coffee.bus.controller.vo.NoPumpConfig;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
+import com.coffee.bus.enums.DeviceAlarmEnum;
 import com.coffee.bus.enums.DeviceStatusEnum;
 import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.common.crud.BaseService;
@@ -35,9 +36,14 @@ import org.springframework.web.bind.annotation.*;
 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 = "网络泵状态枚举,无权限配置, alarm字段表示该状态是否为报警状态")
+    @ApiOperation(value = "设备运行状态枚举,无权限配置")
     public R status(){
         return R.success(DeviceStatusEnum.values());
     }

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

@@ -15,7 +15,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 import java.util.*;
 
@@ -59,7 +59,7 @@ public class BusClinicEntity extends TenantGenericEntity<String,String> {
     private String patientName;
 
     @ApiModelProperty(value = "患者性别")
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class)
+    @TableField(typeHandler = EnumTypeHandler.class)
     private SexEnum patientGender;
 
     @ApiModelProperty(value = "患者年龄")

+ 4 - 2
coffee-system/src/main/java/com/coffee/bus/entity/BusConAlarmEntity.java

@@ -2,6 +2,7 @@ package com.coffee.bus.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.coffee.bus.enums.DeviceAlarmEnum;
 import com.coffee.common.entity.TenantGenericEntity;
 import io.swagger.annotations.ApiModel;
@@ -9,7 +10,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 
 /**
@@ -35,6 +37,6 @@ public class BusConAlarmEntity extends TenantGenericEntity<String,String> {
     private String remark;
 
     @ApiModelProperty(value = "报警类型",example = "ward,surgery,asa,anaesthesia,anal,drugCate,entrust")
-    @TableField(javaType = true,typeHandler = EnumOrdinalTypeHandler.class)
+    @TableField(javaType = true,typeHandler = EnumTypeHandler.class)
     private DeviceAlarmEnum type;
 }

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

@@ -9,7 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 
 /**
@@ -35,6 +35,6 @@ public class BusConMixEntity extends TenantGenericEntity<String,String> {
     private String remark;
 
     @ApiModelProperty(value = "混合常量类型",example = "ward,surgery,asa,anaesthesia,anal,drugCate,entrust")
-    @TableField(javaType = true,typeHandler = EnumOrdinalTypeHandler.class)
+    @TableField(javaType = true,typeHandler = EnumTypeHandler.class)
     private ConstantMixEnum type;
 }

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

@@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import java.util.Date;
 
 /**
@@ -32,7 +32,7 @@ public class BusDeviceAlarmEntity extends TenantGenericEntity<String,String> {
     private String deviceId;
 
     @ApiModelProperty(value = "报警信息")
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class)
+    @TableField(typeHandler = EnumTypeHandler.class)
     private DeviceAlarmEnum alarm;
 
     @ApiModelProperty(value = "报警时间")

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

@@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 
 /**
@@ -41,11 +41,11 @@ public class BusDeviceEntity extends TenantGenericEntity<String,String> {
     private String type;
 
     @ApiModelProperty(value = "运行状态",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceStatusEnum runState;
 
     @ApiModelProperty(value = "报警信息",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceAlarmEnum alarm;
 
     @ApiModelProperty(value = "第三方平台返回配置")

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

@@ -14,7 +14,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMin;
@@ -150,11 +150,11 @@ public class BusDeviceHistoryEntity extends TenantGenericEntity<String,String> {
 
 
     @ApiModelProperty(value = "泵运行状态",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceStatusEnum runState;
 
     @ApiModelProperty(value = "报警信息",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceAlarmEnum alarm;
 
     @ApiModelProperty(value = "报警原因")
@@ -182,7 +182,7 @@ public class BusDeviceHistoryEntity extends TenantGenericEntity<String,String> {
     private String classification;
 
     @ApiModelProperty(value = "泵类型",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
     private DeviceEnum type;
 
     @ApiModelProperty(value = "数据上传时间",readOnly = true,hidden = true)

+ 6 - 5
coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java

@@ -17,7 +17,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import lombok.experimental.Accessors;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMin;
@@ -58,7 +59,7 @@ public class BusDeviceRunningEntity extends TenantGenericEntity<String,String> {
     private String patientName;
 
     @ApiModelProperty(value = "病人性别")
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true)
     private SexEnum patientSex;
 
     @ApiModelProperty(value = "病区")
@@ -170,11 +171,11 @@ public class BusDeviceRunningEntity extends TenantGenericEntity<String,String> {
 
 
     @ApiModelProperty(value = "泵运行状态",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceStatusEnum runState;
 
     @ApiModelProperty(value = "报警信息",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceAlarmEnum alarm;
 
     @ApiModelProperty(value = "输注即将结束提醒",readOnly = true)
@@ -210,7 +211,7 @@ public class BusDeviceRunningEntity extends TenantGenericEntity<String,String> {
     private String classification;
 
     @ApiModelProperty(value = "泵类型",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
     private DeviceEnum type;
 
     @ApiModelProperty(value = "数据上传时间",readOnly = true,hidden = true)

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

@@ -12,7 +12,7 @@ import com.coffee.common.entity.TenantGenericEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 
 import java.util.Date;
 import java.util.Map;
@@ -30,7 +30,7 @@ import java.util.Map;
 public class BusHospitalConfigEntity extends TenantGenericEntity<String,String> implements RecordModifierEntity, RecordCreationEntity {
 
 
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true)
     @ApiModelProperty(value = "配置类型",example = "eval:评价配置,other:其他设置,undo:撤泵配置",allowableValues = "eval:评价配置,other:其他设置,undo:撤泵配置")
     private ConfigEnum type;
 

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

@@ -10,7 +10,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 
 import java.util.Date;
@@ -33,7 +33,7 @@ public class BusHospitalLogEntity extends TenantGenericEntity<String,String> {
     @ApiModelProperty(value = "医院数据接收时间")
     private Date receiveTime;
 
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class)
+    @TableField(typeHandler = EnumTypeHandler.class)
     @ApiModelProperty(value = "医院数据类型,0、心跳 1、病人信息")
     private HospitalLogEnum  type;
 

+ 12 - 4
coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionHistoryEntity.java

@@ -13,7 +13,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import lombok.experimental.Accessors;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.Max;
@@ -151,11 +151,11 @@ public class BusInfusionHistoryEntity extends TenantGenericEntity<String,String>
 
 
     @ApiModelProperty(value = "泵运行状态",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceStatusEnum runState;
 
     @ApiModelProperty(value = "报警信息",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.IGNORED)
     private DeviceAlarmEnum alarm;
 
     @ApiModelProperty(value = "输注即将结束提醒",readOnly = true)
@@ -183,7 +183,7 @@ public class BusInfusionHistoryEntity extends TenantGenericEntity<String,String>
     private String classification;
 
     @ApiModelProperty(value = "泵类型",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
     private DeviceEnum type;
 
     @ApiModelProperty(value = "当前输注记录数据最后上传时间",readOnly = true,hidden = true)
@@ -204,6 +204,10 @@ public class BusInfusionHistoryEntity extends TenantGenericEntity<String,String>
     @TableField(typeHandler = DateToBigIntHandler.class)
     private Date undoTime;
 
+    @ApiModelProperty(value = "撤泵时间")
+    @TableField(typeHandler = DateToBigIntHandler.class)
+    private Date clinicStartTime;
+
     public static BusInfusionHistoryEntity parseRunningInfo(BusDeviceRunningEntity running){
         BusInfusionHistoryEntity entity = new BusInfusionHistoryEntity();
         entity.setDeviceId(running.getDeviceId());
@@ -228,12 +232,14 @@ public class BusInfusionHistoryEntity extends TenantGenericEntity<String,String>
         entity.setPcaValidCount(running.getPcaValidCount());
         entity.setPcaInvalidCount(running.getPcaInvalidCount());
         entity.setPcaTotalCount(running.getPcaTotalCount());
+
         /**
          * 脉冲泵参数
          */
         entity.setPulseDose(running.getPulseDose());
         entity.setPulseFirstLockTime(running.getPulseFirstLockTime());
         entity.setPulseLockTime(running.getPulseLockTime());
+
         /**
          * 智能泵参数
          */
@@ -251,6 +257,8 @@ public class BusInfusionHistoryEntity extends TenantGenericEntity<String,String>
         entity.setWarnWillFinished(running.getWarnAnalgesicPoor());
         entity.setAlarm(running.getAlarm());
 
+        //若当前临床信息不存在,则将时间戳置为 1971/01/01 01:01:01 todo
+        entity.setClinicStartTime(new Date(31510861L));
         return entity;
     }
 }

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

@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import lombok.experimental.Accessors;
 import org.apache.commons.collections4.map.HashedMap;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 
 import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMin;
@@ -49,7 +49,7 @@ public class BusInfusionModifyEntity extends TenantGenericEntity<String,String>
     private String clinicId;
 
     @ApiModelProperty(value = "泵类型",readOnly = true)
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
+    @TableField(typeHandler = EnumTypeHandler.class,javaType = true,updateStrategy = FieldStrategy.NEVER)
     private DeviceEnum type;
 
     @ApiModelProperty(value = "总量",readOnly = true)

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

@@ -12,7 +12,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 
 /**
@@ -36,7 +36,7 @@ public class BusPatientEntity extends TenantGenericEntity<String,String> {
     @Length(max = 255,message = "医生岗位长度不得超过255个字节")
     private String name;
 
-    @TableField(typeHandler = EnumOrdinalTypeHandler.class)
+    @TableField(typeHandler = EnumTypeHandler.class)
     @ApiModelProperty(value = "性别")
     private SexEnum gender;
 

+ 3 - 18
coffee-system/src/main/java/com/coffee/bus/enums/DeviceStatusEnum.java

@@ -22,18 +22,9 @@ public enum DeviceStatusEnum {
      * 如若新增,请在最后尾部新增
      * 切记不可删除!!!!!!!!!!!!
      */
-    Running(0,"正在运行",false),
-    Waiting(1,"待机中",false),
-    Shutdown(2,"关机",false),
-
-    //    以下为报警信息状态
-    Finished(3,"输液结束",true),
-    LowBattery(4,"低电量报警",true),
-    Jam(5,"堵塞报警",true),
-    Bubble(6,"气泡报警",true),
-    NoSignal(7,"不在服务区",true),
-    Machine(8,"机械故障",true),
-    NotFastened(9,"未扣合股涨",true);
+    Running(0,"正在运行"),
+    Waiting(1,"待机中"),
+    Shutdown(2,"关机");
 
 
     /**
@@ -45,11 +36,5 @@ public enum DeviceStatusEnum {
     @Getter
     @ApiModelProperty("运行状态内容")
     private String text;
-    /**
-     * 是否为报警状态
-     */
-    @ApiModelProperty("是否为报警状态")
-    @Getter
-    private Boolean alarm;
 
 }

+ 33 - 0
coffee-system/src/main/java/com/coffee/bus/listener/event/bean/HisEvent.java

@@ -0,0 +1,33 @@
+package com.coffee.bus.listener.event.bean;
+
+import com.coffee.bus.entity.BusClinicEntity;
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+import java.util.*;
+import javax.validation.constraints.NotNull;
+import java.time.Clock;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisEvent.java
+ * @Description 监听his发来的手术事件
+ * @createTime 2022年03月21日 16:30:00
+ */
+@Getter
+public class HisEvent extends ApplicationEvent {
+    private final String hospitalId;
+    private final List<BusClinicEntity> clinics;
+
+    public HisEvent(Object source,List<BusClinicEntity> clinics, @NotNull String hospitalId) {
+        super(source);
+        this.hospitalId=hospitalId;
+        this.clinics=clinics;
+    }
+
+    public HisEvent(Object source, Clock clock, List<BusClinicEntity> clinics, @NotNull String hospitalId) {
+        super(source, clock);
+        this.hospitalId=hospitalId;
+        this.clinics=clinics;
+    }
+}

+ 0 - 35
coffee-system/src/main/java/com/coffee/bus/listener/event/bean/HistoryInfoEvent.java

@@ -1,35 +0,0 @@
-package com.coffee.bus.listener.event.bean;
-
-import lombok.Data;
-import lombok.Getter;
-import org.springframework.context.ApplicationEvent;
-
-import javax.validation.constraints.NotNull;
-import java.time.Clock;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName HistoryInfoEvent.java
- * @Description TODO
- * @createTime 2022年03月21日 16:30:00
- */
-@Getter
-public class HistoryInfoEvent extends ApplicationEvent {
-    private final String content;
-    private final String historyId;
-    private final Long requestId;
-    public HistoryInfoEvent(Object source, @NotNull Long requestId,  @NotNull String content,  @NotNull String historyId) {
-        super(source);
-        this.content=content;
-        this.historyId=historyId;
-        this.requestId=requestId;
-    }
-
-    public HistoryInfoEvent(Object source, Clock clock, @NotNull Long requestId, @NotNull String content, @NotNull String historyId) {
-        super(source, clock);
-        this.content=content;
-        this.historyId=historyId;
-        this.requestId=requestId;
-    }
-}

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

@@ -7,6 +7,6 @@ package com.coffee.bus.registry;
  * @Description TODO
  * @createTime 2022年04月02日 16:31:00
  */
-public interface Registry {
+public interface Registry<E,T> {
     String getId();
 }

+ 4 - 0
coffee-system/src/main/java/com/coffee/bus/registry/constant/PatientKeyConstant.java

@@ -20,4 +20,8 @@ public class PatientKeyConstant {
     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 BED_NO="bedNo";
 }

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

@@ -10,12 +10,9 @@ import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
 import com.coffee.bus.service.LocalBusDeviceService;
 import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.common.cache.manager.ClusterConfigStorageManager;
-import com.coffee.common.cache.value.Value;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
-import java.util.Map;
-
 /**
  * @author lifang
  * @version 1.0.0
@@ -31,7 +28,7 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
     private final ClusterConfigStorageManager configStorageManager;
 
     @Override
-    public DeviceOperator<DeviceCacheInfo> getDevice(String deviceId) {
+    public DeviceOperator<DeviceCacheInfo> getOperator(String deviceId) {
         if(StrUtil.isEmpty(deviceId)){
             return null;
         }
@@ -67,15 +64,7 @@ public class ClusterDeviceRegistry implements DeviceRegistry {
     }
 
     @Override
-    public void register(DeviceCacheInfo deviceInfo) {
-        if(StrUtil.isNotEmpty(deviceInfo.getDeviceId())){
-            ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator( configStorageManager.getStorage(deviceInfo.getKey()));
-            deviceOperator.set(deviceInfo);
-        }
-    }
-
-    @Override
-    public void unRegister(String deviceId) {
+    public void remove(String deviceId) {
         String key=getId()+deviceId;
         ClusterDeviceOperator deviceOperator = new ClusterDeviceOperator(configStorageManager.getStorage(key));
         deviceOperator.clear();

+ 3 - 9
coffee-system/src/main/java/com/coffee/bus/registry/device/DeviceRegistry.java

@@ -16,17 +16,11 @@ public interface DeviceRegistry extends Registry {
      * @param deviceId
      * @return
      */
-    DeviceOperator<DeviceCacheInfo> getDevice(String deviceId);
+    DeviceOperator<DeviceCacheInfo> getOperator(String deviceId);
 
     /**
-     * 注册设备信息
-     * @param basicInfo
-     */
-    void register(DeviceCacheInfo basicInfo);
-
-    /**
-     * 取消注册设备信息
+     * 删除设备信息
      * @param deviceId 设备id
      */
-    void unRegister(String deviceId);
+    void remove(String deviceId);
 }

+ 20 - 0
coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java

@@ -160,6 +160,26 @@ 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 Boolean getFinished() {
         return getValue(PatientKeyConstant.FINISHED).as(Boolean.class);

+ 2 - 7
coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientRegistry.java

@@ -34,7 +34,7 @@ public class ClusterPatientRegistry implements PatientRegistry {
     private final ClusterConfigStorageManager configStorageManager;
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public PatientOperator<PatientCacheInfo> getPatient(String hospitalId, String patientCode) {
+    public PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode) {
         if(StrUtil.isEmpty(hospitalId)||StrUtil.isEmpty(patientCode)){
             return null;
         }
@@ -68,14 +68,9 @@ public class ClusterPatientRegistry implements PatientRegistry {
         return patientOperator;
     }
 
-    @Override
-    public void register(PatientCacheInfo cacheInfo) {
-        ClusterPatientOperator patientOperator = new ClusterPatientOperator( configStorageManager.getStorage(cacheInfo.getKey()));
-        patientOperator.set(cacheInfo);
-    }
 
     @Override
-    public void unRegister(String hospitalId, String patientCode) {
+    public void remove(String hospitalId, String patientCode) {
         String key=getId()+hospitalId+":"+patientCode;
         ClusterPatientOperator patientOperator = new ClusterPatientOperator( configStorageManager.getStorage(key));
         patientOperator.clear();

+ 23 - 0
coffee-system/src/main/java/com/coffee/bus/registry/patient/PatientOperator.java

@@ -75,6 +75,29 @@ 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();
     /**
      * 判断当前临床是否结束
      * @return

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

@@ -13,22 +13,16 @@ import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 public interface PatientRegistry extends Registry {
     /**
      * 根据医院id和病号获取病人操作符
-     * @param hospital
+     * @param hospitalId\
      * @param patientCode
      * @return
      */
-    PatientOperator<PatientCacheInfo> getPatient(String hospital,String patientCode);
+    PatientOperator<PatientCacheInfo> getOperator(String hospitalId, String patientCode);
 
     /**
-     * 注册病人信息
-     * @param basicInfo
-     */
-    void register(PatientCacheInfo basicInfo);
-
-    /**
-     * 取消注册病人信息
+     * 删除病人信息
      * @param hospitalId
      * @param patientCode
      */
-    void unRegister(String hospitalId, String patientCode);
+    void remove(String hospitalId, String patientCode);
 }

+ 1 - 25
coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java

@@ -1,6 +1,5 @@
 package com.coffee.bus.service;
 
-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.mapper.BusClinicMapper;
@@ -43,29 +42,6 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
 
     }
 
-    /**
-     * 判断当前病人是否存在临床信息
-     * @param  hospitalId 医院id
-     * @param patientCode 病号
-     * @return
-     */
-    public boolean existClinic(String hospitalId,String patientCode){
-        return this.getOne(new QueryWrapper<BusClinicEntity>().lambda()
-                .eq(BusClinicEntity::getPatientCode, patientCode)
-                .eq(BusClinicEntity::getTenantId,hospitalId)
-                .eq(BusClinicEntity::getFinished, 0)) == null;
-    }
-
-    /**
-     * 获取当前病号的临床信息
-     * @param hospitalId
-     * @param patientCode
-     * @return
-     */
-    public BusClinicEntity getCurrentClinic(String hospitalId,String patientCode){
-        return this.baseMapper.getCurrentClinic(hospitalId,patientCode);
-    }
-
     @Override
     public boolean save(BusClinicEntity entity) {
         return super.save(entity);
@@ -84,7 +60,7 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
         .set(BusClinicEntity::getFinished,true)
         .set(BusClinicEntity::getEndTime,new Date()));
         //更新病人缓存 todo
-        PatientOperator<PatientCacheInfo> patient = patientRegistry.getPatient(tenantId, patientCode);
+        PatientOperator<PatientCacheInfo> patient = patientRegistry.getOperator(tenantId, patientCode);
         patient.setFinished(true);
     }
 }

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

@@ -87,4 +87,14 @@ public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMa
         //结束撤泵设备所绑定的临床数据
         devices.forEach(device->{ clinicService.finish(device.getPatientCode(),device.getTenantId()); });
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updateClinicInfo(List<String> deviceIds, BusClinicEntity clinic) {
+        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
+                .in(BusDeviceRunningEntity::getDeviceId,deviceIds)
+                .set(BusDeviceRunningEntity::getClinicId,clinic.getId())
+                .set(BusDeviceRunningEntity::getWard,clinic.getWard())
+                .set(BusDeviceRunningEntity::getPatientSex,clinic.getPatientGender())
+                .set(BusDeviceRunningEntity::getBedNo,clinic.getBedNo()));
+    }
 }

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

@@ -48,7 +48,7 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
     @Override
     public void postUpdate(BusDeviceEntity entity) {
         DeviceOperator deviceOperator = deviceRegistry
-                .getDevice(entity.getDeviceId());
+                .getOperator(entity.getDeviceId());
         if(deviceOperator==null){
             return;
         }
@@ -63,6 +63,6 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
     @Override
     public void postDelete(String id) {
         BusDeviceEntity registeredEntity = this.getById(id);
-        deviceRegistry.unRegister(registeredEntity.getDeviceId());
+        deviceRegistry.remove(registeredEntity.getDeviceId());
     }
 }

+ 1 - 0
coffee-system/src/main/java/com/coffee/bus/service/constant/AbstractConstantService.java

@@ -19,4 +19,5 @@ public abstract class AbstractConstantService<M extends BaseMapper<E>, E,PK exte
      * @return
      */
    public abstract ConstantEnum getName();
+
 }

+ 25 - 10
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -1,7 +1,7 @@
 package com.coffee.bus.websocket.listener;
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.swing.RobotUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SignUtil;
@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.coffee.bus.entity.*;
 import com.coffee.bus.enums.DeviceAlarmEnum;
 import com.coffee.bus.enums.DeviceEnum;
+import com.coffee.bus.listener.event.bean.HisEvent;
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.listener.event.bean.DeviceInfoEvent;
 import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
@@ -25,6 +26,7 @@ import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
 import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.*;
 import com.coffee.common.config.websocket.WebSocketConstant;
+import com.coffee.common.enums.SexEnum;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
@@ -33,7 +35,6 @@ import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.awt.*;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.List;
@@ -85,7 +86,7 @@ public class DeviceInfoListener {
             BusDeviceRunningEntity device = infoEvent.getContent();
             //1、判断该设备是否已和医院绑定并开启使用
             String deviceId = device.getDeviceId();
-            DeviceOperator<DeviceCacheInfo> deviceOperator = deviceRegistry.getDevice(deviceId);
+            DeviceOperator<DeviceCacheInfo> deviceOperator = deviceRegistry.getOperator(deviceId);
             if (deviceOperator==null||!Boolean.TRUE.equals(deviceOperator.getEnable())) {
                 log.warn("设备[{}]暂不可用,数据已丢弃",deviceId);
                 return ;
@@ -164,7 +165,7 @@ public class DeviceInfoListener {
             device.setStartTime(new Date());
         }else {
 
-            PatientOperator<PatientCacheInfo> patient = patientRegistry.getPatient(device.getTenantId(), device.getPatientCode());
+            PatientOperator<PatientCacheInfo> patient = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
             Boolean finished = patient.getFinished();
             if(Boolean.TRUE.equals(finished)){
                 //分包标识未改变且临床已结束 ,则此次数据无效
@@ -203,8 +204,8 @@ public class DeviceInfoListener {
      */
     private void handlePatient(BusDeviceRunningEntity device,List<Supplier<?>> suppliers){
         String deviceId = device.getDeviceId();
-        DeviceOperator<DeviceCacheInfo> currentDeviceOperator = deviceRegistry.getDevice(deviceId);
-        PatientOperator<PatientCacheInfo> currentPatientOperator = patientRegistry.getPatient(device.getTenantId(), device.getPatientCode());
+        DeviceOperator<DeviceCacheInfo> currentDeviceOperator = deviceRegistry.getOperator(deviceId);
+        PatientOperator<PatientCacheInfo> currentPatientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
         String bindDeviceId = currentPatientOperator.getBindDeviceId();
         //当前病号所绑定的泵发生了改变,对当前病号进行处理
         if(!StrUtil.isNullOrUndefined(bindDeviceId)&&!deviceId.equals(bindDeviceId)){
@@ -234,7 +235,7 @@ public class DeviceInfoListener {
      * 病患信息处理,当泵所绑定病号发生变化时,处理泵原来所绑定病号信息
      */
     private void handleConflictOriginPatient(String deviceId, String hospitalId, String patientCode, List<Supplier<?>> suppliers){
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getPatient(hospitalId, patientCode);
+        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(hospitalId, patientCode);
         Set<DeviceTimeSmallInfo> allDevice = patientOperator.getAllDevice();
         //过滤掉已换绑的泵,获取剩余所绑定的泵数据
         if(CollectionUtils.isNotEmpty(allDevice)){
@@ -281,11 +282,11 @@ public class DeviceInfoListener {
      */
     private void handleConflictCurrentPatient(BusDeviceRunningEntity device, List<Supplier<?>> suppliers){
         String deviceId = device.getDeviceId();
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getPatient(device.getTenantId(), device.getPatientCode());
+        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
         String bindDeviceId = patientOperator.getBindDeviceId();
         if(!StrUtil.isNullOrUndefined(bindDeviceId)&&!deviceId.equals(bindDeviceId)){
             //泵号发生改变,获取病号绑定的泵信息,判断绑定的泵开始时间,将开始时间稍后的泵设置为主泵
-            DeviceOperator<DeviceCacheInfo> patientCurrentBindDevice = deviceRegistry.getDevice(bindDeviceId);
+            DeviceOperator<DeviceCacheInfo> patientCurrentBindDevice = deviceRegistry.getOperator(bindDeviceId);
             Date startTime = patientCurrentBindDevice.getStartTime();
             if (startTime==null||startTime.before(device.getStartTime())) {
                 log.error("病号:[{}],之前主泵为:[{}],现在主泵为:[{}]",device.getPatientCode(),bindDeviceId,deviceId);
@@ -417,7 +418,7 @@ public class DeviceInfoListener {
     public void send() throws InterruptedException {
 //        List<BusDeviceRunningEntity> list = deviceUsingService.list();
 //        list.forEach(pump->{
-        while (count>3){
+        while (count>1){
             return;
         }
         ++count;
@@ -482,5 +483,19 @@ public class DeviceInfoListener {
         pump3.setPcaTotalCount(RandomUtil.randomInt(100));
         SpringUtil.publishEvent(new DeviceInfoEvent(this,pump3,pump3.getDeviceId()));
 //        });
+        Thread.sleep(5000);
+        String now = DateUtil.now();
+        BusClinicEntity clinic = new BusClinicEntity();
+        clinic.setPatientCode("456");
+        clinic.setName("临床:"+ now);
+        clinic.setPatientName("病号:"+now);
+        clinic.setPatientGender(SexEnum.MAN);
+        clinic.setPatientAge(12);
+        clinic.setWard("病区:"+now);
+        clinic.setBedNo("床号:"+now);
+        clinic.setTenantId("1505808170691784706");
+        clinic.setStartTime(new Date());
+        SpringUtil.publishEvent(new HisEvent(this,Arrays.asList(clinic),clinic.getTenantId()));
+
     }
 }

+ 190 - 0
coffee-system/src/main/java/com/coffee/bus/websocket/listener/HisInfoListener.java

@@ -0,0 +1,190 @@
+package com.coffee.bus.websocket.listener;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.coffee.bus.bean.HisInfo;
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
+import com.coffee.bus.entity.BusPatientEntity;
+import com.coffee.bus.listener.event.bean.HisEvent;
+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.script.ExecuteResult;
+import com.coffee.bus.script.ScriptManager;
+import com.coffee.bus.service.*;
+import com.coffee.common.config.websocket.WebSocketConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HistoryInfoListener.java
+ * @Description TODO
+ * @createTime 2022年03月29日 15:23:00
+ */
+@Component
+@Slf4j
+public class HisInfoListener {
+
+    private final LocalBusClinicService clinicService;
+
+    private final LocalBusInfusionHistoryService infusionHistoryService;
+
+    private final PatientRegistry patientRegistry;
+
+    private final LocalBusDeviceRunningService deviceRunningService;
+
+
+    public HisInfoListener(LocalBusClinicService clinicService, LocalBusInfusionHistoryService infusionHistoryService, PatientRegistry patientRegistry, LocalBusDeviceRunningService deviceRunningService) {
+        this.clinicService = clinicService;
+        this.infusionHistoryService = infusionHistoryService;
+        this.patientRegistry = patientRegistry;
+        this.deviceRunningService = deviceRunningService;
+    }
+
+    private HisInfoListener hisInfoListener;
+
+    @PostConstruct
+    public void init(){
+        hisInfoListener = SpringUtil.getBean(HisInfoListener.class);
+    }
+
+    @EventListener
+    public void historyInfoListener(HisEvent infoEvent){
+        List<BusClinicEntity> clinics = infoEvent.getClinics();
+        if(CollectionUtil.isEmpty(clinics)){
+            return;
+        }
+        //处理病人信息 todo
+        //处理病人手术信息
+        clinics.parallelStream().forEach(hisInfoListener::handle);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void handle(BusClinicEntity clinic){
+        //判断病人手术信息是否存在
+        BusClinicEntity existClinic = lookUpClinic(clinic);
+        //同一手术信息病号、床号是否发生了变化
+        Boolean changed=null;
+        if(existClinic==null){
+            //手术信息不存在
+            clinicService.save(clinic);
+            //常量信息异步处理,失败了无需关注
+            hisInfoListener.handleConstant(clinic);
+            // 输注开始时间>手术开始时间>输注绑定的手术开始时间 找到与输注时间最为相近的手术
+            infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>()
+                    .lambda()
+                    .set(BusInfusionHistoryEntity::getClinicId,clinic.getId())
+                    .eq(BusInfusionHistoryEntity::getTenantId,clinic.getTenantId())
+                    .ge(BusInfusionHistoryEntity::getStartTime,clinic.getStartTime().getTime())
+                    .le(BusInfusionHistoryEntity::getClinicStartTime,clinic.getStartTime().getTime())
+            );
+        }else {
+            clinic.setId(existClinic.getId());
+            //判断手术的病区床号是否发生了变化
+            if(!existClinic.getWard().equals(clinic.getWard())||!existClinic.getBedNo().equals(clinic.getBedNo())){
+                changed=true;
+                //更新手术信息
+                clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda()
+                        .eq(BusClinicEntity::getId,existClinic.getId())
+                        .set(BusClinicEntity::getWard,clinic.getWard())
+                        .set(BusClinicEntity::getBedNo,clinic.getBedNo()));
+            }
+        }
+
+        handleRunningClinic(clinic,changed);
+    }
+
+
+    /**
+     * 获取手术信息
+     * @param clinic
+     * @return
+     */
+    private BusClinicEntity lookUpClinic(BusClinicEntity clinic){
+        return clinicService.getOne(new QueryWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getPatientCode, clinic.getPatientCode())
+                .eq(BusClinicEntity::getName, clinic.getName())
+                .eq(BusClinicEntity::getStartTime, clinic.getStartTime()));
+    }
+
+    /**
+     * 处理手术信息中的常量信息数据 todo
+     * @param clinic 接收到的临床数据
+     */
+    @Async
+    public void handleConstant(BusClinicEntity clinic){
+
+    }
+
+
+    /**
+     * 判断并处理正在进行的临床信息
+     * @param clinic 接收到的临床数据
+     * @param changed 临床数据存在且已发生改变, null 时表示该临床数据不存在
+     */
+    private void handleRunningClinic(BusClinicEntity clinic,Boolean changed){
+        //判断是否为当前最新手术信息
+        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(clinic.getTenantId(), clinic.getPatientCode());
+        String clinicId = patientOperator.getClinicId();
+        if(StrUtil.isNullOrUndefined(clinicId)){
+            //临床数据尚未存在,则将该临床数据设置为最新的临床数据
+            changedRunningClinic(clinic,patientOperator);
+            return ;
+        }
+        //判断临床信息是否一样
+        if(clinicId.equals(clinic.getId())){
+            if(Boolean.TRUE.equals(changed)){
+                changedRunningClinic(clinic,patientOperator);
+                return;
+            }
+        }else {
+            //临床id不一致,找开始时间最晚的为当前的临床id
+            Date startTime = patientOperator.getStartTime();
+            if(startTime==null||clinic.getStartTime().after(startTime)){
+                //更新临床信息
+                changedRunningClinic(clinic,patientOperator);
+                return;
+            }else {
+                //运行临床信息不发生变化,将该次临床置为结束状态
+                clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda()
+                        .eq(BusClinicEntity::getId,clinic.getId())
+                        .set(BusClinicEntity::getFinished,true));
+            }
+        }
+    }
+
+    private void changedRunningClinic(BusClinicEntity clinic,PatientOperator<PatientCacheInfo> patientOperator){
+        patientOperator.setClinicId(clinic.getId());
+        patientOperator.setWard(clinic.getWard());
+        patientOperator.setBedNo(clinic.getBedNo());
+        patientOperator.setStartTime(clinic.getStartTime());
+        Set<DeviceTimeSmallInfo> allDevice = patientOperator.getAllDevice();
+        if(CollectionUtil.isNotEmpty(allDevice)){
+            //病人有相关的泵绑定
+            List<String> deviceIds = allDevice.stream().map(DeviceTimeSmallInfo::getDeviceId).collect(Collectors.toList());
+            deviceRunningService.updateClinicInfo(deviceIds,clinic);
+        }
+        log.error("临床信息发生改变:[{}],[{}]",clinic.getPatientCode(),clinic.toString());
+        //todo 实时传输病人临床数据
+
+    }
+}

+ 0 - 169
coffee-system/src/main/java/com/coffee/bus/websocket/listener/HistoryInfoListener.java

@@ -1,169 +0,0 @@
-package com.coffee.bus.websocket.listener;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.extra.spring.SpringUtil;
-import cn.hutool.json.JSONArray;
-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.bean.HisInfo;
-import com.coffee.bus.entity.BusClinicEntity;
-import com.coffee.bus.entity.BusDeviceRunningEntity;
-import com.coffee.bus.entity.BusDeviceHistoryEntity;
-import com.coffee.bus.entity.BusPatientEntity;
-import com.coffee.bus.listener.event.bean.HistoryInfoEvent;
-import com.coffee.bus.script.ExecuteResult;
-import com.coffee.bus.script.ScriptManager;
-import com.coffee.bus.service.*;
-import com.coffee.common.config.websocket.WebSocketConstant;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.event.EventListener;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.PostConstruct;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName HistoryInfoListener.java
- * @Description TODO
- * @createTime 2022年03月29日 15:23:00
- */
-@Component
-@Slf4j
-public class HistoryInfoListener {
-
-    private final ScriptManager scriptManager;
-
-    private final LocalBusPatientService patientService;
-
-    private final LocalBusClinicService clinicService;
-
-    private final LocalBusDeviceHistoryService historyService;
-
-    private final RedisTemplate redisTemplate;
-
-    private final LocalBusDeviceRunningService pumpService;
-
-    @Autowired
-    public HistoryInfoListener(ScriptManager scriptManager, LocalBusPatientService patientService, LocalBusClinicService clinicService, LocalBusDeviceHistoryService historyService, RedisTemplate redisTemplate, LocalBusDeviceRunningService pumpService) {
-        this.scriptManager = scriptManager;
-        this.patientService = patientService;
-        this.clinicService = clinicService;
-        this.historyService = historyService;
-        this.redisTemplate = redisTemplate;
-        this.pumpService = pumpService;
-    }
-
-    private HistoryInfoListener historyInfoListener;
-
-    @PostConstruct
-    public void init(){
-        historyInfoListener= SpringUtil.getBean(HistoryInfoListener.class);
-    }
-
-    @EventListener
-    public void historyInfoListener(HistoryInfoEvent infoEvent){
-        log.info("接收到了医院数据,[{}]",infoEvent.getContent());
-        String historyId = infoEvent.getHistoryId();
-        String content = infoEvent.getContent();
-        ExecuteResult exec = scriptManager.lookUpHospital(historyId).exec(content);
-        if(exec.isSuccess()){
-            log.info("医院数据解析成功,[{}]",exec.get());
-            //成功
-            JSONArray resultArray = (JSONArray) exec.get();
-            List<HisInfo> hisInfos = resultArray.parallelStream()
-                    .map(result -> JSONUtil.toBean(JSONUtil.toJsonStr(result), HisInfo.class))
-                    .peek(info-> info.setHospitalId(historyId))
-                    .peek(hisInfo -> this.handle(hisInfo,infoEvent.getRequestId()))
-                    .collect(Collectors.toList());
-            //获取到his信息进行处理 todo
-        }else {
-            log.info("医院数据解析失败,[{}]",exec.getMessage());
-        }
-    }
-
-    /**
-     * 处理医院传来的his信息
-     * @param hisInfo
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public void handle(HisInfo hisInfo,Long requestId){
-        //获取病人信息
-        BusPatientEntity patient = BusPatientEntity.of(hisInfo);
-        if(!patientService.exist(patient.getCode(),patient.getTenantId())){
-            //不存在病人信息则进行保存 ,病人基本信息不变动
-            patientService.save(patient);
-            log.info("新增病人信息,[{}]",patient);
-        }
-        BusClinicEntity clinic = BusClinicEntity.of(hisInfo);
-        //判断临床的唯一性
-        BusClinicEntity currentClinic = clinicService.getCurrentClinic(hisInfo.getHospitalId(), hisInfo.getPatientCode());
-        if (currentClinic==null) {
-//            historyInfoListener.updateClinic(clinic,requestId);
-        }else {
-            //临床信息已存在,判断上传信息是否发生重复,是否为最新临床信息
-            if(currentClinic.getName().equals(clinic.getName())&&currentClinic.getStartTime().equals(clinic.getStartTime())){
-                //判断为同一临床信息,不予处理
-                return ;
-            }else {
-                //不同的临床信息,则进行更新
-//                historyInfoListener.updateClinic(clinic,requestId);
-            }
-        }
-        //发送临床信息
-        String topic = WebSocketConstant.getClinicInfoTopic(null, clinic.getPatientCode(), clinic.getTenantId());
-        redisTemplate.convertAndSend(topic, clinic);
-    }
-
-
-
-//    /**
-//     * 针对临床信息更新设备以及设备历史信息
-//     * @param clinic
-//     * @param clinic
-//     */
-//
-//    @Async
-//    @Transactional(rollbackFor = Exception.class)
-//    public void updateClinic(BusClinicEntity clinic,Long requestId){
-//        clinic.setId(String.valueOf(IdWorker.getId()));
-//        //找到此病号信息且未绑定临床号,获取临床绑定设备号,并将临床信息与此次信息进行绑定
-//        List<BusDeviceHistoryEntity> historyList = historyService.list(
-//                new QueryWrapper<BusDeviceHistoryEntity>()
-//                        .lambda()
-//                        .select(BusDeviceHistoryEntity::getId)
-//                        .select(BusDeviceHistoryEntity::getDeviceId)
-//                        .eq(BusDeviceHistoryEntity::getTenantId, clinic.getTenantId())
-//                        .eq(BusDeviceHistoryEntity::getPatientCode, clinic.getPatientCode())
-//                        .le(requestId!=null, BusDeviceHistoryEntity::getRequestId,requestId)
-//                        .isNull(BusDeviceHistoryEntity::getClinicId));
-//        if (CollectionUtil.isNotEmpty(historyList)) {
-//            //历史信息与临床号绑定
-//            historyList.forEach(history-> history.fillClinic(clinic));
-//            historyService.updateBatchById(historyList);
-//            clinic.setDeviceCodes(historyList.stream().map(BusDeviceHistoryEntity::getDeviceId).collect(Collectors.toSet()));
-//        }
-//
-//        pumpService.update(new UpdateWrapper<BusDeviceRunningEntity>()
-//                .lambda()
-//                .eq(BusDeviceRunningEntity::getPatientCode,clinic.getPatientCode())
-//                .eq(BusDeviceRunningEntity::getTenantId,clinic.getTenantId())
-//                .isNull(BusDeviceRunningEntity::getClinicId)
-//                .set(BusDeviceRunningEntity::getClinicId,clinic.getId())
-//                .set(BusDeviceRunningEntity::getPatientSex,clinic.getPatientGender())
-//                .set(BusDeviceRunningEntity::getWard,clinic.getWard())
-//                .set(BusDeviceRunningEntity::getBedNo,clinic.getBedNo())
-//                .set(BusDeviceRunningEntity::getPatientName,clinic.getPatientName()));
-//
-//        clinicService.save(clinic);
-//        log.info("新增临床信息,[{}]",clinic);
-//    }
-}