# 01 Core - crop 表录入说明

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

## 录入目标

`crop` 记录项目涉及的作物范围，是 Core 上下文的起点。后续 program、trial、study、germplasm、observation_variable、genome_map 等数据都需要回到作物维度筛选和解释。

## 前置依赖和下游引用

| 类型 | 内容 |
| --- | --- |
| 表 | `crop` |
| 前置依赖 | 无 |
| 下游引用 | `program`、`location`、`trial`、`study`、`germplasm`、`observation_variable`、`genome_map` |

## 页面入口

| 页面 | 录入要求 |
| --- | --- |
| Crop 列表页 | 支持关键词查询、新增、编辑、查看详情、停用 |
| Crop 新增/编辑页 | 轻量表单，重点录入作物名称 |
| Crop 详情页 | 展示该作物下的项目、试验、研究、种质、图谱入口 |

列表页表格字段：`crop_name`、下游 program 数、下游 study 数、状态。

## 字段录入

| 字段 | 类型 | 控件 | 录入说明 | 校验/来源 |
| --- | --- | --- | --- | --- |
| `id` | varchar(255) | 隐藏/只读 | 作物主键，新增时系统生成，也可导入时指定 | 必填、唯一 |
| `auth_user_id` | varchar(255) | 隐藏 | 数据所属用户 | 登录上下文自动写入 |
| `crop_name` | varchar(255) | 文本框 | 作物名称，用于所有下拉选择展示 | 必填、建议唯一 |

## 校验规则

1. `crop_name` 必填。
2. `crop_name` 建议唯一，新增和编辑时需要做重复提示。
3. 已被下游引用的作物不能物理删除，只能停用或提示引用关系。

## 接口能力

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

## 导入导出

1. 支持通过 Core 导入流程导入 `crop`。
2. 模板列名使用数据库字段名。
3. 可按 `id` 幂等更新；无 `id` 时新增。
4. 列表页支持导出当前筛选结果，导出文件应包含 ID 和展示名称。

## 删除/停用

当 `crop` 已被 `program`、`location`、`trial`、`study`、`germplasm`、`observation_variable`、`genome_map` 引用时，不允许物理删除。后端需要返回引用对象类型和数量，前端弹窗展示后引导用户停用。

## 验收点

1. Crop 列表页支持分页、关键词搜索和基础筛选。
2. 外键选择器展示作物名称，提交保存 `crop.id`。
3. 被引用的 crop 删除失败时，前端展示引用详情。
