|
|
@@ -13,13 +13,17 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
|
|
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeRecordOneReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeElderlyRespVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.*;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
|
|
|
import cn.iocoder.yudao.module.system.dal.mysql.biz.*;
|
|
|
+import cn.iocoder.yudao.module.system.enums.change.BusinessConstants;
|
|
|
+import cn.iocoder.yudao.module.system.enums.change.ChangeConstants;
|
|
|
import cn.iocoder.yudao.module.system.enums.common.BooleanEnum;
|
|
|
+import cn.iocoder.yudao.module.system.util.BizUtil;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -29,12 +33,24 @@ import org.springframework.validation.annotation.Validated;
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
+import java.time.YearMonth;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
+import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exceptionCustomMsg;
|
|
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.BED_CHANGE_RECORD_NOT_EXISTS;
|
|
|
@@ -73,6 +89,21 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
|
|
|
@Resource
|
|
|
private BedSwapRecordMapper bedSwapRecordMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private DailyExpensesMapper dailyExpensesMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ExpenseOrderMapper expenseOrderMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ExpenseOrderItemMapper expenseOrderItemMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private SysChargeCategoryMapper chargeCategoryMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private BizUtil bizUtil;
|
|
|
+
|
|
|
@Override
|
|
|
public Long createBedChangeRecord(BedChangeRecordSaveReqVO createReqVO) {
|
|
|
// 插入
|
|
|
@@ -439,6 +470,279 @@ public class NurseChangeRecordServiceImpl implements ElderlyChangeRecordService
|
|
|
|| originalActual.compareTo(newActual) != 0;
|
|
|
|
|
|
expenseItemMapper.insertBatch(newExpenseItemList);
|
|
|
+
|
|
|
+ // 费用变更后,对未缴费账单进行退补(参考 BpmElderlyChangeApiImpl#generateBill)
|
|
|
+ String itemCategory = getNameRecursive(originalItem.getItemCategoryId(), "");
|
|
|
+ processRefundSupplement(elderId, reqVO.getStartDate(), originalActual, newActual,
|
|
|
+ itemCategory, newCharge.getChargeName(), newCharge.getId());
|
|
|
+
|
|
|
return amountChanged;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 床位对调费用变更后,对未缴费的月度账单进行退补。
|
|
|
+ * 计算变更前后月费用的差额(按变更日到费用截止日的天数折算),生成日常费用记录,
|
|
|
+ * 并对未缴费、未锁定的账单追加账单明细项、同步更新账单应收金额。
|
|
|
+ * 逻辑参照 cn.iocoder.yudao.module.system.api.bpm.BpmElderlyChangeApiImpl#generateBill
|
|
|
+ *
|
|
|
+ * @param elderId 长者ID
|
|
|
+ * @param changeDate 变更生效日期(即对调开始日期)
|
|
|
+ * @param currentExpense 变更前月费用(原费用项实际金额)
|
|
|
+ * @param changeExpense 变更后月费用(新费用项实际金额)
|
|
|
+ * @param itemCategory 费用分类名称
|
|
|
+ * @param itemName 费用项名称
|
|
|
+ * @param overheadChargeId 收费项ID
|
|
|
+ */
|
|
|
+ private void processRefundSupplement(Long elderId, LocalDate changeDate, BigDecimal currentExpense,
|
|
|
+ BigDecimal changeExpense, String itemCategory, String itemName,
|
|
|
+ Long overheadChargeId) {
|
|
|
+ if (currentExpense == null) {
|
|
|
+ currentExpense = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ if (changeExpense == null) {
|
|
|
+ changeExpense = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ // 1. 计算退补金额(按变更日到费用截止日的剩余天数折算)
|
|
|
+ BigDecimal daysInCurrentMonth = BigDecimal.valueOf(changeDate.lengthOfMonth());
|
|
|
+ LocalDate firstDayOfMonth = changeDate.withDayOfMonth(1);
|
|
|
+ BigDecimal currentDays = BigDecimal.valueOf(changeDate.toEpochDay() - firstDayOfMonth.toEpochDay());
|
|
|
+ LocalDate endDay = bizUtil.getEndDateWithExpireDate(elderId, null,
|
|
|
+ firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth()));
|
|
|
+ // 新价格使用天数
|
|
|
+ BigDecimal changeDays = new BigDecimal(Math.abs(ChronoUnit.DAYS.between(endDay, changeDate)) + 1);
|
|
|
+
|
|
|
+ BigDecimal finalAmount;
|
|
|
+ if (0 == currentExpense.setScale(2).compareTo(changeExpense.setScale(2))) {
|
|
|
+ finalAmount = BigDecimal.ZERO;
|
|
|
+ } else if (daysInCurrentMonth.equals(changeDays)) {
|
|
|
+ finalAmount = changeExpense.subtract(currentExpense);
|
|
|
+ } else {
|
|
|
+ // 原价格每天价格
|
|
|
+ BigDecimal currentDayAmount = currentExpense.divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
|
|
|
+ // 新价格每天价格
|
|
|
+ BigDecimal changeDayAmount = changeExpense.divide(daysInCurrentMonth, 8, RoundingMode.HALF_UP);
|
|
|
+ // 原价格剩余费用 = 改变天数 * 原价格
|
|
|
+ BigDecimal currentFinalAmount = changeDays.multiply(currentDayAmount);
|
|
|
+ // 新价格剩余费用 = 改变天数 * 新价格
|
|
|
+ BigDecimal changeFinalAmount = changeDays.multiply(changeDayAmount);
|
|
|
+ // 最终价格 = 新 - 原(正为补收,负为退费)
|
|
|
+ finalAmount = changeFinalAmount.subtract(currentFinalAmount);
|
|
|
+ }
|
|
|
+ if (finalAmount.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ DateTimeFormatter billingMonthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
|
+ String changeBillingMonth = changeDate.format(billingMonthFormatter);
|
|
|
+ YearMonth changeYearMonth = YearMonth.parse(changeBillingMonth, billingMonthFormatter);
|
|
|
+ Date currentDate = new Date();
|
|
|
+ BigDecimal dailyExpensesDOAmount = finalAmount;
|
|
|
+ String remark = String.format(ChangeConstants.BED_SWAP_DAILY_PAY_REMARK, currentExpense.setScale(2),
|
|
|
+ currentExpense.setScale(2), changeExpense.setScale(2), currentDays, changeDays);
|
|
|
+
|
|
|
+ // 2. 查询变更生效月及之后已生成的账单
|
|
|
+ List<ExpenseOrderDO> generateExpenseOrder = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ .eq(ExpenseOrderDO::getElderId, elderId)
|
|
|
+ .ge(ExpenseOrderDO::getBillingMonth, changeBillingMonth)
|
|
|
+ .ne(ExpenseOrderDO::getType, 4));
|
|
|
+ if (generateExpenseOrder.size() > 0) {
|
|
|
+ List<String> targetBillingMonths = new ArrayList<>(generateExpenseOrder.size());
|
|
|
+ Set<String> targetBillingMonthSet = new HashSet<>(generateExpenseOrder.size());
|
|
|
+ for (ExpenseOrderDO e : generateExpenseOrder) {
|
|
|
+ String targetBillingMonth = resolveAttributionBillMonth(e.getBillingMonth(), changeYearMonth, null);
|
|
|
+ targetBillingMonths.add(targetBillingMonth);
|
|
|
+ targetBillingMonthSet.add(targetBillingMonth);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, ExpenseOrderDO> targetOrderMap = new HashMap<>();
|
|
|
+ if (CollectionUtil.isNotEmpty(targetBillingMonthSet)) {
|
|
|
+ List<ExpenseOrderDO> targetOrders = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ .eq(ExpenseOrderDO::getElderId, elderId)
|
|
|
+ .ne(ExpenseOrderDO::getType, 4)
|
|
|
+ .in(ExpenseOrderDO::getBillingMonth, targetBillingMonthSet)
|
|
|
+ .orderByDesc(ExpenseOrderDO::getCreatedTime));
|
|
|
+ for (ExpenseOrderDO targetOrder : targetOrders) {
|
|
|
+ targetOrderMap.putIfAbsent(targetOrder.getBillingMonth(), targetOrder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<DailyExpensesDO> currentDailyExpensesDOList = new ArrayList<>(generateExpenseOrder.size());
|
|
|
+ for (ExpenseOrderDO e : generateExpenseOrder) {
|
|
|
+ DailyExpensesDO dailyExpensesDO = new DailyExpensesDO();
|
|
|
+ dailyExpensesDO.setElderId(elderId);
|
|
|
+ dailyExpensesDO.setItemId(overheadChargeId);
|
|
|
+ dailyExpensesDO.setItemCategory(itemCategory);
|
|
|
+ dailyExpensesDO.setItemName(itemName);
|
|
|
+ dailyExpensesDO.setType(2);
|
|
|
+ dailyExpensesDO.setPrice(changeExpense.setScale(2));
|
|
|
+ if (changeBillingMonth.equals(e.getBillingMonth())) {
|
|
|
+ dailyExpensesDO.setAmount(dailyExpensesDOAmount);
|
|
|
+ dailyExpensesDO.setStartDate(changeDate);
|
|
|
+ dailyExpensesDO.setEndDate(endDay);
|
|
|
+ dailyExpensesDO.setRemarks(remark);
|
|
|
+ } else {
|
|
|
+ dailyExpensesDO.setAmount(changeExpense.subtract(currentExpense));
|
|
|
+ YearMonth yearMonth = YearMonth.parse(e.getBillingMonth());
|
|
|
+ dailyExpensesDO.setStartDate(yearMonth.atDay(1));
|
|
|
+ dailyExpensesDO.setEndDate(yearMonth.atEndOfMonth());
|
|
|
+ dailyExpensesDO.setRemarks(String.format(ChangeConstants.BED_SWAP_DAILY_PAY_REMARK,
|
|
|
+ currentExpense.setScale(2), currentExpense.setScale(2), changeExpense.setScale(2),
|
|
|
+ 0, yearMonth.lengthOfMonth()));
|
|
|
+ }
|
|
|
+ dailyExpensesDO.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
+ dailyExpensesDO.setCreatedTime(currentDate);
|
|
|
+ dailyExpensesDO.setAccountingTime(currentDate);
|
|
|
+ dailyExpensesDO.setCount(1);
|
|
|
+ String targetBillingMonth = resolveAttributionBillMonth(e.getBillingMonth(), changeYearMonth, null);
|
|
|
+ dailyExpensesDO.setAttributionBillTime(targetBillingMonth);
|
|
|
+ ExpenseOrderDO targetExpenseOrder = targetOrderMap.get(targetBillingMonth);
|
|
|
+ if (targetExpenseOrder != null && !targetExpenseOrder.getPayStatus().equals(BooleanEnum.TRUE.getValue())
|
|
|
+ && !targetExpenseOrder.getIsLock()) {
|
|
|
+ dailyExpensesDO.setIsGenerateBill(BooleanEnum.TRUE.getValue());
|
|
|
+ } else {
|
|
|
+ dailyExpensesDO.setIsGenerateBill(BooleanEnum.FALSE.getValue());
|
|
|
+ }
|
|
|
+ currentDailyExpensesDOList.add(dailyExpensesDO);
|
|
|
+ }
|
|
|
+ dailyExpensesMapper.insertBatch(currentDailyExpensesDOList);
|
|
|
+
|
|
|
+ // 为未缴费、未锁定的账单创建账单明细项并更新账单金额
|
|
|
+ for (int i = 0; i < generateExpenseOrder.size(); i++) {
|
|
|
+ DailyExpensesDO dailyExpensesDO = currentDailyExpensesDOList.get(i);
|
|
|
+ ExpenseOrderDO targetExpenseOrder = targetOrderMap.get(targetBillingMonths.get(i));
|
|
|
+ if (targetExpenseOrder != null && !targetExpenseOrder.getPayStatus().equals(BooleanEnum.TRUE.getValue())
|
|
|
+ && !targetExpenseOrder.getIsLock()) {
|
|
|
+ ExpenseOrderItemDO expenseOrderItemDO = new ExpenseOrderItemDO();
|
|
|
+ expenseOrderItemDO.setExpenseOrderId(targetExpenseOrder.getId());
|
|
|
+ expenseOrderItemDO.setSourceExpenseItemId(dailyExpensesDO.getId());
|
|
|
+ expenseOrderItemDO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
+ expenseOrderItemDO.setItemCategoryName(dailyExpensesDO.getItemCategory());
|
|
|
+ expenseOrderItemDO.setItemName(dailyExpensesDO.getItemName());
|
|
|
+ expenseOrderItemDO.setPrice(dailyExpensesDO.getPrice());
|
|
|
+ expenseOrderItemDO.setActualPrice(dailyExpensesDO.getPrice());
|
|
|
+ expenseOrderItemDO.setTotalAmount(dailyExpensesDO.getAmount());
|
|
|
+ expenseOrderItemDO.setRoundAmount(dailyExpensesDO.getAmount().setScale(0, RoundingMode.HALF_UP));
|
|
|
+ expenseOrderItemDO.setRoundTwoDecimalAmount(dailyExpensesDO.getAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
+ expenseOrderItemDO.setCount(dailyExpensesDO.getCount());
|
|
|
+ expenseOrderItemDO.setType(dailyExpensesDO.getType());
|
|
|
+ expenseOrderItemDO.setStartDate(dailyExpensesDO.getStartDate());
|
|
|
+ expenseOrderItemDO.setEndDate(dailyExpensesDO.getEndDate());
|
|
|
+ expenseOrderItemDO.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
+ expenseOrderItemDO.setCreatedTime(currentDate);
|
|
|
+ expenseOrderItemDO.setTenantId(targetExpenseOrder.getTenantId());
|
|
|
+ expenseOrderItemDO.setPayStatus(0);
|
|
|
+ expenseOrderItemMapper.insert(expenseOrderItemDO);
|
|
|
+
|
|
|
+ // 更新账单金额
|
|
|
+ BigDecimal currentAmount = targetExpenseOrder.getActualAmount() != null
|
|
|
+ ? targetExpenseOrder.getActualAmount() : BigDecimal.ZERO;
|
|
|
+ BigDecimal newAmount = currentAmount.add(expenseOrderItemDO.getTotalAmount());
|
|
|
+ ExpenseOrderDO updateExpenseOrderDO = new ExpenseOrderDO();
|
|
|
+ updateExpenseOrderDO.setId(targetExpenseOrder.getId());
|
|
|
+ updateExpenseOrderDO.setActualAmount(newAmount);
|
|
|
+ expenseOrderMapper.updateById(updateExpenseOrderDO);
|
|
|
+ targetExpenseOrder.setActualAmount(newAmount);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 生效当月若无未缴费账单,则生成日常费用(后续由账单生成流程并入账单)
|
|
|
+ ExpenseOrderDO expenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ .eq(ExpenseOrderDO::getElderId, elderId)
|
|
|
+ .eq(ExpenseOrderDO::getBillingMonth, changeBillingMonth)
|
|
|
+ .eq(ExpenseOrderDO::getPayStatus, BooleanEnum.FALSE.getValue())
|
|
|
+ .ne(ExpenseOrderDO::getType, 4));
|
|
|
+ if (expenseOrder == null) {
|
|
|
+ String targetBillingMonth = resolveAttributionBillMonth(changeBillingMonth, changeYearMonth, null);
|
|
|
+ ExpenseOrderDO targetExpenseOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ .eq(ExpenseOrderDO::getElderId, elderId)
|
|
|
+ .eq(ExpenseOrderDO::getBillingMonth, targetBillingMonth));
|
|
|
+ DailyExpensesDO dailyExpensesDO = new DailyExpensesDO();
|
|
|
+ dailyExpensesDO.setElderId(elderId);
|
|
|
+ dailyExpensesDO.setItemId(overheadChargeId);
|
|
|
+ dailyExpensesDO.setItemCategory(itemCategory);
|
|
|
+ dailyExpensesDO.setItemName(itemName);
|
|
|
+ dailyExpensesDO.setType(2);
|
|
|
+ dailyExpensesDO.setPrice(changeExpense.setScale(2));
|
|
|
+ dailyExpensesDO.setAmount(dailyExpensesDOAmount);
|
|
|
+ dailyExpensesDO.setRemarks(remark);
|
|
|
+ dailyExpensesDO.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
+ dailyExpensesDO.setCreatedTime(currentDate);
|
|
|
+ dailyExpensesDO.setStartDate(changeDate);
|
|
|
+ dailyExpensesDO.setEndDate(endDay);
|
|
|
+ dailyExpensesDO.setAccountingTime(currentDate);
|
|
|
+ dailyExpensesDO.setCount(1);
|
|
|
+ dailyExpensesDO.setAttributionBillTime(targetBillingMonth);
|
|
|
+ if (targetExpenseOrder != null && !targetExpenseOrder.getPayStatus().equals(BooleanEnum.TRUE.getValue())
|
|
|
+ && !targetExpenseOrder.getIsLock()) {
|
|
|
+ dailyExpensesDO.setIsGenerateBill(BooleanEnum.TRUE.getValue());
|
|
|
+ } else {
|
|
|
+ dailyExpensesDO.setIsGenerateBill(BooleanEnum.FALSE.getValue());
|
|
|
+ }
|
|
|
+ dailyExpensesMapper.insert(dailyExpensesDO);
|
|
|
+ if (dailyExpensesDO.getIsGenerateBill().equals(BooleanEnum.TRUE.getValue())) {
|
|
|
+ ExpenseOrderItemDO expenseOrderItemDO = new ExpenseOrderItemDO();
|
|
|
+ expenseOrderItemDO.setExpenseOrderId(targetExpenseOrder.getId());
|
|
|
+ expenseOrderItemDO.setSourceExpenseItemId(dailyExpensesDO.getId());
|
|
|
+ expenseOrderItemDO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
+ expenseOrderItemDO.setItemCategoryName(dailyExpensesDO.getItemCategory());
|
|
|
+ expenseOrderItemDO.setItemName(dailyExpensesDO.getItemName());
|
|
|
+ expenseOrderItemDO.setPrice(dailyExpensesDO.getPrice());
|
|
|
+ expenseOrderItemDO.setActualPrice(dailyExpensesDO.getPrice());
|
|
|
+ expenseOrderItemDO.setTotalAmount(dailyExpensesDO.getAmount());
|
|
|
+ expenseOrderItemDO.setRoundAmount(dailyExpensesDO.getAmount().setScale(0, RoundingMode.HALF_UP));
|
|
|
+ expenseOrderItemDO.setRoundTwoDecimalAmount(dailyExpensesDO.getAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
+ expenseOrderItemDO.setCount(dailyExpensesDO.getCount());
|
|
|
+ expenseOrderItemDO.setType(dailyExpensesDO.getType());
|
|
|
+ expenseOrderItemDO.setStartDate(dailyExpensesDO.getStartDate());
|
|
|
+ expenseOrderItemDO.setEndDate(dailyExpensesDO.getEndDate());
|
|
|
+ expenseOrderItemDO.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
+ expenseOrderItemDO.setCreatedTime(currentDate);
|
|
|
+ expenseOrderItemDO.setTenantId(targetExpenseOrder.getTenantId());
|
|
|
+ expenseOrderItemDO.setPayStatus(0);
|
|
|
+ expenseOrderItemMapper.insert(expenseOrderItemDO);
|
|
|
+
|
|
|
+ BigDecimal currentAmount = targetExpenseOrder.getActualAmount() != null
|
|
|
+ ? targetExpenseOrder.getActualAmount() : BigDecimal.ZERO;
|
|
|
+ BigDecimal newAmount = currentAmount.add(expenseOrderItemDO.getTotalAmount());
|
|
|
+ expenseOrderMapper.updateById(new ExpenseOrderDO().setId(targetExpenseOrder.getId()).setActualAmount(newAmount));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归获取费用分类全路径名称(与 BpmElderlyChangeApiImpl#getNameRecursive 一致)
|
|
|
+ */
|
|
|
+ private String getNameRecursive(Long itemCategoryId, String name) {
|
|
|
+ SysChargeCategoryDO sysChargeCategoryDO = chargeCategoryMapper.selectById(itemCategoryId);
|
|
|
+ if (null == sysChargeCategoryDO || null == sysChargeCategoryDO.getParentId()) {
|
|
|
+ String[] split = name.split("/");
|
|
|
+ if (null != split && split.length > 2) {
|
|
|
+ return split[1] + "/" + split[2];
|
|
|
+ }
|
|
|
+ if (null != split && split.length > 1) {
|
|
|
+ return split[0] + "/" + split[1];
|
|
|
+ }
|
|
|
+ return name;
|
|
|
+ }
|
|
|
+ String returnName;
|
|
|
+ if (StringUtils.isEmpty(name)) {
|
|
|
+ returnName = sysChargeCategoryDO.getName();
|
|
|
+ } else {
|
|
|
+ returnName = sysChargeCategoryDO.getName() + "/" + name;
|
|
|
+ }
|
|
|
+ return getNameRecursive(sysChargeCategoryDO.getParentId(), returnName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析日常费用归属账单月(床位对调不涉及滞后月,原样返回)
|
|
|
+ */
|
|
|
+ private String resolveAttributionBillMonth(String sourceBillingMonth, YearMonth changeYearMonth, YearMonth hysteresisYearMonth) {
|
|
|
+ if (hysteresisYearMonth == null || changeYearMonth == null || StringUtils.isBlank(sourceBillingMonth)) {
|
|
|
+ return sourceBillingMonth;
|
|
|
+ }
|
|
|
+ YearMonth sourceYearMonth = YearMonth.parse(sourceBillingMonth);
|
|
|
+ long monthOffset = ChronoUnit.MONTHS.between(changeYearMonth, sourceYearMonth);
|
|
|
+ return hysteresisYearMonth.plusMonths(monthOffset).toString();
|
|
|
+ }
|
|
|
}
|