Parcourir la source

add 输注监控可以根据设备id设备别名进行搜索

A17404李放 il y a 3 ans
Parent
commit
750d3ab319

+ 11 - 2
nb-system/src/main/java/com/nb/bus/controller/BusStatsAnalyseController.java

@@ -68,15 +68,24 @@ public class BusStatsAnalyseController {
         }
         CommonStats commonStats=statsMap.get(analyseEnum);
 
+        long t0 = System.currentTimeMillis();
         List queryResult = commonStats.queryResult(query);
         //提示分析时,根据所选设备类型 进行分析判定
-
+        long startTime = System.currentTimeMillis();
+        System.out.println("查询 = " + (startTime - t0));
         StatsAnalyseResult result = new StatsAnalyseResult();
         ThreadUtil.set(query.getDeviceType());
 
+
         result.setPie(commonStats.handlePie(queryResult));
+        long t1 = System.currentTimeMillis();
+        System.out.println("饼图耗时 = " + (t1 - startTime));
         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)));
+        long t2 = System.currentTimeMillis();
+        System.out.println("线段图耗时 = " + (t2 - t1));
+        result.setTable( commonStats.handleTable(queryResult,query.getTimeUnit(),query.getStartTimeRange().get(0),query.getStartTimeRange().get(1)));
+        long t3 = System.currentTimeMillis();
+        System.out.println("图表耗时 = " + (t3- t2));
         ThreadUtil.remove();
         return R.success(result);
 

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

@@ -59,7 +59,7 @@ public interface BusInfusionHistoryMapper extends BaseMapper<BusInfusionHistoryE
 
 
     /**
-     * 描述: 联合查询出输注运行数据-统计使用
+     * 描述: 联合查询出输注运行数据-统计使用 根据输注、病人、时间(天)已分组完成,数据为每组当天最大值
      * @author lifang
      * @date 2022/6/7 10:03
      * @param query

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

@@ -8,6 +8,7 @@ import javax.validation.constraints.DecimalMax;
 import javax.validation.constraints.DecimalMin;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.Optional;
 
 /**
  * @author lifang
@@ -24,6 +25,7 @@ public class CombineHistoryResult extends CombineResult {
 
     @ApiModelProperty("上传时间")
     private Date uploadTime;
+
     @ApiModelProperty(value = "公共参数-pca有效次数",accessMode = ApiModelProperty.AccessMode.READ_ONLY)
     private Integer pcaValidCount;
 
@@ -47,4 +49,19 @@ public class CombineHistoryResult extends CombineResult {
     @ApiModelProperty(value = "公共-此次输注过程中到此为止的总追加量")
     private BigDecimal totalAppendDose;
 
+
+    @Override
+    public Integer getPcaTotalCount() {
+        return getPcaInvalidCount()+getPcaValidCount();
+    }
+
+    @Override
+    public Integer getPcaValidCount() {
+        return Optional.ofNullable(pcaValidCount).orElse(0);
+    }
+
+    @Override
+    public Integer getPcaInvalidCount() {
+        return Optional.ofNullable(pcaInvalidCount).orElse(0);
+    }
 }

+ 5 - 1
nb-system/src/main/java/com/nb/bus/service/dto/PatientMonitorQuery.java

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

+ 1 - 32
nb-system/src/main/java/com/nb/bus/stats/CommonHistoryStats.java

@@ -2,14 +2,8 @@ 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
@@ -18,30 +12,5 @@ import java.util.stream.Collectors;
  * @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;
-    };
+
 }

+ 4 - 1
nb-system/src/main/java/com/nb/bus/stats/analyse/AlarmStatsAnalyse.java

@@ -218,7 +218,10 @@ public class AlarmStatsAnalyse implements CommonStats<CombineAlarmResult> {
     public  List<TableResult> handleTable(List<CombineAlarmResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
-        Map<String, List<CombineAlarmResult>> groupByTimeResults = groupByInfusionTime(sources, unit,minTime,maxTime);
+        Map<String, List<CombineAlarmResult>> groupByTimeResults = groupByTime(sources, unit,minTime,maxTime,
+                t->Boolean.TRUE.equals(t.getIsAlarm()),
+                CombineAlarmResult::getAlarmTime,
+                t->CollectionUtil.newHashSet(unit.parse(t.getAlarmTime())));
         List<String> columnNames = Arrays.asList(
                 DeviceAlarmEnum.Jam.getText(),
                 DeviceAlarmEnum.Limit.getText(),

+ 3 - 5
nb-system/src/main/java/com/nb/bus/stats/analyse/InfusionDoseStatsAnalyse.java

@@ -57,11 +57,9 @@ public class InfusionDoseStatsAnalyse implements CommonHistoryStats {
     @Override
     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())))
-        );
+        Map<String, List<CombineHistoryResult>> groupByTime =  groupByTime(sources,unit,minTime,maxTime,t-> true,
+                CombineHistoryResult::getUploadTime,
+                t-> CollectionUtil.newHashSet(unit.parse(t.getUploadTime())));
         //获取所有镇痛信息
         List<LineResult> result = new ArrayList<>();
         result.add(inputDoseLine(groupByTime));

+ 55 - 19
nb-system/src/main/java/com/nb/bus/stats/analyse/PcaStatsAnalyse.java

@@ -2,7 +2,6 @@ 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;
@@ -10,7 +9,6 @@ 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;
 import lombok.AllArgsConstructor;
@@ -48,7 +46,13 @@ public class PcaStatsAnalyse implements CommonHistoryStats {
         long total=0;
         long pcaValidTotalCount=0;
         long pcaInvalidTotalCount=0;
-        for (CombineResult combineResult : sources) {
+        Map<String, CombineHistoryResult> infusionMaps = sources.stream()
+                .collect(Collectors.groupingBy(CombineHistoryResult::getId,
+                        Collectors.collectingAndThen(
+                                Collectors.reducing((t1, t2) -> t1.getUploadTime().after(t2.getUploadTime()) ? t1 : t2),
+                                Optional::get
+                        )));
+        for (CombineResult combineResult : infusionMaps.values()) {
             Integer validCount = Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0);
             Integer invalidCount =Optional.ofNullable( combineResult.getPcaInvalidCount()).orElse(0);
             pcaValidTotalCount=pcaValidTotalCount+validCount;
@@ -63,11 +67,9 @@ public class PcaStatsAnalyse implements CommonHistoryStats {
     @Override
     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())))
-        );
+        Map<String, List<CombineHistoryResult>> groupByTime = groupByTime(sources, unit, minTime, maxTime, t -> true,
+                CombineHistoryResult::getUploadTime,
+                t -> CollectionUtil.newHashSet(unit.parse(t.getUploadTime())));
         //获取所有镇痛信息
         List<LineResult> result = new ArrayList<>();
         result.add(countLine(groupByTime));
@@ -130,29 +132,39 @@ public class PcaStatsAnalyse implements CommonHistoryStats {
         LineResult.LineContent<Long> validCountLine = new LineResult.LineContent<>("自控有效次数");
         LineResult.LineContent<Long> invalidCountLine = new LineResult.LineContent<>("自控无效次数");
         List<String> time = result.getTime();
-        //根据时间区间对pca次数进行统计
+        //记录每个输注在最后区间范围内计算的结果, 当前区间的Pca数量-前一时间区间的Pca数量=当前时间区间pca数量
+        Map<String, CombineResult> combineMap = new HashMap<>();
         groupByTime.forEach((timeRange,combineResults)->{
             long pcaValidTotalCount=0;
             long pcaInvalidTotalCount=0;
+
             for (CombineResult combineResult : combineResults) {
                 Integer validCount = Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0);
                 Integer invalidCount =Optional.ofNullable( combineResult.getPcaInvalidCount()).orElse(0);
-                pcaValidTotalCount=pcaValidTotalCount+validCount;
-                pcaInvalidTotalCount=pcaInvalidTotalCount+invalidCount;
+                CombineResult lastCombineResult = Optional.ofNullable(combineMap.get(combineResult.getId())).orElse(new CombineResult());
+
+                pcaValidTotalCount=pcaValidTotalCount+validCount-Optional.ofNullable(lastCombineResult.getPcaValidCount()).orElse(0);
+                pcaInvalidTotalCount=pcaInvalidTotalCount+invalidCount-Optional.ofNullable(lastCombineResult.getPcaInvalidCount()).orElse(0);
+
+                combineMap.put(combineResult.getId(),combineResult);
             }
+
             validCountLine.addValue(pcaValidTotalCount);
             invalidCountLine.addValue(pcaInvalidTotalCount);
             time.add(timeRange);
+
         });
         result.setContent(Arrays.asList(validCountLine,invalidCountLine));
         return result;
     }
 
     @Override
-    public  List<TableResult> handleTable(List<CombineHistoryResult> results, StatsTimeUnit unit,Date minTime,Date maxTime) {
+    public  List<TableResult> handleTable(List<CombineHistoryResult> sources, StatsTimeUnit unit,Date minTime,Date maxTime) {
         TableResult result = new TableResult();
         //根据时间对结果进行区分统计
-        Map<String, List<CombineHistoryResult>> groupByTime = groupByInfusionTime(results, unit,minTime,maxTime);
+        Map<String, List<CombineHistoryResult>> groupByTime =groupByTime(sources, unit, minTime, maxTime, t -> true,
+                CombineHistoryResult::getUploadTime,
+                t -> CollectionUtil.newHashSet(unit.parse(t.getUploadTime())));
         List<StatsColumn> allColumn = Arrays.asList(
                 StatsColumn.of("时间","时间"),
                 StatsColumn.of("输注总数","输注总数"),
@@ -161,6 +173,29 @@ public class PcaStatsAnalyse implements CommonHistoryStats {
                 StatsColumn.of("人均自控数","人均自控数"),
                 StatsColumn.of("人均自控有效数","人均自控有效数"),
                 StatsColumn.of("人均自控无效数","人均自控无效数"));
+
+        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);
+            }
+        });
+
+
         List<Map<String, Object>> contents = new ArrayList<>();
         result.setContent(contents);
         result.setColumn(allColumn);
@@ -171,24 +206,25 @@ public class PcaStatsAnalyse implements CommonHistoryStats {
             long total=0;
             long pcaValidTotalCount=0;
             long pcaInvalidTotalCount=0;
+            List<CombineHistoryResult> personalPcaResults = Optional.ofNullable(groupByTimeAndPatient.get(timeRange)).orElse(new ArrayList<>());
 
-            for (CombineHistoryResult combineResult : combineResults) {
+            for (CombineHistoryResult combineResult : personalPcaResults) {
                 Integer validCount = Optional.ofNullable(combineResult.getPcaValidCount()).orElse(0);
                 Integer invalidCount =Optional.ofNullable( combineResult.getPcaInvalidCount()).orElse(0);
                 pcaValidTotalCount=pcaValidTotalCount+validCount;
                 pcaInvalidTotalCount=pcaInvalidTotalCount+invalidCount;
                 total=total+validCount+invalidCount;
             }
-
             contentValues.put("输注总数", CollectionUtil.size(combineResults));
             contentValues.put("自控总数",total);
             contentValues.put("自控有效数",pcaValidTotalCount);
             contentValues.put("自控无效数",pcaInvalidTotalCount);
-            BigDecimal patientCount = BigDecimal.valueOf(combineResults.stream().map(CombineResult::getPatientCode).distinct().count());
+            BigDecimal patientCount = BigDecimal.valueOf(CollectionUtil.size(personalPcaResults));
+
 
-            contentValues.put("人均自控数",BigDecimal.valueOf(total).divide(patientCount,2, RoundingMode.HALF_UP));
-            contentValues.put("人均自控有效数",BigDecimal.valueOf(pcaValidTotalCount).divide(patientCount,2, RoundingMode.HALF_UP));
-            contentValues.put("人均自控无效数",BigDecimal.valueOf(pcaInvalidTotalCount).divide(patientCount,2, RoundingMode.HALF_UP));
+            contentValues.put("人均自控数",patientCount.equals(BigDecimal.ZERO)?patientCount:BigDecimal.valueOf(total).divide(patientCount,2, RoundingMode.HALF_UP));
+            contentValues.put("人均自控有效数",patientCount.equals(BigDecimal.ZERO)?patientCount:BigDecimal.valueOf(pcaValidTotalCount).divide(patientCount,2, RoundingMode.HALF_UP));
+            contentValues.put("人均自控无效数",patientCount.equals(BigDecimal.ZERO)?patientCount:BigDecimal.valueOf(pcaInvalidTotalCount).divide(patientCount,2, RoundingMode.HALF_UP));
 
             contents.add(contentValues);
         });

+ 11 - 15
nb-system/src/main/resources/mapper/bus/BusInfusionHistoryMapper.xml

@@ -360,20 +360,15 @@
     </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
+        SELECT i.id AS infusion_id,
+        p.id AS patient_id,
+        MAX(h.total_append_dose) AS total_append_dose,
+        MAX(h.input_dose) AS input_dose,
+        MAX(h.continue_dose) AS continue_dose,
+        MAX(h.self_control_lock_time) AS self_control_lock_time,
+        MAX(h.pca_valid_count) AS pca_valid_count,
+        MAX(h.pca_invalid_count) AS pca_invalid_count,
+        MAX(h.upload_time) AS upload_time
         from (
         <include refid="commonInfusionQuery"/>
         ) as i
@@ -394,7 +389,8 @@
             </if>
         </where>
         ) as p on p.id = c.patient_id
-        join bus_device_history as h on h.infusion_id=i.id
+        join (select * from bus_device_history) as h on h.infusion_id=i.id
+        group by i.id,p.id,DATE_FORMAT(upload_time,'%Y-%m-%d')
     </select>
 
 

+ 4 - 1
nb-system/src/main/resources/mapper/bus/BusPatientMapper.xml

@@ -306,7 +306,7 @@
                 </foreach>
             </if>
             <if test="query.timeRange != null and query.timeRange.size >0">
-                and monitor_start_time &gt; #{query.timeRange[0]} and  monitor_start_time &lt; #{query.timeRange[1]}
+                and monitor_start_time &gt;= #{query.timeRange[0]} and  monitor_start_time &lt;= #{query.timeRange[1]}
             </if>
             <if test="query.tenantId!=null">
                 and tenant_id=#{query.tenantId}
@@ -340,6 +340,9 @@
                 <if test="query.deviceId!=null">
                     or i.device_id like concat('%', #{query.deviceId}, '%')
                 </if>
+                <if test="query.deviceAlias!=null">
+                    or d.alias like concat('%', #{query.deviceAlias}, '%')
+                </if>
             </where>
         </if>
         order by c.monitor_start_time desc