ConsoleByDeptFacade.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.diagbot.dto.DeptBaseDTO;
  4. import com.diagbot.dto.DeptEntryNumDTO;
  5. import com.diagbot.dto.DeptNumDTO;
  6. import com.diagbot.dto.HomePageNumDTO;
  7. import com.diagbot.dto.LevelStatisticsDTO;
  8. import com.diagbot.dto.NumDTO;
  9. import com.diagbot.dto.QcResultShortDTO;
  10. import com.diagbot.util.BeanUtil;
  11. import com.diagbot.util.EntityUtil;
  12. import com.diagbot.util.ListUtil;
  13. import com.diagbot.util.StringUtil;
  14. import com.diagbot.util.SysUserUtils;
  15. import com.diagbot.vo.FilterOrderByDeptVO;
  16. import com.diagbot.vo.FilterPageByDeptVO;
  17. import com.diagbot.vo.FilterVO;
  18. import com.diagbot.vo.QcResultShortPageVO;
  19. import com.diagbot.vo.QcresultFilterVO;
  20. import com.google.common.collect.Lists;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Component;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.text.DecimalFormat;
  26. import java.util.Collections;
  27. import java.util.Comparator;
  28. import java.util.HashMap;
  29. import java.util.LinkedHashMap;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.stream.Collectors;
  33. /**
  34. * @Description:主任医生相关首页
  35. * @Author:zhaops
  36. * @time: 2020/5/8 17:05
  37. */
  38. @Component
  39. public class ConsoleByDeptFacade {
  40. @Autowired
  41. private BehospitalInfoFacade behospitalInfoFacade;
  42. @Autowired
  43. private QcresultInfoFacade qcresultInfoFacade;
  44. @Autowired
  45. private BasDeptInfoFacade basDeptInfoFacade;
  46. @Autowired
  47. private FilterFacade filterFacade;
  48. @Autowired
  49. private QcCasesFacade qcCasesFacade;
  50. /**
  51. * 出院人数统计-按科室
  52. *
  53. * @param filterVO
  54. * @return
  55. */
  56. public Map<String, Object> leaveHosCountByDept(FilterVO filterVO) {
  57. Map<String, Object> retMap = new LinkedHashMap<>();
  58. filterFacade.filterVOSet(filterVO);
  59. //关联科室
  60. Map<String, Object> deptMap = getDeptByUser(filterVO);
  61. if (deptMap == null) {
  62. return retMap;
  63. }
  64. //出院总人数
  65. List<NumDTO> totleNumList = behospitalInfoFacade.leaveHosCountByDept(filterVO);
  66. Map<String, NumDTO> totleMap = ListUtil.isEmpty(totleNumList)
  67. ? new HashMap<>()
  68. : EntityUtil.makeEntityMap(totleNumList, "name");
  69. //新生儿人数
  70. List<NumDTO> newBornNumList = behospitalInfoFacade.newBornCountByDept(filterVO);
  71. Map<String, NumDTO> newBornMap = ListUtil.isEmpty(newBornNumList)
  72. ? new HashMap<>()
  73. : EntityUtil.makeEntityMap(newBornNumList, "name");
  74. //死亡人数
  75. List<NumDTO> deathNumList = behospitalInfoFacade.deathCountByDept(filterVO);
  76. Map<String, NumDTO> deathMap = ListUtil.isEmpty(deathNumList)
  77. ? new HashMap<>()
  78. : EntityUtil.makeEntityMap(deathNumList, "name");
  79. //手术人数
  80. List<NumDTO> operationNumList = behospitalInfoFacade.operationCountByDept(filterVO);
  81. Map<String, NumDTO> operationMap = ListUtil.isEmpty(operationNumList)
  82. ? new HashMap<>()
  83. : EntityUtil.makeEntityMap(operationNumList, "name");
  84. for (String deptName : deptMap.keySet()) {
  85. Map<String, Object> map = new LinkedHashMap<>();
  86. map.put("总人数", 0);
  87. map.put("死亡人数", 0);
  88. map.put("手术病人数", 0);
  89. if (totleMap.containsKey(deptName)) {
  90. map.put("总人数", totleMap.get(deptName).getNum());
  91. }
  92. if (deathMap.containsKey(deptName)) {
  93. map.put("死亡人数", deathMap.get(deptName).getNum());
  94. }
  95. if (operationMap.containsKey(deptName)) {
  96. map.put("手术病人数", operationMap.get(deptName).getNum());
  97. }
  98. retMap.put(deptName, map);
  99. }
  100. return retMap;
  101. }
  102. /**
  103. * 病历数统计-按科室
  104. *
  105. * @param filterVO
  106. * @return
  107. */
  108. public Map<String, Object> mrCountByDept(FilterVO filterVO) {
  109. DecimalFormat df = new DecimalFormat("#0.00");
  110. Map<String, Object> retMap = new LinkedHashMap<>();
  111. filterFacade.filterVOSet(filterVO);
  112. QcresultFilterVO qcresultFilterVO = new QcresultFilterVO();
  113. BeanUtil.copyProperties(filterVO, qcresultFilterVO);
  114. //关联科室
  115. Map<String, Object> deptMap = getDeptByUser(filterVO);
  116. if (deptMap == null) {
  117. return retMap;
  118. }
  119. //质控病历总数
  120. List<NumDTO> totleNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
  121. Map<String, NumDTO> totleMap = ListUtil.isEmpty(totleNumList)
  122. ? new HashMap<>()
  123. : EntityUtil.makeEntityMap(totleNumList, "name");
  124. //甲级病历
  125. qcresultFilterVO.setLevel("甲");
  126. List<NumDTO> firstNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
  127. Map<String, NumDTO> firstMap = ListUtil.isEmpty(firstNumList)
  128. ? new HashMap<>()
  129. : EntityUtil.makeEntityMap(firstNumList, "name");
  130. //乙级病历
  131. qcresultFilterVO.setLevel("乙");
  132. List<NumDTO> secondNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
  133. Map<String, NumDTO> secondMap = ListUtil.isEmpty(secondNumList)
  134. ? new HashMap<>()
  135. : EntityUtil.makeEntityMap(secondNumList, "name");
  136. //丙级病历
  137. qcresultFilterVO.setLevel("丙");
  138. List<NumDTO> thirdNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
  139. Map<String, NumDTO> thirdMap = ListUtil.isEmpty(thirdNumList)
  140. ? new HashMap<>()
  141. : EntityUtil.makeEntityMap(thirdNumList, "name");
  142. for (String deptName : deptMap.keySet()) {
  143. List<NumDTO> retList = Lists.newLinkedList();
  144. int totleNum = 0;
  145. int firstLevelNum = 0;
  146. int secondLevelNum = 0;
  147. int thirdLevelNum = 0;
  148. if (totleMap.containsKey(deptName)) {
  149. totleNum = totleMap.get(deptName).getNum();
  150. }
  151. if (firstMap.containsKey(deptName)) {
  152. firstLevelNum = firstMap.get(deptName).getNum();
  153. }
  154. if (secondMap.containsKey(deptName)) {
  155. secondLevelNum = secondMap.get(deptName).getNum();
  156. }
  157. if (thirdMap.containsKey(deptName)) {
  158. thirdLevelNum = thirdMap.get(deptName).getNum();
  159. }
  160. //总病历数为0
  161. if (totleNum == 0) {
  162. retMap.put(deptName, Lists.newLinkedList());
  163. continue;
  164. }
  165. NumDTO totleNumDTO = new NumDTO();
  166. totleNumDTO.setName("累计质控病历数");
  167. totleNumDTO.setTotleNum(totleNum);
  168. totleNumDTO.setNum(totleNum);
  169. NumDTO firstLevelNumDTO = new NumDTO();
  170. firstLevelNumDTO.setName("甲级病历");
  171. firstLevelNumDTO.setNum(firstLevelNum);
  172. firstLevelNumDTO.setTotleNum(totleNum);
  173. Double firstPercent = BigDecimal.valueOf(firstLevelNum)
  174. .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
  175. .doubleValue();
  176. String firstPercentStr = df.format(BigDecimal.valueOf(firstPercent).multiply(BigDecimal.valueOf(100))) + "%";
  177. firstLevelNumDTO.setPercent(firstPercent);
  178. firstLevelNumDTO.setPercentStr(firstPercentStr);
  179. NumDTO secondLevelNumDTO = new NumDTO();
  180. secondLevelNumDTO.setName("乙级病历");
  181. secondLevelNumDTO.setNum(secondLevelNum);
  182. secondLevelNumDTO.setTotleNum(totleNum);
  183. Double secondPercent = BigDecimal.valueOf(secondLevelNum)
  184. .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
  185. .doubleValue();
  186. String secondPercentStr = df.format(BigDecimal.valueOf(secondPercent).multiply(BigDecimal.valueOf(100))) + "%";
  187. secondLevelNumDTO.setPercent(secondPercent);
  188. secondLevelNumDTO.setPercentStr(secondPercentStr);
  189. NumDTO thirdLevelNumDTO = new NumDTO();
  190. thirdLevelNumDTO.setName("丙级病历");
  191. thirdLevelNumDTO.setNum(thirdLevelNum);
  192. thirdLevelNumDTO.setTotleNum(totleNum);
  193. Double thirdPercent = BigDecimal.valueOf(thirdLevelNum)
  194. .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
  195. .doubleValue();
  196. String thirdPercentStr = df.format(BigDecimal.valueOf(thirdPercent).multiply(BigDecimal.valueOf(100))) + "%";
  197. thirdLevelNumDTO.setPercent(thirdPercent);
  198. thirdLevelNumDTO.setPercentStr(thirdPercentStr);
  199. retList.add(totleNumDTO);
  200. retList.add(firstLevelNumDTO);
  201. retList.add(secondLevelNumDTO);
  202. retList.add(thirdLevelNumDTO);
  203. retMap.put(deptName, retList);
  204. }
  205. return retMap;
  206. }
  207. /**
  208. * 各模块缺陷占比排名-按科室
  209. *
  210. * @param filterVO
  211. * @return
  212. */
  213. public Map<String, Object> entryCountGroupByCaseAndDept(FilterVO filterVO) {
  214. DecimalFormat df = new DecimalFormat("#0.00");
  215. Map<String, Object> retMap = new LinkedHashMap<>();
  216. filterFacade.filterVOSet(filterVO);
  217. if (filterVO.getLimitCount() == null || filterVO.getLimitCount().equals(0)) {
  218. filterVO.setLimitCount(10);
  219. }
  220. Integer limitCount = filterVO.getLimitCount();
  221. QcresultFilterVO qcresultFilterVO = new QcresultFilterVO();
  222. BeanUtil.copyProperties(filterVO, qcresultFilterVO);
  223. //关联科室
  224. Map<String, Object> deptMap = getDeptByUser(filterVO);
  225. if (deptMap == null) {
  226. return retMap;
  227. }
  228. List<NumDTO> mrNumList = qcresultInfoFacade.resultCountByDept(qcresultFilterVO);
  229. Map<String, NumDTO> mrMap = ListUtil.isEmpty(mrNumList)
  230. ? new HashMap<>()
  231. : EntityUtil.makeEntityMap(mrNumList, "name");
  232. List<DeptNumDTO> qcEntryNumList = qcresultInfoFacade.entryCountGroupByCaseAndDept(filterVO);
  233. Map<String, List<DeptNumDTO>> qcEntryMap = ListUtil.isEmpty(qcEntryNumList)
  234. ? new HashMap<>()
  235. : EntityUtil.makeEntityListMap(qcEntryNumList, "deptName");
  236. List<NumDTO> standardEntryNumList = qcCasesFacade.entryGroupByCase();
  237. Map<String, NumDTO> standardMap = ListUtil.isEmpty(standardEntryNumList)
  238. ? new HashMap<>()
  239. : EntityUtil.makeEntityMap(standardEntryNumList, "name");
  240. for (String deptName : deptMap.keySet()) {
  241. //没有质控病历
  242. if (!mrMap.containsKey(deptName)) {
  243. retMap.put(deptName, Lists.newLinkedList());
  244. continue;
  245. }
  246. //病历数
  247. Integer mrNum = mrMap.get(deptName).getNum();
  248. //缺陷模块条目未维护
  249. if (ListUtil.isEmpty(standardEntryNumList)) {
  250. retMap.put(deptName, Lists.newLinkedList());
  251. continue;
  252. }
  253. //没有缺陷
  254. if (!qcEntryMap.containsKey(deptName)) {
  255. retMap.put(deptName, Lists.newLinkedList());
  256. continue;
  257. }
  258. //模块缺陷
  259. List<DeptNumDTO> qcEntryNumByDeptList = qcEntryMap.get(deptName);
  260. if (ListUtil.isEmpty(qcEntryNumByDeptList)) {
  261. retMap.put(deptName, Lists.newLinkedList());
  262. continue;
  263. }
  264. List<NumDTO> retList = Lists.newLinkedList();
  265. retList = BeanUtil.listCopyTo(qcEntryNumByDeptList, NumDTO.class);
  266. retList.forEach(item -> {
  267. if (!standardMap.containsKey(item.getName())) {
  268. item.setTotleNum(0);
  269. item.setPercent(0d);
  270. item.setPercentStr("0%");
  271. } else {
  272. Integer totleNum = standardMap.get(item.getName()).getNum() * mrNum;
  273. Double percent = BigDecimal.valueOf(item.getNum())
  274. .divide(BigDecimal.valueOf(totleNum), 4, RoundingMode.HALF_UP)
  275. .doubleValue();
  276. String percentStr
  277. = df.format(BigDecimal.valueOf(percent).multiply(BigDecimal.valueOf(100))) + "%";
  278. item.setTotleNum(totleNum);
  279. item.setPercent(percent);
  280. item.setPercentStr(percentStr);
  281. }
  282. });
  283. //降序排序
  284. Collections.sort(retList, new Comparator<NumDTO>() {
  285. @Override
  286. public int compare(NumDTO o1, NumDTO o2) {
  287. return o2.getPercent().compareTo(o1.getPercent());
  288. }
  289. });
  290. //取top10
  291. retList = retList
  292. .stream()
  293. .limit(limitCount)
  294. .collect(Collectors.toList());
  295. retMap.put(deptName, retList);
  296. }
  297. return retMap;
  298. }
  299. /**
  300. * 条目缺陷占比-按科室
  301. *
  302. * @param filterVO
  303. * @return
  304. */
  305. public Map<String, Object> entryCountGroupByEntryAndDept(FilterVO filterVO) {
  306. Map<String, Object> retMap = new LinkedHashMap<>();
  307. filterFacade.filterVOSet(filterVO);
  308. Integer limitCount = filterVO.getLimitCount();
  309. //关联科室
  310. Map<String, Object> deptMap = getDeptByUser(filterVO);
  311. if (deptMap == null) {
  312. return retMap;
  313. }
  314. List<DeptNumDTO> entryList = qcresultInfoFacade.entryCountGroupByEntryAndDept(filterVO);
  315. Map<String, List<DeptNumDTO>> numListMap = ListUtil.isEmpty(entryList)
  316. ? new HashMap<>()
  317. : EntityUtil.makeEntityListMap(entryList, "deptName");
  318. for (String deptName : deptMap.keySet()) {
  319. if (!numListMap.containsKey(deptName)) {
  320. retMap.put(deptName, Lists.newLinkedList());
  321. continue;
  322. }
  323. List<DeptNumDTO> listByDept = numListMap.get(deptName);
  324. if (ListUtil.isNotEmpty(listByDept)) {
  325. //降序排序
  326. Collections.sort(listByDept, new Comparator<DeptNumDTO>() {
  327. @Override
  328. public int compare(DeptNumDTO o1, DeptNumDTO o2) {
  329. return o2.getPercent().compareTo(o1.getPercent());
  330. }
  331. });
  332. if (listByDept.size() <= limitCount) {
  333. retMap.put(deptName, listByDept);
  334. } else {
  335. retMap.put(deptName, listByDept.subList(0, limitCount));
  336. }
  337. }
  338. }
  339. return retMap;
  340. }
  341. /**
  342. * 用户关联科室
  343. *
  344. * @param filterVO
  345. * @return
  346. */
  347. public Map<String, Object> getDeptByUser(FilterVO filterVO) {
  348. List<DeptBaseDTO> deptList = basDeptInfoFacade.getDeptByUser(filterVO);
  349. if (ListUtil.isNotEmpty(deptList)) {
  350. return EntityUtil.makeMapWithKeyValue(deptList, "deptName", "deptId");
  351. } else {
  352. return null;
  353. }
  354. }
  355. /**
  356. * 获取关联科室
  357. *
  358. * @param
  359. * @return
  360. */
  361. public List<DeptBaseDTO> getDept() {
  362. FilterVO filterVO = new FilterVO();
  363. String hospitalId = SysUserUtils.getCurrentHospitalID();
  364. String userId = SysUserUtils.getCurrentPrincipleID();
  365. filterVO.setHospitalId(hospitalId);
  366. filterVO.setUserId(Long.valueOf(userId));
  367. List<DeptBaseDTO> deptList = basDeptInfoFacade.getDeptByUser(filterVO);
  368. return deptList;
  369. }
  370. /**
  371. * 各模块缺陷占比-科室(分页)
  372. *
  373. * @param filterPageByDeptVO
  374. * @return
  375. */
  376. public IPage<DeptNumDTO> entryCountGroupByCaseAndDeptPage(FilterPageByDeptVO filterPageByDeptVO) {
  377. if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
  378. List<DeptBaseDTO> deptList = this.getDept();
  379. //默认取第一个科室
  380. if (ListUtil.isNotEmpty(deptList)) {
  381. filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
  382. }
  383. }
  384. filterFacade.filterPageByDeptVOSet(filterPageByDeptVO);
  385. IPage<DeptNumDTO> page = qcresultInfoFacade.entryCountGroupByCaseAndDeptPage(filterPageByDeptVO);
  386. return page;
  387. }
  388. /**
  389. * 缺陷详情-科室(分页)
  390. *
  391. * @param filterPageByDeptVO
  392. * @return
  393. */
  394. public IPage<DeptEntryNumDTO> entryCountGroupByEntryAndDeptPage(FilterPageByDeptVO filterPageByDeptVO) {
  395. if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
  396. List<DeptBaseDTO> deptList = this.getDept();
  397. //默认取第一个科室
  398. if (ListUtil.isNotEmpty(deptList)) {
  399. filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
  400. }
  401. }
  402. if (filterPageByDeptVO.getDeptName().equals(filterPageByDeptVO.getDoctorName())) {
  403. filterPageByDeptVO.setDoctorName("");
  404. }
  405. filterFacade.filterPageByDeptVOSet(filterPageByDeptVO);
  406. IPage<DeptEntryNumDTO> page = qcresultInfoFacade.entryCountGroupByEntryAndDeptPage(filterPageByDeptVO);
  407. return page;
  408. }
  409. /**
  410. * 缺陷明细-科室(分页)
  411. *
  412. * @param filterPageByDeptVO
  413. * @return
  414. */
  415. public IPage<DeptNumDTO> resultStatisticsByDeptAndDoctorPage(FilterPageByDeptVO filterPageByDeptVO) {
  416. if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
  417. List<DeptBaseDTO> deptList = this.getDept();
  418. //默认取第一个科室
  419. if (ListUtil.isNotEmpty(deptList)) {
  420. filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
  421. }
  422. }
  423. filterFacade.filterPageByDeptVOSet(filterPageByDeptVO);
  424. IPage<DeptNumDTO> page = behospitalInfoFacade.resultStatisticsByDeptAndDoctorPage(filterPageByDeptVO);
  425. return page;
  426. }
  427. /**
  428. * 条目缺陷占比-科室(内页)
  429. *
  430. * @param filterPageByDeptVO
  431. * @return
  432. */
  433. public IPage<DeptEntryNumDTO> entryGroupByEntryAndDeptInnerPage(FilterPageByDeptVO filterPageByDeptVO) {
  434. if (StringUtil.isBlank(filterPageByDeptVO.getDeptName())) {
  435. List<DeptBaseDTO> deptList = this.getDept();
  436. //默认取第一个科室
  437. if (ListUtil.isNotEmpty(deptList)) {
  438. filterPageByDeptVO.setDeptName(deptList.get(0).getDeptName());
  439. }
  440. }
  441. filterFacade.filterPageByDeptVOSet(filterPageByDeptVO);
  442. IPage<DeptEntryNumDTO> page = qcresultInfoFacade.entryGroupByEntryAndDeptInnerPage(filterPageByDeptVO);
  443. return page;
  444. }
  445. /**
  446. * 各科室缺陷占比(组合)
  447. *
  448. * @param filterOrderByDeptVO
  449. * @return
  450. */
  451. public List<LevelStatisticsDTO> levelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO) {
  452. List<DeptBaseDTO> deptList = getDept();
  453. if (ListUtil.isEmpty(deptList)) {
  454. return null;
  455. }
  456. if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())) {
  457. filterOrderByDeptVO.setDeptName(deptList.get(0).getDeptName());
  458. }
  459. filterFacade.filterOrderByDeptVOSet(filterOrderByDeptVO);
  460. List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatisticsByDept(filterOrderByDeptVO);
  461. return records;
  462. }
  463. /**
  464. * 病案首页合格率占比
  465. *
  466. * @param filterOrderByDeptVO
  467. * @return
  468. */
  469. public List<HomePageNumDTO> homePageLevelStatisticsByDept(FilterOrderByDeptVO filterOrderByDeptVO) {
  470. List<DeptBaseDTO> deptList = getDept();
  471. if (ListUtil.isEmpty(deptList)) {
  472. return null;
  473. }
  474. if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())) {
  475. filterOrderByDeptVO.setDeptName(deptList.get(0).getDeptName());
  476. }
  477. filterFacade.filterOrderByDeptVOSet(filterOrderByDeptVO);
  478. List<HomePageNumDTO> records = behospitalInfoFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO);
  479. //没有医生过滤时增加全科室数据
  480. if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())
  481. || filterOrderByDeptVO.getDeptName().equals(filterOrderByDeptVO.getDeptName())) {
  482. HomePageNumDTO item = getGlobleRecord(records, filterOrderByDeptVO.getDeptName());
  483. if (item != null) {
  484. records.add(0, item);
  485. }
  486. }
  487. return records;
  488. }
  489. /**
  490. * 病案首页合格率占比(首页)
  491. *
  492. * @param filterOrderByDeptVO
  493. * @return
  494. */
  495. public List<HomePageNumDTO> homePageLevelByDeptLimit(FilterOrderByDeptVO filterOrderByDeptVO) {
  496. List<DeptBaseDTO> deptList = getDept();
  497. if (ListUtil.isEmpty(deptList)) {
  498. return null;
  499. }
  500. if (StringUtil.isBlank(filterOrderByDeptVO.getDeptName())) {
  501. filterOrderByDeptVO.setDeptName(deptList.get(0).getDeptName());
  502. }
  503. filterFacade.filterOrderByDeptVOSet(filterOrderByDeptVO);
  504. if (filterOrderByDeptVO.getLimitCount() == null || filterOrderByDeptVO.getLimitCount().equals(0)) {
  505. filterOrderByDeptVO.setLimitCount(10);
  506. }
  507. List<HomePageNumDTO> records = behospitalInfoFacade.homePageLevelStatisticsByDept(filterOrderByDeptVO);
  508. HomePageNumDTO item = getGlobleRecord(records, filterOrderByDeptVO.getDeptName());
  509. if (item != null) {
  510. records.add(0, item);
  511. }
  512. records = records
  513. .stream()
  514. .limit(filterOrderByDeptVO.getLimitCount())
  515. .collect(Collectors.toList());
  516. return records;
  517. }
  518. /**
  519. * 获取某个科室全科室数据
  520. *
  521. * @param records
  522. * @param deptName
  523. * @return
  524. */
  525. public HomePageNumDTO getGlobleRecord(List<HomePageNumDTO> records, String deptName) {
  526. DecimalFormat df = new DecimalFormat("#0.00");
  527. HomePageNumDTO item = new HomePageNumDTO();
  528. //总病历数
  529. Integer mrNum = records
  530. .stream()
  531. .map(HomePageNumDTO::getMrNum)
  532. .reduce(0, Integer::sum);
  533. if (mrNum == null || mrNum == 0) {
  534. return null;
  535. }
  536. //总缺陷数
  537. Integer entryNum = records
  538. .stream()
  539. .map(HomePageNumDTO::getEntryNum)
  540. .reduce(0, Integer::sum);
  541. //总分
  542. Double totleValue = records
  543. .stream()
  544. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  545. .reduce(BigDecimal.ZERO, BigDecimal::add)
  546. .doubleValue();
  547. //平均分
  548. Double averageValue = BigDecimal.valueOf(totleValue)
  549. .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
  550. .doubleValue();
  551. //合格病历总数
  552. Integer firstLevelNum = records
  553. .stream()
  554. .map(HomePageNumDTO::getFirstLevelNum)
  555. .reduce(0, Integer::sum);
  556. //合格病历占比
  557. Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
  558. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  559. .doubleValue();
  560. String firstLevelPercentStr
  561. = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  562. //不合格病历数
  563. Integer secondLevelNum = records
  564. .stream()
  565. .map(HomePageNumDTO::getSecondLevelNum)
  566. .reduce(0, Integer::sum);
  567. //不合格病历占比
  568. Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
  569. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  570. .doubleValue();
  571. String secondLevelPercentStr
  572. = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  573. //条目缺陷总数(模块下条目*病历数)
  574. Integer entryTotleNum = records
  575. .stream()
  576. .map(HomePageNumDTO::getEntryTotleNum)
  577. .reduce(0, Integer::sum);
  578. //空项总数
  579. Integer emptyNum = records
  580. .stream()
  581. .map(HomePageNumDTO::getEmptyNum)
  582. .reduce(0, Integer::sum);
  583. Double emptyPercent = BigDecimal.valueOf(entryTotleNum - emptyNum)
  584. .divide(BigDecimal.valueOf(entryTotleNum), 4, RoundingMode.HALF_UP)
  585. .doubleValue();
  586. String emptyPercentStr
  587. = df.format(BigDecimal.valueOf(emptyPercent).multiply(BigDecimal.valueOf(100))) + "%";
  588. //错误项总数
  589. Integer errorNum = records
  590. .stream()
  591. .map(HomePageNumDTO::getErrorNum)
  592. .reduce(0, Integer::sum);
  593. Double errorPercent = BigDecimal.valueOf(entryTotleNum - errorNum)
  594. .divide(BigDecimal.valueOf(entryTotleNum), 4, RoundingMode.HALF_UP)
  595. .doubleValue();
  596. String errorPercentStr
  597. = df.format(BigDecimal.valueOf(errorPercent).multiply(BigDecimal.valueOf(100))) + "%";
  598. item.setDoctorName(deptName);
  599. item.setEntryNum(entryNum);
  600. item.setMrNum(mrNum);
  601. item.setTotleValue(totleValue);
  602. item.setAverageValue(averageValue);
  603. item.setFirstLevelNum(firstLevelNum);
  604. item.setFirstLevelPercent(firstLevelPercent);
  605. item.setFirstLevelPercentStr(firstLevelPercentStr);
  606. item.setSecondLevelNum(secondLevelNum);
  607. item.setSecondLevelPercent(secondLevelPercent);
  608. item.setSecondLevelPercentStr(secondLevelPercentStr);
  609. item.setEntryTotleNum(entryTotleNum);
  610. item.setEmptyNum(emptyNum);
  611. item.setEmptyPercent(emptyPercent);
  612. item.setEmptyPercentStr(emptyPercentStr);
  613. item.setErrorNum(errorNum);
  614. item.setErrorPercent(errorPercent);
  615. item.setErrorPercentStr(errorPercentStr);
  616. return item;
  617. }
  618. /**
  619. * 条目缺陷质控评分页-科室(内页)
  620. *
  621. * @param qcResultShortPageVO
  622. * @return
  623. */
  624. public IPage<QcResultShortDTO> qcResultShortByDeptPage(QcResultShortPageVO qcResultShortPageVO) {
  625. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  626. IPage<QcResultShortDTO> page = behospitalInfoFacade.qcResultShortByDeptPage(qcResultShortPageVO);
  627. return page;
  628. }
  629. }