package com.kcim.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kcim.common.constants.Constant; import com.kcim.common.constants.NumberConstant; import com.kcim.common.constants.SQLParameter; import com.kcim.common.enums.CustomSqlTypeEnum; import com.kcim.common.exception.CostException; import com.kcim.common.util.BeanUtil; import com.kcim.common.util.PageUtils; import com.kcim.common.util.UserContext; import com.kcim.dao.model.*; import com.kcim.dao.model.dto.PatientItemDepartmentGroupVo; import com.kcim.dao.repository.*; import com.kcim.service.*; import com.kcim.vo.*; import com.kcim.web.reponse.ShareParamCostResponse; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import static com.kcim.common.enums.DefaultComputeColumnEnum.*; import static com.kcim.service.impl.DrugMaterialCalculateServiceImpl.getVisitNoResponsibilityMaps; /** * @program: CostAccount * @description: * @author: Wang.YS * @create: 2024-01-15 20:40 **/ @Service("ShareParamService") @Slf4j public class ShareParamServiceImpl implements ShareParamService { /** * 项目分摊参数主表 */ 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; 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) { this.repository = repository; this.detailRepository = detailRepository; this.importPatientItemRepository = importPatientItemRepository; this.itemRepository = itemRepository; this.itemEmpMapRepository = itemEmpMapRepository; this.itemEquipmentMapRepository = itemEquipmentMapRepository; this.itemSpaceMapRepository = itemSpaceMapRepository; this.shareParamTypeMapRepository = shareParamTypeMapRepository; this.responsibilityDepartmentRepository = responsibilityDepartmentRepository; this.centerService = centerService; this.computeStandShareParamRepository = computeStandShareParamRepository; this.computeStandShareParamDetailRepository = computeStandShareParamDetailRepository; this.standItemService = standItemService; this.sqlService=sqlService; this.responsibilityDepartmentService=responsibilityDepartmentService; } /** * 获取项目分摊参数 * * @param current 当前页 * @param pageSize 页容量 * @param computeDate 核算年月 * @param itemType 项目类型 * @param responsibility 责任中心 * @param itemFilter 项目过滤条件 * @return 分页数据 */ @Override public Object getShareParamCostList(Integer current, Integer pageSize, String computeDate, String itemType, String responsibility, String itemFilter) { Page page = repository.getPage(current, pageSize, computeDate, itemType, responsibility, itemFilter); List records = page.getRecords(); ShareParamCostResponse response = new ShareParamCostResponse(); List titleVos = getCommonTitleVos(); response.setTitle(titleVos); if (CollectionUtils.isEmpty(records)) { response.setPageData(new PageUtils(new ArrayList<>(), NumberConstant.ZERO, pageSize, current)); return response; } List collect1 = records.stream().map(ComputeShareParam::getId).collect(Collectors.toList()); List shareParamDetails = detailRepository.getByShareParamId(computeDate, collect1); Map typeNameMap = getTypeNameDict(); shareParamDetails.forEach(record -> record.setItemTypeName(typeNameMap.get(record.getItemType()))); Map> collect = shareParamDetails.stream().collect(Collectors.groupingBy(ComputeDateShareParamVo::getCode)); List> returnList = new ArrayList<>(); //按报表头组装值 for (ComputeShareParam itemCode : records) { setResultData(titleVos, collect, returnList, itemCode.getCode()); } PageUtils pageUtils = new PageUtils(returnList, Math.toIntExact(page.getTotal()), pageSize, current); response.setPageData(pageUtils); return response; } /** * 完全法项目分摊参数计算 * @param computeDate */ @Override public void computeShareParamCost(String computeDate){ //完全法项目分摊参数计算 calcShareParamCost(computeDate); //执行完全法项目分摊参数计算后续处理脚本 execShareParamCostSQL(computeDate); } /** * 项目分摊参数计算 * * @param computeDate 核算年月 */ public void computeShareParamCostAction(String computeDate) { SessionUserVO currentUser = UserContext.getCurrentUser(); //获取收费项目数据(项目) checkItemCount(computeDate, currentUser); //作废上次计算记录 repository.removeByComputeDate(computeDate, currentUser); detailRepository.removeByComputeDate(computeDate, currentUser); //获到科室与责任中心对照 List patientResponsibility = getPatientResponsibility(currentUser); Map responsibilityCodeMap = new HashMap<>(); Map responsibilityNameMap = new HashMap<>(); patientResponsibility.forEach(visitNoResponsibilityMap -> { responsibilityCodeMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityCode()); responsibilityNameMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityName()); }); //医疗服务项目字典 Map> itemMap = getItemMap(); //获取计算列 List shareParamType = shareParamTypeMapRepository.getList(); //主表公共对象 ComputeShareParam computeShareCost = new ComputeShareParam(); computeShareCost.setComputeDate(computeDate); computeShareCost.setHospId(currentUser.getHospId()); computeShareCost.setCreateUser(String.valueOf(currentUser.getId())); computeShareCost.setCreateTime(new Date()); //明细表公共对象 ComputeShareParamDetail costDetail = new ComputeShareParamDetail(); costDetail.setComputeDate(computeDate); costDetail.setHospId(currentUser.getHospId()); costDetail.setCreateUser(String.valueOf(currentUser.getId())); costDetail.setCreateTime(new Date()); // long count = (itemSize + LIMIT - 1) / LIMIT; // for (int j = 0; j < count; j++) { List items = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser); List saveDetails = new ArrayList<>(); List saveCost = new ArrayList<>(); if (!CollectionUtils.isEmpty(items)) { for (int i = 0; i < items.size(); i++) { PatientItemDepartmentGroupVo item = items.get(i); ComputeShareParam itemCost = BeanUtil.convertObj(computeShareCost, ComputeShareParam.class); itemCost.setCode(item.getItemCode()); itemCost.setName(item.getItemName()); itemCost.setNum(item.getNum()); Map departmentItem = itemMap.get(item.getExecuteDepartmentCode()); if (CollectionUtils.isEmpty(departmentItem)) { continue; } Item itemData = departmentItem.get(item.getItemCode()); if (Objects.isNull(itemData)) { continue; } itemCost.setItemType(itemData.getItemType()); itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode())); itemCost.setResponsibilityName(responsibilityNameMap.get(item.getExecuteDepartmentCode())); itemCost.setIndex(i); saveCost.add(itemCost); costDetail.setIndex(i); saveDetails.addAll(setDetails(costDetail, item, shareParamType, itemMap)); } if (!CollectionUtils.isEmpty(saveCost)) { //作废当前核算年月已有数据 repository.saveBatch(saveCost, 500); if (!CollectionUtils.isEmpty(saveDetails)) { Map indexId = saveCost.stream().collect(Collectors.toMap(ComputeShareParam::getIndex, ComputeShareParam::getId, (a, b) -> b)); Map> collect = saveDetails.stream().collect(Collectors.groupingBy(ComputeShareParamDetail::getIndex)); List saveCostDetails = new ArrayList<>(); collect.forEach((k, v) -> { v.forEach(detail -> detail.setShareParamId(indexId.get(k))); saveCostDetails.addAll(v); }); detailRepository.saveBatch(saveCostDetails, 500); } } } } /** * 项目分摊参数计算 * @param computeDate */ public void calcShareParamCost(String computeDate){ SessionUserVO currentUser = UserContext.getCurrentUser(); //获取收费项目数据(项目) checkItemCount(computeDate, currentUser); //作废上次计算记录 repository.removeByComputeDate(computeDate, currentUser); detailRepository.removeByComputeDate(computeDate, currentUser); //医疗服务项目字典 List itemList = itemRepository.getList(); if (CollectionUtils.isEmpty(itemList)) { throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止"); } //医疗服务项目的参与人员信息 List itemEmpMaps = itemEmpMapRepository.getList(); //医疗服务项目的使用设备信息 List itemEquipmentMaps = itemEquipmentMapRepository.getList(); //医疗服务项目的使用空间信息 List itemSpaceMaps = itemSpaceMapRepository.getList(); //科室责任中心对照信息 List responsibilityDeptMaps = responsibilityDepartmentService.getResponsibilityDepart(); //分摊参数设置信息 List shareParamTypeMaps = shareParamTypeMapRepository.getList(); //医疗服务项目分类字典 DictDataVo itemTypeDict = centerService.getDict(Constant.MED_SERVICE_ITEM_TYPE); //月度患者收费项目信息(按执行科室+收费项目代码汇总过) List ptChargeItems = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser); if (CollectionUtils.isEmpty(ptChargeItems)){ throw new CostException("没有可计算的收费项目"); } // //筛选出字典维护了的项目 // List activePtChargeItems = ptChargeItems.stream().filter(ptItem -> { // //科室项目字典维护了的数据 // if (itemList.stream().anyMatch(item -> item.getCode().equals(ptItem.getItemCode()) && item.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode()))) { // return true; // } // //全院项目字典维护了的数据 // if (itemList.stream().anyMatch(item -> item.getCode().equals(ptItem.getItemCode()) && item.getDepartmentCode().equals(NumberConstant.ZERO))) { // return true; // } // return false; // }).collect(Collectors.toList()); // if (CollectionUtils.isEmpty(activePtChargeItems)){ // throw new CostException("所有收费项目都没有对应的字典数据,请联系管理员"); // } //绑定收费项目对应的医疗服务型项目字典对象 ptChargeItems.stream().forEach(ptItem->{ Item item = getDicItem(ptItem,itemList); ptItem.setDicItem(item); }); List computeShareParamList = new ArrayList(); List ComputeShareParamDetailList = new ArrayList(); ptChargeItems.stream().forEach(ptItem->{ //只处理字典有项目 if(!Objects.isNull(ptItem.getDicItem())) { //根据收费项目创建分摊参数主表对象 ComputeShareParam computeShareCost = creatComputeShareParam(currentUser, computeDate, ptItem, itemTypeDict, responsibilityDeptMaps); computeShareParamList.add(computeShareCost); //创建分摊参数主表对象对应的明细对象 shareParamTypeMaps.stream().forEach(shareParamType -> { ComputeShareParamDetail computeShareParamDetail = createComputeShareParamDetail(currentUser, computeDate, ptItem, computeShareCost, shareParamType, itemEmpMaps, itemEquipmentMaps, itemSpaceMaps); ComputeShareParamDetailList.add(computeShareParamDetail); }); } }); //没有任何可保存的数据 if (CollectionUtils.isEmpty(computeShareParamList)) { throw new CostException("没有任何可保存的数据"); } //保存分摊参数主表对象数据 repository.saveBatch(computeShareParamList, 500); if (CollectionUtils.isEmpty(ComputeShareParamDetailList)) { return; } //保存分摊参数明细表对象数据 ComputeShareParamDetailList.stream().forEach(shareParamDetailL->shareParamDetailL.setShareParamId(shareParamDetailL.getComputeShareCost().getId())); detailRepository.saveBatch(ComputeShareParamDetailList, 500); } /** * 获取收费项目对应的医疗服务项目字典对象 * @param ptItem * @param itemList * @return */ public Item getDicItem(PatientItemDepartmentGroupVo ptItem,List itemList){ //优先取科室项目字典的记录 Optional first = itemList.stream().filter(dicItem -> dicItem.getCode().equals(ptItem.getItemCode()) && dicItem.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode())).findFirst(); if(first.isPresent()) { return first.get(); } //取全院通用的字典记录 first = itemList.stream().filter(dicItem -> dicItem.getCode().equals(ptItem.getItemCode()) && dicItem.getDepartmentCode().equals(NumberConstant.ZERO)).findFirst(); if(first.isPresent()) { return first.get(); } return null; } /** * 根据收费项目创建分摊参数主表对象 * @param currentUser * @param computeDate * @param itemTypeDict * @param ptItem * @param responsibilityDeptMaps * @return */ public ComputeShareParam creatComputeShareParam(SessionUserVO currentUser,String computeDate,PatientItemDepartmentGroupVo ptItem,DictDataVo itemTypeDict, List responsibilityDeptMaps){ ComputeShareParam computeShareCost = new ComputeShareParam(); computeShareCost.setComputeDate(computeDate); computeShareCost.setHospId(currentUser.getHospId()); computeShareCost.setCreateUser(String.valueOf(currentUser.getId())); computeShareCost.setCreateTime(new Date()); computeShareCost.setCode(ptItem.getItemCode()); computeShareCost.setName(ptItem.getItemName()); computeShareCost.setNum(ptItem.getNum()); //获取执行科室对应的责任中心 Optional firstResponsibilityDepartIdVO = responsibilityDeptMaps.stream().filter(respDeptmap -> !Objects.isNull(respDeptmap.getDepartmentCode())&& respDeptmap.getDepartmentCode().equals(ptItem.getExecuteDepartmentCode())).findFirst(); if(!firstResponsibilityDepartIdVO.isPresent()){ String errMsg = String.format("【%s(%s)】没有对应的责任中心,计算中止", ptItem.getExecuteDepartmentName(), ptItem.getExecuteDepartmentCode()); throw new CostException(errMsg); } ResponsibilityDepartIdVO responsibilityDepartIdVO=firstResponsibilityDepartIdVO.get(); computeShareCost.setResponsibilityCode(responsibilityDepartIdVO.getResponsibilityCode()); computeShareCost.setResponsibilityName(responsibilityDepartIdVO.getResponsibilityName()); // computeShareCost.setItemType(getChargeItemType(itemTypeDict,responsibilityDepartIdVO.getShareId())); computeShareCost.setItemType(ptItem.getDicItem().getItemType()); return computeShareCost; } /** * 根据收费项目创建分摊参数明细表对象 * @param currentUser * @param computeDate * @param ptItem * @param computeShareCost * @param shareParamType * @param itemEmpMaps * @param itemEquipmentMaps * @param itemSpaceMaps * @return */ public ComputeShareParamDetail createComputeShareParamDetail( SessionUserVO currentUser,String computeDate,PatientItemDepartmentGroupVo ptItem,ComputeShareParam computeShareCost,ShareParamTypeMap shareParamType, List itemEmpMaps,List itemEquipmentMaps ,List itemSpaceMaps){ //明细表公共对象 ComputeShareParamDetail costDetail = new ComputeShareParamDetail(); costDetail.setComputeDate(computeDate); costDetail.setHospId(currentUser.getHospId()); costDetail.setCreateUser(String.valueOf(currentUser.getId())); costDetail.setCreateTime(new Date()); costDetail.setShareParamCode(shareParamType.getShareParamCode()); if(shareParamType.getSourceType().equals(NumberConstant.ONE_S)){ //计算参与人员的参数值 BigDecimal computeSingleResult = calcEmpParamValue(shareParamType, ptItem, itemEmpMaps); costDetail.setComputeSingleResult(computeSingleResult); costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum())); }else if(shareParamType.getSourceType().equals(NumberConstant.TWO_S)){ //计算使用设备的参数值 BigDecimal computeSingleResult = calcEquipmentParamValue(shareParamType, ptItem, itemEquipmentMaps); costDetail.setComputeSingleResult(computeSingleResult); costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum())); }else if(shareParamType.getSourceType().equals(NumberConstant.THREE_S)){ //计算使用空间的参数值 BigDecimal computeSingleResult = calcSpaceParamValue(shareParamType, ptItem, itemSpaceMaps); costDetail.setComputeSingleResult(computeSingleResult); costDetail.setComputeResult(computeSingleResult.multiply(ptItem.getNum())); }else if(shareParamType.getSourceType().equals(NumberConstant.FOUR_S)){ //计算项目收入的参数值 BigDecimal computeResult = ptItem.getAmount(); if (!ptItem.getNum().equals(BigDecimal.ZERO.setScale(NumberConstant.TWO, RoundingMode.HALF_UP))) { costDetail.setComputeSingleResult(computeResult.divide(ptItem.getNum(), NumberConstant.FOUR, RoundingMode.HALF_UP)); } else { costDetail.setComputeSingleResult(BigDecimal.ZERO); } costDetail.setComputeResult(computeResult); }else if(shareParamType.getSourceType().equals(NumberConstant.FIVE_S)){ //计算项目数量的参数值 BigDecimal computeResult = ptItem.getNum(); costDetail.setComputeSingleResult(BigDecimal.ONE.setScale(NumberConstant.FOUR, RoundingMode.HALF_UP)); costDetail.setComputeResult(computeResult); } costDetail.setComputeShareCost(computeShareCost); return costDetail; } /** * 计算参与人员的参数值 * @param ptItem * @param itemEmpMaps * @return */ public BigDecimal calcEmpParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List itemEmpMaps){ //没有人员配置 if(CollectionUtils.isEmpty(itemEmpMaps)){ return BigDecimal.ZERO; } String sourceCode = shareParamType.getSourceCode(); //没有维护对应的来源代码 if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){ return BigDecimal.ZERO; } //获取项目对应的参与人员配置 List itemEmpList = itemEmpMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList()); if(CollectionUtils.isEmpty(itemEmpList)){ return BigDecimal.ZERO; } BigDecimal paramValue=BigDecimal.ZERO; //全部项目 if(sourceCode.equals(NumberConstant.ZERO_S)){ paramValue = itemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add); return paramValue; } //不是全部的项目时,有可能会是多个 List sourceCodeList = StrUtil.split(sourceCode, "|"); //获取符合条件的项目 List activeItemEmpList = itemEmpList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEmpTypeCode())).collect(Collectors.toList()); if(CollectionUtils.isEmpty(activeItemEmpList)){ return paramValue; } //只统计符合条件的项目 paramValue = activeItemEmpList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add); return paramValue; } /** * 计算使用设备参数值 * @param shareParamType * @param ptItem * @param itemEquipmentMaps * @return */ public BigDecimal calcEquipmentParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List itemEquipmentMaps){ //没有人员配置 if(CollectionUtils.isEmpty(itemEquipmentMaps)){ return BigDecimal.ZERO; } String sourceCode = shareParamType.getSourceCode(); //没有维护对应的来源代码 if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){ return BigDecimal.ZERO; } //获取项目对应的使用设备配置 List itemEquipmentList = itemEquipmentMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList()); if(CollectionUtils.isEmpty(itemEquipmentList)){ return BigDecimal.ZERO; } BigDecimal paramValue=BigDecimal.ZERO; //全部项目 if(sourceCode.equals(NumberConstant.ZERO_S)){ paramValue = itemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add); return paramValue; } //不是全部的项目时,有可能会是多个 List sourceCodeList = StrUtil.split(sourceCode, "|"); //获取符合条件的项目 List activeItemEquipmentList = itemEquipmentList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getEquipmentCode())).collect(Collectors.toList()); if(CollectionUtils.isEmpty(activeItemEquipmentList)){ return paramValue; } //只统计符合条件的项目 paramValue = activeItemEquipmentList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add); return paramValue; } /** * 计算使用空间参数值 * @param shareParamType * @param ptItem * @param itemSpaceMaps * @return */ public BigDecimal calcSpaceParamValue(ShareParamTypeMap shareParamType,PatientItemDepartmentGroupVo ptItem,List itemSpaceMaps){ //没有人员配置 if(CollectionUtils.isEmpty(itemSpaceMaps)){ return BigDecimal.ZERO; } String sourceCode = shareParamType.getSourceCode(); //没有维护对应的来源代码 if(Objects.isNull(sourceCode)||sourceCode.equals(Constant.EMPTY_STR)){ return BigDecimal.ZERO; } //获取项目对应的使用空间配置 List itemSpaceList = itemSpaceMaps.stream().filter(itemEmp -> itemEmp.getItemCode().equals(ptItem.getDicItem().getCode()) && itemEmp.getDepartmentCode().equals(ptItem.getDicItem().getDepartmentCode())).collect(Collectors.toList()); if(CollectionUtils.isEmpty(itemSpaceList)){ return BigDecimal.ZERO; } BigDecimal paramValue=BigDecimal.ZERO; //全部项目 if(sourceCode.equals(NumberConstant.ZERO_S)){ paramValue = itemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add); return paramValue; } //不是全部的项目时,有可能会是多个 List sourceCodeList = StrUtil.split(sourceCode, "|"); //获取符合条件的项目 List activeItemSpaceList = itemSpaceList.stream().filter(itemEmp -> sourceCodeList.contains(itemEmp.getSpaceCode())).collect(Collectors.toList()); if(CollectionUtils.isEmpty(activeItemSpaceList)){ return paramValue; } //只统计符合条件的项目 paramValue = activeItemSpaceList.stream().map(itemEmp -> itemEmp.getExecuteTime().multiply(itemEmp.getNum())).reduce(BigDecimal.ZERO, BigDecimal::add); return paramValue; } /** * 根据责任中心获取医疗服务项目分类 * @param dict * @param shareLevelId * @return */ public String getChargeItemType(DictDataVo dict,Long shareLevelId){ List dataVoList= dict.getDataVoList(); if(CollectionUtils.isEmpty(dataVoList)){ return NumberConstant.ONE_S; } DictDataVo dictDataVo = dataVoList.stream().filter(dataVo -> dataVo.getValue().equals(shareLevelId.toString())).findFirst().get(); return NumberConstant.ONE_S; } /** * 执行完全法项目分摊参数计算后续处理脚本 * @param computeDate */ public void execShareParamCostSQL(String computeDate){ Map sqlParameter = new HashMap<>(); sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate); sqlService.autoExecuteSql(CustomSqlTypeEnum.FULL_PROJECT_PARAM_CALC.getCode(),sqlParameter); } /** * 获取标准项目分摊参数 * * @param current 当前页 * @param pageSize 页容量 * @param computeDate 核算年月 * @param itemType 项目类型 * @param responsibility 责任中心 * @param itemFilter 项目过滤条件 * @return 分页数据 */ @Override public Object getStandShareParamCostList(Integer current, Integer pageSize, String computeDate, String itemType, String responsibility, String itemFilter) { Page page = computeStandShareParamRepository.getPage(current, pageSize, computeDate, itemType, responsibility, itemFilter); List records = page.getRecords(); ShareParamCostResponse response = new ShareParamCostResponse(); List titleVos = getCommonTitleVos(); response.setTitle(titleVos); if (CollectionUtils.isEmpty(records)) { response.setPageData(new PageUtils(new ArrayList<>(), NumberConstant.ZERO, pageSize, current)); return response; } List collect1 = records.stream().map(ComputeStandShareParam::getId).collect(Collectors.toList()); List shareParamDetails = computeStandShareParamDetailRepository.getByShareParamId(computeDate, collect1); Map typeNameMap = getTypeNameDict(); shareParamDetails.forEach(record -> record.setItemTypeName(typeNameMap.get(record.getItemType()))); List> returnList = new ArrayList<>(); //按报表头组装值 Map> collect = shareParamDetails.stream().collect(Collectors.groupingBy(ComputeDateShareParamVo::getCode)); for (ComputeStandShareParam itemCode : records) { setResultData(titleVos, collect, returnList, itemCode.getCode()); } PageUtils pageUtils = new PageUtils(returnList, Math.toIntExact(page.getTotal()), pageSize, current); response.setPageData(pageUtils); return response; } private @NotNull Map getTypeNameDict() { DictDataVo centerDict = centerService.getCenterDict(Constant.MED_SERVICE_ITEM_TYPE); List dataVoList = centerDict.getDataVoList(); return dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b)); } private @NotNull List getCommonTitleVos() { List titleVos = new ArrayList<>(); titleVos.add(new CommonTitleVo(RESPONSIBILITY_CODE.getCode(), RESPONSIBILITY_CODE.getName())); titleVos.add(new CommonTitleVo(RESPONSIBILITY_NAME.getCode(), RESPONSIBILITY_NAME.getName())); titleVos.add(new CommonTitleVo(ITEM_CODE.getCode(), ITEM_CODE.getName())); titleVos.add(new CommonTitleVo(ITEM_NAME.getCode(), ITEM_NAME.getName())); titleVos.add(new CommonTitleVo(ITEM_TYPE.getCode(), ITEM_TYPE.getName())); List shareParamType = shareParamTypeMapRepository.getList(); for (ShareParamTypeMap shareParamTypeMap : shareParamType) { titleVos.add(getTitle(shareParamTypeMap.getShareParamCode(), shareParamTypeMap.getShareParamName())); } return titleVos; } private void setResultData(List titleVos, Map> collect, List> returnList, String code) { List computeDateShareParamVos = collect.get(code); Map computeResultMap = computeDateShareParamVos.stream().collect(Collectors.toMap(ComputeDateShareParamVo::getShareParamCode, ComputeDateShareParamVo::getComputeResult, (a, b) -> b)); List dataList = new ArrayList<>(); for (CommonTitleVo titleVo : titleVos) { if (titleVo.getCode().equals(RESPONSIBILITY_CODE.getCode())) { dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getResponsibilityCode())); } else if (titleVo.getCode().equals(RESPONSIBILITY_NAME.getCode())) { dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getResponsibilityName())); } else if (titleVo.getCode().equals(ITEM_CODE.getCode())) { dataList.add(getData(titleVo.getCode(), code)); } else if (titleVo.getCode().equals(ITEM_NAME.getCode())) { dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getName())); } else if (titleVo.getCode().equals(ITEM_TYPE.getCode())) { dataList.add(getData(titleVo.getCode(), computeDateShareParamVos.get(0).getItemTypeName())); } else { dataList.add(getData(titleVo.getCode(), computeResultMap.get(titleVo.getCode()))); } } returnList.add(dataList); } /** * 标准法项目分摊参数计算 * @param computeDate */ @Override public void computeStandShareParamCost(String computeDate){ //标准法项目分摊参数计算 computeStandShareParamCostAction(computeDate); //执行标准法项目分摊参数计算后续处理脚本 execStandShareParamCostSQL(computeDate); } /** * 计算标准项目分摊参数 * * @param computeDate 核算年月 */ public void computeStandShareParamCostAction(String computeDate) { SessionUserVO currentUser = UserContext.getCurrentUser(); //把当月需要计算数据置成0 // importPatientItemRepository.updateGroupCalculateFlag(computeDate, currentUser); //获取收费项目数据(项目) checkItemCount(computeDate, currentUser); //获取计算列 List shareParamType = shareParamTypeMapRepository.getList(); if (CollectionUtils.isEmpty(shareParamType)) { throw new CostException("分摊参数来源项目未对照【com_share_param_type_map】表无数据"); } //作废上次计算记录 computeStandShareParamRepository.removeByComputeDate(computeDate, currentUser); computeStandShareParamDetailRepository.removeByComputeDate(computeDate, currentUser); //获到科室与责任中心对照 List patientResponsibility = getPatientResponsibility(currentUser); Map responsibilityCodeMap = new HashMap<>(); Map responsibilityNameMap = new HashMap<>(); patientResponsibility.forEach(visitNoResponsibilityMap -> { responsibilityCodeMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityCode()); responsibilityNameMap.put(visitNoResponsibilityMap.getDepartmentCode(), visitNoResponsibilityMap.getResponsibilityName()); }); //医疗服务项目字典 Map> itemMap = getStandItemMap(); //主表公共对象 ComputeStandShareParam computeShareCost = new ComputeStandShareParam(); computeShareCost.setComputeDate(computeDate); computeShareCost.setHospId(currentUser.getHospId()); computeShareCost.setCreateUser(String.valueOf(currentUser.getId())); computeShareCost.setCreateTime(new Date()); //明细表公共对象 ComputeStandShareParamDetail costDetail = new ComputeStandShareParamDetail(); costDetail.setComputeDate(computeDate); costDetail.setHospId(currentUser.getHospId()); costDetail.setCreateUser(String.valueOf(currentUser.getId())); costDetail.setCreateTime(new Date()); List items = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser); List saveDetails = new ArrayList<>(); List saveCost = new ArrayList<>(); if (!CollectionUtils.isEmpty(items)) { for (int i = 0; i < items.size(); i++) { PatientItemDepartmentGroupVo item = items.get(i); ComputeStandShareParam itemCost = BeanUtil.convertObj(computeShareCost, ComputeStandShareParam.class); itemCost.setCode(item.getItemCode()); itemCost.setName(item.getItemName()); itemCost.setNum(item.getNum()); Map departmentItem = itemMap.get(item.getExecuteDepartmentCode()); if (CollectionUtils.isEmpty(departmentItem)) { continue; } Item itemData = departmentItem.get(item.getItemCode()); if (Objects.isNull(itemData)) { continue; } itemCost.setItemType(itemData.getItemType()); itemCost.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode())); itemCost.setResponsibilityName(responsibilityNameMap.get(item.getExecuteDepartmentCode())); itemCost.setIndex(i); saveCost.add(itemCost); costDetail.setIndex(i); saveDetails.addAll(setStandDetails(costDetail, item, shareParamType, itemMap)); } if (!CollectionUtils.isEmpty(saveCost)) { //作废当前核算年月已有数据 computeStandShareParamRepository.saveBatch(saveCost, 500); if (!CollectionUtils.isEmpty(saveDetails)) { Map indexId = saveCost.stream().collect(Collectors.toMap(ComputeStandShareParam::getIndex, ComputeStandShareParam::getId, (a, b) -> b)); Map> collect = saveDetails.stream().collect(Collectors.groupingBy(ComputeStandShareParamDetail::getIndex)); List saveCostDetails = new ArrayList<>(); collect.forEach((k, v) -> { v.forEach(detail -> detail.setShareParamId(indexId.get(k))); saveCostDetails.addAll(v); }); computeStandShareParamDetailRepository.saveBatch(saveCostDetails, 500); } } } } /** * 执行标准法项目分摊参数计算后续处理脚本 * @param computeDate */ public void execStandShareParamCostSQL(String computeDate){ Map sqlParameter = new HashMap<>(); sqlParameter.put(SQLParameter.COMPUTE_DATE_CODE,computeDate); sqlService.autoExecuteSql(CustomSqlTypeEnum.STAND_PROJECT_PARAM_CALC.getCode(),sqlParameter); } private void checkItemCount(String computeDate, SessionUserVO currentUser) { long itemSize = importPatientItemRepository.getItemCount(computeDate, currentUser); if (Objects.equals(itemSize, NumberConstant.ZERO_L)) { log.error("当前核算年月【{}】未导入收费项目数据,计算中止", computeDate); throw new CostException("当前核算年月【" + computeDate + "】未导入收费项目数据,计算中止"); } } private @NotNull Map> getStandItemMap() { List itemList = itemRepository.getList(); if (CollectionUtils.isEmpty(itemList)) { throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止"); } //去除未对照标准项目的数据 //获取标准项目字典 List standItemDict = standItemService.getStandItemDict(); if (CollectionUtils.isEmpty(standItemDict)) { log.error("当前院区未找到标准项目数据,计算中止"); throw new CostException("当前院区未找到标准项目数据,计算中止"); } Map standItemMap = standItemDict.stream().collect(Collectors.toMap(StandItem::getCode, standItem -> standItem, (a, b) -> b)); for (Item item1 : itemList) { String standItemCode = item1.getStandItemCode(); if (!StringUtils.isEmpty(standItemCode)) { if (Objects.nonNull(standItemMap.get(standItemCode))) { item1.setStandItem(standItemMap.get(standItemCode)); } } } Map> itemMap = new HashMap<>(); Map> collect = itemList.stream().collect(Collectors.groupingBy(Item::getDepartmentCode)); collect.forEach((k, v) -> itemMap.put(k, v.stream().collect(Collectors.toMap(Item::getCode, item -> item, (a, b) -> b)))); return itemMap; } private CommonTitleVo getTitle(String code, String name) { return new CommonTitleVo(code, name); } private ReportVo getData(String code, Object name) { ReportVo vo = new ReportVo(); vo.setCode(code); vo.setValue(name); return vo; } private List setDetails(ComputeShareParamDetail costDetail, PatientItemDepartmentGroupVo patientItem, List shareParamType, Map> itemMap) { List details = new ArrayList<>(); Item item = itemMap.get(patientItem.getExecuteDepartmentCode()).get(patientItem.getItemCode()); // Item item = itemMap.get(patientItem.getItemCode()); for (ShareParamTypeMap shareParam : shareParamType) { ComputeShareParamDetail result = BeanUtil.convertObj(costDetail, ComputeShareParamDetail.class); switch (shareParam.getSourceType()) { case NumberConstant.ONE_S: { //参与人员、 List empMaps = item.getEmpMaps(); if (!CollectionUtils.isEmpty(empMaps)) { Map> collect = empMaps.stream().collect(Collectors.groupingBy(ItemEmpMap::getEmpTypeCode)); // Map map = empMaps.stream().collect(Collectors.toMap(ItemEmpMap::getEmpTypeCode, empMap -> empMap, (a, b) -> b)); String sourceCode = shareParam.getSourceCode(); if (sourceCode.equals(NumberConstant.ZERO_S)) { AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (ItemEmpMap empMap : empMaps) { BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum()))); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } else if (sourceCode.contains("|")) { List split = StrUtil.split(sourceCode, "|"); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (String s : split) { List itemEmpMaps = collect.get(s); if (!CollectionUtils.isEmpty(itemEmpMaps)) { for (ItemEmpMap itemEmpMap : itemEmpMaps) { if (Objects.nonNull(itemEmpMap)) { BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); details.add(result); } else { List itemEmpMaps = collect.get(sourceCode); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); if (!CollectionUtils.isEmpty(itemEmpMaps)) { for (ItemEmpMap itemEmpMap : itemEmpMaps) { if (Objects.nonNull(itemEmpMap)) { BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } result.setComputeResult(sum.get()); result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeSingleResult(singleSum.get()); details.add(result); } } else { result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } break; } case NumberConstant.TWO_S: { //使用设备 List equipmentMaps = item.getEquipmentMaps(); if (!CollectionUtils.isEmpty(equipmentMaps)) { Map> collect = equipmentMaps.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getEquipmentCode)); // Map map = equipmentMaps.stream().collect(Collectors.toMap(ItemEquipmentMap::getEquipmentCode, empMap -> empMap, (a, b) -> b)); String sourceCode = shareParam.getSourceCode(); if (sourceCode.equals(NumberConstant.ZERO_S)) { AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (ItemEquipmentMap empMap : equipmentMaps) { BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum()))); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } else if (sourceCode.contains("|")) { List split = StrUtil.split(sourceCode, "|"); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (String s : split) { List itemEquipmentMaps = collect.get(s); if (!CollectionUtils.isEmpty(itemEquipmentMaps)) { for (ItemEquipmentMap equipmentMap : itemEquipmentMaps) { if (Objects.nonNull(equipmentMap)) { BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); details.add(result); } else { List itemEquipmentMaps = collect.get(sourceCode); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (ItemEquipmentMap equipmentMap : itemEquipmentMaps) { if (Objects.nonNull(equipmentMap)) { BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } } else { result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } break; } case NumberConstant.THREE_S: { //使用空间 List spaceMaps = item.getSpaceMaps(); if (!CollectionUtils.isEmpty(spaceMaps)) { // Map map = spaceMaps.stream().collect(Collectors.toMap(ItemSpaceMap::getSpaceCode, f -> f, (a, b) -> b)); Map> collect = spaceMaps.stream().collect(Collectors.groupingBy(ItemSpaceMap::getSpaceCode)); String sourceCode = shareParam.getSourceCode(); if (sourceCode.equals(NumberConstant.ZERO_S)) { AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (ItemSpaceMap empMap : spaceMaps) { BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum()))); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } else if (sourceCode.contains("|")) { List split = StrUtil.split(sourceCode, "|"); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (String s : split) { List itemSpaceMaps = collect.get(s); if (!CollectionUtils.isEmpty(itemSpaceMaps)) { for (ItemSpaceMap spaceMap : itemSpaceMaps) { if (Objects.nonNull(spaceMap)) { BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); details.add(result); } else { List itemSpaceMaps = collect.get(sourceCode); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); if (!CollectionUtils.isEmpty(itemSpaceMaps)) { for (ItemSpaceMap spaceMap : itemSpaceMaps) { if (Objects.nonNull(spaceMap)) { BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } } else { result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); details.add(result); } break; } case NumberConstant.FOUR_S: //项目收入 result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(patientItem.getAmount()); if (!patientItem.getNum().equals(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))) { result.setComputeSingleResult(patientItem.getAmount().divide(patientItem.getNum(), 4, RoundingMode.HALF_UP)); } else { result.setComputeSingleResult(BigDecimal.ZERO); } details.add(result); break; case NumberConstant.FIVE_S: result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(patientItem.getNum()); details.add(result); break; } } return details; } private List setStandDetails(ComputeStandShareParamDetail costDetail, PatientItemDepartmentGroupVo patientItem, List shareParamType, Map> itemMap) { List details = new ArrayList<>(); Item item = itemMap.get(patientItem.getExecuteDepartmentCode()).get(patientItem.getItemCode()); StandItem standItem = item.getStandItem(); for (ShareParamTypeMap shareParam : shareParamType) { ComputeStandShareParamDetail result = BeanUtil.convertObj(costDetail, ComputeStandShareParamDetail.class); switch (shareParam.getSourceType()) { case NumberConstant.ONE_S: { //参与人员、 if (Objects.nonNull(standItem)) { List empMaps = standItem.getEmpMaps(); if (!CollectionUtils.isEmpty(empMaps)) { Map> collect = empMaps.stream().collect(Collectors.groupingBy(StandItemEmpMap::getEmpTypeCode)); String sourceCode = shareParam.getSourceCode(); if (sourceCode.equals(NumberConstant.ZERO_S)) { AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (StandItemEmpMap empMap : empMaps) { BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum()))); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } else if (sourceCode.contains("|")) { List split = StrUtil.split(sourceCode, "|"); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (String s : split) { List itemEmpMaps = collect.get(s); if (!CollectionUtils.isEmpty(itemEmpMaps)) { for (StandItemEmpMap itemEmpMap : itemEmpMaps) { if (Objects.nonNull(itemEmpMap)) { BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); details.add(result); } else { List itemEmpMaps = collect.get(sourceCode); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); if (!CollectionUtils.isEmpty(itemEmpMaps)) { for (StandItemEmpMap itemEmpMap : itemEmpMaps) { if (Objects.nonNull(itemEmpMap)) { BigDecimal multiply = patientItem.getNum().multiply(itemEmpMap.getExecuteTime()).multiply(itemEmpMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(itemEmpMap.getExecuteTime().multiply(itemEmpMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } result.setComputeResult(sum.get()); result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeSingleResult(singleSum.get()); details.add(result); } } else { result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } } else { if (result != null) { result.setComputeResult(BigDecimal.ZERO); } result.setComputeSingleResult(BigDecimal.ZERO); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } break; } case NumberConstant.TWO_S: { //使用设备 if (Objects.nonNull(standItem)) { List equipmentMaps = standItem.getEquipmentMaps(); if (!CollectionUtils.isEmpty(equipmentMaps)) { Map> collect = equipmentMaps.stream().collect(Collectors.groupingBy(StandItemEquipmentMap::getEquipmentCode)); // Map map = equipmentMaps.stream().collect(Collectors.toMap(ItemEquipmentMap::getEquipmentCode, empMap -> empMap, (a, b) -> b)); String sourceCode = shareParam.getSourceCode(); if (sourceCode.equals(NumberConstant.ZERO_S)) { AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (StandItemEquipmentMap empMap : equipmentMaps) { BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum()))); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } else if (sourceCode.contains("|")) { List split = StrUtil.split(sourceCode, "|"); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (String s : split) { List itemEquipmentMaps = collect.get(s); if (!CollectionUtils.isEmpty(itemEquipmentMaps)) { for (StandItemEquipmentMap equipmentMap : itemEquipmentMaps) { if (Objects.nonNull(equipmentMap)) { BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); details.add(result); } else { List itemEquipmentMaps = collect.get(sourceCode); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (StandItemEquipmentMap equipmentMap : itemEquipmentMaps) { if (Objects.nonNull(equipmentMap)) { BigDecimal multiply = patientItem.getNum().multiply(equipmentMap.getExecuteTime()).multiply(equipmentMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(equipmentMap.getExecuteTime().multiply(equipmentMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } } else { result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } } else { result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } break; } case NumberConstant.THREE_S: { //使用空间 if (Objects.nonNull(standItem)) { List spaceMaps = standItem.getSpaceMaps(); if (!CollectionUtils.isEmpty(spaceMaps)) { // Map map = spaceMaps.stream().collect(Collectors.toMap(ItemSpaceMap::getSpaceCode, f -> f, (a, b) -> b)); Map> collect = spaceMaps.stream().collect(Collectors.groupingBy(StandItemSpaceMap::getSpaceCode)); String sourceCode = shareParam.getSourceCode(); if (sourceCode.equals(NumberConstant.ZERO_S)) { AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (StandItemSpaceMap empMap : spaceMaps) { BigDecimal multiply = patientItem.getNum().multiply(empMap.getExecuteTime()).multiply(empMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(empMap.getExecuteTime().multiply(empMap.getNum()))); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } else if (sourceCode.contains("|")) { List split = StrUtil.split(sourceCode, "|"); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); for (String s : split) { List itemSpaceMaps = collect.get(s); if (!CollectionUtils.isEmpty(itemSpaceMaps)) { for (StandItemSpaceMap spaceMap : itemSpaceMaps) { if (Objects.nonNull(spaceMap)) { BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); details.add(result); } else { List itemSpaceMaps = collect.get(sourceCode); AtomicReference sum = new AtomicReference<>(new BigDecimal("0.0000")); AtomicReference singleSum = new AtomicReference<>(new BigDecimal("0.0000")); if (!CollectionUtils.isEmpty(itemSpaceMaps)) { for (StandItemSpaceMap spaceMap : itemSpaceMaps) { if (Objects.nonNull(spaceMap)) { BigDecimal multiply = patientItem.getNum().multiply(spaceMap.getExecuteTime()).multiply(spaceMap.getNum()); sum.updateAndGet(v -> v.add(multiply)); singleSum.updateAndGet(v -> v.add(spaceMap.getExecuteTime().multiply(spaceMap.getNum()))); } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } } } else { sum.updateAndGet(v -> v.add(BigDecimal.ZERO)); singleSum.updateAndGet(v -> v.add(BigDecimal.ZERO)); } result.setComputeResult(sum.get()); result.setComputeSingleResult(singleSum.get()); result.setShareParamCode(shareParam.getShareParamCode()); details.add(result); } } else { result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); details.add(result); } } else { result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(BigDecimal.ZERO); result.setComputeSingleResult(BigDecimal.ZERO); details.add(result); } break; } case NumberConstant.FOUR_S: //项目收入 result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(patientItem.getAmount()); if (!patientItem.getNum().equals(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))) { result.setComputeSingleResult(patientItem.getAmount().divide(patientItem.getNum(), 4, RoundingMode.HALF_UP)); } else { result.setComputeSingleResult(BigDecimal.ZERO); } details.add(result); break; case NumberConstant.FIVE_S: result.setShareParamCode(shareParam.getShareParamCode()); result.setComputeResult(patientItem.getNum()); details.add(result); break; } } return details; } private Map> getItemMap() { List list = itemRepository.getList(); if (CollectionUtils.isEmpty(list)) { throw new CostException("医疗服务项目未维护,请先添加医疗服务项目再进行计算,当前计算中止"); } List list1 = itemEmpMapRepository.getList(); //医疗服务项目字典人员对照 Map>> empMapGroup = new HashMap<>(); if (!CollectionUtils.isEmpty(list1)) { Map> collect = list1.stream().collect(Collectors.groupingBy(ItemEmpMap::getDepartmentCode)); collect.forEach((k, v) -> { Map> collect1 = v.stream().collect(Collectors.groupingBy(ItemEmpMap::getItemCode)); empMapGroup.put(k, collect1); }); // empMapGroup = list1.stream().collect(Collectors.groupingBy(ItemEmpMap::getItemCode)); } List list2 = itemEquipmentMapRepository.getList(); //医疗服务项目字典设备对照 // Map> equipmentGroup = new HashMap<>(); Map>> equipmentGroup = new HashMap<>(); if (!CollectionUtils.isEmpty(list2)) { Map> collect = list2.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getDepartmentCode)); collect.forEach((k, v) -> { Map> collect1 = v.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getItemCode)); equipmentGroup.put(k, collect1); }); // equipmentGroup = list2.stream().collect(Collectors.groupingBy(ItemEquipmentMap::getItemCode)); } List list3 = itemSpaceMapRepository.getList(); //医疗服务项目字典设备对照 // Map> spaceGroup = new HashMap<>(); Map>> spaceGroup = new HashMap<>(); if (!CollectionUtils.isEmpty(list3)) { Map> collect = list3.stream().collect(Collectors.groupingBy(ItemSpaceMap::getDepartmentCode)); collect.forEach((k, v) -> { Map> collect1 = v.stream().collect(Collectors.groupingBy(ItemSpaceMap::getItemCode)); spaceGroup.put(k, collect1); }); // spaceGroup = list3.stream().collect(Collectors.groupingBy(ItemSpaceMap::getItemCode)); } Map> map = new HashMap<>(); Map> collect = list.stream().collect(Collectors.groupingBy(Item::getDepartmentCode)); collect.forEach((k, v) -> { Map> empMap = empMapGroup.get(k); Map> equipmentMap = equipmentGroup.get(k); Map> spaceMap = spaceGroup.get(k); Map itemCodeMap = new HashMap<>(); for (Item item : v) { if (!CollectionUtils.isEmpty(empMap)) { item.setEmpMaps(empMap.get(item.getCode())); } if (!CollectionUtils.isEmpty(equipmentMap)) { item.setEquipmentMaps(equipmentMap.get(item.getCode())); } if (!CollectionUtils.isEmpty(spaceMap)) { item.setSpaceMaps(spaceMap.get(item.getCode())); } itemCodeMap.put(item.getCode(), item); } map.put(k, itemCodeMap); }); return map; } private List getPatientResponsibility(SessionUserVO currentUser) { return getVisitNoResponsibilityMaps(currentUser, responsibilityDepartmentRepository, centerService, log); } private @NotNull Map> getPatientItemGroup(String computeDate, SessionUserVO currentUser, Map responsibilityCodeMap) { List items = importPatientItemRepository.getByDepartGroupComputeDateItem(computeDate, currentUser); //移除执行科室为空的 List removeDepartmentList = new ArrayList<>(); for (PatientItemDepartmentGroupVo item : items) { if(StringUtils.isEmpty(item.getExecuteDepartmentCode())){ removeDepartmentList.add(item); } } if(!CollectionUtils.isEmpty(removeDepartmentList)){ List logs = new ArrayList<>(); for (PatientItemDepartmentGroupVo patientItemDepartmentGroupVo : removeDepartmentList) { logs.add(patientItemDepartmentGroupVo.getItemCode()); } List collect2 = logs.stream().distinct().collect(Collectors.toList()); log.info("以下项目数据【{}】执行科室为空", collect2); items.removeAll(removeDepartmentList); } items.forEach(item -> item.setResponsibilityCode(responsibilityCodeMap.get(item.getExecuteDepartmentCode()))); //移除责任中心为空的 List removeList = new ArrayList<>(); for (PatientItemDepartmentGroupVo item : items) { if(StringUtils.isEmpty(item.getResponsibilityCode())){ removeList.add(item); } } if(!CollectionUtils.isEmpty(removeList)){ List logs = new ArrayList<>(); for (PatientItemDepartmentGroupVo patientItemDepartmentGroupVo : removeList) { logs.add(patientItemDepartmentGroupVo.getExecuteDepartmentCode()); } List collect2 = logs.stream().distinct().collect(Collectors.toList()); log.info("以下执行科室【{}】科室代码未对照责任中心", collect2); items.removeAll(removeList); } Map> collect2 = items.stream().collect(Collectors.groupingBy(PatientItemDepartmentGroupVo::getResponsibilityCode)); Map> responsibilityItemGroupMap = new HashMap<>(); collect2.forEach((k,v)->{ Map> collect3 = v.stream().collect(Collectors.groupingBy(PatientItemDepartmentGroupVo::getItemCode)); if(!CollectionUtils.isEmpty(collect3)){ Map itemGroupMap = new HashMap<>(); collect3.forEach((itemCode,itemList)->{ PatientItemDepartmentGroupVo vo = new PatientItemDepartmentGroupVo(); vo.setItemCode(itemCode); vo.setItemName(itemList.get(0).getItemName()); vo.setResponsibilityCode(k); AtomicReference sumNum = new AtomicReference<>(new BigDecimal("0.00")); AtomicReference sumAmount = new AtomicReference<>(new BigDecimal("0.0000")); for (PatientItemDepartmentGroupVo vo1 : itemList) { sumNum.updateAndGet(s -> s.add(vo1.getNum())); sumAmount.updateAndGet(s -> s.add(vo1.getAmount())); } vo.setNum(sumNum.get()); vo.setAmount(sumAmount.get()); vo.setExecuteDepartmentCode(itemList.get(0).getExecuteDepartmentCode()); itemGroupMap.put(itemCode,vo); }); responsibilityItemGroupMap.put(k,itemGroupMap); } }); return responsibilityItemGroupMap; } }