DataQualityHomeService.java 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. package com.yihu.ehr.analyze.service.dataQuality;
  2. import com.yihu.ehr.analyze.dao.DqPaltformReceiveWarningDao;
  3. import com.yihu.ehr.analyze.service.pack.PackQcReportService;
  4. import com.yihu.ehr.elasticsearch.ElasticSearchPool;
  5. import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
  6. import com.yihu.ehr.entity.quality.DqPaltformReceiveWarning;
  7. import com.yihu.ehr.profile.qualilty.DqDataType;
  8. import com.yihu.ehr.query.BaseJpaService;
  9. import com.yihu.ehr.redis.client.RedisClient;
  10. import com.yihu.ehr.util.datetime.DateUtil;
  11. import com.yihu.ehr.util.rest.Envelop;
  12. import org.apache.commons.lang.StringUtils;
  13. import org.elasticsearch.action.search.SearchRequestBuilder;
  14. import org.elasticsearch.action.search.SearchResponse;
  15. import org.elasticsearch.action.search.SearchType;
  16. import org.elasticsearch.client.transport.TransportClient;
  17. import org.elasticsearch.index.query.BoolQueryBuilder;
  18. import org.elasticsearch.index.query.QueryBuilders;
  19. import org.elasticsearch.index.query.RangeQueryBuilder;
  20. import org.elasticsearch.search.aggregations.AggregationBuilder;
  21. import org.elasticsearch.search.aggregations.AggregationBuilders;
  22. import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
  23. import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
  24. import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
  25. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  26. import org.elasticsearch.search.aggregations.metrics.cardinality.CardinalityBuilder;
  27. import org.elasticsearch.search.aggregations.metrics.cardinality.InternalCardinality;
  28. import org.elasticsearch.search.aggregations.metrics.sum.InternalSum;
  29. import org.elasticsearch.search.aggregations.metrics.sum.SumBuilder;
  30. import org.elasticsearch.search.sort.SortOrder;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.beans.factory.annotation.Value;
  35. import org.springframework.context.ApplicationContext;
  36. import org.springframework.data.domain.Page;
  37. import org.springframework.stereotype.Service;
  38. import javax.annotation.PostConstruct;
  39. import java.io.IOException;
  40. import java.sql.ResultSet;
  41. import java.text.DecimalFormat;
  42. import java.util.*;
  43. /**
  44. * 质控管理- 首页逻辑类
  45. * @author HZY
  46. * @created 2018/8/17 11:24
  47. */
  48. @Service
  49. public class DataQualityHomeService extends BaseJpaService {
  50. private final static Logger logger = LoggerFactory.getLogger(DataQualityHomeService.class);
  51. @Autowired
  52. private ElasticSearchUtil elasticSearchUtil;
  53. @Autowired
  54. private DqPaltformReceiveWarningDao dqPaltformReceiveWarningDao;
  55. @Autowired
  56. private PackQcReportService packQcReportService;
  57. @Value("${quality.orgCode}")
  58. private String defaultOrgCode;
  59. @Value("${quality.cloud}")
  60. private String cloud;
  61. @Value("${quality.cloudName}")
  62. private String cloudName;
  63. @Autowired
  64. private RedisClient redisClient;
  65. @Autowired
  66. private ApplicationContext context;
  67. @Autowired
  68. private ElasticSearchPool elasticSearchPool;
  69. private Map<DqDataType, DataQualityBaseService> dqBaseServiceMap;
  70. @PostConstruct
  71. private void init() {
  72. dqBaseServiceMap = new HashMap<>();
  73. dqBaseServiceMap.put(DqDataType.complete, context.getBean(DataCompleteService.class));
  74. dqBaseServiceMap.put(DqDataType.imTime, context.getBean(DataInTimeService.class));
  75. dqBaseServiceMap.put(DqDataType.correct, context.getBean(DataCorrectService.class));
  76. }
  77. public DataQualityBaseService getInstance(DqDataType type){
  78. DataQualityBaseService dataQualityBaseService;
  79. switch (type) {
  80. case complete:
  81. dataQualityBaseService = dqBaseServiceMap.get(DqDataType.complete);
  82. break;
  83. case imTime:
  84. dataQualityBaseService = dqBaseServiceMap.get(DqDataType.imTime);
  85. break;
  86. case correct:
  87. dataQualityBaseService = dqBaseServiceMap.get(DqDataType.correct);
  88. break;
  89. default:
  90. throw new RuntimeException("Failed to identify dataQualityBaseService type");
  91. }
  92. return dataQualityBaseService;
  93. }
  94. /**
  95. * 平台就诊人数 去重复(完整人数) 档案完整性
  96. * @param dateField 时间区间查询字段
  97. * @param start
  98. * @param end
  99. * @param orgCode
  100. * @return
  101. */
  102. public void getPatientCount(String dateField,String start, String end, String orgCode, Map<String, Object> map) throws Exception {
  103. try {
  104. long starttime = System.currentTimeMillis();
  105. String sql0 = "";
  106. String sql1 = "";
  107. String sql2 = "";
  108. String sql3 = "";
  109. if (StringUtils.isNotEmpty(orgCode)) {
  110. sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
  111. " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  112. sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
  113. " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  114. sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
  115. "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  116. sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
  117. "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  118. } else {
  119. sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND " + dateField +
  120. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  121. sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND " + dateField +
  122. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  123. sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND " + dateField +
  124. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  125. sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND " + dateField +
  126. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  127. }
  128. ResultSet resultSet0 = elasticSearchUtil.findBySql(sql0);
  129. ResultSet resultSet1 = elasticSearchUtil.findBySql(sql1);
  130. ResultSet resultSet2 = elasticSearchUtil.findBySql(sql2);
  131. ResultSet resultSet3 = elasticSearchUtil.findBySql(sql3);
  132. resultSet0.next();
  133. resultSet1.next();
  134. resultSet2.next();
  135. resultSet3.next();
  136. map.put("peIntegrity", new Double(resultSet0.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//体检
  137. map.put("hospitalIntegrity", new Double(resultSet1.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//住院
  138. map.put("outpatientIntegrity", new Double(resultSet2.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//门诊
  139. map.put("visitIntegrity", new Double(resultSet3.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//就诊
  140. logger.info("平台就诊人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
  141. } catch (Exception e) {
  142. if (!"Error".equals(e.getMessage())) {
  143. e.printStackTrace();
  144. }
  145. }
  146. }
  147. /**
  148. * 百分比计算
  149. *
  150. * @param molecular 分子
  151. * @param denominator 分母
  152. * @return
  153. */
  154. public String calRate(double molecular, double denominator) {
  155. if (molecular == 0) {
  156. return "0.00%";
  157. } else if (denominator == 0) {
  158. return "--";
  159. }
  160. DecimalFormat decimalFormat = new DecimalFormat("0.00%");
  161. return decimalFormat.format(molecular / denominator);
  162. }
  163. /**
  164. * 质控情况 - 总计 (及时率,完整率,准确率)
  165. *
  166. * @param start 就诊时间- 起始
  167. * @param end 就诊时间- 截止
  168. * 【目前取的是平台全部机构,若做多区域平台的话,需要添加区域参数】
  169. */
  170. public Map<String, Object> getQuailyDetail(String start, String end) throws Exception {
  171. Map<String, Object> totalMap = new HashMap<>();
  172. List<Map<String, Object>> archiveMapList = new ArrayList<>();
  173. String dateStr = DateUtil.toString(new Date());
  174. if (StringUtils.isBlank(start)) {
  175. start = dateStr;
  176. }
  177. if (StringUtils.isBlank(end)) {
  178. end = dateStr;
  179. }
  180. int totalHospitalNum = 0;//医院总就诊数
  181. double hospitalOutpatientNum = 0;//总门诊数
  182. double hospitalExamNum = 0;//总体检数
  183. double hospitalInpatientNum = 0;//总住院数
  184. double totalInTime = 0;//总及时数
  185. double totalVisitNum = 0;//总完整数(平台总就诊数)
  186. double totalCorrect = 0;//总准确数
  187. //1. 获取医院档案量;
  188. Envelop envelop = packQcReportService.dailyReport("event_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
  189. Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
  190. //医院总数据量
  191. totalHospitalNum = (int) hospitalDataMap.get("total");
  192. hospitalOutpatientNum = (int) hospitalDataMap.get("oupatient");
  193. hospitalInpatientNum = (int) hospitalDataMap.get("inpatient");
  194. hospitalExamNum = (int) hospitalDataMap.get("physical");
  195. Map<String, Object> dataMap = new HashMap<>();
  196. //2. 平台就诊完整数
  197. getPatientCount("event_date",start, end, null, dataMap);
  198. totalVisitNum = Double.valueOf(dataMap.get("visitIntegrity").toString());//就诊完整数
  199. //3. 及时数
  200. totalInTime = getInTimeNum("event_date" ,start, end);
  201. // 3. 去重准确数【】
  202. totalCorrect = getErrorDataSetData("event_date",start, end, null);
  203. //4. 数据集总量
  204. double dataSetsMun = getDataSetsMap(start, end, null);
  205. totalMap.put("orgCode", cloud);//机构code
  206. totalMap.put("orgName", cloudName);//机构名称
  207. totalMap.put("totalInTime", totalInTime);//及时数
  208. totalMap.put("totalComplete", totalVisitNum);//总就诊完整数
  209. totalMap.put("totalCorrect", totalCorrect);//准确数
  210. totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
  211. totalMap.put("totalDataSet", dataSetsMun);//数据集总行数
  212. //计算及时率及完整率,准确性
  213. totalMap.put("inTimeRate", calRate(totalInTime, totalHospitalNum));//及时率
  214. totalMap.put("completeRate", calRate(totalVisitNum, totalHospitalNum));//完整率
  215. totalMap.put("correctRate", calRate(totalCorrect, dataSetsMun));//数据集准确率
  216. Map<String, Object> outPatientMap = genVisitMap("outPatient", hospitalOutpatientNum, totalHospitalNum);
  217. Map<String, Object> inPatientMap = genVisitMap("inPatient", hospitalInpatientNum, totalHospitalNum);
  218. Map<String, Object> examPatientMap = genVisitMap("exam", hospitalExamNum, totalHospitalNum);
  219. archiveMapList.add(outPatientMap);
  220. archiveMapList.add(inPatientMap);
  221. archiveMapList.add(examPatientMap);
  222. //档案包采集情况
  223. totalMap.put("rate", archiveMapList);
  224. return totalMap;
  225. }
  226. /**
  227. * 质控分析 - 完整性统计
  228. *
  229. * @param start 就诊时间- 起始
  230. * @param end 就诊时间- 截止
  231. * 【目前取的是平台全部机构,若做多区域平台的话,需要添加区域参数】
  232. */
  233. public Map<String, Object> getCompleteStatistics(String start, String end) throws Exception {
  234. Map<String, Object> totalMap = new HashMap<>();
  235. String dateStr = DateUtil.toString(new Date());
  236. if (StringUtils.isBlank(start)) {
  237. start = dateStr;
  238. }
  239. if (StringUtils.isBlank(end)) {
  240. end = dateStr;
  241. }
  242. int totalHospitalNum = 0;//医院总就诊数
  243. double totalVisitNum = 0;//总完整数(平台总就诊数)
  244. //1. 获取医院档案量;
  245. Envelop envelop = packQcReportService.dailyReport("event_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
  246. Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
  247. //医院总数据量
  248. totalHospitalNum = (int) hospitalDataMap.get("total");
  249. Map<String, Object> dataMap = new HashMap<>();
  250. //2. 平台就诊完整数
  251. getPatientCount("event_date",start, end, null, dataMap);
  252. totalVisitNum = Double.valueOf(dataMap.get("visitIntegrity").toString());
  253. totalMap.put("totalComplete", totalVisitNum);//总就诊完整数
  254. totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
  255. //计算完整率,
  256. totalMap.put("completeRate", calRate(totalVisitNum, totalHospitalNum));//完整率
  257. return totalMap;
  258. }
  259. /**
  260. * 质控分析 - 准确率统计
  261. *
  262. * @param start 就诊时间- 起始
  263. * @param end 就诊时间- 截止
  264. */
  265. public Map<String, Object> getCorrectStatistics(String start, String end) throws Exception {
  266. long startlong = System.currentTimeMillis();
  267. Map<String, Object> totalMap = new HashMap<>();
  268. String dateStr = DateUtil.toString(new Date());
  269. if (StringUtils.isBlank(start)) {
  270. start = dateStr;
  271. }
  272. if (StringUtils.isBlank(end)) {
  273. end = dateStr;
  274. }
  275. double totalCorrect = 0;//总准确数
  276. long starttime1 = System.currentTimeMillis();
  277. //1. 去重准确数
  278. totalCorrect = getErrorDataSetData("event_date",start, end, null);
  279. long endTime1 = System.currentTimeMillis();
  280. logger.info("去重准确数耗时:"+ (endTime1-starttime1));
  281. //2. 数据集总量
  282. double dataSetsMun = getDataSetsMap(start, end, null);
  283. long endTime2= System.currentTimeMillis();
  284. logger.info("总准确数据集数耗时:"+ (endTime2-endTime1));
  285. totalMap.put("totalCorrect", totalCorrect);//准确数
  286. totalMap.put("totalDataSet", dataSetsMun);//数据集总行数
  287. //3 计算准确性
  288. totalMap.put("correctRate", calRate(totalCorrect, dataSetsMun));//数据集准确率
  289. long endlong = System.currentTimeMillis();
  290. logger.info("总耗时:"+ (endlong-startlong));
  291. return totalMap;
  292. }
  293. /**
  294. * 质控分析 - 及时率统计
  295. *
  296. * @param start 就诊时间- 起始
  297. * @param end 就诊时间- 截止
  298. */
  299. public Map<String, Object> getInTimeStatistics(String start, String end) throws Exception {
  300. Map<String, Object> totalMap = new HashMap<>();
  301. String dateStr = DateUtil.toString(new Date());
  302. if (StringUtils.isBlank(start)) {
  303. start = dateStr;
  304. }
  305. if (StringUtils.isBlank(end)) {
  306. end = dateStr;
  307. }
  308. int totalHospitalNum = 0;//医院总就诊数
  309. double totalInTime = 0;//总及时数
  310. //1. 获取医院档案量;
  311. Envelop envelop = packQcReportService.dailyReport("event_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
  312. Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
  313. //医院总数据量
  314. totalHospitalNum = (int) hospitalDataMap.get("total");
  315. Map<String, Object> dataMap = new HashMap<>();
  316. //2. 及时数
  317. totalInTime = getInTimeNum("event_date" ,start, end);
  318. totalMap.put("totalInTime", totalInTime);//及时数
  319. totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
  320. //3 计算及时率
  321. totalMap.put("inTimeRate", calRate(totalInTime, totalHospitalNum));//及时率
  322. return totalMap;
  323. }
  324. /**
  325. * 获取质控错误 - 数据集总条数
  326. * @param dateField 时间区间查询字段
  327. * @param start
  328. * @param end
  329. * @param orgCode
  330. * @return
  331. */
  332. public double getErrorDataSetData(String dateField,String start, String end, String orgCode) {
  333. long starttime1 = System.currentTimeMillis();
  334. List< Map<String, Object>> resultList = new ArrayList<>();
  335. double num1 = 0;
  336. try {
  337. String dateStr = DateUtil.toString(new Date());
  338. if (StringUtils.isBlank(start)) {
  339. start = dateStr;
  340. }
  341. if (StringUtils.isBlank(end)) {
  342. end = dateStr;
  343. }
  344. // 原生es
  345. TransportClient transportClient = elasticSearchPool.getClient();
  346. StringBuilder stringBuilder = new StringBuilder();
  347. stringBuilder.append("event_date>=" + start + " 00:00:00;");
  348. stringBuilder.append("event_date<=" + end + " 23:59:59;");
  349. stringBuilder.append("qc_step=1||qc_step=2;");
  350. if (StringUtils.isNotEmpty(orgCode)) {
  351. stringBuilder.append("org_code=" + orgCode);
  352. }
  353. SearchRequestBuilder builder = transportClient.prepareSearch("json_archives_qc");
  354. builder.setTypes("qc_metadata_info");
  355. builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
  356. builder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
  357. AggregationBuilder terms = AggregationBuilders.terms("dataset").field("dataset").size(200);
  358. CardinalityBuilder childTerms = AggregationBuilders.cardinality("count").field("pack_id").precisionThreshold(40000);
  359. terms.subAggregation(childTerms);
  360. builder.addAggregation(terms);
  361. builder.setSize(0);
  362. builder.setFrom(0);
  363. SearchResponse response = builder.get();
  364. StringTerms longTerms = response.getAggregations().get("dataset");
  365. for (Terms.Bucket item : longTerms.getBuckets()) {
  366. InternalCardinality extendedStats = item.getAggregations().get("count");
  367. // Map<String, Object> temp = new HashMap<>();
  368. // temp.put("dataset", item.getKeyAsString());
  369. // temp.put("count", extendedStats.getValue());
  370. // resultList.add(temp);
  371. num1 += extendedStats.getValue();
  372. }
  373. } catch (Exception e) {
  374. e.printStackTrace();
  375. num1 = 0;
  376. }
  377. return num1;
  378. }
  379. /**
  380. * 获取数据集总量
  381. *
  382. * @param start
  383. * @param end
  384. * @param orgCode
  385. * @return
  386. */
  387. public double getDataSetsMap(String start, String end, String orgCode) throws IOException {
  388. // 数据集总量
  389. double totalNum = 0;
  390. // 默认时间
  391. String dateStr = DateUtil.toString(new Date());
  392. if (StringUtils.isBlank(start)) {
  393. start = dateStr;
  394. }
  395. if (StringUtils.isBlank(end)) {
  396. end = dateStr;
  397. }
  398. TransportClient transportClient = elasticSearchPool.getClient();
  399. // 条件设置
  400. StringBuilder stringBuilder = new StringBuilder();
  401. stringBuilder.append("event_date>=" + start + " 00:00:00;");
  402. stringBuilder.append("event_date<=" + end + " 23:59:59;");
  403. if (StringUtils.isNotEmpty(orgCode)) {
  404. stringBuilder.append("org_code=" + orgCode);
  405. }
  406. SearchRequestBuilder builder = transportClient.prepareSearch("json_archives_qc");
  407. builder.setTypes("qc_dataset_detail");
  408. builder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
  409. builder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
  410. SumBuilder terms = AggregationBuilders.sum("sumCount").field("count");
  411. builder.addAggregation(terms);
  412. builder.setSize(0);
  413. builder.setFrom(0);
  414. SearchResponse response = builder.get();
  415. InternalSum longTerms = response.getAggregations().get("sumCount");
  416. totalNum = longTerms.getValue();
  417. return totalNum;
  418. }
  419. /**
  420. * 获取所有及时上传数
  421. * @param dateField 时间区间查询字段
  422. * @param start
  423. * @param end
  424. * @return
  425. */
  426. public double getInTimeNum(String dateField,String start, String end) {
  427. double totalInTime = 0;
  428. Map<String, Object> resMap = new HashMap<>();
  429. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(1));
  430. //获取有数据的医院code列表
  431. List<String> orgList = dataQualityBaseService.hasDataHospital(dateField, start, end);
  432. for (String orgCode : orgList) {
  433. //初始化 及时率预警信息
  434. DqPaltformReceiveWarning warning = dqPaltformReceiveWarningDao.findByOrgCode(orgCode);
  435. if (warning == null) {
  436. warning = dqPaltformReceiveWarningDao.findByOrgCode(defaultOrgCode);
  437. }
  438. long starttime = System.currentTimeMillis();
  439. String sql0 = "";
  440. List<String> fields = new ArrayList<String>();
  441. fields.add("count");
  442. try {
  443. sql0 = "SELECT COUNT(DISTINCT event_no) as count FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND " + dateField +
  444. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() ;
  445. List<Map<String, Object>> resultSet0 = elasticSearchUtil.findBySql(fields, sql0);
  446. for (Map<String, Object> orgData : resultSet0) {
  447. double newValue = (double) orgData.get("count");
  448. totalInTime +=newValue;
  449. }
  450. logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
  451. } catch (Exception e) {
  452. if (!"Error".equals(e.getMessage())) {
  453. e.printStackTrace();
  454. }
  455. }
  456. }
  457. return totalInTime;
  458. }
  459. public Map<String, Object> genVisitMap(String typeField, double value, double total) {
  460. Map<String, Object> map = new HashMap<>();
  461. map.put("name", typeField);
  462. map.put("value", value);
  463. map.put("rate", calRate(value,total));
  464. return map;
  465. }
  466. /**
  467. * 批量更新es中的区域编码org_area
  468. * (通过机构编码org_code 更新org_area)
  469. */
  470. public long bulkUpdateOrgArea(String index,String type,String filters){
  471. long page = 0;
  472. long count = elasticSearchUtil.count(index, type, filters);
  473. if (count >10000) {
  474. page = count/10000 + 1;
  475. }else {
  476. page = 1;
  477. }
  478. for (int i = 1;i<=page;i++) {
  479. Page<Map<String, Object>> result = elasticSearchUtil.page(index, type, filters, i, 10000);
  480. List<Map<String, Object>> updateSourceList = new ArrayList<>();
  481. result.forEach(item -> {
  482. Map<String, Object> updateSource = new HashMap<>();
  483. updateSource.put("_id", item.get("_id"));
  484. String orgCode = (String) item.get("org_code");
  485. String orgArea = redisClient.get("organizations:" + orgCode + ":area");
  486. updateSource.put("org_area", orgArea);
  487. updateSourceList.add(updateSource);
  488. });
  489. if (!updateSourceList.isEmpty()) {
  490. elasticSearchUtil.bulkUpdate(index, type, updateSourceList);
  491. }
  492. }
  493. return count;
  494. }
  495. /* ******************************** 区域层级模块相关 ***********************************/
  496. /**
  497. * 获取市区域的下级区域质控情况
  498. * @param dataType 数据维度 (0: 完整性,1:及时性,2:准确性)
  499. * @param start
  500. * @param end
  501. * @return
  502. */
  503. public List<Map<String,Object>> findAreaData(Integer dataType, String start, String end) throws Exception {
  504. List<Map<String,Object>> list = new ArrayList<>();
  505. String dateStr = DateUtil.toString(new Date());
  506. if (StringUtils.isBlank(start)) {
  507. start = dateStr;
  508. }
  509. if (StringUtils.isBlank(end)) {
  510. end = dateStr;
  511. }
  512. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(dataType));
  513. list = dataQualityBaseService.getAreaDataQuality(0,start,end);
  514. return list;
  515. }
  516. /* ******************************** 机构 层级模块相关 ***********************************/
  517. /**
  518. * 获取区县下的机构质控情况
  519. * @param dataType 数据维度 (0: 完整性,1:及时性,2:准确性)
  520. * @param areaCode 上区域编码
  521. * @param start
  522. * @param end
  523. * @return
  524. */
  525. public List<Map<String,Object>> findOrgData(Integer dataType , String areaCode, String start, String end) throws Exception {
  526. List<Map<String,Object>> list = new ArrayList<>();
  527. String dateStr = DateUtil.toString(new Date());
  528. if (StringUtils.isBlank(start)) {
  529. start = dateStr;
  530. }
  531. if (StringUtils.isBlank(end)) {
  532. end = dateStr;
  533. }
  534. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(dataType));
  535. list = dataQualityBaseService.getOrgDataQuality(1,areaCode,start,end);
  536. return list;
  537. }
  538. /**
  539. * 首页错误数据集
  540. * @param orgCode
  541. * @param dataType
  542. * @param start
  543. * @param end
  544. * @return
  545. * @throws Exception
  546. */
  547. public List<Map<String,Object>> homeDatasetError(String orgArea, String orgCode, Integer dataType, String start, String end) throws Exception {
  548. List<String> fileds = new ArrayList<>();
  549. fileds.add("dataset");
  550. fileds.add("count");
  551. fileds.add("version");
  552. StringBuffer sql = new StringBuffer();
  553. sql.append("SELECT dataset,COUNT(DISTINCT pack_id) count ,version FROM json_archives_qc/qc_metadata_info ");
  554. sql.append(" WHERE event_date>='" + start + " 00:00:00' and (qc_step=1 or qc_step=2) and event_date<='" + end + " 23:59:59' ");
  555. if(StringUtils.isNotEmpty(orgArea)){
  556. sql.append(" AND org_area = '"+orgArea+"'");
  557. }
  558. if(StringUtils.isNotEmpty(orgCode)){
  559. sql.append(" AND org_code = '"+orgCode+"'");
  560. }
  561. if(dataType == 0){
  562. sql.append(" AND qc_error_type=1");
  563. }else{
  564. sql.append(" AND qc_error_type<>1");
  565. }
  566. sql.append(" group by dataset,version");
  567. List<Map<String,Object>> list = elasticSearchUtil.findBySql(fileds,sql.toString());
  568. for(Map<String,Object> map:list){
  569. map.put("dataset_name", redisClient.get("std_data_set_" + map.get("version") + ":" + map.get("dataset") + ":name"));
  570. }
  571. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(1));
  572. dataQualityBaseService.comparator(list,"count",1);//降序排序
  573. return list;
  574. }
  575. /**
  576. * 首页错误数据元
  577. * @param dataset
  578. * @param dataType
  579. * @param start
  580. * @param end
  581. * @return
  582. * @throws Exception
  583. */
  584. public List<Map<String,Object>> homeMetadataError(String orgArea, String orgCode, String dataset ,Integer dataType,String start,String end) throws Exception {
  585. List<String> fileds = new ArrayList<>();
  586. fileds.add("dataset");
  587. fileds.add("metadata");
  588. fileds.add("count");
  589. fileds.add("version");
  590. StringBuffer sql = new StringBuffer();
  591. sql.append("SELECT dataset, metadata,COUNT(metadata) count ,version FROM json_archives_qc/qc_metadata_info ");
  592. sql.append(" WHERE event_date>='" + start + " 00:00:00' and (qc_step=1 or qc_step=2) and event_date<='" + end + " 23:59:59'");
  593. if(StringUtils.isNotEmpty(orgArea)){
  594. sql.append(" AND org_area = '"+orgArea+"'");
  595. }
  596. if(StringUtils.isNotEmpty(orgCode)){
  597. sql.append(" AND org_code = '"+orgCode+"'");
  598. }
  599. if(StringUtils.isNotEmpty(dataset)){
  600. sql.append(" AND dataset = '"+dataset+"'");
  601. }
  602. if(dataType == 0){
  603. sql.append(" AND qc_error_type=1");
  604. }else{
  605. sql.append(" AND qc_error_type<>1");
  606. }
  607. sql.append(" group by dataset,metadata,version");
  608. List<Map<String,Object>> list = elasticSearchUtil.findBySql(fileds,sql.toString());
  609. for(Map<String,Object> map:list){
  610. map.put("metadata_name", redisClient.get("std_meta_data_" + map.get("version") + ":" + map.get("dataset")+"."+ map.get("metadata")+ ":name"));
  611. }
  612. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(1));
  613. dataQualityBaseService.comparator(list,"count",1);//降序排序
  614. return list;
  615. }
  616. /**
  617. * 完整率、准确率、及时率趋势
  618. * @param flag 10按月 20按日
  619. * @param dataType 0: 完整性,1:及时性,2:准确性
  620. * @param month
  621. * @return
  622. * @throws Exception
  623. */
  624. public Map<String, Object> homeTrend(String flag, int dataType, String month) throws Exception {
  625. Map<String, Object> map = new HashMap<>();
  626. List<Double> data = new ArrayList<>();
  627. List<String> name = getName(flag, month);
  628. if(dataType==0){
  629. Map<String,Object> hospitalDataMap = packQcReportService.getHospitalNum(flag,month);
  630. Map<String,Object> map1 =getTotalVisitNum(flag, month);
  631. for(int i=0;i<name.size();i++){
  632. if(map1.get(name.get(i))!=null&&hospitalDataMap.get(name.get(i))!=null){
  633. if(Double.parseDouble(hospitalDataMap.get(name.get(i))+"")!=0){
  634. double rate = (long)map1.get(name.get(i))/(double)hospitalDataMap.get(name.get(i))*100;
  635. data.add((double) Math.round(rate * 100) / 100);
  636. }else{
  637. data.add(0.0);
  638. }
  639. }else{
  640. data.add(0.0);
  641. }
  642. }
  643. }else if(dataType==1){
  644. Map<String,Object> hospitalDataMap = packQcReportService.getHospitalNum(flag,month);
  645. for(int i=0;i<name.size();i++){
  646. //2. 及时数
  647. String start="";
  648. String end="";
  649. if("10".equals(flag)){
  650. start = name.get(i)+"-01";
  651. end = DateUtil.getLastDate(start, "yyyy-MM-dd", "yyyy-MM-dd");
  652. }else{
  653. start=name.get(i);
  654. end=name.get(i);
  655. }
  656. double totalInTime = getInTimeNum("event_date" ,start, end);
  657. if(hospitalDataMap.get(name.get(i))!=null&&Double.parseDouble(hospitalDataMap.get(name.get(i))+"")!=0){
  658. double rate = totalInTime/(double)hospitalDataMap.get(name.get(i))*100;
  659. data.add((double) Math.round(rate * 100) / 100);
  660. }else{
  661. data.add(0.0);
  662. }
  663. }
  664. }else if(dataType==2){
  665. Map<String,Object> map1 = getErrorDataSetData(flag, month);
  666. Map<String,Object> map2 = getTotalDataSets(flag, month);
  667. for(int i=0;i<name.size();i++){
  668. if(map1.get(name.get(i))!=null&&map2.get(name.get(i))!=null){
  669. if(Double.parseDouble(map2.get(name.get(i))+"")!=0){
  670. double rate = (double)map1.get(name.get(i))/(double)map2.get(name.get(i))*100;
  671. data.add((double) Math.round(rate * 100) / 100);
  672. }else{
  673. data.add(0.0);
  674. }
  675. }else{
  676. data.add(0.0);
  677. }
  678. }
  679. }
  680. map.put("data", data);
  681. map.put("name", name);
  682. return map;
  683. }
  684. private List<String> getName(String flag ,String month) throws Exception{
  685. List<String> name = new ArrayList<>();
  686. if("10".equals(flag)){//按月
  687. for(int i=6;i>0;i--){
  688. String start = DateUtil.formatDate(DateUtil.addMonth(1-i, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM");
  689. name.add(start);
  690. }
  691. }else{//按日
  692. //当前月份显示最近30天,否则显示当月的数据
  693. if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
  694. for(int i=0;i<30;i++){
  695. String date = DateUtil.toString(DateUtil.addDate(0-i,new Date()));
  696. name.add(0,date);
  697. }
  698. }else{
  699. String end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  700. for(int i=0;i<32;i++){
  701. String date = DateUtil.toString(DateUtil.addDate(i,DateUtil.strToDate(month+"-01")));
  702. name.add(date);
  703. if(date.equals(end)){
  704. break;
  705. }
  706. }
  707. }
  708. }
  709. return name;
  710. }
  711. public Map<String, Object> getHealthyArchiveTrend(String flag,String month) throws Exception {
  712. Map<String, Object> resMap = new HashMap<>();
  713. List<String> date = new ArrayList<>();
  714. List<Long> receiveCount = new ArrayList<>();
  715. List<Long> storageCount = new ArrayList<>();
  716. //采集量统计
  717. Map<String, Object> receive = getHealthyTrend(flag, "receive_date", month);
  718. //入库量统计
  719. Map<String, Object> storage = getHealthyTrend(flag, "finish_date", month);
  720. //前端趋势图 格式生成
  721. for (String key : receive.keySet()) {
  722. Long receiveValue = receive.get(key) == null ? 0 : (Long) receive.get(key);
  723. Long storageValue = storage.get(key) == null ? 0 : (Long) storage.get(key);
  724. receiveCount.add(receiveValue);
  725. storageCount.add(storageValue);
  726. date.add(key);
  727. }
  728. resMap.put("name",date);
  729. resMap.put("receiveData",receiveCount);
  730. resMap.put("storageData",storageCount);
  731. return resMap;
  732. }
  733. /**
  734. * 健康档案建档数
  735. * @param flag 10按月 20按日
  736. * @param dateField 分组时间字段 receive_date:采集维度,finish_date:入库维度
  737. * @param month
  738. * @return
  739. * @throws Exception
  740. */
  741. public Map<String, Object> getHealthyTrend(String flag, String dateField, String month) throws Exception {
  742. TreeMap<String, Object> map = new TreeMap<>();
  743. //先设置值,防止某几个月份没值,前端直接不展示
  744. for(int i=6;i>0;i--){
  745. String data = DateUtil.formatDate(DateUtil.addMonth(-i, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM");
  746. map.put(data,0L);
  747. }
  748. TransportClient transportClient = elasticSearchPool.getClient();
  749. String start = "";
  750. String end = "";
  751. AggregationBuilder aggregation =null;
  752. if("10".equals(flag)){//按月
  753. start = DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
  754. end = DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
  755. aggregation = AggregationBuilders.dateHistogram("agg").field("receive_date")
  756. .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
  757. }else{//按日
  758. //当前月份显示最近30天,否则显示当月的数据
  759. if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
  760. start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
  761. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  762. }else{
  763. start = month+"-01";
  764. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  765. }
  766. aggregation = AggregationBuilders.dateHistogram("agg").field(dateField)
  767. .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
  768. }
  769. // 声明where 条件
  770. BoolQueryBuilder qbs = QueryBuilders.boolQuery();
  771. RangeQueryBuilder startRange = QueryBuilders.rangeQuery(dateField);
  772. startRange.gte(start + " 00:00:00");
  773. qbs.must(startRange);
  774. RangeQueryBuilder endRange = QueryBuilders.rangeQuery(dateField);
  775. endRange.lt(end+" 23:59:59");
  776. qbs.must(endRange);
  777. SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives")
  778. .setTypes("info");
  779. requestBuilder.setQuery(qbs);
  780. requestBuilder.addAggregation(aggregation);
  781. requestBuilder.addSort(dateField, SortOrder.DESC);
  782. SearchResponse response = requestBuilder.execute().actionGet();
  783. Histogram agg = response.getAggregations().get("agg");
  784. // For each entry
  785. for (Histogram.Bucket entry : agg.getBuckets()) {
  786. String key = entry.getKey().toString();
  787. String keyAsString = entry.getKeyAsString();
  788. long docCount = entry.getDocCount();
  789. map.put(keyAsString,docCount);
  790. logger.info("key [{" + keyAsString + "}]");
  791. logger.info("date [{" + key + "}]");
  792. logger.info("doc_count [{" + docCount + "}]");
  793. }
  794. return map;
  795. }
  796. /**
  797. * 平台人数 去重复
  798. * @param flag 10按月 20按日
  799. * @param month
  800. * @return
  801. * @throws Exception
  802. */
  803. public Map<String, Object> getTotalVisitNum(String flag, String month) throws Exception {
  804. TreeMap<String, Object> map = new TreeMap<>();
  805. TransportClient transportClient = elasticSearchPool.getClient();
  806. String start = "";
  807. String end = "";
  808. AggregationBuilder aggregation =null;
  809. if("10".equals(flag)){//按月
  810. start = DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
  811. end = DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
  812. aggregation = AggregationBuilders.dateHistogram("agg").field("event_date")
  813. .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
  814. }else{//按日
  815. //当前月份显示最近30天,否则显示当月的数据
  816. if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
  817. start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
  818. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  819. }else{
  820. start = month+"-01";
  821. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  822. }
  823. aggregation = AggregationBuilders.dateHistogram("agg").field("event_date")
  824. .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
  825. }
  826. StringBuilder stringBuilder = new StringBuilder();
  827. stringBuilder.append("pack_type=1;");
  828. stringBuilder.append("event_date>=" + start + " 00:00:00;");
  829. stringBuilder.append("event_date<" + end + " 23:59:59;");
  830. CardinalityBuilder childTerms = AggregationBuilders.cardinality("count").field("event_no").precisionThreshold(40000);
  831. SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives")
  832. .setTypes("info");
  833. requestBuilder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
  834. requestBuilder.addAggregation(aggregation.subAggregation(childTerms));
  835. requestBuilder.addSort("event_date", SortOrder.DESC);
  836. SearchResponse response = requestBuilder.execute().actionGet();
  837. Histogram agg = response.getAggregations().get("agg");
  838. for (Histogram.Bucket entry : agg.getBuckets()) {
  839. String keyAsString = entry.getKeyAsString();
  840. long docCount = entry.getDocCount();
  841. InternalCardinality extendedStats = entry.getAggregations().get("count");
  842. map.put(keyAsString,extendedStats.getValue());
  843. }
  844. return map;
  845. }
  846. /**
  847. * 获取数据集总量
  848. *
  849. * @return
  850. */
  851. public Map<String, Object> getTotalDataSets(String flag, String month) throws Exception {
  852. TreeMap<String, Object> map = new TreeMap<>();
  853. TransportClient transportClient = elasticSearchPool.getClient();
  854. String start = "";
  855. String end = "";
  856. AggregationBuilder aggregation =null;
  857. if("10".equals(flag)){//按月
  858. start = DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
  859. end = DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
  860. aggregation = AggregationBuilders.dateHistogram("agg").field("event_date")
  861. .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
  862. }else{//按日
  863. //当前月份显示最近30天,否则显示当月的数据
  864. if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
  865. start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
  866. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  867. }else{
  868. start = month+"-01";
  869. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  870. }
  871. aggregation = AggregationBuilders.dateHistogram("agg").field("event_date")
  872. .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
  873. }
  874. StringBuilder stringBuilder = new StringBuilder();
  875. stringBuilder.append("event_date>=" + start + " 00:00:00;");
  876. stringBuilder.append("event_date<=" + end + " 23:59:59;");
  877. SumBuilder terms = AggregationBuilders.sum("sumCount").field("count");
  878. SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives_qc")
  879. .setTypes("qc_dataset_detail");
  880. requestBuilder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
  881. requestBuilder.addAggregation(aggregation.subAggregation(terms));
  882. requestBuilder.addSort("event_date", SortOrder.DESC);
  883. SearchResponse response = requestBuilder.execute().actionGet();
  884. Histogram agg = response.getAggregations().get("agg");
  885. for (Histogram.Bucket entry : agg.getBuckets()) {
  886. String keyAsString = entry.getKeyAsString();
  887. InternalSum longTerms = entry.getAggregations().get("sumCount");
  888. map.put(keyAsString,longTerms.getValue());
  889. }
  890. return map;
  891. }
  892. /**
  893. * 获取质控错误 - 数据集总条数
  894. * @return
  895. */
  896. public Map<String,Object> getErrorDataSetData(String flag, String month)throws Exception {
  897. TreeMap<String, Object> map = new TreeMap<>();
  898. TransportClient transportClient = elasticSearchPool.getClient();
  899. String start = "";
  900. String end = "";
  901. AggregationBuilder aggregation =null;
  902. if("10".equals(flag)){//按月
  903. start = DateUtil.formatDate(DateUtil.addMonth(-6, DateUtil.formatCharDateYMD(month+"-01")), "yyyy-MM") + "-01";
  904. end = DateUtil.getLastDate (month + "-01", "yyyy-MM-dd", "yyyy-MM-dd");
  905. aggregation = AggregationBuilders.dateHistogram("agg").field("event_date")
  906. .interval(DateHistogramInterval.MONTH).format("yyyy-MM");
  907. }else{//按日
  908. //当前月份显示最近30天,否则显示当月的数据
  909. if(month.equals(DateUtil.toString(new Date(), "yyyy-MM"))){
  910. start = DateUtil.toString(DateUtil.addDate(-30,new Date()));
  911. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  912. }else{
  913. start = month+"-01";
  914. end = DateUtil.getLastDate (month+"-01", "yyyy-MM-dd", "yyyy-MM-dd");
  915. }
  916. aggregation = AggregationBuilders.dateHistogram("agg").field("event_date")
  917. .interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
  918. }
  919. StringBuilder stringBuilder = new StringBuilder();
  920. stringBuilder.append("event_date>=" + start + " 00:00:00;");
  921. stringBuilder.append("event_date<=" + end + " 23:59:59;");
  922. stringBuilder.append("qc_step=1||qc_step=2;");
  923. AggregationBuilder terms = AggregationBuilders.terms("dataset").field("dataset").size(200);
  924. CardinalityBuilder childTerms = AggregationBuilders.cardinality("count").field("pack_id").precisionThreshold(40000);
  925. terms.subAggregation(childTerms);
  926. SearchRequestBuilder requestBuilder = transportClient.prepareSearch("json_archives_qc")
  927. .setTypes("qc_metadata_info");
  928. requestBuilder.setQuery(elasticSearchUtil.getQueryBuilder(stringBuilder.toString()));
  929. requestBuilder.addAggregation(aggregation.subAggregation(terms));
  930. requestBuilder.addSort("event_date", SortOrder.DESC);
  931. SearchResponse response = requestBuilder.execute().actionGet();
  932. Histogram agg = response.getAggregations().get("agg");
  933. for (Histogram.Bucket entry : agg.getBuckets()) {
  934. String keyAsString = entry.getKeyAsString();
  935. StringTerms longTerms = entry.getAggregations().get("dataset");
  936. double num = 0;
  937. for (Terms.Bucket item : longTerms.getBuckets()) {
  938. InternalCardinality extendedStats = item.getAggregations().get("count");
  939. num+=extendedStats.getValue();
  940. }
  941. map.put(keyAsString,num);
  942. }
  943. return map;
  944. }
  945. }