ShareParamServiceImpl.java 98 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670
  1. package com.kcim.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.kcim.common.constants.Constant;
  5. import com.kcim.common.constants.NumberConstant;
  6. import com.kcim.common.constants.ParameterConstant;
  7. import com.kcim.common.constants.SQLParameter;
  8. import com.kcim.common.enums.CustomSqlTypeEnum;
  9. import com.kcim.common.exception.CostException;
  10. import com.kcim.common.util.BeanUtil;
  11. import com.kcim.common.util.PageUtils;
  12. import com.kcim.common.util.UserContext;
  13. import com.kcim.dao.model.*;
  14. import com.kcim.dao.model.dto.PatientItemDepartmentGroupVo;
  15. import com.kcim.dao.repository.*;
  16. import com.kcim.service.*;
  17. import com.kcim.vo.*;
  18. import com.kcim.web.reponse.ShareParamCostResponse;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.jetbrains.annotations.NotNull;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.util.CollectionUtils;
  23. import org.springframework.util.ObjectUtils;
  24. import org.springframework.util.StringUtils;
  25. import java.math.BigDecimal;
  26. import java.math.RoundingMode;
  27. import java.util.*;
  28. import java.util.concurrent.atomic.AtomicReference;
  29. import java.util.stream.Collectors;
  30. import static com.kcim.common.enums.DefaultComputeColumnEnum.*;
  31. import static com.kcim.service.impl.DrugMaterialCalculateServiceImpl.getVisitNoResponsibilityMaps;
  32. /**
  33. * @program: CostAccount
  34. * @description:
  35. * @author: Wang.YS
  36. * @create: 2024-01-15 20:40
  37. **/
  38. @Service("ShareParamService")
  39. @Slf4j
  40. public class ShareParamServiceImpl implements ShareParamService {
  41. /**
  42. * 项目分摊参数主表
  43. */
  44. ComputeShareParamRepository repository;
  45. /**
  46. * 项目分摊参数明细表
  47. */
  48. ComputeShareParamDetailRepository detailRepository;
  49. /**
  50. * 项目导入数据
  51. */
  52. ImportPatientItemRepository importPatientItemRepository;
  53. /**
  54. * 医疗服务项目字典
  55. */
  56. ItemRepository itemRepository;
  57. ItemEmpMapRepository itemEmpMapRepository;
  58. ItemEquipmentMapRepository itemEquipmentMapRepository;
  59. ItemSpaceMapRepository itemSpaceMapRepository;
  60. StandItemEmpMapRepository standItemEmpMapRepository;
  61. StandItemEquipmentMapRepository standItemEquipmentMapRepository;
  62. StandItemSpaceMapRepository standItemSpaceMapRepository;
  63. ShareParamTypeMapRepository shareParamTypeMapRepository;
  64. ResponsibilityDepartmentRepository responsibilityDepartmentRepository;
  65. CenterService centerService;
  66. ComputeStandShareParamRepository computeStandShareParamRepository;
  67. ComputeStandShareParamDetailRepository computeStandShareParamDetailRepository;
  68. StandItemService standItemService;
  69. SqlService sqlService;
  70. ResponsibilityDepartmentService responsibilityDepartmentService;
  71. public ShareParamServiceImpl(ComputeShareParamRepository repository, ComputeShareParamDetailRepository detailRepository, ImportPatientItemRepository importPatientItemRepository, ItemRepository itemRepository, ItemEmpMapRepository itemEmpMapRepository, ItemEquipmentMapRepository itemEquipmentMapRepository, ItemSpaceMapRepository itemSpaceMapRepository, ShareParamTypeMapRepository shareParamTypeMapRepository, ResponsibilityDepartmentRepository responsibilityDepartmentRepository, CenterService centerService, ComputeStandShareParamRepository computeStandShareParamRepository, ComputeStandShareParamDetailRepository computeStandShareParamDetailRepository, StandItemService standItemService,SqlService sqlService,ResponsibilityDepartmentService responsibilityDepartmentService
  72. ,StandItemEmpMapRepository standItemEmpMapRepository,StandItemEquipmentMapRepository standItemEquipmentMapRepository,StandItemSpaceMapRepository standItemSpaceMapRepository) {
  73. this.repository = repository;
  74. this.detailRepository = detailRepository;
  75. this.importPatientItemRepository = importPatientItemRepository;
  76. this.itemRepository = itemRepository;
  77. this.standItemEmpMapRepository = standItemEmpMapRepository;
  78. this.standItemEquipmentMapRepository = standItemEquipmentMapRepository;
  79. this.standItemSpaceMapRepository = standItemSpaceMapRepository;
  80. this.itemEmpMapRepository = itemEmpMapRepository;
  81. this.itemEquipmentMapRepository = itemEquipmentMapRepository;
  82. this.itemSpaceMapRepository = itemSpaceMapRepository;
  83. this.shareParamTypeMapRepository = shareParamTypeMapRepository;
  84. this.responsibilityDepartmentRepository = responsibilityDepartmentRepository;
  85. this.centerService = centerService;
  86. this.computeStandShareParamRepository = computeStandShareParamRepository;
  87. this.computeStandShareParamDetailRepository = computeStandShareParamDetailRepository;
  88. this.standItemService = standItemService;
  89. this.sqlService=sqlService;
  90. this.responsibilityDepartmentService=responsibilityDepartmentService;
  91. }
  92. /**
  93. * 获取项目分摊参数
  94. *
  95. * @param current 当前页
  96. * @param pageSize 页容量
  97. * @param computeDate 核算年月
  98. * @param itemType 项目类型
  99. * @param responsibility 责任中心
  100. * @param itemFilter 项目过滤条件
  101. * @return 分页数据
  102. */
  103. @Override
  104. public Object getShareParamCostList(Integer current, Integer pageSize, String computeDate, String itemType, String responsibility, String itemFilter) {
  105. Page<ComputeShareParam> page = repository.getPage(current, pageSize, computeDate, itemType, responsibility, itemFilter);
  106. List<ComputeShareParam> records = page.getRecords();
  107. ShareParamCostResponse response = new ShareParamCostResponse();
  108. List<CommonTitleVo> titleVos = getCommonTitleVos();
  109. response.setTitle(titleVos);
  110. if (CollectionUtils.isEmpty(records)) {
  111. response.setPageData(new PageUtils(new ArrayList<>(), NumberConstant.ZERO, pageSize, current));
  112. return response;
  113. }
  114. List<Integer> collect1 = records.stream().map(ComputeShareParam::getId).collect(Collectors.toList());
  115. List<ComputeDateShareParamVo> shareParamDetails = detailRepository.getByShareParamId(computeDate, collect1);
  116. Map<String, String> typeNameMap = getTypeNameDict();
  117. shareParamDetails.forEach(record -> record.setItemTypeName(typeNameMap.get(record.getItemType())));
  118. Map<String, List<ComputeDateShareParamVo>> collect = shareParamDetails.stream().collect(Collectors.groupingBy(ComputeDateShareParamVo::getCode));
  119. List<List<ReportVo>> returnList = new ArrayList<>();
  120. //按报表头组装值
  121. for (ComputeShareParam itemCode : records) {
  122. setResultData(titleVos, collect, returnList, itemCode.getCode());
  123. }
  124. PageUtils pageUtils = new PageUtils(returnList, Math.toIntExact(page.getTotal()), pageSize, current);
  125. response.setPageData(pageUtils);
  126. return response;
  127. }
  128. /**
  129. * 完全法项目分摊参数计算
  130. * @param computeDate
  131. */
  132. @Override
  133. public void computeShareParamCost(String computeDate){
  134. String parameterValue = centerService.getParameterValueByIndex(ParameterConstant.ITEM_CALC_TYPE,NumberConstant.ZERO);
  135. //走系统计算逻辑
  136. if(StringUtils.isEmpty(parameterValue)|| NumberConstant.ONE_S.equals(parameterValue)||NumberConstant.THREE_S.equals(parameterValue)) {
  137. //根据参数判断是否走新的计算流程
  138. if (NumberConstant.ONE_S.equals(centerService.getParameterValue(ParameterConstant.USER_HOSP_ITEM_CALC))) {
  139. //完全法项目分摊参数计算
  140. calcShareParamCost(computeDate);
  141. } else {
  142. computeShareParamCostAction(computeDate);
  143. }
  144. }
  145. //走自定义SQL计算逻辑
  146. if(NumberConstant.TWO_S.equals(parameterValue)||NumberConstant.THREE_S.equals(parameterValue)) {
  147. //执行完全法项目分摊参数计算后续处理脚本
  148. execShareParamCostSQL(computeDate);
  149. }
  150. }
  151. /**
  152. * 项目分摊参数计算
  153. *
  154. * @param computeDate 核算年月
  155. */
  156. public void computeShareParamCostAction(String computeDate) {
  157. SessionUserVO currentUser = UserContext.getCurrentUser();
  158. //获取收费项目数据(项目)
  159. checkItemCount(computeDate, currentUser);
  160. //作废上次计算记录
  161. repository.removeByComputeDate(computeDate, currentUser);
  162. detailRepository.removeByComputeDate(computeDate, currentUser);
  163. //获到科室与责任中心对照
  164. List<VisitNoResponsibilityMap> patientResponsibility = getPatientResponsibility(currentUser);
  165. Map<String, String> responsibilityCodeMap = new HashMap<>();
  166. Map<String, String> responsibilityNameMap = new HashMap<>();
  167. patientResponsibility.forEach(visitNoResponsibilityMap -> {
  168. responsibilityCodeMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityCode());
  169. responsibilityNameMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityName());
  170. });
  171. //医疗服务项目字典
  172. Map<String, Map<String, Item>> itemMap = getItemMap();
  173. //获取计算列
  174. List<ShareParamTypeMap> shareParamType = shareParamTypeMapRepository.getList();
  175. //主表公共对象
  176. ComputeShareParam computeShareCost = new ComputeShareParam();
  177. computeShareCost.setComputeDate(computeDate);
  178. computeShareCost.setHospId(currentUser.getHospId());
  179. computeShareCost.setCreateUser(String.valueOf(currentUser.getId()));
  180. computeShareCost.setCreateTime(new Date());
  181. //明细表公共对象
  182. ComputeShareParamDetail costDetail = new ComputeShareParamDetail();
  183. costDetail.setComputeDate(computeDate);
  184. costDetail.setHospId(currentUser.getHospId());
  185. costDetail.setCreateUser(String.valueOf(currentUser.getId()));
  186. costDetail.setCreateTime(new Date());
  187. // long count = (itemSize + LIMIT - 1) / LIMIT;
  188. // for (int j = 0; j < count; j++) {
  189. List<PatientItemDepartmentGroupVo> items = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser);
  190. List<ComputeShareParamDetail> saveDetails = new ArrayList<>();
  191. List<ComputeShareParam> saveCost = new ArrayList<>();
  192. if (!CollectionUtils.isEmpty(items)) {
  193. for (int i = 0; i < items.size(); i++) {
  194. PatientItemDepartmentGroupVo item = items.get(i);
  195. ComputeShareParam itemCost = BeanUtil.convertObj(computeShareCost, ComputeShareParam.class);
  196. itemCost.setCode(item.getItemCode());
  197. itemCost.setName(item.getItemName());
  198. itemCost.setNum(item.getNum());
  199. Map<String, Item> departmentItem = itemMap.get(item.getExecuteDepartmentCode());
  200. if (CollectionUtils.isEmpty(departmentItem)) {
  201. continue;
  202. }
  203. Item itemData = departmentItem.get(item.getItemCode());
  204. if (Objects.isNull(itemData)) {
  205. continue;
  206. }
  207. itemCost.setItemType(itemData.getItemType());
  208. itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode()));
  209. itemCost.setResponsibilityName(responsibilityNameMap.get(item.getExecuteDepartmentCode()));
  210. itemCost.setIndex(i);
  211. saveCost.add(itemCost);
  212. costDetail.setIndex(i);
  213. saveDetails.addAll(setDetails(costDetail, item, shareParamType, itemMap));
  214. }
  215. if (!CollectionUtils.isEmpty(saveCost)) {
  216. //作废当前核算年月已有数据
  217. repository.saveBatch(saveCost, 500);
  218. if (!CollectionUtils.isEmpty(saveDetails)) {
  219. Map<Integer, Integer> indexId = saveCost.stream().collect(Collectors.toMap(ComputeShareParam::getIndex, ComputeShareParam::getId, (a, b) -> b));
  220. Map<Integer, List<ComputeShareParamDetail>> collect = saveDetails.stream().collect(Collectors.groupingBy(ComputeShareParamDetail::getIndex));
  221. List<ComputeShareParamDetail> saveCostDetails = new ArrayList<>();
  222. collect.forEach((k, v) -> {
  223. v.forEach(detail -> detail.setShareParamId(indexId.get(k)));
  224. saveCostDetails.addAll(v);
  225. });
  226. detailRepository.saveBatch(saveCostDetails, 500);
  227. }
  228. }
  229. }
  230. }
  231. /**
  232. * 项目分摊参数计算
  233. * @param computeDate
  234. */
  235. public void calcShareParamCost(String computeDate){
  236. SessionUserVO currentUser = UserContext.getCurrentUser();
  237. //获取收费项目数据(项目)
  238. checkItemCount(computeDate, currentUser);
  239. //作废上次计算记录
  240. repository.removeByComputeDate(computeDate, currentUser);
  241. detailRepository.removeByComputeDate(computeDate, currentUser);
  242. //医疗服务项目字典
  243. List<Item> itemList = itemRepository.getList();
  244. if (CollectionUtils.isEmpty(itemList)) {
  245. throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止");
  246. }
  247. //医疗服务项目的参与人员信息
  248. List<ItemEmpMap> itemEmpMaps = itemEmpMapRepository.getList();
  249. //医疗服务项目的使用设备信息
  250. List<ItemEquipmentMap> itemEquipmentMaps = itemEquipmentMapRepository.getList();
  251. //医疗服务项目的使用空间信息
  252. List<ItemSpaceMap> itemSpaceMaps = itemSpaceMapRepository.getList();
  253. //标准项目字典人员对照
  254. List<StandItemEmpMap> standItemEmpMaps = standItemEmpMapRepository.getList();
  255. //标准项目字典设备对照
  256. List<StandItemEquipmentMap> standItemEquipmentMaps = standItemEquipmentMapRepository.getList();
  257. //标准项目字典空间对照
  258. List<StandItemSpaceMap> standItemSpaceMaps = standItemSpaceMapRepository.getList();
  259. //科室责任中心对照信息
  260. List<ResponsibilityDepartIdVO> responsibilityDeptMaps = responsibilityDepartmentService.getResponsibilityDepart();
  261. //分摊参数设置信息
  262. List<ShareParamTypeMap> shareParamTypeMaps = shareParamTypeMapRepository.getList();
  263. //医疗服务项目分类字典
  264. DictDataVo itemTypeDict = centerService.getDict(Constant.MED_SERVICE_ITEM_TYPE);
  265. //月度患者收费项目信息(按执行科室+收费项目代码汇总过)
  266. List<PatientItemDepartmentGroupVo> ptChargeItems = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser);
  267. if (CollectionUtils.isEmpty(ptChargeItems)){
  268. throw new CostException("没有可计算的收费项目");
  269. }
  270. // //筛选出字典维护了的项目
  271. // List<PatientItemDepartmentGroupVo> activePtChargeItems = ptChargeItems.stream().filter(ptItem -> {
  272. // //科室项目字典维护了的数据
  273. // if (itemList.stream().anyMatch(item -> item.getCode().equals(ptItem.getItemCode()) && item.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode()))) {
  274. // return true;
  275. // }
  276. // //全院项目字典维护了的数据
  277. // if (itemList.stream().anyMatch(item -> item.getCode().equals(ptItem.getItemCode()) && item.getDepartmentCode().equals(NumberConstant.ZERO))) {
  278. // return true;
  279. // }
  280. // return false;
  281. // }).collect(Collectors.toList());
  282. // if (CollectionUtils.isEmpty(activePtChargeItems)){
  283. // throw new CostException("所有收费项目都没有对应的字典数据,请联系管理员");
  284. // }
  285. //绑定收费项目对应的医疗服务型项目字典对象
  286. ptChargeItems.stream().forEach(ptItem->{
  287. Item item = getDicItem(ptItem,itemList);
  288. ptItem.setDicItem(item);
  289. });
  290. List<ComputeShareParam> computeShareParamList = new ArrayList();
  291. List<ComputeShareParamDetail> ComputeShareParamDetailList = new ArrayList();
  292. ptChargeItems.stream().forEach(ptItem->{
  293. //只处理字典有项目
  294. if(!Objects.isNull(ptItem.getDicItem())) {
  295. //根据收费项目创建分摊参数主表对象
  296. ComputeShareParam computeShareCost = creatComputeShareParam(currentUser, computeDate, ptItem, itemTypeDict, responsibilityDeptMaps);
  297. computeShareParamList.add(computeShareCost);
  298. //创建分摊参数主表对象对应的明细对象
  299. shareParamTypeMaps.stream().forEach(shareParamType -> {
  300. ComputeShareParamDetail computeShareParamDetail = createComputeShareParamDetail(currentUser, computeDate, ptItem, computeShareCost, shareParamType, itemEmpMaps, itemEquipmentMaps, itemSpaceMaps,standItemEmpMaps, standItemEquipmentMaps, standItemSpaceMaps);
  301. ComputeShareParamDetailList.add(computeShareParamDetail);
  302. });
  303. }
  304. });
  305. //没有任何可保存的数据
  306. if (CollectionUtils.isEmpty(computeShareParamList)) {
  307. throw new CostException("没有任何可保存的数据");
  308. }
  309. //保存分摊参数主表对象数据
  310. repository.saveBatch(computeShareParamList, 500);
  311. if (CollectionUtils.isEmpty(ComputeShareParamDetailList)) {
  312. return;
  313. }
  314. //保存分摊参数明细表对象数据
  315. ComputeShareParamDetailList.stream().forEach(shareParamDetailL->shareParamDetailL.setShareParamId(shareParamDetailL.getComputeShareCost().getId()));
  316. detailRepository.saveBatch(ComputeShareParamDetailList, 500);
  317. }
  318. /**
  319. * 获取收费项目对应的医疗服务项目字典对象
  320. * @param ptItem
  321. * @param itemList
  322. * @return
  323. */
  324. public Item getDicItem(PatientItemDepartmentGroupVo ptItem,List<Item> itemList){
  325. //优先取科室项目字典的记录
  326. Optional<Item> first = itemList.stream().filter(dicItem -> dicItem.getCode().equals(ptItem.getItemCode()) && dicItem.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode())).findFirst();
  327. if(first.isPresent()) {
  328. return first.get();
  329. }
  330. //取全院通用的字典记录
  331. first = itemList.stream().filter(dicItem -> dicItem.getCode().equals(ptItem.getItemCode()) && dicItem.getDepartmentCode().equals(NumberConstant.ZERO)).findFirst();
  332. if(first.isPresent()) {
  333. return first.get();
  334. }
  335. return null;
  336. }
  337. /**
  338. * 根据收费项目创建分摊参数主表对象
  339. * @param currentUser
  340. * @param computeDate
  341. * @param itemTypeDict
  342. * @param ptItem
  343. * @param responsibilityDeptMaps
  344. * @return
  345. */
  346. public ComputeShareParam creatComputeShareParam(SessionUserVO currentUser,String computeDate,PatientItemDepartmentGroupVo ptItem,DictDataVo itemTypeDict, List<ResponsibilityDepartIdVO> responsibilityDeptMaps){
  347. ComputeShareParam computeShareCost = new ComputeShareParam();
  348. computeShareCost.setComputeDate(computeDate);
  349. computeShareCost.setHospId(currentUser.getHospId());
  350. computeShareCost.setCreateUser(String.valueOf(currentUser.getId()));
  351. computeShareCost.setCreateTime(new Date());
  352. computeShareCost.setCode(ptItem.getItemCode());
  353. computeShareCost.setName(ptItem.getItemName());
  354. computeShareCost.setNum(ptItem.getNum());
  355. //获取执行科室对应的责任中心
  356. Optional<ResponsibilityDepartIdVO> firstResponsibilityDepartIdVO = responsibilityDeptMaps.stream().filter(respDeptmap -> !Objects.isNull(respDeptmap.getDepartmentCode())&& respDeptmap.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode())).findFirst();
  357. if(!firstResponsibilityDepartIdVO.isPresent()){
  358. String errMsg = String.format("【%s(%s)】没有对应的责任中心,计算中止", ptItem.getExecuteDepartmentName(), ptItem.getExecuteDepartmentCode());
  359. throw new CostException(errMsg);
  360. }
  361. ResponsibilityDepartIdVO responsibilityDepartIdVO=firstResponsibilityDepartIdVO.get();
  362. computeShareCost.setResponsibilityCode(responsibilityDepartIdVO.getResponsibilityCode());
  363. computeShareCost.setResponsibilityName(responsibilityDepartIdVO.getResponsibilityName());
  364. // computeShareCost.setItemType(getChargeItemType(itemTypeDict,responsibilityDepartIdVO.getShareId()));
  365. computeShareCost.setItemType(ptItem.getDicItem().getItemType());
  366. return computeShareCost;
  367. }
  368. /**
  369. * 根据收费项目创建分摊参数明细表对象
  370. * @param currentUser
  371. * @param computeDate
  372. * @param ptItem
  373. * @param computeShareCost
  374. * @param shareParamType
  375. * @param itemEmpMaps
  376. * @param itemEquipmentMaps
  377. * @param itemSpaceMaps
  378. * @return
  379. */
  380. public ComputeShareParamDetail createComputeShareParamDetail( SessionUserVO currentUser,String computeDate,PatientItemDepartmentGroupVo ptItem,ComputeShareParam computeShareCost,ShareParamTypeMap shareParamType,
  381. List<ItemEmpMap> itemEmpMaps,List<ItemEquipmentMap> itemEquipmentMaps ,List<ItemSpaceMap> itemSpaceMaps,
  382. List<StandItemEmpMap> standItemEmpMaps,List<StandItemEquipmentMap> standItemEquipmentMaps ,List<StandItemSpaceMap> standItemSpaceMaps){
  383. //明细表公共对象
  384. ComputeShareParamDetail costDetail = new ComputeShareParamDetail();
  385. costDetail.setComputeDate(computeDate);
  386. costDetail.setHospId(currentUser.getHospId());
  387. costDetail.setCreateUser(String.valueOf(currentUser.getId()));
  388. costDetail.setCreateTime(new Date());
  389. costDetail.setShareParamCode(shareParamType.getShareParamCode());
  390. if(shareParamType.getSourceType().equals(NumberConstant.ONE_S)){
  391. //计算参与人员的参数值
  392. BigDecimal computeSingleResult = calcEmpParamValue(shareParamType, ptItem, itemEmpMaps);
  393. costDetail.setComputeSingleResult(computeSingleResult);
  394. costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum()));
  395. //计算标准法参与人员的参数值
  396. BigDecimal standComputeSingleResult = calcStandEmpParamValue(shareParamType, ptItem, standItemEmpMaps);
  397. costDetail.setStandComputeSingleResult(standComputeSingleResult);
  398. costDetail.setStandComputeResult(standComputeSingleResult.multiply(ptItem.getNum()));
  399. }else if(shareParamType.getSourceType().equals(NumberConstant.TWO_S)){
  400. //计算使用设备的参数值
  401. BigDecimal computeSingleResult = calcEquipmentParamValue(shareParamType, ptItem, itemEquipmentMaps);
  402. costDetail.setComputeSingleResult(computeSingleResult);
  403. costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum()));
  404. //计算标准法使用设备的参数值
  405. BigDecimal standComputeSingleResult = calcStandEquipmentParamValue(shareParamType, ptItem, standItemEquipmentMaps);
  406. costDetail.setStandComputeSingleResult(standComputeSingleResult);
  407. costDetail.setStandComputeResult(standComputeSingleResult.multiply(ptItem.getNum()));
  408. }else if(shareParamType.getSourceType().equals(NumberConstant.THREE_S)){
  409. //计算使用空间的参数值
  410. BigDecimal computeSingleResult = calcSpaceParamValue(shareParamType, ptItem, itemSpaceMaps);
  411. costDetail.setComputeSingleResult(computeSingleResult);
  412. costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum()));
  413. //计算标准法使用空间的参数值
  414. BigDecimal standComputeSingleResult = calcStandSpaceParamValue(shareParamType, ptItem,standItemSpaceMaps);
  415. costDetail.setStandComputeSingleResult(standComputeSingleResult);
  416. costDetail.setStandComputeResult(standComputeSingleResult.multiply(ptItem.getNum()));
  417. }else if(shareParamType.getSourceType().equals(NumberConstant.FOUR_S)){
  418. //计算项目收入的参数值
  419. BigDecimal computeResult = ptItem.getAmount();
  420. if (!ptItem.getNum().equals(BigDecimal.ZERO.setScale(NumberConstant.TWO, RoundingMode.HALF_UP))) {
  421. costDetail.setComputeSingleResult(computeResult.divide(ptItem.getNum(), NumberConstant.FOUR, RoundingMode.HALF_UP));
  422. costDetail.setStandComputeSingleResult(computeResult.divide(ptItem.getNum(), NumberConstant.FOUR, RoundingMode.HALF_UP));
  423. } else {
  424. costDetail.setComputeSingleResult(BigDecimal.ZERO.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
  425. costDetail.setStandComputeSingleResult(BigDecimal.ZERO.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
  426. }
  427. costDetail.setComputeResult(computeResult);
  428. costDetail.setStandComputeResult(computeResult);
  429. }else if(shareParamType.getSourceType().equals(NumberConstant.FIVE_S)){
  430. //计算项目数量的参数值
  431. BigDecimal computeResult = ptItem.getNum();
  432. costDetail.setComputeSingleResult(BigDecimal.ONE.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
  433. costDetail.setComputeResult(computeResult);
  434. //计算标准法项目数量的参数值
  435. costDetail.setStandComputeSingleResult(BigDecimal.ONE.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP));
  436. costDetail.setStandComputeResult(computeResult);
  437. }
  438. costDetail.setComputeShareCost(computeShareCost);
  439. return costDetail;
  440. }
  441. /**
  442. * 计算参与人员的参数值
  443. * @param ptItem
  444. * @param itemEmpMaps
  445. * @return
  446. */
  447. public BigDecimal calcEmpParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<ItemEmpMap> itemEmpMaps){
  448. //没有人员配置
  449. if(CollectionUtils.isEmpty(itemEmpMaps)){
  450. return BigDecimal.ZERO;
  451. }
  452. String sourceCode = shareParamType.getSourceCode();
  453. //没有维护对应的来源代码
  454. if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
  455. return BigDecimal.ZERO;
  456. }
  457. //获取项目对应的参与人员配置
  458. List<ItemEmpMap> itemEmpList = itemEmpMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList());
  459. if(CollectionUtils.isEmpty(itemEmpList)){
  460. return BigDecimal.ZERO;
  461. }
  462. BigDecimal paramValue=BigDecimal.ZERO;
  463. //全部项目
  464. if(sourceCode.equals(NumberConstant.ZERO_S)){
  465. paramValue = itemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  466. return paramValue;
  467. }
  468. //不是全部的项目时,有可能会是多个
  469. List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
  470. //获取符合条件的项目
  471. List<ItemEmpMap> activeItemEmpList = itemEmpList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEmpTypeCode())).collect(Collectors.toList());
  472. if(CollectionUtils.isEmpty(activeItemEmpList)){
  473. return paramValue;
  474. }
  475. //只统计符合条件的项目
  476. paramValue = activeItemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  477. return paramValue;
  478. }
  479. /**
  480. * 计算标准项目参与人员的参数值
  481. * @param ptItem
  482. * @param standItemEmpMaps
  483. * @return
  484. */
  485. public BigDecimal calcStandEmpParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<StandItemEmpMap> standItemEmpMaps){
  486. //没有人员配置
  487. if(CollectionUtils.isEmpty(standItemEmpMaps)){
  488. return BigDecimal.ZERO;
  489. }
  490. String sourceCode = shareParamType.getSourceCode();
  491. //没有维护对应的来源代码
  492. if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
  493. return BigDecimal.ZERO;
  494. }
  495. //获取项目对应的标准项目的参与人员配置
  496. List<StandItemEmpMap> itemEmpList = standItemEmpMaps.stream().filter(itemEmp ->!ObjectUtils.isEmpty(ptItem.getDicItem())&& ptItem.getDicItem().getStandItemCode().equals(itemEmp.getStandItemCode())).collect(Collectors.toList());
  497. if(CollectionUtils.isEmpty(itemEmpList)){
  498. return BigDecimal.ZERO;
  499. }
  500. BigDecimal paramValue=BigDecimal.ZERO;
  501. //全部项目
  502. if(sourceCode.equals(NumberConstant.ZERO_S)){
  503. paramValue = itemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  504. return paramValue;
  505. }
  506. //不是全部的项目时,有可能会是多个
  507. List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
  508. //获取符合条件的项目
  509. List<StandItemEmpMap> activeItemEmpList = itemEmpList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEmpTypeCode())).collect(Collectors.toList());
  510. if(CollectionUtils.isEmpty(activeItemEmpList)){
  511. return paramValue;
  512. }
  513. //只统计符合条件的项目
  514. paramValue = activeItemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  515. return paramValue;
  516. }
  517. /**
  518. * 计算使用设备参数值
  519. * @param shareParamType
  520. * @param ptItem
  521. * @param itemEquipmentMaps
  522. * @return
  523. */
  524. public BigDecimal calcEquipmentParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<ItemEquipmentMap> itemEquipmentMaps){
  525. //没有人员配置
  526. if(CollectionUtils.isEmpty(itemEquipmentMaps)){
  527. return BigDecimal.ZERO;
  528. }
  529. String sourceCode = shareParamType.getSourceCode();
  530. //没有维护对应的来源代码
  531. if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
  532. return BigDecimal.ZERO;
  533. }
  534. //获取项目对应的使用设备配置
  535. List<ItemEquipmentMap> itemEquipmentList = itemEquipmentMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList());
  536. if(CollectionUtils.isEmpty(itemEquipmentList)){
  537. return BigDecimal.ZERO;
  538. }
  539. BigDecimal paramValue=BigDecimal.ZERO;
  540. //全部项目
  541. if(sourceCode.equals(NumberConstant.ZERO_S)){
  542. paramValue = itemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  543. return paramValue;
  544. }
  545. //不是全部的项目时,有可能会是多个
  546. List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
  547. //获取符合条件的项目
  548. List<ItemEquipmentMap> activeItemEquipmentList = itemEquipmentList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEquipmentCode())).collect(Collectors.toList());
  549. if(CollectionUtils.isEmpty(activeItemEquipmentList)){
  550. return paramValue;
  551. }
  552. //只统计符合条件的项目
  553. paramValue = activeItemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  554. return paramValue;
  555. }
  556. /**
  557. * 计算标准项目使用设备参数值
  558. * @param shareParamType
  559. * @param ptItem
  560. * @param standItemEquipmentMaps
  561. * @return
  562. */
  563. public BigDecimal calcStandEquipmentParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<StandItemEquipmentMap> standItemEquipmentMaps){
  564. //没有人员配置
  565. if(CollectionUtils.isEmpty(standItemEquipmentMaps)){
  566. return BigDecimal.ZERO;
  567. }
  568. String sourceCode = shareParamType.getSourceCode();
  569. //没有维护对应的来源代码
  570. if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
  571. return BigDecimal.ZERO;
  572. }
  573. //获取项目对应的标准项目的使用设备配置
  574. List<StandItemEquipmentMap> itemEquipmentList = standItemEquipmentMaps.stream().filter(itemEmp ->!ObjectUtils.isEmpty(ptItem.getDicItem())&& itemEmp.getStandItemCode().equals(ptItem.getDicItem().getStandItemCode())).collect(Collectors.toList());
  575. if(CollectionUtils.isEmpty(itemEquipmentList)){
  576. return BigDecimal.ZERO;
  577. }
  578. BigDecimal paramValue=BigDecimal.ZERO;
  579. //全部项目
  580. if(sourceCode.equals(NumberConstant.ZERO_S)){
  581. paramValue = itemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  582. return paramValue;
  583. }
  584. //不是全部的项目时,有可能会是多个
  585. List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
  586. //获取符合条件的项目
  587. List<StandItemEquipmentMap> activeItemEquipmentList = itemEquipmentList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEquipmentCode())).collect(Collectors.toList());
  588. if(CollectionUtils.isEmpty(activeItemEquipmentList)){
  589. return paramValue;
  590. }
  591. //只统计符合条件的项目
  592. paramValue = activeItemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  593. return paramValue;
  594. }
  595. /**
  596. * 计算使用空间参数值
  597. * @param shareParamType
  598. * @param ptItem
  599. * @param itemSpaceMaps
  600. * @return
  601. */
  602. public BigDecimal calcSpaceParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<ItemSpaceMap> itemSpaceMaps){
  603. //没有人员配置
  604. if(CollectionUtils.isEmpty(itemSpaceMaps)){
  605. return BigDecimal.ZERO;
  606. }
  607. String sourceCode = shareParamType.getSourceCode();
  608. //没有维护对应的来源代码
  609. if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
  610. return BigDecimal.ZERO;
  611. }
  612. //获取项目对应的使用空间配置
  613. List<ItemSpaceMap> itemSpaceList = itemSpaceMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList());
  614. if(CollectionUtils.isEmpty(itemSpaceList)){
  615. return BigDecimal.ZERO;
  616. }
  617. BigDecimal paramValue=BigDecimal.ZERO;
  618. //全部项目
  619. if(sourceCode.equals(NumberConstant.ZERO_S)){
  620. paramValue = itemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  621. return paramValue;
  622. }
  623. //不是全部的项目时,有可能会是多个
  624. List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
  625. //获取符合条件的项目
  626. List<ItemSpaceMap> activeItemSpaceList = itemSpaceList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getSpaceCode())).collect(Collectors.toList());
  627. if(CollectionUtils.isEmpty(activeItemSpaceList)){
  628. return paramValue;
  629. }
  630. //只统计符合条件的项目
  631. paramValue = activeItemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  632. return paramValue;
  633. }
  634. /**
  635. * 计算标准项目使用空间参数值
  636. * @param shareParamType
  637. * @param ptItem
  638. * @param standItemSpaceMaps
  639. * @return
  640. */
  641. public BigDecimal calcStandSpaceParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List<StandItemSpaceMap> standItemSpaceMaps){
  642. //没有人员配置
  643. if(CollectionUtils.isEmpty(standItemSpaceMaps)){
  644. return BigDecimal.ZERO;
  645. }
  646. String sourceCode = shareParamType.getSourceCode();
  647. //没有维护对应的来源代码
  648. if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){
  649. return BigDecimal.ZERO;
  650. }
  651. //获取项目对应的使用空间配置
  652. List<StandItemSpaceMap> itemSpaceList = standItemSpaceMaps.stream().filter(itemEmp ->!ObjectUtils.isEmpty(ptItem.getDicItem())&&itemEmp.getStandItemCode().equals(ptItem.getDicItem().getStandItemCode())).collect(Collectors.toList());
  653. if(CollectionUtils.isEmpty(itemSpaceList)){
  654. return BigDecimal.ZERO;
  655. }
  656. BigDecimal paramValue=BigDecimal.ZERO;
  657. //全部项目
  658. if(sourceCode.equals(NumberConstant.ZERO_S)){
  659. paramValue = itemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  660. return paramValue;
  661. }
  662. //不是全部的项目时,有可能会是多个
  663. List<String> sourceCodeList = StrUtil.split(sourceCode, "|");
  664. //获取符合条件的项目
  665. List<StandItemSpaceMap> activeItemSpaceList = itemSpaceList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getSpaceCode())).collect(Collectors.toList());
  666. if(CollectionUtils.isEmpty(activeItemSpaceList)){
  667. return paramValue;
  668. }
  669. //只统计符合条件的项目
  670. paramValue = activeItemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
  671. return paramValue;
  672. }
  673. /**
  674. * 根据责任中心获取医疗服务项目分类
  675. * @param dict
  676. * @param shareLevelId
  677. * @return
  678. */
  679. public String getChargeItemType(DictDataVo dict,Long shareLevelId){
  680. List<DictDataVo> dataVoList= dict.getDataVoList();
  681. if(CollectionUtils.isEmpty(dataVoList)){
  682. return NumberConstant.ONE_S;
  683. }
  684. DictDataVo dictDataVo = dataVoList.stream().filter(dataVo -> dataVo.getValue().equals(shareLevelId.toString())).findFirst().get();
  685. return NumberConstant.ONE_S;
  686. }
  687. /**
  688. * 执行完全法项目分摊参数计算后续处理脚本
  689. * @param computeDate
  690. */
  691. public void execShareParamCostSQL(String computeDate){
  692. Map<String,String> sqlParameter = new HashMap<>();
  693. sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
  694. sqlService.autoExecuteSql(CustomSqlTypeEnum.FULL_PROJECT_PARAM_CALC.getCode(),sqlParameter);
  695. }
  696. /**
  697. * 获取标准项目分摊参数
  698. *
  699. * @param current 当前页
  700. * @param pageSize 页容量
  701. * @param computeDate 核算年月
  702. * @param itemType 项目类型
  703. * @param responsibility 责任中心
  704. * @param itemFilter 项目过滤条件
  705. * @return 分页数据
  706. */
  707. @Override
  708. public Object getStandShareParamCostList(Integer current, Integer pageSize, String computeDate, String itemType, String responsibility, String itemFilter) {
  709. Page<ComputeStandShareParam> page = computeStandShareParamRepository.getPage(current, pageSize, computeDate, itemType, responsibility, itemFilter);
  710. List<ComputeStandShareParam> records = page.getRecords();
  711. ShareParamCostResponse response = new ShareParamCostResponse();
  712. List<CommonTitleVo> titleVos = getCommonTitleVos();
  713. response.setTitle(titleVos);
  714. if (CollectionUtils.isEmpty(records)) {
  715. response.setPageData(new PageUtils(new ArrayList<>(), NumberConstant.ZERO, pageSize, current));
  716. return response;
  717. }
  718. List<Integer> collect1 = records.stream().map(ComputeStandShareParam::getId).collect(Collectors.toList());
  719. List<ComputeDateShareParamVo> shareParamDetails = computeStandShareParamDetailRepository.getByShareParamId(computeDate, collect1);
  720. Map<String, String> typeNameMap = getTypeNameDict();
  721. shareParamDetails.forEach(record -> record.setItemTypeName(typeNameMap.get(record.getItemType())));
  722. List<List<ReportVo>> returnList = new ArrayList<>();
  723. //按报表头组装值
  724. Map<String, List<ComputeDateShareParamVo>> collect = shareParamDetails.stream().collect(Collectors.groupingBy(ComputeDateShareParamVo::getCode));
  725. for (ComputeStandShareParam itemCode : records) {
  726. setResultData(titleVos, collect, returnList, itemCode.getCode());
  727. }
  728. PageUtils pageUtils = new PageUtils(returnList, Math.toIntExact(page.getTotal()), pageSize, current);
  729. response.setPageData(pageUtils);
  730. return response;
  731. }
  732. private @NotNull Map<String, String> getTypeNameDict() {
  733. DictDataVo centerDict = centerService.getCenterDict(Constant.MED_SERVICE_ITEM_TYPE);
  734. List<DictDataVo> dataVoList = centerDict.getDataVoList();
  735. return dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
  736. }
  737. private @NotNull List<CommonTitleVo> getCommonTitleVos() {
  738. List<CommonTitleVo> titleVos = new ArrayList<>();
  739. titleVos.add(new CommonTitleVo(RESPONSIBILITY_CODE.getCode(), RESPONSIBILITY_CODE.getName()));
  740. titleVos.add(new CommonTitleVo(RESPONSIBILITY_NAME.getCode(), RESPONSIBILITY_NAME.getName()));
  741. titleVos.add(new CommonTitleVo(ITEM_CODE.getCode(), ITEM_CODE.getName()));
  742. titleVos.add(new CommonTitleVo(ITEM_NAME.getCode(), ITEM_NAME.getName()));
  743. titleVos.add(new CommonTitleVo(ITEM_TYPE.getCode(), ITEM_TYPE.getName()));
  744. List<ShareParamTypeMap> shareParamType = shareParamTypeMapRepository.getList();
  745. for (ShareParamTypeMap shareParamTypeMap : shareParamType) {
  746. titleVos.add(getTitle(shareParamTypeMap.getShareParamCode(), shareParamTypeMap.getShareParamName()));
  747. }
  748. return titleVos;
  749. }
  750. private void setResultData(List<CommonTitleVo> titleVos, Map<String, List<ComputeDateShareParamVo>> collect, List<List<ReportVo>> returnList, String code) {
  751. List<ComputeDateShareParamVo> computeDateShareParamVos = collect.get(code);
  752. Map<String, BigDecimal> computeResultMap = computeDateShareParamVos.stream().collect(Collectors.toMap(ComputeDateShareParamVo::getShareParamCode, ComputeDateShareParamVo::getComputeResult, (a, b) -> b));
  753. List<ReportVo> dataList = new ArrayList<>();
  754. for (CommonTitleVo titleVo : titleVos) {
  755. if (titleVo.getCode().equals(RESPONSIBILITY_CODE.getCode())) {
  756. dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getResponsibilityCode()));
  757. } else if (titleVo.getCode().equals(RESPONSIBILITY_NAME.getCode())) {
  758. dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getResponsibilityName()));
  759. } else if (titleVo.getCode().equals(ITEM_CODE.getCode())) {
  760. dataList.add(getData(titleVo.getCode(), code));
  761. } else if (titleVo.getCode().equals(ITEM_NAME.getCode())) {
  762. dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getName()));
  763. } else if (titleVo.getCode().equals(ITEM_TYPE.getCode())) {
  764. dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getItemTypeName()));
  765. } else {
  766. dataList.add(getData(titleVo.getCode(), computeResultMap.get(titleVo.getCode())));
  767. }
  768. }
  769. returnList.add(dataList);
  770. }
  771. /**
  772. * 标准法项目分摊参数计算
  773. * @param computeDate
  774. */
  775. @Override
  776. public void computeStandShareParamCost(String computeDate){
  777. String parameterValue = centerService.getParameterValueByIndex(ParameterConstant.ITEM_CALC_TYPE,NumberConstant.TWO);
  778. //走系统计算逻辑
  779. if(StringUtils.isEmpty(parameterValue)|| NumberConstant.ONE_S.equals(parameterValue)||NumberConstant.THREE_S.equals(parameterValue)) {
  780. //标准法项目分摊参数计算
  781. computeStandShareParamCostAction(computeDate);
  782. }
  783. //走自定义SQL计算逻辑
  784. if(NumberConstant.TWO_S.equals(parameterValue)||NumberConstant.THREE_S.equals(parameterValue)) {
  785. //执行标准法项目分摊参数计算后续处理脚本
  786. execStandShareParamCostSQL(computeDate);
  787. }
  788. }
  789. /**
  790. * 计算标准项目分摊参数
  791. *
  792. * @param computeDate 核算年月
  793. */
  794. public void computeStandShareParamCostAction(String computeDate) {
  795. SessionUserVO currentUser = UserContext.getCurrentUser();
  796. //把当月需要计算数据置成0
  797. // importPatientItemRepository.updateGroupCalculateFlag(computeDate, currentUser);
  798. //获取收费项目数据(项目)
  799. checkItemCount(computeDate, currentUser);
  800. //获取计算列
  801. List<ShareParamTypeMap> shareParamType = shareParamTypeMapRepository.getList();
  802. if (CollectionUtils.isEmpty(shareParamType)) {
  803. throw new CostException("分摊参数来源项目未对照【com_share_param_type_map】表无数据");
  804. }
  805. //作废上次计算记录
  806. computeStandShareParamRepository.removeByComputeDate(computeDate, currentUser);
  807. computeStandShareParamDetailRepository.removeByComputeDate(computeDate, currentUser);
  808. //获到科室与责任中心对照
  809. List<VisitNoResponsibilityMap> patientResponsibility = getPatientResponsibility(currentUser);
  810. Map<String, String> responsibilityCodeMap = new HashMap<>();
  811. Map<String, String> responsibilityNameMap = new HashMap<>();
  812. patientResponsibility.forEach(visitNoResponsibilityMap -> {
  813. responsibilityCodeMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityCode());
  814. responsibilityNameMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityName());
  815. });
  816. //医疗服务项目字典
  817. Map<String, Map<String, Item>> itemMap = getStandItemMap();
  818. //主表公共对象
  819. ComputeStandShareParam computeShareCost = new ComputeStandShareParam();
  820. computeShareCost.setComputeDate(computeDate);
  821. computeShareCost.setHospId(currentUser.getHospId());
  822. computeShareCost.setCreateUser(String.valueOf(currentUser.getId()));
  823. computeShareCost.setCreateTime(new Date());
  824. //明细表公共对象
  825. ComputeStandShareParamDetail costDetail = new ComputeStandShareParamDetail();
  826. costDetail.setComputeDate(computeDate);
  827. costDetail.setHospId(currentUser.getHospId());
  828. costDetail.setCreateUser(String.valueOf(currentUser.getId()));
  829. costDetail.setCreateTime(new Date());
  830. List<PatientItemDepartmentGroupVo> items = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser);
  831. List<ComputeStandShareParamDetail> saveDetails = new ArrayList<>();
  832. List<ComputeStandShareParam> saveCost = new ArrayList<>();
  833. if (!CollectionUtils.isEmpty(items)) {
  834. for (int i = 0; i < items.size(); i++) {
  835. PatientItemDepartmentGroupVo item = items.get(i);
  836. ComputeStandShareParam itemCost = BeanUtil.convertObj(computeShareCost, ComputeStandShareParam.class);
  837. itemCost.setCode(item.getItemCode());
  838. itemCost.setName(item.getItemName());
  839. itemCost.setNum(item.getNum());
  840. Map<String, Item> departmentItem = itemMap.get(item.getExecuteDepartmentCode());
  841. if (CollectionUtils.isEmpty(departmentItem)) {
  842. continue;
  843. }
  844. Item itemData = departmentItem.get(item.getItemCode());
  845. if (Objects.isNull(itemData)) {
  846. continue;
  847. }
  848. itemCost.setItemType(itemData.getItemType());
  849. itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode()));
  850. itemCost.setResponsibilityName(responsibilityNameMap.get(item.getExecuteDepartmentCode()));
  851. itemCost.setIndex(i);
  852. saveCost.add(itemCost);
  853. costDetail.setIndex(i);
  854. saveDetails.addAll(setStandDetails(costDetail, item, shareParamType, itemMap));
  855. }
  856. if (!CollectionUtils.isEmpty(saveCost)) {
  857. //作废当前核算年月已有数据
  858. computeStandShareParamRepository.saveBatch(saveCost, 500);
  859. if (!CollectionUtils.isEmpty(saveDetails)) {
  860. Map<Integer, Integer> indexId = saveCost.stream().collect(Collectors.toMap(ComputeStandShareParam::getIndex, ComputeStandShareParam::getId, (a, b) -> b));
  861. Map<Integer, List<ComputeStandShareParamDetail>> collect = saveDetails.stream().collect(Collectors.groupingBy(ComputeStandShareParamDetail::getIndex));
  862. List<ComputeStandShareParamDetail> saveCostDetails = new ArrayList<>();
  863. collect.forEach((k, v) -> {
  864. v.forEach(detail -> detail.setShareParamId(indexId.get(k)));
  865. saveCostDetails.addAll(v);
  866. });
  867. computeStandShareParamDetailRepository.saveBatch(saveCostDetails, 500);
  868. }
  869. }
  870. }
  871. }
  872. /**
  873. * 执行标准法项目分摊参数计算后续处理脚本
  874. * @param computeDate
  875. */
  876. public void execStandShareParamCostSQL(String computeDate){
  877. Map<String,String> sqlParameter = new HashMap<>();
  878. sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate);
  879. sqlService.autoExecuteSql(CustomSqlTypeEnum.STAND_PROJECT_PARAM_CALC.getCode(),sqlParameter);
  880. }
  881. private void checkItemCount(String computeDate, SessionUserVO currentUser) {
  882. long itemSize = importPatientItemRepository.getItemCount(computeDate, currentUser);
  883. if (Objects.equals(itemSize, NumberConstant.ZERO_L)) {
  884. log.error("当前核算年月【{}】未导入收费项目数据,计算中止", computeDate);
  885. throw new CostException("当前核算年月【" + computeDate + "】未导入收费项目数据,计算中止");
  886. }
  887. }
  888. private @NotNull Map<String, Map<String, Item>> getStandItemMap() {
  889. List<Item> itemList = itemRepository.getList();
  890. if (CollectionUtils.isEmpty(itemList)) {
  891. throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止");
  892. }
  893. //去除未对照标准项目的数据
  894. //获取标准项目字典
  895. List<StandItem> standItemDict = standItemService.getStandItemDict();
  896. if (CollectionUtils.isEmpty(standItemDict)) {
  897. log.error("当前院区未找到标准项目数据,计算中止");
  898. throw new CostException("当前院区未找到标准项目数据,计算中止");
  899. }
  900. Map<String, StandItem> standItemMap = standItemDict.stream().collect(Collectors.toMap(StandItem::getCode, standItem -> standItem, (a, b) -> b));
  901. for (Item item1 : itemList) {
  902. String standItemCode = item1.getStandItemCode();
  903. if (!StringUtils.isEmpty(standItemCode)) {
  904. if (Objects.nonNull(standItemMap.get(standItemCode))) {
  905. item1.setStandItem(standItemMap.get(standItemCode));
  906. }
  907. }
  908. }
  909. Map<String, Map<String, Item>> itemMap = new HashMap<>();
  910. Map<String, List<Item>> collect = itemList.stream().collect(Collectors.groupingBy(Item::getDepartmentCode));
  911. collect.forEach((k, v) -> itemMap.put(k, v.stream().collect(Collectors.toMap(Item::getCode, item -> item, (a, b) -> b))));
  912. return itemMap;
  913. }
  914. private CommonTitleVo getTitle(String code, String name) {
  915. return new CommonTitleVo(code, name);
  916. }
  917. private ReportVo getData(String code, Object name) {
  918. ReportVo vo = new ReportVo();
  919. vo.setCode(code);
  920. vo.setValue(name);
  921. return vo;
  922. }
  923. private List<ComputeShareParamDetail> setDetails(ComputeShareParamDetail costDetail, PatientItemDepartmentGroupVo patientItem, List<ShareParamTypeMap> shareParamType,
  924. Map<String, Map<String, Item>> itemMap) {
  925. List<ComputeShareParamDetail> details = new ArrayList<>();
  926. Item item = itemMap.get(patientItem.getExecuteDepartmentCode()).get(patientItem.getItemCode());
  927. // Item item = itemMap.get(patientItem.getItemCode());
  928. for (ShareParamTypeMap shareParam : shareParamType) {
  929. ComputeShareParamDetail result = BeanUtil.convertObj(costDetail, ComputeShareParamDetail.class);
  930. switch (shareParam.getSourceType()) {
  931. case NumberConstant.ONE_S: {
  932. //参与人员、
  933. List<ItemEmpMap> empMaps = item.getEmpMaps();
  934. if (!CollectionUtils.isEmpty(empMaps)) {
  935. Map<String, List<ItemEmpMap>> collect = empMaps.stream().collect(Collectors.groupingBy(ItemEmpMap::getEmpTypeCode));
  936. // Map<String, ItemEmpMap> map = empMaps.stream().collect(Collectors.toMap(ItemEmpMap::getEmpTypeCode, empMap -> empMap, (a, b) -> b));
  937. String sourceCode = shareParam.getSourceCode();
  938. if (sourceCode.equals(NumberConstant.ZERO_S)) {
  939. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  940. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  941. for (ItemEmpMap empMap : empMaps) {
  942. BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum());
  943. sum.updateAndGet(v -> v.add(multiply));
  944. singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum())));
  945. }
  946. result.setComputeResult(sum.get());
  947. result.setComputeSingleResult(singleSum.get());
  948. result.setShareParamCode(shareParam.getShareParamCode());
  949. details.add(result);
  950. } else if (sourceCode.contains("|")) {
  951. List<String> split = StrUtil.split(sourceCode, "|");
  952. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  953. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  954. for (String s : split) {
  955. List<ItemEmpMap> itemEmpMaps = collect.get(s);
  956. if (!CollectionUtils.isEmpty(itemEmpMaps)) {
  957. for (ItemEmpMap itemEmpMap : itemEmpMaps) {
  958. if (Objects.nonNull(itemEmpMap)) {
  959. BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum());
  960. sum.updateAndGet(v -> v.add(multiply));
  961. singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum())));
  962. } else {
  963. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  964. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  965. }
  966. }
  967. } else {
  968. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  969. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  970. }
  971. }
  972. result.setShareParamCode(shareParam.getShareParamCode());
  973. result.setComputeResult(sum.get());
  974. result.setComputeSingleResult(singleSum.get());
  975. details.add(result);
  976. } else {
  977. List<ItemEmpMap> itemEmpMaps = collect.get(sourceCode);
  978. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  979. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  980. if (!CollectionUtils.isEmpty(itemEmpMaps)) {
  981. for (ItemEmpMap itemEmpMap : itemEmpMaps) {
  982. if (Objects.nonNull(itemEmpMap)) {
  983. BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum());
  984. sum.updateAndGet(v -> v.add(multiply));
  985. singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum())));
  986. } else {
  987. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  988. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  989. }
  990. }
  991. } else {
  992. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  993. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  994. }
  995. result.setComputeResult(sum.get());
  996. result.setShareParamCode(shareParam.getShareParamCode());
  997. result.setComputeSingleResult(singleSum.get());
  998. details.add(result);
  999. }
  1000. } else {
  1001. result.setComputeResult(BigDecimal.ZERO);
  1002. result.setComputeSingleResult(BigDecimal.ZERO);
  1003. result.setShareParamCode(shareParam.getShareParamCode());
  1004. details.add(result);
  1005. }
  1006. break;
  1007. }
  1008. case NumberConstant.TWO_S: {
  1009. //使用设备
  1010. List<ItemEquipmentMap> equipmentMaps = item.getEquipmentMaps();
  1011. if (!CollectionUtils.isEmpty(equipmentMaps)) {
  1012. Map<String, List<ItemEquipmentMap>> collect = equipmentMaps.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getEquipmentCode));
  1013. // Map<String, ItemEquipmentMap> map = equipmentMaps.stream().collect(Collectors.toMap(ItemEquipmentMap::getEquipmentCode, empMap -> empMap, (a, b) -> b));
  1014. String sourceCode = shareParam.getSourceCode();
  1015. if (sourceCode.equals(NumberConstant.ZERO_S)) {
  1016. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1017. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1018. for (ItemEquipmentMap empMap : equipmentMaps) {
  1019. BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum());
  1020. sum.updateAndGet(v -> v.add(multiply));
  1021. singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum())));
  1022. }
  1023. result.setComputeResult(sum.get());
  1024. result.setComputeSingleResult(singleSum.get());
  1025. result.setShareParamCode(shareParam.getShareParamCode());
  1026. details.add(result);
  1027. } else if (sourceCode.contains("|")) {
  1028. List<String> split = StrUtil.split(sourceCode, "|");
  1029. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1030. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1031. for (String s : split) {
  1032. List<ItemEquipmentMap> itemEquipmentMaps = collect.get(s);
  1033. if (!CollectionUtils.isEmpty(itemEquipmentMaps)) {
  1034. for (ItemEquipmentMap equipmentMap : itemEquipmentMaps) {
  1035. if (Objects.nonNull(equipmentMap)) {
  1036. BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum());
  1037. sum.updateAndGet(v -> v.add(multiply));
  1038. singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum())));
  1039. } else {
  1040. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1041. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1042. }
  1043. }
  1044. } else {
  1045. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1046. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1047. }
  1048. }
  1049. result.setShareParamCode(shareParam.getShareParamCode());
  1050. result.setComputeResult(sum.get());
  1051. result.setComputeSingleResult(singleSum.get());
  1052. details.add(result);
  1053. } else {
  1054. List<ItemEquipmentMap> itemEquipmentMaps = collect.get(sourceCode);
  1055. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1056. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1057. for (ItemEquipmentMap equipmentMap : itemEquipmentMaps) {
  1058. if (Objects.nonNull(equipmentMap)) {
  1059. BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum());
  1060. sum.updateAndGet(v -> v.add(multiply));
  1061. singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum())));
  1062. } else {
  1063. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1064. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1065. }
  1066. }
  1067. result.setComputeResult(sum.get());
  1068. result.setComputeSingleResult(singleSum.get());
  1069. result.setShareParamCode(shareParam.getShareParamCode());
  1070. details.add(result);
  1071. }
  1072. } else {
  1073. result.setComputeResult(BigDecimal.ZERO);
  1074. result.setComputeSingleResult(BigDecimal.ZERO);
  1075. result.setShareParamCode(shareParam.getShareParamCode());
  1076. details.add(result);
  1077. }
  1078. break;
  1079. }
  1080. case NumberConstant.THREE_S: {
  1081. //使用空间
  1082. List<ItemSpaceMap> spaceMaps = item.getSpaceMaps();
  1083. if (!CollectionUtils.isEmpty(spaceMaps)) {
  1084. // Map<String, ItemSpaceMap> map = spaceMaps.stream().collect(Collectors.toMap(ItemSpaceMap::getSpaceCode, f -> f, (a, b) -> b));
  1085. Map<String, List<ItemSpaceMap>> collect = spaceMaps.stream().collect(Collectors.groupingBy(ItemSpaceMap::getSpaceCode));
  1086. String sourceCode = shareParam.getSourceCode();
  1087. if (sourceCode.equals(NumberConstant.ZERO_S)) {
  1088. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1089. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1090. for (ItemSpaceMap empMap : spaceMaps) {
  1091. BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum());
  1092. sum.updateAndGet(v -> v.add(multiply));
  1093. singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum())));
  1094. }
  1095. result.setComputeResult(sum.get());
  1096. result.setComputeSingleResult(singleSum.get());
  1097. result.setShareParamCode(shareParam.getShareParamCode());
  1098. details.add(result);
  1099. } else if (sourceCode.contains("|")) {
  1100. List<String> split = StrUtil.split(sourceCode, "|");
  1101. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1102. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1103. for (String s : split) {
  1104. List<ItemSpaceMap> itemSpaceMaps = collect.get(s);
  1105. if (!CollectionUtils.isEmpty(itemSpaceMaps)) {
  1106. for (ItemSpaceMap spaceMap : itemSpaceMaps) {
  1107. if (Objects.nonNull(spaceMap)) {
  1108. BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum());
  1109. sum.updateAndGet(v -> v.add(multiply));
  1110. singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum())));
  1111. } else {
  1112. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1113. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1114. }
  1115. }
  1116. } else {
  1117. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1118. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1119. }
  1120. }
  1121. result.setShareParamCode(shareParam.getShareParamCode());
  1122. result.setComputeResult(sum.get());
  1123. result.setComputeSingleResult(singleSum.get());
  1124. details.add(result);
  1125. } else {
  1126. List<ItemSpaceMap> itemSpaceMaps = collect.get(sourceCode);
  1127. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1128. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1129. if (!CollectionUtils.isEmpty(itemSpaceMaps)) {
  1130. for (ItemSpaceMap spaceMap : itemSpaceMaps) {
  1131. if (Objects.nonNull(spaceMap)) {
  1132. BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum());
  1133. sum.updateAndGet(v -> v.add(multiply));
  1134. singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum())));
  1135. } else {
  1136. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1137. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1138. }
  1139. }
  1140. } else {
  1141. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1142. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1143. }
  1144. result.setComputeResult(sum.get());
  1145. result.setComputeSingleResult(singleSum.get());
  1146. result.setShareParamCode(shareParam.getShareParamCode());
  1147. details.add(result);
  1148. }
  1149. } else {
  1150. result.setShareParamCode(shareParam.getShareParamCode());
  1151. result.setComputeResult(BigDecimal.ZERO);
  1152. result.setComputeSingleResult(BigDecimal.ZERO);
  1153. details.add(result);
  1154. }
  1155. break;
  1156. }
  1157. case NumberConstant.FOUR_S:
  1158. //项目收入
  1159. result.setShareParamCode(shareParam.getShareParamCode());
  1160. result.setComputeResult(patientItem.getAmount());
  1161. if (!patientItem.getNum().equals(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))) {
  1162. result.setComputeSingleResult(patientItem.getAmount().divide(patientItem.getNum(), 4, RoundingMode.HALF_UP));
  1163. } else {
  1164. result.setComputeSingleResult(BigDecimal.ZERO);
  1165. }
  1166. details.add(result);
  1167. break;
  1168. case NumberConstant.FIVE_S:
  1169. result.setShareParamCode(shareParam.getShareParamCode());
  1170. result.setComputeResult(patientItem.getNum());
  1171. details.add(result);
  1172. break;
  1173. }
  1174. }
  1175. return details;
  1176. }
  1177. private List<ComputeStandShareParamDetail> setStandDetails(ComputeStandShareParamDetail costDetail, PatientItemDepartmentGroupVo patientItem, List<ShareParamTypeMap> shareParamType,
  1178. Map<String, Map<String, Item>> itemMap) {
  1179. List<ComputeStandShareParamDetail> details = new ArrayList<>();
  1180. Item item = itemMap.get(patientItem.getExecuteDepartmentCode()).get(patientItem.getItemCode());
  1181. StandItem standItem = item.getStandItem();
  1182. for (ShareParamTypeMap shareParam : shareParamType) {
  1183. ComputeStandShareParamDetail result = BeanUtil.convertObj(costDetail, ComputeStandShareParamDetail.class);
  1184. switch (shareParam.getSourceType()) {
  1185. case NumberConstant.ONE_S: {
  1186. //参与人员、
  1187. if (Objects.nonNull(standItem)) {
  1188. List<StandItemEmpMap> empMaps = standItem.getEmpMaps();
  1189. if (!CollectionUtils.isEmpty(empMaps)) {
  1190. Map<String, List<StandItemEmpMap>> collect = empMaps.stream().collect(Collectors.groupingBy(StandItemEmpMap::getEmpTypeCode));
  1191. String sourceCode = shareParam.getSourceCode();
  1192. if (sourceCode.equals(NumberConstant.ZERO_S)) {
  1193. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1194. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1195. for (StandItemEmpMap empMap : empMaps) {
  1196. BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum());
  1197. sum.updateAndGet(v -> v.add(multiply));
  1198. singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum())));
  1199. }
  1200. result.setComputeResult(sum.get());
  1201. result.setComputeSingleResult(singleSum.get());
  1202. result.setShareParamCode(shareParam.getShareParamCode());
  1203. details.add(result);
  1204. } else if (sourceCode.contains("|")) {
  1205. List<String> split = StrUtil.split(sourceCode, "|");
  1206. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1207. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1208. for (String s : split) {
  1209. List<StandItemEmpMap> itemEmpMaps = collect.get(s);
  1210. if (!CollectionUtils.isEmpty(itemEmpMaps)) {
  1211. for (StandItemEmpMap itemEmpMap : itemEmpMaps) {
  1212. if (Objects.nonNull(itemEmpMap)) {
  1213. BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum());
  1214. sum.updateAndGet(v -> v.add(multiply));
  1215. singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum())));
  1216. } else {
  1217. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1218. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1219. }
  1220. }
  1221. } else {
  1222. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1223. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1224. }
  1225. }
  1226. result.setShareParamCode(shareParam.getShareParamCode());
  1227. result.setComputeResult(sum.get());
  1228. result.setComputeSingleResult(singleSum.get());
  1229. details.add(result);
  1230. } else {
  1231. List<StandItemEmpMap> itemEmpMaps = collect.get(sourceCode);
  1232. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1233. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1234. if (!CollectionUtils.isEmpty(itemEmpMaps)) {
  1235. for (StandItemEmpMap itemEmpMap : itemEmpMaps) {
  1236. if (Objects.nonNull(itemEmpMap)) {
  1237. BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum());
  1238. sum.updateAndGet(v -> v.add(multiply));
  1239. singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum())));
  1240. } else {
  1241. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1242. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1243. }
  1244. }
  1245. } else {
  1246. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1247. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1248. }
  1249. result.setComputeResult(sum.get());
  1250. result.setShareParamCode(shareParam.getShareParamCode());
  1251. result.setComputeSingleResult(singleSum.get());
  1252. details.add(result);
  1253. }
  1254. } else {
  1255. result.setComputeResult(BigDecimal.ZERO);
  1256. result.setComputeSingleResult(BigDecimal.ZERO);
  1257. result.setShareParamCode(shareParam.getShareParamCode());
  1258. details.add(result);
  1259. }
  1260. } else {
  1261. if (result != null) {
  1262. result.setComputeResult(BigDecimal.ZERO);
  1263. }
  1264. result.setComputeSingleResult(BigDecimal.ZERO);
  1265. result.setShareParamCode(shareParam.getShareParamCode());
  1266. details.add(result);
  1267. }
  1268. break;
  1269. }
  1270. case NumberConstant.TWO_S: {
  1271. //使用设备
  1272. if (Objects.nonNull(standItem)) {
  1273. List<StandItemEquipmentMap> equipmentMaps = standItem.getEquipmentMaps();
  1274. if (!CollectionUtils.isEmpty(equipmentMaps)) {
  1275. Map<String, List<StandItemEquipmentMap>> collect = equipmentMaps.stream().collect(Collectors.groupingBy(StandItemEquipmentMap::getEquipmentCode));
  1276. // Map<String, ItemEquipmentMap> map = equipmentMaps.stream().collect(Collectors.toMap(ItemEquipmentMap::getEquipmentCode, empMap -> empMap, (a, b) -> b));
  1277. String sourceCode = shareParam.getSourceCode();
  1278. if (sourceCode.equals(NumberConstant.ZERO_S)) {
  1279. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1280. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1281. for (StandItemEquipmentMap empMap : equipmentMaps) {
  1282. BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum());
  1283. sum.updateAndGet(v -> v.add(multiply));
  1284. singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum())));
  1285. }
  1286. result.setComputeResult(sum.get());
  1287. result.setComputeSingleResult(singleSum.get());
  1288. result.setShareParamCode(shareParam.getShareParamCode());
  1289. details.add(result);
  1290. } else if (sourceCode.contains("|")) {
  1291. List<String> split = StrUtil.split(sourceCode, "|");
  1292. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1293. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1294. for (String s : split) {
  1295. List<StandItemEquipmentMap> itemEquipmentMaps = collect.get(s);
  1296. if (!CollectionUtils.isEmpty(itemEquipmentMaps)) {
  1297. for (StandItemEquipmentMap equipmentMap : itemEquipmentMaps) {
  1298. if (Objects.nonNull(equipmentMap)) {
  1299. BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum());
  1300. sum.updateAndGet(v -> v.add(multiply));
  1301. singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum())));
  1302. } else {
  1303. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1304. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1305. }
  1306. }
  1307. } else {
  1308. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1309. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1310. }
  1311. }
  1312. result.setShareParamCode(shareParam.getShareParamCode());
  1313. result.setComputeResult(sum.get());
  1314. result.setComputeSingleResult(singleSum.get());
  1315. details.add(result);
  1316. } else {
  1317. List<StandItemEquipmentMap> itemEquipmentMaps = collect.get(sourceCode);
  1318. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1319. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1320. for (StandItemEquipmentMap equipmentMap : itemEquipmentMaps) {
  1321. if (Objects.nonNull(equipmentMap)) {
  1322. BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum());
  1323. sum.updateAndGet(v -> v.add(multiply));
  1324. singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum())));
  1325. } else {
  1326. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1327. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1328. }
  1329. }
  1330. result.setComputeResult(sum.get());
  1331. result.setComputeSingleResult(singleSum.get());
  1332. result.setShareParamCode(shareParam.getShareParamCode());
  1333. details.add(result);
  1334. }
  1335. } else {
  1336. result.setComputeResult(BigDecimal.ZERO);
  1337. result.setComputeSingleResult(BigDecimal.ZERO);
  1338. result.setShareParamCode(shareParam.getShareParamCode());
  1339. details.add(result);
  1340. }
  1341. } else {
  1342. result.setComputeResult(BigDecimal.ZERO);
  1343. result.setComputeSingleResult(BigDecimal.ZERO);
  1344. result.setShareParamCode(shareParam.getShareParamCode());
  1345. details.add(result);
  1346. }
  1347. break;
  1348. }
  1349. case NumberConstant.THREE_S: {
  1350. //使用空间
  1351. if (Objects.nonNull(standItem)) {
  1352. List<StandItemSpaceMap> spaceMaps = standItem.getSpaceMaps();
  1353. if (!CollectionUtils.isEmpty(spaceMaps)) {
  1354. // Map<String, ItemSpaceMap> map = spaceMaps.stream().collect(Collectors.toMap(ItemSpaceMap::getSpaceCode, f -> f, (a, b) -> b));
  1355. Map<String, List<StandItemSpaceMap>> collect = spaceMaps.stream().collect(Collectors.groupingBy(StandItemSpaceMap::getSpaceCode));
  1356. String sourceCode = shareParam.getSourceCode();
  1357. if (sourceCode.equals(NumberConstant.ZERO_S)) {
  1358. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1359. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1360. for (StandItemSpaceMap empMap : spaceMaps) {
  1361. BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum());
  1362. sum.updateAndGet(v -> v.add(multiply));
  1363. singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum())));
  1364. }
  1365. result.setComputeResult(sum.get());
  1366. result.setComputeSingleResult(singleSum.get());
  1367. result.setShareParamCode(shareParam.getShareParamCode());
  1368. details.add(result);
  1369. } else if (sourceCode.contains("|")) {
  1370. List<String> split = StrUtil.split(sourceCode, "|");
  1371. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1372. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1373. for (String s : split) {
  1374. List<StandItemSpaceMap> itemSpaceMaps = collect.get(s);
  1375. if (!CollectionUtils.isEmpty(itemSpaceMaps)) {
  1376. for (StandItemSpaceMap spaceMap : itemSpaceMaps) {
  1377. if (Objects.nonNull(spaceMap)) {
  1378. BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum());
  1379. sum.updateAndGet(v -> v.add(multiply));
  1380. singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum())));
  1381. } else {
  1382. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1383. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1384. }
  1385. }
  1386. } else {
  1387. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1388. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1389. }
  1390. }
  1391. result.setShareParamCode(shareParam.getShareParamCode());
  1392. result.setComputeResult(sum.get());
  1393. result.setComputeSingleResult(singleSum.get());
  1394. details.add(result);
  1395. } else {
  1396. List<StandItemSpaceMap> itemSpaceMaps = collect.get(sourceCode);
  1397. AtomicReference<BigDecimal> sum = new AtomicReference<>(new BigDecimal("0.0000"));
  1398. AtomicReference<BigDecimal> singleSum = new AtomicReference<>(new BigDecimal("0.0000"));
  1399. if (!CollectionUtils.isEmpty(itemSpaceMaps)) {
  1400. for (StandItemSpaceMap spaceMap : itemSpaceMaps) {
  1401. if (Objects.nonNull(spaceMap)) {
  1402. BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum());
  1403. sum.updateAndGet(v -> v.add(multiply));
  1404. singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum())));
  1405. } else {
  1406. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1407. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1408. }
  1409. }
  1410. } else {
  1411. sum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1412. singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO));
  1413. }
  1414. result.setComputeResult(sum.get());
  1415. result.setComputeSingleResult(singleSum.get());
  1416. result.setShareParamCode(shareParam.getShareParamCode());
  1417. details.add(result);
  1418. }
  1419. } else {
  1420. result.setShareParamCode(shareParam.getShareParamCode());
  1421. result.setComputeResult(BigDecimal.ZERO);
  1422. result.setComputeSingleResult(BigDecimal.ZERO);
  1423. details.add(result);
  1424. }
  1425. } else {
  1426. result.setShareParamCode(shareParam.getShareParamCode());
  1427. result.setComputeResult(BigDecimal.ZERO);
  1428. result.setComputeSingleResult(BigDecimal.ZERO);
  1429. details.add(result);
  1430. }
  1431. break;
  1432. }
  1433. case NumberConstant.FOUR_S:
  1434. //项目收入
  1435. result.setShareParamCode(shareParam.getShareParamCode());
  1436. result.setComputeResult(patientItem.getAmount());
  1437. if (!patientItem.getNum().equals(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))) {
  1438. result.setComputeSingleResult(patientItem.getAmount().divide(patientItem.getNum(), 4, RoundingMode.HALF_UP));
  1439. } else {
  1440. result.setComputeSingleResult(BigDecimal.ZERO);
  1441. }
  1442. details.add(result);
  1443. break;
  1444. case NumberConstant.FIVE_S:
  1445. result.setShareParamCode(shareParam.getShareParamCode());
  1446. result.setComputeResult(patientItem.getNum());
  1447. details.add(result);
  1448. break;
  1449. }
  1450. }
  1451. return details;
  1452. }
  1453. private Map<String, Map<String, Item>> getItemMap() {
  1454. List<Item> list = itemRepository.getList();
  1455. if (CollectionUtils.isEmpty(list)) {
  1456. throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止");
  1457. }
  1458. List<ItemEmpMap> list1 = itemEmpMapRepository.getList();
  1459. //医疗服务项目字典人员对照
  1460. Map<String, Map<String, List<ItemEmpMap>>> empMapGroup = new HashMap<>();
  1461. if (!CollectionUtils.isEmpty(list1)) {
  1462. Map<String, List<ItemEmpMap>> collect = list1.stream().collect(Collectors.groupingBy(ItemEmpMap::getDepartmentCode));
  1463. collect.forEach((k, v) -> {
  1464. Map<String, List<ItemEmpMap>> collect1 = v.stream().collect(Collectors.groupingBy(ItemEmpMap::getItemCode));
  1465. empMapGroup.put(k, collect1);
  1466. });
  1467. // empMapGroup = list1.stream().collect(Collectors.groupingBy(ItemEmpMap::getItemCode));
  1468. }
  1469. List<ItemEquipmentMap> list2 = itemEquipmentMapRepository.getList();
  1470. //医疗服务项目字典设备对照
  1471. // Map<String, List<ItemEquipmentMap>> equipmentGroup = new HashMap<>();
  1472. Map<String, Map<String, List<ItemEquipmentMap>>> equipmentGroup = new HashMap<>();
  1473. if (!CollectionUtils.isEmpty(list2)) {
  1474. Map<String, List<ItemEquipmentMap>> collect = list2.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getDepartmentCode));
  1475. collect.forEach((k, v) -> {
  1476. Map<String, List<ItemEquipmentMap>> collect1 = v.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getItemCode));
  1477. equipmentGroup.put(k, collect1);
  1478. });
  1479. // equipmentGroup = list2.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getItemCode));
  1480. }
  1481. List<ItemSpaceMap> list3 = itemSpaceMapRepository.getList();
  1482. //医疗服务项目字典设备对照
  1483. // Map<String, List<ItemSpaceMap>> spaceGroup = new HashMap<>();
  1484. Map<String, Map<String, List<ItemSpaceMap>>> spaceGroup = new HashMap<>();
  1485. if (!CollectionUtils.isEmpty(list3)) {
  1486. Map<String, List<ItemSpaceMap>> collect = list3.stream().collect(Collectors.groupingBy(ItemSpaceMap::getDepartmentCode));
  1487. collect.forEach((k, v) -> {
  1488. Map<String, List<ItemSpaceMap>> collect1 = v.stream().collect(Collectors.groupingBy(ItemSpaceMap::getItemCode));
  1489. spaceGroup.put(k, collect1);
  1490. });
  1491. // spaceGroup = list3.stream().collect(Collectors.groupingBy(ItemSpaceMap::getItemCode));
  1492. }
  1493. Map<String, Map<String, Item>> map = new HashMap<>();
  1494. Map<String, List<Item>> collect = list.stream().collect(Collectors.groupingBy(Item::getDepartmentCode));
  1495. collect.forEach((k, v) -> {
  1496. Map<String, List<ItemEmpMap>> empMap = empMapGroup.get(k);
  1497. Map<String, List<ItemEquipmentMap>> equipmentMap = equipmentGroup.get(k);
  1498. Map<String, List<ItemSpaceMap>> spaceMap = spaceGroup.get(k);
  1499. Map<String, Item> itemCodeMap = new HashMap<>();
  1500. for (Item item : v) {
  1501. if (!CollectionUtils.isEmpty(empMap)) {
  1502. item.setEmpMaps(empMap.get(item.getCode()));
  1503. }
  1504. if (!CollectionUtils.isEmpty(equipmentMap)) {
  1505. item.setEquipmentMaps(equipmentMap.get(item.getCode()));
  1506. }
  1507. if (!CollectionUtils.isEmpty(spaceMap)) {
  1508. item.setSpaceMaps(spaceMap.get(item.getCode()));
  1509. }
  1510. itemCodeMap.put(item.getCode(), item);
  1511. }
  1512. map.put(k, itemCodeMap);
  1513. });
  1514. return map;
  1515. }
  1516. private List<VisitNoResponsibilityMap> getPatientResponsibility(SessionUserVO currentUser) {
  1517. return getVisitNoResponsibilityMaps(currentUser, responsibilityDepartmentRepository, centerService, log);
  1518. }
  1519. private @NotNull Map<String, Map<String, PatientItemDepartmentGroupVo>> getPatientItemGroup(String computeDate, SessionUserVO currentUser, Map<String, String> responsibilityCodeMap) {
  1520. List<PatientItemDepartmentGroupVo> items = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser);
  1521. //移除执行科室为空的
  1522. List<PatientItemDepartmentGroupVo> removeDepartmentList = new ArrayList<>();
  1523. for (PatientItemDepartmentGroupVo item : items) {
  1524. if(StringUtils.isEmpty(item.getExecuteDepartmentCode())){
  1525. removeDepartmentList.add(item);
  1526. }
  1527. }
  1528. if(!CollectionUtils.isEmpty(removeDepartmentList)){
  1529. List<String> logs = new ArrayList<>();
  1530. for (PatientItemDepartmentGroupVo patientItemDepartmentGroupVo : removeDepartmentList) {
  1531. logs.add(patientItemDepartmentGroupVo.getItemCode());
  1532. }
  1533. List<String> collect2 = logs.stream().distinct().collect(Collectors.toList());
  1534. log.info("以下项目数据【{}】执行科室为空", collect2);
  1535. items.removeAll(removeDepartmentList);
  1536. }
  1537. items.forEach(item -> item.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode())));
  1538. //移除责任中心为空的
  1539. List<PatientItemDepartmentGroupVo> removeList = new ArrayList<>();
  1540. for (PatientItemDepartmentGroupVo item : items) {
  1541. if(StringUtils.isEmpty(item.getResponsibilityCode())){
  1542. removeList.add(item);
  1543. }
  1544. }
  1545. if(!CollectionUtils.isEmpty(removeList)){
  1546. List<String> logs = new ArrayList<>();
  1547. for (PatientItemDepartmentGroupVo patientItemDepartmentGroupVo : removeList) {
  1548. logs.add(patientItemDepartmentGroupVo.getExecuteDepartmentCode());
  1549. }
  1550. List<String> collect2 = logs.stream().distinct().collect(Collectors.toList());
  1551. log.info("以下执行科室【{}】科室代码未对照责任中心", collect2);
  1552. items.removeAll(removeList);
  1553. }
  1554. Map<String, List<PatientItemDepartmentGroupVo>> collect2 = items.stream().collect(Collectors.groupingBy(PatientItemDepartmentGroupVo::getResponsibilityCode));
  1555. Map<String,Map<String,PatientItemDepartmentGroupVo>> responsibilityItemGroupMap = new HashMap<>();
  1556. collect2.forEach((k,v)->{
  1557. Map<String, List<PatientItemDepartmentGroupVo>> collect3 = v.stream().collect(Collectors.groupingBy(PatientItemDepartmentGroupVo::getItemCode));
  1558. if(!CollectionUtils.isEmpty(collect3)){
  1559. Map<String,PatientItemDepartmentGroupVo> itemGroupMap = new HashMap<>();
  1560. collect3.forEach((itemCode,itemList)->{
  1561. PatientItemDepartmentGroupVo vo = new PatientItemDepartmentGroupVo();
  1562. vo.setItemCode(itemCode);
  1563. vo.setItemName(itemList.get(0).getItemName());
  1564. vo.setResponsibilityCode(k);
  1565. AtomicReference<BigDecimal> sumNum = new AtomicReference<>(new BigDecimal("0.00"));
  1566. AtomicReference<BigDecimal> sumAmount = new AtomicReference<>(new BigDecimal("0.0000"));
  1567. for (PatientItemDepartmentGroupVo vo1 : itemList) {
  1568. sumNum.updateAndGet(s -> s.add(vo1.getNum()));
  1569. sumAmount.updateAndGet(s -> s.add(vo1.getAmount()));
  1570. }
  1571. vo.setNum(sumNum.get());
  1572. vo.setAmount(sumAmount.get());
  1573. vo.setExecuteDepartmentCode(itemList.get(0).getExecuteDepartmentCode());
  1574. itemGroupMap.put(itemCode,vo);
  1575. });
  1576. responsibilityItemGroupMap.put(k,itemGroupMap);
  1577. }
  1578. });
  1579. return responsibilityItemGroupMap;
  1580. }
  1581. }