LAPTOP-KB9HII50\70708 пре 10 месеци
родитељ
комит
4a7050c907

+ 384 - 4
business/es-service/src/main/java/com/yihu/jw/es/service/StatisticsEsService.java

@ -4,7 +4,6 @@ package com.yihu.jw.es.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.area.dao.BaseCityDao;
import com.yihu.jw.dict.dao.DictHospitalDeptDao;
import com.yihu.jw.doctor.dao.BaseDoctorDao;
import com.yihu.jw.doctor.dao.BaseDoctorHospitalDao;
@ -71,8 +70,6 @@ public class StatisticsEsService {
    @Autowired
    private BaseOrgDao orgDao;
    @Autowired
    private BaseCityDao cityDao;
    @Autowired
    private BaseEvaluateScoreService baseEvaluateScoreService;
    @Autowired
    private HibenateUtils hibenateUtils;
@ -6658,19 +6655,291 @@ public class StatisticsEsService {
     * 6、同比增长:(本期统计周期数据-去年同期统计周期数据)去年同期统计周期数据× 100%;
     * 7、环比增长:(本期统计周期数据 - 上期统计周期数据)上期统计周期数据× 100%;
     */
    public JSONObject businessSituation(ScreenQvo qvo){
    public JSONObject businessSituation(ScreenQvo qvo) throws Exception{
        JSONObject json = new JSONObject();
        // 计算上一个周期  开始时间period[0] 、结束时间period[1]
        String[] period = calculatePreviousPeriod(qvo.getStartDate(), qvo.getEndDate());
        //计算去年同期时间段 开始时间periodYear[0] 、结束时间periodYear[1]
        String[] periodYear = calculatePreviousYearPeriod(qvo.getStartDate(), qvo.getEndDate());
        //----------------------问诊量--------------------------------------
        List<SaveModel> wz_model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, null);//问诊
        //上个周期
        List<SaveModel> wz_model02 = elasticsearchUtil.findListDateQuotaLevel1(period[0], period[1], qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, null);//问诊
        //去年同期时间
        List<SaveModel> wz_model03 = elasticsearchUtil.findListDateQuotaLevel1(periodYear[0], periodYear[1], qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, null);//问诊
        //问诊类型 17	视频咨询        //1	图文咨询        //9	图文复诊        //12	专科协同        //16	视频复诊
        List<SaveModel> wz_model01_17 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "17");
        List<SaveModel> wz_model01_1 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "1");
        List<SaveModel> wz_model01_9 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "9");
        List<SaveModel> wz_model01_12 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "12");
        List<SaveModel> wz_model01_16 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "16");
        json.put("wzType17", countListTotal(wz_model01_17));//问诊类型_视频咨询
        json.put("wzType1", countListTotal(wz_model01_1));//问诊类型_图文咨询
        json.put("wzType9", countListTotal(wz_model01_9));//问诊类型_图文复诊
        json.put("wzType12", countListTotal(wz_model01_12));//问诊类型_专科协同
        json.put("wzType16", countListTotal(wz_model01_16));//问诊类型_视频复诊
        //---------------------【处方量】------------------------------------
        List<SaveModel> cf_model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", SaveModel.timeLevel_ZL, null, null);//开方量
        //上个周期
        List<SaveModel> cf_model02 = elasticsearchUtil.findListDateQuotaLevel1(period[0], period[1], qvo.getArea(), qvo.getLevel(), "2", SaveModel.timeLevel_ZL, null, null);//开方量
        //去年同期时间
        List<SaveModel> cf_model03 = elasticsearchUtil.findListDateQuotaLevel1(periodYear[0], periodYear[1], qvo.getArea(), qvo.getLevel(), "2", SaveModel.timeLevel_ZL, null, null);//开方量
        //---------------------【接诊量】------------------------------------
        //接诊量-已接诊
        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");
        //上个周期
        List<SaveModel> jz_model02 = elasticsearchUtil.findListDateQuotaLevel2(period[0], period[1], qvo.getArea(), qvo.getLevel(), "12,14,16", "1", null, "9,16,12,1,17", "1");
        //去年同期时间
        List<SaveModel> jz_model03 = elasticsearchUtil.findListDateQuotaLevel2(periodYear[0], periodYear[1], qvo.getArea(), qvo.getLevel(), "12,14,16", "1", null, "9,16,12,1,17", "1");
        //接诊量
        int patientVolume = countListTotal(jz_model01);
        int periodPatientVolume = countListTotal(jz_model02);//上个周期
        int periodYearPatientVolume = countListTotal(jz_model03);//去年同期时间
        json.put("wzl_jz", patientVolume);//接诊量
        json.put("wzl_jz_hb", getRange((patientVolume - periodPatientVolume), periodPatientVolume, 0));//接诊量-环比
        json.put("wzl_jz_tb", getRange((patientVolume - periodYearPatientVolume), periodYearPatientVolume, 0));//接诊量-同比
        //问诊
        int wzl = countListTotal(wz_model01);
        //同比和环比
        int wzl_period = countListTotal(wz_model02);//上个周期
        int wzl_periodYear = countListTotal(wz_model03);//去年同周期
        json.put("wzl_total", wzl);//问诊量
        json.put("wzl_jzl", getRange(patientVolume, wzl, 0));//【接诊率】= 接诊量 ÷ 问诊量 ×100%
        json.put("wzl_hb", getRange((wzl - wzl_period), wzl_period, 0));//环比
        json.put("wzl_tb", getRange((wzl - wzl_periodYear), wzl_periodYear, 0));//同比
        //开方 【处方量】
        int kf_total = countListTotal(cf_model01);
        int kf_period = countListTotal(cf_model02);
        //上个周期
        int kf_periodYear = countListTotal(cf_model03);
        //去年同周期
        json.put("kf_total", kf_total);//开方量
        json.put("kf_kfl", getRange(kf_total, patientVolume, 0));//【处方率】= 处方量 ÷ 接诊量 ×100%
        json.put("kf_hb", getRange((kf_total - kf_period), kf_period, 0));//环比
        json.put("kf_tb", getRange((kf_total - kf_periodYear), kf_periodYear, 0));//同比
        //门诊转住院
        String sql = "select COUNT(DISTINCT r.id) from wlyy_outpatient_hospitalization r,base_doctor_hospital bdh,base_doctor bd,dict_hospital_dept hd " +
                "WHERE r.doctor=bdh.doctor_code and bdh.doctor_code = bd.id AND hd.code= bdh.dept_code " +
                "AND bdh.del=1 AND hd.CONSULT_DEPT_FLAG='1' AND bd.job_title_code IN('1201','1301','1401','1101','066','067','061','1310','061','065','1','2','3','4') ";
        //本周期
        String sql01 = sql + " and r.create_time>='"+qvo.getStartDate()+"' and r.create_time<='"+qvo.getEndDate()+" 23:59:59'";
        //上个周期
        String sql02 = sql + " and r.create_time>='"+period[0]+"' and r.create_time<='"+period[1]+" 23:59:59'";
        //去年同期
        String sql03 = sql + " and r.create_time>='"+periodYear[0]+"' and r.create_time<='"+periodYear[1]+" 23:59:59'";
        if("5".equals(qvo.getLevel())){
            //科室
            sql01 += " and hd.code='"+qvo.getArea()+"' ";
            sql02 += " and hd.code='"+qvo.getArea()+"' ";
            sql03 += " and hd.code='"+qvo.getArea()+"' ";
        }
        if("6".equals(qvo.getLevel())){
            //医生
            sql01 += " and r.doctor='"+qvo.getArea()+"' ";
            sql02 += " and r.doctor='"+qvo.getArea()+"' ";
            sql03 += " and r.doctor='"+qvo.getArea()+"' ";
        }
        //已接诊的复诊数
        String sql04 = sql01.replace("wlyy_outpatient_hospitalization","wlyy_outpatient");
        sql04 += " and r.status IN(1,2,3) and r.outpatient_type !='3' ";
        Integer hospitalization01 = jdbcTemplate.queryForObject(sql01,Integer.class);
        Integer hospitalization02 = jdbcTemplate.queryForObject(sql02,Integer.class);
        Integer hospitalization03 = jdbcTemplate.queryForObject(sql03,Integer.class);
        Integer hospitalization04 = jdbcTemplate.queryForObject(sql04,Integer.class);
        json.put("ar_total", hospitalization01);//门诊转住院量
        json.put("ar_kfl", getRange(hospitalization01, hospitalization04, 0));//【转化率】= 门诊转住院量 ÷ 已接诊的复诊数 ×100%
        json.put("ar_hb", getRange((hospitalization01 - hospitalization02), hospitalization02, 0));//环比
        json.put("ar_tb", getRange((hospitalization01 - hospitalization03), hospitalization03, 0));//同比
        return json;
    }
    /**
     * 业务分析
     * 1、【总问诊量】= 用户成功发起的问诊次数,包含取消的订单(同一人发起多次累计多次);
     * 2、图文门诊、图文咨询、视频问诊、视频咨询、社区协诊 = 患者发起的属于该类型的订单次数(同一人发起多次累计多次);
     * 3、【处方量】 = 成功开方且审核通过的数量;
     * 4、【接诊率】 = 接诊量 ÷ 问诊量 × 100%;
     * 5、【问诊转住院】 = 医生登记住院申请的次数;
     * 6、根据页面显示医院总数据或科室数据!
     */
    public JSONObject businessAnalysis(ScreenQvo qvo) throws Exception{
        JSONObject json = new JSONObject();
        //----------------------问诊量--------------------------------------
        List<SaveModel> wz_model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, null);//问诊
        //问诊类型 17	视频咨询        //1	图文咨询        //9	图文复诊        //12	专科协同        //16	视频复诊
        List<SaveModel> wz_model01_17 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "17");
        List<SaveModel> wz_model01_1 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "1");
        List<SaveModel> wz_model01_9 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "9");
        List<SaveModel> wz_model01_12 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "12");
        List<SaveModel> wz_model01_16 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, null, "16");
        json.put("wzType17", countListTotal(wz_model01_17));//问诊类型_视频咨询
        json.put("wzType1", countListTotal(wz_model01_1));//问诊类型_图文咨询
        json.put("wzType9", countListTotal(wz_model01_9));//问诊类型_图文复诊
        json.put("wzType12", countListTotal(wz_model01_12));//问诊类型_专科协同
        json.put("wzType16", countListTotal(wz_model01_16));//问诊类型_视频复诊
        //---------------------【处方量】------------------------------------
        List<SaveModel> cf_model01 = elasticsearchUtil.findListDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "2", SaveModel.timeLevel_ZL, null, null);//开方量
        //---------------------【接诊量】------------------------------------
        //接诊量-已接诊
        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");
        //接诊量
        int patientVolume = countListTotal(jz_model01);
        json.put("wzl_jz", patientVolume);//接诊量
        //问诊
        int wzl = countListTotal(wz_model01);
        json.put("wzl_total", wzl);//问诊量
        json.put("wzl_jzl", getRange(patientVolume, wzl, 0));//【接诊率】= 接诊量 ÷ 问诊量 ×100%
        //开方 【处方量】
        int kf_total = countListTotal(cf_model01);
        //去年同周期
        json.put("kf_total", kf_total);//开方量
        json.put("kf_kfl", getRange(kf_total, patientVolume, 0));//【处方率】= 处方量 ÷ 接诊量 ×100%
        //门诊转住院
        String sql = "select COUNT(DISTINCT r.id) from wlyy_outpatient_hospitalization r,base_doctor_hospital bdh,base_doctor bd,dict_hospital_dept hd " +
                "WHERE r.doctor=bdh.doctor_code and bdh.doctor_code = bd.id AND hd.code= bdh.dept_code " +
                "AND bdh.del=1 AND hd.CONSULT_DEPT_FLAG='1' AND bd.job_title_code IN('1201','1301','1401','1101','066','067','061','1310','061','065','1','2','3','4') ";
        //本周期
        String sql01 = sql + " and r.create_time>='"+qvo.getStartDate()+"' and r.create_time<='"+qvo.getEndDate()+" 23:59:59'";
        if("5".equals(qvo.getLevel())){
            //科室
            sql01 += " and hd.code='"+qvo.getArea()+"' ";
        }
        if("6".equals(qvo.getLevel())){
            //医生
            sql01 += " and r.doctor='"+qvo.getArea()+"' ";
        }
        //已接诊的复诊数
        String sql04 = sql01.replace("wlyy_outpatient_hospitalization","wlyy_outpatient");
        sql04 += " and r.status IN(1,2,3) and r.outpatient_type !='3' ";
        Integer hospitalization01 = jdbcTemplate.queryForObject(sql01,Integer.class);
        Integer hospitalization04 = jdbcTemplate.queryForObject(sql04,Integer.class);
        json.put("ar_total", hospitalization01);//门诊转住院量
        json.put("ar_kfl", getRange(hospitalization01, hospitalization04, 0));//【转化率】= 门诊转住院量 ÷ 已接诊的复诊数 ×100%
        return json;
    }
    /**
     * 业务增长趋势
     * 1、显示展示的时间范围内的收入趋势图,默认按日展示,支持管理员点击区域右上角进行“日、周、月”进行趋势图X轴的切换;
     * 2、支持管理员点击趋势图上的点位时,展示该点位的时间及各类型的订单数量;
     */
    public JSONObject businessNewTrends(ScreenQvo qvo) throws Exception{
        JSONObject json = new JSONObject();
        //问诊类型 17	视频咨询        //1	图文咨询        //9	图文复诊        //12	专科协同        //16	视频复诊
        List<SaveModel> wz_17 = elasticsearchUtil.findLineChartDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, qvo.getInterval(), "17");
        List<SaveModel> wz_1 = elasticsearchUtil.findLineChartDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, qvo.getInterval(), "1");
        List<SaveModel> wz_9 = elasticsearchUtil.findLineChartDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, qvo.getInterval(), "9");
        List<SaveModel> wz_12 = elasticsearchUtil.findLineChartDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, qvo.getInterval(), "12");
        List<SaveModel> wz_16 = elasticsearchUtil.findLineChartDateQuotaLevel1(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "5", SaveModel.timeLevel_ZL, qvo.getInterval(), "16");
        List<JSONObject> list17 = new ArrayList<>();
        List<JSONObject> list1 = new ArrayList<>();
        List<JSONObject> list9 = new ArrayList<>();
        List<JSONObject> list12 = new ArrayList<>();
        List<JSONObject> list16 = new ArrayList<>();
        for (SaveModel saveModel : wz_17) {
            JSONObject range = new JSONObject();
            range.put("range", DateUtil.dateToStr(saveModel.getQuotaDate(), "yyyy-MM-dd"));
            range.put("amount", saveModel.getResult1());
            list17.add(range);
        }
        for (SaveModel saveModel : wz_1) {
            JSONObject range = new JSONObject();
            range.put("range", DateUtil.dateToStr(saveModel.getQuotaDate(), "yyyy-MM-dd"));
            range.put("amount", saveModel.getResult1());
            list1.add(range);
        }
        for (SaveModel saveModel : wz_9) {
            JSONObject range = new JSONObject();
            range.put("range", DateUtil.dateToStr(saveModel.getQuotaDate(), "yyyy-MM-dd"));
            range.put("amount", saveModel.getResult1());
            list9.add(range);
        }
        for (SaveModel saveModel : wz_12) {
            JSONObject range = new JSONObject();
            range.put("range", DateUtil.dateToStr(saveModel.getQuotaDate(), "yyyy-MM-dd"));
            range.put("amount", saveModel.getResult1());
            list12.add(range);
        }
        for (SaveModel saveModel : wz_16) {
            JSONObject range = new JSONObject();
            range.put("range", DateUtil.dateToStr(saveModel.getQuotaDate(), "yyyy-MM-dd"));
            range.put("amount", saveModel.getResult1());
            list16.add(range);
        }
        json.put("wz_1",list1);
        json.put("wz_9",list9);
        json.put("wz_12",list12);
        json.put("wz_16",list16);
        json.put("wz_17",list17);
        return json;
    }
    /**
     * 接诊排行
     */
    public List<JSONObject> businessRanking(ScreenQvo qvo) throws Exception{
        String level2_type = qvo.getLevel2_type();
        List<SaveModel> saveModels = elasticsearchUtil.findDateQuotaLevel2New(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(),
                "12,14,16", "1", "9,16,12,1,17", "1",null,level2_type);
        List<JSONObject> result = new ArrayList<>();
        for (SaveModel saveModel : saveModels) {
            JSONObject object1 = new JSONObject();
            if (level2_type.equals(SaveModel.deptLevel)) {
                object1.put("dept", saveModel.getDept());
                object1.put("deptName", saveModel.getDeptName());
            } else if (level2_type.equals(SaveModel.doctorLevel)) {
                object1.put("doctor", saveModel.getDoctor());
                object1.put("doctorName", saveModel.getDoctorName());
            } else if (level2_type.equals(SaveModel.OrgLevel)) {
                object1.put("hospital", saveModel.getHospital());
                object1.put("hospitalName", saveModel.getHospitalName());
            }
            object1.put("result1", saveModel.getResult1());
            object1.put("result2", saveModel.getResult2());
            result.add(object1);
        }
        // 排序
        result.sort(new Comparator<JSONObject>() {
            @Override
            public int compare(JSONObject o1, JSONObject o2) {
                if (o1.getString("result1").compareTo(o2.getString("result1")) > 0) {
                    return -1;
                } else if (o1.getString("result1").compareTo(o2.getString("result1")) < 0) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });
        return result;
    }
    /**
     * 收入情况
     1、【总收入】=药品费+诊查费;
@ -6792,6 +7061,117 @@ public class StatisticsEsService {
        return json;
    }
    /**
     * 收入分析
     1、【总收入】= 药品费+诊查费;
     2、【药品费】= 患者支付的处方费用;
     3、【诊查费】= 图文门诊+图文咨询+视频问诊+视频咨询+社区协诊;
     4、图文门诊、图文咨询、视频问诊、视频咨询、社区协诊 = 患者支付的属于该类型的诊查费;
     5、根据页面显示医院总数据或科室数据!
     */
    public JSONObject incomeAnalysis(ScreenQvo qvo) throws Exception{
        JSONObject json = new JSONObject();
        String lowLevel = "2";
        String index3 = "3";//处方费/药品费
        String index21 = "21";//诊查费
        //图文问诊、图文咨询、视频问诊、视频咨询、社区协诊=患者支付的属于该类型的诊查费
        //药品费
        double ypFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index3, SaveModel.timeLevel_ZL, null, null, null,lowLevel);
        //诊查费
        double zcFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index21, SaveModel.timeLevel_ZL, null, null, null,lowLevel);
        //总收入
        double totalFee = ypFee+zcFee;
        //图文问诊
        double ppFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index21, SaveModel.timeLevel_ZL, "1", "1", null,lowLevel);
        //图文咨询
        double pcFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index21, SaveModel.timeLevel_ZL, "3", "1", null,lowLevel);
        //视频问诊
        double vpFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index21, SaveModel.timeLevel_ZL, "1", "2", null,lowLevel);
        //视频咨询
        double vcFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index21, SaveModel.timeLevel_ZL, "3", "2", null,lowLevel);
        //社区协诊
        double sxFee = findResult1BySaveModelList(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), index21, SaveModel.timeLevel_ZL, "2", null, null,lowLevel);
        json.put("ypFee",ypFee);
        json.put("zcFee",zcFee);
        json.put("totalFee",totalFee);
        json.put("ppFee",ppFee);
        json.put("pcFee",pcFee);
        json.put("vpFee",vpFee);
        json.put("vcFee",vcFee);
        json.put("sxFee",sxFee);
        return json;
    }
    /**
     * 收入新增趋势
     * 1、显示展示的时间范围内的收入趋势图,默认按日展示,支持管理员点击区域右上角进行“日、周、月”进行趋势图X轴的切换;
     * 2、支持管理员点击趋势图上的点位时,展示该点位的时间及收入;
     */
    public List<JSONObject> incomeNewTrends(ScreenQvo qvo) throws Exception{
        //药品费+诊查费=总收入
        List<SaveModel> list = elasticsearchUtil.findLineChartDateQuotaLevel0(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(),
                qvo.getLevel(), "3,21", SaveModel.timeLevel_ZL, qvo.getInterval());
        List<JSONObject> feeList = new ArrayList<>();
        for (SaveModel saveModel : list) {
            JSONObject range = new JSONObject();
            range.put("range", DateUtil.dateToStr(saveModel.getQuotaDate(), "yyyy-MM-dd"));
            range.put("amount", saveModel.getResult1());
            feeList.add(range);
        }
        return feeList;
    }
    /**
     * 收入排行
     */
    public List<JSONObject> incomeRanking(ScreenQvo qvo) throws Exception{
        //药品费+诊查费=总收入
        String level2_type = qvo.getLevel2_type();
        List<SaveModel> saveModels = elasticsearchUtil.findDateQuotaLevel0(qvo.getStartDate(), qvo.getEndDate(), qvo.getArea(), qvo.getLevel(), "3,21", SaveModel.timeLevel_ZL, null, level2_type);
        List<JSONObject> result = new ArrayList<>();
        for (SaveModel saveModel : saveModels) {
            JSONObject object1 = new JSONObject();
            if (level2_type.equals(SaveModel.deptLevel)) {
                object1.put("dept", saveModel.getDept());
                object1.put("deptName", saveModel.getDeptName());
            } else if (level2_type.equals(SaveModel.doctorLevel)) {
                object1.put("doctor", saveModel.getDoctor());
                object1.put("doctorName", saveModel.getDoctorName());
            } else if (level2_type.equals(SaveModel.OrgLevel)) {
                object1.put("hospital", saveModel.getHospital());
                object1.put("hospitalName", saveModel.getHospitalName());
            }
            object1.put("result1", saveModel.getResult1());
            object1.put("result2", saveModel.getResult2());
            result.add(object1);
        }
        // 排序
        result.sort(new Comparator<JSONObject>() {
            @Override
            public int compare(JSONObject o1, JSONObject o2) {
                if (o1.getString("result1").compareTo(o2.getString("result1")) > 0) {
                    return -1;
                } else if (o1.getString("result1").compareTo(o2.getString("result1")) < 0) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });
        return result;
    }
    public SaveModel findOneBySaveModelList(String startDate, String endDate, String area, int level, String index, String timeLevel,
                                            String slaveKey1, String slaveKey2, String interval, String lowLevel){

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

@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.jw.elasticsearch.ElasticSearch7Util;
import com.yihu.jw.util.date.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
@ -1613,6 +1612,128 @@ public class ElasticsearchUtil {
        return excuteEs7(sql.toString(), SaveModel.class, "", "");
    }
    /**
     * 二级指标查询列表
     * 获取二级指标的增量、到达量
     * 备注:原接口的三级指标对应现在的二级指标
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param area      区域code
     * @param level     等级
     * @param index     指标
     * @param timeLevel 1增量 2到达量
     * @param slaveKey1 一级维度code
     * @param slaveKey2 二级维度code
     * @param interval  1日 2周 3月
     * @param lowLevel  下一等级
     * @return
     */
    public List findDateQuotaLevel2New(String startDate, String endDate, String area, int level, String index, String timeLevel, String slaveKey1, String slaveKey2, String interval, String lowLevel) {
        //时间格式转换  yyyy-MM-dd转成 2017-07-17T00:00:00+0800
        if (StringUtils.isNotEmpty(startDate)) {
            if (startDate.length() > 10) {
                startDate = changeTime(startDate);
            } else {
                startDate = changeDate(startDate);
            }
        }
        if (StringUtils.isNotEmpty(endDate)) {
            if (endDate.length() > 10) {
                endDate = changeTime(endDate);
            } else {
                endDate = changeDate(endDate);
            }
        }
        StringBuffer sql = new StringBuffer();
        StringBuffer groupBy = new StringBuffer();
        String low_level = level + "";
        if (StringUtils.isNotEmpty(lowLevel)) {
            low_level = lowLevel;
        }
        StringBuffer condition = new StringBuffer();
        if (StringUtils.isNotEmpty(interval)) {
            if (SaveModel.interval_month.equals(interval)) {
                condition.append(" ,to_char(date_trunc('month',quotaDate),'yyyy-MM-dd') as quotaDate ");
            } else if (SaveModel.interval_week.equals(interval)) {
                condition.append(" ,to_char(date_trunc('week',quotaDate),'yyyy-MM-dd') as quotaDate ");
            } else if (SaveModel.interval_day.equals(interval)) {
                condition.append(" ,to_char(date_trunc('day',quotaDate),'yyyy-MM-dd') as quotaDate ");
            }
        }
        if (SaveModel.doctorLevel.equals(low_level)) {
            groupBy.append("  group by doctor,doctorName");
            sql.append("select doctor as doctor,doctorName as doctorName,sum(result1) as result1,sum(result2) as result2 "+condition+" from " + esIndex + " where ");
        }else if (SaveModel.deptLevel.equals(low_level)) {
            groupBy.append("  group by dept,deptName");
            sql.append("select dept as dept,deptName as deptName,sum(result1) as result1,sum(result2) as result2"+condition+" from " + esIndex + " where ");
        } else if (SaveModel.OrgLevel.equals(low_level)) {
            sql.append("select hospital as hospital,hospitalName as hospitalName,sum(result1) as result1,sum(result2) as result2 from " + esIndex + " where ");
            groupBy.append("  group by hospital,hospitalName");
        } else if (SaveModel.townLevel.equals(low_level)) {
            groupBy.append("  group by town,townName");
            sql.append("select town as town,townName as townName,sum(result1) as result1,sum(result2) as result2"+condition+" from " + esIndex + " where ");
        } else if (SaveModel.cityLevel.equals(low_level)) {
            groupBy.append("  group by city,cityName");
            sql.append("select city as city,cityName as cityName,sum(result1) as result1,sum(result2) as result2"+condition+" from " + esIndex + " where ");
        }
        if (StringUtils.isNotEmpty(area)) {
            if (SaveModel.doctorLevel.equals(level + "")) {
                sql.append(" doctor='" + area + "'");
            }else if (SaveModel.deptLevel.equals(level + "")) {
                sql.append(" dept='" + area + "'");
            } else if (SaveModel.OrgLevel.equals(level + "")) {
                sql.append(" hospital='" + area + "'");
            } else if (SaveModel.townLevel.equals(level + "")) {
                sql.append(" town='" + area + "'");
            } else if (SaveModel.cityLevel.equals(level + "")) {
                sql.append(" city='" + area + "'");
            }
            sql.append(" and ");
        }
        sql.append(" quotaCode in(" + index + ")  ");
        sql.append(" and timeLevel='" + timeLevel + "'  ");
        sql.append(" and areaLevel='6'");
        if (StringUtils.isNotEmpty(startDate)) {
            sql.append(" and quotaDate>='" + startDate + "'");
        }
        if (StringUtils.isNotEmpty(endDate)) {
            sql.append(" and quotaDate<='" + endDate + "'");
        }
        if (StringUtils.isNotBlank(slaveKey1) && (!commonParams.equals(slaveKey1))) {
            String[] str = slaveKey1.split(",");
            StringBuffer buffer = new StringBuffer();
            for (int i=0;i<str.length;i++){
                buffer.append("'"+str[i]+"',");
            }
            buffer.deleteCharAt(buffer.length()-1);
            sql.append(" and slaveKey1 in (" + buffer + ")");
        }
        if (StringUtils.isNotBlank(slaveKey2) && (!commonParams.equals(slaveKey2))) {
            String[] str = slaveKey2.split(",");
            StringBuffer buffer = new StringBuffer();
            for (int i=0;i<str.length;i++){
                buffer.append("'"+str[i]+"',");
            }
            buffer.deleteCharAt(buffer.length()-1);
            sql.append(" and slaveKey2 in (" + buffer + ")");
        }
        //根据时间维度分组
        if (StringUtils.isNotEmpty(interval)) {
            if (SaveModel.interval_month.equals(interval)) {
                groupBy.append(" ,to_char(date_trunc('month',quotaDate),'yyyy-MM-dd') ");
            } else if (SaveModel.interval_week.equals(interval)) {
                groupBy.append(" ,to_char(date_trunc('week',quotaDate),'yyyy-MM-dd') ");
            } else if (SaveModel.interval_day.equals(interval)) {
                groupBy.append(" ,to_char(date_trunc('day',quotaDate),'yyyy-MM-dd') ");
            }
        }
        sql.append(groupBy);
        logger.info("sql :" + sql.toString());
        return excuteEs7(sql.toString(), SaveModel.class, "", "");
    }
    /**
     * 多维度指标查寻(可控纬度与分组)
     * @param startDate

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

@ -18,6 +18,8 @@ public class ScreenQvo {
    private String area;//区域code
    private int level;//等级
    private String index;//指标
    private String interval;//1日 2周 3月 (按照日周月聚合)
    private String level2_type;//6医生 5科室 4医院
    private int flag;//1本月 2近半年 3全年
@ -199,4 +201,20 @@ public class ScreenQvo {
   public void setSsc(String ssc) {
      this.ssc = ssc;
   }
    public String getInterval() {
        return interval;
    }
    public void setInterval(String interval) {
        this.interval = interval;
    }
    public String getLevel2_type() {
        return level2_type;
    }
    public void setLevel2_type(String level2_type) {
        this.level2_type = level2_type;
    }
}

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

@ -1901,10 +1901,10 @@ class EsStatisticsEndpoint extends EnvelopRestEndpoint {
    }
    /**
     * 收入情况
     * 收入情况说明
     * strJson={"startDate":"2024-01-01","endDate":"2024-05-27","area":"350200","level":2}
     */
    @GetMapping(value = "/incomeSituation")
    @GetMapping(value = "incomeSituation")
    @ApiOperation(value = "收入情况")
    public ObjEnvelop incomeSituation(@RequestParam(required = true) String strJson) {
        try {
@ -1917,6 +1917,93 @@ class EsStatisticsEndpoint extends EnvelopRestEndpoint {
        }
    }
    /**
     * 业务情况说明
     * strJson={"startDate":"2024-01-01","endDate":"2024-05-27","area":"350200","level":2}
     */
    @GetMapping(value = "businessSituation")
    @ApiOperation(value = "业务情况说明")
    public ObjEnvelop businessSituation(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            JSONObject json = statisticsEsService.businessSituation(qvo);
            return ObjEnvelop.getSuccess("查询成功",json);
        } catch (Exception e) {
            e.printStackTrace();
            return ObjEnvelop.getError("查询失败");
        }
    }
    @GetMapping(value = "incomeAnalysis")
    @ApiOperation(value = "收入分析")
    public ObjEnvelop incomeAnalysis(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            JSONObject json = statisticsEsService.incomeAnalysis(qvo);
            return ObjEnvelop.getSuccess("查询成功",json);
        } catch (Exception e) {
            e.printStackTrace();
            return ObjEnvelop.getError("查询失败");
        }
    }
    @GetMapping(value = "incomeNewTrends")
    @ApiOperation(value = "收入新增趋势")
    public ListEnvelop incomeNewTrends(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            List<JSONObject> list = statisticsEsService.incomeNewTrends(qvo);
            return ListEnvelop.getSuccess("查询成功",list);
        } catch (Exception e) {
            e.printStackTrace();
            return ListEnvelop.getError("查询失败");
        }
    }
    @GetMapping(value = "incomeRanking")
    @ApiOperation(value = "收入排行")
    public ListEnvelop incomeRanking(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            List<JSONObject> list = statisticsEsService.incomeRanking(qvo);
            return ListEnvelop.getSuccess("查询成功",list);
        } catch (Exception e) {
            e.printStackTrace();
            return ListEnvelop.getError("查询失败");
        }
    }
    @GetMapping(value = "businessAnalysis")
    @ApiOperation(value = "业务分析")
    public ObjEnvelop businessAnalysis(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            JSONObject json = statisticsEsService.businessAnalysis(qvo);
            return ObjEnvelop.getSuccess("查询成功",json);
        } catch (Exception e) {
            e.printStackTrace();
            return ObjEnvelop.getError("查询失败");
        }
    }
    @GetMapping(value = "businessNewTrends")
    @ApiOperation(value = "业务增长趋势")
    public ObjEnvelop businessNewTrends(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            JSONObject json = statisticsEsService.businessNewTrends(qvo);
            return ObjEnvelop.getSuccess("查询成功",json);
        } catch (Exception e) {
            e.printStackTrace();
            return ObjEnvelop.getError("查询失败");
        }
    }
    @GetMapping(value = "businessRanking")
    @ApiOperation(value = "接诊排行")
    public ListEnvelop businessRanking(@RequestParam(required = true) String strJson) {
        try {
            ScreenQvo qvo = JSON.parseObject(strJson, ScreenQvo.class);
            List<JSONObject> list = statisticsEsService.businessRanking(qvo);
            return ListEnvelop.getSuccess("查询成功",list);
        } catch (Exception e) {
            e.printStackTrace();
            return ListEnvelop.getError("查询失败");
        }
    }
}