Bladeren bron

add 病人监控列表
add 主泵切换
add 批量撤泵

18339543638 3 jaren geleden
bovenliggende
commit
93b01ed5ea
19 gewijzigde bestanden met toevoegingen van 226 en 107 verwijderingen
  1. 1 1
      coffee-codegen/src/main/resources/templates/service.java.vm
  2. 2 2
      coffee-common/src/main/java/com/coffee/common/crud/controller/BaseDeleteController.java
  3. 5 0
      coffee-common/src/main/java/com/coffee/common/result/ResultCode.java
  4. 1 1
      coffee-framework/src/main/java/com/coffee/framework/config/mybatisplus/MybatisPlusConfig.java
  5. 1 9
      coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceRunningController.java
  6. 72 34
      coffee-system/src/main/java/com/coffee/bus/controller/BusPatientController.java
  7. 3 0
      coffee-system/src/main/java/com/coffee/bus/entity/BusInfusionHistoryEntity.java
  8. 4 1
      coffee-system/src/main/java/com/coffee/bus/entity/BusPatientEntity.java
  9. 4 12
      coffee-system/src/main/java/com/coffee/bus/handler/CheckSignHandler.java
  10. 1 1
      coffee-system/src/main/java/com/coffee/bus/registry/patient/ClusterPatientOperator.java
  11. 11 1
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java
  12. 73 20
      coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java
  13. 4 11
      coffee-system/src/main/java/com/coffee/bus/service/dto/DeviceShiftConfig.java
  14. 7 1
      coffee-system/src/main/java/com/coffee/bus/service/dto/ManualUndoConfig.java
  15. 26 0
      coffee-system/src/main/java/com/coffee/bus/service/dto/PatientMonitorResult.java
  16. 9 10
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java
  17. 1 0
      coffee-system/src/main/java/com/coffee/bus/websocket/listener/HisInfoListener.java
  18. 1 1
      coffee-system/src/main/java/com/coffee/system/service/impl/SysUserServiceImpl.java
  19. 0 2
      coffee-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 1 - 1
coffee-codegen/src/main/resources/templates/service.java.vm

@@ -59,7 +59,7 @@ public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
     /**
      * 删除
      *
-     * @param ids
+     * @param deviceIds
      */
     void remove(String ids);
     

+ 2 - 2
coffee-common/src/main/java/com/coffee/common/crud/controller/BaseDeleteController.java

@@ -43,13 +43,13 @@ public interface BaseDeleteController<E, K extends Serializable> extends BaseCur
      * @Author lifang
      * @Date 14:31 2022/3/12
      * @Description 此处Delete接收消息体数组略显麻烦,直接使用Post请求进行接收
-     * @Param [ids]
+     * @Param [deviceIds]
      * @return com.coffee.common.result.R
      **/
 
     @PostMapping("/delete/_batch")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "ids",value = "主键id集合",required = true)
+            @ApiImplicitParam(name = "deviceIds",value = "主键id集合",required = true)
     })
     @ApiOperation(value = "根据ID删除")
     default R delete(@RequestBody List<String> ids) {

+ 5 - 0
coffee-common/src/main/java/com/coffee/common/result/ResultCode.java

@@ -24,6 +24,11 @@ public enum ResultCode implements IResultCode {
      */
     FAILURE(HttpServletResponse.SC_BAD_REQUEST, "业务异常"),
 
+    /**
+     * 病人当前设备重复绑定
+     */
+    PATIENT_DEVICE_REPEAT(4001, "业务异常"),
+
     /**
      * 请求未授权
      */

+ 1 - 1
coffee-framework/src/main/java/com/coffee/framework/config/mybatisplus/MybatisPlusConfig.java

@@ -142,7 +142,7 @@ public class MybatisPlusConfig {
                     return true;
                 }
                 StringBuffer url = request.getRequest().getRequestURL();
-                if(url.toString().endsWith("/login")){
+                if(url.toString().endsWith("/login")||url.toString().endsWith("/getUserInfo")){
                     return true;
                 }
                 if(CollectionUtil.isNotEmpty(ignoreTableName)&&ignoreTableName.contains(tableName)){

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

@@ -77,14 +77,6 @@ public class BusDeviceRunningController implements BaseQueryController<BusDevice
 //        return R.success();
 //    }
 
-    @PostMapping("/shift")
-    @SaCheckPermission("device:running:shift")
-    @ApiOperation(value = "进行主泵切换的操作",notes = "当出现泵重复状态时,若用户想要进行主泵的切换,调用该接口进行操作,主泵切换完成后,会将副泵自动撤泵,权限标识为【device:running:shift】")
-    public R shift(@RequestBody DeviceShiftConfig shiftConfig){
-        netPumpService.shift(shiftConfig);
-        return R.success();
-    }
-
 
 
 
@@ -94,7 +86,7 @@ public class BusDeviceRunningController implements BaseQueryController<BusDevice
      */
     @Override
     public String getPermissionPrefix() {
-        return "bus:pump";
+        return "device:running";
     }
 
     @Override

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

@@ -9,23 +9,25 @@ import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.entity.PatientMonitorDomain;
 import com.coffee.bus.enums.DeviceStatusEnum;
+import com.coffee.bus.registry.patient.PatientOperator;
+import com.coffee.bus.registry.patient.PatientRegistry;
+import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
+import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.LocalBusClinicService;
 import com.coffee.bus.service.LocalBusDeviceRunningService;
 import com.coffee.bus.service.LocalBusPatientService;
-import com.coffee.bus.service.dto.ManualUndoConfig;
-import com.coffee.bus.service.dto.PatientDeviceNoneResult;
-import com.coffee.bus.service.dto.PatientDeviceRepeatResult;
-import com.coffee.bus.service.dto.PatientMonitorQuery;
+import com.coffee.bus.service.dto.*;
 import com.coffee.common.crud.BaseService;
 import com.coffee.common.crud.controller.BaseCrudController;
 import com.coffee.common.exception.CustomException;
 import com.coffee.common.result.R;
+import com.coffee.common.result.ResultCode;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.async.DeferredResult;
 
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -38,14 +40,16 @@ import java.util.stream.Collectors;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/bus/patient")
-@Api(tags = "医院病人管理",description = "统一权限前缀(bus:patient),例如新增bus:patient:add")
-public class BusPatientController extends BaseCrudController<BusPatientEntity, String> {
+@Api(tags = "医院病人管理",description = "关于病人的相关操作")
+public class BusPatientController  {
     private final LocalBusPatientService patientService;
 
     private final LocalBusDeviceRunningService deviceRunningService;
 
     private final LocalBusClinicService clinicService;
 
+    private final PatientRegistry patientRegistry;
+
     @PostMapping("/no_page")
     @SaCheckPermission("bus:patient:query")
     @ApiOperation(value = "病人监控管理列表",notes = "病人监控管理列表,权限【bus:patient:query】")
@@ -95,44 +99,78 @@ public class BusPatientController extends BaseCrudController<BusPatientEntity, S
                 .in(BusDeviceRunningEntity::getPatientCode,patientCodes)));
     }
 
-    @PostMapping("/finished")
+    @PostMapping("/do/finished")
     @SaCheckPermission("bus:patient:finished")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "结束监控数据结构",name = "monitorFinished",dataTypeClass = MonitorFinished.class)
-    })
-    @ApiOperation(value = "判断给定病号中是否可以结束临床管理",notes = "病患当前绑定主设备必须要在关机、不在服务器、待机中才能结束管理,权限【bus:patient:finished】")
+    @ApiResponse(code = 4001,message = "病号当前绑定了多个设备,不可结束管理")
+    @ApiOperation(value = "结束对于病号的当前监控,即结束管理",notes = "病患当前绑定主设备必须要在关机、不在服务器、待机中才能结束管理,权限【bus:patient:finished】")
     public R finished(@RequestBody MonitorFinished monitorFinished, @RequestAttribute("tenantId")String tenantId){
         List<String> patientCodes = monitorFinished.getPatientCodes();
         if(CollectionUtil.isEmpty(patientCodes)){
             throw new CustomException("请选择一个病患");
         }
-        List<BusDeviceRunningEntity> runningDevices = deviceRunningService.list(new QueryWrapper<BusDeviceRunningEntity>()
-                .lambda()
-                .select(BusDeviceRunningEntity::getDeviceId)
-                .in(BusDeviceRunningEntity::getPatientCode, patientCodes)
-                .eq(BusDeviceRunningEntity::getIsUndo, false)
-                .eq(BusDeviceRunningEntity::getMonitorType, true));
-        if(CollectionUtil.isNotEmpty(runningDevices)){
-            //病患绑定的有设备,对设备进行撤泵操作
-            ManualUndoConfig undoConfig = ManualUndoConfig.of(runningDevices.stream().map(BusDeviceRunningEntity::getId).collect(Collectors.toList()), true, monitorFinished.getUndo());
-            deviceRunningService.undo(undoConfig);
+        List<PatientOperator<PatientCacheInfo>> patientOperators = patientCodes.stream().map(code -> patientRegistry.getOperator(tenantId, code)).collect(Collectors.toList());
+        //重复设备
+        Optional<PatientOperator<PatientCacheInfo>> existRepeatDevice = patientOperators.stream()
+                .filter(patientOperator -> {
+                    Set<DeviceTimeSmallInfo> allDevice = patientOperator.getAllDevice();
+                    if (allDevice != null && allDevice.size() > 1) {
+                        return true;
+                    }
+                    return false;
+                })
+                .findAny();
+        if(existRepeatDevice.isPresent()){
+            return R.result(ResultCode.PATIENT_DEVICE_REPEAT,String.format("病号【%s】当前绑定了多个设备,请将多余设备结束后结束管理",existRepeatDevice.get().getCode()));
         }
-        //结束临床
-        clinicService.finish(patientCodes,tenantId);
+        //组装撤泵信息
+        List<ManualUndoConfig> undoConfigs = patientOperators.stream().map(operator ->
+                ManualUndoConfig.of(Collections.singletonList(operator.getBindDeviceId()), operator.getCode(), tenantId,true, monitorFinished.getUndo())
+        )
+                .filter(undoConfig -> undoConfig.getDeviceIds() != null && undoConfig.getDeviceIds().size() > 0)
+                .collect(Collectors.toList());
+        //病患绑定的有设备,对设备进行撤泵操作,且结束临床
+        deviceRunningService.batchUndo(undoConfigs,true);
+        return R.success();
+    }
+
+    @PostMapping("/shift")
+    @SaCheckPermission("device:patient:shift")
+    @ApiOperation(value = "病人进行主泵切换的操作,只切换,不结束",notes = "当出现泵重复状态时,若用户想要进行主泵的切换,调用该接口进行操作,主泵切换完成后,会将副泵自动撤泵,权限标识为【device:patient:shift】")
+    public R shift(@RequestBody DeviceShiftConfig shiftConfig){
+        deviceRunningService.shift(shiftConfig);
+        return R.success();
+    }
+
+    @PostMapping("/undo")
+    @SaCheckPermission("device:patient:undo")
+    @ApiOperation(value = "病人多余的副泵撤掉,只撤泵,不切换",notes = "当出现泵重复状态时,若用户想要取消对其他副泵的监控,则调用此接口进行撤泵操作,权限标识为【device:patient:undo】")
+    public R shift(@RequestBody ManualUndoConfig undoConfig){
+        deviceRunningService.undo(undoConfig,false);
         return R.success();
     }
-    /**
-     * 权限控制前缀
-     * @return
-     */
-    @Override
-    public String getPermissionPrefix() {
-        return "bus:patient";
+
+
+    //todo
+    @PostMapping("/edit")
+    @SaCheckPermission("device:patient:edit")
+    @ApiOperation(value = "编辑病人信息及病人当前手术信息",notes = "编辑病人信息及病人当前手术信息,权限标识为【device:patient:edit】")
+    public R edit(){
+        return R.success();
     }
 
-    @Override
-    public BaseService<? extends Mapper<BusPatientEntity>, BusPatientEntity, String> getService() {
-        return patientService;
+
+    @GetMapping("/monitor/{monitorType}/{patientCode}")
+    @SaCheckPermission("device:patient:query")
+    @ApiOperation(value = "查看病人当前监控详情",notes = "查看病人当前监控详情,权限标识为【device:patient:query】")
+    public R<PatientMonitorResult> monitor(@PathVariable("monitorType")@ApiParam(value = "是否为有泵监控",example = "0、无泵,1、有泵") Boolean haveDevice,@PathVariable("patientCode")@ApiParam(value = "病号") String patientCode){
+        PatientMonitorResult result = new PatientMonitorResult();
+        if(haveDevice){
+            patientService.getOne(new QueryWrapper<BusPatientEntity>().lambda()
+                    .eq(BusPatientEntity::getCode,patientCode).last("limit 1"));
+        }else {
+
+        }
+        return R.success(result);
     }
 
     //todo 使用

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

@@ -202,6 +202,9 @@ public class BusInfusionHistoryEntity extends TenantGenericEntity<String,String>
     @ApiModelProperty(value = "手术开始时间")
     private Date clinicStartTime;
 
+    @ApiModelProperty(value = "该次输注是否已结束")
+    private Boolean finished;
+
     public static BusInfusionHistoryEntity parseRunningInfo(BusDeviceRunningEntity running){
         BusInfusionHistoryEntity entity = new BusInfusionHistoryEntity();
         entity.setDeviceId(running.getDeviceId());

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

@@ -25,7 +25,7 @@ import org.hibernate.validator.constraints.Length;
 @EqualsAndHashCode(callSuper = true)
 @Data
 @TableName(value = "bus_patient",autoResultMap = true)
-@ApiModel(value="住院病人基本信息", description="住院病人基本信息实体类")
+@ApiModel(value="住院病人基本信息", description="住院病人基本信息实体类,这里只存储有泵监控的,无泵监控的没有病人信息,只有临床手术信息")
 @ToString
 public class BusPatientEntity extends TenantGenericEntity<String,String> {
     @ApiModelProperty(value = "病号")
@@ -43,6 +43,9 @@ public class BusPatientEntity extends TenantGenericEntity<String,String> {
     @ApiModelProperty("病号最新的输注记录")
     private String infusionId;
 
+    @ApiModelProperty("病人最后的手术id,若病人手术信息暂不存在,则先置为-1")
+    private String clinicId;
+
     @TableField(fill = FieldFill.INSERT)
     @TableLogic(value = "0",delval = "1")
     private Integer isDelete;

+ 4 - 12
coffee-system/src/main/java/com/coffee/bus/handler/CheckSignHandler.java

@@ -1,29 +1,20 @@
 package com.coffee.bus.handler;
 
-import cn.hutool.core.io.FastByteArrayOutputStream;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.crypto.SignUtil;
-import cn.hutool.crypto.asymmetric.SignAlgorithm;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.coffee.common.result.R;
 import com.coffee.common.result.ResultCode;
-import jodd.net.HttpMethod;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.codec.digest.Md5Crypt;
-import org.bouncycastle.crypto.digests.MD5Digest;
-import org.springframework.stereotype.Component;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
 import org.springframework.web.servlet.HandlerInterceptor;
-import sun.security.provider.MD5;
 
-import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.nio.charset.Charset;
-import java.util.TreeMap;
 
 /**
  * @author lifang
@@ -32,7 +23,8 @@ import java.util.TreeMap;
  * @Description TODO
  * @createTime 2022年04月22日 10:47:00
  */
-@Component
+@Configuration
+@Profile("dev")
 public class CheckSignHandler implements HandlerInterceptor {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {

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

@@ -57,7 +57,7 @@ public class ClusterPatientOperator implements PatientOperator<PatientCacheInfo>
 //        }
 //        Value finished = parseValue(result.get("finished"));
 //        if(finished!=null&&finished.get()!=null){
-//            cacheInfo.setIsFinished(finished.asBoolean());
+//            cacheInfo.setFinished(finished.asBoolean());
 //        }
 //        Value bindDeviceId =parseValue( result.get("bindDeviceId"));
 //        if(bindDeviceId!=null&&bindDeviceId.get()!=null){

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

@@ -55,11 +55,21 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
      */
     @Transactional(rollbackFor = Exception.class)
     public void finish(List<String> patientCodes, String tenantId) {
+        this.finish(patientCodes,new Date(),tenantId);
+    }
+
+    /**
+     * 结束当前医院病号的临床数据
+     * @param patientCodes 病号
+     * @param  finishTime 临床结束时间
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void finish(List<String> patientCodes,Date finishTime, String tenantId) {
         this.update(new UpdateWrapper<BusClinicEntity>().lambda()
                 .in(BusClinicEntity::getPatientCode,patientCodes)
                 .eq(BusClinicEntity::getFinished,false)
                 .set(BusClinicEntity::getFinished,true)
-                .set(BusClinicEntity::getEndTime,new Date()));
+                .set(BusClinicEntity::getEndTime,finishTime));
         //更新病人缓存
         patientCodes.stream().map(code->patientRegistry.getOperator(tenantId,code)).forEach(operator->operator.setFinished(true));
     }

+ 73 - 20
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceRunningService.java

@@ -1,11 +1,14 @@
 package com.coffee.bus.service;
 
 import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.coffee.bus.entity.BusPatientEntity;
+import com.coffee.bus.registry.device.DeviceOperator;
 import com.coffee.bus.registry.device.DeviceRegistry;
+import com.coffee.bus.registry.device.bean.DeviceCacheInfo;
 import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
-import com.coffee.bus.registry.patient.bean.DeviceTimeSmallInfo;
 import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.dto.UndoDeviceConfig;
 import com.coffee.bus.service.dto.DeviceShiftConfig;
@@ -15,15 +18,13 @@ import com.coffee.bus.entity.BusDeviceRunningEntity;
 import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.mapper.BusDeviceRunningMapper;
 import com.coffee.common.crud.BaseService;
-import lombok.AllArgsConstructor;
+import com.coffee.common.exception.CustomException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -37,13 +38,17 @@ import java.util.stream.Collectors;
 public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMapper, BusDeviceRunningEntity,String> {
     private final LocalBusInfusionHistoryService infusionHistoryService;
     private final PatientRegistry patientRegistry;
+    private final LocalBusPatientService patientService;
+    private final LocalBusClinicService clinicService;
     @Autowired
     @Lazy
     private DeviceRegistry deviceRegistry;
 
-    public LocalBusDeviceRunningService(LocalBusInfusionHistoryService infusionHistoryService, PatientRegistry patientRegistry) {
+    public LocalBusDeviceRunningService(LocalBusInfusionHistoryService infusionHistoryService, PatientRegistry patientRegistry,LocalBusPatientService patientService, LocalBusClinicService clinicService) {
         this.infusionHistoryService = infusionHistoryService;
         this.patientRegistry = patientRegistry;
+        this.patientService=patientService;
+        this.clinicService=clinicService;
     }
 
     @Override
@@ -61,23 +66,43 @@ public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMa
 
     }
 
+    /**
+     * 批量撤泵
+     * @param undoConfigs 批量撤泵配置
+     * @param  finishClinic 撤泵后是否结束相关临床
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void batchUndo(List<ManualUndoConfig> undoConfigs,boolean finishClinic){
+        undoConfigs.forEach(undoConfig -> this.undo(undoConfig,false));
+        //批量结束临床
+        if(finishClinic){
+            Map<String, List<ManualUndoConfig>> configsMap = undoConfigs.stream().collect(Collectors.groupingBy(ManualUndoConfig::getTenantId));
+            configsMap.forEach((k,v)-> {
+                clinicService.finish(v.stream().map(ManualUndoConfig::getPatientCode).collect(Collectors.toList()),v.get(0).getUndo().getUndoTime() ,k);
+            });
+        }
+    }
     /**
      * 结束病患监控操作
      * @param manualUndoConfig
+     * @param  finishClinic 撤泵后是否结束相关临床
      */
     @Transactional(rollbackFor = Exception.class)
-    public void undo(ManualUndoConfig manualUndoConfig) {
-        List<String> ids = manualUndoConfig.getIds();
-        if(CollectionUtil.isEmpty(ids)){
+    public void undo(ManualUndoConfig manualUndoConfig,boolean finishClinic) {
+        List<String> deviceIds = manualUndoConfig.getDeviceIds();
+        if(CollectionUtil.isEmpty(deviceIds)){
             return;
         }
         /****************将撤泵记录存入到泵的使用历史记录中***************/
-        List<BusDeviceRunningEntity> devices = this.listByIds(ids);
+        List<BusDeviceRunningEntity> devices = this.list(new QueryWrapper<BusDeviceRunningEntity>().lambda().in(BusDeviceRunningEntity::getDeviceId,deviceIds));
         if(CollectionUtil.isEmpty(devices)){
             return;
         }
+        if (devices.stream().anyMatch(BusDeviceRunningEntity::getMaster)) {
+            throw new CustomException("主泵不可撤除,请在【结束管理】处操作");
+        }
         //对所有运行中的泵进行撤泵操作
-        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().in(BusDeviceRunningEntity::getId,ids).set(BusDeviceRunningEntity::getIsUndo,true));
+        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda().in(BusDeviceRunningEntity::getDeviceId,deviceIds).set(BusDeviceRunningEntity::getIsUndo,true));
         //无泵监护,不需要监护输注数据
         if(!Boolean.TRUE.equals(manualUndoConfig.getMonitorType())){
             //输注结束,更新撤泵信息
@@ -90,9 +115,13 @@ public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMa
                     .set(BusInfusionHistoryEntity::getDestroyer,undo.getDestroyer())
                     .set(BusInfusionHistoryEntity::getWitnesses,undo.getWitnesses()));
             //将缓存设置为已撤泵状态
-            ids.stream().map(deviceRegistry::getOperator)
+            deviceIds.stream().map(deviceRegistry::getOperator)
                     .forEach(operator->operator.setUndo(true));
         }
+        //结束临床
+        if(finishClinic){
+            clinicService.finish(Collections.singletonList(manualUndoConfig.getPatientCode()),manualUndoConfig.getTenantId());
+        }
 
     }
 
@@ -113,14 +142,38 @@ public class LocalBusDeviceRunningService extends BaseService<BusDeviceRunningMa
      */
     @Transactional(rollbackFor = Exception.class)
     public void shift(DeviceShiftConfig shiftConfig) {
-        PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(shiftConfig.getTenantId(), shiftConfig.getPatientCode());
-        List<String> replicaIds = shiftConfig.getReplicaIds();
-        if(CollectionUtil.isNotEmpty(replicaIds)){
-            ManualUndoConfig manualUndoConfig = ManualUndoConfig.of(replicaIds,true,shiftConfig.getUndo());
-            //对副泵进行撤泵操作
-            undo(manualUndoConfig);
+        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(shiftConfig.getTenantId(), shiftConfig.getPatientCode());
+        String bindDeviceId = patientOperator.getBindDeviceId();
+        List<String> replicaDeviceIds = shiftConfig.getReplicaDeviceIds();
+        String masterDeviceId = shiftConfig.getMasterDeviceId();
+        if (masterDeviceId.equals(bindDeviceId)) {
+            //主泵未发生切换
+            return;
         }
-        operator.setBindDeviceId(shiftConfig.getMasterId());
-        operator.setAllDevice(Arrays.asList(DeviceTimeSmallInfo.of(shiftConfig.getMasterId(),shiftConfig.getStartTime())));
+        //切换副泵
+        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
+                .in(BusDeviceRunningEntity::getDeviceId,replicaDeviceIds).set(BusDeviceRunningEntity::getMaster,false));
+        //切换主泵
+        this.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
+                .eq(BusDeviceRunningEntity::getDeviceId,masterDeviceId).set(BusDeviceRunningEntity::getMaster,true));
+
+        DeviceOperator<DeviceCacheInfo> masterOperator = deviceRegistry.getOperator(masterDeviceId);
+        String currentInfusionId = masterOperator.getInfusionId();
+
+        //病患绑定主泵信息
+        patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
+                .eq(BusPatientEntity::getCode,shiftConfig.getPatientCode())
+                .eq(BusPatientEntity::getTenantId,shiftConfig.getTenantId())
+                .set(BusPatientEntity::getInfusionId,currentInfusionId));
+
+        //刷新缓存信息
+        replicaDeviceIds.stream().map(deviceRegistry::getOperator).forEach(deviceOperator->{
+            deviceOperator.setMaster(false);
+            //切换后也标注为暂时撤泵,即后续该泵发来的数据不再做主副泵切换的判断
+            deviceOperator.setUndo(true);
+        });
+
+        masterOperator.setMaster(true);
+        patientOperator.setBindDeviceId(shiftConfig.getMasterDeviceId());
     }
 }

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

@@ -18,18 +18,17 @@ import java.util.List;
 @Data
 @ApiModel("主副设备切换配置")
 public class DeviceShiftConfig {
-    @ApiModelProperty("副泵id集合")
-    private List<String> replicaIds;
+    @ApiModelProperty("副泵设备id集合")
+    private List<String> replicaDeviceIds;
 
-    @ApiModelProperty("主泵id")
+    @ApiModelProperty("主泵设备id")
     @NotNull(message = "请选择一个泵作为此临床信息的主泵进行监控")
-    private String masterId;
+    private String masterDeviceId;
 
     @ApiModelProperty("主泵的开始时间")
     @NotNull(message = "主泵的开始时间不能为空")
     private Date startTime;
 
-
     @ApiModelProperty("病号")
     @NotNull(message = "病号不能为空")
     private String patientCode;
@@ -37,10 +36,4 @@ public class DeviceShiftConfig {
     @ApiModelProperty("医院id")
     @NotNull(message = "医院id不能为空")
     private String tenantId;
-
-    @ApiModelProperty("撤泵配置")
-    @NotNull(message = "撤泵信息不能为空")
-    private UndoDeviceConfig undo;
-
-
 }

+ 7 - 1
coffee-system/src/main/java/com/coffee/bus/service/dto/ManualUndoConfig.java

@@ -20,7 +20,13 @@ import java.util.*;
 @AllArgsConstructor(staticName = "of")
 public class ManualUndoConfig {
     @ApiModelProperty("进行撤泵的所有运行数据id")
-    private List<String> ids;
+    private List<String> deviceIds;
+
+    @ApiModelProperty("撤泵病号")
+    private String patientCode;
+
+    @ApiModelProperty("医院id")
+    private String tenantId;
 
     @ApiModelProperty("是否为有泵监护,0、无泵 1、有泵")
     private Boolean monitorType;

+ 26 - 0
coffee-system/src/main/java/com/coffee/bus/service/dto/PatientMonitorResult.java

@@ -0,0 +1,26 @@
+package com.coffee.bus.service.dto;
+
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
+import com.coffee.bus.entity.BusPatientEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName PatientMonitorResult.java
+ * @Description TODO
+ * @createTime 2022年04月23日 11:39:00
+ */
+@ApiModel("病人监控信息返回结果")
+@Data
+public class PatientMonitorResult {
+    @ApiModelProperty("病人信息")
+    private BusPatientEntity patient;
+    @ApiModelProperty("最后输注信息")
+    private BusInfusionHistoryEntity infusion;
+    @ApiModelProperty("手术信息")
+    private BusClinicEntity clinic;
+}

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

@@ -8,7 +8,6 @@ import cn.hutool.crypto.SignUtil;
 import cn.hutool.crypto.asymmetric.Sign;
 import cn.hutool.crypto.asymmetric.SignAlgorithm;
 import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -173,10 +172,11 @@ public class DeviceInfoListener {
         device.setMonitorType(true);
         if(!classification.equals(originClassify)){
             newInfusion.set(true);
+            //启动新的输注,则撤泵标识取消
+            device.setIsUndo(false);
             //分包标识发生了改变,设备开机时间重新计算
             device.setStartTime(new Date());
         }else {
-
             PatientOperator<PatientCacheInfo> patient = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
             Boolean finished = patient.getFinished();
             if(Boolean.TRUE.equals(finished)){
@@ -342,12 +342,16 @@ public class DeviceInfoListener {
      */
     private void handleInfusionHistory(BusDeviceRunningEntity device, DeviceOperator<DeviceCacheInfo> deviceOperator, AtomicBoolean newInfusion, List<Supplier<?>> cacheOperation) {
         BusInfusionHistoryEntity infusionHistory = BusInfusionHistoryEntity.parseRunningInfo(device);
+        String originInfusionId = deviceOperator.getInfusionId();
         if (newInfusion.get()) {
             //检测数据库是否存在该输注信息
             infusionHistory.setId(String.valueOf(IdWorker.getId()));
+            infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
+                    .eq(BusInfusionHistoryEntity::getId,originInfusionId)
+                    .set(BusInfusionHistoryEntity::getFinished,true));
             infusionHistoryService.save(infusionHistory);
         }else {
-            infusionHistory.setId(deviceOperator.getInfusionId());
+            infusionHistory.setId(originInfusionId);
             infusionHistoryService.updateById(infusionHistory);
         }
         device.setInfusionId(infusionHistory.getId());
@@ -378,7 +382,7 @@ public class DeviceInfoListener {
         }
         String infusionParam = deviceOperator.getInfusionParam();
         if(StrUtil.isEmpty(infusionParam)||!infusionParam.equals(signHex)){
-            //输注参数发生变化
+            //输注参数发生变化, todo 则根据参数修改时间 进行主副泵的判别
             infusionModifyService.save(busInfusionModify);
             cacheOperation.add(()->{
                 deviceOperator.setInfusionParam(signHex);
@@ -393,12 +397,7 @@ public class DeviceInfoListener {
      * @param device 设备运行数据
      */
     private void handleHospitalConfig(BusDeviceRunningEntity device,List<Supplier<?>> cacheOperation) {
-        PatientOperator<PatientCacheInfo> patientOperator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
-        device.setPatientSex(patientOperator.getGender());
-        device.setClinicId(patientOperator.getClinicId());
-        device.setWard(patientOperator.getWard());
-        device.setBedNo(patientOperator.getBedNo());
-        device.setPatientName(patientOperator.getName());
+
     }
 
 

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

@@ -63,6 +63,7 @@ public class HisInfoListener {
     }
 
     @EventListener
+    @Transactional(rollbackFor = Exception.class)
     public void historyInfoListener(HisEvent infoEvent){
         List<BusClinicEntity> clinics = infoEvent.getClinics();
         if(CollectionUtil.isEmpty(clinics)){

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

@@ -231,7 +231,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             }
             this.update(Wrappers.lambdaUpdate(SysUser.class).eq(SysUser::getId, item).set(SysUser::getDelFlag, DelFlagEnum.YES.getCode()));
         });
-        // this.removeByIds(Arrays.asList(ids.split(",")));
+        // this.removeByIds(Arrays.asList(deviceIds.split(",")));
     }
 
     @Override

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

@@ -181,10 +181,8 @@ left join  (SELECT * FROM bus_clinic WHERE finished=0 ) AS c ON  c.`patient_code
                 </choose>
                 <if test="query.warnAnalgesicPoor != false">or warn_analgesic_poor=1 </if>
                 <if test="query.warnLowBattery != false"> or warn_low_battery=1 </if>
-
               )
             </if>
-
         </where>
         ) as i on p.infusion_id=i.id
         left join bus_clinic c on i.clinic_id=c.id