ExtractPercentHelper.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.yihu.quota.etl.extract;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.yihu.quota.etl.extract.es.EsExtract;
  4. import com.yihu.quota.etl.model.EsConfig;
  5. import com.yihu.quota.util.ElasticsearchUtil;
  6. import com.yihu.quota.model.TjQuota;
  7. import com.yihu.quota.model.dimension.TjQuotaDimensionMain;
  8. import com.yihu.quota.model.dimension.TjQuotaDimensionSlave;
  9. import com.yihu.quota.model.source.TjQuotaDataSource;
  10. import com.yihu.quota.service.dimension.TjDimensionMainService;
  11. import com.yihu.quota.service.dimension.TjDimensionSlaveService;
  12. import com.yihu.quota.service.quota.QuotaService;
  13. import com.yihu.quota.service.source.TjDataSourceService;
  14. import com.yihu.quota.vo.DictModel;
  15. import com.yihu.quota.vo.QuotaVo;
  16. import com.yihu.quota.vo.SaveModel;
  17. import net.sf.json.JSONObject;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.context.annotation.Scope;
  23. import org.springframework.stereotype.Component;
  24. import java.text.DecimalFormat;
  25. import java.util.*;
  26. /**
  27. * Created by janseny on 2017/08/22.
  28. */
  29. @Component
  30. @Scope("prototype")
  31. public class ExtractPercentHelper {
  32. @Autowired
  33. ElasticsearchUtil esClientUtil;
  34. @Autowired
  35. ObjectMapper objectMapper;
  36. @Autowired
  37. private TjDataSourceService dataSourceService;
  38. @Autowired
  39. private QuotaService quotaService;
  40. @Autowired
  41. private TjDimensionMainService dimensionMainService;
  42. @Autowired
  43. private TjDimensionSlaveService dimensionSlaveService;
  44. @Autowired
  45. private EsExtract esExtract;
  46. @Autowired
  47. private ElasticsearchUtil elasticsearchUtil;
  48. private Logger logger = LoggerFactory.getLogger(ExtractPercentHelper.class);
  49. /**
  50. * 公共的抽取数据
  51. *
  52. * @param quotaVo
  53. * @return
  54. * @throws Exception
  55. */
  56. public List<SaveModel> extractData(QuotaVo quotaVo, String startTime, String endTime, String timeLevel) throws Exception {
  57. String message = "";
  58. try {
  59. //得到该指标的数据来源
  60. TjQuotaDataSource quotaDataSource = dataSourceService.findSourceByQuotaCode(quotaVo.getCode());
  61. //如果为空说明数据错误
  62. if (quotaDataSource == null) {
  63. message = "数据源配置错误";
  64. throw new Exception(message);
  65. }
  66. JSONObject obj = JSONObject.fromObject(quotaDataSource.getConfigJson());
  67. EsConfig esConfig = (EsConfig) JSONObject.toBean(obj, EsConfig.class);
  68. if (StringUtils.isEmpty(esConfig.getThousandFlag())) {
  69. if (StringUtils.isNotEmpty(esConfig.getMolecular()) && StringUtils.isNotEmpty(esConfig.getDenominator())) {
  70. Map<String, DictModel> dimensionMap = getQuotaDimension(quotaDataSource.getQuotaCode());
  71. Map<String, DictModel> moleDimensionMap = getQuotaDimension(esConfig.getMolecular());
  72. Map<String, DictModel> denoDimensionMap = getQuotaDimension(esConfig.getDenominator());
  73. List<String> quotaDimension = new ArrayList<>();
  74. String moleDimension = "";
  75. String denoDimension = "";
  76. int num = 0;
  77. int count = 0;
  78. for (String key : dimensionMap.keySet()) {
  79. for (String molekey : moleDimensionMap.keySet()) {
  80. if (key.equals(molekey) && dimensionMap.get(key).getCode().equals(moleDimensionMap.get(molekey).getCode())) {
  81. moleDimension = moleDimension + moleDimensionMap.get(molekey).getName() + ";";
  82. num++;
  83. }
  84. }
  85. for (String denokey : denoDimensionMap.keySet()) {
  86. if (key.equals(denokey) && dimensionMap.get(key).getCode().equals(denoDimensionMap.get(denokey).getCode())) {
  87. denoDimension = denoDimension + denoDimensionMap.get(denokey).getName() + ";";
  88. count++;
  89. }
  90. }
  91. quotaDimension.add(dimensionMap.get(key).getName());
  92. }
  93. if (num != dimensionMap.size()) {
  94. message = "指标维度无法与分子指标维度匹配";
  95. throw new Exception(message);
  96. }
  97. if (count != dimensionMap.size()) {
  98. message = "指标维度无法与分母指标维度匹配";
  99. throw new Exception(message);
  100. }
  101. TjQuota moleTjQuota = quotaService.findByCode(esConfig.getMolecular());
  102. TjQuota denoTjQuota = quotaService.findByCode(esConfig.getDenominator());
  103. Map<String, String> param = new HashMap<>();
  104. param.put("startTime", startTime);
  105. param.put("endTime", endTime);
  106. Map<String, Map<String, Object>> moleResultMap = quotaService.getQuotaResult(moleTjQuota.getId(), objectMapper.writeValueAsString(param), moleDimension.substring(0, moleDimension.length() - 1));
  107. Map<String, Map<String, Object>> denoResultMap = quotaService.getQuotaResult(denoTjQuota.getId(), objectMapper.writeValueAsString(param), denoDimension.substring(0, denoDimension.length() - 1));
  108. List<SaveModel> resultModel = getPercentResult(moleResultMap, denoResultMap, quotaVo, esConfig);
  109. return resultModel;
  110. } else {
  111. message = "配置错误,分子或分母指标没有配置";
  112. throw new Exception(message);
  113. }
  114. } else {
  115. // 每千每万人口 计算
  116. if (StringUtils.isNotEmpty(esConfig.getThousandDmolecular()) && StringUtils.isNotEmpty(esConfig.getThousandDenominator())) {
  117. Map<String, DictModel> dimensionMap = getQuotaDimension(quotaDataSource.getQuotaCode());
  118. Map<String, DictModel> moleDimensionMap = getQuotaDimension(esConfig.getThousandDmolecular());
  119. String moleDimension = "";
  120. int num = 0;
  121. for (String key : dimensionMap.keySet()) {
  122. for (String molekey : moleDimensionMap.keySet()) {
  123. if (key.equals(molekey)) {
  124. moleDimension = moleDimension + moleDimensionMap.get(molekey).getName() + ";";
  125. num++;
  126. }
  127. }
  128. }
  129. if (num != dimensionMap.size()) {
  130. message = "指标维度无法与分子指标维度匹配";
  131. throw new Exception(message);
  132. }
  133. TjQuota moleTjQuota = quotaService.findByCode(esConfig.getThousandDmolecular());
  134. TjQuota denoTjQuota = quotaService.findByCode(esConfig.getThousandDenominator());
  135. Map<String, String> param = new HashMap<>();
  136. param.put("startTime", startTime);
  137. param.put("endTime", endTime);
  138. Map<String, Map<String, Object>> moleResultMap = quotaService.getQuotaResult(moleTjQuota.getId(), objectMapper.writeValueAsString(param), moleDimension.substring(0, moleDimension.length() - 1));
  139. int totalCount = 0;
  140. Calendar calendar = Calendar.getInstance();
  141. Map<String, Integer> doneResultMap = quotaService.searcherSumByGroupBySql(denoTjQuota, "year", "year=" + calendar.get(Calendar.YEAR), "result", "", "");
  142. if (doneResultMap != null && doneResultMap.size() > 0) {
  143. for (String key : doneResultMap.keySet()) {
  144. totalCount = totalCount + doneResultMap.get(key);
  145. }
  146. }
  147. List<SaveModel> resultModel = new ArrayList<>();
  148. if (moleResultMap != null && moleResultMap.size() > 0 && totalCount > 0) {
  149. resultModel = getThousandPercentResult(moleResultMap, totalCount, quotaVo, esConfig.getThousandFlag());
  150. }
  151. return resultModel;
  152. } else {
  153. message = "配置错误,分子或分母指标没有配置";
  154. throw new Exception(message);
  155. }
  156. }
  157. } catch (Exception e) {
  158. message = "数据抽取错误";
  159. throw new Exception(message);
  160. }
  161. }
  162. //获取指标维度
  163. public Map<String, DictModel> getQuotaDimension(String quotaCode) {
  164. // 指标 主维度
  165. List<TjQuotaDimensionMain> dimensionMains = dimensionMainService.findTjQuotaDimensionMainByQuotaCode(quotaCode);
  166. // 指标 细维度
  167. List<TjQuotaDimensionSlave> dimensionSlaves = dimensionSlaveService.findTjQuotaDimensionSlaveByQuotaCode(quotaCode);
  168. Map<String, DictModel> map = new HashMap<>();
  169. String mainKey = "";
  170. String mainVal = "";
  171. for (int i = 0; i < dimensionMains.size(); i++) {
  172. mainKey = dimensionMains.get(i).getMainCode();
  173. mainVal = dimensionMains.get(i).getMainCode() + " - " + dimensionMains.get(i).getDictSql();
  174. DictModel dictModel = new DictModel();
  175. dictModel.setName(mainKey);
  176. dictModel.setCode(mainVal);
  177. map.put(mainKey, dictModel);
  178. }
  179. String slaveKey = "";
  180. String slaveVal = "";
  181. String slaveName = "";
  182. for (int i = 0; i < dimensionSlaves.size(); i++) {
  183. slaveName = slaveName + "slaveKey" + (i + 1);
  184. slaveKey = dimensionSlaves.get(i).getSlaveCode();
  185. slaveVal = dimensionSlaves.get(i).getSlaveCode() + " - " + dimensionSlaves.get(i).getDictSql();
  186. DictModel dictModel = new DictModel();
  187. dictModel.setName(slaveName);
  188. dictModel.setCode(slaveVal);
  189. map.put(slaveKey, dictModel);
  190. }
  191. return map;
  192. }
  193. public List<SaveModel> getPercentResult(Map<String, Map<String, Object>> moleReultMap, Map<String, Map<String, Object>> denoReultMap, QuotaVo quotaVo, EsConfig esConfig) {
  194. List<SaveModel> saveModelList = new ArrayList<>();
  195. for (String dekey : denoReultMap.keySet()) {
  196. Map<String, Object> map = new HashMap<>();
  197. Map<String, Object> denoMap = denoReultMap.get(dekey);
  198. if (denoMap.get("result").toString().equals("0")) {
  199. map = denoMap;
  200. } else {
  201. for (String mokey : moleReultMap.keySet()) {
  202. Map<String, Object> moleMap = moleReultMap.get(mokey);
  203. if (dekey.equals(mokey)) {
  204. if (moleMap.get("result").toString().equals("0")) {
  205. map = moleMap;
  206. } else {
  207. int point = 0;
  208. float moleVal = Float.valueOf(moleMap.get("result").toString());
  209. float denoVal = Float.valueOf(denoMap.get("result").toString());
  210. int percentOperationValue = 100;
  211. if (StringUtils.isNotEmpty(esConfig.getPercentOperationValue())) {
  212. percentOperationValue = Integer.valueOf(esConfig.getPercentOperationValue());
  213. }
  214. if (esConfig.getPercentOperation().equals(1)) {
  215. point = (int) (moleVal / denoVal) * percentOperationValue;
  216. } else if (esConfig.getPercentOperation().equals(2)) {
  217. point = (int) (moleVal / denoVal) / percentOperationValue;
  218. }
  219. moleMap.remove("result");
  220. moleMap.put("result", point);
  221. map = moleMap;
  222. }
  223. break;
  224. }
  225. }
  226. }
  227. SaveModel saveModel = objectMapper.convertValue(map, SaveModel.class);
  228. saveModel.setQuotaName(quotaVo.getName());
  229. saveModel.setQuotaCode(quotaVo.getCode());
  230. saveModelList.add(saveModel);
  231. }
  232. return saveModelList;
  233. }
  234. public List<SaveModel> getThousandPercentResult(Map<String, Map<String, Object>> moleReultMap, int totalCount, QuotaVo quotaVo, String thousandFlag) {
  235. List<SaveModel> saveModelList = new ArrayList<>();
  236. Map<String, Object> map = new HashMap<>();
  237. for (String mokey : moleReultMap.keySet()) {
  238. Map<String, Object> moleMap = moleReultMap.get(mokey);
  239. if (moleMap.get("result").toString().equals("0")) {
  240. map = moleMap;
  241. moleMap.put("result", "0");
  242. } else {
  243. String point = "0";
  244. float moleVal = Float.valueOf(moleMap.get("result").toString());
  245. DecimalFormat df = new DecimalFormat("#.##");
  246. point = df.format((moleVal / totalCount) * Integer.valueOf(thousandFlag));
  247. moleMap.put("result", point);
  248. map = moleMap;
  249. }
  250. SaveModel saveModel = objectMapper.convertValue(map, SaveModel.class);
  251. saveModel.setQuotaName(quotaVo.getName());
  252. saveModel.setQuotaCode(quotaVo.getCode());
  253. saveModelList.add(saveModel);
  254. }
  255. return saveModelList;
  256. }
  257. }