Ver Fonte

add 从his拉取数据时自动添加常量信息

A17404李放 há 3 anos atrás
pai
commit
5d9c23f888
16 ficheiros alterados com 271 adições e 100 exclusões
  1. 7 2
      coffee-admin/src/test/java/com/coffee/admin/BusHospitalTest.java
  2. 11 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusConDoctor.java
  3. 9 2
      coffee-system/src/main/java/com/coffee/bus/entity/BusConMixEntity.java
  4. 4 4
      coffee-system/src/main/java/com/coffee/bus/enums/ConstantMixEnum.java
  5. 12 28
      coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManager.java
  6. 5 17
      coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManagerRegister.java
  7. 40 18
      coffee-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSession.java
  8. 8 2
      coffee-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSessionManager.java
  9. 9 1
      coffee-system/src/main/java/com/coffee/bus/hospital/his/strategy/all/EqualsStrategyHandler.java
  10. 2 0
      coffee-system/src/main/java/com/coffee/bus/hospital/his/strategy/all/MoreToLessHisStrategyHandler.java
  11. 4 0
      coffee-system/src/main/java/com/coffee/bus/mapper/BusConMixMapper.java
  12. 4 1
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  13. 56 0
      coffee-system/src/main/java/com/coffee/bus/service/constant/LocalBusConDoctorService.java
  14. 86 3
      coffee-system/src/main/java/com/coffee/bus/service/constant/LocalBusConMixService.java
  15. 7 19
      coffee-system/src/main/java/com/coffee/bus/service/dto/ClinicQuery.java
  16. 7 3
      coffee-system/src/main/java/com/coffee/bus/websocket/DefaultWebSocketMsgHandler.java

+ 7 - 2
coffee-admin/src/test/java/com/coffee/admin/BusHospitalTest.java

@@ -5,7 +5,9 @@ import com.coffee.bus.bean.GeoPoint;
 import com.coffee.bus.bean.Script;
 import com.coffee.bus.controller.BusHospitalController;
 import com.coffee.bus.entity.BusHospitalEntity;
+import com.coffee.bus.enums.ConstantMixEnum;
 import com.coffee.bus.service.LocalBusHospitalService;
+import com.coffee.bus.service.constant.LocalBusConMixService;
 import com.coffee.bus.utils.CodeUtils;
 import com.coffee.common.result.R;
 import org.junit.Test;
@@ -14,7 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -29,6 +33,8 @@ public class BusHospitalTest {
     @Autowired
     private LocalBusHospitalService busHospitalService;
 
+    @Autowired
+    private LocalBusConMixService conMixService;
     @Autowired
     private BusHospitalController busHospitalController;
     @Test
@@ -87,7 +93,6 @@ public class BusHospitalTest {
 
     @Test
     public void debug(){
-//        R debug = busHospitalController.debug("1505789859765604353", "{\"ceshi\":\"测试\" , \"age\":\"20\" }");
-//        System.out.println(debug);
+//        conMixService.insertUniqueCon(ConstantMixEnum.ward, Arrays.asList("手术名称1","手术名称2","手术3").stream().collect(Collectors.toSet()), "1");
     }
 }

+ 11 - 0
coffee-system/src/main/java/com/coffee/bus/entity/BusConDoctor.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
 import org.hibernate.validator.constraints.Length;
 
@@ -21,6 +22,7 @@ import org.hibernate.validator.constraints.Length;
 @TableName(value = "bus_con_doctor",autoResultMap = true)
 @ApiModel(value="常量人员", description="包括:病区、手术、ASA、镇痛、麻醉、药品分类、医嘱")
 @ToString
+@NoArgsConstructor
 public class BusConDoctor extends TenantGenericEntity<String,String> {
 
     @ApiModelProperty(value = "医生名称")
@@ -39,4 +41,13 @@ public class BusConDoctor extends TenantGenericEntity<String,String> {
 
     @ApiModelProperty(value = "是否为配置、撤泵、评价人员")
     private Boolean reviewer;
+
+    public BusConDoctor(String name, Boolean surgeon, Boolean anesthetists, Boolean reviewer, String remark,String tenantId) {
+        this.name = name;
+        this.remark = remark;
+        this.surgeon = surgeon;
+        this.anesthetists = anesthetists;
+        this.reviewer = reviewer;
+        this.setTenantId(tenantId);
+    }
 }

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

@@ -1,6 +1,5 @@
 package com.coffee.bus.entity;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.coffee.bus.enums.ConstantMixEnum;
 import com.coffee.common.entity.TenantGenericEntity;
@@ -8,8 +7,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
-import org.apache.ibatis.type.EnumTypeHandler;
 import org.hibernate.validator.constraints.Length;
 
 /**
@@ -24,6 +23,7 @@ import org.hibernate.validator.constraints.Length;
 @TableName(value = "bus_con_mix",autoResultMap = true)
 @ApiModel(value="常量设置的混合类", description="包括:病区、手术、ASA、镇痛、麻醉、药品分类、医嘱")
 @ToString
+@NoArgsConstructor
 public class BusConMixEntity extends TenantGenericEntity<String,String> {
 
     @ApiModelProperty(value = "常量名称")
@@ -38,4 +38,11 @@ public class BusConMixEntity extends TenantGenericEntity<String,String> {
     private ConstantMixEnum type;
 
     private String code;
+
+    public BusConMixEntity(String name, ConstantMixEnum type,String tenantId,String remark) {
+        this.name = name;
+        this.type = type;
+        this.remark=remark;
+        this.setTenantId(tenantId);
+    }
 }

+ 4 - 4
coffee-system/src/main/java/com/coffee/bus/enums/ConstantMixEnum.java

@@ -25,10 +25,10 @@ public enum ConstantMixEnum  implements IEnum<Integer> {
     surgery(1,"手术名称"),
     @ApiModelProperty("asa")
     asa(2,"asa"),
-    @ApiModelProperty("麻醉手术")
-    anaesthesia(3,"麻醉手术"),
-    @ApiModelProperty("镇痛手术")
-    anal(4,"镇痛手术"),
+    @ApiModelProperty("麻醉方式")
+    anaesthesia(3,"麻醉方式"),
+    @ApiModelProperty("镇痛方式")
+    anal(4,"镇痛方式"),
     @ApiModelProperty("药品分类")
     drugCate(5,"药品分类"),
     @ApiModelProperty("医嘱")

+ 12 - 28
coffee-system/src/main/java/com/coffee/bus/hospital/HospitalManager.java

@@ -1,6 +1,7 @@
 package com.coffee.bus.hospital;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.coffee.bus.bean.Script;
@@ -20,10 +21,12 @@ import com.coffee.bus.registry.patient.PatientRegistry;
 import com.coffee.bus.hospital.script.ScriptManager;
 import com.coffee.bus.hospital.script.ScriptParse;
 import com.coffee.bus.service.*;
+import com.coffee.bus.service.constant.LocalBusConMixService;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.cache.ConfigStorage;
 import com.coffee.common.cache.manager.ConfigStorageManager;
 import com.coffee.common.util.RedissonUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.Data;
 
 import java.util.List;
@@ -51,52 +54,33 @@ public class HospitalManager {
 
     private HospitalFunctionExtraConfigHandler extraConfigHandler;
 
-    private LocalBusHospitalService hospitalService;
-
     private LocalBusHospitalConfigService hospitalConfigService;
 
-    private LocalBusClinicService clinicService;
-
     private ScriptManager scriptManager;
 
     private ConfigStorage storage;
 
-    private LocalBusDeviceAlarmService alarmService;
-
-    private LocalBusPatientService patientService;
-
-    private LocalBusHospitalLogService hospitalLogService;
+    private LocalBusHospitalService hospitalService;
     public HospitalManager(String hospitalId,
-                           LocalBusHospitalService hospitalService,
-                           LocalBusHospitalConfigService hospitalConfigService,
-                           LocalBusClinicService clinicService,
-                           LocalBusInfusionHistoryService infusionHistoryService,
                            DeviceRegistry deviceRegistry,
                            WsPublishUtils wsPublishUtils,
                            ScriptManager scriptManager,
                            ConfigStorageManager configStorageManager,
-                           RedissonUtil redissonUtil,
-                           LocalBusDeviceAlarmService alarmService,
-                           LocalBusHospitalLogService hospitalLogService,
-                           LocalBusPatientService patientService) {
+                           RedissonUtil redissonUtil) {
         this.hospitalId = hospitalId;
-        this.hospitalService = hospitalService;
-        this.hospitalConfigService = hospitalConfigService;
-        this.clinicService = clinicService;
+        this.hospitalService= SpringUtil.getBean(LocalBusHospitalService.class);
+        this.hospitalConfigService = SpringUtil.getBean(LocalBusHospitalConfigService.class);
         this.scriptManager = scriptManager;
-        this.hospitalId = hospitalId;
         this.storage=configStorageManager.getStorage(hospitalId);
-        this.alarmService=alarmService;
-        this.hospitalLogService=hospitalLogService;
-        this.autoUndoConfigHandler=new HospitalAutoUndoConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils,patientService);
-        this.finishMonitorConfigHandler=new HospitalFinishMonitorConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils,patientService);
-        this.analConfigHandler=new HospitalFunctionAnalConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils,alarmService);
-        this.extraConfigHandler=new HospitalFunctionExtraConfigHandler(storage,hospitalId,redissonUtil,infusionHistoryService,deviceRegistry,wsPublishUtils,finishMonitorConfigHandler,autoUndoConfigHandler,alarmService,patientService);
+        this.autoUndoConfigHandler=new HospitalAutoUndoConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusPatientService.class));
+        this.finishMonitorConfigHandler=new HospitalFinishMonitorConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusPatientService.class));
+        this.analConfigHandler=new HospitalFunctionAnalConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,SpringUtil.getBean(LocalBusDeviceAlarmService.class));
+        this.extraConfigHandler=new HospitalFunctionExtraConfigHandler(storage,hospitalId,redissonUtil,SpringUtil.getBean(LocalBusInfusionHistoryService.class),deviceRegistry,wsPublishUtils,finishMonitorConfigHandler,autoUndoConfigHandler,SpringUtil.getBean(LocalBusDeviceAlarmService.class),SpringUtil.getBean(LocalBusPatientService.class));
         init(configStorageManager);
     }
 
     private void init(ConfigStorageManager configStorageManager){
-        this.scriptSession=new HisScriptSession(hospitalId,scriptManager,configStorageManager,clinicService,hospitalService,hospitalLogService,patientService);
+        this.scriptSession=new HisScriptSession(hospitalId,scriptManager,configStorageManager);
         refreshInfo();
         refreshConfig();
         refreshScript();

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

@@ -3,9 +3,11 @@ package com.coffee.bus.hospital;
 import com.coffee.bus.registry.device.DeviceRegistry;
 import com.coffee.bus.hospital.script.ScriptManager;
 import com.coffee.bus.service.*;
+import com.coffee.bus.service.constant.LocalBusConMixService;
 import com.coffee.bus.utils.WsPublishUtils;
 import com.coffee.common.cache.manager.ConfigStorageManager;
 import com.coffee.common.util.RedissonUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -22,42 +24,28 @@ import java.util.concurrent.ConcurrentHashMap;
 public class HospitalManagerRegister {
     private Map<String,HospitalManager> managerMap=new ConcurrentHashMap<>();
 
-    private LocalBusHospitalService hospitalService;
-    private LocalBusHospitalConfigService hospitalConfigService;
-    private LocalBusClinicService clinicService;
-    private LocalBusInfusionHistoryService infusionHistoryService;
     private DeviceRegistry deviceRegistry;
     private WsPublishUtils wsPublishUtils;
     private ScriptManager scriptManager;
     private ConfigStorageManager configStorageManager;
     private RedissonUtil redissonUtil;
-    private LocalBusDeviceAlarmService alarmService;
-    private LocalBusHospitalLogService hospitalLogService;
-    private LocalBusPatientService patientService;
-    public HospitalManagerRegister( LocalBusHospitalService hospitalService, LocalBusHospitalConfigService hospitalConfigService, LocalBusClinicService clinicService, LocalBusInfusionHistoryService infusionHistoryService,  DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, ScriptManager scriptManager, ConfigStorageManager configStorageManager,LocalBusDeviceAlarmService alarmService,LocalBusHospitalLogService hospitalLogService, RedissonUtil redissonUtil,LocalBusPatientService patientService) {
-        this.hospitalService = hospitalService;
-        this.hospitalConfigService = hospitalConfigService;
-        this.clinicService = clinicService;
-        this.infusionHistoryService = infusionHistoryService;
+    public HospitalManagerRegister(DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, ScriptManager scriptManager, ConfigStorageManager configStorageManager, RedissonUtil redissonUtil) {
         this.deviceRegistry = deviceRegistry;
         this.wsPublishUtils = wsPublishUtils;
         this.scriptManager = scriptManager;
         this.configStorageManager = configStorageManager;
         this.redissonUtil = redissonUtil;
-        this.alarmService=alarmService;
-        this.hospitalLogService=hospitalLogService;
-        this.patientService=patientService;
     }
 
     public void register(String hospitalId){
         managerMap.computeIfAbsent(hospitalId,k->
-                new HospitalManager(k,hospitalService,hospitalConfigService,clinicService,infusionHistoryService,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil,alarmService,hospitalLogService,patientService)
+                new HospitalManager(k,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil)
         );
     };
 
     public HospitalManager get(String hospitalId){
         return  managerMap.computeIfAbsent(hospitalId,k->
-                new HospitalManager(k,hospitalService,hospitalConfigService,clinicService,infusionHistoryService,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil,alarmService,hospitalLogService,patientService)
+                new HospitalManager(k,deviceRegistry,wsPublishUtils,scriptManager,configStorageManager,redissonUtil)
         );
     }
 

+ 40 - 18
coffee-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSession.java

@@ -1,22 +1,23 @@
 package com.coffee.bus.hospital.his;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSON;
-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.entity.BusClinicEntity;
-import com.coffee.bus.entity.BusHospitalEntity;
-import com.coffee.bus.entity.BusHospitalLogEntity;
-import com.coffee.bus.entity.BusPatientEntity;
+import com.coffee.bus.entity.*;
+import com.coffee.bus.enums.ConstantMixEnum;
 import com.coffee.bus.listener.event.bean.HisEvent;
 import com.coffee.bus.hospital.script.DefaultParse;
 import com.coffee.bus.service.LocalBusHospitalLogService;
 import com.coffee.bus.service.LocalBusPatientService;
+import com.coffee.bus.service.constant.LocalBusConDoctorService;
+import com.coffee.bus.service.constant.LocalBusConMixService;
 import com.coffee.common.exception.ExecuteResult;
 import com.coffee.bus.hospital.script.ScriptManager;
 import com.coffee.bus.hospital.script.ScriptParse;
@@ -28,18 +29,20 @@ import com.coffee.common.cache.value.Value;
 import com.coffee.common.exception.CustomException;
 import com.coffee.common.exception.ScriptException;
 import com.coffee.common.result.R;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.Length;
 import org.springframework.util.Assert;
 import org.springframework.web.context.request.async.DeferredResult;
 import org.tio.core.ChannelContext;
 import org.tio.core.Tio;
 import org.tio.core.utils.TioUtils;
 import org.tio.websocket.common.WsResponse;
-
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -59,15 +62,18 @@ public class HisScriptSession {
     private LocalBusHospitalService hospitalService;
     private LocalBusPatientService patientService;
     private LocalBusHospitalLogService hospitalLogService;
+    private LocalBusConMixService conMixService;
+    private LocalBusConDoctorService conDoctorService;
     private Map<String,HisRequest> hisRequestMap=new ConcurrentHashMap<>();
-
-    public HisScriptSession(String hospitalId, ScriptManager scriptManager, ConfigStorageManager configStorageManager, LocalBusClinicService clinicService, LocalBusHospitalService hospitalService, LocalBusHospitalLogService hospitalLogService,LocalBusPatientService patientService) {
+    public HisScriptSession(String hospitalId, ScriptManager scriptManager, ConfigStorageManager configStorageManager) {
         this.hospitalId = hospitalId;
         this.scriptManager = scriptManager;
-        this.clinicService = clinicService;
-        this.hospitalService=hospitalService;
-        this.hospitalLogService=hospitalLogService;
-        this.patientService=patientService;
+        this.clinicService = SpringUtil.getBean(LocalBusClinicService.class);
+        this.hospitalService=SpringUtil.getBean(LocalBusHospitalService.class);
+        this.hospitalLogService=SpringUtil.getBean(LocalBusHospitalLogService.class);
+        this.patientService=SpringUtil.getBean(LocalBusPatientService.class);
+        this.conMixService=SpringUtil.getBean(LocalBusConMixService.class);
+        this.conDoctorService=SpringUtil.getBean(LocalBusConDoctorService.class);
         init(configStorageManager,hospitalId);
     }
 
@@ -200,8 +206,11 @@ public class HisScriptSession {
         }
         ExecuteResult exec = script.exec(text);
         JSON result=null;
+        List<BusClinicEntity> sources=null;
         try {
             result = exec.getIfSuccess();
+            sources = SpringUtil.getBean(ObjectMapper.class).readValue(result.toStringPretty(), new TypeReference<List<BusClinicEntity>>() {
+            });
         }catch (Exception e){
             log.error("数据解析后转化为json失败,{},",text,e.getMessage());
             if(StrUtil.isNotEmpty(text)){
@@ -217,12 +226,23 @@ public class HisScriptSession {
                 log.error("医院日志存储异常,数据:【{}】",JSONUtil.toJsonStr(hospitalLog),e);
             }
         }
-        //数据解析完成后发布
-        JSONArray jsonArray = JSONUtil.parseArray(result);
-        List<BusClinicEntity> sources = JSONUtil.toList(jsonArray, BusClinicEntity.class);
         if(CollectionUtil.isEmpty(sources)){
             return null;
         }else {
+            BusPatientEntity patient = patientService
+                    .getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode, patientCode).eq(BusPatientEntity::getTenantId, hospitalId));
+            if(patient!=null){
+                List<BusClinicEntity> finalSources = sources;
+                CompletableFuture.runAsync(()->{
+                    conMixService.insertUniqueCon(finalSources,hospitalId);
+                    conDoctorService.insertUniqueDoctor(finalSources,hospitalId);
+                })
+                        .whenComplete((i,e)->{
+                            if(e!=null){
+                                log.error("拉取His信息存储常量失败,",e);
+                            }
+                        });
+            }
             List<BusClinicEntity> publish=new ArrayList<>();
             //对数据去重, name+startTime进行唯一值判定
             Map<String, BusClinicEntity> distinct = new HashMap<>();
@@ -233,8 +253,6 @@ public class HisScriptSession {
                     return source;
                 });
             });
-            BusPatientEntity patient = patientService
-                    .getOne(new QueryWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getCode, patientCode).eq(BusPatientEntity::getTenantId, hospitalId));
             publish.sort(Comparator.comparing(BusClinicEntity::getStartTime));
             publish.forEach(source->{
                 source.setTenantId(hospitalId);
@@ -316,7 +334,11 @@ public class HisScriptSession {
                         //正常响应
                         try {
                             BusClinicEntity clinic = handle(Value.simple(hisResponse.getContext()).asString(), hisResponse.getPatientCode());
-                            result.setResult(R.success(clinic));
+                            if(clinic==null){
+                                result.setResult(R.fail(String.format("病号【[%s]】病人数据查询为空",hisResponse.getPatientCode())));
+                            }else {
+                                result.setResult(R.success(clinic));
+                            }
                         }catch (ScriptException e){
                             result.setResult(R.fail(String.format("病号【[%s]】病人数据查询为空",hisResponse.getPatientCode())));
                         }

+ 8 - 2
coffee-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSessionManager.java

@@ -5,7 +5,9 @@ import com.coffee.bus.service.LocalBusClinicService;
 import com.coffee.bus.service.LocalBusHospitalLogService;
 import com.coffee.bus.service.LocalBusHospitalService;
 import com.coffee.bus.service.LocalBusPatientService;
+import com.coffee.bus.service.constant.LocalBusConMixService;
 import com.coffee.common.cache.manager.ClusterConfigStorageManager;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -29,14 +31,18 @@ public class HisScriptSessionManager {
     private ClusterConfigStorageManager configStorageManager;
     private LocalBusHospitalLogService hospitalLogService;
     private LocalBusPatientService patientService;
+    private LocalBusConMixService conMixService;
     @Autowired
-    public HisScriptSessionManager( LocalBusClinicService clinicService, ScriptManager scriptManager, LocalBusHospitalService hospitalService, LocalBusHospitalLogService hospitalLogService, ClusterConfigStorageManager configStorageManager,LocalBusPatientService patientService) {
+    public HisScriptSessionManager( LocalBusClinicService clinicService, ScriptManager scriptManager, LocalBusHospitalService hospitalService, LocalBusHospitalLogService hospitalLogService, ClusterConfigStorageManager configStorageManager,
+                                    LocalBusPatientService patientService,
+                                    LocalBusConMixService conMixService) {
         this.clinicService = clinicService;
         this.scriptManager = scriptManager;
         this.hospitalService = hospitalService;
         this.hospitalLogService=hospitalLogService;
         this.configStorageManager = configStorageManager;
         this.patientService=patientService;
+        this.conMixService=conMixService;
     }
 
     /**
@@ -58,7 +64,7 @@ public class HisScriptSessionManager {
      * @return HisScriptSession
      */
     public HisScriptSession register(String hospitalId){
-        return new HisScriptSession(hospitalId, scriptManager,configStorageManager, clinicService,hospitalService,hospitalLogService,patientService);
+        return new HisScriptSession(hospitalId, scriptManager,configStorageManager);
     }
 
     /**

+ 9 - 1
coffee-system/src/main/java/com/coffee/bus/hospital/his/strategy/all/EqualsStrategyHandler.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.coffee.bus.entity.BusClinicEntity;
 import com.coffee.bus.service.LocalBusClinicService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
+import com.coffee.bus.utils.WsPublishUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -28,6 +29,7 @@ import java.util.List;
 public class EqualsStrategyHandler implements HisAllStrategyHandler {
     private final LocalBusClinicService clinicService;
     private final LocalBusInfusionHistoryService infusionHistoryService;
+    private final WsPublishUtils wsPublishUtils;
     @Override
     public String getId() {
         return "equal";
@@ -56,7 +58,13 @@ public class EqualsStrategyHandler implements HisAllStrategyHandler {
         for (int i = 0; i < source.size(); i++) {
             clinicService.compareFromHis(source.get(i),target.get(i));
         }
-        clinicService.setCurrentClinicByHis(CollectionUtil.getFirst(source.iterator()));
+        long count = source.stream().map(BusClinicEntity::getStartTime).distinct().count();
+        //判断所有手术是否开始时间相同,若相同则不往下进行处理
+        if(count>1){
+            clinicService.setCurrentClinicByHis(CollectionUtil.getFirst(source.iterator()));
+        }else {
+            wsPublishUtils.publishPatientMonitor(clinicEntity.getPatientCode(),clinicEntity.getTenantId());
+        }
     }
 
     @Override

+ 2 - 0
coffee-system/src/main/java/com/coffee/bus/hospital/his/strategy/all/MoreToLessHisStrategyHandler.java

@@ -53,8 +53,10 @@ public class MoreToLessHisStrategyHandler implements HisAllStrategyHandler {
         if (CollectionUtil.isEmpty(target)) {
             //所有的source都为新增
             insert.addAll(source);
+            insert.forEach(clinicService::insertFromHis);
         }else {
             int subSize = CollectionUtil.size(source) - CollectionUtil.size(target);
+            //按照开始时间从大到小排序
             target.sort((t1,t2)->t2.getStartTime().compareTo(t1.getStartTime()));
             List<BusClinicEntity> compareSub = source.subList(subSize,CollectionUtil.size(source));
             if(timeRefresh(compareSub,target)){

+ 4 - 0
coffee-system/src/main/java/com/coffee/bus/mapper/BusConMixMapper.java

@@ -3,7 +3,11 @@ package com.coffee.bus.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.coffee.bus.entity.BusConDoctor;
 import com.coffee.bus.entity.BusConMixEntity;
+import com.coffee.bus.enums.ConstantMixEnum;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Set;
 
 /**
  * @author lifang

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

@@ -1,5 +1,6 @@
 package com.coffee.bus.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -173,12 +174,13 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
         Assert.hasText(tenantId,"医院id不可为空");
         Assert.notNull(startTime,"手术开始时间不可为空");
 
+        //遗留bug 当同一临床的开始时间发生变化时,变化后临床没有绑定输注信息,若之前的临床监控开始时间不为空,则变化后依旧保持原值不变
         List<BusInfusionHistoryEntity> infusionHistories = this.list(new QueryWrapper<BusInfusionHistoryEntity>()
                 .lambda()
                 .eq(BusInfusionHistoryEntity::getTenantId, tenantId)
                 .eq(BusInfusionHistoryEntity::getPatientCode, patientCode)
                 .ge(BusInfusionHistoryEntity::getStartTime, startTime)
-                .le(BusInfusionHistoryEntity::getClinicStartTime, startTime));
+                .lt(BusInfusionHistoryEntity::getClinicStartTime, startTime));
         if(CollectionUtil.isNotEmpty(infusionHistories)){
             infusionHistories.sort(Comparator.comparing(BusInfusionHistoryEntity::getStartTime));
             infusionHistories.forEach(infusion-> {
@@ -188,6 +190,7 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
             );
             this.updateBatchById(infusionHistories);
             clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,clinicId)
+                    .isNull(CollUtil.isEmpty(infusionHistories),BusClinicEntity::getMonitorStartTime)
                     .set(BusClinicEntity::getMonitorStartTime,infusionHistories.get(0).getStartTime()));
         }else {
             clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,clinicId)

+ 56 - 0
coffee-system/src/main/java/com/coffee/bus/service/constant/LocalBusConDoctorService.java

@@ -1,10 +1,22 @@
 package com.coffee.bus.service.constant;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.entity.BusClinicEntity;
 import com.coffee.bus.entity.BusConDoctor;
 import com.coffee.bus.enums.ConstantEnum;
 import com.coffee.bus.mapper.BusConDoctorMapper;
 import com.coffee.common.crud.BaseService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author lifang
@@ -34,4 +46,48 @@ public class LocalBusConDoctorService extends AbstractConstantService<BusConDoct
     public ConstantEnum getName() {
         return ConstantEnum.doctor;
     }
+
+    /**
+     * 描述: 插入医生常量
+     * @author lifang
+     * @date 2022/6/15 8:54
+     * @param clinics
+     * @param hospitalId
+     * @return void
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void insertUniqueDoctor(List<BusClinicEntity> clinics, String hospitalId) {
+        if(CollUtil.isEmpty(clinics)){
+            return;
+        }
+        //保存医生常量数据
+        List<BusConDoctor> busConDoctors = new ArrayList<>();
+        clinics.forEach(clinic->{
+            String anaDoctorName = clinic.getAnaDoctor();
+            String surgeryDoctorName = clinic.getSurgeryDoctor();
+            if (ObjectUtil.equal(anaDoctorName,surgeryDoctorName)) {
+                if (StrUtil.isNotEmpty(anaDoctorName)) {
+                    busConDoctors.add(new BusConDoctor(CharSequenceUtil.trim(anaDoctorName),true,true,true,"从医院自动获取",hospitalId));
+                }
+            }else {
+                if (StrUtil.isNotEmpty(anaDoctorName)) {
+                    busConDoctors.add( new BusConDoctor(CharSequenceUtil.trim(anaDoctorName),false,true,true,"从医院自动获取",hospitalId));
+                }
+                if (StrUtil.isNotEmpty(surgeryDoctorName)) {
+                    busConDoctors.add( new BusConDoctor(CharSequenceUtil.trim(surgeryDoctorName),true,false,true,"从医院自动获取",hospitalId));
+                }
+            }
+        });
+        Map<String, BusConDoctor> insertMap = new HashMap<>();
+        for (BusConDoctor busConDoctor : busConDoctors) {
+            insertMap.putIfAbsent(busConDoctor.getName(),busConDoctor);
+        }
+        List<BusConDoctor> existDoctors = this.list(new QueryWrapper<BusConDoctor>().lambda()
+                .select(BusConDoctor::getName)
+                .eq(BusConDoctor::getTenantId, hospitalId));
+        if (CollUtil.isNotEmpty(existDoctors)) {
+            existDoctors.stream().map(BusConDoctor::getName).forEach(insertMap::remove);
+        }
+        this.saveBatch(insertMap.values());
+    }
 }

+ 86 - 3
coffee-system/src/main/java/com/coffee/bus/service/constant/LocalBusConMixService.java

@@ -1,21 +1,27 @@
 package com.coffee.bus.service.constant;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.entity.BusClinicEntity;
 import com.coffee.bus.entity.BusConMixEntity;
 import com.coffee.bus.enums.ConstantEnum;
 import com.coffee.bus.enums.ConstantMixEnum;
 import com.coffee.bus.mapper.BusConMixMapper;
 import com.coffee.common.exception.CustomException;
 import com.coffee.common.util.RedissonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.Length;
 import org.redisson.api.RMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -26,6 +32,7 @@ import java.util.stream.Collectors;
  * @createTime 2022年03月19日 09:27:00
  */
 @Service
+@Slf4j
 public class LocalBusConMixService extends AbstractConstantService<BusConMixMapper, BusConMixEntity,String> implements CommandLineRunner {
     private Map<String, RMap<String,String>> wardMap=new HashMap<>();
     @Autowired
@@ -75,6 +82,82 @@ public class LocalBusConMixService extends AbstractConstantService<BusConMixMapp
         return ConstantEnum.mix;
     }
 
+    /**
+     * 描述: 插入常量
+     * @author lifang
+     * @date 2022/6/15 9:09
+     * @param clinics
+     * @param tenantId
+     * @return void
+     */
+    public void insertUniqueCon(List<BusClinicEntity> clinics, String tenantId){
+        if(CollUtil.isEmpty(clinics)){
+            return;
+        }
+        Set<String> wards = new HashSet<>();
+        Set<String> anaTypes = new HashSet<>();
+        Set<String> asaNames = new HashSet<>();
+        Set<String> analTypes= new HashSet<>();
+        Set<String> clinicNames = new HashSet<>();
+        //获取所有常量
+        List<BusConMixEntity> existCons = this.baseMapper.selectList(new QueryWrapper<BusConMixEntity>().lambda().eq(BusConMixEntity::getTenantId, tenantId));
+
+        clinics.forEach(clinic->{
+            if(StrUtil.isNotBlank(clinic.getWard())){
+                wards.add(CharSequenceUtil.trim(clinic.getWard()));
+            }
+            if(StrUtil.isNotBlank(clinic.getAnaType())){
+                anaTypes.add(CharSequenceUtil.trim(clinic.getAnaType()));
+            }
+            if(StrUtil.isNotBlank(clinic.getAnalType())){
+                analTypes.add(CharSequenceUtil.trim(clinic.getAnalType()));
+            }
+            if(StrUtil.isNotBlank(clinic.getAsa())){
+                asaNames.add(CharSequenceUtil.trim(clinic.getAsa()));
+            }
+            if(StrUtil.isNotBlank(clinic.getSurgeryName())){
+                clinicNames.add(CharSequenceUtil.trim(clinic.getSurgeryName()));
+            }
+        });
+
+        //已存在的常量集合
+        if (CollUtil.isNotEmpty(existCons)) {
+            existCons.forEach(existCon->{
+                if(ConstantMixEnum.ward.equals(existCon.getType())){
+                    wards.remove(existCon.getName());
+                }
+                if(ConstantMixEnum.anal.equals(existCon.getType())){
+                    analTypes.remove(existCon.getName());
+                }
+                if(ConstantMixEnum.anaesthesia.equals(existCon.getType())){
+                    anaTypes.remove(existCon.getName());
+                }
+                if(ConstantMixEnum.asa.equals(existCon.getType())){
+                    asaNames.remove(existCon.getName());
+                }
+                if(ConstantMixEnum.surgery.equals(existCon.getType())){
+                    clinicNames.remove(existCon.getName());
+                }
+            });
+        }
+        List<BusConMixEntity> insertMixList = new ArrayList<>();
+        wards.stream().map(name->new BusConMixEntity(name,ConstantMixEnum.ward,tenantId,"从医院自动获取")).forEach(insertMixList::add);
+        analTypes.stream().map(name->new BusConMixEntity(name,ConstantMixEnum.anal,tenantId,"从医院自动获取")).forEach(insertMixList::add);
+        anaTypes.stream().map(name->new BusConMixEntity(name,ConstantMixEnum.anaesthesia,tenantId,"从医院自动获取")).forEach(insertMixList::add);
+        asaNames.stream().map(name->new BusConMixEntity(name,ConstantMixEnum.asa,tenantId,"从医院自动获取")).forEach(insertMixList::add);
+        clinicNames.stream().map(name->new BusConMixEntity(name,ConstantMixEnum.surgery,tenantId,"从医院自动获取")).forEach(insertMixList::add);
+        if(CollUtil.isNotEmpty(insertMixList)){
+            try {
+                this.saveBatch(insertMixList);
+            }catch (DuplicateKeyException e){
+
+            }catch (Exception e){
+                log.error("常量【{}】插入失败,", JSONUtil.toJsonStr(insertMixList),e);
+            }
+
+        }
+    }
+
     @Override
     public void run(String... args) {
         List<BusConMixEntity> conList = list(new QueryWrapper<BusConMixEntity>().lambda().eq(BusConMixEntity::getType, ConstantMixEnum.ward));

+ 7 - 19
coffee-system/src/main/java/com/coffee/bus/service/dto/ClinicQuery.java

@@ -51,14 +51,11 @@ public class ClinicQuery implements Serializable {
 
 
     @ApiModelProperty("按照临床开始时间排序")
-    private Boolean clinicStartTimeDesc;
+    private Boolean monitorStartTimeDesc;
 
     @ApiModelProperty("按照临床是否结束排序")
     private Boolean clinicFinishedDesc;
 
-    @ApiModelProperty("按照临床最后上传时间排序")
-    private Boolean clinicEndTimeDesc;
-
     @ApiModelProperty(value = "降序列",hidden = true)
     @JsonIgnore
     private List<String> orderByDesc=new ArrayList<>();
@@ -67,12 +64,12 @@ public class ClinicQuery implements Serializable {
     @JsonIgnore
     private List<String> orderByAsc=new ArrayList<>();
 
-    public void setClinicStartTimeDesc(Boolean clinicStartTimeDesc) {
-        this.clinicStartTimeDesc = clinicStartTimeDesc;
-        if (Boolean.TRUE.equals(clinicStartTimeDesc)) {
-            orderByDesc.add("clinic_start_time");
-        }else if(Boolean.FALSE.equals(clinicStartTimeDesc)){
-            orderByAsc.add("clinic_start_time");
+    public void setMonitorStartTimeDesc(Boolean monitorStartTimeDesc) {
+        this.monitorStartTimeDesc = monitorStartTimeDesc;
+        if (Boolean.TRUE.equals(monitorStartTimeDesc)) {
+            orderByDesc.add("monitor_start_time");
+        }else if(Boolean.FALSE.equals(monitorStartTimeDesc)){
+            orderByAsc.add("monitor_start_time");
         }
     }
 
@@ -84,13 +81,4 @@ public class ClinicQuery implements Serializable {
             orderByAsc.add("finished");
         }
     }
-
-    public void setClinicEndTimeDesc(Boolean clinicEndTimeDesc) {
-        this.clinicEndTimeDesc = clinicEndTimeDesc;
-        if (Boolean.TRUE.equals(clinicEndTimeDesc)) {
-            orderByDesc.add("monitor_end_time");
-        }else if(Boolean.FALSE.equals(clinicEndTimeDesc)){
-            orderByAsc.add("monitor_end_time");
-        }
-    }
 }

+ 7 - 3
coffee-system/src/main/java/com/coffee/bus/websocket/DefaultWebSocketMsgHandler.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
+import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.hospital.his.HisResponse;
 import com.coffee.bus.hospital.his.HisScriptSession;
 import com.coffee.bus.hospital.his.HisScriptSessionManager;
@@ -16,7 +17,9 @@ import com.coffee.common.config.websocket.handler.WsHandler;
 import com.coffee.common.result.R;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 import org.tio.core.ChannelContext;
@@ -37,8 +40,9 @@ import java.util.stream.Collectors;
 @AutoConfigureAfter(RedisTemplate.class)
 public class DefaultWebSocketMsgHandler implements IWsMsgHandler {
     private final List<WsHandler> messageHandlers;
-    private final HisScriptSessionManager scriptSessionManager;
     private final HospitalCodeCheck codeCheck;
+    private final HospitalManagerRegister hospitalManagerRegister;
+
 
     @Override
     public HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) {
@@ -67,7 +71,7 @@ public class DefaultWebSocketMsgHandler implements IWsMsgHandler {
                 String hospitalId = codeCheck.getHospitalId(authorization);
                 if (CharSequenceUtil.isNotBlank(hospitalId)) {
                     channelContext.set(Constants.HOSPITAL_ID,hospitalId);
-                    HisScriptSession hisScriptSession = scriptSessionManager.get(hospitalId);
+                    HisScriptSession hisScriptSession =  hospitalManagerRegister.get(hospitalId).getScriptSession();
                     //绑定
                     hisScriptSession.bindChannel(channelContext);
                     log.info("医院脚本连接成功,医院编码【{}】",authorization);
@@ -177,7 +181,7 @@ public class DefaultWebSocketMsgHandler implements IWsMsgHandler {
             //医院响应
             HisResponse hisResponse = JSONUtil.toBean(message, HisResponse.class);
             CompletableFuture
-                    .runAsync(()-> scriptSessionManager.get(hospitalId).response(hisResponse))
+                    .runAsync(()-> hospitalManagerRegister.get(hospitalId).getScriptSession().response(hisResponse))
             .exceptionally(t->{
                 log.error("医院【{}】响应处理失败,响应消息【{}】,",hospitalId,message,t);
                 return null;