From c6df387b1f62e273aff17f4ececa36cfb3bed338 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 6 Feb 2025 22:35:19 +0900 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8F=B7=E5=92=8C=E6=A0=B8?= =?UTF-8?q?=E9=94=80=E7=A0=81=E7=BB=9F=E4=B8=80=E7=94=9F=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/merchant_order.py | 21 +++++------------- app/api/endpoints/merchant_pay_order.py | 7 +++--- app/api/endpoints/order.py | 4 ++-- app/core/qcloud.py | 4 ++-- app/core/utils.py | 29 +++++++++++++++++++++++++ app/models/merchant_order.py | 12 ---------- app/models/merchant_pay_order.py | 10 +-------- app/models/order.py | 9 -------- 8 files changed, 42 insertions(+), 54 deletions(-) create mode 100644 app/core/utils.py diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index 01bc4bb..a8137fc 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -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,19 +57,9 @@ 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) db_order = MerchantOrderDB( diff --git a/app/api/endpoints/merchant_pay_order.py b/app/api/endpoints/merchant_pay_order.py index ff13d5b..9758649 100644 --- a/app/api/endpoints/merchant_pay_order.py +++ b/app/api/endpoints/merchant_pay_order.py @@ -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( diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index fdbf6df..656d97d 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -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 diff --git a/app/core/qcloud.py b/app/core/qcloud.py index ee8aa34..c4c8e93 100644 --- a/app/core/qcloud.py +++ b/app/core/qcloud.py @@ -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() diff --git a/app/core/utils.py b/app/core/utils.py new file mode 100644 index 0000000..6ac5900 --- /dev/null +++ b/app/core/utils.py @@ -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}" \ No newline at end of file diff --git a/app/models/merchant_order.py b/app/models/merchant_order.py index 24899fa..0ba04ed 100644 --- a/app/models/merchant_order.py +++ b/app/models/merchant_order.py @@ -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)) \ No newline at end of file diff --git a/app/models/merchant_pay_order.py b/app/models/merchant_pay_order.py index 7a2395b..450783c 100644 --- a/app/models/merchant_pay_order.py +++ b/app/models/merchant_pay_order.py @@ -48,12 +48,4 @@ class MerchantPayOrderInfo(BaseModel): merchant_image: Optional[str] = None 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}" \ No newline at end of file + from_attributes = True \ No newline at end of file diff --git a/app/models/order.py b/app/models/order.py index f1b736a..0709942 100644 --- a/app/models/order.py +++ b/app/models/order.py @@ -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