|
|
@@ -166,10 +166,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
public PageResult<ExpenseOrderDO> getExpenseBillPage(ExpenseBillPageReqVO pageReqVO) {
|
|
|
Page<ExpenseOrderDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
|
|
|
List<ExpenseOrderDO> list = expenseOrderMapper.getExpenseBillPage(page, pageReqVO);
|
|
|
+ Map<String,BigDecimal> categoryAmountMap = new HashMap<>();
|
|
|
+ Map<Integer,String> typeCategoryMap = new HashMap<>();
|
|
|
for (ExpenseOrderDO expenseOrderDO : list) {
|
|
|
- BigDecimal bedAmount = BigDecimal.ZERO;
|
|
|
- BigDecimal nurseAmount = BigDecimal.ZERO;
|
|
|
- BigDecimal mealAmount = BigDecimal.ZERO;
|
|
|
BigDecimal otherAmount = BigDecimal.ZERO;
|
|
|
BigDecimal otherRoundAmount = BigDecimal.ZERO;
|
|
|
BigDecimal paidAmount = BigDecimal.ZERO;
|
|
|
@@ -191,25 +190,33 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
for (ExpenseOrderItemDO orderItem : orderItems) {
|
|
|
if(orderItem.getExpenseSource().equals(BusinessConstants.EXPENSE_ITEM)){
|
|
|
if (orderItem.getType() != null && orderItem.getType() == 1) {
|
|
|
- bedAmount = bedAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
+ typeCategoryMap.put(orderItem.getType(),orderItem.getItemCategoryName());
|
|
|
+ categoryAmountMap.put(orderItem.getItemCategoryName(),orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
} else if (orderItem.getType() != null && orderItem.getType() == 2) {
|
|
|
- nurseAmount = nurseAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
+ typeCategoryMap.put(orderItem.getType(),orderItem.getItemCategoryName());
|
|
|
+ categoryAmountMap.put(orderItem.getItemCategoryName(),orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
} else if (orderItem.getType() != null && orderItem.getType() == 3) {
|
|
|
- mealAmount = mealAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
+ typeCategoryMap.put(orderItem.getType(),orderItem.getItemCategoryName());
|
|
|
+ categoryAmountMap.put(orderItem.getItemCategoryName(),orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
}else {
|
|
|
otherAmount = otherAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
otherRoundAmount = otherRoundAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
}
|
|
|
} else {
|
|
|
+ BigDecimal categoryAmount = categoryAmountMap.get(orderItem.getItemCategoryName());
|
|
|
+ if(categoryAmount != null){
|
|
|
+ categoryAmountMap.put(orderItem.getItemCategoryName(),categoryAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP)));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
otherAmount = otherAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
otherRoundAmount = otherRoundAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
}
|
|
|
}
|
|
|
- expenseOrderDO.setBedAmount(bedAmount);
|
|
|
- expenseOrderDO.setNurseAmount(nurseAmount);
|
|
|
- expenseOrderDO.setMealAmount(mealAmount);
|
|
|
+ expenseOrderDO.setBedAmount(categoryAmountMap.get(typeCategoryMap.get(1)));
|
|
|
+ expenseOrderDO.setNurseAmount(categoryAmountMap.get(typeCategoryMap.get(2)));
|
|
|
+ expenseOrderDO.setMealAmount(categoryAmountMap.get(typeCategoryMap.get(3)));
|
|
|
expenseOrderDO.setOtherAmount(otherAmount);
|
|
|
- expenseOrderDO.setPayableAmount(bedAmount.add(nurseAmount).add(mealAmount).add(otherAmount).setScale(2, RoundingMode.HALF_UP));
|
|
|
+ expenseOrderDO.setPayableAmount(expenseOrderDO.getBedAmount().add(expenseOrderDO.getNurseAmount()).add(expenseOrderDO.getMealAmount()).add(expenseOrderDO.getOtherAmount()).setScale(2, RoundingMode.HALF_UP));
|
|
|
expenseOrderDO.setOtherRoundAmount(otherRoundAmount);
|
|
|
expenseOrderDO.setPaidAmount(paidAmount.setScale(2, RoundingMode.HALF_UP));
|
|
|
}
|
|
|
@@ -515,7 +522,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
}
|
|
|
}
|
|
|
if (expenseOrderItem.getExpenseSource().equals(BusinessConstants.CONSUMER_VOUCHER)) {
|
|
|
- //修改长期护理保险缴费状态
|
|
|
+ //修改消费券缴费状态
|
|
|
ElderlyConsumerVouchersDO consumerVouchersDO = elderlyConsumerVouchersMapper.selectById(expenseOrderItem.getSourceExpenseItemId());
|
|
|
if (consumerVouchersDO != null) {
|
|
|
consumerVouchersDO.setReturnStatus(BooleanEnum.TRUE.getValue());
|
|
|
@@ -769,138 +776,162 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
actualStart = LocalDate.parse(collect.get(0).getStartTime());
|
|
|
actualEnd = LocalDate.parse(collect.get(0).getEndTime());
|
|
|
}
|
|
|
- //查询上月未缴费的日常费用
|
|
|
- YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
- List<DailyExpensesDO> dailyExpensesList = dailyExpensesMapper.selectList(new LambdaQueryWrapperX<DailyExpensesDO>()
|
|
|
- .eq(DailyExpensesDO::getElderId, elderId)
|
|
|
- .le(DailyExpensesDO::getAttributionBillTime, attributionBillTime.toString())
|
|
|
- .eq(DailyExpensesDO::getStatus, BooleanEnum.FALSE.getValue())
|
|
|
- .eq(DailyExpensesDO::getIsGenerateBill, BooleanEnum.FALSE.getValue()));
|
|
|
-
|
|
|
- List<ExpenseItemRespVO> dailyExpensesCollect = dailyExpensesList.stream().map(item -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(item.getType());
|
|
|
- respVO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
- respVO.setSourceExpenseItemId(item.getId());
|
|
|
- respVO.setPrice(item.getPrice());
|
|
|
- respVO.setTotalAmount(item.getAmount());
|
|
|
- respVO.setItemName(item.getItemName());
|
|
|
- respVO.setItemCategory(item.getItemCategory());
|
|
|
- respVO.setCount(item.getCount());
|
|
|
- respVO.setDescription(item.getRemarks());
|
|
|
- LocalDate localDate = item.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
|
|
- if (item.getType() == 2 || item.getType() == 3) { //变更和外出
|
|
|
- respVO.setStartTime(item.getStartDate() == null ? null : item.getStartDate().toString());
|
|
|
- respVO.setEndTime(item.getEndDate() == null ? null : item.getEndDate().toString());
|
|
|
- } else if (item.getType() == 5) { //分期
|
|
|
- respVO.setStartTime(localDate.toString());
|
|
|
- respVO.setEndTime(localDate.with(TemporalAdjusters.lastDayOfMonth()).toString());
|
|
|
- } else {
|
|
|
- respVO.setStartTime(item.getStartDate() == null ? null : item.getStartDate().toString());
|
|
|
- respVO.setEndTime(item.getEndDate() == null ? null : item.getEndDate().toString());
|
|
|
- }
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
-
|
|
|
- //组装长护险抵扣的数据
|
|
|
- // 查询对应月份未进行抵扣的长护险记录
|
|
|
- List<ExpenseSubsidyDO> unclaimedSubsidies = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>()
|
|
|
- .eq(ExpenseSubsidyDO::getElderId, elderId)
|
|
|
- .eq(ExpenseSubsidyDO::getDeductionBillMonth, billingMonth)
|
|
|
- .eq(ExpenseSubsidyDO::getStatus, BooleanEnum.FALSE.getValue())); // 未抵扣状态
|
|
|
-
|
|
|
- // 组装成长护险抵扣项,参考queryExpenseBillItem中的日常和月度费用格式
|
|
|
- LocalDate finalActualStart = actualStart;
|
|
|
- LocalDate finalActualEnd = actualEnd;
|
|
|
- List<ExpenseItemRespVO> subsidyCollect = unclaimedSubsidies.stream().map(subsidy -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(7); // 7表示长护险抵扣项
|
|
|
- respVO.setExpenseSource(BusinessConstants.LONG_TERM_CARE_INSURANCE); // 长护险费用来源标识
|
|
|
- respVO.setSourceExpenseItemId(subsidy.getId());
|
|
|
- respVO.setPrice(subsidy.getAmount().negate());
|
|
|
- respVO.setTotalAmount(subsidy.getAmount().negate());
|
|
|
- respVO.setItemName("长护险抵扣");
|
|
|
- respVO.setItemCategory("长护险");
|
|
|
- respVO.setCount(1);
|
|
|
- respVO.setDescription(subsidy.getRemarks());
|
|
|
- // 设置抵扣期间为实际区间(可能存在离住截断)
|
|
|
- respVO.setStartTime(finalActualStart.toString());
|
|
|
- respVO.setEndTime(finalActualEnd.toString());
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
+ List<ExpenseItemRespVO> dailyExpensesCollect = collectDailyExpenseItemsNoBill(elderId, billingMonth);
|
|
|
+ List<ExpenseItemRespVO> subsidyCollect = collectSubsidyItems(elderId, billingMonth, actualStart, actualEnd, false);
|
|
|
+ List<ExpenseItemRespVO> consumerVoucherCollect = collectConsumerVoucherItems(elderId, billingMonth, actualStart, actualEnd, false);
|
|
|
|
|
|
// 优惠抵扣项:按实际区间折算金额 & 展示区间
|
|
|
List<ExpenseItemRespVO> discountCollect = adjustDiscountByActualRange(elderId, billingMonth, actualStart, actualEnd);
|
|
|
collect.addAll(discountCollect);
|
|
|
collect.addAll(subsidyCollect);
|
|
|
+ collect.addAll(consumerVoucherCollect);
|
|
|
collect.addAll(dailyExpensesCollect);
|
|
|
return collect;
|
|
|
|
|
|
} else {
|
|
|
- //存在当月订单合并未缴费的日常费用
|
|
|
- //查询上月未缴费的日常费用
|
|
|
List<ExpenseItemRespVO> resultList = new ArrayList<>();
|
|
|
- YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
- List<DailyExpensesDO> dailyExpensesList = dailyExpensesMapper.selectList(new LambdaQueryWrapperX<DailyExpensesDO>()
|
|
|
- .eq(DailyExpensesDO::getElderId, elderId)
|
|
|
- .le(DailyExpensesDO::getAttributionBillTime, attributionBillTime)
|
|
|
- .eq(DailyExpensesDO::getStatus, BooleanEnum.FALSE.getValue())
|
|
|
- .eq(DailyExpensesDO::getIsGenerateBill, BooleanEnum.FALSE.getValue()));
|
|
|
-
|
|
|
- if (CollectionUtil.isNotEmpty(dailyExpensesList)) {
|
|
|
- List<ExpenseItemRespVO> dailyExpenses = dailyExpensesList.stream().map(item -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(item.getType());
|
|
|
- respVO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
- respVO.setSourceExpenseItemId(item.getId());
|
|
|
- respVO.setPrice(item.getPrice());
|
|
|
- respVO.setTotalAmount(item.getAmount());
|
|
|
- respVO.setItemName(item.getItemName());
|
|
|
- respVO.setItemCategory(item.getItemCategory());
|
|
|
- respVO.setCount(item.getCount());
|
|
|
- YearMonth yearMonth = YearMonth.parse(item.getAttributionBillTime(), DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
-// LocalDate localDate = item.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
|
|
- respVO.setStartTime(yearMonth.atDay(1).toString());
|
|
|
- respVO.setEndTime(yearMonth.atEndOfMonth().toString());
|
|
|
- respVO.setDescription(item.getRemarks());
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- resultList.addAll(dailyExpenses);
|
|
|
+ YearMonth billingYm = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
+ LocalDate monthStart = billingYm.atDay(1);
|
|
|
+ LocalDate monthEnd = billingYm.atEndOfMonth();
|
|
|
+ resultList.addAll(collectDailyExpenseItemsHasBill(elderId, billingMonth));
|
|
|
+ resultList.addAll(collectSubsidyItems(elderId, billingMonth, monthStart, monthEnd, false));
|
|
|
+ resultList.addAll(collectConsumerVoucherItems(elderId, billingMonth, monthStart, monthEnd, false));
|
|
|
+ resultList.addAll(calculateDiscountDeduction(elderId, billingMonth));
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<ExpenseItemRespVO> collectDailyExpenseItemsNoBill(Long elderId, String billingMonth) {
|
|
|
+ YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
+ List<DailyExpensesDO> dailyExpensesList = dailyExpensesMapper.selectList(new LambdaQueryWrapperX<DailyExpensesDO>()
|
|
|
+ .eq(DailyExpensesDO::getElderId, elderId)
|
|
|
+ .le(DailyExpensesDO::getAttributionBillTime, attributionBillTime.toString())
|
|
|
+ .eq(DailyExpensesDO::getStatus, BooleanEnum.FALSE.getValue())
|
|
|
+ .eq(DailyExpensesDO::getIsGenerateBill, BooleanEnum.FALSE.getValue()));
|
|
|
+
|
|
|
+ return dailyExpensesList.stream().map(item -> {
|
|
|
+ ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
+ respVO.setExpenseType(item.getType());
|
|
|
+ respVO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
+ respVO.setSourceExpenseItemId(item.getId());
|
|
|
+ respVO.setPrice(item.getPrice());
|
|
|
+ respVO.setTotalAmount(item.getAmount());
|
|
|
+ respVO.setItemName(item.getItemName());
|
|
|
+ respVO.setItemCategory(item.getItemCategory());
|
|
|
+ respVO.setCount(item.getCount());
|
|
|
+ respVO.setDescription(item.getRemarks());
|
|
|
+ LocalDate localDate = item.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
|
|
+ if (item.getType() == 2 || item.getType() == 3) {
|
|
|
+ respVO.setStartTime(item.getStartDate() == null ? null : item.getStartDate().toString());
|
|
|
+ respVO.setEndTime(item.getEndDate() == null ? null : item.getEndDate().toString());
|
|
|
+ } else if (item.getType() == 5) {
|
|
|
+ respVO.setStartTime(localDate.toString());
|
|
|
+ respVO.setEndTime(localDate.with(TemporalAdjusters.lastDayOfMonth()).toString());
|
|
|
+ } else {
|
|
|
+ respVO.setStartTime(item.getStartDate() == null ? null : item.getStartDate().toString());
|
|
|
+ respVO.setEndTime(item.getEndDate() == null ? null : item.getEndDate().toString());
|
|
|
}
|
|
|
+ return respVO;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
|
|
|
- List<ExpenseSubsidyDO> unclaimedSubsidies = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>()
|
|
|
- .eq(ExpenseSubsidyDO::getElderId, elderId)
|
|
|
- .eq(ExpenseSubsidyDO::getDeductionBillMonth, billingMonth)
|
|
|
- .eq(ExpenseSubsidyDO::getStatus, BooleanEnum.FALSE.getValue())); // 未抵扣状态
|
|
|
+ private List<ExpenseItemRespVO> collectDailyExpenseItemsHasBill(Long elderId, String billingMonth) {
|
|
|
+ YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
+ List<DailyExpensesDO> dailyExpensesList = dailyExpensesMapper.selectList(new LambdaQueryWrapperX<DailyExpensesDO>()
|
|
|
+ .eq(DailyExpensesDO::getElderId, elderId)
|
|
|
+ .like(DailyExpensesDO::getAttributionBillTime, attributionBillTime)
|
|
|
+ .eq(DailyExpensesDO::getStatus, BooleanEnum.FALSE.getValue())
|
|
|
+ .eq(DailyExpensesDO::getIsGenerateBill, BooleanEnum.FALSE.getValue()));
|
|
|
|
|
|
- // 组装成长护险抵扣项,参考queryExpenseBillItem中的日常和月度费用格式
|
|
|
- List<ExpenseItemRespVO> subsidyCollect = unclaimedSubsidies.stream().map(subsidy -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(7); // 7表示长护险抵扣项
|
|
|
- respVO.setExpenseSource(BusinessConstants.LONG_TERM_CARE_INSURANCE); // 长护险费用来源标识
|
|
|
- respVO.setSourceExpenseItemId(subsidy.getId());
|
|
|
- respVO.setPrice(subsidy.getAmount().negate());
|
|
|
- respVO.setTotalAmount(subsidy.getAmount().negate());
|
|
|
- respVO.setItemName("长护险抵扣");
|
|
|
- respVO.setItemCategory("长护险");
|
|
|
- respVO.setCount(1);
|
|
|
- respVO.setDescription(subsidy.getRemarks());
|
|
|
- // 设置抵扣期间为整个月
|
|
|
- YearMonth yearMonth = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
- respVO.setStartTime(yearMonth.atDay(1).toString());
|
|
|
- respVO.setEndTime(yearMonth.atEndOfMonth().toString());
|
|
|
+ return dailyExpensesList.stream().map(item -> {
|
|
|
+ ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
+ respVO.setExpenseType(item.getType());
|
|
|
+ respVO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
+ respVO.setSourceExpenseItemId(item.getId());
|
|
|
+ respVO.setPrice(item.getPrice());
|
|
|
+ respVO.setTotalAmount(item.getAmount());
|
|
|
+ respVO.setItemName(item.getItemName());
|
|
|
+ respVO.setItemCategory(item.getItemCategory());
|
|
|
+ respVO.setCount(item.getCount() == null ? 1 : item.getCount());
|
|
|
+ if (item.getStartDate() != null) {
|
|
|
+ respVO.setStartTime(item.getStartDate().toString());
|
|
|
+ }
|
|
|
+ if (item.getEndDate() != null) {
|
|
|
+ respVO.setEndTime(item.getEndDate().toString());
|
|
|
+ }
|
|
|
+ respVO.setDescription(item.getRemarks());
|
|
|
+ return respVO;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- resultList.addAll(subsidyCollect);
|
|
|
+ private List<ExpenseItemRespVO> collectSubsidyItems(Long elderId, String billingMonth,
|
|
|
+ LocalDate startDate, LocalDate endDate,
|
|
|
+ boolean markUsed) {
|
|
|
+ List<ExpenseSubsidyDO> unclaimedSubsidies = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>()
|
|
|
+ .eq(ExpenseSubsidyDO::getElderId, elderId)
|
|
|
+ .eq(ExpenseSubsidyDO::getDeductionBillMonth, billingMonth)
|
|
|
+ .eq(ExpenseSubsidyDO::getStatus, BooleanEnum.FALSE.getValue()));
|
|
|
|
|
|
- // 优惠抵扣项
|
|
|
- List<ExpenseItemRespVO> discountCollect = calculateDiscountDeduction(elderId, billingMonth);
|
|
|
- resultList.addAll(discountCollect);
|
|
|
+ List<ExpenseSubsidyDO> updateList = new ArrayList<>();
|
|
|
+ List<ExpenseItemRespVO> result = unclaimedSubsidies.stream().map(subsidy -> {
|
|
|
+ ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
+ respVO.setExpenseType(7);
|
|
|
+ respVO.setExpenseSource(BusinessConstants.LONG_TERM_CARE_INSURANCE);
|
|
|
+ respVO.setSourceExpenseItemId(subsidy.getId());
|
|
|
+ respVO.setPrice(subsidy.getAmount().negate());
|
|
|
+ respVO.setTotalAmount(subsidy.getAmount().negate());
|
|
|
+ respVO.setItemName("长护险抵扣");
|
|
|
+ respVO.setItemCategory("长护险");
|
|
|
+ respVO.setCount(1);
|
|
|
+ respVO.setDescription(subsidy.getRemarks());
|
|
|
+ respVO.setStartTime(startDate.toString());
|
|
|
+ respVO.setEndTime(endDate.toString());
|
|
|
+ if (markUsed) {
|
|
|
+ subsidy.setStatus(BooleanEnum.TRUE.getValue());
|
|
|
+ updateList.add(subsidy);
|
|
|
+ }
|
|
|
+ return respVO;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
|
- return resultList;
|
|
|
+ if (markUsed && CollectionUtil.isNotEmpty(updateList)) {
|
|
|
+ expenseSubsidyMapper.updateBatch(updateList);
|
|
|
}
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<ExpenseItemRespVO> collectConsumerVoucherItems(Long elderId, String billingMonth,
|
|
|
+ LocalDate startDate, LocalDate endDate,
|
|
|
+ boolean markUsed) {
|
|
|
+ List<ElderlyConsumerVouchersDO> voucherList = elderlyConsumerVouchersMapper.selectList(new LambdaQueryWrapperX<ElderlyConsumerVouchersDO>()
|
|
|
+ .eq(ElderlyConsumerVouchersDO::getElderId, elderId)
|
|
|
+ .eq(ElderlyConsumerVouchersDO::getBillingMonth, billingMonth)
|
|
|
+ .eq(ElderlyConsumerVouchersDO::getStatus, BooleanEnum.FALSE.getValue()));
|
|
|
+
|
|
|
+ List<ElderlyConsumerVouchersDO> updateList = new ArrayList<>();
|
|
|
+ List<ExpenseItemRespVO> result = voucherList.stream().map(voucher -> {
|
|
|
+ ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
+ respVO.setExpenseType(7);
|
|
|
+ respVO.setExpenseSource(BusinessConstants.CONSUMER_VOUCHER);
|
|
|
+ respVO.setSourceExpenseItemId(voucher.getId());
|
|
|
+ respVO.setPrice(voucher.getAmount().negate());
|
|
|
+ respVO.setTotalAmount(voucher.getAmount().negate());
|
|
|
+ respVO.setItemName("消费券抵扣");
|
|
|
+ respVO.setItemCategory("消费券");
|
|
|
+ respVO.setCount(1);
|
|
|
+ respVO.setDescription(voucher.getRemarks());
|
|
|
+ respVO.setStartTime(startDate.toString());
|
|
|
+ respVO.setEndTime(endDate.toString());
|
|
|
+ if (markUsed) {
|
|
|
+ voucher.setStatus(BooleanEnum.TRUE.getValue());
|
|
|
+ updateList.add(voucher);
|
|
|
+ }
|
|
|
+ return respVO;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (markUsed && CollectionUtil.isNotEmpty(updateList)) {
|
|
|
+ elderlyConsumerVouchersMapper.updateBatch(updateList);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -2300,66 +2331,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
actualEnd = LocalDate.parse(collect.get(0).getEndTime());
|
|
|
}
|
|
|
|
|
|
- // 2、日常费用:实现对齐 queryExpenseBillItem 中无账单场景的逻辑
|
|
|
- YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
- List<DailyExpensesDO> dailyExpensesList = dailyExpensesMapper.selectList(new LambdaQueryWrapperX<DailyExpensesDO>()
|
|
|
- .eq(DailyExpensesDO::getElderId, elderId)
|
|
|
- .le(DailyExpensesDO::getAttributionBillTime, attributionBillTime.toString())
|
|
|
- .eq(DailyExpensesDO::getStatus, BooleanEnum.FALSE.getValue())
|
|
|
- .eq(DailyExpensesDO::getIsGenerateBill, BooleanEnum.FALSE.getValue()));
|
|
|
-
|
|
|
- List<ExpenseItemRespVO> dailyExpensesCollect = dailyExpensesList.stream().map(item -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(item.getType());
|
|
|
- respVO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
- respVO.setSourceExpenseItemId(item.getId());
|
|
|
- respVO.setPrice(item.getPrice());
|
|
|
- respVO.setTotalAmount(item.getAmount());
|
|
|
- respVO.setItemName(item.getItemName());
|
|
|
- respVO.setItemCategory(item.getItemCategory());
|
|
|
- respVO.setCount(item.getCount());
|
|
|
- respVO.setDescription(item.getRemarks());
|
|
|
- LocalDate localDate = item.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
|
|
- if (item.getType() == 2 || item.getType() == 3) { // 变更和外出
|
|
|
- respVO.setStartTime(item.getStartDate() == null ? null : item.getStartDate().toString());
|
|
|
- respVO.setEndTime(item.getEndDate() == null ? null : item.getEndDate().toString());
|
|
|
- } else if (item.getType() == 5) { // 分期
|
|
|
- respVO.setStartTime(localDate.toString());
|
|
|
- respVO.setEndTime(localDate.with(TemporalAdjusters.lastDayOfMonth()).toString());
|
|
|
- } else {
|
|
|
- respVO.setStartTime(item.getStartDate() == null ? null : item.getStartDate().toString());
|
|
|
- respVO.setEndTime(item.getEndDate() == null ? null : item.getEndDate().toString());
|
|
|
- }
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- // 3、长护险抵扣:参考 queryExpenseBillItem 中的实现,并复用固定费用区间
|
|
|
- List<ExpenseSubsidyDO> unclaimedSubsidies = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>()
|
|
|
- .eq(ExpenseSubsidyDO::getElderId, elderId)
|
|
|
- .eq(ExpenseSubsidyDO::getDeductionBillMonth, billingMonth)
|
|
|
- .eq(ExpenseSubsidyDO::getStatus, BooleanEnum.FALSE.getValue())); // 未抵扣状态
|
|
|
-
|
|
|
- LocalDate finalActualStart = actualStart;
|
|
|
- LocalDate finalActualEnd = actualEnd;
|
|
|
- List<ExpenseItemRespVO> subsidyCollect = unclaimedSubsidies.stream().map(subsidy -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(7); // 7表示长护险抵扣项
|
|
|
- respVO.setExpenseSource(BusinessConstants.LONG_TERM_CARE_INSURANCE); // 长护险费用来源标识
|
|
|
- respVO.setSourceExpenseItemId(subsidy.getId());
|
|
|
- respVO.setPrice(subsidy.getAmount().negate());
|
|
|
- respVO.setTotalAmount(subsidy.getAmount().negate());
|
|
|
- respVO.setItemName("长护险抵扣");
|
|
|
- respVO.setItemCategory("长护险");
|
|
|
- respVO.setCount(1);
|
|
|
- respVO.setDescription(subsidy.getRemarks());
|
|
|
- // 设置抵扣期间为实际区间(可能存在离住截断)
|
|
|
- respVO.setStartTime(finalActualStart.toString());
|
|
|
- respVO.setEndTime(finalActualEnd.toString());
|
|
|
- // 更新抵扣记录状态为已使用
|
|
|
- subsidy.setStatus(1);
|
|
|
- expenseSubsidyMapper.updateById(subsidy);
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
+ List<ExpenseItemRespVO> dailyExpensesCollect = collectDailyExpenseItemsNoBill(elderId, billingMonth);
|
|
|
+ List<ExpenseItemRespVO> subsidyCollect = collectSubsidyItems(elderId, billingMonth, actualStart, actualEnd, true);
|
|
|
+ List<ExpenseItemRespVO> consumerVoucherCollect = collectConsumerVoucherItems(elderId, billingMonth, actualStart, actualEnd, true);
|
|
|
|
|
|
// 4、优惠抵扣项:按实际区间折算金额 & 展示区间
|
|
|
List<ExpenseItemRespVO> adjustedDiscountCollect = adjustDiscountByActualRange(elderId, billingMonth, actualStart, actualEnd);
|
|
|
@@ -2368,6 +2342,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
dataList.addAll(dailyExpensesCollect);
|
|
|
dataList.addAll(adjustedDiscountCollect);
|
|
|
dataList.addAll(subsidyCollect);
|
|
|
+ dataList.addAll(consumerVoucherCollect);
|
|
|
|
|
|
// 根据长者的入住类型确定账单类型
|
|
|
// inStatusType: 1=入住(长住), 2=试住, 3=短住
|
|
|
@@ -2441,55 +2416,10 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 已经生成的获取当月未缴费的日常费用添加到账单中去
|
|
|
YearMonth attributionBillTime = YearMonth.parse(billingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
- List<DailyExpensesDO> dailyExpensesList = dailyExpensesMapper.selectList(new LambdaQueryWrapperX<DailyExpensesDO>()
|
|
|
- .eq(DailyExpensesDO::getElderId, elderId)
|
|
|
- .like(DailyExpensesDO::getAttributionBillTime, attributionBillTime)
|
|
|
- .eq(DailyExpensesDO::getStatus, BooleanEnum.FALSE.getValue())
|
|
|
- .eq(DailyExpensesDO::getIsGenerateBill, BooleanEnum.FALSE.getValue()));
|
|
|
-
|
|
|
- List<ExpenseItemRespVO> dataList = dailyExpensesList.stream().map(item -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(item.getType());
|
|
|
- respVO.setExpenseSource(BusinessConstants.DAILY_EXPENSES);
|
|
|
- respVO.setSourceExpenseItemId(item.getId());
|
|
|
- respVO.setPrice(item.getPrice());
|
|
|
- respVO.setTotalAmount(item.getAmount());
|
|
|
- respVO.setItemName(item.getItemName());
|
|
|
- respVO.setItemCategory(item.getItemCategory());
|
|
|
- respVO.setCount(item.getCount() == null ? 1 : item.getCount());
|
|
|
- respVO.setStartTime(item.getStartDate().toString());
|
|
|
- respVO.setEndTime(item.getEndDate().toString());
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- // 查询对应月份未进行抵扣的长护险记录
|
|
|
- List<ExpenseSubsidyDO> unclaimedSubsidies = expenseSubsidyMapper.selectList(new LambdaQueryWrapperX<ExpenseSubsidyDO>()
|
|
|
- .eq(ExpenseSubsidyDO::getElderId, elderId)
|
|
|
- .eq(ExpenseSubsidyDO::getDeductionBillMonth, billingMonth)
|
|
|
- .eq(ExpenseSubsidyDO::getStatus, BooleanEnum.FALSE.getValue())); // 未抵扣状态
|
|
|
-
|
|
|
- // 组装成长护险抵扣项,参考queryExpenseBillItem中的日常和月度费用格式
|
|
|
- List<ExpenseItemRespVO> subsidyCollect = unclaimedSubsidies.stream().map(subsidy -> {
|
|
|
- ExpenseItemRespVO respVO = new ExpenseItemRespVO();
|
|
|
- respVO.setExpenseType(7); // 7表示长护险抵扣项
|
|
|
- respVO.setExpenseSource(BusinessConstants.LONG_TERM_CARE_INSURANCE); // 长护险费用来源标识
|
|
|
- respVO.setSourceExpenseItemId(subsidy.getId());
|
|
|
- respVO.setPrice(subsidy.getAmount().negate());
|
|
|
- respVO.setTotalAmount(subsidy.getAmount().negate());
|
|
|
- respVO.setItemName("长护险抵扣");
|
|
|
- respVO.setItemCategory("长护险");
|
|
|
- respVO.setCount(1);
|
|
|
- respVO.setDescription(subsidy.getRemarks());
|
|
|
- // 设置抵扣期间为整个月
|
|
|
- respVO.setStartTime(attributionBillTime.atDay(1).toString());
|
|
|
- respVO.setEndTime(attributionBillTime.atEndOfMonth().toString());
|
|
|
- subsidy.setStatus(1);
|
|
|
- expenseSubsidyMapper.updateById(subsidy);
|
|
|
- return respVO;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- dataList.addAll(subsidyCollect);
|
|
|
+ List<ExpenseItemRespVO> dataList = new ArrayList<>(collectDailyExpenseItemsHasBill(elderId, billingMonth));
|
|
|
+ dataList.addAll(collectSubsidyItems(elderId, billingMonth, attributionBillTime.atDay(1), attributionBillTime.atEndOfMonth(), true));
|
|
|
+ dataList.addAll(collectConsumerVoucherItems(elderId, billingMonth, attributionBillTime.atDay(1), attributionBillTime.atEndOfMonth(), true));
|
|
|
dataList.addAll(calculateDiscountDeduction(elderId, billingMonth));
|
|
|
|
|
|
BigDecimal amount = BigDecimal.ZERO;
|