ElasticsearchUtil.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. package com.yihu.wlyy.util;
  2. import com.alibaba.druid.sql.ast.SQLExpr;
  3. import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
  4. import com.alibaba.druid.sql.parser.SQLExprParser;
  5. import com.yihu.wlyy.config.es.ElasticFactory;
  6. import com.yihu.wlyy.web.quota.vo.SaveModel;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.elasticsearch.action.search.SearchResponse;
  9. import org.nlpcn.es4sql.domain.Select;
  10. import org.nlpcn.es4sql.jdbc.ObjectResult;
  11. import org.nlpcn.es4sql.jdbc.ObjectResultsExtractor;
  12. import org.nlpcn.es4sql.parse.ElasticSqlExprParser;
  13. import org.nlpcn.es4sql.parse.SqlParser;
  14. import org.nlpcn.es4sql.query.AggregationQueryAction;
  15. import org.nlpcn.es4sql.query.DefaultQueryAction;
  16. import org.nlpcn.es4sql.query.SqlElasticSearchRequestBuilder;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.data.redis.core.StringRedisTemplate;
  21. import org.springframework.stereotype.Component;
  22. import java.text.ParseException;
  23. import java.text.SimpleDateFormat;
  24. import java.util.ArrayList;
  25. import java.util.Date;
  26. import java.util.List;
  27. /**
  28. * Created by chenweida on 2017/7/17.
  29. * SELECT town,townName,sum(result1) result1 FROM wlyy_quota_test
  30. * where quotaCode='1'
  31. * group by town,townName , date_histogram(field='quotaDate','interval'='week')
  32. */
  33. @Component
  34. public class ElasticsearchUtil {
  35. private Logger logger = LoggerFactory.getLogger(ElasticsearchUtil.class);
  36. @Autowired
  37. private ElasticFactory elasticFactory;
  38. @Autowired
  39. private StringRedisTemplate redisTemplate;
  40. public List excute(String sql, Class clazz, String esType, String esIndex) {
  41. List saveModels = new ArrayList<>();
  42. try {
  43. SQLExprParser parser = new ElasticSqlExprParser(sql);
  44. SQLExpr expr = parser.expr();
  45. SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
  46. Select select = null;
  47. select = new SqlParser().parseSelect(queryExpr);
  48. //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
  49. AggregationQueryAction action = null;
  50. DefaultQueryAction queryAction = null;
  51. SqlElasticSearchRequestBuilder requestBuilder = null;
  52. if (select.isAgg) {
  53. //包含计算的的排序分组的
  54. action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
  55. requestBuilder = action.explain();
  56. } else {
  57. //封装成自己的Select对象
  58. queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
  59. requestBuilder = queryAction.explain();
  60. }
  61. SearchResponse response = (SearchResponse) requestBuilder.get();
  62. Object queryResult = null;
  63. if (sql.toUpperCase().indexOf("GROUP") != -1 || sql.toUpperCase().indexOf("SUM") != -1) {
  64. queryResult = response.getAggregations();
  65. } else {
  66. queryResult = response.getHits();
  67. }
  68. ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
  69. List<String> heads = temp.getHeaders();
  70. temp.getLines().forEach(one -> {
  71. Object saveModel = null;
  72. try {
  73. saveModel = clazz.newInstance();
  74. } catch (Exception e) {
  75. logger.error(e.getMessage());
  76. }
  77. for (int i = 0; i < one.size(); i++) {
  78. try {
  79. String key = null;
  80. Object value = one.get(i);
  81. if (heads.get(i).startsWith("_")) {
  82. continue;
  83. }
  84. key = "set" + UpFirstStr(heads.get(i));
  85. if (heads.get(i).contains("quotaDate") || heads.get(i).contains("createTime") || heads.get(i).contains("date_histogram")) {
  86. if (heads.get(i).contains("date_histogram")) {
  87. key = "setQuotaDate";
  88. }
  89. value = DateUtil.strToDate(String.valueOf(value).replace("T00:00:00+0800", " 00:00:00"), "yyyy-MM-dd HH:mm:ss");
  90. }
  91. if (value instanceof String) {
  92. clazz.getMethod(key, String.class).invoke(saveModel, value);
  93. } else if (value instanceof Integer) {
  94. clazz.getMethod(key, Integer.class).invoke(saveModel, value);
  95. } else if (value instanceof Double) {
  96. clazz.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue());
  97. } else if (value instanceof java.util.Date) {
  98. clazz.getMethod(key, java.util.Date.class).invoke(saveModel, value);
  99. }
  100. } catch (Exception e) {
  101. logger.warn(e.getMessage());
  102. }
  103. }
  104. saveModels.add(saveModel);
  105. });
  106. } catch (Exception e) {
  107. logger.error(e.getMessage());
  108. }
  109. return saveModels;
  110. }
  111. public Long excuteForLong(String sql, String esType, String esIndex) {
  112. try {
  113. SQLExprParser parser = new ElasticSqlExprParser(sql);
  114. SQLExpr expr = parser.expr();
  115. SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
  116. Select select = null;
  117. select = new SqlParser().parseSelect(queryExpr);
  118. //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
  119. AggregationQueryAction action = null;
  120. DefaultQueryAction queryAction = null;
  121. SqlElasticSearchRequestBuilder requestBuilder = null;
  122. if (select.isAgg) {
  123. //包含计算的的排序分组的
  124. action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
  125. requestBuilder = action.explain();
  126. } else {
  127. //封装成自己的Select对象
  128. queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
  129. requestBuilder = queryAction.explain();
  130. }
  131. SearchResponse response = (SearchResponse) requestBuilder.get();
  132. ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true);
  133. Long Longvalue = ((Double) temp.getLines().get(0).get(1)).longValue();
  134. return Longvalue;
  135. } catch (Exception e) {
  136. logger.error(e.getMessage());
  137. }
  138. return 0L;
  139. }
  140. /**
  141. * 首字母大写
  142. *
  143. * @param str
  144. * @return
  145. */
  146. private String UpFirstStr(String str) {
  147. return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
  148. }
  149. public Object excuteOneObject(String sql, Class clazz, String esType, String esIndex) {
  150. try {
  151. SQLExprParser parser = new ElasticSqlExprParser(sql);
  152. SQLExpr expr = parser.expr();
  153. SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
  154. Select select = null;
  155. select = new SqlParser().parseSelect(queryExpr);
  156. //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
  157. AggregationQueryAction action = null;
  158. DefaultQueryAction queryAction = null;
  159. SqlElasticSearchRequestBuilder requestBuilder = null;
  160. if (select.isAgg) {
  161. //包含计算的的排序分组的
  162. action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
  163. requestBuilder = action.explain();
  164. } else {
  165. //封装成自己的Select对象
  166. queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
  167. requestBuilder = queryAction.explain();
  168. }
  169. SearchResponse response = (SearchResponse) requestBuilder.get();
  170. ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getHits(), true);
  171. List<String> heads = temp.getHeaders();
  172. Object saveModel = clazz.newInstance();
  173. try {
  174. for (int i = 0; i < temp.getLines().get(0).size(); i++) {
  175. String key = null;
  176. Object value = temp.getLines().get(0).get(i);
  177. if (heads.get(i).contains("createTime")) {
  178. key = "setCreateTime";
  179. value = DateUtil.strToDate(String.valueOf(value).replace("+0800", "").replace("T", " "), "yyyy-MM-dd HH:mm:ss");
  180. } else {
  181. key = "set" + UpFirstStr(heads.get(i));
  182. }
  183. if (value instanceof String) {
  184. clazz.getMethod(key, String.class).invoke(saveModel, value);
  185. } else if (value instanceof Integer) {
  186. clazz.getMethod(key, Integer.class).invoke(saveModel, value);
  187. } else if (value instanceof Double) {
  188. clazz.getMethod(key, Integer.class).invoke(saveModel, ((Double) value).intValue());
  189. } else if (value instanceof java.util.Date) {
  190. clazz.getMethod(key, java.util.Date.class).invoke(saveModel, value);
  191. }
  192. }
  193. } catch (Exception e) {
  194. logger.warn(e.getMessage());
  195. }
  196. return saveModel;
  197. } catch (Exception e) {
  198. logger.error(e.getMessage());
  199. }
  200. return null;
  201. }
  202. /**
  203. * 0级指标查询列表
  204. * 获取所有指标的增量、到达量
  205. * 备注:原来接口的一级指标对应现在的
  206. *
  207. * @param startDate 开始时间
  208. * @param endDate 结束时间
  209. * @param area 区域code
  210. * @param level 等级
  211. * @param index 指标
  212. * @param timeLevel 1增量 2到达量
  213. * @param interval 1日 2周 3月
  214. * @param lowLevel 下一级区域等级
  215. * @return
  216. * @throws Exception
  217. */
  218. public List findDateQuotaLevel0(String startDate, String endDate, String area, int level, String index, String timeLevel, String interval, String lowLevel) throws Exception {
  219. //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  220. if (StringUtils.isNotEmpty(startDate)) {
  221. if(startDate.length()>10){
  222. startDate = changeTime(startDate);
  223. }else{
  224. startDate = changeDate(startDate);
  225. }
  226. }
  227. if (StringUtils.isNotEmpty(endDate)) {
  228. if(endDate.length()>10){
  229. endDate = changeTime(endDate);
  230. }else{
  231. endDate = changeDate(endDate);
  232. }
  233. }
  234. StringBuffer sql = new StringBuffer();
  235. StringBuffer groupBy = new StringBuffer();
  236. String low_level = level + "";
  237. if (StringUtils.isNotEmpty(lowLevel)) {
  238. low_level = lowLevel;
  239. }
  240. if (SaveModel.teamLevel.equals(low_level)) {
  241. sql.append("select team,teamName,sum(result1) result1, sum(result2) result2 from wlyy_quota_test where ");
  242. groupBy.append(" group by team,teamName");
  243. } else if (SaveModel.OrgLevel.equals(low_level)) {
  244. sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  245. groupBy.append(" group by hospital,hospitalName");
  246. } else if (SaveModel.townLevel.equals(low_level)) {
  247. sql.append("select town,townName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  248. groupBy.append(" group by town,townName");
  249. } else if (SaveModel.cityLevel.equals(low_level)) {
  250. sql.append("select city,cityName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  251. groupBy.append(" group by city,cityName");
  252. }
  253. if(StringUtils.isNotEmpty(area)){
  254. if (SaveModel.teamLevel.equals(level + "")) {
  255. sql.append(" team='" + area + "'");
  256. } else if (SaveModel.OrgLevel.equals(level + "")) {
  257. sql.append(" hospital='" + area + "'");
  258. } else if (SaveModel.townLevel.equals(level + "")) {
  259. sql.append(" town='" + area + "'");
  260. } else if (SaveModel.cityLevel.equals(level + "")) {
  261. sql.append(" city='" + area + "'");
  262. }
  263. sql.append(" and ");
  264. }
  265. sql.append(" quotaCode='" + index + "' ");
  266. sql.append(" and timeLevel='" + timeLevel + "' ");
  267. sql.append(" and areaLevel='5'");
  268. if (StringUtils.isNotEmpty(startDate)) {
  269. sql.append(" and quotaDate>='" + startDate + "'");
  270. }
  271. if (StringUtils.isNotEmpty(endDate)) {
  272. sql.append(" and quotaDate<='" + endDate + "'");
  273. }
  274. //根据时间维度分组
  275. if (StringUtils.isNotEmpty(interval)) {
  276. if (SaveModel.interval_month.equals(interval)) {
  277. groupBy.append(" ,date_histogram(field='quotaDate','interval'='month','time_zone'='+08:00') ");
  278. } else if (SaveModel.interval_week.equals(interval)) {
  279. groupBy.append(" ,date_histogram(field='quotaDate','interval'='week','time_zone'='+08:00') ");
  280. } else if (SaveModel.interval_day.equals(interval)) {
  281. groupBy.append(" ,date_histogram(field='quotaDate','interval'='1d','time_zone'='+08:00') ");
  282. }
  283. }
  284. sql.append(groupBy);
  285. return excute(sql.toString(), SaveModel.class, "", "");
  286. }
  287. /**
  288. * 一级指标查询列表
  289. * 获取一级指标的增量、到达量
  290. * 备注:原接口的二级指标对应现在的一级指标
  291. *
  292. * @param startDate 开始时间
  293. * @param endDate 结束时间
  294. * @param area 区域code
  295. * @param level 等级
  296. * @param index 指标
  297. * @param timeLevel 1增量 2到达量
  298. * @param slaveKey1 一级维度
  299. * @param interval 1日 2周 3月
  300. * @param lowLevel 下个等级
  301. * @return
  302. * @throws Exception
  303. */
  304. public List findDateQuotaLevel1(String startDate, String endDate, String area, int level, String index, String timeLevel, String slaveKey1, String interval, String lowLevel) throws Exception {
  305. //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  306. if (StringUtils.isNotEmpty(startDate)) {
  307. if(startDate.length()>10){
  308. startDate = changeTime(startDate);
  309. }else{
  310. startDate = changeDate(startDate);
  311. }
  312. }
  313. if (StringUtils.isNotEmpty(endDate)) {
  314. if(endDate.length()>10){
  315. endDate = changeTime(endDate);
  316. }else{
  317. endDate = changeDate(endDate);
  318. }
  319. }
  320. StringBuffer sql = new StringBuffer();
  321. StringBuffer groupBy = new StringBuffer();
  322. String low_level = level + "";
  323. if (StringUtils.isNotEmpty(lowLevel)) {
  324. low_level = lowLevel;
  325. }
  326. if (SaveModel.teamLevel.equals(low_level)) {
  327. sql.append("select team,teamName,slaveKey1,slaveKey1Name,sum(result1) result1, sum(result2) result2 from wlyy_quota_test where ");
  328. groupBy.append(" group by team,teamName,slaveKey1,slaveKey1Name");
  329. } else if (SaveModel.OrgLevel.equals(low_level)) {
  330. sql.append("select hospital,hospitalName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  331. groupBy.append(" group by hospital,hospitalName,slaveKey1,slaveKey1Name");
  332. } else if (SaveModel.townLevel.equals(low_level)) {
  333. sql.append("select town,townName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  334. groupBy.append(" group by town,townName,slaveKey1,slaveKey1Name");
  335. } else if (SaveModel.cityLevel.equals(low_level)) {
  336. sql.append("select city,cityName,slaveKey1,slaveKey1Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  337. groupBy.append(" group by city,cityName,slaveKey1,slaveKey1Name");
  338. }
  339. if(StringUtils.isNotEmpty(area)){
  340. if (SaveModel.teamLevel.equals(level + "")) {
  341. sql.append(" team='" + area + "'");
  342. } else if (SaveModel.OrgLevel.equals(level + "")) {
  343. sql.append(" hospital='" + area + "'");
  344. } else if (SaveModel.townLevel.equals(level + "")) {
  345. sql.append(" town='" + area + "'");
  346. } else if (SaveModel.cityLevel.equals(level + "")) {
  347. sql.append(" city='" + area + "'");
  348. }
  349. sql.append(" and ");
  350. }
  351. sql.append(" quotaCode='" + index + "' ");
  352. sql.append(" and timeLevel='" + timeLevel + "' ");
  353. sql.append(" and areaLevel='5'");
  354. if (StringUtils.isNotEmpty(startDate)) {
  355. sql.append(" and quotaDate>='" + startDate + "'");
  356. }
  357. if (StringUtils.isNotEmpty(endDate)) {
  358. sql.append(" and quotaDate<='" + endDate + "'");
  359. }
  360. if (StringUtils.isNotEmpty(slaveKey1)) {
  361. sql.append(" and slaveKey1='" + slaveKey1 + "' ");
  362. }
  363. //根据时间维度分组
  364. if (StringUtils.isNotEmpty(interval)) {
  365. if (SaveModel.interval_month.equals(interval)) {
  366. groupBy.append(" ,date_histogram(field='quotaDate','interval'='month','time_zone'='+08:00') ");
  367. } else if (SaveModel.interval_week.equals(interval)) {
  368. groupBy.append(" ,date_histogram(field='quotaDate','interval'='week','time_zone'='+08:00') ");
  369. } else if (SaveModel.interval_day.equals(interval)) {
  370. groupBy.append(" ,date_histogram(field='quotaDate','interval'='1d','time_zone'='+08:00') ");
  371. }
  372. }
  373. sql.append(groupBy);
  374. return excute(sql.toString(), SaveModel.class, "", "");
  375. }
  376. /**
  377. * 二级指标查询列表
  378. * 获取二级指标的增量、到达量
  379. * 备注:原接口的三级指标对应现在的二级指标
  380. *
  381. * @param startDate 开始时间
  382. * @param endDate 结束时间
  383. * @param area 区域code
  384. * @param level 等级
  385. * @param index 指标
  386. * @param timeLevel 1增量 2到达量
  387. * @param slaveKey1 一级维度code
  388. * @param slaveKey2 二级维度code
  389. * @param interval 1日 2周 3月
  390. * @param lowLevel 下一等级
  391. * @return
  392. */
  393. public List findDateQuotaLevel2(String startDate, String endDate, String area, int level, String index, String timeLevel, String slaveKey1, String slaveKey2, String interval, String lowLevel) {
  394. //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  395. if (StringUtils.isNotEmpty(startDate)) {
  396. if(startDate.length()>10){
  397. startDate = changeTime(startDate);
  398. }else{
  399. startDate = changeDate(startDate);
  400. }
  401. }
  402. if (StringUtils.isNotEmpty(endDate)) {
  403. if(endDate.length()>10){
  404. endDate = changeTime(endDate);
  405. }else{
  406. endDate = changeDate(endDate);
  407. }
  408. }
  409. StringBuffer sql = new StringBuffer();
  410. StringBuffer groupBy = new StringBuffer();
  411. String low_level = level + "";
  412. if (StringUtils.isNotEmpty(lowLevel)) {
  413. low_level = lowLevel;
  414. }
  415. if (SaveModel.teamLevel.equals(low_level)) {
  416. sql.append("select team,teamName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,result1,result2 from wlyy_quota_test where ");
  417. groupBy.append(" group by team,teamName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  418. } else if (SaveModel.OrgLevel.equals(low_level)) {
  419. sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  420. groupBy.append(" group by hospital,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,hospitalName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  421. } else if (SaveModel.townLevel.equals(low_level)) {
  422. sql.append("select town,townName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  423. groupBy.append(" group by town,townName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  424. } else if (SaveModel.cityLevel.equals(low_level)) {
  425. sql.append("select city,cityName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from wlyy_quota_test where ");
  426. groupBy.append(" group by city,cityName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  427. }
  428. if(StringUtils.isNotEmpty(area)){
  429. if (SaveModel.teamLevel.equals(level + "")) {
  430. sql.append(" team='" + area + "'");
  431. } else if (SaveModel.OrgLevel.equals(level + "")) {
  432. sql.append(" hospital='" + area + "'");
  433. } else if (SaveModel.townLevel.equals(level + "")) {
  434. sql.append(" town='" + area + "'");
  435. } else if (SaveModel.cityLevel.equals(level + "")) {
  436. sql.append(" city='" + area + "'");
  437. }
  438. sql.append(" and ");
  439. }
  440. sql.append(" quotaCode='" + index + "' ");
  441. sql.append(" and timeLevel='" + timeLevel + "' ");
  442. sql.append(" and areaLevel='5'");
  443. if (StringUtils.isNotEmpty(startDate)) {
  444. sql.append(" and quotaDate>='" + startDate + "'");
  445. }
  446. if (StringUtils.isNotEmpty(endDate)) {
  447. sql.append(" and quotaDate<='" + endDate + "'");
  448. }
  449. if (StringUtils.isNotBlank(slaveKey1)) {
  450. sql.append(" and slaveKey1='" + slaveKey1 + "'");
  451. }
  452. if (StringUtils.isNotBlank(slaveKey2)) {
  453. sql.append(" and slaveKey2='" + slaveKey2 + "'");
  454. }
  455. //根据时间维度分组
  456. if (StringUtils.isNotEmpty(interval)) {
  457. if (SaveModel.interval_month.equals(interval)) {
  458. groupBy.append(" ,date_histogram(field='quotaDate','interval'='month','time_zone'='+08:00') ");
  459. } else if (SaveModel.interval_week.equals(interval)) {
  460. groupBy.append(" ,date_histogram(field='quotaDate','interval'='week','time_zone'='+08:00') ");
  461. } else if (SaveModel.interval_day.equals(interval)) {
  462. groupBy.append(" ,date_histogram(field='quotaDate','interval'='1d','time_zone'='+08:00') ");
  463. }
  464. }
  465. sql.append(groupBy);
  466. return excute(sql.toString(), SaveModel.class, "", "");
  467. }
  468. /**
  469. * 时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  470. *
  471. * @param quotaDate
  472. */
  473. private String changeDate(String quotaDate){
  474. try {
  475. quotaDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").format(new SimpleDateFormat("yyyy-MM-dd").parse(quotaDate));
  476. } catch (ParseException e) {
  477. e.printStackTrace();
  478. }
  479. return quotaDate;
  480. }
  481. public String changeTime(String time){
  482. try {
  483. time = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time));
  484. } catch (ParseException e) {
  485. e.printStackTrace();
  486. }
  487. return time;
  488. }
  489. //获取最新更新的时间
  490. public String getQuotaTime() {
  491. String date = redisTemplate.opsForValue().get("quota:date");
  492. // date = date.replace(" ","T")+"+0800";
  493. return date;
  494. }
  495. /**
  496. * 0级维度
  497. * 查询某一天某一个0级维度的指标
  498. *
  499. * @param quotaDate 时间 yyyy-mm-dd
  500. * @param area code 厦门市 350200
  501. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  502. * @param index 指标code
  503. * @param timelevel // 1日 2年
  504. * @return
  505. */
  506. public SaveModel findOneDateQuotaLevel0(String quotaDate, String area, int level, String index, String timelevel) throws Exception {
  507. List list = findDateQuotaLevel0(quotaDate, quotaDate, area, level, index, timelevel, null, null);
  508. return (SaveModel) list.get(0);
  509. }
  510. /**
  511. * 0级维度
  512. * 查询某个时间区间某一个0级维度的指标
  513. *
  514. * @param startDate 开始时间 yyyy-mm-dd
  515. * @param endDate 结束时间 yyyy-mm-dd
  516. * @param area code 厦门市 350200
  517. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  518. * @param index 指标code
  519. * @param timelevel // 1日 2年
  520. * @return
  521. */
  522. public SaveModel findOneDateQuotaLevel0(String startDate, String endDate, String area, int level, String index, String timelevel) throws Exception {
  523. List list = findDateQuotaLevel0(startDate, endDate, area, level, index, timelevel, null, null);
  524. return (SaveModel) list.get(0);
  525. }
  526. /**
  527. * 1级维度
  528. * 查询某一天某一个1级维度的某个1级维度下的指标 例如查询65岁以上患者
  529. *
  530. * @param quotaDate 时间 yyyy-mm-dd
  531. * @param area code 厦门市 350200
  532. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  533. * @param index 指标code
  534. * @param timelevel // 1日 2年
  535. * @param slaveKey1 一级维度的key 不传返回全部
  536. * @return
  537. */
  538. public SaveModel findOneDateQuotaLevel1(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  539. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1, null, null);
  540. return (SaveModel) list.get(0);
  541. }
  542. /**
  543. * 1级维度
  544. * 查询某个时间区间某一个1级维度的某个1级维度下的指标 例如查询65岁以上患者
  545. *
  546. * @param startDate 开始时间 yyyy-mm-dd
  547. * @param endDate 结束时间 yyyy-mm-dd
  548. * @param area code 厦门市 350200
  549. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  550. * @param index 指标code
  551. * @param timelevel // 1日 2年
  552. * @param slaveKey1 一级维度的key 不传返回全部
  553. * @return
  554. */
  555. public SaveModel findOneDateQuotaLevel1(String startDate, String endDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  556. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,slaveKey1, null, null);
  557. return (SaveModel) list.get(0);
  558. }
  559. /**
  560. * 1级维度
  561. * 查询某一天某一个所有1级维度下的指标 例如某个机构下的所有维度的患者列表
  562. *
  563. * @param quotaDate 时间 yyyy-mm-dd
  564. * @param area code 厦门市 350200
  565. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  566. * @param index 指标code
  567. * @param timelevel // 1日 2年
  568. * @return
  569. */
  570. public List<SaveModel> findOneDateQuotaLevel1(String quotaDate, String area, int level, String index, String timelevel) throws Exception {
  571. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,null, null, null);
  572. return list;
  573. }
  574. /**
  575. * 2级维度
  576. * 查询某一天某一个2级维度的某个1级维度和2级维度下的指标 例如查询65岁以上的高血压患者
  577. *
  578. * @param quotaDate 时间 yyyy-mm-dd
  579. * @param area code 厦门市 350200
  580. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  581. * @param index 指标code
  582. * @param timelevel // 1日 2年
  583. * @param slaveKey1 一级维度的key
  584. * @param slaveKey2 二级维度的key
  585. * @return
  586. */
  587. public SaveModel findOneDateQuotaLevel2(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1, String slaveKey2) throws Exception {
  588. List list = findDateQuotaLevel2(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, null);
  589. return (SaveModel) list.get(0);
  590. }
  591. /**
  592. * 2级维度
  593. * 查询某个时间区间某一个2级维度的某个1级维度和2级维度下的指标 例如查询65岁以上的高血压患者
  594. *
  595. * @param startDate 开始时间 yyyy-mm-dd
  596. * @param endDate 结束时间 yyyy-mm-dd
  597. * @param area code 厦门市 350200
  598. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  599. * @param index 指标code
  600. * @param timelevel // 1日 2年
  601. * @param slaveKey1 一级维度的key
  602. * @param slaveKey2 二级维度的key
  603. * @return
  604. */
  605. public SaveModel findOneDateQuotaLevel2(String startDate, String endDate, String area, int level, String index, String timelevel, String slaveKey1, String slaveKey2) throws Exception {
  606. List list = findDateQuotaLevel2(startDate, endDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, null);
  607. return (SaveModel) list.get(0);
  608. }
  609. /**
  610. * 2级维度
  611. * 查询某一天某个1级维度下所有2级维度的指标 例如查询65岁以上的高血压患者
  612. *
  613. * @param quotaDate 时间 yyyy-mm-dd
  614. * @param area code 厦门市 350200
  615. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  616. * @param index 指标code
  617. * @param timelevel // 1日 2年
  618. * @param slaveKey1 一级维度的key
  619. * @return
  620. */
  621. public List<SaveModel> findOneDateQuotaLevel2(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  622. List list = findDateQuotaLevel2(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1,null, null, null);
  623. return list;
  624. }
  625. /**
  626. * 折线图
  627. * 0级维度
  628. * 查询某个0级维度的指标折线图
  629. *
  630. * @param startDate 开始时间 yyyy-mm-dd 包含头
  631. * @param endDate 结束时间 yyyy-mm-dd 包含头
  632. * @param area code 厦门市 350200 code 和level是对应的
  633. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  634. * @param index 指标code
  635. * @param timelevel 1增量 2到达量(按照年度)
  636. * @param interval 1日 2周 3月 (按照日周月聚合)
  637. * @return
  638. * @throws Exception
  639. */
  640. public List<SaveModel> findLineChartDateQuotaLevel0(String startDate,String endDate, String area, int level, String index, String timelevel,String interval) throws Exception {
  641. List list = findDateQuotaLevel0(startDate, endDate, area, level, index, timelevel, interval, null);
  642. return list;
  643. }
  644. /**
  645. * 折线图
  646. * 1级维度
  647. * 查询某个1级维度的某个1级维度下的折线图 例如查询65岁以上患者
  648. *
  649. * @param startDate 开始时间 yyyy-mm-dd 包含头
  650. * @param endDate 结束时间 yyyy-mm-dd 包含头
  651. * @param area code 厦门市 350200 code 和level是对应的
  652. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  653. * @param index 指标code
  654. * @param timelevel 1增量 2到达量(按照年度)
  655. * @param interval 1日 2周 3月 (按照日周月聚合)
  656. * @param slaveKey1 一级维度的key
  657. * @return
  658. */
  659. public List<SaveModel> findLineChartDateQuotaLevel1(String startDate,String endDate, String area, int level, String index, String timelevel,String interval, String slaveKey1) throws Exception {
  660. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,slaveKey1, interval, null);
  661. return list;
  662. }
  663. /**
  664. * 折线图
  665. * 2级维度
  666. * 查询某个2级维度的某个1级维度和2级维度下的折线图 例如查询65岁以上的高血压患者
  667. *
  668. * @param startDate 开始时间 yyyy-mm-dd 包含头
  669. * @param endDate 结束时间 yyyy-mm-dd 包含头
  670. * @param area code 厦门市 350200 code 和level是对应的
  671. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  672. * @param index 指标code
  673. * @param timelevel 1增量 2到达量(按照年度)
  674. * @param interval 1日 2周 3月 (按照日周月聚合)
  675. * @param slaveKey1 一级维度的key
  676. * @param slaveKey2 二级维度的key
  677. * @return
  678. */
  679. public List<SaveModel> findLineChartDateQuotaLevel2(String startDate,String endDate, String area, int level, String index, String timelevel,String interval, String slaveKey1, String slaveKey2) throws Exception {
  680. List list = findDateQuotaLevel2(startDate, endDate, area, level, index, timelevel,slaveKey1,slaveKey2, interval, null);
  681. return list;
  682. }
  683. /**
  684. * 列表
  685. * 0级维度
  686. * 查询某一天某个0级维度的指标列表
  687. *
  688. * @param quotaDate 时间 yyyy-mm-dd 包含头
  689. * @param area code 厦门市 350200 code 和level是对应的
  690. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  691. * @param index 指标code
  692. * @param timelevel 1增量 2到达量(按照年度)
  693. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  694. * @return
  695. * @throws Exception
  696. */
  697. public List<SaveModel> findListDateQuotaLevel0(String quotaDate, String area, int level, String index, String timelevel, String lowLevel) throws Exception {
  698. List list = findDateQuotaLevel0(quotaDate, quotaDate, area, level, index, timelevel, null, lowLevel); return list;
  699. }
  700. /**
  701. * 列表
  702. * 0级维度
  703. * 查询某个区间某个0级维度的指标列表
  704. *
  705. * @param startDate 开始时间 yyyy-mm-dd 包含头
  706. * @param endDate 结束时间 yyyy-mm-dd 包含头
  707. * @param area code 厦门市 350200 code 和level是对应的
  708. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  709. * @param index 指标code
  710. * @param timelevel 1增量 2到达量(按照年度)
  711. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队.
  712. * @return
  713. * @throws Exception
  714. */
  715. public List<SaveModel> findListDateQuotaLevel0(String startDate,String endDate, String area, int level, String index, String timelevel, String lowLevel) throws Exception {
  716. List list = findDateQuotaLevel0(startDate, endDate, area, level, index, timelevel, null, lowLevel); return list;
  717. }
  718. /**
  719. * 列表
  720. * 1级维度
  721. * 查询某个1级维度的某个1级维度下的列表 例如查询65岁以上患者
  722. *
  723. * @param quotaDate 时间 yyyy-mm-dd 包含头
  724. * @param area code 厦门市 350200 code 和level是对应的
  725. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  726. * @param index 指标code
  727. * @param timelevel 1增量 2到达量(按照年度)
  728. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  729. * @param slaveKey1 一级维度的key
  730. * @return
  731. */
  732. public List<SaveModel> findListDateQuotaLevel1(String quotaDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1) throws Exception {
  733. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1, null, lowLevel);
  734. return list;
  735. }
  736. /**
  737. * 列表
  738. * 1级维度
  739. * 查询某个区间某个1级维度的某个1级维度下的列表 例如查询65岁以上患者
  740. *
  741. * @param startDate 开始时间 yyyy-mm-dd 包含头
  742. * @param endDate 结束时间 yyyy-mm-dd 包含头
  743. * @param area code 厦门市 350200 code 和level是对应的
  744. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  745. * @param index 指标code
  746. * @param timelevel 1增量 2到达量(按照年度)
  747. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  748. * @param slaveKey1 一级维度的key
  749. * @return
  750. */
  751. public List<SaveModel> findListDateQuotaLevel1(String startDate,String endDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1) throws Exception {
  752. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,slaveKey1, null, lowLevel);
  753. return list;
  754. }
  755. /**
  756. * 列表
  757. * 2级维度
  758. * 查询某个2级维度的某个1级维度和2级维度下的列表 例如查询65岁以上的高血压患者
  759. *
  760. * @param quotaDate 时间 yyyy-mm-dd 包含头
  761. * @param area code 厦门市 350200 code 和level是对应的
  762. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  763. * @param index 指标code
  764. * @param timelevel 1增量 2到达量(按照年度)
  765. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  766. * @param slaveKey1 一级维度的key
  767. * @param slaveKey2 二级维度的key
  768. * @return
  769. */
  770. public List<SaveModel> findListDateQuotaLevel2(String quotaDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1, String slaveKey2) throws Exception {
  771. List list = findDateQuotaLevel2(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, lowLevel);
  772. return list;
  773. }
  774. /**
  775. * 列表
  776. * 2级维度
  777. * 查询某个区间某个2级维度的某个1级维度和2级维度下的列表 例如查询65岁以上的高血压患者
  778. *
  779. * @param startDate 开始时间 yyyy-mm-dd 包含头
  780. * @param endDate 结束时间 yyyy-mm-dd 包含头
  781. * @param area code 厦门市 350200 code 和level是对应的
  782. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  783. * @param index 指标code
  784. * @param timelevel 1增量 2到达量(按照年度)
  785. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  786. * @param slaveKey1 一级维度的key
  787. * @param slaveKey2 二级维度的key
  788. * @return
  789. */
  790. public List<SaveModel> findListDateQuotaLevel2(String startDate,String endDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1, String slaveKey2) throws Exception {
  791. List list = findDateQuotaLevel2(startDate, endDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, lowLevel);
  792. return list;
  793. }
  794. /**
  795. * 将参数转换成需要的SaveModel里的标识
  796. * @param level 等级 4 市 3区 2社区 1团队
  797. * @return
  798. * @author zhangdan
  799. * @time 2017-10-18
  800. */
  801. public int changeLevel(int level){
  802. int resultLevel =0;
  803. if (level==1){
  804. //团队转成SaveModel里的标识
  805. resultLevel = Integer.valueOf(SaveModel.teamLevel);
  806. }else if(level==2){
  807. //社区转成SaveModel里的标识
  808. resultLevel = Integer.valueOf(SaveModel.OrgLevel);
  809. }else if (level ==3){
  810. //区转成SaveModel里的标识
  811. resultLevel = Integer.valueOf(SaveModel.townLevel);
  812. }else if (level==4){
  813. //市转成SaveModel里的标识
  814. resultLevel = Integer.valueOf(SaveModel.cityLevel);
  815. }
  816. if(resultLevel==0){
  817. resultLevel = level;
  818. }
  819. return resultLevel;
  820. }
  821. }