Ver código fonte

add his数据处理逻辑,全更新、部分更新、仅更新最新数据

A17404李放 3 anos atrás
pai
commit
1b6234ccfb
21 arquivos alterados com 489 adições e 229 exclusões
  1. 6 6
      coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java
  2. 25 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/HisStrategyEnum.java
  3. 2 2
      coffee-system/src/main/java/com/coffee/bus/his/strategy/HisStrategyHandler.java
  4. 30 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/HisStrategyManager.java
  5. 58 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/all/EqualsStrategyHandler.java
  6. 13 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/all/HisAllStrategyHandler.java
  7. 36 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/all/HisAllStrategyManager.java
  8. 56 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/all/LessToMoreHisStrategyHandler.java
  9. 5 5
      coffee-system/src/main/java/com/coffee/bus/his/strategy/all/MoreToLessHisStrategyHandler.java
  10. 75 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/onlynew/DefaultHisNewStrategyHandler.java
  11. 13 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/onlynew/HisNewStrategyHandler.java
  12. 30 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/onlynew/HisNewStrategyManager.java
  13. 85 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/part/DefaultHisPartStrategyHandler.java
  14. 13 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/part/HisPartStrategyHandler.java
  15. 30 0
      coffee-system/src/main/java/com/coffee/bus/his/strategy/part/HisPartStrategyManager.java
  16. 5 3
      coffee-system/src/main/java/com/coffee/bus/listener/event/bean/HisEvent.java
  17. 4 1
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceManualService.java
  18. 2 1
      coffee-system/src/main/java/com/coffee/bus/service/dto/UndoDeviceConfig.java
  19. 0 35
      coffee-system/src/main/java/com/coffee/bus/service/strategy/EqualsStrategy.java
  20. 0 175
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/HisInfoListener.java
  21. 1 1
      coffee-system/src/main/resources/mapper/bus/BusDeviceManualMapper.xml

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

@@ -101,7 +101,7 @@ public class BusPatientController  {
     @SaCheckPermission("bus:patient:finished")
     @ApiResponse(code = 4001,message = "病号当前绑定了多个设备,不可结束管理")
     @ApiOperation(value = "结束管理",notes = "病患当前绑定主设备必须要在关机、不在服务器、待机中才能结束管理,权限【bus:patient:finished】")
-    public R finished(@PathVariable("monitorType")@ApiParam(value = "是否为无泵管理",defaultValue = "false",example = "0、无泵 1、有泵") boolean haveDevice,
+    public R finished(@PathVariable("monitorType")@ApiParam(value = "是否为无泵管理 false、无泵 true、有泵",defaultValue = "false" ) boolean haveDevice,
                       @RequestBody MonitorFinishedVo monitorFinishedVo,
                       @RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
         if(haveDevice){
@@ -119,7 +119,7 @@ public class BusPatientController  {
      * @param tenantId
      * @return R
      */
-    private R monitorFinished(MonitorFinishedVo monitorFinishedVo, String tenantId){
+    private R<Boolean> monitorFinished(MonitorFinishedVo monitorFinishedVo, String tenantId){
         List<String> patientCodes = monitorFinishedVo.getPatientCodes();
         if(CollectionUtil.isEmpty(patientCodes)){
             throw new CustomException("请选择一个病患");
@@ -136,7 +136,7 @@ public class BusPatientController  {
                 })
                 .findAny();
         if(existRepeatDevice.isPresent()){
-            return R.result(ResultCode.PATIENT_DEVICE_REPEAT,String.format("病号【%s】当前绑定了多个设备,请将多余设备结束后结束管理",existRepeatDevice.get().getCode()));
+            return R.fail(String.format("病号【%s】当前绑定了多个设备,请将多余设备结束后结束管理",existRepeatDevice.get().getCode()));
         }
         //组装撤泵信息
         List<ManualUndoConfig> undoConfigs = patientOperators.stream().map(operator ->
@@ -145,7 +145,7 @@ public class BusPatientController  {
                 .collect(Collectors.toList());
         //病患绑定的有设备,对设备进行撤泵操作,且结束临床
         deviceRunningService.batchUndo(undoConfigs,true);
-        return R.success();
+        return R.success(true);
     }
 
     /**
@@ -155,13 +155,13 @@ public class BusPatientController  {
      * @param monitorFinishedVo
      * @return R
      */
-    private R manualFinished(MonitorFinishedVo monitorFinishedVo){
+    private R<Boolean> manualFinished(MonitorFinishedVo monitorFinishedVo){
         List<String> clinicIds = monitorFinishedVo.getClinicIds();
         if (CollectionUtil.isEmpty(clinicIds)) {
             throw new CustomException("未选择临床信息");
         }
         manualService.finishedMonitor(monitorFinishedVo);
-        return R.success();
+        return R.success(true);
     }
 
 

+ 25 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/HisStrategyEnum.java

@@ -0,0 +1,25 @@
+package com.coffee.bus.his.strategy;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisStrategyEnum.java
+ * @Description TODO
+ * @createTime 2022年05月12日 14:52:00
+ */
+@AllArgsConstructor
+@Getter
+public enum  HisStrategyEnum  implements IEnum<Integer> {
+
+    NEW(1,"只拉取最新的病人数据"),
+    PART(2,"拉取部分病人数据"),
+    ALL(3,"拉取所有的病人数据,(例、最新三个月)"),;
+
+    private Integer value;
+    private String text;
+
+}

+ 2 - 2
coffee-system/src/main/java/com/coffee/bus/service/strategy/HisStrategy.java → coffee-system/src/main/java/com/coffee/bus/his/strategy/HisStrategyHandler.java

@@ -1,4 +1,4 @@
-package com.coffee.bus.service.strategy;
+package com.coffee.bus.his.strategy;
 
 import com.coffee.bus.entity.BusClinicEntity;
 import java.util.*;
@@ -9,7 +9,7 @@ import java.util.*;
  * @Description his系统数据的处理策略
  * @createTime 2022年05月12日 09:33:00
  */
-public interface HisStrategy {
+public interface HisStrategyHandler {
     /**
      * 描述: 处理策略id,保证id的唯一性
      * @author lifang

+ 30 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/HisStrategyManager.java

@@ -0,0 +1,30 @@
+package com.coffee.bus.his.strategy;
+
+import java.util.*;
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisStrategyManager.java
+ * @Description TODO
+ * @createTime 2022年05月12日 14:45:00
+ */
+public interface HisStrategyManager<T extends HisStrategyHandler> {
+    /**
+     * 描述: 获取策略类型
+     * @author lifang
+     * @date  14:48
+     * @param
+     * @see  HisStrategyEnum
+     * @return String
+     */
+    HisStrategyEnum getType();
+
+    /**
+     * 描述: 获取策略处理器
+     * @author lifang
+     * @date 2022/5/12 14:48
+     * @param
+     * @return List<HisStrategyHandler>
+     */
+    List<T> getStrategies();
+}

+ 58 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/all/EqualsStrategyHandler.java

@@ -0,0 +1,58 @@
+package com.coffee.bus.his.strategy.all;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.service.LocalBusClinicService;
+import com.coffee.bus.his.strategy.HisStrategyHandler;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName EqualsStrategyHandler.java
+ * @Description 从his拉取的数据多于当前数据库存储的数据
+ * his          手术场次: 一  、 二 、 三
+ * 数据库存储    手术场次: 一 、 二 、三
+ * 按照场次对场次相同的手术进行对比,对新增手术进行新增操作
+ * @createTime 2022年05月12日 11:13:00
+ */
+@Component
+@Slf4j
+@AllArgsConstructor
+public class EqualsStrategyHandler implements HisAllStrategyHandler {
+    private final LocalBusClinicService clinicService;
+    @Override
+    public String getId() {
+        return "equal";
+    }
+
+    @Override
+    public String getDescription() {
+        return "拉取的his手术数量和数据库存储的手术数量相等";
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handle(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        //空数据不处理
+        if(CollectionUtil.isEmpty(source)){
+            return;
+        }
+        source.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        target.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        for (int i = 0; i < source.size(); i++) {
+            clinicService.compareFromHis(source.get(i),target.get(i));
+        }
+    }
+
+    @Override
+    public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        return CollectionUtil.size(source)==CollectionUtil.size(target);
+    }
+}

+ 13 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/all/HisAllStrategyHandler.java

@@ -0,0 +1,13 @@
+package com.coffee.bus.his.strategy.all;
+
+import com.coffee.bus.his.strategy.HisStrategyHandler;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisAllStrategyHandler.java
+ * @Description TODO
+ * @createTime 2022年05月12日 14:55:00
+ */
+public interface HisAllStrategyHandler extends HisStrategyHandler {
+}

+ 36 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/all/HisAllStrategyManager.java

@@ -0,0 +1,36 @@
+package com.coffee.bus.his.strategy.all;
+
+import com.coffee.bus.his.strategy.HisStrategyEnum;
+import com.coffee.bus.his.strategy.HisStrategyManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisAllStrategyManager.java
+ * @Description his拉取病人全部的临床数据
+ * @createTime 2022年05月12日 14:49:00
+ */
+@Component
+public class HisAllStrategyManager  implements HisStrategyManager<HisAllStrategyHandler> {
+
+    private List<HisAllStrategyHandler> handlers;
+
+    @Autowired
+    public HisAllStrategyManager(List<HisAllStrategyHandler> handlers) {
+        this.handlers = handlers;
+    }
+
+    @Override
+    public HisStrategyEnum getType() {
+        return HisStrategyEnum.ALL;
+    }
+
+    @Override
+    public List<HisAllStrategyHandler> getStrategies() {
+        return handlers;
+    }
+}

+ 56 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/all/LessToMoreHisStrategyHandler.java

@@ -0,0 +1,56 @@
+package com.coffee.bus.his.strategy.all;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.service.LocalBusClinicService;
+import com.coffee.bus.his.strategy.HisStrategyHandler;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName LessToMoreHisStrategyHandler.java
+ * @Description 从his拉取的数据多于当前数据库存储的数据,按照时间先后只更新最新的N场手术数据,其他的数据不做任何处理
+ * his          手术场次: 一  、 二
+ * 数据库存储    手术场次: 一 、 二 、三
+ * @createTime 2022年05月12日 13:53:00
+ */
+@AllArgsConstructor
+@Component
+public class LessToMoreHisStrategyHandler implements HisAllStrategyHandler {
+    private final LocalBusClinicService clinicService;
+    @Override
+    public String getId() {
+        return "less-to-more";
+    }
+
+    @Override
+    public String getDescription() {
+        return "his拉取数据少于数据库数据";
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handle(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        //当HIS未拉取任何数据时,不做任何处理
+        if(CollectionUtil.isEmpty(source)){
+            return;
+        }
+        source.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        target.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        int subSize = target.size() - source.size();
+        for (int i = 0; i < source.size(); i++) {
+            clinicService.compareFromHis(source.get(i),target.get(subSize+i));
+        }
+    }
+
+    @Override
+    public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        return CollectionUtil.size(source)<CollectionUtil.size(target);
+    }
+}

+ 5 - 5
coffee-system/src/main/java/com/coffee/bus/service/strategy/MoreToLessHisStrategy.java → coffee-system/src/main/java/com/coffee/bus/his/strategy/all/MoreToLessHisStrategyHandler.java

@@ -1,9 +1,9 @@
-package com.coffee.bus.service.strategy;
+package com.coffee.bus.his.strategy.all;
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUtil;
 import com.coffee.bus.entity.BusClinicEntity;
 import com.coffee.bus.service.LocalBusClinicService;
+import com.coffee.bus.his.strategy.HisStrategyHandler;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -14,7 +14,7 @@ import java.util.*;
 /**
  * @author lifang
  * @version 1.0.0
- * @ClassName MoreToLessHisStrategy.java
+ * @ClassName MoreToLessHisStrategyHandler.java
  * @Description 从his拉取的数据多于当前数据库存储的数据
  * his          手术场次: 一  、 二 、 三
  * 数据库存储    手术场次: 一 、 二
@@ -24,7 +24,7 @@ import java.util.*;
 @Component
 @Slf4j
 @AllArgsConstructor
-public class MoreToLessHisStrategy implements HisStrategy {
+public class MoreToLessHisStrategyHandler implements HisAllStrategyHandler {
     private final LocalBusClinicService clinicService;
     @Override
     public String getId() {
@@ -63,7 +63,7 @@ public class MoreToLessHisStrategy implements HisStrategy {
 
     @Override
     public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
-        return CollectionUtil.isNotEmpty(source)&&(CollectionUtil.isEmpty(target)||source.size()>target.size());
+        return CollectionUtil.size(source)>CollectionUtil.size(target);
     }
 
 

+ 75 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/onlynew/DefaultHisNewStrategyHandler.java

@@ -0,0 +1,75 @@
+package com.coffee.bus.his.strategy.onlynew;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.service.LocalBusClinicService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName DefaultHisNewStrategyHandler.java
+ * @Description TODO
+ * @createTime 2022年05月12日 15:01:00
+ */
+@Component
+@AllArgsConstructor
+public class DefaultHisNewStrategyHandler implements HisNewStrategyHandler {
+    private final LocalBusClinicService clinicService;
+    @Override
+    public String getId() {
+        return "new-clinic";
+    }
+
+    @Override
+    public String getDescription() {
+        return "his只提供最新的一跳病人数据,对其进行处理";
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handle(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        if(CollectionUtil.isEmpty(source)){
+            return;
+        }
+        //是否插入新的数据
+        boolean insert=true;
+        //是否为设置为当前的临床数据
+        boolean isCurrent=false;
+        BusClinicEntity clinic = source.get(0);
+        if(CollectionUtil.isEmpty(target)){
+            isCurrent=true;
+        }else {
+            target.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+            //获取最新的临床数据
+            BusClinicEntity newClinic = target.get(target.size() - 1);
+            if(clinic.getStartTime().equals(newClinic.getStartTime())){
+                //临床数据未发生变化
+                clinicService.compareFromHis(clinic,newClinic);
+                insert=false;
+            }else if(clinic.getStartTime().after(newClinic.getStartTime())){
+                isCurrent=true;
+            }else {
+                //旧的数据丢掉
+                insert=false;
+            }
+        }
+        if(insert){
+            clinicService.insertFromHis(clinic);
+        }
+        if(isCurrent){
+            clinicService.setCurrentClinicByHis(clinic);
+        }
+    }
+
+    @Override
+    public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        return CollectionUtil.isNotEmpty(source);
+    }
+}

+ 13 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/onlynew/HisNewStrategyHandler.java

@@ -0,0 +1,13 @@
+package com.coffee.bus.his.strategy.onlynew;
+
+import com.coffee.bus.his.strategy.HisStrategyHandler;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisPartStrategyHandler.java
+ * @Description TODO
+ * @createTime 2022年05月12日 14:59:00
+ */
+public interface HisNewStrategyHandler extends HisStrategyHandler {
+}

+ 30 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/onlynew/HisNewStrategyManager.java

@@ -0,0 +1,30 @@
+package com.coffee.bus.his.strategy.onlynew;
+
+import com.coffee.bus.his.strategy.HisStrategyEnum;
+import com.coffee.bus.his.strategy.HisStrategyManager;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisNewStrategyManager.java
+ * @Description his只拉取病人最新的历史数据
+ * @createTime 2022年05月12日 14:50:00
+ */
+@Component
+@AllArgsConstructor
+public class HisNewStrategyManager implements HisStrategyManager<HisNewStrategyHandler> {
+    private final List<HisNewStrategyHandler> handlers;
+    @Override
+    public HisStrategyEnum getType() {
+        return HisStrategyEnum.NEW;
+    }
+
+    @Override
+    public List<HisNewStrategyHandler> getStrategies() {
+        return handlers;
+    }
+}

+ 85 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/part/DefaultHisPartStrategyHandler.java

@@ -0,0 +1,85 @@
+package com.coffee.bus.his.strategy.part;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.his.strategy.all.HisAllStrategyHandler;
+import com.coffee.bus.his.strategy.onlynew.HisNewStrategyHandler;
+import com.coffee.bus.service.LocalBusClinicService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName DefaultHisPartStrategyHandler.java
+ * @Description TODO
+ * @createTime 2022年05月12日 15:01:00
+ */
+@Component
+@AllArgsConstructor
+public class DefaultHisPartStrategyHandler implements HisNewStrategyHandler {
+    private final LocalBusClinicService clinicService;
+    private final List<HisAllStrategyHandler> allStrategyHandlers;
+    @Override
+    public String getId() {
+        return "part-clinic";
+    }
+
+    @Override
+    public String getDescription() {
+        return "his只提供一部分病人数据(如,最近3个月),对其进行处理";
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handle(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        if(CollectionUtil.isEmpty(source)){
+            return;
+        }
+        source.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        if(CollectionUtil.isEmpty(target)){
+            //只插入
+            insert(source);
+        }else {
+            //his拉取数据中最早的手术开始时间
+            BusClinicEntity earliest = source.get(0);
+            target.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+            //按照时间比较,找到第一个比his拉取数据大的手术信息
+            int start=0;
+            for (; start < target.size(); start++) {
+                BusClinicEntity existClinic = target.get(start);
+                if(existClinic.getStartTime().equals(earliest.getStartTime())){
+                    break;
+                }
+                if(existClinic.getStartTime().after(earliest.getStartTime())){
+                    //start下限为0
+                    start=start>0?start-1:0;
+                    break;
+                }
+            }
+            if(start>=target.size()){
+                insert(source);
+            }else {
+                //走全处理的逻辑
+                List<BusClinicEntity> existClinics = target.subList(start, target.size());
+                allStrategyHandlers.stream()
+                        .filter(handler->handler.apply(source,existClinics))
+                        .forEach(handler->handler.handle(source,existClinics));
+            }
+        }
+
+    }
+
+    public void insert(List<BusClinicEntity> source){
+        source.forEach(clinicService::insertFromHis);
+        clinicService.setCurrentClinicByHis(source.get(source.size()-1));
+    }
+    @Override
+    public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        return CollectionUtil.isNotEmpty(source);
+    }
+}

+ 13 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/part/HisPartStrategyHandler.java

@@ -0,0 +1,13 @@
+package com.coffee.bus.his.strategy.part;
+
+import com.coffee.bus.his.strategy.HisStrategyHandler;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisPartStrategyHandler.java
+ * @Description TODO
+ * @createTime 2022年05月12日 14:59:00
+ */
+public interface HisPartStrategyHandler extends HisStrategyHandler {
+}

+ 30 - 0
coffee-system/src/main/java/com/coffee/bus/his/strategy/part/HisPartStrategyManager.java

@@ -0,0 +1,30 @@
+package com.coffee.bus.his.strategy.part;
+
+import com.coffee.bus.his.strategy.HisStrategyEnum;
+import com.coffee.bus.his.strategy.HisStrategyManager;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisNewStrategyManager.java
+ * @Description his只拉取病人最新的历史数据
+ * @createTime 2022年05月12日 14:50:00
+ */
+@Component
+@AllArgsConstructor
+public class HisPartStrategyManager implements HisStrategyManager<HisPartStrategyHandler> {
+    private final List<HisPartStrategyHandler> handlers;
+    @Override
+    public HisStrategyEnum getType() {
+        return HisStrategyEnum.PART;
+    }
+
+    @Override
+    public List<HisPartStrategyHandler> getStrategies() {
+        return handlers;
+    }
+}

+ 5 - 3
coffee-system/src/main/java/com/coffee/bus/listener/event/bean/HisEvent.java

@@ -18,16 +18,18 @@ import java.time.Clock;
 public class HisEvent extends ApplicationEvent {
     private final String hospitalId;
     private final List<BusClinicEntity> clinics;
-
-    public HisEvent(Object source,List<BusClinicEntity> clinics, @NotNull String hospitalId) {
+    private final String patientCode;
+    public HisEvent(Object source,List<BusClinicEntity> clinics, @NotNull String hospitalId, @NotNull String patientCode) {
         super(source);
         this.hospitalId=hospitalId;
         this.clinics=clinics;
+        this.patientCode=patientCode;
     }
 
-    public HisEvent(Object source, Clock clock, List<BusClinicEntity> clinics, @NotNull String hospitalId) {
+    public HisEvent(Object source, Clock clock, List<BusClinicEntity> clinics, @NotNull String hospitalId, @NotNull  String patientCode) {
         super(source, clock);
         this.hospitalId=hospitalId;
         this.clinics=clinics;
+        this.patientCode=patientCode;
     }
 }

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

@@ -1,6 +1,9 @@
 package com.coffee.bus.service;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -106,6 +109,6 @@ public class LocalBusDeviceManualService extends BaseService<BusDeviceManualMapp
                 .in(BusClinicEntity::getId,vo.getClinicIds())
                 .set(BusClinicEntity::getFinished,true)
                 .set(BusClinicEntity::getEndTime,vo.getUndo().getUndoTime())
-                .set(BusClinicEntity::getUndoConfig,vo.getUndo()));
+                .set(BusClinicEntity::getUndoConfig, vo.getUndo(),"typeHandler = com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"));
     }
 }

+ 2 - 1
coffee-system/src/main/java/com/coffee/bus/service/dto/UndoDeviceConfig.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -16,7 +17,7 @@ import java.util.Date;
  */
 @Data
 @ApiModel("撤泵所填信息")
-public class UndoDeviceConfig {
+public class UndoDeviceConfig implements Serializable {
     @ApiModelProperty("撤泵人")
     @NotNull(message = "撤泵人不能为空")
     private String undoBy;

+ 0 - 35
coffee-system/src/main/java/com/coffee/bus/service/strategy/EqualsStrategy.java

@@ -1,35 +0,0 @@
-package com.coffee.bus.service.strategy;
-
-import cn.hutool.core.collection.CollectionUtil;
-import com.coffee.bus.entity.BusClinicEntity;
-
-import java.util.List;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName EqualsStrategy.java
- * @Description TODO
- * @createTime 2022年05月12日 11:13:00
- */
-public class EqualsStrategy implements HisStrategy {
-    @Override
-    public String getId() {
-        return "equal";
-    }
-
-    @Override
-    public String getDescription() {
-        return "拉取的his手术数量和数据库存储的手术数量相等";
-    }
-
-    @Override
-    public void handle(List<BusClinicEntity> source, List<BusClinicEntity> target) {
-
-    }
-
-    @Override
-    public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
-        return (CollectionUtil.isEmpty(source)&&CollectionUtil.isEmpty(target))||source.size()==target.size();
-    }
-}

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

@@ -55,186 +55,11 @@ public class HisInfoListener {
         this.patientService = patientService;
     }
 
-    private HisInfoListener hisInfoListener;
-
-    @PostConstruct
-    public void init(){
-        hisInfoListener = SpringUtil.getBean(HisInfoListener.class);
-    }
 
     @EventListener
     @Transactional(rollbackFor = Exception.class)
     public void historyInfoListener(HisEvent infoEvent){
         List<BusClinicEntity> clinics = infoEvent.getClinics();
-        if(CollectionUtil.isEmpty(clinics)){
-            return;
-        }
-        //处理病人信息
-        BusPatientEntity patient = clinics.stream().map(clinicEntity -> {
-            BusPatientEntity patientEntity = new BusPatientEntity();
-            patientEntity.setName(clinicEntity.getPatientName());
-            patientEntity.setGender(clinicEntity.getPatientGender());
-            patientEntity.setCode(clinicEntity.getPatientCode());
-            patientEntity.setTenantId(clinicEntity.getTenantId());
-            return patientEntity;
-        }).findFirst().get();
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(patient.getTenantId(), patient.getCode());
-        String name = patientOperator.getName();
-        if(StrUtil.isNullOrUndefined(name)){
-            patientService.update(new UpdateWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode,patient.getCode())
-                    .eq(BusPatientEntity::getTenantId,patient.getTenantId())
-                    .set(BusPatientEntity::getName,patient.getName())
-                    .set(BusPatientEntity::getGender,patient.getGender()));
-            patientOperator.setName(patient.getName());
-            patientOperator.setGender(patient.getGender());
-        }
-        //处理病人手术信息
-        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())
-                    .set(BusInfusionHistoryEntity::getClinicStartTime,clinic.getStartTime())
-                    .eq(BusInfusionHistoryEntity::getTenantId,clinic.getTenantId())
-                    .ge(BusInfusionHistoryEntity::getStartTime,clinic.getStartTime())
-                    .le(BusInfusionHistoryEntity::getClinicStartTime,clinic.getStartTime())
-            );
-        }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);
-            Boolean finished = patientOperator.getFinished();
-            if(Boolean.TRUE.equals(finished)){
-                clinicService.update(new UpdateWrapper<BusClinicEntity>()
-                        .lambda()
-                        .eq(BusClinicEntity::getId,clinic.getId())
-                        .set(BusClinicEntity::getFinished,true));
-            }
-            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);
-                clinicService.update(new UpdateWrapper<BusClinicEntity>()
-                        .lambda()
-                        .ne(BusClinicEntity::getId,clinic.getId())
-                        .eq(BusClinicEntity::getPatientCode,clinic.getPatientCode())
-                        .eq(BusClinicEntity::getTenantId,clinic.getTenantId())
-                        .set(BusClinicEntity::getFinished,true));
-                return;
-            }else {
-                //运行临床信息不发生变化,将该次临床置为结束状态, 进行撤泵操作 todo
-                clinicService.update(new UpdateWrapper<BusClinicEntity>()
-                        .lambda()
-                        .eq(BusClinicEntity::getId,clinic.getId())
-                        .set(BusClinicEntity::getFinished,true));
-            }
-        }
-    }
-
-    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())
-                            .orderByAsc(BusInfusionHistoryEntity::getStartTime).last("limit 1"));
-            if(infusion!=null){
-                //临床信息发生变化
-                if(Boolean.TRUE.equals(patientOperator.getFinished())){
-                    clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda()
-                    .eq(BusClinicEntity::getId,clinic.getId())
-                    .set(BusClinicEntity::getFinished,false)
-                    );
-                    patientOperator.setFinished(false);
-                }else {
-                    //重新计算病人该次临床的开始时间
-                }
-            }
-
-        }
-        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 实时传输病人临床数据
 
     }
 }

+ 1 - 1
coffee-system/src/main/resources/mapper/bus/BusDeviceManualMapper.xml

@@ -48,7 +48,7 @@
                 </foreach>
             </if>
         </where>
-        order by c.monitor_start_time desc
+        order by c.monitor_start_time desc,c.patient_code desc
     </select>
 
 </mapper>