ソースを参照

add:首页数据看板

Scott 2 年 前
コミット
203be97387

+ 10 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/HomePageController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.medical.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * @author Scott
  * @time 2023/10/17 20:14 星期二
@@ -51,6 +54,13 @@ public class HomePageController {
         return Result.OK(response);
     }
 
+    @ApiOperation(value="数据看板-事后项目占比排名-前五", notes="数据看板-事后项目占比排名-前五")
+    @GetMapping(value = "/statistics/after/pie/chart")
+    public Result<List<JSONObject>> loadStatisticsPieChart(@Param("startTime") String startTime, @Param("endTime") String endTime) {
+        List<JSONObject>  response = homePageService.loadStatisticsPieChart(startTime, endTime);
+        return Result.OK(response);
+    }
+
 
 }
 

+ 11 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IHomePageService.java

@@ -1,9 +1,12 @@
 package org.jeecg.modules.medical.service;
 
+import com.alibaba.fastjson.JSONObject;
 import org.jeecg.modules.medical.response.DashboardStatisticsBarResponse;
 import org.jeecg.modules.medical.response.DashboardStatisticsLineResponse;
 import org.jeecg.modules.medical.response.DashboardStatisticsViolateResponse;
 
+import java.util.List;
+
 /**
  * @author LENOVO
  * @time 2023/10/17 20:27 星期二
@@ -22,4 +25,12 @@ public interface IHomePageService {
      * @return
      */
     DashboardStatisticsViolateResponse loadStatisticsViolateRulesTop(String startTime, String endTime);
+
+    /**
+     * 事后项目占比排名-前五-饼形图
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<JSONObject> loadStatisticsPieChart(String startTime, String endTime);
 }

+ 295 - 23
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/HomePageServiceImpl.java

@@ -11,7 +11,6 @@ import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.sql.Array;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -27,30 +26,64 @@ public class HomePageServiceImpl implements IHomePageService {
 
     @Override
     public DashboardStatisticsBarResponse loadStatisticsBar(String startTime, String endTime) {
+        DashboardStatisticsBarResponse sourceData = getSourceData();
+
         DashboardStatisticsBarResponse result = new DashboardStatisticsBarResponse();
-        result.setSwipesTotal(300);
-        result.setBeforeReminderTotal(260);
-        result.setFormulaTotal(280);
-        result.setMiddleReviewTotal(100);
-        result.setViolationAmountTotal(new BigDecimal("2880.05"));
-        result.setAfterSupervisoryTotal(90);
+        result.setSwipesTotal(sourceData.getSwipesTotal());
+        result.setBeforeReminderTotal(sourceData.getBeforeReminderTotal());
+        result.setFormulaTotal(sourceData.getFormulaTotal());
+        result.setMiddleReviewTotal(sourceData.getMiddleReviewTotal());
+        result.setViolationAmountTotal(sourceData.getViolationAmountTotal());
+        result.setAfterSupervisoryTotal(sourceData.getAfterSupervisoryTotal());
 
         Date startTimeDate = DateTimeUtil.parse(startTime, DateTimeUtil.FULL_STYLE);
         Date endTimeDate = DateTimeUtil.parse(endTime, DateTimeUtil.FULL_STYLE);
 
         long diffDay = DateTimeUtil.subDay(startTimeDate, endTimeDate);
+
         if (diffDay > 0) {
-            BigDecimal factor = getFactoryValue(diffDay);
-            result.setSwipesTotal(new BigDecimal(result.getSwipesTotal()).multiply(factor).intValue());
-            result.setBeforeReminderTotal(new BigDecimal(result.getBeforeReminderTotal()).multiply(factor).intValue());
-            result.setFormulaTotal(new BigDecimal(result.getFormulaTotal()).multiply(factor).intValue());
-            result.setMiddleReviewTotal(new BigDecimal(result.getMiddleReviewTotal()).multiply(factor).intValue());
-            result.setViolationAmountTotal(new BigDecimal(String.valueOf(result.getViolationAmountTotal())).multiply(factor).setScale(2, BigDecimal.ROUND_HALF_UP));
-            result.setAfterSupervisoryTotal(new BigDecimal(result.getAfterSupervisoryTotal()).multiply(factor).intValue());
+            for (int i = 0; i <= diffDay; i++) {
+                Date ss = DateTimeUtil.addDay(startTimeDate, (long) i);
+
+                BigDecimal factor = new BigDecimal("1");
+                if (i > 0) {
+                    factor = getFactoryValue(i);
+                }
+
+                int t1 = new BigDecimal(sourceData.getSwipesTotal()).multiply(factor).intValue();
+                result.setSwipesTotal(result.getSwipesTotal() + t1);
+
+                int t2 = new BigDecimal(sourceData.getBeforeReminderTotal()).multiply(factor).intValue();
+                result.setBeforeReminderTotal(result.getBeforeReminderTotal() + t2);
+
+                int t3 = new BigDecimal(sourceData.getFormulaTotal()).multiply(factor).intValue();
+                result.setFormulaTotal(result.getFormulaTotal() + t3);
+
+                int t4 = new BigDecimal(sourceData.getMiddleReviewTotal()).multiply(factor).intValue();
+                result.setMiddleReviewTotal(result.getMiddleReviewTotal() + t4);
+
+                BigDecimal t5 = new BigDecimal(String.valueOf(sourceData.getViolationAmountTotal())).multiply(factor).setScale(2, BigDecimal.ROUND_HALF_UP);
+                result.setViolationAmountTotal(result.getViolationAmountTotal().add(t5));
+
+                int t6 = new BigDecimal(sourceData.getAfterSupervisoryTotal()).multiply(factor).intValue();
+                result.setAfterSupervisoryTotal(result.getAfterSupervisoryTotal() + t6);
+            }
         }
+
         return result;
     }
 
+    private static DashboardStatisticsBarResponse getSourceData() {
+        DashboardStatisticsBarResponse sourceData = new DashboardStatisticsBarResponse();
+        sourceData.setSwipesTotal(300);
+        sourceData.setBeforeReminderTotal(260);
+        sourceData.setFormulaTotal(280);
+        sourceData.setMiddleReviewTotal(100);
+        sourceData.setViolationAmountTotal(new BigDecimal("2880.05"));
+        sourceData.setAfterSupervisoryTotal(90);
+        return sourceData;
+    }
+
 
     /**
      * 根据天数获取因子数
@@ -150,12 +183,254 @@ public class HomePageServiceImpl implements IHomePageService {
     @Override
     public DashboardStatisticsViolateResponse loadStatisticsViolateRulesTop(String startTime, String endTime) {
         DashboardStatisticsBarResponse sourceData = this.loadStatisticsBar(startTime, endTime);
-
         DashboardStatisticsViolateResponse result = new DashboardStatisticsViolateResponse();
-        Date startTimeDate = DateTimeUtil.parse(startTime, DateTimeUtil.FULL_STYLE);
-        Date endTimeDate = DateTimeUtil.parse(endTime, DateTimeUtil.FULL_STYLE);
-        long diffDay = DateTimeUtil.subDay(startTimeDate, endTimeDate);
+//        Date startTimeDate = DateTimeUtil.parse(startTime, DateTimeUtil.FULL_STYLE);
+//        Date endTimeDate = DateTimeUtil.parse(endTime, DateTimeUtil.FULL_STYLE);
+//        long diffDay = DateTimeUtil.subDay(startTimeDate, endTimeDate);
+
+        // 生成事前规则类型排名
+        DashboardStatisticsDetailedItem beforeRulesTop = generateBeforeRuleTop(sourceData);
+        // 生成事中规则类型排名
+        DashboardStatisticsDetailedItem middleRulesTop = generateMiddleRuleTop(sourceData);
+        // 生成事后规则类型排名
+        DashboardStatisticsDetailedItem afterRulesTop = generateAfterRuleTop(sourceData);
+        // 生成事中医生违规数排名前五
+        DashboardStatisticsDetailedItem middleDoctorsViolateTop = generateMiddleDoctorsViolateTop(sourceData);
+        // 生成事后医生违规数排名前五
+        DashboardStatisticsDetailedItem afterDoctorsViolateTop = generateAfterDoctorsViolateTop(sourceData);
+
+        result.setBeforeRulesTop(beforeRulesTop);
+        result.setMiddleRulesTop(middleRulesTop);
+        result.setAfterRulesTop(afterRulesTop);
+        result.setMiddleDoctorsViolateTop(middleDoctorsViolateTop);
+        result.setAfterDoctorsViolateTop(afterDoctorsViolateTop);
+
+        return result;
+    }
+
+    @Override
+    public List<JSONObject> loadStatisticsPieChart(String startTime, String endTime) {
+        List<JSONObject> result = new ArrayList<>();
+
+        DashboardStatisticsBarResponse sourceData = this.loadStatisticsBar(startTime, endTime);
+
+        Integer afterSupervisoryTotal = sourceData.getAfterSupervisoryTotal();
+
+        BigDecimal top1 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.25")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top2 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.13")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top3 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.15")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top4 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.11")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top5 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.05")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+
+        JSONObject item1 = new JSONObject();
+        item1.put("name", "心电图检查");
+        item1.put("value", top1);
+        result.add(item1);
+
+        JSONObject item2 = new JSONObject();
+        item2.put("name", "血塞通注射液");
+        item2.put("value", top2);
+        result.add(item2);
+
+        JSONObject item3 = new JSONObject();
+        item3.put("name", "血压检查");
+        item3.put("value", top3);
+        result.add(item3);
+
+        JSONObject item4 = new JSONObject();
+        item4.put("name", "血常规检查");
+        item4.put("value", top4);
+        result.add(item4);
+
+        JSONObject item5 = new JSONObject();
+        item5.put("name", "脉络宁注射液");
+        item5.put("value", top5);
+        result.add(item5);
+
+        return result;
+    }
+
+    /**
+     * 事后医生违规数排名前五
+     * @param sourceData
+     * @return
+     */
+    private DashboardStatisticsDetailedItem generateAfterDoctorsViolateTop(DashboardStatisticsBarResponse sourceData) {
+        DashboardStatisticsDetailedItem afterDoctorsViolateTop = new DashboardStatisticsDetailedItem();
+        afterDoctorsViolateTop.setTitle("事中医生违规数排名前五");
+        ArrayList<JSONObject> rule1 = new ArrayList<>();
+
+        Integer afterSupervisoryTotal = sourceData.getAfterSupervisoryTotal();
+        BigDecimal top1 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.25")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top2 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.13")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top3 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.15")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top4 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.11")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top5 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.03")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+
+        JSONObject item1 = new JSONObject();
+        item1.put("title", "陈晓利");
+        item1.put("total", top1);
+        rule1.add(item1);
+
+        JSONObject item2 = new JSONObject();
+        item2.put("title", "赵科林");
+        item2.put("total", top2);
+        rule1.add(item2);
+
+        JSONObject item3 = new JSONObject();
+        item3.put("title", "张鸿飞");
+        item3.put("total", top3);
+        rule1.add(item3);
+
+        JSONObject item4 = new JSONObject();
+        item4.put("title", "刘晓芳");
+        item4.put("total", top4);
+        rule1.add(item4);
+
+        JSONObject item5 = new JSONObject();
+        item5.put("title", "张利");
+        item5.put("total", top5);
+        rule1.add(item5);
+
+        afterDoctorsViolateTop.setList(rule1);
+        return afterDoctorsViolateTop;
+    }
+
+    /**
+     * 生成事中医生违规数排名
+     * @param sourceData
+     * @return
+     */
+    private DashboardStatisticsDetailedItem generateMiddleDoctorsViolateTop(DashboardStatisticsBarResponse sourceData) {
+        DashboardStatisticsDetailedItem middleDoctorsViolateTop = new DashboardStatisticsDetailedItem();
+        middleDoctorsViolateTop.setTitle("事中医生违规数排名前五");
+        ArrayList<JSONObject> rule1 = new ArrayList<>();
+        // 事中提醒总和
+        Integer middleReviewTotal = sourceData.getMiddleReviewTotal();
+        BigDecimal top1 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.25")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top2 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.13")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top3 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.15")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top4 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.11")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top5 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.05")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+
+        JSONObject item1 = new JSONObject();
+        item1.put("title", "陈晓利");
+        item1.put("total", top1);
+        rule1.add(item1);
+
+        JSONObject item2 = new JSONObject();
+        item2.put("title", "张鸿飞");
+        item2.put("total", top2);
+        rule1.add(item2);
+
+        JSONObject item3 = new JSONObject();
+        item3.put("title", "赵科林");
+        item3.put("total", top3);
+        rule1.add(item3);
+
+        JSONObject item4 = new JSONObject();
+        item4.put("title", "刘晓芳");
+        item4.put("total", top4);
+        rule1.add(item4);
+
+        JSONObject item5 = new JSONObject();
+        item5.put("title", "张利");
+        item5.put("total", top5);
+        rule1.add(item5);
+        middleDoctorsViolateTop.setList(rule1);
+        return middleDoctorsViolateTop;
+    }
+
+    /**
+     * 生成事后规则类型排名
+     * @param sourceData
+     * @return
+     */
+    private DashboardStatisticsDetailedItem generateAfterRuleTop(DashboardStatisticsBarResponse sourceData) {
+        DashboardStatisticsDetailedItem afterRulesTop = new DashboardStatisticsDetailedItem();
+        afterRulesTop.setTitle("事后规则类型排名");
+        ArrayList<JSONObject> rule1 = new ArrayList<>();
+        Integer afterSupervisoryTotal = sourceData.getAfterSupervisoryTotal();
+        BigDecimal top1 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.25")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top2 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.13")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top3 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.15")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top4 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.11")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top5 = new BigDecimal(afterSupervisoryTotal).multiply(new BigDecimal("0.05")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+
+        JSONObject item1 = new JSONObject();
+        item1.put("title", "不合理住院");
+        item1.put("total", top1);
+        rule1.add(item1);
+
+        JSONObject item2 = new JSONObject();
+        item2.put("title", "仅有I级护理病例统计");
+        item2.put("total", top2);
+        rule1.add(item2);
 
+        JSONObject item3 = new JSONObject();
+        item3.put("title", "限生育保险");
+        item3.put("total", top3);
+        rule1.add(item3);
+
+        JSONObject item4 = new JSONObject();
+        item4.put("title", "非医保支付中药引片");
+        item4.put("total", top4);
+        rule1.add(item4);
+
+        JSONObject item5 = new JSONObject();
+        item5.put("title", "不合理用药"); //TODO 等待数据
+        item5.put("total", top5);
+        rule1.add(item5);
+        afterRulesTop.setList(rule1);
+        return afterRulesTop;
+    }
+
+    /**
+     * 生成事中规则类型排名
+     * @param sourceData
+     * @return
+     */
+    private DashboardStatisticsDetailedItem generateMiddleRuleTop(DashboardStatisticsBarResponse sourceData) {
+        DashboardStatisticsDetailedItem middleRulesTop = new DashboardStatisticsDetailedItem();
+        middleRulesTop.setTitle("事中规则类型排名");
+        ArrayList<JSONObject> rule1 = new ArrayList<>();
+
+        Integer middleReviewTotal = sourceData.getMiddleReviewTotal();
+        BigDecimal top1 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.23")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top2 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.16")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top3 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.14")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top4 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.11")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top5 = new BigDecimal(middleReviewTotal).multiply(new BigDecimal("0.05")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+
+        JSONObject item1 = new JSONObject();
+        item1.put("title", "限适应症和支付疗程(药品)");
+        item1.put("total", top1);
+        rule1.add(item1);
+
+        JSONObject item2 = new JSONObject();
+        item2.put("title", "限适应症(药品)");
+        item2.put("total", top2);
+        rule1.add(item2);
+
+        JSONObject item3 = new JSONObject();
+        item3.put("title", "限医院等级适应症疗程(药品)");
+        item3.put("total", top3);
+        rule1.add(item3);
+
+        JSONObject item4 = new JSONObject();
+        item4.put("title", "限病种(药品)");
+        item4.put("total", top4);
+        rule1.add(item4);
+
+        JSONObject item5 = new JSONObject();
+        item5.put("title", "限适应症"); //TODO 等待数据
+        item5.put("total", top5);
+        rule1.add(item5);
+        middleRulesTop.setList(rule1);
+        return middleRulesTop;
+    }
+
+    private static DashboardStatisticsDetailedItem generateBeforeRuleTop(DashboardStatisticsBarResponse sourceData) {
         // 生成事前规则类型排名
         DashboardStatisticsDetailedItem beforeRulesTop = new DashboardStatisticsDetailedItem();
         beforeRulesTop.setTitle("事前规则类型排名");
@@ -166,7 +441,7 @@ public class HomePageServiceImpl implements IHomePageService {
         BigDecimal top2 = new BigDecimal(beforeReminderTotal).multiply(new BigDecimal("0.17")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
         BigDecimal top3 = new BigDecimal(beforeReminderTotal).multiply(new BigDecimal("0.14")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
         BigDecimal top4 = new BigDecimal(beforeReminderTotal).multiply(new BigDecimal("0.11")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
-        BigDecimal top5 = new BigDecimal(beforeReminderTotal).multiply(new BigDecimal("0.3")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
+        BigDecimal top5 = new BigDecimal(beforeReminderTotal).multiply(new BigDecimal("0.03")).setScale(0, BigDecimal.ROUND_HALF_DOWN);
         JSONObject item1 = new JSONObject();
         item1.put("title", "频繁门诊");
         item1.put("total", top1);
@@ -193,9 +468,6 @@ public class HomePageServiceImpl implements IHomePageService {
         rule1.add(item5);
 
         beforeRulesTop.setList(rule1);
-        result.setBeforeRulesTop(beforeRulesTop);
-
-
-        return result;
+        return beforeRulesTop;
     }
 }