实现dashboard服务器详情页续费功能

This commit is contained in:
jingrow 2025-07-30 00:28:15 +08:00
parent 1e9d669e8d
commit 33bd5dd87b
3 changed files with 131 additions and 63 deletions

View File

@ -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

View File

@ -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:

View File

@ -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": "支付成功",