-- ============================================================ -- 桃育种系统 - 业务枚举字典初始化 SQL(权威单一来源,方案 B:dict_value 存英码,dict_label 显中文) -- ------------------------------------------------------------ -- 说明(2026-08-03 命名校准): -- * 线上库已存在一批「规划附录 7 标签页性状字典」(growth_vigor/fruit_shape/firmness/ -- identify_status/peach_variety_type/seed_treatment 等,英码设计,共 51 类型), -- 本文件与线上库对齐,只负责【as-built 字段】所需字典,不再重复种入已存在类型。 -- * 已确认的命名对齐(旧 bre_dict 名 → 线上权威名): -- variety_type -> peach_variety_type (线上已存在,值同) -- seed_treatment_method-> seed_treatment (线上已存在;本文件补充 层积=stratify) -- selection_result -> identify_status (选育结论用线上 6 态:未知/入选/初选/重点/保存/淘汰) -- is_preset -> 复用 sys_yes_no (是=1/否=0,与现有存储一致,不再建独立类型) -- firmness -> 线上权威值 (很软/软/中/硬/很硬,非旧「溶质」族) -- * 本文件补充的 as-built 类型(10 个):maturity_period / flowering_period / eco_type / -- row_orientation / gender / personnel_role / cross_method / tree_status / photo_type / series。 -- * dict_value = 英码(稳定键,落库用);dict_label = 中文(下拉/回显展示用)。 -- * 页面下拉经 sys_dict 取 {value:dict_value, label:dict_label},用户选中文、库存英码。 -- * Excel 导入:单元格填中文 dict_label,导入服务经 sys_dict 解析 label→value 后写库 -- (实现见 backend/app/utils/dict_util.py: DictLabelResolver,接入各 breeding 域 -- service.batch_import;存量中文值经 scripts/migrate_dict_english.py 迁移)。 -- 运行:psql -h localhost -U dpb -d dpb -f backend/sql/bre_dict.sql -- 特性:幂等可重复执行(dict_type / (dict_type,dict_value) 已存在则跳过) -- 注 :gen_random_uuid() 为 PostgreSQL 13+ 内置(本项目 PG16) -- ============================================================ -- ------------------------------------------------------------ -- 1) 字典类型(as-built 字段需要的 11 个;已存在则跳过) -- 注:peach_variety_type/firmness/seed_treatment/identify_status 线上已存在,不重复建。 -- ------------------------------------------------------------ INSERT INTO sys_dict_type (dict_name, dict_type, status, description, uuid, is_deleted, created_time, updated_time) SELECT v.dict_name, v.dict_type, 0, v.description, gen_random_uuid(), FALSE, now(), now() FROM (VALUES ('成熟期', 'maturity_period', '亲本资源-成熟期'), ('花期', 'flowering_period', '亲本资源-花期'), ('生态区类型', 'eco_type', '基地管理-生态区'), ('地块行向', 'row_orientation', '试验地块-行向'), ('人员性别', 'gender', '人员花名册-性别'), ('人员角色', 'personnel_role', '人员花名册-角色'), ('杂交方式', 'cross_method', '杂交组合-杂交方式'), ('单株状态', 'tree_status', '育种单株-状态'), ('照片类型', 'photo_type', '单株照片-类型'), ('育种系列', 'series', '育种目标-系列'), ('桃变种类型', 'peach_variety_type', '亲本资源-变种类型'), ('育种阶段', 'breeding_stage', '全流程-育种阶段(germplasm种质/parent亲本/seedling实生苗/sp初选株/ap复选株/line品系/regional_trial区试品系/released新品种)'), ('世代', 'breeding_generation', '育种-世代(F1/F2/BC1/BC2/BC3)'), ('分组类型', 'breeding_group_type', '分组管理-类型(project/family/category/temporary_set/custom)'), ('试验设计', 'breeding_design_type', '试验设计-类型(rcbd/augmented/contrast/split_plot/unreplicated)'), ('生物学状态', 'biological_status', '亲本资源-生物学状态(wild/landrace/breeding_line)'), ('保存方式', 'storage_type', '种质/种质库-保存方式(田间/离体/种子/DNA)'), ('杂交类型', 'cross_type', '杂交组合-杂交类型(杂交/自交/开放)'), ('农事操作', 'field_operation', '农事操作-操作类型(施肥/喷药/修剪/灌溉/疏果/套袋/采收)') ) AS v(dict_name, dict_type, description) WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type t WHERE t.dict_type = v.dict_type); -- ------------------------------------------------------------ -- 2) 字典数据(dict_type_id 由子查询解析;dict_value=英码, dict_label=中文) -- dict_sort 同字典内升序;首个值默认(is_default=true) -- (peach_variety_type/firmness/identify_status 线上已存在,未列入 VALUES 的不重复种) -- ------------------------------------------------------------ INSERT INTO sys_dict_data ( dict_sort, dict_label, dict_value, dict_type, dict_type_id, is_default, status, css_class, list_class, description, uuid, is_deleted, created_time, updated_time ) SELECT v.dict_sort, v.dict_label, v.dict_value, v.dict_type, t.id, v.is_default, 0, '', NULL, v.dict_label, gen_random_uuid(), FALSE, now(), now() FROM (VALUES -- 成熟期 maturity_period (1,'早','early','maturity_period',TRUE), (2,'中','mid','maturity_period',FALSE), (3,'晚','late','maturity_period',FALSE), -- 花期 flowering_period (1,'极早花','very_early','flowering_period',TRUE), (2,'早花','early','flowering_period',FALSE), (3,'中花','mid','flowering_period',FALSE), (4,'晚花','late','flowering_period',FALSE), (5,'极晚花','very_late','flowering_period',FALSE), -- 生态区类型 eco_type (1,'华北','north_china','eco_type',TRUE), (2,'西北','northwest','eco_type',FALSE), (3,'华东','east_china','eco_type',FALSE), (4,'西南','southwest','eco_type',FALSE), (5,'东北','northeast','eco_type',FALSE), (6,'华南','south_china','eco_type',FALSE), -- 地块行向 row_orientation (1,'南北行','ns','row_orientation',TRUE), (2,'东西行','ew','row_orientation',FALSE), -- 人员性别 gender (1,'男','male','gender',TRUE), (2,'女','female','gender',FALSE), -- 人员角色 personnel_role (1,'育种专家','expert','personnel_role',TRUE), (2,'技术员','technician','personnel_role',FALSE), (3,'管理员','admin','personnel_role',FALSE), -- 杂交方式 cross_method (1,'人工杂交','artificial','cross_method',TRUE), (2,'自然授粉','natural','cross_method',FALSE), (3,'回交','backcross','cross_method',FALSE), -- 单株状态 tree_status(与 selection_result 写回映射一致: -- _TREE_STATUS_BY_SELECT 写入 selected/primary/key/preserved/eliminated) (1,'存活','alive','tree_status',TRUE), (2,'淘汰','eliminated','tree_status',FALSE), (3,'入选','selected','tree_status',FALSE), (4,'初选','primary','tree_status',FALSE), (5,'核心','key','tree_status',FALSE), (6,'保留','preserved','tree_status',FALSE), -- 照片类型 photo_type (1,'全株','whole','photo_type',TRUE), (2,'果实','fruit','photo_type',FALSE), (3,'枝干','branch','photo_type',FALSE), -- 育种系列 series (1,'普通桃','common','series',TRUE), (2,'油桃','nectarine','series',FALSE), (3,'蟠桃','flat_peach','series',FALSE), (4,'油蟠桃','nectarine_flat','series',FALSE), (5,'黄肉加工桃','yellow_processing','series',FALSE), (6,'观赏桃','ornamental','series',FALSE), -- 桃变种类型 peach_variety_type(线上已存在时 NOT EXISTS 自动跳过) (1,'普通桃','common','peach_variety_type',TRUE), (2,'油桃','nectarine','peach_variety_type',FALSE), (3,'蟠桃','flat_peach','peach_variety_type',FALSE), (4,'油蟠桃','nectarine_flat','peach_variety_type',FALSE), (5,'黄肉','yellow_flesh','peach_variety_type',FALSE), -- 种子处理方法 seed_treatment(补充 层积=stratify;线上 胚培养/冷床沙藏/露地沙藏 已存在,自动跳过) (4,'层积','stratify','seed_treatment',FALSE), -- 育种阶段 breeding_stage (1,'种质','germplasm','breeding_stage',TRUE), (2,'亲本','parent','breeding_stage',FALSE), (3,'实生苗','seedling','breeding_stage',FALSE), (4,'初选株','sp','breeding_stage',FALSE), (5,'复选株','ap','breeding_stage',FALSE), (6,'品系','line','breeding_stage',FALSE), (7,'区试品系','regional_trial','breeding_stage',FALSE), (8,'新品种','released','breeding_stage',FALSE), -- 世代 breeding_generation (1,'F1','F1','breeding_generation',TRUE), (2,'F2','F2','breeding_generation',FALSE), (3,'BC1','BC1','breeding_generation',FALSE), (4,'BC2','BC2','breeding_generation',FALSE), (5,'BC3','BC3','breeding_generation',FALSE), -- 分组类型 breeding_group_type (1,'育种项目','project','breeding_group_type',TRUE), (2,'家系','family','breeding_group_type',FALSE), (3,'类目','category','breeding_group_type',FALSE), (4,'临时集','temporary_set','breeding_group_type',FALSE), (5,'自定义','custom','breeding_group_type',FALSE), -- 试验设计 breeding_design_type (1,'随机区组','rcbd','breeding_design_type',TRUE), (2,'增广设计','augmented','breeding_design_type',FALSE), (3,'对照设计','contrast','breeding_design_type',FALSE), (4,'裂区设计','split_plot','breeding_design_type',FALSE), (5,'不设重复','unreplicated','breeding_design_type',FALSE), -- 生物学状态 biological_status (1,'野生','wild','biological_status',TRUE), (2,'地方品种','landrace','biological_status',FALSE), (3,'育成品种','breeding_line','biological_status',FALSE), -- 保存方式 storage_type (1,'田间','field','storage_type',TRUE), (2,'离体','in_vitro','storage_type',FALSE), (3,'种子','seed','storage_type',FALSE), (4,'DNA','dna','storage_type',FALSE), -- 杂交类型 cross_type (1,'杂交','hybrid','cross_type',TRUE), (2,'自交','selfing','cross_type',FALSE), (3,'开放','open','cross_type',FALSE), -- 农事操作 field_operation (1,'施肥','fertilize','field_operation',TRUE), (2,'喷药','spray','field_operation',FALSE), (3,'修剪','prune','field_operation',FALSE), (4,'灌溉','irrigate','field_operation',FALSE), (5,'疏果','thinning','field_operation',FALSE), (6,'套袋','bagging','field_operation',FALSE), (7,'采收','harvest','field_operation',FALSE) ) AS v(dict_sort, dict_label, dict_value, dict_type, is_default) JOIN sys_dict_type t ON t.dict_type = v.dict_type WHERE NOT EXISTS ( SELECT 1 FROM sys_dict_data d WHERE d.dict_type = v.dict_type AND d.dict_value = v.dict_value );