# 01 Core - program 表录入说明

来源：`docs/requirements/01-core-data-entry-requirements.md`

## 录入目标

`program` 表示长期育种项目，是多个 trial、study、材料、样本和结果的聚合维度。创建 program 时必须明确所属 crop，可选负责人。

## 前置依赖和下游引用

| 类型 | 内容 |
| --- | --- |
| 表 | `program` |
| 前置依赖 | `crop`，可选 `person` |
| 下游引用 | `trial`、`study`、`location`、`crossing_project`、`seed_lot`、`plate`、`sample` |

## 页面入口

| 页面 | 录入要求 |
| --- | --- |
| Program 列表页 | 支持 crop、负责人、program_type、关键词筛选；新增、编辑、查看详情、停用 |
| Program 新增/编辑页 | 分为“基本信息”和“负责人/作物”两组 |
| Program 详情页 | Tab 展示 trial、study、location、seed lot、sample |

列表页表格字段：`name`、`abbreviation`、crop、负责人、trial 数、study 数。

## 字段录入

| 字段 | 类型 | 控件 | 录入说明 | 校验/来源 |
| --- | --- | --- | --- | --- |
| `id` | varchar(255) | 隐藏/只读 | 项目主键 | 必填、唯一 |
| `auth_user_id` | varchar(255) | 隐藏 | 数据所属用户 | 登录上下文自动写入 |
| `abbreviation` | varchar(255) | 文本框 | 项目缩写 | 可选 |
| `documentationurl` | varchar(255) | URL 输入框 | 项目文档链接 | URL 格式校验 |
| `funding_information` | varchar(255) | 多行文本 | 经费来源说明 | 可选 |
| `name` | varchar(255) | 文本框 | 项目名称 | 必填 |
| `objective` | varchar(255) | 多行文本 | 项目目标 | 可选 |
| `program_type` | integer | 下拉框 | 项目类型枚举 | 可选，按 BrAPI 枚举 |
| `crop_id` | varchar(255) | 作物选择器 | 所属作物 | 必选，来源 `crop.id` |
| `lead_person_id` | varchar(255) | 人员选择器 | 项目负责人 | 可选，来源 `person.id` |

## 校验规则

1. `name` 必填。
2. `crop_id` 必选，且必须引用已存在的 `crop.id`。
3. 选择负责人时，`lead_person_id` 必须引用已存在的 `person.id`。
4. `documentationurl` 需要做 URL 格式校验。

## 接口能力

| 接口 | 用途 |
| --- | --- |
| `GET /programs` | program 分页查询 |
| `POST /programs` | 新增 program |
| `GET /programs/{id}` | program 详情 |
| `PUT /programs/{id}` | 编辑 program |
| `DELETE /programs/{id}` | 删除或停用 program，需做引用检查 |
| `GET /programs/{id}/trials` | 查询 program 下 trial |
| `GET /programs/{id}/studies` | 查询 program 下 study |
| `GET /selectors/programs` | program 搜索下拉，参数 `keyword`、`cropId` |

## 导入导出

1. 支持通过 Core 导入流程导入 `program`。
2. 外键列支持填写 ID；可额外支持名称匹配，但名称重复时必须报错。
3. 可按 `id` 幂等更新；无 `id` 时新增。
4. 列表页支持导出当前筛选结果，导出文件应包含 ID 和展示名称。

## 删除/停用

当 `program` 已有关联 `trial`、`study`、`location`、`crossing_project`、`seed_lot`、`plate`、`sample` 时，不允许物理删除。后端需要返回引用对象类型和数量，前端展示后引导用户停用。

## 验收点

1. 创建 program 时必须选择 crop。
2. 负责人选择器只能保存已存在的 person ID。
3. Program 详情页能进入该项目下的 trial 和 study。
