ConsoleFacade.java 181 KB

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