diff --git a/app.py b/app.py index abfbc8d6..c1d2c22e 100755 --- a/app.py +++ b/app.py @@ -1917,11 +1917,17 @@ def create_payment_order(): # 创建订单 try: + # 获取原价和折扣金额 + original_amount = price_result.get('original_amount', amount) + discount_amount = price_result.get('discount_amount', 0) + order = PaymentOrder( user_id=session['user_id'], plan_name=plan_name, billing_cycle=billing_cycle, - amount=amount + amount=amount, + original_amount=original_amount, + discount_amount=discount_amount ) # 添加订阅类型标记(用于前端展示) @@ -1931,12 +1937,8 @@ def create_payment_order(): if promo_code and price_result.get('promo_code'): promo_obj = PromoCode.query.filter_by(code=promo_code.upper()).first() if promo_obj: - # 注意:需要在 PaymentOrder 表中添加 promo_code_id 字段 - # 如果没有该字段,这行会报错,可以注释掉 - try: - order.promo_code_id = promo_obj.id - except: - pass # 如果表中没有该字段,跳过 + order.promo_code_id = promo_obj.id + print(f"📦 订单关联优惠码: {promo_obj.code} (ID: {promo_obj.id})") db.session.add(order) db.session.commit() @@ -2058,6 +2060,29 @@ def check_order_status(order_id): # 激活用户订阅 activate_user_subscription(order.user_id, order.plan_name, order.billing_cycle) + # 记录优惠码使用情况 + if order.promo_code_id: + try: + existing_usage = PromoCodeUsage.query.filter_by(order_id=order.id).first() + if not existing_usage: + usage = PromoCodeUsage( + promo_code_id=order.promo_code_id, + user_id=order.user_id, + order_id=order.id, + original_amount=order.original_amount or order.amount, + discount_amount=order.discount_amount or 0, + final_amount=order.amount + ) + db.session.add(usage) + promo = PromoCode.query.get(order.promo_code_id) + if promo: + promo.current_uses = (promo.current_uses or 0) + 1 + print(f"🎫 优惠码使用记录已创建: {promo.code}") + except Exception as e: + print(f"⚠️ 记录优惠码使用失败: {e}") + + db.session.commit() + return jsonify({ 'success': True, 'data': order.to_dict(), @@ -2136,24 +2161,30 @@ def force_update_order_status(order_id): activate_user_subscription(order.user_id, order.plan_name, order.billing_cycle) # 记录优惠码使用(如果使用了优惠码) - if hasattr(order, 'promo_code_id') and order.promo_code_id: + if order.promo_code_id: try: - promo_usage = PromoCodeUsage( - promo_code_id=order.promo_code_id, - user_id=order.user_id, - order_id=order.id, - original_amount=order.original_amount if hasattr(order, 'original_amount') else order.amount, - discount_amount=order.discount_amount if hasattr(order, 'discount_amount') else 0, - final_amount=order.amount - ) - db.session.add(promo_usage) + # 检查是否已经记录过(防止重复) + existing_usage = PromoCodeUsage.query.filter_by(order_id=order.id).first() + if not existing_usage: + promo_usage = PromoCodeUsage( + promo_code_id=order.promo_code_id, + user_id=order.user_id, + order_id=order.id, + original_amount=order.original_amount or order.amount, + discount_amount=order.discount_amount or 0, + final_amount=order.amount + ) + db.session.add(promo_usage) - # 更新优惠码使用次数 - promo = PromoCode.query.get(order.promo_code_id) - if promo: - promo.current_uses = (promo.current_uses or 0) + 1 + # 更新优惠码使用次数 + promo = PromoCode.query.get(order.promo_code_id) + if promo: + promo.current_uses = (promo.current_uses or 0) + 1 + print(f"🎫 优惠码使用记录已创建: {promo.code}") + else: + print(f"ℹ️ 优惠码使用记录已存在,跳过") except Exception as e: - print(f"记录优惠码使用失败: {e}") + print(f"⚠️ 记录优惠码使用失败: {e}") db.session.commit() @@ -2254,6 +2285,37 @@ def wechat_payment_callback(): else: print(f"⚠️ 订阅激活失败,但订单已标记为已支付") + # 记录优惠码使用情况 + if order.promo_code_id: + try: + # 检查是否已经记录过(防止重复) + existing_usage = PromoCodeUsage.query.filter_by( + order_id=order.id + ).first() + + if not existing_usage: + # 创建优惠码使用记录 + usage = PromoCodeUsage( + promo_code_id=order.promo_code_id, + user_id=order.user_id, + order_id=order.id, + original_amount=order.original_amount or order.amount, + discount_amount=order.discount_amount or 0, + final_amount=order.amount + ) + db.session.add(usage) + + # 更新优惠码使用次数 + promo = PromoCode.query.get(order.promo_code_id) + if promo: + promo.current_uses = (promo.current_uses or 0) + 1 + print(f"🎫 优惠码使用记录已创建: {promo.code}, 当前使用次数: {promo.current_uses}") + else: + print(f"ℹ️ 优惠码使用记录已存在,跳过") + except Exception as e: + print(f"⚠️ 记录优惠码使用失败: {e}") + # 不影响主流程,继续执行 + db.session.commit() # 返回成功响应给微信