zhaops 5 роки тому
батько
коміт
a5503611e3

+ 2 - 2
src/main/java/com/diagbot/aggregate/DeptStatisticsAggregate.java

@@ -72,14 +72,14 @@ public class DeptStatisticsAggregate {
                 result.setPercent(percent);
             });
             List<ResultDetailDTO> retResults = Lists.newLinkedList();
-            if (results2.size() <= 6) {
+            if (results2.size() <= 10) {
                 retResults = BeanUtil.listCopyTo(results2, ResultDetailDTO.class);
             } else {
 
                 Double rate = 0d;
                 Integer num = 0;
                 for (ResultDetailDTO result : results2) {
-                    if (retResults.size() < 5) {
+                    if (retResults.size() < 9) {
                         rate = BigDecimal.valueOf(rate)
                                 .add(BigDecimal.valueOf(Double.valueOf(result.getPercent())))
                                 .doubleValue();

+ 75 - 4
src/main/java/com/diagbot/aggregate/ResultStatisticsAggregate.java

@@ -1,10 +1,15 @@
 package com.diagbot.aggregate;
 
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.ResultDetailDTO;
 import com.diagbot.facade.BehospitalInfoFacade;
+import com.diagbot.facade.QcCasesFacade;
+import com.diagbot.facade.QcresultInfoFacade;
 import com.diagbot.util.BeanUtil;
+import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.vo.FilterVO;
+import com.diagbot.vo.QcresultFilterVO;
 import com.google.common.collect.Lists;
 import io.github.lvyahui8.spring.annotation.DataConsumer;
 import io.github.lvyahui8.spring.annotation.DataProvider;
@@ -15,9 +20,12 @@ import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description:缺陷相关统计
@@ -28,16 +36,23 @@ import java.util.Map;
 public class ResultStatisticsAggregate {
     @Autowired
     private BehospitalInfoFacade behospitalInfoFacade;
+    @Autowired
+    private QcresultInfoFacade qcresultInfoFacade;
+    @Autowired
+    private QcCasesFacade qcCasesFacade;
 
     @DataProvider("setAllResult")
     public Map<String, Object> setAllResult(
             @InvokeParameter("filterVO") FilterVO filterVO,
-            @DataConsumer("getResult") List<ResultDetailDTO> results) {
+            @DataConsumer("getResult") List<ResultDetailDTO> results,
+            @DataConsumer("entryCountGroupByCase") List<NumDTO> entryNums) {
         Map<String, Object> retMap = new LinkedHashMap<>();
+        if (ListUtil.isNotEmpty(entryNums)) {
+            retMap.put("各模块缺陷占比排行", entryNums);
+        }
         if (ListUtil.isNotEmpty(results)) {
-            retMap.put("缺陷排行列表", results);
+            retMap.put("条目缺陷占比", results);
         }
-
         return retMap;
     }
 
@@ -60,8 +75,10 @@ public class ResultStatisticsAggregate {
                 String percentStr
                         = df.format(BigDecimal.valueOf(result.getPercent()).multiply(BigDecimal.valueOf(100))) + "%";
                 result.setPercentStr(percentStr);
+                //top9+其他
                 if (retResutls.size() < 10) {
                     retResutls.add(result);
+                } else {
                 }
 
             });
@@ -71,4 +88,58 @@ public class ResultStatisticsAggregate {
         return null;
     }
 
-}
+    @DataProvider("entryCountGroupByCase")
+    public List<NumDTO> entryCountGroupByCase(@InvokeParameter("filterVO") FilterVO filterVO) {
+        QcresultFilterVO qcresultFilterVO = new QcresultFilterVO();
+        BeanUtil.copyProperties(filterVO, qcresultFilterVO);
+        int mrNum = qcresultInfoFacade.resultCount(qcresultFilterVO);
+        List<NumDTO> qcEntryNumList = qcresultInfoFacade.entryCountGroupByCase(filterVO);
+        List<NumDTO> standardEntryNumList = qcCasesFacade.entryGroupByCase();
+        if (ListUtil.isEmpty(qcEntryNumList)) {
+            standardEntryNumList.forEach(entryNum -> {
+                Integer totleNum = entryNum.getNum() * mrNum;
+                entryNum.setPercent(0d);
+                entryNum.setPercentStr("0%");
+                entryNum.setTotleNum(totleNum);
+            });
+        } else {
+            Map<Long, Integer> qcEntryNumMap
+                    = EntityUtil.makeMapWithKeyValue(qcEntryNumList, "id", "num");
+            if (ListUtil.isNotEmpty(standardEntryNumList)) {
+                standardEntryNumList.forEach(entryNum -> {
+                    Integer totleNum = entryNum.getNum() * mrNum;
+                    if (qcEntryNumMap.containsKey(entryNum.getId())) {
+                        Double percent = BigDecimal.valueOf(entryNum.getNum())
+                                .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
+                                .doubleValue();
+                        DecimalFormat df = new DecimalFormat("#0.00");
+                        String percentStr
+                                = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
+                        entryNum.setTotleNum(totleNum);
+                        entryNum.setPercent(percent);
+                        entryNum.setPercentStr(percentStr);
+                    } else {
+                        entryNum.setPercent(0d);
+                        entryNum.setPercentStr("0%");
+                        entryNum.setTotleNum(totleNum);
+                    }
+                });
+            }
+            //降序排序
+            Collections.sort(standardEntryNumList, new Comparator<NumDTO>() {
+                @Override
+                public int compare(NumDTO o1, NumDTO o2) {
+                    return o2.getPercent().compareTo(o1.getPercent());
+                }
+            });
+        }
+
+        //取top10
+        standardEntryNumList = standardEntryNumList
+                .stream()
+                .limit(10)
+                .collect(Collectors.toList());
+
+        return standardEntryNumList;
+    }
+}

+ 2 - 0
src/main/java/com/diagbot/dto/NumDTO.java

@@ -11,6 +11,8 @@ import lombok.Setter;
 @Getter
 @Setter
 public class NumDTO {
+    private Long id;
+    private String name;
     private Integer totleNum;
     private Integer num;
     private Double percent;

+ 6 - 60
src/main/java/com/diagbot/facade/ConsoleFacade.java

@@ -1,25 +1,15 @@
 package com.diagbot.facade;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.diagbot.dto.AverageStatisticsDTO;
 import com.diagbot.dto.NumDTO;
-import com.diagbot.dto.QcResultPercentDTO;
-import com.diagbot.dto.SysRoleDTO;
-import com.diagbot.dto.SysUserRoleDTO;
-import com.diagbot.entity.BehospitalInfo;
-import com.diagbot.entity.SysRole;
-import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
-import com.diagbot.util.EntityUtil;
-import com.diagbot.util.ListUtil;
 import com.diagbot.util.SysUserUtils;
 import com.diagbot.vo.FilterVO;
 import com.diagbot.vo.HomePageFilterVO;
 import com.diagbot.vo.QcresultFilterVO;
-import com.diagbot.vo.SysUserBaseVO;
 import com.google.common.collect.Lists;
 import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,7 +23,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -108,9 +97,11 @@ public class ConsoleFacade {
         qcresultFilterVO.setLevel("丙");
         int thirdLevelNum = qcresultInfoFacade.resultCount(qcresultFilterVO);
         NumDTO totleNumDTO = new NumDTO();
+        totleNumDTO.setName("累计质控病历数");
         totleNumDTO.setTotleNum(totleNum);
         totleNumDTO.setNum(totleNum);
         NumDTO firstLevelNumDTO = new NumDTO();
+        firstLevelNumDTO.setName("甲级病历");
         firstLevelNumDTO.setNum(firstLevelNum);
         firstLevelNumDTO.setTotleNum(totleNum);
         Double firstPercent = BigDecimal.valueOf(firstLevelNum)
@@ -120,6 +111,7 @@ public class ConsoleFacade {
         firstLevelNumDTO.setPercent(firstPercent);
         firstLevelNumDTO.setPercentStr(firstPercentStr);
         NumDTO secondLevelNumDTO = new NumDTO();
+        secondLevelNumDTO.setName("乙级病历");
         secondLevelNumDTO.setNum(secondLevelNum);
         secondLevelNumDTO.setTotleNum(totleNum);
         Double secondPercent = BigDecimal.valueOf(secondLevelNum)
@@ -129,6 +121,7 @@ public class ConsoleFacade {
         secondLevelNumDTO.setPercent(secondPercent);
         secondLevelNumDTO.setPercentStr(secondPercentStr);
         NumDTO thirdLevelNumDTO = new NumDTO();
+        thirdLevelNumDTO.setName("丙级病历");
         thirdLevelNumDTO.setNum(thirdLevelNum);
         thirdLevelNumDTO.setTotleNum(totleNum);
         Double thirdPercent = BigDecimal.valueOf(1)
@@ -182,59 +175,12 @@ public class ConsoleFacade {
      */
     public Map<String, Object> resultStatistics(FilterVO filterVO) {
         Map<String, Object> retMap = new LinkedHashMap<>();
-        retMap.put("缺陷排行列表", Lists.newLinkedList());
-        retMap.put("各科室缺陷占比", Lists.newLinkedList());
+        retMap.put("各模块缺陷占比排行", Lists.newLinkedList());
+        retMap.put("条目缺陷占比", Lists.newLinkedList());
         String hospitalId = SysUserUtils.getCurrentHospitalID();
         String startDate = getStartDateStr(filterVO.getType());
         filterVO.setStartDate(startDate);
         filterVO.setHospitalId(hospitalId);
-        /*if (filterVO.getLimitCount() == null || filterVO.getLimitCount().equals(0)) {
-            filterVO.setLimitCount(10);
-        }*/
-        //        List<ResultDetailDTO> results = behospitalInfoFacade.resultStatistics(filterVO);
-        //        if (ListUtil.isNotEmpty(results)) {
-        //            results.forEach(result -> {
-        //                DecimalFormat df = new DecimalFormat("#0.00");
-        //                String percentStr
-        //                        = df.format(BigDecimal.valueOf(result.getPercent()).multiply(BigDecimal.valueOf(100))) + "%";
-        //                result.setPercentStr(percentStr);
-        //            });
-        //            retMap.put("缺陷排行列表", results);
-        //        }
-        //        List<ResultDetailDTO> results2 = behospitalInfoFacade.resultStatisticsByDept(filterVO);
-        //        if (ListUtil.isNotEmpty(results2)) {
-        //            List<ResultDetailDTO> retResults = Lists.newLinkedList();
-        //            if (results2.size() <= 6) {
-        //                retResults = BeanUtil.listCopyTo(results2, ResultDetailDTO.class);
-        //            } else {
-        //
-        //                Double rate = 0d;
-        //                Integer num = 0;
-        //                for (ResultDetailDTO result : results2) {
-        //                    if (retResults.size() < 5) {
-        //                        rate = BigDecimal.valueOf(rate)
-        //                                .add(BigDecimal.valueOf(Double.valueOf(result.getPercent())))
-        //                                .doubleValue();
-        //                        retResults.add(result);
-        //                    } else {
-        //                        num += result.getNum();
-        //                    }
-        //                }
-        //                ResultDetailDTO retResult = new ResultDetailDTO();
-        //                retResult.setName("其他");
-        //                retResult.setNum(num);
-        //                retResult.setPercent(BigDecimal.valueOf(1).subtract(BigDecimal.valueOf(rate)).doubleValue());
-        //                retResults.add(retResult);
-        //            }
-        //            retResults.forEach(result -> {
-        //                DecimalFormat df = new DecimalFormat("#0.00");
-        //                String percentStr
-        //                        = df.format(BigDecimal.valueOf(result.getPercent()).multiply(BigDecimal.valueOf(100))) + "%";
-        //                result.setPercentStr(percentStr);
-        //            });
-        //            retMap.put("各科室缺陷占比", retResults);
-        //        }
-
         try {
             Map<String, Object> invokeParams = new HashMap<>();
             invokeParams.put("filterVO", filterVO);

+ 8 - 0
src/main/java/com/diagbot/mapper/QcCasesMapper.java

@@ -1,6 +1,7 @@
 package com.diagbot.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcCasesDTO;
 import com.diagbot.entity.QcCases;
 import com.diagbot.vo.QcCasesQueryVO;
@@ -17,4 +18,11 @@ import java.util.List;
  */
 public interface QcCasesMapper extends BaseMapper<QcCases> {
     List<QcCasesDTO> getQcCases(QcCasesQueryVO queryVO);
+
+    /**
+     * 按模块统计条目数
+     *
+     * @return
+     */
+    List<NumDTO> entryGroupByCase();
 }

+ 10 - 1
src/main/java/com/diagbot/mapper/QcresultInfoMapper.java

@@ -1,6 +1,7 @@
 package com.diagbot.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.vo.FilterVO;
@@ -42,4 +43,12 @@ public interface QcresultInfoMapper extends BaseMapper<QcresultInfo> {
      * @return
      */
     public List<QcResultPercentDTO> levelPercentGroupByDept(FilterVO filterVO);
-}
+
+    /**
+     * 按模块统计缺陷数
+     *
+     * @param filterVO
+     * @return
+     */
+    public List<NumDTO> entryCountGroupByCase(FilterVO filterVO);
+}

+ 9 - 1
src/main/java/com/diagbot/service/QcCasesService.java

@@ -1,6 +1,7 @@
 package com.diagbot.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcCasesDTO;
 import com.diagbot.entity.QcCases;
 import com.diagbot.vo.QcCasesQueryVO;
@@ -17,4 +18,11 @@ import java.util.List;
  */
 public interface QcCasesService extends IService<QcCases> {
     List<QcCasesDTO> getQcCases(QcCasesQueryVO queryVO);
-}
+
+    /**
+     * 按模块统计条目数
+     *
+     * @return
+     */
+    List<NumDTO> entryGroupByCase();
+}

+ 10 - 1
src/main/java/com/diagbot/service/QcresultInfoService.java

@@ -1,6 +1,7 @@
 package com.diagbot.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.vo.FilterVO;
@@ -43,4 +44,12 @@ public interface QcresultInfoService extends IService<QcresultInfo> {
      * @return
      */
     public List<QcResultPercentDTO> levelPercentGroupByDept(FilterVO filterVO);
-}
+
+    /**
+     * 按模块统计缺陷数
+     *
+     * @param filterVO
+     * @return
+     */
+    public List<NumDTO> entryCountGroupByCase(FilterVO filterVO);
+}

+ 11 - 0
src/main/java/com/diagbot/service/impl/QcCasesServiceImpl.java

@@ -1,6 +1,7 @@
 package com.diagbot.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcCasesDTO;
 import com.diagbot.entity.QcCases;
 import com.diagbot.mapper.QcCasesMapper;
@@ -24,4 +25,14 @@ public class QcCasesServiceImpl extends ServiceImpl<QcCasesMapper, QcCases> impl
     public List<QcCasesDTO> getQcCases(QcCasesQueryVO queryVO) {
         return baseMapper.getQcCases(queryVO);
     }
+
+    /**
+     * 按模块统计条目数
+     *
+     * @return
+     */
+    @Override
+    public List<NumDTO> entryGroupByCase() {
+        return baseMapper.entryGroupByCase();
+    }
 }

+ 13 - 1
src/main/java/com/diagbot/service/impl/QcresultInfoServiceImpl.java

@@ -1,6 +1,7 @@
 package com.diagbot.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcResultPercentDTO;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.mapper.QcresultInfoMapper;
@@ -56,4 +57,15 @@ public class QcresultInfoServiceImpl extends ServiceImpl<QcresultInfoMapper, Qcr
     public List<QcResultPercentDTO> levelPercentGroupByDept(FilterVO filterVO) {
         return baseMapper.levelPercentGroupByDept(filterVO);
     }
-}
+
+    /**
+     * 按模块统计缺陷数
+     *
+     * @param filterVO
+     * @return
+     */
+    @Override
+    public List<NumDTO> entryCountGroupByCase(FilterVO filterVO) {
+        return baseMapper.entryCountGroupByCase(filterVO);
+    }
+}

+ 18 - 0
src/main/java/com/diagbot/web/ConsoleController.java

@@ -54,4 +54,22 @@ public class ConsoleController {
         Map<String, Object> data = consoleFacade.averageStatistics(filterVO);
         return RespDTO.onSuc(data);
     }
+
+    @ApiOperation(value = "科室相关统计[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/deptStatistics")
+    @SysLogger("deptStatistics")
+    public RespDTO<Map<String, Object>> deptStatistics(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleFacade.deptStatistics(filterVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "出院相关统计[by:zhaops]",
+            notes = "type: 统计维度 1-本月,2-本年(必填)<br>")
+    @PostMapping("/leaveHosStatistics")
+    @SysLogger("leaveHosStatistics")
+    public RespDTO<Map<String, Object>> leaveHosStatistics(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleFacade.leaveHosStatistics(filterVO);
+        return RespDTO.onSuc(data);
+    }
 }

+ 18 - 0
src/main/resources/mapper/QcCasesMapper.xml

@@ -32,4 +32,22 @@
             and qch.hospital_id = #{hospitalId}
         </if>
     </select>
+
+    <!-- 按模块统计条目数 -->
+    <select id="entryGroupByCase" resultType="com.diagbot.dto.NumDTO">
+        SELECT
+        a.id,
+        a.NAME,
+        count(*) AS num
+        FROM
+        qc_cases a,
+        qc_cases_entry b
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND a.id = b.cases_id
+        GROUP BY
+        a.id,
+        a.`name`
+    </select>
 </mapper>

+ 42 - 0
src/main/resources/mapper/QcresultInfoMapper.xml

@@ -115,4 +115,46 @@
         a.beh_dept_name
     </select>
 
+    <!-- 按模块统计质控缺陷数 -->
+    <select id="entryCountGroupByCase" parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.NumDTO">
+        SELECT
+        d.cases_id AS id,
+        e.NAME AS name,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_home_page b,
+        med_qcresult_info c,
+        med_qcresult_detail d,
+        qc_cases e,
+        qc_cases_entry f
+        WHERE
+        a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        AND d.is_deleted = 'N'
+        AND e.is_deleted = 'N'
+        AND f.is_deleted = 'N'
+        AND a.hospital_id = b.hospital_id
+        AND a.hospital_id = c.hospital_id
+        AND a.hospital_id = d.hospital_id
+        AND a.behospital_code = b.behospital_code
+        AND a.behospital_code = c.behospital_code
+        AND a.behospital_code = d.behospital_code
+        AND d.cases_id = e.id
+        AND d.cases_entry_id = f.id
+        AND e.id = f.cases_id
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.behospital_date >= DATE(#{startDate})]]>
+        </if>
+        <if test="endDate != null and endDate != ''">
+            <![CDATA[AND a.leave_hospital_date < DATE(#{endDate})]]>
+        </if>
+        GROUP BY
+        d.cases_id,
+        e.`name`
+    </select>
 </mapper>