-- ============================================================
-- 桃育种业务流完善·产量构成/果实品质/物候/生长量/描述性状 trait 种子（2026-08-05）
-- 背景：全量盘点发现 bre_trait 字典缺产量构成（单株产量/好果率）、品质（SS%/酸/固酸比）、
--       物候（仅 first_flower_date 一条）、生长量（主干周/树高/冠幅）——真实桃育种
--       品比/丰产性评价与 EBV 选种目标都依赖这些数值性状；
--       另补描述性 categorical 性状（离核/果皮底色/着色类型）供种质级观测（bre_observation EAV）使用。
-- 设计：统计引擎(_trait_meta_map)仅消费 data_type='numeric' 且 into_ebv='1' 的性状；
--       · 产量构成/品质/生长量 numeric + into_ebv='1' 进 EBV/指数（direction 按育种目标）
--       · 物候 data_type='date' + into_ebv='0'（不参与统计，作物候历）
--       · 描述性状 data_type='text' + into_ebv='0'（categorical，走 EAV text 观测）
-- 幂等：trait_code 冲突则更新（不动 uuid/created_time），同 bre_trait_seed.sql 惯例。
--       avg_fruit_weight/fruit_shape/pubescence 已存在，仅在 DO UPDATE 刷新数值范围（不改 category）。
-- ============================================================

INSERT INTO bre_trait
    (trait_code, trait_name, category, data_type, unit, is_core, scale_json, uuid, is_deleted, created_time,
     direction, into_ebv, default_h2, valid_min, valid_max, stage, method)
VALUES
-- ① 产量构成（numeric，越高越好）--------------------------------
('single_tree_yield',  '单株产量',   '产量构成', 'numeric', 'kg', '1', NULL, md5(random()::text||'single_tree_yield'),  false, now(), 'desc', '1', 0.3, 0, 200,   'evaluation', '单株采收产量（kg/株），丰产性核心'),
('fruit_number',       '果实个数',   '产量构成', 'numeric', '个', '1', NULL, md5(random()::text||'fruit_number'),       false, now(), 'desc', '1', 0.3, 0, 5000,  'evaluation', '单株采收果实个数'),
('marketable_rate',    '好果率',     '产量构成', 'numeric', '%',  '1', NULL, md5(random()::text||'marketable_rate'),    false, now(), 'desc', '1', 0.4, 0, 100,   'evaluation', '商品果率（%），分级后商品果占比'),
('fruit_crack_rate',   '裂果率',     '产量构成', 'numeric', '%',  '1', NULL, md5(random()::text||'fruit_crack_rate'),   false, now(), 'asc',  '1', 0.3, 0, 100,   'evaluation', '裂果率（%），越低越好'),
-- ② 果实品质（numeric，SS 高优/酸低优/固酸比高优）----------------
('ss_content',         '可溶性固形物', '果实品质', 'numeric', '%', '1', NULL, md5(random()::text||'ss_content'),       false, now(), 'desc', '1', 0.5, 0, 35,    'evaluation', '可溶性固形物含量（SS%，折光仪测定），核心风味指标'),
('titratable_acid',    '可滴定酸',    '果实品质', 'numeric', '%', '1', NULL, md5(random()::text||'titratable_acid'),   false, now(), 'asc',  '1', 0.4, 0, 3,     'evaluation', '可滴定酸含量（%，中和滴定），过高味酸'),
('ss_acid_ratio',      '固酸比',      '果实品质', 'numeric', '',   '1', NULL, md5(random()::text||'ss_acid_ratio'),     false, now(), 'desc', '1', 0.4, 5, 50,    'evaluation', '固酸比（SS/酸），风味协调性综合指标'),
-- ③ 物候（date，不参与统计，作物候历/育种排期）-------------------
('full_bloom_date',    '盛花期',     '物候',     'date',    '',   '0', NULL, md5(random()::text||'full_bloom_date'),    false, now(), 'asc',  '0', NULL, NULL, NULL, 'evaluation', '盛花期（整株 75% 花开放日期），花期避霜排期关键'),
('fruit_maturity_date','果实成熟期', '物候',     'date',    '',   '0', NULL, md5(random()::text||'fruit_maturity_date'), false, now(), 'asc',  '0', NULL, NULL, NULL, 'evaluation', '果实成熟期（采收起始日期），早熟性核心'),
('leaf_fall_date',     '落叶期',     '物候',     'date',    '',   '0', NULL, md5(random()::text||'leaf_fall_date'),     false, now(), 'asc',  '0', NULL, NULL, NULL, 'evaluation', '落叶期（株叶 75% 脱落日期）'),
-- ④ 生长量（numeric，树势）--------------------------------------
('trunk_circumference','主干周长',   '生长量',   'numeric', 'cm', '0', NULL, md5(random()::text||'trunk_circumference'), false, now(), 'desc', '0', NULL, 0, 500,   'evaluation', '距地面 20cm 处主干周长（cm），树势指标'),
('tree_height',        '树高',       '生长量',   'numeric', 'm',  '0', NULL, md5(random()::text||'tree_height'),       false, now(), 'desc', '0', NULL, 0, 20,    'evaluation', '树高（m）'),
('crown_width',        '冠幅',       '生长量',   'numeric', 'm',  '0', NULL, md5(random()::text||'crown_width'),       false, now(), 'desc', '0', NULL, 0, 20,    'evaluation', '冠幅（东西+南北均值，m）'),
-- ⑤ 描述性 categorical（text，种质级观测，不参与统计）-------------
('freestone',          '离核性',     '果核',     'text',    '',   '0', NULL, md5(random()::text||'freestone'),         false, now(), 'asc',  '0', NULL, NULL, NULL, 'evaluation', '离核/半离核/黏核（categorical）'),
('ground_color',       '果皮底色',   '果皮',     'text',    '',   '0', NULL, md5(random()::text||'ground_color'),      false, now(), 'asc',  '0', NULL, NULL, NULL, 'evaluation', '果皮底色（categorical：黄/白/绿/红…）'),
('coloring_type',      '着色类型',   '果皮',     'text',    '',   '0', NULL, md5(random()::text||'coloring_type'),     false, now(), 'asc',  '0', NULL, NULL, NULL, 'evaluation', '果实着色类型（categorical：全红/条红/斑点/无…）')
ON CONFLICT (trait_code) DO UPDATE SET
    trait_name   = EXCLUDED.trait_name,
    category     = EXCLUDED.category,
    data_type    = EXCLUDED.data_type,
    unit         = EXCLUDED.unit,
    is_core      = EXCLUDED.is_core,
    scale_json   = EXCLUDED.scale_json,
    direction    = EXCLUDED.direction,
    into_ebv     = EXCLUDED.into_ebv,
    default_h2   = EXCLUDED.default_h2,
    valid_min    = EXCLUDED.valid_min,
    valid_max    = EXCLUDED.valid_max,
    stage        = EXCLUDED.stage,
    method       = EXCLUDED.method;
