|
|
@@ -592,65 +592,70 @@ public class ExpenseServiceImpl implements ExpenseService {
|
|
|
*/
|
|
|
private void reconcileCurrentMonthBillAfterAppend(Long elderId, Long tenantId, ExpenseItemDO item,
|
|
|
String targetBillingMonth, LocalDate startDate, LocalDate endDate) {
|
|
|
- ExpenseOrderDO currentOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
+ List<ExpenseOrderDO> currentOrderList = expenseOrderMapper.selectList(new LambdaQueryWrapperX<ExpenseOrderDO>()
|
|
|
.eq(ExpenseOrderDO::getElderId, elderId)
|
|
|
- .eq(ExpenseOrderDO::getBillingMonth, targetBillingMonth)
|
|
|
+ .ge(ExpenseOrderDO::getBillingMonth, targetBillingMonth)
|
|
|
.in(ExpenseOrderDO::getType, 2, 3)
|
|
|
.eq(tenantId != null, ExpenseOrderDO::getTenantId, tenantId)
|
|
|
.orderByDesc(ExpenseOrderDO::getCreatedTime)
|
|
|
.last("LIMIT 1"));
|
|
|
|
|
|
- if (currentOrder == null) {
|
|
|
+ if (currentOrderList == null) {
|
|
|
return;
|
|
|
}
|
|
|
- if (Boolean.TRUE.equals(currentOrder.getConfirmStatus()) || Boolean.TRUE.equals(currentOrder.getIsLock())) {
|
|
|
- throw exceptionCustomMsg(ErrorCodeConstants.COMMON_ERROR, "当月账单已确认或已锁定,无法自动补差");
|
|
|
- }
|
|
|
+ for (ExpenseOrderDO currentOrder : currentOrderList) {
|
|
|
+ if (Boolean.TRUE.equals(currentOrder.getConfirmStatus()) || Boolean.TRUE.equals(currentOrder.getIsLock())) {
|
|
|
+ throw exceptionCustomMsg(ErrorCodeConstants.COMMON_ERROR, "当月账单已确认或已锁定,无法自动补差");
|
|
|
+ }
|
|
|
|
|
|
- YearMonth billingYm = YearMonth.parse(targetBillingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
- LocalDate billStart = billingYm.atDay(1);
|
|
|
- LocalDate billEnd = billingYm.atEndOfMonth();
|
|
|
+ YearMonth billingYm = YearMonth.parse(targetBillingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
+ LocalDate billStart = billingYm.atDay(1);
|
|
|
+ LocalDate billEnd = billingYm.atEndOfMonth();
|
|
|
|
|
|
- LocalDate actualStart = startDate.isBefore(billStart) ? billStart : startDate;
|
|
|
- LocalDate actualEnd = endDate.isAfter(billEnd) ? billEnd : endDate;
|
|
|
- if (actualEnd.isBefore(actualStart)) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ LocalDate actualStart = startDate.isBefore(billStart) ? billStart : startDate;
|
|
|
+ LocalDate actualEnd = endDate.isAfter(billEnd) ? billEnd : endDate;
|
|
|
+ if (actualEnd.isBefore(actualStart)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- long overlapDays = ChronoUnit.DAYS.between(actualStart, actualEnd) + 1;
|
|
|
- int monthDays = billingYm.lengthOfMonth();
|
|
|
- BigDecimal dayPrice = item.getActualAmount().divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.DOWN);
|
|
|
- BigDecimal billDeltaAmount = dayPrice.multiply(BigDecimal.valueOf(overlapDays)).setScale(2, RoundingMode.HALF_UP);
|
|
|
- if (billDeltaAmount.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ long overlapDays = ChronoUnit.DAYS.between(actualStart, actualEnd) + 1;
|
|
|
+ int monthDays = billingYm.lengthOfMonth();
|
|
|
+ BigDecimal dayPrice = item.getActualAmount().divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.DOWN);
|
|
|
+ BigDecimal billDeltaAmount = item.getActualAmount();
|
|
|
+ if(currentOrder.getBillingMonth().equals(targetBillingMonth)){
|
|
|
+ billDeltaAmount = dayPrice.multiply(BigDecimal.valueOf(overlapDays)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ }
|
|
|
+ if (billDeltaAmount.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- ExpenseOrderItemDO orderItem = new ExpenseOrderItemDO();
|
|
|
- orderItem.setExpenseOrderId(currentOrder.getId());
|
|
|
- orderItem.setSourceExpenseItemId(item.getId());
|
|
|
- orderItem.setExpenseSource(BusinessConstants.EXPENSE_ITEM);
|
|
|
- orderItem.setCount((int) overlapDays);
|
|
|
- orderItem.setItemName(item.getItemName());
|
|
|
- orderItem.setItemCategoryName(item.getItemCategoryName());
|
|
|
- orderItem.setPrice(item.getAmount());
|
|
|
- orderItem.setActualPrice(dayPrice);
|
|
|
- orderItem.setTotalAmount(billDeltaAmount);
|
|
|
- orderItem.setRoundAmount(billDeltaAmount.setScale(0, RoundingMode.HALF_UP));
|
|
|
- orderItem.setRoundTwoDecimalAmount(billDeltaAmount.setScale(2, RoundingMode.HALF_UP));
|
|
|
- orderItem.setCreatedTime(new Date());
|
|
|
- orderItem.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
- orderItem.setType(item.getType());
|
|
|
- orderItem.setTenantId(tenantId);
|
|
|
- orderItem.setStartDate(actualStart);
|
|
|
- orderItem.setEndDate(actualEnd);
|
|
|
- orderItem.setDescription("固定费项补差:" + actualStart + "至" + actualEnd + ",共" + overlapDays + "天," + item.getItemName());
|
|
|
- expenseOrderItemMapper.insert(orderItem);
|
|
|
-
|
|
|
- BigDecimal billAmount = currentOrder.getActualAmount() == null ? BigDecimal.ZERO : currentOrder.getActualAmount();
|
|
|
- currentOrder.setActualAmount(billAmount.add(billDeltaAmount));
|
|
|
- currentOrder.setPayStatus(BooleanEnum.FALSE.getValue());
|
|
|
- currentOrder.setPayType(null);
|
|
|
- expenseOrderMapper.updateById(currentOrder);
|
|
|
+ ExpenseOrderItemDO orderItem = new ExpenseOrderItemDO();
|
|
|
+ orderItem.setExpenseOrderId(currentOrder.getId());
|
|
|
+ orderItem.setSourceExpenseItemId(item.getId());
|
|
|
+ orderItem.setExpenseSource(BusinessConstants.EXPENSE_ITEM);
|
|
|
+ orderItem.setCount((int) overlapDays);
|
|
|
+ orderItem.setItemName(item.getItemName());
|
|
|
+ orderItem.setItemCategoryName(item.getItemCategoryName());
|
|
|
+ orderItem.setPrice(item.getAmount());
|
|
|
+ orderItem.setActualPrice(dayPrice);
|
|
|
+ orderItem.setTotalAmount(billDeltaAmount);
|
|
|
+ orderItem.setRoundAmount(billDeltaAmount.setScale(0, RoundingMode.HALF_UP));
|
|
|
+ orderItem.setRoundTwoDecimalAmount(billDeltaAmount.setScale(2, RoundingMode.HALF_UP));
|
|
|
+ orderItem.setCreatedTime(new Date());
|
|
|
+ orderItem.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
|
|
|
+ orderItem.setType(item.getType());
|
|
|
+ orderItem.setTenantId(tenantId);
|
|
|
+ orderItem.setStartDate(actualStart);
|
|
|
+ orderItem.setEndDate(actualEnd);
|
|
|
+ orderItem.setDescription("固定费项补差:" + actualStart + "至" + actualEnd + ",共" + overlapDays + "天," + item.getItemName());
|
|
|
+ expenseOrderItemMapper.insert(orderItem);
|
|
|
+
|
|
|
+ BigDecimal billAmount = currentOrder.getActualAmount() == null ? BigDecimal.ZERO : currentOrder.getActualAmount();
|
|
|
+ currentOrder.setActualAmount(billAmount.add(billDeltaAmount));
|
|
|
+ currentOrder.setPayStatus(BooleanEnum.FALSE.getValue());
|
|
|
+ currentOrder.setPayType(null);
|
|
|
+ expenseOrderMapper.updateById(currentOrder);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|