Browse Source

feat: 订单创建时余额不足时直接生成通联支付订单链接

- 修改 OrderService.create 方法,当用户余额不足时,不再直接返回错误
- 计算差额(火花数)并创建通联充值订单链接
- 在 DepositService.createTLDepositOrder 中添加重载方法,支持传入额外信息
  - shortageAmount: 缺少的金额
  - currentBalance: 当前余额
  - requiredAmount: 需要的总金额
  - message: 自定义消息
- 添加内部异常类 ChargeRequiredException 用于处理余额不足的场景
- 返回码统一使用 MyRet.CODE_NO_MONEY 表示余额不足

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
skyfffire 3 ngày trước cách đây
mục cha
commit
15669fb805

+ 21 - 1
src/main/java/modules/deposit/DepositService.java

@@ -2,7 +2,6 @@ package modules.deposit;
 
 import com.alibaba.fastjson.JSON;
 import com.jfinal.plugin.activerecord.Db;
-import com.jfinal.plugin.activerecord.Record;
 import common.model.Deposit;
 import common.model.User;
 import common.model.BalanceLog;
@@ -27,6 +26,21 @@ public class DepositService {
      * @return 充值结果,包含支付链接和订单号
      */
     public MyRet createTLDepositOrder(Integer amount, Long userId) {
+        return createTLDepositOrder(amount, userId, null, null, null, null);
+    }
+
+    /**
+     * 创建通联充值订单(带有额外信息)
+     *
+     * @param amount 充值金额(分)
+     * @param userId 用户ID
+     * @param shortageAmount 缺少的金额(火花)
+     * @param currentBalance 当前余额(火花)
+     * @param requiredAmount 需要的总金额(火花)
+     * @param message 自定义消息
+     * @return 充值结果,包含支付链接和订单号
+     */
+    public MyRet createTLDepositOrder(Integer amount, Long userId, Float shortageAmount, Float currentBalance, Float requiredAmount, String message) {
         try {
             // 生成通联订单号
             String tlOrderNo = "DLTBH_TL_" + System.currentTimeMillis() + "_" + userId;
@@ -70,6 +84,12 @@ public class DepositService {
                 resultData.put("tl_order_no", tlOrderNo);
                 resultData.put("amount", amount);
 
+                // 添加额外信息
+                if (shortageAmount != null) resultData.put("shortage_amount", shortageAmount);
+                if (currentBalance != null) resultData.put("current_balance", currentBalance);
+                if (requiredAmount != null) resultData.put("required_amount", requiredAmount);
+                if (message != null) resultData.put("message", message);
+
                 return MyRet.ok("通联支付订单创建成功").setData(resultData);
             } else {
                 return MyRet.fail("通联支付订单创建失败:充值记录入库失败");

+ 31 - 2
src/main/java/modules/order/OrderService.java

@@ -11,6 +11,7 @@ import common.model.OrderLog;
 import common.model.User;
 import common.utils.http.MyRet;
 import modules.nftt.NfttService;
+import modules.deposit.DepositService;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -21,6 +22,9 @@ import java.util.stream.Collectors;
 public class OrderService {
     @Inject
     NfttService nfttService;
+
+    @Inject
+    DepositService depositService;
     
     public String hello() {
         return "Hello order";
@@ -45,10 +49,13 @@ public class OrderService {
                 float unitPrice = item.getFloat("price");
                 float totalPrice = unitPrice * quantity;
 
-                // 判断用户余额并预扣
+                // 判断用户余额
                 User user = User.dao.findById(userId);
                 if (user.getBalance() < totalPrice) {
-                    throw new RuntimeException("余额不足,请充值。需要: " + totalPrice + ",你有:" + user.getBalance());
+                    // 余额不足,计算差额并创建通联充值订单
+                    float shortageAmount = totalPrice - user.getBalance();
+                    int chargeAmount = (int) (shortageAmount * 100); // 1火花=1分钱,转换为分
+                    throw new ChargeRequiredException(chargeAmount, shortageAmount, user.getBalance(), totalPrice);
                 }
                 user.setBalance(user.getBalance() - totalPrice);
                 if (!user.update()) {
@@ -114,6 +121,10 @@ public class OrderService {
             });
 
             return MyRet.ok(orderType == 1 ? "抢购成功" : "预购成功");
+        } catch (ChargeRequiredException e) {
+            // 余额不足,创建通联充值订单
+            String message = "余额不足,请先完成充值。需要: " + e.requiredAmount + " 火花,你有:" + e.currentBalance + " 火花,还需充值: " + e.shortageAmount + " 火花";
+            return depositService.createTLDepositOrder(e.chargeAmount, userId, e.shortageAmount, e.currentBalance, e.requiredAmount, message).setCode(MyRet.CODE_NO_MONEY);
         } catch (Exception e) {
             return MyRet.fail(e.getMessage());
         }
@@ -473,4 +484,22 @@ public class OrderService {
     public static String generateOrderSn() {
         return System.currentTimeMillis() + "" + (int)(Math.random() * 10000);
     }
+
+    /**
+     * 余额不足异常,用于触发创建充值订单
+     */
+    private static class ChargeRequiredException extends RuntimeException {
+        int chargeAmount;           // 需要充值的金额(分)
+        float shortageAmount;       // 缺少的金额(火花)
+        float currentBalance;       // 当前余额(火花)
+        float requiredAmount;       // 需要的总金额(火花)
+
+        ChargeRequiredException(int chargeAmount, float shortageAmount, float currentBalance, float requiredAmount) {
+            super("余额不足,需要充值");
+            this.chargeAmount = chargeAmount;
+            this.shortageAmount = shortageAmount;
+            this.currentBalance = currentBalance;
+            this.requiredAmount = requiredAmount;
+        }
+    }
 }