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

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,
MerchantOrderCreate,
MerchantOrderInfo,
generate_order_id,
generate_verify_code,
MerchantOrderStatus
)
from app.models.merchant_product import MerchantProductDB
@ -22,6 +20,7 @@ from app.core.account import AccountManager
from app.core.wechat import WeChatClient
from pydantic import BaseModel
from app.core.config import settings
from app.core.utils import CommonUtils
router = APIRouter()
@ -40,7 +39,7 @@ async def create_merchant_order(
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(
MerchantOrderDB.user_id == current_user.userid,
@ -58,18 +57,8 @@ async def create_merchant_order(
message=f"该商品限购{product.purchase_limit}次,您已达到限购次数"
)
# 生成订单号和核销码
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
order_id = CommonUtils.generate_order_id('M')
verify_code = CommonUtils.generate_verify_code()
# 创建订单
pay_amount = float(product.sale_price)

View File

@ -5,9 +5,7 @@ from app.models.merchant_pay_order import (
MerchantPayOrderDB,
MerchantPayOrderCreate,
MerchantPayOrderInfo,
MerchantPayOrderStatus,
generate_pay_order_id
)
MerchantPayOrderStatus)
from app.models.merchant import MerchantDB
from app.models.database import get_db
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 app.core.config import settings
from pydantic import BaseModel
from app.core.utils import CommonUtils
router = APIRouter()
@ -59,7 +58,7 @@ async def create_pay_order(
return error_response(code=404, message="商家不存在")
# 生成订单号
order_id = generate_pay_order_id()
order_id = CommonUtils.generate_order_id('P')
# 创建订单
db_order = MerchantPayOrderDB(

View File

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

View File

@ -65,7 +65,7 @@ class QCloudManager:
)
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))
@ -86,7 +86,7 @@ class QCloudManager:
self._init_sms_client()
# 生成验证码
code = self.generate_verify_code()
code = self.generate_phone_code()
# 构建请求
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:
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:
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:
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):
package_count: int
original_amount: float