ソースを参照

BUGFIX
1、解决单个生成账单长护险和消费券金额取反的问题

liangwenxuan 9 時間 前
コミット
ecf85d3d90

+ 38 - 6
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -923,8 +923,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             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.setPrice(subsidy.getAmount());
+            respVO.setTotalAmount(subsidy.getAmount());
             respVO.setItemName("长护险抵扣");
             respVO.setItemCategory("长护险");
             respVO.setCount(1);
@@ -958,8 +958,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             respVO.setExpenseType(7);
             respVO.setExpenseSource(BusinessConstants.CONSUMER_VOUCHER);
             respVO.setSourceExpenseItemId(voucher.getId());
-            respVO.setPrice(voucher.getAmount().negate());
-            respVO.setTotalAmount(voucher.getAmount().negate());
+            respVO.setPrice(voucher.getAmount());
+            respVO.setTotalAmount(voucher.getAmount());
             respVO.setItemName("消费券抵扣");
             respVO.setItemCategory("消费券");
             respVO.setCount(1);
@@ -1068,6 +1068,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
 
 
     @Override
+    @Transactional
     public void generateExpenseBill(ExpenseOrderSaveVO saveVO) {
         // 获取长者信息,用于判断入住类型
         ElderlyInfoDO elderlyInfo = elderlyInfoMapper.selectById(saveVO.getElderId());
@@ -1104,7 +1105,7 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
             // 单个处理时校验账单是否已缴费
             isExpenseOrderPay(dbExpenseOrder);
         }
-
+        List<ExpenseOrderItemDO> preHandleConsumerVouchers = new ArrayList<>();
         if (dbExpenseOrder == null) {
             //当前月份不存在账单,生成新的账单
             ExpenseOrderDO expenseOrder = new ExpenseOrderDO();
@@ -1147,6 +1148,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                 if (item.getExpenseSource().equals(BusinessConstants.DISCOUNT_DEDUCTION)) {
                     addDiscountRecord(saveVO.getElderId(), saveVO.getBillingMonth(), item);
                 }
+                if(item.getExpenseSource().equals(BusinessConstants.CONSUMER_VOUCHER)){
+                    preHandleConsumerVouchers.add(orderItem);
+                }
                 //判断是否生成过账单(用于标记那些生成账单后再生成的费用项)
                 DailyExpensesDO dailyExpenses = dailyExpensesMapper.selectById(item.getSourceExpenseItemId());
                 if (dailyExpenses != null) {
@@ -1163,6 +1167,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
 
                 totalAmount = totalAmount.add(orderItem.getTotalAmount().setScale(2, RoundingMode.DOWN));
             }
+            // 消费券处理
+            updateElderlyConsumerVouchers(preHandleConsumerVouchers,expenseOrder.getBillOrderNumber());
             expenseOrder.setActualAmount(totalAmount);
             expenseOrderMapper.updateById(expenseOrder);
         } else {
@@ -1208,6 +1214,8 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                     expenseSubsidyMapper.updateById(expenseSubsidyDO);
                 }
             }
+            // 消费券处理
+            updateElderlyConsumerVouchers(preHandleConsumerVouchers,dbExpenseOrder.getBillOrderNumber());
             dbExpenseOrder.setPayStatus(BooleanEnum.FALSE.getValue());
 //            dbExpenseOrder.setPayableAmount(amount); //更新总金额
             dbExpenseOrder.setActualAmount(dbExpenseOrder.getActualAmount().add(amount));
@@ -2793,7 +2801,6 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         // 3. 删除账单明细项
         List<ExpenseOrderItemDO> orderItems = expenseOrderItemMapper.selectList(
                 new LambdaQueryWrapperX<ExpenseOrderItemDO>().eq(ExpenseOrderItemDO::getExpenseOrderId, id));
-
         for (ExpenseOrderItemDO orderItem : orderItems) {
             // 4. 如果是日常费用,需要更新日常费用状态
             if (BusinessConstants.DAILY_EXPENSES.equals(orderItem.getExpenseSource())) {
@@ -2821,8 +2828,20 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                         .setStatus(BooleanEnum.FALSE.getValue()),
                 new LambdaUpdateWrapper<ExpenseSubsidyDO>()
                         .eq(ExpenseSubsidyDO::getElderId, expenseOrder.getElderId())
+                        .eq(ExpenseSubsidyDO::getOrderNumber,expenseOrder.getBillOrderNumber())
                         .eq(ExpenseSubsidyDO::getDeductionBillMonth, expenseOrder.getBillingMonth())
                         .eq(ExpenseSubsidyDO::getTenantId, TenantContextHolder.getTenantId()));
+        // 消费券更新为未抵扣状态
+        LambdaUpdateWrapper<ElderlyConsumerVouchersDO> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(ElderlyConsumerVouchersDO::getElderId, expenseOrder.getElderId())
+                .eq(ElderlyConsumerVouchersDO::getOrderId, expenseOrder.getId())
+                .eq(ElderlyConsumerVouchersDO::getBillingMonth, expenseOrder.getBillingMonth())
+                .eq(ElderlyConsumerVouchersDO::getTenantId, TenantContextHolder.getTenantId())
+                .set(ElderlyConsumerVouchersDO::getStatus, BooleanEnum.FALSE.getValue())
+                .set(ElderlyConsumerVouchersDO::getOrderId, null)
+                .set(ElderlyConsumerVouchersDO::getOrderNumber, null);
+        elderlyConsumerVouchersMapper.update(null, wrapper);
+
         // 5. 删除主账单
         expenseOrderMapper.deleteById(id);
     }
@@ -3904,4 +3923,17 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
 
         return adjustedDiscountCollect;
     }
+
+    private void updateElderlyConsumerVouchers(List<ExpenseOrderItemDO> list,String orderNumber){
+        List<ElderlyConsumerVouchersDO> vouchersDOList = new ArrayList<>();
+        for (ExpenseOrderItemDO item : list) {
+            ElderlyConsumerVouchersDO vouchersDO = new ElderlyConsumerVouchersDO();
+            vouchersDO.setId(item.getSourceExpenseItemId());
+            vouchersDO.setStatus(BooleanEnum.TRUE.getValue());
+            vouchersDO.setOrderId(item.getExpenseOrderId());
+            vouchersDO.setOrderNumber(orderNumber);
+            vouchersDOList.add(vouchersDO);
+        }
+        elderlyConsumerVouchersMapper.updateBatch(vouchersDOList);
+    }
 }