浏览代码

add 从his拉取数据时自动添加常量信息
update 阿里云同步数据时,避免循环访问数据库,将数据放入内存中处理

A17404李放 3 年之前
父节点
当前提交
8aa4d1692f
共有 25 个文件被更改,包括 273 次插入126 次删除
  1. 6 6
      coffee-admin/src/main/resources/logback.xml
  2. 21 5
      coffee-admin/src/test/java/com/coffee/admin/AliyunTest.java
  3. 1 1
      coffee-system/src/main/java/com/coffee/bus/controller/BusClinicController.java
  4. 13 2
      coffee-system/src/main/java/com/coffee/bus/controller/BusConstantController.java
  5. 6 4
      coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceController.java
  6. 4 1
      coffee-system/src/main/java/com/coffee/bus/controller/BusHospitalController.java
  7. 11 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceEntity.java
  8. 7 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java
  9. 3 3
      coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionHistoryEntity.java
  10. 5 0
      coffee-system/src/main/java/com/coffee/bus/hospital/config/HospitalFunctionExtraConfigHandler.java
  11. 48 3
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java
  12. 53 18
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusHospitalService.java
  13. 2 1
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java
  14. 1 3
      coffee-system/src/main/java/com/coffee/bus/service/constant/LocalBusConMixService.java
  15. 3 0
      coffee-system/src/main/java/com/coffee/bus/service/dto/DeviceQuery.java
  16. 5 1
      coffee-system/src/main/java/com/coffee/bus/stats/analyse/EvalStatsAnalyse.java
  17. 63 44
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  18. 1 0
      coffee-system/src/main/java/com/coffee/system/common/dto/SysMenuEditDTO.java
  19. 1 1
      coffee-system/src/main/java/com/coffee/system/common/dto/SysUserAddDTO.java
  20. 0 6
      coffee-system/src/main/java/com/coffee/system/common/dto/SysUserEditDTO.java
  21. 4 2
      coffee-system/src/main/java/com/coffee/system/controller/SysUserController.java
  22. 1 1
      coffee-system/src/main/java/com/coffee/system/service/impl/SysUserServiceImpl.java
  23. 6 3
      coffee-system/src/main/resources/mapper/bus/BusClinicMapper.xml
  24. 6 19
      coffee-system/src/main/resources/mapper/bus/BusDeviceMapper.xml
  25. 2 2
      coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 6 - 6
coffee-admin/src/main/resources/logback.xml

@@ -15,10 +15,10 @@
 
     <!-- 控制台输出 -->
     <appender name="sys_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${log.path}/sys-console.log</file>
+            <file>${LOG_PATH}/sys-console.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${LOG_PATH}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern>
             <!-- 日志最大 1天 -->
             <maxHistory>1</maxHistory>
         </rollingPolicy>
@@ -34,11 +34,11 @@
 
     <!-- 系统日志输出 -->
     <appender name="sys_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${log.path}/sys-info.log</file>
+        <file>${LOG_PATH}/sys-info.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${LOG_PATH}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
             <!-- 日志最大的历史 60天 -->
             <maxHistory>60</maxHistory>
         </rollingPolicy>
@@ -56,11 +56,11 @@
     </appender>
 
     <appender name="sys_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${log.path}/sys-error.log</file>
+        <file>${LOG_PATH}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${LOG_PATH}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
             <!-- 日志最大的历史 60天 -->
             <maxHistory>60</maxHistory>
         </rollingPolicy>

+ 21 - 5
coffee-admin/src/test/java/com/coffee/admin/AliyunTest.java

@@ -1,8 +1,11 @@
 package com.coffee.admin;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.coffee.bus.entity.BusDeviceEntity;
 import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.listener.event.bean.DeviceInfoEvent;
+import com.coffee.bus.service.LocalBusDeviceService;
 import com.coffee.bus.service.LocalBusInfusionHistoryService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -11,6 +14,8 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.ApplicationContext;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.List;
+
 /**
  * @Author longsanlang
  * @Date 2022-04-06 17:55:44
@@ -27,6 +32,10 @@ public class AliyunTest {
     @Autowired
     private LocalBusInfusionHistoryService localBusInfusionHistoryService;
 
+    @Autowired
+    private LocalBusDeviceService deviceService;
+    @Autowired
+    private LocalBusInfusionHistoryService infusionHistoryService;
     @Test
     public void test001(){
         BusDeviceRunningEntity pump = new BusDeviceRunningEntity();
@@ -43,11 +52,18 @@ public class AliyunTest {
 
     @Test
     public void test002(){
-        BusInfusionHistoryEntity deviceUsedEntity = new BusInfusionHistoryEntity();
-        deviceUsedEntity.setTenantId("123456");
-
-        localBusInfusionHistoryService.save(deviceUsedEntity);
-        System.out.println(deviceUsedEntity);
+        List<BusDeviceEntity> deviceList = deviceService.list();
+        for (BusDeviceEntity deviceEntity : deviceList) {
+            BusInfusionHistoryEntity one = infusionHistoryService.getOne(new QueryWrapper<BusInfusionHistoryEntity>()
+                    .lambda().eq(BusInfusionHistoryEntity::getDeviceId, deviceEntity.getDeviceId())
+                    .orderByDesc(BusInfusionHistoryEntity::getStartTime)
+                    .last("limit 1"));
+            if(one!=null){
+                deviceEntity.setInfusionId(one.getId());
+                deviceEntity.setType(one.getType());
+            }
+        }
+        deviceService.updateBatchById(deviceList);
     }
 
 }

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

@@ -151,7 +151,7 @@ public class BusClinicController {
     @PostMapping("/edit")
     @SaCheckPermission("bus:clinic:edit")
     @ApiOperation(value = "编辑病人(当前)信息",notes = "编辑病人临床信息,权限【bus:clinic:edit】")
-    public R<Boolean> edit(@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId, @RequestBody @Validated ClinicEditVo entity){
+    public R<Boolean> edit(@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId, @RequestBody ClinicEditVo entity){
         if(entity.getHaveDevice()){
             BusClinicEntity clinic = entity.getClinic();
             if(clinic==null){

+ 13 - 2
coffee-system/src/main/java/com/coffee/bus/controller/BusConstantController.java

@@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.coffee.bus.enums.ConstantEnum;
 import com.coffee.bus.service.constant.AbstractConstantService;
 import com.coffee.common.entity.QueryParamEntity;
+import com.coffee.common.exception.CustomException;
 import com.coffee.common.result.R;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.Serializable;
@@ -86,7 +88,11 @@ public class BusConstantController {
         if(constantService==null){
             return R.success("常量类型{"+type+"}不存在");
         }
-        return constantService.save( payload.toBean(constantService.getEntityClass()))?R.success():R.fail("数据新增失败");
+        try {
+            return constantService.save( payload.toBean(constantService.getEntityClass()))?R.success():R.fail("数据新增失败");
+        }catch (DuplicateKeyException e){
+            throw new CustomException("常量名称不可重复");
+        }
     }
 
     @PostMapping("/update/{type}")
@@ -100,6 +106,11 @@ public class BusConstantController {
         if(constantService==null){
             return R.success("常量类型{"+type+"}不存在");
         }
-        return constantService.updateById( payload.toBean(constantService.getEntityClass()))?R.success():R.fail("数据更新失败");
+        try {
+            return constantService.updateById( payload.toBean(constantService.getEntityClass()))?R.success():R.fail("数据更新失败");
+        }catch (DuplicateKeyException e){
+            throw new CustomException("常量名称不可重复");
+        }
+
     }
 }

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

@@ -105,10 +105,11 @@ public class BusDeviceController extends BaseCrudController<BusDeviceEntity, Str
     @ApiOperation(value = "从阿里云同步设备",notes = "从阿里云平台获取设备并更新")
     @PutMapping("/sync-device")
     public R syncDevice() {
-        int i = deviceService.syncAllDevice();
-        if (i > 0){
-            return R.success(i,"同步成功");
-        }else {
+        log.info("从阿里云同步设备");
+        try {
+            return R.success(deviceService.syncDeviceFromIot()) ;
+        }catch (Exception e){
+            log.error("同步设备失败,【{}】",e);
             return R.fail("同步失败");
         }
     }
@@ -121,6 +122,7 @@ public class BusDeviceController extends BaseCrudController<BusDeviceEntity, Str
     @ApiOperation(value = "从阿里云更新本地设备",notes = "从阿里云平台获取设备并更新,参数为设备id列表,格式如['123456','456123'],参数可为空。")
     @PutMapping("/sync-device/batch")
     public R syncDevice(@RequestBody List<String> ids) {
+        log.info("从阿里云更新本地设备");
         int i = deviceService.syncDevice(ids);
         if (i > 0){
             return R.success(i,"同步成功");

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

@@ -114,6 +114,7 @@ public class BusHospitalController extends BaseCrudController<BusHospitalEntity,
         hospitalService.update(new UpdateWrapper<BusHospitalEntity>()
                 .lambda()
                 .eq(BusHospitalEntity::getId,tenantId)
+                .set(null!=updateConfig,BusHospitalEntity::getUpdateConfig,JSONUtil.toJsonStr(updateConfig))
                 .set(BusHospitalEntity::getStrategy,strategy.getValue()));
         if(updateConfig!=null){
             hospitalManagerRegister.get(tenantId)
@@ -136,7 +137,9 @@ public class BusHospitalController extends BaseCrudController<BusHospitalEntity,
     @ApiOperation(value = "查看医院脚本信息",notes = "His对接策略编辑,权限【bus:hospital:script:query】")
     public R<BusHospitalEntity> lookScript(@RequestAttribute("tenantId")@ApiParam(hidden = true) String id){
         return R.success(this.hospitalService.getOne(new QueryWrapper<BusHospitalEntity>().lambda()
-                .select(BusHospitalEntity::getId,BusHospitalEntity::getScript,BusHospitalEntity::getStrategy,BusHospitalEntity::getDraftScript)
+                .select(BusHospitalEntity::getId,BusHospitalEntity::getScript,BusHospitalEntity::getStrategy,
+                        BusHospitalEntity::getDraftScript,
+                        BusHospitalEntity::getUpdateConfig)
                 .eq(BusHospitalEntity::getId,id)));
     }
 }

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

@@ -8,7 +8,9 @@ import com.coffee.aliyun.utils.EnumUtils;
 import com.coffee.bus.bean.AliIotConfig;
 import com.coffee.bus.enums.DeviceStatusEnum2;
 import com.coffee.bus.enums.DeviceTypeEnum;
+import com.coffee.common.config.mybatis.TenantNameHandler;
 import com.coffee.common.entity.TenantGenericEntity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -36,12 +38,18 @@ public class BusDeviceEntity extends TenantGenericEntity<String,String> {
 
 
     @ApiModelProperty(value = "mqtt通道信息")
+    @JsonIgnore
     private String mqttConnInfo;
 
     @ApiModelProperty(value = "设备别名")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     @Length(max = 255,message = "设备别名不得超过255个字符")
     private String alias;
 
+    @ApiModelProperty(value = "输注id")
+    @JsonIgnore
+    private String infusionId;
+
     @ApiModelProperty(value = "设备类型")
     @Length(max = 255,message = "设备类型不得超过255个字符")
     private DeviceTypeEnum type;
@@ -70,6 +78,9 @@ public class BusDeviceEntity extends TenantGenericEntity<String,String> {
     @ApiModelProperty(value = "设备在线状态,0未激活,1在线,2离线",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
     private DeviceStatusEnum2 status;
 
+    @TableField(value = "tenant_id",typeHandler = TenantNameHandler.class,updateStrategy = FieldStrategy.NEVER,insertStrategy = FieldStrategy.NEVER)
+    private String tenantName;
+
     /**
      * @author 龙三郎
      * 根据阿里云返回的数据更新设备对象

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

@@ -105,6 +105,13 @@ public class BusDeviceRunningEntity extends CommonDeviceParam<String,String> {
     @TableField(exist = false)
     @JsonIgnoreProperties
     private boolean infusionModify;
+
+    /**
+     *当设备输注过程已撤泵被重新开启时,只在设备上传解析过程中使用,其他地方无用处
+     */
+    @TableField(exist = false)
+    @JsonIgnoreProperties
+    private boolean resetUndo;
     /**
      * 患者id
      */

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

@@ -84,9 +84,9 @@ public class BusInfusionHistoryEntity extends CommonDeviceParam<String,String> {
         entity.setStartTime(running.getStartTime());
         entity.setPatientId(running.getPatientId());
         entity.setLastUploadTime(running.getUploadTime());
-        if(DeviceStatusEnum.Shutdown.equals(running.getRunState())){
-            entity.setFinished(true);
-        }
+//        if(DeviceStatusEnum.Shutdown.equals(running.getRunState())){
+//            entity.setFinished(true);
+//        }
         //若当前临床信息不存在,则将时间戳置为 1971/01/01 01:01:01
         entity.setClinicStartTime(defaultClinicStartTime());
         return entity;

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

@@ -135,6 +135,11 @@ public class HospitalFunctionExtraConfigHandler  extends  AbstractHospitalConfig
             log.debug("不在服务区消息【{}】由于输注已结束,不在继续处理该消息,消息【{}】",source.getId(),source);
             return;
         }
+        if(!infusionHistory.getLastUploadTime().equals(source.getUploadTime())){
+            //有数据更新,取消不在服务区判定
+            log.debug("不在服务区消息【{}】由于有新数据产生,不在继续处理该消息,消息【{}】",source.getId(),source);
+            return;
+        }
         //不在服务区报警信息保存
         Date uploadTime=new Date(source.getTimestamp().getTime()+source.getUnit().toMillis(source.getTimeout()));
         BusDeviceAlarmEntity alarm = BusDeviceAlarmEntity.noSignalOf(source.getDeviceId(),source.getInfusionId(),source.getHistoryId(),source.getTenantId(),uploadTime);

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

@@ -2,7 +2,9 @@ package com.coffee.bus.service;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.StrUtil;
 import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
+import com.aliyuncs.iot.model.v20180120.QueryDeviceResponse;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -23,9 +25,12 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
@@ -53,9 +58,9 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
 
     @Override
     public void validateBeforeSave(BusDeviceEntity entity) {
-       if(entity.getTenantId()==null){
-           entity.setTenantId("1");
-       }
+        if(entity.getTenantId()==null){
+            entity.setTenantId("1");
+        }
     }
 
     @Override
@@ -211,11 +216,50 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
     public IPage<DeviceResult> pageQuery(Page<DeviceResult> page, DeviceQuery query){
         return this.baseMapper.pageQuery(page,query);
     }
+
+    /**
+     * 描述: 从阿里云平台获取全部的设备,同步到系统数据库
+     * @author lifang
+     * @date 2022/6/21 9:46
+     * @param
+     * @return int
+     */
+    public int syncDeviceFromIot() throws ExecutionException, InterruptedException {
+        log.info("从阿里云同步所有设备信息");
+        ArrayList<BusDeviceEntity> devices = new ArrayList<>();
+        List<QueryDeviceResponse.DeviceInfo> deviceInfos = aliyunIotSdk.queryDevice();
+        if (CollUtil.isNotEmpty(deviceInfos)) {
+            for (QueryDeviceResponse.DeviceInfo deviceInfo : deviceInfos) {
+                BusDeviceEntity device = new BusDeviceEntity();
+                device.setConfig(new AliIotConfig());
+                // 更新设备属性
+                device.updateFields(deviceInfo);
+                devices.add(device);
+            }
+            return  CompletableFuture.supplyAsync(() -> {
+                Set<String> pollDeviceIds = devices.stream().filter(info -> StrUtil.isNotBlank(info.getDeviceId()))
+                        .map(BusDeviceEntity::getDeviceId)
+                        .collect(Collectors.toSet());
+                List<BusDeviceEntity> existDevices = this.list(new QueryWrapper<BusDeviceEntity>().lambda().select(BusDeviceEntity::getDeviceId).in(BusDeviceEntity::getDeviceId, pollDeviceIds));
+                if (CollUtil.size(pollDeviceIds) != CollUtil.size(existDevices)) {
+                    //有新的设备产生
+                    Set<String> existDeviceIds = existDevices.stream().map(BusDeviceEntity::getDeviceId).collect(Collectors.toSet());
+                    List<BusDeviceEntity> insertDevices = devices.stream().filter(info -> !existDeviceIds.contains(info.getDeviceId())).collect(Collectors.toList());
+                    this.saveBatch(insertDevices);
+                    return CollUtil.size(insertDevices);
+                }
+                return 0;
+            }).get();
+        }
+        return 0;
+    }
+
     /**
      * @author 龙三郎
      * 从阿里云平台获取全部的设备,同步到系统数据库
      * @return
      */
+    @Deprecated
     public int syncAllDevice(){
         Integer m = 0;
         // 创建异步执行任务,有返回值
@@ -223,6 +267,7 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
             AtomicReference<Integer> n = new AtomicReference<>(0);
             // 同步所有的设备
             aliyunIotSdk.queryDevice().forEach(item ->{
+                //避免循环中操作数据库
                 BusDeviceEntity device = new BusDeviceEntity();
                 device.setConfig(new AliIotConfig());
                 // 更新设备属性

+ 53 - 18
coffee-system/src/main/java/com/coffee/bus/service/LocalBusHospitalService.java

@@ -1,16 +1,18 @@
 package com.coffee.bus.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.coffee.bus.bean.GeoPoint;
-import com.coffee.bus.entity.BusHospitalConfigEntity;
-import com.coffee.bus.entity.BusHospitalEntity;
-import com.coffee.bus.entity.HisUpdateEntity;
+import com.coffee.bus.entity.*;
+import com.coffee.bus.enums.ConstantMixEnum;
 import com.coffee.bus.hospital.HospitalManagerRegister;
 import com.coffee.bus.hospital.his.strategy.HisStrategyEnum;
 import com.coffee.bus.mapper.BusHospitalMapper;
+import com.coffee.bus.service.constant.LocalBusConAlarmService;
+import com.coffee.bus.service.constant.LocalBusConMixService;
 import com.coffee.bus.utils.CodeUtils;
 import com.coffee.common.cache.ConfigStorage;
 import com.coffee.common.cache.manager.ConfigStorageManager;
@@ -29,6 +31,7 @@ import javax.annotation.PostConstruct;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -45,6 +48,14 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
 
     private ConfigStorage nameCache;
 
+    @Autowired
+    @Lazy
+    private LocalBusConMixService conMixService;
+
+    @Autowired
+    @Lazy
+    private LocalBusConAlarmService conAlarmService;
+
     @Autowired
     @Lazy
     private SysRoleServiceImpl sysRoleService;
@@ -80,12 +91,12 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
         if("1".equals(entity.getId())){
             throw new CustomException("系统级医院,不可修改");
         }
-        BusHospitalEntity hospital = this.getById(entity.getName());
+        BusHospitalEntity hospital = this.getById(entity.getId());
         if(hospital==null){
             return;
         }
         if (!ObjectUtil.equal(entity.getName(), hospital.getName())) {
-            if(!isExistName(entity.getName())){
+            if(isExistName(entity.getName())){
                 throw new CustomException(String.format("医院名称[%s]不可重复",entity.getName()));
             }
         }
@@ -110,25 +121,49 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
                 config.setTenantId(entity.getId());
             });
             configService.saveBatch(configs);
+
+            //设置默认更新策略
+            HisUpdateEntity updateConfig = entity.getUpdateConfig();
+            if(updateConfig!=null){
+                hospitalManagerRegister.get(entity.getId()).refreshUpdateConfig(updateConfig);
+            }
+
+            //设置默认管理员角色
+            SysRole sysRole = new SysRole();
+            sysRole.setTenantId(entity.getId());
+            sysRole.setRoleName("超级管理员");
+            sysRole.setDataScope("1");
+            sysRole.setRoleCode("admin");
+            sysRole.setRemarks("超级管理员角色,不可编辑,不可删除");
+            sysRoleService.save(sysRole);
+            nameCache.setConfig(entity.getId(),entity.getName());
+
+            //设置默认常量信息
+            List<BusConMixEntity> drugCons = conMixService.list(new QueryWrapper<BusConMixEntity>()
+                    .lambda().eq(BusConMixEntity::getTenantId, "1")
+                    .eq(BusConMixEntity::getType, ConstantMixEnum.drugCate));
+            if(CollUtil.isNotEmpty(drugCons)){
+                conMixService.saveBatch(drugCons.stream().peek(mix->{
+                    mix.setId(null);
+                    mix.setTenantId(entity.getId());
+                }).collect(Collectors.toSet()));
+            }
+
+            //设置默认报警原因
+            List<BusConAlarmEntity> alarmCauses = conAlarmService.list(new QueryWrapper<BusConAlarmEntity>()
+                    .lambda().eq(BusConAlarmEntity::getTenantId, "1"));
+            if (CollUtil.isNotEmpty(alarmCauses)) {
+                conAlarmService.saveBatch(alarmCauses.stream().peek(alarmCause->{
+                    alarmCause.setId(null);
+                    alarmCause.setTenantId(entity.getId());
+                }).collect(Collectors.toSet()));
+            }
         })
                 .whenComplete((i,e)->{
                     if(e!=null){
                         log.error("新增医院默认配置失败,",e);
                     }
                 });
-        HisUpdateEntity updateConfig = entity.getUpdateConfig();
-        if(updateConfig!=null){
-            hospitalManagerRegister.get(entity.getId()).refreshUpdateConfig(updateConfig);
-        }
-        //设置默认管理员角色
-        SysRole sysRole = new SysRole();
-        sysRole.setTenantId(entity.getId());
-        sysRole.setRoleName("超级管理员");
-        sysRole.setDataScope("1");
-        sysRole.setRoleCode("admin");
-        sysRole.setRemarks("超级管理员角色,不可编辑,不可删除");
-        sysRoleService.save(sysRole);
-        nameCache.setConfig(entity.getId(),entity.getName());
     }
 
     @Override

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

@@ -305,7 +305,8 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
                 .eq(BusInfusionHistoryEntity::getTenantId, lastInfusion.getTenantId()));
         int size = CollectionUtil.size(infusionHistories);
         if(size>0){
-            lastInfusion = infusionHistories.stream().max(Comparator.comparing(BusInfusionHistoryEntity::getStartTime)).orElseGet(null);
+            lastInfusion = infusionHistories.stream()
+                    .max(Comparator.comparing(BusInfusionHistoryEntity::getStartTime)).get();
         }
 
         patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()

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

@@ -40,9 +40,7 @@ public class LocalBusConMixService extends AbstractConstantService<BusConMixMapp
 
     @Override
     public void validateBeforeSave(BusConMixEntity entity) {
-        if (ConstantMixEnum.ward.equals(entity.getType())&& StrUtil.isNotEmpty(entity.getCode())) {
-            throw new CustomException("病区编号不能为空");
-        }
+
     }
 
     @Override

+ 3 - 0
coffee-system/src/main/java/com/coffee/bus/service/dto/DeviceQuery.java

@@ -35,6 +35,9 @@ public class DeviceQuery implements Serializable {
     @ApiModelProperty("设备类型集合")
     private List<Integer> deviceTypes;
 
+    @ApiModelProperty("设备状态 0、未激活 1、在线 2、离线")
+    private Integer status;
+
     @ApiModelProperty("分页查询")
     @NotNull(message = "分页查询参数不可为空")
     private Page<DeviceResult> page;

+ 5 - 1
coffee-system/src/main/java/com/coffee/bus/stats/analyse/EvalStatsAnalyse.java

@@ -1,5 +1,6 @@
 package com.coffee.bus.stats.analyse;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -226,7 +227,10 @@ public class EvalStatsAnalyse implements CommonStats<CombineEvalResult> {
     public List<TableResult> handleTable(List<CombineEvalResult> results, StatsTimeUnit unit) {
         TableResult result = new TableResult();
         BusHospitalConfigEntity config = evalConfig();
-        FunctionEvalConfig evalConfig = JSONUtil.toBean(JSONUtil.toJsonStr(config.getConfig()), FunctionEvalConfig.class);
+        FunctionEvalConfig evalConfig=new FunctionEvalConfig();
+        if(config!=null&& CollUtil.isNotEmpty(config.getConfig())){
+            evalConfig = JSONUtil.toBean(JSONUtil.toJsonStr(config.getConfig()), FunctionEvalConfig.class);
+        }
         //根据时间对结果进行区分统计
         Map<String, List<CombineEvalResult>> groupByTime = groupByTime(results, unit);
 

+ 63 - 44
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -66,7 +66,6 @@ public class DeviceInfoListener {
     private final Executor executor;
     private final HospitalManagerRegister hospitalManagerRegister;
 
-
     /**
      * 监听上传的数据信息,
      * 若设备详情发生变化,则及时通知相应的ws通道
@@ -106,6 +105,12 @@ public class DeviceInfoListener {
             handleHospitalConfig(device,cacheOperation);
 
             if(device.isNewInfusion()){
+                deviceService.update(new UpdateWrapper<BusDeviceEntity>()
+                        .lambda()
+                        .eq(BusDeviceEntity::getDeviceId,device.getDeviceId())
+                        .set(BusDeviceEntity::getInfusionId,device.getInfusionId())
+                        .set(BusDeviceEntity::getType,device.getType())
+                );
                 infusionHistoryService.save(infusionHistory);
             }else {
                 infusionHistoryService.updateById(infusionHistory);
@@ -116,8 +121,10 @@ public class DeviceInfoListener {
                     wsPublishUtils.publishPatientMonitor(device.getPatientCode(),device.getTenantId());
                     wsPublishUtils.publishMonitorStateCount(device.getTenantId());
                 }
-                if (Boolean.TRUE.equals(device.isInfusionModify())||DeviceStatusEnum.Shutdown.equals(device.getRunState())) {
-                    wsPublishUtils.publishDeviceNone(device.getTenantId());
+                if (Boolean.TRUE.equals(device.isResetUndo())||Boolean.TRUE.equals(device.isInfusionModify())) {
+                    if (Boolean.TRUE.equals(device.isInfusionModify())) {
+                        wsPublishUtils.publishDeviceNone(device.getTenantId());
+                    }
                     wsPublishUtils.publishDeviceRepeat(device.getTenantId());
                 }
                 if (Boolean.TRUE.equals(device.isResetClinic())) {
@@ -136,6 +143,7 @@ public class DeviceInfoListener {
 
             //所有事务处理完成后更新缓存信息
             cacheOperation.forEach(Supplier::get);
+            log.info("设备数据处理结束:{}",JSONUtil.toJsonStr(infoEvent.getContent()));
             log.info("设备数据处理耗时:{}",(System.currentTimeMillis()-startTime));
         }
     }
@@ -167,36 +175,40 @@ public class DeviceInfoListener {
         device.setMaster(true);
         String deviceId = device.getDeviceId();
         PatientOperator currentPatientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
-        if(device.isInfusionModify()){
-            if(device.isNewInfusion()){
+        if(Boolean.TRUE.equals(device.isResetUndo())||device.isInfusionModify()){
+            if(Boolean.TRUE.equals(device.isResetUndo())||device.isNewInfusion()){
                 //只有在新开启输注时进行判断,1、判断当前输注的病号是否存在其他正在进行的输注 2、判断该设备上一次输注绑定的病号是否没有任何输注
                 long runningInfusionCount = infusionHistoryService.count(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
                         .eq(BusInfusionHistoryEntity::getFinished, false)
+                        .eq(BusInfusionHistoryEntity::getIsUndo,false)
                         .eq(BusInfusionHistoryEntity::getPatientCode, device.getPatientCode())
                         .eq(BusInfusionHistoryEntity::getTenantId, device.getTenantId()));
                 patientService.update(new UpdateWrapper<BusPatientEntity>()
                         .lambda()
                         .eq(BusPatientEntity::getCode,device.getPatientCode())
                         .eq(BusPatientEntity::getTenantId,device.getTenantId())
-                        .set(BusPatientEntity::getInfusionId,device.getInfusionId())
+                        //已撤泵重启的输注不再作为主泵进行判定
+                        .set(Boolean.FALSE.equals(device.isResetUndo()),BusPatientEntity::getInfusionId,device.getInfusionId())
                         .set(runningInfusionCount>0,BusPatientEntity::getAlarm,PatientAlarmEnum.DEVICE_REPEAT)
                         .set(runningInfusionCount==0,BusPatientEntity::getAlarm,PatientAlarmEnum.NONE));
-                BusInfusionHistoryEntity lastInfusion = infusionHistoryService.lastInfusion(deviceId);
-                if(lastInfusion!=null&&ObjectUtil.notEqual(device.getPatientCode(),lastInfusion.getPatientCode())){
-                    //输注设备被占用
-                    BusInfusionHistoryEntity normalInfusion = infusionHistoryService.deviceOccupation(lastInfusion);
-                    if(normalInfusion!=null){
-                        patientRegistry.getOperator(lastInfusion.getTenantId(), lastInfusion.getPatientCode()).setBindDeviceId(normalInfusion.getDeviceId());
-                        suppliers.add(()->{
-                            wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientCode(),lastInfusion.getTenantId());
-                            return null;
-                        });
+                if(device.isNewInfusion()){
+                    BusInfusionHistoryEntity lastInfusion = infusionHistoryService.lastInfusion(deviceId);
+                    if(lastInfusion!=null&&ObjectUtil.notEqual(device.getPatientCode(),lastInfusion.getPatientCode())){
+                        //输注设备被占用
+                        BusInfusionHistoryEntity normalInfusion = infusionHistoryService.deviceOccupation(lastInfusion);
+                        if(normalInfusion!=null){
+                            patientRegistry.getOperator(lastInfusion.getTenantId(), lastInfusion.getPatientCode()).setBindDeviceId(normalInfusion.getDeviceId());
+                            suppliers.add(()->{
+                                wsPublishUtils.publishPatientMonitor(lastInfusion.getPatientCode(),lastInfusion.getTenantId());
+                                return null;
+                            });
+                        }
                     }
                 }
-                if(clinicFinished){
-                    clinicService.resetClinic(device.getClinicId());
-                    device.setResetClinic(true);
-                }
+//                if(clinicFinished){
+//                    clinicService.resetClinic(device.getClinicId());
+//                    device.setResetClinic(true);
+//                }
                 device.setMaster(true);
                 suppliers.add(()->{
                     currentPatientOperator.setBindDeviceId(deviceId);
@@ -253,6 +265,9 @@ public class DeviceInfoListener {
             device.setNewInfusion(false);
             infusionHistory.setStartTime(device.getStartTime());
             infusionHistory.setId(originInfusionId);
+            BusInfusionHistoryEntity originInfusion = infusionHistoryService.getById(originInfusionId);
+            device.setResetUndo(Boolean.TRUE.equals(originInfusion.getIsUndo()));
+            device.setMaster(false);
         }
         device.setInfusionId(infusionHistory.getId());
         cacheOperation.add(()->{
@@ -281,35 +296,23 @@ public class DeviceInfoListener {
         String signHex = busInfusionModify.signParam();
         String infusionParam = deviceOperator.getInfusionParam();
         boolean clinicFinished = clinicService.isFinished(device.getClinicId());
-        if(ObjectUtil.notEqual(signHex,infusionParam)){
-            device.setInfusionModify(true);
-            infusionModifyService.save(busInfusionModify);
-            device.setInfusionModifyId(busInfusionModify.getId());
-            device.setModifyTime(busInfusionModify.getModifyTime());
+        //1、输注已撤泵,重新开启
+        if(Boolean.TRUE.equals(device.isResetUndo())||ObjectUtil.notEqual(signHex,infusionParam)){
+            if(ObjectUtil.notEqual(signHex,infusionParam)){
+                device.setInfusionModify(true);
+                infusionModifyService.save(busInfusionModify);
+                device.setInfusionModifyId(busInfusionModify.getId());
+                device.setModifyTime(busInfusionModify.getModifyTime());
+            }
             handlePatient(device,clinicFinished,cacheOperation);
             cacheOperation.add(()->{
-                deviceOperator.setInfusionParam(signHex);
-                deviceOperator.setModifyTime(device.getUploadTime());
+                if(device.isInfusionModify()){
+                    deviceOperator.setInfusionParam(signHex);
+                    deviceOperator.setModifyTime(device.getUploadTime());
+                }
                 return null;
             });
-            device.setIsUndo(false);
         }else {
-            //判断临床是否已结束,若临床已结束,则采用当前输注作为主输注开启临床
-            if(clinicFinished){
-                clinicService.resetClinic(device.getClinicId());
-                patientService.update(new UpdateWrapper<BusPatientEntity>()
-                        .lambda()
-                        .eq(BusPatientEntity::getCode,device.getPatientCode())
-                        .eq(BusPatientEntity::getTenantId,device.getTenantId())
-                        .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
-                PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
-                device.setMaster(true);
-                device.setResetClinic(true);
-                cacheOperation.add(()->{
-                    patientOperator.setBindDeviceId(device.getDeviceId());
-                    return null;
-                });
-            }
             //填充当前参数修改记录id
             BusInfusionModifyEntity modify =infusionModifyService.recentModify(device.getClinicId(),device.getTenantId());
             if(modify==null){
@@ -323,6 +326,22 @@ public class DeviceInfoListener {
 //                infusionHistoryService.deviceShutDown(device.getInfusionId(),device.getPatientCode(),device.getTenantId());
 //            }
         }
+        //判断临床是否已结束,若临床已结束,则采用当前输注作为主输注开启临床
+        if(clinicFinished){
+            clinicService.resetClinic(device.getClinicId());
+            patientService.update(new UpdateWrapper<BusPatientEntity>()
+                    .lambda()
+                    .eq(BusPatientEntity::getCode,device.getPatientCode())
+                    .eq(BusPatientEntity::getTenantId,device.getTenantId())
+                    .set(BusPatientEntity::getInfusionId,device.getInfusionId()));
+            PatientOperator patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
+            device.setMaster(true);
+            device.setResetClinic(true);
+            cacheOperation.add(()->{
+                patientOperator.setBindDeviceId(device.getDeviceId());
+                return null;
+            });
+        }
     }
 
 

+ 1 - 0
coffee-system/src/main/java/com/coffee/system/common/dto/SysMenuEditDTO.java

@@ -69,6 +69,7 @@ public class SysMenuEditDTO implements Serializable {
     @Size(max = 100, message = "图标长度不能超过100个字符")
     private String icon;
 
+    private Boolean tenantMenu;
     /**
      * 是否缓存 0缓存;1不缓存
      */

+ 1 - 1
coffee-system/src/main/java/com/coffee/system/common/dto/SysUserAddDTO.java

@@ -131,7 +131,7 @@ public class SysUserAddDTO implements Serializable {
      */
     private List<Long> roleIds;
 
-    private Integer isSys;
+    private Boolean isSys;
 
     private Long tenantId;
 }

+ 0 - 6
coffee-system/src/main/java/com/coffee/system/common/dto/SysUserEditDTO.java

@@ -96,12 +96,6 @@ public class SysUserEditDTO implements Serializable {
      */
     private String deptId;
 
-    /**
-     * 锁定标记 0正常;1锁定
-     */
-    @NotBlank(message = "锁定标记不能为空")
-    private String lockFlag;
-
     /**
      * 排序
      */

+ 4 - 2
coffee-system/src/main/java/com/coffee/system/controller/SysUserController.java

@@ -3,6 +3,7 @@ package com.coffee.system.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.coffee.common.annotation.Log;
+import com.coffee.common.exception.CustomException;
 import com.coffee.common.result.R;
 import com.coffee.common.util.ExcelUtil;
 import com.coffee.system.common.dto.SysUserAddDTO;
@@ -11,6 +12,7 @@ import com.coffee.system.common.dto.SysUserQueryDTO;
 import com.coffee.system.common.dto.SysUserResetPwdDTO;
 import com.coffee.system.entity.SysUser;
 import com.coffee.system.service.ISysUserService;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -48,8 +50,8 @@ public class SysUserController {
     @SaCheckPermission("system:sysUser:add")
     @Log(title = "用户管理新增")
     public R add(@Validated @RequestBody SysUserAddDTO req) {
-        sysUserService.add(req);
-        return R.success();
+            sysUserService.add(req);
+            return R.success();
     }
 
     /**

+ 1 - 1
coffee-system/src/main/java/com/coffee/system/service/impl/SysUserServiceImpl.java

@@ -123,7 +123,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             throw new CustomException("工号已存在");
         }
         if(req.getIsSys()==null){
-            req.setIsSys(0);
+            req.setIsSys(false);
         }
         SysUser entity = BeanUtil.copyProperties(req, SysUser.class);
         // 密码加密

+ 6 - 3
coffee-system/src/main/resources/mapper/bus/BusClinicMapper.xml

@@ -165,9 +165,12 @@
         eval.eval_count as eval_count
         from
         (select * from bus_patient
-        <if test="query.patientCode!=null">
-            and patient_code like concat('%',#{query.patientCode},'%')
-        </if>
+        <where>
+            <if test="query.patientCode!=null">
+                and patient_code like concat('%',#{query.patientCode},'%')
+            </if>
+        </where>
+
         )as p
         left join
         (select * from bus_clinic

+ 6 - 19
coffee-system/src/main/resources/mapper/bus/BusDeviceMapper.xml

@@ -38,7 +38,7 @@
         d.id as id,
         d.device_id as device_id,
         d.alias as alias,
-        ifnull(i.type,3) as type,
+        ifnull(i.type,0) as type,
         i.run_state as run_state,
         i.alarm as alarm,
         d.config as config,
@@ -63,26 +63,13 @@
             <if test="query.alias!=null">
                 and alias like concat('%',#{query.alias},'%')
             </if>
-        </where>
-        ) AS d
-        LEFT JOIN (select * from bus_infusion_history
-        <where>
-            finished=0
-            <if test="query.runStates != null and query.runStates.size > 0">
-                and run_state in
-                <foreach item="state" index="index" collection="query.runStates" open="(" separator="," close=")">
-                    #{state, jdbcType=VARCHAR}
-                </foreach>
-            </if>
-            <if test="query.alarms != null and query.alarms.size > 0">
-                and alarm in
-                <foreach item="alarm" index="index" collection="query.alarms" open="(" separator="," close=")">
-                    #{alarm, jdbcType=VARCHAR}
-                </foreach>
+            <if test="query.status!=null">
+                status = #{query.status}
             </if>
         </where>
-        ) as i
-        on i.device_id=d.device_id
+        ) AS d
+        LEFT JOIN (select * from bus_infusion_history) as i
+        on i.id=d.infusion_id
         order by d.create_time desc
     </select>
 </mapper>

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

@@ -216,7 +216,7 @@
         (select * from bus_infusion_history
         <where>
             is_undo='0'
-            <if test="query.infusionFinished == true and query.andFinished == true ">
+            <if test="query.infusionFinished != null and query.andFinished == true ">
                 and  finished=#{query.infusionFinished}
             </if>
             <if test="query.types != null and query.types.size > 0">
@@ -243,7 +243,7 @@
                             #{alarm, jdbcType=VARCHAR}
                         </foreach>
                     </if>
-                    <if test="query.infusionFinished == true and query.andFinished == false ">
+                    <if test="query.infusionFinished != null and query.andFinished == false ">
                         or finished=#{query.infusionFinished}
                     </if>
                     )