Browse Source

完整性、及时性、准确性趋势性能优化

zhengwei 6 years ago
parent
commit
fdbb01233c

+ 227 - 62
src/main/java/com/yihu/ehr/analyze/service/dataQuality/DataQualityHomeService.java

@ -686,13 +686,69 @@ public class DataQualityHomeService extends BaseJpaService {
    public Map<String, Object> homeTrend(String flag, int dataType, String month) throws Exception {
        Map<String, Object> map  = new HashMap<>();
        List<Double> data = new ArrayList<>();
        List<String> name = getName(flag, month);
        if(dataType==0){
            Map<String,Object> hospitalDataMap = packQcReportService.getHospitalNum(flag,month);
            Map<String,Object> map1  =getTotalVisitNum(flag, month);
            for(int i=0;i<name.size();i++){
                if(map1.get(name.get(i))!=null&&hospitalDataMap.get(name.get(i))!=null){
                    if(Double.parseDouble(hospitalDataMap.get(name.get(i))+"")!=0){
                        double rate = (long)map1.get(name.get(i))/(double)hospitalDataMap.get(name.get(i))*100;
                        data.add((double) Math.round(rate * 100) / 100);
                    }else{
                        data.add(0.0);
                    }
                }else{
                    data.add(0.0);
                }
            }
        }else if(dataType==1){
            Map<String,Object> hospitalDataMap = packQcReportService.getHospitalNum(flag,month);
            for(int i=0;i<name.size();i++){
                //2. 及时数
                String start="";
                String end="";
                if("10".equals(flag)){
                    start = name.get(i)+"01";
                    end =  DateUtil.getLastDate(start, "yyyy-MM-dd", "yyyy-MM-dd");
                }else{
                    start=name.get(i);
                    end=name.get(i);
                }
                double totalInTime = getInTimeNum("receive_date" ,start, end);
                if(hospitalDataMap.get(name.get(i))!=null&&Double.parseDouble(hospitalDataMap.get(name.get(i))+"")!=0){
                    double rate = totalInTime/(double)hospitalDataMap.get(name.get(i))*100;
                    data.add((double) Math.round(rate * 100) / 100);
                }else{
                    data.add(0.0);
                }
            }
        }else if(dataType==2){
            Map<String,Object> map1 = getErrorDataSetData(flag, month);
            Map<String,Object> map2 = getTotalDataSets(flag, month);
            for(int i=0;i<name.size();i++){
                if(map1.get(name.get(i))!=null&&map2.get(name.get(i))!=null){
                    if(Double.parseDouble(map2.get(name.get(i))+"")!=0){
                        double rate = (double)map1.get(name.get(i))/(double)map2.get(name.get(i))*100;
                        data.add((double) Math.round(rate * 100) / 100);
                    }else{
                        data.add(0.0);
                    }
                }else{
                    data.add(0.0);
                }
            }
        }
        map.put("data", data);
        map.put("name", name);
        return map;
    }
    private List<String> getName(String flag ,String month) throws Exception{
        List<String> name = new ArrayList<>();
        if("10".equals(flag)){//按月
            for(int i=5;i>=0;i--){
            for(int i=6;i>0;i--){
                String start =  DateUtil.formatDate(DateUtil.addMonth(0-i, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM");
                String end =  DateUtil.getLastDate (start+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
                double rate = getRate(dataType, start+"-01", end);
                data.add((double) Math.round(rate * 100) / 100);
                name.add(start);
            }
        }else{//按日
@ -700,16 +756,12 @@ public class DataQualityHomeService extends BaseJpaService {
            if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
                for(int i=0;i<30;i++){
                    String date = DateUtil.toString(DateUtil.addDate(0-i,new Date()));
                    double rate = getRate(dataType, date, date);
                    data.add (0,(double) Math.round(rate * 100) / 100);
                    name.add(0,date);
                }
            }else{
                String end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
                for(int i=0;i<32;i++){
                    String date = DateUtil.toString(DateUtil.addDate(i,DateUtil.strToDate(month+"-01")));
                    double rate = getRate(dataType, date, date);
                    data.add ((double) Math.round(rate * 100) / 100);
                    name.add(date);
                    if(date.equals(end)){
                        break;
@ -717,62 +769,9 @@ public class DataQualityHomeService extends BaseJpaService {
                }
            }
        }
        map.put("data", data);
        map.put("name", name);
        return map;
        return name;
    }
    /**
     * 获取比例
     * @param dataType
     * @param start
     * @param end
     * @return
     */
    public double getRate(int dataType, String start, String end) throws Exception{
        int totalHospitalNum = 0;//医院总就诊数
        double totalInTime = 0;//总及时数
        double totalVisitNum = 0;//总完整数(平台总就诊数)
        double totalCorrect = 0;//总准确数
        //1. 获取医院档案量;
        Envelop envelop = packQcReportService.dailyReport("create_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
        Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
        //医院总数据量
        totalHospitalNum = (int) hospitalDataMap.get("total");
        if(dataType==0){
            //1. 平台就诊完整数
            Map<String, Object> dataMap = new HashMap<>();
            getPatientCount("receive_date",start, end, null, dataMap);
            totalVisitNum = Double.valueOf(dataMap.get("visitIntegrity").toString());//就诊完整数
            if(totalHospitalNum==0){
                return 0.0;
            }else{
                return totalVisitNum/totalHospitalNum*100;
            }
        }else if (dataType==1){
            //2. 及时数
            totalInTime = getInTimeNum("receive_date" ,start, end);
            if(totalHospitalNum==0){
                return 0.0;
            }else{
                return totalInTime/totalHospitalNum*100;
            }
        }else{
            //3. 去重准确数【】
            totalCorrect = getErrorDataSetData("receive_date",start, end, null);
            //4. 数据集总量
            double dataSetsMun = getDataSetsMap(start, end, null);
            if(dataSetsMun==0){
                return 0.0;
            }else{
                return totalCorrect/dataSetsMun*100;
            }
        }
    }
    public Map<String, Object> getHealthyArchiveTrend(String flag,String month) throws Exception {
        Map<String, Object> resMap  = new HashMap<>();
        List<String> date = new ArrayList<>();
@ -860,4 +859,170 @@ public class DataQualityHomeService extends BaseJpaService {
        return map;
    }
    /**
     * 平台人数 去重复
     * @param flag 10按月 20按日
     * @param month
     * @return
     * @throws Exception
     */
    public Map<String, Object> getTotalVisitNum(String flag, String month) throws Exception {
        TreeMap<String, Object> map  = new TreeMap<>();
        TransportClient transportClient = elasticSearchPool.getClient();
        String start =  "";
        String end =  "";
        AggregationBuilder aggregation =null;
        if("10".equals(flag)){//按月
            start =  DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
            end =  DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
            aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
                    .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
        }else{//按日
            //当前月份显示最近30天,否则显示当月的数据
            if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
                start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }else{
                start = month+"-01";
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }
            aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
                    .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
        }
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("pack_type=1;");
        stringBuilder.append("receive_date>=" + start + " 00:00:00;");
        stringBuilder.append("receive_date<" + end + " 23:59:59;");
        CardinalityBuilder childTerms = AggregationBuilders.cardinality("count").field("event_no").precisionThreshold(40000);
        SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives")
                .setTypes("info");
        requestBuilder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
        requestBuilder.addAggregation(aggregation.subAggregation(childTerms));
        requestBuilder.addSort("receive_date", SortOrder.DESC);
        SearchResponse response = requestBuilder.execute().actionGet();
        Histogram agg = response.getAggregations().get("agg");
        for (Histogram.Bucket entry : agg.getBuckets()) {
            String keyAsString = entry.getKeyAsString();
            long docCount = entry.getDocCount();
            InternalCardinality extendedStats = entry.getAggregations().get("count");
            map.put(keyAsString,extendedStats.getValue());
        }
        return map;
    }
    /**
     * 获取数据集总量
     *
     * @return
     */
    public Map<String, Object> getTotalDataSets(String flag, String month) throws Exception {
        TreeMap<String, Object> map  = new TreeMap<>();
        TransportClient transportClient = elasticSearchPool.getClient();
        String start =  "";
        String end =  "";
        AggregationBuilder aggregation =null;
        if("10".equals(flag)){//按月
            start =  DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
            end =  DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
            aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
                    .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
        }else{//按日
            //当前月份显示最近30天,否则显示当月的数据
            if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
                start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }else{
                start = month+"-01";
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }
            aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
                    .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
        }
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("receive_date>=" + start + " 00:00:00;");
        stringBuilder.append("receive_date<=" + end + " 23:59:59;");
        SumBuilder terms = AggregationBuilders.sum("sumCount").field("count");
        SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives_qc")
                .setTypes("qc_dataset_detail");
        requestBuilder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
        requestBuilder.addAggregation(aggregation.subAggregation(terms));
        requestBuilder.addSort("receive_date", SortOrder.DESC);
        SearchResponse response = requestBuilder.execute().actionGet();
        Histogram agg = response.getAggregations().get("agg");
        for (Histogram.Bucket entry : agg.getBuckets()) {
            String keyAsString = entry.getKeyAsString();
            InternalSum longTerms = entry.getAggregations().get("sumCount");
            map.put(keyAsString,longTerms.getValue());
        }
        return map;
    }
    /**
     * 获取质控错误 - 数据集总条数
     * @return
     */
    public Map<String,Object> getErrorDataSetData(String flag, String month)throws Exception {
        TreeMap<String, Object> map  = new TreeMap<>();
        TransportClient transportClient = elasticSearchPool.getClient();
        String start =  "";
        String end =  "";
        AggregationBuilder aggregation =null;
        if("10".equals(flag)){//按月
            start =  DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
            end =  DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
            aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
                    .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
        }else{//按日
            //当前月份显示最近30天,否则显示当月的数据
            if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
                start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }else{
                start = month+"-01";
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }
            aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
                    .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
        }
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("receive_date>=" + start + " 00:00:00;");
        stringBuilder.append("receive_date<=" + end + " 23:59:59;");
        stringBuilder.append("qc_step=1||qc_step=2;");
        AggregationBuilder terms = AggregationBuilders.terms("dataset").field("dataset").size(200);
        CardinalityBuilder childTerms = AggregationBuilders.cardinality("count").field("pack_id").precisionThreshold(40000);
        terms.subAggregation(childTerms);
        SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives_qc")
                .setTypes("qc_metadata_info");
        requestBuilder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
        requestBuilder.addAggregation(aggregation.subAggregation(terms));
        requestBuilder.addSort("receive_date", SortOrder.DESC);
        SearchResponse response = requestBuilder.execute().actionGet();
        Histogram agg = response.getAggregations().get("agg");
        for (Histogram.Bucket entry : agg.getBuckets()) {
            String keyAsString = entry.getKeyAsString();
            StringTerms longTerms = entry.getAggregations().get("dataset");
            double num = 0;
            for (Terms.Bucket item : longTerms.getBuckets()) {
                InternalCardinality extendedStats = item.getAggregations().get("count");
               num+=extendedStats.getValue();
            }
            map.put(keyAsString,num);
        }
        return map;
    }
}

+ 65 - 1
src/main/java/com/yihu/ehr/analyze/service/pack/PackQcReportService.java

@ -31,6 +31,9 @@ import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInter
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.metrics.sum.InternalSum;
import org.elasticsearch.search.aggregations.metrics.sum.SumBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
@ -89,7 +92,7 @@ public class PackQcReportService extends BaseJpaService {
        startRange.gte(startDate);
        boolQueryBuilder.must(startRange);
        RangeQueryBuilder endRange = QueryBuilders.rangeQuery("event_date");
        RangeQueryBuilder endRange = QueryBuilders.rangeQuery(dateField);
        endRange.lt(DateUtil.toString(end));
        boolQueryBuilder.must(endRange);
@ -119,6 +122,67 @@ public class PackQcReportService extends BaseJpaService {
        return envelop;
    }
    /**
     * 健康档案建档数
     * @param flag 10按月 20按日
     * @param month
     * @return
     * @throws Exception
     */
    public Map<String, Object> getHospitalNum(String flag, String month) throws Exception {
        TreeMap<String, Object> map  = new TreeMap<>();
        TransportClient transportClient = elasticSearchPool.getClient();
        String start =  "";
        String end =  "";
        AggregationBuilder aggregation =null;
        if("10".equals(flag)){//按月
            start =  DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
            end =  DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
            aggregation = AggregationBuilders.dateHistogram("agg").field("create_date")
                    .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
        }else{//按日
            //当前月份显示最近30天,否则显示当月的数据
            if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
                start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }else{
                start = month+"-01";
                end =  DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
            }
            aggregation = AggregationBuilders.dateHistogram("agg").field("create_date")
                    .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
        }
        // 声明where 条件
        BoolQueryBuilder qbs = QueryBuilders.boolQuery();
        RangeQueryBuilder startRange = QueryBuilders.rangeQuery("create_date");
        startRange.gte(start + "T00:00:00Z");
        qbs.must(startRange);
        RangeQueryBuilder endRange = QueryBuilders.rangeQuery("create_date");
        endRange.lt(end+"T23:59:59Z");
        qbs.must(endRange);
        SumBuilder terms = AggregationBuilders.sum("sumCount").field("HSI07_01_001");
        SearchRequestBuilder requestBuilder = transportClient.prepareSearch("qc")
                .setTypes("daily_report");
        requestBuilder.setQuery(qbs);
        requestBuilder.addAggregation(aggregation.subAggregation(terms));
        requestBuilder.addSort("create_date", SortOrder.DESC);
        SearchResponse response = requestBuilder.execute().actionGet();
        Histogram agg = response.getAggregations().get("agg");
        for (Histogram.Bucket entry : agg.getBuckets()) {
            String key = entry.getKey().toString();
            String keyAsString = entry.getKeyAsString();
            InternalSum longTerms = entry.getAggregations().get("sumCount");
            map.put(keyAsString,longTerms.getValue());
        }
        return map;
    }
    /**
     * 获取资源化数据
     * @param startDate