[M-AI-02-06] 新增 AiJobArtifact 产物关联模型 #278

Closed
opened 2026-06-19 23:30:04 +08:00 by wangdl · 1 comment
Owner

依赖

  • M-AI-02-05

目标

为 Job 和业务产物建立稳定的一对多引用,解决结果只能依赖隐式 sourceId 或单一 Result Relation 的问题。

建议字段

最终以 ADR 为准:

id
jobId
artifactType
artifactId
ordinal
metadata
createdAt

Artifact 类型

本批冻结允许值:

analysis_result
focus_item
review_card
quiz
learning_analysis
recommendation
knowledge_import

本批不允许执行者自行增加其他类型。

约束

  • Artifact 使用多态引用,不为每种业务表增加 FK;
  • 必须保留 Job FK;
  • 唯一约束:
(jobId, artifactType, artifactId)
  • 索引:
(jobId, ordinal)
(artifactType, artifactId)

Repository

只实现:

  • create;
  • createMany;
  • findByJobId;
  • findJobsByArtifact。

要求重复写入幂等。

非目标

  • 不修改现有 Workflow;
  • 不开始写 Artifact;
  • 不修改客户端;
  • 不替代 AiAnalysisResult。

验收

  • 重复创建同一 Artifact 不产生重复记录;
  • 一个 Job 可关联多个不同类型产物;
  • Artifact 查询顺序稳定;
  • 删除策略符合 ADR;
  • 真实 MySQL 集成测试通过。
## 依赖 * M-AI-02-05 ## 目标 为 Job 和业务产物建立稳定的一对多引用,解决结果只能依赖隐式 `sourceId` 或单一 Result Relation 的问题。 ## 建议字段 最终以 ADR 为准: ``` id jobId artifactType artifactId ordinal metadata createdAt ``` ## Artifact 类型 本批冻结允许值: ``` analysis_result focus_item review_card quiz learning_analysis recommendation knowledge_import ``` 本批不允许执行者自行增加其他类型。 ## 约束 * Artifact 使用多态引用,不为每种业务表增加 FK; * 必须保留 Job FK; * 唯一约束: ``` (jobId, artifactType, artifactId) ``` * 索引: ``` (jobId, ordinal) (artifactType, artifactId) ``` ## Repository 只实现: * create; * createMany; * findByJobId; * findJobsByArtifact。 要求重复写入幂等。 ## 非目标 * 不修改现有 Workflow; * 不开始写 Artifact; * 不修改客户端; * 不替代 AiAnalysisResult。 ## 验收 - 重复创建同一 Artifact 不产生重复记录; - 一个 Job 可关联多个不同类型产物; - Artifact 查询顺序稳定; - 删除策略符合 ADR; - 真实 MySQL 集成测试通过。
wangdl added this to the M-AI-02 统一 AiJob 数据库 Expand milestone 2026-06-19 23:30:04 +08:00
wangdl added the
area:database
backend
prisma
labels 2026-06-19 23:30:04 +08:00
wangdl changed title from [M-AI-02] 新增 AiJobArtifact 产物关联模型 to [M-AI-02-06] 新增 AiJobArtifact 产物关联模型 2026-06-19 23:31:04 +08:00
Author
Owner

开发完成评论

完成内容

  • 新增 AiJobArtifact 模型(7 字段,多态引用 artifactType + artifactId
  • UNIQUE(jobId, artifactType, artifactId) — 幂等保证
  • INDEX(jobId, ordinal) + INDEX(artifactType, artifactId) — 正向/反向查询
  • FK ON DELETE CASCADE — Job 删除时级联清理
  • 幂等 create():P2002 冲突时返回已有记录(不抛错)
  • 批量 createMany() + findByJobId() + findJobsByArtifact()
  • 11 个单元测试(幂等、批量、反向查询、约束检查、多类型关联)

ARTIFACT_TYPES(冻结)

analysis_result, focus_item, review_card, quiz, learning_analysis, recommendation, knowledge_import

修改文件

  • prisma/schema.prisma:新增 AiJobArtifact model + AiAnalysisJob.artifacts relation
  • prisma/migrations/20260620000003_m_ai_02_06_ai_job_artifact/migration.sql(新增)
  • src/modules/ai-runtime/ai-job-artifact.repository.ts(新增,106 行)
  • src/modules/ai-runtime/ai-job-artifact.repository.spec.ts(新增,161 行)

验证

  • 表结构:7 列,类型/default 正确
  • UNIQUE 约束:(jobId, artifactType, artifactId)
  • FK:CASCADE

测试情况

  • 单元测试:11 passed
  • 回归测试:290 passed

是否建议进入 Review

## 开发完成评论 ### 完成内容 - 新增 `AiJobArtifact` 模型(7 字段,多态引用 `artifactType` + `artifactId`) - UNIQUE(`jobId`, `artifactType`, `artifactId`) — 幂等保证 - INDEX(`jobId`, `ordinal`) + INDEX(`artifactType`, `artifactId`) — 正向/反向查询 - FK `ON DELETE CASCADE` — Job 删除时级联清理 - 幂等 `create()`:P2002 冲突时返回已有记录(不抛错) - 批量 `createMany()` + `findByJobId()` + `findJobsByArtifact()` - 11 个单元测试(幂等、批量、反向查询、约束检查、多类型关联) ### ARTIFACT_TYPES(冻结) `analysis_result`, `focus_item`, `review_card`, `quiz`, `learning_analysis`, `recommendation`, `knowledge_import` ### 修改文件 - `prisma/schema.prisma`:新增 `AiJobArtifact` model + `AiAnalysisJob.artifacts` relation - `prisma/migrations/20260620000003_m_ai_02_06_ai_job_artifact/migration.sql`(新增) - `src/modules/ai-runtime/ai-job-artifact.repository.ts`(新增,106 行) - `src/modules/ai-runtime/ai-job-artifact.repository.spec.ts`(新增,161 行) ### 验证 - 表结构:7 列,类型/default 正确 ✅ - UNIQUE 约束:`(jobId, artifactType, artifactId)` ✅ - FK:CASCADE ✅ ### 测试情况 - 单元测试:11 passed ✅ - 回归测试:290 passed ✅ ### 是否建议进入 Review - 是
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#278
No description provided.