ExamStatisticsService.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package com.yihu.ehr.svrinspection.service;
  2. import com.yihu.ehr.model.geography.MGeographyDict;
  3. import com.yihu.ehr.model.org.MOrganization;
  4. import com.yihu.ehr.profile.core.ResourceCore;
  5. import com.yihu.ehr.solr.SolrUtil;
  6. import com.yihu.ehr.svrinspection.commons.exception.ManageException;
  7. import com.yihu.ehr.svrinspection.commons.service.BaseService;
  8. import com.yihu.ehr.svrinspection.feign.AddressClient;
  9. import com.yihu.ehr.util.datetime.DateUtil;
  10. import com.yihu.ehr.util.log.LogService;
  11. import org.apache.commons.lang.StringUtils;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Component;
  14. import java.util.*;
  15. /**
  16. * 检验数据统计-solr
  17. * @author HZY
  18. * @created 2018/11/15 14:01
  19. */
  20. @Component
  21. public class ExamStatisticsService extends BaseService {
  22. private static String core = ResourceCore.SubTable;
  23. @Autowired
  24. private AddressClient addressClient;
  25. @Autowired
  26. private SolrUtil solrUtil;
  27. @Autowired
  28. private AssistanceApplyService assistanceApplyService;
  29. /**
  30. * 区域检验统计分布
  31. *
  32. * @param pid 上级区域编码
  33. * @param field 分组字段
  34. * @param eventDate
  35. * @return
  36. * @throws Exception
  37. */
  38. public List<Map<String,Object>> areaGroupCount(Integer pid, String field, String eventDate) throws Exception {
  39. List<Map<String,Object>> resultList = new ArrayList<>();
  40. StringBuilder fq = new StringBuilder();
  41. Map<String, Long> result = new TreeMap<>();
  42. String q = "(rowkey:*HDSD00_79* OR rowkey:*HDSD00_77*)";//solr细表中的检查检验
  43. if (StringUtils.isBlank(eventDate)) {
  44. LogService.getLogger().error("eventDate is null,check your params");
  45. throw new Exception("eventDate is null,check your params");
  46. }
  47. //事件日期
  48. fq.append("event_date:[" + eventDate + "T00:00:00Z TO " + eventDate + "T23:59:59Z]");
  49. //统计查询
  50. Map<String, Long> facetField = solrUtil.groupCount(core,q, fq.toString(),field, 0, -1);
  51. //获取区县列表
  52. List<MGeographyDict> addressList = addressClient.getAddressDictByPid(pid);
  53. addressList.stream().forEach(address ->{
  54. Map<String,Object> areaData = areaData = new HashMap<>();
  55. areaData.put("areaCode",address.getPid());
  56. areaData.put("areaName",address.getName());
  57. if (facetField.get(String.valueOf(address.getId())) == null) {
  58. areaData.put("count",0);
  59. }else {
  60. areaData.put("count",facetField.get(String.valueOf(address.getId())));
  61. }
  62. resultList.add(areaData);
  63. });
  64. comparator(resultList,"count");
  65. return resultList;
  66. }
  67. /**
  68. * 医院检验统计分布
  69. *
  70. * @param areaCode 区域编码
  71. * @param field 分组字段
  72. * @param eventDate 事件时间
  73. * @return
  74. * @throws Exception
  75. */
  76. public List<Map<String,Object>> hospitalGroupCount(String areaCode, String field, String eventDate) throws Exception {
  77. List<Map<String,Object>> resultList = new ArrayList<>();
  78. StringBuilder fq = new StringBuilder();
  79. String q = "(rowkey:*HDSD00_79* OR rowkey:*HDSD00_77*)";//solr细表中的检查检验
  80. if (StringUtils.isBlank(areaCode)) {
  81. throw new ManageException("areaCode is null,check your params");
  82. }
  83. if (StringUtils.isBlank(eventDate)) {
  84. throw new ManageException("eventDate is null,check your params");
  85. }
  86. //区域编码
  87. fq.append("org_area:"+areaCode);
  88. //事件日期
  89. fq.append(" && event_date:[" + eventDate + "T00:00:00Z TO " + eventDate + "T23:59:59Z]");
  90. //统计查询
  91. Map<String, Long> facetField = solrUtil.groupCount(core,q, fq.toString(),field, 0, -1);
  92. //获取区县列表
  93. List<MOrganization> addressList = addressClient.getOrganizationByAreaCode(areaCode);
  94. addressList.stream().forEach(organization ->{
  95. //只显示有检验数的医院
  96. if (facetField.get(organization.getOrgCode()) != null) {
  97. Map<String,Object> areaData = areaData = new HashMap<>();
  98. areaData.put("orgCode",organization.getOrgCode());
  99. areaData.put("orgName",organization.getFullName());
  100. areaData.put("count",facetField.get(organization.getOrgCode()));
  101. resultList.add(areaData);
  102. }
  103. });
  104. comparator(resultList,"count");
  105. return resultList;
  106. }
  107. /**
  108. * 区域检验数统计
  109. *
  110. * TODO 累计数和新增数先从solr获取,后期考虑是否同步到mysql中
  111. * @param areaCode
  112. * @param eventDate
  113. * @return
  114. */
  115. public Map<String,Object> areaExamStatistics(String areaCode, String eventDate) throws Exception {
  116. Map<String,Object> result = new HashMap<>();
  117. //累计检验数
  118. long total = totalCount(areaCode, eventDate);
  119. //今日新增数
  120. long today = todayIncreaseCount(areaCode);
  121. //已申请数
  122. long apply = assistanceApplyService.toDayCount(0);
  123. //已处理数
  124. long solution = assistanceApplyService.toDayCount(1);
  125. //业务分布
  126. List<Map<String, Object>> list = examEventRanking(areaCode, eventDate);
  127. result.put("total",total);
  128. result.put("increase",today);
  129. result.put("applied",apply);
  130. result.put("solution",solution);
  131. result.put("eventPercentage",solution);
  132. return result;
  133. }
  134. /**
  135. * solr 获取检验累计总数
  136. *
  137. * @param areaCode 区域编码
  138. * @param eventDate 时间
  139. * @return
  140. * @throws ManageException
  141. */
  142. public long totalCount(String areaCode, String eventDate) throws ManageException {
  143. long total = 0;
  144. StringBuilder fq = new StringBuilder();
  145. String q = "(rowkey:*HDSD00_79* OR rowkey:*HDSD00_77*)";//solr细表中的检查检验
  146. if (!StringUtils.isBlank(areaCode)) {
  147. //区域编码
  148. fq.append("org_area:"+areaCode);
  149. }
  150. if (StringUtils.isBlank(eventDate)) {
  151. throw new ManageException("eventDate is null,check your params");
  152. }
  153. //事件日期
  154. fq.append(" && event_date:[" + eventDate + "T00:00:00Z TO " + eventDate + "T23:59:59Z]");
  155. //统计查询
  156. try {
  157. total = solrUtil.count(core,q, fq.toString());
  158. } catch (Exception e) {
  159. throw new ManageException("获取累计统计数异常",e);
  160. }
  161. return total;
  162. }
  163. /**
  164. * 今日新增检验数
  165. *
  166. * @param areaCode 区域编码
  167. * @return
  168. * @throws ManageException
  169. */
  170. public long todayIncreaseCount(String areaCode) throws ManageException {
  171. long total = 0;
  172. StringBuilder fq = new StringBuilder();
  173. String q = "(rowkey:*HDSD00_79* OR rowkey:*HDSD00_77*)";//solr细表中的检查检验
  174. if (!StringUtils.isBlank(areaCode)) {
  175. //区域编码
  176. fq.append("org_area:"+areaCode);
  177. }
  178. String createDate = DateUtil.getNowDate(DateUtil.DEFAULT_DATE_YMD_FORMAT);
  179. //创建日期
  180. fq.append(" && create_date:[" + createDate + "T00:00:00Z TO " + createDate + "T23:59:59Z]");
  181. //统计查询
  182. try {
  183. total = solrUtil.count(core,q, fq.toString());
  184. } catch (Exception e) {
  185. throw new ManageException("获取今日新增档案数异常",e);
  186. }
  187. return total;
  188. }
  189. /**
  190. * 检验次数业务分布
  191. *
  192. * @param areaCode 区域编码
  193. * @param eventDate 时间
  194. * @return
  195. * @throws Exception
  196. */
  197. public List<Map<String,Object>> examEventRanking(String areaCode, String eventDate) throws Exception {
  198. List<Map<String,Object>> resultList = new ArrayList<>();
  199. StringBuilder fq = new StringBuilder();
  200. String q = "(rowkey:*HDSD00_79* OR rowkey:*HDSD00_77*)";//solr细表中的检查检验
  201. if (StringUtils.isBlank(areaCode)) {
  202. throw new ManageException("areaCode is null,check your params");
  203. }
  204. if (StringUtils.isBlank(eventDate)) {
  205. throw new ManageException("eventDate is null,check your params");
  206. }
  207. //区域编码
  208. fq.append("org_area:"+areaCode);
  209. //事件日期
  210. fq.append(" && event_date:[" + eventDate + "T00:00:00Z TO " + eventDate + "T23:59:59Z]");
  211. //统计查询
  212. Map<String, Long> facetField = solrUtil.groupCount(core,q, fq.toString(),"event_type", 0, -1);
  213. comparator(resultList,"count");
  214. return resultList;
  215. }
  216. }