浏览代码

Merge branch '2.0' of suqinyi/wlyy2.0 into 2.0

suqinyi 2 年之前
父节点
当前提交
ddb1ea2c86

+ 714 - 13
business/es-service/src/main/java/com/yihu/jw/es/service/StatisticsEsService.java

@ -15,6 +15,7 @@ import com.yihu.jw.es.util.ElasticsearchUtil;
import com.yihu.jw.es.util.SaveModel;
import com.yihu.jw.es.util.SaveModel;
import com.yihu.jw.evaluate.score.service.BaseEvaluateScoreService;
import com.yihu.jw.evaluate.score.service.BaseEvaluateScoreService;
import com.yihu.jw.org.dao.BaseOrgDao;
import com.yihu.jw.org.dao.BaseOrgDao;
import com.yihu.jw.restmodel.hospital.statistics.ScreenQvo;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.utils.hibernate.HibenateUtils;
import com.yihu.jw.utils.hibernate.HibenateUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.StringUtils;
@ -26,9 +27,16 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.*;
import java.util.*;
/**
/**
@ -65,10 +73,11 @@ public class StatisticsEsService {
    /**
    /**
     * 问诊量
     * 问诊量
     *
     * @param startDate
     * @param startDate
     * @param endDate
     * @param endDate
     * @param area
     * @param area
     * @param level 2 市  3区  4医院 5、科室 6医生
     * @param level       2 市  3区  4医院 5、科室 6医生
     * @param index
     * @param index
     * @param level2_type
     * @param level2_type
     * @return
     * @return
@ -1757,7 +1766,7 @@ public class StatisticsEsService {
        List<JSONObject> result = new ArrayList<>();
        List<JSONObject> result = new ArrayList<>();
//        if (saveModels != null && saveModels.size() >0) {
//        if (saveModels != null && saveModels.size() >0) {
        List<Map<String, Object>> resultList = DateUtil.findDates(dateFormat.parse(startDate), dateFormat.parse(DateUtil.getNextDay(dateFormat.parse(endDate), 1)));
        List<Map<String, Object>> resultList = DateUtil.findDates(dateFormat.parse(startDate), dateFormat.parse(DateUtil.getNextDay(endDate, 1)));
//            result.clear();
//            result.clear();
        for (Map<String, Object> one : resultList) {
        for (Map<String, Object> one : resultList) {
            JSONObject json = new JSONObject();
            JSONObject json = new JSONObject();
@ -4264,7 +4273,7 @@ public class StatisticsEsService {
            rs.put("total", totalNm);
            rs.put("total", totalNm);
            rs.put("noReceiveCount", noReceiveNm);
            rs.put("noReceiveCount", noReceiveNm);
            rs.put("haveReceiveCount", haveReceiveNm);
            rs.put("haveReceiveCount", haveReceiveNm);
            rs.put("endAndReciveCount",endNm+haveReceiveNm);
            rs.put("endAndReciveCount", endNm + haveReceiveNm);
            rs.put("code", key);
            rs.put("code", key);
            resultMaps.add(rs);
            resultMaps.add(rs);
        }
        }
@ -5022,24 +5031,24 @@ public class StatisticsEsService {
                        break;
                        break;
                    }
                    }
                }
                }
                for (SaveModel saveModel2:precriptionIsPayList){
                    String isPay=saveModel2.getHospital()==null?"":saveModel2.getHospital();
                    String pre=saveModel.getHospital()==null?"":saveModel.getHospital();
                    if(isPay.equalsIgnoreCase(pre)){
                for (SaveModel saveModel2 : precriptionIsPayList) {
                    String isPay = saveModel2.getHospital() == null ? "" : saveModel2.getHospital();
                    String pre = saveModel.getHospital() == null ? "" : saveModel.getHospital();
                    if (isPay.equalsIgnoreCase(pre)) {
                        isPayNum = saveModel2.getResult1();
                        isPayNum = saveModel2.getResult1();
                        prescriptionPayRate = getRange(isPayNum.intValue(),preNum.intValue(),0);
                        jsonObject.put("prescriptionPayRate",prescriptionPayRate);
                        prescriptionPayRate = getRange(isPayNum.intValue(), preNum.intValue(), 0);
                        jsonObject.put("prescriptionPayRate", prescriptionPayRate);
                        break;
                        break;
                    }
                    }
                }
                }
                if(null==saveModel.getHospital()){
                    resultArray =new JSONArray();
                }else {
                if (null == saveModel.getHospital()) {
                    resultArray = new JSONArray();
                } else {
                    resultArray.add(jsonObject);
                    resultArray.add(jsonObject);
                }
                }
            }
            }
        }
        }
        object.put("excelData",resultArray);
        object.put("excelData", resultArray);
        return object;
        return object;
    }
    }
@ -5873,4 +5882,696 @@ public class StatisticsEsService {
        return jsonObject;
        return jsonObject;
    }
    }
    /**
     * 1自定义时间 2 本月  3 近半年 4 全年
     * 【总收入】= 诊查费(21) + 处方费(3)
     * 【问诊量】= 用户成功发起问诊量,包含取消的订单(同一人发起多次累计多次)   【接诊率】= 接诊量 ÷ 问诊量 ×100%
     * 【处方量】= 成功接诊后开方数量 【处方率】= 处方量 ÷ 接诊量 ×100%
     */
    public JSONObject getTotal3Data(ScreenQvo qvo) throws Exception {
        JSONObject result = new JSONObject();
        // 计算上一个周期  开始时间period[0] 、结束时间period[1]
        String[] period = calculatePreviousPeriod(qvo.getStartDate(), qvo.getEndDate());
        //计算去年同期时间段 开始时间periodYear[0] 、结束时间periodYear[1]
        String[] periodYear = calculatePreviousYearPeriod(qvo.getStartDate(), qvo.getEndDate());
        //到结束时间的增量
        SaveModel model01 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getEndDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "3", "2");//查询诊查费
        SaveModel model02 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getEndDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "21", "2");//处方费
        //到开始时间的增量
        SaveModel model03 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getStartDate(), qvo.getStartDate(), qvo.getArea(), qvo.getLevel(), "3", "2");//查询诊查费
        SaveModel model04 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getStartDate(), qvo.getStartDate(), qvo.getArea(), qvo.getLevel(), "21", "2");//处方费
        //上个周期的结束时间的增量
        SaveModel model05 = elasticsearchUtil.findOneDateQuotaLevel0(period[1], period[1], qvo.getArea(), qvo.getLevel(), "3", "2");//查询诊查费
        SaveModel model06 = elasticsearchUtil.findOneDateQuotaLevel0(period[1], period[1], qvo.getArea(), qvo.getLevel(), "21", "2");//处方费
        //上个周期的开始时间的增量
        SaveModel model07 = elasticsearchUtil.findOneDateQuotaLevel0(period[0], period[0], qvo.getArea(), qvo.getLevel(), "3", "2");//查询诊查费
        SaveModel model08 = elasticsearchUtil.findOneDateQuotaLevel0(period[0], period[0], qvo.getArea(), qvo.getLevel(), "21", "2");//处方费
        //去年同期时间的结束时间的增量
        SaveModel model09 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[1], periodYear[1], qvo.getArea(), qvo.getLevel(), "3", "2");//查询诊查费
        SaveModel model10 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[1], periodYear[1], qvo.getArea(), qvo.getLevel(), "21", "2");//处方费
        //去年同期时间的开始时间的增量
        SaveModel model11 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[0], periodYear[0], qvo.getArea(), qvo.getLevel(), "3", "2");//查询诊查费
        SaveModel model12 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[0], periodYear[0], qvo.getArea(), qvo.getLevel(), "21", "2");//处方费
        //----------------------问诊量--------------------------------------
        SaveModel wz_model01 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getEndDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", "2");//问诊-到结束时间的增量
        SaveModel wz_model02 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getStartDate(), qvo.getStartDate(), qvo.getArea(), qvo.getLevel(), "5", "2");//问诊-到开始时间的增量
        //上个周期的增量
        SaveModel wz_model03 = elasticsearchUtil.findOneDateQuotaLevel0(period[1], period[1], qvo.getArea(), qvo.getLevel(), "5", "2");//问诊-结束时间
        SaveModel wz_model04 = elasticsearchUtil.findOneDateQuotaLevel0(period[0], period[0], qvo.getArea(), qvo.getLevel(), "5", "2");//问诊=开始时间
        //去年同期时间的增量
        SaveModel wz_model05 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[1], periodYear[1], qvo.getArea(), qvo.getLevel(), "5", "2");//问诊-结束时间
        SaveModel wz_model06 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[0], periodYear[0], qvo.getArea(), qvo.getLevel(), "5", "2");//问诊=开始时间
        //---------------------【处方量】------------------------------------
        SaveModel cf_model01 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getEndDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", "2");//开方量-到结束时间的增量
        SaveModel cf_model02 = elasticsearchUtil.findOneDateQuotaLevel0(qvo.getStartDate(), qvo.getStartDate(), qvo.getArea(), qvo.getLevel(), "2", "2");//开方量-到开始时间的增量
        //上个周期的增量
        SaveModel cf_model03 = elasticsearchUtil.findOneDateQuotaLevel0(period[1], period[1], qvo.getArea(), qvo.getLevel(), "2", "2");//开方量-结束时间
        SaveModel cf_model04 = elasticsearchUtil.findOneDateQuotaLevel0(period[0], period[0], qvo.getArea(), qvo.getLevel(), "2", "2");//开方量=开始时间
        //去年同期时间的增量
        SaveModel cf_model05 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[1], periodYear[1], qvo.getArea(), qvo.getLevel(), "2", "2");//开方量-结束时间
        SaveModel cf_model06 = elasticsearchUtil.findOneDateQuotaLevel0(periodYear[0], periodYear[0], qvo.getArea(), qvo.getLevel(), "2", "2");//开方量=开始时间
        //---------------------【接诊量】------------------------------------
        //接诊量-已接诊
        List<SaveModel> jz_model01 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12,14,16", "1", null, "9,16,12,1,17", "1");
        /**
         *  计算同比和环比
         *  环比增长= (本期统计周期数据-上期统计周期数据)上期统计周期数据×100%
         *  同比增长= (本期统计周期数据-去年同期统计周期数据)去年同期统计周期据×100%
         */
        long totalRevenue = ((model01 == null ? 0 : model01.getResult1().longValue()) - (model03 == null ? 0 : model03.getResult1().longValue())) +
                (model02 == null ? 0 : model02.getResult1().longValue()) - (model04 == null ? 0 : model04.getResult1().longValue());
        //上周期总收入
        long periodTotal = ((model05 == null ? 0 : model05.getResult1().longValue()) - (model07 == null ? 0 : model07.getResult1().longValue()))
                + (model06 == null ? 0 : model06.getResult1().longValue()) - (model08 == null ? 0 : model08.getResult1().longValue());
        //去年同期时间段总收入
        long periodYearTotal = ((model09 == null ? 0 : model09.getResult1().longValue()) - (model11 == null ? 0 : model11.getResult1().longValue()))
                + (model10 == null ? 0 : model10.getResult1().longValue() - (model12 == null ? 0 : model12.getResult1().longValue()));
        //同比和环比
        long fee_hb = periodTotal == 0 ? 0 : (totalRevenue - periodTotal) / periodTotal;//环比
        long fee_tb = periodYearTotal == 0 ? 0 : (totalRevenue - periodYearTotal) / periodYearTotal;//同比
        result.put("fee_examination", (model01 == null ? 0 : model01.getResult1().longValue()) - (model03 == null ? 0 : model03.getResult1().longValue()));//诊查费
        result.put("fee_prescription", (model02 == null ? 0 : model02.getResult1().longValue()) - (model04 == null ? 0 : model04.getResult1().longValue()));//处方费
        result.put("fee_total", totalRevenue);//总收入
        result.put("fee_hb", fee_hb);//环比
        result.put("fee_tb", fee_tb);//同比
        int patientVolume = 0;
        //接诊量
        if (!jz_model01.isEmpty()) {
            patientVolume = (int) jz_model01.stream().mapToDouble(SaveModel::getResult1).sum();
        }
        //问诊
        int wzl = (wz_model01 == null ? 0 : wz_model01.getResult1().intValue()) - (wz_model02 == null ? 0 : wz_model02.getResult2().intValue());
        //同比和环比
        int wzl_period = (wz_model03 == null ? 0 : wz_model03.getResult1().intValue()) - (wz_model04 == null ? 0 : wz_model04.getResult1().intValue());//上个周期
        int wzl_periodYear = (wz_model05 == null ? 0 : wz_model05.getResult1().intValue()) - (wz_model06 == null ? 0 : wz_model06.getResult1().intValue());//去年同周期
        result.put("wzl_total", wzl);//问诊量
        result.put("wzl_jz", patientVolume);//接诊量
        result.put("wzl_jzl", getRange(patientVolume, wzl, 0));//【接诊率】= 接诊量 ÷ 问诊量 ×100%
        result.put("wzl_hb", getRange((wzl - wzl_period), wzl_period, 0));//环比
        result.put("wzl_tb", getRange((wzl - wzl_periodYear), wzl_periodYear, 0));//同比
        //开方 【处方量】
        int kf_total = (cf_model01 == null ? 0 : cf_model01.getResult1().intValue()) - (cf_model02 == null ? 0 : cf_model02.getResult1().intValue());
        int kf_period = (cf_model03 == null ? 0 : cf_model03.getResult1().intValue()) - (cf_model04 == null ? 0 : cf_model04.getResult1().intValue());//上个周期
        int kf_periodYear = (cf_model05 == null ? 0 : cf_model05.getResult1().intValue()) - (cf_model06 == null ? 0 : cf_model06.getResult1().intValue());//去年同周期
        result.put("kf_total", kf_total);//开方量
        result.put("kf_kfl", getRange(kf_total, patientVolume, 0));//【处方率】= 处方量 ÷ 接诊量 ×100%
        result.put("kf_hb", getRange((kf_total - kf_period), kf_period, 0));//环比
        result.put("kf_tb", getRange((kf_total - kf_periodYear), kf_periodYear, 0));//同比
        return result;
    }
    /**
     * 借鉴:
     * hospital/statistics/outPatientLine
     * {"index":5,"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2,"level2_type":4,"interval":1}
     */
    public JSONObject getKindsConsultCount(ScreenQvo qvo) throws Exception {
        //专家咨询数量 = 图文咨询 + 视频咨询
        //协同门诊
        List<SaveModel> xt_list = elasticsearchUtil.findDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "12", null, "4");
        ///图文咨询
        List<SaveModel> twzx_list = elasticsearchUtil.findDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "1", null, "4");
        //图文复诊
        List<SaveModel> twfz_list = elasticsearchUtil.findDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "9", null, "4");
        //视频咨询
        List<SaveModel> spzx_list = elasticsearchUtil.findDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "17", null, "4");
        //视频复诊
        List<SaveModel> spfz_list = elasticsearchUtil.findDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "16", null, "4");
        JSONObject result = new JSONObject();
        int xtmz = xt_list.isEmpty() ? 0 : xt_list.get(0).getResult1().intValue();
        int twzx = twzx_list.isEmpty() ? 0 : twfz_list.get(0).getResult1().intValue();
        int twfz = twfz_list.isEmpty() ? 0 : twfz_list.get(0).getResult1().intValue();
        int spzx = spzx_list.isEmpty() ? 0 : spzx_list.get(0).getResult1().intValue();
        int spfz = spfz_list.isEmpty() ? 0 : spfz_list.get(0).getResult1().intValue();
        //计算百分比
        int total =xtmz+twzx+twfz+spzx+spfz;
        result.put("xtmz", xtmz);//协同门诊
        result.put("twzx", twzx);//图文咨询
        result.put("twfz", twfz);//图文复诊
        result.put("spzx", spzx);//视频咨询
        result.put("spfz", spfz);//视频复诊
        //百分比
        result.put("xtmz_bfb", getRange(xtmz,total , 0));//协同门诊
        result.put("twzx_bfb", getRange(twzx,total , 0));//图文咨询
        result.put("twfz_bfb", getRange(twfz,total , 0));//图文复诊
        result.put("spzx_bfb", getRange(spzx,total , 0));//视频咨询
        result.put("spfz_bfb", getRange(spfz,total , 0));//视频复诊
        return result;
    }
    /**
     * 获取 已接诊量、未接诊量、取消量、处方量数量
     * 自定义时间、本月  按天展示
     * 近半年、全年     按月展示
     * <p>
     * 图文复诊 {"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2,"interval":1,"index":11,"lowCode":9}
     * 视频复诊{"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2,"interval":1,"index":15,"lowCode":16}
     * 社区协诊{"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2,"interval":1,"index":13,"lowCode":12}
     * 图文咨询{"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2,"interval":1,"index":11,"lowCode":1}
     * 视频咨询{"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2,"interval":1,"index":15,"lowCode":17}
     */
    public JSONObject getConsultAndPrescriptionList(ScreenQvo qvo) throws Exception {
        JSONObject result = new JSONObject();
        HashMap<String, String> map = new HashMap<>();
        map.put("notReceivedTreatment", "0"); //未接诊
        map.put("receivedTreatment", "1"); //已接诊
        map.put("patientCanceled", "-1"); //患者取消
        //按天分组
        if ("1".equals(qvo.getTimeType())) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                JSONArray array01 = dateTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", "9", SaveModel.timeLevel_ZL, value);//图文复诊
                JSONArray array02 = dateTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", "16", SaveModel.timeLevel_ZL, value);//视频复诊
                JSONArray array03 = dateTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", "12", SaveModel.timeLevel_ZL, value);//社区协诊
                JSONArray array04 = dateTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", "1", SaveModel.timeLevel_ZL, value);//图文咨询
                JSONArray array05 = dateTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", "17", SaveModel.timeLevel_ZL, value);//视频咨询
                //数据处理进行合并相加
                ArrayList<JSONArray> list = new ArrayList<>();
                list.add(array01);
                list.add(array02);
                list.add(array03);
                list.add(array04);
                list.add(array05);
                JSONArray arrayAll = jsonArrayCalculation(list);
                //数据转化
                result.put(key, addWeekdayToJSONArray(arrayAll));
            }
            //算出每天的开方量
            JSONArray array = dateTotalStatistics3(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", null, SaveModel.timeLevel_ZL, null);
            result.put("prescriptionVolume", addWeekdayToJSONArray(array));
        }
        //按月分组
        if ("3".equals(qvo.getTimeType())) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                JSONArray array01 = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", "9", SaveModel.timeLevel_ZL, value);//图文复诊
                JSONArray array02 = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", "16", SaveModel.timeLevel_ZL, value);//视频复诊
                JSONArray array03 = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", "12", SaveModel.timeLevel_ZL, value);//社区协诊
                JSONArray array04 = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", "1", SaveModel.timeLevel_ZL, value);//图文咨询
                JSONArray array05 = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", "17", SaveModel.timeLevel_ZL, value);//视频咨询
                //数据处理进行合并相加
                ArrayList<JSONArray> list = new ArrayList<>();
                list.add(array01);
                list.add(array02);
                list.add(array03);
                list.add(array04);
                list.add(array05);
                JSONArray arrayAll = jsonArrayCalculation(list);
                result.put(key, arrayAll);
            }
            //算出开方量
            JSONArray array = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", null, SaveModel.timeLevel_ZL, null);
            result.put("prescriptionVolume", array);
        }
        return result;
    }
    /**
     * 诊查费(21) + 处方费(3)
     */
    public JSONObject getDrugAndExaminationFeeList(ScreenQvo qvo) throws Exception {
        JSONObject result = new JSONObject();
        HashMap<String, String> map = new HashMap<>();
        map.put("drugFree", "3"); //诊查费
        map.put("ExaminationFee", "1"); //处方费
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            //按日
            if ("1".equals(qvo.getTimeType())) {
                JSONArray array = dateTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), value, null, SaveModel.timeLevel_ZL, null);
                result.put(key, addWeekdayToJSONArray(array));
            }
            //按月
            if ("3".equals(qvo.getTimeType())) {
                JSONArray array = monthTotalStatistics2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), value, null, SaveModel.timeLevel_ZL, null);
                result.put(key, array);
            }
        }
        return result;
    }
    /**
     * 获取【科室、医生】的接诊量接诊率排名
     * 参照:hospital/statistics/consultListPC
     * 查科室数据
     * 图文问诊:{"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5,"index":11,"lowCode":9}
     * 视频问诊:{"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5,"index":15,"lowCode":16}
     * 社区协诊:{"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5,"index":13,"lowCode":12}
     * 图文咨询:{"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5,"index":11,"lowCode":1}
     * 视频咨询:{"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5,"index":15,"lowCode":17}
     * <p>
     * <p>
     * 查找医生
     * {"startDate":"2023-07-17","endDate":"2023-07-20","area":"1010100","level":5,"lowLevel":6,"index":11,"lowCode":9}
     */
    public JSONObject getDeptOrDoctorVolumeList(ScreenQvo qvo) throws Exception {
        JSONObject result = new JSONObject();
        //查科室
        if ("4".equals(String.valueOf(qvo.getLevel()))) {
            //问诊总数
            List<SaveModel> model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "5", "9");
            List<SaveModel> model02 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "5", "16");
            List<SaveModel> model03 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "5", "12");
            List<SaveModel> model04 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "5", "1");
            List<SaveModel> model05 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "5", "17");
            //已接诊
            List<SaveModel> jz_model01 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "5", "9", "1");
            List<SaveModel> jz_model02 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "5", "16", "1");
            List<SaveModel> jz_model03 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "5", "12", "1");
            List<SaveModel> jz_model04 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "5", "1", "1");
            List<SaveModel> jz_model05 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "5", "17", "1");
            //未接诊
            List<SaveModel> wjz_model01 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "5", "9", "0");
            List<SaveModel> wjz_model02 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "5", "16", "0");
            List<SaveModel> wjz_model03 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "5", "12", "0");
            List<SaveModel> wjz_model04 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "5", "1", "0");
            List<SaveModel> wjz_model05 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "5", "17", "0");
            //转换
            List<Map<String, Object>> list01 = getCoutListPCNew(4, "5", model01, jz_model01, wjz_model01);
            List<Map<String, Object>> list02 = getCoutListPCNew(4, "5", model02, jz_model02, wjz_model02);
            List<Map<String, Object>> list03 = getCoutListPCNew(4, "5", model03, jz_model03, wjz_model03);
            List<Map<String, Object>> list04 = getCoutListPCNew(4, "5", model04, jz_model04, wjz_model04);
            List<Map<String, Object>> list05 = getCoutListPCNew(4, "5", model05, jz_model05, wjz_model05);
            List<List<Map<String, Object>>> listOfLists = new ArrayList<>();
            listOfLists.add(list01);
            listOfLists.add(list02);
            listOfLists.add(list03);
            listOfLists.add(list04);
            listOfLists.add(list05);
            //数据转换
            List<Map<String, Object>> list = mergeAndSortLists(listOfLists, "1");
            result.put("resultList", list);
        }
        //查医生
        if ("5".equals(String.valueOf(qvo.getLevel()))) {
            //问诊总数
            List<SaveModel> model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "6", "9");
            List<SaveModel> model02 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "6", "16");
            List<SaveModel> model03 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "6", "12");
            List<SaveModel> model04 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "6", "1");
            List<SaveModel> model05 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "6", "17");
            //已接诊
            List<SaveModel> jz_model01 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "6", "9", "1");
            List<SaveModel> jz_model02 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "6", "16", "1");
            List<SaveModel> jz_model03 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "6", "12", "1");
            List<SaveModel> jz_model04 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "6", "1", "1");
            List<SaveModel> jz_model05 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "6", "17", "1");
            //未接诊
            List<SaveModel> wjz_model01 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "6", "9", "0");
            List<SaveModel> wjz_model02 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "6", "16", "0");
            List<SaveModel> wjz_model03 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "14", SaveModel.timeLevel_ZL, "6", "12", "0");
            List<SaveModel> wjz_model04 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "12", SaveModel.timeLevel_ZL, "6", "1", "0");
            List<SaveModel> wjz_model05 = elasticsearchUtil.findListDateQuotaLevel2(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "16", SaveModel.timeLevel_ZL, "6", "17", "0");
            List<Map<String, Object>> list01 = getCoutListPCNew(5, "6", model01, jz_model01, wjz_model01);
            List<Map<String, Object>> list02 = getCoutListPCNew(5, "6", model02, jz_model02, wjz_model02);
            List<Map<String, Object>> list03 = getCoutListPCNew(5, "6", model03, jz_model03, wjz_model03);
            List<Map<String, Object>> list04 = getCoutListPCNew(5, "6", model04, jz_model04, wjz_model04);
            List<Map<String, Object>> list05 = getCoutListPCNew(5, "6", model05, jz_model05, wjz_model05);
            //查询所有医生的照片和科室
            List<List<Map<String, Object>>> listOfLists = new ArrayList<>();
            listOfLists.add(list01);
            listOfLists.add(list02);
            listOfLists.add(list03);
            listOfLists.add(list04);
            listOfLists.add(list05);
            //数据转换
            List<Map<String, Object>> list = mergeAndSortLists(listOfLists, "2");
            result.put("resultList", list);
        }
        return result;
    }
    /**
     * 【全院明细】
     * 科室、医生、问诊量、接诊量、未接诊量、接诊率、处方量、检查费、药品费、总收入
     * 1、按科室  level 4 lowLevel 5
     * 2、按医生  level 4 lowLevel 6
     * //科室和医生
     * 视频咨询:{"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5,"index":15,"lowCode":17}
     * 查找医生: {"startDate":"2023-07-17","endDate":"2023-07-20","area":"1010100","level":5,"lowLevel":6,"index":11,"lowCode":9}
     */
    public JSONObject getAllHospitalDetails(ScreenQvo qvo) throws Exception {
        JSONObject result = new JSONObject();
        List<Map<String, Object>> resultList = null;
        //查科室
        if ("4".equals(String.valueOf(qvo.getLevel()))) {
            JSONObject jsonObject = getDeptOrDoctorVolumeList(qvo);//问诊量、接诊量、未接诊量、接诊率
            resultList = (List<Map<String, Object>>) jsonObject.get("resultList");
            //诊查费(21) + 处方费(3)=总收入  处方量(2)
            List<SaveModel> model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "3", SaveModel.timeLevel_ZL, "5", null);
            List<SaveModel> model02 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "21", SaveModel.timeLevel_ZL, "5", null);
            List<SaveModel> model03 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", SaveModel.timeLevel_ZL, "5", null);
            List<Map<String, Object>> list = mergeListsToList(resultList, model01, model02, model03, "1");
            result.put("list", list);
        }
        //查医生
        if ("5".equals(String.valueOf(qvo.getLevel()))) {
            JSONObject jsonObject = getDeptOrDoctorVolumeList(qvo);//问诊量、接诊量、未接诊量、接诊率
            resultList = (List<Map<String, Object>>) jsonObject.get("resultList");
            // 处方费(3)+诊查费(21) =总收入  处方量(2)
            List<SaveModel> model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "3", SaveModel.timeLevel_ZL, "6", null);
            List<SaveModel> model02 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "21", SaveModel.timeLevel_ZL, "6", null);
            List<SaveModel> model03 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", SaveModel.timeLevel_ZL, "6", null);
            List<Map<String, Object>> list = mergeListsToList(resultList, model01, model02, model03, "2");
            result.put("list", list);
        }
        return result;
    }
    /**
     * 补充数据
     */
    private List<Map<String, Object>> mergeListsToList(List<Map<String, Object>> resultList, List<SaveModel> model01, List<SaveModel> model02, List<SaveModel> model03, String type) {
        for (Map<String, Object> map : resultList) {
            String name = (String) map.get("name");
            //处方费
            for (SaveModel model : model01) {
                if ("1".equals(type)) {
                    String deptName = model.getDeptName();
                    if (deptName.equals(name)) {
                        map.put("free_prescription", model.getResult1().doubleValue());
                    }
                }
                if ("2".equals(type)) {
                    String doctorName = model.getDoctorName();
                    if (doctorName.equals(name)) {
                        map.put("free_prescription", model.getResult1().doubleValue());
                    }
                }
            }
            //诊查费
            for (SaveModel model : model02) {
                if ("1".equals(type)) {
                    String deptName = model.getDeptName();
                    if (deptName.equals(name)) {
                        map.put("free_exam", model.getResult1().doubleValue());
                    }
                }
                if ("2".equals(type)) {
                    String doctorName = model.getDoctorName();
                    if (doctorName.equals(name)) {
                        map.put("free_exam", model.getResult1().doubleValue());
                    }
                }
            }
            //处方量
            for (SaveModel model : model03) {
                if ("1".equals(type)) {
                    String deptName = model.getDeptName();
                    if (deptName.equals(name)) {
                        map.put("prescription_volume", model.getResult1().doubleValue());
                    }
                }
                if ("2".equals(type)) {
                    String doctorName = model.getDoctorName();
                    if (doctorName.equals(name)) {
                        map.put("prescription_volume", model.getResult1().doubleValue());
                    }
                }
            }
        }
        //计算总收入【检查费+处方费】
        for (Map<String, Object> map : resultList) {
            double free_prescription = Double.parseDouble(map.get("free_prescription").toString());
            double free_exam = Double.parseDouble(map.get("free_exam").toString());
            BigDecimal bd1 = new BigDecimal(Double.toString(free_prescription));
            BigDecimal bd2 = new BigDecimal(Double.toString(free_exam));
            double fee_total = bd1.add(bd2).doubleValue();
            map.put("fee_total", fee_total);//总收入
        }
        return resultList;
    }
    /**
     * list的map进行合并计算
     */
    private List<Map<String, Object>> mergeAndSortLists(List<List<Map<String, Object>>> listOfLists, String type) {
        Map<String, Map<String, Object>> mergedMap = new HashMap<>();
        for (List<Map<String, Object>> list : listOfLists) {
            for (Map<String, Object> map : list) {
                String name = (String) map.get("name");
                if (mergedMap.containsKey(name)) {
                    Map<String, Object> existingMap = mergedMap.get(name);
                    existingMap.put("total", (int) existingMap.get("total") + (int) map.get("total"));
                    existingMap.put("haveReceiveCount", (int) existingMap.get("haveReceiveCount") + (int) map.get("haveReceiveCount"));
                    existingMap.put("noReceiveCount", (int) existingMap.get("noReceiveCount") + (int) map.get("noReceiveCount"));
                } else {
                    mergedMap.put(name, new HashMap<>(map));
                }
            }
        }
        List<Map<String, Object>> sortedMaps = new ArrayList<>(mergedMap.values());
        for (Map<String, Object> map : sortedMaps) {
            double haveReceiveCount = Double.parseDouble(map.get("haveReceiveCount").toString());
            double total = Double.parseDouble(map.get("total").toString());
            double jzl = (double) haveReceiveCount / total * 100;
            map.put("jzl", jzl + "%");//接诊率
        }
        if ("1".equals(type)) {
            //排序
            sortedMaps.sort(Comparator.comparingInt(map -> (int) map.get("total")));
            Collections.reverse(sortedMaps);
        }
        if ("2".equals(type)) {
            // todo 查出所有医生的数据 赋值科室
            String sql = " SELECT\t`id`,\t`name`,\tphoto,\tvisit_dept \"deptCode\",visit_dept_name \"deptName\" \n" +
                    "FROM\n" +
                    "\tbase.base_doctor \n" +
                    "WHERE\n" +
                    "\t1 = 1 \n" +
                    "\tAND visit_dept IS NOT NULL \n";
            List<Map<String, Object>> doctorList = jdbcTemplate.queryForList(sql);
            for (Map<String, Object> map : sortedMaps) {
                map.put("deptCode", "");
                map.put("deptName", "");
                map.put("photo", "");
                String code = String.valueOf(map.get("code"));
                for (Map<String, Object> doctorMap : doctorList) {
                    if (code.equals(String.valueOf(doctorMap.get("id")))) {
                        map.put("deptCode", String.valueOf(doctorMap.get("deptCode")));
                        map.put("deptName", String.valueOf(doctorMap.get("deptName")));
                        map.put("photo", String.valueOf(doctorMap.get("photo")));
                    }
                }
            }
            sortedMaps.sort(Comparator.comparingInt(map -> (int) map.get("haveReceiveCount")));
            Collections.reverse(sortedMaps);
        }
        return sortedMaps;
    }
    /**
     * 给jsonArray里面数据多放一个参数,星期几
     */
    public static JSONArray addWeekdayToJSONArray(JSONArray jsonArray) {
        for (int j = 0; j < jsonArray.size(); j++) {
            JSONObject obj = jsonArray.getJSONObject(j);
            String dateString = obj.getString("range");
            obj.put("weekday", getChineseWeekday(dateString));
        }
        return jsonArray;
    }
    /**
     * 根据字符串时间,算出星期几
     */
    public static String getChineseWeekday(String dateString) {
        LocalDate date = LocalDate.parse(dateString, DateTimeFormatter.ISO_LOCAL_DATE);
        ZonedDateTime zonedDateTime = date.atStartOfDay(ZoneId.of("Asia/Shanghai"));
        DayOfWeek dayOfWeek = zonedDateTime.getDayOfWeek();
        Locale locale = Locale.CHINESE;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E", locale);
        return dayOfWeek.getDisplayName(TextStyle.FULL, locale);
    }
    /**
     * 计算上一个周期。按时间间隔
     */
    public static String[] calculatePreviousPeriod(String start, String end) {
        // 将时间字符串转换为LocalDate对象
        LocalDate startDate = LocalDate.parse(start, DateTimeFormatter.ISO_LOCAL_DATE);
        LocalDate endDate = LocalDate.parse(end, DateTimeFormatter.ISO_LOCAL_DATE);
        // 计算周期
        int interval = (int) (endDate.toEpochDay() - startDate.toEpochDay()) + 1;
        // 计算上一个周期的开始时间和结束时间
        LocalDate previousStart = startDate.minusDays(interval);
        LocalDate previousEnd = endDate.minusDays(interval);
        // 将日期对象转换为字符串
        String previousStartDate = previousStart.format(DateTimeFormatter.ISO_LOCAL_DATE);
        String previousEndDate = previousEnd.format(DateTimeFormatter.ISO_LOCAL_DATE);
        // 返回上一个周期的时间段
        return new String[]{previousStartDate, previousEndDate};
    }
    /**
     * 计算去年同期时间段
     */
    public static String[] calculatePreviousYearPeriod(String start, String end) {
        // 将时间字符串转换为LocalDate对象
        LocalDate startDate = LocalDate.parse(start, DateTimeFormatter.ISO_LOCAL_DATE);
        LocalDate endDate = LocalDate.parse(end, DateTimeFormatter.ISO_LOCAL_DATE);
        // 计算去年同期的开始时间和结束时间
        LocalDate previousStart = startDate.minusYears(1);
        LocalDate previousEnd = endDate.minusYears(1);
        // 将日期对象转换为字符串
        String previousStartDate = previousStart.format(DateTimeFormatter.ISO_LOCAL_DATE);
        String previousEndDate = previousEnd.format(DateTimeFormatter.ISO_LOCAL_DATE);
        // 返回去年同期的时间段
        return new String[]{previousStartDate, previousEndDate};
    }
    /**
     * 转换
     */
    public List<Map<String, Object>> getCoutListPCNew(Integer level, String lowLevel, List<SaveModel> total, List<SaveModel> haveReceive, List<SaveModel> noReceive) {
        Map<String, Object> totalMap = new HashMap<>();
        Map<String, Object> haveReceiveMap = new HashMap<>();
        Map<String, Object> noReceiveMap = new HashMap<>();
        String low_level = StringUtils.isEmpty(lowLevel) ? String.valueOf(level + 1) : lowLevel;
        //转换已接诊
        for (SaveModel saveModel : haveReceive) {
            if (SaveModel.doctorLevel.equals(low_level)) {
                haveReceiveMap.put(saveModel.getDoctor(), saveModel);
            } else if (SaveModel.deptLevel.equals(low_level)) {
                haveReceiveMap.put(saveModel.getDept(), saveModel);
            } else if (SaveModel.OrgLevel.equals(low_level)) {
                haveReceiveMap.put(saveModel.getHospital(), saveModel);
            }
        }
        //转换总咨询数
        for (SaveModel saveModel : total) {
            if (SaveModel.doctorLevel.equals(low_level)) {
                totalMap.put(saveModel.getDoctor(), saveModel);
            } else if (SaveModel.deptLevel.equals(low_level)) {
                totalMap.put(saveModel.getDept(), saveModel);
            } else if (SaveModel.OrgLevel.equals(low_level)) {
                totalMap.put(saveModel.getHospital(), saveModel);
            }
        }
        //转换未接诊
        for (SaveModel saveModel : noReceive) {
            if (SaveModel.doctorLevel.equals(low_level)) {
                noReceiveMap.put(saveModel.getDoctor(), saveModel);
            } else if (SaveModel.deptLevel.equals(low_level)) {
                noReceiveMap.put(saveModel.getDept(), saveModel);
            } else if (SaveModel.OrgLevel.equals(low_level)) {
                noReceiveMap.put(saveModel.getHospital(), saveModel);
            }
        }
        List<Map<String, Object>> resultMaps = new ArrayList<>();
        for (String key : totalMap.keySet()) {
            Map<String, Object> rs = new HashMap<>();
            SaveModel totalRs = (SaveModel) totalMap.get(key);
            SaveModel haveReceiveRs = (SaveModel) haveReceiveMap.get(key);
            SaveModel noReceiveRs = (SaveModel) noReceiveMap.get(key);
            totalRs = totalRs == null ? new SaveModel() : totalRs;
            haveReceiveRs = haveReceiveRs == null ? new SaveModel() : haveReceiveRs;
            noReceiveRs = noReceiveRs == null ? new SaveModel() : noReceiveRs;
            //合并结果集
            Integer totalNm = totalRs.getResult2().intValue();
            Integer haveReceiveNm = haveReceiveRs.getResult2().intValue();
            Integer noReceiveNm = noReceiveRs.getResult2().intValue();
            if (SaveModel.doctorLevel.equals(low_level)) {
                rs.put("name", totalRs.getDoctorName());
            } else if (SaveModel.deptLevel.equals(low_level)) {
                rs.put("name", totalRs.getDeptName());
            } else if (SaveModel.OrgLevel.equals(low_level)) {
                rs.put("name", totalRs.getHospitalName());
            }
            rs.put("total", totalNm);
            rs.put("haveReceiveCount", haveReceiveNm);
            rs.put("noReceiveCount", noReceiveNm);
            rs.put("code", key);
            resultMaps.add(rs);
        }
        return resultMaps;
    }
    /**
     * 按日期合并jsonarray的数据
     */
    private JSONArray jsonArrayCalculation(ArrayList<JSONArray> list) {
        JSONArray result = new JSONArray();
        for (JSONArray jsonArray : list) {
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String range = jsonObject.getString("range");
                boolean isExisting = false;
                for (int j = 0; j < result.size(); j++) {
                    JSONObject existingObject = result.getJSONObject(j);
                    if (existingObject.getString("range").equals(range)) {
                        int amount = existingObject.getIntValue("amount") + jsonObject.getIntValue("amount");
                        double num = existingObject.getDoubleValue("num") + jsonObject.getDoubleValue("num");
                        existingObject.put("amount", amount);
                        existingObject.put("num", num);
                        isExisting = true;
                        break;
                    }
                }
                if (!isExisting) {
                    result.add(jsonObject);
                }
            }
        }
        return result;
    }
}
}

+ 2 - 1
business/es-service/src/main/java/com/yihu/jw/es/util/ElasticsearchUtil.java

@ -1555,7 +1555,7 @@ public class ElasticsearchUtil {
        }
        }
        if (StringUtils.isNotEmpty(area)) {
        if (StringUtils.isNotEmpty(area)) {
                if (SaveModel.doctorLevel.equals(level + "")) {
            if (SaveModel.doctorLevel.equals(level + "")) {
                sql.append(" doctor='" + area + "'");
                sql.append(" doctor='" + area + "'");
            }else if (SaveModel.deptLevel.equals(level + "")) {
            }else if (SaveModel.deptLevel.equals(level + "")) {
                sql.append(" dept='" + area + "'");
                sql.append(" dept='" + area + "'");
@ -2379,6 +2379,7 @@ public class ElasticsearchUtil {
            return null;
            return null;
        }
        }
        return (SaveModel) list.get(0);
        return (SaveModel) list.get(0);
    }
    }
    public SaveModel findOneDateQuotaLevel0(String startDate, String endDate, String area, int level, String index, String timelevel,String areaLevel) throws Exception {
    public SaveModel findOneDateQuotaLevel0(String startDate, String endDate, String area, int level, String index, String timelevel,String areaLevel) throws Exception {

+ 8 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/hospital/BaseHospitalRequestMapping.java

@ -1450,6 +1450,14 @@ public class BaseHospitalRequestMapping {
    public static class Statistics extends BaseHospitalRequestMapping.Basic{
    public static class Statistics extends BaseHospitalRequestMapping.Basic{
        public static final String PREFIX  = "/statistics";
        public static final String PREFIX  = "/statistics";
        public static final String getTotal3Data = "/getTotal3Data";
        public static final String getKindsConsultCount = "/getKindsConsultCount";
        public static final String getConsultAndPrescriptionList = "/getConsultAndPrescriptionList";
        public static final String getDrugAndExaminationFeeList = "/getDrugAndExaminationFeeList";
        public static final String getDeptOrDoctorVolumeList = "/getDeptOrDoctorVolumeList";
        public static final String getAllHospitalDetails = "/getAllHospitalDetails";
        public static final String exportHospitalDetails = "/exportHospitalDetails";
        public static final String total = "/total";
        public static final String total = "/total";
        public static final String outPatientLine="/outPatientLine";
        public static final String outPatientLine="/outPatientLine";
        public static final String prescriptionLine="/prescriptionLine";
        public static final String prescriptionLine="/prescriptionLine";

+ 70 - 0
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/hospital/statistics/ScreenQvo.java

@ -0,0 +1,70 @@
package com.yihu.jw.restmodel.hospital.statistics;
/**
 * @author suqinyi
 * @Date 2023/7/18
 * 大屏查下
 */
public class ScreenQvo {
//   timeLevel 1增量 2到达量
//   interval  1日 2周 3月
//   lowLevel  下一级区域等级
   private String startDate;//开始时间
   private String endDate;//结束时间
   private String area;//区域code
   private int level;//等级
   private String index;//指标
   private String timeType;//查询时间范围 1自定义时间 2 本月  3 近半年 4 全年
   public String getStartDate() {
      return startDate;
   }
   public void setStartDate(String startDate) {
      this.startDate = startDate;
   }
   public String getEndDate() {
      return endDate;
   }
   public void setEndDate(String endDate) {
      this.endDate = endDate;
   }
   public String getArea() {
      return area;
   }
   public void setArea(String area) {
      this.area = area;
   }
   public int getLevel() {
      return level;
   }
   public void setLevel(int level) {
      this.level = level;
   }
   public String getIndex() {
      return index;
   }
   public void setIndex(String index) {
      this.index = index;
   }
   public String getTimeType() {
      return timeType;
   }
   public void setTimeType(String timeType) {
      this.timeType = timeType;
   }
}

+ 0 - 3
svr/svr-internet-hospital/src/main/java/com/yihu/jw/hospital/endpoint/integrate/BaseHospitalUserActivityController.java

@ -1,8 +1,5 @@
package com.yihu.jw.hospital.endpoint.integrate;
package com.yihu.jw.hospital.endpoint.integrate;
import com.yihu.jw.entity.hospital.suggest.BaseSuggestionDO;
import com.yihu.jw.hospital.integrate.dao.BaseHospitalUserActivityDao;
import com.yihu.jw.hospital.integrate.service.BaseHospitalUserActivityService;
import com.yihu.jw.hospital.integrate.service.BaseHospitalUserActivityService;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;

+ 146 - 1
svr/svr-internet-hospital/src/main/java/com/yihu/jw/hospital/endpoint/statistics/EsStatisticsEndpoint.java

@ -1,15 +1,18 @@
package com.yihu.jw.hospital.endpoint.statistics;
package com.yihu.jw.hospital.endpoint.statistics;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.es.service.StatisticsEsService;
import com.yihu.jw.es.service.StatisticsEsService;
import com.yihu.jw.restmodel.hospital.statistics.ScreenQvo;
import com.yihu.jw.es.util.SaveModel;
import com.yihu.jw.es.util.SaveModel;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ListEnvelop;
import com.yihu.jw.restmodel.web.ListEnvelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.hospital.BaseHospitalRequestMapping;
import com.yihu.jw.rm.hospital.BaseHospitalRequestMapping;
import com.yihu.jw.utils.StringUtil;
import com.yihu.jw.util.date.DateUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiParam;
@ -21,6 +24,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
/**
/**
 * Created by wangzhinan on 2019/12/3.
 * Created by wangzhinan on 2019/12/3.
 */
 */
@ -183,6 +192,7 @@ public class EsStatisticsEndpoint extends EnvelopRestEndpoint {
    }
    }
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.outPatientCircular)
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.outPatientCircular)
    @ApiOperation(value = "门诊类别统计-圆形")
    @ApiOperation(value = "门诊类别统计-圆形")
    public ObjEnvelop getOutPatientCircular(
    public ObjEnvelop getOutPatientCircular(
@ -1102,4 +1112,139 @@ public class EsStatisticsEndpoint extends EnvelopRestEndpoint {
        }
        }
    }
    }
    /**
     * 查询收入,开方,问诊量
     * 参数:
     * strJson={"startDate":"2023-07-18","endDate":"2023-07-19","area":"350200","level":2}
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.getTotal3Data)
    @ApiOperation(value = "查询收入,开方,问诊量")
    public ObjEnvelop getTotal3Data(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        try {
            result = statisticsEsService.getTotal3Data(qvo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(result);
    }
    /**
     * 获取咨询各类型的数量
     * 参数:{"startDate":"2023-07-01","endDate":"2023-07-19","area":"350200","level":2}
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.getKindsConsultCount)
    @ApiOperation(value = "获取咨询各类型的数量")
    public ObjEnvelop getKindsConsultCount(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        try {
            result = statisticsEsService.getKindsConsultCount(qvo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(result);
    }
    /**
     * 【业务情况】 统计全院在相应时间内累计的:已接诊量、未接诊量、取消量的数据,三者之和等于总问诊量;
     *  获取 已接诊量、未接诊量、取消量、处方量数量
     *  参数:
     *  timeType=1 按天分组
     *  timeType=3 按月分组
     *  strJson={"startDate":"2023-07-15","endDate":"2023-07-16","area":"350200","level":2,"timeType":"1"}
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.getConsultAndPrescriptionList)
    @ApiOperation(value = "获取【已接诊量、未接诊量、取消量、处方量】数据")
    public ObjEnvelop getConsultAndPrescriptionList(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        try {
            result = statisticsEsService.getConsultAndPrescriptionList(qvo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(result);
    }
    /**
     * 费用情况
     *【费用情况】分别展示每日药品费与诊查费用情况
     * 参数:
     * timeType=1 按天分组
     * timeType=3 按月分组
     * strJson={"startDate":"2023-07-15","endDate":"2023-07-16","area":"350200","level":2,"timeType":"1"}
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.getDrugAndExaminationFeeList)
    @ApiOperation(value = "获取【药品费、诊查费】数据")
    public ObjEnvelop getDrugAndExaminationFeeList(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        try {
            result = statisticsEsService.getDrugAndExaminationFeeList(qvo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(result);
    }
    /**
     * 获取【科室、医生】的接诊量接诊率排名
     * 参数:
     * 科室参数:strJson={"startDate":"2023-07-01","endDate":"2023-07-20","area":"350211A1002","level":4,"lowLevel":5}
     * 医生参数:strJson={"startDate":"2023-07-17","endDate":"2023-07-20","area":"","level":5,"lowLevel":6}
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.getDeptOrDoctorVolumeList)
    @ApiOperation(value = " 获取【科室、医生】的接诊量接诊率排名")
    public ObjEnvelop getDeptOrDoctorVolumeList(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        try {
            result = statisticsEsService.getDeptOrDoctorVolumeList(qvo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(result);
    }
    /**
     *【全院明细】
     * 科室、医生、问诊量、接诊量、未接诊量、接诊率、处方量、检查费、药品费、总收入
     * 参数:
     * 科室:strJson={"startDate":"2023-07-01","endDate":"2023-07-20","area":"医院代码","level":4,"lowLevel":5}
     * 医生:strJson={"startDate":"2023-07-17","endDate":"2023-07-20","area":"科室代码","level":5,"lowLevel":6}
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.getAllHospitalDetails)
    @ApiOperation(value = "【全院明细】")
    public ObjEnvelop getAllHospitalDetails(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        try {
            result = statisticsEsService.getAllHospitalDetails(qvo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success(result);
    }
    /**
     *  todo 导出的接口
     */
    @GetMapping(value = BaseHospitalRequestMapping.Statistics.exportHospitalDetails)
    @ApiOperation(value = "【导出全院明细】")
    public ObjEnvelop exportHospitalDetails(@RequestParam(required = true) String strJson) {
        JSONObject result = new JSONObject();
        ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
        //导出...
        return success(result);
    }
}
}