From 207190822f3243133d964c24e526d555f8aed8f6 Mon Sep 17 00:00:00 2001 From: jingrow Date: Sun, 27 Jul 2025 20:45:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E6=97=B6=E4=BD=99=E9=A2=9D=E6=94=AF=E4=BB=98=E6=94=B9=E6=88=90?= =?UTF-8?q?=E4=BD=BF=E7=94=A8process=5Fbalance=5Fpayment=5Ffor=5Fserver=5F?= =?UTF-8?q?order=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/src2/pages/NewJsiteServer.vue | 2 +- jcloud/api/billing.py | 72 ++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/dashboard/src2/pages/NewJsiteServer.vue b/dashboard/src2/pages/NewJsiteServer.vue index f903dcb..402ec48 100644 --- a/dashboard/src2/pages/NewJsiteServer.vue +++ b/dashboard/src2/pages/NewJsiteServer.vue @@ -417,7 +417,7 @@ export default { // 处理余额支付 processBalancePayment() { return { - url: 'jcloud.api.billing.process_balance_payment_for_order', + url: 'jcloud.api.billing.process_balance_payment_for_server_order', validate() { if (!this.order || !this.order.order_id) { throw new DashboardError('缺少订单信息'); diff --git a/jcloud/api/billing.py b/jcloud/api/billing.py index 1b6468e..5a8c97d 100644 --- a/jcloud/api/billing.py +++ b/jcloud/api/billing.py @@ -1089,7 +1089,7 @@ def handle_order_payment_complete(order_id): process_balance_recharge(order) elif order.order_type == "网站续费": process_site_renew(order_id) - elif order.order_type == "Jsite Server": + elif order.order_type == "新建服务器": # 异步创建服务器 jingrow.enqueue('jcloud.api.aliyun_server_light.create_server_async', order_name=order.name) @@ -1568,6 +1568,76 @@ def process_balance_payment_for_renew_order(order_id): "message": _(f"余额支付失败: {str(e)}") } +@jingrow.whitelist() +def process_balance_payment_for_server_order(order_id): + """使用账户余额支付订单""" + try: + # 获取当前用户团队 + team = get_current_team(True) + + # 获取订单信息 + order = jingrow.get_pg("Order", {"order_id": order_id}) + if not order: + jingrow.throw(f"找不到订单: {order_id}") + + # 验证订单是否属于当前团队 + if order.team != team.name: + jingrow.throw("您没有权限支付此订单") + + # 检查订单状态 + if order.status != "待支付": + return { + "success": False, + "message": "该订单已支付或已取消" + } + + # 使用 Team 类的 get_balance 方法获取余额 + balance = team.get_balance() + + # 检查余额是否足够 + if balance < order.total_amount: + return { + "success": False, + "message": "余额不足" + } + + # 创建余额交易记录(扣款) + balance_transaction = jingrow.get_pg({ + "pagetype": "Balance Transaction", + "team": team.name, + "type": "Adjustment", + "source": "Prepaid Credits", + "amount": -1 * float(order.total_amount), # 使用负数表示扣减 + "description": f"{order.order_type}-{order.title}", + "paid_via_local_pg": 1 + }) + balance_transaction.flags.ignore_permissions = True + balance_transaction.insert() + balance_transaction.submit() + + # 更新订单状态 + order.status = "已支付" + order.payment_method = "余额支付" + order.save(ignore_permissions=True) + jingrow.db.commit() + + # 异步执行服务器创建 + jingrow.enqueue('jcloud.api.aliyun_server_light.create_server_async', order_name=order.name) + jingrow.log_error("异步执行创建服务器", f"订单ID: {order_id}") + return { + "status": "Success", + "message": "支付成功", + "order": order.as_dict() + } + + except Exception as e: + jingrow.log_error("支付错误", f"余额支付失败: {str(e)}") + return { + "status": "Error", + "message": f"余额支付失败: {str(e)}" + } + + @jingrow.whitelist() def process_alipay_order(order_id): """创建支付宝订单支付链接"""