feat(points): 新增积分赠送

This commit is contained in:
xingc
2025-05-07 22:52:09 +08:00
parent 9ce1ebbb98
commit 1fa4a7fc36
12 changed files with 254 additions and 47 deletions

View File

@@ -13,7 +13,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from core.base.schema import ProductCategory
from core.db.crud import CRUD
from core.db.engine import get_async_session
from core.db.models import User, Order, Product
from core.db.models import User, Order, Product, PointsTransaction
logger = logging.getLogger(__name__)
@@ -30,7 +30,7 @@ async def actions_after_payment(
logger.error(f'Order not found -> {order_id}')
return
product: Product = await db_crud.get(model=Product, filters={'product_id': order.product_id})
product: Product = await db_crud.get(model=Product, filters={'id': order.product_id})
if not product:
logger.warning(f'Product not found -> {order.product_id}')
return
@@ -40,30 +40,62 @@ async def actions_after_payment(
logger.warning(f'User not found -> {order.order_id}')
return
if product.action == ProductCategory.VIP:
vip_expire_date = (
user.vip_expire_date or datetime.now()
) + timedelta(days=product.number)
await db_crud.update(
model=User,
data={
'vip_expire_date': vip_expire_date.date()
},
filters={'user_id': order.user_id}
await actions_handler(db_crud, product, user)
if product.gift_id:
gift_product = await db_crud.get(
model=Product, filters={
'id': product.gift_id,
'category': ProductCategory.GIFT
}
)
elif product.action == ProductCategory.POINTS:
points = (
user.points or 0
) + product.number
await db_crud.update(
model=User,
data={
'points': points
},
filters={'user_id': order.user_id}
)
else:
logger.error(f'Unknown action -> {product.action}')
await actions_handler(db_crud, gift_product, user)
except Exception as e:
logger.error(f'Payment Actions Exception occurred -> {e}')
logger.exception(e)
logger.exception(e)
async def actions_handler(db_crud: CRUD, product: Product, user: User):
if product.action == ProductCategory.VIP:
vip_expire_date = (
user.vip_expire_date or datetime.now()
) + timedelta(days=product.number)
await db_crud.update(
model=User,
data={
'vip_expire_date': vip_expire_date.date()
},
filters={'user_id': user.user_id}
)
elif product.action == ProductCategory.POINTS:
points = (
user.points or 0
) + product.number
await db_crud.update(
model=User,
data={
'points': points
},
filters={'user_id': user.user_id}
)
if product.category.value == 'gift':
transaction_type = 3
else:
transaction_type = 1
await db_crud.update(
model=PointsTransaction,
data={
'user_id': user.user_id,
'transaction_type': transaction_type,
'points': product.number,
'product_id': product.id,
'balance': points,
'description': f'{product.name} - {product.number}'
},
filters={'id': -1}
)
else:
logger.error(f'Unknown action -> {product.action}')

View File

@@ -14,7 +14,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from core.base import schema as base_schema
from core.db.crud import CRUD
from core.db.engine import get_async_session
from core.db.models import Order
from core.db.models import Order, Product
from core.routers.auth.schema import LoginUser
from core.routers.auth.services import get_current_user_form_http
from core.utils.helper import generate_keyname, generate_order_number
@@ -55,6 +55,14 @@ async def create_order(
login_user: LoginUser = Depends(get_current_user_form_http),
db_session: AsyncSession = Depends(get_async_session),
):
db_crud = CRUD(db_session, Order)
product = await db_crud.get(model=Product, filters={'id': payload.product_id})
if product is None:
raise HTTPException(status.HTTP_404_NOT_FOUND, detail='产品不存在')
if product.number != payload.total_fee:
raise HTTPException(status.HTTP_400_BAD_REQUEST, detail='产品费用不合法')
client_ip = (
request.headers.get('X-Real-IP') or
request.headers.get('x-real-ip') or
@@ -67,7 +75,7 @@ async def create_order(
create_ip=client_ip
)
payment_params = wechat_pay_api.generate_payment_params(prepay_id)
db_crud = CRUD(db_session, Order)
order: Order = await db_crud.create(
data={
'order_id': out_trade_no,
@@ -112,7 +120,7 @@ async def wechat_notify(
# 处理支付结果
db_crud = CRUD(db_session, Order)
record = {
'out_trade_no': params['out_trade_no'],
'order_id': params['out_trade_no'],
'transaction_id': params['transaction_id']
}
if params['return_code'] == 'SUCCESS' and params['result_code'] == 'SUCCESS':

View File

@@ -21,7 +21,7 @@ class PaymentParamsOut(BaseModel):
timeStamp: str
nonceStr: str
package: str
package: str
paySign: str
signType: str