ShareParamServiceImpl.java 87 KB

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