更新Jsite Server字段,新建服务器时点击确认创建后同时创建支付订单和Jsite Server记录

This commit is contained in:
jingrow 2025-07-27 22:29:04 +08:00
parent 207190822f
commit e9f327af93
4 changed files with 79 additions and 56 deletions

View File

@ -136,10 +136,10 @@
</div> </div>
<h3 class="text-xl font-medium text-gray-900 mb-2">支付成功</h3> <h3 class="text-xl font-medium text-gray-900 mb-2">支付成功</h3>
<p class="text-gray-600 mb-4"> <p class="text-gray-600 mb-4">
您的订单已支付成功服务器正在创建中创建并启动需要 3-5 分钟请耐心等待 您的订单已支付成功服务器记录已创建服务器正在后台创建中创建并启动需要 3-5 分钟请耐心等待
</p> </p>
<p class="text-gray-500 text-sm"> <p class="text-gray-500 text-sm">
创建完成后将收到通知可以在服务器列表中查看状态 您可以在服务器列表中查看服务器状态创建完成后状态将更新为"Running"
</p> </p>
</div> </div>
@ -267,6 +267,7 @@ export default {
success: false, success: false,
// //
order: null, order: null,
server: null, //
showPaymentProcessing: false, showPaymentProcessing: false,
paymentSuccess: false, paymentSuccess: false,
isProcessingPayment: false, isProcessingPayment: false,
@ -400,9 +401,11 @@ export default {
console.log('订单创建成功,完整响应:', data); console.log('订单创建成功,完整响应:', data);
console.log('订单ID:', data.order?.order_id); console.log('订单ID:', data.order?.order_id);
console.log('服务器记录:', data.server);
// //
this.order = data.order; this.order = data.order;
this.server = data.server; //
this.showPaymentProcessing = true; this.showPaymentProcessing = true;
// //
@ -436,7 +439,13 @@ export default {
...(response.order || {}), ...(response.order || {}),
status: '已支付' status: '已支付'
}; };
this.$emit('success', orderData);
//
const serverData = {
...this.server
};
this.$emit('success', { order: orderData, server: serverData });
this.isProcessingPayment = false; this.isProcessingPayment = false;
this.paymentSuccess = true; this.paymentSuccess = true;
@ -511,7 +520,13 @@ export default {
this.stopPaymentCheck(); this.stopPaymentCheck();
const orderData = { ...this.order, ...(data.order || {}) }; const orderData = { ...this.order, ...(data.order || {}) };
this.$emit('success', orderData);
//
const serverData = {
...this.server
};
this.$emit('success', { order: orderData, server: serverData });
this.paymentSuccess = true; this.paymentSuccess = true;
} }

View File

@ -411,7 +411,7 @@ def create_server_order(**kwargs):
import random import random
order_id = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3] + ''.join(random.choices('0123456789', k=6)) order_id = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3] + ''.join(random.choices('0123456789', k=6))
# 创建订单 # 创建订单记录
order = jingrow.get_pg({ order = jingrow.get_pg({
"pagetype": "Order", "pagetype": "Order",
"order_id": order_id, "order_id": order_id,
@ -420,20 +420,28 @@ def create_server_order(**kwargs):
"status": "待支付", "status": "待支付",
"total_amount": total_amount, "total_amount": total_amount,
"title": f"{region_id}", "title": f"{region_id}",
"description": f"{selected_plan.get('core')}核/{selected_plan.get('memory')}GB/{selected_plan.get('disk_size')}GB, {period}个月", "description": f"{selected_plan.get('core')}核/{selected_plan.get('memory')}GB/{selected_plan.get('disk_size')}GB, {period}个月"
"server_config": {
"plan_id": plan_id,
"image_id": image_id,
"period": period,
"region_id": region_id,
"monthly_price": monthly_price
}
}) })
order.insert(ignore_permissions=True) order.insert(ignore_permissions=True)
# 创建服务器记录
server = jingrow.get_pg({
"pagetype": "Jsite Server",
"team": team.name,
"status": "Pending",
"region": region_id,
"system_image": image_id,
"end_date": jingrow.utils.add_months(jingrow.utils.nowdate(), period),
"title": f"{region_id} - {selected_plan.get('core')}核/{selected_plan.get('memory')}GB",
"planid": plan_id,
"period": period,
"order_id": order_id
})
server.insert(ignore_permissions=True)
jingrow.db.commit() jingrow.db.commit()
return {"success": True, "order": order.as_dict()} return {"success": True, "order": order.as_dict(), "server": server.as_dict()}
except Exception as e: except Exception as e:
jingrow.log_error("创建服务器订单失败", str(e)) jingrow.log_error("创建服务器订单失败", str(e))
@ -446,12 +454,16 @@ def create_server_async(order_name):
if not order: if not order:
raise Exception("订单不存在") raise Exception("订单不存在")
# 获取配置 # 查找对应的服务器记录通过订单ID
config = order.server_config or {} server = jingrow.get_pg("Jsite Server", {"order_id": order.order_id})
plan_id = config.get('plan_id') if not server:
image_id = config.get('image_id') raise Exception("找不到对应的服务器记录")
period = config.get('period', 1)
region_id = config.get('region_id', 'cn-shanghai') # 从服务器记录中获取配置信息
region_id = server.region or 'cn-shanghai'
image_id = server.system_image or 'e9363571cf2444aba422b17470285465'
plan_id = server.planid or 'swas.s.c2m1s30b1.linux'
period = server.period or 1
# 调用阿里云API创建实例 # 调用阿里云API创建实例
result = create_aliyun_instance(plan_id, image_id, period, region_id) result = create_aliyun_instance(plan_id, image_id, period, region_id)
@ -461,30 +473,13 @@ def create_server_async(order_name):
instance_id = result['data']['instance_id'] instance_id = result['data']['instance_id']
# 创建服务器记录 # 更新服务器记录状态
server = jingrow.get_pg({ server.status = "Active"
"pagetype": "Jsite Server", server.instance_id = instance_id
"instance_id": instance_id, server.save(ignore_permissions=True)
"team": order.team,
"order": order.name,
"status": "Running",
"region_id": region_id,
"plan_id": plan_id,
"image_id": image_id,
"period": period,
"monthly_price": config.get('monthly_price', 0),
"total_amount": order.total_amount,
"payment_method": order.payment_method,
"created_at": jingrow.utils.now(),
"expires_at": jingrow.utils.add_months(jingrow.utils.nowdate(), period)
})
server.insert(ignore_permissions=True)
# 更新订单状态 # 更新订单状态
order.status = "交易成功" order.status = "交易成功"
order.instance_id = instance_id
order.server_record = server.name
order.save(ignore_permissions=True) order.save(ignore_permissions=True)
jingrow.db.commit() jingrow.db.commit()
@ -493,9 +488,4 @@ def create_server_async(order_name):
except Exception as e: except Exception as e:
jingrow.log_error("服务器创建失败", f"订单 {order_name}: {str(e)}") jingrow.log_error("服务器创建失败", f"订单 {order_name}: {str(e)}")
# 更新订单状态为失败
try:
jingrow.db.set_value("Order", order_name, "status", "创建失败")
except:
pass
raise e raise e

View File

@ -9,19 +9,21 @@
"team", "team",
"column_break_4", "column_break_4",
"status", "status",
"plan", "order_id",
"server_section", "server_section",
"instance_id", "instance_id",
"cpu", "cpu",
"disk_size", "disk_size",
"region", "region",
"system_image", "system_image",
"planid",
"column_break_aliyun", "column_break_aliyun",
"end_date", "end_date",
"memory", "memory",
"bandwidth", "bandwidth",
"ip", "ip",
"running_status", "running_status",
"period",
"ssh_section", "ssh_section",
"ssh_user", "ssh_user",
"ssh_port", "ssh_port",
@ -55,12 +57,6 @@
"label": "团队", "label": "团队",
"options": "Team" "options": "Team"
}, },
{
"fieldname": "plan",
"fieldtype": "Link",
"label": "计划",
"options": "Server Plan"
},
{ {
"fetch_from": "virtual_machine.public_ip_address", "fetch_from": "virtual_machine.public_ip_address",
"fieldname": "ip", "fieldname": "ip",
@ -166,11 +162,31 @@
"in_list_view": 1, "in_list_view": 1,
"label": "运行状态", "label": "运行状态",
"read_only": 1 "read_only": 1
},
{
"fieldname": "order_id",
"fieldtype": "Data",
"label": "订单ID",
"read_only": 1
},
{
"fieldname": "planid",
"fieldtype": "Data",
"hidden": 1,
"label": "套餐ID",
"read_only": 1
},
{
"fieldname": "period",
"fieldtype": "Int",
"hidden": 1,
"label": "购买时长(月)",
"read_only": 1
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2025-07-26 13:27:00.795541", "modified": "2025-07-27 22:04:39.820405",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Jcloud", "module": "Jcloud",
"name": "Jsite Server", "name": "Jsite Server",

View File

@ -21,7 +21,9 @@ class JsiteServer(Document):
instance_id: DF.Data | None instance_id: DF.Data | None
ip: DF.Data | None ip: DF.Data | None
memory: DF.Data | None memory: DF.Data | None
plan: DF.Link | None order_id: DF.Data | None
period: DF.Int
planid: DF.Data | None
region: DF.Data | None region: DF.Data | None
root_public_key: DF.Code | None root_public_key: DF.Code | None
running_status: DF.Data | None running_status: DF.Data | None