ElasticsearchUtil.java 39 KB

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