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