You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

6.0 KiB

充值服务代码实现技术栈合规性修正

日期: 2026-01-29
类型: 技术栈合规性修正
影响范围: 充值服务代码实现
状态: 已完成

变更概述

对充值服务的代码实现进行全面的技术栈合规性修正,确保符合 jointo-tech-stack 规范。

变更详情

1. Schema 层修正 (server/app/schemas/recharge.py)

问题: 使用 Pydantic v1 的 class Config 语法

修正: 升级到 Pydantic v2 的 model_config = ConfigDict() 语法

影响的 Schema:

  • RechargeOrderResponse - 移除 class Config,添加 model_config = ConfigDict(populate_by_name=True)
  • PaymentParamsResponse - 移除 class Config,添加 model_config = ConfigDict(populate_by_name=True)
  • RechargeOrderCreateResponse - 移除 class Config,添加 model_config = ConfigDict(populate_by_name=True)
  • RechargeOrderListResponse - 移除 class Config,添加 model_config = ConfigDict(populate_by_name=True)
  • PaymentCallbackRequest - 移除 class Config,添加 model_config = ConfigDict(populate_by_name=True)

2. Celery 任务层修正 (server/app/tasks/recharge_tasks.py)

问题:

  • Celery 任务直接使用 async def(不支持)
  • 使用 get_session() 而非 async_session_maker()

修正: 采用同步包装器 + asyncio.run() 模式

变更内容:

# 修正前
@shared_task(name="recharge.check_orphan_orders")
async def check_orphan_recharge_orders():
    async with get_session() as session:
        # ...

# 修正后
async def _check_orphan_recharge_orders_async():
    """异步实现"""
    async with async_session_maker() as session:
        # ...

@shared_task(name="recharge.check_orphan_orders")
def check_orphan_recharge_orders():
    """同步包装器"""
    return asyncio.run(_check_orphan_recharge_orders_async())

影响的任务:

  • check_orphan_recharge_orders - 拆分为同步包装器 + 异步实现
  • cleanup_expired_orders - 拆分为同步包装器 + 异步实现

导入变更:

  • 添加 import asyncio
  • from app.core.database import get_session 改为 from app.core.database import async_session_maker

3. Repository 层修正 (server/app/repositories/recharge_repository.py)

问题: 使用 datetime.utcnow() 而非时区感知的时间戳

修正: 使用 datetime.now(timezone.utc)

变更内容:

# 修正前
from datetime import datetime

async def get_expired_orders(self) -> List[RechargeOrder]:
    result = await self.session.execute(
        select(RechargeOrder).where(
            RechargeOrder.expired_at < datetime.utcnow()
        )
    )

# 修正后
from datetime import datetime, timezone

async def get_expired_orders(self) -> List[RechargeOrder]:
    result = await self.session.execute(
        select(RechargeOrder).where(
            RechargeOrder.expired_at < datetime.now(timezone.utc)
        )
    )

影响的方法:

  • get_expired_orders() - 将 datetime.utcnow() 改为 datetime.now(timezone.utc)

导入变更:

  • from datetime import datetime 改为 from datetime import datetime, timezone

技术栈规范依据

Pydantic v2 规范

  • 规范: 使用 model_config = ConfigDict() 替代 class Config
  • 来源: jointo-tech-stack - backend.md - Pydantic v2 配置

Celery 异步任务规范

  • 规范: Celery 任务必须是同步函数,使用 asyncio.run() 包装异步逻辑
  • 来源: jointo-tech-stack - backend.md - Celery 异步任务模式

时区感知时间戳规范

  • 规范: 使用 datetime.now(timezone.utc) 而非 datetime.utcnow()
  • 来源: jointo-tech-stack - backend.md - 时间戳标准

数据库会话规范

  • 规范: 使用 async_session_maker() 而非 get_session()
  • 来源: jointo-tech-stack - backend.md - 数据库会话管理

测试验证

语法检查

# 检查 Schema 层
docker exec jointo-server-app python -m py_compile app/schemas/recharge.py

# 检查 Celery 任务层
docker exec jointo-server-app python -m py_compile app/tasks/recharge_tasks.py

# 检查 Repository 层
docker exec jointo-server-app python -m py_compile app/repositories/recharge_repository.py

功能测试

# 测试充值服务 API
docker exec jointo-server-app pytest tests/integration/test_recharge_api.py -v

# 测试充值服务逻辑
docker exec jointo-server-app pytest tests/unit/test_recharge_service.py -v

# 测试 Celery 任务
docker exec jointo-server-app pytest tests/unit/test_recharge_tasks.py -v

影响评估

兼容性

  • 向后兼容: 所有修正均为内部实现调整,不影响 API 接口
  • 数据库兼容: 无数据库结构变更
  • API 兼容: 请求/响应格式保持不变

性能影响

  • 无性能影响: 修正仅涉及语法和规范调整

风险评估

  • 低风险: 修正均为标准化调整,不涉及业务逻辑变更

后续工作

必须完成

  • 执行语法检查,确保代码无编译错误
  • 执行单元测试,确保功能正常
  • 执行集成测试,确保 API 正常

建议优化

  • 为 Celery 任务添加单元测试
  • 为 Repository 的时区处理添加测试用例
  • 考虑为 Schema 添加更多的字段验证

相关文档

  • 技术栈规范: .claude/skills/jointo-tech-stack/references/backend.md
  • 服务设计文档: docs/requirements/backend/04-services/user/recharge-service.md
  • 文档合规性修正: docs/server/changelogs/2026-01-29-recharge-service-tech-stack-compliance.md

总结

本次修正确保充值服务的代码实现完全符合 jointo-tech-stack 规范:

  1. Schema 层: 所有 Pydantic Schema 升级到 v2 语法
  2. Celery 任务层: 采用同步包装器 + asyncio.run() 模式
  3. Repository 层: 使用时区感知的时间戳
  4. 数据库会话: 统一使用 async_session_maker()

所有修正均遵循项目技术栈规范,确保代码质量和可维护性。