ConsoleFacade.java 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394
  1. package com.diagbot.facade;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.diagbot.aggregate.AverageStatisticsAggregate;
  6. import com.diagbot.aggregate.MrStatisticsAggregate;
  7. import com.diagbot.aggregate.ResultStatisticsAggregate;
  8. import com.diagbot.dto.*;
  9. import com.diagbot.entity.QcCasesEntry;
  10. import com.diagbot.entity.SysHospitalSet;
  11. import com.diagbot.exception.CommonErrorCode;
  12. import com.diagbot.exception.CommonException;
  13. import com.diagbot.util.*;
  14. import com.diagbot.vo.*;
  15. import com.google.common.collect.Lists;
  16. import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
  17. import org.apache.ibatis.annotations.Param;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Component;
  20. import java.math.BigDecimal;
  21. import java.math.RoundingMode;
  22. import java.text.DecimalFormat;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. /**
  26. * @Description:
  27. * @Author:zhaops
  28. * @time: 2020/4/13 16:45
  29. */
  30. @Component
  31. public class ConsoleFacade {
  32. @Autowired
  33. private FilterFacade filterFacade;
  34. @Autowired
  35. private DataBeanAggregateQueryFacade dataBeanAggregateQueryFacade;
  36. @Autowired
  37. private AverageStatisticsAggregate averageStatisticsAggregate;
  38. @Autowired
  39. private MrStatisticsAggregate mrStatisticsAggregate;
  40. @Autowired
  41. private ResultStatisticsAggregate resultStatisticsAggregate;
  42. @Autowired
  43. private QcresultInfoFacade qcresultInfoFacade;
  44. @Autowired
  45. private HomePageFacade homePageFacade;
  46. @Autowired
  47. private BehospitalInfoFacade behospitalInfoFacade;
  48. @Autowired
  49. private SysHospitalSetFacade sysHospitalSetFacade;
  50. @Autowired
  51. private QcCasesEntryFacade qcCasesEntryFacade;
  52. //region-----------------------聚合接口开始-------------------------------
  53. /**
  54. * 病历相关统计
  55. *
  56. * @param filterVO
  57. * @return
  58. */
  59. public Map<String, Object> mrStatistics(FilterVO filterVO) {
  60. Map<String, Object> retMap = new LinkedHashMap<>();
  61. filterFacade.filterVOSet(filterVO);
  62. try {
  63. Map<String, Object> invokeParams = new HashMap<>();
  64. invokeParams.put("filterVO", filterVO);
  65. retMap
  66. = dataBeanAggregateQueryFacade.get("setAllMr", invokeParams, Map.class);
  67. } catch (Exception e) {
  68. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  69. }
  70. return retMap;
  71. }
  72. /**
  73. * 缺陷相关统计
  74. *
  75. * @param filterVO
  76. * @return
  77. */
  78. public Map<String, Object> resultStatistics(FilterVO filterVO) {
  79. Map<String, Object> retMap = new LinkedHashMap<>();
  80. filterFacade.filterVOSet(filterVO);
  81. try {
  82. Map<String, Object> invokeParams = new HashMap<>();
  83. invokeParams.put("filterVO", filterVO);
  84. retMap
  85. = dataBeanAggregateQueryFacade.get("setAllResult", invokeParams, Map.class);
  86. } catch (Exception e) {
  87. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  88. }
  89. return retMap;
  90. }
  91. /**
  92. * 平局值相关统计
  93. *
  94. * @param filterVO
  95. * @return
  96. */
  97. public Map<String, Object> averageStatistics(FilterVO filterVO) {
  98. Map<String, Object> retMap = new LinkedHashMap<>();
  99. filterFacade.filterVOSet(filterVO);
  100. try {
  101. Map<String, Object> invokeParams = new HashMap<>();
  102. invokeParams.put("filterVO", filterVO);
  103. retMap
  104. = dataBeanAggregateQueryFacade.get("setAllAverage", invokeParams, Map.class);
  105. } catch (Exception e) {
  106. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  107. }
  108. return retMap;
  109. }
  110. //endregion-----------------------聚合接口结束-------------------------------
  111. //region-----------------------单独接口开始-------------------------------
  112. /**
  113. * 平均住院天数
  114. *
  115. * @param filterVO
  116. * @return
  117. */
  118. public Map<String, Object> getAverageDayNum(FilterVO filterVO) {
  119. Map<String, Object> retMap = new HashMap<>();
  120. filterFacade.filterVOSet(filterVO);
  121. List<AverageStatisticsDTO> averageDayNumList = averageStatisticsAggregate.getAverageDayNum(filterVO);
  122. if (ListUtil.isNotEmpty(averageDayNumList)) {
  123. retMap.put("平均住院日", averageDayNumList);
  124. }
  125. return retMap;
  126. }
  127. /**
  128. * 平均住院费用
  129. *
  130. * @param filterVO
  131. * @return
  132. */
  133. public Map<String, Object> getAverageFee(FilterVO filterVO) {
  134. Map<String, Object> retMap = new HashMap<>();
  135. filterFacade.filterVOSet(filterVO);
  136. List<AverageStatisticsDTO> averageFeeList = averageStatisticsAggregate.getAverageFee(filterVO);
  137. if (ListUtil.isNotEmpty(averageFeeList)) {
  138. retMap.put("平均住院费用", averageFeeList);
  139. }
  140. return retMap;
  141. }
  142. /**
  143. * 质控平均分按科室统计
  144. *
  145. * @param filterVO
  146. * @return
  147. */
  148. public Map<String, Object> getAverageScore(FilterVO filterVO) {
  149. Map<String, Object> retMap = new HashMap<>();
  150. filterFacade.filterVOSet(filterVO);
  151. List<AverageStatisticsDTO> averageScoreList = averageStatisticsAggregate.getAverageScore(filterVO);
  152. if (ListUtil.isNotEmpty(averageScoreList)) {
  153. retMap.put("各科室质控平均分", averageScoreList);
  154. }
  155. return retMap;
  156. }
  157. /**
  158. * 各科室质控平均分(首页)-根据内外科系统统计
  159. *
  160. * @param filterVO
  161. * @return
  162. */
  163. public List<AverageStatisticsDTO> getAverageScoreByDeptClass(FilterVO filterVO) {
  164. filterFacade.filterVOSet(filterVO);
  165. List<AverageStatisticsDTO> retAverageScoreList = Lists.newLinkedList();
  166. List<AverageStatisticsDTO> averageScoreList = qcresultInfoFacade.getAverageScoreByDeptClass(filterVO);
  167. Integer limitCount = filterVO.getLimitCount();
  168. //质控平均分
  169. if (ListUtil.isNotEmpty(averageScoreList)) {
  170. retAverageScoreList = averageStatisticsAggregate.getLimitAverageList(averageScoreList, limitCount);
  171. }
  172. return retAverageScoreList;
  173. }
  174. /**
  175. * 各科室甲级病历占比
  176. *
  177. * @param filterVO
  178. * @return
  179. */
  180. public Map<String, Object> getLevelResultDept(FilterVO filterVO) {
  181. Map<String, Object> retMap = new HashMap<>();
  182. filterFacade.filterVOSet(filterVO);
  183. List<QcResultPercentDTO> levelResults = mrStatisticsAggregate.getLevelResultDept(filterVO);
  184. if (ListUtil.isNotEmpty(levelResults)) {
  185. retMap.put("各科室甲级病历占比", levelResults);
  186. }
  187. return retMap;
  188. }
  189. /**
  190. * 出院人数统计
  191. *
  192. * @param filterVO
  193. * @return
  194. */
  195. public Map<String, Object> leaveHosCount(FilterVO filterVO) {
  196. Map<String, Object> retMap = new HashMap<>();
  197. filterFacade.filterVOSet(filterVO);
  198. Map<String, Object> leaveHosMap = new HashMap<>();
  199. try {
  200. Map<String, Object> invokeParams = new HashMap<>();
  201. invokeParams.put("filterVO", filterVO);
  202. leaveHosMap
  203. = dataBeanAggregateQueryFacade.get("setAllLeaveHos", invokeParams, Map.class);
  204. } catch (Exception e) {
  205. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  206. }
  207. if (leaveHosMap != null) {
  208. retMap.put("出院人数统计", leaveHosMap);
  209. }
  210. return retMap;
  211. }
  212. /**
  213. * 质控病历统计
  214. *
  215. * @param filterVO
  216. * @return
  217. */
  218. public Map<String, Object> mrCount(FilterVO filterVO) {
  219. Map<String, Object> retMap = new HashMap<>();
  220. filterFacade.filterVOSet(filterVO);
  221. List<NumDTO> mrCountList = mrStatisticsAggregate.mrCount(filterVO);
  222. if (ListUtil.isNotEmpty(mrCountList)) {
  223. retMap.put("病历数统计", mrCountList);
  224. }
  225. return retMap;
  226. }
  227. /**
  228. * 各模块缺陷占比排行
  229. *
  230. * @param filterVO
  231. * @return
  232. */
  233. public Map<String, Object> entryCountGroupByCase(FilterVO filterVO) {
  234. Map<String, Object> retMap = new HashMap<>();
  235. filterFacade.filterVOSet(filterVO);
  236. List<NumDTO> caseList = resultStatisticsAggregate.entryCountGroupByCase(filterVO);
  237. if (ListUtil.isNotEmpty(caseList)) {
  238. retMap.put("各模块缺陷占比排行", caseList);
  239. }
  240. return retMap;
  241. }
  242. /**
  243. * 条目缺陷占比
  244. *
  245. * @param filterVO
  246. * @return
  247. */
  248. public Map<String, Object> entryCountGroupByEntry(FilterVO filterVO) {
  249. Map<String, Object> retMap = new HashMap<>();
  250. filterFacade.filterVOSet(filterVO);
  251. List<NumDTO> entryList = resultStatisticsAggregate.entryCountGroupByEntry(filterVO);
  252. if (ListUtil.isNotEmpty(entryList)) {
  253. retMap.put("条目缺陷占比", entryList);
  254. }
  255. return retMap;
  256. }
  257. /**
  258. * 单项否决缺陷占比
  259. *
  260. * @param filterVO
  261. * @return
  262. */
  263. public List<EntryNumDTO> entryRejectPercent(FilterVO filterVO) {
  264. List<EntryNumDTO> retList = Lists.newLinkedList();
  265. filterFacade.filterVOSet(filterVO);
  266. Integer limitCount = filterVO.getLimitCount();
  267. List<EntryNumDTO> numDTOList = qcresultInfoFacade.entryRejectPercent(filterVO);
  268. if (ListUtil.isNotEmpty(numDTOList)) {
  269. if (numDTOList.size() <= limitCount) {
  270. retList = numDTOList;
  271. } else {
  272. retList = numDTOList.subList(0, limitCount);
  273. }
  274. }
  275. return retList;
  276. }
  277. /**
  278. * 各科室甲/乙/丙级病历占比
  279. *
  280. * @param filterVO
  281. * @return
  282. */
  283. public List<DeptNumDTO> qcResultLevelPercent(FilterVO filterVO) {
  284. if (StringUtil.isBlank(filterVO.getLevel())) {
  285. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请输入病历等级");
  286. }
  287. List<DeptNumDTO> retList = Lists.newLinkedList();
  288. filterFacade.filterVOSet(filterVO);
  289. Integer limitCount = filterVO.getLimitCount();
  290. List<DeptNumDTO> numDTOList = qcresultInfoFacade.qcResultLevelPercent(filterVO);
  291. if (ListUtil.isNotEmpty(numDTOList)) {
  292. if (numDTOList.size() <= limitCount) {
  293. retList = numDTOList;
  294. } else {
  295. retList = numDTOList.subList(0, limitCount);
  296. }
  297. }
  298. return retList;
  299. }
  300. /**
  301. * 各科室缺陷占比
  302. *
  303. * @param filterVO
  304. * @return
  305. */
  306. public Map<String, Object> entryByDept(FilterVO filterVO) {
  307. Map<String, Object> retMap = new HashMap<>();
  308. filterFacade.filterVOSet(filterVO);
  309. List<NumDTO> deptList = resultStatisticsAggregate.entryByDept(filterVO);
  310. if (ListUtil.isNotEmpty(deptList)) {
  311. retMap.put("各科室缺陷占比", deptList);
  312. }
  313. return retMap;
  314. }
  315. //endregion-----------------------单独接口结束-------------------------------
  316. //region_______________________分页接口开始-------------------------------
  317. /**
  318. * 各模块缺陷占比(分页)
  319. *
  320. * @param filterPageVO
  321. * @return
  322. */
  323. public IPage<NumDTO> entryCountGroupByCasePage(FilterPageVO filterPageVO) {
  324. filterFacade.filterPageVOSet(filterPageVO);
  325. IPage<NumDTO> page = qcresultInfoFacade.entryCountGroupByCasePage(filterPageVO);
  326. return page;
  327. }
  328. /**
  329. * 缺陷详情(分页)
  330. *
  331. * @param filterPageVO
  332. * @return
  333. */
  334. public IPage<EntryNumGroupDTO> entryCountGroupByEntryPage(FilterPageVO filterPageVO) {
  335. filterFacade.filterPageVOSet(filterPageVO);
  336. if (filterPageVO.getDeptName().equals("全院")) {
  337. filterPageVO.setDeptName("");
  338. }
  339. IPage<EntryNumGroupDTO> page = qcresultInfoFacade.entryCountGroupByEntryPage(filterPageVO);
  340. return page;
  341. }
  342. /**
  343. * 按科室统计平均住院天数(分页)
  344. *
  345. * @param filterPageByAverageVO
  346. * @return
  347. */
  348. public IPage<AverageStatisticsDTO> getAverageDayNumPage(FilterPageByAverageVO filterPageByAverageVO) {
  349. filterFacade.filterPageByAverageVOSet(filterPageByAverageVO);
  350. IPage<AverageStatisticsDTO> page = homePageFacade.getAverageDayNumPage(filterPageByAverageVO);
  351. return page;
  352. }
  353. /**
  354. * 按科室统计平均住院费用(分页)
  355. *
  356. * @param filterPageByAverageVO
  357. * @return
  358. */
  359. public IPage<AverageStatisticsFeeDTO> getAverageFeePage(FilterPageByAverageVO filterPageByAverageVO) {
  360. filterFacade.filterPageByAverageVOSet(filterPageByAverageVO);
  361. IPage<AverageStatisticsFeeDTO> page = homePageFacade.getAverageFeePage(filterPageByAverageVO);
  362. return page;
  363. }
  364. /**
  365. * 各科室质控平均分(分页)
  366. *
  367. * @param filterPageVO
  368. * @return
  369. */
  370. public IPage<AverageStatisticsDTO> getAverageScoreByDeptPage(FilterPageVO filterPageVO) {
  371. filterFacade.filterPageVOSet(filterPageVO);
  372. IPage<AverageStatisticsDTO> page = qcresultInfoFacade.getAverageScoreByDeptPage(filterPageVO);
  373. return page;
  374. }
  375. /**
  376. * 各科室缺陷占比排行(分页)
  377. *
  378. * @param filterPageVO
  379. * @return
  380. */
  381. public IPage<NumDTO> resultStatisticsByDeptPage(FilterPageVO filterPageVO) {
  382. filterFacade.filterPageVOSet(filterPageVO);
  383. IPage<NumDTO> page = behospitalInfoFacade.resultStatisticsByDeptPage(filterPageVO);
  384. return page;
  385. }
  386. /**
  387. * 各科室甲级病历占比排行(分页)
  388. *
  389. * @param filterPageVO
  390. * @return
  391. */
  392. public IPage<QcResultPercentDTO> levelPercentGroupByDeptPage(FilterPageVO filterPageVO) {
  393. filterFacade.filterPageVOSet(filterPageVO);
  394. IPage<QcResultPercentDTO> page = qcresultInfoFacade.levelPercentGroupByDeptPage(filterPageVO);
  395. return page;
  396. }
  397. /**
  398. * 条目缺陷占比(内页)
  399. *
  400. * @param filterPageVO
  401. * @return
  402. */
  403. public IPage<EntryNumDTO> entryGroupByEntryInnerPage(FilterPageVO filterPageVO) {
  404. filterFacade.filterPageVOSet(filterPageVO);
  405. IPage<EntryNumDTO> page = qcresultInfoFacade.entryGroupByEntryInnerPage(filterPageVO);
  406. return page;
  407. }
  408. //endregion-----------------------分页接口结束-------------------------------
  409. /**
  410. * 各科室缺陷占比(组合)
  411. *
  412. * @param filterOrderVO
  413. * @return
  414. */
  415. public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO) {
  416. filterFacade.filterOrderVOSet(filterOrderVO);
  417. List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatistics(filterOrderVO);
  418. return records;
  419. }
  420. /**
  421. * 各科室缺陷占比(组合)-全院-根据内外科系统统计(台州)
  422. *
  423. * @param filterOrderVO
  424. * @return
  425. */
  426. public List<LevelStatisticsTZDTO> levelStatisticsByDeptClass_TZ(FilterOrderVO filterOrderVO) {
  427. filterFacade.filterOrderVOSet(filterOrderVO);
  428. List<LevelStatisticsTZDTO> records = behospitalInfoFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
  429. return records;
  430. }
  431. /**
  432. * 病案首页合格率占比
  433. *
  434. * @param filterOrderVO
  435. * @return
  436. */
  437. public List<HomePageNumDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO) {
  438. filterFacade.filterOrderVOSet(filterOrderVO);
  439. List<HomePageNumDTO> records = behospitalInfoFacade.homePageLevelStatistics(filterOrderVO);
  440. //没有科室过滤时增加全院数据
  441. if (StringUtil.isBlank(filterOrderVO.getName()) || filterOrderVO.getName().equals("全院")) {
  442. HomePageNumDTO item = getGlobleRecord(records);
  443. if (item != null) {
  444. records.add(0, item);
  445. }
  446. }
  447. return records;
  448. }
  449. /**
  450. * 病案首页合格率占比
  451. *
  452. * @param filterOrderVO
  453. * @return
  454. */
  455. public List<HomePageNumDTO> homePageLevelLimit(FilterOrderVO filterOrderVO) {
  456. filterFacade.filterOrderVOSet(filterOrderVO);
  457. List<HomePageNumDTO> records = behospitalInfoFacade.homePageLevelStatistics(filterOrderVO);
  458. HomePageNumDTO item = getGlobleRecord(records);
  459. if (item != null) {
  460. records.add(0, item);
  461. }
  462. records = records
  463. .stream()
  464. .limit(filterOrderVO.getLimitCount())
  465. .collect(Collectors.toList());
  466. return records;
  467. }
  468. /**
  469. * 增加全院记录
  470. *
  471. * @param records
  472. * @return
  473. */
  474. public HomePageNumDTO getGlobleRecord(List<HomePageNumDTO> records) {
  475. DecimalFormat df = new DecimalFormat("#0.00");
  476. HomePageNumDTO item = new HomePageNumDTO();
  477. if (ListUtil.isEmpty(records)) {
  478. return null;
  479. }
  480. //总病历数
  481. Integer mrNum = records
  482. .stream()
  483. .map(HomePageNumDTO::getMrNum)
  484. .reduce(0, Integer::sum);
  485. if (mrNum == null || mrNum == 0) {
  486. return null;
  487. }
  488. //总缺陷数
  489. Integer entryNum = records
  490. .stream()
  491. .map(HomePageNumDTO::getEntryNum)
  492. .reduce(0, Integer::sum);
  493. //总分
  494. Double totleValue = records
  495. .stream()
  496. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  497. .reduce(BigDecimal.ZERO, BigDecimal::add)
  498. .doubleValue();
  499. //平均分
  500. Double averageValue = BigDecimal.valueOf(totleValue)
  501. .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
  502. .doubleValue();
  503. //合格病历总数
  504. Integer firstLevelNum = records
  505. .stream()
  506. .map(HomePageNumDTO::getFirstLevelNum)
  507. .reduce(0, Integer::sum);
  508. //合格病历占比
  509. Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
  510. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  511. .doubleValue();
  512. String firstLevelPercentStr
  513. = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  514. //不合格病历数
  515. Integer secondLevelNum = records
  516. .stream()
  517. .map(HomePageNumDTO::getSecondLevelNum)
  518. .reduce(0, Integer::sum);
  519. //不合格病历占比
  520. Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
  521. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  522. .doubleValue();
  523. String secondLevelPercentStr
  524. = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  525. //条目缺陷总数(模块下条目*病历数)
  526. Integer entryTotleNum = records
  527. .stream()
  528. .map(HomePageNumDTO::getEntryTotleNum)
  529. .reduce(0, Integer::sum);
  530. //空项总数
  531. Integer emptyNum = records
  532. .stream()
  533. .map(HomePageNumDTO::getEmptyNum)
  534. .reduce(0, Integer::sum);
  535. Double emptyPercent = BigDecimal.valueOf(entryTotleNum - emptyNum)
  536. .divide(BigDecimal.valueOf(entryTotleNum), 4, RoundingMode.HALF_UP)
  537. .doubleValue();
  538. String emptyPercentStr
  539. = df.format(BigDecimal.valueOf(emptyPercent).multiply(BigDecimal.valueOf(100))) + "%";
  540. //错误项总数
  541. Integer errorNum = records
  542. .stream()
  543. .map(HomePageNumDTO::getErrorNum)
  544. .reduce(0, Integer::sum);
  545. Double errorPercent = BigDecimal.valueOf(entryTotleNum - errorNum)
  546. .divide(BigDecimal.valueOf(entryTotleNum), 4, RoundingMode.HALF_UP)
  547. .doubleValue();
  548. String errorPercentStr
  549. = df.format(BigDecimal.valueOf(errorPercent).multiply(BigDecimal.valueOf(100))) + "%";
  550. item.setDeptName("全院");
  551. item.setEntryNum(entryNum);
  552. item.setMrNum(mrNum);
  553. item.setTotleValue(totleValue);
  554. item.setAverageValue(averageValue);
  555. item.setFirstLevelNum(firstLevelNum);
  556. item.setFirstLevelPercent(firstLevelPercent);
  557. item.setFirstLevelPercentStr(firstLevelPercentStr);
  558. item.setSecondLevelNum(secondLevelNum);
  559. item.setSecondLevelPercent(secondLevelPercent);
  560. item.setSecondLevelPercentStr(secondLevelPercentStr);
  561. item.setEntryTotleNum(entryTotleNum);
  562. item.setEmptyNum(emptyNum);
  563. item.setEmptyPercent(emptyPercent);
  564. item.setEmptyPercentStr(emptyPercentStr);
  565. item.setErrorNum(errorNum);
  566. item.setErrorPercent(errorPercent);
  567. item.setErrorPercentStr(errorPercentStr);
  568. return item;
  569. }
  570. /**
  571. * 条目缺陷质控评分页(内页)
  572. *
  573. * @param qcResultShortPageVO
  574. * @return
  575. */
  576. public IPage<QcResultShortDTO> qcResultShortPage(QcResultShortPageVO qcResultShortPageVO) {
  577. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  578. IPage<QcResultShortDTO> page = behospitalInfoFacade.qcResultShortPage(qcResultShortPageVO);
  579. return page;
  580. }
  581. /**
  582. * 关键条目缺陷占比统计
  583. *
  584. * @param entryStatisticsVO
  585. * @return
  586. */
  587. public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO) {
  588. filterFacade.entryStatisticsVOSet(entryStatisticsVO);
  589. if (entryStatisticsVO.getDeptName().equals("全院")) {
  590. entryStatisticsVO.setDeptName("");
  591. }
  592. List<EntryStatisticsDTO> records = behospitalInfoFacade.entryStatistics(entryStatisticsVO);
  593. //增加全院数据
  594. if (entryStatisticsVO.getDeptName().equals("")) {
  595. EntryStatisticsDTO record = getEntryGlobleRecord(records);
  596. if (record != null) {
  597. records.add(0, record);
  598. }
  599. }
  600. return records;
  601. }
  602. /**
  603. * 关键条目缺陷占比统计增加全院记录
  604. *
  605. * @param records
  606. * @return
  607. */
  608. private EntryStatisticsDTO getEntryGlobleRecord(List<EntryStatisticsDTO> records) {
  609. DecimalFormat df = new DecimalFormat("#0.00");
  610. if (ListUtil.isEmpty(records)) {
  611. return null;
  612. }
  613. EntryStatisticsDTO record = new EntryStatisticsDTO();
  614. record.setDeptName("全院");
  615. //未在24小时内完成会诊
  616. Integer consultationNum = records
  617. .stream()
  618. .map(EntryStatisticsDTO::getConsultationNum)
  619. .reduce(0, Integer::sum);
  620. record.setConsultationNum(consultationNum);
  621. record.setConsultationEntryId(records.get(0).getConsultationEntryId());
  622. Integer consultationMRNum = records
  623. .stream()
  624. .map(EntryStatisticsDTO::getConsultationMRNum)
  625. .reduce(0, Integer::sum);
  626. record.setConsultationMRNum(consultationMRNum);
  627. if (consultationMRNum != null && !consultationMRNum.equals(0)) {
  628. Double consultationPercent = BigDecimal.valueOf(consultationNum)
  629. .divide(BigDecimal.valueOf(consultationMRNum), 4, RoundingMode.HALF_UP)
  630. .doubleValue();
  631. String consultationPercentStr
  632. = df.format(BigDecimal.valueOf(consultationPercent).multiply(BigDecimal.valueOf(100))) + "%";
  633. record.setConsultationPercent(consultationPercent);
  634. record.setConsultationPercentStr(consultationPercentStr);
  635. }
  636. //手术记录名称不匹配
  637. Integer operationNameNum = records
  638. .stream()
  639. .map(EntryStatisticsDTO::getOperationNameNum)
  640. .reduce(0, Integer::sum);
  641. record.setOperationNameNum(operationNameNum);
  642. record.setOperationNameEntryId(records.get(0).getOperationNameEntryId());
  643. Integer operationMRNum = records
  644. .stream()
  645. .map(EntryStatisticsDTO::getOperationMRNum)
  646. .reduce(0, Integer::sum);
  647. record.setOperationMRNum(operationMRNum);
  648. if (operationMRNum != null && !operationMRNum.equals(0)) {
  649. Double operationNamePercent = BigDecimal.valueOf(operationNameNum)
  650. .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
  651. .doubleValue();
  652. String operationNamePercentStr
  653. = df.format(BigDecimal.valueOf(operationNamePercent).multiply(BigDecimal.valueOf(100))) + "%";
  654. record.setOperationNamePercent(operationNamePercent);
  655. record.setOperationNamePercentStr(operationNamePercentStr);
  656. }
  657. //术后首程未在15分钟内完成
  658. Integer operation15MinuteNum = records
  659. .stream()
  660. .map(EntryStatisticsDTO::getOperation15MinuteNum)
  661. .reduce(0, Integer::sum);
  662. record.setOperation15MinuteNum(operation15MinuteNum);
  663. record.setOperation15MinuteEntryId(records.get(0).getOperation15MinuteEntryId());
  664. if (operationMRNum != null && !operationMRNum.equals(0)) {
  665. Double operation15MinutePercent = BigDecimal.valueOf(operation15MinuteNum)
  666. .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
  667. .doubleValue();
  668. String operation15MinutePercentStr
  669. = df.format(BigDecimal.valueOf(operation15MinutePercent).multiply(BigDecimal.valueOf(100))) + "%";
  670. record.setOperation15MinutePercent(operation15MinutePercent);
  671. record.setOperation15MinutePercentStr(operation15MinutePercentStr);
  672. }
  673. //病案首页手术时间不匹配
  674. Integer operationTimeNum = records
  675. .stream()
  676. .map(EntryStatisticsDTO::getOperationTimeNum)
  677. .reduce(0, Integer::sum);
  678. record.setOperationTimeNum(operationTimeNum);
  679. record.setOperationTimeEntryId(records.get(0).getOperationTimeEntryId());
  680. if (operationMRNum != null && !operationMRNum.equals(0)) {
  681. Double operationTimePercent = BigDecimal.valueOf(operationTimeNum)
  682. .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
  683. .doubleValue();
  684. String operationTimePercentStr
  685. = df.format(BigDecimal.valueOf(operationTimePercent).multiply(BigDecimal.valueOf(100))) + "%";
  686. record.setOperationTimePercent(operationTimePercent);
  687. record.setOperationTimePercentStr(operationTimePercentStr);
  688. }
  689. //未在6小时内书写危机值记录
  690. Integer crisisNum = records
  691. .stream()
  692. .map(EntryStatisticsDTO::getCrisisNum)
  693. .reduce(0, Integer::sum);
  694. record.setCrisisNum(crisisNum);
  695. record.setCrisisEntryId(records.get(0).getCrisisEntryId());
  696. Integer crisisMRNum = records
  697. .stream()
  698. .map(EntryStatisticsDTO::getCrisisMRNum)
  699. .reduce(0, Integer::sum);
  700. record.setCrisisMRNum(crisisMRNum);
  701. if (crisisMRNum != null && !crisisMRNum.equals(0)) {
  702. Double crisisPercent = BigDecimal.valueOf(crisisNum)
  703. .divide(BigDecimal.valueOf(crisisMRNum), 4, RoundingMode.HALF_UP)
  704. .doubleValue();
  705. String crisisPercentStr
  706. = df.format(BigDecimal.valueOf(crisisPercent).multiply(BigDecimal.valueOf(100))) + "%";
  707. record.setCrisisPercent(crisisPercent);
  708. record.setCrisisPercentStr(crisisPercentStr);
  709. }
  710. //病人住院超过30天,阶段小节书写
  711. Integer stageSummaryNum = records
  712. .stream()
  713. .map(EntryStatisticsDTO::getStageSummaryNum)
  714. .reduce(0, Integer::sum);
  715. record.setStageSummaryNum(stageSummaryNum);
  716. record.setStageSummaryEntryId(records.get(0).getStageSummaryEntryId());
  717. Integer stageSummaryMRNum = records
  718. .stream()
  719. .map(EntryStatisticsDTO::getStageSummaryMRNum)
  720. .reduce(0, Integer::sum);
  721. record.setStageSummaryMRNum(stageSummaryMRNum);
  722. if (stageSummaryMRNum != null && !stageSummaryMRNum.equals(0)) {
  723. Double stageSummaryPercent = BigDecimal.valueOf(stageSummaryNum)
  724. .divide(BigDecimal.valueOf(stageSummaryMRNum), 4, RoundingMode.HALF_UP)
  725. .doubleValue();
  726. String stageSummaryPercentStr
  727. = df.format(BigDecimal.valueOf(stageSummaryPercent).multiply(BigDecimal.valueOf(100))) + "%";
  728. record.setStageSummaryPercent(stageSummaryPercent);
  729. record.setStageSummaryPercentStr(stageSummaryPercentStr);
  730. }
  731. //住院超过31日病人数
  732. Integer beHosGT31DaysMRNum = records
  733. .stream()
  734. .map(EntryStatisticsDTO::getBeHosGT31DaysMRNum)
  735. .reduce(0, Integer::sum);
  736. record.setBeHosGT31DaysMRNum(beHosGT31DaysMRNum);
  737. return record;
  738. }
  739. /**
  740. * 病案首页合格率、完整率、改善率统计
  741. *
  742. * @param filterVO
  743. * @return
  744. */
  745. public Map<String, Object> homePageMRCount(FilterVO filterVO) {
  746. Map<String, Object> retMap = new HashMap<>();
  747. retMap.put("合格率", null);
  748. retMap.put("不合格率", null);
  749. retMap.put("完整率", null);
  750. retMap.put("改善率", null);
  751. filterFacade.filterVOSet(filterVO);
  752. try {
  753. Map<String, Object> invokeParams = new HashMap<>();
  754. invokeParams.put("filterVO", filterVO);
  755. retMap
  756. = dataBeanAggregateQueryFacade.get("setAllHomePage", invokeParams, Map.class);
  757. } catch (Exception e) {
  758. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  759. }
  760. return retMap;
  761. }
  762. /**
  763. * 离院病人质控评分详情页
  764. *
  765. * @param qcResultShortPageVO
  766. * @return
  767. */
  768. public IPage<QcResultShortDTO> leaveHosMRPage(QcResultShortPageVO qcResultShortPageVO) {
  769. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  770. IPage<QcResultShortDTO> page = behospitalInfoFacade.leaveHosMRPage(qcResultShortPageVO);
  771. return page;
  772. }
  773. /**
  774. * 质控核查统计(内页)
  775. *
  776. * @param filterOrderVO
  777. * @return
  778. */
  779. public List<HomePageImproveDTO> qcCheckStatistics(FilterOrderVO filterOrderVO) {
  780. filterFacade.filterOrderVOSet(filterOrderVO);
  781. List<HomePageImproveDTO> records = behospitalInfoFacade.qcCheckStatistics(filterOrderVO);
  782. //增加全院数据
  783. if (StringUtil.isBlank(filterOrderVO.getName()) || filterOrderVO.getName().equals("全院")) {
  784. HomePageImproveDTO item = getGlobleRecord_improve(records);
  785. if (item != null) {
  786. records.add(0, item);
  787. }
  788. }
  789. return records;
  790. }
  791. /**
  792. * 增加全院记录
  793. *
  794. * @param records
  795. * @return
  796. */
  797. public HomePageImproveDTO getGlobleRecord_improve(List<HomePageImproveDTO> records) {
  798. DecimalFormat df = new DecimalFormat("#0.00");
  799. HomePageImproveDTO item = new HomePageImproveDTO();
  800. if (ListUtil.isEmpty(records)) {
  801. return null;
  802. }
  803. item.setDeptName("全院");
  804. //总病历数
  805. Integer mrNum = records
  806. .stream()
  807. .map(HomePageImproveDTO::getMrNum)
  808. .reduce(0, Integer::sum);
  809. if (mrNum == null || mrNum == 0) {
  810. return null;
  811. }
  812. item.setMrNum(mrNum);
  813. //核查病历数
  814. Integer checkedNum = records
  815. .stream()
  816. .map(HomePageImproveDTO::getCheckedNum)
  817. .reduce(0, Integer::sum);
  818. item.setCheckedNum(checkedNum);
  819. if (mrNum != null && !mrNum.equals(0)) {
  820. //核查病历占比
  821. Double checkedPercent = BigDecimal.valueOf(checkedNum)
  822. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  823. .doubleValue();
  824. String checkedPercentStr
  825. = df.format(BigDecimal.valueOf(checkedPercent).multiply(BigDecimal.valueOf(100))) + "%";
  826. item.setCheckedPercent(checkedPercent);
  827. item.setCheckedPercentStr(checkedPercentStr);
  828. }
  829. //带病案首页的病历数
  830. Integer homePageMRNum = records
  831. .stream()
  832. .map(HomePageImproveDTO::getHomePageMRNum)
  833. .reduce(0, Integer::sum);
  834. item.setHomePageMRNum(homePageMRNum);
  835. if (homePageMRNum == null || homePageMRNum.equals(0)) {
  836. return item;
  837. }
  838. //改善病历数
  839. Integer improveNum = records
  840. .stream()
  841. .map(HomePageImproveDTO::getImproveNum)
  842. .reduce(0, Integer::sum);
  843. //改善率
  844. Double improvePercent = BigDecimal.valueOf(improveNum)
  845. .divide(BigDecimal.valueOf(homePageMRNum), 4, RoundingMode.HALF_UP)
  846. .doubleValue();
  847. String improvePercentStr
  848. = df.format(BigDecimal.valueOf(improvePercent).multiply(BigDecimal.valueOf(100))) + "%";
  849. //改善至合格病历数
  850. Integer improveToPassNum = records
  851. .stream()
  852. .map(HomePageImproveDTO::getImproveToPassNum)
  853. .reduce(0, Integer::sum);
  854. //改善至合格占比
  855. Double improveToPassPercent = BigDecimal.valueOf(improveToPassNum)
  856. .divide(BigDecimal.valueOf(homePageMRNum), 4, RoundingMode.HALF_UP)
  857. .doubleValue();
  858. String improveToPassPercentStr
  859. = df.format(BigDecimal.valueOf(improveToPassPercent).multiply(BigDecimal.valueOf(100))) + "%";
  860. //改善至满分病历数
  861. Integer improveToFullNum = records
  862. .stream()
  863. .map(HomePageImproveDTO::getImproveToFullNum)
  864. .reduce(0, Integer::sum);
  865. //改善至满分占比
  866. Double improveToFullPercent = BigDecimal.valueOf(improveToFullNum)
  867. .divide(BigDecimal.valueOf(homePageMRNum), 4, RoundingMode.HALF_UP)
  868. .doubleValue();
  869. String improveToFullPercentStr
  870. = df.format(BigDecimal.valueOf(improveToFullPercent).multiply(BigDecimal.valueOf(100))) + "%";
  871. item.setImproveNum(improveNum);
  872. item.setImprovePercent(improvePercent);
  873. item.setImprovePercentStr(improvePercentStr);
  874. item.setImproveToPassNum(improveToPassNum);
  875. item.setImproveToPassPercent(improveToPassPercent);
  876. item.setImproveToPassPercentStr(improveToPassPercentStr);
  877. item.setImproveToFullNum(improveToFullNum);
  878. item.setImproveToFullPercent(improveToFullPercent);
  879. item.setImproveToFullPercentStr(improveToFullPercentStr);
  880. return item;
  881. }
  882. /**
  883. * 未整改病历统计
  884. *
  885. * @param filterUnModifyMRVO
  886. * @return
  887. */
  888. public UnModifyMRDTO unModifyMRStatistics(FilterUnModifyMRVO filterUnModifyMRVO) {
  889. UnModifyMRDTO unModifyMRDTO = new UnModifyMRDTO();
  890. List<Object> retList = Lists.newLinkedList();
  891. filterFacade.filterUnModifyMRVOSet(filterUnModifyMRVO);
  892. //colums
  893. QueryWrapper<SysHospitalSet> hospitalSetQueryWrapper = new QueryWrapper<>();
  894. hospitalSetQueryWrapper.eq("is_deleted", 'N')
  895. .eq("hospital_id", filterUnModifyMRVO.getHospitalId())
  896. .eq("code", "unmodify_mr_entry");
  897. SysHospitalSet hospitalSet = sysHospitalSetFacade.getOne(hospitalSetQueryWrapper);
  898. if (hospitalSet == null || StringUtil.isBlank(hospitalSet.getValue())) {
  899. return unModifyMRDTO;
  900. }
  901. //表头生成
  902. List<String> columnSet = Arrays.asList(hospitalSet.getValue().split(","));
  903. List<ColumnDTO> columns = Lists.newLinkedList();
  904. Integer orderNo = 1;
  905. ColumnDTO columnDeptId = new ColumnDTO();
  906. columnDeptId.setOrderNo(orderNo);
  907. columnDeptId.setFieldName("deptId");
  908. columnDeptId.setColumnName("科室编码");
  909. columnDeptId.setIsShow(0);
  910. columns.add(columnDeptId);
  911. orderNo++;
  912. ColumnDTO columnDeptName = new ColumnDTO();
  913. columnDeptName.setOrderNo(orderNo);
  914. columnDeptName.setFieldName("deptName");
  915. columnDeptName.setColumnName("科室名称");
  916. columnDeptName.setIsShow(1);
  917. columns.add(columnDeptName);
  918. orderNo++;
  919. List<Long> casesEntryIds = Lists.newArrayList();
  920. for (String valueStr : columnSet) {
  921. if (StringUtil.isBlank(valueStr)) {
  922. continue;
  923. }
  924. String[] keyValue = valueStr.split("--");
  925. if (keyValue != null || keyValue.length > 1) {
  926. casesEntryIds.add(Long.valueOf(keyValue[0]));
  927. ColumnDTO columnId = new ColumnDTO();
  928. columnId.setOrderNo(orderNo);
  929. columnId.setId(Long.valueOf(keyValue[0]));
  930. columnId.setFieldName("entry_" + keyValue[0] + "_id");
  931. columnId.setColumnName(keyValue[1] + "id");
  932. columnId.setIsShow(0);
  933. columns.add(columnId);
  934. orderNo++;
  935. ColumnDTO columnName = new ColumnDTO();
  936. columnName.setOrderNo(orderNo);
  937. columnName.setId(Long.valueOf(keyValue[0]));
  938. columnName.setFieldName("entry_" + keyValue[0] + "_name");
  939. columnName.setColumnName(keyValue[1] + "name");
  940. columnName.setIsShow(0);
  941. columns.add(columnName);
  942. orderNo++;
  943. ColumnDTO columnNum = new ColumnDTO();
  944. columnNum.setOrderNo(orderNo);
  945. columnNum.setId(Long.valueOf(keyValue[0]));
  946. columnNum.setFieldName("entry_" + keyValue[0] + "_num");
  947. columnNum.setColumnName(keyValue[1]);
  948. columnNum.setIsShow(1);
  949. columns.add(columnNum);
  950. orderNo++;
  951. }
  952. }
  953. //条目未维护
  954. if (ListUtil.isEmpty(casesEntryIds)) {
  955. return unModifyMRDTO;
  956. }
  957. //casesEntryIds
  958. filterUnModifyMRVO.setCasesEntryIds(casesEntryIds);
  959. QueryWrapper<QcCasesEntry> qcCasesEntryQueryWrapper = new QueryWrapper<>();
  960. qcCasesEntryQueryWrapper.eq("is_deleted", "N")
  961. .in("id", casesEntryIds);
  962. List<QcCasesEntry> casesEntryList = qcCasesEntryFacade.list(qcCasesEntryQueryWrapper);
  963. // 实体类中将实体类转化为map形式,其中条目id对应目标条目名称
  964. Map<Long, String> basCasesEntryMap = EntityUtil.makeMapWithKeyValue(casesEntryList, "id", "name");
  965. List<UnModifyMRDetailDTO> records = behospitalInfoFacade.unModifyMRStatistics(filterUnModifyMRVO);
  966. //以科室分组,将符合科室的每条数据以map形式存储
  967. Map<String, List<UnModifyMRDetailDTO>> deptMap = EntityUtil.makeEntityListMap(records, "deptName");
  968. //科室对应科室id
  969. Map<String, String> deptInfoMap = EntityUtil.makeMapWithKeyValue(records, "deptName", "deptId");
  970. Map<String, Map<Long, UnModifyMRDetailDTO>> deptEntryMap = new LinkedHashMap<>();
  971. for (Map.Entry<String, List<UnModifyMRDetailDTO>> entry : deptMap.entrySet()) {
  972. Map<Long, UnModifyMRDetailDTO> entryMap = EntityUtil.makeEntityMap(entry.getValue(), "casesEntryId");
  973. deptEntryMap.put(entry.getKey(), entryMap);
  974. }
  975. try {
  976. for (Map.Entry<String, Map<Long, UnModifyMRDetailDTO>> entry : deptEntryMap.entrySet()) {
  977. Object obj = new Object();
  978. HashMap addMap = new HashMap();
  979. HashMap addValMap = new HashMap();
  980. addMap.put("deptName", Class.forName("java.lang.String"));
  981. addValMap.put("deptName", entry.getKey());
  982. addMap.put("deptId", Class.forName("java.lang.String"));
  983. addValMap.put("deptId", deptInfoMap.get(entry.getKey()));
  984. for (ColumnDTO item : columns) {
  985. if (item.getFieldName().lastIndexOf("_id") > 0) {
  986. addMap.put(item.getFieldName(), Class.forName("java.lang.Long"));
  987. if (item.getId() != null) {
  988. addValMap.put(item.getFieldName(), item.getId());
  989. } else {
  990. addValMap.put(item.getFieldName(), null);
  991. }
  992. } else if (item.getFieldName().lastIndexOf("_name") > 0) {
  993. addMap.put(item.getFieldName(), Class.forName("java.lang.String"));
  994. if (basCasesEntryMap.containsKey(item.getId())) {
  995. addValMap.put(item.getFieldName(), basCasesEntryMap.get(item.getId()));
  996. } else {
  997. addValMap.put(item.getFieldName(), "");
  998. }
  999. } else if (item.getFieldName().lastIndexOf("_num") > 0) {
  1000. addMap.put(item.getFieldName(), Class.forName("java.lang.Integer"));
  1001. if (entry.getValue().containsKey(item.getId())) {
  1002. addValMap.put(item.getFieldName(), entry.getValue().get(item.getId()).getCasesEntryNum());
  1003. } else {
  1004. addValMap.put(item.getFieldName(), 0);
  1005. }
  1006. }
  1007. }
  1008. obj = new ClassUtil().dynamicClass(obj, addMap, addValMap);
  1009. retList.add(obj);
  1010. }
  1011. } catch (Exception e) {
  1012. e.printStackTrace();
  1013. }
  1014. //排序
  1015. Collections.sort(retList, new Comparator<Object>() {
  1016. @Override
  1017. public int compare(Object o1, Object o2) {
  1018. if (StringUtil.isNotBlank(filterUnModifyMRVO.getAsc())) {
  1019. //升序
  1020. Object o1Val = ObjectUtil.getValueByKey(o1, filterUnModifyMRVO.getAsc());
  1021. Object o2Val = ObjectUtil.getValueByKey(o2, filterUnModifyMRVO.getAsc());
  1022. if (filterUnModifyMRVO.getAsc().lastIndexOf("_num") > 1) {
  1023. return ((Integer) o1Val).compareTo((Integer) o2Val);
  1024. }
  1025. if (filterUnModifyMRVO.getAsc().lastIndexOf("_id") > 1) {
  1026. return ((Long) o1Val).compareTo((Long) o2Val);
  1027. } else {
  1028. return ((String) o1Val).compareTo((String) o2Val);
  1029. }
  1030. } else if (StringUtil.isNotBlank(filterUnModifyMRVO.getDesc())) {
  1031. //降序
  1032. Object o1Val = ObjectUtil.getValueByKey(o1, filterUnModifyMRVO.getDesc());
  1033. Object o2Val = ObjectUtil.getValueByKey(o2, filterUnModifyMRVO.getDesc());
  1034. if (filterUnModifyMRVO.getDesc().lastIndexOf("_num") > 1) {
  1035. return ((Integer) o2Val).compareTo((Integer) o1Val);
  1036. }
  1037. if (filterUnModifyMRVO.getDesc().lastIndexOf("_id") > 1) {
  1038. return ((Long) o2Val).compareTo((Long) o1Val);
  1039. } else {
  1040. return ((String) o2Val).compareTo((String) o1Val);
  1041. }
  1042. } else {
  1043. return 0;
  1044. }
  1045. }
  1046. });
  1047. //增加全院数据
  1048. if (ListUtil.isNotEmpty(retList) &&
  1049. (StringUtil.isBlank(filterUnModifyMRVO.getName())
  1050. || filterUnModifyMRVO.getName().equals("全院"))) {
  1051. try {
  1052. Object globleObj = new Object();
  1053. HashMap addMap = new HashMap();
  1054. HashMap addValMap = new HashMap();
  1055. addMap.put("deptId", Class.forName("java.lang.String"));
  1056. addValMap.put("deptId", "");
  1057. addMap.put("deptName", Class.forName("java.lang.String"));
  1058. addValMap.put("deptName", "全院");
  1059. for (ColumnDTO item : columns) {
  1060. if (item.getFieldName().lastIndexOf("_id") > 0) {
  1061. addMap.put(item.getFieldName(), Class.forName("java.lang.Long"));
  1062. if (item.getId() != null) {
  1063. addValMap.put(item.getFieldName(), item.getId());
  1064. } else {
  1065. addValMap.put(item.getFieldName(), null);
  1066. }
  1067. } else if (item.getFieldName().lastIndexOf("_name") > 0) {
  1068. addMap.put(item.getFieldName(), Class.forName("java.lang.String"));
  1069. if (basCasesEntryMap.containsKey(item.getId())) {
  1070. addValMap.put(item.getFieldName(), basCasesEntryMap.get(item.getId()));
  1071. } else {
  1072. addValMap.put(item.getFieldName(), "");
  1073. }
  1074. } else if (item.getFieldName().lastIndexOf("_num") > 0) {
  1075. addMap.put(item.getFieldName(), Class.forName("java.lang.Integer"));
  1076. Integer entryNum = retList
  1077. .stream()
  1078. .map(i -> ObjectUtil.getValueByKey(i, item.getFieldName()))
  1079. .filter(i -> i != null)
  1080. .map(i -> (Integer) i)
  1081. .reduce(0, Integer::sum);
  1082. addValMap.put(item.getFieldName(), entryNum);
  1083. }
  1084. }
  1085. globleObj = new ClassUtil().dynamicClass(globleObj, addMap, addValMap);
  1086. retList.add(0, globleObj);
  1087. } catch (Exception e) {
  1088. e.printStackTrace();
  1089. }
  1090. }
  1091. unModifyMRDTO.setColumns(columns);
  1092. unModifyMRDTO.setData(retList);
  1093. return unModifyMRDTO;
  1094. }
  1095. /**
  1096. * 未整改病历质控评分页(内页)
  1097. *
  1098. * @param qcResultShortPageVO
  1099. * @return
  1100. */
  1101. public IPage<QcResultShortDTO> unModifyMRPage(QcResultShortPageVO qcResultShortPageVO) {
  1102. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  1103. return behospitalInfoFacade.unModifyMRPage(qcResultShortPageVO);
  1104. }
  1105. /**
  1106. * 不合格数病历号(内页)
  1107. *
  1108. * @param qcResultShortPageVO
  1109. * @return
  1110. */
  1111. public IPage<QcResultShortDTO> badLevelPage(QcResultShortPageVO qcResultShortPageVO) {
  1112. filterFacade.badLevelPageVOSet(qcResultShortPageVO);
  1113. return behospitalInfoFacade.badLevelPage(qcResultShortPageVO);
  1114. }
  1115. /**
  1116. * 31天再入院详情页
  1117. *
  1118. * @param reBeHosPageVO
  1119. * @return
  1120. */
  1121. public IPage<ReBeHosDTO> reHos31DaysPage(ReBeHosPageVO reBeHosPageVO) {
  1122. filterFacade.reBeHosPageVOSet(reBeHosPageVO);
  1123. IPage<ReBeHosMergeDTO> page = behospitalInfoFacade.reHos31DaysPage(reBeHosPageVO);
  1124. List<ReBeHosMergeDTO> records = page.getRecords();
  1125. IPage<ReBeHosDTO> retPage = new Page<>();
  1126. BeanUtil.copyProperties(page, retPage);
  1127. List<ReBeHosDTO> retRecords = Lists.newLinkedList();
  1128. if (ListUtil.isNotEmpty(records)) {
  1129. for (ReBeHosMergeDTO record : records) {
  1130. ReBeHosDTO retRecord = new ReBeHosDTO();
  1131. BeanUtil.copyProperties(record, retRecord);
  1132. List<ReBeHosDetailDTO> details = Lists.newLinkedList();
  1133. ReBeHosDetailDTO detailRecord = new ReBeHosDetailDTO();
  1134. BeanUtil.copyProperties(record, detailRecord);
  1135. details.add(detailRecord);
  1136. ReBeHosDetailDTO lastDetailRecord = new ReBeHosDetailDTO();
  1137. lastDetailRecord.setName(record.getName());
  1138. lastDetailRecord.setBehDeptId(record.getLastBehDeptId());
  1139. lastDetailRecord.setBehDeptName(record.getBehDeptName());
  1140. lastDetailRecord.setBehospitalCode(record.getLastBehospitalCode());
  1141. lastDetailRecord.setBehospitalDate(record.getLastBehospitalDate());
  1142. lastDetailRecord.setLeaveHospitalDate(record.getLastLeaveHospitalDate());
  1143. lastDetailRecord.setLevel(record.getLastLevel());
  1144. lastDetailRecord.setScoreRes(record.getLastScoreRes());
  1145. lastDetailRecord.setBehospitalDayNum(record.getLastBehospitalDayNum());
  1146. lastDetailRecord.setTotleFee(record.getLastTotleFee());
  1147. details.add(lastDetailRecord);
  1148. retRecord.setDetails(details);
  1149. retRecords.add(retRecord);
  1150. }
  1151. }
  1152. retPage.setRecords(retRecords);
  1153. return retPage;
  1154. }
  1155. /**
  1156. * 入院人数统计(首页)
  1157. *
  1158. * @param filterVO
  1159. * @return
  1160. */
  1161. public List<NumDTO> beHosCount(FilterVO filterVO) {
  1162. filterFacade.filterVOSet(filterVO);
  1163. List<NumDTO> records = behospitalInfoFacade.beHosCount(filterVO);
  1164. if (ListUtil.isNotEmpty(records)) {
  1165. NumDTO globleRecord = new NumDTO();
  1166. globleRecord.setName("全院");
  1167. Integer num = records.stream()
  1168. .map(NumDTO::getNum)
  1169. .reduce(0, Integer::sum);
  1170. globleRecord.setNum(num);
  1171. records.add(0, globleRecord);
  1172. }
  1173. if (ListUtil.isNotEmpty(records) && records.size() > filterVO.getLimitCount()) {
  1174. records = records.subList(0, 10);
  1175. }
  1176. return records;
  1177. }
  1178. /**
  1179. * 单条条目缺陷统计(首页)
  1180. *
  1181. * @param filterVO
  1182. * @return
  1183. */
  1184. public List<NumDTO> casesEntryStatisticsById(FilterVO filterVO) {
  1185. filterFacade.filterVOSet(filterVO);
  1186. List<NumDTO> records = behospitalInfoFacade.casesEntryStatisticsById(filterVO);
  1187. if (ListUtil.isNotEmpty(records)) {
  1188. NumDTO globleRecord = new NumDTO();
  1189. globleRecord.setName("全院");
  1190. Integer num = records.stream()
  1191. .map(NumDTO::getNum)
  1192. .reduce(0, Integer::sum);
  1193. globleRecord.setNum(num);
  1194. records.add(0, globleRecord);
  1195. }
  1196. if (ListUtil.isNotEmpty(records) && records.size() > filterVO.getLimitCount()) {
  1197. records = records.subList(0, 10);
  1198. }
  1199. return records;
  1200. }
  1201. /**
  1202. * 病案首页改善率质控评分页(内页)
  1203. *
  1204. * @param qcResultShortPageVO
  1205. * @return
  1206. */
  1207. public IPage<QcResultShortDTO> hmImproveMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO) {
  1208. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  1209. return behospitalInfoFacade.hmImproveMRPage(qcResultShortPageVO);
  1210. }
  1211. /**
  1212. * 质控核查质控评分页(内页)
  1213. *
  1214. * @param qcResultShortPageVO
  1215. * @return
  1216. */
  1217. public IPage<QcResultShortDTO> qcCheckMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO) {
  1218. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  1219. return behospitalInfoFacade.qcCheckMRPage(qcResultShortPageVO);
  1220. }
  1221. /*
  1222. */
  1223. /**
  1224. * 病历稽查表导出(首页)
  1225. *
  1226. * @param filterVO
  1227. * @return
  1228. */
  1229. public List<MedicalCheckExportDTO> medicalCheckExport(@Param("filterVO") FilterMedicalCheckVO filterVO) {
  1230. filterFacade.getMedicalCheckVOSet(filterVO);
  1231. List<MedicalCheckExportDTO> medicalCheck = behospitalInfoFacade.getMedicalCheckExport(filterVO);
  1232. return medicalCheck;
  1233. }
  1234. /**
  1235. * 病历稽查表(首页)
  1236. *
  1237. * @param filterVO
  1238. * @return
  1239. */
  1240. public IPage<MedicalCheckDTO> getMedicalCheck(@Param("filterVO") FilterMedicalCheckVO filterVO) {
  1241. filterFacade.getMedicalCheckVOSet(filterVO);
  1242. IPage<MedicalCheckDTO> medicalCheck = behospitalInfoFacade.getMedicalCheck(filterVO);
  1243. return medicalCheck;
  1244. }
  1245. /**
  1246. * 病历稽查表(title)
  1247. *
  1248. * @param
  1249. * @return
  1250. */
  1251. public List<ColumnDTO> getMedicalCheckTitle() {
  1252. //病历稽查入参拼接
  1253. String hospitalId = SysUserUtils.getCurrentHospitalID();
  1254. //colums
  1255. QueryWrapper<SysHospitalSet> hospitalSetQueryWrapper = new QueryWrapper<>();
  1256. hospitalSetQueryWrapper.eq("is_deleted", 'N')
  1257. .eq("hospital_id", hospitalId)
  1258. .eq("code", "medical_check_form");
  1259. List<ColumnDTO> columns = Lists.newLinkedList();
  1260. SysHospitalSet hospitalSet = sysHospitalSetFacade.getOne(hospitalSetQueryWrapper);
  1261. if (hospitalSet == null || StringUtil.isBlank(hospitalSet.getValue())) {
  1262. return columns;
  1263. }
  1264. //表头生成
  1265. List<String> columnSet = Arrays.asList(hospitalSet.getValue().split(","));
  1266. Integer orderNo = 1;
  1267. ColumnDTO columnDeptId = new ColumnDTO();
  1268. columnDeptId.setOrderNo(orderNo);
  1269. columnDeptId.setFieldName("deptId");
  1270. columnDeptId.setColumnName("科室编码");
  1271. columnDeptId.setIsShow(0);
  1272. columns.add(columnDeptId);
  1273. orderNo++;
  1274. ColumnDTO columnDeptName = new ColumnDTO();
  1275. columnDeptName.setOrderNo(orderNo);
  1276. columnDeptName.setFieldName("deptName");
  1277. columnDeptName.setColumnName("科室");
  1278. columnDeptName.setIsShow(1);
  1279. columns.add(columnDeptName);
  1280. orderNo++;
  1281. ColumnDTO columnMedicalName = new ColumnDTO();
  1282. columnMedicalName.setOrderNo(orderNo);
  1283. columnMedicalName.setFieldName("medicalName");
  1284. columnMedicalName.setColumnName("医疗组");
  1285. columnMedicalName.setIsShow(1);
  1286. columns.add(columnMedicalName);
  1287. orderNo++;
  1288. for (String valueStr : columnSet) {
  1289. String[] keyValue = valueStr.split("--");
  1290. if (keyValue != null || keyValue.length > 1) {
  1291. ColumnDTO columnNum = new ColumnDTO();
  1292. columnNum.setOrderNo(orderNo);
  1293. columnNum.setId(Long.valueOf(keyValue[0]));
  1294. columnNum.setFieldName("entry_" + keyValue[0] + "_num");
  1295. columnNum.setColumnName(keyValue[1]);
  1296. columnNum.setIsShow(1);
  1297. columns.add(columnNum);
  1298. orderNo++;
  1299. }
  1300. }
  1301. return columns;
  1302. }
  1303. }