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
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 规范:
- ✅ Schema 层: 所有 Pydantic Schema 升级到 v2 语法
- ✅ Celery 任务层: 采用同步包装器 +
asyncio.run()模式 - ✅ Repository 层: 使用时区感知的时间戳
- ✅ 数据库会话: 统一使用
async_session_maker()
所有修正均遵循项目技术栈规范,确保代码质量和可维护性。