Explorar o código

update 换绑时取消限制
add 临床信息处理

A17404李放 %!s(int64=3) %!d(string=hai) anos
pai
achega
5d2fcb156c

+ 7 - 8
coffee-system/src/main/java/com/coffee/bus/controller/BusDeviceController.java

@@ -31,10 +31,15 @@ import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.context.request.async.DeferredResult;
 
 import javax.validation.constraints.NotNull;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 /**
@@ -55,16 +60,11 @@ public class BusDeviceController extends BaseCrudController<BusDeviceEntity, Str
     private final LocalBusDeviceRunningService runningService;
     @PostMapping("/shift/bind")
     @ApiOperation(value = "设备换绑",notes = "权限【device:info:shift】")
-    public R shift(@RequestBody DeviceBindVo vo,@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
+    public R shift(@RequestBody DeviceBindVo vo){
         if(StrUtil.isEmpty(vo.getBindTenantId())|| CollectionUtil.isEmpty(vo.getDeviceIds())){
             throw new CustomException("选择的医院、设备不能为空");
         }
-         List<String> deviceIds = vo.getDeviceIds();
-        List<BusDeviceRunningEntity> deviceList = runningService.listByIds(deviceIds);
-        if(deviceList.stream().anyMatch(device -> !device.getRunState().equals(DeviceStatusEnum.Shutdown))){
-            throw new CustomException("所选设备中有设备未处于关机状态,此次操作无法进行");
-        }
-        deviceService.shift(tenantId,vo.getDeviceIds(),vo.getBindTenantId());
+        deviceService.shift(vo.getDeviceIds(),vo.getBindTenantId());
         return R.success(DeviceAlarmEnum.values());
     }
 
@@ -126,5 +126,4 @@ public class BusDeviceController extends BaseCrudController<BusDeviceEntity, Str
             return R.fail("同步失败");
         }
     }
-
 }

+ 1 - 5
coffee-system/src/main/java/com/coffee/bus/entity/BusDeviceRunningEntity.java

@@ -1,15 +1,11 @@
 package com.coffee.bus.entity;
 
 
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
+
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.coffee.aliyun.utils.*;
 import com.coffee.bus.entity.common.CommonDeviceParam;
-import com.coffee.bus.enums.DeviceAlarmEnum;
-import com.coffee.bus.enums.DeviceStatusEnum;
-import com.coffee.bus.enums.DeviceTypeEnum;
-import com.coffee.common.entity.TenantGenericEntity;
 import com.coffee.common.enums.SexEnum;
 import com.fasterxml.jackson.annotation.*;
 import io.swagger.annotations.ApiModel;

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

@@ -132,8 +132,8 @@ public class BusInfusionHistoryEntity extends CommonDeviceParam<String,String> {
         entity.setWarnWillFinished(running.getWarnAnalgesicPoor());
         entity.setAlarm(running.getAlarm());
 
-        //若当前临床信息不存在,则将时间戳置为 1971/01/01 01:01:01 todo
-        entity.setClinicStartTime(new Date(31510861L));
+        //若当前临床信息不存在,则将时间戳置为 3000/01/01 01:01:01
+        entity.setClinicStartTime(new Date(32503654861L));
         return entity;
     }
 

+ 1 - 1
coffee-system/src/main/java/com/coffee/bus/enums/DeviceTypeEnum.java

@@ -16,7 +16,7 @@ import lombok.Getter;
 @AllArgsConstructor
 @JsonFormat(shape = JsonFormat.Shape.OBJECT)
 public enum DeviceTypeEnum implements IEnum<Integer> {
-    no(0,"无泵"),
+    no(0,"未知"),
     continuous(1,"网络泵"),
     intelligent(2,"智能泵"),
     pulse(3,"脉冲泵"),

+ 115 - 2
coffee-system/src/main/java/com/coffee/bus/service/LocalBusClinicService.java

@@ -1,14 +1,20 @@
 package com.coffee.bus.service;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.coffee.bus.controller.vo.ClinicStatsVo;
 import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.entity.BusDeviceRunningEntity;
+import com.coffee.bus.entity.BusInfusionHistoryEntity;
 import com.coffee.bus.entity.BusPatientEntity;
 import com.coffee.bus.mapper.BusClinicMapper;
+import com.coffee.bus.registry.patient.PatientOperator;
 import com.coffee.bus.registry.patient.PatientRegistry;
+import com.coffee.bus.registry.patient.bean.PatientCacheInfo;
 import com.coffee.bus.service.dto.ClinicQuery;
 import com.coffee.bus.service.dto.ClinicResult;
 import com.coffee.bus.service.dto.ClinicStatsQueryResult;
@@ -20,7 +26,10 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
 import java.util.*;
+import java.util.function.Supplier;
 
 /**
  * @author lifang
@@ -34,10 +43,16 @@ import java.util.*;
 public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClinicEntity,String> {
     @Autowired
     @Lazy
-    private LocalBusPatientService patientService;
+    private PatientRegistry patientRegistry;
     @Autowired
     @Lazy
-    private PatientRegistry patientRegistry;
+    private LocalBusInfusionHistoryService infusionHistoryService;
+    @Autowired
+    @Lazy
+    private LocalBusDeviceRunningService deviceRunningService;
+    @Autowired
+    @Lazy
+    private LocalBusPatientService patientService;
     @Override
     public void validateBeforeSave(BusClinicEntity entity) {
 
@@ -94,6 +109,104 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
         return this.baseMapper.recentClinic(hospitalId,patientCode);
     }
 
+    /**
+     * 描述: 对两场手术进行比较,判断名称、时间是否发生了变化
+     * @author lifang
+     * @date 2022/5/12 9:10
+     * @param source his系统拉取的数据
+     * @param target 数据库存储的数据
+     * @return void
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void compareFromHis(BusClinicEntity source,BusClinicEntity target){
+        Assert.hasText(target.getId(),"LocalBusClinicService.compareFromHis方法调用时,target参数id不能为空");
+        Assert.hasText(source.getPatientCode(),"LocalBusClinicService.compareFromHis方法调用时,source参数patientCode不能为空");
+        Assert.notNull(source.getStartTime(),"LocalBusClinicService.compareFromHis方法调用时,source参数startTime不能为空");
+        Assert.hasText(source.getName(),"LocalBusClinicService.compareFromHis方法调用时,source参数name不能为空");
+        source.setId(target.getId());
+        this.updateById(source);
+        //手术开始时间发生变化,重新计算输注数据
+        if(source.getStartTime()!=null&&source.getStartTime()!=target.getStartTime()){
+            infusionHistoryService.adjustInfusionByClinic(source.getId(),source.getPatientCode(),source.getTenantId(),source.getStartTime());
+        }
+    }
+
+
+
+    /**
+     * 描述: his拉取的新的手术信息,执行插入操作
+     * @author lifang
+     * @date 2022/5/12 10:27
+     * @param source
+     * @return void
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void insertFromHis(BusClinicEntity source){
+        Assert.hasText(source.getTenantId(),"LocalBusClinicService.insertFromHis方法调用时,source参数tenantId不能为空");
+        Assert.hasText(source.getPatientCode(),"LocalBusClinicService.insertFromHis方法调用时,source参数patientCode不能为空");
+        Assert.hasText(source.getName(),"LocalBusClinicService.insertFromHis方法调用时,source参数name不能为空");
+        this.save(source);
+        infusionHistoryService.adjustInfusionByClinic(source.getId(),source.getPatientCode(),source.getTenantId(),source.getStartTime());
+    }
+
+
+    /**
+     * 描述: 从his拉去的数据设置为当前临床信息
+     * @author lifang
+     * @date 2022/5/12 10:31
+     * @param source
+     * @return void
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void setCurrentClinicByHis(BusClinicEntity source){
+        Assert.hasText(source.getId(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数id不能为空");
+        Assert.hasText(source.getPatientCode(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数patientCode不能为空");
+        Assert.hasText(source.getTenantId(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数tenantId不能为空");
+        Assert.notNull(source.getStartTime(),"LocalBusClinicService.setCurrentClinic方法调用时,source参数startTime不能为空");
+        //处理当前运行的信息
+        deviceRunningService.update(new UpdateWrapper<BusDeviceRunningEntity>().lambda()
+                .eq(BusDeviceRunningEntity::getPatientCode,source.getPatientCode())
+                .eq(BusDeviceRunningEntity::getTenantId,source.getTenantId())
+                .set(BusDeviceRunningEntity::getClinicId,source.getId()));
+
+        //处理当前的输注信息
+        infusionHistoryService.update(new UpdateWrapper<BusInfusionHistoryEntity>().lambda()
+                .eq(BusInfusionHistoryEntity::getPatientCode,source.getPatientCode())
+                .eq(BusInfusionHistoryEntity::getTenantId,source.getTenantId())
+                .eq(BusInfusionHistoryEntity::getFinished,false)
+                .set(BusInfusionHistoryEntity::getClinicId,source.getId()));
+
+        //更新病人信息
+        patientService.update(new UpdateWrapper<BusPatientEntity>().lambda()
+                .eq(BusPatientEntity::getCode,source.getPatientCode())
+                .eq(BusPatientEntity::getTenantId,source.getTenantId())
+                .set(BusPatientEntity::getClinicId,source.getId()));
+        //处理
+        List<BusClinicEntity> clinics = this.list(new QueryWrapper<BusClinicEntity>().lambda()
+                .eq(BusClinicEntity::getPatientCode, source.getPatientCode())
+                .eq(BusClinicEntity::getTenantId, source.getTenantId())
+                .eq(BusClinicEntity::getFinished, false)
+                .ne(BusClinicEntity::getId, source.getId()));
+        //将下一场手术的开始时间作为该场手术监控的结束时间
+        clinics.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        for (int i = 0; i < clinics.size(); i++) {
+            BusClinicEntity clinic = clinics.get(i);
+            clinic.setFinished(true);
+            if(i==clinics.size()-1){
+                if(clinic.getEndTime()==null){
+                    clinic.setEndTime(source.getEndTime());
+                }
+                continue;
+            }
+            if(clinic.getEndTime()==null){
+                clinic.setEndTime(clinics.get(i+1).getStartTime());
+            }
+        }
+        this.updateBatchById(clinics);
+
+        PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(source.getTenantId(), source.getPatientCode());
+        operator.setClinicId(source.getId());
+    }
     /**
      * 从his同步病人数据-异步
      * @param hospitalId

+ 5 - 16
coffee-system/src/main/java/com/coffee/bus/service/LocalBusDeviceService.java

@@ -47,13 +47,12 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
     @Autowired
     private AliyunIotSdk aliyunIotSdk;
 
-    @Autowired
-    @Lazy
-    private LocalBusHospitalService hospitalService;
 
     @Override
     public void validateBeforeSave(BusDeviceEntity entity) {
-
+       if(entity.getTenantId()==null){
+           entity.setTenantId("1");
+       }
     }
 
     @Override
@@ -68,8 +67,7 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
 
     @Override
     public void postSave(BusDeviceEntity entity) {
-        //设备新增成功后,更新医院设备数量信息
-        hospitalService.update(new UpdateWrapper<BusHospitalEntity>().lambda().eq(BusHospitalEntity::getId,entity.getTenantId()).setSql("device_count=device_count+1"));
+
     }
 
     @Override
@@ -198,21 +196,12 @@ public class LocalBusDeviceService extends BaseService<BusDeviceMapper, BusDevic
      * 描述: 设备医院换绑操作
      * @author lifang
      * @date 2022/5/8 21:34
-     * @param beforeTenantId  换绑之前的医院id
      * @param deviceIds 换绑的设备id
      * @param afterTenantId 换绑之后的医院id
      * @return void
      */
     @Transactional(rollbackFor = Exception.class)
-    public void shift(String beforeTenantId,List<String> deviceIds, String afterTenantId) {
-        if(!beforeTenantId.equals(afterTenantId)){
-            BusHospitalEntity originHospital = hospitalService.getById(beforeTenantId);
-            int remain = originHospital.getDeviceCount() - deviceIds.size();
-            hospitalService.update(new UpdateWrapper<BusHospitalEntity>().lambda().eq(BusHospitalEntity::getId,beforeTenantId).set(BusHospitalEntity::getDeviceCount,remain>0?remain:0));
-
-            hospitalService.update(new UpdateWrapper<BusHospitalEntity>().lambda().eq(BusHospitalEntity::getId,afterTenantId).setSql("device_count=device_count+"+deviceIds.size()));
-        }
-
+    public void shift(List<String> deviceIds, String afterTenantId) {
         this.update(new UpdateWrapper<BusDeviceEntity>().lambda()
                 .in(BusDeviceEntity::getDeviceId,deviceIds)
                 .set(BusDeviceEntity::getTenantId,afterTenantId));

+ 24 - 0
coffee-system/src/main/java/com/coffee/bus/service/LocalBusInfusionHistoryService.java

@@ -2,6 +2,7 @@ package com.coffee.bus.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.coffee.aliyun.utils.Constants;
 import com.coffee.aliyun.utils.Items;
 import com.coffee.aliyun.utils.PumpParams;
@@ -15,7 +16,9 @@ import com.coffee.common.crud.BaseService;
 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.Date;
 import java.util.Objects;
 
 /**
@@ -125,4 +128,25 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
                 .lambda()
                 .eq(BusInfusionHistoryEntity::getTenantId,hospitalId).eq(BusInfusionHistoryEntity::getPatientCode,patientCode).last("limit 1"));
     }
+
+    /**
+     * 描述: 通过临床手术的开始时间调整输注信息所绑定的手术信息
+     * @author lifang
+     * @date 2022/5/12 9:28
+     * @param clinicId 手术id
+     * @param patientCode 病号
+     * @param tenantId 医院id
+     * @param startTime 开始时间
+     * @return void
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adjustInfusionByClinic(String clinicId, String patientCode, String tenantId, Date startTime){
+        this.update(new UpdateWrapper<BusInfusionHistoryEntity>()
+                .lambda()
+                .set(BusInfusionHistoryEntity::getClinicId,clinicId)
+                .eq(BusInfusionHistoryEntity::getTenantId,tenantId)
+                .eq(BusInfusionHistoryEntity::getPatientCode,patientCode)
+                .lt(BusInfusionHistoryEntity::getStartTime,startTime)
+                .gt(BusInfusionHistoryEntity::getClinicStartTime,startTime));
+    }
 }

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

@@ -32,6 +32,9 @@ public class DeviceQuery implements Serializable {
     @ApiModelProperty("设备报警状态集合")
     private List<Integer> alarms;
 
+    @ApiModelProperty("设备类型集合")
+    private List<Integer> deviceTypes;
+
     @ApiModelProperty("分页查询")
     @NotNull(message = "分页查询参数不可为空")
     private Page<DeviceResult> page;

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

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

+ 49 - 0
coffee-system/src/main/java/com/coffee/bus/service/strategy/HisStrategy.java

@@ -0,0 +1,49 @@
+package com.coffee.bus.service.strategy;
+
+import com.coffee.bus.entity.BusClinicEntity;
+import java.util.*;
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName HisHandlerStrategy.java
+ * @Description his系统数据的处理策略
+ * @createTime 2022年05月12日 09:33:00
+ */
+public interface HisStrategy {
+    /**
+     * 描述: 处理策略id,保证id的唯一性
+     * @author lifang
+     * @date 2022/5/12 9:35
+     * @param
+     * @return String
+     */
+    String getId();
+
+    /**
+     * 描述: 处理策略描述
+     * @author lifang
+     * @date 2022/5/12 9:35
+     * @param
+     * @return String
+     */
+    String getDescription();
+    /**
+     * 描述: 策略处理实现逻辑
+     * @author lifang
+     * @date 2022/5/12 9:38
+     * @param source his数据来源
+     * @param target 本地数据来源
+     * @return void
+     */
+    void handle(List<BusClinicEntity> source,List<BusClinicEntity> target);
+
+    /**
+     * 描述: 判断该his数据是否适用该策略
+     * @author lifang
+     * @date 2022/5/12 9:39
+     * @param source his数据来源
+     * @param target 数据库存储数据
+     * @return boolean
+     */
+    boolean apply(List<BusClinicEntity> source,List<BusClinicEntity> target);
+}

+ 70 - 0
coffee-system/src/main/java/com/coffee/bus/service/strategy/MoreToLessHisStrategy.java

@@ -0,0 +1,70 @@
+package com.coffee.bus.service.strategy;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import com.coffee.bus.entity.BusClinicEntity;
+import com.coffee.bus.service.LocalBusClinicService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName MoreToLessHisStrategy.java
+ * @Description 从his拉取的数据多于当前数据库存储的数据
+ * his          手术场次: 一  、 二 、 三
+ * 数据库存储    手术场次: 一 、 二
+ * 按照场次对场次相同的手术进行对比,对新增手术进行新增操作
+ * @createTime 2022年05月12日 09:45:00
+ */
+@Component
+@Slf4j
+@AllArgsConstructor
+public class MoreToLessHisStrategy implements HisStrategy {
+    private final LocalBusClinicService clinicService;
+    @Override
+    public String getId() {
+        return "more-to-less";
+    }
+
+    @Override
+    public String getDescription() {
+        return "his拉取数据多于数据库数据";
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handle(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        //所有按照从小到大排序
+        source.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+        List<BusClinicEntity> insert=new LinkedList<>();
+        if (CollectionUtil.isEmpty(target)) {
+            //所有的source都为新增
+            insert.addAll(source);
+        }else {
+            target.sort(Comparator.comparing(BusClinicEntity::getStartTime));
+            //对比修改临床信息
+            int start=0;
+            for (; start < target.size(); start++) {
+                clinicService.compareFromHis(source.get(start),target.get(start));
+            }
+            insert.addAll(source.subList(start,source.size()));
+        }
+        //按照开始时间从大到小排序
+        CollectionUtil.reverse(insert);
+        //新增临床信息
+        insert.forEach(clinicService::insertFromHis);
+        clinicService.setCurrentClinicByHis(insert.get(0));
+    }
+
+    @Override
+    public boolean apply(List<BusClinicEntity> source, List<BusClinicEntity> target) {
+        return CollectionUtil.isNotEmpty(source)&&(CollectionUtil.isEmpty(target)||source.size()>target.size());
+    }
+
+
+}

+ 2 - 0
coffee-system/src/main/java/com/coffee/bus/websocket/listener/DeviceInfoListener.java

@@ -71,6 +71,7 @@ public class DeviceInfoListener {
 
     private final WsPublishUtils wsPublishUtils;
 
+    private final LocalBusDeviceService deviceService;
     /**
      * 监听上传的数据信息,
      * 若设备详情发生变化,则及时通知相应的ws通道
@@ -119,6 +120,7 @@ public class DeviceInfoListener {
             handleAlarm(history,deviceOperator,cacheOperation);
             //todo 流速图处理
             if(first){
+                deviceService.update(new UpdateWrapper<BusDeviceEntity>().lambda().eq(BusDeviceEntity::getDeviceId,deviceId).set(BusDeviceEntity::getType,device.getType()));
                 PatientOperator<PatientCacheInfo> operator = patientRegistry.getOperator(device.getTenantId(), device.getPatientCode());
                 //首次插入则设置设备别名
                 device.setAlias(deviceOperator.getAlias());

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

@@ -52,6 +52,12 @@
             <if test="query.deviceId!=null">
                 and device_id like concat('%',#{query.deviceId},'%')
             </if>
+            <if test="query.deviceTypes != null and query.deviceTypes.size > 0">
+                and type in
+                <foreach item="type" index="index" collection="query.deviceTypes" open="(" separator="," close=")">
+                    #{type, jdbcType=VARCHAR}
+                </foreach>
+            </if>
             <if test="query.alias!=null">
                 and alias like concat('%',#{query.alias},'%')
             </if>

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

@@ -13,8 +13,8 @@
         <result column="device_running_id" property="deviceRunningId"/>
         <result column="device_id" property="deviceId"/>
         <result column="device_alias" property="deviceAlias"/>
-        <result column="device_run_state" property="deviceRunState" typeHandler="com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler"/>
-        <result column="device_alarm" property="deviceAlarm" typeHandler="com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler"/>
+        <result column="device_run_state" property="deviceRunState"/>
+        <result column="device_alarm" property="deviceAlarm" />
         <result column="infusion_start_time" property="infusionStartTime"/>
         <result column="master" property="master"/>
     </resultMap>
@@ -237,19 +237,26 @@
                     </if>
                 </otherwise>
             </choose>
-            <if test="query.warnWillFinished != false or query.warnAnalgesicPoor != false or  query.warnLowBattery != false">
-                and (
-                <choose>
-                    <when test="query.warnWillFinished != false">warn_will_finished=1</when>
-                    <otherwise>warn_will_finished!=1</otherwise>
-                </choose>
-                <if test="query.warnAnalgesicPoor != false">or warn_analgesic_poor=1 </if>
-                <if test="query.warnLowBattery != false"> or warn_low_battery=1 </if>
-                )
-            </if>
-            <if test="query.warnFlow !=null">
-                and warn_flow= #{query.warnFlow}
-            </if>
+            <choose>
+                <when test="query.warnWillFinished != false or query.warnAnalgesicPoor != false or  query.warnLowBattery != false">
+                    and (
+                    <choose>
+                        <when test="query.warnWillFinished != false">warn_will_finished=1</when>
+                        <otherwise>warn_will_finished!=1</otherwise>
+                    </choose>
+                    <if test="query.warnAnalgesicPoor != false">or warn_analgesic_poor=1 </if>
+                    <if test="query.warnLowBattery != false"> or warn_low_battery=1 </if>
+                    <if test="query.warnFlow !=null">
+                        or warn_flow= #{query.warnFlow}
+                    </if>
+                    )
+                </when>
+                <otherwise>
+                    <if test="query.warnFlow !=null">
+                        and warn_flow= #{query.warnFlow}
+                    </if>
+                </otherwise>
+            </choose>
         </where>
         ) as i on p.infusion_id=i.id
         join (select device_id,alias from bus_device_running) as r on r.device_id=i.device_id