浏览代码

bug提交

chenweida 7 年之前
父节点
当前提交
17c17cd8ad

+ 176 - 0
patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/controller/ElasticsearchUtil.java

@ -0,0 +1,176 @@
package com.yihu.wlyy.statistics.controller;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.yihu.wlyy.statistics.etl.save.es.ElasticFactory;
import com.yihu.wlyy.statistics.vo.SaveModel;
import org.elasticsearch.action.search.SearchResponse;
import org.nlpcn.es4sql.domain.Select;
import org.nlpcn.es4sql.jdbc.ObjectResult;
import org.nlpcn.es4sql.jdbc.ObjectResultsExtractor;
import org.nlpcn.es4sql.parse.ElasticSqlExprParser;
import org.nlpcn.es4sql.parse.SqlParser;
import org.nlpcn.es4sql.query.AggregationQueryAction;
import org.nlpcn.es4sql.query.DefaultQueryAction;
import org.nlpcn.es4sql.query.SqlElasticSearchRequestBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by chenweida on 2017/7/17.
 * SELECT town,townName,sum(result1) result1 FROM wlyy_quota_test
 where quotaCode='1'
 group by town,townName , date_histogram(field='quotaDate','interval'='week')
 */
@Component
public class ElasticsearchUtil {
    @Autowired
    private ElasticFactory elasticFactory;
    @Value("${es.type}")
    private String esType;
    @Value("${es.index}")
    private String esIndex;
    /**
     *
     * @param quotaCode  指标quotacode
     * @param startDate 开始日期 yyyy-MM-dd
     * @param endDate  结束日期 yyyy-MM-dd
     * @param timeLevel  1增量 2到达量
     * @param areaLevel 1 省 2 市 3 区县 4 机构 5团队
     * @param interval 1日 2周 3月
     * @return
     */
    public List<SaveModel> findQuotas(String quotaCode,
                                      String startDate,
                                      String endDate,
                                      String timeLevel,
                                      String areaLevel,
                                      String interval) {
        StringBuffer sql = new StringBuffer();
        StringBuffer groupBy = new StringBuffer();
        if (SaveModel.teamLevel.equals(areaLevel)) {
            sql.append("select team,teamName,result1,result2 from wlyy_quota_test where ");
        } else if (SaveModel.OrgLevel.equals(areaLevel)) {
            sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
            groupBy.append(" group by hospital,hospitalName");
        } else if (SaveModel.townLevel.equals(areaLevel)) {
            sql.append("select town,townName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
            groupBy.append(" group by town,townName");
        } else if (SaveModel.cityLevel.equals(areaLevel)) {
            sql.append("select city,cityName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where");
            groupBy.append(" group by city,cityName");
        }
        sql.append(" quotaCode='" + quotaCode + "'  ");
        sql.append(" and timeLevel='" + timeLevel + "'  ");
        sql.append(" and areaLevel='5'  ");
        sql.append(" and quotaDate >='" + startDate + "'  ");
        sql.append(" and quotaDate <='" + endDate + "'  ");
        sql.append(groupBy);
        return excute(sql.toString());
    }
    public List<SaveModel> findQuotas(String quotaCode,
                                      String quotaDate,
                                      String timeLevel,
                                      String areaLevel) {
        return null;
    }
    public List<SaveModel> findQuotasByChllevel(String quotaCode,
                                                String startDate,
                                                String endDate,
                                                String timeLevel,
                                                String areaLevel,
                                                String childAreaLevel) {
        return null;
    }
    public List<SaveModel> findQuotasByChllevel(String quotaCode,
                                                String quotaDate,
                                                String timeLevel,
                                                String areaLevel,
                                                String childAreaLevel) {
        return null;
    }
    /**
     * 执行sql查询es
     *
     * @param sql
     * @return
     */
    public List<SaveModel> excute(String sql) {
        List<SaveModel> saveModels = new ArrayList<>();
        try {
            SQLExprParser parser = new ElasticSqlExprParser(sql);
            SQLExpr expr = parser.expr();
            SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
            Select select = null;
            select = new SqlParser().parseSelect(queryExpr);
            //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
            AggregationQueryAction action = null;
            DefaultQueryAction queryAction = null;
            SqlElasticSearchRequestBuilder requestBuilder = null;
            if (select.isAgg) {
                //包含计算的的排序分组的
                action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
                requestBuilder = action.explain();
            } else {
                //封装成自己的Select对象
                queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
                requestBuilder = queryAction.explain();
            }
            SearchResponse response = (SearchResponse) requestBuilder.get();
            ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true);
            List<String> heads = temp.getHeaders();
            temp.getLines().stream().forEach(one -> {
                try {
                    SaveModel saveModel = new SaveModel();
                    for (int i = 0; i < one.size(); i++) {
                        String key = "set" + UpFirstStr(heads.get(i));
                        Object value = one.get(i);
                        if (value instanceof String) {
                            SaveModel.class.getMethod(key, String.class).invoke(saveModel, value);
                        } else if (value instanceof Integer) {
                            SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, value);
                        } else if (value instanceof Double) {
                            SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue());
                        }
                    }
                    saveModels.add(saveModel);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return saveModels;
    }
    /**
     * 首字母大写
     *
     * @param str
     * @return
     */
    public String UpFirstStr(String str) {
        return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
    }
}

+ 3 - 81
patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/model/job/ElasticsearchService.java

@ -4,6 +4,7 @@ import com.alibaba.druid.pool.ExceptionSorter;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.yihu.wlyy.statistics.controller.ElasticsearchUtil;
import com.yihu.wlyy.statistics.etl.save.es.ElasticFactory;
import com.yihu.wlyy.statistics.vo.SaveModel;
import io.searchbox.client.JestClient;
@ -35,13 +36,8 @@ import java.util.List;
 */
@Service
public class ElasticsearchService {
    @Autowired
    private ElasticFactory elasticFactory;
    @Value("${es.type}")
    private String esType;
    @Value("${es.index}")
    private String esIndex;
    private ElasticsearchUtil elasticsearchUtil;
    /**
     * 查询一级维度的指标
@ -54,30 +50,6 @@ public class ElasticsearchService {
     * @return
     */
    public SaveModel findDimension1Quota(String quotaCode, String timeLevel, String areaLevel, String code, String quotaDate) {
        try {
            JestClient jestClient = elasticFactory.getJestClient();
            //先根据条件查找出来
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(
                    new BoolQueryBuilder()
                            .must(QueryBuilders.matchQuery("quotaCode", quotaCode))
                            .must(QueryBuilders.matchQuery("timeLevel", timeLevel))
                            .must(QueryBuilders.matchQuery(SaveModel.getAreaLevelKey(areaLevel), code))
                            .must(QueryBuilders.matchQuery("quotaDate", quotaDate)))
                    .size(10);//一次取10条
            Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(esIndex).addType(esType)
                    .build();
            SearchResult result = jestClient.execute(search);
            List<SaveModel> saveModels = result.getSourceAsObjectList(SaveModel.class);
            if (saveModels != null && saveModels.size() > 0) {
                return saveModels.get(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
@ -89,57 +61,7 @@ public class ElasticsearchService {
    public List<SaveModel> excute(String sql) {
        List<SaveModel> saveModels = new ArrayList<>();
        try {
            SQLExprParser parser = new ElasticSqlExprParser(sql);
            SQLExpr expr = parser.expr();
            SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
            Select select = null;
            select = new SqlParser().parseSelect(queryExpr);
            //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
            AggregationQueryAction action = null;
            DefaultQueryAction queryAction = null;
            SqlElasticSearchRequestBuilder requestBuilder = null;
            if (select.isAgg) {
                //包含计算的的排序分组的
                action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
                requestBuilder = action.explain();
            } else {
                //封装成自己的Select对象
                queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
                requestBuilder = queryAction.explain();
            }
            SearchResponse response = (SearchResponse) requestBuilder.get();
            ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true);
            List<String> heads = temp.getHeaders();
            temp.getLines().stream().forEach(one -> {
                try {
                    SaveModel saveModel = new SaveModel();
                    for (int i = 0; i < one.size(); i++) {
                        String key = "set" + UpFirstStr(heads.get(i));
                        Object value = one.get(i);
                        if (value instanceof String) {
                            SaveModel.class.getMethod(key, String.class).invoke(saveModel,value);
                        }else if (value instanceof Integer) {
                            SaveModel.class.getMethod(key, Integer.class).invoke(saveModel, value);
                        }else if (value instanceof Double) {
                            SaveModel.class.getMethod(key, Integer.class).invoke(saveModel,  ((Double)value).intValue());
                        }
                    }
                    saveModels.add(saveModel);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return saveModels;
        return elasticsearchUtil.excute(sql);
    }
    public String UpFirstStr(String str) {
        return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
    }
}

+ 4 - 4
patient-co-statistics-es/src/main/java/com/yihu/wlyy/statistics/vo/SaveModel.java

@ -18,10 +18,10 @@ public class SaveModel {
    private final static String townKey = "town";
    private final static String cityKey = "city";
    private final static String teamLevel = "5";
    private final static String OrgLevel = "4";
    private final static String townLevel = "3";
    private final static String cityLevel = "2";
    public final static String teamLevel = "5";
    public final static String OrgLevel = "4";
    public final static String townLevel = "3";
    public final static String cityLevel = "2";
    private static final Map<String, String> fieldsSithch = new HashMap<>();
    @JestId

+ 2 - 1
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/dataFilter/SignDataFilter.java

@ -367,8 +367,9 @@ public class SignDataFilter {
                    str.append(",");
                }
            }
            return str.toString();
        }
        return "";
        return "0";
    }
    private String getAgeDisease(SignFamily signFamily) {

+ 4 - 4
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/etl/mycache/CachePool.java

@ -241,15 +241,15 @@ public class CachePool {
            String sql = "select sign_code,server_type from wlyy_sign_family_server ";
            String countSql = "select count(id) from wlyy_sign_family_server ";
            List<SignFamilyServer> signPatientLabelInfoList = null;
            signPatientLabelInfoList = SpringUtil.getBean(DBExtract.class).extractByPage(SignFamilyServer.class, sql, countSql, true);
            signPatientLabelInfoList = SpringUtil.getBean(DBExtract.class).extractByPage(SignFamilyServer.class, sql, countSql,50000, true);
            for (SignFamilyServer signFamilyServer : signPatientLabelInfoList) {
                if (diseaseGroup.containsKey(signFamilyServer.getSignCode())) {
                    List<String> code = diseaseGroup.get(signFamilyServer.getSignCode());
                if (serverGroup.containsKey(signFamilyServer.getSignCode())) {
                    List<String> code = serverGroup.get(signFamilyServer.getSignCode());
                    code.add(signFamilyServer.getServerType());
                } else {
                    List<String> code = new ArrayList<>();
                    code.add(signFamilyServer.getServerType());
                    diseaseGroup.put(signFamilyServer.getServerType(), code);
                    serverGroup.put(signFamilyServer.getServerType(), code);
                }
            }
        } catch (Exception e) {

+ 3 - 0
patient-co-statistics/src/main/java/com/yihu/wlyy/statistics/job/business/Constant.java

@ -448,6 +448,9 @@ public class Constant {
    public static String getServerType(String key) {
        switch (key) {
            case "0": {
                return "未分组";
            }
            case "1": {
                return "普通服务";
            }