Переглянути джерело

add
废液管理
修改异常标识

lifang 3 місяців тому
батько
коміт
35eadb6266
15 змінених файлів з 926 додано та 9 видалено
  1. 18 0
      nb-service-api/web-service-api/src/main/java/com/nb/web/api/bean/FormulaDrugDetailDomain.java
  2. 21 0
      nb-service-api/web-service-api/src/main/java/com/nb/web/api/entity/BusClinicEntity.java
  3. 139 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusLiquidController.java
  4. 84 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/vo/BusLiquidListVO.java
  5. 36 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/ExportResult.java
  6. 20 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/ExportType.java
  7. 158 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/LiquidExcelMergeWriteHandler.java
  8. 8 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/mapper/BusClinicMapper.java
  9. 81 3
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusClinicService.java
  10. 120 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/BusLiquidExcelVO.java
  11. 47 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/BusLiquidQuery.java
  12. 6 1
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/ClinicQuery.java
  13. 16 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/ClinicResult.java
  14. 34 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/LiquidBatchHandleDTO.java
  15. 138 5
      nb-service/web-service/src/main/resources/mapper/bus/BusClinicMapper.xml

+ 18 - 0
nb-service-api/web-service-api/src/main/java/com/nb/web/api/bean/FormulaDrugDetailDomain.java

@@ -1,5 +1,6 @@
 package com.nb.web.api.bean;
 package com.nb.web.api.bean;
 
 
+import cn.hutool.core.util.StrUtil;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
@@ -22,4 +23,21 @@ public class FormulaDrugDetailDomain {
 
 
     @ApiModelProperty(value = "药品单位")
     @ApiModelProperty(value = "药品单位")
     private String unit;
     private String unit;
+
+    @ApiModelProperty("批号")
+    private String batchCode;
+
+    @ApiModelProperty("用法")
+    private String use;
+
+    @ApiModelProperty("药品残余量")
+    private String remainDose;
+
+    public String getName() {
+        return StrUtil.isEmpty(name)? "" : name;
+    }
+
+    public String getUnit() {
+        return StrUtil.isEmpty(unit)? "" : unit;
+    }
 }
 }

+ 21 - 0
nb-service-api/web-service-api/src/main/java/com/nb/web/api/entity/BusClinicEntity.java

@@ -3,6 +3,7 @@ package com.nb.web.api.entity;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.nb.web.api.bean.FormulaDrugDomain;
 import com.nb.web.api.bean.FormulaDrugDomain;
 import com.nb.web.api.bean.UndoDeviceConfig;
 import com.nb.web.api.bean.UndoDeviceConfig;
 import com.nb.core.entity.TenantGenericEntity;
 import com.nb.core.entity.TenantGenericEntity;
@@ -161,6 +162,26 @@ public class BusClinicEntity extends TenantGenericEntity<String,String> {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String abnormalReason;
     private String abnormalReason;
 
 
+    @ApiModelProperty(value = "手动输入的床号信息",hidden = true)
+    @JsonIgnore
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String manualBedno;
+
+    @ApiModelProperty(value = "废液执行人")
+    private String liquidExecutor;
+
+    @ApiModelProperty(value = "废液检查人")
+    private String liquidChecker;
+
+    @ApiModelProperty(value = "废液核对备注")
+    private String liquidRemark;
+
+    @ApiModelProperty(value = "废液核对时间")
+    private Date liquidTime;
+
+    @ApiModelProperty(value = "废液处理方式")
+    private String liquidMethod;
+
     public String getWeight() {
     public String getWeight() {
         return StrUtil.isBlank(weight)?null:weight;
         return StrUtil.isBlank(weight)?null:weight;
     }
     }

+ 139 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusLiquidController.java

@@ -0,0 +1,139 @@
+package com.nb.web.service.bus.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.nb.core.exception.CustomException;
+import com.nb.core.result.R;
+import com.nb.web.api.bean.FormulaDrugDetailDomain;
+import com.nb.web.api.bean.FormulaDrugDomain;
+import com.nb.web.service.bus.controller.vo.*;
+import com.nb.web.service.bus.excel.ExportResult;
+import com.nb.web.service.bus.excel.ExportType;
+import com.nb.web.service.bus.excel.LiquidExcelMergeWriteHandler;
+import com.nb.web.service.bus.service.*;
+import com.nb.web.service.bus.service.dto.*;
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName BusHospitalController.java
+ * @Description
+ * @createTime 2022年03月19日 09:28:00
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/bus/liquid")
+@Slf4j
+@Api(tags = "废液管理",description = "统一权限前缀(bus:liquid),例如新增bus:liquid:add")
+public class BusLiquidController {
+    private final LocalBusClinicService clinicService;
+
+    @PostMapping("/page")
+    @ApiOperation(value = "废液列表分页查询",notes = "权限  无")
+    public R<IPage<BusLiquidListVO>> page(@RequestBody@Validated BusLiquidQuery query) {
+        return R.success(clinicService.selectLiquidPage(query));
+    }
+
+    @PostMapping("/batchHandle")
+    @SaCheckPermission("bus:liquid:edit")
+    @ApiOperation(value = "批量处理废液",notes = "权限【bus:liquid:edit】")
+    public R<Boolean> batchHandle(@RequestBody@Validated LiquidBatchHandleDTO source) {
+        clinicService.batchHandleLiquid(source);
+        return R.success(Boolean.TRUE);
+    }
+
+    @ApiOperation("导出废液记录单")
+    @PostMapping("/export/record")
+    public R<ExportResult> exportRecord(@RequestBody Collection<String> ids) throws IOException {
+        if(CollectionUtil.isEmpty(ids)){
+            throw new CustomException("请选择要导出的废液记录");
+        }
+        List<BusLiquidListVO> records= clinicService.selectLiquidByIds(ids);
+        if(CollectionUtil.isEmpty(records)){
+            throw new CustomException("请选择要导出的废液记录");
+        }
+        List<BusLiquidExcelVO> excelList = new ArrayList<>();
+        // 将BusLiquidListVO转换为BusLiquidExcelVO
+        for (int i = 0; i < records.size(); i++) {
+            BusLiquidListVO record = records.get(i);
+            excelList.addAll(convertExcelVO(record,i+1));
+        }
+        String fileName = "废液记录单";
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        EasyExcel.write(outputStream, BusLiquidExcelVO.class)
+                .registerWriteHandler(new LiquidExcelMergeWriteHandler(excelList))
+                .sheet("废液记录单")
+                .doWrite(excelList);
+        String base64Str = "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"+java.util.Base64.getEncoder().encodeToString(outputStream.toByteArray());
+        return R.success(ExportResult.of(fileName, base64Str, ExportType.EXCEL));
+    }
+
+    private  List<BusLiquidExcelVO> convertExcelVO(BusLiquidListVO record,int index){
+        List<BusLiquidExcelVO> result=new ArrayList<>();
+        List<FormulaDrugDetailDomain> detail=new ArrayList<>();
+        FormulaDrugDomain formula = record.getFormula();
+        if(formula!=null&&CollectionUtil.isNotEmpty(formula.getDetail())){
+            detail=formula.getDetail();
+        }else {
+            detail.add(new FormulaDrugDetailDomain());
+        }
+        for (FormulaDrugDetailDomain formulaDrugDetailDomain : detail) {
+            BusLiquidExcelVO excelVO = new BusLiquidExcelVO();
+            excelVO.setNum(index);
+            // 这里需要根据实际字段进行映射
+            excelVO.setClinicId(record.getClinicId());
+            excelVO.setClinicName(record.getClinicName());
+            excelVO.setPatientCode(record.getPatientCode());
+            excelVO.setPatientId(record.getPatientId());
+            excelVO.setPatientName(record.getPatientName());
+            excelVO.setWard(record.getWard());
+            excelVO.setBedNo(record.getBedNo());
+            if(StrUtil.isNotEmpty(record.getDeviceAlias())){
+                excelVO.setDeviceAlias(record.getDeviceAlias());
+            }else {
+                excelVO.setDeviceAlias(record.getDeviceId());
+            }
+            excelVO.setClinicStartTime(DateUtil.format(record.getClinicStartTime(), "yyyy/MM/dd HH:mm"));
+            excelVO.setUndoTime(DateUtil.format(record.getUndoTime(),"yyyy/MM/dd HH:mm"));
+            excelVO.setName(formulaDrugDetailDomain.getName());
+            excelVO.setDose(formulaDrugDetailDomain.getDose()+formulaDrugDetailDomain.getUnit());
+            //根据药液剩余量计算药品残余量
+            if(StrUtil.isEmpty(formulaDrugDetailDomain.getDose())|| !NumberUtil.isNumber(formulaDrugDetailDomain.getDose()) ||ObjectUtil.equals(record.getRemainDose(), BigDecimal.ZERO)){
+                excelVO.setDrugRemainDose("0"+formulaDrugDetailDomain.getUnit());
+            }else {
+                BigDecimal divide = record.getRemainDose().divide(record.getTotalDose(), 2, RoundingMode.CEILING);
+                BigDecimal totalDose = BigDecimal.valueOf(Double.valueOf(formulaDrugDetailDomain.getDose()));
+                BigDecimal multiply = totalDose.multiply(divide);
+                excelVO.setDrugRemainDose(multiply+formulaDrugDetailDomain.getUnit());
+            }
+            excelVO.setBatchCode(formulaDrugDetailDomain.getBatchCode());
+            excelVO.setUse(formulaDrugDetailDomain.getUse());
+            excelVO.setTotalDose(record.getTotalDose()+"ml");
+            excelVO.setRemainDose(record.getRemainDose()+"ml");
+            excelVO.setLiquidExecutor(record.getLiquidExecutor());
+            excelVO.setLiquidChecker(record.getLiquidChecker());
+            excelVO.setLiquidRemark(record.getLiquidRemark());
+            excelVO.setLiquidTime(DateUtil.formatDateTime(record.getLiquidTime()));
+            result.add(excelVO);
+        }
+        return result;
+    }
+}

+ 84 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/vo/BusLiquidListVO.java

@@ -0,0 +1,84 @@
+package com.nb.web.service.bus.controller.vo;
+
+import cn.hutool.core.util.StrUtil;
+import com.nb.web.api.bean.FormulaDrugDomain;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName PatientMonitorResult.java
+ * @Description TODO
+ * @createTime 2022年04月21日 15:57:00
+ */
+@ApiModel("废液显示")
+@Data
+@ToString
+public class BusLiquidListVO implements Serializable {
+    @ApiModelProperty("手术id")
+    private String clinicId;
+
+    @ApiModelProperty("手术名称")
+    private String clinicName;
+    @ApiModelProperty(value = "住院号")
+    private String patientCode;
+
+    @ApiModelProperty(value = "病人id")
+    private String patientId;
+
+    @ApiModelProperty(value = "病人名称")
+    private String patientName;
+
+    @ApiModelProperty(value = "病区")
+    private String ward;
+
+    @ApiModelProperty(value = "床号")
+    private String bedNo;
+
+    @ApiModelProperty(value = "泵id")
+    private String deviceId;
+
+    @ApiModelProperty(value = "泵别名")
+    private String deviceAlias;
+
+    @ApiModelProperty("用泵时间")
+    private Date clinicStartTime;
+
+    @ApiModelProperty("撤泵时间")
+    private Date undoTime;
+
+    @ApiModelProperty("配方")
+    private FormulaDrugDomain formula;
+
+    @ApiModelProperty(value = "总量")
+    private BigDecimal totalDose;
+
+    @ApiModelProperty(value = "剩余量")
+    private BigDecimal remainDose;
+
+    @ApiModelProperty(value = "废液执行人")
+    private String liquidExecutor;
+
+    @ApiModelProperty(value = "废液检查人")
+    private String liquidChecker;
+
+    @ApiModelProperty(value = "废液核对备注")
+    private String liquidRemark;
+
+    @ApiModelProperty(value = "废液核对时间")
+    private Date liquidTime;
+
+    @ApiModelProperty("废液处置方式")
+    private String liquidMethod;
+    @ApiModelProperty("是否已核对")
+    public Boolean getLiquidType() {
+        return StrUtil.isNotEmpty(liquidChecker);
+    }
+}

+ 36 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/ExportResult.java

@@ -0,0 +1,36 @@
+package com.nb.web.service.bus.excel;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName : ExportResult
+ * @Description : 文件导出结果
+ * @Author : LF
+ * @Date: 2023年06月15日
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExportResult {
+    private String fileName;
+    private String base64;
+    private ExportType type;
+    public String getFileName() {
+        if(CollectionUtil.size(StrUtil.split(fileName,"."))>2){
+            return fileName;
+        }
+        return fileName+type.getSuffix();
+    }
+
+    public static ExportResult of(String fileName,String base64){
+        return new ExportResult(fileName,base64,ExportType.EXCEL);
+    }
+
+    public static ExportResult of(String fileName,String base64,ExportType type){
+        return new ExportResult(fileName,base64,type);
+    }
+}

+ 20 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/ExportType.java

@@ -0,0 +1,20 @@
+package com.nb.web.service.bus.excel;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Enum : ExportType
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年09月25日
+ */
+@AllArgsConstructor
+@Getter
+public enum ExportType {
+    DOCX(".docx"),
+    EXCEL(".xlsx"),
+    ZIP(".zip"),;
+    @Getter
+    private String suffix;
+}

+ 158 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/LiquidExcelMergeWriteHandler.java

@@ -0,0 +1,158 @@
+package com.nb.web.service.bus.excel;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.write.handler.RowWriteHandler;
+import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
+import com.nb.web.service.bus.service.dto.BusLiquidExcelVO;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @ClassName : LiquidExcelMergeWriteHandler
+ * @Description : 废液Excel导出合并单元格处理类
+ * @Author :
+ * @Date: 2025年09月11日
+ */
+
+public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
+    // 最小行索引
+    private int minRowIndex = 0;
+    // 需要合并的列索引(根据ExcelProperty的order值)
+    private Set<Integer> includeColumnIndexes = new HashSet<Integer>() {{
+        add(0);  // 序号 (num) - order = 1
+        add(1);  // 手术名称 (clinicName) - order = 1
+        add(2);  // 住院号 (patientCode) - order = 2
+        add(3);  // 病人名称 (patientName) - order = 3
+        add(4);  // 病区 (ward) - order = 4
+        add(5);  // 床号 (bedNo) - order = 5
+        add(6);  // 泵别名 (deviceAlias) - order = 6
+        add(7);  // 用泵时间 (clinicStartTime) - order = 7
+        add(8);  // 撤泵时间 (undoTime) - order = 8
+        add(14); // 总量 (totalDose) - order = 14
+        add(15); // 剩余量 (remainDose) - order = 15
+        add(16); // 废液执行人 (liquidExecutor) - order = 16
+        add(17); // 废液检查人 (liquidChecker) - order = 17
+        add(18); // 废液核对备注 (liquidRemark) - order = 18
+        add(19); // 废液核对时间 (liquidTime) - order = 19
+        add(20); // 废液核对时间 (liquidTime) - order = 19
+    }};
+
+    private List<BusLiquidExcelVO> source;
+
+    public LiquidExcelMergeWriteHandler(List<BusLiquidExcelVO> source) {
+        this.source = source;
+    }
+
+    @Override
+    public void afterRowDispose(RowWriteHandlerContext context) {
+        Integer rowIndex = context.getRowIndex();
+        // 只有在处理最后一行时才执行合并操作
+        if (rowIndex != CollectionUtil.size(source)) {
+            return;
+        }
+
+        // 设置表头字体和大小
+        setHeaderStyle(context.getWriteSheetHolder().getSheet());
+        // 设置所有单元格垂直居中
+        setVerticalAlignment(context.getWriteSheetHolder().getSheet());
+        // 自适应列宽
+        autoSizeColumns(context.getWriteSheetHolder().getSheet());
+
+        Integer lastRowIndex = rowIndex;
+        int lastMergeIndex = lastRowIndex;
+        int currentIndex = lastRowIndex;
+        while (currentIndex >= 1) {
+            BusLiquidExcelVO curSource = CollectionUtil.get(source, currentIndex -1 );
+            BusLiquidExcelVO preSource = CollectionUtil.get(source, currentIndex -2);
+            if (!StrUtil.equals(curSource.getClinicId(), preSource.getClinicId()) || currentIndex == 1) {
+                // 合并指定的列
+                for (Integer i : includeColumnIndexes) {
+                    mergeCell(context.getWriteSheetHolder().getSheet(), currentIndex, lastMergeIndex, i, i);
+                }
+                currentIndex--;
+                lastMergeIndex = currentIndex;
+            }else {
+                currentIndex--;
+            }
+        }
+    }
+
+    private void setVerticalAlignment(Sheet sheet) {
+        CellStyle style = sheet.getWorkbook().createCellStyle();
+        // 设置垂直居中
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 设置水平左对齐
+        style.setAlignment(HorizontalAlignment.LEFT);
+        // 设置边框
+        style.setBorderTop(BorderStyle.THIN);
+        style.setBorderBottom(BorderStyle.THIN);
+        style.setBorderLeft(BorderStyle.THIN);
+        style.setBorderRight(BorderStyle.THIN);
+        // 应用到所有单元格
+        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+            Row row = sheet.getRow(i);
+            if (row != null) {
+                for (int j = 0; j < row.getLastCellNum(); j++) {
+                    Cell cell = row.getCell(j);
+                    if (cell != null) {
+                        cell.setCellStyle(style);
+                    } else {
+                        cell = row.createCell(j);
+                        cell.setCellStyle(style);
+                    }
+                }
+            }
+        }
+    }
+
+
+    private void autoSizeColumns(Sheet sheet) {
+        // 自适应列宽
+        for (int i = 0; i < 20; i++) { // 20列
+//            sheet.autoSizeColumn(i);
+        }
+    }
+
+    private void setHeaderStyle(Sheet sheet) {
+        // 创建表头样式
+        CellStyle headerStyle = sheet.getWorkbook().createCellStyle();
+        Font headerFont = sheet.getWorkbook().createFont();
+        headerFont.setFontName("微软雅黑"); // 设置字体为微软雅黑
+        headerFont.setFontHeightInPoints((short) 10); // 设置字体大小为10号
+        headerFont.setBold(true); // 设置粗体
+        headerStyle.setFont(headerFont);
+        headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
+        headerStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
+        // 设置灰色背景
+        headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        // 设置边框
+        headerStyle.setBorderTop(BorderStyle.THIN);
+        headerStyle.setBorderBottom(BorderStyle.THIN);
+        headerStyle.setBorderLeft(BorderStyle.THIN);
+        headerStyle.setBorderRight(BorderStyle.THIN);
+        // 应用表头样式到第一行(表头行)
+        Row headerRow = sheet.getRow(0);
+        if (headerRow != null) {
+            for (int i = 0; i < headerRow.getLastCellNum(); i++) {
+                Cell cell = headerRow.getCell(i);
+                if (cell != null) {
+                    cell.setCellStyle(headerStyle);
+                }
+            }
+        }
+    }
+    private void mergeCell(Sheet sheet, int startRowIndex, int endRowIndex, int startColumnIndex, int endColumnIndex) {
+        // 开始和结束行数一样
+        if (startRowIndex == endRowIndex) {
+            return;
+        }
+        CellRangeAddress cellRangeAddress = new CellRangeAddress(startRowIndex, endRowIndex, startColumnIndex, endColumnIndex);
+        sheet.addMergedRegion(cellRangeAddress);
+    }
+}

+ 8 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/mapper/BusClinicMapper.java

@@ -3,16 +3,20 @@ package com.nb.web.service.bus.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nb.web.service.bus.controller.vo.BusLiquidListVO;
 import com.nb.web.service.bus.controller.vo.ClinicStatsVo;
 import com.nb.web.service.bus.controller.vo.ClinicStatsVo;
 import com.nb.web.api.entity.BusClinicEntity;
 import com.nb.web.api.entity.BusClinicEntity;
 import java.util.*;
 import java.util.*;
 
 
+import com.nb.web.service.bus.service.dto.BusLiquidQuery;
 import com.nb.web.service.bus.service.dto.ClinicQuery;
 import com.nb.web.service.bus.service.dto.ClinicQuery;
 import com.nb.web.service.bus.service.dto.ClinicResult;
 import com.nb.web.service.bus.service.dto.ClinicResult;
 import com.nb.web.service.bus.service.dto.ClinicStatsQueryResult;
 import com.nb.web.service.bus.service.dto.ClinicStatsQueryResult;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
 
 
+import javax.validation.constraints.NotNull;
+
 /**
 /**
  * @author lifang
  * @author lifang
  * @version 1.0.0
  * @version 1.0.0
@@ -44,4 +48,8 @@ public interface BusClinicMapper extends BaseMapper<BusClinicEntity> {
     IPage<ClinicResult> pageQuery(Page<ClinicResult> page,@Param("query") ClinicQuery query);
     IPage<ClinicResult> pageQuery(Page<ClinicResult> page,@Param("query") ClinicQuery query);
 
 
     IPage<ClinicResult> latestQueryPage(Page<ClinicResult> page, @Param("query") ClinicQuery query);
     IPage<ClinicResult> latestQueryPage(Page<ClinicResult> page, @Param("query") ClinicQuery query);
+
+    IPage<BusLiquidListVO> selectLiquidPage(Page<BusLiquidListVO> page, @Param("query")BusLiquidQuery query);
+
+    List<BusLiquidListVO> selectLiquidByIds(@Param("ids")Collection<String> ids);
 }
 }

+ 81 - 3
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusClinicService.java

@@ -2,19 +2,25 @@ package com.nb.web.service.bus.service;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.nb.web.api.bean.FormulaDrugDetailDomain;
+import com.nb.web.api.entity.BusDeviceEntity;
 import com.nb.web.api.entity.BusEvaluationEntity;
 import com.nb.web.api.entity.BusEvaluationEntity;
 import com.nb.web.api.enums.ClinicManageEnum;
 import com.nb.web.api.enums.ClinicManageEnum;
 import com.nb.web.api.event.ClinicFinishedEvent;
 import com.nb.web.api.event.ClinicFinishedEvent;
 import com.nb.web.api.event.ClinicRestartEvent;
 import com.nb.web.api.event.ClinicRestartEvent;
 import com.nb.web.api.event.PatientInfoEvent;
 import com.nb.web.api.event.PatientInfoEvent;
 import com.nb.web.service.bus.controller.vo.BusClinicExcelVO;
 import com.nb.web.service.bus.controller.vo.BusClinicExcelVO;
+import com.nb.web.service.bus.controller.vo.BusLiquidListVO;
 import com.nb.web.service.bus.controller.vo.ClinicStatsVo;
 import com.nb.web.service.bus.controller.vo.ClinicStatsVo;
 import com.nb.web.api.entity.BusClinicEntity;
 import com.nb.web.api.entity.BusClinicEntity;
 import com.nb.web.api.entity.BusInfusionHistoryEntity;
 import com.nb.web.api.entity.BusInfusionHistoryEntity;
@@ -24,20 +30,21 @@ import com.nb.web.service.bus.mapper.BusEvaluationMapper;
 import com.nb.web.service.bus.mapper.BusInfusionHistoryMapper;
 import com.nb.web.service.bus.mapper.BusInfusionHistoryMapper;
 import com.nb.web.service.bus.registry.patient.PatientOperator;
 import com.nb.web.service.bus.registry.patient.PatientOperator;
 import com.nb.web.service.bus.registry.patient.PatientRegistry;
 import com.nb.web.service.bus.registry.patient.PatientRegistry;
-import com.nb.web.service.bus.service.dto.ClinicQuery;
-import com.nb.web.service.bus.service.dto.ClinicResult;
-import com.nb.web.service.bus.service.dto.ClinicStatsReturnResult;
+import com.nb.web.service.bus.service.dto.*;
 import com.nb.web.service.bus.utils.ExportExcelUtils;
 import com.nb.web.service.bus.utils.ExportExcelUtils;
 import com.nb.web.service.bus.utils.WsPublishUtils;
 import com.nb.web.service.bus.utils.WsPublishUtils;
 import com.nb.common.crud.BaseService;
 import com.nb.common.crud.BaseService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.web.servlet.error.DefaultErrorViewResolver;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 import org.springframework.util.Assert;
 
 
 import java.io.IOException;
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -70,6 +77,11 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
     @Autowired
     @Autowired
     @Lazy
     @Lazy
     private WsPublishUtils wsPublishUtils;
     private WsPublishUtils wsPublishUtils;
+
+    @Autowired
+    @Lazy
+    private LocalBusDeviceService deviceService;
+
     @Override
     @Override
     public void validateBeforeSave(BusClinicEntity entity) {
     public void validateBeforeSave(BusClinicEntity entity) {
         if(entity.getMonitorStartTime()==null){
         if(entity.getMonitorStartTime()==null){
@@ -395,4 +407,70 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
         }
         }
         return ExportExcelUtils.exportClinicExcelBase64(result);
         return ExportExcelUtils.exportClinicExcelBase64(result);
     }
     }
+
+    public IPage<BusLiquidListVO> selectLiquidPage(BusLiquidQuery query) {
+        IPage<BusLiquidListVO> result = this.baseMapper.selectLiquidPage(query.getPage(), query);
+        if(CollectionUtil.isNotEmpty(result.getRecords())){
+            List<BusDeviceEntity> deviceList = deviceService.listByIds(result.getRecords().stream().map(BusLiquidListVO::getDeviceId).collect(Collectors.toList()));
+            Map<String, BusDeviceEntity> deviceMap = deviceList.stream().collect(Collectors.toMap(BusDeviceEntity::getId, item->item));
+            for (BusLiquidListVO record : result.getRecords()) {
+                BusDeviceEntity device = deviceMap.get(record.getDeviceId());
+                if(ObjectUtil.isNotNull(device)){
+                    record.setDeviceAlias(device.getAlias());
+                }
+                //格式化配方信息
+                if(ObjectUtil.isNotEmpty(record.getFormula())){
+                    List<FormulaDrugDetailDomain> detail = record.getFormula().getDetail();
+                    if(CollectionUtil.isNotEmpty(detail)){
+                        String content="";
+                        for (FormulaDrugDetailDomain drug : detail) {
+                            //根据药液剩余量计算药品残余量
+                            if(StrUtil.isEmpty(drug.getDose())|| !NumberUtil.isNumber(drug.getDose()) ||ObjectUtil.equals(record.getRemainDose(), BigDecimal.ZERO)){
+                                drug.setRemainDose("0"+drug.getUnit());
+                            }else {
+                                BigDecimal divide = record.getRemainDose().divide(record.getTotalDose(), 2, RoundingMode.CEILING);
+                                BigDecimal totalDose = BigDecimal.valueOf(Double.valueOf(drug.getDose()));
+                                BigDecimal multiply = totalDose.multiply(divide);
+                                drug.setRemainDose(multiply+drug.getUnit());
+                            }
+                            drug.setDose(drug.getDose()+drug.getUnit());
+                        }
+                        record.getFormula().setName( detail.stream()
+                                .map(d->d.getName()+d.getDose())
+                                .collect(Collectors.joining("+")));
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    public void batchHandleLiquid(LiquidBatchHandleDTO source) {
+        List<String> clinicIds = source.getClinicIds();
+        this.baseMapper.update(null,new LambdaUpdateWrapper<BusClinicEntity>()
+                .in(BusClinicEntity::getId,clinicIds)
+                .set(BusClinicEntity::getLiquidExecutor,source.getLiquidExecutor())
+                .set(BusClinicEntity::getLiquidChecker,source.getLiquidChecker())
+                .set(BusClinicEntity::getLiquidTime,source.getLiquidTime())
+                .set(BusClinicEntity::getLiquidChecker,source.getLiquidMethod())
+                .set(BusClinicEntity::getLiquidRemark,source.getLiquidRemark()));
+    }
+
+    public List<BusLiquidListVO> selectLiquidByIds(Collection<String> ids) {
+        if(CollectionUtil.isEmpty(ids)){
+            return Collections.emptyList();
+        }
+        List<BusLiquidListVO> result = this.baseMapper.selectLiquidByIds(ids);
+        if(CollectionUtil.isNotEmpty(result)){
+            List<BusDeviceEntity> deviceList = deviceService.listByIds(result.stream().map(BusLiquidListVO::getDeviceId).collect(Collectors.toList()));
+            Map<String, BusDeviceEntity> deviceMap = deviceList.stream().collect(Collectors.toMap(BusDeviceEntity::getId, item->item));
+            for (BusLiquidListVO record : result) {
+                BusDeviceEntity device = deviceMap.get(record.getDeviceId());
+                if(ObjectUtil.isNotNull(device)){
+                    record.setDeviceAlias(device.getAlias());
+                }
+            }
+        }
+        return result;
+    }
 }
 }

+ 120 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/BusLiquidExcelVO.java

@@ -0,0 +1,120 @@
+package com.nb.web.service.bus.service.dto;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName PatientMonitorResult.java
+ * @Description TODO
+ * @createTime 2022年04月21日 15:57:00
+ */
+@ApiModel("废液显示")
+@Data
+@ToString
+@ExcelIgnoreUnannotated
+public class BusLiquidExcelVO implements Serializable {
+    @ApiModelProperty("手术id")
+    @ExcelIgnore
+    private String clinicId;
+
+    @ApiModelProperty(value = "病人id")
+    @ExcelIgnore
+    private String patientId;
+
+    @ExcelProperty(value = "序号", order = 0)
+    private Integer num;
+
+    @ApiModelProperty("手术名称")
+    @ExcelProperty(value = "手术名称", order = 1)
+    private String clinicName;
+
+    @ApiModelProperty(value = "住院号")
+    @ExcelProperty(value = "住院号", order = 2)
+    private String patientCode;
+
+    @ApiModelProperty(value = "病人名称")
+    @ExcelProperty(value = "病人名称", order = 3)
+    private String patientName;
+
+    @ApiModelProperty(value = "病区")
+    @ExcelProperty(value = "病区", order = 4)
+    private String ward;
+
+    @ApiModelProperty(value = "床号")
+    @ExcelProperty(value = "床号", order = 5)
+    private String bedNo;
+
+    @ApiModelProperty(value = "泵别名")
+    @ExcelProperty(value = "泵别名", order = 6)
+    private String deviceAlias;
+
+    @ApiModelProperty("用泵时间")
+    @ExcelProperty(value = "用泵时间", order = 7)
+    private String clinicStartTime;
+
+    @ApiModelProperty("撤泵时间")
+    @ExcelProperty(value = "撤泵时间", order = 8)
+    private String undoTime;
+
+    @ApiModelProperty(value = "药品名称")
+    @ExcelProperty(value = "药品名称", order = 9)
+    private String name;
+
+    @ApiModelProperty(value = "药品用量")
+    @ExcelProperty(value = "药品用量", order = 10)
+    private String dose;
+
+    @ApiModelProperty(value = "药品残余量")
+    @ExcelProperty(value = "药品残余量", order = 11)
+    private String drugRemainDose;
+
+    @ApiModelProperty("批号")
+    @ExcelProperty(value = "批号", order = 12)
+    private String batchCode;
+
+    @ApiModelProperty("用法")
+    @ExcelProperty(value = "用法", order = 13)
+    private String use;
+
+    @ApiModelProperty(value = "总量")
+    @ExcelProperty(value = "总量", order = 14)
+    private String totalDose;
+
+    @ApiModelProperty(value = "剩余量")
+    @ExcelProperty(value = "剩余量", order = 15)
+    private String remainDose;
+
+    @ApiModelProperty(value = "废液执行人")
+    @ExcelProperty(value = "废液执行人", order = 16)
+    private String liquidExecutor;
+
+    @ApiModelProperty(value = "废液检查人")
+    @ExcelProperty(value = "废液检查人", order = 17)
+    private String liquidChecker;
+
+    @ApiModelProperty(value = "废液处理方式")
+    @ExcelProperty(value = "废液处理方式", order = 18)
+    private String liquidMethod;
+
+    @ApiModelProperty(value = "废液核对时间")
+    @ExcelProperty(value = "废液核对时间", order = 19)
+    private String liquidTime;
+
+    @ApiModelProperty(value = "废液核对备注")
+    @ExcelProperty(value = "废液核对备注", order = 20)
+    private String liquidRemark;
+}

+ 47 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/BusLiquidQuery.java

@@ -0,0 +1,47 @@
+package com.nb.web.service.bus.service.dto;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nb.web.service.bus.controller.vo.BusLiquidListVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName PatientMonitorQuery.java
+ * @Description TODO
+ * @createTime 2022年04月22日 08:50:00
+ */
+@Data
+@ApiModel("废液查询参数")
+public class BusLiquidQuery implements Serializable {
+    @ApiModelProperty(value = "查询时间区间")
+    private List<Date> undoTime;
+
+    @ApiModelProperty(value = "住院号")
+    private String patientCode;
+
+    @ApiModelProperty(value = "床号")
+    private String bedNo;
+
+    @ApiModelProperty("病区查询集合")
+    private List<String> wards;
+
+    @ApiModelProperty(value = "病人名称")
+    private String patientName;
+
+    @ApiModelProperty(value = "手术名称")
+    private String surgeryName;
+
+    @ApiModelProperty(value = "是否核对  0、未核对 1、已核对")
+    private Boolean liquidType;
+
+    @ApiModelProperty(value = "分页查询参数",required = true)
+    @NotNull(message = "分页查询参数不可为空")
+    private Page<BusLiquidListVO> page;
+}

+ 6 - 1
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/ClinicQuery.java

@@ -44,12 +44,15 @@ public class ClinicQuery implements Serializable {
     @ApiModelProperty("是否结束")
     @ApiModelProperty("是否结束")
     private Integer finished;
     private Integer finished;
 
 
+    @ApiModelProperty(value = "是否为废液查询",hidden = true)
+    @JsonIgnore
+    private Boolean liquid;
+
     @ApiModelProperty("分页查询参数")
     @ApiModelProperty("分页查询参数")
     @NotNull(message = "分页查询参数不可为空")
     @NotNull(message = "分页查询参数不可为空")
     private Page<ClinicResult> page;
     private Page<ClinicResult> page;
 
 
 
 
-
     @ApiModelProperty("按照临床开始时间排序")
     @ApiModelProperty("按照临床开始时间排序")
     private Boolean monitorStartTimeDesc;
     private Boolean monitorStartTimeDesc;
 
 
@@ -64,6 +67,8 @@ public class ClinicQuery implements Serializable {
     @JsonIgnore
     @JsonIgnore
     private List<String> orderByAsc=new ArrayList<>();
     private List<String> orderByAsc=new ArrayList<>();
 
 
+
+
     public void setMonitorStartTimeDesc(Boolean monitorStartTimeDesc) {
     public void setMonitorStartTimeDesc(Boolean monitorStartTimeDesc) {
         this.monitorStartTimeDesc = monitorStartTimeDesc;
         this.monitorStartTimeDesc = monitorStartTimeDesc;
         if (Boolean.TRUE.equals(monitorStartTimeDesc)) {
         if (Boolean.TRUE.equals(monitorStartTimeDesc)) {

+ 16 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/ClinicResult.java

@@ -1,5 +1,7 @@
 package com.nb.web.service.bus.service.dto;
 package com.nb.web.service.bus.service.dto;
 
 
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.nb.web.api.enums.PatientAlarmEnum;
 import com.nb.web.api.enums.PatientAlarmEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
@@ -69,6 +71,20 @@ public class ClinicResult  implements Serializable {
     @ApiModelProperty("评价信息")
     @ApiModelProperty("评价信息")
     private int evalCount;
     private int evalCount;
 
 
+    @ApiModelProperty(value = "废液执行人")
+    private String liquidExecutor;
+
+    @ApiModelProperty(value = "废液检查人")
+    private String liquidChecker;
+
+    @ApiModelProperty(value = "废液核对备注")
+    private String liquidRemark;
+
+    @ApiModelProperty(value = "废液核对时间")
+    private Date liquidTime;
+
+    @ApiModelProperty(value = "废液处理方式")
+    private String liquidType;
 
 
     public Integer getInfusionCount() {
     public Integer getInfusionCount() {
         if (Boolean.FALSE.equals(monitorType)) {
         if (Boolean.FALSE.equals(monitorType)) {

+ 34 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/LiquidBatchHandleDTO.java

@@ -0,0 +1,34 @@
+package com.nb.web.service.bus.service.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.*;
+@Data
+public class LiquidBatchHandleDTO {
+    @ApiModelProperty("临床id")
+    @NotNull(message = "临床id不能为空")
+    private List<String> clinicIds;
+
+    @ApiModelProperty("废液处理执行人")
+    @NotBlank(message = "废液处理执行人不能为空")
+    private String liquidExecutor;
+
+    @ApiModelProperty("废液处理核对人")
+    @NotBlank(message = "废液处理核对人不能为空")
+    private String liquidChecker;
+
+    @ApiModelProperty("废液处理时间")
+    @NotNull(message = "废液处理时间不能为空")
+    private Date liquidTime;
+
+    @ApiModelProperty("废液处理方式")
+    @NotNull(message = "废液处理方式不能为空")
+    private String liquidMethod;
+
+    @ApiModelProperty("废液处理备注")
+    private String liquidRemark;
+
+}

+ 138 - 5
nb-service/web-service/src/main/resources/mapper/bus/BusClinicMapper.xml

@@ -34,7 +34,11 @@
         <result column="monitor_alarm" property="monitorAlarm"/>
         <result column="monitor_alarm" property="monitorAlarm"/>
         <result column="infusion_count" property="infusionCount"/>
         <result column="infusion_count" property="infusionCount"/>
         <result column="eval_count" property="evalCount"/>
         <result column="eval_count" property="evalCount"/>
-
+        <result column="liquid_executor" property="liquidExecutor"/>
+        <result column="liquid_checker" property="liquidChecker"/>
+        <result column="liquid_remark" property="liquidRemark"/>
+        <result column="liquid_time" property="liquidTime"/>
+        <result column="liquid_type" property="liquidType"/>
     </resultMap>
     </resultMap>
     <select id="stats" resultMap="stats">
     <select id="stats" resultMap="stats">
         SELECT
         SELECT
@@ -106,12 +110,15 @@
     </select>
     </select>
 
 
     <select id="pageQuery" resultMap="queryResult" parameterType="com.nb.web.service.bus.service.dto.ClinicQuery">
     <select id="pageQuery" resultMap="queryResult" parameterType="com.nb.web.service.bus.service.dto.ClinicQuery">
-       select p.id as patient_id,
+        select p.id as patient_id,
         c.id as clinic_id,
         c.id as clinic_id,
         c.patient_code as patient_code,
         c.patient_code as patient_code,
         c.patient_name as patient_name,
         c.patient_name as patient_name,
         c.ward as ward,
         c.ward as ward,
-        c.bed_no as bed_no,
+        CASE
+        WHEN c.manual_bedno IS NOT NULL AND c.manual_bedno != '' THEN c.manual_bedno
+        ELSE c.bed_no
+        END as bed_no,
         c.`surgery_name` as surgery_name,
         c.`surgery_name` as surgery_name,
         c.surgery_doctor as surgery_doctor,
         c.surgery_doctor as surgery_doctor,
         c.ana_doctor as ana_doctor,
         c.ana_doctor as ana_doctor,
@@ -119,11 +126,20 @@
         c.finished as finished,
         c.finished as finished,
         c.start_time as clinic_start_time,
         c.start_time as clinic_start_time,
         c.monitor_start_time as monitor_start_time,
         c.monitor_start_time as monitor_start_time,
-        c.end_time as monitor_end_time
+        c.end_time as monitor_end_time,
+        c.liquid_type as liquid_type,
+        c.liquid_executor as liquid_executor,
+        c.liquid_checker as liquid_checker,
+        c.liquid_remark as liquid_remark,
+        c.liquid_time as liquid_time
         from bus_clinic as c
         from bus_clinic as c
         left join bus_patient
         left join bus_patient
         as p on c.patient_id = p.id
         as p on c.patient_id = p.id
         <where>
         <where>
+            <if test="query.liquid!=null and query.liquid == true">
+                and c.finished= 1
+            </if>
+
             <if test="query.monitorType!=null and query.monitorType!=''">
             <if test="query.monitorType!=null and query.monitorType!=''">
                 and c.monitor_type=#{query.monitorType}
                 and c.monitor_type=#{query.monitorType}
             </if>
             </if>
@@ -143,7 +159,7 @@
                 </foreach>
                 </foreach>
             </if>
             </if>
             <if test="query.bedNo!=null and query.bedNo!=''">
             <if test="query.bedNo!=null and query.bedNo!=''">
-                and c.bed_no like concat('%',#{query.bedNo},'%')
+                and bed_no like concat('%',#{query.bedNo},'%')
             </if>
             </if>
             <if test="query.timeRange != null and query.timeRange.size >0">
             <if test="query.timeRange != null and query.timeRange.size >0">
                 and c.monitor_start_time &gt; #{query.timeRange[0]} and  c.monitor_start_time &lt; #{query.timeRange[1]}
                 and c.monitor_start_time &gt; #{query.timeRange[0]} and  c.monitor_start_time &lt; #{query.timeRange[1]}
@@ -244,4 +260,121 @@
             </foreach>
             </foreach>
         </if>
         </if>
     </select>
     </select>
+
+    <resultMap id="stdLiquidResult" type="com.nb.web.service.bus.controller.vo.BusLiquidListVO">
+        <result property="clinicId" column="clinic_id"/>
+        <result property="clinicName" column="clinic_name"/>
+        <result property="patientId" column="patient_id"/>
+        <result property="patientCode" column="patient_code"/>
+        <result property="patientName" column="patient_name"/>
+        <result property="ward" column="ward"/>
+        <result property="bedNo" column="bed_no"/>
+        <result property="deviceId" column="device_id"/>
+        <result property="clinicStartTime" column="clinic_start_time"/>
+        <result property="undoTime" column="undo_time"/>
+        <result property="formula" column="formula" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
+        <result property="totalDose" column="total_dose"/>
+        <result property="remainDose" column="remain_dose"/>
+        <result property="liquidExecutor" column="liquid_executor"/>
+        <result property="liquidChecker" column="liquid_checker"/>
+        <result property="liquidRemark" column="liquid_remark"/>
+        <result property="liquidTime" column="liquid_time"/>
+        <result property="liquidMethod" column="liquid_method"/>
+    </resultMap>
+
+    <select id="selectLiquidPage" resultMap="stdLiquidResult">
+        select
+        c.id as clinic_id,
+        c.patient_id as patient_id,
+        c.patient_code as patient_code,
+        c.patient_name as patient_name,
+        c.ward as ward,
+        CASE
+        WHEN c.manual_bedno IS NOT NULL AND c.manual_bedno != '' THEN c.manual_bedno
+        ELSE c.bed_no
+        END as bed_no,
+        c.surgery_name  as clinic_name,
+        i.device_id as device_id,
+        c.monitor_start_time as clinic_start_time,
+        i.undo_time as undo_time,
+        c.formula as formula,
+        i.total_dose as total_dose,
+        i.remain_dose as remain_dose,
+        c.liquid_executor as liquid_executor,
+        c.liquid_checker as liquid_checker,
+        c.liquid_remark as liquid_remark,
+        c.liquid_time as liquid_time,
+        c.liquid_method as liquid_method
+        from bus_clinic as c
+        join bus_patient as p on c.patient_id = p.id
+        join bus_infusion_history as i on p.infusion_id = i.id
+        <where>
+            c.finished = 1
+            <if test="query.undoTime != null and query.undoTime.size ==1">
+                and undo_time &gt; #{query.undoTime[0]}
+            </if>
+            <if test="query.undoTime != null and query.undoTime.size > 1">
+                and undo_time &gt; #{query.undoTime[0]} and  c.undo_time &lt; #{query.undoTime[1]}
+            </if>
+            <if test="query.patientCode!=null and query.patientCode!=''">
+                and c.patient_code like concat('%',#{query.patientCode},'%')
+            </if>
+            <if test="query.bedNo!=null and query.bedNo!=''">
+                and bed_no like concat('%',#{query.bedNo},'%')
+            </if>
+            <if test="query.wards != null and query.wards.size > 0">
+                and c.ward in
+                <foreach item="w" index="index" collection="query.wards" open="(" separator="," close=")">
+                    #{w, jdbcType=VARCHAR}
+                </foreach>
+            </if>
+            <if test="query.patientName!=null and query.patientName!=''">
+                and patient_name like concat('%',#{query.patientName},'%')
+            </if>
+            <if test="query.surgeryName!=null and query.surgeryName!=''">
+                and c.surgery_name like concat('%',#{query.surgeryName},'%')
+            </if>
+            <if test="query.liquidType!=null and query.liquidType == false">
+                and liquid_checker is null
+            </if>
+            <if test="query.liquidType!=null and query.liquidType == true">
+                and liquid_checker is not null
+            </if>
+        </where>
+        order by undo_time desc
+    </select>
+
+
+    <select id="selectLiquidByIds" resultMap="stdLiquidResult">
+        select
+        c.id as clinic_id,
+        c.patient_id as patient_id,
+        c.patient_code as patient_code,
+        c.patient_name as patient_name,
+        c.ward as ward,
+        CASE
+        WHEN c.manual_bedno IS NOT NULL AND c.manual_bedno != '' THEN c.manual_bedno
+        ELSE c.bed_no
+        END as bed_no,
+        c.surgery_name  as clinic_name,
+        i.device_id as device_id,
+        c.monitor_start_time as clinic_start_time,
+        i.undo_time as undo_time,
+        c.formula as formula,
+        i.total_dose as total_dose,
+        i.remain_dose as remain_dose,
+        c.liquid_executor as liquid_executor,
+        c.liquid_checker as liquid_checker,
+        c.liquid_remark as liquid_remark,
+        c.liquid_time as liquid_time
+        from bus_clinic as c
+        left join bus_patient as p on c.patient_id = p.id
+        left join bus_infusion_history as i on p.infusion_id = i.id
+        <where>
+            and c.id in
+            <foreach item="w" index="index" collection="ids" open="(" separator="," close=")">
+                #{w, jdbcType=VARCHAR}
+            </foreach>
+        </where>
+    </select>
 </mapper>
 </mapper>