DataQualityHomeService.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  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.ElasticSearchUtil;
  5. import com.yihu.ehr.entity.quality.DqPaltformReceiveWarning;
  6. import com.yihu.ehr.profile.qualilty.DqDataType;
  7. import com.yihu.ehr.query.BaseJpaService;
  8. import com.yihu.ehr.redis.client.RedisClient;
  9. import com.yihu.ehr.util.datetime.DateUtil;
  10. import com.yihu.ehr.util.rest.Envelop;
  11. import org.apache.commons.lang.StringUtils;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.context.ApplicationContext;
  17. import org.springframework.data.domain.Page;
  18. import org.springframework.stereotype.Service;
  19. import javax.annotation.PostConstruct;
  20. import java.io.IOException;
  21. import java.sql.ResultSet;
  22. import java.text.DecimalFormat;
  23. import java.util.*;
  24. /**
  25. * 质控管理- 首页逻辑类
  26. * @author HZY
  27. * @created 2018/8/17 11:24
  28. */
  29. @Service
  30. public class DataQualityHomeService extends BaseJpaService {
  31. private final static Logger logger = LoggerFactory.getLogger(DataQualityHomeService.class);
  32. @Autowired
  33. private ElasticSearchUtil elasticSearchUtil;
  34. @Autowired
  35. private DqPaltformReceiveWarningDao dqPaltformReceiveWarningDao;
  36. @Autowired
  37. private PackQcReportService packQcReportService;
  38. @Value("${quality.orgCode}")
  39. private String defaultOrgCode;
  40. @Value("${quality.cloud}")
  41. private String cloud;
  42. @Value("${quality.cloudName}")
  43. private String cloudName;
  44. @Autowired
  45. private RedisClient redisClient;
  46. @Autowired
  47. private ApplicationContext context;
  48. private Map<DqDataType, DataQualityBaseService> dqBaseServiceMap;
  49. @PostConstruct
  50. private void init() {
  51. dqBaseServiceMap = new HashMap<>();
  52. dqBaseServiceMap.put(DqDataType.complete, context.getBean(DataCompleteService.class));
  53. dqBaseServiceMap.put(DqDataType.imTime, context.getBean(DataInTimeService.class));
  54. dqBaseServiceMap.put(DqDataType.correct, context.getBean(DataCorrectService.class));
  55. }
  56. public DataQualityBaseService getInstance(DqDataType type){
  57. DataQualityBaseService dataQualityBaseService;
  58. switch (type) {
  59. case complete:
  60. dataQualityBaseService = dqBaseServiceMap.get(DqDataType.complete);
  61. break;
  62. case imTime:
  63. dataQualityBaseService = dqBaseServiceMap.get(DqDataType.imTime);
  64. break;
  65. case correct:
  66. dataQualityBaseService = dqBaseServiceMap.get(DqDataType.correct);
  67. break;
  68. default:
  69. throw new RuntimeException("Failed to identify dataQualityBaseService type");
  70. }
  71. return dataQualityBaseService;
  72. }
  73. /**
  74. * 平台就诊人数 去重复(完整人数) 档案完整性
  75. * @param dateField 时间区间查询字段
  76. * @param start
  77. * @param end
  78. * @param orgCode
  79. * @return
  80. */
  81. public void getPatientCount(String dateField,String start, String end, String orgCode, Map<String, Object> map) throws Exception {
  82. try {
  83. long starttime = System.currentTimeMillis();
  84. String sql0 = "";
  85. String sql1 = "";
  86. String sql2 = "";
  87. String sql3 = "";
  88. if (StringUtils.isNotEmpty(orgCode)) {
  89. sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
  90. " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  91. sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN" +
  92. " '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  93. sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
  94. "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  95. sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND " + dateField + " BETWEEN " +
  96. "'" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  97. } else {
  98. sql0 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=2 AND pack_type=1 AND " + dateField +
  99. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  100. sql1 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=1 AND pack_type=1 AND " + dateField +
  101. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  102. sql2 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE event_type=0 AND pack_type=1 AND " + dateField +
  103. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  104. sql3 = "SELECT COUNT(DISTINCT event_no) FROM json_archives WHERE pack_type=1 AND " + dateField +
  105. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59'";
  106. }
  107. ResultSet resultSet0 = elasticSearchUtil.findBySql(sql0);
  108. ResultSet resultSet1 = elasticSearchUtil.findBySql(sql1);
  109. ResultSet resultSet2 = elasticSearchUtil.findBySql(sql2);
  110. ResultSet resultSet3 = elasticSearchUtil.findBySql(sql3);
  111. resultSet0.next();
  112. resultSet1.next();
  113. resultSet2.next();
  114. resultSet3.next();
  115. map.put("peIntegrity", new Double(resultSet0.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//体检
  116. map.put("hospitalIntegrity", new Double(resultSet1.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//住院
  117. map.put("outpatientIntegrity", new Double(resultSet2.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//门诊
  118. map.put("visitIntegrity", new Double(resultSet3.getObject("COUNT(DISTINCT event_no)").toString()).intValue());//就诊
  119. logger.info("平台就诊人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
  120. } catch (Exception e) {
  121. if (!"Error".equals(e.getMessage())) {
  122. e.printStackTrace();
  123. }
  124. }
  125. }
  126. /**
  127. * 百分比计算
  128. *
  129. * @param molecular 分子
  130. * @param denominator 分母
  131. * @return
  132. */
  133. public String calRate(double molecular, double denominator) {
  134. if (molecular == 0) {
  135. return "0.00%";
  136. } else if (denominator == 0) {
  137. return "100.00%";
  138. }
  139. DecimalFormat decimalFormat = new DecimalFormat("0.00%");
  140. return decimalFormat.format(molecular / denominator);
  141. }
  142. /**
  143. * 质控情况 - 总计 (及时率,完整率,准确率)
  144. *
  145. * @param start 就诊时间- 起始
  146. * @param end 就诊时间- 截止
  147. * 【目前取的是平台全部机构,若做多区域平台的话,需要添加区域参数】
  148. */
  149. public Map<String, Object> getQuailyDetail(String start, String end) throws Exception {
  150. Map<String, Object> totalMap = new HashMap<>();
  151. List<Map<String, Object>> archiveMapList = new ArrayList<>();
  152. String dateStr = DateUtil.toString(new Date());
  153. if (StringUtils.isBlank(start)) {
  154. start = dateStr;
  155. }
  156. if (StringUtils.isBlank(end)) {
  157. end = dateStr;
  158. }
  159. int totalHospitalNum = 0;//医院总就诊数
  160. double hospitalOutpatientNum = 0;//总门诊数
  161. double hospitalExamNum = 0;//总体检数
  162. double hospitalInpatientNum = 0;//总住院数
  163. double totalInTime = 0;//总及时数
  164. double totalVisitNum = 0;//总完整数(平台总就诊数)
  165. double totalCorrect = 0;//总准确数
  166. //1. 获取医院档案量;
  167. Envelop envelop = packQcReportService.dailyReport("create_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
  168. Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
  169. //医院总数据量
  170. totalHospitalNum = (int) hospitalDataMap.get("total");
  171. hospitalOutpatientNum = (int) hospitalDataMap.get("oupatient");
  172. hospitalInpatientNum = (int) hospitalDataMap.get("inpatient");
  173. hospitalExamNum = (int) hospitalDataMap.get("physical");
  174. Map<String, Object> dataMap = new HashMap<>();
  175. //2. 平台就诊完整数
  176. getPatientCount("receive_date",start, end, null, dataMap);
  177. totalVisitNum = Double.valueOf(dataMap.get("visitIntegrity").toString());//就诊完整数
  178. //3. 及时数
  179. totalInTime = getInTimeNum("receive_date" ,start, end);
  180. // 3. 去重准确数【】
  181. totalCorrect = getErrorDataSetData("receive_date",start, end, null);
  182. //4. 数据集总量
  183. int dataSetsMun = getDataSetsMap(start, end, null);
  184. totalMap.put("orgCode", cloud);//机构code
  185. totalMap.put("orgName", cloudName);//机构名称
  186. totalMap.put("totalInTime", totalInTime);//及时数
  187. totalMap.put("totalComplete", totalVisitNum);//总就诊完整数
  188. totalMap.put("totalCorrect", totalCorrect);//准确数
  189. totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
  190. totalMap.put("totalDataSet", dataSetsMun);//数据集总行数
  191. //计算及时率及完整率,准确性
  192. totalMap.put("inTimeRate", calRate(totalInTime, totalHospitalNum));//及时率
  193. totalMap.put("completeRate", calRate(totalVisitNum, totalHospitalNum));//完整率
  194. totalMap.put("correctRate", calRate(totalCorrect, dataSetsMun));//数据集准确率
  195. Map<String, Object> outPatientMap = genVisitMap("outPatient", hospitalOutpatientNum, totalHospitalNum);
  196. Map<String, Object> inPatientMap = genVisitMap("inPatient", hospitalInpatientNum, totalHospitalNum);
  197. Map<String, Object> examPatientMap = genVisitMap("exam", hospitalExamNum, totalHospitalNum);
  198. archiveMapList.add(outPatientMap);
  199. archiveMapList.add(inPatientMap);
  200. archiveMapList.add(examPatientMap);
  201. //档案包采集情况
  202. totalMap.put("rate", archiveMapList);
  203. return totalMap;
  204. }
  205. /**
  206. * 质控分析 - 完整性统计
  207. *
  208. * @param start 就诊时间- 起始
  209. * @param end 就诊时间- 截止
  210. * 【目前取的是平台全部机构,若做多区域平台的话,需要添加区域参数】
  211. */
  212. public Map<String, Object> getCompleteStatistics(String start, String end) throws Exception {
  213. Map<String, Object> totalMap = new HashMap<>();
  214. String dateStr = DateUtil.toString(new Date());
  215. if (StringUtils.isBlank(start)) {
  216. start = dateStr;
  217. }
  218. if (StringUtils.isBlank(end)) {
  219. end = dateStr;
  220. }
  221. int totalHospitalNum = 0;//医院总就诊数
  222. double totalVisitNum = 0;//总完整数(平台总就诊数)
  223. //1. 获取医院档案量;
  224. Envelop envelop = packQcReportService.dailyReport("create_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
  225. Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
  226. //医院总数据量
  227. totalHospitalNum = (int) hospitalDataMap.get("total");
  228. Map<String, Object> dataMap = new HashMap<>();
  229. //2. 平台就诊完整数
  230. getPatientCount("receive_date",start, end, null, dataMap);
  231. totalVisitNum = Double.valueOf(dataMap.get("visitIntegrity").toString());
  232. totalMap.put("totalComplete", totalVisitNum);//总就诊完整数
  233. totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
  234. //计算完整率,
  235. totalMap.put("completeRate", calRate(totalVisitNum, totalHospitalNum));//完整率
  236. return totalMap;
  237. }
  238. /**
  239. * 质控分析 - 准确率统计
  240. *
  241. * @param start 就诊时间- 起始
  242. * @param end 就诊时间- 截止
  243. */
  244. public Map<String, Object> getCorrectStatistics(String start, String end) throws Exception {
  245. Map<String, Object> totalMap = new HashMap<>();
  246. String dateStr = DateUtil.toString(new Date());
  247. if (StringUtils.isBlank(start)) {
  248. start = dateStr;
  249. }
  250. if (StringUtils.isBlank(end)) {
  251. end = dateStr;
  252. }
  253. double totalCorrect = 0;//总准确数
  254. Map<String, Object> dataMap = new HashMap<>();
  255. //1. 去重准确数
  256. totalCorrect = getErrorDataSetData("receive_date",start, end, null);
  257. //2. 数据集总量
  258. int dataSetsMun = getDataSetsMap(start, end, null);
  259. totalMap.put("totalCorrect", totalCorrect);//准确数
  260. totalMap.put("totalDataSet", dataSetsMun);//数据集总行数
  261. //3 计算准确性
  262. totalMap.put("correctRate", calRate(totalCorrect, dataSetsMun));//数据集准确率
  263. return totalMap;
  264. }
  265. /**
  266. * 质控分析 - 及时率统计
  267. *
  268. * @param start 就诊时间- 起始
  269. * @param end 就诊时间- 截止
  270. */
  271. public Map<String, Object> getInTimeStatistics(String start, String end) throws Exception {
  272. Map<String, Object> totalMap = new HashMap<>();
  273. String dateStr = DateUtil.toString(new Date());
  274. if (StringUtils.isBlank(start)) {
  275. start = dateStr;
  276. }
  277. if (StringUtils.isBlank(end)) {
  278. end = dateStr;
  279. }
  280. int totalHospitalNum = 0;//医院总就诊数
  281. double totalInTime = 0;//总及时数
  282. //1. 获取医院档案量;
  283. Envelop envelop = packQcReportService.dailyReport("create_date", start + "T00:00:00Z", end + "T23:59:59Z", null);
  284. Map<String, Object> hospitalDataMap = (Map<String, Object>) envelop.getDetailModelList().get(0);
  285. //医院总数据量
  286. totalHospitalNum = (int) hospitalDataMap.get("total");
  287. Map<String, Object> dataMap = new HashMap<>();
  288. //2. 及时数
  289. totalInTime = getInTimeNum("receive_date" ,start, end);
  290. totalMap.put("totalInTime", totalInTime);//及时数
  291. totalMap.put("totalHospital", totalHospitalNum);//医院总就诊数
  292. //3 计算及时率
  293. totalMap.put("inTimeRate", calRate(totalInTime, totalHospitalNum));//及时率
  294. return totalMap;
  295. }
  296. /**
  297. * 获取质控错误 - 数据集总条数
  298. * @param dateField 时间区间查询字段
  299. * @param start
  300. * @param end
  301. * @param orgCode
  302. * @return
  303. */
  304. public double getErrorDataSetData(String dateField,String start, String end, String orgCode) {
  305. Map<String, Object> map = new HashMap<String, Object>();
  306. double num1 = 0;
  307. try {
  308. String dateStr = DateUtil.toString(new Date());
  309. if (StringUtils.isBlank(start)) {
  310. start = dateStr;
  311. }
  312. if (StringUtils.isBlank(end)) {
  313. end = dateStr;
  314. }
  315. List<String> fields = new ArrayList<String>();
  316. fields.add("dataset");
  317. fields.add("count");
  318. String sql1 = "";
  319. if (StringUtils.isNotEmpty(orgCode)) {
  320. sql1 = "SELECT dataset,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where org_code='" + orgCode + "' " +
  321. dateField + ">='" + start + " 00:00:00' and "+ dateField + "<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by dataset";
  322. } else {
  323. sql1 = "SELECT dataset,count(DISTINCT event_no) as count from json_archives_qc/qc_metadata_info where " +
  324. dateField +">='" + start + " 00:00:00' and "+dateField+"<='" + end + " 23:59:59' and (qc_step=1 or qc_step=2) group by dataset";
  325. }
  326. List<Map<String, Object>> list1 = elasticSearchUtil.findBySql(fields, sql1);
  327. if (list1 != null && list1.size() > 0) {
  328. for (Map<String, Object> map1 : list1) {
  329. num1 += (double) map1.get("count");
  330. }
  331. }
  332. } catch (Exception e) {
  333. e.printStackTrace();
  334. num1 = 0;
  335. }
  336. return num1;
  337. }
  338. /**
  339. * 获取数据集总量
  340. *
  341. * @param start
  342. * @param end
  343. * @param orgCode
  344. * @return
  345. */
  346. public int getDataSetsMap(String start, String end, String orgCode) throws IOException {
  347. // 数据集总量
  348. int totalNum = 0;
  349. String dateStr = DateUtil.toString(new Date());
  350. if (StringUtils.isBlank(start)) {
  351. start = dateStr;
  352. }
  353. if (StringUtils.isBlank(end)) {
  354. end = dateStr;
  355. }
  356. StringBuilder stringBuilder1 = new StringBuilder();
  357. stringBuilder1.append("receive_date>=").append(start).append(" 00:00:00").append(";");
  358. stringBuilder1.append("receive_date<=").append(end).append(" 23:59:59").append(";");
  359. if (StringUtils.isNotBlank(orgCode)) {
  360. stringBuilder1.append("org_code=" + orgCode);
  361. }
  362. List<Map<String, Object>> dataSets = elasticSearchUtil.list("json_archives_qc", "qc_dataset_detail", stringBuilder1.toString());
  363. for (Map<String, Object> dataSet : dataSets) {
  364. for (Map.Entry<String, Object> entry : dataSet.entrySet()) {
  365. totalNum += (Integer) dataSet.get("count");
  366. }
  367. }
  368. return totalNum;
  369. }
  370. /**
  371. * 获取所有及时上传数
  372. * @param dateField 时间区间查询字段
  373. * @param start
  374. * @param end
  375. * @return
  376. */
  377. public double getInTimeNum(String dateField,String start, String end) {
  378. double totalInTime = 0;
  379. Map<String, Object> resMap = new HashMap<>();
  380. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(1));
  381. //获取有数据的医院code列表
  382. List<String> orgList = dataQualityBaseService.hasDataHospital(dateField, start, end);
  383. for (String orgCode : orgList) {
  384. //初始化 及时率预警信息
  385. DqPaltformReceiveWarning warning = dqPaltformReceiveWarningDao.findByOrgCode(orgCode);
  386. if (warning == null) {
  387. warning = dqPaltformReceiveWarningDao.findByOrgCode(defaultOrgCode);
  388. }
  389. long starttime = System.currentTimeMillis();
  390. String sql0 = "";
  391. List<String> fields = new ArrayList<String>();
  392. fields.add("count");
  393. try {
  394. sql0 = "SELECT COUNT(DISTINCT event_no) as count FROM json_archives WHERE pack_type=1 AND org_code='" + orgCode + "' AND " + dateField +
  395. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() ;
  396. List<Map<String, Object>> resultSet0 = elasticSearchUtil.findBySql(fields, sql0);
  397. for (Map<String, Object> orgData : resultSet0) {
  398. double newValue = (double) orgData.get("count");
  399. totalInTime +=newValue;
  400. }
  401. logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
  402. } catch (Exception e) {
  403. if (!"Error".equals(e.getMessage())) {
  404. e.printStackTrace();
  405. }
  406. }
  407. }
  408. return totalInTime;
  409. }
  410. public Map<String, Object> genVisitMap(String typeField, double value, double total) {
  411. Map<String, Object> map = new HashMap<>();
  412. map.put("name", typeField);
  413. map.put("value", value);
  414. map.put("rate", calRate(value,total));
  415. return map;
  416. }
  417. /**
  418. * 批量更新es中的区域编码org_area
  419. * (通过机构编码org_code 更新org_area)
  420. */
  421. public long bulkUpdateOrgArea(String index,String type,String filters){
  422. long page = 0;
  423. long count = elasticSearchUtil.count(index, type, filters);
  424. if (count >10000) {
  425. page = count/10000 + 1;
  426. }else {
  427. page = 1;
  428. }
  429. for (int i = 1;i<=page;i++) {
  430. Page<Map<String, Object>> result = elasticSearchUtil.page(index, type, filters, i, 10000);
  431. List<Map<String, Object>> updateSourceList = new ArrayList<>();
  432. result.forEach(item -> {
  433. Map<String, Object> updateSource = new HashMap<>();
  434. updateSource.put("_id", item.get("_id"));
  435. String orgCode = (String) item.get("org_code");
  436. String orgArea = redisClient.get("organizations:" + orgCode + ":area");
  437. updateSource.put("org_area", orgArea);
  438. updateSourceList.add(updateSource);
  439. });
  440. if (!updateSourceList.isEmpty()) {
  441. elasticSearchUtil.bulkUpdate(index, type, updateSourceList);
  442. }
  443. }
  444. return count;
  445. }
  446. /* ******************************** 区域层级模块相关 ***********************************/
  447. /**
  448. * 获取市区域的下级区域质控情况
  449. * @param dataType 数据维度 (0: 完整性,1:及时性,2:准确性)
  450. * @param start
  451. * @param end
  452. * @return
  453. */
  454. public List<Map<String,Object>> findAreaData(Integer dataType, String start, String end) throws Exception {
  455. List<Map<String,Object>> list = new ArrayList<>();
  456. String dateStr = DateUtil.toString(new Date());
  457. if (StringUtils.isBlank(start)) {
  458. start = dateStr;
  459. }
  460. if (StringUtils.isBlank(end)) {
  461. end = dateStr;
  462. }
  463. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(dataType));
  464. list = dataQualityBaseService.getAreaDataQuality(0,start,end);
  465. return list;
  466. }
  467. /* ******************************** 机构 层级模块相关 ***********************************/
  468. /**
  469. * 获取区县下的机构质控情况
  470. * @param dataType 数据维度 (0: 完整性,1:及时性,2:准确性)
  471. * @param areaCode 上区域编码
  472. * @param start
  473. * @param end
  474. * @return
  475. */
  476. public List<Map<String,Object>> findOrgData(Integer dataType , String areaCode, String start, String end) throws Exception {
  477. List<Map<String,Object>> list = new ArrayList<>();
  478. String dateStr = DateUtil.toString(new Date());
  479. if (StringUtils.isBlank(start)) {
  480. start = dateStr;
  481. }
  482. if (StringUtils.isBlank(end)) {
  483. end = dateStr;
  484. }
  485. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(dataType));
  486. list = dataQualityBaseService.getOrgDataQuality(1,areaCode,start,end);
  487. return list;
  488. }
  489. /**
  490. * 首页错误数据集
  491. * @param orgCode
  492. * @param dataType
  493. * @param start
  494. * @param end
  495. * @return
  496. * @throws Exception
  497. */
  498. public List<Map<String,Object>> homeDatasetError(String orgArea, String orgCode, Integer dataType, String start, String end) throws Exception {
  499. List<String> fileds = new ArrayList<>();
  500. fileds.add("dataset");
  501. fileds.add("count");
  502. fileds.add("version");
  503. StringBuffer sql = new StringBuffer();
  504. sql.append("SELECT dataset,COUNT(dataset) count ,version FROM json_archives_qc/qc_metadata_info ");
  505. sql.append(" WHERE receive_date>='" + start + " 00:00:00' and (qc_step=1 or qc_step=2) and receive_date<='" + end + " 23:59:59'");
  506. if(StringUtils.isNotEmpty(orgArea)){
  507. sql.append(" AND org_area = '"+orgArea+"'");
  508. }
  509. if(StringUtils.isNotEmpty(orgCode)){
  510. sql.append(" AND org_code = '"+orgCode+"'");
  511. }
  512. if(dataType == 0){
  513. sql.append(" AND qc_error_type=1");
  514. }else{
  515. sql.append(" AND qc_error_type<>1");
  516. }
  517. sql.append(" group by dataset,version");
  518. List<Map<String,Object>> list = elasticSearchUtil.findBySql(fileds,sql.toString());
  519. for(Map<String,Object> map:list){
  520. map.put("dataset_name", redisClient.get("std_data_set_" + map.get("version") + ":" + map.get("dataset") + ":name"));
  521. }
  522. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(1));
  523. dataQualityBaseService.comparator(list,"count",1);//降序排序
  524. return list;
  525. }
  526. /**
  527. * 首页错误数据元
  528. * @param dataset
  529. * @param dataType
  530. * @param start
  531. * @param end
  532. * @return
  533. * @throws Exception
  534. */
  535. public List<Map<String,Object>> homeMetadataError(String orgArea, String orgCode, String dataset ,Integer dataType,String start,String end) throws Exception {
  536. List<String> fileds = new ArrayList<>();
  537. fileds.add("dataset");
  538. fileds.add("metadata");
  539. fileds.add("count");
  540. fileds.add("version");
  541. StringBuffer sql = new StringBuffer();
  542. sql.append("SELECT dataset, metadata,COUNT(metadata) count ,version FROM json_archives_qc/qc_metadata_info ");
  543. sql.append(" WHERE receive_date>='" + start + " 00:00:00' and (qc_step=1 or qc_step=2) and receive_date<='" + end + " 23:59:59'");
  544. if(StringUtils.isNotEmpty(orgArea)){
  545. sql.append(" AND org_area = '"+orgArea+"'");
  546. }
  547. if(StringUtils.isNotEmpty(orgCode)){
  548. sql.append(" AND org_code = '"+orgCode+"'");
  549. }
  550. if(StringUtils.isNotEmpty(dataset)){
  551. sql.append(" AND dataset = '"+dataset+"'");
  552. }
  553. if(dataType == 0){
  554. sql.append(" AND qc_error_type=1");
  555. }else{
  556. sql.append(" AND qc_error_type<>1");
  557. }
  558. sql.append(" group by dataset,metadata,version");
  559. List<Map<String,Object>> list = elasticSearchUtil.findBySql(fileds,sql.toString());
  560. for(Map<String,Object> map:list){
  561. map.put("metadata_name", redisClient.get("std_meta_data_" + map.get("version") + ":" + map.get("dataset")+"."+ map.get("metadata")+ ":name"));
  562. }
  563. DataQualityBaseService dataQualityBaseService = getInstance(DqDataType.create(1));
  564. dataQualityBaseService.comparator(list,"count",1);//降序排序
  565. return list;
  566. }
  567. }