ComputeGroupCostServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package com.kcim.service.impl;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.kcim.common.constants.NumberConstant;
  4. import com.kcim.common.enums.ReportItemTypeEnum;
  5. import com.kcim.common.exception.CostException;
  6. import com.kcim.common.util.BeanUtil;
  7. import com.kcim.common.util.PageUtils;
  8. import com.kcim.common.util.UserContext;
  9. import com.kcim.dao.model.*;
  10. import com.kcim.dao.model.dto.ComputeGroupCostPageDto;
  11. import com.kcim.dao.model.dto.ComputeItemGroupByVisitNoDto;
  12. import com.kcim.dao.model.dto.ComputePatientCostGroupByDepartmentDto;
  13. import com.kcim.dao.repository.*;
  14. import com.kcim.service.ComputeGroupCostService;
  15. import com.kcim.service.ComputeItemCostService;
  16. import lombok.AllArgsConstructor;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Propagation;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import org.springframework.util.CollectionUtils;
  22. import org.springframework.util.StringUtils;
  23. import java.math.BigDecimal;
  24. import java.util.ArrayList;
  25. import java.util.Date;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.stream.Collectors;
  29. /**
  30. * @program: CostAccount
  31. * @description: DRG/DIP分组成本计算接口实现类
  32. * @author: Wang.YS
  33. * @create: 2023-10-31 16:15
  34. **/
  35. @Service("ComputeGroupCostService")
  36. @Slf4j
  37. @AllArgsConstructor
  38. public class ComputeGroupCostServiceImpl implements ComputeGroupCostService {
  39. /**
  40. * DRG/DIP分组成本主表
  41. */
  42. ComputeGroupCostRepository repository;
  43. /**
  44. * DRG/DIP分组成本明细表
  45. */
  46. ComputeGroupCostDetailRepository detailRepository;
  47. /**
  48. * 患者信息导入
  49. */
  50. ImportPatientInfoRepository importPatientInfoRepository;
  51. /**
  52. * 病人成本计算
  53. */
  54. ComputePatientCostRepository computePatientCostRepository;
  55. ComputeItemCostRepository computeItemCostRepository;
  56. ComputeItemCostService computeItemCostService;
  57. /**
  58. * DRG/DIP分组成本分页查询
  59. *
  60. * @param current 当前页
  61. * @param pageSize 页容量
  62. * @param computeDate 核算年月
  63. * @param departmentName 科室名称
  64. * @param groupName 分组名称
  65. * @return 分页列表
  66. */
  67. @Override
  68. public Object groupCostCalculateList(Integer current, Integer pageSize, String computeDate, String departmentName, String groupName) {
  69. Page<ComputeGroupCostPageDto> page = repository.getByPage(current, pageSize, computeDate, departmentName, groupName);
  70. if(CollectionUtils.isEmpty(page.getRecords())){
  71. return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
  72. }
  73. return new PageUtils(page.getRecords(), Math.toIntExact(page.getTotal()),pageSize,current);
  74. }
  75. /**
  76. * DRG/DIP分组成本计算
  77. *
  78. * @param computeDate 核算年月
  79. */
  80. @Override
  81. @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
  82. public void groupCostCalculate(String computeDate) {
  83. List<ImportPatientInfo> patientInfos = importPatientInfoRepository.getByComputeDate(computeDate);
  84. if(CollectionUtils.isEmpty(patientInfos)){
  85. log.error("未导入当前核算年月【"+computeDate+"】患者信息,计算中止");
  86. throw new CostException("未导入当前核算年月【"+computeDate+"】患者信息,当前计算中止");
  87. }
  88. //获取计算过的项目信息
  89. // List<ComputePatientCostGroupByDepartmentDto> patientCostDepartmentGroup = computePatientCostRepository.getPatientCostDepartmentGroup(computeDate);
  90. // if(CollectionUtils.isEmpty(patientCostDepartmentGroup)){
  91. // throw new CostException("当前核算年月【"+computeDate+"】未计算病人成本信息,请先计算病人成本信息,当前计算中止");
  92. // }
  93. List<ComputeItemGroupByVisitNoDto> byComputeDateGroupByVisitNo = computeItemCostRepository.getByComputeDateGroupByVisitNo(computeDate);
  94. if(CollectionUtils.isEmpty(byComputeDateGroupByVisitNo)){
  95. throw new CostException("当前核算年月【"+computeDate+"】未计算收费项目成本计算,请先计算收费项目成本,当前计算中止");
  96. }
  97. Map<String, ComputeItemGroupByVisitNoDto> computeItemGroup = byComputeDateGroupByVisitNo.stream().collect(Collectors.toMap(ComputeItemGroupByVisitNoDto::getVisitNo, dto -> dto, (a, b) -> b));
  98. // Map<String, ComputePatientCostGroupByDepartmentDto> computeItemGroup = patientCostDepartmentGroup.stream().collect(Collectors.toMap(ComputePatientCostGroupByDepartmentDto::getDepartmentCode, dto -> dto, (a, b) -> b));
  99. //过滤掉分组为空的数据
  100. List<ImportPatientInfo> patientInfoList = patientInfos.stream().filter(patientInfo -> !StringUtils.isEmpty(patientInfo.getGroupCode())).collect(Collectors.toList());
  101. //按分组和科室进行分组
  102. Map<String, List<ImportPatientInfo>> group = patientInfoList.stream().collect(Collectors.groupingBy(ImportPatientInfo::getGroupCode));
  103. ComputeGroupCost computeGroupCost = new ComputeGroupCost();
  104. computeGroupCost.setComputeDate(computeDate);
  105. computeGroupCost.setHospId(UserContext.getHospId());
  106. computeGroupCost.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  107. computeGroupCost.setCreateTime(new Date());
  108. ComputeGroupCostDetail groupCostDetail = new ComputeGroupCostDetail();
  109. groupCostDetail.setHospId(UserContext.getHospId());
  110. groupCostDetail.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  111. groupCostDetail.setCreateTime(new Date());
  112. int index = 0;
  113. List<ComputeGroupCost> saveGroupCost = new ArrayList<>();
  114. List<ComputeGroupCostDetail> details = new ArrayList<>();
  115. for (String groupCode : group.keySet()) {
  116. List<ImportPatientInfo> groups = group.get(groupCode);
  117. String groupMame = groups.get(0).getGroupName();
  118. Map<String, List<ImportPatientInfo>> departmentGroup = groups.stream().collect(Collectors.groupingBy(ImportPatientInfo::getDepartmentCode));
  119. for (String departmentCode : departmentGroup.keySet()) {
  120. ComputeGroupCost groupCost = BeanUtil.convertObj(computeGroupCost, ComputeGroupCost.class);
  121. groupCost.setCode(groupCode);
  122. groupCost.setName(groupMame);
  123. groupCost.setDepartmentCode(departmentCode);
  124. List<ImportPatientInfo> infos = departmentGroup.get(departmentCode);
  125. groupCost.setDepartmentName(infos.get(0).getDepartmentName());
  126. groupCost.setPatientNum(infos.size());
  127. groupCost.setIndex(index);
  128. List<ComputeItemGroupByVisitNoDto> dtoList = infos.stream().map(info -> computeItemGroup.get(info.getVisitNo())).collect(Collectors.toList());
  129. // ComputePatientCostGroupByDepartmentDto patientCost = computeItemGroup.get(departmentCode);
  130. // List<ComputeDiseaseCostDetail> detail = getDetail(index, diseaseCostDetail, dtoList);
  131. // ComputePatientCostGroupByDepartmentDto patientCost = computeItemGroup.get(departmentCode);
  132. List<ComputeGroupCostDetail> detail = getDetail(index, groupCostDetail, dtoList);
  133. saveGroupCost.add(groupCost);
  134. details.addAll(detail);
  135. index++;
  136. }
  137. }
  138. if(!CollectionUtils.isEmpty(saveGroupCost)){
  139. //作废当前核算年月已有数据
  140. List<Integer> integers = repository.removeByComputeDate(computeDate);
  141. if(!CollectionUtils.isEmpty(integers)){
  142. detailRepository.removeByDiseaseCostId(integers);
  143. }
  144. repository.saveBatch(saveGroupCost,100);
  145. if(!CollectionUtils.isEmpty(saveGroupCost)){
  146. Map<Integer,Integer> indexId = saveGroupCost.stream().collect(Collectors.toMap(ComputeGroupCost::getIndex, ComputeGroupCost::getId, (a, b) -> b));
  147. Map<Integer, List<ComputeGroupCostDetail>> collect = details.stream().collect(Collectors.groupingBy(ComputeGroupCostDetail::getIndex));
  148. List<ComputeGroupCostDetail> saveCostDetails = new ArrayList<>();
  149. collect.keySet().forEach(integer -> {
  150. Integer costId = indexId.get(integer);
  151. List<ComputeGroupCostDetail> detailList = collect.get(integer);
  152. detailList.forEach(detail -> detail.setGroupCostId(costId));
  153. saveCostDetails.addAll(detailList);
  154. });
  155. detailRepository.saveBatch(saveCostDetails,500);
  156. }
  157. }
  158. }
  159. private List<ComputeGroupCostDetail> getDetail(int i, ComputeGroupCostDetail costDetail, List<ComputeItemGroupByVisitNoDto> dtoList) {
  160. List<String> itemTypeList = computeItemCostService.getItemTypeList();
  161. List<ComputeGroupCostDetail> details = new ArrayList<>();
  162. for (String s : itemTypeList) {
  163. ComputeGroupCostDetail detail = BeanUtil.convertObj(costDetail, ComputeGroupCostDetail.class);
  164. detail.setType(s);
  165. detail.setIndex(i);
  166. if(s.equals(ReportItemTypeEnum.DRUG_INCOME.getCode())){
  167. BigDecimal bigDecimal = new BigDecimal("0.0000");
  168. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  169. bigDecimal = bigDecimal.add(dto.getDrugIncome());
  170. }
  171. detail.setComputeResult(bigDecimal);
  172. }else if (s.equals(ReportItemTypeEnum.MATERIAL_INCOME.getCode())) {
  173. BigDecimal bigDecimal = new BigDecimal("0.0000");
  174. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  175. bigDecimal = bigDecimal.add(dto.getMaterialIncome());
  176. }
  177. detail.setComputeResult(bigDecimal);
  178. }else if (s.equals(ReportItemTypeEnum.ITEM_INCOME.getCode())) {
  179. BigDecimal bigDecimal = new BigDecimal("0.0000");
  180. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  181. bigDecimal = bigDecimal.add(dto.getItemIncome());
  182. }
  183. detail.setComputeResult(bigDecimal);
  184. }else if (s.equals(ReportItemTypeEnum.DRUG_COST.getCode())) {
  185. BigDecimal bigDecimal = new BigDecimal("0.0000");
  186. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  187. bigDecimal = bigDecimal.add(dto.getDrugCost());
  188. }
  189. detail.setComputeResult(bigDecimal);
  190. }else if (s.equals(ReportItemTypeEnum.MATERIAL_COST.getCode())) {
  191. BigDecimal bigDecimal = new BigDecimal("0.0000");
  192. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  193. bigDecimal = bigDecimal.add(dto.getMaterialCost());
  194. }
  195. detail.setComputeResult(bigDecimal);
  196. }else if (s.equals(ReportItemTypeEnum.ITEM_COST.getCode())) {
  197. BigDecimal bigDecimal = new BigDecimal("0.0000");
  198. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  199. bigDecimal = bigDecimal.add(dto.getItemCost());
  200. }
  201. detail.setComputeResult(bigDecimal);
  202. }else if (s.equals(ReportItemTypeEnum.EMP_COST.getCode())) {
  203. BigDecimal bigDecimal = new BigDecimal("0.0000");
  204. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  205. bigDecimal = bigDecimal.add(dto.getEmpCost());
  206. }
  207. detail.setComputeResult(bigDecimal);
  208. }else if (s.equals(ReportItemTypeEnum.EQUIPMENT_COST.getCode())) {
  209. BigDecimal bigDecimal = new BigDecimal("0.0000");
  210. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  211. bigDecimal = bigDecimal.add(dto.getEquipmentCost());
  212. }
  213. detail.setComputeResult(bigDecimal);
  214. }else if (s.equals(ReportItemTypeEnum.SPACE_COST.getCode())) {
  215. BigDecimal bigDecimal = new BigDecimal("0.0000");
  216. for (ComputeItemGroupByVisitNoDto dto : dtoList) {
  217. bigDecimal = bigDecimal.add(dto.getSpaceCost());
  218. }
  219. detail.setComputeResult(bigDecimal);
  220. } else {
  221. detail.setComputeResult(BigDecimal.ZERO);
  222. }
  223. details.add(detail);
  224. }
  225. return details;
  226. }
  227. }