ElasticsearchUtil.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  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 slaveKeyValue 一级维度
  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,int keyNum, String slaveKeyValue, String interval, String lowLevel) throws Exception {
  310. String slaveKey = "";
  311. String slaveKeyName = "";
  312. if(keyNum==1){
  313. slaveKey = "slaveKey1";
  314. slaveKeyName = "slaveKey1Name";
  315. }else if(keyNum==2){
  316. slaveKey = "slaveKey2";
  317. slaveKeyName = "slaveKey2Name";
  318. }
  319. //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  320. if (StringUtils.isNotEmpty(startDate)) {
  321. if(startDate.length()>10){
  322. startDate = changeTime(startDate);
  323. }else{
  324. startDate = changeDate(startDate);
  325. }
  326. }
  327. if (StringUtils.isNotEmpty(endDate)) {
  328. if(endDate.length()>10){
  329. endDate = changeTime(endDate);
  330. }else{
  331. endDate = changeDate(endDate);
  332. }
  333. }
  334. StringBuffer sql = new StringBuffer();
  335. StringBuffer groupBy = new StringBuffer();
  336. String low_level = level + "";
  337. if (StringUtils.isNotEmpty(lowLevel)) {
  338. low_level = lowLevel;
  339. }
  340. if (SaveModel.teamLevel.equals(low_level)) {
  341. sql.append("select team,teamName,"+slaveKey+","+slaveKeyName+",sum(result1) result1, sum(result2) result2 from "+esIndex+" where ");
  342. groupBy.append(" group by team,teamName,"+slaveKey+","+slaveKeyName);
  343. } else if (SaveModel.OrgLevel.equals(low_level)) {
  344. sql.append("select hospital,hospitalName,"+slaveKey+","+slaveKeyName+",sum(result1) result1,sum(result2) result2 from "+esIndex+" where ");
  345. groupBy.append(" group by hospital,hospitalName,"+slaveKey+","+slaveKeyName);
  346. } else if (SaveModel.townLevel.equals(low_level)) {
  347. sql.append("select town,townName,"+slaveKey+",slaveKey1Name,sum(result1) result1,sum(result2) result2 from "+esIndex+" where ");
  348. groupBy.append(" group by town,townName,"+slaveKey+","+slaveKeyName);
  349. } else if (SaveModel.cityLevel.equals(low_level)) {
  350. sql.append("select city,cityName,"+slaveKey+","+slaveKeyName+",sum(result1) result1,sum(result2) result2 from "+esIndex+" where ");
  351. groupBy.append(" group by city,cityName,"+slaveKey+","+slaveKeyName);
  352. }
  353. if(StringUtils.isNotEmpty(area)){
  354. if (SaveModel.teamLevel.equals(level + "")) {
  355. sql.append(" team='" + area + "'");
  356. } else if (SaveModel.OrgLevel.equals(level + "")) {
  357. sql.append(" hospital='" + area + "'");
  358. } else if (SaveModel.townLevel.equals(level + "")) {
  359. sql.append(" town='" + area + "'");
  360. } else if (SaveModel.cityLevel.equals(level + "")) {
  361. sql.append(" city='" + area + "'");
  362. }
  363. sql.append(" and ");
  364. }
  365. sql.append(" quotaCode='" + index + "' ");
  366. sql.append(" and timeLevel='" + timeLevel + "' ");
  367. sql.append(" and areaLevel='5'");
  368. if (StringUtils.isNotEmpty(startDate)) {
  369. sql.append(" and quotaDate>='" + startDate + "'");
  370. }
  371. if (StringUtils.isNotEmpty(endDate)) {
  372. sql.append(" and quotaDate<='" + endDate + "'");
  373. }
  374. if (StringUtils.isNotEmpty(slaveKeyValue)) {
  375. sql.append(" and "+slaveKey+"='" + slaveKeyValue + "' ");
  376. }
  377. //根据时间维度分组
  378. if (StringUtils.isNotEmpty(interval)) {
  379. if (SaveModel.interval_month.equals(interval)) {
  380. groupBy.append(" ,date_histogram(field='quotaDate','interval'='month','time_zone'='+08:00') ");
  381. } else if (SaveModel.interval_week.equals(interval)) {
  382. groupBy.append(" ,date_histogram(field='quotaDate','interval'='week','time_zone'='+08:00') ");
  383. } else if (SaveModel.interval_day.equals(interval)) {
  384. groupBy.append(" ,date_histogram(field='quotaDate','interval'='1d','time_zone'='+08:00') ");
  385. }
  386. }
  387. sql.append(groupBy);
  388. return excute(sql.toString(), SaveModel.class, "", "");
  389. }
  390. /**
  391. * 二级指标查询列表
  392. * 获取二级指标的增量、到达量
  393. * 备注:原接口的三级指标对应现在的二级指标
  394. *
  395. * @param startDate 开始时间
  396. * @param endDate 结束时间
  397. * @param area 区域code
  398. * @param level 等级
  399. * @param index 指标
  400. * @param timeLevel 1增量 2到达量
  401. * @param slaveKey1 一级维度code
  402. * @param slaveKey2 二级维度code
  403. * @param interval 1日 2周 3月
  404. * @param lowLevel 下一等级
  405. * @return
  406. */
  407. public List findDateQuotaLevel2(String startDate, String endDate, String area, int level, String index, String timeLevel, String slaveKey1, String slaveKey2, String interval, String lowLevel) {
  408. //时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  409. if (StringUtils.isNotEmpty(startDate)) {
  410. if(startDate.length()>10){
  411. startDate = changeTime(startDate);
  412. }else{
  413. startDate = changeDate(startDate);
  414. }
  415. }
  416. if (StringUtils.isNotEmpty(endDate)) {
  417. if(endDate.length()>10){
  418. endDate = changeTime(endDate);
  419. }else{
  420. endDate = changeDate(endDate);
  421. }
  422. }
  423. StringBuffer sql = new StringBuffer();
  424. StringBuffer groupBy = new StringBuffer();
  425. String low_level = level + "";
  426. if (StringUtils.isNotEmpty(lowLevel)) {
  427. low_level = lowLevel;
  428. }
  429. if (SaveModel.teamLevel.equals(low_level)) {
  430. sql.append("select team,teamName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,result1,result2 from "+esIndex+" where ");
  431. groupBy.append(" group by team,teamName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  432. } else if (SaveModel.OrgLevel.equals(low_level)) {
  433. sql.append("select hospital,hospitalName,sum(result1) result1,sum(result2) result2 from "+esIndex+" where ");
  434. groupBy.append(" group by hospital,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,hospitalName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  435. } else if (SaveModel.townLevel.equals(low_level)) {
  436. sql.append("select town,townName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from "+esIndex+" where ");
  437. groupBy.append(" group by town,townName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  438. } else if (SaveModel.cityLevel.equals(low_level)) {
  439. sql.append("select city,cityName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name,sum(result1) result1,sum(result2) result2 from "+esIndex+" where ");
  440. groupBy.append(" group by city,cityName,slaveKey1,slaveKey1Name,slaveKey2,slaveKey2Name");
  441. }
  442. if(StringUtils.isNotEmpty(area)){
  443. if (SaveModel.teamLevel.equals(level + "")) {
  444. sql.append(" team='" + area + "'");
  445. } else if (SaveModel.OrgLevel.equals(level + "")) {
  446. sql.append(" hospital='" + area + "'");
  447. } else if (SaveModel.townLevel.equals(level + "")) {
  448. sql.append(" town='" + area + "'");
  449. } else if (SaveModel.cityLevel.equals(level + "")) {
  450. sql.append(" city='" + area + "'");
  451. }
  452. sql.append(" and ");
  453. }
  454. sql.append(" quotaCode='" + index + "' ");
  455. sql.append(" and timeLevel='" + timeLevel + "' ");
  456. sql.append(" and areaLevel='5'");
  457. if (StringUtils.isNotEmpty(startDate)) {
  458. sql.append(" and quotaDate>='" + startDate + "'");
  459. }
  460. if (StringUtils.isNotEmpty(endDate)) {
  461. sql.append(" and quotaDate<='" + endDate + "'");
  462. }
  463. if (StringUtils.isNotBlank(slaveKey1)) {
  464. sql.append(" and slaveKey1='" + slaveKey1 + "'");
  465. }
  466. if (StringUtils.isNotBlank(slaveKey2)) {
  467. sql.append(" and slaveKey2='" + slaveKey2 + "'");
  468. }
  469. //根据时间维度分组
  470. if (StringUtils.isNotEmpty(interval)) {
  471. if (SaveModel.interval_month.equals(interval)) {
  472. groupBy.append(" ,date_histogram(field='quotaDate','interval'='month','time_zone'='+08:00') ");
  473. } else if (SaveModel.interval_week.equals(interval)) {
  474. groupBy.append(" ,date_histogram(field='quotaDate','interval'='week','time_zone'='+08:00') ");
  475. } else if (SaveModel.interval_day.equals(interval)) {
  476. groupBy.append(" ,date_histogram(field='quotaDate','interval'='1d','time_zone'='+08:00') ");
  477. }
  478. }
  479. sql.append(groupBy);
  480. return excute(sql.toString(), SaveModel.class, "", "");
  481. }
  482. /**
  483. * 时间格式转换 yyyy-MM-dd转成 2017-07-17T00:00:00+0800
  484. *
  485. * @param quotaDate
  486. */
  487. private String changeDate(String quotaDate){
  488. try {
  489. quotaDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").format(new SimpleDateFormat("yyyy-MM-dd").parse(quotaDate));
  490. } catch (ParseException e) {
  491. e.printStackTrace();
  492. }
  493. return quotaDate;
  494. }
  495. public String changeTime(String time){
  496. try {
  497. if(time.length()==10){
  498. time = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").format(new SimpleDateFormat("yyyy-MM-dd").parse(time));
  499. }else if(time.length()==19){
  500. time = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX").format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time));
  501. }
  502. } catch (ParseException e) {
  503. e.printStackTrace();
  504. }
  505. return time;
  506. }
  507. //获取最新更新的时间
  508. public String getQuotaTime() {
  509. String date = redisTemplate.opsForValue().get("quota:date");
  510. // date = date.replace(" ","T")+"+0800";
  511. try {
  512. date = new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date));
  513. }catch (ParseException e) {
  514. e.printStackTrace();
  515. }
  516. return date;
  517. }
  518. /**
  519. * 0级维度
  520. * 查询某一天某一个0级维度的指标
  521. *
  522. * @param quotaDate 时间 yyyy-mm-dd
  523. * @param area code 厦门市 350200
  524. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  525. * @param index 指标code
  526. * @param timelevel // 1日 2年
  527. * @return
  528. */
  529. public SaveModel findOneDateQuotaLevel0(String quotaDate, String area, int level, String index, String timelevel) throws Exception {
  530. List list = findDateQuotaLevel0(quotaDate, quotaDate, area, level, index, timelevel, null, null);
  531. return (SaveModel) list.get(0);
  532. }
  533. /**
  534. * 0级维度
  535. * 查询某个时间区间某一个0级维度的指标
  536. *
  537. * @param startDate 开始时间 yyyy-mm-dd
  538. * @param endDate 结束时间 yyyy-mm-dd
  539. * @param area code 厦门市 350200
  540. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  541. * @param index 指标code
  542. * @param timelevel // 1日 2年
  543. * @return
  544. */
  545. public SaveModel findOneDateQuotaLevel0(String startDate, String endDate, String area, int level, String index, String timelevel) throws Exception {
  546. List list = findDateQuotaLevel0(startDate, endDate, area, level, index, timelevel, null, null);
  547. return (SaveModel) list.get(0);
  548. }
  549. /**
  550. * 1级维度
  551. * 查询某一天某一个1级维度的某个1级维度下的指标 例如查询65岁以上患者
  552. *
  553. * @param quotaDate 时间 yyyy-mm-dd
  554. * @param area code 厦门市 350200
  555. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  556. * @param index 指标code
  557. * @param timelevel // 1日 2年
  558. * @param slaveKey1 一级维度的key 不传返回全部
  559. * @return
  560. */
  561. public SaveModel findOneDateQuotaLevel1(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  562. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,1,slaveKey1, null, null);
  563. return (SaveModel) list.get(0);
  564. }
  565. public SaveModel findOneDateQuotaLevel1Key2(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  566. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,2,slaveKey1, null, null);
  567. return (SaveModel) list.get(0);
  568. }
  569. /**
  570. * 1级维度
  571. * 查询某个时间区间某一个1级维度的某个1级维度下的指标 例如查询65岁以上患者
  572. *
  573. * @param startDate 开始时间 yyyy-mm-dd
  574. * @param endDate 结束时间 yyyy-mm-dd
  575. * @param area code 厦门市 350200
  576. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  577. * @param index 指标code
  578. * @param timelevel // 1日 2年
  579. * @param slaveKey1 一级维度的key 不传返回全部
  580. * @return
  581. */
  582. public SaveModel findOneDateQuotaLevel1(String startDate, String endDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  583. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,1,slaveKey1, null, null);
  584. return (SaveModel) list.get(0);
  585. }
  586. public SaveModel findOneDateQuotaLevel1Key2(String startDate, String endDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  587. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,2,slaveKey1, null, null);
  588. return (SaveModel) list.get(0);
  589. }
  590. /**
  591. * 1级维度
  592. * 查询某一天某一个所有1级维度下的指标 例如某个机构下的所有维度的患者列表
  593. *
  594. * @param quotaDate 时间 yyyy-mm-dd
  595. * @param area code 厦门市 350200
  596. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  597. * @param index 指标code
  598. * @param timelevel // 1日 2年
  599. * @return
  600. */
  601. public List<SaveModel> findOneDateQuotaLevel1(String quotaDate, String area, int level, String index, String timelevel) throws Exception {
  602. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,1,null, null, null);
  603. return list;
  604. }
  605. public List<SaveModel> findOneDateQuotaLevel1key2(String quotaDate, String area, int level, String index, String timelevel) throws Exception {
  606. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,2,null, null, null);
  607. return list;
  608. }
  609. /**
  610. * 1级维度
  611. * 查询某一天某一个所有1级维度下的指标 例如某个机构下的所有维度的患者列表
  612. *
  613. * @param area code 厦门市 350200
  614. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  615. * @param index 指标code
  616. * @param timelevel // 1日 2年
  617. * @return
  618. */
  619. public List<SaveModel> findOneDateQuotaLevel1(String startDate,String endDate, String area, int level, String index, String timelevel) throws Exception {
  620. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,1,null, null, null);
  621. return list;
  622. }
  623. public List<SaveModel> findOneDateQuotaLevel1Key2(String startDate,String endDate, String area, int level, String index, String timelevel) throws Exception {
  624. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,2,null, null, null);
  625. return list;
  626. }
  627. /**
  628. * 2级维度
  629. * 查询某一天某一个2级维度的某个1级维度和2级维度下的指标 例如查询65岁以上的高血压患者
  630. *
  631. * @param quotaDate 时间 yyyy-mm-dd
  632. * @param area code 厦门市 350200
  633. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  634. * @param index 指标code
  635. * @param timelevel // 1日 2年
  636. * @param slaveKey1 一级维度的key
  637. * @param slaveKey2 二级维度的key
  638. * @return
  639. */
  640. public SaveModel findOneDateQuotaLevel2(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1, String slaveKey2) throws Exception {
  641. List list = findDateQuotaLevel2(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, null);
  642. return (SaveModel) list.get(0);
  643. }
  644. /**
  645. * 2级维度
  646. * 查询某个时间区间某一个2级维度的某个1级维度和2级维度下的指标 例如查询65岁以上的高血压患者
  647. *
  648. * @param startDate 开始时间 yyyy-mm-dd
  649. * @param endDate 结束时间 yyyy-mm-dd
  650. * @param area code 厦门市 350200
  651. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  652. * @param index 指标code
  653. * @param timelevel // 1日 2年
  654. * @param slaveKey1 一级维度的key
  655. * @param slaveKey2 二级维度的key
  656. * @return
  657. */
  658. public SaveModel findOneDateQuotaLevel2(String startDate, String endDate, String area, int level, String index, String timelevel, String slaveKey1, String slaveKey2) throws Exception {
  659. List list = findDateQuotaLevel2(startDate, endDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, null);
  660. return (SaveModel) list.get(0);
  661. }
  662. /**
  663. * 2级维度
  664. * 查询某一天某个1级维度下所有2级维度的指标 例如查询65岁以上的高血压患者
  665. *
  666. * @param quotaDate 时间 yyyy-mm-dd
  667. * @param area code 厦门市 350200
  668. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  669. * @param index 指标code
  670. * @param timelevel // 1日 2年
  671. * @param slaveKey1 一级维度的key
  672. * @return
  673. */
  674. public List<SaveModel> findOneDateQuotaLevel2(String quotaDate, String area, int level, String index, String timelevel, String slaveKey1) throws Exception {
  675. List list = findDateQuotaLevel2(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1,null, null, null);
  676. return list;
  677. }
  678. /**
  679. * 折线图
  680. * 0级维度
  681. * 查询某个0级维度的指标折线图
  682. *
  683. * @param startDate 开始时间 yyyy-mm-dd 包含头
  684. * @param endDate 结束时间 yyyy-mm-dd 包含头
  685. * @param area code 厦门市 350200 code 和level是对应的
  686. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  687. * @param index 指标code
  688. * @param timelevel 1增量 2到达量(按照年度)
  689. * @param interval 1日 2周 3月 (按照日周月聚合)
  690. * @return
  691. * @throws Exception
  692. */
  693. public List<SaveModel> findLineChartDateQuotaLevel0(String startDate,String endDate, String area, int level, String index, String timelevel,String interval) throws Exception {
  694. List list = findDateQuotaLevel0(startDate, endDate, area, level, index, timelevel, interval, null);
  695. return list;
  696. }
  697. /**
  698. * 折线图
  699. * 1级维度
  700. * 查询某个1级维度的某个1级维度下的折线图 例如查询65岁以上患者
  701. *
  702. * @param startDate 开始时间 yyyy-mm-dd 包含头
  703. * @param endDate 结束时间 yyyy-mm-dd 包含头
  704. * @param area code 厦门市 350200 code 和level是对应的
  705. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  706. * @param index 指标code
  707. * @param timelevel 1增量 2到达量(按照年度)
  708. * @param interval 1日 2周 3月 (按照日周月聚合)
  709. * @param slaveKey1 一级维度的key
  710. * @return
  711. */
  712. public List<SaveModel> findLineChartDateQuotaLevel1(String startDate,String endDate, String area, int level, String index, String timelevel,String interval, String slaveKey1) throws Exception {
  713. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,1,slaveKey1, interval, null);
  714. return list;
  715. }
  716. public List<SaveModel> findLineChartDateQuotaLevel1Key2(String startDate,String endDate, String area, int level, String index, String timelevel,String interval, String slaveKey2) throws Exception {
  717. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,2,slaveKey2, interval, null);
  718. return list;
  719. }
  720. /**
  721. * 折线图
  722. * 2级维度
  723. * 查询某个2级维度的某个1级维度和2级维度下的折线图 例如查询65岁以上的高血压患者
  724. *
  725. * @param startDate 开始时间 yyyy-mm-dd 包含头
  726. * @param endDate 结束时间 yyyy-mm-dd 包含头
  727. * @param area code 厦门市 350200 code 和level是对应的
  728. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  729. * @param index 指标code
  730. * @param timelevel 1增量 2到达量(按照年度)
  731. * @param interval 1日 2周 3月 (按照日周月聚合)
  732. * @param slaveKey1 一级维度的key
  733. * @param slaveKey2 二级维度的key
  734. * @return
  735. */
  736. public List<SaveModel> findLineChartDateQuotaLevel2(String startDate,String endDate, String area, int level, String index, String timelevel,String interval, String slaveKey1, String slaveKey2) throws Exception {
  737. List list = findDateQuotaLevel2(startDate, endDate, area, level, index, timelevel,slaveKey1,slaveKey2, interval, null);
  738. return list;
  739. }
  740. /**
  741. * 列表
  742. * 0级维度
  743. * 查询某一天某个0级维度的指标列表
  744. *
  745. * @param quotaDate 时间 yyyy-mm-dd 包含头
  746. * @param area code 厦门市 350200 code 和level是对应的
  747. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  748. * @param index 指标code
  749. * @param timelevel 1增量 2到达量(按照年度)
  750. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  751. * @return
  752. * @throws Exception
  753. */
  754. public List<SaveModel> findListDateQuotaLevel0(String quotaDate, String area, int level, String index, String timelevel, String lowLevel) throws Exception {
  755. List list = findDateQuotaLevel0(quotaDate, quotaDate, area, level, index, timelevel, null, lowLevel); return list;
  756. }
  757. /**
  758. * 列表
  759. * 0级维度
  760. * 查询某个区间某个0级维度的指标列表
  761. *
  762. * @param startDate 开始时间 yyyy-mm-dd 包含头
  763. * @param endDate 结束时间 yyyy-mm-dd 包含头
  764. * @param area code 厦门市 350200 code 和level是对应的
  765. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  766. * @param index 指标code
  767. * @param timelevel 1增量 2到达量(按照年度)
  768. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队.
  769. * @return
  770. * @throws Exception
  771. */
  772. public List<SaveModel> findListDateQuotaLevel0(String startDate,String endDate, String area, int level, String index, String timelevel, String lowLevel) throws Exception {
  773. List list = findDateQuotaLevel0(startDate, endDate, area, level, index, timelevel, null, lowLevel); return list;
  774. }
  775. /**
  776. * 列表
  777. * 1级维度
  778. * 查询某个1级维度的某个1级维度下的列表 例如查询65岁以上患者
  779. *
  780. * @param quotaDate 时间 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. * @return
  788. */
  789. public List<SaveModel> findListDateQuotaLevel1(String quotaDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1) throws Exception {
  790. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,1,slaveKey1, null, lowLevel);
  791. return list;
  792. }
  793. public List<SaveModel> findListDateQuotaLevel1Key2(String quotaDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey2) throws Exception {
  794. List list = findDateQuotaLevel1(quotaDate, quotaDate, area, level, index, timelevel,2,slaveKey2, null, lowLevel);
  795. return list;
  796. }
  797. /**
  798. * 列表
  799. * 1级维度
  800. * 查询某个区间某个1级维度的某个1级维度下的列表 例如查询65岁以上患者
  801. *
  802. * @param startDate 开始时间 yyyy-mm-dd 包含头
  803. * @param endDate 结束时间 yyyy-mm-dd 包含头
  804. * @param area code 厦门市 350200 code 和level是对应的
  805. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  806. * @param index 指标code
  807. * @param timelevel 1增量 2到达量(按照年度)
  808. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  809. * @param slaveKey1 一级维度的key
  810. * @return
  811. */
  812. public List<SaveModel> findListDateQuotaLevel1(String startDate,String endDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1) throws Exception {
  813. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,1,slaveKey1, null, lowLevel);
  814. return list;
  815. }
  816. public List<SaveModel> findListDateQuotaLevel1Key2(String startDate,String endDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey2) throws Exception {
  817. List list = findDateQuotaLevel1(startDate, endDate, area, level, index, timelevel,2,slaveKey2, null, lowLevel);
  818. return list;
  819. }
  820. /**
  821. * 列表
  822. * 2级维度
  823. * 查询某个2级维度的某个1级维度和2级维度下的列表 例如查询65岁以上的高血压患者
  824. *
  825. * @param quotaDate 时间 yyyy-mm-dd 包含头
  826. * @param area code 厦门市 350200 code 和level是对应的
  827. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  828. * @param index 指标code
  829. * @param timelevel 1增量 2到达量(按照年度)
  830. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  831. * @param slaveKey1 一级维度的key
  832. * @param slaveKey2 二级维度的key
  833. * @return
  834. */
  835. public List<SaveModel> findListDateQuotaLevel2(String quotaDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1, String slaveKey2) throws Exception {
  836. List list = findDateQuotaLevel2(quotaDate, quotaDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, lowLevel);
  837. return list;
  838. }
  839. /**
  840. * 列表
  841. * 2级维度
  842. * 查询某个区间某个2级维度的某个1级维度和2级维度下的列表 例如查询65岁以上的高血压患者
  843. *
  844. * @param startDate 开始时间 yyyy-mm-dd 包含头
  845. * @param endDate 结束时间 yyyy-mm-dd 包含头
  846. * @param area code 厦门市 350200 code 和level是对应的
  847. * @param level 等级 1 省 2 市 3 区县 4 机构 5团队
  848. * @param index 指标code
  849. * @param timelevel 1增量 2到达量(按照年度)
  850. * @param lowLevel 下一级区域等级 1 省 2 市 3 区县 4 机构 5团队
  851. * @param slaveKey1 一级维度的key
  852. * @param slaveKey2 二级维度的key
  853. * @return
  854. */
  855. public List<SaveModel> findListDateQuotaLevel2(String startDate,String endDate, String area, int level, String index, String timelevel,String lowLevel, String slaveKey1, String slaveKey2) throws Exception {
  856. List list = findDateQuotaLevel2(startDate, endDate, area, level, index, timelevel,slaveKey1,slaveKey2, null, lowLevel);
  857. return list;
  858. }
  859. /**
  860. * 将参数转换成需要的SaveModel里的标识
  861. * @param level 等级 4 市 3区 2社区 1团队
  862. * 转换后的level 等级 2 市 3区 4社区 5团队
  863. * @return
  864. * @author zhangdan
  865. * @time 2017-10-18
  866. */
  867. public int changeLevel(int level){
  868. int resultLevel =0;
  869. if (level==1){
  870. //团队转成SaveModel里的标识
  871. resultLevel = Integer.valueOf(SaveModel.teamLevel);
  872. }else if(level==2){
  873. //社区转成SaveModel里的标识
  874. resultLevel = Integer.valueOf(SaveModel.OrgLevel);
  875. }else if (level ==3){
  876. //区转成SaveModel里的标识
  877. resultLevel = Integer.valueOf(SaveModel.townLevel);
  878. }else if (level==4){
  879. //市转成SaveModel里的标识
  880. resultLevel = Integer.valueOf(SaveModel.cityLevel);
  881. }
  882. if(resultLevel==0){
  883. resultLevel = level;
  884. }
  885. return resultLevel;
  886. }
  887. }