# 04 Germplasm / Seed - seed_lot_transaction 表录入说明

来源：`docs/architecture/04-germplasm-seed-data-flow.md`

## 录入目标

`seed_lot_transaction` 记录 seed lot 之间的库存流转，例如入库、出库、转移、分装、合并或消耗。它表达 from seed lot 到 to seed lot 的数量变化。

## 上下游关系

| 类型 | 内容 |
| --- | --- |
| 表 | `seed_lot_transaction` |
| Java 实体 | `SeedLotTransactionEntity` |
| 前置依赖 | `from_seed_lot`、`to_seed_lot` |
| 下游引用 | 库存追踪、库存数量更新 |
| API | `/brapi/v2/seedlots/transactions`、`/brapi/v2/seedlots/{seedLotDbId}/transactions` |

## 字段录入

| 字段 | 业务意义 | 录入方式 | 校验规则 |
| --- | --- | --- | --- |
| `id` | transaction 主键 | 系统生成；导入可指定 | 必填、唯一 |
| `auth_user_id` | 数据所属用户 | 登录上下文自动写入 | 不允许前端手填 |
| `from_seed_lot_id` | 来源 seed lot | SeedLot 选择器 | 入库场景可为空，若填需存在 |
| `to_seed_lot_id` | 目标 seed lot | SeedLot 选择器 | 出库/消耗场景可为空，若填需存在 |
| `amount` | 流转数量 | 数字输入 | 必填，正数 |
| `units` | 数量单位 | 下拉/文本 | 必填，应与批次单位一致或可换算 |
| `timestamp` | 流转时间 | 日期时间选择器 | 默认当前时间 |
| `description` | 流转说明 | 多行文本 | 可选 |

## 页面与交互

- 在 SeedLot 详情页 Transactions Tab 展示相关流转。
- 新增交易后应更新 from/to seed lot 的 amount 和 last_updated。
- 支持按时间、from/to seed lot、program、location 查询。

## 关键校验

1. `from_seed_lot_id` 和 `to_seed_lot_id` 至少填写一个。
2. `from_seed_lot_id` 不能等于 `to_seed_lot_id`。
3. 出库或转移时，来源批次数量不能被扣成负数。
4. transaction 是业务动作痕迹，原则上不允许随意物理删除。

---

**状态：已完成**（与第二章 `02-germplasm-seed/12-seed_lot_transaction.md` 共用实现，页面：`germplasm/seed-lot` → 库存交易 Tab；`germplasm/seed-lot/[seedLotDbId]` → Transactions Tab）
