ConsoleFacade.java 185 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233
  1. package com.diagbot.facade;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.diagbot.aggregate.AverageStatisticsAggregate;
  7. import com.diagbot.aggregate.MrStatisticsAggregate;
  8. import com.diagbot.aggregate.ResultStatisticsAggregate;
  9. import com.diagbot.dto.*;
  10. import com.diagbot.entity.*;
  11. import com.diagbot.enums.IsDeleteEnum;
  12. import com.diagbot.enums.QualityContent;
  13. import com.diagbot.enums.TimeContent;
  14. import com.diagbot.exception.CommonErrorCode;
  15. import com.diagbot.exception.CommonException;
  16. import com.diagbot.service.MedManagementInfoService;
  17. import com.diagbot.util.*;
  18. import com.diagbot.vo.*;
  19. import com.google.common.collect.Lists;
  20. import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.apache.ibatis.annotations.Param;
  23. import org.springframework.beans.BeanUtils;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.beans.factory.annotation.Qualifier;
  26. import org.springframework.stereotype.Component;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import java.math.BigDecimal;
  29. import java.math.RoundingMode;
  30. import java.text.DateFormat;
  31. import java.text.DecimalFormat;
  32. import java.text.ParseException;
  33. import java.text.SimpleDateFormat;
  34. import java.time.*;
  35. import java.time.format.DateTimeFormatter;
  36. import java.util.*;
  37. import java.util.concurrent.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * @Description:
  41. * @Author:zhaops
  42. * @time: 2020/4/13 16:45
  43. */
  44. @Component
  45. public class ConsoleFacade {
  46. @Autowired
  47. private FilterFacade filterFacade;
  48. @Autowired
  49. private DataBeanAggregateQueryFacade dataBeanAggregateQueryFacade;
  50. @Autowired
  51. private AverageStatisticsAggregate averageStatisticsAggregate;
  52. @Autowired
  53. private MrStatisticsAggregate mrStatisticsAggregate;
  54. @Autowired
  55. private ResultStatisticsAggregate resultStatisticsAggregate;
  56. @Autowired
  57. private QcresultInfoFacade qcresultInfoFacade;
  58. @Autowired
  59. private HomePageFacade homePageFacade;
  60. @Autowired
  61. private BehospitalInfoFacade behospitalInfoFacade;
  62. @Autowired
  63. private SysHospitalSetFacade sysHospitalSetFacade;
  64. @Autowired
  65. private QcCasesEntryFacade qcCasesEntryFacade;
  66. @Autowired
  67. @Qualifier("medManagementInfoServiceImpl")
  68. private MedManagementInfoService medManagementInfoService;
  69. @Autowired
  70. private DoctorAdviceFacade doctorAdviceFacade;
  71. @Autowired
  72. private MedIndexResultFacade medIndexResultFacade;
  73. @Autowired
  74. private MedIndexRelevanceFacade medIndexRelevanceFacade;
  75. //region-----------------------聚合接口开始-------------------------------
  76. /**
  77. * 病历相关统计
  78. *
  79. * @param filterVO
  80. * @return
  81. */
  82. public Map<String, Object> mrStatistics(FilterVO filterVO) {
  83. Map<String, Object> retMap = new LinkedHashMap<>();
  84. filterFacade.filterVOSet(filterVO);
  85. try {
  86. Map<String, Object> invokeParams = new HashMap<>();
  87. invokeParams.put("filterVO", filterVO);
  88. retMap
  89. = dataBeanAggregateQueryFacade.get("setAllMr", invokeParams, Map.class);
  90. } catch (Exception e) {
  91. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  92. }
  93. return retMap;
  94. }
  95. /**
  96. * 缺陷相关统计
  97. *
  98. * @param filterVO
  99. * @return
  100. */
  101. public Map<String, Object> resultStatistics(FilterVO filterVO) {
  102. Map<String, Object> retMap = new LinkedHashMap<>();
  103. filterFacade.filterVOSet(filterVO);
  104. try {
  105. Map<String, Object> invokeParams = new HashMap<>();
  106. invokeParams.put("filterVO", filterVO);
  107. retMap
  108. = dataBeanAggregateQueryFacade.get("setAllResult", invokeParams, Map.class);
  109. } catch (Exception e) {
  110. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  111. }
  112. return retMap;
  113. }
  114. /**
  115. * 平局值相关统计
  116. *
  117. * @param filterVO
  118. * @return
  119. */
  120. public Map<String, Object> averageStatistics(FilterVO filterVO) {
  121. Map<String, Object> retMap = new LinkedHashMap<>();
  122. filterFacade.filterVOSet(filterVO);
  123. try {
  124. Map<String, Object> invokeParams = new HashMap<>();
  125. invokeParams.put("filterVO", filterVO);
  126. retMap
  127. = dataBeanAggregateQueryFacade.get("setAllAverage", invokeParams, Map.class);
  128. } catch (Exception e) {
  129. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  130. }
  131. return retMap;
  132. }
  133. //endregion-----------------------聚合接口结束-------------------------------
  134. //region-----------------------单独接口开始-------------------------------
  135. /**
  136. * 平均住院天数
  137. *
  138. * @param filterVO
  139. * @return
  140. */
  141. public Map<String, Object> getAverageDayNum(FilterVO filterVO) {
  142. Map<String, Object> retMap = new HashMap<>();
  143. filterFacade.filterVOSet(filterVO);
  144. List<AverageStatisticsDTO> averageDayNumList = averageStatisticsAggregate.getAverageDayNum(filterVO);
  145. if (ListUtil.isNotEmpty(averageDayNumList)) {
  146. retMap.put("平均住院日", averageDayNumList);
  147. }
  148. return retMap;
  149. }
  150. /**
  151. * 平均住院费用
  152. *
  153. * @param filterVO
  154. * @return
  155. */
  156. public Map<String, Object> getAverageFee(FilterVO filterVO) {
  157. Map<String, Object> retMap = new HashMap<>();
  158. filterFacade.filterVOSet(filterVO);
  159. List<AverageStatisticsDTO> averageFeeList = averageStatisticsAggregate.getAverageFee(filterVO);
  160. if (ListUtil.isNotEmpty(averageFeeList)) {
  161. retMap.put("平均住院费用", averageFeeList);
  162. }
  163. return retMap;
  164. }
  165. /**
  166. * 质控平均分按科室统计
  167. *
  168. * @param filterVO
  169. * @return
  170. */
  171. public Map<String, Object> getAverageScore(FilterVO filterVO) {
  172. Map<String, Object> retMap = new HashMap<>();
  173. filterFacade.filterVOSame(filterVO);
  174. List<AverageStatisticsDTO> averageScoreList = averageStatisticsAggregate.getAverageScore(filterVO);
  175. AverageStatisticsDTO item = getGlobleAverageTitle(averageScoreList);
  176. if (item != null) {
  177. averageScoreList.add(0, item);
  178. }
  179. if (ListUtil.isNotEmpty(averageScoreList)) {
  180. retMap.put("各科室质控平均分", averageScoreList);
  181. }
  182. return retMap;
  183. }
  184. /**
  185. * 增加全院记录
  186. *
  187. * @param records
  188. * @return
  189. */
  190. public AverageStatisticsDTO getGlobleAverageTitle(List<AverageStatisticsDTO> records) {
  191. DecimalFormat df = new DecimalFormat("#0.00");
  192. AverageStatisticsDTO item = new AverageStatisticsDTO();
  193. if (ListUtil.isEmpty(records)) {
  194. return null;
  195. }
  196. //数量
  197. Integer num = records
  198. .stream()
  199. .map(AverageStatisticsDTO::getNum)
  200. .reduce(0, Integer::sum);
  201. //同期数量
  202. Integer sameNum = records
  203. .stream()
  204. .map(AverageStatisticsDTO::getSameNum)
  205. .reduce(0, Integer::sum);
  206. Double totleValue = records
  207. .stream()
  208. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  209. .reduce(BigDecimal.ZERO, BigDecimal::add)
  210. .doubleValue();
  211. Double sameTotleValue = records
  212. .stream()
  213. .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
  214. .reduce(BigDecimal.ZERO, BigDecimal::add)
  215. .doubleValue();
  216. Double averageValue = 0d;
  217. if (0 != num) {
  218. averageValue = BigDecimal.valueOf(totleValue)
  219. .divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP)
  220. .doubleValue();
  221. }
  222. Double lastYearAverageValue = 0d;
  223. if (0 != sameNum) {
  224. lastYearAverageValue = BigDecimal.valueOf(sameTotleValue)
  225. .divide(BigDecimal.valueOf(sameNum), 2, RoundingMode.HALF_UP)
  226. .doubleValue();
  227. }
  228. item.setName("全院");
  229. item.setNum(num);
  230. item.setSameNum(sameNum);
  231. item.setAverageValue(averageValue);
  232. item.setTotleValue(totleValue);
  233. item.setSameTotleValue(sameTotleValue);
  234. item.setLastYearAverageValue(lastYearAverageValue);
  235. return item;
  236. }
  237. /**
  238. * 各科室质控平均分(首页)-根据内外科系统统计
  239. *
  240. * @param filterVO
  241. * @return
  242. */
  243. public List<AverageStatisticsDTO> getAverageScoreByDeptClass(FilterVO filterVO) {
  244. filterFacade.filterVOSame(filterVO);
  245. List<AverageStatisticsDTO> retAverageScoreList = Lists.newLinkedList();
  246. List<AverageStatisticsDTO> averageScoreList = qcresultInfoFacade.getAverageScoreByDeptClass(filterVO);
  247. Integer limitCount = filterVO.getLimitCount();
  248. //质控平均分
  249. if (ListUtil.isNotEmpty(averageScoreList)) {
  250. retAverageScoreList = averageStatisticsAggregate.getLimitAverageList(averageScoreList, limitCount);
  251. }
  252. AverageStatisticsDTO item = getGlobleInOutTitle(retAverageScoreList, filterVO);
  253. if (item != null) {
  254. retAverageScoreList.add(0, item);
  255. }
  256. return retAverageScoreList;
  257. }
  258. /**
  259. * 增加内外科记录
  260. *
  261. * @param records
  262. * @return
  263. */
  264. public AverageStatisticsDTO getGlobleInOutTitle(List<AverageStatisticsDTO> records, FilterVO filterVO) {
  265. DecimalFormat df = new DecimalFormat("#0.00");
  266. AverageStatisticsDTO item = new AverageStatisticsDTO();
  267. if (ListUtil.isEmpty(records)) {
  268. return null;
  269. }
  270. //数量
  271. Integer num = records
  272. .stream()
  273. .map(AverageStatisticsDTO::getNum)
  274. .reduce(0, Integer::sum);
  275. //同期数量
  276. Integer sameNum = records
  277. .stream()
  278. .map(AverageStatisticsDTO::getSameNum)
  279. .reduce(0, Integer::sum);
  280. Double totleValue = records
  281. .stream()
  282. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  283. .reduce(BigDecimal.ZERO, BigDecimal::add)
  284. .doubleValue();
  285. Double sameTotleValue = records
  286. .stream()
  287. .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
  288. .reduce(BigDecimal.ZERO, BigDecimal::add)
  289. .doubleValue();
  290. Double averageValue = 0d;
  291. if (0 != num) {
  292. averageValue = BigDecimal.valueOf(totleValue)
  293. .divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP)
  294. .doubleValue();
  295. }
  296. Double lastYearAverageValue = 0d;
  297. if (0 != sameNum) {
  298. lastYearAverageValue = BigDecimal.valueOf(sameTotleValue)
  299. .divide(BigDecimal.valueOf(sameNum), 2, RoundingMode.HALF_UP)
  300. .doubleValue();
  301. }
  302. if ("内科".equals(filterVO.getDeptClass())) {
  303. item.setName("内科系统");
  304. } else {
  305. item.setName("外科系统");
  306. }
  307. item.setNum(num);
  308. item.setSameNum(sameNum);
  309. item.setAverageValue(averageValue);
  310. item.setTotleValue(totleValue);
  311. item.setSameTotleValue(sameTotleValue);
  312. item.setLastYearAverageValue(lastYearAverageValue);
  313. return item;
  314. }
  315. /**
  316. * 各科室甲级病历占比
  317. *
  318. * @param filterVO
  319. * @return
  320. */
  321. public Map<String, Object> getLevelResultDept(FilterVO filterVO) {
  322. Map<String, Object> retMap = new HashMap<>();
  323. filterFacade.filterVOSet(filterVO);
  324. List<QcResultPercentDTO> levelResults = mrStatisticsAggregate.getLevelResultDept(filterVO);
  325. if (ListUtil.isNotEmpty(levelResults)) {
  326. retMap.put("各科室甲级病历占比", levelResults);
  327. }
  328. return retMap;
  329. }
  330. /**
  331. * 出院人数统计
  332. *
  333. * @param filterVO
  334. * @return
  335. */
  336. public Map<String, Object> leaveHosCount(FilterVO filterVO) {
  337. Map<String, Object> retMap = new HashMap<>();
  338. filterFacade.filterVOSet(filterVO);
  339. Map<String, Object> leaveHosMap = new HashMap<>();
  340. try {
  341. Map<String, Object> invokeParams = new HashMap<>();
  342. invokeParams.put("filterVO", filterVO);
  343. leaveHosMap
  344. = dataBeanAggregateQueryFacade.get("setAllLeaveHos", invokeParams, Map.class);
  345. } catch (Exception e) {
  346. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  347. }
  348. if (leaveHosMap != null) {
  349. retMap.put("出院人数统计", leaveHosMap);
  350. }
  351. return retMap;
  352. }
  353. public String handleTime(String startDate){
  354. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  355. Date parse = null;
  356. try {
  357. parse = dateFormat.parse(startDate);
  358. } catch (ParseException e) {
  359. e.printStackTrace();
  360. }
  361. return (dateFormat.format(parse)+" 23:59:59");
  362. };
  363. /**
  364. * 病案指标
  365. * @param filterVO
  366. * @return
  367. */
  368. public List<Map<String,String>> medicalRecordIndicator(FilterVO filterVO){
  369. filterFacade.filterSet(filterVO);
  370. List<Map<String, String>> hashMapArrayList = new ArrayList<>();
  371. String indexName = filterVO.getIndexName();
  372. //各指标未完成人数情况 ---分子
  373. Map<String, Long> triggeringRulesMap = behospitalInfoFacade.triggeringRules(filterVO);
  374. Long operationCount = triggeringRulesMap.get(QualityContent.SSJLWCC_24H);
  375. Long InHospitalRecords = triggeringRulesMap.get(QualityContent.RYJLWWC_24H);
  376. Long OutHospitalRecords = triggeringRulesMap.get(QualityContent.CYJLWWC_24H);
  377. Long recordHomePage = triggeringRulesMap.get(QualityContent.BASYWWC_24H);
  378. //病理手术
  379. Long operationPathologyFee = triggeringRulesMap.get("operationPathologyFee");
  380. //CT
  381. Long ct = triggeringRulesMap.get("CT");
  382. //MR
  383. Long mr = triggeringRulesMap.get("MR");
  384. //细菌培养
  385. Long bacterialCulture = triggeringRulesMap.get("bacterialCulture");
  386. //抗菌药物
  387. Long antibiosis = triggeringRulesMap.get("antibiosis");
  388. //恶性肿瘤化学治疗
  389. Long chemotherapyMalignantTumors = triggeringRulesMap.get("chemotherapyMalignantTumors");
  390. Map<String, Double> medicalRecordIndicator = medIndexResultFacade.medicalRecordIndicator(filterVO);
  391. Double startCount = medicalRecordIndicator.get("startCount");
  392. Double operationFeeNum = medicalRecordIndicator.get("operationFeeNum");
  393. Double CTNum = medicalRecordIndicator.get("CTNum");
  394. Double MRNum = medicalRecordIndicator.get("MRNum");
  395. Double operationPathologyFeeNum = medicalRecordIndicator.get("operationPathologyFeeNum");
  396. Double bacterialCultureNum = medicalRecordIndicator.get("bacterialCultureNum");
  397. Double antibiosisFeeNum = medicalRecordIndicator.get("antibiosisFeeNum");
  398. Double chemotherapyMalignantTumorsNum = medicalRecordIndicator.get("chemotherapyMalignantTumorsNum");
  399. MedIndexFilterVO timeVo = new MedIndexFilterVO();
  400. BeanUtils.copyProperties(filterVO,timeVo);
  401. timeTrans(timeVo);
  402. Map<String, Object> baseIndex = behospitalInfoFacade.getBaseIndex(timeVo);
  403. //指标一、二、三
  404. if (QualityContent.FOURSTR.contains(indexName)||indexName.equals(QualityContent.QB)) {
  405. hashMapArrayList = ManageIndexMethod(indexName, hashMapArrayList, baseIndex, timeVo);
  406. }
  407. //入院记录24小时完成率
  408. if(indexName.equals(QualityContent.RYJL_24H_WCL)||indexName.equals(QualityContent.QB)) {
  409. if (InHospitalRecords != null && startCount != null) {
  410. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  411. stringStringHashMap.put("name", QualityContent.RYJL_24H_WCL);
  412. stringStringHashMap.put("notCopiedStr", getResult(startCount - InHospitalRecords, startCount.doubleValue()));
  413. stringStringHashMap.put("num", Double.valueOf(startCount).toString());
  414. hashMapArrayList.add(stringStringHashMap);
  415. }
  416. }
  417. //手术记录完成率
  418. if (indexName.equals(QualityContent.SSJL_24H_WCL)||indexName.equals(QualityContent.QB)) {
  419. if (operationFeeNum != null && operationCount != null) {
  420. LinkedHashMap<String, String> stringStringHashMap = new LinkedHashMap<>();
  421. stringStringHashMap.put("name", QualityContent.SSJL_24H_WCL);
  422. stringStringHashMap.put("notCopiedStr", getResult(operationFeeNum - operationCount, operationFeeNum));
  423. stringStringHashMap.put("num", operationFeeNum.toString());
  424. hashMapArrayList.add(stringStringHashMap);
  425. }
  426. }
  427. //出院记录24小时完成率
  428. if(indexName.equals(QualityContent.CYJL_24H_WCL)||indexName.equals(QualityContent.QB)) {
  429. if (OutHospitalRecords != null && startCount != null) {
  430. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  431. stringStringHashMap.put("name", QualityContent.CYJL_24H_WCL);
  432. stringStringHashMap.put("notCopiedStr", getResult(startCount - OutHospitalRecords, startCount.doubleValue()));
  433. stringStringHashMap.put("num", Double.valueOf(startCount).toString());
  434. hashMapArrayList.add(stringStringHashMap);
  435. }
  436. }
  437. //病案首页24小时完成率
  438. if(indexName.equals(QualityContent.BASY_24H_WCL)||indexName.equals(QualityContent.QB)) {
  439. if (recordHomePage != null && startCount != null) {
  440. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  441. stringStringHashMap.put("name", QualityContent.BASY_24H_WCL);
  442. stringStringHashMap.put("notCopiedStr", getResult(startCount - recordHomePage, startCount.doubleValue()));
  443. stringStringHashMap.put("num", Double.valueOf(startCount).toString());
  444. hashMapArrayList.add(stringStringHashMap);
  445. }
  446. }
  447. //CT完成率
  448. if (indexName.equals(QualityContent.CT_JCJL_FHL)||indexName.equals(QualityContent.QB)) {
  449. if (CTNum != null && ct != null) {
  450. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  451. stringStringHashMap.put("name", QualityContent.CT_JCJL_FHL);
  452. stringStringHashMap.put("notCopiedStr", getResult(CTNum - ct, CTNum));
  453. stringStringHashMap.put("num", CTNum.toString());
  454. hashMapArrayList.add(stringStringHashMap);
  455. }
  456. }
  457. //MRI完成率
  458. if (indexName.equals(QualityContent.MR_JCJL_FHL)||indexName.equals(QualityContent.QB)) {
  459. if (MRNum != null && mr != null) {
  460. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  461. stringStringHashMap.put("name", QualityContent.MR_JCJL_FHL);
  462. stringStringHashMap.put("notCopiedStr", getResult(MRNum - mr, MRNum));
  463. stringStringHashMap.put("num", MRNum.toString());
  464. hashMapArrayList.add(stringStringHashMap);
  465. }
  466. }
  467. //病理完成率为
  468. if (indexName.equals(QualityContent.BL_JCJL_FHL)||indexName.equals(QualityContent.QB)) {
  469. if (operationPathologyFeeNum != null && operationPathologyFee != null) {
  470. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  471. stringStringHashMap.put("name", QualityContent.BL_JCJL_FHL);
  472. stringStringHashMap.put("notCopiedStr", getResult(operationPathologyFeeNum - operationPathologyFee, operationPathologyFeeNum));
  473. stringStringHashMap.put("num", operationPathologyFeeNum.toString());
  474. hashMapArrayList.add(stringStringHashMap);
  475. }
  476. }
  477. //细菌培养
  478. if (indexName.equals(QualityContent.XJPY_JCJL_FHL)||indexName.equals(QualityContent.QB)) {
  479. if (bacterialCultureNum != null && bacterialCulture != null) {
  480. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  481. stringStringHashMap.put("name", QualityContent.XJPY_JCJL_FHL);
  482. stringStringHashMap.put("notCopiedStr", getResult(bacterialCultureNum - bacterialCulture, bacterialCultureNum));
  483. stringStringHashMap.put("num", bacterialCultureNum.toString());
  484. hashMapArrayList.add(stringStringHashMap);
  485. }
  486. }
  487. //抗菌
  488. if (indexName.equals(QualityContent.KJYW_SY_FHL)||indexName.equals(QualityContent.QB)) {
  489. if (antibiosisFeeNum != null && antibiosis != null) {
  490. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  491. stringStringHashMap.put("name", QualityContent.KJYW_SY_FHL);
  492. stringStringHashMap.put("notCopiedStr", getResult(antibiosisFeeNum - antibiosis, antibiosisFeeNum));
  493. stringStringHashMap.put("num", antibiosisFeeNum.toString());
  494. hashMapArrayList.add(stringStringHashMap);
  495. }
  496. }
  497. //恶性肿瘤化学治疗
  498. if (indexName.equals(QualityContent.EXZL_HXZL_FHL)||indexName.equals(QualityContent.QB)) {
  499. if (chemotherapyMalignantTumorsNum != null && chemotherapyMalignantTumors != null) {
  500. Map<String, String> stringStringHashMap = new LinkedHashMap<>();
  501. stringStringHashMap.put("name", QualityContent.EXZL_HXZL_FHL);
  502. stringStringHashMap.put("notCopiedStr", getResult(chemotherapyMalignantTumorsNum - chemotherapyMalignantTumors, chemotherapyMalignantTumorsNum));
  503. stringStringHashMap.put("num", chemotherapyMalignantTumorsNum.toString());
  504. hashMapArrayList.add(stringStringHashMap);
  505. }
  506. }
  507. //指标十四 恶性肿瘤放射治疗
  508. if (indexName.equals(QualityContent.EXZL_FSZL_FHL)||indexName.equals(QualityContent.QB)) {
  509. hashMapArrayList = tumorRadiationMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
  510. }
  511. //指标十五 手术记录
  512. if (indexName.equals(QualityContent.SS_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
  513. hashMapArrayList = operationMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
  514. }
  515. //指标十六 植入物相关记录符合率
  516. if (indexName.equals(QualityContent.ZRW_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
  517. hashMapArrayList = implantsMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
  518. }
  519. //指标十七 临床用血相关记录符合率
  520. if (indexName.equals(QualityContent.LCYX_XGJL_WCL)||indexName.equals(QualityContent.QB)) {
  521. hashMapArrayList = bloodMethod(hashMapArrayList,medicalRecordIndicator,triggeringRulesMap);
  522. }
  523. //指标十八 医师查房记录
  524. if (indexName.equals(QualityContent.YSCF_JL_WCL)||indexName.equals(QualityContent.QB)) {
  525. hashMapArrayList = WardRoundMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
  526. }
  527. //指标十九 抢救记录
  528. if (indexName.equals(QualityContent.HZQJ_JLJS_WCL)||indexName.equals(QualityContent.QB)) {
  529. hashMapArrayList = rescueMethod(medicalRecordIndicator,hashMapArrayList,triggeringRulesMap);
  530. }
  531. //指标二十 出院患者病历2日归档
  532. if (indexName.equals(QualityContent.CCHZ_2DAY_GDL)||indexName.equals(QualityContent.QB)) {
  533. hashMapArrayList = getfileSecAmount(medicalRecordIndicator,hashMapArrayList, baseIndex);
  534. }
  535. //指标二十一 出院患者病历归档完整率
  536. if (indexName.equals(QualityContent.CCHZ_GD_WZL)||indexName.equals(QualityContent.QB)) {
  537. hashMapArrayList = fileCompleteMethod(medicalRecordIndicator,hashMapArrayList, baseIndex);
  538. }
  539. //指标二十二 不合理复制病历发生率
  540. if (indexName.equals(QualityContent.BHL_FZ_FSL)||indexName.equals(QualityContent.QB)) {
  541. hashMapArrayList = unreasonedCopyMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
  542. }
  543. //指标二十三 知情同意书规范签署率
  544. if (indexName.equals(QualityContent.ZQTYS_GF_QSL)||indexName.equals(QualityContent.QB)) {
  545. hashMapArrayList = contentSignMethod(hashMapArrayList, baseIndex, triggeringRulesMap);
  546. }
  547. //指标二十四 甲级率
  548. if (indexName.equals(QualityContent.JJBLL)||indexName.equals(QualityContent.QB)) {
  549. hashMapArrayList = firMethod(hashMapArrayList,baseIndex);
  550. }
  551. return hashMapArrayList;
  552. }
  553. /**
  554. * 病案指标数据保存
  555. *
  556. * @param IndexTimeVO
  557. * @return 2170
  558. */
  559. @Transactional
  560. public Boolean saveMedicaIndicator(IndexTimeVO IndexTimeVO){
  561. FilterVO filterVO = new FilterVO();
  562. BeanUtils.copyProperties(IndexTimeVO,filterVO);
  563. List<String> timeList = filterFacade.getTimeList(filterVO);
  564. QueryWrapper<MedIndexResult> qw = new QueryWrapper<>();
  565. qw.eq("hospital_id",filterVO.getHospitalId());
  566. qw.ge("start_date",filterVO.getStartDate()+" 00:00:00");
  567. qw.le("end_date", handleTime(filterVO.getEndDate()));
  568. medIndexResultFacade.remove(qw);
  569. QueryWrapper<MedIndexRelevance> qwa = new QueryWrapper<>();
  570. qwa.eq("hospital_id",filterVO.getHospitalId());
  571. qwa.ge("start_date",filterVO.getStartDate()+" 00:00:00");
  572. qwa.le("end_date", handleTime(filterVO.getEndDate()));
  573. medIndexRelevanceFacade.remove(qwa);
  574. for (String startTime : timeList) {
  575. filterVO.setStartDate(startTime);
  576. filterVO.setEndDate( handleTime(startTime));
  577. getMedicaIndicator(filterVO);
  578. }
  579. return true;
  580. }
  581. /**
  582. * 病案指标数据保存
  583. *
  584. * @param filterVO
  585. * @return 2170
  586. */
  587. public void getMedicaIndicator(FilterVO filterVO){
  588. MedIndexResult medIndexResult = new MedIndexResult();
  589. List<Map<String, String>> selectOperationNumMap = behospitalInfoFacade.selectOperationNum(filterVO);
  590. Set<String> outHospitalCode = new CopyOnWriteArraySet<>();
  591. Set<String> operationCode = new CopyOnWriteArraySet<>();
  592. Set<String> operationPathologyCode = new CopyOnWriteArraySet<>();
  593. Set<String> antibiosisCode = new CopyOnWriteArraySet<>();
  594. List<String> adviceVerify = adviceVerify(filterVO);
  595. Long operationFeeNum = 0L;
  596. filterVO.setFlagStr("2");
  597. List<MedManageParamsDTO> doctorAdviceMedManageParams = behospitalInfoFacade.getMedManageParams(filterVO);
  598. Map<String, Set<String>> adviceNum = getAdviceNum(filterVO, doctorAdviceMedManageParams);
  599. if(ListUtil.isNotEmpty(selectOperationNumMap)) {
  600. for (Map<String, String> stringStringMap : selectOperationNumMap) {
  601. String behospitalCode = stringStringMap.get("behospitalCode");
  602. //出院code
  603. outHospitalCode.add(behospitalCode);
  604. String operationFee = stringStringMap.get("operationFee");
  605. String pathologyFee = stringStringMap.get("pathologyFee");
  606. String antibiosisFee = stringStringMap.get("antibiosisFee");
  607. if(StringUtil.isNotEmpty(operationFee)) {
  608. double of = 0.0;
  609. try {
  610. of = Double.parseDouble(operationFee);
  611. } catch (Exception e) {
  612. e.printStackTrace();
  613. }
  614. if (of > 0) {
  615. //手术code
  616. operationCode.add(behospitalCode);
  617. }
  618. }
  619. if(StringUtil.isNotEmpty(operationFee)&&StringUtil.isNotEmpty(pathologyFee)) {
  620. double of = 0.0;
  621. double pf = 0.0;
  622. try {
  623. of = Double.parseDouble(operationFee);
  624. pf = Double.parseDouble(pathologyFee);
  625. } catch (NumberFormatException e) {
  626. e.printStackTrace();
  627. }
  628. if (of > 0 && pf > QualityContent.pathologyFee) {
  629. //病理code
  630. operationPathologyCode.add(behospitalCode);
  631. }
  632. }
  633. if(StringUtil.isNotEmpty(antibiosisFee)) {
  634. double af = 0.0;
  635. try {
  636. af = Double.parseDouble(antibiosisFee);
  637. } catch (NumberFormatException e) {
  638. e.printStackTrace();
  639. }
  640. if (af > 0) {
  641. //抗菌code
  642. antibiosisCode.add(behospitalCode);
  643. }
  644. }
  645. }
  646. }
  647. if(ListUtil.isNotEmpty(adviceVerify)){
  648. for (String code : adviceVerify) {
  649. outHospitalCode.add(code);
  650. }
  651. }
  652. Long startCount = Long.valueOf(outHospitalCode.size());
  653. //手术人
  654. Set<String> operationList = adviceNum.get("operation");
  655. if(operationList!=null&&operationList.size()>0){
  656. for (String s : operationList) {
  657. operationCode.add(s);
  658. }
  659. }
  660. if(operationCode.size()>0&&operationCode!=null) {
  661. operationFeeNum = Long.valueOf(operationCode.size());
  662. }
  663. //CT人数
  664. Set<String> ctList = adviceNum.get("CT");
  665. Long CTNum=0L;
  666. if(ctList!=null&&ctList.size()>0) {
  667. CTNum = Long.valueOf(ctList.size());
  668. }
  669. //MR人数
  670. Set<String> mrList = adviceNum.get("MR");
  671. Long MRNum=0L;
  672. if(mrList!=null&&mrList.size()>0) {
  673. MRNum = Long.valueOf(mrList.size());
  674. }
  675. //手术病理人数
  676. Long operationPathologyFeeNum=0L;
  677. Set<String> operationPathologyList = adviceNum.get("operationPathology");
  678. if(operationPathologyList!=null&&operationPathologyList.size()>0){
  679. for (String s : operationPathologyList) {
  680. operationPathologyCode.add(s);
  681. }
  682. }
  683. if(operationPathologyCode.size()>0&&operationPathologyCode!=null) {
  684. operationPathologyFeeNum = Long.valueOf(operationPathologyCode.size());
  685. }
  686. //细菌培养人数
  687. Set<String> bacterialCultureList = adviceNum.get("bacterialCulture");
  688. Long bacterialCultureNum=0L;
  689. if(bacterialCultureList!=null&&bacterialCultureList.size()>0) {
  690. bacterialCultureNum = Long.valueOf(bacterialCultureList.size());
  691. }
  692. //抗菌药物人数
  693. Set<String> antibiosisList = adviceNum.get("antibiosis");
  694. if(antibiosisList!=null&&antibiosisList.size()>0) {
  695. for (String s : antibiosisList) {
  696. antibiosisCode.add(s);
  697. }
  698. }
  699. Long antibiosisFeeNum =0L;
  700. if(antibiosisCode.size()>0&&antibiosisCode!=null) {
  701. antibiosisFeeNum = Long.valueOf(antibiosisCode.size());
  702. }
  703. //恶性肿瘤化学治疗人数
  704. Set<String> chemotherapyMalignantTumorsList = adviceNum.get("chemotherapyMalignantTumors");
  705. Long chemotherapyMalignantTumorsNum =0L;
  706. if(chemotherapyMalignantTumorsList!=null&&chemotherapyMalignantTumorsList.size()>0) {
  707. chemotherapyMalignantTumorsNum=Long.valueOf(chemotherapyMalignantTumorsList.size());
  708. }
  709. //出院人数
  710. if(startCount!=null){
  711. medIndexResult.setAdmissionResult(Double.valueOf(startCount));
  712. }
  713. //手术完成人数为
  714. if (operationFeeNum != null) {
  715. medIndexResult.setOperationResult(Double.valueOf(operationFeeNum));
  716. }
  717. //CT人数
  718. if (CTNum != null) {
  719. medIndexResult.setCtResult(Double.valueOf(CTNum));
  720. }
  721. //MRI人数
  722. if (MRNum != null ) {
  723. medIndexResult.setMriResult(Double.valueOf(MRNum));
  724. }
  725. //病理人数
  726. if (operationPathologyFeeNum != null) {
  727. medIndexResult.setPathologyResult(Double.valueOf(operationPathologyFeeNum));
  728. }
  729. //细菌培养人数
  730. if (bacterialCultureNum != null) {
  731. medIndexResult.setGermResult(Double.valueOf(bacterialCultureNum));
  732. }
  733. //抗菌人数
  734. if (antibiosisFeeNum != null ) {
  735. medIndexResult.setAntibiosisResult(Double.valueOf(antibiosisFeeNum));
  736. }
  737. //恶性肿瘤化学治疗人数
  738. if (chemotherapyMalignantTumorsNum != null ) {
  739. medIndexResult.setTumorChemistryResult(Double.valueOf(chemotherapyMalignantTumorsNum));
  740. }
  741. /**
  742. * ================================保存数据-标示线========================================
  743. */
  744. MedIndexFilterVO timeVo = new MedIndexFilterVO();
  745. BeanUtils.copyProperties(filterVO,timeVo);
  746. timeTrans(timeVo);
  747. Set<String> rescueCode = new CopyOnWriteArraySet<>();
  748. Set<String> bloodCode = new CopyOnWriteArraySet<>();
  749. //指标二十七
  750. //指标14--恶性肿瘤放射治疗记录符合率
  751. Set<String> tumorRadiationSet = tumorRadiationMethods(adviceNum, medIndexResult);
  752. //指标15 手术记录
  753. medIndexResult.setOperationCompleteResult(Double.parseDouble(operationFeeNum+""));
  754. //指标16--植入物相关记录符合率
  755. Set<String> implantsCode = implantsMethods(filterVO, medIndexResult);
  756. //指标17 临床用血相关记录符合率
  757. bloodMethods(doctorAdviceMedManageParams, filterVO,medIndexResult,bloodCode);
  758. //指标18 医师查房记录 查询直接返回 -code需要加载
  759. //指标19 抢救记录
  760. rescueMethods(doctorAdviceMedManageParams,medIndexResult,rescueCode);
  761. //指标20 出院患者病历2日归档
  762. getfileSecAmounts(filterVO,medIndexResult);
  763. //指标21 出院患者病历归档完整率
  764. fileCompleteMethods(filterVO,medIndexResult);
  765. //指标22 不合理复制病历发生率 查询直接返回
  766. //指标23 知情同意书规范签署率 //分子通过规则
  767. // contentSignMethods(contentFile,medIndexResult);
  768. //指标24 甲级率 查询直接返回
  769. medIndexResult.setHospitalId(filterVO.getHospitalId());
  770. medIndexResult.setStartDate(filterVO.getStartDate());
  771. medIndexResult.setEndDate(filterVO.getEndDate());
  772. medIndexResult.setGmtCreate(new Date());
  773. medIndexResultFacade.save(medIndexResult);
  774. Integer id = medIndexResult.getId();
  775. MedIndexRelevance medIndexRelevance = new MedIndexRelevance();
  776. medIndexRelevance.setIndexResultId(id);
  777. medIndexRelevance.setHospitalId(filterVO.getHospitalId());
  778. medIndexRelevance.setStartDate(filterVO.getStartDate());
  779. medIndexRelevance.setEndDate(filterVO.getEndDate());
  780. medIndexRelevance.setGmtCreate(new Date());
  781. if(outHospitalCode.size()>0&&outHospitalCode!=null) {
  782. medIndexRelevance.setRelevanceType(4);
  783. for (String Code : outHospitalCode) {
  784. medIndexRelevance.setBehospitalCode(Code);
  785. medIndexRelevanceFacade.save(medIndexRelevance);
  786. }
  787. medIndexRelevance.setRelevanceType(6);
  788. for (String Code : outHospitalCode) {
  789. medIndexRelevance.setBehospitalCode(Code);
  790. medIndexRelevanceFacade.save(medIndexRelevance);
  791. }
  792. medIndexRelevance.setRelevanceType(7);
  793. for (String Code : outHospitalCode) {
  794. medIndexRelevance.setBehospitalCode(Code);
  795. medIndexRelevanceFacade.save(medIndexRelevance);
  796. }
  797. }
  798. if(operationCode.size()>0&&operationCode!=null) {
  799. medIndexRelevance.setRelevanceType(5);
  800. for (String Code : operationCode) {
  801. medIndexRelevance.setBehospitalCode(Code);
  802. medIndexRelevanceFacade.save(medIndexRelevance);
  803. }
  804. }
  805. if(ctList!=null&&ctList.size()>0) {
  806. medIndexRelevance.setRelevanceType(8);
  807. for (String CTCode : ctList) {
  808. medIndexRelevance.setBehospitalCode(CTCode);
  809. medIndexRelevanceFacade.save(medIndexRelevance);
  810. }
  811. }
  812. if(mrList!=null&&mrList.size()>0) {
  813. medIndexRelevance.setRelevanceType(9);
  814. for (String MrCode : mrList) {
  815. medIndexRelevance.setBehospitalCode(MrCode);
  816. medIndexRelevanceFacade.save(medIndexRelevance);
  817. }
  818. }
  819. if(operationPathologyCode.size()>0&&operationPathologyCode!=null) {
  820. medIndexRelevance.setRelevanceType(10);
  821. for (String Code : operationPathologyCode) {
  822. medIndexRelevance.setBehospitalCode(Code);
  823. medIndexRelevanceFacade.save(medIndexRelevance);
  824. }
  825. }
  826. if(bacterialCultureList!=null&&bacterialCultureList.size()>0) {
  827. medIndexRelevance.setRelevanceType(11);
  828. for (String Code : bacterialCultureList) {
  829. medIndexRelevance.setBehospitalCode(Code);
  830. medIndexRelevanceFacade.save(medIndexRelevance);
  831. }
  832. }
  833. if(antibiosisCode.size()>0&&antibiosisCode!=null) {
  834. medIndexRelevance.setRelevanceType(12);
  835. for (String Code : antibiosisCode) {
  836. medIndexRelevance.setBehospitalCode(Code);
  837. medIndexRelevanceFacade.save(medIndexRelevance);
  838. }
  839. }
  840. if(chemotherapyMalignantTumorsList!=null&&chemotherapyMalignantTumorsList.size()>0) {
  841. medIndexRelevance.setRelevanceType(13);
  842. for (String Code : chemotherapyMalignantTumorsList) {
  843. medIndexRelevance.setBehospitalCode(Code);
  844. medIndexRelevanceFacade.save(medIndexRelevance);
  845. }
  846. }
  847. if(tumorRadiationSet.size()>0 && tumorRadiationSet != null) {
  848. medIndexRelevance.setRelevanceType(14);
  849. for (String Code : tumorRadiationSet) {
  850. medIndexRelevance.setBehospitalCode(Code);
  851. medIndexRelevanceFacade.save(medIndexRelevance);
  852. }
  853. }
  854. if(operationCode.size() > 0 && operationCode != null) {
  855. medIndexRelevance.setRelevanceType(15);
  856. for (String Code : operationCode) {
  857. medIndexRelevance.setBehospitalCode(Code);
  858. medIndexRelevanceFacade.save(medIndexRelevance);
  859. }
  860. }
  861. if(implantsCode.size() > 0 && implantsCode != null) {
  862. medIndexRelevance.setRelevanceType(16);
  863. for (String Code : implantsCode) {
  864. medIndexRelevance.setBehospitalCode(Code);
  865. medIndexRelevanceFacade.save(medIndexRelevance);
  866. }
  867. }
  868. if(bloodCode.size() > 0 && bloodCode != null) {
  869. medIndexRelevance.setRelevanceType(17);
  870. for (String Code : bloodCode) {
  871. medIndexRelevance.setBehospitalCode(Code);
  872. medIndexRelevanceFacade.save(medIndexRelevance);
  873. }
  874. }
  875. if(outHospitalCode.size() > 0 && outHospitalCode != null) {
  876. medIndexRelevance.setRelevanceType(18);
  877. for (String Code : outHospitalCode) {
  878. medIndexRelevance.setBehospitalCode(Code);
  879. medIndexRelevanceFacade.save(medIndexRelevance);
  880. }
  881. }
  882. if(rescueCode.size() > 0 && rescueCode != null) {
  883. medIndexRelevance.setRelevanceType(19);
  884. for (String Code : rescueCode) {
  885. medIndexRelevance.setBehospitalCode(Code);
  886. medIndexRelevanceFacade.save(medIndexRelevance);
  887. }
  888. }
  889. if(outHospitalCode.size() > 0 && outHospitalCode != null) {
  890. medIndexRelevance.setRelevanceType(22);
  891. for (String Code : outHospitalCode) {
  892. medIndexRelevance.setBehospitalCode(Code);
  893. medIndexRelevanceFacade.save(medIndexRelevance);
  894. }
  895. }
  896. if(outHospitalCode.size() > 0 && outHospitalCode != null) {
  897. medIndexRelevance.setRelevanceType(23);
  898. for (String Code : outHospitalCode) {
  899. medIndexRelevance.setBehospitalCode(Code);
  900. medIndexRelevanceFacade.save(medIndexRelevance);
  901. }
  902. }
  903. }
  904. /**
  905. * 两数据相除得到百分比
  906. * @param i
  907. * @param y
  908. * @return
  909. */
  910. public String getResult(double i , Double y){
  911. DecimalFormat df = new DecimalFormat();
  912. df.setMaximumFractionDigits(2);
  913. df.setMinimumFractionDigits(2);
  914. if(String.valueOf(y).equals("0.0")){
  915. return "0.00%";
  916. }
  917. String k= df.format((i * 100.00) / y) + "%";
  918. return k;
  919. }
  920. /**
  921. * 获取无病案首页病人code
  922. * @param filterVO
  923. * @return
  924. */
  925. public List<String> adviceVerify(FilterVO filterVO){
  926. List<Map<String, String>> medicalRecords = behospitalInfoFacade.getMedicalRecords(filterVO);
  927. List<String> behospitalCodeList = new CopyOnWriteArrayList<>();
  928. for (Map<String, String> medicalRecord : medicalRecords) {
  929. String behospitalCode = medicalRecord.get("behospital_code");
  930. behospitalCodeList.add(behospitalCode);
  931. }
  932. return behospitalCodeList;
  933. }
  934. /**
  935. * 医嘱二级条件判断 或且
  936. * @param name
  937. * @param arg
  938. * @return
  939. */
  940. public Boolean secondLevelCondition(String name,String[][] arg){
  941. for (int i = 0; i < arg.length; i++) {
  942. String[] strings = arg[i];
  943. int z=0;
  944. for (int y = 0; y < strings.length; y++) {
  945. if(name.contains(strings[y])){
  946. z++;
  947. }
  948. }
  949. if(z==strings.length){
  950. return false;
  951. }else {
  952. continue;
  953. }
  954. }
  955. return true;
  956. }
  957. /**
  958. * 一级条件判断 或且
  959. * @param name
  960. * @param arg
  961. * @return
  962. */
  963. public Boolean stairCondition(String name,String[][] arg){
  964. for (int i = 0; i < arg.length; i++) {
  965. String[] strings = arg[i];
  966. int z=0;
  967. for (int y = 0; y < strings.length; y++) {
  968. if(name.contains(strings[y])){
  969. z++;
  970. }
  971. }
  972. if(z==strings.length){
  973. return true;
  974. }else {
  975. continue;
  976. }
  977. }
  978. return false;
  979. }
  980. /**
  981. * 遍历医嘱信息存入相关数据
  982. */
  983. public Map<String,Set<String>> getAdviceNum(FilterVO filterVO, List<MedManageParamsDTO> doctorAdviceMedManageParamsList) {
  984. CopyOnWriteArrayList<MedManageParamsDTO> doctorAdviceMedManageParams = new CopyOnWriteArrayList<>(doctorAdviceMedManageParamsList);
  985. String indexName = filterVO.getIndexName();
  986. Map mapCode = new HashMap<String,List<String>>();
  987. Set<String> CTBehospitalCode = new CopyOnWriteArraySet<>();
  988. Set<String> operationPathologyBehospitalCode = new CopyOnWriteArraySet<>();
  989. Set<String> MRBehospitalCode = new CopyOnWriteArraySet<>();
  990. Set<String> operationBehospitalCode = new CopyOnWriteArraySet<>();
  991. Set<String> pathologyBehospitalCode = new CopyOnWriteArraySet<>();
  992. Set<String> bacterialCultureCode = new CopyOnWriteArraySet<>();
  993. Set<String> antibiosisBehospitalCode = new CopyOnWriteArraySet<>();
  994. Set<String> chemotherapyMalignantTumorsBehospitalCode = new CopyOnWriteArraySet<>();
  995. Set<String> tumorRadiationBehospitalCode = new CopyOnWriteArraySet<>();
  996. //无首页code
  997. List<String> behospitalCodeList = adviceVerify(filterVO);
  998. //首页为肿瘤code
  999. List<String> malignancyCodeList = getMalignancyCode(filterVO);
  1000. ForkJoinPool myPool = new ForkJoinPool(6);
  1001. try {
  1002. myPool.submit(() ->
  1003. doctorAdviceMedManageParams.parallelStream().forEach(adviceMedManageParam->{
  1004. String daItemName = adviceMedManageParam.getDaItemName();
  1005. String behospitalCode = adviceMedManageParam.getBehospitalCode();
  1006. String doctorAdviceType = adviceMedManageParam.getDoctorAdviceType();
  1007. String daStatus = adviceMedManageParam.getDaStatus();
  1008. if(StringUtil.isEmpty(daStatus) || (!daStatus.equals(QualityContent.CANCELLATION_ORDER) && StringUtil.isNotEmpty(daStatus))){
  1009. //得到与手术相关
  1010. if (StringUtil.isNotEmpty(daItemName)) {
  1011. if (QualityContent.NORecord_NEED_MEDICAL_ADVICE.contains(indexName)) {
  1012. //当code存在于无首页code集合中
  1013. if (behospitalCodeList.contains(behospitalCode)) {
  1014. //code也不存在于以保存的code集合
  1015. //手术
  1016. if (indexName.equals(QualityContent.SSJL_24H_WCL) || indexName.equals(QualityContent.BL_JCJL_FHL) || indexName.equals(QualityContent.QB)) {
  1017. if (!operationBehospitalCode.contains(behospitalCode)) {
  1018. String[][] operationList = QualityContent.OPERATION_LIST;
  1019. Boolean stair = stairCondition(daItemName, operationList);
  1020. if (stair) {
  1021. String[][] operationArg = QualityContent.OPERATION_ARG;
  1022. Boolean levelCondition = secondLevelCondition(daItemName, operationArg);
  1023. if (levelCondition) {
  1024. operationBehospitalCode.add(behospitalCode);
  1025. }
  1026. }
  1027. }
  1028. }
  1029. //手术病理
  1030. if (indexName.equals(QualityContent.BL_JCJL_FHL) || indexName.equals(QualityContent.QB)) {
  1031. if (!pathologyBehospitalCode.contains(behospitalCode)) {
  1032. Boolean condition = stairCondition(daItemName, QualityContent.BL_LIST);
  1033. if (condition) {
  1034. pathologyBehospitalCode.add(behospitalCode);
  1035. }
  1036. }
  1037. }
  1038. //取临时和长期
  1039. if (doctorAdviceType.equals(QualityContent.STAT_ORDER) || doctorAdviceType.equals(QualityContent.STANDING_ORDER)) {
  1040. //抗菌药物
  1041. if (indexName.equals(QualityContent.KJYW_SY_FHL) || indexName.equals(QualityContent.QB)) {
  1042. if (!antibiosisBehospitalCode.contains(behospitalCode)) {
  1043. List<String> antimicrobialDrugList = QualityContent.Antimicrobial_Drug_List;
  1044. for (String antimicrobialDrug : antimicrobialDrugList) {
  1045. if (daItemName.contains(antimicrobialDrug)) {
  1046. //包含抗菌药物
  1047. antibiosisBehospitalCode.add(behospitalCode);
  1048. }
  1049. }
  1050. }
  1051. }
  1052. }
  1053. }
  1054. }
  1055. //得到为临时医嘱
  1056. if (StringUtil.isNotEmpty(doctorAdviceType)) {
  1057. if (doctorAdviceType.equals(QualityContent.STAT_ORDER)) {
  1058. if (indexName.equals(QualityContent.CT_JCJL_FHL) || indexName.equals(QualityContent.QB)) {
  1059. if (!CTBehospitalCode.contains(behospitalCode)) {
  1060. //筛选与CT相关
  1061. //一级条件
  1062. String[][] ctList = QualityContent.CT_LIST;
  1063. Boolean stair = stairCondition(daItemName, ctList);
  1064. if (stair) {
  1065. String[][] ctRegulation = QualityContent.CT_REGULATION;
  1066. Boolean levelCondition = secondLevelCondition(daItemName, ctRegulation);
  1067. if (levelCondition) {
  1068. CTBehospitalCode.add(behospitalCode);
  1069. }
  1070. }
  1071. }
  1072. }
  1073. //与MR相关
  1074. if (indexName.equals(QualityContent.MR_JCJL_FHL) || indexName.equals(QualityContent.QB)) {
  1075. if (!MRBehospitalCode.contains(behospitalCode)) {
  1076. String[][] mrList = QualityContent.MR_LIST;
  1077. Boolean stair = stairCondition(daItemName, mrList);
  1078. if (stair) {
  1079. String[][] mrRegulation = QualityContent.MR_REGULATION;
  1080. Boolean levelCondition = secondLevelCondition(daItemName, mrRegulation);
  1081. if (levelCondition) {
  1082. MRBehospitalCode.add(behospitalCode);
  1083. }
  1084. }
  1085. }
  1086. }
  1087. //细菌培养
  1088. if (indexName.equals(QualityContent.XJPY_JCJL_FHL) || indexName.equals(QualityContent.QB)) {
  1089. if(!bacterialCultureCode.contains(behospitalCode)){
  1090. if(daItemName.contains(QualityContent.BACTERIAL_CULTURE)){
  1091. bacterialCultureCode.add(behospitalCode);
  1092. }
  1093. }
  1094. }
  1095. }
  1096. }
  1097. //获取为长期医嘱或临时医嘱的医嘱
  1098. if (StringUtil.isNotEmpty(doctorAdviceType)) {
  1099. if (indexName.equals(QualityContent.EXZL_HXZL_FHL) || indexName.equals(QualityContent.QB)) {
  1100. if (ListUtil.isNotEmpty(malignancyCodeList)) {
  1101. if (malignancyCodeList.contains(behospitalCode)) {
  1102. if (!chemotherapyMalignantTumorsBehospitalCode.contains(behospitalCode)) {
  1103. if (doctorAdviceType.equals(QualityContent.STAT_ORDER) || doctorAdviceType.equals(QualityContent.STANDING_ORDER)) {
  1104. List<String> chemotherapyDrugList = QualityContent.Chemotherapy_Drug_List;
  1105. for (String chemotherapyDrug : chemotherapyDrugList) {
  1106. if (daItemName.contains(chemotherapyDrug)) {
  1107. //医嘱含有化疗药物
  1108. chemotherapyMalignantTumorsBehospitalCode.add(behospitalCode);
  1109. }
  1110. }
  1111. }
  1112. }
  1113. }
  1114. }
  1115. }
  1116. if (indexName.equals(QualityContent.EXZL_FSZL_FHL) || indexName.equals(QualityContent.QB)) {
  1117. if (ListUtil.isNotEmpty(malignancyCodeList)) {
  1118. if (malignancyCodeList.contains(behospitalCode)) {
  1119. if (!tumorRadiationBehospitalCode.contains(behospitalCode)) {
  1120. if (doctorAdviceType.equals(QualityContent.STAT_ORDER) || doctorAdviceType.equals(QualityContent.STANDING_ORDER)) {
  1121. List<String> tumorRadiationDrugList = QualityContent.radiotherapyDrugList;
  1122. for (String tumorRadiationDrug : tumorRadiationDrugList) {
  1123. if (daItemName.contains(tumorRadiationDrug)) {
  1124. //医嘱含有放射治疗药物
  1125. tumorRadiationBehospitalCode.add(behospitalCode);
  1126. }
  1127. }
  1128. }
  1129. }
  1130. }
  1131. }
  1132. }
  1133. }
  1134. }
  1135. }
  1136. })).get();
  1137. } catch (InterruptedException e) {
  1138. e.printStackTrace();
  1139. } catch (ExecutionException e) {
  1140. e.printStackTrace();
  1141. }finally {
  1142. myPool.shutdown();
  1143. if(CTBehospitalCode !=null && CTBehospitalCode.size()>0){
  1144. mapCode.put("CT",CTBehospitalCode);
  1145. }else {
  1146. mapCode.put("CT",null);
  1147. }
  1148. if(MRBehospitalCode!=null && MRBehospitalCode.size()>0){
  1149. mapCode.put("MR",MRBehospitalCode);
  1150. }else {
  1151. mapCode.put("MR",null);
  1152. }
  1153. if(operationBehospitalCode!=null && operationBehospitalCode.size()>0){
  1154. mapCode.put("operation",operationBehospitalCode);
  1155. }else {
  1156. mapCode.put("operation",null);
  1157. }
  1158. if((operationBehospitalCode!=null)&&(pathologyBehospitalCode!=null&&pathologyBehospitalCode.size()>0)){
  1159. for (String operation : operationBehospitalCode) {
  1160. if(pathologyBehospitalCode.contains(operation)){
  1161. operationPathologyBehospitalCode.add(operation);
  1162. }
  1163. }
  1164. mapCode.put("operationPathology",operationPathologyBehospitalCode);
  1165. }else {
  1166. mapCode.put("operationPathology",null);
  1167. }
  1168. if(bacterialCultureCode!=null && bacterialCultureCode.size()>0){
  1169. mapCode.put("bacterialCulture",bacterialCultureCode);
  1170. }else {
  1171. mapCode.put("bacterialCulture",null);
  1172. }
  1173. if(antibiosisBehospitalCode!=null && antibiosisBehospitalCode.size()>0){
  1174. mapCode.put("antibiosis",antibiosisBehospitalCode);
  1175. }else {
  1176. mapCode.put("antibiosis",null);
  1177. }
  1178. if(chemotherapyMalignantTumorsBehospitalCode!=null && chemotherapyMalignantTumorsBehospitalCode.size()>0){
  1179. mapCode.put("chemotherapyMalignantTumors",chemotherapyMalignantTumorsBehospitalCode);
  1180. }else {
  1181. mapCode.put("chemotherapyMalignantTumors",null);
  1182. }
  1183. if(tumorRadiationBehospitalCode!=null && tumorRadiationBehospitalCode.size()>0){
  1184. mapCode.put("tumorRadiationSecNum",tumorRadiationBehospitalCode);
  1185. }else {
  1186. mapCode.put("tumorRadiationSecNum",null);
  1187. }
  1188. return mapCode;
  1189. }
  1190. }
  1191. /**
  1192. * 获取首页为恶性肿瘤病历code
  1193. */
  1194. public List<String> getMalignancyCode(FilterVO filterVO){
  1195. List<Map<String,String>> malignancyCodeList = behospitalInfoFacade.malignancy(filterVO);
  1196. ArrayList<String> arrayList = new ArrayList<>();
  1197. if(ListUtil.isNotEmpty(malignancyCodeList)) {
  1198. for (Map<String, String> map : malignancyCodeList) {
  1199. String behospitalCode = map.get("behospital_code");
  1200. arrayList.add(behospitalCode);
  1201. }
  1202. }
  1203. return arrayList;
  1204. }
  1205. /**
  1206. * 质控病历统计
  1207. *
  1208. * @param filterVO
  1209. * @return
  1210. */
  1211. public Map<String, Object> mrCount(FilterVO filterVO) {
  1212. Map<String, Object> retMap = new HashMap<>();
  1213. filterFacade.filterVOSet(filterVO);
  1214. List<NumDTO> mrCountList = mrStatisticsAggregate.mrCount(filterVO);
  1215. if (ListUtil.isNotEmpty(mrCountList)) {
  1216. retMap.put("病历数统计", mrCountList);
  1217. }
  1218. return retMap;
  1219. }
  1220. /**
  1221. * 各模块缺陷占比排行
  1222. *
  1223. * @param filterVO
  1224. * @return
  1225. */
  1226. public Map<String, Object> entryCountGroupByCase(FilterVO filterVO) {
  1227. Map<String, Object> retMap = new HashMap<>();
  1228. filterFacade.filterVOSet(filterVO);
  1229. List<NumDTO> caseList = resultStatisticsAggregate.entryCountGroupByCase(filterVO);
  1230. if (ListUtil.isNotEmpty(caseList)) {
  1231. retMap.put("各模块缺陷占比排行", caseList);
  1232. }
  1233. return retMap;
  1234. }
  1235. /**
  1236. * 条目缺陷占比
  1237. *
  1238. * @param filterVO
  1239. * @return
  1240. */
  1241. public Map<String, Object> entryCountGroupByEntry(FilterVO filterVO) {
  1242. Map<String, Object> retMap = new HashMap<>();
  1243. filterFacade.filterVOSet(filterVO);
  1244. List<NumDTO> entryList = resultStatisticsAggregate.entryCountGroupByEntry(filterVO);
  1245. if (ListUtil.isNotEmpty(entryList)) {
  1246. retMap.put("条目缺陷占比", entryList);
  1247. }
  1248. return retMap;
  1249. }
  1250. /**
  1251. * 单项否决缺陷占比
  1252. *
  1253. * @param filterVO
  1254. * @return
  1255. */
  1256. public List<EntryNumDTO> entryRejectPercent(FilterVO filterVO) {
  1257. List<EntryNumDTO> retList = Lists.newLinkedList();
  1258. filterFacade.filterVOSet(filterVO);
  1259. Integer limitCount = filterVO.getLimitCount();
  1260. List<EntryNumDTO> numDTOList = qcresultInfoFacade.entryRejectPercent(filterVO);
  1261. if (ListUtil.isNotEmpty(numDTOList)) {
  1262. if (numDTOList.size() <= limitCount) {
  1263. retList = numDTOList;
  1264. } else {
  1265. retList = numDTOList.subList(0, limitCount);
  1266. }
  1267. }
  1268. return retList;
  1269. }
  1270. /**
  1271. * 各科室甲/乙/丙级病历占比
  1272. *
  1273. * @param filterVO
  1274. * @return
  1275. */
  1276. public List<DeptNumDTO> qcResultLevelPercent(FilterVO filterVO) {
  1277. if (StringUtil.isBlank(filterVO.getLevel())) {
  1278. throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请输入病历等级");
  1279. }
  1280. List<DeptNumDTO> retList = Lists.newLinkedList();
  1281. filterFacade.filterVOSet(filterVO);
  1282. Integer limitCount = filterVO.getLimitCount();
  1283. List<DeptNumDTO> numDTOList = qcresultInfoFacade.qcResultLevelPercent(filterVO);
  1284. if (ListUtil.isNotEmpty(numDTOList)) {
  1285. if (numDTOList.size() <= limitCount) {
  1286. retList = numDTOList;
  1287. } else {
  1288. retList = numDTOList.subList(0, limitCount);
  1289. }
  1290. }
  1291. return retList;
  1292. }
  1293. /**
  1294. * 各科室缺陷占比
  1295. *
  1296. * @param filterVO
  1297. * @return
  1298. */
  1299. public Map<String, Object> entryByDept(FilterVO filterVO) {
  1300. Map<String, Object> retMap = new HashMap<>();
  1301. filterFacade.filterVOSet(filterVO);
  1302. List<NumDTO> deptList = resultStatisticsAggregate.entryByDept(filterVO);
  1303. if (ListUtil.isNotEmpty(deptList)) {
  1304. retMap.put("各科室缺陷占比", deptList);
  1305. }
  1306. return retMap;
  1307. }
  1308. //endregion-----------------------单独接口结束-------------------------------
  1309. //region_______________________分页接口开始-------------------------------
  1310. /**
  1311. * 各模块缺陷占比(分页)
  1312. *
  1313. * @param filterPageVO
  1314. * @return
  1315. */
  1316. public IPage<NumDTO> entryCountGroupByCasePage(FilterPageVO filterPageVO) {
  1317. filterFacade.filterPageVOSet(filterPageVO);
  1318. IPage<NumDTO> page = qcresultInfoFacade.entryCountGroupByCasePage(filterPageVO);
  1319. return page;
  1320. }
  1321. /**
  1322. * 缺陷详情(分页)
  1323. *
  1324. * @param filterPageVO
  1325. * @return
  1326. */
  1327. public IPage<EntryNumGroupDTO> entryCountGroupByEntryPage(FilterPageVO filterPageVO) {
  1328. filterFacade.filterPageVOSet(filterPageVO);
  1329. if (filterPageVO.getDeptName().equals("全院")) {
  1330. filterPageVO.setDeptName("");
  1331. }
  1332. IPage<EntryNumGroupDTO> page = qcresultInfoFacade.entryCountGroupByEntryPage(filterPageVO);
  1333. return page;
  1334. }
  1335. /**
  1336. * 缺陷详情(分页)-湘雅
  1337. *
  1338. * @param filterPageVO
  1339. * @return
  1340. */
  1341. public IPage<EntryNumGroupDTO> entryCountGroupXYByEntryPage(FilterPageXYVO filterPageVO) {
  1342. String hospitalId = SysUserUtils.getCurrentHospitalID();
  1343. String userId = SysUserUtils.getCurrentPrincipleID();
  1344. filterPageVO.setHospitalId(hospitalId);
  1345. filterPageVO.setUserId(Long.valueOf(userId));
  1346. IPage<EntryNumGroupDTO> page = qcresultInfoFacade.getBaseMapper().entryCountGroupXYByEntryPage(filterPageVO);
  1347. return page;
  1348. }
  1349. /**
  1350. * 按科室统计平均住院天数(分页)
  1351. *
  1352. * @param filterPageByAverageVO
  1353. * @return
  1354. */
  1355. public IPage<AverageStatisticsDTO> getAverageDayNumPage(FilterPageByAverageVO filterPageByAverageVO) {
  1356. filterFacade.filterPageByAverageVOSet(filterPageByAverageVO);
  1357. IPage<AverageStatisticsDTO> page = homePageFacade.getAverageDayNumPage(filterPageByAverageVO);
  1358. return page;
  1359. }
  1360. /**
  1361. * 按科室统计平均住院费用(分页)
  1362. *
  1363. * @param filterPageByAverageVO
  1364. * @return
  1365. */
  1366. public IPage<AverageStatisticsFeeDTO> getAverageFeePage(FilterPageByAverageVO filterPageByAverageVO) {
  1367. filterFacade.filterPageByAverageVOSet(filterPageByAverageVO);
  1368. IPage<AverageStatisticsFeeDTO> page = homePageFacade.getAverageFeePage(filterPageByAverageVO);
  1369. return page;
  1370. }
  1371. /**
  1372. * 各科室质控平均分(分页)
  1373. *
  1374. * @param filterPageVO
  1375. * @return
  1376. */
  1377. public IPage<AverageStatisticsDTO> getAverageScoreByDeptPage(FilterPageVO filterPageVO) {
  1378. filterFacade.filterPageVOSet(filterPageVO);
  1379. IPage<AverageStatisticsDTO> page = qcresultInfoFacade.getAverageScoreByDeptPage(filterPageVO);
  1380. return page;
  1381. }
  1382. /**
  1383. * 各科室缺陷占比排行(分页)
  1384. *
  1385. * @param filterPageVO
  1386. * @return
  1387. */
  1388. public IPage<NumDTO> resultStatisticsByDeptPage(FilterPageVO filterPageVO) {
  1389. filterFacade.filterPageVOSet(filterPageVO);
  1390. IPage<NumDTO> page = behospitalInfoFacade.resultStatisticsByDeptPage(filterPageVO);
  1391. return page;
  1392. }
  1393. /**
  1394. * 各科室甲级病历占比排行(分页)
  1395. *
  1396. * @param filterPageVO
  1397. * @return
  1398. */
  1399. public IPage<QcResultPercentDTO> levelPercentGroupByDeptPage(FilterPageVO filterPageVO) {
  1400. filterFacade.filterPageVOSet(filterPageVO);
  1401. IPage<QcResultPercentDTO> page = qcresultInfoFacade.levelPercentGroupByDeptPage(filterPageVO);
  1402. return page;
  1403. }
  1404. /**
  1405. * 条目缺陷占比(内页)
  1406. *
  1407. * @param filterPageVO
  1408. * @return
  1409. */
  1410. public IPage<EntryNumDTO> entryGroupByEntryInnerPage(FilterPageVO filterPageVO) {
  1411. filterFacade.filterPageVOSet(filterPageVO);
  1412. IPage<EntryNumDTO> page = qcresultInfoFacade.entryGroupByEntryInnerPage(filterPageVO);
  1413. return page;
  1414. }
  1415. //endregion-----------------------分页接口结束-------------------------------
  1416. /**
  1417. * 各科室缺陷占比(组合)
  1418. *
  1419. * @param filterOrderVO
  1420. * @return
  1421. */
  1422. public List<LevelStatisticsDTO> levelStatistics(FilterOrderVO filterOrderVO) {
  1423. filterFacade.filterOrderVOSame(filterOrderVO);
  1424. List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatistics(filterOrderVO);
  1425. //没有科室过滤时增加全院数据
  1426. if (StringUtil.isBlank(filterOrderVO.getDeptName()) || filterOrderVO.getDeptName().equals("全院")) {
  1427. LevelStatisticsDTO item = getGlobleTitle(records);
  1428. if (item != null) {
  1429. records.add(0, item);
  1430. }
  1431. }
  1432. if (ListUtil.isNotEmpty(records)) {
  1433. for (LevelStatisticsDTO record : records) {
  1434. BigDecimalMethod(record);
  1435. }
  1436. }
  1437. return records;
  1438. }
  1439. /**
  1440. * 各科室缺陷占比(组合)-导出
  1441. *
  1442. * @param filterOrderVO
  1443. * @return
  1444. */
  1445. public List<LevelStatisticsDTO> levelStatisticsStr(FilterOrderVO filterOrderVO) {
  1446. filterFacade.filterOrderVOSame(filterOrderVO);
  1447. List<LevelStatisticsDTO> records = behospitalInfoFacade.levelStatistics(filterOrderVO);
  1448. //没有科室过滤时增加全院数据
  1449. if (StringUtil.isBlank(filterOrderVO.getDeptName()) || filterOrderVO.getDeptName().equals("全院")) {
  1450. LevelStatisticsDTO item = getGlobleTitle(records);
  1451. if (item != null) {
  1452. records.add(0, item);
  1453. }
  1454. }
  1455. if (ListUtil.isNotEmpty(records)) {
  1456. for (LevelStatisticsDTO record : records) {
  1457. BigDecimalStrExport(record);
  1458. }
  1459. }
  1460. return records;
  1461. }
  1462. /**
  1463. * 增加全院记录
  1464. *
  1465. * @param records
  1466. * @return
  1467. */
  1468. public LevelStatisticsDTO getGlobleTitle(List<LevelStatisticsDTO> records) {
  1469. DecimalFormat df = new DecimalFormat("#0.00");
  1470. LevelStatisticsDTO item = new LevelStatisticsDTO();
  1471. if (ListUtil.isEmpty(records)) {
  1472. return null;
  1473. }
  1474. //缺陷总数
  1475. Integer entryNum = records
  1476. .stream()
  1477. .map(LevelStatisticsDTO::getEntryNum)
  1478. .reduce(0, Integer::sum);
  1479. if (entryNum == null || entryNum == 0) {
  1480. return null;
  1481. }
  1482. //同比总数
  1483. Integer sameNum = records
  1484. .stream()
  1485. .map(LevelStatisticsDTO::getSameNum)
  1486. .reduce(0, Integer::sum);
  1487. //质控病历数
  1488. Integer mrNum = records
  1489. .stream()
  1490. .map(LevelStatisticsDTO::getMrNum)
  1491. .reduce(0, Integer::sum);
  1492. //同比病历数
  1493. Integer sameMrNum = records
  1494. .stream()
  1495. .map(LevelStatisticsDTO::getSameMrNum)
  1496. .reduce(0, Integer::sum);
  1497. //质控评分
  1498. Double totleValue = records
  1499. .stream()
  1500. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  1501. .reduce(BigDecimal.ZERO, BigDecimal::add)
  1502. .doubleValue();
  1503. //同比质控评分
  1504. Double sameTotleValue = records
  1505. .stream()
  1506. .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
  1507. .reduce(BigDecimal.ZERO, BigDecimal::add)
  1508. .doubleValue();
  1509. //质控平均分
  1510. Double averageValue = BigDecimal.valueOf(totleValue)
  1511. .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
  1512. .doubleValue();
  1513. Double sameAvgValue = 0d;
  1514. //同比平均分
  1515. if (0d != sameTotleValue) {
  1516. sameAvgValue = BigDecimal.valueOf(sameTotleValue)
  1517. .divide(BigDecimal.valueOf(sameMrNum), 2, RoundingMode.HALF_UP)
  1518. .doubleValue();
  1519. }
  1520. //甲级病历数
  1521. Integer firstLevelNum = records
  1522. .stream()
  1523. .map(LevelStatisticsDTO::getFirstLevelNum)
  1524. .reduce(0, Integer::sum);
  1525. //同比甲级病历数
  1526. Integer sameFirstLevelNum = records
  1527. .stream()
  1528. .map(LevelStatisticsDTO::getSameFirstLevelNum)
  1529. .reduce(0, Integer::sum);
  1530. //乙级病历数
  1531. Integer secondLevelNum = records
  1532. .stream()
  1533. .map(LevelStatisticsDTO::getSecondLevelNum)
  1534. .reduce(0, Integer::sum);
  1535. //同比乙级病历数
  1536. Integer sameSecondLevelNum = records
  1537. .stream()
  1538. .map(LevelStatisticsDTO::getSameSecondLevelNum)
  1539. .reduce(0, Integer::sum);
  1540. //丙级病历数
  1541. Integer thirdLevelNum = records
  1542. .stream()
  1543. .map(LevelStatisticsDTO::getThirdLevelNum)
  1544. .reduce(0, Integer::sum);
  1545. //同比丙级病历数
  1546. Integer sameThirdLevelNum = records
  1547. .stream()
  1548. .map(LevelStatisticsDTO::getSameThirdLevelNum)
  1549. .reduce(0, Integer::sum);
  1550. //甲级病历占比
  1551. Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
  1552. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  1553. .doubleValue();
  1554. String firstLevelPercentStr
  1555. = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1556. //同比甲级病历占比
  1557. Double sameFirstLevelPercent = 0d;
  1558. String sameFirstLevelPercentStr = "0.00%";
  1559. if (0 != sameFirstLevelNum) {
  1560. sameFirstLevelPercent = BigDecimal.valueOf(sameFirstLevelNum)
  1561. .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
  1562. .doubleValue();
  1563. sameFirstLevelPercentStr
  1564. = df.format(BigDecimal.valueOf(sameFirstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1565. }
  1566. //乙级病历占比
  1567. Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
  1568. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  1569. .doubleValue();
  1570. String secondLevelPercentStr
  1571. = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1572. //同比乙级病历占比
  1573. Double sameSecondLevelPercent = 0d;
  1574. String sameSecondLevelPercentStr = "0.00%";
  1575. if (0 != sameFirstLevelNum) {
  1576. sameSecondLevelPercent = BigDecimal.valueOf(sameSecondLevelNum)
  1577. .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
  1578. .doubleValue();
  1579. sameSecondLevelPercentStr
  1580. = df.format(BigDecimal.valueOf(sameSecondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1581. }
  1582. //丙级病历占比
  1583. Double thirdLevelPercent = BigDecimal.valueOf(thirdLevelNum)
  1584. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  1585. .doubleValue();
  1586. String thirdLevelPercentStr
  1587. = df.format(BigDecimal.valueOf(thirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1588. //同比丙级病历占比
  1589. Double sameThirdLevelPercent = 0d;
  1590. String sameThirdLevelPercentStr = "0.00%";
  1591. if (0 != sameFirstLevelNum) {
  1592. sameThirdLevelPercent = BigDecimal.valueOf(sameThirdLevelNum)
  1593. .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
  1594. .doubleValue();
  1595. sameThirdLevelPercentStr
  1596. = df.format(BigDecimal.valueOf(sameThirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1597. }
  1598. item.setDeptName("全院");
  1599. item.setEntryNum(entryNum);
  1600. item.setSameNum(sameNum);
  1601. item.setMrNum(mrNum);
  1602. item.setSameMrNum(sameMrNum);
  1603. item.setTotleValue(totleValue);
  1604. item.setSameTotleValue(sameTotleValue);
  1605. item.setAverageValue(averageValue);
  1606. item.setSameAvgValue(sameAvgValue);
  1607. item.setFirstLevelNum(firstLevelNum);
  1608. item.setSameFirstLevelNum(sameFirstLevelNum);
  1609. item.setFirstLevelPercent(firstLevelPercent);
  1610. item.setSameFirstLevelPercent(sameFirstLevelPercent);
  1611. item.setFirstLevelPercentStr(firstLevelPercentStr);
  1612. item.setSameFirstLevelPercentStr(sameFirstLevelPercentStr);
  1613. item.setSecondLevelNum(secondLevelNum);
  1614. item.setSameSecondLevelNum(sameSecondLevelNum);
  1615. item.setSecondLevelPercent(secondLevelPercent);
  1616. item.setSameSecondLevelPercent(sameSecondLevelPercent);
  1617. item.setSecondLevelPercentStr(secondLevelPercentStr);
  1618. item.setSameSecondLevelPercentStr(sameSecondLevelPercentStr);
  1619. item.setThirdLevelNum(thirdLevelNum);
  1620. item.setSameThirdLevelNum(sameThirdLevelNum);
  1621. item.setThirdLevelPercent(thirdLevelPercent);
  1622. item.setSameThirdLevelPercent(sameThirdLevelPercent);
  1623. item.setThirdLevelPercentStr(thirdLevelPercentStr);
  1624. item.setSameThirdLevelPercentStr(sameThirdLevelPercentStr);
  1625. return item;
  1626. }
  1627. /**
  1628. * 各科室缺陷占比(组合)-全院-根据内外科系统统计(台州)-导出
  1629. *
  1630. * @param filterOrderVO
  1631. * @return
  1632. */
  1633. public List<LevelStatisticsTZDTO> levelStatisticsByDeptStr_TZ(FilterOrderVO filterOrderVO) {
  1634. filterFacade.filterOrderVOSame(filterOrderVO);
  1635. List<LevelStatisticsTZDTO> records = behospitalInfoFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
  1636. if (StringUtil.isBlank(filterOrderVO.getDeptName())) {
  1637. LevelStatisticsTZDTO item = getGlobleRecords(records, filterOrderVO);
  1638. if (item != null) {
  1639. records.add(0, item);
  1640. }
  1641. }
  1642. if (ListUtil.isNotEmpty(records)) {
  1643. for (LevelStatisticsTZDTO record : records) {
  1644. BigDecimalStrExport(record);
  1645. }
  1646. }
  1647. return records;
  1648. }
  1649. /**
  1650. * 各科室缺陷占比(组合)-全院-根据内外科系统统计(台州)
  1651. *
  1652. * @param filterOrderVO
  1653. * @return
  1654. */
  1655. public List<LevelStatisticsTZDTO> levelStatisticsByDeptClass_TZ(FilterOrderVO filterOrderVO) {
  1656. filterFacade.filterOrderVOSame(filterOrderVO);
  1657. List<LevelStatisticsTZDTO> records = behospitalInfoFacade.levelStatisticsByDeptClass_TZ(filterOrderVO);
  1658. if (StringUtil.isBlank(filterOrderVO.getDeptName())) {
  1659. LevelStatisticsTZDTO item = getGlobleRecords(records, filterOrderVO);
  1660. if (item != null) {
  1661. records.add(0, item);
  1662. }
  1663. }
  1664. if (ListUtil.isNotEmpty(records)) {
  1665. for (LevelStatisticsTZDTO record : records) {
  1666. BigDecimalMethod(record);
  1667. }
  1668. }
  1669. return records;
  1670. }
  1671. /**
  1672. * 增加全院记录
  1673. *
  1674. * @param records
  1675. * @return
  1676. */
  1677. public LevelStatisticsTZDTO getGlobleRecords(List<LevelStatisticsTZDTO> records, FilterOrderVO filterOrderVO) {
  1678. DecimalFormat df = new DecimalFormat("#0.00");
  1679. LevelStatisticsTZDTO item = new LevelStatisticsTZDTO();
  1680. if (ListUtil.isEmpty(records)) {
  1681. return null;
  1682. }
  1683. //缺陷总数
  1684. Integer entryNum = records
  1685. .stream()
  1686. .map(LevelStatisticsTZDTO::getEntryNum)
  1687. .reduce(0, Integer::sum);
  1688. if (entryNum == null || entryNum == 0) {
  1689. return null;
  1690. }
  1691. //同比总数
  1692. Integer sameNum = records
  1693. .stream()
  1694. .map(LevelStatisticsTZDTO::getSameNum)
  1695. .reduce(0, Integer::sum);
  1696. //质控病历数
  1697. Integer mrNum = records
  1698. .stream()
  1699. .map(LevelStatisticsTZDTO::getMrNum)
  1700. .reduce(0, Integer::sum);
  1701. //同比病历数
  1702. Integer sameMrNum = records
  1703. .stream()
  1704. .map(LevelStatisticsTZDTO::getSameMrNum)
  1705. .reduce(0, Integer::sum);
  1706. //质控评分
  1707. Double totleValue = records
  1708. .stream()
  1709. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  1710. .reduce(BigDecimal.ZERO, BigDecimal::add)
  1711. .doubleValue();
  1712. //同比质控评分
  1713. Double sameTotleValue = records
  1714. .stream()
  1715. .map(i -> BigDecimal.valueOf(i.getSameTotleValue()))
  1716. .reduce(BigDecimal.ZERO, BigDecimal::add)
  1717. .doubleValue();
  1718. //质控平均分
  1719. Double averageValue = BigDecimal.valueOf(totleValue)
  1720. .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
  1721. .doubleValue();
  1722. Double sameAvgValue = 0d;
  1723. //同比平均分
  1724. if (0d != sameTotleValue) {
  1725. sameAvgValue = BigDecimal.valueOf(sameTotleValue)
  1726. .divide(BigDecimal.valueOf(sameMrNum), 2, RoundingMode.HALF_UP)
  1727. .doubleValue();
  1728. }
  1729. //甲级病历数
  1730. Integer firstLevelNum = records
  1731. .stream()
  1732. .map(LevelStatisticsTZDTO::getFirstLevelNum)
  1733. .reduce(0, Integer::sum);
  1734. //同比甲级病历数
  1735. Integer sameFirstLevelNum = records
  1736. .stream()
  1737. .map(LevelStatisticsTZDTO::getSameFirstLevelNum)
  1738. .reduce(0, Integer::sum);
  1739. //乙级病历数
  1740. Integer secondLevelNum = records
  1741. .stream()
  1742. .map(LevelStatisticsTZDTO::getSecondLevelNum)
  1743. .reduce(0, Integer::sum);
  1744. //同比乙级病历数
  1745. Integer sameSecondLevelNum = records
  1746. .stream()
  1747. .map(LevelStatisticsTZDTO::getSameSecondLevelNum)
  1748. .reduce(0, Integer::sum);
  1749. //丙级病历数
  1750. Integer thirdLevelNum = records
  1751. .stream()
  1752. .map(LevelStatisticsTZDTO::getThirdLevelNum)
  1753. .reduce(0, Integer::sum);
  1754. //同比丙级病历数
  1755. Integer sameThirdLevelNum = records
  1756. .stream()
  1757. .map(LevelStatisticsTZDTO::getSameThirdLevelNum)
  1758. .reduce(0, Integer::sum);
  1759. //甲级病历占比
  1760. Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
  1761. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  1762. .doubleValue();
  1763. String firstLevelPercentStr
  1764. = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1765. //同比甲级病历占比
  1766. Double sameFirstLevelPercent = 0d;
  1767. String sameFirstLevelPercentStr = "0.00%";
  1768. if (0 != sameFirstLevelNum) {
  1769. sameFirstLevelPercent = BigDecimal.valueOf(sameFirstLevelNum)
  1770. .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
  1771. .doubleValue();
  1772. sameFirstLevelPercentStr
  1773. = df.format(BigDecimal.valueOf(sameFirstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1774. }
  1775. //乙级病历占比
  1776. Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
  1777. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  1778. .doubleValue();
  1779. String secondLevelPercentStr
  1780. = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1781. //同比乙级病历占比
  1782. Double sameSecondLevelPercent = 0d;
  1783. String sameSecondLevelPercentStr = "0.00%";
  1784. if (0 != sameFirstLevelNum) {
  1785. sameSecondLevelPercent = BigDecimal.valueOf(sameSecondLevelNum)
  1786. .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
  1787. .doubleValue();
  1788. sameSecondLevelPercentStr
  1789. = df.format(BigDecimal.valueOf(sameSecondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1790. }
  1791. //丙级病历占比
  1792. Double thirdLevelPercent = BigDecimal.valueOf(thirdLevelNum)
  1793. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  1794. .doubleValue();
  1795. String thirdLevelPercentStr
  1796. = df.format(BigDecimal.valueOf(thirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1797. //同比丙级病历占比
  1798. Double sameThirdLevelPercent = 0d;
  1799. String sameThirdLevelPercentStr = "0.00%";
  1800. if (0 != sameFirstLevelNum) {
  1801. sameThirdLevelPercent = BigDecimal.valueOf(sameThirdLevelNum)
  1802. .divide(BigDecimal.valueOf(sameMrNum), 4, RoundingMode.HALF_UP)
  1803. .doubleValue();
  1804. sameThirdLevelPercentStr
  1805. = df.format(BigDecimal.valueOf(sameThirdLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  1806. }
  1807. if (StringUtil.isBlank(filterOrderVO.getDeptClass()) || filterOrderVO.getDeptClass().equals("全院")) {
  1808. item.setDeptName("全院");
  1809. } else if ("内科".equals(filterOrderVO.getDeptClass())) {
  1810. item.setDeptClassId("01");
  1811. item.setDeptClass("内科");
  1812. item.setDeptName("全部科室");
  1813. } else if ("外科".equals(filterOrderVO.getDeptClass())) {
  1814. item.setDeptClassId("1030000");
  1815. item.setDeptClass("外科");
  1816. item.setDeptName("全部科室");
  1817. }
  1818. item.setEntryNum(entryNum);
  1819. item.setSameNum(sameNum);
  1820. item.setMrNum(mrNum);
  1821. item.setSameMrNum(sameMrNum);
  1822. item.setTotleValue(totleValue);
  1823. item.setSameTotleValue(sameTotleValue);
  1824. item.setAverageValue(averageValue);
  1825. item.setSameAvgValue(sameAvgValue);
  1826. item.setFirstLevelNum(firstLevelNum);
  1827. item.setSameFirstLevelNum(sameFirstLevelNum);
  1828. item.setFirstLevelPercent(firstLevelPercent);
  1829. item.setSameFirstLevelPercent(sameFirstLevelPercent);
  1830. item.setFirstLevelPercentStr(firstLevelPercentStr);
  1831. item.setSameFirstLevelPercentStr(sameFirstLevelPercentStr);
  1832. item.setSecondLevelNum(secondLevelNum);
  1833. item.setSameSecondLevelNum(sameSecondLevelNum);
  1834. item.setSecondLevelPercent(secondLevelPercent);
  1835. item.setSameSecondLevelPercent(sameSecondLevelPercent);
  1836. item.setSecondLevelPercentStr(secondLevelPercentStr);
  1837. item.setSameSecondLevelPercentStr(sameSecondLevelPercentStr);
  1838. item.setThirdLevelNum(thirdLevelNum);
  1839. item.setSameThirdLevelNum(sameThirdLevelNum);
  1840. item.setThirdLevelPercent(thirdLevelPercent);
  1841. item.setSameThirdLevelPercent(sameThirdLevelPercent);
  1842. item.setThirdLevelPercentStr(thirdLevelPercentStr);
  1843. item.setSameThirdLevelPercentStr(sameThirdLevelPercentStr);
  1844. return item;
  1845. }
  1846. public void BigDecimalStrExport(LevelStatisticsDTO record) {
  1847. BigDecimal entrySameBigDecimal = getSubtract(new BigDecimal(record.getEntryNum()), new BigDecimal(record.getSameNum() == null ? 0 : record.getSameNum()));
  1848. if (entrySameBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1849. record.setEntryStrNum(record.getEntryNum() + "↑");
  1850. } else if (entrySameBigDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1851. record.setEntryStrNum(record.getEntryNum() + "↓");
  1852. }
  1853. BigDecimal sameMrNumBigDecimal = getSubtract(new BigDecimal(record.getMrNum()), new BigDecimal(record.getSameMrNum() == null ? 0 : record.getSameMrNum()));
  1854. if (sameMrNumBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1855. record.setMrStrNum(record.getMrNum() + "↑");
  1856. } else if (sameMrNumBigDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1857. record.setMrStrNum(record.getMrNum() + "↓");
  1858. }
  1859. BigDecimal sameAvgValueDecimal = getSubtract(new BigDecimal(record.getAverageValue()), new BigDecimal(record.getSameAvgValue() == null ? 0 : record.getSameAvgValue()));
  1860. if (sameAvgValueDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1861. record.setAverageStrValue(record.getAverageValue() + "↑");
  1862. } else if (sameAvgValueDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1863. record.setAverageStrValue(record.getAverageValue() + "↓");
  1864. }
  1865. BigDecimal SameFirstLevelBigDecimal = getSubtract(new BigDecimal(record.getFirstLevelNum()), new BigDecimal(record.getSameFirstLevelNum() == null ? 0 : record.getSameFirstLevelNum()));
  1866. if (SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1867. record.setFirstLevelStrNum(record.getFirstLevelNum() + "↑");
  1868. } else if (SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1869. record.setFirstLevelStrNum(record.getFirstLevelNum() + "↓");
  1870. }
  1871. BigDecimal SameSecondLevelBigDecimal = getSubtract(new BigDecimal(record.getSecondLevelNum()), new BigDecimal(record.getSameSecondLevelNum() == null ? 0 : record.getSameSecondLevelNum()));
  1872. if (SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1873. record.setSecondLevelStrNum(record.getSecondLevelNum() + "↑");
  1874. } else if (SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1875. record.setSecondLevelStrNum(record.getSecondLevelNum() + "↓");
  1876. }
  1877. BigDecimal SameThirdLevelBigDecimal = getSubtract(new BigDecimal(record.getThirdLevelNum()), new BigDecimal(record.getSameThirdLevelNum() == null ? 0 : record.getSameThirdLevelNum()));
  1878. if (SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1879. record.setThirdLevelStrNum(record.getThirdLevelNum() + "↑");
  1880. } else if (SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1881. record.setThirdLevelStrNum(record.getThirdLevelNum() + "↓");
  1882. }
  1883. BigDecimal SameFirstLevelPeDecimal = getSubtract(new BigDecimal(record.getFirstLevelPercent()), new BigDecimal(record.getSameFirstLevelPercent() == null ? 0 : record.getSameFirstLevelPercent()));
  1884. if (SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1885. record.setFirstLevelPercentStr(record.getFirstLevelPercentStr() + "↑");
  1886. } else if (SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1887. record.setFirstLevelPercentStr(record.getFirstLevelPercentStr() + "↓");
  1888. }
  1889. BigDecimal SameSecondLevelPeDecimal = getSubtract(new BigDecimal(record.getSecondLevelPercent()), new BigDecimal(record.getSameSecondLevelPercent() == null ? 0 : record.getSameSecondLevelPercent()));
  1890. if (SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1891. record.setSecondLevelPercentStr(record.getSecondLevelPercentStr() + "↑");
  1892. } else if (SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1893. record.setSecondLevelPercentStr(record.getSecondLevelPercentStr() + "↓");
  1894. }
  1895. BigDecimal SameThirdLevelPeDecimal = getSubtract(new BigDecimal(record.getThirdLevelPercent()), new BigDecimal(record.getSameThirdLevelPercent() == null ? 0 : record.getSameThirdLevelPercent()));
  1896. if (SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1897. record.setThirdLevelPercentStr(record.getThirdLevelPercentStr() + "↑");
  1898. } else if (SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO) < 0) {
  1899. record.setThirdLevelPercentStr(record.getThirdLevelPercentStr() + "↓");
  1900. }
  1901. }
  1902. ;
  1903. public void BigDecimalMethod(LevelStatisticsDTO record) {
  1904. BigDecimal entrySameBigDecimal = getSubtract(new BigDecimal(record.getEntryNum()), new BigDecimal(record.getSameNum() == null ? 0 : record.getSameNum()));
  1905. if (entrySameBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1906. record.setEntrySameNum(1);
  1907. } else if (entrySameBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1908. record.setEntrySameNum(0);
  1909. } else {
  1910. record.setEntrySameNum(-1);
  1911. }
  1912. BigDecimal sameMrNumBigDecimal = getSubtract(new BigDecimal(record.getMrNum()), new BigDecimal(record.getSameMrNum() == null ? 0 : record.getSameMrNum()));
  1913. if (sameMrNumBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1914. record.setMrSameNum(1);
  1915. } else if (sameMrNumBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1916. record.setMrSameNum(0);
  1917. } else {
  1918. record.setMrSameNum(-1);
  1919. }
  1920. BigDecimal sameAvgValueDecimal = getSubtract(new BigDecimal(record.getAverageValue()), new BigDecimal(record.getSameAvgValue() == null ? 0 : record.getSameAvgValue()));
  1921. if (sameAvgValueDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1922. record.setAvSameValue(1);
  1923. } else if (sameAvgValueDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1924. record.setAvSameValue(0);
  1925. } else {
  1926. record.setAvSameValue(-1);
  1927. }
  1928. BigDecimal SameFirstLevelBigDecimal = getSubtract(new BigDecimal(record.getFirstLevelNum()), new BigDecimal(record.getSameFirstLevelNum() == null ? 0 : record.getSameFirstLevelNum()));
  1929. if (SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1930. record.setFirSameLevelNum(1);
  1931. } else if (SameFirstLevelBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1932. record.setFirSameLevelNum(0);
  1933. } else {
  1934. record.setFirSameLevelNum(-1);
  1935. }
  1936. BigDecimal SameSecondLevelBigDecimal = getSubtract(new BigDecimal(record.getSecondLevelNum()), new BigDecimal(record.getSameSecondLevelNum() == null ? 0 : record.getSameSecondLevelNum()));
  1937. if (SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1938. record.setSecSameLevelNum(1);
  1939. } else if (SameSecondLevelBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1940. record.setSecSameLevelNum(0);
  1941. } else {
  1942. record.setSecSameLevelNum(-1);
  1943. }
  1944. BigDecimal SameThirdLevelBigDecimal = getSubtract(new BigDecimal(record.getThirdLevelNum()), new BigDecimal(record.getSameThirdLevelNum() == null ? 0 : record.getSameThirdLevelNum()));
  1945. if (SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1946. record.setThiSameLevelNum(1);
  1947. } else if (SameThirdLevelBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1948. record.setThiSameLevelNum(0);
  1949. } else {
  1950. record.setThiSameLevelNum(-1);
  1951. }
  1952. BigDecimal SameFirstLevelPeDecimal = getSubtract(new BigDecimal(record.getFirstLevelPercent()), new BigDecimal(record.getSameFirstLevelPercent() == null ? 0 : record.getSameFirstLevelPercent()));
  1953. if (SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1954. record.setFirSameLevelPercent(1);
  1955. } else if (SameFirstLevelPeDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1956. record.setFirSameLevelPercent(0);
  1957. } else {
  1958. record.setFirSameLevelPercent(-1);
  1959. }
  1960. BigDecimal SameSecondLevelPeDecimal = getSubtract(new BigDecimal(record.getSecondLevelPercent()), new BigDecimal(record.getSameSecondLevelPercent() == null ? 0 : record.getSameSecondLevelPercent()));
  1961. if (SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1962. record.setSecSameLevelPercent(1);
  1963. } else if (SameSecondLevelPeDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1964. record.setSecSameLevelPercent(0);
  1965. } else {
  1966. record.setSecSameLevelPercent(-1);
  1967. }
  1968. BigDecimal SameThirdLevelPeDecimal = getSubtract(new BigDecimal(record.getThirdLevelPercent()), new BigDecimal(record.getSameThirdLevelPercent() == null ? 0 : record.getSameThirdLevelPercent()));
  1969. if (SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO) > 0) {
  1970. record.setThiSameLevelPercent(1);
  1971. } else if (SameThirdLevelPeDecimal.compareTo(BigDecimal.ZERO) == 0) {
  1972. record.setThiSameLevelPercent(0);
  1973. } else {
  1974. record.setThiSameLevelPercent(-1);
  1975. }
  1976. }
  1977. ;
  1978. /**
  1979. * 差值计算
  1980. *
  1981. * @param bigDecimalOne
  1982. * @param bigDecimalTwo
  1983. * @return
  1984. */
  1985. private BigDecimal getSubtract(BigDecimal bigDecimalOne, BigDecimal bigDecimalTwo) {
  1986. BigDecimal newBigDecimal = new BigDecimal(0);
  1987. if (null == bigDecimalOne && null != bigDecimalTwo) {
  1988. newBigDecimal = newBigDecimal.subtract(bigDecimalTwo);
  1989. } else if (null != bigDecimalOne && null == bigDecimalTwo) {
  1990. newBigDecimal = bigDecimalOne.subtract(newBigDecimal);
  1991. } else if (null != bigDecimalOne && null != bigDecimalTwo) {
  1992. newBigDecimal = bigDecimalOne.subtract(bigDecimalTwo);
  1993. }
  1994. return newBigDecimal;
  1995. }
  1996. /**
  1997. * 病案首页合格率占比
  1998. *
  1999. * @param filterOrderVO
  2000. * @return
  2001. */
  2002. public List<HomePageNumDTO> homePageLevelStatistics(FilterOrderVO filterOrderVO) {
  2003. filterFacade.filterOrderVOSet(filterOrderVO);
  2004. List<HomePageNumDTO> records = behospitalInfoFacade.homePageLevelStatistics(filterOrderVO);
  2005. //没有科室过滤时增加全院数据
  2006. if (StringUtil.isBlank(filterOrderVO.getDeptName()) || filterOrderVO.getDeptName().equals("全院")) {
  2007. HomePageNumDTO item = getGlobleRecord(records);
  2008. if (item != null) {
  2009. records.add(0, item);
  2010. }
  2011. }
  2012. return records;
  2013. }
  2014. /**
  2015. * 医师病案首页合格率占比 湘雅定制
  2016. *
  2017. * @param filterOrderXYPageVO
  2018. * @return
  2019. */
  2020. public IPage<HomePageNumXYDTO> homePageLevelStatisticsXY(FilterOrderXYPageVO filterOrderXYPageVO) {
  2021. String hospitalId = SysUserUtils.getCurrentHospitalID();
  2022. String userId = SysUserUtils.getCurrentPrincipleID();
  2023. filterOrderXYPageVO.setHospitalId(hospitalId);
  2024. filterOrderXYPageVO.setUserId(Long.valueOf(userId));
  2025. IPage<HomePageNumXYDTO> records = behospitalInfoFacade.homePageLevelStatisticsXY(filterOrderXYPageVO);
  2026. return records;
  2027. }
  2028. /**
  2029. * 病历质控报表
  2030. *
  2031. * @param behospitalPageVO
  2032. * @return
  2033. */
  2034. public IPage<QualityControlDTO> getQualityControl(BehospitalPageVO behospitalPageVO) {
  2035. behospitalPageSet(behospitalPageVO);
  2036. IPage<QualityControlDTO> records = behospitalInfoFacade.getQualityControl(behospitalPageVO);
  2037. List<QualityControlDTO> qualityControlDTOs = records.getRecords();
  2038. CaseScoreVO caseScoreVO = new CaseScoreVO();
  2039. BeanUtil.copyProperties(behospitalPageVO, caseScoreVO);
  2040. List<CaseScoreDTO> caseScoreDTOS = behospitalInfoFacade.getQualityCaseSorce(caseScoreVO);
  2041. if (ListUtil.isNotEmpty(qualityControlDTOs)) {
  2042. qualityControlDTOs.forEach(qualityControlDTO -> {
  2043. if (ListUtil.isNotEmpty(caseScoreDTOS)) {
  2044. AlgorithmVO algorithmVO = new AlgorithmVO();
  2045. BeanUtil.copyProperties(behospitalPageVO, algorithmVO);
  2046. algorithmVO.setType(0);
  2047. List<QcResultAlgVO> qcResultAlgVOList = new ArrayList<QcResultAlgVO>();
  2048. for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
  2049. if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode()) &&
  2050. StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode()) &&
  2051. qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
  2052. QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
  2053. BeanUtil.copyProperties(caseScoreDTO, qcResultAlgVO);
  2054. qcResultAlgVO.setIsReject(Integer.valueOf(caseScoreDTO.getIsReject()));
  2055. qcResultAlgVO.setScore(new BigDecimal(caseScoreDTO.getScore()));
  2056. qcResultAlgVO.setCasesScore(new BigDecimal(caseScoreDTO.getCasesScore()));
  2057. qcResultAlgVOList.add(qcResultAlgVO);
  2058. }
  2059. }
  2060. algorithmVO.setType(0);
  2061. algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
  2062. getScoreForCx(algorithmVO, qualityControlDTO);
  2063. }
  2064. if (qualityControlDTO.getLevel().equals("未评分")) {
  2065. QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
  2066. BeanUtil.copyProperties(qualityControlNullDTO, qualityControlDTO);
  2067. }
  2068. });
  2069. }
  2070. ;
  2071. return records;
  2072. }
  2073. /**
  2074. * 病历质控报表-科室
  2075. *
  2076. * @param behospitalPageVO
  2077. * @return
  2078. */
  2079. public IPage<QualityControlDTO> getQualityControlExport(BehospitalPageVO behospitalPageVO) {
  2080. behospitalPageSet(behospitalPageVO);
  2081. IPage<QualityControlDTO> records = behospitalInfoFacade.getQualityControl(behospitalPageVO);
  2082. List<QualityControlDTO> qualityControlDTOs = records.getRecords();
  2083. CaseScoreVO caseScoreVO = new CaseScoreVO();
  2084. BeanUtil.copyProperties(behospitalPageVO, caseScoreVO);
  2085. List<CaseScoreDTO> caseScoreDTOS = behospitalInfoFacade.getQualityCaseSorce(caseScoreVO);
  2086. if (ListUtil.isNotEmpty(qualityControlDTOs)) {
  2087. qualityControlDTOs.forEach(qualityControlDTO -> {
  2088. if (ListUtil.isNotEmpty(caseScoreDTOS)) {
  2089. AlgorithmVO algorithmVO = new AlgorithmVO();
  2090. BeanUtil.copyProperties(behospitalPageVO, algorithmVO);
  2091. algorithmVO.setType(0);
  2092. List<QcResultAlgVO> qcResultAlgVOList = new ArrayList<QcResultAlgVO>();
  2093. for (CaseScoreDTO caseScoreDTO : caseScoreDTOS) {
  2094. if (StringUtils.isNotEmpty(qualityControlDTO.getBehospitalCode()) &&
  2095. StringUtils.isNotEmpty(caseScoreDTO.getBehospitalCode()) &&
  2096. qualityControlDTO.getBehospitalCode().equals(caseScoreDTO.getBehospitalCode())) {
  2097. QcResultAlgVO qcResultAlgVO = new QcResultAlgVO();
  2098. BeanUtil.copyProperties(caseScoreDTO, qcResultAlgVO);
  2099. qcResultAlgVO.setIsReject(Integer.valueOf(caseScoreDTO.getIsReject()));
  2100. qcResultAlgVO.setScore(new BigDecimal(caseScoreDTO.getScore()));
  2101. qcResultAlgVO.setCasesScore(new BigDecimal(caseScoreDTO.getCasesScore()));
  2102. qcResultAlgVOList.add(qcResultAlgVO);
  2103. }
  2104. }
  2105. algorithmVO.setType(0);
  2106. algorithmVO.setQcResultAlgVOList(qcResultAlgVOList);
  2107. getScoreForCx(algorithmVO, qualityControlDTO);
  2108. }
  2109. if (qualityControlDTO.getLevel().equals("未评分")) {
  2110. QualityControlNullDTO qualityControlNullDTO = new QualityControlNullDTO();
  2111. BeanUtil.copyProperties(qualityControlNullDTO, qualityControlDTO);
  2112. }
  2113. });
  2114. }
  2115. ;
  2116. return records;
  2117. }
  2118. private void behospitalPageSet(BehospitalPageVO behospitalPageVO) {
  2119. //入参验证
  2120. //入院时间
  2121. if (null != behospitalPageVO && null != behospitalPageVO.getBehosDateStart()) {
  2122. behospitalPageVO.setBehosDateStart(DateUtil.getFirstTimeOfDay(behospitalPageVO.getBehosDateStart()));
  2123. }
  2124. if (null != behospitalPageVO && null != behospitalPageVO.getBehosDateEnd()) {
  2125. behospitalPageVO.setBehosDateEnd(DateUtil.getFirstTimeOfDay(DateUtil.addDay(behospitalPageVO.getBehosDateEnd(), 1)));
  2126. }
  2127. if (null != behospitalPageVO && null != behospitalPageVO.getBehosDateStart() && null != behospitalPageVO.getBehosDateEnd()) {
  2128. if (DateUtil.after(behospitalPageVO.getBehosDateStart(), behospitalPageVO.getBehosDateEnd())) {
  2129. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "入院时间的开始时间必须小于结束时间!");
  2130. }
  2131. }
  2132. //出院时间
  2133. if (null != behospitalPageVO && null != behospitalPageVO.getLeaveHosDateStart()) {
  2134. behospitalPageVO.setLeaveHosDateStart(DateUtil.getFirstTimeOfDay(behospitalPageVO.getLeaveHosDateStart()));
  2135. }
  2136. if (null != behospitalPageVO && null != behospitalPageVO.getLeaveHosDateEnd()) {
  2137. behospitalPageVO.setLeaveHosDateEnd(DateUtil.getFirstTimeOfDay(DateUtil.addDay(behospitalPageVO.getLeaveHosDateEnd(), 1)));
  2138. }
  2139. if (null != behospitalPageVO && null != behospitalPageVO.getLeaveHosDateStart() && null != behospitalPageVO.getLeaveHosDateEnd()) {
  2140. if (DateUtil.after(behospitalPageVO.getLeaveHosDateStart(), behospitalPageVO.getLeaveHosDateEnd())) {
  2141. throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "出院时间的开始时间必须小于结束时间!");
  2142. }
  2143. }
  2144. behospitalPageVO.setHospitalId(Long.parseLong(SysUserUtils.getCurrentHospitalID()));
  2145. // behospitalPageVO.setIsPlacefile("1");
  2146. // if (null != behospitalPageVO.getStatisticsType()
  2147. // && null == behospitalPageVO.getLeaveHosDateStart()
  2148. // && null == behospitalPageVO.getLeaveHosDateEnd()) {
  2149. // String startDate = filterFacade.getStartDateStr(behospitalPageVO.getStatisticsType(), null);
  2150. // String endDate = filterFacade.getEndDateStr(behospitalPageVO.getStatisticsType(), null);
  2151. // behospitalPageVO.setLeaveHosDateStart(DateUtil.parseDate(startDate));
  2152. // behospitalPageVO.setLeaveHosDateEnd(DateUtil.parseDate(endDate));
  2153. // }
  2154. }
  2155. /**
  2156. * 病案首页合格率占比
  2157. *
  2158. * @param filterOrderVO
  2159. * @return
  2160. */
  2161. public List<HomePageNumDTO> homePageLevelLimit(FilterOrderVO filterOrderVO) {
  2162. filterFacade.filterOrderVOSet(filterOrderVO);
  2163. List<HomePageNumDTO> records = behospitalInfoFacade.homePageLevelStatistics(filterOrderVO);
  2164. HomePageNumDTO item = getGlobleRecord(records);
  2165. if (item != null) {
  2166. records.add(0, item);
  2167. }
  2168. records = records
  2169. .stream()
  2170. .limit(filterOrderVO.getLimitCount())
  2171. .collect(Collectors.toList());
  2172. return records;
  2173. }
  2174. /**
  2175. * 增加全院记录
  2176. *
  2177. * @param records
  2178. * @return
  2179. */
  2180. public HomePageNumDTO getGlobleRecord(List<HomePageNumDTO> records) {
  2181. DecimalFormat df = new DecimalFormat("#0.00");
  2182. HomePageNumDTO item = new HomePageNumDTO();
  2183. if (ListUtil.isEmpty(records)) {
  2184. return null;
  2185. }
  2186. //总病历数
  2187. Integer mrNum = records
  2188. .stream()
  2189. .map(HomePageNumDTO::getMrNum)
  2190. .reduce(0, Integer::sum);
  2191. if (mrNum == null || mrNum == 0) {
  2192. return null;
  2193. }
  2194. //总缺陷数
  2195. Integer entryNum = records
  2196. .stream()
  2197. .map(HomePageNumDTO::getEntryNum)
  2198. .reduce(0, Integer::sum);
  2199. //总分
  2200. Double totleValue = records
  2201. .stream()
  2202. .map(i -> BigDecimal.valueOf(i.getTotleValue()))
  2203. .reduce(BigDecimal.ZERO, BigDecimal::add)
  2204. .doubleValue();
  2205. //平均分
  2206. Double averageValue = BigDecimal.valueOf(totleValue)
  2207. .divide(BigDecimal.valueOf(mrNum), 2, RoundingMode.HALF_UP)
  2208. .doubleValue();
  2209. //合格病历总数
  2210. Integer firstLevelNum = records
  2211. .stream()
  2212. .map(HomePageNumDTO::getFirstLevelNum)
  2213. .reduce(0, Integer::sum);
  2214. //合格病历占比
  2215. Double firstLevelPercent = BigDecimal.valueOf(firstLevelNum)
  2216. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  2217. .doubleValue();
  2218. String firstLevelPercentStr
  2219. = df.format(BigDecimal.valueOf(firstLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2220. //不合格病历数
  2221. Integer secondLevelNum = records
  2222. .stream()
  2223. .map(HomePageNumDTO::getSecondLevelNum)
  2224. .reduce(0, Integer::sum);
  2225. //不合格病历占比
  2226. Double secondLevelPercent = BigDecimal.valueOf(secondLevelNum)
  2227. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  2228. .doubleValue();
  2229. String secondLevelPercentStr
  2230. = df.format(BigDecimal.valueOf(secondLevelPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2231. //条目缺陷总数(模块下条目*病历数)
  2232. Integer entryTotleNum = records
  2233. .stream()
  2234. .map(HomePageNumDTO::getEntryTotleNum)
  2235. .reduce(0, Integer::sum);
  2236. //空项总数
  2237. Integer emptyNum = records
  2238. .stream()
  2239. .map(HomePageNumDTO::getEmptyNum)
  2240. .reduce(0, Integer::sum);
  2241. Double emptyPercent = BigDecimal.valueOf(entryTotleNum - emptyNum)
  2242. .divide(BigDecimal.valueOf(entryTotleNum), 4, RoundingMode.HALF_UP)
  2243. .doubleValue();
  2244. String emptyPercentStr
  2245. = df.format(BigDecimal.valueOf(emptyPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2246. //错误项总数
  2247. Integer errorNum = records
  2248. .stream()
  2249. .map(HomePageNumDTO::getErrorNum)
  2250. .reduce(0, Integer::sum);
  2251. Double errorPercent = BigDecimal.valueOf(entryTotleNum - errorNum)
  2252. .divide(BigDecimal.valueOf(entryTotleNum), 4, RoundingMode.HALF_UP)
  2253. .doubleValue();
  2254. String errorPercentStr
  2255. = df.format(BigDecimal.valueOf(errorPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2256. item.setDeptName("全院");
  2257. item.setEntryNum(entryNum);
  2258. item.setMrNum(mrNum);
  2259. item.setTotleValue(totleValue);
  2260. item.setAverageValue(averageValue);
  2261. item.setFirstLevelNum(firstLevelNum);
  2262. item.setFirstLevelPercent(firstLevelPercent);
  2263. item.setFirstLevelPercentStr(firstLevelPercentStr);
  2264. item.setSecondLevelNum(secondLevelNum);
  2265. item.setSecondLevelPercent(secondLevelPercent);
  2266. item.setSecondLevelPercentStr(secondLevelPercentStr);
  2267. item.setEntryTotleNum(entryTotleNum);
  2268. item.setEmptyNum(emptyNum);
  2269. item.setEmptyPercent(emptyPercent);
  2270. item.setEmptyPercentStr(emptyPercentStr);
  2271. item.setErrorNum(errorNum);
  2272. item.setErrorPercent(errorPercent);
  2273. item.setErrorPercentStr(errorPercentStr);
  2274. return item;
  2275. }
  2276. /**
  2277. * 条目缺陷质控评分页(内页)
  2278. *
  2279. * @param qcResultShortPageVO
  2280. * @return
  2281. */
  2282. public IPage<QcResultShortDTO> qcResultShortPage(QcResultShortPageVO qcResultShortPageVO) {
  2283. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  2284. IPage<QcResultShortDTO> page = behospitalInfoFacade.qcResultShortPage(qcResultShortPageVO);
  2285. return page;
  2286. }
  2287. /**
  2288. * 条目缺陷质控评分页(内页)-湘雅
  2289. *
  2290. * @param qcResultShortPageVO
  2291. * @return
  2292. */
  2293. public IPage<QcResultShortDTO> qcResultShortXYPage(QcResultShortXYPageVO qcResultShortPageVO) {
  2294. String hospitalId = SysUserUtils.getCurrentHospitalID();
  2295. String userId = SysUserUtils.getCurrentPrincipleID();
  2296. qcResultShortPageVO.setHospitalId(hospitalId);
  2297. qcResultShortPageVO.setUserId(Long.valueOf(userId));
  2298. IPage<QcResultShortDTO> page = behospitalInfoFacade.getBaseMapper().qcResultShortXYPage(qcResultShortPageVO);
  2299. return page;
  2300. }
  2301. /**
  2302. * 关键条目缺陷占比统计
  2303. *
  2304. * @param entryStatisticsVO
  2305. * @return
  2306. */
  2307. public List<EntryStatisticsDTO> entryStatistics(EntryStatisticsVO entryStatisticsVO) {
  2308. filterFacade.entryStatisticsVOSet(entryStatisticsVO);
  2309. if (entryStatisticsVO.getDeptName().equals("全院")) {
  2310. entryStatisticsVO.setDeptName("");
  2311. }
  2312. List<EntryStatisticsDTO> records = behospitalInfoFacade.entryStatistics(entryStatisticsVO);
  2313. //增加全院数据
  2314. if (entryStatisticsVO.getDeptName().equals("")) {
  2315. EntryStatisticsDTO record = getEntryGlobleRecord(records);
  2316. if (record != null) {
  2317. records.add(0, record);
  2318. }
  2319. }
  2320. return records;
  2321. }
  2322. /**
  2323. * 关键条目缺陷占比统计增加全院记录
  2324. *
  2325. * @param records
  2326. * @return
  2327. */
  2328. private EntryStatisticsDTO getEntryGlobleRecord(List<EntryStatisticsDTO> records) {
  2329. DecimalFormat df = new DecimalFormat("#0.00");
  2330. if (ListUtil.isEmpty(records)) {
  2331. return null;
  2332. }
  2333. EntryStatisticsDTO record = new EntryStatisticsDTO();
  2334. record.setDeptName("全院");
  2335. //未在24小时内完成会诊
  2336. Integer consultationNum = records
  2337. .stream()
  2338. .map(EntryStatisticsDTO::getConsultationNum)
  2339. .reduce(0, Integer::sum);
  2340. record.setConsultationNum(consultationNum);
  2341. record.setConsultationEntryId(records.get(0).getConsultationEntryId());
  2342. Integer consultationMRNum = records
  2343. .stream()
  2344. .map(EntryStatisticsDTO::getConsultationMRNum)
  2345. .reduce(0, Integer::sum);
  2346. record.setConsultationMRNum(consultationMRNum);
  2347. if (consultationMRNum != null && !consultationMRNum.equals(0)) {
  2348. Double consultationPercent = BigDecimal.valueOf(consultationNum)
  2349. .divide(BigDecimal.valueOf(consultationMRNum), 4, RoundingMode.HALF_UP)
  2350. .doubleValue();
  2351. String consultationPercentStr
  2352. = df.format(BigDecimal.valueOf(consultationPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2353. record.setConsultationPercent(consultationPercent);
  2354. record.setConsultationPercentStr(consultationPercentStr);
  2355. }
  2356. //手术记录名称不匹配
  2357. Integer operationNameNum = records
  2358. .stream()
  2359. .map(EntryStatisticsDTO::getOperationNameNum)
  2360. .reduce(0, Integer::sum);
  2361. record.setOperationNameNum(operationNameNum);
  2362. record.setOperationNameEntryId(records.get(0).getOperationNameEntryId());
  2363. Integer operationMRNum = records
  2364. .stream()
  2365. .map(EntryStatisticsDTO::getOperationMRNum)
  2366. .reduce(0, Integer::sum);
  2367. record.setOperationMRNum(operationMRNum);
  2368. if (operationMRNum != null && !operationMRNum.equals(0)) {
  2369. Double operationNamePercent = BigDecimal.valueOf(operationNameNum)
  2370. .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
  2371. .doubleValue();
  2372. String operationNamePercentStr
  2373. = df.format(BigDecimal.valueOf(operationNamePercent).multiply(BigDecimal.valueOf(100))) + "%";
  2374. record.setOperationNamePercent(operationNamePercent);
  2375. record.setOperationNamePercentStr(operationNamePercentStr);
  2376. }
  2377. //术后首程未在15分钟内完成
  2378. Integer operation15MinuteNum = records
  2379. .stream()
  2380. .map(EntryStatisticsDTO::getOperation15MinuteNum)
  2381. .reduce(0, Integer::sum);
  2382. record.setOperation15MinuteNum(operation15MinuteNum);
  2383. record.setOperation15MinuteEntryId(records.get(0).getOperation15MinuteEntryId());
  2384. if (operationMRNum != null && !operationMRNum.equals(0)) {
  2385. Double operation15MinutePercent = BigDecimal.valueOf(operation15MinuteNum)
  2386. .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
  2387. .doubleValue();
  2388. String operation15MinutePercentStr
  2389. = df.format(BigDecimal.valueOf(operation15MinutePercent).multiply(BigDecimal.valueOf(100))) + "%";
  2390. record.setOperation15MinutePercent(operation15MinutePercent);
  2391. record.setOperation15MinutePercentStr(operation15MinutePercentStr);
  2392. }
  2393. //病案首页手术时间不匹配
  2394. Integer operationTimeNum = records
  2395. .stream()
  2396. .map(EntryStatisticsDTO::getOperationTimeNum)
  2397. .reduce(0, Integer::sum);
  2398. record.setOperationTimeNum(operationTimeNum);
  2399. record.setOperationTimeEntryId(records.get(0).getOperationTimeEntryId());
  2400. if (operationMRNum != null && !operationMRNum.equals(0)) {
  2401. Double operationTimePercent = BigDecimal.valueOf(operationTimeNum)
  2402. .divide(BigDecimal.valueOf(operationMRNum), 4, RoundingMode.HALF_UP)
  2403. .doubleValue();
  2404. String operationTimePercentStr
  2405. = df.format(BigDecimal.valueOf(operationTimePercent).multiply(BigDecimal.valueOf(100))) + "%";
  2406. record.setOperationTimePercent(operationTimePercent);
  2407. record.setOperationTimePercentStr(operationTimePercentStr);
  2408. }
  2409. //未在6小时内书写危机值记录
  2410. Integer crisisNum = records
  2411. .stream()
  2412. .map(EntryStatisticsDTO::getCrisisNum)
  2413. .reduce(0, Integer::sum);
  2414. record.setCrisisNum(crisisNum);
  2415. record.setCrisisEntryId(records.get(0).getCrisisEntryId());
  2416. Integer crisisMRNum = records
  2417. .stream()
  2418. .map(EntryStatisticsDTO::getCrisisMRNum)
  2419. .reduce(0, Integer::sum);
  2420. record.setCrisisMRNum(crisisMRNum);
  2421. if (crisisMRNum != null && !crisisMRNum.equals(0)) {
  2422. Double crisisPercent = BigDecimal.valueOf(crisisNum)
  2423. .divide(BigDecimal.valueOf(crisisMRNum), 4, RoundingMode.HALF_UP)
  2424. .doubleValue();
  2425. String crisisPercentStr
  2426. = df.format(BigDecimal.valueOf(crisisPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2427. record.setCrisisPercent(crisisPercent);
  2428. record.setCrisisPercentStr(crisisPercentStr);
  2429. }
  2430. //病人住院超过30天,阶段小节书写
  2431. Integer stageSummaryNum = records
  2432. .stream()
  2433. .map(EntryStatisticsDTO::getStageSummaryNum)
  2434. .reduce(0, Integer::sum);
  2435. record.setStageSummaryNum(stageSummaryNum);
  2436. record.setStageSummaryEntryId(records.get(0).getStageSummaryEntryId());
  2437. Integer stageSummaryMRNum = records
  2438. .stream()
  2439. .map(EntryStatisticsDTO::getStageSummaryMRNum)
  2440. .reduce(0, Integer::sum);
  2441. record.setStageSummaryMRNum(stageSummaryMRNum);
  2442. if (stageSummaryMRNum != null && !stageSummaryMRNum.equals(0)) {
  2443. Double stageSummaryPercent = BigDecimal.valueOf(stageSummaryNum)
  2444. .divide(BigDecimal.valueOf(stageSummaryMRNum), 4, RoundingMode.HALF_UP)
  2445. .doubleValue();
  2446. String stageSummaryPercentStr
  2447. = df.format(BigDecimal.valueOf(stageSummaryPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2448. record.setStageSummaryPercent(stageSummaryPercent);
  2449. record.setStageSummaryPercentStr(stageSummaryPercentStr);
  2450. }
  2451. //住院超过31日病人数
  2452. Integer beHosGT31DaysMRNum = records
  2453. .stream()
  2454. .map(EntryStatisticsDTO::getBeHosGT31DaysMRNum)
  2455. .reduce(0, Integer::sum);
  2456. record.setBeHosGT31DaysMRNum(beHosGT31DaysMRNum);
  2457. return record;
  2458. }
  2459. /**
  2460. * 病案首页合格率、完整率、改善率统计
  2461. *
  2462. * @param filterVO
  2463. * @return
  2464. */
  2465. public Map<String, Object> homePageMRCount(FilterVO filterVO) {
  2466. Map<String, Object> retMap = new HashMap<>();
  2467. retMap.put("合格率", null);
  2468. retMap.put("不合格率", null);
  2469. retMap.put("完整率", null);
  2470. retMap.put("改善率", null);
  2471. filterFacade.filterVOSet(filterVO);
  2472. try {
  2473. Map<String, Object> invokeParams = new HashMap<>();
  2474. invokeParams.put("filterVO", filterVO);
  2475. retMap
  2476. = dataBeanAggregateQueryFacade.get("setAllHomePage", invokeParams, Map.class);
  2477. } catch (Exception e) {
  2478. throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
  2479. }
  2480. return retMap;
  2481. }
  2482. /**
  2483. * 离院病人质控评分详情页
  2484. *
  2485. * @param qcResultShortPageVO
  2486. * @return
  2487. */
  2488. public IPage<QcResultShortDTO> leaveHosMRPage(QcResultShortPageVO qcResultShortPageVO) {
  2489. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  2490. IPage<QcResultShortDTO> page = behospitalInfoFacade.leaveHosMRPage(qcResultShortPageVO);
  2491. return page;
  2492. }
  2493. /**
  2494. * 质控核查统计(内页)
  2495. *
  2496. * @param filterOrderVO
  2497. * @return
  2498. */
  2499. public List<HomePageImproveDTO> qcCheckStatistics(FilterOrderVO filterOrderVO) {
  2500. filterFacade.filterOrderVOSet(filterOrderVO);
  2501. List<HomePageImproveDTO> records = behospitalInfoFacade.qcCheckStatistics(filterOrderVO);
  2502. //增加全院数据
  2503. if (StringUtil.isBlank(filterOrderVO.getDeptName()) || filterOrderVO.getDeptName().equals("全院")) {
  2504. HomePageImproveDTO item = getGlobleRecord_improve(records);
  2505. if (item != null) {
  2506. records.add(0, item);
  2507. }
  2508. }
  2509. return records;
  2510. }
  2511. /**
  2512. * 增加全院记录
  2513. *
  2514. * @param records
  2515. * @return
  2516. */
  2517. public HomePageImproveDTO getGlobleRecord_improve(List<HomePageImproveDTO> records) {
  2518. DecimalFormat df = new DecimalFormat("#0.00");
  2519. HomePageImproveDTO item = new HomePageImproveDTO();
  2520. if (ListUtil.isEmpty(records)) {
  2521. return null;
  2522. }
  2523. item.setDeptName("全院");
  2524. //总病历数
  2525. Integer mrNum = records
  2526. .stream()
  2527. .map(HomePageImproveDTO::getMrNum)
  2528. .reduce(0, Integer::sum);
  2529. if (mrNum == null || mrNum == 0) {
  2530. return null;
  2531. }
  2532. item.setMrNum(mrNum);
  2533. //核查病历数
  2534. Integer checkedNum = records
  2535. .stream()
  2536. .map(HomePageImproveDTO::getCheckedNum)
  2537. .reduce(0, Integer::sum);
  2538. item.setCheckedNum(checkedNum);
  2539. if (mrNum != null && !mrNum.equals(0)) {
  2540. //核查病历占比
  2541. Double checkedPercent = BigDecimal.valueOf(checkedNum)
  2542. .divide(BigDecimal.valueOf(mrNum), 4, RoundingMode.HALF_UP)
  2543. .doubleValue();
  2544. String checkedPercentStr
  2545. = df.format(BigDecimal.valueOf(checkedPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2546. item.setCheckedPercent(checkedPercent);
  2547. item.setCheckedPercentStr(checkedPercentStr);
  2548. }
  2549. //带病案首页的病历数
  2550. Integer homePageMRNum = records
  2551. .stream()
  2552. .map(HomePageImproveDTO::getHomePageMRNum)
  2553. .reduce(0, Integer::sum);
  2554. item.setHomePageMRNum(homePageMRNum);
  2555. if (homePageMRNum == null || homePageMRNum.equals(0)) {
  2556. return item;
  2557. }
  2558. //改善病历数
  2559. Integer improveNum = records
  2560. .stream()
  2561. .map(HomePageImproveDTO::getImproveNum)
  2562. .reduce(0, Integer::sum);
  2563. //改善率
  2564. Double improvePercent = BigDecimal.valueOf(improveNum)
  2565. .divide(BigDecimal.valueOf(homePageMRNum), 4, RoundingMode.HALF_UP)
  2566. .doubleValue();
  2567. String improvePercentStr
  2568. = df.format(BigDecimal.valueOf(improvePercent).multiply(BigDecimal.valueOf(100))) + "%";
  2569. //改善至合格病历数
  2570. Integer improveToPassNum = records
  2571. .stream()
  2572. .map(HomePageImproveDTO::getImproveToPassNum)
  2573. .reduce(0, Integer::sum);
  2574. //改善至合格占比
  2575. Double improveToPassPercent = BigDecimal.valueOf(improveToPassNum)
  2576. .divide(BigDecimal.valueOf(homePageMRNum), 4, RoundingMode.HALF_UP)
  2577. .doubleValue();
  2578. String improveToPassPercentStr
  2579. = df.format(BigDecimal.valueOf(improveToPassPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2580. //改善至满分病历数
  2581. Integer improveToFullNum = records
  2582. .stream()
  2583. .map(HomePageImproveDTO::getImproveToFullNum)
  2584. .reduce(0, Integer::sum);
  2585. //改善至满分占比
  2586. Double improveToFullPercent = BigDecimal.valueOf(improveToFullNum)
  2587. .divide(BigDecimal.valueOf(homePageMRNum), 4, RoundingMode.HALF_UP)
  2588. .doubleValue();
  2589. String improveToFullPercentStr
  2590. = df.format(BigDecimal.valueOf(improveToFullPercent).multiply(BigDecimal.valueOf(100))) + "%";
  2591. item.setImproveNum(improveNum);
  2592. item.setImprovePercent(improvePercent);
  2593. item.setImprovePercentStr(improvePercentStr);
  2594. item.setImproveToPassNum(improveToPassNum);
  2595. item.setImproveToPassPercent(improveToPassPercent);
  2596. item.setImproveToPassPercentStr(improveToPassPercentStr);
  2597. item.setImproveToFullNum(improveToFullNum);
  2598. item.setImproveToFullPercent(improveToFullPercent);
  2599. item.setImproveToFullPercentStr(improveToFullPercentStr);
  2600. return item;
  2601. }
  2602. /**
  2603. * 未整改病历统计
  2604. *
  2605. * @param filterUnModifyMRVO
  2606. * @return
  2607. */
  2608. public UnModifyMRDTO unModifyMRStatistics(FilterUnModifyMRVO filterUnModifyMRVO) {
  2609. UnModifyMRDTO unModifyMRDTO = new UnModifyMRDTO();
  2610. List<Object> retList = Lists.newLinkedList();
  2611. filterFacade.filterUnModifyMRVOSet(filterUnModifyMRVO);
  2612. //colums
  2613. QueryWrapper<SysHospitalSet> hospitalSetQueryWrapper = new QueryWrapper<>();
  2614. hospitalSetQueryWrapper.eq("is_deleted", 'N')
  2615. .eq("hospital_id", filterUnModifyMRVO.getHospitalId())
  2616. .eq("code", "unmodify_mr_entry");
  2617. SysHospitalSet hospitalSet = sysHospitalSetFacade.getOne(hospitalSetQueryWrapper);
  2618. if (hospitalSet == null || StringUtil.isBlank(hospitalSet.getValue())) {
  2619. return unModifyMRDTO;
  2620. }
  2621. //表头生成
  2622. List<String> columnSet = Arrays.asList(hospitalSet.getValue().split(","));
  2623. List<ColumnDTO> columns = Lists.newLinkedList();
  2624. Integer orderNo = 1;
  2625. ColumnDTO columnDeptId = new ColumnDTO();
  2626. columnDeptId.setOrderNo(orderNo);
  2627. columnDeptId.setFieldName("deptId");
  2628. columnDeptId.setColumnName("科室编码");
  2629. columnDeptId.setIsShow(0);
  2630. columns.add(columnDeptId);
  2631. orderNo++;
  2632. ColumnDTO columnDeptName = new ColumnDTO();
  2633. columnDeptName.setOrderNo(orderNo);
  2634. columnDeptName.setFieldName("deptName");
  2635. columnDeptName.setColumnName("科室");
  2636. columnDeptName.setIsShow(1);
  2637. columns.add(columnDeptName);
  2638. orderNo++;
  2639. List<Long> casesEntryIds = Lists.newArrayList();
  2640. for (String valueStr : columnSet) {
  2641. if (StringUtil.isBlank(valueStr)) {
  2642. continue;
  2643. }
  2644. String[] keyValue = valueStr.split("--");
  2645. if (keyValue != null || keyValue.length > 1) {
  2646. casesEntryIds.add(Long.valueOf(keyValue[0]));
  2647. ColumnDTO columnId = new ColumnDTO();
  2648. columnId.setOrderNo(orderNo);
  2649. columnId.setId(Long.valueOf(keyValue[0]));
  2650. columnId.setFieldName("entry_" + keyValue[0] + "_id");
  2651. columnId.setColumnName(keyValue[1] + "id");
  2652. columnId.setIsShow(0);
  2653. columns.add(columnId);
  2654. orderNo++;
  2655. ColumnDTO columnName = new ColumnDTO();
  2656. columnName.setOrderNo(orderNo);
  2657. columnName.setId(Long.valueOf(keyValue[0]));
  2658. columnName.setFieldName("entry_" + keyValue[0] + "_name");
  2659. columnName.setColumnName(keyValue[1] + "name");
  2660. columnName.setIsShow(0);
  2661. columns.add(columnName);
  2662. orderNo++;
  2663. ColumnDTO columnNum = new ColumnDTO();
  2664. columnNum.setOrderNo(orderNo);
  2665. columnNum.setId(Long.valueOf(keyValue[0]));
  2666. columnNum.setFieldName("entry_" + keyValue[0] + "_num");
  2667. columnNum.setColumnName(keyValue[1]);
  2668. columnNum.setIsShow(1);
  2669. columns.add(columnNum);
  2670. orderNo++;
  2671. }
  2672. }
  2673. //条目未维护
  2674. if (ListUtil.isEmpty(casesEntryIds)) {
  2675. return unModifyMRDTO;
  2676. }
  2677. //casesEntryIds
  2678. filterUnModifyMRVO.setCasesEntryIds(casesEntryIds);
  2679. QueryWrapper<QcCasesEntry> qcCasesEntryQueryWrapper = new QueryWrapper<>();
  2680. qcCasesEntryQueryWrapper.eq("is_deleted", "N")
  2681. .in("id", casesEntryIds);
  2682. List<QcCasesEntry> casesEntryList = qcCasesEntryFacade.list(qcCasesEntryQueryWrapper);
  2683. // 实体类中将实体类转化为map形式,其中条目id对应目标条目名称
  2684. Map<Long, String> basCasesEntryMap = EntityUtil.makeMapWithKeyValue(casesEntryList, "id", "name");
  2685. List<UnModifyMRDetailDTO> records = behospitalInfoFacade.unModifyMRStatistics(filterUnModifyMRVO);
  2686. //以科室分组,将符合科室的每条数据以map形式存储
  2687. Map<String, List<UnModifyMRDetailDTO>> deptMap = EntityUtil.makeEntityListMap(records, "deptName");
  2688. //科室对应科室id
  2689. Map<String, String> deptInfoMap = EntityUtil.makeMapWithKeyValue(records, "deptName", "deptId");
  2690. Map<String, Map<Long, UnModifyMRDetailDTO>> deptEntryMap = new LinkedHashMap<>();
  2691. for (Map.Entry<String, List<UnModifyMRDetailDTO>> entry : deptMap.entrySet()) {
  2692. Map<Long, UnModifyMRDetailDTO> entryMap = EntityUtil.makeEntityMap(entry.getValue(), "casesEntryId");
  2693. deptEntryMap.put(entry.getKey(), entryMap);
  2694. }
  2695. try {
  2696. for (Map.Entry<String, Map<Long, UnModifyMRDetailDTO>> entry : deptEntryMap.entrySet()) {
  2697. Object obj = new Object();
  2698. HashMap addMap = new HashMap();
  2699. HashMap addValMap = new HashMap();
  2700. addMap.put("deptName", Class.forName("java.lang.String"));
  2701. addValMap.put("deptName", entry.getKey());
  2702. addMap.put("deptId", Class.forName("java.lang.String"));
  2703. addValMap.put("deptId", deptInfoMap.get(entry.getKey()));
  2704. for (ColumnDTO item : columns) {
  2705. if (item.getFieldName().lastIndexOf("_id") > 0) {
  2706. addMap.put(item.getFieldName(), Class.forName("java.lang.Long"));
  2707. if (item.getId() != null) {
  2708. addValMap.put(item.getFieldName(), item.getId());
  2709. } else {
  2710. addValMap.put(item.getFieldName(), null);
  2711. }
  2712. } else if (item.getFieldName().lastIndexOf("_name") > 0) {
  2713. addMap.put(item.getFieldName(), Class.forName("java.lang.String"));
  2714. if (basCasesEntryMap.containsKey(item.getId())) {
  2715. addValMap.put(item.getFieldName(), basCasesEntryMap.get(item.getId()));
  2716. } else {
  2717. addValMap.put(item.getFieldName(), "");
  2718. }
  2719. } else if (item.getFieldName().lastIndexOf("_num") > 0) {
  2720. addMap.put(item.getFieldName(), Class.forName("java.lang.Integer"));
  2721. if (entry.getValue().containsKey(item.getId())) {
  2722. addValMap.put(item.getFieldName(), entry.getValue().get(item.getId()).getCasesEntryNum());
  2723. } else {
  2724. addValMap.put(item.getFieldName(), 0);
  2725. }
  2726. }
  2727. }
  2728. obj = new ClassUtil().dynamicClass(obj, addMap, addValMap);
  2729. retList.add(obj);
  2730. }
  2731. } catch (Exception e) {
  2732. e.printStackTrace();
  2733. }
  2734. //排序
  2735. Collections.sort(retList, new Comparator<Object>() {
  2736. @Override
  2737. public int compare(Object o1, Object o2) {
  2738. if (StringUtil.isNotBlank(filterUnModifyMRVO.getAsc())) {
  2739. //升序
  2740. Object o1Val = ObjectUtil.getValueByKey(o1, filterUnModifyMRVO.getAsc());
  2741. Object o2Val = ObjectUtil.getValueByKey(o2, filterUnModifyMRVO.getAsc());
  2742. if (filterUnModifyMRVO.getAsc().lastIndexOf("_num") > 1) {
  2743. return ((Integer) o1Val).compareTo((Integer) o2Val);
  2744. }
  2745. if (filterUnModifyMRVO.getAsc().lastIndexOf("_id") > 1) {
  2746. return ((Long) o1Val).compareTo((Long) o2Val);
  2747. } else {
  2748. return ((String) o1Val).compareTo((String) o2Val);
  2749. }
  2750. } else if (StringUtil.isNotBlank(filterUnModifyMRVO.getDesc())) {
  2751. //降序
  2752. Object o1Val = ObjectUtil.getValueByKey(o1, filterUnModifyMRVO.getDesc());
  2753. Object o2Val = ObjectUtil.getValueByKey(o2, filterUnModifyMRVO.getDesc());
  2754. if (filterUnModifyMRVO.getDesc().lastIndexOf("_num") > 1) {
  2755. return ((Integer) o2Val).compareTo((Integer) o1Val);
  2756. }
  2757. if (filterUnModifyMRVO.getDesc().lastIndexOf("_id") > 1) {
  2758. return ((Long) o2Val).compareTo((Long) o1Val);
  2759. } else {
  2760. return ((String) o2Val).compareTo((String) o1Val);
  2761. }
  2762. } else {
  2763. return 0;
  2764. }
  2765. }
  2766. });
  2767. //增加全院数据
  2768. if (ListUtil.isNotEmpty(retList) &&
  2769. (StringUtil.isBlank(filterUnModifyMRVO.getDeptName())
  2770. || filterUnModifyMRVO.getDeptName().equals("全院"))) {
  2771. try {
  2772. Object globleObj = new Object();
  2773. HashMap addMap = new HashMap();
  2774. HashMap addValMap = new HashMap();
  2775. addMap.put("deptId", Class.forName("java.lang.String"));
  2776. addValMap.put("deptId", "");
  2777. addMap.put("deptName", Class.forName("java.lang.String"));
  2778. addValMap.put("deptName", "全院");
  2779. for (ColumnDTO item : columns) {
  2780. if (item.getFieldName().lastIndexOf("_id") > 0) {
  2781. addMap.put(item.getFieldName(), Class.forName("java.lang.Long"));
  2782. if (item.getId() != null) {
  2783. addValMap.put(item.getFieldName(), item.getId());
  2784. } else {
  2785. addValMap.put(item.getFieldName(), null);
  2786. }
  2787. } else if (item.getFieldName().lastIndexOf("_name") > 0) {
  2788. addMap.put(item.getFieldName(), Class.forName("java.lang.String"));
  2789. if (basCasesEntryMap.containsKey(item.getId())) {
  2790. addValMap.put(item.getFieldName(), basCasesEntryMap.get(item.getId()));
  2791. } else {
  2792. addValMap.put(item.getFieldName(), "");
  2793. }
  2794. } else if (item.getFieldName().lastIndexOf("_num") > 0) {
  2795. addMap.put(item.getFieldName(), Class.forName("java.lang.Integer"));
  2796. Integer entryNum = retList
  2797. .stream()
  2798. .map(i -> ObjectUtil.getValueByKey(i, item.getFieldName()))
  2799. .filter(i -> i != null)
  2800. .map(i -> (Integer) i)
  2801. .reduce(0, Integer::sum);
  2802. addValMap.put(item.getFieldName(), entryNum);
  2803. }
  2804. }
  2805. globleObj = new ClassUtil().dynamicClass(globleObj, addMap, addValMap);
  2806. retList.add(0, globleObj);
  2807. } catch (Exception e) {
  2808. e.printStackTrace();
  2809. }
  2810. }
  2811. unModifyMRDTO.setColumns(columns);
  2812. unModifyMRDTO.setData(retList);
  2813. return unModifyMRDTO;
  2814. }
  2815. /**
  2816. * 未整改病历质控评分页(内页)
  2817. *
  2818. * @param qcResultShortPageVO
  2819. * @return
  2820. */
  2821. public IPage<QcResultShortDTO> unModifyMRPage(QcResultShortPageVO qcResultShortPageVO) {
  2822. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  2823. return behospitalInfoFacade.unModifyMRPage(qcResultShortPageVO);
  2824. }
  2825. /**
  2826. * 不合格/合格数病历号(内页)
  2827. *
  2828. * @param qcResultPageVO
  2829. * @return
  2830. */
  2831. public IPage<QcResultShortDTO> badLevelPage(QcResultPageVO qcResultPageVO) {
  2832. filterFacade.badLevelPageVOSet(qcResultPageVO);
  2833. return behospitalInfoFacade.badLevelPage(qcResultPageVO);
  2834. }
  2835. /**
  2836. * 不合格/合格数病历号(内页)-湘雅
  2837. *
  2838. * @param qcResultPageVO
  2839. * @return
  2840. */
  2841. public IPage<QcResultShortDTO> badLevelXYPage(QcResultPageXYVO qcResultPageVO) {
  2842. String hospitalId = SysUserUtils.getCurrentHospitalID();
  2843. String userId = SysUserUtils.getCurrentPrincipleID();
  2844. qcResultPageVO.setHospitalId(hospitalId);
  2845. qcResultPageVO.setUserId(Long.valueOf(userId));
  2846. return behospitalInfoFacade.getBaseMapper().badLevelXYPage(qcResultPageVO);
  2847. }
  2848. /**
  2849. * 31天再入院详情页
  2850. *
  2851. * @param reBeHosPageVO
  2852. * @return
  2853. */
  2854. public IPage<ReBeHosDTO> reHos31DaysPage(ReBeHosPageVO reBeHosPageVO) {
  2855. filterFacade.reBeHosPageVOSet(reBeHosPageVO);
  2856. long size = reBeHosPageVO.getSize();
  2857. long current = reBeHosPageVO.getCurrent();
  2858. reBeHosPageVO.setCurrent(1L);
  2859. reBeHosPageVO.setSize(Long.MAX_VALUE);
  2860. IPage<ReBeHosMergeDTO> page = behospitalInfoFacade.reHos31DaysPage(reBeHosPageVO);
  2861. List<ReBeHosMergeDTO> records = page.getRecords();
  2862. IPage<ReBeHosDTO> retPage = new Page<>();
  2863. if (ListUtil.isNotEmpty(records)) {
  2864. BeanUtil.copyProperties(page, retPage);
  2865. List<ReBeHosDTO> retRecords = Lists.newLinkedList();
  2866. Iterator<ReBeHosMergeDTO> iterator = records.iterator();
  2867. while(iterator.hasNext()){
  2868. ReBeHosMergeDTO record = iterator.next();
  2869. ConsoleByDeptFacade.strTrans(record);
  2870. Boolean flag = isContainDiagnose(record);
  2871. if(!flag){
  2872. iterator.remove();
  2873. continue;
  2874. }
  2875. ReBeHosDTO retRecord = new ReBeHosDTO();
  2876. BeanUtil.copyProperties(record, retRecord);
  2877. List<ReBeHosDetailDTO> details = Lists.newLinkedList();
  2878. ReBeHosDetailDTO detailRecord = new ReBeHosDetailDTO();
  2879. BeanUtil.copyProperties(record, detailRecord);
  2880. details.add(detailRecord);
  2881. ReBeHosDetailDTO lastDetailRecord = new ReBeHosDetailDTO();
  2882. lastDetailRecord.setName(record.getName());
  2883. lastDetailRecord.setAge(record.getLastAge());
  2884. lastDetailRecord.setDiagnose(record.getLastDiagnose());
  2885. lastDetailRecord.setDiagnoseName(record.getLastDiagnoseName());
  2886. lastDetailRecord.setBehDeptId(record.getLastBehDeptId());
  2887. lastDetailRecord.setBehDeptName(record.getLastBehDeptName());
  2888. lastDetailRecord.setBehospitalCode(record.getLastBehospitalCode());
  2889. lastDetailRecord.setBehospitalDate(record.getLastBehospitalDate());
  2890. lastDetailRecord.setLeaveHospitalDate(record.getLastLeaveHospitalDate());
  2891. lastDetailRecord.setLevel(record.getLastLevel());
  2892. lastDetailRecord.setScoreRes(record.getLastScoreRes());
  2893. lastDetailRecord.setBehospitalDayNum(record.getLastBehospitalDayNum());
  2894. lastDetailRecord.setTotleFee(record.getLastTotleFee());
  2895. details.add(lastDetailRecord);
  2896. retRecord.setDetails(details);
  2897. retRecords.add(retRecord);
  2898. }
  2899. //首页返回全部数据
  2900. if(reBeHosPageVO.getFlag()==31){
  2901. retPage.setRecords(retRecords);
  2902. return retPage;
  2903. }
  2904. //导出操作
  2905. if(reBeHosPageVO.getFlag()==1){
  2906. size = retRecords.size();
  2907. }
  2908. retPage.setSize(size);
  2909. retPage.setTotal(retRecords.size());
  2910. retPage.setCurrent(current);
  2911. //数据返回索引处理
  2912. if(0 == current){
  2913. current = 1;
  2914. }
  2915. int startIndex = ((int)current -1)*10;
  2916. int endIndex = startIndex + (int) size;
  2917. if(retRecords.size()>1){
  2918. if( retRecords.size()-startIndex<(int)size){
  2919. retRecords = retRecords.subList(startIndex,retRecords.size());
  2920. }else{
  2921. retRecords = retRecords.subList(startIndex,endIndex );
  2922. }
  2923. }
  2924. retPage.setRecords(retRecords);
  2925. }
  2926. return retPage;
  2927. }
  2928. static Boolean isContainDiagnose(ReBeHosMergeDTO record){
  2929. // String lastDiagnoseName = replace(record.getLastDiagnoseName());本身使用,分隔
  2930. String diagnose =replace(record.getDiagnose());//手动分隔
  2931. String lastDiagnose = replace(record.getLastDiagnose());
  2932. record.setDiagnose(diagnose);
  2933. record.setLastDiagnose(lastDiagnose);
  2934. Set lastDiagnoseNames = strTranListMethod(record.getLastDiagnoseName());
  2935. Set diagnoses = strTranListMethod(record.getDiagnose());
  2936. long count = diagnoses.stream().filter(obj ->null != lastDiagnoseNames && null != obj && lastDiagnoseNames.contains(obj)).count();
  2937. if(count<=0){
  2938. return false;
  2939. }
  2940. return true;
  2941. };
  2942. static String replace(String str){
  2943. if(StringUtils.isEmpty(str)){
  2944. return null;
  2945. }
  2946. str = str.trim().replace(";", ",").replace(";", ",")
  2947. .replace("、", ",").replace(",", ",")
  2948. .replace("|", ",").replace(" ", ",")
  2949. .replace(":", ",") .replace(":", ",");
  2950. if(str.startsWith(",")){
  2951. str = str.substring(1);
  2952. }
  2953. if(str.endsWith(",")){
  2954. str = str.substring(0,str.length()-1);
  2955. }
  2956. return str;
  2957. }
  2958. static Set strTranListMethod(String str){
  2959. Set<String> names = new HashSet<>();
  2960. if(StringUtils.isNotEmpty(str)){
  2961. if(str.contains(",") && str.length()>1){
  2962. for (String diagnoseName : str.split(",")) {
  2963. names.add(diagnoseName);
  2964. }
  2965. }else{
  2966. names.add(str);
  2967. }
  2968. }
  2969. return names;
  2970. };
  2971. /**
  2972. * 入院人数统计(首页)
  2973. *
  2974. * @param filterVO
  2975. * @return
  2976. */
  2977. public List<NumDTO> beHosCount(FilterVO filterVO) {
  2978. filterFacade.filterVOSet(filterVO);
  2979. List<NumDTO> records = behospitalInfoFacade.beHosCount(filterVO);
  2980. if (ListUtil.isNotEmpty(records)) {
  2981. NumDTO globleRecord = new NumDTO();
  2982. globleRecord.setName("全院");
  2983. Integer num = records.stream()
  2984. .map(NumDTO::getNum)
  2985. .reduce(0, Integer::sum);
  2986. globleRecord.setNum(num);
  2987. records.add(0, globleRecord);
  2988. }
  2989. if (ListUtil.isNotEmpty(records) && records.size() > filterVO.getLimitCount()) {
  2990. records = records.subList(0, 10);
  2991. }
  2992. return records;
  2993. }
  2994. /**
  2995. * 单条条目缺陷统计(首页)
  2996. *
  2997. * @param filterVO
  2998. * @return
  2999. */
  3000. public List<NumDTO> casesEntryStatisticsById(FilterVO filterVO) {
  3001. filterFacade.filterVOSet(filterVO);
  3002. List<NumDTO> records = behospitalInfoFacade.casesEntryStatisticsById(filterVO);
  3003. if (ListUtil.isNotEmpty(records)) {
  3004. NumDTO globleRecord = new NumDTO();
  3005. globleRecord.setName("全院");
  3006. Integer num = records.stream()
  3007. .map(NumDTO::getNum)
  3008. .reduce(0, Integer::sum);
  3009. globleRecord.setNum(num);
  3010. records.add(0, globleRecord);
  3011. }
  3012. if (ListUtil.isNotEmpty(records) && records.size() > filterVO.getLimitCount()) {
  3013. records = records.subList(0, 10);
  3014. }
  3015. return records;
  3016. }
  3017. /**
  3018. * 病案首页改善率质控评分页(内页)
  3019. *
  3020. * @param qcResultShortPageVO
  3021. * @return
  3022. */
  3023. public IPage<QcResultShortDTO> hmImproveMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO) {
  3024. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  3025. return behospitalInfoFacade.hmImproveMRPage(qcResultShortPageVO);
  3026. }
  3027. //指标十四 恶性肿瘤放射治疗
  3028. private List<Map<String, String>> tumorRadiationMethod(Map<String, Double> medManageParams,List<Map<String, String>> retList, Map<String, Long> triggeringRulesMap){
  3029. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3030. //接受肿瘤放射治疗的质控病历总数
  3031. Double count = medManageParams.get("tumorRadiationResult");
  3032. String num = null;
  3033. if( null == count){
  3034. count = 0d;
  3035. }
  3036. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3037. double tumorRadiationDo = currencyCal(count, triggeringRulesMap.get("tumorRadiationNum"));//triggeringRules(filterVO)
  3038. num = String.valueOf(tumorRadiationDo);
  3039. if(tumorRadiationDo<0d){
  3040. num = null;
  3041. }
  3042. };
  3043. firMap.put("name","恶性肿瘤放射治疗记录符合率");
  3044. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3045. firMap.put("num",String.valueOf(count));
  3046. retList.add(firMap);
  3047. return retList;
  3048. }
  3049. //指标十六 植入物相关记录符合率
  3050. private List<Map<String, String>> implantsMethod(Map<String, Double> medManageParams,List<Map<String, String>> retList, Map<String, Long> triggeringRulesMap){
  3051. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3052. //使用植入物的质控病历总数
  3053. Double count = medManageParams.get("implantsResult");
  3054. if( null == count){
  3055. count = 0d;
  3056. }
  3057. String num = null;
  3058. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3059. double implantsDo = currencyCal(count, triggeringRulesMap.get("implantsNum"));//triggeringRules(filterVO)
  3060. num = String.valueOf(implantsDo);
  3061. if(implantsDo<0d){
  3062. num = null;
  3063. }
  3064. };
  3065. firMap.put("name","植入物相关记录符合率");
  3066. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3067. firMap.put("num",String.valueOf(count));
  3068. retList.add(firMap);
  3069. return retList;
  3070. }
  3071. //指标十八 抢救记录
  3072. private List<Map<String, String>> rescueMethod( Map<String, Double> medManageParams, List<Map<String, String>> retList,Map<String, Long> triggeringRulesMap){
  3073. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3074. //接受抢救的质控病历总数
  3075. Double count = medManageParams.get("rescueResult");
  3076. if( null == count){
  3077. count = 0d;
  3078. }
  3079. String num = null;
  3080. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3081. double rescueDo = currencyCal(count, triggeringRulesMap.get("rescueNum"));
  3082. num = String.valueOf(rescueDo);
  3083. if(rescueDo<0d){
  3084. num = null;
  3085. }
  3086. };
  3087. firMap.put("name","患者抢救记录及时完成率");
  3088. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3089. firMap.put("num",String.valueOf(count));
  3090. retList.add(firMap);
  3091. return retList;
  3092. };
  3093. //指标十七 医师查房记录
  3094. private List<Map<String, String>> WardRoundMethod( List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
  3095. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3096. String num = null;
  3097. Object forWorkNum = baseIndex.get("forWorkNum");
  3098. if( triggeringRulesMap.containsKey("WardRoundNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
  3099. double wardRoundDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("WardRoundNum"));
  3100. num = String.valueOf(wardRoundDo);
  3101. if(wardRoundDo<0d){
  3102. num = null;
  3103. }
  3104. };
  3105. firMap.put("name","医师查房记录完成率");
  3106. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3107. if(null == forWorkNum){
  3108. firMap.put("num","0");
  3109. }else{
  3110. firMap.put("num",baseIndex.get("forWorkNum").toString());
  3111. }
  3112. retList.add(firMap);
  3113. return retList;
  3114. }
  3115. //指标二十二 不合理复制病历发生率
  3116. private List<Map<String, String>> unreasonedCopyMethod( List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
  3117. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3118. String num = null;
  3119. Object forWorkNum = baseIndex.get("forWorkNum");
  3120. if( triggeringRulesMap.containsKey("unreasonedCopyNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
  3121. double wardRoundDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("unreasonedCopyNum"));
  3122. num = String.valueOf(wardRoundDo);
  3123. if(wardRoundDo<0d){
  3124. num = null;
  3125. }
  3126. };
  3127. firMap.put("name","不合理复制病历发生率");
  3128. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3129. if(null == forWorkNum){
  3130. firMap.put("num","0");
  3131. }else{
  3132. firMap.put("num",baseIndex.get("forWorkNum").toString());
  3133. }
  3134. retList.add(firMap);
  3135. return retList;
  3136. };
  3137. //指标二十三 知情同意书规范签署率
  3138. private List<Map<String, String>> contentSignMethod(List<Map<String, String>> retList, Map<String, Object> baseIndex, Map<String, Long> triggeringRulesMap){
  3139. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3140. Object forWorkNum = baseIndex.get("forWorkNum");
  3141. String num = null;
  3142. if( triggeringRulesMap.containsKey("InformedNum") && baseIndex.containsKey("forWorkNum") && !baseIndex.get("forWorkNum").toString().equals("0")){
  3143. double InformedDo = currencyCal(baseIndex.get("forWorkNum"), triggeringRulesMap.get("InformedNum"));
  3144. num = String.valueOf(InformedDo);
  3145. if(InformedDo<0d){
  3146. num = null;
  3147. }
  3148. }
  3149. firMap.put("name","知情同意书规范签署率");
  3150. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3151. if(null == forWorkNum){
  3152. firMap.put("num","0");
  3153. }else{
  3154. firMap.put("num",baseIndex.get("forWorkNum").toString());
  3155. }
  3156. retList.add(firMap);
  3157. return retList;
  3158. }
  3159. //指标十四 手术记录
  3160. private List<Map<String, String>> operationMethod(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Long> triggeringRulesMap){
  3161. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3162. String operationFeeNum = medManageParams.get("operationFeeNum")+"";
  3163. if(StringUtils.isEmpty(operationFeeNum)){
  3164. operationFeeNum = "0";
  3165. }
  3166. String num = null;
  3167. if( triggeringRulesMap.containsKey("operationRecordNum") && StringUtils.isNotEmpty(operationFeeNum) && ! operationFeeNum.equals("0")){
  3168. double operationRecordDo = currencyCal(operationFeeNum, triggeringRulesMap.get("operationRecordNum"));
  3169. num = String.valueOf(operationRecordDo);
  3170. if(operationRecordDo<0d){
  3171. num = null;
  3172. }
  3173. };
  3174. firMap.put("name","手术相关记录完成率");
  3175. if("0.0".equals(num)){
  3176. num = "0.00";
  3177. }
  3178. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3179. firMap.put("num",operationFeeNum);
  3180. retList.add(firMap);
  3181. return retList;
  3182. }
  3183. //指标十六 临床用血相关记录符合率
  3184. private List<Map<String, String>> bloodMethod( List<Map<String, String>>retList,Map<String, Double> bloodRes,Map<String, Long> triggeringRulesMap){
  3185. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3186. Double count = bloodRes.get("bloodResult");
  3187. if( null == count){
  3188. count = 0d;
  3189. }
  3190. String num = null;
  3191. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3192. //指标十七
  3193. double bloodDo = currencyCal(count, triggeringRulesMap.get("bloodNum"));
  3194. num = String.valueOf(bloodDo);
  3195. if(bloodDo<0d){
  3196. num = null;
  3197. }
  3198. }
  3199. firMap.put("name","临床用血相关记录符合率");
  3200. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3201. firMap.put("num",String.valueOf(count));
  3202. retList.add(firMap);
  3203. return retList;
  3204. }
  3205. private double currencyCal(Object objFir,Object objSec){
  3206. DecimalFormat df = new DecimalFormat("#0.00");
  3207. double firDouble = Double.parseDouble(objFir.toString()) - Double.parseDouble(objSec.toString());
  3208. double thrWorkNum = Double.parseDouble(objFir.toString());
  3209. double retData = 0d;
  3210. if(thrWorkNum != 0){
  3211. retData = Double.parseDouble(df.format(firDouble * 100 / thrWorkNum));
  3212. }
  3213. return retData;
  3214. };
  3215. //指标十九 出院患者病历2日归档
  3216. private List<Map<String, String>> getfileSecAmount(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Object> baseIndex){
  3217. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3218. DecimalFormat df = new DecimalFormat("#0.00");
  3219. Double count = medManageParams.get("secFileResult");
  3220. Object forWorkNum = baseIndex.get("forWorkNum");
  3221. if( null == count){
  3222. count = 0d;
  3223. }
  3224. String num = null;
  3225. if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString()) && ! baseIndex.get("forWorkNum").toString().equals("0") ){
  3226. double retNum =count* 100/Double.parseDouble(baseIndex.get("forWorkNum").toString());
  3227. double firGradeStr = Double.parseDouble(df.format(retNum));
  3228. num = String.valueOf(firGradeStr);
  3229. }
  3230. firMap.put("name","出院患者病历2日归档率");
  3231. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3232. if(null == forWorkNum){
  3233. firMap.put("num","0");
  3234. }else{
  3235. firMap.put("num",baseIndex.get("forWorkNum").toString());
  3236. }
  3237. retList.add(firMap);
  3238. return retList;
  3239. };
  3240. //指标21 --出院患者病历归档完整率
  3241. private List<Map<String, String>> fileCompleteMethod(Map<String, Double> medManageParams, List<Map<String, String>>retList, Map<String, Object> baseIndex){
  3242. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3243. Double count = medManageParams.get("fileCompleteResult");
  3244. Object forWorkNum = baseIndex.get("forWorkNum");
  3245. if( null == count){
  3246. count = 0d;
  3247. }
  3248. String num = null;
  3249. if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString()) && ! baseIndex.get("forWorkNum").toString().equals("0") ){
  3250. double retNum = currencyCal( baseIndex.get("forWorkNum").toString(),count);
  3251. num = String.valueOf(retNum);
  3252. }
  3253. firMap.put("name","出院患者病历归档完整率");
  3254. firMap.put("notCopiedStr",StringUtils.isEmpty(num) ? "0.00%":(num+"%"));
  3255. if(null == forWorkNum){
  3256. firMap.put("num","0");
  3257. }else{
  3258. firMap.put("num",baseIndex.get("forWorkNum").toString());
  3259. }
  3260. retList.add(firMap);
  3261. return retList;
  3262. }
  3263. private List<Map<String, String>> ManageIndexMethod(String indexName,List<Map<String, String>> retList, Map<String, Object> baseIndex, MedIndexFilterVO timeVo){
  3264. QueryWrapper<MedManagementInfo> query = new QueryWrapper<>();
  3265. query.eq("hospital_id", timeVo.getHospitalId())
  3266. .eq("is_deleted", IsDeleteEnum.N)
  3267. .isNotNull("start_date")
  3268. .isNotNull("end_date")
  3269. .ge("start_date",timeVo.getLastStartDate())
  3270. .le("end_date",timeVo.getLastEndDate())
  3271. .select("position_id","work_person");
  3272. List<MedManagementInfo> list = medManagementInfoService.list(query);
  3273. //单位时间同期住院病案管理人员实际工作总月数
  3274. if(indexName.equals(QualityContent.ZYBA_CYHZ)||indexName.equals(QualityContent.QB)) {
  3275. Optional<Double> secOp = list.stream().filter(obj->obj.getPositionId().equals("1")).map(MedManagementInfo::getWorkPerson).reduce(Double::sum);
  3276. Double secMouth = 0d;
  3277. if(secOp.isPresent()){
  3278. secMouth = secOp.get();
  3279. }
  3280. if(secMouth == 0d){
  3281. secMouth = 5d;
  3282. }
  3283. //指标一
  3284. String num1 = "0";
  3285. if(secMouth != 0d && secMouth != null && StringUtils.isNotEmpty( baseIndex.get("firWorkNum").toString())){
  3286. num1 = String.valueOf(Math.round(Double.parseDouble(baseIndex.get("firWorkNum").toString()) / secMouth));
  3287. }
  3288. LinkedHashMap<String, String> firMap = new LinkedHashMap<>();
  3289. firMap.put("name","住院病案管理人员月均负担出院患者病历数");
  3290. firMap.put("notCopiedStr",num1);
  3291. retList.add(firMap);
  3292. }
  3293. //单位时间同期门诊病案管理人员实际工作总月数
  3294. if(indexName.equals(QualityContent.MZBA_CYHZ)||indexName.equals(QualityContent.QB)) {
  3295. Optional<Double> firOp = list.stream().filter(obj -> obj.getPositionId().equals("3")).map(MedManagementInfo::getWorkPerson).reduce(Double::sum);
  3296. Double firMouth = 0d;
  3297. if(firOp.isPresent()){
  3298. firMouth = firOp.get();
  3299. }
  3300. if(firMouth == 0d){
  3301. firMouth = 5d;
  3302. }
  3303. String num3 = "0";
  3304. if(firMouth != 0d && firMouth != null && StringUtils.isNotEmpty( baseIndex.get("secWorkNum").toString())){
  3305. //指标二
  3306. num3 = String.valueOf(Math.round(Double.parseDouble(baseIndex.get("secWorkNum").toString())/firMouth));
  3307. }
  3308. LinkedHashMap<String, String> thrMap = new LinkedHashMap<>();
  3309. thrMap.put("name","门诊病案管理人员月均负担门诊患者病历数");
  3310. thrMap.put("notCopiedStr",num3);
  3311. retList.add(thrMap);
  3312. }
  3313. //单位时间同期病案编码管理人员实际工作总月数
  3314. if(indexName.equals(QualityContent.BABM_CYHZ)||indexName.equals(QualityContent.QB)) {
  3315. Optional<Double> thrOp = list.stream().filter(obj->obj.getPositionId().equals("2")).map(MedManagementInfo::getWorkPerson).reduce(Double::sum);
  3316. Double thrMouth = 0d;
  3317. if(thrOp.isPresent()){
  3318. thrMouth = thrOp.get();
  3319. }
  3320. if(thrMouth == 0d){
  3321. thrMouth = 5d;
  3322. }
  3323. //指标三
  3324. String num2 = "0";
  3325. if(thrMouth != 0d && thrMouth != null && StringUtils.isNotEmpty( baseIndex.get("firWorkNum").toString())){
  3326. num2 = String.valueOf(Math.round(Double.parseDouble(baseIndex.get("firWorkNum").toString())/thrMouth));
  3327. }
  3328. LinkedHashMap<String, String> secMap = new LinkedHashMap<>();
  3329. secMap.put("name","病案编码人员月均负担出院患者病历数");
  3330. secMap.put("notCopiedStr",num2);
  3331. retList.add(secMap);
  3332. }
  3333. return retList;
  3334. };
  3335. private List<Map<String, String>> firMethod(List<Map<String, String>> retList, Map<String, Object> baseIndex){
  3336. DecimalFormat df = new DecimalFormat("0.00");
  3337. //指标二十七 -甲级病历率
  3338. LinkedHashMap<String, String> fouMap = new LinkedHashMap<>();
  3339. Double firRecord = 0d;
  3340. String num4= null;
  3341. if(StringUtils.isNotEmpty( baseIndex.get("forWorkNum").toString())){
  3342. firRecord =Double.parseDouble(baseIndex.get("forWorkNum").toString());
  3343. }
  3344. if( firRecord != 0d && StringUtils.isNotEmpty( baseIndex.get("sixWorkNum").toString()) ){
  3345. double retNum = Double.parseDouble(baseIndex.get("sixWorkNum").toString()) * 100 / firRecord;
  3346. double firGradeStr = Double.parseDouble(df.format(retNum));
  3347. num4 = String.valueOf(firGradeStr);
  3348. }
  3349. fouMap.put("name","甲级病历率");
  3350. fouMap.put("notCopiedStr",StringUtils.isEmpty(num4) ? "0.00%":(num4+"%"));
  3351. fouMap.put("num",String.valueOf(firRecord));
  3352. retList.add(fouMap);
  3353. return retList;
  3354. };
  3355. /**
  3356. * ==============================后台维护===============================
  3357. */
  3358. private Set<String> tumorRadiationMethods( Map<String, Set<String>> adviceNum,MedIndexResult medIndexResult){
  3359. Set<String> tumorRadiationSecNum = new CopyOnWriteArraySet<>();
  3360. if(adviceNum.containsKey("tumorRadiationSecNum")&& adviceNum.get("tumorRadiationSecNum") != null && adviceNum.get("tumorRadiationSecNum").size()>0){
  3361. tumorRadiationSecNum = adviceNum.get("tumorRadiationSecNum");
  3362. double count = tumorRadiationSecNum.size();
  3363. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3364. medIndexResult.setTumorRadiationResult(count);
  3365. }
  3366. }
  3367. return tumorRadiationSecNum;
  3368. }
  3369. //指标19 抢救记录
  3370. private void rescueMethods(List<MedManageParamsDTO> medManageParams,MedIndexResult medIndexResult, Set<String> rescueCode){
  3371. List<MedManageParamsDTO> manageList= new ArrayList<>();
  3372. List<String> rescueDrugList = QualityContent.RESCUEDRUGLIST;
  3373. for (int i = 0; i < medManageParams.size(); i++) {
  3374. String daItemName = medManageParams.get(i).getDaItemName();
  3375. String doctorAdviceType = medManageParams.get(i).getDoctorAdviceType();
  3376. String da_status = medManageParams.get(i).getDaStatus();
  3377. for (String str : rescueDrugList) {
  3378. if(StringUtils.isNotEmpty(daItemName) && daItemName.contains(str) && StringUtils.isNotEmpty(doctorAdviceType) && doctorAdviceType.equals(QualityContent.STAT_ORDER) && (StringUtils.isEmpty(da_status) || (StringUtils.isNotEmpty(da_status) && ! da_status.equals(QualityContent.CANCELLATION_ORDER)))){
  3379. manageList.add(medManageParams.get(i));
  3380. rescueCode.add(medManageParams.get(i).getBehospitalCode());
  3381. }
  3382. }
  3383. }
  3384. //接受抢救的质控病历总数
  3385. double count = manageList.stream().map(MedManageParamsDTO::getBehospitalCode).distinct().count();
  3386. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3387. medIndexResult.setRescueResult(count);
  3388. }
  3389. }
  3390. //指标17 临床用血相关记录符合率
  3391. private void bloodMethods(List<MedManageParamsDTO> doctorAdviceList,FilterVO filterVO,MedIndexResult medIndexResult, Set<String> bloodCode){
  3392. filterVO.setFlagStr("1");
  3393. List<MedManageParamsDTO> medManageParams = behospitalInfoFacade.getMedManageParams(filterVO);
  3394. Set<String> manageList= new CopyOnWriteArraySet<>();
  3395. List<String> blood_list = QualityContent.BLOODLIST;
  3396. //lis项目存在用血住院病历号
  3397. long xx1 = System.currentTimeMillis();
  3398. List<String> beCode = medManageParams.stream()
  3399. .filter(obj -> StringUtils.isNotEmpty(obj.getRepName()) && blood_list.contains(obj.getRepName()))
  3400. .map(MedManageParamsDTO::getBehospitalCode).distinct()
  3401. .collect(Collectors.toList());
  3402. long xx2= System.currentTimeMillis();
  3403. System.out.println("lis项目存在用血住院病历号 = " + (xx2-xx1));
  3404. //advice体现lis项目存在用血的住院病历号
  3405. doctorAdviceList.parallelStream()
  3406. .filter(obj -> beCode.contains(obj.getBehospitalCode()) && StringUtils.isNotEmpty(obj.getDoctorAdviceType()) && obj.getDoctorAdviceType()
  3407. .equals(QualityContent.STAT_ORDER) && blood_list.contains(obj.getDaItemName()) &&
  3408. (StringUtils.isEmpty(obj.getDaStatus()) || (StringUtils.isNotEmpty(obj.getDaStatus()) && ! obj.getDaStatus()
  3409. .equals(QualityContent.CANCELLATION_ORDER))))
  3410. .distinct()
  3411. .map(obj -> {manageList.add(obj.getBehospitalCode());return bloodCode.add(obj.getBehospitalCode());})
  3412. .collect(Collectors.toList());
  3413. long xx3= System.currentTimeMillis();
  3414. System.out.println("advice体现lis项目存在用血的住院病历号 = " + (xx3-xx2));
  3415. //临床用血的质控病历总数
  3416. double count = manageList.size();
  3417. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3418. //指标十七
  3419. medIndexResult.setBloodResult(count);
  3420. }
  3421. }
  3422. //指标20 出院患者病历2日归档
  3423. private void getfileSecAmounts(FilterVO filterVO,MedIndexResult medIndexResult){
  3424. QueryWrapper<BehospitalInfo> query = new QueryWrapper<>();
  3425. DecimalFormat df = new DecimalFormat("#0.00");
  3426. query.eq("hospital_id", filterVO.getHospitalId())
  3427. .eq("is_deleted", IsDeleteEnum.N)
  3428. .ne("qc_type_id", 0)
  3429. .eq("is_placefile", 1)
  3430. // .eq("is_placefile", filterVO.getIsPlacefile())
  3431. .isNotNull("leave_hospital_date")
  3432. .ge("leave_hospital_date",filterVO.getStartDate())
  3433. .le("leave_hospital_date",filterVO.getEndDate());
  3434. List<BehospitalInfo> list = behospitalInfoFacade.list(query);
  3435. Iterator<BehospitalInfo> iterator = list.iterator();
  3436. while (iterator.hasNext()){
  3437. BehospitalInfo beh = iterator.next();
  3438. Boolean flag = getTrueSecFile(beh.getLeaveHospitalDate(), beh.getPlacefileDate(), TimeContent.HolidaysTimeList);
  3439. //时间截止则删除元素
  3440. if(!flag){
  3441. iterator.remove();
  3442. }
  3443. }
  3444. double count = list.stream().distinct().map(BehospitalInfo::getBedCode).count();
  3445. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3446. medIndexResult.setSecFileResult(count);
  3447. }
  3448. }
  3449. private Boolean getTrueSecFile(Date date1,Date date2, List<String> holidaysTimeList){
  3450. if(date1.after(date2)){
  3451. return false;
  3452. }
  3453. Date date = date1;
  3454. Date dateSec = date2;
  3455. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3456. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  3457. SimpleDateFormat simpleDateFormatRe = new SimpleDateFormat("yyyy-MM-dd");
  3458. Calendar cal = null;
  3459. int count = 0;
  3460. try {
  3461. date1 = simpleDateFormatRe.parse(simpleDateFormatRe.format(date1));
  3462. date2 = simpleDateFormatRe.parse(simpleDateFormatRe.format(date2));
  3463. cal = Calendar.getInstance();
  3464. cal.setTime(date);
  3465. count = 0;
  3466. for (String str : holidaysTimeList) {
  3467. Date date3 = simpleDateFormatRe.parse(str);
  3468. if(date3.after(date1) && date3.before(date2)){
  3469. count++;
  3470. }
  3471. }
  3472. } catch (ParseException e) {
  3473. e.printStackTrace();
  3474. }
  3475. cal.add(Calendar.DAY_OF_YEAR,count+2);
  3476. String endTime = simpleDateFormat.format(cal.getTime());
  3477. LocalDateTime ldt = LocalDateTime.parse(endTime,dateTimeFormatter);
  3478. ZoneId zone = ZoneId.systemDefault();
  3479. Instant instant = ldt.atZone(zone).toInstant();
  3480. Date endDate = Date.from(instant);
  3481. if(endDate.after(dateSec)){
  3482. return true;
  3483. }
  3484. return false;
  3485. }
  3486. private void timeTrans( MedIndexFilterVO filterVO){
  3487. SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
  3488. Calendar cal1 = Calendar.getInstance();
  3489. Calendar cal2 = Calendar.getInstance();
  3490. try {
  3491. cal1.setTime(myFormatter.parse(filterVO.getStartDate()));
  3492. cal2.setTime(myFormatter.parse(filterVO.getEndDate()));
  3493. } catch (ParseException e) {
  3494. e.printStackTrace();
  3495. }
  3496. cal1.set(Calendar.DAY_OF_MONTH, 1);//当月的第一天
  3497. cal2.set(Calendar.DAY_OF_MONTH, 1);
  3498. cal2.set(Calendar.DATE, 1);//设为当前月的1号
  3499. cal2.roll(Calendar.DATE, -1);
  3500. String startTime = myFormatter.format(cal1.getTime())+" 00:00:00";
  3501. String endTime = myFormatter.format(cal2.getTime())+" 23:59:59";
  3502. filterVO.setLastStartDate(startTime);
  3503. filterVO.setLastEndDate(endTime);
  3504. };
  3505. //指标 16--植入物相关记录符合率
  3506. private Set<String> implantsMethods(FilterVO filterVO,MedIndexResult medIndexResult){
  3507. filterVO.setFlagStr("4");
  3508. List<MedManageParamsDTO> fileLists = behospitalInfoFacade.getMedManageParams(filterVO);
  3509. Set<String> collect = fileLists.parallelStream().filter(obj -> {
  3510. String content = obj.getContent();
  3511. Map contenMap = JSON.parseObject(content, Map.class);
  3512. return contenMap.containsKey("使用植入性材料") && StringUtils.isNotEmpty(contenMap.get("使用植入性材料").toString())
  3513. && "true".equals(contenMap.get("使用植入性材料").toString());
  3514. }).map(MedManageParamsDTO::getBehospitalCode).collect(Collectors.toSet());
  3515. double count = collect.size();
  3516. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3517. medIndexResult.setImplantsResult(count);
  3518. }
  3519. return collect;
  3520. }
  3521. //指标21 出院患者病历归档完整率
  3522. private void fileCompleteMethods(FilterVO filterVO,MedIndexResult medIndexResult){
  3523. filterVO.setFlagStr("3");
  3524. List<MedManageParamsDTO> fileLists = behospitalInfoFacade.getMedManageParams(filterVO);
  3525. double count = fileLists.stream().map(MedManageParamsDTO::getBehospitalCode).distinct().count();
  3526. if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3527. medIndexResult.setFileCompleteResult(count);
  3528. }
  3529. }
  3530. //指标23 知情同意书规范签署率
  3531. // private void contentSignMethods(List<MedManageParamsDTO>fileLists,MedIndexResult medIndexResult){
  3532. // Set<String> collect = fileLists.parallelStream().filter(obj -> {
  3533. // String content = obj.getContent();
  3534. // Map contenMap = JSON.parseObject(content, Map.class);
  3535. // return contenMap.containsKey("签署") && StringUtils.isNotEmpty(contenMap.get("签署").toString());
  3536. // }).map(MedManageParamsDTO::getBehospitalCode).collect(Collectors.toSet());
  3537. // double count = collect.size();
  3538. // if(StringUtils.isNotEmpty(String.valueOf(count)) && count != 0d){
  3539. // medIndexResult.setRecordSignResult(count);
  3540. // }
  3541. // }
  3542. /**
  3543. * 质控核查质控评分页(内页)
  3544. *
  3545. * @param qcResultShortPageVO
  3546. * @return
  3547. */
  3548. public IPage<QcResultShortDTO> qcCheckMRPage(@Param("qcResultShortPageVO") QcResultShortPageVO qcResultShortPageVO) {
  3549. filterFacade.qcResultShortPageVOSet(qcResultShortPageVO);
  3550. return behospitalInfoFacade.qcCheckMRPage(qcResultShortPageVO);
  3551. }
  3552. /**
  3553. * 病历稽查表导出(首页)
  3554. *
  3555. * @param filterVO
  3556. * @return
  3557. */
  3558. public List<MedicalCheckExportDTO> medicalCheckExport(@Param("filterVO") FilterMedicalCheckVO filterVO) {
  3559. filterFacade.getMedicalCheckVOSet(filterVO);
  3560. List<MedicalCheckExportDTO> medicalCheck = behospitalInfoFacade.getMedicalCheckExport(filterVO);
  3561. return medicalCheck;
  3562. }
  3563. /**
  3564. * 病历稽查表
  3565. *
  3566. * @param filterVO
  3567. * @return
  3568. */
  3569. public IPage<MedicalCheckDTO> getMedicalCheck(@Param("filterVO") FilterMedicalCheckVO filterVO) {
  3570. filterFacade.getMedicalCheckVOSet(filterVO);
  3571. //colums
  3572. QueryWrapper<SysHospitalSet> hospitalSetQueryWrapper = new QueryWrapper<>();
  3573. hospitalSetQueryWrapper.eq("is_deleted", 'N')
  3574. .eq("hospital_id", filterVO.getHospitalId())
  3575. .eq("code", "medical_check_form");
  3576. SysHospitalSet hospitalSet = sysHospitalSetFacade.getOne(hospitalSetQueryWrapper);
  3577. //表头生成
  3578. List<String> columnSet = Arrays.asList(hospitalSet.getValue().split(","));
  3579. //目标条目
  3580. List<Long> casesEntryIds = Lists.newArrayList();
  3581. //遍历第一个条目
  3582. for (String valueStr : columnSet) {
  3583. if (StringUtil.isBlank(valueStr)) {
  3584. continue;
  3585. }
  3586. String[] keyValue = valueStr.split("--");
  3587. if (keyValue != null || keyValue.length > 1) {
  3588. casesEntryIds.add(Long.valueOf(keyValue[0]));
  3589. }
  3590. }
  3591. IPage<MedicalCheckDTO> medicalCheck = behospitalInfoFacade.getMedicalCheck(filterVO, casesEntryIds);
  3592. return medicalCheck;
  3593. }
  3594. /**
  3595. * 病历稽查表(title)
  3596. *
  3597. * @param
  3598. * @return
  3599. */
  3600. public List<ColumnDTO> getMedicalCheckTitle() {
  3601. //病历稽查入参拼接
  3602. String hospitalId = SysUserUtils.getCurrentHospitalID();
  3603. //colums
  3604. QueryWrapper<SysHospitalSet> hospitalSetQueryWrapper = new QueryWrapper<>();
  3605. hospitalSetQueryWrapper.eq("is_deleted", 'N')
  3606. .eq("hospital_id", hospitalId)
  3607. .eq("code", "medical_check_form");
  3608. List<ColumnDTO> columns = Lists.newLinkedList();
  3609. SysHospitalSet hospitalSet = sysHospitalSetFacade.getOne(hospitalSetQueryWrapper);
  3610. if (hospitalSet == null || StringUtil.isBlank(hospitalSet.getValue())) {
  3611. return columns;
  3612. }
  3613. //表头生成
  3614. List<String> columnSet = Arrays.asList(hospitalSet.getValue().split(","));
  3615. Integer orderNo = 1;
  3616. ColumnDTO columnDeptId = new ColumnDTO();
  3617. columnDeptId.setOrderNo(orderNo);
  3618. columnDeptId.setFieldName("deptId");
  3619. columnDeptId.setColumnName("科室编码");
  3620. columnDeptId.setIsShow(0);
  3621. columns.add(columnDeptId);
  3622. orderNo++;
  3623. ColumnDTO columnDeptName = new ColumnDTO();
  3624. columnDeptName.setOrderNo(orderNo);
  3625. columnDeptName.setFieldName("deptName");
  3626. columnDeptName.setColumnName("科室");
  3627. columnDeptName.setIsShow(1);
  3628. columns.add(columnDeptName);
  3629. orderNo++;
  3630. ColumnDTO columnMedicalName = new ColumnDTO();
  3631. columnMedicalName.setOrderNo(orderNo);
  3632. columnMedicalName.setFieldName("doctorName");
  3633. columnMedicalName.setColumnName("医疗组");
  3634. columnMedicalName.setIsShow(1);
  3635. columns.add(columnMedicalName);
  3636. orderNo++;
  3637. for (String valueStr : columnSet) {
  3638. String[] keyValue = valueStr.split("--");
  3639. if (keyValue != null || keyValue.length > 1) {
  3640. ColumnDTO columnNum = new ColumnDTO();
  3641. columnNum.setOrderNo(orderNo);
  3642. columnNum.setId(Long.valueOf(keyValue[0]));
  3643. columnNum.setFieldName("entry_" + keyValue[0] + "_name");
  3644. columnNum.setColumnName(keyValue[1]);
  3645. columnNum.setIsShow(1);
  3646. columns.add(columnNum);
  3647. orderNo++;
  3648. }
  3649. }
  3650. return columns;
  3651. }
  3652. /**
  3653. * 评结果分数(长兴)
  3654. *
  3655. * @param algorithmVO 操作条目的所有信息
  3656. * @return 评结果分数
  3657. */
  3658. private void getScoreForCx(AlgorithmVO algorithmVO, QualityControlDTO qualityControlDTO) {
  3659. List<QcResultAlgVO> qcResultAlgHomePage = new ArrayList<>();
  3660. List<QcResultAlgVO> qcResultAlgHomePageExt = new ArrayList<>();
  3661. for (QcResultAlgVO qcResultAlgVO : algorithmVO.getQcResultAlgVOList()) {
  3662. //首页的情况
  3663. if (qcResultAlgVO.getCasesId().equals(243L)) {
  3664. qcResultAlgHomePage.add(qcResultAlgVO);
  3665. } else {
  3666. //非首页
  3667. qcResultAlgHomePageExt.add(qcResultAlgVO);
  3668. }
  3669. }
  3670. //病案首页
  3671. AlgorithmVO homePage = new AlgorithmVO();
  3672. BeanUtil.copyProperties(algorithmVO, homePage);
  3673. homePage.setQcResultAlgVOList(qcResultAlgHomePage);
  3674. homePage.setIsHomePage(true);
  3675. cal(homePage, qualityControlDTO);
  3676. //病案首页以外
  3677. AlgorithmVO homePageExt = new AlgorithmVO();
  3678. BeanUtil.copyProperties(algorithmVO, homePageExt);
  3679. homePageExt.setQcResultAlgVOList(qcResultAlgHomePageExt);
  3680. cal(homePageExt, qualityControlDTO);
  3681. }
  3682. /**
  3683. * 计算分数
  3684. *
  3685. * @param algorithmVO 操作条目的所有信息
  3686. * @return 评分分数
  3687. */
  3688. private void cal(AlgorithmVO algorithmVO, QualityControlDTO qualityControlDTO) {
  3689. //模块总分
  3690. Map<Long, BigDecimal> casesMap = new HashMap<>();
  3691. //单票否决计分
  3692. Map<Long, BigDecimal> rejectScoreMap = new HashMap<>();
  3693. //模块计分
  3694. Map<Long, BigDecimal> casesScoreMap = new HashMap<>();
  3695. //模块缺陷统计
  3696. Map<Long, String> casesNameMap = new HashMap<>();
  3697. //扣分统计
  3698. Map<Long, BigDecimal> scoreMap = new HashMap<>();
  3699. List<QcResultAlgVO> qcResultAlgVOList = algorithmVO.getQcResultAlgVOList();
  3700. if (ListUtil.isNotEmpty(qcResultAlgVOList)) {
  3701. for (QcResultAlgVO qcResultAlgVO : qcResultAlgVOList) {
  3702. if (!casesMap.containsKey(qcResultAlgVO.getCasesId())) {
  3703. //模块总分
  3704. casesMap.put(qcResultAlgVO.getCasesId(), qcResultAlgVO.getCasesScore());
  3705. }
  3706. if (!casesScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
  3707. casesScoreMap.put(qcResultAlgVO.getCasesId(), BigDecimal.ZERO);
  3708. rejectScoreMap.put(qcResultAlgVO.getCasesId(), BigDecimal.ZERO);
  3709. casesNameMap.put(qcResultAlgVO.getCasesId(), "");
  3710. }
  3711. //单票否决计分
  3712. if (qcResultAlgVO.getIsReject().equals(1)) {
  3713. if (rejectScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
  3714. BigDecimal casesScore = rejectScoreMap.get(qcResultAlgVO.getCasesId());
  3715. casesScore = casesScore.add(qcResultAlgVO.getScore());
  3716. rejectScoreMap.put(qcResultAlgVO.getCasesId(), casesScore);
  3717. }
  3718. } else {
  3719. //非单票否决计分
  3720. if (casesScoreMap.containsKey(qcResultAlgVO.getCasesId())) {
  3721. BigDecimal casesScore = casesScoreMap.get(qcResultAlgVO.getCasesId());
  3722. casesScore = casesScore.add(qcResultAlgVO.getScore());
  3723. casesScoreMap.put(qcResultAlgVO.getCasesId(), casesScore);
  3724. }
  3725. }
  3726. String casesName = casesNameMap.get(qcResultAlgVO.getCasesId());
  3727. if (StringUtils.isEmpty(casesName)) {
  3728. casesName = casesName + qcResultAlgVO.getMsg();
  3729. } else {
  3730. casesName = casesName + ";" + qcResultAlgVO.getMsg();
  3731. }
  3732. casesNameMap.put(qcResultAlgVO.getCasesId(), casesName);
  3733. }
  3734. //模块计分
  3735. for (Map.Entry<Long, BigDecimal> casesScore : casesScoreMap.entrySet()) {
  3736. BigDecimal allSccore = casesMap.get(casesScore.getKey());
  3737. if (BigDecimalUtil.le(allSccore, casesScore.getValue())) {
  3738. //模块标准分小于等于模块减分总和就用模块标准分
  3739. allSccore = allSccore.add(rejectScoreMap.get(casesScore.getKey()));
  3740. } else {
  3741. //模块标准分大于模块减分总和就用模块减分总和
  3742. allSccore = casesScore.getValue().add(rejectScoreMap.get(casesScore.getKey()));
  3743. }
  3744. if (BigDecimalUtil.lt(allSccore, BigDecimal.ZERO)) {
  3745. allSccore = BigDecimal.ZERO;
  3746. }
  3747. scoreMap.put(casesScore.getKey(), allSccore);
  3748. }
  3749. DecimalFormat df = new DecimalFormat("0.0");
  3750. if (StringUtils.isNotEmpty(casesNameMap.get(237L))) {
  3751. qualityControlDTO.setAdmissionNote(casesNameMap.get(237L));
  3752. }
  3753. if (scoreMap.get(237L) != null) {
  3754. qualityControlDTO.setAdmissionNoteScore(Double.valueOf(df.format(scoreMap.get(237L))));
  3755. }
  3756. if (StringUtils.isNotEmpty(casesNameMap.get(238L))) {
  3757. qualityControlDTO.setFirstCourseNote(casesNameMap.get(238L));
  3758. }
  3759. if (scoreMap.get(238L) != null) {
  3760. qualityControlDTO.setFirstCourseNoteScore(Double.valueOf(df.format(scoreMap.get(238L))));
  3761. }
  3762. if (StringUtils.isNotEmpty(casesNameMap.get(242L))) {
  3763. qualityControlDTO.setDischargeNote(casesNameMap.get(242L));
  3764. }
  3765. if (scoreMap.get(242L) != null) {
  3766. qualityControlDTO.setDischargeNoteScore(Double.valueOf(df.format(scoreMap.get(242L))));
  3767. }
  3768. if (StringUtils.isNotEmpty(casesNameMap.get(243L))) {
  3769. qualityControlDTO.setMedHomePage(casesNameMap.get(243L));
  3770. }
  3771. if (scoreMap.get(243L) != null) {
  3772. qualityControlDTO.setMedHomePageScore(Double.valueOf(df.format(scoreMap.get(243L))));
  3773. }
  3774. if (StringUtils.isNotEmpty(casesNameMap.get(280L))) {
  3775. qualityControlDTO.setDocAdviceNote(casesNameMap.get(280L));
  3776. }
  3777. if (scoreMap.get(280L) != null) {
  3778. qualityControlDTO.setDocAdviceNoteScore(Double.valueOf(df.format(scoreMap.get(280L))));
  3779. }
  3780. String operationInfo = "";
  3781. if (StringUtils.isNotEmpty(casesNameMap.get(248L))) {
  3782. operationInfo = "围手术期病历讨论:" + casesNameMap.get(248L);
  3783. }
  3784. if (StringUtils.isNotEmpty(casesNameMap.get(249L))) {
  3785. operationInfo = operationInfo + ";" + "术前讨论制度:" + casesNameMap.get(249L);
  3786. }
  3787. if (operationInfo.contains(";")) {
  3788. String[] split = operationInfo.split(";");
  3789. if (StringUtils.isEmpty(split[0])) {
  3790. operationInfo = operationInfo.substring(operationInfo.indexOf(split[1]));
  3791. }
  3792. }
  3793. qualityControlDTO.setOperationInfo(StringUtils.isEmpty(operationInfo) == true ? "无缺陷" : operationInfo);
  3794. Double score_248 = 0d;
  3795. Double score_11 = 0d;
  3796. Double score_249 = 0d;
  3797. if (scoreMap.get(248L) != null) {
  3798. score_248 = Double.valueOf(df.format(scoreMap.get(248L)));
  3799. }
  3800. if (scoreMap.get(11L) != null) {
  3801. score_11 = Double.valueOf(df.format(scoreMap.get(11L)));
  3802. }
  3803. if (scoreMap.get(249L) != null) {
  3804. score_249 = Double.valueOf(df.format(scoreMap.get(249L)));
  3805. }
  3806. qualityControlDTO.setOperationInfoScore(score_248 + score_11 + score_249);
  3807. }
  3808. String courseRecord = "";
  3809. if (StringUtils.isNotEmpty(casesNameMap.get(239L))) {
  3810. courseRecord = "死亡病例讨论制度:" + casesNameMap.get(239L);
  3811. }
  3812. if (StringUtils.isNotEmpty(casesNameMap.get(240L))) {
  3813. courseRecord = courseRecord + ";" + "疑难病例讨论制度:" + casesNameMap.get(240L);
  3814. }
  3815. if (StringUtils.isNotEmpty(casesNameMap.get(241L))) {
  3816. courseRecord = courseRecord + ";" + "三级查房制度:" + casesNameMap.get(241L);
  3817. }
  3818. if (StringUtils.isNotEmpty(casesNameMap.get(244L))) {
  3819. courseRecord = courseRecord + ";" + "会诊制度:" + casesNameMap.get(244L);
  3820. }
  3821. if (StringUtils.isNotEmpty(casesNameMap.get(245L))) {
  3822. courseRecord = courseRecord + ";" + "分级护理制度:" + casesNameMap.get(245L);
  3823. }
  3824. if (StringUtils.isNotEmpty(casesNameMap.get(246L))) {
  3825. courseRecord = courseRecord + ";" + "值班及交接班制度:" + casesNameMap.get(246L);
  3826. }
  3827. if (StringUtils.isNotEmpty(casesNameMap.get(247L))) {
  3828. courseRecord = courseRecord + ";" + "临床用血审核制度:" + casesNameMap.get(247L);
  3829. }
  3830. if (StringUtils.isNotEmpty(casesNameMap.get(250L))) {
  3831. courseRecord = courseRecord + ";" + "死亡记录:" + casesNameMap.get(250L);
  3832. }
  3833. if (courseRecord.contains(";")) {
  3834. String[] courseRecordSplit = courseRecord.split(";");
  3835. if (StringUtils.isEmpty(courseRecordSplit[0])) {
  3836. courseRecord = courseRecord.substring(courseRecord.indexOf(courseRecordSplit[1]));
  3837. }
  3838. }
  3839. qualityControlDTO.setCourseRecord(StringUtils.isEmpty(courseRecord) == true ? "无缺陷" : courseRecord);
  3840. Double score_239 = 0d;
  3841. Double score_240 = 0d;
  3842. Double score_241 = 0d;
  3843. Double score_244 = 0d;
  3844. Double score_245 = 0d;
  3845. Double score_246 = 0d;
  3846. Double score_247 = 0d;
  3847. Double score_250 = 0d;
  3848. DecimalFormat df = new DecimalFormat("0.0");
  3849. if (scoreMap.get(239L) != null) {
  3850. score_239 = Double.valueOf(df.format(scoreMap.get(239L)));
  3851. }
  3852. if (scoreMap.get(240L) != null) {
  3853. score_240 = Double.valueOf(df.format(scoreMap.get(240L)));
  3854. }
  3855. if (scoreMap.get(241L) != null) {
  3856. score_241 = Double.valueOf(df.format(scoreMap.get(241L)));
  3857. }
  3858. if (scoreMap.get(244L) != null) {
  3859. score_244 = Double.valueOf(df.format(scoreMap.get(244L)));
  3860. }
  3861. if (scoreMap.get(245L) != null) {
  3862. score_245 = Double.valueOf(df.format(scoreMap.get(245L)));
  3863. }
  3864. if (scoreMap.get(246L) != null) {
  3865. score_246 = Double.valueOf(df.format(scoreMap.get(246L)));
  3866. }
  3867. if (scoreMap.get(247L) != null) {
  3868. score_247 = Double.valueOf(df.format(scoreMap.get(247L)));
  3869. }
  3870. if (scoreMap.get(250L) != null) {
  3871. score_250 = Double.valueOf(df.format(scoreMap.get(250L)));
  3872. }
  3873. qualityControlDTO.setCourseRecordScore(score_239 + score_240 + score_241 + score_244 + score_245 + score_246 + score_247 + score_250);
  3874. /* qualityControlDTO.setCourseRecord(name_239+";"+name_240
  3875. +";"+name_241+";"+name_244+";"+name_245
  3876. +";"+name_246+";"+name_247+";"+name_250);
  3877. qualityControlDTO.setCourseRecordScore(score_239+score_240+score_241+score_244+score_245+score_246
  3878. +score_247+score_250);*/
  3879. Double score_262 = 0d;
  3880. Double score_281 = 0d;
  3881. Double score_282 = 0d;
  3882. Double score_283 = 0d;
  3883. Double score_284 = 0d;
  3884. if (scoreMap.get(262L) != null) {
  3885. score_262 = Double.valueOf(df.format(scoreMap.get(262L)));
  3886. }
  3887. if (scoreMap.get(281L) != null) {
  3888. score_281 = Double.valueOf(df.format(scoreMap.get(281L)));
  3889. }
  3890. if (scoreMap.get(282L) != null) {
  3891. score_282 = Double.valueOf(df.format(scoreMap.get(282L)));
  3892. }
  3893. if (scoreMap.get(283L) != null) {
  3894. score_283 = Double.valueOf(df.format(scoreMap.get(283L)));
  3895. }
  3896. if (scoreMap.get(284L) != null) {
  3897. score_284 = Double.valueOf(df.format(scoreMap.get(284L)));
  3898. }
  3899. String otherCase = "";
  3900. if (StringUtils.isNotEmpty(casesNameMap.get(262L))) {
  3901. otherCase = "危急值报告制度:" + casesNameMap.get(262L);
  3902. }
  3903. if (StringUtils.isNotEmpty(casesNameMap.get(281L))) {
  3904. otherCase = otherCase + ";" + "危急值报告制度:" + casesNameMap.get(281L);
  3905. }
  3906. if (StringUtils.isNotEmpty(casesNameMap.get(282L))) {
  3907. otherCase = otherCase + ";" + "危急值报告制度:" + casesNameMap.get(282L);
  3908. }
  3909. if (StringUtils.isNotEmpty(casesNameMap.get(283L))) {
  3910. otherCase = otherCase + ";" + "危急值报告制度:" + casesNameMap.get(283L);
  3911. }
  3912. if (StringUtils.isNotEmpty(casesNameMap.get(284L))) {
  3913. otherCase = otherCase + ";" + "危急值报告制度:" + casesNameMap.get(284L);
  3914. }
  3915. if (otherCase.contains(";")) {
  3916. String[] otherCaseSplit = otherCase.split(";");
  3917. if (StringUtils.isEmpty(otherCaseSplit[0])) {
  3918. otherCase = otherCase.substring(otherCase.indexOf(otherCaseSplit[1]));
  3919. }
  3920. }
  3921. qualityControlDTO.setOtherCase(StringUtils.isEmpty(otherCase) == true ? "无缺陷" : otherCase);
  3922. qualityControlDTO.setOtherCaseScore(score_262 + score_281 + score_282 + score_283 + score_284);
  3923. }
  3924. }