订单号和核销码统一生成。
This commit is contained in:
parent
2cb3cc85b8
commit
c6df387b1f
@ -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)
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
29
app/core/utils.py
Normal 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}"
|
||||
@ -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))
|
||||
@ -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}"
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user