DataInTimeService.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package com.yihu.ehr.analyze.service.dataQuality;
  2. import com.yihu.ehr.analyze.dao.DqPaltformReceiveWarningDao;
  3. import com.yihu.ehr.entity.quality.DqPaltformReceiveWarning;
  4. import com.yihu.ehr.redis.client.RedisClient;
  5. import com.yihu.ehr.util.datetime.DateUtil;
  6. import org.apache.commons.lang.StringUtils;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.stereotype.Service;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16. /**
  17. * 质控管理首页- 及时性逻辑类
  18. *
  19. * @author HZY
  20. * @created 2018/8/17 11:24
  21. */
  22. @Service
  23. public class DataInTimeService extends DataQualityBaseService {
  24. private final static Logger logger = LoggerFactory.getLogger(DataInTimeService.class);
  25. @Value("${quality.orgCode}")
  26. private String defaultOrgCode;
  27. @Value("${quality.cloud}")
  28. private String cloud;
  29. @Value("${quality.cloudName}")
  30. private String cloudName;
  31. @Autowired
  32. private RedisClient redisClient;
  33. @Autowired
  34. private DataCorrectService dataCorrectService;
  35. @Autowired
  36. private DqPaltformReceiveWarningDao dqPaltformReceiveWarningDao;
  37. /**
  38. * 获取及时接收档案数
  39. *
  40. * @param dateField 时间区间查询字段
  41. * @param start
  42. * @param end
  43. * @return
  44. */
  45. public Map<String, Object> getInTimeMap(Integer dataLevel, String dateField, String start, String end, String orgArea) {
  46. Map<String, Object> resMap = new HashMap<>();
  47. //获取有数据的医院code列表
  48. List<String> orgList = hasDataHospital(dateField, start, end);
  49. for (String orgCode : orgList) {
  50. //初始化 及时率预警信息
  51. DqPaltformReceiveWarning warning = dqPaltformReceiveWarningDao.findByOrgCode(orgCode);
  52. if (warning == null) {
  53. warning = dqPaltformReceiveWarningDao.findByOrgCode(defaultOrgCode);
  54. }
  55. long starttime = System.currentTimeMillis();
  56. String sql0 = "";
  57. List<String> fields = new ArrayList<String>();
  58. fields.add("count");
  59. fields.add("org_code");
  60. try {
  61. if (StringUtils.isNotEmpty(orgArea)) {
  62. sql0 = "SELECT COUNT(DISTINCT event_no) as count,org_code FROM json_archives WHERE pack_type=1 AND org_area='" + orgArea + "' AND " + dateField +
  63. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() + " GROUP BY org_code";
  64. } else {
  65. sql0 = "SELECT COUNT(DISTINCT event_no) as count,org_code FROM json_archives WHERE pack_type=1 AND " + dateField +
  66. " BETWEEN '" + start + " 00:00:00' AND '" + end + " 23:59:59' and delay <=" + warning.getPeInTime() + " GROUP BY org_code";
  67. }
  68. List<Map<String, Object>> resultSet0 = elasticSearchUtil.findBySql(fields, sql0);
  69. for (Map<String, Object> orgData : resultSet0) {
  70. if (dataLevel == 0) {
  71. //区域级别分组
  72. String org = orgData.get("org_code").toString();
  73. double newValue = (double) orgData.get("count");
  74. String area = redisClient.get("organizations:" + org + ":area");
  75. double oldValue = resMap.get(area) == null ? 0 : (double) resMap.get(area);
  76. resMap.put(area, oldValue + newValue);
  77. } else if (dataLevel == 1) {
  78. //机构级别分组
  79. resMap.put(orgData.get("org_code").toString(), orgData.get("count"));
  80. }
  81. }
  82. logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
  83. } catch (Exception e) {
  84. if (!"Error".equals(e.getMessage())) {
  85. e.printStackTrace();
  86. }
  87. }
  88. }
  89. return resMap;
  90. }
  91. /**
  92. * 获取及时上传数
  93. *
  94. * @param dateField 时间区间查询字段
  95. * @param start
  96. * @param end
  97. * @return
  98. */
  99. public Map<String, Object> getInTimeDataMap(Integer dataLevel, String dateField, String start, String end, String orgArea) {
  100. Map<String, Object> resMap = new HashMap<>();
  101. double totalInTime = 0;//总计就诊及时数
  102. long starttime = System.currentTimeMillis();
  103. //获取及时数组
  104. resMap = getInTimeMap(dataLevel, dateField, start, end, orgArea); //就诊及时数
  105. for (String key : resMap.keySet()) {
  106. double outpatientInTime = getDoubleValue(resMap.get(key));
  107. totalInTime += outpatientInTime; // //就诊及时性
  108. }
  109. //指定数据类型
  110. if (dataLevel == 0) {
  111. resMap.put("type", "org_area");
  112. } else {
  113. resMap.put("type", "org_code");
  114. }
  115. //总计
  116. if (!resMap.isEmpty()) {
  117. resMap.put("", totalInTime);
  118. }
  119. logger.info("平台就诊及时人数 去重复:" + (System.currentTimeMillis() - starttime) + "ms");
  120. return resMap;
  121. }
  122. /* ******************************** 区域层级模块相关 ***********************************/
  123. @Override
  124. public List<Map<String, Object>> getAreaDataQuality(Integer dataLevel, String startDate, String endDate) throws Exception {
  125. //String end = DateUtil.addDate(1, endDate, DateUtil.DEFAULT_DATE_YMD_FORMAT);
  126. Map<String, Object> resMap = null;
  127. List<Map<String, Object>> list = new ArrayList<>();
  128. double totalNum = 0;//平台总数
  129. double totalHospitalNum = 0;//医院总数
  130. //机构数据
  131. List<Map<String, Object>> groupList = dataCorrectService.getOrgDataMap(dataLevel, "event_date", startDate, endDate, null);
  132. //平台接收数据量
  133. Map<String, Object> platformDataGroup = getInTimeDataMap(dataLevel, "event_date", startDate, endDate, null);
  134. // 计算
  135. for (Map<String, Object> map : groupList) {
  136. resMap = new HashMap<String, Object>();
  137. String type = platformDataGroup.get("type").toString();
  138. String code = "";
  139. double platPormNum = 0;
  140. if ("org_area".equals(type)) {
  141. platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
  142. code = map.get("org_area").toString();
  143. } else {
  144. platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
  145. code = map.get("org_code").toString();
  146. }
  147. double orgNum = getDoubleValue(map.get("count"));
  148. double rate = calDoubleRate(platPormNum, orgNum);
  149. if (!"".equals(code)) {
  150. resMap.put("code", code);
  151. resMap.put("name", map.get("name"));
  152. resMap.put("count", platPormNum);
  153. resMap.put("total", orgNum);
  154. resMap.put("rate", rate);
  155. list.add(resMap);
  156. totalNum += platPormNum;
  157. } else {
  158. totalHospitalNum = platPormNum;
  159. }
  160. }
  161. //排序
  162. rateComparator(list);
  163. //添加总计
  164. if (totalHospitalNum != 0) {
  165. Map<String, Object> totalMap = genTotalData("上饶市", totalNum, totalHospitalNum);
  166. list.add(0, totalMap);
  167. }
  168. return list;
  169. }
  170. @Override
  171. public List<Map<String, Object>> getOrgDataQuality(Integer dataLevel, String areaCode, String startDate, String endDate) throws Exception {
  172. //String end = DateUtil.addDate(1, endDate, DateUtil.DEFAULT_DATE_YMD_FORMAT);
  173. Map<String, Object> resMap = null;
  174. List<Map<String, Object>> list = new ArrayList<>();
  175. double totalNum = 0;//平台总数
  176. double totalHospitalNum = 0;//医院总数
  177. //机构数据
  178. List<Map<String, Object>> groupList = dataCorrectService.getOrgDataMap(dataLevel, "event_date", startDate, endDate, areaCode);
  179. //平台接收数据量
  180. Map<String, Object> platformDataGroup = getInTimeDataMap(dataLevel, "event_date", startDate, endDate, areaCode);
  181. // 计算
  182. for (Map<String, Object> map : groupList) {
  183. resMap = new HashMap<String, Object>();
  184. String type = platformDataGroup.get("type").toString();
  185. String code = "";
  186. double platPormNum = 0;
  187. if ("org_area".equals(type)) {
  188. platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_area")));
  189. code = map.get("org_area").toString();
  190. } else {
  191. platPormNum = getDoubleValue(platformDataGroup.get(map.get("org_code")));
  192. code = map.get("org_code").toString();
  193. }
  194. double orgNum = getDoubleValue(map.get("count"));
  195. double rate = calDoubleRate(platPormNum, orgNum);
  196. if (!"".equals(code)) {
  197. resMap.put("code", code);
  198. resMap.put("name", map.get("name"));
  199. resMap.put("count", platPormNum);
  200. resMap.put("total", orgNum);
  201. resMap.put("rate", rate);
  202. list.add(resMap);
  203. totalNum += platPormNum;
  204. } else {
  205. totalHospitalNum = platPormNum;
  206. }
  207. }
  208. //排序
  209. rateComparator(list);
  210. //添加总计
  211. if (totalHospitalNum != 0) {
  212. Map<String, Object> totalMap = genTotalData("全部机构", totalNum, totalHospitalNum);
  213. list.add(0, totalMap);
  214. }
  215. return list;
  216. }
  217. }