Browse Source

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

zhangjinjun 6 years ago
parent
commit
a77200d166
70 changed files with 3176 additions and 136 deletions
  1. 7 10
      src/main/java/com/yihu/quota/config/AsyncConfig.java
  2. 4 2
      src/main/java/com/yihu/quota/config/quota/JobFactory.java
  3. 19 14
      src/main/java/com/yihu/quota/config/quota/SchedulerConfig.java
  4. 119 0
      src/main/java/com/yihu/quota/contants/JobConstant.java
  5. 1 0
      src/main/java/com/yihu/quota/contants/MicroServiceApi.java
  6. 209 0
      src/main/java/com/yihu/quota/controller/CubeController.java
  7. 3 3
      src/main/java/com/yihu/quota/controller/JobController.java
  8. 77 0
      src/main/java/com/yihu/quota/controller/ViewController.java
  9. 90 0
      src/main/java/com/yihu/quota/controller/ViewDimensionController.java
  10. 84 0
      src/main/java/com/yihu/quota/controller/ViewQuotaController.java
  11. 1 0
      src/main/java/com/yihu/quota/dao/dict/SystemDictDao.java
  12. 1 0
      src/main/java/com/yihu/quota/dao/dict/SystemDictListDao.java
  13. 1 2
      src/main/java/com/yihu/quota/dao/dimension/TjDimensionSlaveDao.java
  14. 14 0
      src/main/java/com/yihu/quota/dao/view/ViewDao.java
  15. 14 0
      src/main/java/com/yihu/quota/dao/view/ViewDimensionDao.java
  16. 14 0
      src/main/java/com/yihu/quota/dao/view/ViewQuotaDao.java
  17. 14 0
      src/main/java/com/yihu/quota/dao/view/ViewQuotaFilterDao.java
  18. 1 1
      src/main/java/com/yihu/quota/etl/formula/AgeGroup.java
  19. 4 4
      src/main/java/com/yihu/quota/etl/formula/DateFunc.java
  20. 1 1
      src/main/java/com/yihu/quota/etl/formula/Days.java
  21. 19 0
      src/main/java/com/yihu/quota/etl/formula/DictFunc.java
  22. 3 3
      src/main/java/com/yihu/quota/etl/formula/Division.java
  23. 82 0
      src/main/java/com/yihu/quota/etl/formula/FormulaExecutor.java
  24. 1 1
      src/main/java/com/yihu/quota/etl/formula/Functioner.java
  25. 8 0
      src/main/java/com/yihu/quota/feign/RsDictClient.java
  26. 9 3
      src/main/java/com/yihu/quota/kafka/ConsumerListener.java
  27. 1 1
      src/main/java/com/yihu/quota/kafka/KafkaConsumerConfig.java
  28. 71 0
      src/main/java/com/yihu/quota/kafka/Producer.java
  29. 15 0
      src/main/java/com/yihu/quota/model/cube/Cube.java
  30. 11 13
      src/main/java/com/yihu/quota/model/cube/CubeMapping.java
  31. 16 1
      src/main/java/com/yihu/quota/model/cube/CubeMemberMapping.java
  32. 27 0
      src/main/java/com/yihu/quota/model/dimension/Dimension.java
  33. 55 0
      src/main/java/com/yihu/quota/model/dimension/DimensionMember.java
  34. 48 0
      src/main/java/com/yihu/quota/model/rest/FieldInfo.java
  35. 15 0
      src/main/java/com/yihu/quota/model/source/DataSourcesTable.java
  36. 15 0
      src/main/java/com/yihu/quota/model/source/DataSourcesTableField.java
  37. 89 0
      src/main/java/com/yihu/quota/model/view/View.java
  38. 129 0
      src/main/java/com/yihu/quota/model/view/ViewDimension.java
  39. 94 0
      src/main/java/com/yihu/quota/model/view/ViewQuota.java
  40. 102 0
      src/main/java/com/yihu/quota/model/view/ViewQuotaFilter.java
  41. 1 1
      src/main/java/com/yihu/quota/scheduler/special/OutPatientCostScheduler.java
  42. 40 0
      src/main/java/com/yihu/quota/service/cube/CubeMappingService.java
  43. 70 0
      src/main/java/com/yihu/quota/service/cube/CubeMemberMappingService.java
  44. 4 0
      src/main/java/com/yihu/quota/service/cube/CubeService.java
  45. 414 0
      src/main/java/com/yihu/quota/service/cube/ElasticSearchDataProcessService.java
  46. 1 0
      src/main/java/com/yihu/quota/service/dimension/TjDimensionMainService.java
  47. 1 0
      src/main/java/com/yihu/quota/service/dimension/TjDimensionSlaveService.java
  48. 2 2
      src/main/java/com/yihu/quota/service/job/EsQuotaJob.java
  49. 1 0
      src/main/java/com/yihu/quota/service/job/EsQuotaPercentJob.java
  50. 57 56
      src/main/java/com/yihu/quota/service/job/JobService.java
  51. 185 0
      src/main/java/com/yihu/quota/service/job/SingleTableJob.java
  52. 1 0
      src/main/java/com/yihu/quota/service/org/OrgService.java
  53. 1 0
      src/main/java/com/yihu/quota/service/quota/special/DeviceService.java
  54. 1 0
      src/main/java/com/yihu/quota/service/quota/special/HbaseService.java
  55. 1 0
      src/main/java/com/yihu/quota/service/quota/special/SolrStatistsService.java
  56. 1 0
      src/main/java/com/yihu/quota/service/quota/special/StatisticsService.java
  57. 2 1
      src/main/java/com/yihu/quota/service/scheduler/HealthArchiveSchedulerService.java
  58. 26 0
      src/main/java/com/yihu/quota/service/view/ViewDimensionService.java
  59. 24 0
      src/main/java/com/yihu/quota/service/view/ViewQuotaFilterService.java
  60. 24 0
      src/main/java/com/yihu/quota/service/view/ViewQuotaService.java
  61. 28 0
      src/main/java/com/yihu/quota/service/view/ViewService.java
  62. 122 0
      src/main/java/com/yihu/quota/util/AggregationBuildHandler.java
  63. 266 0
      src/main/java/com/yihu/quota/util/ElasticSearchHandler.java
  64. 20 17
      src/main/java/com/yihu/quota/util/QuartzHelper.java
  65. 23 0
      src/main/java/com/yihu/quota/util/sql/Db.java
  66. 50 0
      src/main/java/com/yihu/quota/util/sql/DbKit.java
  67. 18 0
      src/main/java/com/yihu/quota/util/sql/MysqlDb.java
  68. 18 0
      src/main/java/com/yihu/quota/util/sql/OracleDb.java
  69. 134 0
      src/main/java/com/yihu/quota/vo/CubeMappingModel.java
  70. 152 0
      src/main/java/com/yihu/quota/vo/CubeMemberMappingModel.java

+ 7 - 10
src/main/java/com/yihu/quota/config/AsyncConfig.java

@ -9,7 +9,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
 * Created by Administrator on 2016.10.18.
 * @author Administrator
 * @date 2016.10.18
 * 启用多綫程
 */
@Configuration
@ -30,19 +31,15 @@ public class AsyncConfig {
    @Bean
    public Executor dbExtractExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
        return createExecutor();
    }
    @Bean
    public Executor dbStorageExecutor() {
        return createExecutor();
    }
    private Executor createExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);

+ 4 - 2
src/main/java/com/yihu/quota/config/quota/JobFactory.java

@ -7,18 +7,20 @@ import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
/**
 * Created by Administrator on 2016.10.12.
 * @author Administrator
 * @date 2016.10.12
 * 為了讓quartz種可以使用Spring的注入
 */
@Component("jobFactory")
public class JobFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
       // 进行注入
        // 进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }

+ 19 - 14
src/main/java/com/yihu/quota/config/quota/SchedulerConfig.java

@ -1,4 +1,5 @@
package com.yihu.quota.config.quota;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.ApplicationContext;
@ -12,7 +13,8 @@ import java.io.IOException;
import java.util.Properties;
/**
 * Created by chenweida on 2016/2/3.
 * @author chenweida
 * @date 2016/2/3
 */
@Configuration
public class SchedulerConfig {
@ -22,22 +24,10 @@ public class SchedulerConfig {
    private JobFactory jobFactory;
    @Autowired
    private DataSource dataSource;
    @Bean
    SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        bean.setJobFactory(jobFactory);
        bean.setApplicationContext(this.applicationContext);
        bean.setOverwriteExistingJobs(true);
        bean.setStartupDelay(20);// 延时启动
        bean.setSchedulerName("schedulerFactoryBeanCWD");
        bean.setAutoStartup(true);
        bean.setDataSource(dataSource);
        bean.setQuartzProperties(quartzProperties());
        return bean;
    }
    /**
     * quartz配置文件
     *
     * @return
     * @throws IOException
     */
@ -48,5 +38,20 @@ public class SchedulerConfig {
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
    @Bean
    SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        bean.setJobFactory(jobFactory);
        bean.setApplicationContext(this.applicationContext);
        bean.setOverwriteExistingJobs(true);
        // 延时启动
        bean.setStartupDelay(20);
        bean.setSchedulerName("schedulerFactoryBeanCWD");
        bean.setAutoStartup(true);
        bean.setDataSource(dataSource);
        bean.setQuartzProperties(quartzProperties());
        return bean;
    }
}

+ 119 - 0
src/main/java/com/yihu/quota/contants/JobConstant.java

@ -0,0 +1,119 @@
package com.yihu.quota.contants;
/**
 * @author l4qiang
 */
public interface JobConstant {
    /**
     * 任务状态
     */
    public enum Status {
        /**
         * 未执行
         */
        NotStart,
        /**
         * 正在执行
         */
        Running;
        public static Status fromInt(int x) {
            switch (x) {
                case 0:
                    return NotStart;
                case 1:
                    return Running;
                default:
                    return null;
            }
        }
        public static Status fromStr(String x) {
            switch (x) {
                case "0":
                    return NotStart;
                case "1":
                    return Running;
                default:
                    return null;
            }
        }
    }
    public enum ExecType {
        /**
         * 全量
         */
        Full,
        /**
         * 增量
         */
        Increment;
        public static ExecType fromInt(int x) {
            switch (x) {
                case 0:
                    return Full;
                case 1:
                    return Increment;
                default:
                    return null;
            }
        }
        public static ExecType fromStr(String x) {
            switch (x) {
                case "0":
                    return Full;
                case "1":
                    return Increment;
                default:
                    return null;
            }
        }
    }
    public enum ExecWay {
        /**
         * 手动执行
         */
        Manual,
        /**
         * Cron触发
         */
        Cron,
        /**
         * 事件触发
         */
        Trigger;
        public static ExecWay fromInt(int x) {
            switch (x) {
                case 0:
                    return Manual;
                case 1:
                    return Cron;
                case 2:
                    return Trigger;
                default:
                    return null;
            }
        }
        public static ExecWay fromStr(String x) {
            switch (x) {
                case "0":
                    return Manual;
                case "1":
                    return Cron;
                case "2":
                    return Trigger;
                default:
                    return null;
            }
        }
    }
}

+ 1 - 0
src/main/java/com/yihu/quota/contants/MicroServiceApi.java

@ -11,6 +11,7 @@ public interface MicroServiceApi {
    interface Resource {
        String DICT_ENTRY = "cache/dict-entry";
        String DICT_ENTRIES = "cache/dict-entries";
    }
    interface Redis {

+ 209 - 0
src/main/java/com/yihu/quota/controller/CubeController.java

@ -0,0 +1,209 @@
package com.yihu.quota.controller;
import com.google.gson.Gson;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.util.rest.Envelop;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.cube.CubeMapping;
import com.yihu.quota.model.cube.CubeMemberMapping;
import com.yihu.quota.model.rest.FieldInfo;
import com.yihu.quota.service.cube.CubeMappingService;
import com.yihu.quota.service.cube.CubeMemberMappingService;
import com.yihu.quota.service.cube.CubeService;
import com.yihu.quota.service.cube.ElasticSearchDataProcessService;
import com.yihu.quota.util.ElasticSearchHandler;
import com.yihu.quota.vo.CubeMappingModel;
import com.yihu.quota.vo.CubeMemberMappingModel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.client.transport.TransportClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by janseny on 2018/9/19.
 */
@RestController
@RequestMapping(ApiVersion.Version1_0 + "/cube")
@Api(description = "OLAP 多维数据集 控制入口")
public class CubeController  extends BaseController {
    @Autowired
    private CubeService cubeService;
    @Autowired
    private CubeMappingService cubeMappingService;
    @Autowired
    private CubeMemberMappingService cubeMemberMappingService;
    @Autowired
    private ElasticSearchHandler esHandler;
    @Autowired
    private ElasticSearchDataProcessService elasticSearchDataProcessService;
    @ApiOperation(value = "创建多维数据集ES的mapping结构 ")
    @RequestMapping(value = "/elasticSearchMapping", method = RequestMethod.GET)
    public Envelop getQuotaReport(
            @ApiParam(name = "id", value = "多维数据集ID", required = true)
            @RequestParam(value = "id", required = true) int id
    ) {
        Envelop envelop = new Envelop();
        try {
            List<FieldInfo> fieldInfoList = new ArrayList<>();
            Cube cube = cubeService.findOne(id);
            String index = "";
            String type = "";
            if(cube.getIndexName() != null){
                index = cube.getIndexName();
            }
            if(cube.getIndexType() != null){
                type = cube.getIndexType();
            }
            boolean isExist =  esHandler.isExistsIndex(index,esHandler.getTransportClient());
            if(isExist){
                envelop.setSuccessFlg(false);
                envelop.setErrorMsg("索引已存在");
                return envelop;
            }
            // 数据集维度
            List<CubeMappingModel> cubeMappingModels = cubeMappingService.findCubeMappingModelsByCubeId(id);
            if(cubeMappingModels != null && cubeMappingModels.size() > 0){
                FieldInfo rowKeyFieldInfo =  new FieldInfo();
                rowKeyFieldInfo.setField("rowkey");
                rowKeyFieldInfo.setDataType("String");
                fieldInfoList.add(rowKeyFieldInfo);
                for(CubeMappingModel cubeMappingModel : cubeMappingModels){
                    String fieldCode = cubeMappingModel.getDimensionCode();
                    //数据字典名称作为一个属性 扩展
                    if(StringUtils.isNotEmpty(cubeMappingModel.getDict())){
                        FieldInfo dictFieldName =  new FieldInfo();
                        dictFieldName.setField(fieldCode + "Name");
                        dictFieldName.setDataType("String");
                        fieldInfoList.add(dictFieldName);
                    }
                    FieldInfo fieldInfo =  new FieldInfo();
                    fieldInfo.setField(fieldCode);
                    // 子成员 扩展
                    List<CubeMemberMappingModel>  cubeMemberMappingModels = cubeMemberMappingService.findCubeMemberMappingModelsById(cubeMappingModel.getId());
                    if(cubeMemberMappingModels != null && cubeMemberMappingModels.size() > 0){
                        List<FieldInfo> childFieldiList = new ArrayList<>();
                        //如果存在子集设置 子集属性
                        if(cubeMappingModel.getChildSaveType() != null){
                            if(cubeMappingModel.getChildSaveType().equals(1)){
                                fieldInfo.setDataType("object");
                            }else if(cubeMappingModel.getChildSaveType().equals(2)){
                                fieldInfo.setDataType("nested");
                            }
                        }
                        for(CubeMemberMappingModel cubeMemberMappingModel : cubeMemberMappingModels){
                            FieldInfo childFieldInfo =  new FieldInfo();
                            childFieldInfo.setField(cubeMemberMappingModel.getDimensionCode());
                            childFieldInfo.setDataType(cubeMemberMappingModel.getDataType());
                            childFieldiList.add(childFieldInfo);
                            //数据字典名称作为一个子属性 扩展
                            if(StringUtils.isNotEmpty(cubeMemberMappingModel.getDict())){
                                FieldInfo dictFieldName =  new FieldInfo();
                                dictFieldName.setField(fieldCode + "Name");
                                dictFieldName.setDataType("String");
                                childFieldiList.add(dictFieldName);
                            }
                        }
                        fieldInfo.setFieldInfos(childFieldiList);
                    }else {
                        fieldInfo.setDataType(cubeMappingModel.getDataType());
                    }
                    fieldInfoList.add(fieldInfo);
                }
                FieldInfo updateDateFieldInfo =  new FieldInfo();
                updateDateFieldInfo.setField("updateDate");
                updateDateFieldInfo.setDataType("Date");
                fieldInfoList.add(updateDateFieldInfo);
                esHandler.createIndexAndCreateMapping(index, type, fieldInfoList, esHandler.getTransportClient());
                envelop.setSuccessFlg(true);
            }else {
                envelop.setSuccessFlg(false);
                envelop.setErrorMsg("没有维度信息");
            }
            return envelop;
        } catch (Exception e) {
            e.printStackTrace();
            invalidUserException(e, -1, "创建失败:" + e.getMessage());
        }
        envelop.setSuccessFlg(false);
        return envelop;
    }
    @ApiOperation(value = "保存mapping 数据 ")
    @RequestMapping(value = "/saveElasticSearchMappingData", method = RequestMethod.GET)
    public Envelop saveElasticSearchMappingData(
            @ApiParam(name = "table", value = "表 Healtharchive / HealtharchiveSub", required = true)
            @RequestParam(value = "table", required = true) String table,
            @ApiParam(name = "rowkey", value = "行数据唯一键值", required = true)
            @RequestParam(value = "rowkey", required = true) String rowkey,
            @ApiParam(name = "cloumn", value = "列", required = true)
            @RequestParam(value = "cloumn", required = true) String cloumn,
            @ApiParam(name = "cloumnValue", value = "列值", required = true)
            @RequestParam(value = "cloumnValue", required = true) Object cloumnValue,
            @ApiParam(name = "profileId", value = "关联父级主表rowKey值", required = false)
            @RequestParam(value = "profileId", required = false) String profileId
    ){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        try {
            Gson gson = new Gson();
            Map<String, Object> source  = new HashMap<>();
            source.put("dataSource","hbase");
            source.put("table",table);
            source.put("rowkey",rowkey);
            source.put("profile_id",profileId);
            String actionStr = "Put";
            source.put("action",actionStr);
            source.put(cloumn,cloumnValue);
            String jsonData = gson.toJson(source);
            elasticSearchDataProcessService.saveData(jsonData);
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
        }
        return envelop;
    }
    @ApiOperation(value = "删除mapping 数据 ")
    @RequestMapping(value = "/delElasticSearchMappingData", method = RequestMethod.GET)
    public Envelop delElasticSearchMappingData(
            @ApiParam(name = "table", value = "表 Healtharchive / HealtharchiveSub", required = true)
            @RequestParam(value = "table", required = true) String table,
            @ApiParam(name = "rowkey", value = "行数据唯一键值", required = true)
            @RequestParam(value = "rowkey", required = true) String rowkey
    ){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        try {
            Gson gson = new Gson();
            Map<String, Object> source  = new HashMap<>();
            source.put("dataSource","hbase");
            source.put("table",table);
            source.put("rowkey",rowkey);
            source.put("action","DeleteFamily");
            String jsonData = gson.toJson(source);
            elasticSearchDataProcessService.saveData(jsonData);
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
        }
        return envelop;
    }
}

+ 3 - 3
src/main/java/com/yihu/quota/controller/JobController.java

@ -37,7 +37,7 @@ public class JobController extends BaseController {
            @ApiParam(name = "id", value = "指标ID", required = true)
            @RequestParam(value = "id", required = true) Integer id) {
        try {
            jobService.executeJob(id, "1", null, null);
            jobService.execute(id, "1", null, null);
            return true;
        } catch (Exception e) {
            error(e);
@ -59,7 +59,7 @@ public class JobController extends BaseController {
            @ApiParam(name = "endDate", value = "截止日期")
            @RequestParam(value = "endDate", required = false) String endDate) {
        try {
            jobService.executeJob(id, "2", startDate, endDate);
            jobService.execute(id, "2", startDate, endDate);
            return true;
        } catch (Exception e) {
            error(e);
@ -74,7 +74,7 @@ public class JobController extends BaseController {
            @ApiParam(name = "id", value = "指标ID", required = true)
            @RequestParam(value = "id", required = true) Integer id) {
        try {
            jobService.removeJob(id);
            jobService.stop(id);
            return true;
        } catch (Exception e) {
            error(e);

+ 77 - 0
src/main/java/com/yihu/quota/controller/ViewController.java

@ -0,0 +1,77 @@
package com.yihu.quota.controller;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.util.rest.Envelop;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.view.View;
import com.yihu.quota.service.cube.CubeService;
import com.yihu.quota.service.view.ViewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@RestController
@RequestMapping(ApiVersion.Version1_0 + "/view")
@Api(description = "OLAP 视图 控制入口")
public class ViewController extends BaseController {
    @Autowired
    private ViewService viewService;
    @Autowired
    private CubeService cubeService;
    @ApiOperation(value = "添加视图")
    @RequestMapping(value = "/addView", method = RequestMethod.GET)
    public Envelop addView(
            @ApiParam(name = "code", value = "视图code", required = true)
            @RequestParam(value = "code", required = true) String code,
            @ApiParam(name = "name", value = "视图名称", required = true)
            @RequestParam(value = "name", required = true) String name,
            @ApiParam(name = "cubeId", value = "多维数据集ID", required = true)
            @RequestParam(value = "cubeId", required = true) int cubeId,
            @ApiParam(name = "displayType", value = "展示类型 1:数值,2:普通表格,3:树形表格,4:饼图,5:折线图,6:柱状图,7:组合图(折线图+柱状图),8:雷达图,9:旭日图", required = false)
            @RequestParam(value = "displayType", required = false) String displayType,
            @ApiParam(name = "isDrill", value = "可钻取 1:可以,2:不可以", required = false)
            @RequestParam(value = "isDrill", required = false) String isDrill
    ){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        try {
            View view = new View();
            Cube cube = cubeService.findOne(cubeId);
            view.setCode(code);
            view.setName(name);
            view.setDimensionDataset(cube.getIndexName()+"/" + cube.getIndexType());
            view.setDisplayType(displayType != null ? displayType : "1");
            view.setIsDrill(isDrill != null ? isDrill : "1");
            viewService.save(view);
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
        }
        return envelop;
    }
    @ApiOperation(value = "删除视图")
    @RequestMapping(value = "/delView", method = RequestMethod.DELETE)
    public Envelop delView(
            @ApiParam(name = "id", value = "ID", required = true)
            @RequestParam(value = "id", required = true) int id){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        viewService.delete(id);
        return envelop;
    }
}

+ 90 - 0
src/main/java/com/yihu/quota/controller/ViewDimensionController.java

@ -0,0 +1,90 @@
package com.yihu.quota.controller;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.util.rest.Envelop;
import com.yihu.quota.model.view.View;
import com.yihu.quota.model.view.ViewDimension;
import com.yihu.quota.service.view.ViewDimensionService;
import com.yihu.quota.service.view.ViewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@RestController
@RequestMapping(ApiVersion.Version1_0 + "/viewDimension")
@Api(description = "OLAP 视图维度 控制入口")
public class ViewDimensionController extends BaseController {
    @Autowired
    private ViewDimensionService viewDimensionService;
    @Autowired
    private ViewService viewService;
    @ApiOperation(value = "添加视图维度")
    @RequestMapping(value = "/addViewDimension", method = RequestMethod.GET)
    public Envelop addViewDimension(
            @ApiParam(name = "code", value = "维度code", required = true)
            @RequestParam(value = "code", required = true) String code,
            @ApiParam(name = "name", value = "维度名称", required = true)
            @RequestParam(value = "name", required = true) String name,
            @ApiParam(name = "viewId", value = "多维数据集ID", required = true)
            @RequestParam(value = "viewId", required = true) int viewId,
            @ApiParam(name = "rankType", value = "1:行维度,2,:列维度,默认行维度", required = false)
            @RequestParam(value = "rankType", required = false) String rankType,
            @ApiParam(name = "groupRow", value = "行维度组", required = false)
            @RequestParam(value = "groupRow", required = true) int groupRow,
            @ApiParam(name = "groupRowOrder", value = "组内行维度顺序", required = false)
            @RequestParam(value = "groupRowOrder", required = false) int groupRowOrder,
            @ApiParam(name = "columnOrder", value = "列维度顺序", required = false)
            @RequestParam(value = "columnOrder", required = false) int columnOrder,
            @ApiParam(name = "rowMemberorderType", value = "行维度成员排序方式,1:按名称排序,2:按子聚合统计值排序,默认按名称排序。", required = false)
            @RequestParam(value = "rowMemberorderType", required = false) String rowMemberorderType,
            @ApiParam(name = "rowMemberCount", value = "行维度成员返回个数", required = false)
            @RequestParam(value = "rowMemberCount", required = false) int rowMemberCount
    ){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        try {
            View view = viewService.findOne(viewId);
            ViewDimension viewDimension = new ViewDimension();
            viewDimension.setViewId(viewId);
            viewDimension.setDimensionCode(code);
            viewDimension.setDimensionName(name);
            String dataset = view.getDimensionDataset();
            viewDimension.setEsIndex(dataset.substring(0,dataset.indexOf("/")));
            viewDimension.setEsIndex(dataset.substring(dataset.indexOf("/")+1));
            viewDimension.setRankType(rankType);
            viewDimension.setGroupRow(groupRow);
            viewDimension.setGroupRowOrder(groupRowOrder);
            viewDimension.setColumnOrder(columnOrder);
            viewDimension.setRowMemberOrderType(rowMemberorderType);
            viewDimension.setRowMemberCount(rowMemberCount);
            viewDimensionService.save(viewDimension);
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
        }
        return envelop;
    }
    @ApiOperation(value = "删除视图维度")
    @RequestMapping(value = "/delViewDimension", method = RequestMethod.DELETE)
    public Envelop delViewDimension(
            @ApiParam(name = "id", value = "ID", required = true)
            @RequestParam(value = "id", required = true) int id){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        viewDimensionService.delete(id);
        return envelop;
    }
}

+ 84 - 0
src/main/java/com/yihu/quota/controller/ViewQuotaController.java

@ -0,0 +1,84 @@
package com.yihu.quota.controller;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.util.rest.Envelop;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.view.View;
import com.yihu.quota.model.view.ViewQuota;
import com.yihu.quota.service.cube.CubeService;
import com.yihu.quota.service.view.ViewQuotaService;
import com.yihu.quota.service.view.ViewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@RestController
@RequestMapping(ApiVersion.Version1_0 + "/viewQuota")
@Api(description = "OLAP 视图指标 控制入口")
public class ViewQuotaController extends BaseController {
    @Autowired
    private ViewQuotaService viewQuotaService;
    @Autowired
    private ViewService viewService;
    @ApiOperation(value = "添加视图指标")
    @RequestMapping(value = "/addViewQuota", method = RequestMethod.GET)
    public Envelop addViewQuota(
            @ApiParam(name = "code", value = "维度code", required = true)
            @RequestParam(value = "code", required = true) String code,
            @ApiParam(name = "name", value = "维度名称", required = true)
            @RequestParam(value = "name", required = true) String name,
            @ApiParam(name = "viewId", value = "多维数据集ID", required = true)
            @RequestParam(value = "viewId", required = true) int viewId,
            @ApiParam(name = "formulaMode", value = "计算方式,1:基础公式,2:自定义公式。", required = true)
            @RequestParam(value = "formulaMode", required = false) String formulaMode,
            @ApiParam(name = "basicFormulaType", value = "基础公式:1:求和,2.计数,3:均值,4:最大值,5:最小值,6:去重计数", required = false)
            @RequestParam(value = "basicFormulaType", required = false) String basicFormulaType,
            @ApiParam(name = "chartType", value = "图表类型,1:折线图,2:柱状图。", required = false)
            @RequestParam(value = "chartType", required = false) String chartType
    ){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        try {
            View view = viewService.findOne(viewId);
            ViewQuota viewQuota = new ViewQuota();
            viewQuota.setViewId(viewId);
            viewQuota.setDimensionCode(code);
            viewQuota.setDimensionName(name);
            String dataset = view.getDimensionDataset();
            viewQuota.setEsIndex(dataset.substring(0, dataset.indexOf("/")));
            viewQuota.setEsIndex(dataset.substring(dataset.indexOf("/") + 1));
            viewQuota.setFormulaMode(formulaMode);
            viewQuota.setBasicFormulaType(basicFormulaType);
            viewQuota.setChartType(chartType);
            viewQuotaService.save(viewQuota);
        }catch (Exception e){
            e.printStackTrace();
            envelop.setSuccessFlg(false);
        }
        return envelop;
    }
    @ApiOperation(value = "删除视图指标")
    @RequestMapping(value = "/delViewQuota", method = RequestMethod.DELETE)
    public Envelop delViewQuota(
            @ApiParam(name = "id", value = "ID", required = true)
            @RequestParam(value = "id", required = true) int id){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        viewQuotaService.delete(id);
        return envelop;
    }
}

+ 1 - 0
src/main/java/com/yihu/quota/dao/dict/SystemDictDao.java

@ -7,5 +7,6 @@ import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by chenweida on 2017/6/1.
 */
@Deprecated
public interface SystemDictDao extends PagingAndSortingRepository<SystemDict, Long>, JpaSpecificationExecutor<SystemDict> {
}

+ 1 - 0
src/main/java/com/yihu/quota/dao/dict/SystemDictListDao.java

@ -7,5 +7,6 @@ import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by chenweida on 2017/6/1.
 */
@Deprecated
public interface SystemDictListDao extends PagingAndSortingRepository<SystemDictList, Long>, JpaSpecificationExecutor<SystemDictList> {
}

+ 1 - 2
src/main/java/com/yihu/quota/dao/dimension/TjDimensionSlaveDao.java

@ -7,6 +7,5 @@ import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * Created by chenweida on 2017/6/1.
 */
public interface TjDimensionSlaveDao extends PagingAndSortingRepository<TjDimensionSlave, Long>, JpaSpecificationExecutor<TjDimensionSlave
        > {
public interface TjDimensionSlaveDao extends PagingAndSortingRepository<TjDimensionSlave, Long>, JpaSpecificationExecutor<TjDimensionSlave> {
}

+ 14 - 0
src/main/java/com/yihu/quota/dao/view/ViewDao.java

@ -0,0 +1,14 @@
package com.yihu.quota.dao.view;
import com.yihu.quota.model.view.View;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author janseny
 * @date 2018年9月26日
 */
public interface ViewDao extends PagingAndSortingRepository<View, Integer> {
}

+ 14 - 0
src/main/java/com/yihu/quota/dao/view/ViewDimensionDao.java

@ -0,0 +1,14 @@
package com.yihu.quota.dao.view;
import com.yihu.quota.model.view.ViewDimension;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author janseny
 * @date 2018年9月26日
 */
public interface ViewDimensionDao extends PagingAndSortingRepository<ViewDimension, Integer> {
}

+ 14 - 0
src/main/java/com/yihu/quota/dao/view/ViewQuotaDao.java

@ -0,0 +1,14 @@
package com.yihu.quota.dao.view;
import com.yihu.quota.model.view.ViewQuota;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author janseny
 * @date 2018年9月26日
 */
public interface ViewQuotaDao extends PagingAndSortingRepository<ViewQuota, Integer> {
}

+ 14 - 0
src/main/java/com/yihu/quota/dao/view/ViewQuotaFilterDao.java

@ -0,0 +1,14 @@
package com.yihu.quota.dao.view;
import com.yihu.quota.model.view.ViewQuotaFilter;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author janseny
 * @date 2018年9月26日
 */
public interface ViewQuotaFilterDao extends PagingAndSortingRepository<ViewQuotaFilter, Integer> {
}

+ 1 - 1
src/main/java/com/yihu/quota/etl/formula/AgeGroup.java

@ -3,7 +3,7 @@ package com.yihu.quota.etl.formula;
/**
 * @author l4qiang
 */
public class AgeGroup implements Functioner {
public class AgeGroupFunc implements Functioner {
    public static final String level_age_1_name = "0~6";
    public static final String level_age_2_name = "7~17";
    public static final String level_age_3_name = "18~40";

+ 4 - 4
src/main/java/com/yihu/quota/etl/formula/DateFunc.java

@ -10,14 +10,14 @@ public class DateFunc implements Functioner {
     * @return
     */
    @Override
    public Integer execute(Object... args) {
    public Integer execute(Object... args) throws Exception {
        if (args.length < 2) {
            return 0;
            throw new Exception("args error");
        }
        Date date = (Date) args[0];
        Integer span = (Integer) args[0];
        if (span != Calendar.YEAR && span != Calendar.MONTH && span != Calendar.DAY_OF_MONTH){
        Integer span = (Integer) args[1];
        if (span != Calendar.YEAR && span != Calendar.MONTH && span != Calendar.DAY_OF_MONTH) {
            return 0;
        }

+ 1 - 1
src/main/java/com/yihu/quota/etl/formula/Days.java

@ -8,7 +8,7 @@ import java.util.Date;
/**
 * @author l4qiang
 */
public class Days implements Functioner {
public class DaysFunc implements Functioner {
    @Override
    public Long execute(Object... args) {
        if (args.length < 2) {

+ 19 - 0
src/main/java/com/yihu/quota/etl/formula/DictFunc.java

@ -0,0 +1,19 @@
package com.yihu.quota.etl.formula;
import com.yihu.quota.feign.RsDictClient;
import com.yihu.quota.util.SpringUtil;
public class DictFunc implements Functioner {
    @Override
    public String execute(Object... args) throws Exception {
        if (args.length < 2) {
            throw new Exception("args error");
        }
        String dict = (String) args[0];
        String code = (String) args[1];
        RsDictClient rsDictClient = SpringUtil.getBean(RsDictClient.class);
        return rsDictClient.getCacheValue(dict, code);
    }
}

+ 3 - 3
src/main/java/com/yihu/quota/etl/formula/Division.java

@ -6,16 +6,16 @@ import com.yihu.quota.util.SpringUtil;
/**
 * @author l4qiang
 */
public class Division implements Functioner {
public class DivisionFunc implements Functioner {
    /**
     * @param args args[0] orgCode
     *             args[1] level 1-区县,2-市,3-省,4-国家
     * @return
     */
    @Override
    public String execute(Object... args) {
    public String execute(Object... args) throws Exception {
        if (args.length < 2) {
            return "";
            throw new Exception("args error");
        }
        String orgCode = (String) args[0];

+ 82 - 0
src/main/java/com/yihu/quota/etl/formula/FormulaExecutor.java

@ -0,0 +1,82 @@
package com.yihu.quota.etl.formula;
import com.yihu.ehr.util.datetime.DateUtil;
import java.util.HashMap;
/**
 * 算法执行器
 *
 * @author l4qiang
 */
public class FormulaExecutor {
    static HashMap<String, Functioner> functionerHashMap;
    /**
     * @param clazz  算法类名,包含完整路径,在配置时维护。如:com.yihu.quota.etl.formula.DivisionFunc
     * @param args   参数,需要替换参数使用${code}方式进行标识,在配置时维护.如:string:${province};number:1
     * @param values 值,需要赋值的值使用code方式进行标识, 如:province,361000
     * @throws Exception
     */
    public void run(String clazz, String args, HashMap<String, String> values) throws Exception {
        Functioner functioner = functionerHashMap.get(clazz);
        if (functioner == null) {
            functioner = (Functioner) Class.forName(clazz).newInstance();
            functionerHashMap.put(clazz, functioner);
        }
        if (functioner != null) {
            String[] metaList = args.split(";");
            Object[] parameter = new Object[metaList.length];
            for (int i = 0; i < metaList.length; i++) {
                String arg = metaList[i];
                String[] split = arg.split(":");
                if (split.length != 2) {
                    throw new Exception("wrong args");
                }
                switch (split[0]) {
                    case "number": {
                        String temp = getValue(values, split[1]);
                        parameter[i] = Integer.parseInt(temp);
                        break;
                    }
                    case "string": {
                        String temp = getValue(values, split[1]);
                        parameter[i] = temp;
                        break;
                    }
                    case "date": {
                        String temp = getValue(values, split[1]);
                        parameter[i] = DateUtil.formatCharDateYMD(temp);
                        break;
                    }
                    default:
                        break;
                }
            }
            functioner.execute(parameter);
        }
    }
    private String getValue(HashMap<String, String> values, String defaultValue) {
        String key = defaultValue;
        if (defaultValue.startsWith("${") && defaultValue.endsWith("}")) {
            key = defaultValue.substring(2, defaultValue.lastIndexOf("}"));
        }
        String value = values.get(key);
        if (value != null) {
            return value;
        }
        return defaultValue;
    }
}

+ 1 - 1
src/main/java/com/yihu/quota/etl/formula/Functioner.java

@ -4,5 +4,5 @@ package com.yihu.quota.etl.formula;
 * @author l4qiang
 */
public interface Functioner {
    Object execute(Object... args);
    Object execute(Object... args) throws Exception;
}

+ 8 - 0
src/main/java/com/yihu/quota/feign/RsDictClient.java

@ -10,6 +10,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import springfox.documentation.annotations.ApiIgnore;
import java.io.Serializable;
import java.util.List;
/**
 * @author l4qiang
 */
@ -23,6 +26,11 @@ public interface RsDictClient {
            @ApiParam(name = "dict") @RequestParam(value = "dict") String dict,
            @ApiParam(name = "code") @RequestParam(value = "code") String code);
    @RequestMapping(value = MicroServiceApi.Resource.DICT_ENTRIES, method = RequestMethod.GET)
    @ApiOperation(value = "根据dict从缓存获取字典项")
    List<Serializable> getCacheEntries(
            @ApiParam(name = "dict") @RequestParam(value = "dict") String dict);
    @RequestMapping(value = MicroServiceApi.Resource.DICT_ENTRY, method = RequestMethod.DELETE)
    @ApiOperation(value = "清空缓存字典项")
    void deleteCacheValue(

+ 9 - 3
src/main/java/com/yihu/quota/kafka/ConsumerListener.java

@ -1,6 +1,8 @@
package com.yihu.quota.kafka;
import com.yihu.quota.service.cube.ElasticSearchDataProcessService;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
/**
@ -8,11 +10,15 @@ import org.springframework.kafka.annotation.KafkaListener;
 * kafka消费监听
 */
public class ConsumerListener {
    @Autowired
    private ElasticSearchDataProcessService elasticSearchDataProcessService;
    @KafkaListener(topics = "test")
    @KafkaListener(topics = "sep-hbase-data")
    public void loadData(ConsumerRecord<?, ?> record) {
        System.out.println("-- " + record.key() + " - " + record.value());
        System.out.println("kafka data: " + record.key() + " - " + record.value());
        if(record.value() != null){
            elasticSearchDataProcessService.saveData(record.value().toString());
        }
    }
}

+ 1 - 1
src/main/java/com/yihu/quota/kafka/KafkaConsumerConfig.java

@ -23,7 +23,7 @@ public class KafkaConsumerConfig {
    @Value("${kafka.broker.address}")
    private String kafkaBrokerAddress;
    private static String GROUP_ID = "test";
    private static String GROUP_ID = "sep-hbase-data";
    /* --------------producer configuration-----------------**/
    @Bean

+ 71 - 0
src/main/java/com/yihu/quota/kafka/Producer.java

@ -0,0 +1,71 @@
package com.yihu.quota.kafka;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.Yaml;
import java.io.FileInputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/**
 * @author janseny
 * @date 2018/9/14
 */
@Component
public class Producer {
    private static final Logger logger = LoggerFactory.getLogger(Producer.class);
    public static String sepTopic = "sep-hbase-data";
    public ProducerFactory<String, String> producerFactory() {
        String kafkaBrokerAddress = "";
        try {
            Yaml yaml = new Yaml();
            URL url = Producer.class.getClassLoader().getResource("application.yml");
            if (url != null) {
                Map map = (Map) yaml.load(new FileInputStream(url.getFile()));
                Map map2 = (Map) map.get("kafka");
                Map map3 = (Map) map2.get("broker");
                kafkaBrokerAddress = map3.get("address").toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBrokerAddress);
        props.put(ProducerConfig.RETRIES_CONFIG, 0);
        props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
        props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        return new DefaultKafkaProducerFactory<>(props);
    }
    public boolean sendMessage(String topic, String message) {
        try {
            if (logger.isInfoEnabled()) {
                logger.info("send Message success.");
            }
            KafkaTemplate<String, String> kafkaTemplate = new KafkaTemplate<>(producerFactory());
            kafkaTemplate.send(topic, message);
            return true;
        } catch (Exception e) {
            if (logger.isErrorEnabled()) {
                logger.error("send Message fail." + "topic:" + topic + ",message:" + message + "error:" + e.getMessage(), e);
            }
            return false;
        }
    }
}

+ 15 - 0
src/main/java/com/yihu/quota/model/cube/Cube.java

@ -18,6 +18,7 @@ public class Cube {
    private String code;                  //多维数据集编码
    private Integer dataSourceType;     //数据源类型 1 hbase 2 mysql
    private String indexName;           //保存的索引名称
    private String indexType;           //保存的索引类型名称
    private String note;                //备注
    @Id
@ -31,6 +32,7 @@ public class Cube {
        this.id = id;
    }
    @Column(name = "name")
    public String getName() {
        return name;
    }
@ -39,6 +41,7 @@ public class Cube {
        this.name = name;
    }
    @Column(name = "code")
    public String getCode() {
        return code;
    }
@ -47,6 +50,7 @@ public class Cube {
        this.code = code;
    }
    @Column(name = "data_source_type")
    public Integer getDataSourceType() {
        return dataSourceType;
    }
@ -55,6 +59,7 @@ public class Cube {
        this.dataSourceType = dataSourceType;
    }
    @Column(name = "index_name")
    public String getIndexName() {
        return indexName;
    }
@ -63,6 +68,16 @@ public class Cube {
        this.indexName = indexName;
    }
    @Column(name = "index_type")
    public String getIndexType() {
        return indexType;
    }
    public void setIndexType(String indexType) {
        this.indexType = indexType;
    }
    @Column(name = "note")
    public String getNote() {
        return note;
    }

+ 11 - 13
src/main/java/com/yihu/quota/model/cube/CubeMapping.java

@ -19,8 +19,7 @@ public class CubeMapping {
    private Integer dimensionId;      //维度ID
    private String dimensionCode;    //维度编码
    private String fieldName;        //字段名称
    private Integer saveType;        //成员保存时映射格式类型: 1 列 2 对象 3 子集
    private String childPrimaryKay; //子集唯一字段
    private Integer childSaveType; //子集映射格式类型 1 对象 2 子集
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
@ -33,6 +32,7 @@ public class CubeMapping {
        this.id = id;
    }
    @Column(name = "cube_id")
    public Integer getCubeId() {
        return cubeId;
    }
@ -41,6 +41,7 @@ public class CubeMapping {
        this.cubeId = cubeId;
    }
    @Column(name = "data_field_id")
    public Integer getDataFieldId() {
        return dataFieldId;
    }
@ -49,6 +50,7 @@ public class CubeMapping {
        this.dataFieldId = dataFieldId;
    }
    @Column(name = "dimension_id")
    public Integer getDimensionId() {
        return dimensionId;
    }
@ -57,6 +59,7 @@ public class CubeMapping {
        this.dimensionId = dimensionId;
    }
    @Column(name = "dimension_code")
    public String getDimensionCode() {
        return dimensionCode;
    }
@ -65,6 +68,7 @@ public class CubeMapping {
        this.dimensionCode = dimensionCode;
    }
    @Column(name = "field_name")
    public String getFieldName() {
        return fieldName;
    }
@ -73,19 +77,13 @@ public class CubeMapping {
        this.fieldName = fieldName;
    }
    public Integer getSaveType() {
        return saveType;
    @Column(name = "child_save_type")
    public Integer getChildSaveType() {
        return childSaveType;
    }
    public void setSaveType(Integer saveType) {
        this.saveType = saveType;
    public void setChildSaveType(Integer childSaveType) {
        this.childSaveType = childSaveType;
    }
    public String getChildPrimaryKay() {
        return childPrimaryKay;
    }
    public void setChildPrimaryKay(String childPrimaryKay) {
        this.childPrimaryKay = childPrimaryKay;
    }
}

+ 16 - 1
src/main/java/com/yihu/quota/model/cube/CubeMemberMapping.java

@ -14,11 +14,12 @@ import java.util.List;
@Table(name = "olap_cube_member_mapping")
public class CubeMemberMapping {
    private Integer id;
    private Integer cubeMappingId;    //多维数据集ID
    private Integer cubeMappingId;    //多维数据集维度ID
    private Integer dataFieldId;      //字段名
    private Integer dimensionMemberId;//维度成员ID
    private String dimensionCode;    //维度编码
    private String fieldName;        //字段名称
    private Integer isPrimarykey;  //是否指定唯一字段 1是 0 否
    @Id
@ -32,6 +33,7 @@ public class CubeMemberMapping {
        this.id = id;
    }
    @Column(name = "cube_mapping_id")
    public Integer getCubeMappingId() {
        return cubeMappingId;
    }
@ -40,6 +42,7 @@ public class CubeMemberMapping {
        this.cubeMappingId = cubeMappingId;
    }
    @Column(name = "data_field_id")
    public Integer getDataFieldId() {
        return dataFieldId;
    }
@ -48,6 +51,7 @@ public class CubeMemberMapping {
        this.dataFieldId = dataFieldId;
    }
    @Column(name = "dimension_member_id")
    public Integer getDimensionMemberId() {
        return dimensionMemberId;
    }
@ -56,6 +60,7 @@ public class CubeMemberMapping {
        this.dimensionMemberId = dimensionMemberId;
    }
    @Column(name = "dimension_code")
    public String getDimensionCode() {
        return dimensionCode;
    }
@ -64,6 +69,7 @@ public class CubeMemberMapping {
        this.dimensionCode = dimensionCode;
    }
    @Column(name = "field_name")
    public String getFieldName() {
        return fieldName;
    }
@ -71,4 +77,13 @@ public class CubeMemberMapping {
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    @Column(name = "is_primarykey")
    public Integer getIsPrimarykey() {
        return isPrimarykey;
    }
    public void setIsPrimarykey(Integer isPrimarykey) {
        this.isPrimarykey = isPrimarykey;
    }
}

+ 27 - 0
src/main/java/com/yihu/quota/model/dimension/Dimension.java

@ -33,6 +33,16 @@ public class Dimension {
     */
    private String algorithm;
    /**
     * 中间算法参数
     */
    private String parm;
    /**
     * 数据类型
     */
    private String dataType;
    /**
     * 临时字段,存放维度成员
     */
@ -89,6 +99,23 @@ public class Dimension {
        this.algorithm = algorithm;
    }
    @Column(name = "data_type")
    public String getDataType() {
        return dataType;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public String getParm() {
        return parm;
    }
    public void setParm(String parm) {
        this.parm = parm;
    }
    @Transient
    public List<DimensionMember> getDimensionMembers() {
        return dimensionMembers;

+ 55 - 0
src/main/java/com/yihu/quota/model/dimension/DimensionMember.java

@ -35,6 +35,26 @@ public class DimensionMember {
     */
    private String dimensionName;
    /**
     * 数据类型
     */
    private String dataType;
    /**
     * 中间算法
     */
    private String algorithm;
    /**
     * 中间算法参数
     */
    private String parm;
    /**
     * 数据字典
     */
    private String dict;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
@ -79,6 +99,41 @@ public class DimensionMember {
        this.level = level;
    }
    @Column(name = "data_type")
    public String getDataType() {
        return dataType;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public String getDict() {
        return dict;
    }
    public void setDict(String dict) {
        this.dict = dict;
    }
    public String getAlgorithm() {
        return algorithm;
    }
    public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
    }
    public String getParm() {
        return parm;
    }
    public void setParm(String parm) {
        this.parm = parm;
    }
    @Formula("(SELECT odm.name FROM olap_dimension_member odm LEFT JOIN olap_dimension od ON od.id = odm.dimension_id WHERE odm.id  = id )")
    public String getDimensionName() {
        return dimensionName;

+ 48 - 0
src/main/java/com/yihu/quota/model/rest/FieldInfo.java

@ -0,0 +1,48 @@
package com.yihu.quota.model.rest;
import java.util.List;
/**
 * ElasticSearch 字段信息
 * Created by janseny on 2018/9/17.
 */
public class FieldInfo {
    private String field;//名称
    private String dataType;//数据类型
    private int participle;//分词 1 string  not_analyzed 不分词  2 分词
    private List<FieldInfo> fieldInfos ;//子属性集合
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
    public String getDataType() {
        return dataType;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public int getParticiple() {
        return participle;
    }
    public void setParticiple(int participle) {
        this.participle = participle;
    }
    public List<FieldInfo> getFieldInfos() {
        return fieldInfos;
    }
    public void setFieldInfos(List<FieldInfo> fieldInfos) {
        this.fieldInfos = fieldInfos;
    }
}

+ 15 - 0
src/main/java/com/yihu/quota/model/source/DataSourcesTable.java

@ -20,6 +20,12 @@ public class DataSourcesTable {
     * 表名
     */
    private String tableName;
    /**
     * 表编码
     */
    private String tableCode;
    /**
     * 备注
     */
@ -62,6 +68,15 @@ public class DataSourcesTable {
        this.tableName = tableName;
    }
    @Column(name = "table_code")
    public String getTableCode() {
        return tableCode;
    }
    public void setTableCode(String tableCode) {
        this.tableCode = tableCode;
    }
    public String getNote() {
        return note;
    }

+ 15 - 0
src/main/java/com/yihu/quota/model/source/DataSourcesTableField.java

@ -21,6 +21,11 @@ public class DataSourcesTableField {
     * 字段名
     */
    private String fieldName;
    /**
     * 字段编码
     */
    private String fieldCode;
    /**
     * 字段类型
     */
@ -64,6 +69,16 @@ public class DataSourcesTableField {
        this.fieldName = fieldName;
    }
    @Column(name = "field_code")
    public String getFieldCode() {
        return fieldCode;
    }
    public void setFieldCode(String fieldCode) {
        this.fieldCode = fieldCode;
    }
    @Column(name = "field_type")
    public String getFieldType() {
        return fieldType;

+ 89 - 0
src/main/java/com/yihu/quota/model/view/View.java

@ -0,0 +1,89 @@
package com.yihu.quota.model.view;
import com.yihu.ehr.entity.BaseIdentityEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 *
 * @author janseny
 * @date 2018年9月26日
 */
@Entity
@Table(name = "olap_view")
public class View extends BaseIdentityEntity {
    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; // 备注
    @Column(name = "code")
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    @Column(name = "name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Column(name = "dimension_dataset")
    public String getDimensionDataset() {
        return dimensionDataset;
    }
    public void setDimensionDataset(String dimensionDataset) {
        this.dimensionDataset = dimensionDataset;
    }
    @Column(name = "display_type")
    public String getDisplayType() {
        return displayType;
    }
    public void setDisplayType(String displayType) {
        this.displayType = displayType;
    }
    @Column(name = "tree_data_type")
    public String getTreeDataType() {
        return treeDataType;
    }
    public void setTreeDataType(String treeDataType) {
        this.treeDataType = treeDataType;
    }
    @Column(name = "is_drill")
    public String getIsDrill() {
        return isDrill;
    }
    public void setIsDrill(String isDrill) {
        this.isDrill = isDrill;
    }
    @Column(name = "remark")
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
}

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

@ -0,0 +1,129 @@
package com.yihu.quota.model.view;
import com.yihu.ehr.entity.BaseIdentityEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 *
 * @author janseny
 * @date 2018年9月26日
 */
@Entity
@Table(name = "olap_view_dimension")
public class ViewDimension extends BaseIdentityEntity {
    public Integer viewId; // 视图Id
    public String dimensionCode; // 维度编码
    public String dimensionName; // 维度名称
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String rankType; // 行列维度类型,1:行维度,2,:列维度,默认行维度。
    public Integer groupRow; // 行维度组
    public Integer groupRowOrder; // 组内行维度顺序
    public Integer rowOrder; //可钻取的行维度顺序
    public Integer columnOrder; //列维度顺序
    public String rowMemberOrderType; //行维度成员排序方式,1:按名称排序,2:按子聚合统计值排序,默认按名称排序。
    public Integer rowMemberCount; //行维度成员返回个数
    @Column(name = "view_id")
    public Integer getViewId() {
        return viewId;
    }
    public void setViewId(Integer viewId) {
        this.viewId = viewId;
    }
    @Column(name = "dimension_code")
    public String getDimensionCode() {
        return dimensionCode;
    }
    public void setDimensionCode(String dimensionCode) {
        this.dimensionCode = dimensionCode;
    }
    @Column(name = "dimension_name")
    public String getDimensionName() {
        return dimensionName;
    }
    public void setDimensionName(String dimensionName) {
        this.dimensionName = dimensionName;
    }
    @Column(name = "es_index")
    public String getEsIndex() {
        return esIndex;
    }
    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 = "rank_type")
    public String getRankType() {
        return rankType;
    }
    public void setRankType(String rankType) {
        this.rankType = rankType;
    }
    @Column(name = "group_row")
    public Integer getGroupRow() {
        return groupRow;
    }
    public void setGroupRow(Integer groupRow) {
        this.groupRow = groupRow;
    }
    @Column(name = "group_row_order")
    public Integer getGroupRowOrder() {
        return groupRowOrder;
    }
    public void setGroupRowOrder(Integer groupRowOrder) {
        this.groupRowOrder = groupRowOrder;
    }
    @Column(name = "row_order")
    public Integer getRowOrder() {
        return rowOrder;
    }
    public void setRowOrder(Integer rowOrder) {
        this.rowOrder = rowOrder;
    }
    @Column(name = "column_order")
    public Integer getColumnOrder() {
        return columnOrder;
    }
    public void setColumnOrder(Integer columnOrder) {
        this.columnOrder = columnOrder;
    }
    @Column(name = "row_member_order_type")
    public String getRowMemberOrderType() {
        return rowMemberOrderType;
    }
    public void setRowMemberOrderType(String rowMemberOrderType) {
        this.rowMemberOrderType = rowMemberOrderType;
    }
    @Column(name = "row_member_count")
    public Integer getRowMemberCount() {
        return rowMemberCount;
    }
    public void setRowMemberCount(Integer rowMemberCount) {
        this.rowMemberCount = rowMemberCount;
    }
}

+ 94 - 0
src/main/java/com/yihu/quota/model/view/ViewQuota.java

@ -0,0 +1,94 @@
package com.yihu.quota.model.view;
import com.yihu.ehr.entity.BaseIdentityEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 *
 * @author janseny
 * @date 2018年9月26日
 */
@Entity
@Table(name = "olap_view_quota")
public class ViewQuota extends BaseIdentityEntity {
    public Integer viewId; // 视图Id
    public String dimensionCode; // 维度编码
    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:柱状图。
    @Column(name = "view_id")
    public Integer getViewId() {
        return viewId;
    }
    public void setViewId(Integer viewId) {
        this.viewId = viewId;
    }
    @Column(name = "dimension_code")
    public String getDimensionCode() {
        return dimensionCode;
    }
    public void setDimensionCode(String dimensionCode) {
        this.dimensionCode = dimensionCode;
    }
    @Column(name = "dimension_name")
    public String getDimensionName() {
        return dimensionName;
    }
    public void setDimensionName(String dimensionName) {
        this.dimensionName = dimensionName;
    }
    @Column(name = "es_index")
    public String getEsIndex() {
        return esIndex;
    }
    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 = "formula_mode")
    public String getFormulaMode() {
        return formulaMode;
    }
    public void setFormulaMode(String formulaMode) {
        this.formulaMode = formulaMode;
    }
    @Column(name = "basic_formula_type")
    public String getBasicFormulaType() {
        return basicFormulaType;
    }
    public void setBasicFormulaType(String basicFormulaType) {
        this.basicFormulaType = basicFormulaType;
    }
    @Column(name = "chart_type")
    public String getChartType() {
        return chartType;
    }
    public void setChartType(String chartType) {
        this.chartType = chartType;
    }
}

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

@ -0,0 +1,102 @@
package com.yihu.quota.model.view;
import com.yihu.ehr.entity.BaseIdentityEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 *
 * @author janseny
 * @date 2018年9月26日
 */
@Entity
@Table(name = "olap_view_quota_filter")
public class ViewQuotaFilter extends BaseIdentityEntity {
    public Integer relationId; // 视图/指标主键
    public String dimensionCode; // 维度编码
    public String dimensionName; // 维度名称
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String filterType; // 多维数据集的 ES type
    public String relationType; // 关系类型,1:且,2:或。
    public String compareType; //比较类型,A1:属于,A2:不属于,B1:为空,B2:非空,C1:开头是,C2:结尾是,D1:包含,D2:不包含。
    public String filterValue; //过滤的值
    @Column(name = "relation_id")
    public Integer getRelationId() {
        return relationId;
    }
    public void setRelationId(Integer relationId) {
        this.relationId = relationId;
    }
    @Column(name = "dimension_code")
    public String getDimensionCode() {
        return dimensionCode;
    }
    public void setDimensionCode(String dimensionCode) {
        this.dimensionCode = dimensionCode;
    }
    @Column(name = "dimension_name")
    public String getDimensionName() {
        return dimensionName;
    }
    public void setDimensionName(String dimensionName) {
        this.dimensionName = dimensionName;
    }
    @Column(name = "es_index")
    public String getEsIndex() {
        return esIndex;
    }
    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 = "filter_type")
    public String getFilterType() {
        return filterType;
    }
    public void setFilterType(String filterType) {
        this.filterType = filterType;
    }
    @Column(name = "relation_type")
    public String getRelationType() {
        return relationType;
    }
    public void setRelationType(String relationType) {
        this.relationType = relationType;
    }
    @Column(name = "compare_type")
    public String getCompareType() {
        return compareType;
    }
    public void setCompareType(String compareType) {
        this.compareType = compareType;
    }
    @Column(name = "filter_value")
    public String getFilterValue() {
        return filterValue;
    }
    public void setFilterValue(String filterValue) {
        this.filterValue = filterValue;
    }
}

+ 1 - 1
src/main/java/com/yihu/quota/scheduler/special/OutPatientCostScheduler.java

@ -8,7 +8,7 @@ import com.yihu.ehr.profile.core.ResourceCore;
import com.yihu.ehr.solr.SolrUtil;
import com.yihu.ehr.util.datetime.DateUtil;
import com.yihu.ehr.util.rest.Envelop;
import com.yihu.quota.service.scheduler.HealthArchiveSchedulerService;
import com.yihu.quota.service.special.scheduler.HealthArchiveSchedulerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

+ 40 - 0
src/main/java/com/yihu/quota/service/cube/CubeMappingService.java

@ -5,9 +5,13 @@ import com.yihu.quota.dao.cube.CubeDao;
import com.yihu.quota.dao.cube.CubeMappingDao;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.cube.CubeMapping;
import com.yihu.quota.vo.CubeMappingModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * Created by janseny on 2018/9/10.
@ -31,4 +35,40 @@ public class CubeMappingService extends BaseJpaService<CubeMapping, CubeMappingD
    public void deleteOlapcubeMapping(Integer id) {
        cubeMappingDao.delete(id);
    }
    public CubeMapping findOne(Integer id) {
       return cubeMappingDao.findOne(id);
    }
    /**
     * 根据数据集 查询对应的维度信息
     * @param cubeId
     * @return
     */
    public List<CubeMappingModel> findCubeMappingModelsByCubeId(int cubeId) {
        String sql = "SELECT ocm.*,od.data_type,od.dict from olap_cube_mapping ocm ,olap_dimension od " +
                " where ocm.dimension_id = od.id AND ocm.cube_id = ? order by ocm.id asc";
        List<CubeMappingModel> cubeMappingModels = jdbcTemplate.query(sql, new BeanPropertyRowMapper(CubeMappingModel.class), cubeId);
        return cubeMappingModels;
    }
    /**
     * 根据表编码和字段编码 查询对应的维度信息
     * @param fieldCode
     * @param tableCode
     * @return
     */
    public List<CubeMappingModel> findCubeMappingModelsByFieldCode(String tableCode,String fieldCode) {
        String sql = "SELECT ocm.*,oc.index_name,oc.index_type,odstf.field_code,od.dict,od.data_type,od.`algorithm`,od.parm from olap_cube_mapping ocm  " +
                " LEFT JOIN olap_data_sources_table_field odstf ON ocm.data_field_id = odstf.id "+
                " LEFT JOIN olap_data_sources_table odst ON odst.id = odstf.table_id " +
                " LEFT JOIN olap_cube oc ON oc.id = ocm.cube_id " +
                " LEFT JOIN olap_dimension od ON ocm.dimension_id = od.id where odstf.field_code = ? and odst.table_code = ? ";
        String param[] = {fieldCode,tableCode};
        List<CubeMappingModel> cubeMappingModels = jdbcTemplate.query(sql, new BeanPropertyRowMapper(CubeMappingModel.class), param);
        return cubeMappingModels;
    }
}

+ 70 - 0
src/main/java/com/yihu/quota/service/cube/CubeMemberMappingService.java

@ -6,9 +6,13 @@ import com.yihu.quota.dao.cube.CubeMemberMappingDao;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.cube.CubeMapping;
import com.yihu.quota.model.cube.CubeMemberMapping;
import com.yihu.quota.vo.CubeMemberMappingModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * Created by janseny on 2018/9/10.
@ -32,4 +36,70 @@ public class CubeMemberMappingService extends BaseJpaService<CubeMemberMapping,
    public void deleteOlapcubeMemberMapping(Integer id) {
        cubeMemberMappingDao.delete(id);
    }
    /**
     * 根据数据集维度ID 查询对应的维度成员信息
     * @param id
     * @return
     */
    public List<CubeMemberMappingModel> findCubeMemberMappingModelsById(Integer id) {
        String sql = "SELECT ocmm.*,odm.data_type from olap_cube_member_mapping ocmm ,olap_dimension_member odm " +
                " where ocmm.dimension_member_id = odm.id  AND ocmm.cube_mapping_id = ?  order by ocmm.id asc ";
        List<CubeMemberMappingModel> cubeMemberMappingModels = jdbcTemplate.query(sql, new BeanPropertyRowMapper(CubeMemberMappingModel.class), id);
        return cubeMemberMappingModels;
    }
    /**
     * 根据 表编码和字段编码 查询对应的维度信息
     * @param fieldCode
     * @return
     */
    public List<CubeMemberMappingModel> findCubeMemberMappingModels(String tableCode,String fieldCode) {
        String sql = "SELECT ocmm.*,oc.index_name,oc.index_type,ocm.dimension_code as parentCode,ocm.child_save_type,odstf.field_code,odm.dict,odm.data_type,odm.`algorithm`,odm.parm from olap_cube_member_mapping ocmm " +
                " LEFT JOIN olap_data_sources_table_field odstf ON ocmm.data_field_id = odstf.id " +
                " LEFT JOIN olap_data_sources_table odst ON odst.id = odstf.table_id " +
                " LEFT JOIN olap_dimension_member odm ON ocmm.dimension_member_id = odm.id  " +
                " LEFT JOIN olap_cube_mapping ocm ON ocm.id = ocmm.cube_mapping_id " +
                " LEFT JOIN olap_cube oc ON oc.id = ocm.cube_id " +
                " where odstf.field_code = ? and odst.table_code = ? ";
        String param[] = {fieldCode,tableCode};
        List<CubeMemberMappingModel> cubeMemberMappingModels = jdbcTemplate.query(sql, new BeanPropertyRowMapper(CubeMemberMappingModel.class), param);
        return cubeMemberMappingModels;
    }
    /**
     * 根据 表编码 查询对应的 保存索引和类型
     * @param tableCode
     * @return
     */
    public Cube findCubeByTableCode(String tableCode) {
        String sql = "SELECT oc.* from olap_cube oc " +
                " LEFT JOIN olap_cube_mapping ocm ON oc.id = ocm.cube_id " +
                " LEFT JOIN olap_data_sources_table_field odst ON odst.id = ocm.data_field_id " +
                " LEFT JOIN olap_data_sources_table ods ON ods.id = odst.table_id  " +
                " where ods.table_code = ? ";
        String param[] = {tableCode};
        List<Cube> cubes = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Cube.class), param);
        if(cubes != null && cubes.size() > 0){
            return cubes.get(0);
        }else {
            return null;
        }
    }
    /**
     * 查询子集中 主键字段
     * @param cubeMappingId
     * @return
     */
    public CubeMemberMapping findCubeMemberMappingPrimary(int cubeMappingId){
        String[] fields = {"cubeMappingId","isPrimarykey"};
        Object[] values = {cubeMappingId,1};
        List<CubeMemberMapping> cubeMemberMappings = findByFields(fields,values);
        if(cubeMemberMappings != null && cubeMemberMappings.size() > 0){
            return cubeMemberMappings.get(0);
        }else {
            return null;
        }
    }
}

+ 4 - 0
src/main/java/com/yihu/quota/service/cube/CubeService.java

@ -29,4 +29,8 @@ public class CubeService extends BaseJpaService<Cube, CubeDao> {
    public void deleteOlapCube(Integer id) {
        cubeDao.delete(id);
    }
    public Cube findOne(Integer id) {
        return cubeDao.findOne(id);
    }
}

+ 414 - 0
src/main/java/com/yihu/quota/service/cube/ElasticSearchDataProcessService.java

@ -0,0 +1,414 @@
package com.yihu.quota.service.cube;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.yihu.ehr.elasticsearch.ElasticSearchPool;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.util.datetime.DateUtil;
import com.yihu.quota.etl.formula.AgeGroupFunc;
import com.yihu.quota.etl.formula.DictFunc;
import com.yihu.quota.etl.formula.DivisionFunc;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.cube.CubeMemberMapping;
import com.yihu.quota.util.ElasticSearchHandler;
import com.yihu.quota.vo.CubeMappingModel;
import com.yihu.quota.vo.CubeMemberMappingModel;
import net.bytebuddy.implementation.bytecode.Throw;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.*;
/**
 * Created by janseny on 2018/9/18.
 */
@Service
public class ElasticSearchDataProcessService {
    private static Logger logger = LoggerFactory.getLogger(ElasticSearchDataProcessService.class);
    private static String dataSource_hbase = "hbase";
    private static String dataSource_mysql = "mysql";
    private static String action_del = "DeleteFamily";//删除整行
    private static String action_put = "Put";                //添加和修改单个字段值
    private static String dataSource_k = "dataSource";
    private static String table_k = "table";
    private static String id_k = "_id";
    private static String rowKey_k = "rowkey";
    private static String profileId_k = "profile_id";
    private static String action_k = "action";
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private CubeMappingService cubeMappingService;
    @Autowired
    private CubeMemberMappingService cubeMemberMappingService;
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    /**
     *
     * @param data json 数据串
     */
    public void saveData(String data){
        try {
            Gson gson = new Gson();
            Map<String, Object> dataMap = gson.fromJson(data, Map.class);
            if(dataMap.containsKey(dataSource_k)){
                String dataSource = dataMap.get(dataSource_k).toString();
                dataMap.remove(dataSource_k);
                if(dataSource.toLowerCase().equals(dataSource_hbase)){
                     hbaseDataProcess(dataMap);
                }else if(dataSource.toLowerCase().equals(dataSource_mysql)){
                     mysqlDataProcess(dataMap);
                }
            }
        } catch (Exception e) {
            logger.debug("json数据转换异常");
            e.getMessage();
        }
    }
    /**
     * @param dataMap
     * 如果是子集的数据 hbase 过来要指定父级数据
     * 如果是 删除 子表中的一行数据,es 这边就无法确定删除哪个数据
     */
    public void hbaseDataProcess(Map<String, Object> dataMap) throws Exception{
        Map<String, Object> source  = new HashMap<>();
        String table = "";
        String rowKey = "";
        String profileId = "";
        String action = "";
        if(dataMap.containsKey(table_k)){
            table = dataMap.get(table_k).toString();
        }
        if(dataMap.containsKey(rowKey_k)){
            rowKey = dataMap.get(rowKey_k).toString();
            source.put(id_k,rowKey);
            source.put(rowKey_k,rowKey);
        }
        if(dataMap.containsKey(profileId_k)){
            profileId = dataMap.get(profileId_k).toString();
        }
        if(dataMap.containsKey(action_k)){
            action = dataMap.get(action_k).toString();
        }
        try {
            dataMap.remove(table_k);
            dataMap.remove(rowKey_k);
            dataMap.remove(action_k);
            String keyValue = "";
            if(action.contains(action_put)){
                for(String hbaseColCode : dataMap.keySet()){
                    if(dataMap.get(hbaseColCode)!= null){
                        keyValue = dataMap.get(hbaseColCode).toString();
                    }
                    List<CubeMappingModel> cubeMappingModels = cubeMappingService.findCubeMappingModelsByFieldCode(table, hbaseColCode);
                    if(cubeMappingModels != null && cubeMappingModels.size() > 0){
                        for(CubeMappingModel cubeMappingModel :cubeMappingModels){
                            String index = cubeMappingModel.getIndexName();
                            String type = cubeMappingModel.getIndexType();
                            String cloumnCode = cubeMappingModel.getDimensionCode();
                            String dataType = cubeMappingModel.getDataType();
                            String dict = cubeMappingModel.getDict();
                            String algorithm = cubeMappingModel.getAlgorithm();
                            String algorithmParm = cubeMappingModel.getParm();
                            //维度数据扩展保存
                            Map<String, Object> esDataMap = dimensionDataExtendToMap(keyValue, cloumnCode, dataType, dict, algorithm, algorithmParm);
                            source.putAll(esDataMap);
                            saveElasticSearchData(index, type,rowKey,source);
                        }
                    }
                    //如果存在维度的话 rowkey 赋值给 profileId
                    if(cubeMappingModels != null){
                        profileId = rowKey;
                    }
                    // 是否是子集属性
                    List<CubeMemberMappingModel> cubeMemberMappingModels = cubeMemberMappingService.findCubeMemberMappingModels(table,hbaseColCode);
                    if(cubeMemberMappingModels != null && cubeMemberMappingModels.size() > 0){
                        for(CubeMemberMappingModel cubeMemberMappingModel :cubeMemberMappingModels){
                            String index = cubeMemberMappingModel.getIndexName();
                            String type = cubeMemberMappingModel.getIndexType();
                            String subRowKey = rowKey;
                            if(action.contains(action_put)){
                                //维度成员数据扩展保存
                                source = dimensionMemberDataExtendToMap(cubeMemberMappingModel,keyValue,subRowKey,profileId);
                                saveElasticSearchData(index, type,profileId,source);
                            }
                        }
                    }
                }
            }else if(action.contains(action_del)){
                //一个表只能对应到一个 索引type
                Cube cube = cubeMemberMappingService.findCubeByTableCode(table);
                if(cube != null){
                    elasticSearchUtil.delete(cube.getIndexType(),cube.getIndexType(),rowKey);
                }else {
                    throw new Exception("视图,表不存在");
                }
            }
        }catch (ParseException e){
            logger.debug("elasticSearch 执行失败");
            e.printStackTrace();
            e.getMessage();
        } catch (Exception e) {
            logger.debug("数据解析异常");
            e.printStackTrace();
        }
    }
    /**
     * 维度数据扩展 转map
     * @param cloumnValue
     * @param cloumnCode
     * @param dataType
     * @param dict
     * @param algorithm
     * @param algorithmParm
     * @return
     */
    public Map<String,Object> dimensionDataExtendToMap(String cloumnValue,String cloumnCode,String dataType ,String dict,String algorithm,String algorithmParm ){
        Map<String, Object> source  = new HashMap<>();
        //字典扩展
        if(StringUtils.isNotEmpty(dict) && StringUtils.isEmpty(algorithm)){
            source = extendDictData(source,cloumnCode,dict,cloumnValue);
        }else if(StringUtils.isNotEmpty(algorithm)){
            //年龄段
            if(algorithm.equals("AgeGroupFunc")){
                source = extendAgeGroupData(source,cloumnCode,dict,cloumnValue);
            }
            //其他算法 --
        }else {
            source.put(cloumnCode,dataConver(dataType,cloumnValue));
        }
        return  source;
    }
    /**
     * 维度成员数据扩展 转map
     * @param cubeMemberMappingModel
     * @param cloumnValue
     * @param subRowKey
     * @return
     */
    public Map<String,Object> dimensionMemberDataExtendToMap(CubeMemberMappingModel cubeMemberMappingModel,String cloumnValue,String subRowKey,String profileId) throws Exception {
        Map<String, Object> source  = new HashMap<>();
        String cloumnCode = cubeMemberMappingModel.getDimensionCode();
        String parentCode = cubeMemberMappingModel.getParentCode();
        String dataType = cubeMemberMappingModel.getDataType();
        String dict = cubeMemberMappingModel.getDict();
        String algorithm = cubeMemberMappingModel.getAlgorithm();
        String algorithmParm = cubeMemberMappingModel.getParm();
        int childSaveType = cubeMemberMappingModel.getChildSaveType();
        String index = cubeMemberMappingModel.getIndexName();
        String type = cubeMemberMappingModel.getIndexType();
        if(childSaveType == 1 ){//对象方式
            Map<String, Object> objChildMap  = new HashMap<>();
            if(StringUtils.isNotEmpty(dict)){
                objChildMap = extendDictData(objChildMap,cloumnCode,dict,cloumnValue);
                source.put(parentCode,objChildMap);
            }else if(StringUtils.isNotEmpty(algorithm)){
                //区域算法
                if(algorithm.equals("DivisionFunc") && StringUtils.isNotEmpty(algorithmParm)){
                    objChildMap = extendDivisionData(objChildMap, cloumnCode, algorithmParm, cloumnValue);
                }
                source.put(parentCode,objChildMap);
                //其他算法 统一改为反射的方式 计算 TODO
            }else {
                objChildMap.put(cloumnCode,cloumnValue);
            }
            source.put(parentCode,objChildMap);
        }else if(childSaveType == 2 ){//nested 方式
            //查找子集主键字段
            CubeMemberMapping primaryCubeMember = cubeMemberMappingService.findCubeMemberMappingPrimary(cubeMemberMappingModel.getCubeMappingId());
            String primaryKeyCode = "";
            if(primaryCubeMember != null ){
                primaryKeyCode = primaryCubeMember.getDimensionCode();
            }else {
                return null;
            }
            List<Map<String,Object>> nestedList = new ArrayList<>();
            //查出历史数据 然后组合保存
            Map<String, Object> oldMataMap = elasticSearchUtil.findById(index, type, profileId);
            if(oldMataMap != null && oldMataMap.size() > 0){
                //组装 子集历史数据,更改当前字段值 在添加
                List<Map<String, Object>> childList = (List<Map<String, Object>>)oldMataMap.get(parentCode);
                if(childList != null && childList.size() > 0){
                    boolean isexist = false;
                    for(Map<String, Object> map : childList){
                        if(subRowKey.equals(map.get(primaryKeyCode).toString())){
                            map.put(primaryKeyCode,subRowKey);
                            map.put(cloumnCode,dataConver(dataType,cloumnValue));
                            if(StringUtils.isNotEmpty(dict)){
                                map = extendDictData(map,cloumnCode,dict,cloumnValue);
                            }else if(StringUtils.isNotEmpty(algorithm)){
                                //其他算法
                            }
                            isexist = true;
                        }
                        nestedList.add(map);
                    }
                    if( !isexist){
                        Map<String,Object> map = new HashMap<>();
                        map.put(primaryKeyCode,subRowKey);
                        map.put(cloumnCode,dataConver(dataType,cloumnValue));
                        if(StringUtils.isNotEmpty(dict)){
                            map = extendDictData(map,cloumnCode,dict,cloumnValue);
                        }else if(StringUtils.isNotEmpty(algorithm)){
                            //其他算法
                        }
                        nestedList.add(map);
                    }
                    source.put(parentCode, nestedList);
                }else{
                    Map<String,Object> map = new HashMap<>();
                    map.put(primaryKeyCode,subRowKey);
                    map.put(cloumnCode,dataConver(dataType,cloumnValue));
                    nestedList.add(map);
                    source.put(parentCode, nestedList);
                }
            }else{
                throw new Exception("没有找到数据,无法更新");
            }
        }
        return source;
    }
    /**
     * 字典数据扩展
     * @param source 数据集合
     * @param cloumnCode 列code
     * @param dict 字典ID
     * @param code 字典编码
     * @return
     */
    public Map<String, Object> extendDictData(Map<String, Object> source ,String cloumnCode,String dict,String code){
        DictFunc dictFunc = new DictFunc();
        String value = "";
        String param[] = {dict,code};
//      value = dictFunc.execute(param);
        value =  cloumnCode + "测试值";
        source.put(cloumnCode,code);
        source.put(cloumnCode + "Name",value);
        return source;
    }
    /**
     * 年龄扩展年龄段 及年龄段字典
     * @param source 数据集合
     * @param cloumnCode 列code
     * @param dict 字典ID
     * @param sourceValue 年龄
     * @return
     */
    public Map<String, Object> extendAgeGroupData(Map<String, Object> source ,String cloumnCode,String dict,String sourceValue){
        String value = "";
        DictFunc dictFunc = new DictFunc();
        AgeGroupFunc ageGroupFunc = new AgeGroupFunc();
        String ageGroup = ageGroupFunc.execute(Integer.valueOf(sourceValue));
        String param[] = {dict,ageGroup};
//      value = dictFunc.execute(param);
        value = "年龄段=" + ageGroup;
        if(StringUtils.isNotEmpty(dict)){
            source.put(cloumnCode,ageGroup);
            source.put(cloumnCode + "Name",value);
        }
        return source;
    }
    /**
     * 区域扩展
     * @param source 数据集合
     * @param cloumnCode 列code
     * @param algorithmParm 算法参数
     * @param sourceValue 年龄
     * @return
     */
    public Map<String, Object> extendDivisionData(Map<String, Object> source ,String cloumnCode,String algorithmParm,String sourceValue){
        DivisionFunc divisionFunc = new DivisionFunc();
        String level = "1";
        String divisionVal = "";
        if(cloumnCode.toLowerCase().equals("town")){
            level = "1";
            divisionVal = "信州区";
        }else if(cloumnCode.toLowerCase().equals("city")){
            level = "2";
            divisionVal = "上饶市";
        }else if(cloumnCode.toLowerCase().equals("province")){
            level = "3";
            divisionVal = "江西省";
        }
        String divisionParam[] = {sourceValue,level};
//      divisionVal = divisionFunc.execute(divisionParam);
        source.put(cloumnCode,divisionVal);
        return source;
    }
    /**
     * 添加修改 数据
     * @param index
     * @param type
     * @param rowKey
     * @param source
     * @throws ParseException
     */
    public void saveElasticSearchData(String index,String  type,String rowKey,Map<String, Object> source) throws ParseException {
        Map<String, Object> data = elasticSearchUtil.findById(index, type, rowKey);
        if(data != null){
            elasticSearchUtil.update(index, type,rowKey,source);
        }else {
            elasticSearchUtil.index(index, type,source);
        }
    }
    /**
     * @param dataMap
     */
    public Map<String, Object>  mysqlDataProcess(Map<String, Object> dataMap){
        Map<String, Object> source  = new HashMap<>();
        String table = dataMap.get(table_k).toString();
        String rowKey = dataMap.get(rowKey_k).toString();
        //处理 数据库执行动作 增删改
        //TODO
        return source;
    }
    /**
     * 数据类型转换
     * @param dataType
     * @param keyValue
     */
    public Object dataConver(String dataType,String keyValue){
        NumberFormat nf = NumberFormat.getInstance();
        Object value = null;
        dataType = dataType.toLowerCase();
        if(dataType.equals("string")){
            value = keyValue;
        }else if(dataType.equals("int")){
            int intValue = Integer.valueOf(keyValue);
            value = intValue;
        }else if(dataType.equals("double")){
            nf.setGroupingUsed(false);
            nf.setMaximumFractionDigits(2);
            double doubleValue = Double.valueOf(keyValue);
            value = doubleValue;
        }else if(dataType.equals("date")){
            Date dateValue = DateUtil.formatCharDateYMDHMS(keyValue);
            value = dateValue;
        }
        return value;
    }
}

+ 1 - 0
src/main/java/com/yihu/quota/service/dimension/TjDimensionMainService.java

@ -13,6 +13,7 @@ import java.util.List;
 * @date 2017/6/1
 */
@Service
@Deprecated
public class TjDimensionMainService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

+ 1 - 0
src/main/java/com/yihu/quota/service/dimension/TjDimensionSlaveService.java

@ -13,6 +13,7 @@ import java.util.List;
 * @date 2017/6/1
 */
@Service
@Deprecated
public class TjDimensionSlaveService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

+ 2 - 2
src/main/java/com/yihu/quota/service/job/EsQuotaJob.java

@ -35,7 +35,6 @@ import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * @author chenweida
@ -45,6 +44,7 @@ import java.util.Map;
@Component
@Scope("prototype")
@DisallowConcurrentExecution
@Deprecated
public class EsQuotaJob implements Job {
    @Autowired
    ElasticsearchUtil elasticsearchUtil;
@ -57,6 +57,7 @@ public class EsQuotaJob implements Job {
    private String executeFlag; // 执行动作 1 手动执行 2 周期执行
    private int haveThreadCount = 0;//已完成线程数
    private int threadCount = 1;//总线程数
    @Autowired
    private TjQuotaLogDao tjQuotaLogDao;
    @Autowired
@ -294,7 +295,6 @@ public class EsQuotaJob implements Job {
     */
    private void initParams(JobExecutionContext context) {
        JobDataMap map = context.getJobDetail().getJobDataMap();
        Map<String, Object> params = context.getJobDetail().getJobDataMap();
        Object object = map.get("quota");
        if (object != null) {
            BeanUtils.copyProperties(object, this.quotaVo);

+ 1 - 0
src/main/java/com/yihu/quota/service/job/EsQuotaPercentJob.java

@ -40,6 +40,7 @@ import java.util.List;
@Component
@Scope("prototype")
@DisallowConcurrentExecution
@Deprecated
public class EsQuotaPercentJob implements Job {
    @Autowired
    ElasticsearchUtil elasticsearchUtil;

+ 57 - 56
src/main/java/com/yihu/quota/service/job/JobService.java

@ -1,14 +1,15 @@
package com.yihu.quota.service.job;
import com.yihu.quota.contants.JobConstant;
import com.yihu.quota.dao.TjQuotaDao;
import com.yihu.quota.model.TjQuota;
import com.yihu.quota.util.QuartzHelper;
import com.yihu.quota.vo.QuotaVo;
import org.apache.commons.lang3.StringUtils;
import org.quartz.ObjectAlreadyExistsException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
@ -18,7 +19,6 @@ import java.util.Map;
 */
@Service
public class JobService {
    @Autowired
    private QuartzHelper quartzHelper;
    @Autowired
@ -26,49 +26,55 @@ public class JobService {
    /**
     * 启动指标任务
     * 启动任务只关心任务是否手动(马上)执行还是任务执行(Cron),对于数据是否初始化(全量),或者增量,这个是具体Job判断的事情。
     * 任务只是执行时间有区别,并且任务不可能同时存在立即执行和周期执行两种行为,不需要增加任务名称来增加复杂度
     *
     * @param id          指标ID
     * @param executeFlag 执行动作标识,1:初始执行(全量统计),2:立即执行、周期执行(增量统计)
     * @param executeFlag 执行动作标识,0:全量执行,1:增量执行。
     * @param startDate   抽取数据起始日期。初始执行时为NULL;立即执行时需要传值;周期执行时也为NULL,如果是基础指标周期执行,后续默认赋值昨天开始。
     * @param endDate     抽取数据截止日期。初始执行时无NULL;立即执行时需要传值;周期执行时也为NULL,如果是基础指标周期执行,后续默认赋值昨天截止。
     * @throws Exception
     */
    public void executeJob(Integer id, String executeFlag, String startDate, String endDate) throws Exception {
    public void execute(Integer id, String executeFlag, String startDate, String endDate) throws Exception {
        TjQuota tjQuota = quotaDao.findOne(id);
        if (tjQuota != null) {
            QuotaVo quotaVo = new QuotaVo();
            BeanUtils.copyProperties(tjQuota, quotaVo);
            Map<String, Object> params = new HashMap<>();
            params.put("quota", quotaVo);
            params.put("executeFlag", executeFlag);
            params.put("startTime", startDate);
            params.put("endTime", endDate);
            String quotaCode = quotaVo.getCode().replace("_", "");
            String quotaCodeImmediately = quotaCode + "immediately";
            boolean existJob = quartzHelper.isExistJob(quotaCode);
            boolean existJobImmediately = quartzHelper.isExistJob(quotaCodeImmediately);
            if (existJob && "0".equals(quotaVo.getJobStatus())) {
                //周期执行jobKey
                quartzHelper.removeJob(quotaCode);
            }
            if (existJobImmediately) {
                //立即执行jobKey
                quartzHelper.removeJob(quotaCodeImmediately);
            }
            //往quartz框架添加任务
            if ((!StringUtils.isEmpty(executeFlag) && executeFlag.equals("1")) || // 初始执行
                    (!StringUtils.isEmpty(tjQuota.getJobClazz()) && tjQuota.getExecType().equals("1"))) { // 立即执行
                try {
                    quartzHelper.startNow(Class.forName(quotaVo.getJobClazz()), quotaCodeImmediately, params);
                } catch (Exception e) {
                    throw new ObjectAlreadyExistsException(quotaCodeImmediately + "," + tjQuota.getName() + "指标正在执行!");
                }
            } else {
                //周期执行指标 更新指标执行状态:0未开启,1执行中
                tjQuota.setJobStatus("1");
                quotaDao.save(tjQuota);
                quartzHelper.addJob(Class.forName(quotaVo.getJobClazz()), quotaVo.getCron(), quotaCode, params);
        if (tjQuota == null) {
            throw new Exception("数据采集任务,id:" + id);
        }
        QuotaVo quotaVo = new QuotaVo();
        BeanUtils.copyProperties(tjQuota, quotaVo);
        Map<String, Object> params = new HashMap<>(4);
        params.put("quota", quotaVo);
        params.put("executeFlag", executeFlag);
        params.put("startTime", startDate);
        params.put("endTime", endDate);
        String jobId = quotaVo.getCode();
        boolean existJobId = quartzHelper.isExistJob(jobId);
        if (existJobId) {
            quartzHelper.removeJob(jobId);
        }
        if (StringUtils.isEmpty(quotaVo.getJobClazz())) {
            throw new Exception("数据采集任务未配置执行类");
        }
        //往quartz框架添加任务
        JobConstant.ExecWay execWay = JobConstant.ExecWay.fromStr(tjQuota.getExecType());
        // 初始执行或者立即执行
        if (JobConstant.ExecWay.Manual.equals(execWay)) {
            try {
                quartzHelper.startNow(Class.forName(quotaVo.getJobClazz()), jobId, params);
            } catch (Exception e) {
                throw new ObjectAlreadyExistsException(jobId + "," + tjQuota.getName() + "指标正在执行!");
            }
        } else {
            //周期执行指标 更新指标执行状态:0未开启,1执行中
            tjQuota.setJobStatus("1");
            quotaDao.save(tjQuota);
            quartzHelper.addJob(Class.forName(quotaVo.getJobClazz()), quotaVo.getCron(), jobId, params);
        }
    }
@ -78,28 +84,23 @@ public class JobService {
     * @param id 指标ID
     * @throws Exception
     */
    public void removeJob(Integer id) throws Exception {
    public void stop(Integer id) throws Exception {
        TjQuota tjQuota = quotaDao.findOne(id);
        if (tjQuota != null) {
            QuotaVo quotaVo = new QuotaVo();
            BeanUtils.copyProperties(tjQuota, quotaVo);
            String quotaCode = quotaVo.getCode().replace("_", "");
            String quotaCodeImmediately = quotaCode + "immediately";
            boolean existJob = quartzHelper.isExistJob(quotaCode);
            boolean existJobImmediately = quartzHelper.isExistJob(quotaCodeImmediately);
            if (existJob) {
                //周期执行jobKey
                quartzHelper.removeJob(quotaCode);
            }
            if (existJobImmediately) {
                //立即执行jobKey
                quartzHelper.removeJob(quotaCodeImmediately);
            }
            //周期执行指标 更新指标执行状态:0未开启,1执行中
            tjQuota.setJobStatus("0");
            quotaDao.save(tjQuota);
        if (tjQuota == null) {
            throw new Exception("数据采集任务,id:" + id);
        }
        QuotaVo quotaVo = new QuotaVo();
        BeanUtils.copyProperties(tjQuota, quotaVo);
        String jobId = quotaVo.getCode();
        boolean existJobId = quartzHelper.isExistJob(jobId);
        if (existJobId) {
            quartzHelper.removeJob(jobId);
        }
        //周期执行指标 更新指标执行状态:0未开启,1执行中
        tjQuota.setJobStatus("0");
        quotaDao.save(tjQuota);
    }
}

+ 185 - 0
src/main/java/com/yihu/quota/service/job/SingleTableJob.java

@ -0,0 +1,185 @@
package com.yihu.quota.service.job;
import com.google.gson.Gson;
import com.yihu.ehr.util.datetime.DateUtil;
import com.yihu.quota.contants.JobConstant;
import com.yihu.quota.kafka.Producer;
import com.yihu.quota.util.sql.DbKit;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 用于一个表就是一个多维数据集的情况,如组织机构表的数据采集
 * 数据采集表要求,不符合要求的表需要先改造后进行数据采集:
 * <p>
 * 表必须是单字段唯一键(或主键),不支持复合唯一键(或主键)
 * 过滤字段只支持单字段,不支持多字段过滤
 * 过滤字段只支持时间和数字字段,不支持其他类型字段
 *
 * @author l4qiang
 * @date 2018-09-18
 */
@Component
@Scope("prototype")
@DisallowConcurrentExecution
public class SingleTableJob implements Job {
    static private Logger logger = LoggerFactory.getLogger(SingleTableJob.class);
    /**
     * 数据来源表
     */
    protected String table;
    /**
     * 表主键
     */
    protected String primeKey;
    /**
     * 过滤字段
     */
    protected String filterField;
    /**
     * 过滤字段类型
     */
    protected String filterFieldType;
    /**
     * 过滤数据步长
     */
    protected String size;
    /**
     * 开始时间
     */
    protected String start;
    /**
     * 结束时间
     */
    protected String end;
    /**
     * 执行动作 1 手动执行 2 周期执行
     */
    protected JobConstant.ExecType execType;
    @Autowired
    private Producer producer;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        prepare(jobExecutionContext);
        cleanData();
        List<Map<String, Object>> list;
        do {
            list = fetch();
            saveData(list);
        } while (list != null && list.size() != 0);
    }
    private void prepare(JobExecutionContext jobExecutionContext) {
        //spring注入
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        table = jobDataMap.getString("table");
        primeKey = jobDataMap.getString("primeKey");
        filterField = jobDataMap.getString("filterField");
        filterFieldType = jobDataMap.getString("filterFieldType");
        size = jobDataMap.getString("size");
        start = jobDataMap.getString("start");
        end = jobDataMap.getString("end");
    }
    private void cleanData() {
        if (JobConstant.ExecType.Full.equals(execType)) {
            Map<String, Object> dataMap = new HashMap<>(2);
            dataMap.put("table", table);
            dataMap.put("delAll", true);
            Gson gson = new Gson();
            String jsonData = gson.toJson(dataMap);
            producer.sendMessage(Producer.sepTopic, jsonData);
        }
    }
    private void saveData(List<Map<String, Object>> list) {
        if (list == null) {
            logger.warn("未获取到数据");
            return;
        }
        list.forEach(item -> {
            Map<String, Object> dataMap = new HashMap<>(item.size());
            dataMap.put("table", table);
            item.forEach((key, value) -> {
                if (key.equals(primeKey)) {
                    dataMap.put("rowKey", value);
                }
                dataMap.put(key, value);
            });
            Gson gson = new Gson();
            String jsonData = gson.toJson(dataMap);
            producer.sendMessage(Producer.sepTopic, jsonData);
        });
    }
    /**
     * TODO:没有设置数据库来源和数据库类型,当前使用默认数据库
     *
     * @return
     */
    private List<Map<String, Object>> fetch() {
        String sql = "";
        if ("number".equals(filterFieldType)) {
            Long lngTemp = Long.parseLong(start) + Long.parseLong(size);
            String temp = lngTemp.toString();
            sql = "select * from " + table +
                    " where " + filterField + ">=" + start + " and " + filterField + "<" + temp + " and " +
                    filterField + "<=" + end;
            start = temp;
        } else if ("date".equals(filterFieldType)) {
            Date date = DateUtil.toDateFromTime(start);
            java.util.Calendar calendar = java.util.Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(java.util.Calendar.HOUR_OF_DAY, Integer.parseInt(size));
            String temp = DateUtil.toString(calendar.getTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
            sql = "select * from " + table +
                    " where " + filterField + ">=" + DbKit.use().getLongDate(start) + " and " + filterField + "<" + DbKit.use().getLongDate(temp) + " and " +
                    filterField + "<=" + DbKit.use().getLongDate(end);
            start = temp;
        } else {
            logger.warn("不支持的过滤字段类型");
            return null;
        }
        return jdbcTemplate.queryForList(sql);
    }
}

+ 1 - 0
src/main/java/com/yihu/quota/service/org/OrgService.java

@ -12,6 +12,7 @@ import java.util.Map;
 * Created by progr1mmer on 2017/12/29.
 */
@Service
@Deprecated
public class OrgService {
    @Autowired

+ 1 - 0
src/main/java/com/yihu/quota/service/quota/special/DeviceService.java

@ -14,6 +14,7 @@ import javax.transaction.Transactional;
 */
@Service
@Transactional
@Deprecated
public class DeviceService {
    @Autowired

+ 1 - 0
src/main/java/com/yihu/quota/service/quota/special/HbaseService.java

@ -21,6 +21,7 @@ import java.util.Map;
 * @author jansney
 */
@Service
@Deprecated
public class HbaseService {
    @Autowired
    HBaseDao hbaseDao;

+ 1 - 0
src/main/java/com/yihu/quota/service/quota/special/SolrStatistsService.java

@ -19,6 +19,7 @@ import java.util.Map;
 * Created by janseny on 2017/7/7.
 */
@Service
@Deprecated
public class SolrStatistsService {
    private static String core = "HealthProfile";

+ 1 - 0
src/main/java/com/yihu/quota/service/quota/special/StatisticsService.java

@ -20,6 +20,7 @@ import java.util.*;
 * Created by lyr on 2016/7/21.
 */
@Service
@Deprecated
public class StatisticsService {
    private static String core = "HealthProfile";

+ 2 - 1
src/main/java/com/yihu/quota/service/scheduler/HealthArchiveSchedulerService.java

@ -1,4 +1,4 @@
package com.yihu.quota.service.scheduler;
package com.yihu.quota.service.special.scheduler;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
@ -25,6 +25,7 @@ import java.util.*;
 * Created by wxw on 2018/3/14.
 */
@Service
@Deprecated
public class HealthArchiveSchedulerService {
    @Autowired

+ 26 - 0
src/main/java/com/yihu/quota/service/view/ViewDimensionService.java

@ -0,0 +1,26 @@
package com.yihu.quota.service.view;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.quota.dao.view.ViewDao;
import com.yihu.quota.dao.view.ViewDimensionDao;
import com.yihu.quota.model.view.View;
import com.yihu.quota.model.view.ViewDimension;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@Service
public class ViewDimensionService extends BaseJpaService<ViewDimension, ViewDimensionDao> {
    private static final Logger logger = Logger.getLogger(ViewDimensionService.class);
    @Autowired
    ViewDimensionDao viewDimensionDao;
}

+ 24 - 0
src/main/java/com/yihu/quota/service/view/ViewQuotaFilterService.java

@ -0,0 +1,24 @@
package com.yihu.quota.service.view;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.quota.dao.view.ViewQuotaFilterDao;
import com.yihu.quota.model.view.ViewQuotaFilter;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@Service
public class ViewQuotaFilterService extends BaseJpaService<ViewQuotaFilter, ViewQuotaFilterDao> {
    private static final Logger logger = Logger.getLogger(ViewQuotaFilterService.class);
    @Autowired
    ViewQuotaFilterDao viewQuotaFilterDao;
}

+ 24 - 0
src/main/java/com/yihu/quota/service/view/ViewQuotaService.java

@ -0,0 +1,24 @@
package com.yihu.quota.service.view;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.quota.dao.view.ViewQuotaDao;
import com.yihu.quota.model.view.ViewQuota;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@Service
public class ViewQuotaService extends BaseJpaService<ViewQuota, ViewQuotaDao> {
    private static final Logger logger = Logger.getLogger(ViewQuotaService.class);
    @Autowired
    ViewQuotaDao viewQuotaDao;
}

+ 28 - 0
src/main/java/com/yihu/quota/service/view/ViewService.java

@ -0,0 +1,28 @@
package com.yihu.quota.service.view;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.quota.dao.view.ViewDao;
import com.yihu.quota.model.cube.Cube;
import com.yihu.quota.model.view.View;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author janseny
 * @date 2018年9月26日
 */
@Service
public class ViewService extends BaseJpaService<View, ViewDao> {
    private static final Logger logger = Logger.getLogger(ViewService.class);
    @Autowired
    ViewDao viewDao;
    public View findOne(Integer id) {
        return viewDao.findOne(id);
    }
}

+ 122 - 0
src/main/java/com/yihu/quota/util/AggregationBuildHandler.java

@ -0,0 +1,122 @@
package com.yihu.quota.util;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
 * Created by janseny on 2018/9/28.
 */
@Component
public class AggregationBuildHandler {
    /**
     * 简单聚合
     * @param aggType 聚合类型
     * @param aggName 聚合名称
     * @param fieldName 聚合字段
     * @return
     */
    public AbstractAggregationBuilder addAggregationBuilder(String aggType,String aggName, String fieldName){
        AbstractAggregationBuilder builder = null;
        if(aggType.equals("sum")){
            builder = AggregationBuilders.sum(aggName).field(fieldName);
        }else if(aggType.equals("count")){
            builder = AggregationBuilders.count(aggName).field(fieldName);
        }else if(aggType.equals("avg")){
            builder = AggregationBuilders.avg(aggName).field(fieldName);
        }else if(aggType.equals("max")){
            builder = AggregationBuilders.max(aggName).field(fieldName);
        }else if(aggType.equals("min")){
            builder = AggregationBuilders.min(aggName).field(fieldName);
        }
        return  builder;
    }
    /**
     * 分组后,简单聚合
     * @param aggType 聚合类型
     * @param aggName 聚合名称
     * @param fieldName 聚合字段
     * @return
     */
    public AbstractAggregationBuilder addTermAggregationBuilder(String termName, String termFieldName,String aggType,String aggName, String fieldName){
        AbstractAggregationBuilder builder = null;
        TermsBuilder termsBuilder = addTermsBuilder(termName,termFieldName);
        if(aggType.equals("sum")){
            builder = termsBuilder.subAggregation(AggregationBuilders.sum(aggName).field(fieldName));
        }else if(aggType.equals("count")){
            builder = termsBuilder.subAggregation(AggregationBuilders.count(aggName).field(fieldName));
        }else if(aggType.equals("avg")){
            builder = termsBuilder.subAggregation(AggregationBuilders.avg(aggName).field(fieldName));
        }else if(aggType.equals("max")){
            builder = termsBuilder.subAggregation(AggregationBuilders.max(aggName).field(fieldName));
        }else if(aggType.equals("min")){
            builder = termsBuilder.subAggregation(AggregationBuilders.min(aggName).field(fieldName));
        }
        return  builder;
    }
    /**
     * 添加分组
     * @param termName
     * @param fieldName
     * @return
     */
    public TermsBuilder addTermsBuilder(String termName, String fieldName){
        TermsBuilder termsBuilder= AggregationBuilders.terms(termName).field(fieldName);
        return termsBuilder;
    }
    /**
     *
     * @param client
     * @param boolQueryBuilder  查询的过滤条件
     * @param aggBuilderList  聚合组
     *  聚合组中成员是 单个的聚合查询,其中单个的聚合查询可以嵌套子聚合查询 如:
     *  单个聚合 查询 :TermsBuilder firstAgg= AggregationBuilders.terms("player_count ").field("team");
     *  带有子聚合的聚合查询 :
     *    TermsBuilder secondAgg= AggregationBuilders.terms("pos_count").field("position")
     *      .subAggregation(
     *          AggregationBuilders.dateHistogram("by_year").field("dateOfBirth").interval((DateHistogramInterval.YEAR))
     *              .subAggregation(
     *                  AggregationBuilders.avg("avg_children").field("children")
     *              )
     *          );
     * @return 结果集
     */
    public List<Map<String, Object>> structAggregationQuery(TransportClient client,String index,String type,
                                                            BoolQueryBuilder boolQueryBuilder,
                                                            LinkedList<AbstractAggregationBuilder> aggBuilderList){
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type).
                setQuery(boolQueryBuilder);
        for(AbstractAggregationBuilder aggBuilder : aggBuilderList){
            searchRequestBuilder.addAggregation(aggBuilder);
        }
        SearchResponse sr = searchRequestBuilder.execute().actionGet();
        List<Map<String, Object>> matchRsult = new LinkedList<Map<String, Object>>();
        //数据解析 TODO
//        ValueCount sum = sr.getAggregations().get("count_result");
//        double v = sum.getValue();
        client.close();
        return matchRsult;
    }
}

+ 266 - 0
src/main/java/com/yihu/quota/util/ElasticSearchHandler.java

@ -0,0 +1,266 @@
package com.yihu.quota.util;
import com.yihu.quota.model.rest.FieldInfo;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
/**
 * Created by janseny on 2018/9/17.
 */
@Configuration
@Component
public class ElasticSearchHandler {
    private static Logger logger = LoggerFactory.getLogger(ElasticSearchHandler.class);
    @Value("${elasticsearch.cluster-name}")
    private String clusterName;
    @Value("${elasticsearch.cluster-nodes}")
    private String ip;
    /**
     * 取得实例
     * @return
     */
    public synchronized TransportClient getTransportClient() {
        TransportClient client = null ;
        try {
            Settings settings = Settings.builder().put("cluster.name", clusterName)
        /*            .put("client.transport.sniff", true)*/
                    .put("client.transport.ping_timeout", "30s").build();
            String host = ip.split(";")[0];
            host = host.substring(0,host.indexOf(":"));
            client = TransportClient.builder().settings(settings).build()
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), 9300));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return client;
    }
    /**
     * 关闭连接
     * @param client   es客户端
     */
    public void close(TransportClient client) {
        client.close();
    }
    /**
     * 为集群添加新的节点
     * @param nodeName
     * @param client   es客户端
     */
    public synchronized void addNode(String nodeName,TransportClient client) {
        try {
            client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(nodeName), 9300));
            close(client);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
    /**
     * 删除集群中的某个节点
     * @param client   es客户端
     * @param name
     */
    public synchronized void removeNode(String name,TransportClient client) {
        try {
            client.removeTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(name), 9300));
            close(client);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
    /**
     * 创建索引
     *
     * @param index   索引名称
     * @param client   es客户端
     */
    public void createIndex(String index,TransportClient client) {
        CreateIndexRequest request = new CreateIndexRequest(index);
        client.admin().indices().create(request);
        close(client);
    }
    /**
     * 判断指定的索引名是否存在
     * @param indexName 索引名
     * @return  存在:true; 不存在:false;
     */
    public boolean isExistsIndex(String indexName,TransportClient client){
        IndicesExistsResponse response =  client.admin().indices().exists(
                new IndicesExistsRequest().indices(new String[]{indexName})).actionGet();
        close(client);
        return response.isExists();
    }
    /**
     * 判断指定的索引的类型是否存在
     * @param indexName 索引名
     * @param indexType 索引类型
     * @return  存在:true; 不存在:false;
     */
    public boolean isExistsType(String indexName,String indexType,TransportClient client){
        TypesExistsResponse response = client.admin().indices()
                .typesExists(new TypesExistsRequest(new String[]{indexName}, indexType)).actionGet();
        boolean isEXist = response.isExists();
        close(client);
        return isEXist;
    }
    /**
     * 创建mapping
     * @param index    索引
     * @param type     类型
     * @param client   es客户端
     * @param xMapping mapping描述
     */
    public void createBangMapping(String index, String type, XContentBuilder xMapping,TransportClient client) {
        PutMappingRequest mapping = Requests.putMappingRequest(index).type(type).source(xMapping);
        client.admin().indices().putMapping(mapping).actionGet();
        close(client);
    }
    /**
     * 根据信息自动创建索引与mapping
     * 构建mapping描述    有问题
     * @param fieldInfoList
     * @param client   es客户端
     * @return
     */
    public void createIndexAndCreateMapping(String index, String type,List<FieldInfo> fieldInfoList,TransportClient client) {
        XContentBuilder mapping = null;
        try {
            CreateIndexRequestBuilder cib = client.admin()
                    .indices().prepareCreate(index);
            mapping = XContentFactory.jsonBuilder()
                    .startObject().startObject("properties"); //设置之定义字段
            for(FieldInfo info : fieldInfoList){
                String field = info.getField();
                String dataType = info.getDataType();
                if(dataType == null || "".equals(dataType.trim())){
                    dataType = "String";
                }
                dataType = dataType.toLowerCase();
                Integer participle = info.getParticiple();
                if("string".equals(dataType)){
                    mapping.startObject(field).field("type", "string").field("index", "not_analyzed").endObject();
                }else if("date".equals(dataType)){
                    mapping.startObject(field).field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject();
                }else if("object".equals(dataType)){//对象属性
                    mapping.startObject(field).startObject("properties");
                    //子属性
                    List<FieldInfo> childFieldList = info.getFieldInfos();
                    for(FieldInfo child : childFieldList){
                        String childField = child.getField();
                        String childDataType = child.getDataType();
                        int childParticiple = child.getParticiple();
                        if("string".equals(childDataType)){
                            mapping.startObject(childField).field("type", "string").field("index", "not_analyzed").endObject();
                        }else if("date".equals(dataType)){
                            mapping.startObject(childField).field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject();
                        }else {
                            mapping.startObject(childField) .field("type", childDataType).endObject();
                        }
                    }
                    mapping.endObject().endObject();
                }else if("nested".equals(dataType)){//子集属性
                    mapping.startObject(field).field("type", "nested").startObject("properties");
                    //子属性
                    List<FieldInfo> childFieldList = info.getFieldInfos();
                    for(FieldInfo child : childFieldList){
                        String childField = child.getField();
                        String childDataType = child.getDataType();
                        int childParticiple = child.getParticiple();
                        if("string".equals(childDataType)){
                            mapping.startObject(childField).field("type", "string").field("index", "not_analyzed").endObject();
                        }else if("date".equals(dataType)){
                            mapping.startObject(childField).field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject();
                        }else {
                            mapping.startObject(childField) .field("type", childDataType).endObject();
                        }
                    }
                    mapping.endObject().endObject();
                }else {
                    mapping.startObject(field) .field("type", dataType).endObject();
                }
            }
            mapping.endObject()
                    .endObject();
            cib.addMapping(type, mapping);
            cib.execute().actionGet();
            close(client);
        } catch (IOException e) {
            logger.debug("创建索引发生异常");
        }
    }
    /**
     * 根据模板自动创建索引与mapping
     * @param index 索引字段
     * @param type  类型
     * @param client  客户端
     * @throws IOException
     */
    public void createMappingByTemplate(String index, String type,TransportClient client) throws IOException {
        CreateIndexRequestBuilder cib=client.admin()
                .indices().prepareCreate(index);
        XContentBuilder mapping = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("properties") //设置之定义字段
                        .startObject("id") .field("type", "integer").field("index", "not_analyzed").endObject()
                        .startObject("classs").field("type", "integer").field("index", "not_analyzed").endObject()
                        .startObject("score").field("type", "integer").field("index", "not_analyzed").endObject()
                        //子属性
                        .startObject("student")
                            .startObject("properties")
                                .startObject("name").field("type", "string").field("index", "not_analyzed").endObject()
                                .startObject("age").field("type", "string").endObject()
                            .endObject()
                        .endObject()
                        .startObject("updatetime").field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject()
                    .endObject()
                .endObject();
        cib.addMapping(type, mapping);
        cib.execute().actionGet();
        close(client);
    }
}

+ 20 - 17
src/main/java/com/yihu/quota/util/QuartzHelper.java

@ -12,6 +12,9 @@ import java.util.Map;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
/**
 * @author administrator
 */
@Component("quartzHelper")
public class QuartzHelper {
    @Autowired
@ -29,22 +32,20 @@ public class QuartzHelper {
        }
    }
    public void addJob(Class jobClass, String cronString, String jobKey,
                       Map<String, Object> params) throws Exception {
        if (!CronExpression.isValidExpression(cronString)) {
    public void addJob(Class jobClass, String cron, String id, Map<String, Object> params) throws Exception {
        if (!CronExpression.isValidExpression(cron)) {
            throw new Exception("cronExpression is not a valid Expression");
        }
        try {
            JobDetail job = JobBuilder.newJob(jobClass)
                    .withIdentity("job-id:" + jobKey, "job-group:" + jobKey)
                    .withIdentity("job-id:" + id, "job-group:" + id)
                    .build();
            JobDataMap jobDataMap = job.getJobDataMap();
            jobDataMap.putAll(params);
            CronTrigger trigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity("trigger-name:" + jobKey,
                            "trigger-group:" + jobKey)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronString))
                    .withIdentity("trigger-name:" + id, "trigger-group:" + id)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                    .build();
            scheduler.scheduleJob(job, trigger);
            scheduler.start();
@ -53,18 +54,20 @@ public class QuartzHelper {
        }
    }
    public void removeJob(String jobKeyString) throws Exception {
        TriggerKey triggerKey = new TriggerKey("trigger-name:" + jobKeyString,
                "trigger-group:" + jobKeyString);
        JobKey jobName = new JobKey("job-group:" + jobKeyString, "job-id:"
                + jobKeyString);
        scheduler.pauseTrigger(triggerKey);// 停止触发器
        scheduler.unscheduleJob(triggerKey);// 移除触发器
        scheduler.deleteJob(jobName);// 删除任务
    public void removeJob(String id) throws Exception {
        TriggerKey triggerKey = new TriggerKey("trigger-name:" + id, "trigger-group:" + id);
        JobKey jobKey = new JobKey("job-group:" + id, "job-id:" + id);
        // 停止触发器
        scheduler.pauseTrigger(triggerKey);
        // 移除触发器
        scheduler.unscheduleJob(triggerKey);
        // 删除任务
        scheduler.deleteJob(jobKey);
    }
    public boolean isExistJob(String jobKey) throws SchedulerException {
        JobKey jk = new JobKey("job-id:" + jobKey, "job-group:" + jobKey);
    public boolean isExistJob(String id) throws SchedulerException {
        JobKey jk = new JobKey("job-id:" + id, "job-group:" + id);
        if (scheduler.checkExists(jk)) {
            return true;
        } else {

+ 23 - 0
src/main/java/com/yihu/quota/util/sql/Db.java

@ -0,0 +1,23 @@
package com.yihu.quota.util.sql;
public interface Db {
    String getDate(String value);
    String getLongDate(String value);
    String getNumber(String value);
    /**
     * 支持的数据类型
     */
    public enum Type {
        /**
         * oracle
         */
        oracle,
        /**
         * mysql
         */
        mysql
    }
}

+ 50 - 0
src/main/java/com/yihu/quota/util/sql/DbKit.java

@ -0,0 +1,50 @@
package com.yihu.quota.util.sql;
import java.util.HashMap;
public class DbKit {
    private Db defaultDb;
    private HashMap<Db.Type, Db> mapDB = new HashMap<>();
    private DbKit(Db.Type type) {
        Db db = mapDB.get(type);
        if (db != null) {
            defaultDb = db;
            return;
        }
        switch (type) {
            case mysql:
                db = new MysqlDb();
                break;
            case oracle:
                db = new OracleDb();
                break;
            default:
                break;
        }
        defaultDb = db;
        mapDB.put(type, db);
    }
    public static DbKit use() {
        return use(Db.Type.mysql);
    }
    public static DbKit use(Db.Type type) {
        return new DbKit(type);
    }
    public String getDate(String value) {
        return defaultDb.getDate(value);
    }
    public String getLongDate(String value) {
        return defaultDb.getLongDate(value);
    }
    public String getNumber(String value) {
        return defaultDb.getNumber(value);
    }
}

+ 18 - 0
src/main/java/com/yihu/quota/util/sql/MysqlDb.java

@ -0,0 +1,18 @@
package com.yihu.quota.util.sql;
public class MysqlDb implements Db {
    @Override
    public String getDate(String value) {
        return "str_to_date('" + value + "','%Y-%M-%D')";
    }
    @Override
    public String getLongDate(String value) {
        return "str_to_date('" + value + "','%Y-%m-%d %H:%i:%S')";
    }
    @Override
    public String getNumber(String value) {
        return "cast(" + value + " as signed integer)";
    }
}

+ 18 - 0
src/main/java/com/yihu/quota/util/sql/OracleDb.java

@ -0,0 +1,18 @@
package com.yihu.quota.util.sql;
public class OracleDb implements Db {
    @Override
    public String getDate(String value) {
        return "to_date('" + value + "','YYYY-MM-DD')";
    }
    @Override
    public String getLongDate(String value) {
        return "to_date('" + value + "','YYYY-MM-DD HH24:MI:SS')";
    }
    @Override
    public String getNumber(String value) {
        return "to_number(" + value + ")";
    }
}

+ 134 - 0
src/main/java/com/yihu/quota/vo/CubeMappingModel.java

@ -0,0 +1,134 @@
package com.yihu.quota.vo;
/**
 * Created by janseny on 2018/9/19.
 */
public class CubeMappingModel {
    private Integer id;
    private Integer cubeId;            //多维数据集ID
    private Integer dataFieldId;      //字段名
    private Integer dimensionId;      //维度ID
    private String dimensionCode;    //维度编码
    private String fieldName;        //字段名称
    private String dict;             //数据字典
    private String algorithm;       // 中间算法
    private String parm;             //中间算法参数
    private String dataType;        //数据类型
    private Integer childSaveType; //子集映射格式类型 1 对象 2 子集
    private String fieldCode;        //字段编码
    private String indexName;
    private String indexType;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getCubeId() {
        return cubeId;
    }
    public void setCubeId(Integer cubeId) {
        this.cubeId = cubeId;
    }
    public Integer getDataFieldId() {
        return dataFieldId;
    }
    public void setDataFieldId(Integer dataFieldId) {
        this.dataFieldId = dataFieldId;
    }
    public Integer getDimensionId() {
        return dimensionId;
    }
    public void setDimensionId(Integer dimensionId) {
        this.dimensionId = dimensionId;
    }
    public String getDimensionCode() {
        return dimensionCode;
    }
    public void setDimensionCode(String dimensionCode) {
        this.dimensionCode = dimensionCode;
    }
    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    public String getDataType() {
        return dataType;
    }
    public String getDict() {
        return dict;
    }
    public void setDict(String dict) {
        this.dict = dict;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public Integer getChildSaveType() {
        return childSaveType;
    }
    public void setChildSaveType(Integer childSaveType) {
        this.childSaveType = childSaveType;
    }
    public String getFieldCode() {
        return fieldCode;
    }
    public void setFieldCode(String fieldCode) {
        this.fieldCode = fieldCode;
    }
    public String getAlgorithm() {
        return algorithm;
    }
    public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
    }
    public String getParm() {
        return parm;
    }
    public void setParm(String parm) {
        this.parm = parm;
    }
    public String getIndexName() {
        return indexName;
    }
    public void setIndexName(String indexName) {
        this.indexName = indexName;
    }
    public String getIndexType() {
        return indexType;
    }
    public void setIndexType(String indexType) {
        this.indexType = indexType;
    }
}

+ 152 - 0
src/main/java/com/yihu/quota/vo/CubeMemberMappingModel.java

@ -0,0 +1,152 @@
package com.yihu.quota.vo;
/**
 * Created by janseny on 2018/9/19.
 */
public class CubeMemberMappingModel {
    private Integer id;
    private Integer cubeMappingId;    //多维数据集维度ID
    private Integer dataFieldId;      //字段名
    private Integer dimensionMemberId;//维度成员ID
    private String dimensionCode;    //维度编码
    private String fieldName;        //字段名称
    private String algorithm;       // 中间算法
    private String parm;            //中间算法参数
    private String dataType;        //数据类型
    private String dict;            //数据字典
    private String fieldCode;      //字段编码
    private String parentCode;      //父级属性code
    private Integer childSaveType;
    private String indexName;
    private String indexType;
    private Integer isPrimarykey;  //是否指定唯一字段 1是 0 否
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getCubeMappingId() {
        return cubeMappingId;
    }
    public void setCubeMappingId(Integer cubeMappingId) {
        this.cubeMappingId = cubeMappingId;
    }
    public Integer getDataFieldId() {
        return dataFieldId;
    }
    public void setDataFieldId(Integer dataFieldId) {
        this.dataFieldId = dataFieldId;
    }
    public Integer getDimensionMemberId() {
        return dimensionMemberId;
    }
    public void setDimensionMemberId(Integer dimensionMemberId) {
        this.dimensionMemberId = dimensionMemberId;
    }
    public String getDimensionCode() {
        return dimensionCode;
    }
    public void setDimensionCode(String dimensionCode) {
        this.dimensionCode = dimensionCode;
    }
    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    public String getDataType() {
        return dataType;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public String getDict() {
        return dict;
    }
    public void setDict(String dict) {
        this.dict = dict;
    }
    public String getFieldCode() {
        return fieldCode;
    }
    public void setFieldCode(String fieldCode) {
        this.fieldCode = fieldCode;
    }
    public String getAlgorithm() {
        return algorithm;
    }
    public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
    }
    public String getParm() {
        return parm;
    }
    public void setParm(String parm) {
        this.parm = parm;
    }
    public String getParentCode() {
        return parentCode;
    }
    public void setParentCode(String parentCode) {
        this.parentCode = parentCode;
    }
    public Integer getChildSaveType() {
        return childSaveType;
    }
    public void setChildSaveType(Integer childSaveType) {
        this.childSaveType = childSaveType;
    }
    public String getIndexName() {
        return indexName;
    }
    public void setIndexName(String indexName) {
        this.indexName = indexName;
    }
    public String getIndexType() {
        return indexType;
    }
    public void setIndexType(String indexType) {
        this.indexType = indexType;
    }
    public Integer getIsPrimarykey() {
        return isPrimarykey;
    }
    public void setIsPrimarykey(Integer isPrimarykey) {
        this.isPrimarykey = isPrimarykey;
    }
}