From debc09877d75221d6bab9c190989ab8bf07a439e Mon Sep 17 00:00:00 2001 From: wwwwwwwww <526125649@qq.com> Date: Thu, 11 Jun 2026 14:26:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95=E5=8F=B7?= =?UTF-8?q?=E8=A7=84=E5=88=99=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=88=97=E8=A1=A8=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-admin/src/pages/AdminPaymentStats.tsx | 1 + video-gen-admin/src/types/index.ts | 2 +- video-gen-api/app/api/v1/admin.py | 8 +++++--- video-gen-api/app/utils/id_gen.py | 13 +++++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/video-gen-admin/src/pages/AdminPaymentStats.tsx b/video-gen-admin/src/pages/AdminPaymentStats.tsx index ea85bfb4..895db0b4 100644 --- a/video-gen-admin/src/pages/AdminPaymentStats.tsx +++ b/video-gen-admin/src/pages/AdminPaymentStats.tsx @@ -70,6 +70,7 @@ const AdminPaymentStats: React.FC = () => { const columns = [ { title: '订单号', dataIndex: 'orderNo', key: 'orderNo', width: 200 }, + { title: '用户', dataIndex: 'username', key: 'username', width: 120 }, { title: '支付方式', dataIndex: 'paymentMethod', key: 'paymentMethod', width: 100, render: (m: string) => { diff --git a/video-gen-admin/src/types/index.ts b/video-gen-admin/src/types/index.ts index b6a2f74d..869b85e0 100644 --- a/video-gen-admin/src/types/index.ts +++ b/video-gen-admin/src/types/index.ts @@ -128,7 +128,7 @@ export interface PaymentOrder { id: string; orderNo: string; userId: string; - user?: { username: string }; + username?: string; amount: number; credits: number; paymentMethod: string; diff --git a/video-gen-api/app/api/v1/admin.py b/video-gen-api/app/api/v1/admin.py index 29382db3..af648dc0 100644 --- a/video-gen-api/app/api/v1/admin.py +++ b/video-gen-api/app/api/v1/admin.py @@ -543,12 +543,13 @@ async def get_payment_stats( recent_filters.append(PaymentOrder.created_at < query_end) recent_result = await db.execute( - select(PaymentOrder) + select(PaymentOrder, User) + .join(User, PaymentOrder.user_id == User.id) .where(*recent_filters) .order_by(PaymentOrder.created_at.desc()) .limit(50) ) - recent = recent_result.scalars().all() + recent_data = recent_result.all() return { "by_status": by_status, @@ -565,6 +566,7 @@ async def get_payment_stats( "id": o.id, "order_no": o.order_no, "user_id": o.user_id, + "username": u.username, "amount": round(o.amount, 2), "credits": round(o.credits, 2), "payment_method": o.payment_method, @@ -573,7 +575,7 @@ async def get_payment_stats( "paid_at": _iso(o.paid_at), "created_at": _iso(o.created_at), } - for o in recent + for o, u in recent_data ], } diff --git a/video-gen-api/app/utils/id_gen.py b/video-gen-api/app/utils/id_gen.py index 57eb61d5..e6892635 100644 --- a/video-gen-api/app/utils/id_gen.py +++ b/video-gen-api/app/utils/id_gen.py @@ -1,5 +1,7 @@ import time import random +from datetime import datetime +import uuid def generate_id() -> str: @@ -10,7 +12,10 @@ def generate_id() -> str: def generate_order_no() -> str: - """Generate a human-readable order number.""" - timestamp = int(time.time()) - randomness = random.randint(1000, 9999) - return f"VG{timestamp}{randomness}" + """Generate a human-readable order number with yyyymmddhhmmss format.""" + # 格式化为 yyyymmddhhmmss 格式的时间戳 + now = datetime.now() + timestamp = now.strftime("%Y%m%d%H%M%S") + # 使用 UUID 的部分值来生成更可靠的随机数,防止并发冲突 + random_part = uuid.uuid4().hex[:8].upper() + return f"MZZC{timestamp}{random_part}"