diff --git a/dashboard/src2/components/JsiteServerRenewalDialog.vue b/dashboard/src2/components/JsiteServerRenewalDialog.vue index 920f415..3fd939e 100644 --- a/dashboard/src2/components/JsiteServerRenewalDialog.vue +++ b/dashboard/src2/components/JsiteServerRenewalDialog.vue @@ -287,14 +287,11 @@ export default { resources: { createRenewalOrder() { return { - url: 'jcloud.api.billing.create_server_renewal_order', + url: 'jcloud.api.aliyun_server_light.create_server_renew_order', validate() { if (!this.server) { throw new DashboardError('缺少服务器信息'); } - if (!this.selectedPaymentMethod) { - throw new DashboardError('请选择支付方式'); - } }, onSuccess(data) { if (!data.success) { @@ -316,10 +313,8 @@ export default { }, processBalancePayment() { return { - url: 'jcloud.api.billing.process_balance_payment_for_server_renew_order', - params: { - order_id: this.order?.order_id - }, + url: 'jcloud.api.billing.process_balance_payment_for_server_order', + params: {}, validate() { if (!this.order || !this.order.order_id) { throw new DashboardError('缺少订单信息'); @@ -333,8 +328,15 @@ export default { return; } - // 调用服务器续费API - this.$resources.renewServer.submit(); + // 支付成功,等待支付完成回调处理续费 + this.$emit('success', { + order: this.order, + renewal_period: this.selectedPeriod, + message: response.message || '支付成功' + }); + + this.isProcessingPayment = false; + this.paymentSuccess = true; }, onError(error) { this.error = error.message || '余额支付处理失败'; @@ -345,9 +347,7 @@ export default { processAlipayPayment() { return { url: 'jcloud.api.billing.process_alipay_order', - params: { - order_id: this.order?.order_id - }, + params: {}, validate() { if (!this.order || !this.order.order_id) { throw new DashboardError('缺少订单信息'); @@ -371,9 +371,7 @@ export default { processWechatPayment() { return { url: 'jcloud.api.billing.process_wechatpay_order', - params: { - order_id: this.order?.order_id - }, + params: {}, validate() { if (!this.order || !this.order.order_id) { throw new DashboardError('缺少订单信息'); @@ -395,9 +393,7 @@ export default { checkPaymentStatus() { return { url: 'jcloud.api.billing.check_order_payment_status', - params: { - order_id: this.order?.order_id - }, + params: {}, validate() { if (!this.order || !this.order.order_id) { throw new DashboardError('缺少订单信息'); @@ -408,43 +404,15 @@ export default { // 支付成功,停止轮询 this.stopPaymentCheck(); - // 调用服务器续费API - this.$resources.renewServer.submit(); - } - } - }; - }, - renewServer() { - return { - url: 'jcloud.api.aliyun_server_light.renew_aliyun_instance', - params: { - instance_id: this.serverInfo?.instance_id, - period: this.selectedPeriod, - region_id: this.serverInfo?.region - }, - validate() { - if (!this.serverInfo?.instance_id || !this.serverInfo?.region) { - throw new DashboardError('缺少服务器信息'); - } - }, - onSuccess(response) { - if (response.message?.success) { + // 支付成功,等待支付完成回调处理续费 this.$emit('success', { order: this.order, renewal_period: this.selectedPeriod, - message: response.message.message + message: '支付成功' }); - this.isProcessingPayment = false; this.paymentSuccess = true; - } else { - this.error = response.message?.message || '续费失败'; - this.isProcessingPayment = false; } - }, - onError(error) { - this.error = error.message || '服务器续费失败'; - this.isProcessingPayment = false; } }; } @@ -455,16 +423,10 @@ export default { this.show = false; }, createRenewalOrder() { - if (!this.selectedPaymentMethod) { - this.error = '请选择支付方式'; - return; - } - this.error = null; this.$resources.createRenewalOrder.submit({ server: this.server, - renewal_months: this.selectedPeriod, - payment_method: this.selectedPaymentMethod + renewal_months: this.selectedPeriod }); }, processPayment() { @@ -478,18 +440,26 @@ export default { } if (this.selectedPaymentMethod === 'balance') { - this.$resources.processBalancePayment.submit(); + this.$resources.processBalancePayment.submit({ + order_id: this.order.order_id + }); } else if (this.selectedPaymentMethod === 'alipay') { - this.$resources.processAlipayPayment.submit(); + this.$resources.processAlipayPayment.submit({ + order_id: this.order.order_id + }); } else if (this.selectedPaymentMethod === 'wechatpay') { - this.$resources.processWechatPayment.submit(); + this.$resources.processWechatPayment.submit({ + order_id: this.order.order_id + }); } }, startPaymentCheck() { this.isProcessingPayment = false; this.checkInterval = setInterval(() => { - this.$resources.checkPaymentStatus.submit(); + this.$resources.checkPaymentStatus.submit({ + order_id: this.order.order_id + }); }, 3000); // 15分钟后停止检查 diff --git a/jcloud/api/aliyun_server_light.py b/jcloud/api/aliyun_server_light.py index f7ab0db..1bf7fac 100644 --- a/jcloud/api/aliyun_server_light.py +++ b/jcloud/api/aliyun_server_light.py @@ -809,6 +809,101 @@ def create_server_order(**kwargs): jingrow.log_error("创建服务器订单失败", str(e)) return {"success": False, "message": str(e)} +@jingrow.whitelist() +def create_server_renew_order(**kwargs): + """创建服务器续费订单""" + try: + server = kwargs.get('server') + renewal_months = kwargs.get('renewal_months', 1) + + if not server: + jingrow.throw("缺少服务器信息") + + # 验证输入 + server_pg = jingrow.get_pg("Jsite Server", server) + if not server_pg: + jingrow.throw("服务器不存在") + + team = server_pg.team + + # 验证当前用户权限 + current_team = get_current_team(True) + if current_team.name != team: + jingrow.throw("您没有权限为此服务器创建续费订单") + + # 计算续费金额 + renewal_months = int(renewal_months) + plan_price = server_pg.plan_price or 0 + total_amount = plan_price * renewal_months + + # 生成唯一订单号 + order_id = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3] + ''.join(random.choices('0123456789', k=6)) + + # 创建订单记录 + order = jingrow.get_pg({ + "pagetype": "Order", + "order_id": order_id, + "order_type": "服务器续费", + "team": team, + "status": "待支付", + "total_amount": total_amount, + "title": server_pg.instance_id, + "description": str(renewal_months) # 存储续费月数 + }) + + order.insert(ignore_permissions=True) + jingrow.db.commit() + + return { + "success": True, + "order": order.as_dict() + } + except Exception as e: + jingrow.log_error("续费订单错误", f"创建续费订单失败: {str(e)}") + return { + "success": False, + "message": f"创建续费订单失败: {str(e)}" + } + +def renew_server(order_name): + """支付成功后异步续费服务器""" + try: + order = jingrow.get_pg("Order", order_name) + if not order: + raise Exception("订单不存在") + + # 从订单中获取信息 + instance_id = order.title # 实例ID + renewal_months = int(order.description) # 续费月数 + + # 查找服务器记录获取区域信息 + server = jingrow.get_pg("Jsite Server", {"instance_id": instance_id}) + if not server: + raise Exception("找不到对应的服务器记录") + + # 调用阿里云API续费 + manager = _get_manager() + result = manager.renew_instance(instance_id, renewal_months, server.region) + + if not result or not result.get('success'): + raise Exception(f"阿里云续费失败: {result.get('message', '未知错误')}") + + # 更新服务器到期时间 + server.end_date = jingrow.utils.add_months(server.end_date or jingrow.utils.nowdate(), renewal_months) + server.save(ignore_permissions=True) + + # 更新订单状态 + order.status = "交易成功" + order.save(ignore_permissions=True) + + jingrow.db.commit() + + return True + + except Exception as e: + jingrow.log_error("服务器续费失败", f"订单 {order_name}: {str(e)}") + raise e + def create_aliyun_server(order_name): """异步创建服务器""" try: diff --git a/jcloud/api/billing.py b/jcloud/api/billing.py index 958b102..bbab3b8 100644 --- a/jcloud/api/billing.py +++ b/jcloud/api/billing.py @@ -1089,6 +1089,9 @@ def handle_order_payment_complete(order_id): process_balance_recharge(order) elif order.order_type == "网站续费": process_site_renew(order_id) + elif order.order_type == "服务器续费": + # 异步续费服务器 + jingrow.enqueue('jcloud.api.aliyun_server_light.renew_server', order_name=order.name) elif order.order_type == "新建服务器": # 异步创建服务器 jingrow.enqueue('jcloud.api.aliyun_server_light.create_aliyun_server', order_name=order.name) @@ -1621,9 +1624,9 @@ def process_balance_payment_for_server_order(order_id): order.save(ignore_permissions=True) jingrow.db.commit() - # 异步执行服务器创建 - jingrow.enqueue('jcloud.api.aliyun_server_light.create_aliyun_server', order_name=order.name) - jingrow.log_error("异步执行创建服务器", f"订单ID: {order_id}") + # 支付成功后,调用订单完成处理函数 + handle_order_payment_complete(order_id) + return { "status": "Success", "message": "支付成功",