243 lines
16 KiB
Python
243 lines
16 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""桃育种 breeding 模块字段规格(生成器共享数据)。
|
|
|
|
每个模块: domain(路由名) / table(表名) / title(中文) / icon / order(菜单排序)
|
|
fields: 每个字段为 dict,由 F() 构造。
|
|
字段属性:
|
|
name : 字段名(蛇形)
|
|
type : str | text | int | float | select | fk | date
|
|
req : 创建时必填
|
|
label : 中文标签
|
|
search : None | "like" | "eq" (查询过滤方式)
|
|
table : 是否在列表展示
|
|
options : select 类型选项 [(value, label), ...]
|
|
fk : fk 类型 (ref_domain, ref_label_field) 如 ("target","target_name")
|
|
unique : 创建时查重 (label 提示)
|
|
length : str 列长度(默认100)
|
|
"""
|
|
|
|
def F(name, type="str", req=False, label="", search=None, table=True,
|
|
options=None, fk=None, unique=False, length=100):
|
|
return dict(name=name, type=type, req=req, label=label, search=search,
|
|
table=table, options=options or [], fk=fk, unique=unique, length=length)
|
|
|
|
def cls_of(domain: str) -> str:
|
|
return "".join(w.capitalize() for w in domain.split("_"))
|
|
|
|
def api_of(domain: str) -> str:
|
|
return cls_of(domain) + "API"
|
|
|
|
def options_method_of(domain: str) -> str:
|
|
return f"get{cls_of(domain)}Options"
|
|
|
|
# (domain, table, title, icon, order, fields)
|
|
MOD = [
|
|
dict(domain="target", table="bre_target", title="育种目标", icon="ri:target-line", order=4, fields=[
|
|
F("target_name", req=True, label="目标名称", search="like"),
|
|
F("series", label="系列/品系", search="like"),
|
|
F("description", type="text", label="目标描述", table=False),
|
|
F("is_preset", type="select", label="是否预设", options=[("1","是"),("0","否")]),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="cross_combination", table="bre_cross_combination", title="杂交组合", icon="ri:git-branch-line", order=5, fields=[
|
|
F("combination_code", req=True, label="组合编号", search="like", unique=True),
|
|
F("cross_year", type="int", label="杂交年份", search="eq"),
|
|
F("bre_target_id", type="fk", req=True, label="育种目标", search="eq", fk=("target","target_name")),
|
|
F("female_parent_id", type="fk", label="母本", fk=("germplasm","cultivar_name")),
|
|
F("male_parent_id", type="fk", label="父本", fk=("germplasm","cultivar_name")),
|
|
F("cross_method", type="select", label="杂交方式", search="eq",
|
|
options=[("人工杂交","人工杂交"),("自然授粉","自然授粉"),("回交","回交")]),
|
|
F("cross_date", type="date", label="杂交日期"),
|
|
F("seed_count", type="int", label="获种数"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="pollination", table="bre_pollination", title="授粉管理", icon="ri:flower-line", order=6, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("plot_id", type="fk", label="试验地块", search="eq", fk=("plot","plot_code")),
|
|
F("pollination_date", type="date", label="授粉日期"),
|
|
F("flower_count", type="int", label="花朵数"),
|
|
F("effective_count", type="int", label="有效坐果数"),
|
|
F("bre_personnel_id", type="fk", label="授粉人", search="eq", fk=("personnel","name")),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="seed_treatment", table="bre_seed_treatment", title="种子处理", icon="ri:test-tube-line", order=7, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("treatment_method", type="select", label="处理方式", search="eq",
|
|
options=[("沙藏","沙藏"),("层积","层积"),("低温冷藏","低温冷藏"),("常温","常温")]),
|
|
F("treatment_start", type="date", label="处理开始日期"),
|
|
F("treatment_end", type="date", label="处理结束日期"),
|
|
F("germination_rate", type="float", label="发芽率(%)"),
|
|
F("bre_personnel_id", type="fk", label="种子处理人", search="eq", fk=("personnel","name")),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="seedling", table="bre_seedling", title="育苗管理", icon="ri:sprout-line", order=8, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("sowing_date", type="date", label="播种日期"),
|
|
F("tray_no", label="穴盘号", search="like"),
|
|
F("nursery", label="苗圃", search="like"),
|
|
F("seedling_count", type="int", label="出苗数"),
|
|
F("bre_personnel_id", type="fk", label="育苗人", search="eq", fk=("personnel","name")),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="planting", table="bre_planting", title="定植管理", icon="ri:tree-line", order=9, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("plot_id", type="fk", label="试验地块", search="eq", fk=("plot","plot_code")),
|
|
F("planting_date", type="date", label="定植日期"),
|
|
F("tree_count", type="int", label="定植株数"),
|
|
F("row_no", type="int", label="行号"),
|
|
F("col_no", type="int", label="列号"),
|
|
F("bre_personnel_id", type="fk", label="定植人", search="eq", fk=("personnel","name")),
|
|
F("seedling_id", type="fk", label="育苗批次", search="eq", fk=("seedling","sowing_date")),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="tree", table="bre_tree", title="育种单株", icon="ri:forest-line", order=10, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("plot_id", type="fk", label="试验地块/位置", search="eq", fk=("plot","plot_code")),
|
|
F("tree_no", req=True, label="单株编号", search="like", unique=True),
|
|
F("row_orientation", type="select", label="行向", search="eq",
|
|
options=[("南北","南北"),("东西","东西")]),
|
|
F("row_no", type="int", label="行数"),
|
|
F("col_no", type="int", label="列数"),
|
|
F("planted_date", type="date", label="定植时间"),
|
|
F("bre_personnel_id", type="fk", label="责任人", search="eq", fk=("personnel","name")),
|
|
F("status", type="select", label="状态", search="eq",
|
|
options=[("入选","入选"),("初选","初选"),("重点","重点"),("保存","保存"),("淘汰","淘汰")]),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="tree_evaluation", table="bre_tree_evaluation", title="单株评价", icon="ri:clipboard-line", order=11, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("tree_id", type="fk", req=True, label="单株", search="eq", fk=("tree","tree_no")),
|
|
F("evaluate_year", type="int", label="评价年份", search="eq"),
|
|
F("evaluate_date", type="date", label="调查时间"),
|
|
F("bre_personnel_id", type="fk", label="评价人", search="eq", fk=("personnel","name")),
|
|
F("overall_score", type="float", label="综合评分"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="tree_photo", table="bre_tree_photo", title="单株照片", icon="ri:camera-line", order=12, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("tree_id", type="fk", label="单株", search="eq", fk=("tree","tree_no")),
|
|
F("evaluation_id", type="fk", label="所属鉴定", search="eq", fk=("tree_evaluation","evaluate_date")),
|
|
F("category", type="select", label="所属标签页", search="eq",
|
|
options=[("基本信息","基本信息"),("基本鉴定","基本鉴定"),("果实外观","果实外观"),
|
|
("果皮","果皮"),("果实大小","果实大小"),("果肉","果肉"),("果核","果核"),("其它","其它")]),
|
|
F("photo_type", type="select", label="照片类型", search="eq",
|
|
options=[("全株","全株"),("果实","果实"),("枝干","枝干")]),
|
|
F("photo_url", label="照片路径/URL"),
|
|
F("capture_date", type="date", label="拍摄日期"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="selection_result", table="bre_selection_result", title="选育结果", icon="ri:award-line", order=13, fields=[
|
|
F("combination_id", type="fk", req=True, label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("tree_id", type="fk", req=True, label="单株", search="eq", fk=("tree","tree_no")),
|
|
F("selection_year", type="int", label="入选年份", search="eq"),
|
|
F("is_selected", type="select", label="选育结论", search="eq",
|
|
options=[("入选","入选"),("淘汰","淘汰"),("待定","待定")]),
|
|
F("reason", type="text", label="入选理由", table=False),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="personnel", table="bre_personnel", title="人员花名册", icon="ri:user-line", order=14, fields=[
|
|
F("name", req=True, label="姓名", search="like", unique=True),
|
|
F("gender", type="select", label="性别", search="eq", options=[("男","男"),("女","女")]),
|
|
F("role", type="select", label="角色", search="eq",
|
|
options=[("育种专家","育种专家"),("技术员","技术员"),("管理员","管理员")]),
|
|
F("phone", label="联系电话", search="like"),
|
|
F("organization", label="所属单位", search="like"),
|
|
F("join_date", type="date", label="入职日期"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="trait", table="bre_trait", title="性状字典", icon="ri:list-check-line", order=20, fields=[
|
|
F("trait_code", req=True, label="性状编码", search="like", unique=True),
|
|
F("trait_name", req=True, label="性状名称", search="like"),
|
|
F("category", label="性状类别", search="eq"),
|
|
F("data_type", type="select", label="数据类型", search="eq",
|
|
options=[("numeric", "数值型"), ("categorical", "分类型")]),
|
|
F("unit", label="单位"),
|
|
F("is_core", type="select", label="是否核心性状", search="eq",
|
|
options=[("1", "是"), ("0", "否")]),
|
|
F("scale_json", type="text", label="量规/分级JSON", table=False),
|
|
F("valid_min", type="float", label="有效最小值", table=False),
|
|
F("valid_max", type="float", label="有效最大值", table=False),
|
|
F("ontology_uri", label="本体IRI", table=False),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="selection_rule", table="bre_selection_rule", title="选择规则", icon="ri:filter-line", order=21, fields=[
|
|
F("rule_name", req=True, label="规则名称", search="like"),
|
|
F("target_id", type="fk", req=True, label="育种目标", search="eq", fk=("target", "target_name")),
|
|
F("stage", label="适用阶段", search="eq"),
|
|
F("conditions_json", type="text", label="条件(JSON)", table=False),
|
|
F("logic", type="select", label="逻辑关系", search="eq",
|
|
options=[("and", "与"), ("or", "或")]),
|
|
F("action", type="select", label="动作", search="eq",
|
|
options=[("keep", "保留"), ("eliminate", "淘汰")]),
|
|
F("priority", type="int", label="优先级"),
|
|
F("enabled", type="select", label="是否启用", search="eq",
|
|
options=[("1", "启用"), ("0", "停用")]),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="trial", table="bre_trial", title="试验", icon="ri:flask-line", order=22, fields=[
|
|
F("trial_name", req=True, label="试验名称", search="like"),
|
|
F("trial_type", label="试验类型", search="eq"),
|
|
F("design_type", label="设计类型", search="eq"),
|
|
F("start_year", type="int", label="起始年份", search="eq"),
|
|
F("end_year", type="int", label="结束年份", search="eq"),
|
|
F("objective", type="text", label="试验目的", table=False),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="trial_study", table="bre_trial_study", title="试验执行", icon="ri:play-circle-line", order=23, fields=[
|
|
F("trial_id", type="fk", req=True, label="所属试验", search="eq", fk=("trial", "trial_name")),
|
|
F("study_name", req=True, label="研究点名称", search="like"),
|
|
F("site_id", type="int", label="基地ID", search="eq"),
|
|
F("year", type="int", label="年份"),
|
|
F("block_count", type="int", label="区组数"),
|
|
F("design_type", label="设计类型"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="treatment", table="bre_treatment", title="试验处理", icon="ri:mental-health-line", order=24, fields=[
|
|
F("trial_study_id", type="fk", req=True, label="所属研究点", search="eq", fk=("trial_study", "study_name")),
|
|
F("factor", req=True, label="因子", search="like"),
|
|
F("level", req=True, label="水平", search="like"),
|
|
F("description", label="描述"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="trial_study_entry", table="bre_trial_study_entry", title="参试条目", icon="ri:list-check-2", order=27, fields=[
|
|
F("trial_study_id", type="fk", req=True, label="所属研究点", search="eq", fk=("trial_study", "study_name")),
|
|
F("entry_number", type="int", req=True, label="参试编号", search="eq"),
|
|
F("germplasm_id", type="fk", req=True, label="参试种质", search="eq", fk=("germplasm", "cultivar_name")),
|
|
F("combination_id", type="fk", label="来源组合", search="eq", fk=("cross_combination", "combination_code")),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="group", table="bre_group", title="分组管理", icon="ri:group-line", order=25, fields=[
|
|
F("group_name", req=True, label="分组名称", search="like"),
|
|
F("group_type", label="分组类型", search="eq"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="pedigree", table="bre_pedigree", title="系谱管理", icon="ri:git-branch-line", order=26, fields=[
|
|
F("combination_id", type="fk", req=True, label="来源杂交组合", search="eq", fk=("cross_combination", "combination_code")),
|
|
F("child_code", req=True, label="子代种质编号", search="like"),
|
|
F("generation", label="世代", search="eq"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
dict(domain="plan", table="bre_plan", title="育种计划", icon="ri:calendar-check-line", order=27, fields=[
|
|
F("plan_code", req=True, label="计划编号", search="like", unique=True),
|
|
F("plan_name", req=True, label="计划名称", search="like"),
|
|
F("objective", type="text", label="计划目标", table=False),
|
|
F("start_year", type="int", label="起始年份", search="eq"),
|
|
F("end_year", type="int", label="结束年份", search="eq"),
|
|
F("leader", label="负责人"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
# 性状观测明细(EAV 长表):一次鉴定(tree_evaluation) 下的各性状取值。
|
|
# menu=False:无独立菜单,仅提供 CRUD 供单株评价 7 标签页表单与统计引擎调用。
|
|
dict(domain="trait_observation", table="bre_trait_observation", title="性状观测", icon="ri:database-2-line", order=28, menu=False, fields=[
|
|
F("evaluation_id", type="fk", label="所属鉴定", search="eq", fk=("tree_evaluation","evaluate_date")),
|
|
F("tree_id", type="fk", label="单株", search="eq", fk=("tree","tree_no")),
|
|
F("combination_id", type="fk", label="杂交组合", search="eq", fk=("cross_combination","combination_code")),
|
|
F("trait_id", type="fk", req=True, label="性状", search="eq", fk=("trait","trait_name")),
|
|
F("evaluate_year", type="int", label="观测年份", search="eq"),
|
|
F("value_numeric", type="float", label="数值"),
|
|
F("value_text", label="文本值", length=255),
|
|
F("value_date", type="date", label="日期值"),
|
|
F("remark", type="text", label="备注", table=False),
|
|
]),
|
|
]
|