订单号和核销码统一生成。

This commit is contained in:
aaron 2025-02-06 22:35:19 +09:00
parent 2cb3cc85b8
commit c6df387b1f
8 changed files with 42 additions and 54 deletions

View File

@ -6,8 +6,6 @@ from app.models.merchant_order import (
MerchantOrderDB, MerchantOrderDB,
MerchantOrderCreate, MerchantOrderCreate,
MerchantOrderInfo, MerchantOrderInfo,
generate_order_id,
generate_verify_code,
MerchantOrderStatus MerchantOrderStatus
) )
from app.models.merchant_product import MerchantProductDB from app.models.merchant_product import MerchantProductDB
@ -22,6 +20,7 @@ from app.core.account import AccountManager
from app.core.wechat import WeChatClient from app.core.wechat import WeChatClient
from pydantic import BaseModel from pydantic import BaseModel
from app.core.config import settings from app.core.config import settings
from app.core.utils import CommonUtils
router = APIRouter() router = APIRouter()
@ -40,7 +39,7 @@ async def create_merchant_order(
return error_response(code=404, message="商品不存在") return error_response(code=404, message="商品不存在")
# 检查限购 # 检查限购
if product.purchase_limit: if product.purchase_limit and product.purchase_limit > 0:
# 查询用户已购买数量 # 查询用户已购买数量
purchased_count = db.query(func.count(MerchantOrderDB.id)).filter( purchased_count = db.query(func.count(MerchantOrderDB.id)).filter(
MerchantOrderDB.user_id == current_user.userid, MerchantOrderDB.user_id == current_user.userid,
@ -58,18 +57,8 @@ async def create_merchant_order(
message=f"该商品限购{product.purchase_limit}次,您已达到限购次数" message=f"该商品限购{product.purchase_limit}次,您已达到限购次数"
) )
order_id = CommonUtils.generate_order_id('M')
verify_code = CommonUtils.generate_verify_code()
# 生成订单号和核销码
while True:
order_id = generate_order_id()
verify_code = generate_verify_code()
exists = db.query(MerchantOrderDB).filter(
(MerchantOrderDB.order_id == order_id) |
(MerchantOrderDB.order_verify_code == verify_code)
).first()
if not exists:
break
# 创建订单 # 创建订单
pay_amount = float(product.sale_price) pay_amount = float(product.sale_price)

View File

@ -5,9 +5,7 @@ from app.models.merchant_pay_order import (
MerchantPayOrderDB, MerchantPayOrderDB,
MerchantPayOrderCreate, MerchantPayOrderCreate,
MerchantPayOrderInfo, MerchantPayOrderInfo,
MerchantPayOrderStatus, MerchantPayOrderStatus)
generate_pay_order_id
)
from app.models.merchant import MerchantDB from app.models.merchant import MerchantDB
from app.models.database import get_db from app.models.database import get_db
from app.api.deps import get_current_user, get_admin_user from app.api.deps import get_current_user, get_admin_user
@ -16,6 +14,7 @@ from app.core.response import success_response, error_response, ResponseModel
from datetime import datetime, timezone from datetime import datetime, timezone
from app.core.config import settings from app.core.config import settings
from pydantic import BaseModel from pydantic import BaseModel
from app.core.utils import CommonUtils
router = APIRouter() router = APIRouter()
@ -59,7 +58,7 @@ async def create_pay_order(
return error_response(code=404, message="商家不存在") return error_response(code=404, message="商家不存在")
# 生成订单号 # 生成订单号
order_id = generate_pay_order_id() order_id = CommonUtils.generate_order_id('P')
# 创建订单 # 创建订单
db_order = MerchantPayOrderDB( db_order = MerchantPayOrderDB(

View File

@ -8,7 +8,6 @@ from app.models.order import (
OrderCreate, OrderCreate,
OrderInfo, OrderInfo,
OrderPackageInfo, OrderPackageInfo,
generate_order_id,
OrderPriceCalculateRequest, OrderPriceCalculateRequest,
OrderPriceInfo, OrderPriceInfo,
OrderStatus, OrderStatus,
@ -29,6 +28,7 @@ from app.models.community import CommunityDB
from app.models.community_building import CommunityBuildingDB from app.models.community_building import CommunityBuildingDB
from app.models.station import StationDB from app.models.station import StationDB
from app.models.point import PointRecordDB, PointRecordType from app.models.point import PointRecordDB, PointRecordType
from app.core.utils import CommonUtils
router = APIRouter() router = APIRouter()
@ -126,7 +126,7 @@ async def create_shipping_order(
price_info = price_result.price_info price_info = price_result.price_info
# 生成订单号 # 生成订单号
orderid = generate_order_id() orderid = CommonUtils.generate_order_id('D')
# 计算原始金额 # 计算原始金额
original_amount = price_info.original_amount original_amount = price_info.original_amount

View File

@ -65,7 +65,7 @@ class QCloudManager:
) )
self.cos_client = CosS3Client(config) self.cos_client = CosS3Client(config)
def generate_verify_code(self, length: int = 6) -> str: def generate_phone_code(self, length: int = 6) -> str:
"""生成验证码""" """生成验证码"""
return ''.join(random.choices(string.digits, k=length)) return ''.join(random.choices(string.digits, k=length))
@ -86,7 +86,7 @@ class QCloudManager:
self._init_sms_client() self._init_sms_client()
# 生成验证码 # 生成验证码
code = self.generate_verify_code() code = self.generate_phone_code()
# 构建请求 # 构建请求
req = sms_models.SendSmsRequest() req = sms_models.SendSmsRequest()

29
app/core/utils.py Normal file
View File

@ -0,0 +1,29 @@
from datetime import datetime
import time
class CommonUtils:
"""订单工具类"""
@staticmethod
def generate_order_id(prefix: str) -> str:
"""
生成订单号
:param prefix: 订单前缀 M(商品订单)P(支付订单)D(配送订单)
:return: 15位订单号前缀(1) + 日期(8) + 时间戳(6)
"""
now = datetime.now()
date_str = now.strftime('%Y%m%d')
# 取时间戳后6位
timestamp = str(int(time.time() * 1000))[-6:]
return f"{prefix}{date_str}{timestamp}"
@staticmethod
def generate_verify_code() -> str:
"""
生成核销码
:return: 16位数字核销码日期(8) + 时间戳(8)
"""
now = datetime.now()
date_str = now.strftime('%Y%m%d')
timestamp = str(int(time.time() * 1000))[-8:]
return f"{date_str}{timestamp}"

View File

@ -61,15 +61,3 @@ class MerchantOrderInfo(BaseModel):
class Config: class Config:
from_attributes = True from_attributes = True
def generate_order_id() -> str:
"""生成订单号8位日期 + 7位时间戳"""
now = datetime.now()
date_str = now.strftime('%Y%m%d')
# 取时间戳后7位
timestamp = str(int(time.time() * 1000))[-7:]
return f"M{date_str}{timestamp}"
def generate_verify_code() -> str:
"""生成21位数字核销码"""
return ''.join(random.choices('0123456789', k=21))

View File

@ -49,11 +49,3 @@ class MerchantPayOrderInfo(BaseModel):
class Config: class Config:
from_attributes = True from_attributes = True
def generate_pay_order_id() -> str:
"""生成支付订单号P + 8位日期 + 7位时间戳"""
now = datetime.now()
date_str = now.strftime('%Y%m%d')
# 取时间戳后7位
timestamp = str(int(time.time() * 1000))[-7:]
return f"P{date_str}{timestamp}"

View File

@ -111,15 +111,6 @@ class OrderPackageInfo(BaseModel):
class Config: class Config:
from_attributes = True from_attributes = True
def generate_order_id() -> str:
"""生成订单号:日期+时间戳"""
now = datetime.now()
# 生成8位日期 + 6位序号共14位
date_str = now.strftime('%Y%m%d') # 8位日期
# 生成6位序号毫秒级时间戳后6位
timestamp = str(int(now.timestamp() * 1000))[-6:]
return f"D{date_str}{timestamp}"
class OrderPriceInfo(BaseModel): class OrderPriceInfo(BaseModel):
package_count: int package_count: int
original_amount: float original_amount: float