ソースを参照

Merge branch 'balance_refund_money' into pre

zoujiajian 1 ヶ月 前
親
コミット
94b7d1b628

+ 18 - 25
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -2376,31 +2376,24 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
         String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
 
-        if (mixedRefund) {
-            // bxj 原记录的 outRefundNo 属于首次现金退款,不能覆盖;单独记录本次转换流水。
-            RefundOrderDon conversionRecord = new RefundOrderDon();
-            conversionRecord.setUserId(refundOrderDon.getUserId());
-            conversionRecord.setOrderId(orderId);
-            conversionRecord.setGoodsType(refundOrderDon.getGoodsType());
-            conversionRecord.setOutRefundNo(outNo);
-            conversionRecord.setGoodsId(refundOrderDon.getGoodsId());
-            conversionRecord.setSkuId(refundOrderDon.getSkuId());
-            conversionRecord.setGoodsTitle(refundOrderDon.getGoodsTitle());
-            conversionRecord.setSpecVal(refundOrderDon.getSpecVal());
-            conversionRecord.setTotalFee(refundOrderDon.getTotalFee());
-            conversionRecord.setRefundFee(refundFee);
-            conversionRecord.setRefundBalance(BigDecimal.ZERO);
-            conversionRecord.setRefundDesc("混合退款余额转现金");
-            // 现金退款流水记录实际原支付渠道,与普通现金退款记录保持一致。
-            conversionRecord.setRefundMethod(paymentType.name());
-            conversionRecord.setIsClearBalance(true);
-            conversionRecord.setOperator(refundOrderDon.getOperator());
-            conversionRecord.setChatImg(refundOrderDon.getChatImg());
-            refundOrderDonMapper.insert(conversionRecord);
-        } else {
-            refundOrderDonMapper.update(null, Wrappers.lambdaUpdate(RefundOrderDon.class)
-                    .set(RefundOrderDon::getOutRefundNo, outNo)
-                    .eq(RefundOrderDon::getId, refundOrderId));
+        // balance 和 bxj 都只更新原退款记录,保留原记录 ID 和创建时间。
+        // refund_fee 记录现金累计,refund_balance 记录转换后剩余余额。
+        BigDecimal remainingRecordBalance = refundableBalance.subtract(refundFee);
+        BigDecimal originalCash = mixedRefund
+                ? Optional.ofNullable(refundOrderDon.getRefundFee()).orElse(BigDecimal.ZERO)
+                : BigDecimal.ZERO;
+        String updatedRefundMethod = remainingRecordBalance.signum() > 0
+                ? OrderRefundReq.RefundType.bxj.name() : paymentType.name();
+        int refundUpdate = refundOrderDonMapper.update(null, Wrappers.lambdaUpdate(RefundOrderDon.class)
+                .set(RefundOrderDon::getRefundFee, originalCash.add(refundFee))
+                .set(RefundOrderDon::getRefundBalance, remainingRecordBalance)
+                .set(RefundOrderDon::getRefundMethod, updatedRefundMethod)
+                .set(RefundOrderDon::getIsClearBalance, true)
+                .set(RefundOrderDon::getOutRefundNo, outNo)
+                .set(RefundOrderDon::getUpdateTime, new Date())
+                .eq(RefundOrderDon::getId, refundOrderId));
+        if (refundUpdate != 1) {
+            throw BusinessRuntimeException.getInstance("余额转现金退款记录更新失败");
         }
     }