Przeglądaj źródła

1、fix 统计改为输注过程, 统计数据更加精确
2、add 输注监控增加搜索参数 设备号

A17404李放 3 lat temu
rodzic
commit
f9a350d3e7
27 zmienionych plików z 637 dodań i 282 usunięć
  1. 4 0
      nb-system/src/main/java/com/nb/bus/controller/BusInfusionHistoryController.java
  2. 23 14
      nb-system/src/main/java/com/nb/bus/controller/BusStatsAnalyseController.java
  3. 30 7
      nb-system/src/main/java/com/nb/bus/enums/StatsTimeUnit.java
  4. 13 6
      nb-system/src/main/java/com/nb/bus/mapper/BusInfusionHistoryMapper.java
  5. 6 3
      nb-system/src/main/java/com/nb/bus/service/LocalBusInfusionHistoryService.java
  6. 5 0
      nb-system/src/main/java/com/nb/bus/service/dto/CombineAlarmResult.java
  7. 50 0
      nb-system/src/main/java/com/nb/bus/service/dto/CombineHistoryResult.java
  8. 24 6
      nb-system/src/main/java/com/nb/bus/service/dto/CombineQuery.java
  9. 8 1
      nb-system/src/main/java/com/nb/bus/service/dto/CombineResult.java
  10. 4 0
      nb-system/src/main/java/com/nb/bus/service/dto/PatientMonitorQuery.java
  11. 38 0
      nb-system/src/main/java/com/nb/bus/stats/CommonClinicStats.java
  12. 47 0
      nb-system/src/main/java/com/nb/bus/stats/CommonHistoryStats.java
  13. 59 18
      nb-system/src/main/java/com/nb/bus/stats/CommonStats.java
  14. 16 13
      nb-system/src/main/java/com/nb/bus/stats/analyse/AlarmStatsAnalyse.java
  15. 35 60
      nb-system/src/main/java/com/nb/bus/stats/analyse/EvalStatsAnalyse.java
  16. 28 18
      nb-system/src/main/java/com/nb/bus/stats/analyse/InfusionDoseStatsAnalyse.java
  17. 44 15
      nb-system/src/main/java/com/nb/bus/stats/analyse/PcaStatsAnalyse.java
  18. 2 0
      nb-system/src/main/java/com/nb/bus/stats/entity/StatsAnalyseResult.java
  19. 8 13
      nb-system/src/main/java/com/nb/bus/stats/report/AgeAndGenderStatsReport.java
  20. 9 15
      nb-system/src/main/java/com/nb/bus/stats/report/AgeStatsReport.java
  21. 8 15
      nb-system/src/main/java/com/nb/bus/stats/report/AnalStatsAnalyse.java
  22. 7 14
      nb-system/src/main/java/com/nb/bus/stats/report/AsaStatsReport.java
  23. 10 15
      nb-system/src/main/java/com/nb/bus/stats/report/GenderStatsReport.java
  24. 18 16
      nb-system/src/main/java/com/nb/bus/stats/report/WeightStatsReport.java
  25. 14 2
      nb-system/src/main/java/com/nb/bus/utils/ThreadUtil.java
  26. 119 28
      nb-system/src/main/resources/mapper/bus/BusInfusionHistoryMapper.xml
  27. 8 3
      nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

+ 4 - 0
nb-system/src/main/java/com/nb/bus/controller/BusInfusionHistoryController.java

@@ -11,6 +11,7 @@ import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
 import com.nb.common.crud.BaseService;
 import com.nb.common.crud.controller.BaseQueryController;
+import com.nb.common.exception.CustomException;
 import com.nb.common.result.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -43,6 +44,9 @@ public class BusInfusionHistoryController implements BaseQueryController<BusInfu
     @SaCheckPermission("bus:infusion:query")
     @ApiOperation(value = "输注历史查询(此查询中包括了所属的临床信息)",notes = "权限【bus:infusion:query】")
     public R<IPage<CombineResult>> compQuery(@RequestBody CombineQuery query){
+        if(query.getPage()==null){
+            throw new CustomException("分页参数【page】不能为空");
+        }
         return R.success(infusionHistoryService.queryPage(query,query.getPage()));
     }
 

+ 23 - 14
nb-system/src/main/java/com/nb/bus/controller/BusStatsAnalyseController.java

@@ -3,9 +3,9 @@ package com.nb.bus.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.service.dto.CombineQuery;
-import com.nb.bus.service.dto.CombineResult;
 import com.nb.bus.stats.CommonStats;
 import com.nb.bus.stats.entity.StatsAnalyseResult;
 import com.nb.bus.utils.ThreadUtil;
@@ -15,9 +15,14 @@ import com.nb.common.result.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.*;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * @author lifang
@@ -28,6 +33,7 @@ import java.util.*;
  */
 @RestController
 @RequestMapping("/stats/analgesia")
+@Slf4j
 @Api(tags = "镇痛分析",description = "统一权限前缀(stats:analyse),例如新增stats:analyse:add")
 public class BusStatsAnalyseController {
     private final Map<StatsAnalyseEnum,CommonStats> statsMap=new EnumMap<>(StatsAnalyseEnum.class);
@@ -46,12 +52,15 @@ public class BusStatsAnalyseController {
     @PostMapping("/{type}")
     @SaCheckPermission("stats:analgesia:query")
     @ApiOperation("统计")
-    public R stats(@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId,@PathVariable("type")@ApiParam("统计类型 1、PCA镇痛分析 2、提示分析 3、评价分析 4、自控分析 5、输注量分析") Integer type, @RequestBody CombineQuery query){
+    public R stats(@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId,@PathVariable("type")@ApiParam("统计类型 1、PCA镇痛分析 2、提示分析 3、评价分析 4、自控分析 5、输注量分析") Integer type, @RequestBody @Validated CombineQuery query){
         if (StrUtil.isBlank(tenantId)) {
             throw new TenantException();
         }
-        if(query.getTimeUnit()==null){
-            throw new CustomException("时间单位不能为空");
+        if(CollectionUtil.isEmpty(query.getStartTimeRange())){
+            throw new CustomException("开始时间不能为空");
+        }
+        if(CollectionUtil.size(query.getStartTimeRange())!=2){
+            throw new CustomException("查询开始时间时,需设置【最小开始时间】-【最大开始时间的】时间范围");
         }
         StatsAnalyseEnum analyseEnum = StatsAnalyseEnum.of(type);
         if(analyseEnum==null){
@@ -59,17 +68,17 @@ public class BusStatsAnalyseController {
         }
         CommonStats commonStats=statsMap.get(analyseEnum);
 
-        List result = commonStats.queryResult(query);
+        List queryResult = commonStats.queryResult(query);
         //提示分析时,根据所选设备类型 进行分析判定
 
-        ThreadUtil.getSingleThreadLocal().set(query.getDeviceType());
-        if(CollectionUtil.isNotEmpty(result)){
-            result.sort(Comparator.comparing(CombineResult::getInfusionStartTime));
-            StatsAnalyseResult of = StatsAnalyseResult.of(commonStats.handlePie(result), commonStats.handleLine(result, query.getTimeUnit()), commonStats.handleTable(result,query.getTimeUnit()));
-            ThreadUtil.getSingleThreadLocal().remove();
-            return R.success(of);
-        }
-        return R.success(StatsAnalyseResult.empty());
+        StatsAnalyseResult result = new StatsAnalyseResult();
+        ThreadUtil.set(query.getDeviceType());
+
+        result.setPie(commonStats.handlePie(queryResult));
+        result.setLine(commonStats.handleLine(queryResult, query.getTimeUnit(),query.getStartTimeRange().get(0),query.getStartTimeRange().get(1)));
+        result.setPie( commonStats.handleTable(queryResult,query.getTimeUnit(),query.getStartTimeRange().get(0),query.getStartTimeRange().get(1)));
+        ThreadUtil.remove();
+        return R.success(result);
 
 
     }

+ 30 - 7
nb-system/src/main/java/com/nb/bus/enums/StatsTimeUnit.java

@@ -1,5 +1,6 @@
 package com.nb.bus.enums;
 
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import com.baomidou.mybatisplus.annotation.IEnum;
@@ -8,6 +9,7 @@ import lombok.Getter;
 
 import java.time.LocalDate;
 import java.util.Date;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author lifang
@@ -24,6 +26,15 @@ public enum  StatsTimeUnit implements IEnum<Integer> {
         public String parse(Date date) {
             return DateUtil.format(date,"yyyy年MM月dd日");
         }
+
+        @Override
+        public void validate(Date startTime, Date endTime) throws UnsupportedOperationException{
+            if (DateUtil.between(startTime,endTime, DateUnit.DAY)>90) {
+                throw new UnsupportedOperationException("查询单位为【日】时,查询范围不可超过90天");
+            }
+        }
+
+
     },
     WEEK(2){
         @Override
@@ -31,12 +42,30 @@ public enum  StatsTimeUnit implements IEnum<Integer> {
             String prefix= DateUtil.format(date, "yyyy年");
             return prefix+"第"+DateUtil.weekOfYear(date)+"周\n("+DateUtil.formatDate(DateUtil.beginOfWeek(date))+"-"+DateUtil.formatDate(DateUtil.endOfWeek(date))+")";
         }
+
+        @Override
+        public void validate(Date startTime, Date endTime) throws UnsupportedOperationException{
+            if (DateUtil.between(startTime,endTime, DateUnit.DAY)>366) {
+                throw new UnsupportedOperationException("查询单位为【周】时,查询范围不可超过366天");
+            }
+        }
+
+
     },
     MONTH(3){
         @Override
         public String parse(Date date) {
             return DateUtil.format(date, "yyyy年MM月");
         }
+
+        @Override
+        public void validate(Date startTime, Date endTime)throws UnsupportedOperationException {
+            if (DateUtil.between(startTime,endTime, DateUnit.DAY)>366) {
+                throw new UnsupportedOperationException("查询单位为【月】时,查询范围不可超过366天");
+            }
+        }
+
+
     };
     private Integer value;
 
@@ -50,11 +79,5 @@ public enum  StatsTimeUnit implements IEnum<Integer> {
      */
     public abstract String parse(Date date);
 
-
-    public static void main(String[] args) {
-        System.out.println(DateUtil.beginOfWeek(new Date()));
-        System.out.println(DateUtil.endOfWeek(new Date()));
-        System.out.println(DateUtil.beginOfWeek(DateUtil.yesterday()));
-        System.out.println(DateUtil.endOfWeek(DateUtil.yesterday()));
-    }
+   public abstract void validate(Date startTime,Date endTime) throws UnsupportedOperationException;
 }

+ 13 - 6
nb-system/src/main/java/com/nb/bus/mapper/BusInfusionHistoryMapper.java

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.nb.bus.entity.BusInfusionHistoryEntity;
-import com.nb.bus.service.dto.CombineAlarmResult;
-import com.nb.bus.service.dto.CombineEvalResult;
-import com.nb.bus.service.dto.CombineQuery;
-import com.nb.bus.service.dto.CombineResult;
+import com.nb.bus.service.dto.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import java.util.*;
@@ -52,13 +49,23 @@ public interface BusInfusionHistoryMapper extends BaseMapper<BusInfusionHistoryE
     List<CombineAlarmResult> queryStatsAlarm(@Param("query") CombineQuery query);
 
     /**
-     * 描述: 联合查询出输注报警信息-统计使用
+     * 描述: 联合查询出通用数据-统计使用
+     * @author lifang
+     * @date 2022/6/7 10:03
+     * @param query
+     * @return List<CombineAlarmResult>
+     */
+    List<CombineResult> queryStatsCommon(@Param("query") CombineQuery query);
+
+
+    /**
+     * 描述: 联合查询出输注运行数据-统计使用
      * @author lifang
      * @date 2022/6/7 10:03
      * @param query
      * @return List<CombineAlarmResult>
      */
-    List<CombineResult> queryStatsAnal(@Param("query") CombineQuery query);
+    List<CombineHistoryResult> queryStatsHistory(@Param("query") CombineQuery query);
 
     /**
      * 描述: 联合查询出输注评分信息-统计使用

+ 6 - 3
nb-system/src/main/java/com/nb/bus/service/LocalBusInfusionHistoryService.java

@@ -5,7 +5,6 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -329,14 +328,18 @@ public class LocalBusInfusionHistoryService extends BaseService<BusInfusionHisto
         return this.baseMapper.queryPage(query,page);
     }
 
-    public List<CombineResult> queryStatsAnal(CombineQuery query) {
-        return this.baseMapper.queryStatsAnal(query);
+    public List<CombineResult> queryStatsCommon(CombineQuery query) {
+        return this.baseMapper.queryStatsCommon(query);
     }
 
     public List<CombineAlarmResult> queryStatsAlarm(CombineQuery query) {
         return this.baseMapper.queryStatsAlarm(query);
     }
 
+    public List<CombineHistoryResult> queryStatsHistory(CombineQuery query) {
+        return this.baseMapper.queryStatsHistory(query);
+    }
+
     public List<CombineEvalResult> queryStatsEval(CombineQuery query) {
         return this.baseMapper.queryStatsEval(query);
     }

+ 5 - 0
nb-system/src/main/java/com/nb/bus/service/dto/CombineAlarmResult.java

@@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * @author lifang
  * @version 1.0.0
@@ -21,4 +23,7 @@ public class CombineAlarmResult extends CombineResult {
     @ApiModelProperty(value = "是否为报警信息",hidden = true)
     @JsonIgnoreProperties
     private Boolean isAlarm;
+
+    @ApiModelProperty(value = "报警时间")
+    private Date alarmTime;
 }

+ 50 - 0
nb-system/src/main/java/com/nb/bus/service/dto/CombineHistoryResult.java

@@ -0,0 +1,50 @@
+package com.nb.bus.service.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.DecimalMax;
+import javax.validation.constraints.DecimalMin;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CombineAlarmResult.java
+ * @Description
+ * @createTime 2022年06月07日 09:50:00
+ */
+@Data
+public class CombineHistoryResult extends CombineResult {
+
+    @ApiModelProperty("历史数据id")
+    private String historyId;
+
+    @ApiModelProperty("上传时间")
+    private Date uploadTime;
+    @ApiModelProperty(value = "公共参数-pca有效次数",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private Integer pcaValidCount;
+
+    @ApiModelProperty(value = "公共参数-pca无效次数",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private Integer pcaInvalidCount;
+
+    @ApiModelProperty(value = "公共参数-pca总按次数",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private Integer pcaTotalCount;
+
+    @ApiModelProperty(value = "公共参数-已输入量",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private BigDecimal inputDose;
+
+    @ApiModelProperty(value = "公共参数-追加量",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    @DecimalMax(value = "10",message = "PCA追加量最大值不得超过10")
+    @DecimalMin(value = "0",message ="PCA追加量最小值不得低于0" )
+    private BigDecimal appendDose;
+
+    @ApiModelProperty(value = "公共参数-自控锁时",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private Integer selfControlLockTime;
+
+    @ApiModelProperty(value = "公共-此次输注过程中到此为止的总追加量")
+    private BigDecimal totalAppendDose;
+
+}

+ 24 - 6
nb-system/src/main/java/com/nb/bus/service/dto/CombineQuery.java

@@ -2,6 +2,7 @@ package com.nb.bus.service.dto;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.enums.WarnEnum;
@@ -57,6 +58,12 @@ public class CombineQuery {
     @ApiModelProperty("输注开始时间区间")
     private List<Date> startTimeRange;
 
+    @ApiModelProperty("临床监控开始时间区间")
+    private List<Date> clinicStartTimeRange;
+
+    @ApiModelProperty("临床结束时间区间")
+    private List<Date> clinicEndTimeRange;
+
     @ApiModelProperty("输注撤泵时间区间")
     private List<Date>  undoTimeRange;
 
@@ -105,9 +112,12 @@ public class CombineQuery {
     @ApiModelProperty("自控类型 0、有效 1、无效 2、总数")
     private Integer pcaType;
 
-    @ApiModelProperty("是否已结束")
+    @ApiModelProperty("是否已结束 0、未结束 1、已结束 2、已撤泵")
     private Integer finished;
 
+    @ApiModelProperty("是否已撤泵")
+    @JsonIgnore
+    private Integer isUndo;
     /**
      * 根据此提醒进行解析
      * @see  com.nb.bus.enums.WarnEnum
@@ -132,12 +142,8 @@ public class CombineQuery {
     private List<Integer> warnFlow;
 
     @ApiModelProperty("分页查询")
-    @NotNull(message = "分页参数不可为空")
     private Page<CombineResult> page;
 
-    @ApiModelProperty(value = "设备运行状态")
-    private Integer deviceRunState;
-
     @ApiModelProperty(value = "设备报警状态")
     private Integer deviceAlarm;
 
@@ -145,6 +151,7 @@ public class CombineQuery {
     private Boolean infusionStartTimeDesc;
 
     @ApiModelProperty("按照输注是否结束排序")
+    @Deprecated
     private Boolean infusionFinishedDesc;
 
     @ApiModelProperty("按照输注最后上传时间排序")
@@ -159,8 +166,10 @@ public class CombineQuery {
     @JsonIgnore
     private List<String> orderByAsc=new ArrayList<>();
 
-    @ApiModelProperty("统计查询时的时间枚举条件, 1、天 2、周 3、月")
+    @ApiModelProperty("统计查询时的时间枚举条件, 1、天 不可超过90天 2、周 不可超过366天 3、月 不可超过366天")
+    @NotNull(message = "时间单位不能为空")
     private StatsTimeUnit timeUnit;
+
     public void setPcaCountRange(List<Integer> pcaCountRange) {
         this.pcaCountRange = pcaCountRange;
         parsePca();
@@ -259,4 +268,13 @@ public class CombineQuery {
             });
         }
     }
+
+    public void setFinished(Integer finished) {
+        if(ObjectUtil.equal(2,finished)){
+            isUndo=1;
+            finished=0;
+        }else {
+            this.finished=finished;
+        }
+    }
 }

+ 8 - 1
nb-system/src/main/java/com/nb/bus/service/dto/CombineResult.java

@@ -17,7 +17,7 @@ import java.util.Date;
  * @Description 综合
  * @createTime 2022年06月02日 13:41:00
  */
-@ApiModel("输注、临床综合结果")
+@ApiModel("输注、综合结果")
 @Data
 public class CombineResult extends CommonDeviceParam<String,String> {
 
@@ -27,6 +27,13 @@ public class CombineResult extends CommonDeviceParam<String,String> {
     @ApiModelProperty("临床id")
     private String clinicId;
 
+    @ApiModelProperty("临床开始时间,即监控开始时间")
+    private Date clinicStartTime;
+
+    @ApiModelProperty("临床结束时间,即结束管理时间")
+    private Date clinicEndTime;
+
+
     @ApiModelProperty(value = "是否已撤泵,0、未撤泵1、已撤泵")
     private Boolean isUndo;
 

+ 4 - 0
nb-system/src/main/java/com/nb/bus/service/dto/PatientMonitorQuery.java

@@ -38,6 +38,9 @@ public class PatientMonitorQuery  implements Serializable {
     @ApiModelProperty("WEB端请传输blurry-住院号")
     private String code;
 
+    @ApiModelProperty("WEB端请传输deviceId-设备号")
+    private String deviceId;
+
     @ApiModelProperty("安卓端使用-麻醉医生")
     private String anaDoctor;
 
@@ -130,5 +133,6 @@ public class PatientMonitorQuery  implements Serializable {
         this.setBedNo(blurry);
         this.setName(blurry);
         this.setCode(blurry);
+        this.setDeviceId(blurry);
     }
 }

+ 38 - 0
nb-system/src/main/java/com/nb/bus/stats/CommonClinicStats.java

@@ -0,0 +1,38 @@
+package com.nb.bus.stats;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.nb.bus.enums.StatsTimeUnit;
+import com.nb.bus.service.LocalBusInfusionHistoryService;
+import com.nb.bus.service.dto.CombineQuery;
+import com.nb.bus.service.dto.CombineResult;
+
+import java.util.*;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CommonClinicStats.java
+ * @Description TODO
+ * @createTime 2022年07月23日 10:17:00
+ */
+public interface CommonClinicStats extends CommonStats<CombineResult> {
+
+    LocalBusInfusionHistoryService getInfusionHistoryService();
+
+    @Override
+    default List<CombineResult> queryResult(CombineQuery query) {
+        List<CombineResult> combineResults = getInfusionHistoryService().queryStatsCommon(query);
+        //根据临床id进行去重操作
+        Map<String, CombineResult> clinicIdMap = new HashMap<>();
+        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
+        return new ArrayList<>(clinicIdMap.values());
+    }
+
+    default Map<String,List<CombineResult>> groupByClinicStartTime(List<CombineResult> sources, StatsTimeUnit unit, Date minTime, Date maxTime){
+        return  groupByTime(sources,unit,minTime,maxTime
+                ,t-> StrUtil.isNotEmpty(t.getClinicId())
+                ,CombineResult::getClinicStartTime,
+                t-> CollectionUtil.newHashSet(unit.parse(t.getClinicStartTime())));
+    };
+}

+ 47 - 0
nb-system/src/main/java/com/nb/bus/stats/CommonHistoryStats.java

@@ -0,0 +1,47 @@
+package com.nb.bus.stats;
+
+
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.nb.bus.service.dto.CombineHistoryResult;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CommonHistoryStats.java
+ * @Description TODO
+ * @createTime 2022年07月23日 10:02:00
+ */
+public interface CommonHistoryStats extends CommonStats<CombineHistoryResult> {
+    /**
+     * 描述: 每个时区内对输注信息进行去重,只保留每个时区内相同输注信息的最后一次上传记录
+     * @author lifang
+     * @date 2022/7/23 10:04
+     * @param sources
+     * @return Map<String,List<CombineHistoryResult>>
+     */
+    default Map<String, List<CombineHistoryResult>> groupByInfuisonAndGetMax(Map<String, List<CombineHistoryResult>> sources){
+        sources
+                .forEach((k,histories)->{
+                    if(CollectionUtil.isNotEmpty(histories)){
+                        //按照输注区分找到每个时间段内最后的输注信息
+                        Map<String, CombineHistoryResult> lastHistories = histories
+                                .parallelStream()
+                                .collect(
+                                        //先根据输注id分组
+                                        Collectors.groupingBy(CombineHistoryResult::getId,
+                                                Collectors.collectingAndThen(
+                                                        Collectors.reducing((c1, c2) -> c1.getUploadTime().after(c2.getUploadTime()) ? c1 : c2),
+                                                        Optional::get)
+                                        ));
+                        histories=CollectionUtil.newArrayList(lastHistories.values());
+                    }
+                });;
+        return sources;
+    };
+}

+ 59 - 18
nb-system/src/main/java/com/nb/bus/stats/CommonStats.java

@@ -14,6 +14,7 @@ import com.nb.bus.stats.entity.TableResult;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -43,43 +44,83 @@ public interface CommonStats<T extends CombineResult> {
      * 描述: 处理饼图
      * @author lifang
      * @date 2022/6/6 10:15
-     * @param results
+     * @param sources
      * @return PieResult
      */
-    List<PieResult> handlePie(List<T> results);
+    List<PieResult> handlePie(List<T> sources);
 
     /**
-     * 描述: 处理折线图
+     * 描述:
      * @author lifang
-     * @date 2022/6/6 10:15
-     * @param results
-     * @return LineResult
+     * @date 2022/7/22 21:06
+     * @param sources
+     * @param unit 查询单位
+     * @param minTime 开始时间最小值
+     * @param maxTime 开始时间最大值
+     * @return List<LineResult>
      */
-    List<LineResult> handleLine(List<T> results, StatsTimeUnit unit);
+    List<LineResult> handleLine(List<T> sources, StatsTimeUnit unit,Date minTime,Date maxTime);
 
     /**
      * 描述: 处理图表
      * @author lifang
      * @date 2022/6/6 10:16
-     * @param results
+     * @param sources
      * @return TableResult
      */
-    List<TableResult> handleTable(List<T> results, StatsTimeUnit unit);
+    List<TableResult> handleTable(List<T> sources, StatsTimeUnit unit,Date minTime,Date maxTime);
 
 
 
-    default Map<String, List<T>> groupByTime(List<T> results, StatsTimeUnit unit){
-        return groupByTime(results,unit,T::getInfusionStartTime);
+    default Map<String, List<T>> groupByInfusionTime(List<T> sources, StatsTimeUnit unit, Date minTime, Date maxTime){
+        return groupByTime(sources,unit,minTime,maxTime,
+                t->true,
+                T::getInfusionStartTime,t->{
+                    Date startTime = t.getInfusionStartTime();
+                    Date endTime = t.getLastUploadTime();
+                    Set<String> result = new HashSet<>();
+                    while (!startTime.after(endTime)) {
+                        result.add(unit.parse(startTime));
+                        startTime=new Date(startTime.getTime()+ TimeUnit.DAYS.toMillis(1));
+                    }
+                    return result;
+                });
     }
 
-    default Map<String, List<T>> groupByTime(List<T> results, StatsTimeUnit unit, Function< T,Date> supplier){
-        results.sort(Comparator.comparing(supplier));
+
+    /**
+     * 描述:
+     * @author lifang
+     * @date 2022/7/22 22:42
+     * @param sources   资源集合
+     * @param unit  分类时间单位
+     * @param minTime   最小时间
+     * @param maxTime   最大时间
+     * @param sortSupplier  排序字段
+     * @param supplier  提供所属时间区间(格式化后)
+     * @return Map<String,List<T>>
+     */
+    default Map<String, List<T>> groupByTime(List<T> sources, StatsTimeUnit unit,Date minTime,Date maxTime,
+                                             Predicate<T> predicate,
+                                             Function<T,Date> sortSupplier,Function<T,Set<String>> supplier){
+        List<T> sortResult=sources.stream().filter(predicate::test).collect(Collectors.toList());
+        sortResult.sort(Comparator.comparing(sortSupplier));
         Map<String, List<T>> result = new LinkedHashMap<>();
-        results.forEach(combineResult->{
-            String timeFormat = unit.parse(supplier.apply(combineResult));
-            combineResult.setTimeParseResult(timeFormat);
-            result.computeIfAbsent(timeFormat,k->new ArrayList<>()).add(combineResult);
-        });
+        //增加x轴所有时间节点
+        while (!minTime.after(maxTime)){
+            result.computeIfAbsent(unit.parse(minTime),k->new ArrayList<>());
+            minTime=new Date(minTime.getTime()+ TimeUnit.DAYS.toMillis(1));
+        }
+
+        sortResult
+                .stream()
+                .forEach(combineResult->{
+                    Set<String> timeFormats = supplier.apply(combineResult);
+                    for (String timeFormat : timeFormats) {
+                        result.computeIfAbsent(timeFormat,k->new ArrayList<>()).add(combineResult);
+                    }
+//            combineResult.setTimeParseResult(timeFormat);
+                });
         return result;
     }
 

+ 16 - 13
nb-system/src/main/java/com/nb/bus/stats/analyse/AlarmStatsAnalyse.java

@@ -1,6 +1,7 @@
 package com.nb.bus.stats.analyse;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import com.nb.bus.enums.*;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
@@ -50,17 +51,19 @@ public class AlarmStatsAnalyse implements CommonStats<CombineAlarmResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineAlarmResult> results, StatsTimeUnit unit) {
-        //根据时间对结果进行区分统计
-        Map<String, List<CombineAlarmResult>> groupByTime = groupByTime(results, unit);
+    public List<LineResult> handleLine(List<CombineAlarmResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
+        //根据报警时间对结果进行区分统计
+        Map<String, List<CombineAlarmResult>> groupByTime = groupByTime(sources, unit,minTime,maxTime,
+                t->Boolean.TRUE.equals(t.getIsAlarm()),
+                CombineAlarmResult::getAlarmTime,
+                t->CollectionUtil.newHashSet(unit.parse(t.getAlarmTime())));
         List<LineResult> result = new ArrayList<>();
         //增加散点图
         result.add(alarmScatter(groupByTime));
+        //增加数量图
         result.add(countLine(groupByTime));
+        //增加比率图
         result.add(ratioLine(groupByTime));
-
-
-        //比率
         return result;
     }
 
@@ -167,15 +170,15 @@ public class AlarmStatsAnalyse implements CommonStats<CombineAlarmResult> {
      * 描述: 提示次数折线图
      * @author lifang
      * @date 2022/6/7 13:24
-     * @param results
+     * @param sources
      * @return LineResult
      */
-    private LineResult countLine(Map<String, List<CombineAlarmResult>> results) {
+    private LineResult countLine(Map<String, List<CombineAlarmResult>> sources) {
         LineResult<Long> result = LineResult.of("count",false,false,"提示次数分布图");
         List<String> time = result.getTime();
         Map<String, AlarmTotalPieResult> groupByTime = new HashMap<>();
         //根据时间区间对镇痛方式进行统计
-        results.forEach((timeRange,combineResults)->{
+        sources.forEach((timeRange,combineResults)->{
             AlarmTotalPieResult alarmTotalPieResult = groupByTime.computeIfAbsent(timeRange, k -> new AlarmTotalPieResult(addIntelligentParam()));
             combineResults.forEach(alarmTotalPieResult::handle);
             time.add(timeRange);
@@ -205,17 +208,17 @@ public class AlarmStatsAnalyse implements CommonStats<CombineAlarmResult> {
 
         });
         result.setContent(new ArrayList<>(lineContentMap.values()));
-        result.setSampleCount(CollUtil.size(results));
+        result.setSampleCount(CollUtil.size(sources));
         return result;
     }
 
 
 
     @Override
-    public  List<TableResult> handleTable(List<CombineAlarmResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineAlarmResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
-        Map<String, List<CombineAlarmResult>> groupByTimeResults = groupByTime(results, unit);
+        Map<String, List<CombineAlarmResult>> groupByTimeResults = groupByInfusionTime(sources, unit,minTime,maxTime);
         List<String> columnNames = Arrays.asList(
                 DeviceAlarmEnum.Jam.getText(),
                 DeviceAlarmEnum.Limit.getText(),
@@ -384,7 +387,7 @@ public class AlarmStatsAnalyse implements CommonStats<CombineAlarmResult> {
      * @return boolean
      */
     public boolean addIntelligentParam(){
-        Object deviceType = ThreadUtil.getSingleThreadLocal().get();
+        Object deviceType = ThreadUtil.get();
         if(deviceType==null|| DeviceTypeEnum.intelligent.getValue().equals(deviceType)){
             return true;
         }

+ 35 - 60
nb-system/src/main/java/com/nb/bus/stats/analyse/EvalStatsAnalyse.java

@@ -14,7 +14,6 @@ import com.nb.bus.service.LocalBusHospitalConfigService;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.dto.CombineEvalResult;
 import com.nb.bus.service.dto.CombineQuery;
-import com.nb.bus.service.dto.CombineResult;
 import com.nb.bus.stats.CommonStats;
 import com.nb.bus.stats.entity.*;
 import com.nb.bus.stats.enums.PieEnum;
@@ -22,11 +21,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.springframework.stereotype.Service;
 
-import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -202,40 +198,44 @@ public class EvalStatsAnalyse implements CommonStats<CombineEvalResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineEvalResult> results, StatsTimeUnit unit) {
-        //对所有结果进行时间划分
-        Map<String, List<CombineEvalResult>> groupByTime = groupByTime(results, unit);
-        //获取所有镇痛信息
+    public List<LineResult> handleLine(List<CombineEvalResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
+        //根据输注进行时间进行划分
+        Map<String, List<CombineEvalResult>> groupByInfusionStartTime = groupByInfusionTime(sources, unit,minTime,maxTime);
+        //根据评分时间进行划分
+        Map<String, List<CombineEvalResult>> groupByEvalTime = groupByTime(sources, unit, minTime, maxTime,
+                t->StrUtil.isNotEmpty(t.getEvalId()),
+                CombineEvalResult::getEvalTime,
+                t -> CollectionUtil.newHashSet(unit.parse(t.getEvalTime())));
+
         List<LineResult> result = new ArrayList<>();
-        result.add(addRatio(results,unit,groupByTime));
-        //只对包含评价的数据进行时间划分
-        Map<String, List<CombineEvalResult>> exitEvalGroupByTime = groupByTime(
-                results
-                        .stream()
-                        .filter(evalResult -> StrUtil.isNotEmpty(evalResult.getEvalId()))
-                        .collect(Collectors.toList())
-                , unit);
+
+        result.add(addRatio(groupByInfusionStartTime,groupByEvalTime));
         BusHospitalConfigEntity config = evalConfig();
         if(config==null){
             return result;
         }
+
         FunctionEvalConfig evalConfig = JSONUtil.toBean(JSONUtil.toJsonStr(config.getConfig()), FunctionEvalConfig.class);
 
-        addEvalLine(exitEvalGroupByTime,result,evalConfig);
+        addEvalLine(groupByEvalTime,result,evalConfig);
         //比率
         return result;
     }
 
     @Override
-    public List<TableResult> handleTable(List<CombineEvalResult> results, StatsTimeUnit unit) {
+    public List<TableResult> handleTable(List<CombineEvalResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         BusHospitalConfigEntity config = evalConfig();
         FunctionEvalConfig evalConfig=new FunctionEvalConfig();
         if(config!=null&& CollUtil.isNotEmpty(config.getConfig())){
             evalConfig = JSONUtil.toBean(JSONUtil.toJsonStr(config.getConfig()), FunctionEvalConfig.class);
         }
-        //根据时间对结果进行区分统计
-        Map<String, List<CombineEvalResult>> groupByTime = groupByTime(results, unit);
+        //根据输注进行区分
+        Map<String, List<CombineEvalResult>> groupByInfusionStartTime = groupByInfusionTime(sources, unit,minTime,maxTime);
+        Map<String, List<CombineEvalResult>> groupByEvalTime = groupByTime(sources, unit, minTime, maxTime,
+                t->StrUtil.isNotEmpty(t.getEvalId()),
+                CombineEvalResult::getEvalTime,
+                t -> CollectionUtil.newHashSet(unit.parse(t.getEvalTime())));
 
         List<StatsColumn> allColumn = getAllColumn(evalConfig);
 
@@ -243,20 +243,19 @@ public class EvalStatsAnalyse implements CommonStats<CombineEvalResult> {
         result.setContent(contents);
         result.setColumn(allColumn);
         //根据时间区间对镇痛方式进行统计
-        groupByTime.forEach((timeRange,combineResult)->{
-            RatioResult ratioResult = computeEvalRatio(combineResult);
+        groupByInfusionStartTime.forEach((timeRange,combineResult)->{
+            List<CombineEvalResult> combineEvalResults = groupByEvalTime.get(timeRange);
+            BigDecimal totalCount =BigDecimal.valueOf( CollectionUtil.size(combineResult));
+            BigDecimal evalCount = BigDecimal.valueOf(CollectionUtil.size(groupByEvalTime.get(timeRange)));
             //表格内容
-            long evalCount = combineResult.stream().filter(r -> StrUtil.isNotEmpty(r.getEvalId())).count();
             LinkedHashMap<String, Object> contentValues = new LinkedHashMap<>();
             contentValues.put("时间",timeRange);
-            contentValues.put("输注次数",ratioResult.getTotalSize());
+            contentValues.put("输注次数",totalCount);
             contentValues.put("评价次数",evalCount);
-            contentValues.put("评价比率",ratioResult.getRatio());
+            contentValues.put("评价比率",computeRatio(evalCount,totalCount));
             //获取特定时间区间内
             EvalTableResult evalTableResult = new EvalTableResult();
-            combineResult.stream()
-                    .filter(evalResult -> StrUtil.isNotEmpty(evalResult.getEvalId()))
-                    .forEach(evalTableResult::handle);
+            combineEvalResults.forEach(evalTableResult::handle);
             contentValues.putAll(evalTableResult);
             contents.add(contentValues);
         });
@@ -340,20 +339,21 @@ public class EvalStatsAnalyse implements CommonStats<CombineEvalResult> {
      * 描述:添加评价比率,当天/周/月 评价过的输注次数与 当天/周/月总输注次数的占比
      * @author lifang
      * @date 2022/6/8 21:50
-     * @param groupByTime 根据输注开始时间进行统计
+     * @param groupByInfusionTime 根据输注开始时间进行分组
+     * @param groupByEvalTime 根据评价时间进行分组
      * @return LineResult
      */
-    private LineResult<BigDecimal> addRatio(List<CombineEvalResult> results, StatsTimeUnit unit,Map<String, List<CombineEvalResult>> groupByTime) {
+    private LineResult<BigDecimal> addRatio(Map<String, List<CombineEvalResult>> groupByInfusionTime,Map<String, List<CombineEvalResult>> groupByEvalTime) {
         LineResult<BigDecimal> result = LineResult.of("ratio",true,false,"评价占比分布图");
         LineResult.LineContent<BigDecimal> ratioLine =  new LineResult.LineContent<>("评价占比");
         List<String> time = result.getTime();
-
-        //根据输注开始时间区间对评价进行统计
-        groupByTime.forEach((timeRange,combineResult)->{
-            ratioLine.addValue(computeEvalRatio(combineResult).getRatio());
+        groupByInfusionTime.forEach((timeRange,combineResults)->{
+            ratioLine.addValue(
+                    computeRatio(BigDecimal.valueOf(CollectionUtil.size(groupByEvalTime.get(timeRange))),
+                            BigDecimal.valueOf(CollectionUtil.size(combineResults)))
+            );
             time.add(timeRange);
         });
-
         result.setContent(Arrays.asList(ratioLine));
         return result;
     }
@@ -541,35 +541,10 @@ public class EvalStatsAnalyse implements CommonStats<CombineEvalResult> {
                     CombineEvalResult::getBloodOxygenSaturation);
             result.add(bloodOxygenSaturationLine);
         }
-
-
     }
 
 
-
-    private RatioResult computeEvalRatio(List<CombineEvalResult> results){
-        Map<String, List<CombineEvalResult>> resultMap = results.stream().collect(Collectors.groupingBy(CombineEvalResult::getId));
-        BigDecimal totalSize = BigDecimal.valueOf(CollectionUtil.size(resultMap.keySet()));
-        AtomicInteger evalCount=new AtomicInteger(0);
-        resultMap.forEach((id,evalResult)->{
-            if (evalResult.stream().anyMatch(r-> StrUtil.isNotEmpty(r.getEvalId()))) {
-                evalCount.addAndGet(1);
-            }
-        });
-        return    RatioResult.of(totalSize,BigDecimal.valueOf(evalCount.get()), computeRatio(BigDecimal.valueOf(evalCount.get()),totalSize));
-
-    }
-
     private BusHospitalConfigEntity evalConfig(){
         return  configService.getOne(new QueryWrapper<BusHospitalConfigEntity>().lambda().eq(BusHospitalConfigEntity::getType, ConfigEnum.eval));
     }
-
-    @Data
-    @AllArgsConstructor(staticName = "of")
-    static class RatioResult{
-        BigDecimal totalSize;
-        BigDecimal evalCount;
-        BigDecimal ratio;
-
-    }
 }

+ 28 - 18
nb-system/src/main/java/com/nb/bus/stats/analyse/InfusionDoseStatsAnalyse.java

@@ -1,18 +1,24 @@
 package com.nb.bus.stats.analyse;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
+import com.nb.bus.service.dto.CombineHistoryResult;
 import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
+import com.nb.bus.stats.CommonHistoryStats;
 import com.nb.bus.stats.CommonStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
 import com.nb.bus.stats.entity.TableResult;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -23,11 +29,11 @@ import java.util.*;
  */
 @AllArgsConstructor
 @Service
-public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
+public class InfusionDoseStatsAnalyse implements CommonHistoryStats {
     private final LocalBusInfusionHistoryService infusionHistoryService;
     @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        return infusionHistoryService.queryStatsAnal(query);
+    public List<CombineHistoryResult> queryResult(CombineQuery query) {
+        return infusionHistoryService.queryStatsHistory(query);
     }
 
     @Override
@@ -36,7 +42,7 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<PieResult> handlePie(List<CombineResult> results) {
+    public List<PieResult> handlePie(List<CombineHistoryResult> results) {
         return null;
     }
 
@@ -44,14 +50,18 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
      * 描述: 输注量分析需要 最大值、最小值、均数、标准差
      * @author lifang
      * @date 2022/6/7 21:28
-     * @param results
+     * @param sources
      * @param unit
      * @return List<LineResult>
      */
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
-        //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+    public List<LineResult> handleLine(List<CombineHistoryResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
+        //根据每个时间区间内区分历史数据
+        Map<String, List<CombineHistoryResult>> groupByTime =groupByInfuisonAndGetMax(
+                groupByTime(sources,unit,minTime,maxTime,t-> StrUtil.isNotEmpty(t.getHistoryId()),
+                        CombineHistoryResult::getUploadTime,
+                        t-> CollectionUtil.newHashSet(unit.parse(t.getUploadTime())))
+        );
         //获取所有镇痛信息
         List<LineResult> result = new ArrayList<>();
         result.add(inputDoseLine(groupByTime));
@@ -62,7 +72,7 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
         return result;
     }
 
-    private LineResult selfLockTimeLine(Map<String, List<CombineResult>> groupByTime) {
+    private LineResult selfLockTimeLine(Map<String, List<CombineHistoryResult>> groupByTime) {
         LineResult<BigDecimal> result = LineResult.of("selfLockTime",false,false,"自控锁时分析走势图");
         handleMixPolyLines(groupByTime,result,
                 combineResult -> {
@@ -75,16 +85,16 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
         return result;
     }
 
-    private LineResult appendDoseLine(Map<String, List<CombineResult>> groupByTime) {
+    private LineResult appendDoseLine(Map<String, List<CombineHistoryResult>> groupByTime) {
         LineResult<BigDecimal> result = LineResult.of("appendDoseLine",false,false,"追加量分析走势图");
         handleMixPolyLines(groupByTime,result,
                 combineResult -> {
-                    if (combineResult.getAppendDose() == null) {
-                        combineResult.setAppendDose(BigDecimal.valueOf(0));
+                    if (combineResult.getTotalAppendDose() == null) {
+                        combineResult.setTotalAppendDose(BigDecimal.valueOf(0));
                     }
                 },
                 ignore->true,
-                CombineResult::getAppendDose);
+                CombineHistoryResult::getTotalAppendDose);
         return result;
     }
 
@@ -95,7 +105,7 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
      * @param groupByTime
      * @return LineResult
      */
-    private LineResult inputDoseLine(Map<String, List<CombineResult>> groupByTime) {
+    private LineResult inputDoseLine(Map<String, List<CombineHistoryResult>> groupByTime) {
         LineResult<BigDecimal> result = LineResult.of("inputDoseLine",false,false,"已输入量分析走势图");
         handleMixPolyLines(groupByTime,result,
                 combineResult -> {
@@ -109,13 +119,13 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
     }
 
     /**
-     * 描述: 已输入量分析折线图 已输入量 最大值、最小值、均数、标准差
+     * 描述: 持续量分析折线图 持续量 最大值、最小值、均数、标准差
      * @author lifang
      * @date 2022/6/7 21:31
      * @param groupByTime
      * @return LineResult
      */
-    private LineResult continueDoseLine(Map<String, List<CombineResult>> groupByTime) {
+    private LineResult continueDoseLine(Map<String, List<CombineHistoryResult>> groupByTime) {
         LineResult<BigDecimal> result = LineResult.of("continueDoseLine",false,false,"持续量分析走势图");
 
         handleMixPolyLines(groupByTime,result,
@@ -125,12 +135,12 @@ public class InfusionDoseStatsAnalyse implements CommonStats<CombineResult> {
                     }
                 },
                 ignore->true,
-                CombineResult::getContinueDose);
+                CombineHistoryResult::getContinueDose);
         return result;
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineHistoryResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         return null;
     }
 

+ 44 - 15
nb-system/src/main/java/com/nb/bus/stats/analyse/PcaStatsAnalyse.java

@@ -2,11 +2,14 @@ package com.nb.bus.stats.analyse;
 
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
+import com.nb.bus.service.dto.CombineHistoryResult;
 import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
+import com.nb.bus.stats.CommonHistoryStats;
 import com.nb.bus.stats.CommonStats;
 import com.nb.bus.stats.entity.*;
 import com.nb.bus.stats.enums.PieEnum;
@@ -16,6 +19,7 @@ import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -26,11 +30,11 @@ import java.util.*;
  */
 @Component
 @AllArgsConstructor
-public class PcaStatsAnalyse implements CommonStats<CombineResult> {
+public class PcaStatsAnalyse implements CommonHistoryStats {
     private final LocalBusInfusionHistoryService infusionHistoryService;
     @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        return infusionHistoryService.queryStatsAnal(query);
+    public List<CombineHistoryResult> queryResult(CombineQuery query) {
+        return infusionHistoryService.queryStatsHistory(query);
     }
 
     @Override
@@ -39,12 +43,12 @@ public class PcaStatsAnalyse implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<PieResult> handlePie(List<CombineResult> results) {
+    public List<PieResult> handlePie(List<CombineHistoryResult> sources) {
         PieResult result = PieResult.of(PieEnum.total.name(),"自控分析饼图");
         long total=0;
         long pcaValidTotalCount=0;
         long pcaInvalidTotalCount=0;
-        for (CombineResult combineResult : results) {
+        for (CombineResult combineResult : sources) {
             Integer validCount = Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0);
             Integer invalidCount =Optional.ofNullable( combineResult.getPcaInvalidCount()).orElse(0);
             pcaValidTotalCount=pcaValidTotalCount+validCount;
@@ -57,9 +61,13 @@ public class PcaStatsAnalyse implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineHistoryResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineHistoryResult>> groupByTime =groupByInfuisonAndGetMax(
+                groupByTime(sources,unit,minTime,maxTime,t-> StrUtil.isNotEmpty(t.getHistoryId()),
+                        CombineHistoryResult::getUploadTime,
+                        t-> CollectionUtil.newHashSet(unit.parse(t.getUploadTime())))
+        );
         //获取所有镇痛信息
         List<LineResult> result = new ArrayList<>();
         result.add(countLine(groupByTime));
@@ -75,14 +83,35 @@ public class PcaStatsAnalyse implements CommonStats<CombineResult> {
      * @param groupByTime
      * @return LineResult
      */
-    private LineResult capitaLine(Map<String, List<CombineResult>> groupByTime) {
+    private LineResult capitaLine(Map<String, List<CombineHistoryResult>> groupByTime) {
         LineResult<BigDecimal> result =LineResult.of("capital",false,false,"人均次数");
-        handleMixPolyLines(groupByTime,result,
+        Map<String, List<CombineHistoryResult>> groupByTimeAndPatient=new HashMap<>();
+
+        //根据病号对输注进行划分
+        groupByTime.forEach((k,histories)->{
+            if(CollectionUtil.isNotEmpty(histories)){
+                Map<String, Integer> pcaTotalCountByPatient = histories.parallelStream()
+                        .collect(
+                                Collectors.groupingBy(CombineHistoryResult::getPatientId,
+                                        Collectors.summingInt(CombineHistoryResult::getPcaTotalCount))
+                        );
+                List<CombineHistoryResult> values = new ArrayList<>();
+                pcaTotalCountByPatient.forEach((patientId,pcaTotalCount)->{
+                    CombineHistoryResult value = new CombineHistoryResult();
+                    value.setPcaTotalCount(pcaTotalCount);
+                    value.setPatientId(patientId);
+                    values.add(value);
+                });
+                groupByTimeAndPatient.put(k,values);
+            }
+        });
+
+        handleMixPolyLines(groupByTimeAndPatient,result,
                 combineResult -> {
                     combineResult.setPcaTotalCount(
                             Optional.ofNullable(combineResult.getPcaInvalidCount()).orElse(0)
-                            +
-                            Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0));
+                                    +
+                                    Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0));
                 },
                 ignore->true,
                 combineResult -> BigDecimal.valueOf(combineResult.getPcaTotalCount()));
@@ -96,7 +125,7 @@ public class PcaStatsAnalyse implements CommonStats<CombineResult> {
      * @param groupByTime
      * @return LineResult
      */
-    private LineResult countLine(Map<String, List<CombineResult>> groupByTime) {
+    private LineResult countLine(Map<String, List<CombineHistoryResult>> groupByTime) {
         LineResult<Long> result = LineResult.of("count",false,false,"自控次数分布图");
         LineResult.LineContent<Long> validCountLine = new LineResult.LineContent<>("自控有效次数");
         LineResult.LineContent<Long> invalidCountLine = new LineResult.LineContent<>("自控无效次数");
@@ -120,10 +149,10 @@ public class PcaStatsAnalyse implements CommonStats<CombineResult> {
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineHistoryResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineHistoryResult>> groupByTime = groupByInfusionTime(results, unit,minTime,maxTime);
         List<StatsColumn> allColumn = Arrays.asList(
                 StatsColumn.of("时间","时间"),
                 StatsColumn.of("输注总数","输注总数"),
@@ -143,7 +172,7 @@ public class PcaStatsAnalyse implements CommonStats<CombineResult> {
             long pcaValidTotalCount=0;
             long pcaInvalidTotalCount=0;
 
-            for (CombineResult combineResult : combineResults) {
+            for (CombineHistoryResult combineResult : combineResults) {
                 Integer validCount = Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0);
                 Integer invalidCount =Optional.ofNullable( combineResult.getPcaInvalidCount()).orElse(0);
                 pcaValidTotalCount=pcaValidTotalCount+validCount;

+ 2 - 0
nb-system/src/main/java/com/nb/bus/stats/entity/StatsAnalyseResult.java

@@ -2,6 +2,7 @@ package com.nb.bus.stats.entity;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.util.*;
 /**
@@ -13,6 +14,7 @@ import java.util.*;
  */
 @Data
 @AllArgsConstructor(staticName = "of")
+@NoArgsConstructor
 public class StatsAnalyseResult {
     private List<PieResult> pie;
     private List<LineResult> line;

+ 8 - 13
nb-system/src/main/java/com/nb/bus/stats/report/AgeAndGenderStatsReport.java

@@ -5,6 +5,7 @@ import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
+import com.nb.bus.stats.CommonClinicStats;
 import com.nb.bus.stats.CommonStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
@@ -13,6 +14,7 @@ import com.nb.bus.stats.entity.TableResult;
 import com.nb.bus.stats.enums.AgeStatsEnum;
 import com.nb.common.enums.SexEnum;
 import lombok.AllArgsConstructor;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -29,16 +31,9 @@ import java.util.*;
 @Slf4j
 @AllArgsConstructor
 @Service
-public class AgeAndGenderStatsReport implements CommonStats<CombineResult> {
+public class AgeAndGenderStatsReport implements CommonClinicStats {
+    @Getter
     private final LocalBusInfusionHistoryService infusionHistoryService;
-    @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        List<CombineResult> combineResults = infusionHistoryService.queryStatsAnal(query);
-        //根据临床id进行去重操作
-        Map<String, CombineResult> clinicIdMap = new HashMap<>();
-        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
-        return new ArrayList<>(clinicIdMap.values());
-    }
 
     @Override
     public StatsAnalyseEnum getId() {
@@ -76,9 +71,9 @@ public class AgeAndGenderStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         LineResult<BigDecimal> manResult =LineResult.of("manAverageLine",false,false,"男性年龄走势图");
         handleMixPolyLines(groupByTime,manResult,
                 peek->{},
@@ -96,8 +91,8 @@ public class AgeAndGenderStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
+        Map<String, List<CombineResult>> groupByTime = groupByInfusionTime(results, unit,minTime,maxTime);
         TableResult manTableResult = new TableResult();
         manTableResult.setId("manTable");
         manTableResult.setDescription("男性年龄分布表格");

+ 9 - 15
nb-system/src/main/java/com/nb/bus/stats/report/AgeStatsReport.java

@@ -4,9 +4,8 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
-import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
-import com.nb.bus.stats.CommonStats;
+import com.nb.bus.stats.CommonClinicStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
 import com.nb.bus.stats.entity.StatsColumn;
@@ -14,6 +13,7 @@ import com.nb.bus.stats.entity.TableResult;
 import com.nb.bus.stats.enums.AgeStatsEnum;
 import com.nb.bus.stats.enums.PieEnum;
 import lombok.AllArgsConstructor;
+import lombok.Getter;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -28,16 +28,10 @@ import java.util.*;
  */
 @AllArgsConstructor
 @Service
-public class AgeStatsReport implements CommonStats<CombineResult> {
+public class AgeStatsReport implements CommonClinicStats {
+    @Getter
     private final LocalBusInfusionHistoryService infusionHistoryService;
-    @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        List<CombineResult> combineResults = infusionHistoryService.queryStatsAnal(query);
-        //根据临床id进行去重操作
-        Map<String, CombineResult> clinicIdMap = new HashMap<>();
-        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
-        return new ArrayList<>(clinicIdMap.values());
-    }
+
 
     @Override
     public StatsAnalyseEnum getId() {
@@ -77,9 +71,9 @@ public class AgeStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         List<LineResult> result = new ArrayList<>();
         result.add(averageLine(groupByTime));
         //比率
@@ -97,10 +91,10 @@ public class AgeStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         List<StatsColumn> allColumn = Arrays.asList(
                 StatsColumn.of("时间","时间"),
                 StatsColumn.of("总人数","总人数"),

+ 8 - 15
nb-system/src/main/java/com/nb/bus/stats/report/AnalStatsAnalyse.java

@@ -9,15 +9,15 @@ import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.constant.LocalBusConMixService;
-import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
-import com.nb.bus.stats.CommonStats;
+import com.nb.bus.stats.CommonClinicStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
 import com.nb.bus.stats.entity.StatsColumn;
 import com.nb.bus.stats.entity.TableResult;
 import com.nb.bus.stats.enums.PieEnum;
 import lombok.AllArgsConstructor;
+import lombok.Getter;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
@@ -34,17 +34,10 @@ import java.util.stream.Collectors;
  */
 @Component
 @AllArgsConstructor
-public class AnalStatsAnalyse implements CommonStats<CombineResult> {
+public class AnalStatsAnalyse implements CommonClinicStats {
     private final LocalBusConMixService conMixService;
+    @Getter
     private final LocalBusInfusionHistoryService infusionHistoryService;
-    @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        List<CombineResult> combineResults = infusionHistoryService.queryStatsAnal(query);
-        //根据临床id进行去重操作
-        Map<String, CombineResult> clinicIdMap = new HashMap<>();
-        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
-        return new ArrayList<>(clinicIdMap.values());
-    }
 
     @Override
     public StatsAnalyseEnum getId() {
@@ -69,9 +62,9 @@ public class AnalStatsAnalyse implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         //获取所有镇痛信息
         List<String> allAnal = getAllAnalName( groupByAnal(results), getConAnal());
         List<LineResult> result = new ArrayList<>();
@@ -93,11 +86,11 @@ public class AnalStatsAnalyse implements CommonStats<CombineResult> {
      * @return TableResult
      */
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
         Map<String, LineResult.LineContent<Long>> content = new HashMap<>();
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         List<String> allAnal = getAllAnalName( groupByAnal(results), getConAnal());
         List<StatsColumn> allColumn = getAllColumn(allAnal);
         allColumn.add(1,StatsColumn.of("总人数","总人数"));

+ 7 - 14
nb-system/src/main/java/com/nb/bus/stats/report/AsaStatsReport.java

@@ -9,14 +9,14 @@ import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.constant.LocalBusConMixService;
-import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
-import com.nb.bus.stats.CommonStats;
+import com.nb.bus.stats.CommonClinicStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
 import com.nb.bus.stats.entity.TableResult;
 import com.nb.bus.stats.enums.PieEnum;
 import lombok.AllArgsConstructor;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -35,17 +35,10 @@ import java.util.stream.Collectors;
 @Slf4j
 @AllArgsConstructor
 @Service
-public class AsaStatsReport implements CommonStats<CombineResult> {
+public class AsaStatsReport implements CommonClinicStats {
+    @Getter
     private final LocalBusInfusionHistoryService infusionHistoryService;
     private final LocalBusConMixService conMixService;
-    @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        List<CombineResult> combineResults = infusionHistoryService.queryStatsAnal(query);
-        //根据临床id进行去重操作
-        Map<String, CombineResult> clinicIdMap = new HashMap<>();
-        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
-        return new ArrayList<>(clinicIdMap.values());
-    }
 
     @Override
     public StatsAnalyseEnum getId() {
@@ -65,9 +58,9 @@ public class AsaStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         //获取所有镇痛信息
         List<String> allAsa = getAllAsaName( groupByAsa(results), getConAsa());
         List<LineResult> result = new ArrayList<>();
@@ -89,7 +82,7 @@ public class AsaStatsReport implements CommonStats<CombineResult> {
 
 
     @Override
-    public List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         return null;
     }
 

+ 10 - 15
nb-system/src/main/java/com/nb/bus/stats/report/GenderStatsReport.java

@@ -4,9 +4,8 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.nb.bus.enums.StatsAnalyseEnum;
 import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
-import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
-import com.nb.bus.stats.CommonStats;
+import com.nb.bus.stats.CommonClinicStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
 import com.nb.bus.stats.entity.StatsColumn;
@@ -14,6 +13,8 @@ import com.nb.bus.stats.entity.TableResult;
 import com.nb.bus.stats.enums.PieEnum;
 import com.nb.common.enums.SexEnum;
 import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -28,16 +29,10 @@ import java.util.*;
  */
 @AllArgsConstructor
 @Service
-public class GenderStatsReport implements CommonStats<CombineResult> {
+@Slf4j
+public class GenderStatsReport implements CommonClinicStats {
+    @Getter
     private final LocalBusInfusionHistoryService infusionHistoryService;
-    @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        List<CombineResult> combineResults = infusionHistoryService.queryStatsAnal(query);
-        //根据临床id进行去重操作
-        Map<String, CombineResult> clinicIdMap = new HashMap<>();
-        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
-        return new ArrayList<>(clinicIdMap.values());
-    }
 
     @Override
     public StatsAnalyseEnum getId() {
@@ -72,9 +67,9 @@ public class GenderStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         List<LineResult> result = new ArrayList<>();
         result.add(countLine(groupByTime));
         result.add(ratioLine(groupByTime));
@@ -152,10 +147,10 @@ public class GenderStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         List<StatsColumn> allColumn = getAllColumn(Arrays.asList("男性", "女性", "未知"));
         allColumn.add(1,StatsColumn.of("总人数","总人数"));
 

+ 18 - 16
nb-system/src/main/java/com/nb/bus/stats/report/WeightStatsReport.java

@@ -6,6 +6,7 @@ import com.nb.bus.enums.StatsTimeUnit;
 import com.nb.bus.service.LocalBusInfusionHistoryService;
 import com.nb.bus.service.dto.CombineQuery;
 import com.nb.bus.service.dto.CombineResult;
+import com.nb.bus.stats.CommonClinicStats;
 import com.nb.bus.stats.CommonStats;
 import com.nb.bus.stats.entity.LineResult;
 import com.nb.bus.stats.entity.PieResult;
@@ -14,6 +15,7 @@ import com.nb.bus.stats.enums.PieEnum;
 import com.nb.bus.stats.enums.WeightRangeEnum;
 import com.nb.common.enums.SexEnum;
 import lombok.AllArgsConstructor;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
@@ -30,16 +32,10 @@ import java.util.stream.Collectors;
 @Slf4j
 @AllArgsConstructor
 @Service
-public class WeightStatsReport implements CommonStats<CombineResult> {
+public class WeightStatsReport implements CommonClinicStats {
+    @Getter
     private final LocalBusInfusionHistoryService infusionHistoryService;
-    @Override
-    public List<CombineResult> queryResult(CombineQuery query) {
-        List<CombineResult> combineResults = infusionHistoryService.queryStatsAnal(query);
-        //根据临床id进行去重操作
-        Map<String, CombineResult> clinicIdMap = new HashMap<>();
-        combineResults.forEach(result->clinicIdMap.computeIfAbsent(result.getClinicId(),k->result));
-        return new ArrayList<>(clinicIdMap.values());
-    }
+
 
     @Override
     public StatsAnalyseEnum getId() {
@@ -100,6 +96,7 @@ public class WeightStatsReport implements CommonStats<CombineResult> {
             String weight = combineResult.getWeight();
             if(CharSequenceUtil.isNullOrUndefined(weight)){
                 ageMap.merge(WeightRangeEnum.unkown,1,(t1, t2)->t1+t2);
+                continue;
             }
             try {
                 BigDecimal count = BigDecimal.valueOf(Double.valueOf(weight));
@@ -117,11 +114,12 @@ public class WeightStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit) {
+    public List<LineResult> handleLine(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         //根据时间对结果进行区分统计
-        Map<String, List<CombineResult>> groupByTime = groupByTime(results, unit);
+        Map<String, List<CombineResult>> groupByTime = groupByClinicStartTime(results, unit,minTime,maxTime);
         List<LineResult> result = new ArrayList<>();
         LineResult<BigDecimal> manLine = LineResult.of("manAverageLine",false,false,"男性平均体重走势图");
+
         handleMixPolyLines(groupByTime,manLine,
                 peek->{},
                 filter->{
@@ -131,12 +129,14 @@ public class WeightStatsReport implements CommonStats<CombineResult> {
                     try {
                          Double.valueOf(filter.getWeight());
                     }catch (Exception e){
-                        log.error("临床【{}】体重【{}】格式错误",filter.getClinicId(),filter.getWeight());
+                        if(log.isDebugEnabled()){
+                            log.debug("临床【{}】体重【{}】格式错误",filter.getClinicId(),filter.getWeight());
+                        }
                         return false;
                     }
                     return SexEnum.MAN.equals(filter.getPatientGender());
                 },
-                map->BigDecimal.valueOf(Long.valueOf(map.getWeight()))
+                map->BigDecimal.valueOf(Double.valueOf(map.getWeight()))
         );
         LineResult<BigDecimal> womenLine =  LineResult.of("womenAverageLine",false,false,"女性平均体重走势图");
         handleMixPolyLines(groupByTime,womenLine,
@@ -148,12 +148,14 @@ public class WeightStatsReport implements CommonStats<CombineResult> {
                     try {
                          Double.valueOf(filter.getWeight());
                     }catch (Exception e){
-                        log.error("临床【{}】体重【{}】格式错误",filter.getClinicId(),filter.getWeight());
+                        if(log.isDebugEnabled()){
+                            log.debug("临床【{}】体重【{}】格式错误",filter.getClinicId(),filter.getWeight());
+                        }
                         return false;
                     }
                     return SexEnum.WOMAN.equals(filter.getPatientGender());
                 },
-                map->BigDecimal.valueOf(Long.valueOf(map.getWeight()))
+                map->BigDecimal.valueOf(Double.valueOf(map.getWeight()))
         );
         result.add(womenLine);
         result.add(manLine);
@@ -162,7 +164,7 @@ public class WeightStatsReport implements CommonStats<CombineResult> {
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit) {
+    public  List<TableResult> handleTable(List<CombineResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
         return Collections.emptyList();
     }
 }

+ 14 - 2
nb-system/src/main/java/com/nb/bus/utils/ThreadUtil.java

@@ -8,8 +8,20 @@ package com.nb.bus.utils;
  * @createTime 2022年07月15日 11:23:00
  */
 public class ThreadUtil {
-    private static ThreadLocal threadLocal=new ThreadLocal();
-    public static ThreadLocal getSingleThreadLocal(){
+    private static ThreadLocal threadLocal=new InheritableThreadLocal();
+    private static ThreadLocal getSingleThreadLocal(){
         return threadLocal;
     }
+
+    public static void set(Object obj){
+        getSingleThreadLocal().set(obj);
+    }
+
+    public static Object get(){
+        return getSingleThreadLocal().get();
+    }
+
+    public static void remove(){
+        getSingleThreadLocal().remove();
+    }
   }

+ 119 - 28
nb-system/src/main/resources/mapper/bus/BusInfusionHistoryMapper.xml

@@ -4,6 +4,8 @@
 
     <resultMap id="combineResult" type="com.nb.bus.service.dto.CombineResult">
         <result column="infusion_id" property="id"/>
+        <result column="clinic_start_time" property="clinicStartTime"/>
+        <result column="clinic_end_time" property="clinicEndTime"/>
         <result column="patient_id" property="patientId"/>
         <result column="device_id" property="deviceId"/>
         <result column="classification" property="classification"/>
@@ -71,6 +73,7 @@
 
     <resultMap id="combineAlarmResult" type="com.nb.bus.service.dto.CombineAlarmResult">
         <result column="device_type" property="type"/>
+        <result column="alarm_time" property="alarmTime"/>
         <result column="infusion_id" property="id"/>
         <result column="infusion_start_time" property="infusionStartTime"/>
         <result column="cause" property="cause"/>
@@ -86,6 +89,7 @@
     <resultMap id="combineEvalResult" type="com.nb.bus.service.dto.CombineEvalResult">
         <result column="evaluate_time" property="evalTime"/>
         <result column="infusion_id" property="id"/>
+        <result column="last_upload_time" property="lastUploadTime"/>
         <result column="eval_id" property="evalId"/>
         <result column="infusion_start_time" property="infusionStartTime"/>
         <result column="statics" property="statics"/>
@@ -112,6 +116,25 @@
         <result column="blood_oxygen_saturation" property="bloodOxygenSaturation"/>
     </resultMap>
 
+    <resultMap id="queryStatsHistory" type="com.nb.bus.service.dto.CombineHistoryResult">
+        <result column="infusion_id" property="id"/>
+        <result column="patient_id" property="patientId"/>
+        <result column="device_id" property="deviceId"/>
+        <result column="clinic_id" property="clinicId"/>
+        <result column="history_id" property="historyId"/>
+        <result column="device_type" property="type"/>
+        <result column="total_append_dose" property="totalAppendDose"/>
+        <result column="input_dose" property="inputDose"/>
+        <result column="continue_dose" property="continueDose"/>
+        <result column="self_control_lock_time" property="selfControlLockTime"/>
+        <result column="pca_valid_count" property="pcaValidCount"/>
+        <result column="pca_invalid_count" property="pcaInvalidCount"/>
+        <result column="pca_total_count" property="pcaTotalCount"/>
+        <result column="upload_time" property="uploadTime"/>
+    </resultMap>
+
+
+
     <select id="currentInClinic" resultType="com.nb.bus.entity.BusInfusionHistoryEntity">
         select d.alias,i.* from
             (select * from bus_infusion_history where clinic_id=#{clinicId} ORDER BY start_time desc limit 1) as i
@@ -197,12 +220,18 @@
             </if>
         </where>
         ) as p on p.id = c.patient_id
+        <if test="query.warns != null or query.deviceAlarm != null">
+            JOIN (
+            <include refid="commonDeviceAlarmQuery"/>
+            ) as a
+            on a.infusion_id = i.id
+        </if>
         <if test="(query.orderByDesc!=null and query.orderByDesc.size > 0) or (query.orderByAsc!=null and query.orderByAsc.size > 0)">
             order by
         </if>
         <if test="query.orderByDesc!=null and query.orderByDesc.size > 0">
             <foreach item="descItem" index="index" collection="query.orderByDesc" open="" separator="," close="">
---             !!!!这里使用$不要使用#,否自只是对列名(字符串)进行排序,而不是进行列排序
+                --             !!!!这里使用$不要使用#,否自只是对列名(字符串)进行排序,而不是进行列排序
                 ${descItem} desc
             </foreach>
         </if>
@@ -225,6 +254,7 @@
         i.start_time as infusion_start_time,
         a.cause as cause,
         i.patient_code as patient_code,
+        a.upload_time as alarm_time,
         a.alarm as alarm,
         a.run_state as run_state,
         a.alarm_state as alarm_state,
@@ -239,10 +269,13 @@
         <include refid="commonClinicQuery"/>
         ) as c
         on i.clinic_id=c.id
-        JOIN bus_device_alarm a on a.infusion_id = i.id
+        JOIN(
+        <include refid="commonDeviceAlarmQuery"/>
+        ) as a
+        on a.infusion_id = i.id
     </select>
 
-    <select id="queryStatsAnal" resultMap="combineResult">
+    <select id="queryStatsCommon" resultMap="combineResult">
         select
         i.id as infusion_id,
         i.device_id as device_id,
@@ -255,6 +288,8 @@
         i.append_dose as append_dose,
         i.self_control_lock_time as self_control_lock_time,
         i.patient_code as patient_code,
+        c.monitor_start_time as clinic_start_time,
+        c.end_time as clinic_end_time,
         c.id as clinic_id,
         c.asa as asa,
         c.patient_gender as patient_gender,
@@ -269,12 +304,19 @@
         <include refid="commonClinicQuery"/>
         ) as c
         on i.clinic_id=c.id
+        <if test="query.warns != null or query.deviceAlarm != null">
+            JOIN (
+            <include refid="commonDeviceAlarmQuery"/>
+            ) as a
+            on a.infusion_id = i.id
+        </if>
     </select>
 
 
     <select id="queryStatsEval" resultMap="combineEvalResult">
         select
         i.id as infusion_id,
+        i.last_upload_time as last_upload_time,
         i.start_time as infusion_start_time,
         e.evaluate_time as evaluate_time,
         e.statics as statics,
@@ -309,8 +351,53 @@
         on i.clinic_id=c.id
         left join (select * from bus_evaluation) as e
         on e.infusion_id=i.id
+        <if test="query.warns != null or query.deviceAlarm != null">
+            JOIN (
+            <include refid="commonDeviceAlarmQuery"/>
+            ) as a
+            on a.infusion_id = i.id
+        </if>
+    </select>
+
+    <select id="queryStatsHistory" resultMap="queryStatsHistory">
+        select
+        i.id as infusion_id,
+        i.device_id as device_id,
+        i.clinic_id as clinic_id,
+        p.id as patient_id,
+        h.id as history_id,
+        h.total_append_dose as total_append_dose,
+        h.input_dose as input_dose,
+        h.continue_dose as continue_dose,
+        h.self_control_lock_time as self_control_lock_time,
+        h.pca_valid_count as pca_valid_count,
+        h.pca_invalid_count as pca_invalid_count,
+        h.pca_total_count as pca_total_count,
+        h.upload_time as upload_time
+        from (
+        <include refid="commonInfusionQuery"/>
+        ) as i
+        <if test="query.warns != null or query.deviceAlarm != null">
+            JOIN (
+            <include refid="commonDeviceAlarmQuery"/>
+            ) as a
+            on a.infusion_id = i.id
+        </if>
+        JOIN (
+        <include refid="commonClinicQuery"/>
+        ) as c
+        on i.clinic_id=c.id
+        join (select * from bus_patient
+        <where>
+            <if test="query.patientCode != null">
+                and code like concat('%',#{query.patientCode},'%')
+            </if>
+        </where>
+        ) as p on p.id = c.patient_id
+        join bus_device_history as h on h.infusion_id=i.id
     </select>
 
+
     <sql id="commonInfusionQuery">
         select * from bus_infusion_history
         <where>
@@ -335,11 +422,8 @@
             <if test="query.finished != null">
                 and finished =#{query.finished}
             </if>
-            <if test="query.deviceRunState != null">
-                and run_state = #{query.deviceRunState}
-            </if>
-            <if test="query.deviceAlarm != null">
-                and alarm = #{query.deviceAlarm}
+            <if test="query.isUndo != null">
+                and is_undo =#{query.isUndo}
             </if>
             <if test="query.validPcaCountRange != null and query.validPcaCountRange.size > 0">
                 and pca_valid_count &gt;=  #{query.validPcaCountRange[0]}
@@ -353,26 +437,20 @@
                     and pca_invalid_count &lt;=  #{query.inValidPcaCountRange[1]}
                 </if>
             </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>0=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>
+    </sql>
+
+    <sql id="commonDeviceAlarmQuery">
+        select * from bus_device_alarm
+        <where>
+            <if test="query.warnAnalgesicPoor == true">and warn_analgesic_poor=1 </if>
+            <if test="query.warnLowBattery == true"> and warn_low_battery=1 </if>
+            <if test="query.warnFlow !=null">
+                and warn_flow= #{query.warnFlow}
+            </if>
+            <if test="query.deviceAlarm != null">
+                and alarm = #{query.deviceAlarm}
+            </if>
         </where>
     </sql>
 
@@ -448,6 +526,19 @@
             <if test="query.surgeryName != null">
                 and surgery_name like concat('%',#{query.surgeryName},'%')
             </if>
+
+            <if test="query.clinicStartTimeRange != null and query.clinicStartTimeRange.size > 0">
+                and monitor_start_time &gt;=  #{query.clinicStartTimeRange[0]}
+                <if test="query.startTimeRange.size >1 ">
+                    and monitor_start_time &lt;=  #{query.clinicStartTimeRange[1]}
+                </if>
+            </if>
+            <if test="query.clinicEndTimeRange != null and query.clinicEndTimeRange.size > 0">
+                and finished =1 and end_time &gt;=  #{query.clinicEndTimeRange[0]}
+                <if test="query.clinicEndTimeRange.size >1 ">
+                    and end_time &lt;=  #{query.clinicEndTimeRange[1]}
+                </if>
+            </if>
         </where>
     </sql>
 </mapper>

+ 8 - 3
nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -287,13 +287,15 @@
             </choose>
         </where>
         ) as i on p.infusion_id=i.id
-        left join (select device_id,alias
+        left join
+        (select device_id,alias
         from bus_device
         <where>
             <if test="query.tenantId!=null">
                 and tenant_id=#{query.tenantId}
             </if>
-        </where>) as d on d.device_id=i.device_id
+        </where>
+        ) as d on d.device_id=i.device_id
         join (select * from bus_clinic
         <where>
             finished=0
@@ -311,7 +313,7 @@
             </if>
         </where>
         ) c on p.clinic_id=c.id
-        <if test="query.bedNo!=null || query.name!=null || query.code!=null || query.anaDoctor!=null || query.surgeName!=null ||query.gender!=null ||query.anaType!=null">
+        <if test="query.bedNo!=null || query.name!=null || query.code!=null || query.anaDoctor!=null || query.surgeName!=null ||query.gender!=null ||query.anaType!=null || query.deviceId != null">
             <where>
                 (1=0
                 <if test="query.bedNo!=null">
@@ -335,6 +337,9 @@
                 <if test="query.anaType!=null">
                     or c.ana_type LIKE concat('%', #{query.anaType}, '%')
                 </if>)
+                <if test="query.deviceId!=null">
+                    and i.device_id like concat('%', #{query.deviceId}, '%')
+                </if>
             </where>
         </if>
         order by c.monitor_start_time desc