A17404李放 3 年之前
父节点
当前提交
26d3e3165a
共有 32 个文件被更改,包括 235 次插入181 次删除
  1. 4 4
      coffee-admin/src/main/resources/application-dev.yml
  2. 36 0
      coffee-admin/src/test/java/com/coffee/admin/BusDeviceTest.java
  3. 2 2
      coffee-admin/src/test/java/com/coffee/admin/BusHospitalTest.java
  4. 16 29
      coffee-common/src/main/java/com/coffee/common/cache/ClusterConfigStorage.java
  5. 5 2
      coffee-common/src/main/java/com/coffee/common/cache/manager/ClusterConfigStorageManager.java
  6. 11 8
      coffee-common/src/main/java/com/coffee/common/config/websocket/handler/Subscribe.java
  7. 3 3
      coffee-common/src/main/java/com/coffee/common/entity/TenantGenericEntity.java
  8. 20 37
      coffee-common/src/main/java/com/coffee/common/util/RedissonUtil.java
  9. 2 0
      coffee-system/src/main/java/com/coffee/bus/bean/Script.java
  10. 4 7
      coffee-system/src/main/java/com/coffee/bus/controller/BusAlarmController.java
  11. 8 5
      coffee-system/src/main/java/com/coffee/bus/controller/BusClinicController.java
  12. 7 4
      coffee-system/src/main/java/com/coffee/bus/controller/BusHospitalController.java
  13. 22 0
      coffee-system/src/main/java/com/coffee/bus/controller/vo/CauseVo.java
  14. 3 0
      coffee-system/src/main/java/com/coffee/bus/controller/vo/ClinicStatsVo.java
  15. 23 0
      coffee-system/src/main/java/com/coffee/bus/controller/vo/ExecScript.java
  16. 4 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceEntity.java
  17. 3 7
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceHistoryEntity.java
  18. 1 2
      coffee-system/src/main/java/com/coffee/bus/hospital/config/AbstractHospitalConfigHandler.java
  19. 4 4
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalAutoUndoConfigHandler.java
  20. 2 1
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFinishMonitorConfigHandler.java
  21. 2 2
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionAnalConfigHandler.java
  22. 2 2
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
  23. 1 3
      coffee-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSessionManager.java
  24. 14 10
      coffee-system/src/main/java/com/coffee/bus/hospital/script/PythonParse.java
  25. 10 15
      coffee-system/src/main/java/com/coffee/bus/hospital/script/ScriptManager.java
  26. 1 0
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java
  27. 2 1
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusHospitalService.java
  28. 4 4
      coffee-system/src/main/java/com/coffee/bus/service/dto/ClinicAnalRecordResult.java
  29. 1 13
      coffee-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java
  30. 9 11
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  31. 7 4
      coffee-system/src/main/java/com/coffee/system/entity/SysUser.java
  32. 2 1
      coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 4 - 4
coffee-admin/src/main/resources/application-dev.yml

@@ -88,14 +88,14 @@ spring:
     # 密码
     password: 6E6985E1F7CB40F24A\.
     # 连接超时时间
-    timeout: 10s
+    timeout: 30s
     lettuce:
       pool:
         # 连接池中的最小空闲连接
-        min-idle: 0
+        min-idle: 16
         # 连接池中的最大空闲连接
-        max-idle: 8
+        max-idle: 16
         # 连接池的最大数据库连接数
-        max-active: 8
+        max-active: 16
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms

+ 36 - 0
coffee-admin/src/test/java/com/coffee/admin/BusDeviceTest.java

@@ -1,7 +1,13 @@
 package com.coffee.admin;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.coffee.bus.entity.BusDeviceEntity;
+import com.coffee.bus.entity.BusDeviceHistoryEntity;
+import com.coffee.bus.service.LocalBusDeviceHistoryService;
 import com.coffee.bus.service.LocalBusDeviceService;
+import com.coffee.bus.service.dto.ClinicAnalInfusionRecord;
+import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,12 +24,15 @@ import java.util.List;
  * @Description XXX
  */
 @RunWith(SpringRunner.class)
+@Slf4j
 @SpringBootTest(classes = AdminApplication.class)
 public class BusDeviceTest {
 
     @Autowired
     LocalBusDeviceService deviceService;
 
+    @Autowired
+    LocalBusDeviceHistoryService historyService;
     @Test
     public void test001(){
         BusDeviceEntity device = new BusDeviceEntity();
@@ -50,4 +59,31 @@ public class BusDeviceTest {
         deviceService.removeByDeviceId("nbceshi001");
     }
 
+
+    @Test
+    public void copy(){
+        Page<BusDeviceHistoryEntity> page = historyService.page(Page.of(0, 50));
+        List<BusDeviceHistoryEntity> records = page.getRecords();
+
+        for (int i = 0; i < 100; i++) {
+            long current = System.currentTimeMillis();
+            records.stream().forEach(record->{
+//            long start = System.currentTimeMillis();
+                BeanUtil.copyProperties(record, ClinicAnalInfusionRecord.class);
+//            System.out.println("BeanCopy耗时:" + (System.currentTimeMillis() - start));
+            });
+            System.out.println("BeanCopy单线程总耗时:" + (System.currentTimeMillis() - current));
+        }
+
+        for (int i = 0; i < 100; i++) {
+            long current1 = System.currentTimeMillis();
+            records.parallelStream().forEach(record->{
+//            long start = System.currentTimeMillis();
+                BeanUtil.copyProperties(record, ClinicAnalInfusionRecord.class);
+//            System.out.println("BeanCopy耗时:" + (System.currentTimeMillis() - start));
+            });
+            System.out.println("BeanCopy多线程总耗时:" + (System.currentTimeMillis() - current1));
+        }
+
+    }
 }

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

@@ -87,7 +87,7 @@ public class BusHospitalTest {
 
     @Test
     public void debug(){
-        R debug = busHospitalController.debug("1505789859765604353", "{\"ceshi\":\"测试\" , \"age\":\"20\" }");
-        System.out.println(debug);
+//        R debug = busHospitalController.debug("1505789859765604353", "{\"ceshi\":\"测试\" , \"age\":\"20\" }");
+//        System.out.println(debug);
     }
 }

+ 16 - 29
coffee-common/src/main/java/com/coffee/common/cache/ClusterConfigStorage.java

@@ -1,12 +1,9 @@
 package com.coffee.common.cache;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.annotation.IEnum;
 import com.coffee.common.cache.value.Value;
-import org.redisson.api.RMap;
-import org.redisson.api.RedissonClient;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 import org.springframework.data.redis.core.BoundHashOperations;
@@ -20,9 +17,9 @@ import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 public class ClusterConfigStorage implements ConfigStorage {
-    private final RMap<String, Object>  cacheMap;
-    public ClusterConfigStorage(RedissonClient redissonClient,String name){
-        cacheMap = redissonClient.getMap(name);
+    private  BoundHashOperations boundHashOperations;
+    public ClusterConfigStorage(RedisTemplate redisTemplate,String name){
+        boundHashOperations = redisTemplate.opsForSet().getOperations().boundHashOps(name);
     }
 
     @Override
@@ -30,8 +27,7 @@ public class ClusterConfigStorage implements ConfigStorage {
         if (StrUtil.isEmpty(key)) {
             return null;
         }
-//        return Value.simple(boundHashOperations.get(key));
-        return Value.simple(cacheMap.get(key));
+        return Value.simple(boundHashOperations.get(key));
     }
 
     @Override
@@ -47,8 +43,7 @@ public class ClusterConfigStorage implements ConfigStorage {
                 map.put(k,v);
             }
         });
-//        boundHashOperations.putAll(map);
-        cacheMap.putAll(map);
+        boundHashOperations.putAll(map);
         return true;
     }
 
@@ -58,55 +53,47 @@ public class ClusterConfigStorage implements ConfigStorage {
             return true;
         }
         if(value==null){
-            cacheMap.remove(key);
-//            boundHashOperations.delete(key);
+            boundHashOperations.delete(key);
         }else {
             if(value instanceof IEnum){
                 value=((IEnum) value).getValue();
             }
-//            boundHashOperations.put(key,value);
-            cacheMap.put(key,value);
+            boundHashOperations.put(key,value);
         }
         return true;
     }
 
     @Override
     public Value getAndRemove(String key) {
-//        Value value = Value.simple(boundHashOperations.get(key));
-//        boundHashOperations.delete(key);
-
-        return      Value.simple(cacheMap.remove(key));
+        Value value = Value.simple(boundHashOperations.get(key));
+        boundHashOperations.delete(key);
+        return value;
     }
 
     @Override
     public Boolean remove(String key) {
-//        boundHashOperations.delete(key);
-        cacheMap.remove(key);
+        boundHashOperations.delete(key);
         return true;
     }
 
     @Override
     public Boolean remove(Collection<String> key) {
-//        boundHashOperations.delete(key);
-        cacheMap.fastRemove(key.toArray(new String[CollectionUtil.size(key)]));
+        boundHashOperations.delete(key);
         return true;
     }
 
     @Override
     public Boolean clear() {
-//        boundHashOperations.delete(boundHashOperations.keys());
-        cacheMap.readAllMap();
+        boundHashOperations.delete(boundHashOperations.keys());
         return true;
     }
 
     @Override
     public Map<String, Value> getKeys(Collection<String> keys) {
         Map<String, Value> result = new HashMap<>();
-        Map<String, Object> map = cacheMap.readAllMap();
-//        keys.parallelStream().forEach(key->{
-//            result.put(key,getConfig(key));
-//        });
-        map.forEach((k,v)->result.put(k,Value.simple(v)));
+        keys.parallelStream().forEach(key->{
+            result.put(key,getConfig(key));
+        });
         return result;
     }
 }

+ 5 - 2
coffee-common/src/main/java/com/coffee/common/cache/manager/ClusterConfigStorageManager.java

@@ -23,16 +23,19 @@ public class ClusterConfigStorageManager implements ConfigStorageManager {
 
     private final RedissonClient redissonClient;
 
+    private final RedisTemplate redisTemplate;
+
 
     private Map<String,ClusterConfigStorage > storageMap=new ConcurrentHashMap<>();
 
-    public ClusterConfigStorageManager(RedissonClient redissonClient) {
+    public ClusterConfigStorageManager(RedissonClient redissonClient,RedisTemplate redisTemplate) {
         this.redissonClient = redissonClient;
+        this.redisTemplate=redisTemplate;
     }
 
     @Override
     public ConfigStorage getStorage(String id) {
-        return  storageMap.computeIfAbsent(id, __ -> new ClusterConfigStorage(redissonClient,id));
+        return  storageMap.computeIfAbsent(id, __ -> new ClusterConfigStorage(redisTemplate,id));
     }
 
 }

+ 11 - 8
coffee-common/src/main/java/com/coffee/common/config/websocket/handler/Subscribe.java

@@ -1,6 +1,7 @@
 package com.coffee.common.config.websocket.handler;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.coffee.common.Constants;
 import com.coffee.common.bo.LoginUser;
 import com.coffee.common.config.websocket.DefaultMessageListener;
@@ -96,13 +97,15 @@ public abstract class Subscribe implements WsHandler {
      * @param topic
      */
     public void unsubscribe(ChannelContext channelContext, String topic){
-//        if(StrUtil.isEmpty(topic)){
-//            return;
-//        }
-//        topicMap.computeIfPresent(topic,(k,rTopic)->{
-//            rTopic.removeListener( getTopicListener(channelContext,k));
-//            return rTopic;
-//        });
+        if(StrUtil.isEmpty(topic)){
+            return;
+        }
+        topicMap.computeIfPresent(topic,(k,rTopic)->{
+            rTopic.removeListener( getTopicListener(channelContext,k));
+            return rTopic;
+        });
+        Map<String, DefaultMessageListener> topicListeners = getTopicListeners(channelContext);
+        topicListeners.remove(topic);
     };
 
 
@@ -121,7 +124,7 @@ public abstract class Subscribe implements WsHandler {
         Map<String, DefaultMessageListener> topicByChannel = getTopicListeners(channelContext);
         DefaultMessageListener messageListener = topicByChannel.computeIfAbsent(topic, k -> {
             DefaultMessageListener defaultMessageListener = new DefaultMessageListener(getId(), objectMapper, channelContext,rTopic);
-            rTopic.addListener(TopicMessage.class, defaultMessageListener);
+            rTopic.addListenerAsync(TopicMessage.class, defaultMessageListener);
             return defaultMessageListener;
         });
         return  messageListener;

+ 3 - 3
coffee-common/src/main/java/com/coffee/common/entity/TenantGenericEntity.java

@@ -28,7 +28,7 @@ public abstract class TenantGenericEntity<PK,TN> extends GenericEntity<PK> {
     @JsonSerialize(using = ToStringSerializer.class)
     private TN tenantId;
 
-    @Getter
-    @TableField(value = "tenant_id",insertStrategy = FieldStrategy.NEVER,updateStrategy = FieldStrategy.NEVER,typeHandler = TenantNameHandler.class)
-    private String tenantName;
+//    @Getter
+//    @TableField(value = "tenant_id",insertStrategy = FieldStrategy.NEVER,updateStrategy = FieldStrategy.NEVER,typeHandler = TenantNameHandler.class)
+//    private String tenantName;
 }

+ 20 - 37
coffee-common/src/main/java/com/coffee/common/util/RedissonUtil.java

@@ -1,15 +1,11 @@
 package com.coffee.common.util;
 
-import cn.hutool.core.date.DateUtil;
+
 import io.netty.channel.DefaultEventLoop;
 import io.netty.channel.EventLoopGroup;
-import lombok.AllArgsConstructor;
 import lombok.Getter;
-import org.redisson.Redisson;
 import org.redisson.api.*;
 import org.redisson.client.codec.Codec;
-import org.redisson.config.Config;
-import org.redisson.config.SingleServerConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import java.util.Map;
@@ -35,7 +31,7 @@ public class RedissonUtil {
 
     private static Map<String,RBlockingDeque<Object>> blockingDequeMap=new ConcurrentHashMap<>();
 
-
+    private static Map<String,RLock> lockMap=new ConcurrentHashMap<>();
     private EventLoopGroup eventLoopGroup=new DefaultEventLoop();
 
     public RPatternTopic getPatternTopic(String pattern){
@@ -54,43 +50,30 @@ public class RedissonUtil {
         name="queue:"+name;
         synchronized (name){
             if(!blockingDequeMap.containsKey(name)){
+                String lockName="lock:"+name;
                 RBlockingDeque<Object> value = redissonClient.getBlockingDeque(name);
                 delayedQueueMap.putIfAbsent(name,redissonClient.getDelayedQueue(value));
+                lockMap.putIfAbsent(lockName,redissonClient.getLock(lockName));
                 value.subscribeOnElements(i->{
-                    //开启新的线程消费,不可阻塞该异步线程
-                    eventLoopGroup.submit(()->consumer.accept(i));
-                    value.popAsync();
+                    //开启新的线程消费,唯一线程消费,不可阻塞该异步线程
+                    eventLoopGroup.submit(() -> {
+                        RLock lock = lockMap.get(lockName);
+                        try {
+                            if (lock.tryLock(-1,20,TimeUnit.SECONDS)) {
+                                try {
+                                    consumer.accept(i);
+                                    value.popAsync();
+                                }finally {
+                                    lock.unlockAsync();
+                                }
+                            }
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                    });
                 });
             }
             return delayedQueueMap.get(name);
         }
     }
-
-
-
-
-    public static void main(String[] args) {
-        Config config = new Config();
-        SingleServerConfig singleServerConfig = config.useSingleServer();
-        singleServerConfig.setAddress("redis://192.168.100.32:9736");
-        singleServerConfig.setPassword("6E6985E1F7CB40F24A\\.")
-                .setDatabase(3);
-//        config.setTransportMode(TransportMode.EPOLL);
-
-        RedissonClient redisson = Redisson.create(config);
-        RBlockingQueue<Object> blockingQueue = redisson.getBlockingQueue("dest_queue1");
-        RDelayedQueue<Object> delayedQueue = redisson.getDelayedQueue(blockingQueue);
-        blockingQueue.subscribeOnElements(str->{
-            String now = DateUtil.now();
-            System.out.println(str);
-        });
-
-//        for(int i=1;i<=5;i++) {
-//            JSONObject jsonObject = new JSONObject().putOpt(DateUtil.now(), i);
-//            // 向阻塞队列放入数据
-//            delayedQueue.offerAsync(jsonObject, 3, TimeUnit.SECONDS);
-//        }
-
-
-    }
 }

+ 2 - 0
coffee-system/src/main/java/com/coffee/bus/bean/Script.java

@@ -1,5 +1,6 @@
 package com.coffee.bus.bean;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -13,6 +14,7 @@ import java.io.Serializable;
  */
 @Data
 public class Script implements Serializable {
+    @JsonIgnore
     private String id;
     private String content;
     /**

+ 4 - 7
coffee-system/src/main/java/com/coffee/bus/controller/BusAlarmController.java

@@ -3,6 +3,7 @@ package com.coffee.bus.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.baomidou.mybatisplus.core.mapper.Mapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.coffee.bus.controller.vo.CauseVo;
 import com.coffee.bus.service.dto.AlarmQuery;
 import com.coffee.bus.entity.BusClinicEntity;
 import com.coffee.bus.entity.BusDeviceAlarmEntity;
@@ -31,15 +32,11 @@ public class BusAlarmController extends BaseCrudController<BusDeviceAlarmEntity,
     private final LocalBusDeviceAlarmService deviceAlarmService;
 
     @PostMapping("/cause/{id}")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "cause",value = "报警原因",dataTypeClass = String.class,required = true,example = "设备误报"),
-            @ApiImplicitParam(name = "id",value = "报警信息id",dataTypeClass = String.class,required = true)
-    })
     @ApiOperation(value = "添加报警原因",notes = "权限:【bus:alarm:cause】")
     @SaCheckPermission("bus:alarm:cause")
-    public R cause(@PathVariable("id") String id, @RequestBody String cause) {
-        deviceAlarmService.addCause(id,cause);
-        return R.success();
+    public R<Boolean> cause(@PathVariable("id") String id, @RequestBody@Validated CauseVo cause) {
+        deviceAlarmService.addCause(id,cause.getCause());
+        return R.success(true);
     }
 
 

+ 8 - 5
coffee-system/src/main/java/com/coffee/bus/controller/BusClinicController.java

@@ -13,6 +13,7 @@ import com.coffee.common.result.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import java.util.List;
@@ -29,6 +30,7 @@ import java.util.stream.Collectors;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/bus/clinic")
+@Slf4j
 @Api(tags = "病人临床手术管理",description = "统一权限前缀(bus:clinic),例如新增bus:clinic:add")
 public class BusClinicController {
     private final LocalBusClinicService clinicService;
@@ -39,7 +41,7 @@ public class BusClinicController {
     private final DeviceRegistry deviceRegistry;
     @PostMapping("/stats")
     @ApiOperation(value = "临床过程中的数据记录",notes = "权限【无】")
-    public R<ClinicStatsReturnResult> stats(@RequestBody ClinicStatsVo statsVo) {
+    public R<ClinicStatsReturnResult> stats(@RequestBody@Validated ClinicStatsVo statsVo) {
         return R.success(clinicService.stats(statsVo));
     }
 
@@ -55,7 +57,8 @@ public class BusClinicController {
     @PostMapping("/anal/record/{clinicId}")
     @SaCheckPermission("bus:clinic:query")
     @ApiOperation(value = "查询临床信息的镇痛访视记录单",notes = "权限【bus:clinic:query】")
-    public R<ClinicAnalRecordResult> analRecord(@PathVariable("clinicId") String clinicId){
+    public R<ClinicAnalRecordResult> analRecord(@PathVariable("clinicId") String clinicId,@RequestAttribute("tenantId") String tenantId){
+        log.info("查询临床访视单【{}】",clinicId);
         ClinicAnalRecordResult result = new ClinicAnalRecordResult();
         BusClinicEntity clinic = clinicService.getById(clinicId);
         if(clinic==null){
@@ -67,12 +70,13 @@ public class BusClinicController {
         //填充评价记录
         result.setEvaluations(evaluationService.list(new QueryWrapper<BusEvaluationEntity>().lambda().eq(BusEvaluationEntity::getClinicId,clinicId).orderByAsc(BusEvaluationEntity::getEvaluateTime)));
 
-
         //填充输注记录
         List<BusInfusionHistoryEntity> infusionHistories = infusionHistoryService.list(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
                 .eq(BusInfusionHistoryEntity::getClinicId, clinicId)
                 .orderByAsc(BusInfusionHistoryEntity::getStartTime));
 
+        result.fillUndoInfo(infusionHistories);
+
         //添加设备别名
         Map<String, List<BusInfusionHistoryEntity>> infusionByDeviceId = infusionHistories.stream().collect(Collectors.groupingBy(BusInfusionHistoryEntity::getDeviceId));
         infusionByDeviceId.forEach((deviceId,infusions)->{
@@ -80,11 +84,10 @@ public class BusClinicController {
             infusions.forEach(infusion->infusion.setAlias(alias));
         });
 
-        result.fillUndoInfo(infusionHistories);
-
         List<String> infusionIds = infusionHistories.stream().map(BusInfusionHistoryEntity::getId).collect(Collectors.toList());
         List<BusInfusionModifyEntity> infusionModifies = infusionModifyService.list(new QueryWrapper<BusInfusionModifyEntity>().lambda()
                 .in(BusInfusionModifyEntity::getInfusionId, infusionIds));
+
         result.fillInfusionRecords(infusionHistories,infusionModifies);
 
         List<BusDeviceHistoryEntity> deviceHistories = deviceHistoryService.list(new QueryWrapper<BusDeviceHistoryEntity>()

+ 7 - 4
coffee-system/src/main/java/com/coffee/bus/controller/BusHospitalController.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaMode;
 import com.baomidou.mybatisplus.core.mapper.Mapper;
 import com.coffee.bus.bean.Script;
+import com.coffee.bus.controller.vo.ExecScript;
 import com.coffee.bus.entity.BusHospitalEntity;
 import com.coffee.bus.hospital.script.ScriptManager;
 import com.coffee.bus.service.LocalBusHospitalService;
@@ -59,12 +60,14 @@ public class BusHospitalController extends BaseCrudController<BusHospitalEntity,
         return R.success();
     }
 
-    @PostMapping("/{id}/debug")
-    @ApiOperation(value = "执行医院解析脚本")
-    public R debug(@PathVariable("id") String id,@RequestBody String param){
-        return R.success( scriptManager.lookUpHospital(id).exec(param));
+    @PostMapping("/debug")
+    @ApiOperation(value = "执行解析脚本")
+    public R debug(@RequestBody ExecScript execScript){
+        return R.success( scriptManager.debug(execScript.getContent(),execScript.getInput()));
     }
 
+
+
     @PostMapping("/validate")
     @SaCheckPermission(mode = SaMode.OR,value = {"bus:hospital:edit","bus:hospital:add"})
     @ApiOperation(value = "校验医院名称是否重复",notes = "权限【bus:hospital:edit 或 bus:hospital:edit】")

+ 22 - 0
coffee-system/src/main/java/com/coffee/bus/controller/vo/CauseVo.java

@@ -0,0 +1,22 @@
+package com.coffee.bus.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CauseVo.java
+ * @Description TODO
+ * @createTime 2022年05月21日 14:14:00
+ */
+@Data
+@ApiModel("报警原因")
+public class CauseVo {
+    @NotNull(message = "报警原因不能为空")
+    @ApiModelProperty("报警原因")
+    private String cause;
+}

+ 3 - 0
coffee-system/src/main/java/com/coffee/bus/controller/vo/ClinicStatsVo.java

@@ -3,6 +3,8 @@ package com.coffee.bus.controller.vo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
+import javax.validation.constraints.NotNull;
 import java.util.*;
 /**
  * @author lifang
@@ -15,6 +17,7 @@ import java.util.*;
 @Data
 public class ClinicStatsVo {
     @ApiModelProperty("临床id")
+    @NotNull(message = "临床id不能为空")
     private String clinicId;
     @ApiModelProperty("设备id")
     private String deviceId;

+ 23 - 0
coffee-system/src/main/java/com/coffee/bus/controller/vo/ExecScript.java

@@ -0,0 +1,23 @@
+package com.coffee.bus.controller.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ExecScript.java
+ * @Description TODO
+ * @createTime 2022年05月21日 19:14:00
+ */
+@Data
+@ApiModel("脚本执行")
+public class ExecScript {
+    @ApiModelProperty("脚本内容")
+    private String content;
+    @ApiModelProperty("输入参数")
+    private String input;
+
+    private String type;
+}

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

@@ -42,6 +42,10 @@ public class BusDeviceEntity extends TenantGenericEntity<String,String> {
     @ApiModelProperty(value = "设备唯一id")
     private String deviceId;
 
+
+    @ApiModelProperty(value = "mqtt通道信息")
+    private String mqttConnInfo;
+
     @ApiModelProperty(value = "设备别名")
     @Length(max = 255,message = "设备别名不得超过255个字符")
     private String alias;

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

@@ -36,9 +36,6 @@ import java.util.Date;
 @ApiModel(value="设备历史运行数据", description="设备历史运行数据记录")
 public class BusDeviceHistoryEntity extends CommonDeviceParam<String,String> {
 
-    @ApiModelProperty(value = "患者编号")
-    private String patientId;
-
     @ApiModelProperty(value = "输注记录id")
     @JsonIgnoreProperties
     private String infusionId;
@@ -47,10 +44,6 @@ public class BusDeviceHistoryEntity extends CommonDeviceParam<String,String> {
     @JsonIgnoreProperties
     private String infusionModifyId;
 
-    @ApiModelProperty(value = "是否已撤泵,0、未撤泵1、已撤泵")
-    @JsonIgnoreProperties
-    private Boolean isUndo;
-
     @ApiModelProperty(value = "是否为主泵数据, 0、副泵 1、主泵(即当前临床绑定的泵)")
     @JsonIgnoreProperties
     private Boolean master;
@@ -105,6 +98,9 @@ public class BusDeviceHistoryEntity extends CommonDeviceParam<String,String> {
         entity.setWarnWillFinished(running.getWarnAnalgesicPoor());
         entity.setAlarm(running.getAlarm());
 
+        entity.setWard(running.getWard());
+        entity.setBedNo(running.getBedNo());
+        entity.setDataNumber(running.getDataNumber());
         entity.setMaster(running.getMaster());
         entity.setTenantId(running.getTenantId());
         return entity;

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

@@ -5,12 +5,10 @@ import com.coffee.bus.registry.patient.PatientRegistry;
 import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import com.coffee.bus.utils.WsPublishUtils;
-import com.coffee.common.cache.ClusterConfigStorage;
 import com.coffee.common.cache.ConfigStorage;
 import com.coffee.common.cache.value.Value;
 import com.coffee.common.util.RedissonUtil;
 import lombok.Getter;
-import org.redisson.api.RedissonClient;
 
 /**
  * @author lifang
@@ -37,6 +35,7 @@ public abstract class AbstractHospitalConfigHandler<E,T> implements HospitalConf
     protected String hospitalId;
 
     public AbstractHospitalConfigHandler(ConfigStorage configStorage, String hospitalId, RedissonUtil redissonUtil, LocalBusDeviceRunningService deviceRunningService, LocalBusInfusionHistoryService infusionHistoryService, DeviceRegistry deviceRegistry, WsPublishUtils wsPublishUtils, PatientRegistry patientRegistry) {
+        this.hospitalId=hospitalId;
         this.configStorage=configStorage;
         this.redissonUtil = redissonUtil;
         this.deviceRunningService = deviceRunningService;

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

@@ -74,7 +74,7 @@ public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandle
                 .patientCode(patientCode)
                 .config(undoDeviceConfig)
                 .timeout(config.getNoSignalInterval())
-                .unit(TimeUnit.MINUTES)
+                .unit(TimeUnit.SECONDS)
                 .tenantId(tenantId)
                 .timestamp(new Date())
                 .build();
@@ -107,11 +107,11 @@ public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandle
                     .patientCode(source.getPatientCode())
                     .config(undoDeviceConfig)
                     .timeout(config.getShutDownInterval())
-                    .unit(TimeUnit.MINUTES)
+                    .unit(TimeUnit.SECONDS)
                     .tenantId(source.getTenantId())
                     .timestamp(new Date())
                     .build();
-            shutdownUndoDelay.offer(finishMonitor,config.getShutDownInterval(),TimeUnit.MINUTES);
+            shutdownUndoDelay.offer(finishMonitor,config.getShutDownInterval(),finishMonitor.getUnit());
         }
 
 
@@ -134,7 +134,7 @@ public class HospitalAutoUndoConfigHandler extends  AbstractHospitalConfigHandle
             manualUndoConfig.setClinicId(entity.getClinicId());
             manualUndoConfig.setMonitorType(true);
             manualUndoConfig.setUndo(source.getConfig());
-
+            manualUndoConfig.setTenantId(source.getTenantId());
             deviceRunningService.undo(manualUndoConfig,false);
         }
     }

+ 2 - 1
coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFinishMonitorConfigHandler.java

@@ -113,7 +113,7 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
                     .tenantId(source.getTenantId())
                     .timestamp(new Date())
                     .build();
-            shutdownFinishDelay.offer(finishMonitor,config.getShutDownInterval(),TimeUnit.MINUTES);
+            shutdownFinishDelay.offer(finishMonitor,config.getShutDownInterval(),finishMonitor.getUnit());
         }
 
         //不在服务区延迟队列清空
@@ -145,6 +145,7 @@ public class HospitalFinishMonitorConfigHandler extends AbstractHospitalConfigHa
             PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(tenantId, patientCode);
             ManualUndoConfig manualUndoConfig = new ManualUndoConfig();
             config.setUndoTime(new Date());
+            manualUndoConfig.setTenantId(source.getTenantId());
             manualUndoConfig.setUndo(config);
             manualUndoConfig.setMonitorType(true);
             manualUndoConfig.setClinicId(entity.getClinicId());

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

@@ -96,7 +96,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
                 .pcaValidCount(source.getPcaValidCount())
                 .pcaInvalidCount(source.getPcaInvalidCount())
                 .timeout(analConfig.getInsufficientTime())
-                .unit(TimeUnit.SECONDS)
+                .unit(TimeUnit.MINUTES)
                 .threshold(analConfig.getInsufficientCount())
                 .judgeByValid(analConfig.getValid())
                 .tenantId(source.getTenantId())
@@ -158,7 +158,7 @@ public class HospitalFunctionAnalConfigHandler extends AbstractHospitalConfigHan
                     .deviceId(anal.getDeviceId())
                     .tenantId(anal.getTenantId())
                     .timeout(config.getDisappearTime())
-                    .unit(TimeUnit.SECONDS)
+                    .unit(TimeUnit.MINUTES)
                     .timestamp(new Date())
                     .build();
             noneAnalDelayedQueue.offer(noneAnal,noneAnal.getTimeout(),noneAnal.getUnit());

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

@@ -95,7 +95,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
                 .tenantId(source.getTenantId())
                 .timestamp(new Date())
                 .timeout(interval)
-                .unit(TimeUnit.SECONDS)
+                .unit(TimeUnit.MINUTES)
                 .build();
         //将该次消息视为最后一次消息放入队列中
         delayedQueue.offer(noSignal,noSignal.getTimeout(),noSignal.getUnit());
@@ -142,7 +142,7 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
      * @return void
      */
     private void judgeLowInfusion(BusDeviceRunningEntity source,int interval){
-        RDelayedQueue delayedQueue = redissonUtil.getDelayedQueue(getId() +"-signal"+ "-" + source.getTenantId() + "-" + source.getDeviceId(), e -> {
+        RDelayedQueue delayedQueue = redissonUtil.getDelayedQueue(getId() +"-lowFusion"+ "-" + source.getTenantId() + "-" + source.getDeviceId(), e -> {
             if(e instanceof  LowInfusionEntity){
                 handleLowInfusion((LowInfusionEntity)e);
             }

+ 1 - 3
coffee-system/src/main/java/com/coffee/bus/hospital/his/HisScriptSessionManager.java

@@ -23,15 +23,13 @@ public class HisScriptSessionManager {
     private Map<String,HisScriptSession> sessionMap=new ConcurrentHashMap<>();
     private LocalBusClinicService clinicService;
     private ScriptManager scriptManager;
-    private RedissonClient redissonClient;
     private LocalBusHospitalService hospitalService;
     private ClusterConfigStorageManager configStorageManager;
 
     @Autowired
-    public HisScriptSessionManager( LocalBusClinicService clinicService, ScriptManager scriptManager, RedissonClient redissonClient, LocalBusHospitalService hospitalService, ClusterConfigStorageManager configStorageManager) {
+    public HisScriptSessionManager( LocalBusClinicService clinicService, ScriptManager scriptManager, LocalBusHospitalService hospitalService, ClusterConfigStorageManager configStorageManager) {
         this.clinicService = clinicService;
         this.scriptManager = scriptManager;
-        this.redissonClient = redissonClient;
         this.hospitalService = hospitalService;
         this.configStorageManager = configStorageManager;
     }

+ 14 - 10
coffee-system/src/main/java/com/coffee/bus/hospital/script/PythonParse.java

@@ -1,5 +1,7 @@
 package com.coffee.bus.hospital.script;
 
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSON;
 import cn.hutool.json.JSONUtil;
@@ -24,13 +26,16 @@ public class PythonParse implements ScriptParse {
     private PyFunction pyFunction;
 
     public PythonParse() {
-//        Properties p = new Properties();
-//        p.setProperty("python.console.encoding", "UTF-8");
-//        PySystemState systemState = Py.getSystemState();
-//        PyString xml = new PyString(Thread.currentThread().getContextClassLoader().getResource("python").getPath());
-//        systemState.path.append(xml);
-//        PythonInterpreter.initialize(System.getProperties(), p, new String[] {});
-//        interpreter = new PythonInterpreter();
+        Properties p = new Properties();
+        p.setProperty("python.console.encoding", "UTF-8");
+        PySystemState systemState = Py.getSystemState();
+//        PyString xml = new PyString("\\python-modules");
+        PyString xml = new PyString("E:\\software\\coffee-boot\\coffee-admin\\src\\main\\resources\\python");
+        systemState.path.append(xml);
+        PythonInterpreter.initialize(System.getProperties(), p, new String[] {});
+
+        interpreter = new PythonInterpreter();
+
     }
 
     @Override
@@ -75,9 +80,8 @@ public class PythonParse implements ScriptParse {
         Properties p = new Properties();
         p.setProperty("python.console.encoding", "UTF-8");
         PySystemState systemState = Py.getSystemState();
-        PyString xml = new PyString("E:\\software\\coffee-boot\\coffee-admin\\src\\main\\resources\\python");
-//        PyString xml = new PyString("_classpath_:python");
-        systemState.path.append(xml);
+        PyString xml = new PyString("\\python-modules");
+        systemState.modules.__add__(xml);
         PythonInterpreter.initialize(System.getProperties(), p, new String[] {});
         PythonInterpreter pythonInterpreter = new PythonInterpreter();
         String str = "# -*- coding: utf-8 -*-\n" +

+ 10 - 15
coffee-system/src/main/java/com/coffee/bus/hospital/script/ScriptManager.java

@@ -2,6 +2,7 @@ package com.coffee.bus.hospital.script;
 
 import cn.hutool.core.collection.CollectionUtil;
 import com.coffee.bus.service.LocalBusHospitalService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
@@ -18,7 +19,7 @@ import java.util.stream.Collectors;
  * @createTime 2022年03月27日 17:23:00
  */
 @Component
-public class ScriptManager implements CommandLineRunner {
+public class ScriptManager {
 
     @Resource
     private List<ScriptParse> scriptParseList;
@@ -27,8 +28,9 @@ public class ScriptManager implements CommandLineRunner {
 
     private Map<String,ScriptParse> hospital=new HashMap<>();
 
-    @Resource
-    private LocalBusHospitalService hospitalService;
+    @Autowired
+    private PythonParse pythonParse;
+
     @PostConstruct
     public void init(){
         if(CollectionUtil.isNotEmpty(scriptParseList)){
@@ -58,20 +60,13 @@ public class ScriptManager implements CommandLineRunner {
         hospital.put(hospitalId,scriptParse);
     }
 
+    public ExecuteResult debug(String script,String input){
+        pythonParse.reset(script);
+        return pythonParse.exec(input);
+    }
+
     public ScriptParse createScript(String scriptId ){
         return new PythonParse();
     }
 
-    @Override
-    public void run(String... args) {
-//        List<BusHospitalEntity> hospitals = hospitalService.list(new QueryWrapper<BusHospitalEntity>().lambda().isNotNull(BusHospitalEntity::getScript));
-//        //将脚本初始化
-//        if(CollectionUtil.isNotEmpty(hospitals)){
-//            hospitals.stream().filter(hospitalEntity -> ObjectUtil.isNotNull(hospitalEntity.getScript())).forEach(hospital -> {
-//
-//                Script script = hospital.getScript();
-//                resetScript(hospital.getId(),script.getId(),script.getContent());
-//            });
-//        }
-    }
 }

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

@@ -102,6 +102,7 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
                 .map(BusClinicEntity::getPatientCode)
                 .map(code->patientRegistry.getOperator(tenantId,code))
                 .forEach(operator->operator.setFinished(true));
+        wsPublishUtils.publishMonitorTotalCount(tenantId);
     }
 
     /**

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

@@ -22,6 +22,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author lifang
@@ -112,7 +113,7 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
             configStorage.setConfig(entity.getId(),entity.getName());
         });
         configService.saveDefaultConfig();
-
+        list.forEach(hospital->hospitalManagerRegister.refresh(hospital.getId(),true,true,true));
     }
 
 

+ 4 - 4
coffee-system/src/main/java/com/coffee/bus/service/dto/ClinicAnalRecordResult.java

@@ -71,7 +71,7 @@ public class ClinicAnalRecordResult implements Serializable {
     public void fillUndoInfo(List<BusInfusionHistoryEntity> infusionHistories){
         infusionHistories.sort((t1,t2)->t2.getStartTime().compareTo(t1.getStartTime()));
         //找到最后一个撤泵信息
-        Optional<BusInfusionHistoryEntity> undoInfo = infusionHistories.stream().filter(infusion -> Boolean.TRUE.equals(infusion.getIsUndo()))
+        Optional<BusInfusionHistoryEntity> undoInfo = infusionHistories.parallelStream().filter(infusion -> Boolean.TRUE.equals(infusion.getIsUndo()))
                 .findFirst();
         if(undoInfo.isPresent()){
             this.setUndoBy(undoInfo.get().getUndoBy());
@@ -90,13 +90,13 @@ public class ClinicAnalRecordResult implements Serializable {
      * @return void
      */
     public void fillInfusionRecords(List<BusInfusionHistoryEntity> infusionHistories, List<BusInfusionModifyEntity> infusionModifies) {
-        List<ClinicAnalInfusionRecord> infusionRecords = infusionHistories.stream().map(ClinicAnalInfusionRecord::parse).collect(Collectors.toList());
-        List<ClinicAnalInfusionModify> modifies = infusionModifies.stream().map(ClinicAnalInfusionModify::parse).collect(Collectors.toList());
+        List<ClinicAnalInfusionRecord> infusionRecords = infusionHistories.parallelStream().map(ClinicAnalInfusionRecord::parse).collect(Collectors.toList());
+        List<ClinicAnalInfusionModify> modifies = infusionModifies.parallelStream().map(ClinicAnalInfusionModify::parse).collect(Collectors.toList());
         this.setInfusionRecords(infusionRecords);
 
         Map<String, ClinicAnalInfusionRecord> recordHashMap = new HashMap<>();
         infusionRecords.forEach(infusionRecord->recordHashMap.put(infusionRecord.getId(),infusionRecord));
-        Map<String, List<ClinicAnalInfusionModify>> modifyMapByInfusionId = modifies.stream().collect(Collectors.groupingBy(ClinicAnalInfusionModify::getInfusionId));
+        Map<String, List<ClinicAnalInfusionModify>> modifyMapByInfusionId = modifies.parallelStream().collect(Collectors.groupingBy(ClinicAnalInfusionModify::getInfusionId));
         //将修改记录有输注记录绑定
         modifyMapByInfusionId.forEach((k,v)->
                 recordHashMap.computeIfPresent(k,(id,infusion)->{

+ 1 - 13
coffee-system/src/main/java/com/coffee/bus/utils/WsPublishUtils.java

@@ -1,13 +1,9 @@
 package com.coffee.bus.utils;
 
 
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONObject;
-import com.alibaba.fastjson.serializer.JSONObjectCodec;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.coffee.bus.entity.BusClinicEntity;
-import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.enums.PatientAlarmEnum;
 import com.coffee.bus.service.LocalBusClinicService;
 import com.coffee.bus.service.LocalBusPatientService;
@@ -15,17 +11,9 @@ import com.coffee.bus.service.dto.MonitorStatusStatsCountResult;
 import com.coffee.bus.service.dto.PatientMonitorResult;
 import com.coffee.common.config.websocket.TopicMessage;
 import com.coffee.common.config.websocket.WebSocketConstant;
-import com.coffee.common.redis.RedisUtils;
 import com.coffee.common.util.RedissonUtil;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.redisson.RedissonTopic;
-import org.redisson.api.RedissonClient;
-import org.redisson.codec.JsonJacksonCodec;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
@@ -48,7 +36,7 @@ public class WsPublishUtils implements Serializable{
     private final RedissonUtil redissonUtil;
 
     private void publish(String topic,TopicMessage msg){
-        redissonUtil.getTopic(topic).publish(msg);
+        redissonUtil.getTopic(topic).publishAsync(msg);
     }
 
     /**

+ 9 - 11
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -25,7 +25,6 @@ import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
 import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.*;
 import com.coffee.bus.utils.WsPublishUtils;
-import com.coffee.common.util.RedissonUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
@@ -96,10 +95,10 @@ public class DeviceInfoListener {
             String deviceId = device.getDeviceId();
             device.setUploadTime(device.getUploadTime()==null?new Date():device.getUploadTime());
             DeviceOperator<DeviceCacheInfo> deviceOperator = deviceRegistry.getOperator(deviceId);
-            if (deviceOperator==null||!Boolean.TRUE.equals(deviceOperator.getEnable())) {
-                log.warn("设备[{}]暂不可用,数据已丢弃",deviceId);
-                return ;
-            }
+//            if (deviceOperator==null||!Boolean.TRUE.equals(deviceOperator.getEnable())) {
+//                log.warn("设备[{}]暂不可用,数据已丢弃",deviceId);
+//                return ;
+//            }
 
             //数据准确性判断
             String classification = device.getClassification();
@@ -116,7 +115,7 @@ public class DeviceInfoListener {
             boolean first = handleRunningInfo(device, deviceOperator,cacheOperation);
 
             //医院相关配置处理
-//            handleHospitalConfig(device,cacheOperation);
+            handleHospitalConfig(device,cacheOperation);
 
             //处理输注参数
             handleInfusion(device, deviceOperator, cacheOperation);
@@ -410,17 +409,16 @@ public class DeviceInfoListener {
         String signHex = busInfusionModify.signParam(sign);
         String infusionParam = deviceOperator.getInfusionParam();
 
+        Boolean clinicFinished = patientOperator.getFinished();
         //输注参数已发生变化
         if(ObjectUtil.notEqual(signHex,infusionParam)){
             infusionModifyService.save(busInfusionModify);
             device.setInfusionModifyId(busInfusionModify.getId());
             device.setModifyTime(busInfusionModify.getUpdateTime());
             //参数发生变化后,进行判断
-            if(Boolean.TRUE.equals(patientOperator.getFinished())){
+            if(Boolean.TRUE.equals(clinicFinished)&&device.isNewInfusion()){
                 //若临床已结束,则只有新的输注能够进行泵冲突处理
-                if(device.isNewInfusion()){
-                    handlePatient(device,cacheOperation);
-                }
+                handlePatient(device,cacheOperation);
                 clinicService
                         .update(new UpdateWrapper<BusClinicEntity>().lambda().eq(BusClinicEntity::getId,patientOperator.getClinicId())
                                 .set(BusClinicEntity::getFinished,false));
@@ -430,7 +428,7 @@ public class DeviceInfoListener {
                     wsPublishUtils.publishMonitorTotalCount(device.getTenantId());
                     return null;
                 });
-            } else {
+            } else if(!Boolean.TRUE.equals(clinicFinished)){
                 handlePatient(device,cacheOperation);
             }
             cacheOperation.add(()->{

+ 7 - 4
coffee-system/src/main/java/com/coffee/system/entity/SysUser.java

@@ -4,11 +4,9 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.*;
 import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.coffee.common.annotation.ExcelDict;
+import com.coffee.common.config.mybatis.TenantNameHandler;
 import com.coffee.common.convert.ExcelDictConverter;
 import com.coffee.common.entity.TenantGenericEntity;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -17,6 +15,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.models.auth.In;
 import lombok.Data;
+import lombok.Getter;
 import org.python.antlr.ast.Str;
 
 import java.io.Serializable;
@@ -210,4 +209,8 @@ public class SysUser extends TenantGenericEntity<Long,Long> {
      **/
     @TableField
     private Boolean isSys;
+
+    @Getter
+    @TableField(value = "tenant_id",insertStrategy = FieldStrategy.NEVER,updateStrategy = FieldStrategy.NEVER,typeHandler = TenantNameHandler.class)
+    private String tenantName;
 }

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

@@ -373,8 +373,9 @@
 
         <select id="selectAlarmCount" resultType="long">
             select count(1) from bus_patient as p
-            join (select * from bus_clinic where finished=0
+            join (select * from bus_clinic
             <where>
+                finished=0
                 <if test="tenantId!=null">
                     and tenant_id=#{tenantId}
                 </if>