Quellcode durchsuchen

Merge remote-tracking branch 'origin/dev-1.13.0' into dev-1.13.0

Conflicts:
	src/main/java/com/yihu/quota/controller/ViewController.java
jkzlzhoujie vor 6 Jahren
Ursprung
Commit
d83a60e03f

+ 18 - 15
src/main/java/com/yihu/quota/controller/ViewController.java

@ -57,7 +57,7 @@ public class ViewController extends BaseController {
    private AggregationBuildHandler aggregationBuildHandler;
    @ApiOperation(value = "添加视图")
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    @RequestMapping(value = ServiceApi.StatisticView.View.Add, method = RequestMethod.GET)
    public Envelop add(
            @ApiParam(name = "code", value = "视图code", required = true)
            @RequestParam(value = "code", required = true) String code,
@ -78,7 +78,8 @@ public class ViewController extends BaseController {
            Cube cube = cubeService.findOne(cubeId);
            view.setCode(code);
            view.setName(name);
            view.setDimensionDataset(cube.getIndexName()+"/" + cube.getIndexType());
            view.setEsIndex(cube.getIndexName());
            view.setEsType(cube.getIndexType());
            view.setDisplayType(displayType != null ? displayType : "1");
            view.setIsDrill(isDrill != null ? isDrill : "1");
            viewService.save(view);
@ -90,7 +91,7 @@ public class ViewController extends BaseController {
    }
    @ApiOperation(value = "删除视图")
    @RequestMapping(value = "/del", method = RequestMethod.DELETE)
    @RequestMapping(value = ServiceApi.StatisticView.View.Delete, method = RequestMethod.DELETE)
    public Envelop delete(
            @ApiParam(name = "id", value = "ID", required = true)
            @RequestParam(value = "id", required = true) int id){
@ -100,15 +101,22 @@ public class ViewController extends BaseController {
        return envelop;
    }
    @ApiOperation(value = "获取视图的统计结果")
    @RequestMapping(value = "/getViewStatisticData", method = RequestMethod.GET)
    @ApiOperation(value = "获取视图的统计结果,并转换成展示的数据格式")
    @RequestMapping(value = ServiceApi.StatisticView.View.GetViewStatisticData, method = RequestMethod.GET)
    public Envelop getViewStatisticData(
            @ApiParam(name = "viewCode", value = "视图编码", required = true)
            @RequestParam(value = "viewCode") String viewCode) {
            @RequestParam(value = "viewCode") String viewCode,
            @ApiParam(name = "filters", value = "过滤条件JSON字符串,如:'[{\"relationType\":\"and\",\"field\":\"event_date\",\"compareType\":\">=\",\"filterValue\":\"2017-06-11\"}]'")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sort", value = "排序JSON字符串,如:'{\"field\":\"event_date\",\"type\":\"asc\"}'")
            @RequestParam(value = "sort", required = false) String sort) {
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        try {
            // 根据视图规则,获取统计结果
            viewService.statViewResult(viewCode, filters);
            // 将统计结果,转换成展示的数据格式
            // TODO
        }catch (Exception e){
            e.printStackTrace();
@ -142,13 +150,12 @@ public class ViewController extends BaseController {
//                    .subAggregation(AggregationBuilders.terms("性别_terms").field("sex")
//                                    .subAggregation(AggregationBuilders.count("count_result").field("rowkey"))
//                    );
            AbstractAggregationBuilder firstAgg = aggregationBuildHandler.addAggregationBuilder("count","all_count_result","rowkey");
            AbstractAggregationBuilder secondAgg = aggregationBuildHandler.addTermAggregationBuilder("合计_性别_terms","sex","count", "sex_count_result", "rowkey");
            AbstractAggregationBuilder firstAgg = aggregationBuildHandler.addAggregationBuilder("count","count_result","rowkey");
            AbstractAggregationBuilder secondAgg = aggregationBuildHandler.addTermAggregationBuilder("合计_性别_terms","sex","count", "count_result", "rowkey");
            AbstractAggregationBuilder threeAgg = aggregationBuildHandler.addTermsBuilder("区县_terms", "area.town")
                    .subAggregation(aggregationBuildHandler.addAggregationBuilder("count", "合计_count_result", "rowkey"))
                    .subAggregation(aggregationBuildHandler.addTermsBuilder("性别_terms","sex")
                                    .subAggregation(aggregationBuildHandler.addAggregationBuilder("count", "town_sex_count_result", "rowkey"))
                                    .subAggregation(aggregationBuildHandler.addAggregationBuilder("count", "count_result", "rowkey"))
                    );
            LinkedList<AbstractAggregationBuilder> aggBuildList = new LinkedList<>();
@ -156,10 +163,6 @@ public class ViewController extends BaseController {
            aggBuildList.add(secondAgg);
            aggBuildList.add(threeAgg);
            List<Map<String, Object>> resultList = aggregationBuildHandler.structAggregationQuery(client,"patient_event","info", boolQueryBuilder, aggBuildList);
            envelop.setDetailModelList(resultList);
        }catch (Exception e){
            e.printStackTrace();

+ 66 - 12
src/main/java/com/yihu/quota/model/view/View.java

@ -7,8 +7,11 @@ import com.yihu.ehr.entity.BaseIdentityEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.List;
/**
 * 视图 entity
 *
 * @author janseny
 * @date 2018年9月26日
@ -17,13 +20,28 @@ import javax.persistence.Table;
@Table(name = "olap_view")
public class View extends BaseAssignedEntity {
    public String code; // 视图编码
    public String name; // 视图名称
    public String dimensionDataset; // 多维数据集,ES 的 index/type,拼接成:"index1[,index2...]/type1[,type2...]"
    public String displayType; //  展示类型,1:数值,2:普通表格,3:树形表格,4:饼图,5:折线图,6:柱状图,7:组合图(折线图+柱状图),8:雷达图,9:旭日图。
    public String treeDataType; // 树形数据类型,org_type_tree:机构类型树形数据。
    public String isDrill; // 可钻取,1:可以,2:不可以。
    public String remark; // 备注
    private String code; // 视图编码
    private String name; // 视图名称
    private String esIndex; // 多维数据集的 ES index,多个的话用逗号分隔
    private String esType; // 多维数据集的 ES type,多个的话用逗号分隔
    private String displayType; //  展示类型,1:数值,2:普通表格,3:树形表格,4:饼图,5:折线图,6:柱状图,7:组合图(折线图+柱状图),8:雷达图,9:旭日图。
    private String treeDataType; // 树形数据类型,org_type_tree:机构类型树形数据。
    private String isDrill; // 可钻取,1:可以,2:不可以。
    private String remark; // 备注
    // 临时属性
    /**
     * 视图默认过滤条件
     */
    private List<ViewQuotaFilter> viewFilterList;
    /**
     * 视图维度
     */
    private List<ViewDimension> viewDimensionList;
    /**
     * 视图指标
     */
    private List<ViewQuota> viewQuotaList;
    @Column(name = "code")
    public String getCode() {
@ -43,13 +61,22 @@ public class View extends BaseAssignedEntity {
        this.name = name;
    }
    @Column(name = "dimension_dataset")
    public String getDimensionDataset() {
        return dimensionDataset;
    @Column(name = "es_index")
    public String getEsIndex() {
        return esIndex;
    }
    public void setDimensionDataset(String dimensionDataset) {
        this.dimensionDataset = dimensionDataset;
    public void setEsIndex(String esIndex) {
        this.esIndex = esIndex;
    }
    @Column(name = "es_type")
    public String getEsType() {
        return esType;
    }
    public void setEsType(String esType) {
        this.esType = esType;
    }
    @Column(name = "display_type")
@ -87,4 +114,31 @@ public class View extends BaseAssignedEntity {
    public void setRemark(String remark) {
        this.remark = remark;
    }
    @Transient
    public List<ViewQuotaFilter> getViewFilterList() {
        return viewFilterList;
    }
    public void setViewFilterList(List<ViewQuotaFilter> viewFilterList) {
        this.viewFilterList = viewFilterList;
    }
    @Transient
    public List<ViewDimension> getViewDimensionList() {
        return viewDimensionList;
    }
    @Transient
    public void setViewDimensionList(List<ViewDimension> viewDimensionList) {
        this.viewDimensionList = viewDimensionList;
    }
    public List<ViewQuota> getViewQuotaList() {
        return viewQuotaList;
    }
    public void setViewQuotaList(List<ViewQuota> viewQuotaList) {
        this.viewQuotaList = viewQuotaList;
    }
}

+ 2 - 2
src/main/java/com/yihu/quota/model/view/ViewDimension.java

@ -22,12 +22,12 @@ public class ViewDimension extends BaseAssignedEntity {
    public String dimensionName; // 维度名称
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String rankType; // 行列维度类型,1:行维度,2,:列维度,默认行维度。
    public String rankType; // 行列维度类型,row:行维度,col:列维度,默认行维度。
    public Integer groupRow; // 行维度组
    public Integer groupRowOrder; // 组内行维度顺序
    public Integer rowOrder; //可钻取的行维度顺序
    public Integer columnOrder; //列维度顺序
    public String rowMemberOrderType; //行维度成员排序方式,1:按名称排序,2:按子聚合统计值排序,默认按名称排序。
    public String rowMemberOrderType; //行维度成员排序方式,name:按名称排序,sub_agg:按子聚合统计值排序,默认按名称排序。
    public Integer rowMemberCount; //行维度成员返回个数
    @Column(name = "view_id")

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

@ -7,8 +7,11 @@ import com.yihu.ehr.entity.BaseIdentityEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.List;
/**
 * 视图指标 entity
 *
 * @author janseny
 * @date 2018年9月26日
@ -22,9 +25,15 @@ public class ViewQuota extends BaseAssignedEntity {
    public String dimensionName; // 维度名称
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String formulaMode; // 计算方式,1:基础公式,2:自定义公式。
    public String basicFormulaType; // 基础公式:1:求和,2.计数,3:均值,4:最大值,5:最小值,6:去重计数
    public String chartType; // 图表类型,1:折线图,2:柱状图。
    public String formulaMode; // 计算方式,basic:基础公式,custom:自定义公式。
    public String basicFormulaType; // 基础公式:sum:求和,count.计数,avg:均值,max:最大值,min:最小值,cardinality:去重计数
    public String chartType; // 图表类型,line:折线图,bar:柱状图。
    // 临时属性
    /**
     * 指标过滤条件
     */
    public List<ViewQuotaFilter> quotaFilterList;
    @Column(name = "view_id")
    public Integer getViewId() {
@ -43,6 +52,7 @@ public class ViewQuota extends BaseAssignedEntity {
    public void setDimensionCode(String dimensionCode) {
        this.dimensionCode = dimensionCode;
    }
    @Column(name = "dimension_name")
    public String getDimensionName() {
        return dimensionName;
@ -51,6 +61,7 @@ public class ViewQuota extends BaseAssignedEntity {
    public void setDimensionName(String dimensionName) {
        this.dimensionName = dimensionName;
    }
    @Column(name = "es_index")
    public String getEsIndex() {
        return esIndex;
@ -59,6 +70,7 @@ public class ViewQuota extends BaseAssignedEntity {
    public void setEsIndex(String esIndex) {
        this.esIndex = esIndex;
    }
    @Column(name = "es_type")
    public String getEsType() {
        return esType;
@ -67,6 +79,7 @@ public class ViewQuota extends BaseAssignedEntity {
    public void setEsType(String esType) {
        this.esType = esType;
    }
    @Column(name = "formula_mode")
    public String getFormulaMode() {
        return formulaMode;
@ -75,6 +88,7 @@ public class ViewQuota extends BaseAssignedEntity {
    public void setFormulaMode(String formulaMode) {
        this.formulaMode = formulaMode;
    }
    @Column(name = "basic_formula_type")
    public String getBasicFormulaType() {
        return basicFormulaType;
@ -83,6 +97,7 @@ public class ViewQuota extends BaseAssignedEntity {
    public void setBasicFormulaType(String basicFormulaType) {
        this.basicFormulaType = basicFormulaType;
    }
    @Column(name = "chart_type")
    public String getChartType() {
        return chartType;
@ -92,4 +107,12 @@ public class ViewQuota extends BaseAssignedEntity {
        this.chartType = chartType;
    }
    @Transient
    public List<ViewQuotaFilter> getQuotaFilterList() {
        return quotaFilterList;
    }
    public void setQuotaFilterList(List<ViewQuotaFilter> quotaFilterList) {
        this.quotaFilterList = quotaFilterList;
    }
}

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

@ -22,9 +22,9 @@ public class ViewQuotaFilter extends BaseAssignedEntity {
    public String dimensionName; // 维度名称
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String filterType; // 过滤条件类型,1:视图,2:指标。
    public String relationType; // 关系类型,1:且,2:或。
    public String compareType; //比较类型,A1:属于,A2:不属于,B1:为空,B2:非空,C1:开头是,C2:结尾是,D1:包含,D2:不包含。
    public String filterType; // 过滤条件类型,view:视图,quota:指标。
    public String relationType; // 关系类型,关系类型,and:且,or:或
    public String compareType; //比较类型,belong:属于,not_belong:不属于,null:为空,not_null:非空,start_with:开头是,end_with:结尾是,contain:包含,not_contain:不包含
    public String filterValue; //过滤的值
    @Column(name = "relation_id")

+ 50 - 3
src/main/java/com/yihu/quota/service/view/ViewService.java

@ -1,5 +1,7 @@
package com.yihu.quota.service.view;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.ehr.elasticsearch.ElasticSearchPool;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.quota.dao.view.ViewDao;
@ -10,12 +12,21 @@ import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.view.View;
import com.yihu.quota.model.view.ViewDimension;
import com.yihu.quota.model.view.ViewQuota;
import com.yihu.quota.model.view.ViewQuotaFilter;
import com.yihu.quota.vo.ViewQuotaFilterModel;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
@ -37,23 +48,59 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
    private ViewQuotaFilterDao viewQuotaFilterDao;
    @Autowired
    private ElasticSearchPool elasticSearchPool;
    @Autowired
    private ObjectMapper objectMapper;
    public View findOne(Integer id) {
        return viewDao.findOne(id);
    }
    /**
     * 获取视图完整规则
     *
     * @param viewCode 视图编码
     * @return 视图规则
     */
    public View getViewRule(String viewCode) {
        View view = viewDao.findByCode(viewCode);
        view.setViewFilterList(viewQuotaFilterDao.findByRelationId(view.getId()));
        view.setViewDimensionList(viewDimensionDao.findByViewId(view.getId()));
        view.setViewQuotaList(viewQuotaDao.findByViewId(view.getId()));
        for (ViewQuota viewQuota : view.getViewQuotaList()) {
            List<ViewQuotaFilter> quotaFilterList = viewQuotaFilterDao.findByRelationId(viewQuota.getId());
            viewQuota.setQuotaFilterList(quotaFilterList);
        }
        return view;
    }
    /**
     * 获取视图统计结果
     *
     * @param viewCode
     * @param filters
     */
    public void statViewResult(String viewCode) {
    public void statViewResult(String viewCode, String filters) throws IOException {
        // 获取视图规则
        View view = viewDao.findByCode(viewCode);
        List<ViewDimension> viewDimensionList = viewDimensionDao.findByViewId(view.getId());
        List<ViewQuota> viewQuotaList = viewQuotaDao.findByViewId(view.getId());
        String[] esIndices = view.getEsIndex().split(",");
        String[] esTypes = view.getEsType().split(",");
        // 根据视图规则组装 ES 聚合语句
        TransportClient transportClient = elasticSearchPool.getClient();
        SearchRequestBuilder searchRequest = transportClient.prepareSearch(esIndices).setTypes(esTypes).setSize(0);
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        if (StringUtils.isNotEmpty(filters)) {
            List<ViewQuotaFilterModel> filterModelList = objectMapper.readValue(filters, new TypeReference<List<ViewQuotaFilterModel>>() {
            });
            for (ViewQuotaFilterModel filterModel : filterModelList) {
                if ("and".equals(filterModel.getRelationType())) {
                    if ("".equals(filterModel.getCompareType())) {
//                        queryBuilder.must(QueryBuilders);
                    }
                }
            }
        }
        transportClient.close();

+ 59 - 0
src/main/java/com/yihu/quota/vo/ViewQuotaFilterModel.java

@ -0,0 +1,59 @@
package com.yihu.quota.vo;
/**
 * 视图、指标过滤条件 model
 *
 * @author 张进军
 * @date 2018/9/29 15:40
 */
public class ViewQuotaFilterModel {
    /**
     * 字段编码
     */
    private String field;
    /**
     * 关系类型,and:且,or:或
     */
    private String relationType;
    /**
     * 比较类型,belong:属于,not_belong:不属于,null:为空,not_null:非空,start_with:开头是,end_with:结尾是,contain:包含,not_contain:不包含
     */
    private String compareType;
    /**
     * 过滤的值
     */
    private String value;
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
    public String getRelationType() {
        return relationType;
    }
    public void setRelationType(String relationType) {
        this.relationType = relationType;
    }
    public String getCompareType() {
        return compareType;
    }
    public void setCompareType(String compareType) {
        this.compareType = compareType;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}