Files

304 lines
20 KiB
Markdown
Raw Permalink Normal View History

# 桃育种系统 · 模块扩展需求规格(V2 草案)
> 编制日期:2026-07-28
> 依据:通用育种软件功能清单(用户提供) + 国际成熟方案(BrAPI / BMS·Breedbase / RosBREED / MIAPPE + `doc\果树所\育种\yz.sql` 真实桃性状 + 现有 14 个 breeding 域
> 状态:**草案,待评审**。字段取值/枚举以「待确认」标注处需与业务方对齐后再落地(遵循"不确定不擅自动手"准则)。
---
## 0. 设计原则(本规格的宪法)
1. **性状与观测分离(对标 BrAPI `ObservationVariable` + `Observation`**:所有表型(含物候)走 `trait`(性状字典)+ `observation`(通用测量值),**不再把性状写死成列**。新增桃性状只加字典、不动表结构。这是与现有 `tree_evaluation` 架构最大的升级,也是统计/决策层能成立的前提。
2. **Program/Trial/Study 三层(对标 BrAPI**:把"多年多点试验"从 site/plot 里抽象出来,支持同一品系跨生态点、跨年同步试验(MET, Multi-Environment Trial)。
3. **桃语义而非大田语义**:清单里的「P/F1/F2 世代、拔节期/抽穗期、播种季节、随机区组/间比」是按一年生大田作物(玉米/小麦)写的,**对桃(多年生无性繁殖果树)必须语义替换**(见 §1)。
4. **砧木–接穗建模**:桃特有的「嫁接繁殖」维度,现有系统完全缺失,必须补齐。
5. **预留分子层**`marker`/`genotype_sample`/`genotype_call` 对齐 BrAPI `Sample`+`Calls`,未来接 GBS / PeachSNP170K 做基因组选择(GS)不改骨架。
6. **统计与决策是地基不是补丁**:上面的数据模型必须能让 V1.1 统计引擎(R `sommer`/`lme4` 做 ABLUP/EBV、选择指数)与 V3.0 AI 决策直接消费,不做"先堆数据再补分析"的短视设计。
---
## 1. 桃育种语义替换表(清单 → 桃)
| 清单原文(大田作物语境) | 桃系统应改为 | 落点 |
|---|---|---|
| P / F1 / F2 世代 | **选择阶段 stage**:杂交实生苗 → 初选株 → 复选株 → 品系 → 区试品系 → 新品种 | germplasm/tree/cross/selection 统一 `stage` |
| 拔节期 / 抽穗期 | 桃物候:萌芽 / 开花(初花·盛花) / 坐果 / 果实发育 / 成熟 / 落叶 | `observation`(物候类变量) |
| 播种季节 | 桃用**嫁接 / 定植**(砧木 + 接穗),非播种 | planting.rootstock_id |
| 自交系 | 桃为**克隆(无性繁殖)**,入选株 = 待审定克隆,需砧木关联 | germplasm.is_rootstock / tree.rootstock_id |
| 随机区组 / 间比试验 | 桃果园株数少,简化为 **区组 + 重复 + 对照**轻量设计 | trial.design_type |
| 材料编号 | accession_no(唯一 accession 编号) | germplasm.accession_no |
**stage 枚举(提案,待确认)**`germplasm_seed`(种质资源)/ `parent`(亲本)/ `seedling_pop`(杂交实生群体)/ `SP`(初选株 Single Plant/ `AP`(复选株 Advanced/ `line`(品系)/ `regional_trial`(区试品系)/ `released`(新品种)。*注:RosBREED 用 DNA-informed 多周期筛选,实际取值以业务方口径为准。*
---
## 2. 目标模块总览(共 21 个)
**A. 现有 14 域(保留 + 字段调整)**
germplasm / site / plot / target / cross_combination / pollination / seed_treatment / seedling / planting / tree / tree_evaluation / tree_photo / selection_result / personnel
**B. 新增 7 个业务模块(P0P2)**
| 模块 | 表名 | BrAPI 映射 | 优先级 |
|---|---|---|---|
| trait(性状字典) | breeding_trait | ObservationVariable | P0 地基 |
| observation(通用观测) | breeding_observation | Observation | P0 地基 |
| field_operation(农事操作) | breeding_field_operation | Event | P0 |
| trial(多年多点试验) | breeding_trial + breeding_trial_study | Trial / Study | P1 |
| group(分组/标签) | breeding_group + breeding_group_member | List | P1 |
| statistics(统计报表) | breeding_report(配置)+ 聚合端点 | — | P2 |
| 分子基因型层 | breeding_marker / breeding_genotype_sample / breeding_genotype_call | Sample / Calls / Marker | V2.0(地基先建) |
**重要简化(避免模块膨胀)**
- **物候期不单列模块** → 只是 `observation` 中「物候类变量」的观测。
- **系谱树不单列模块** → 靠 `cross_combination.parent_combination_id` 自链 + `germplasm.pedigree` 字符串 + 前端 D3 树图 + `/pedigree/{id}` 聚合端点。
---
## 3. 新模块字段规格
### 3.1 breeding_trait(性状字典,P0
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int PK | | |
| trait_code | varchar(64) | UNIQUE, NOT NULL | 如 `brix``fruit_weight``bloom_date` |
| trait_name | varchar(128) | NOT NULL | 中文名:可溶性固形物、单果重… |
| category | varchar(32) | NOT NULL | fruit/flower/plant/disease/phenology/yield/quality/rootstock |
| data_type | varchar(16) | NOT NULL | numeric / categorical / date / boolean |
| unit | varchar(32) | | g、%、°Brix、mm、date |
| method | varchar(256) | | 测定方法(如折射仪、游标卡尺) |
| scale_json | jsonb | | 量表/选项(categorical 时存选项数组;numeric 时存 min/max/step |
| is_preset | bool | default false | 是否系统内置(种子数据) |
| remark | varchar(512) | | |
| created_time / updated_time / is_deleted | 标准 | | 来自 ModelMixin |
**种子数据来源**`doc\果树所\育种\yz.sql``pa_four`(~40 字段:单果重/果形/果核/可溶性固形物/成熟期/离粘核/风味…)与物候类变量,导入为 `is_preset=true` 的桃专用性状字典。
### 3.2 breeding_observation(通用观测,P0
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int PK | | |
| unit_type | varchar(16) | NOT NULL | tree / plot / combination(观测单元类型,多态) |
| unit_id | int | NOT NULL | 对应单元 idtree_id / plot_id / combination_id |
| trait_id | int FK→breeding_trait | NOT NULL | 测了哪个性状 |
| value_numeric | numeric(12,4) | | data_type=numeric 时 |
| value_text | varchar(512) | | categorical / boolean 存此 |
| value_date | date | | data_type=date 时 |
| obs_year | int | | 观测年份(MET 聚合键) |
| obs_date | date | | 具体日期 |
| site_id | int FK→breeding_site | | 观测地点 |
| person_id | int FK→breeding_personnel | | 观测人 |
| remark | varchar(512) | | |
**索引**`(unit_type, unit_id, trait_id)` 复合索引;`(obs_year)``(trait_id)`
**语义**:单株评价、物候期、小区测定**全部走这张表**,取代 `tree_evaluation` 的硬编码列(见 §4 过渡方案)。
### 3.3 breeding_field_operation(农事操作,P0
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int PK | | |
| op_type | varchar(32) | NOT NULL | 施肥/灌溉/植保/除草/修剪/病害防治/其他 |
| unit_type | varchar(16) | NOT NULL | tree / plot |
| unit_id | int | NOT NULL | 作用对象 id |
| op_date | date | NOT NULL | 操作日期 |
| material | varchar(128) | | 药剂/肥料名 |
| dosage | varchar(64) | | 用量 |
| method | varchar(128) | | 方式(叶面/根施…) |
| operator_id | int FK→breeding_personnel | | 操作人 |
| site_id / plot_id | int FK | | 定位 |
| remark | varchar(512) | | |
**索引**`(unit_type, unit_id)``(op_date)`
### 3.4 breeding_trial + breeding_trial_study(多年多点试验,P1
**breeding_trial**
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| trial_code | varchar(64) UNIQUE | 试验编号 |
| trial_name | varchar(128) NOT NULL | |
| target_id | int FK→breeding_breeding_target | 关联育种目标 |
| design_type | varchar(32) | 随机区组/对比/间比/简约 |
| description | varchar(512) | |
| years | varchar(64) | 跨年计划,如 2026-2028 |
| remark | varchar(512) | |
**breeding_trial_study**Trial×Location×Year
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| trial_id | int FK→breeding_trial | |
| site_id | int FK→breeding_site | 试验点 |
| year | int | 年份 |
| replicate | int | 重复次数 |
| control_germplasm_id | int FK→breeding_germplasm | 对照品种 |
| layout_json | jsonb | 田间种植图(小区排布坐标) |
| remark | varchar(512) | |
> 试验单元(哪株种在哪)复用 `breeding_tree` + `plot`,通过 `trial_study` 关联;布局图由前端可视化 + 轻量排布算法生成(不照搬大田作物复杂设计)。
### 3.5 breeding_group + breeding_group_member(分组/标签,P1
**breeding_group**
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| group_name | varchar(128) NOT NULL | |
| group_type | varchar(32) | 项目/品系群/目标/临时选系集(待确认维度) |
| target_id | int FK | 关联育种目标(可选) |
| owner_team | varchar(64) | 归属团队 |
| description | varchar(512) | |
**breeding_group_member**
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| group_id | int FK→breeding_group | |
| germplasm_id | int FK→breeding_germplasm | 成员种质 |
| tree_id | int FK→breeding_tree | 或成员单株 |
| note | varchar(256) | |
> 分组维度(group_type 取值)**待确认**:按项目 / 品系群 / 育种目标 / 临时选系集。不臆造,等对齐。
### 3.6 breeding_report(统计报表配置,P2
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| report_name | varchar(128) NOT NULL | 报表名 |
| report_type | varchar(32) | 育种进度/世代汇总/杂交组合统计/材料库存/MET分析 |
| query_json | jsonb | 报表查询参数(保存配置,便于复用) |
| created_by | varchar(64) | |
**配套**:只读聚合端点(不建大表):
- `GET /breeding/statistics/progress` 育种进度
- `GET /breeding/statistics/generation-summary` 世代汇总
- `GET /breeding/statistics/cross-stats` 杂交组合统计
- `GET /breeding/statistics/inventory` 材料库存
- `GET /breeding/statistics/met` 多年多点分析(钩子,V1.1 R 引擎)
### 3.7 分子基因型层(V2.0,地基先建)
**breeding_marker**(标记/位点)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| marker_name | varchar(64) UNIQUE | 如 SNP_Chr01_123456 |
| chromosome | varchar(16) | 染色体 |
| position | int | 物理位置 |
| marker_type | varchar(16) | SSR / SNP / InDel |
| remark | varchar(512) | |
**breeding_genotype_sample**(基因型样品)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| source_type | varchar(16) | germplasm / tree |
| source_id | int | 来源 id |
| sample_type | varchar(16) | DNA / leaf |
| sample_date | date | |
| method | varchar(64) | 测序/芯片(GBS / PeachSNP170K |
| lab | varchar(128) | 检测单位 |
| remark | varchar(512) | |
**breeding_genotype_call**(基因型调用)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int PK | |
| sample_id | int FK→breeding_genotype_sample | |
| marker_id | int FK→breeding_marker | |
| allele | varchar(32) | 基因型编码(AA/AT/TT 或 0/1/2 |
| remark | varchar(256) | |
**索引**`(sample_id, marker_id)` 复合唯一。
---
## 4. 现有模块字段调整(非新增模块)
| 模块 | 新增字段 | 说明 |
|---|---|---|
| germplasm | accession_no(varchar UNIQUE)、pedigree(varchar 系谱串)、stage(varchar 选择阶段)、storage_type(varchar 田间/离体/种子/DNA)、is_rootstock(bool)、rootstock_id(int FK 自关联) | 种质档案补全 + 桃特有维度 |
| cross_combination | cross_type(varchar 杂交/自交/开放)、parent_combination_id(int 自链 FK)、reason(varchar 选配理由)、stage | 系谱链 + 选配理由 |
| pollination | bagging_date(date 套袋)、emasculation_date(date 去雄) | 田间杂交登记补全 |
| planting | rootstock_id(int FK→germplasm) | 砧木–接穗建模 |
| tree | stage(varchar 选择阶段)、rootstock_id(int FK→germplasm) | 世代/阶段标记(4.x 全流程依赖) |
| site | soil_type(varchar 土壤类型) | 试验地块补全 |
| selection_result | 对齐 stage 晋级流转(建议加 from_stage/to_stage + approved_by | 晋级审批流 |
**tree_evaluation 定位(复审定稿:混合模型)**`tree_evaluation` **保留并作为固定列「评分卡」**(承载桃稳定高频的 ~30–40 个果实质/农艺性状,源自 `yz.sql``pa_four`),这是 90% 报表与 SQL 聚合的主路径;`observation` 仅作为**扩展层**承载物候期时序观测 + 字典中标记为 `is_core=false` 的新增/临时性状。详见 §8.4。*原则修订:§0「性状与观测分离」对单作物程序过严,改为「核心性状固定列 + 扩展性状 EAV」。*
---
## 5. 统计分析与决策地基(关键要求)
用户明确要求"统计分析与决策,需要基础能够支持"。数据模型须满足:
1. **任意性状可聚合**`observation` 通用表使「按性状×年份×地点×阶段」的切片聚合无需改表——这是 ABLUP/EBV 与选择指数的输入。
2. **MET 结构就绪**`trial/trial_study` 提供 environment(地点×年) 维度,V1.1 用 `sommer`/`lme4` 做混合模型 BLUP,输出单株 EBV。
3. **选择指数可计算**`observation`(表型) + `genotype_call`(基因型) → 多维选择指数(RosBREED DNA-informed 思路),按 `stage` 分层筛选。
4. **决策支撑**`selection_result`(晋级/淘汰) + `stage` 流转 + EBV 排名 → 前端决策视图(哪些株晋级/淘汰、依据的 EBV)。
5. **溯源闭环**`tree→combination→父/母本 germplasm` + `observation/field_operation/pollination` 全 FK → 任意品系反向追溯(需求 7.1)。
---
## 6. 实施路线(建议)
| 阶段 | 内容 |
|---|---|
| 地基(先做) | trait + observation + 现有模块 stage/rootstock/accession_no/pedigree 字段;数据权限/options 沿用现有生成器 |
| P0 | field_operation |
| P1 | trial(+study)、group(+member) |
| P2 | statistics 聚合端点 |
| V2.0 | marker + genotype_sample + genotype_call(地基先建表,分析后置) |
| V1.1 | R 统计引擎接入 observation/trial 做 BLUP/EBV |
| V3.0 | AI 决策(Agno + DeepSeek)消费 EBV/选择指数 |
**工程约定**:新模块按现有 `_gen_specs.py``MOD` 规格 + 生成器产出(6 文件 + 菜单 + options),与 14 域完全一致;改字段后跑 `deploy.bat migrate``fix_breeding_columns.py`)再重启后端。
---
## 7. 待用户确认项(不臆造)
1. **stage 具体取值清单**(§1 提案为草案,以业务方口径为准)。
2. **group_type 分组维度**(项目/品系群/目标/临时选系集)。
3. **tree_evaluation 过渡策略**(同步落 observation / 弃用迁移)。
4. **trait 字典首批字段**:是否直接以 `yz.sql``pa_four` ~40 字段为种子,哪些 category 划分。
5. **design_type 试验设计类型**在桃场景下的具体取值(简化到哪几种)。
---
## 8. 复审补充:遗漏与替代思路(2026-07-28 复审)
> 本节为第一稿(§0–§7)的批判性复审结论,针对"还有哪些遗漏 / 不同思路"自省。改变范围的项标注「待拍板」。
### 8.1 原稿遗漏的关键项
1. **`generation`(遗传世代)与 `selection_stage`(选择阶段)混为一谈**:桃虽以无性选择为主,但回交转育(BC1/BC2)、自交分离(F2)仍是真实遗传世代,与"选到第几轮"是两回事。建议拆字段:`generation`F1/BC1/BC2…,跟 `cross_type` 联动)+ `selection_stage`(实生苗/初选株/复选株/品系/区试/新品种)。
2. **缺"树→种质"晋升链路(克隆生命周期)**:入选株应晋升为 clone/accessiongermplasm)被命名扩繁。需 `tree.germplasm_id`,否则基因型(测在 germplasm)与表型(测在 tree)无法在 GS 中拼接。
3. **原清单 1.4「按团队权限隔离」无 team 实体**:现有 `_build_conditions` 仅按 `created_id` 过滤,系统无 team/organization。若需多团队数据隔离,须新增 `team` 模块 + 用户-团队映射,数据权限改按 `owner_team` 隔离。【待拍板】
4. **"材料库存"被弱化成纯报表**:库存是事务性的(种子批/ lot、在圃株数、离体/DNA 管数、活力)。应加 `germplasm_stock`/`seed_lot` 表(数量、批次、位置、活力、出入库),报表只是视图。【待拍板】
5. **缺环境/气象数据(G×E 统计地基)**:多年多点分析核心是基因型×环境互作,无环境协变量(site×year 的需冷量/积温/降雨)BLUP 只能粗估。建议加 `environment_condition`site×year),可复用 `yz.sql` 的"天气"字段。
6. **分子层缺"预测模型"表(GS 反馈环断裂)**:RosBREED 是闭环(表型+基因型→训练模型→输出 EBV→指导下轮选配)。需 `breeding_prediction`(模型/性状/精度 accuracy/预测日期/被预测个体)。
7. **克隆繁殖/苗圃未建模(桃主繁殖方式)**:现有 `seedling`/`seed_treatment` 仅种子实生苗;桃入选后主要靠嫁接/芽接扩繁,缺 `propagation`(接穗来源→成活→出圃)。【待拍板】
8. **统一修改日志/审计缺失**:晋级审批、全程可追溯需"谁/何时/改了什么"轨迹,现有仅 `updated_time`。建议轻量 `breeding_audit_log`(或接系统操作日志)。
9. **小遗漏**`tree_photo` 应可关联 `observation`(某次测量的果实照片,为 CV/AI 预留);`observation` 应可挂 `trial_study_id`(区分试验观测 vs 果园日常观测);编号生成策略未定义(`accession_no`/`combination_code`/`tree_no`/`trial_code` 需统一自动编号服务)。
### 8.2 替代思路与推荐
- **A. EAV 纯通用 vs 混合固定列 → 推荐混合固定列**(详 §8.4)。理由:桃果实质性状稳定且高频(yz.sql 已验证 40 固定字段沿用多年)、报表是核心需求(固定列 SQL 聚合极快)、现有 `tree_evaluation` 已在工作——纯 EAV 会牺牲报表性能并浪费已建代码。
- **B. 分组 vs 标签 → 建议并行**:`group`(正式项目组/品系群)+ 自由 `tag`(多对多,如"抗褐腐""高Brix""区试备选")。
- **C. 直接对齐 BrAPI API(战略级)**:当前自定义 `/breeding/...`;若未来对接 Breedbase/Flapjack/国际交换,实现 BrAPI 兼容端点可省适配。数据模型已对齐 BrAPI,是铺路,不一定要现在做。
- **D. MIAPPE 合规(远期)**:若数据要共享/投稿,Investigation/Study/Assessment 三层对齐 MIAPPE 比自定 trial 抽象更标准,作一致性检查项。
### 8.3 复审后模块清单(原 21 模块基础上)
- 新增:`team`(若多团队隔离)、`germplasm_stock`/`seed_lot`(库存批次)、`environment_condition`(site×year 环境因子,统计地基)、`breeding_prediction`GS 模型/育种值,V2.0)、`propagation`(克隆扩繁/苗圃)、`breeding_audit_log`(审计)。
- 字段细化:`tree.germplasm_id` + `generation` 字段;`observation.trial_study_id``tree_photo.observation_id`;统一编号生成服务。
- 物候期仍走 `observation`(时序,非固定列);系谱树仍靠 `cross_combination.parent_combination_id` 自链 + 前端树图。
### 8.4 EAV 决策详述(对应 §4 tree_evaluation
**结论:混合固定列(Hybrid)。**
- **固定列层 = `tree_evaluation`**:承载桃稳定高频的 ~30–40 个核心果实质/农艺性状(单果重、果形、果核、可溶性固形物、成熟期、离粘核、风味、硬度…,源自 `yz.sql` `pa_four`)。一树一年一行,表单/报表直读,SQL 聚合无需 pivot。
- **EAV 扩展层 = `observation`**:仅承载①物候期时序观测(萌芽/开花/坐果/成熟,一树多期,天然时序)②`trait` 字典中 `is_core=false` 的新增/临时性状。
- **防双源规则**`trait.is_core` 标志——核心性状只存固定列,非核心只存 observation,禁止同一性状两处重复记录。
- **对统计引擎(V1.1)**:读取两者——核心性状走固定列、扩展性状走 observation,统计层归一化后做 BLUP/EBV。
- **对 GS/决策**:表型来自固定列 + observation,基因型来自 `genotype_call`,经 `tree.germplasm_id` 桥接,由 `breeding_prediction` 输出育种值。
- **代价**:新增核心性状需改表(但低频,且走 `migrate` 脚本已固化);换来报表性能与已建代码保留。对本单作物程序,此代价可接受。
---
确认后据此实施,不先行编码。