소스 검색

控制台-缺陷相关统计

zhaops 5 년 전
부모
커밋
a3868fef07

+ 30 - 0
src/main/java/com/diagbot/dto/ResultDetailDTO.java

@@ -0,0 +1,30 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/15 16:26
+ */
+@Getter
+@Setter
+public class ResultDetailDTO {
+    /**
+     * 缺陷名称/科室名称
+     */
+    private String name;
+    /**
+     * 数量
+     */
+    private Integer num;
+    /**
+     * 占比
+     */
+    private Double percent;
+    /**
+     * 百分比
+     */
+    private String percentStr;
+}

+ 17 - 0
src/main/java/com/diagbot/dto/ResultStatisticsDTO.java

@@ -0,0 +1,17 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/15 15:59
+ */
+@Getter
+@Setter
+public class ResultStatisticsDTO {
+    List<ResultDetailDTO> details;
+}

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

@@ -1,17 +1,26 @@
 package com.diagbot.facade;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.dto.ResultDetailDTO;
+import com.diagbot.dto.ResultStatisticsDTO;
 import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.entity.QcresultInfo;
 import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.FilterVO;
+import com.fasterxml.jackson.datatype.jsr310.DecimalUtils;
+import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -81,32 +90,32 @@ public class ConsoleFacade {
                     .size());
             retMap.put("本月甲级病历-人工", qcresultInfoList
                     .stream()
-                    .filter(i -> i.getGradeType().equals(2) && i.getLevel().equals("甲"))
+                    .filter(i -> i.getGradeType().equals(2) && i.getLevel().equals("甲"))
                     .collect(Collectors.toList())
                     .size());
             retMap.put("本月甲级病历-机器", qcresultInfoList
                     .stream()
-                    .filter(i -> i.getGradeType().equals(1) && i.getLevel().equals("甲"))
+                    .filter(i -> i.getGradeType().equals(1) && i.getLevel().equals("甲"))
                     .collect(Collectors.toList())
                     .size());
             retMap.put("本月乙级病历-人工", qcresultInfoList
                     .stream()
-                    .filter(i -> i.getGradeType().equals(2) && i.getLevel().equals("乙"))
+                    .filter(i -> i.getGradeType().equals(2) && i.getLevel().equals("乙"))
                     .collect(Collectors.toList())
                     .size());
             retMap.put("本月乙级病历-机器", qcresultInfoList
                     .stream()
-                    .filter(i -> i.getGradeType().equals(1) && i.getLevel().equals("乙"))
+                    .filter(i -> i.getGradeType().equals(1) && i.getLevel().equals("乙"))
                     .collect(Collectors.toList())
                     .size());
             retMap.put("本月不合格病历-人工", qcresultInfoList
                     .stream()
-                    .filter(i -> i.getGradeType().equals(2) && i.getLevel().equals("丙"))
+                    .filter(i -> i.getGradeType().equals(2) && i.getLevel().equals("丙"))
                     .collect(Collectors.toList())
                     .size());
             retMap.put("本月不合格病历-机器", qcresultInfoList
                     .stream()
-                    .filter(i -> i.getGradeType().equals(1) && i.getLevel().equals("丙"))
+                    .filter(i -> i.getGradeType().equals(1) && i.getLevel().equals("丙"))
                     .collect(Collectors.toList())
                     .size());
         }
@@ -115,4 +124,77 @@ public class ConsoleFacade {
 
     }
 
+    /**
+     * 缺陷相关统计
+     *
+     * @param filterVO
+     * @return
+     */
+    public Map<String, Object> resultStatistics(FilterVO filterVO) {
+        Map<String, Object> retMap = new LinkedHashMap<>();
+        retMap.put("缺陷排行列表", Lists.newLinkedList());
+        retMap.put("各科室缺陷占比", Lists.newLinkedList());
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        Date date = new Date();
+        String startDate = "";
+        String year = DateUtil.getYear(date);
+        int month = DateUtil.getMonth(date);
+        if (filterVO.getType().equals(1)) {
+            //本月统计
+            startDate = year + "-" + month + "-1";
+        } else if (filterVO.getType().equals(2)) {
+            //本年统计
+            startDate = year + "-1-1";
+        }
+        filterVO.setStartDate(startDate);
+        filterVO.setHospitalId(hospitalId);
+        filterVO.setLimitCount(10);
+        List<ResultDetailDTO> results = behospitalInfoFacade.resultStatistics(filterVO);
+        if (ListUtil.isNotEmpty(results)) {
+            results.forEach(result -> {
+                DecimalFormat df = new DecimalFormat("#.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)
+                        .min(BigDecimal.valueOf(rate))
+                        .doubleValue());
+                retResults.add(retResult);
+            }
+            retResults.forEach(result -> {
+                DecimalFormat df = new DecimalFormat("#.00");
+                String percentStr
+                        = df.format(BigDecimal.valueOf(result.getPercent()).multiply(BigDecimal.valueOf(100))) + "%";
+                result.setPercentStr(percentStr);
+            });
+            retMap.put("各科室缺陷占比", retResults);
+        }
+        return retMap;
+    }
 }

+ 18 - 0
src/main/java/com/diagbot/mapper/BehospitalInfoMapper.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.BehospitalInfoDTO;
 import com.diagbot.dto.MsgDTO;
+import com.diagbot.dto.ResultDetailDTO;
 import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
+import com.diagbot.vo.FilterVO;
 
 import java.util.List;
 
@@ -23,4 +25,20 @@ public interface BehospitalInfoMapper extends BaseMapper<BehospitalInfo> {
     public IPage<BehospitalInfoDTO> getPage(BehospitalPageVO behospitalPageVO);
 
     public List<MsgDTO> getMsg(AnalyzeVO analyzeVO);
+
+    /**
+     * 缺陷排行列表统计
+     *
+     * @param filterVO
+     * @return
+     */
+    public List<ResultDetailDTO> resultStatistics(FilterVO filterVO);
+
+    /**
+     * 各科室缺陷占比
+     *
+     * @param filterVO
+     * @return
+     */
+    public List<ResultDetailDTO> resultStatisticsByDept(FilterVO filterVO);
 }

+ 18 - 0
src/main/java/com/diagbot/service/BehospitalInfoService.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.diagbot.dto.BehospitalInfoDTO;
 import com.diagbot.dto.MsgDTO;
+import com.diagbot.dto.ResultDetailDTO;
 import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
+import com.diagbot.vo.FilterVO;
 
 import java.util.List;
 
@@ -23,4 +25,20 @@ public interface BehospitalInfoService extends IService<BehospitalInfo> {
     public IPage<BehospitalInfoDTO> getPage(BehospitalPageVO behospitalPageVO);
 
     public List<MsgDTO> getMsg(AnalyzeVO analyzeVO);
+
+    /**
+     * 缺陷排行列表统计
+     *
+     * @param filterVO
+     * @return
+     */
+    public List<ResultDetailDTO> resultStatistics(FilterVO filterVO);
+
+    /**
+     * 各科室缺陷占比
+     *
+     * @param filterVO
+     * @return
+     */
+    public List<ResultDetailDTO> resultStatisticsByDept(FilterVO filterVO);
 }

+ 25 - 1
src/main/java/com/diagbot/service/impl/BehospitalInfoServiceImpl.java

@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.diagbot.dto.BehospitalInfoDTO;
 import com.diagbot.dto.MsgDTO;
+import com.diagbot.dto.ResultDetailDTO;
 import com.diagbot.entity.BehospitalInfo;
 import com.diagbot.mapper.BehospitalInfoMapper;
 import com.diagbot.service.BehospitalInfoService;
 import com.diagbot.vo.AnalyzeVO;
 import com.diagbot.vo.BehospitalPageVO;
+import com.diagbot.vo.FilterVO;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -33,4 +35,26 @@ public class BehospitalInfoServiceImpl extends ServiceImpl<BehospitalInfoMapper,
     public List<MsgDTO> getMsg(AnalyzeVO analyzeVO) {
         return baseMapper.getMsg(analyzeVO);
     }
-}
+
+    /**
+     * 缺陷排行列表统计
+     *
+     * @param filterVO
+     * @return
+     */
+    @Override
+    public List<ResultDetailDTO> resultStatistics(FilterVO filterVO) {
+        return baseMapper.resultStatistics(filterVO);
+    }
+
+    /**
+     * 各科室缺陷占比
+     *
+     * @param filterVO
+     * @return
+     */
+    @Override
+    public List<ResultDetailDTO> resultStatisticsByDept(FilterVO filterVO) {
+        return baseMapper.resultStatisticsByDept(filterVO);
+    }
+}

+ 34 - 0
src/main/java/com/diagbot/vo/FilterVO.java

@@ -0,0 +1,34 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/15 16:04
+ */
+@Getter
+@Setter
+public class FilterVO {
+    /**
+     * 统计维度 1-本月,2-本年
+     */
+    private Integer type;
+    /**
+     * 起始时间
+     */
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    private String endDate;
+    /**
+     * 医院id
+     */
+    private String hospitalId;
+    /**
+     * 限制条数
+     */
+    private Integer limitCount;
+}

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

@@ -3,10 +3,12 @@ package com.diagbot.web;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.facade.ConsoleFacade;
+import com.diagbot.vo.FilterVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -34,4 +36,13 @@ public class ConsoleController {
         Map<String, Object> data = consoleFacade.mrStatistics();
         return RespDTO.onSuc(data);
     }
+
+    @ApiOperation(value = "缺陷相关统计[by:zhaops]",
+            notes = "")
+    @PostMapping("/resultStatistics")
+    @SysLogger("resultStatistics")
+    public RespDTO<Map<String, Object>> resultStatistics(@RequestBody FilterVO filterVO) {
+        Map<String, Object> data = consoleFacade.resultStatistics(filterVO);
+        return RespDTO.onSuc(data);
+    }
 }

+ 125 - 0
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -72,4 +72,129 @@
         order by a.order_no
     </select>
 
+
+    <!-- 缺陷排行列表 -->
+    <select id="resultStatistics"  parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.ResultDetailDTO">
+        SELECT
+        t1.msg AS name,
+        t1.num AS num,
+        round( t1.num / t2.totle, 4) AS percent
+        FROM
+        (
+        (
+        SELECT
+        c.msg,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_qcresult_info b,
+        med_qcresult_detail c
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND b.behospital_code = c.behospital_code
+        AND b.hospital_id = c.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= #{startDate}]]>
+        </if>
+        GROUP BY
+        c.msg
+        ORDER BY
+        count(*) DESC
+        ) t1,
+        (
+        SELECT
+        count(*) AS totle
+        FROM
+        med_behospital_info a,
+        med_qcresult_info b,
+        med_qcresult_detail c
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND b.behospital_code = c.behospital_code
+        AND b.hospital_id = c.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= #{startDate}]]>
+        </if>
+        ) t2
+        )
+        <if test="limitCount != null and limitCount != ''">
+            limit 0,#{limitCount}
+        </if>
+    </select>
+
+    <!-- 各科室缺陷占比 -->
+    <select id="resultStatisticsByDept"  parameterType="com.diagbot.vo.FilterVO" resultType="com.diagbot.dto.ResultDetailDTO">
+        SELECT
+        t1.beh_dept_name AS name,
+        t1.num AS num,
+        round( t1.num / t2.totle, 4 ) AS percent
+        FROM
+        (
+        (
+        SELECT
+        a.beh_dept_id,
+        a.beh_dept_name,
+        count(*) AS num
+        FROM
+        med_behospital_info a,
+        med_qcresult_info b,
+        med_qcresult_detail c
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND b.behospital_code = c.behospital_code
+        AND b.hospital_id = c.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= #{startDate}]]>
+        </if>
+        GROUP BY
+        a.beh_dept_id,
+        a.beh_dept_name
+        ORDER BY
+        count(*) DESC
+        ) t1,
+        (
+        SELECT
+        count(*) AS totle
+        FROM
+        med_behospital_info a,
+        med_qcresult_info b,
+        med_qcresult_detail c
+        WHERE
+        a.behospital_code = b.behospital_code
+        AND a.hospital_id = b.hospital_id
+        AND b.behospital_code = c.behospital_code
+        AND b.hospital_id = c.hospital_id
+        AND a.is_deleted = 'N'
+        AND b.is_deleted = 'N'
+        AND c.is_deleted = 'N'
+        <if test="hospitalId != null and hospitalId != ''">
+            AND a.hospital_id = #{hospitalId}
+        </if>
+        <if test="startDate != null and startDate != ''">
+            <![CDATA[ and a.leave_hospital_date >= #{startDate}]]>
+        </if>
+        ) t2
+        )
+    </select>
 </mapper>