# 积分服务文档规范修复 > **日期**:2026-01-28 > **类型**:文档修复 > **影响范围**:credit-service.md --- ## 变更概述 全面修复 `credit-service.md` 文档,使其符合 Jointo 技术栈规范,从 v1.0 升级到 v2.0。 --- ## 主要变更 ### 1. 补充 Model 层定义 **问题**:文档缺少 SQLModel 模型定义 **修复**:新增 5 个模型类定义 - `CreditTransaction` - 积分流水模型 - `CreditConsumptionLog` - 积分消耗记录模型 - `CreditPackage` - 积分套餐模型 - `CreditPricing` - 积分定价配置模型 - `CreditGift` - 积分赠送记录模型 **关键特性**: - 使用 SQLModel 而非 SQLAlchemy Base - UUID v7 主键(应用层生成,`default=generate_uuid`) - 完整的 Relationship 配置(使用 `primaryjoin`) - 所有关联字段创建索引 - 禁止物理外键约束 ### 2. 添加 Relationship 配置 **问题**:缺少 Relationship 配置 **修复**:为所有关联字段添加 Relationship ```python # 示例:CreditTransaction 模型 user: Optional["User"] = Relationship( sa_relationship_kwargs={ "primaryjoin": "CreditTransaction.user_id == User.user_id", "foreign_keys": "[CreditTransaction.user_id]", } ) ``` **说明**: - 使用 `TYPE_CHECKING` 避免循环导入 - 使用 `primaryjoin` 明确指定关联条件(因为无物理外键) - 使用 `foreign_keys` 指定外键列 ### 3. 修复 CREATE TABLE 语句 **问题**:字段缺少行内 COMMENT 注释 **修复前**: ```sql CREATE TABLE credit_transactions ( transaction_id UUID PRIMARY KEY, user_id UUID NOT NULL, ... ); -- 字段注释 COMMENT ON COLUMN credit_transactions.transaction_id IS '交易唯一标识'; COMMENT ON COLUMN credit_transactions.user_id IS '用户 ID - 应用层验证'; ``` **修复后**: ```sql CREATE TABLE credit_transactions ( transaction_id UUID PRIMARY KEY COMMENT '交易唯一标识', user_id UUID NOT NULL COMMENT '用户 ID - 应用层验证', ... ); -- 表级注释 COMMENT ON TABLE credit_transactions IS '算力积分流水表 - 应用层保证引用完整性'; ``` **优势**: - 行内注释更直观 - 减少 SQL 语句数量 - 符合 PostgreSQL 最佳实践 ### 4. 修复迁移脚本 **问题**:多条 COMMENT 语句在一个 `op.execute()` 中执行,asyncpg 不支持 **修复前**: ```python await session.execute(text(""" COMMENT ON COLUMN credit_transactions.user_id IS '用户 ID - 应用层验证'; COMMENT ON COLUMN credit_transactions.related_order_id IS '关联的充值订单 ID - 应用层验证'; ... """)) ``` **修复后**: ```python comments = [ "COMMENT ON COLUMN credit_transactions.user_id IS '用户 ID - 应用层验证'", "COMMENT ON COLUMN credit_transactions.related_order_id IS '关联的充值订单 ID - 应用层验证'", ... ] for comment in comments: await session.execute(text(comment)) ``` **说明**: - asyncpg 不支持在一个 `execute()` 中执行多条 SQL 语句 - 使用循环拆分为单独执行 - 避免迁移执行失败 --- ## 规范符合度 | 检查项 | 修复前 | 修复后 | |--------|--------|--------| | 使用 SQLModel | ❌ 缺失 | ✅ 完整 | | UUID v7 主键(应用层生成) | ❌ 缺失 | ✅ 完整 | | Relationship 配置 | ❌ 缺失 | ✅ 完整 | | 禁止物理外键 | ✅ 符合 | ✅ 符合 | | 使用 AsyncSession | ✅ 符合 | ✅ 符合 | | SMALLINT + IntEnum | ✅ 符合 | ✅ 符合 | | CREATE TABLE 行内注释 | ❌ 缺失 | ✅ 完整 | | 迁移脚本拆分 COMMENT | ❌ 错误 | ✅ 修复 | | 索引完整性 | ✅ 符合 | ✅ 符合 | **总体符合度**:从 55% 提升到 100% --- ## 文件变更 ### 修改文件 - `docs/requirements/backend/04-services/user/credit-service.md` - 版本:v1.0 → v2.0 - 新增:Model 层定义(约 500 行) - 修复:CREATE TABLE 语句(5 个表) - 修复:迁移脚本(字段注释拆分) ### 新增文件 - `docs/server/changelogs/2026-01-28-credit-service-spec-compliance.md`(本文件) --- ## 后续步骤 1. **代码实现**:根据修复后的文档实现 CreditService 代码 2. **数据库迁移**:执行迁移脚本创建积分服务相关表 3. **集成测试**:验证积分服务与 AI Service、Recharge Service 的集成 --- ## 参考文档 - [数据库设计规范](../../requirements/backend/01-architecture-overview.md) - [Jointo 技术栈规范](.claude/skills/jointo-tech-stack/references/database.md) - [Alembic 迁移指南](../guides/alembic-migration-guide.md)