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.
 

4.5 KiB

积分服务文档规范修复

日期: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

# 示例: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 注释

修复前

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 - 应用层验证';

修复后

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 不支持

修复前

await session.execute(text("""
    COMMENT ON COLUMN credit_transactions.user_id IS '用户 ID - 应用层验证';
    COMMENT ON COLUMN credit_transactions.related_order_id IS '关联的充值订单 ID - 应用层验证';
    ...
"""))

修复后

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 的集成

参考文档