Browse Source

Merge branch 'dev-1.13.0' of http://192.168.1.220:10080/EHR/svr-quota into dev-1.13.0

jkzlzhoujie 6 năm trước cách đây
mục cha
commit
4d4e3c7514

+ 3 - 3
src/main/java/com/yihu/quota/model/view/ViewQuotaFilter.java

@ -27,7 +27,7 @@ public class ViewQuotaFilter extends BaseAssignedEntity {
    private String filterType; // 过滤条件类型,view:视图,quota:指标。
    private String relationType; // 关系类型,关系类型,and:且,or:或
    private String compareType; //比较类型,belong:属于,not_belong:不属于,null:为空,not_null:非空,gt:大于,gte:大于等于,小于:lt,小于等于:lte,contain:包含,not_contain:不包含
    private Object filterValue; //过滤的值
    private String filterValue; //过滤的值
    @Column(name = "relation_id")
    public Integer getRelationId() {
@ -111,11 +111,11 @@ public class ViewQuotaFilter extends BaseAssignedEntity {
    }
    @Column(name = "filter_value")
    public Object getFilterValue() {
    public String getFilterValue() {
        return filterValue;
    }
    public void setFilterValue(Object filterValue) {
    public void setFilterValue(String filterValue) {
        this.filterValue = filterValue;
    }
}

+ 96 - 94
src/main/java/com/yihu/quota/service/view/ViewService.java

@ -123,7 +123,7 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
     *
     * @param viewCode        视图编码
     * @param filterModelList 页面的过滤条件模型集合
     * @return 聚合对象
     * @return ES聚合对象
     * @author 张进军
     */
    public Aggregations statViewResult(String viewCode, List<ViewQuotaFilterModel> filterModelList) throws Exception {
@ -201,7 +201,7 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
                        if (i == otherRowDimensionCount - 1) {
                            // 末端行维度场合
                            // 汇总列维度的聚合及嵌套其指标聚合,并列嵌套于末端行维度的聚合
                            // 汇总列维度的聚合及嵌套其指标聚合,并列嵌套于末端行维度的聚合。
                            this.gatherColDimensionsAndQuotasAgg(rowAgg, otherRowDimension, colDimensionList, viewQuotaList);
                            preRowAgg = rowAgg;
                        } else {
@ -213,7 +213,7 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
                    }
                } else {
                    // 行维度组内只有一个行维度的场合
                    // 汇总列维度的聚合及嵌套其指标聚合,并列嵌套于顶层行维度的聚合
                    // 汇总列维度的聚合及嵌套其指标聚合,并列嵌套于顶层行维度的聚合。
                    this.gatherColDimensionsAndQuotasAgg(topAgg, topRowDimension, colDimensionList, viewQuotaList);
                }
@ -241,7 +241,7 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
     * @param filterModelList  视图/指标的过滤条件模型集合
     */
    private void joinFilters(BoolQueryBuilder boolQueryBuilder, List<ViewQuotaFilterModel> filterModelList) {
        if (filterModelList.size() != 0) {
        if (filterModelList != null && filterModelList.size() != 0) {
            for (ViewQuotaFilterModel filterModel : filterModelList) {
                String field = filterModel.getDimensionCode();
                Object value = filterModel.getFilterValue();
@ -305,104 +305,18 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
        }
    }
    /**
     * 汇总指标的度量聚合
     *
     * @param viewQuotaList 视图的指标
     * @param viewDimension 视图的行/列维度
     * @return 指标的度量聚合
     * @throws IOException
     */
    private List<AbstractAggregationBuilder> gatherQuotaMetricsAgg(List<ViewQuota> viewQuotaList, ViewDimension viewDimension) throws IOException {
        List<AbstractAggregationBuilder> quotaAggList = new ArrayList<>();
        for (ViewQuota quota : viewQuotaList) {
            if ("basic".equals(quota.getFormulaMode())) {
                String aggNamePre = "";
                if (viewDimension == null) {
                    // 视图展示位数值类型的场合
                    aggNamePre += quota.getCode() + "-";
                } else {
                    // 合计维度场合
                    String dimensionCode = viewDimension.getDimensionCode();
                    aggNamePre = ViewConstant.TOTAL_DIMENSION_CODE.equals(dimensionCode) ? dimensionCode + "-" : "";
                }
                if ("sum".equals(quota.getBasicFormulaType())) {
                    // 求和
                    String aggName = aggNamePre + "sum-result";
                    SumBuilder sumAgg = AggregationBuilders.sum(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(sumAgg, quota));
                } else if ("count".equals(quota.getBasicFormulaType())) {
                    // 计数
                    String aggName = aggNamePre + "count-result";
                    ValueCountBuilder countAgg = AggregationBuilders.count(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(countAgg, quota));
                } else if ("avg".equals(quota.getBasicFormulaType())) {
                    // 均值
                    String aggName = aggNamePre + "avg-result";
                    AvgBuilder avgAgg = AggregationBuilders.avg(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(avgAgg, quota));
                } else if ("max".equals(quota.getBasicFormulaType())) {
                    // 最大值
                    String aggName = aggNamePre + "max-result";
                    MaxBuilder maxAgg = AggregationBuilders.max(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(maxAgg, quota));
                } else if ("min".equals(quota.getBasicFormulaType())) {
                    // 最小值
                    String aggName = aggNamePre + "min-result";
                    MinBuilder minAgg = AggregationBuilders.min(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(minAgg, quota));
                } else if ("cardinality".equals(quota.getBasicFormulaType())) {
                    // 去重计数
                    String aggName = aggNamePre + "cardinality-result";
                    CardinalityBuilder cardinalityAgg = AggregationBuilders.cardinality(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(cardinalityAgg, quota));
                }
            }
        }
        return quotaAggList;
    }
    /**
     * 组装度量聚合
     *
     * @param metricAgg ES度量聚合构建器
     * @param quota     视图指标
     * @throws IOException
     */
    private AbstractAggregationBuilder joinMetricAgg(MetricsAggregationBuilder metricAgg, ViewQuota quota) throws IOException {
        List<ViewQuotaFilter> quotaFilterList = quota.getQuotaFilterList();
        FilterAggregationBuilder filterAgg = null;
        if (quotaFilterList != null && quotaFilterList.size() > 0) {
            String quotaFilterStr = objectMapper.writeValueAsString(quotaFilterList);
            List<ViewQuotaFilterModel> quotaFilterModelList = objectMapper.readValue(quotaFilterStr, new TypeReference<List<ViewQuotaFilterModel>>() {
            });
            BoolQueryBuilder quotaBoolQueryBuilder = QueryBuilders.boolQuery();
            joinFilters(quotaBoolQueryBuilder, quotaFilterModelList);
            String aggName = quota.getDimensionCode() + "-filter";
            filterAgg = AggregationBuilders.filter(aggName).filter(quotaBoolQueryBuilder);
            filterAgg.subAggregation(metricAgg);
        }
        if (filterAgg == null) {
            return metricAgg;
        } else {
            return filterAgg;
        }
    }
    /**
     * 组装行/列维度的聚合
     *
     * @param viewDimension 视图行/列维度
     * @return 行/列维度的聚合
     * @return 行/列维度的聚合构建器
     */
    private AggregationBuilder joinDimensionAgg(ViewDimension viewDimension) {
        AggregationBuilder dimensionAgg = null;
        String dimensionCode = viewDimension.getDimensionCode();
        String orderType = viewDimension.getMemberOrderType();
        boolean isTopAsc = "asc".equals(viewDimension.getMemberOrderStrategy()) ? true : false;
        String orderStrategy = viewDimension.getMemberOrderStrategy();
        boolean isTopAsc = StringUtils.isEmpty(orderStrategy) || "asc".equals(orderStrategy) ? true : false;
        String fieldType = cubeService.findDimensionDataType(viewDimension.getCubeCode(), viewDimension.getDimensionCode());
        if (!"date".equals(fieldType)) {
@ -467,7 +381,7 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
    /**
     * 汇总列维度的聚合及嵌套其指标聚合,并列嵌套于上层聚合
     *
     * @param upperAgg         上层聚合对象
     * @param upperAgg         上层维度的聚合构建器
     * @param rowViewDimension 视图的行维度
     * @param colDimensionList 视图的列维度集合
     * @param viewQuotaList    视图的指标集合
@ -497,4 +411,92 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
        }
    }
    /**
     * 汇总指标的度量聚合
     *
     * @param viewQuotaList 视图的指标
     * @param viewDimension 视图的行/列维度
     * @return 指标的度量聚合构建器集合
     * @throws IOException
     */
    private List<AbstractAggregationBuilder> gatherQuotaMetricsAgg(List<ViewQuota> viewQuotaList,
                                                                   ViewDimension viewDimension) throws IOException {
        List<AbstractAggregationBuilder> quotaAggList = new ArrayList<>();
        for (ViewQuota quota : viewQuotaList) {
            if ("basic".equals(quota.getFormulaMode())) {
                String aggNamePre = "";
                String dimensionCode = viewDimension.getDimensionCode();
                if (viewDimension == null) {
                    // 视图展示为数值类型的场合
                    aggNamePre += quota.getCode() + "-";
                } else if (ViewConstant.TOTAL_DIMENSION_CODE.equals(dimensionCode)) {
                    // 合计维度场合
                    aggNamePre = ViewConstant.TOTAL_DIMENSION_CODE + "-";
                }
                if ("sum".equals(quota.getBasicFormulaType())) {
                    // 求和
                    String aggName = aggNamePre + "sum-result";
                    SumBuilder sumAgg = AggregationBuilders.sum(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(sumAgg, quota));
                } else if ("count".equals(quota.getBasicFormulaType())) {
                    // 计数
                    String aggName = aggNamePre + "count-result";
                    ValueCountBuilder countAgg = AggregationBuilders.count(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(countAgg, quota));
                } else if ("avg".equals(quota.getBasicFormulaType())) {
                    // 均值
                    String aggName = aggNamePre + "avg-result";
                    AvgBuilder avgAgg = AggregationBuilders.avg(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(avgAgg, quota));
                } else if ("max".equals(quota.getBasicFormulaType())) {
                    // 最大值
                    String aggName = aggNamePre + "max-result";
                    MaxBuilder maxAgg = AggregationBuilders.max(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(maxAgg, quota));
                } else if ("min".equals(quota.getBasicFormulaType())) {
                    // 最小值
                    String aggName = aggNamePre + "min-result";
                    MinBuilder minAgg = AggregationBuilders.min(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(minAgg, quota));
                } else if ("cardinality".equals(quota.getBasicFormulaType())) {
                    // 去重计数
                    String aggName = aggNamePre + "cardinality-result";
                    CardinalityBuilder cardinalityAgg = AggregationBuilders.cardinality(aggName).field(quota.getDimensionCode());
                    quotaAggList.add(this.joinMetricAgg(cardinalityAgg, quota));
                }
            }
        }
        return quotaAggList;
    }
    /**
     * 组装度量聚合
     *
     * @param metricAgg ES度量聚合构建器
     * @param quota     视图指标
     * @throws IOException
     */
    private AbstractAggregationBuilder joinMetricAgg(MetricsAggregationBuilder metricAgg, ViewQuota quota) throws IOException {
        List<ViewQuotaFilter> quotaFilterList = quota.getQuotaFilterList();
        FilterAggregationBuilder filterAgg = null;
        if (quotaFilterList != null && quotaFilterList.size() > 0) {
            String quotaFilterStr = objectMapper.writeValueAsString(quotaFilterList);
            List<ViewQuotaFilterModel> quotaFilterModelList = objectMapper.readValue(quotaFilterStr, new TypeReference<List<ViewQuotaFilterModel>>() {
            });
            BoolQueryBuilder quotaBoolQueryBuilder = QueryBuilders.boolQuery();
            joinFilters(quotaBoolQueryBuilder, quotaFilterModelList);
            String aggName = quota.getDimensionCode() + "-filter";
            filterAgg = AggregationBuilders.filter(aggName).filter(quotaBoolQueryBuilder);
            filterAgg.subAggregation(metricAgg);
        }
        if (filterAgg == null) {
            return metricAgg;
        } else {
            return filterAgg;
        }
    }
}