from pathlib import Path import yaml from django.conf import settings def governance_defaults() -> dict: return { "owner_mappings": [ { "owner_role": "注册资料负责人", "owner_name": "张三", "department": "注册事务部", "chapter_scope": "CH1", "risk_scope": "字段冲突 / 缺失项", "feishu_user_id": "ou_demo_1", "feishu_open_id": "on_demo_1", "feishu_name": "张三", "notify_enabled": "是", }, { "owner_role": "注册申报负责人", "owner_name": "李四", "department": "临床注册组", "chapter_scope": "CH2-CH6", "risk_scope": "完整性风险 / 导出阻断", "feishu_user_id": "ou_demo_2", "feishu_open_id": "on_demo_2", "feishu_name": "李四", "notify_enabled": "是", }, ], "feishu_configs": [ { "config_name": "注册审核完成通知", "notify_reason": "task_completed", "channel": "群机器人", "message_template": "审核完成摘要 + @处理人", "status": "启用", }, { "config_name": "注册审核异常通知", "notify_reason": "task_failed", "channel": "群机器人", "message_template": "异常摘要 + @处理人", "status": "启用", }, ], "template_mappings": [ { "template_name": "注册证导出模板", "output_type": "registration_word_export_report", "version": "V1.0", "placeholder_count": 18, "status": "启用", "field_mapping_summary": "产品名称 / 注册人 / 适用机型 / 储存条件", }, { "template_name": "风险摘要导出模板", "output_type": "registration_word_export_report", "version": "V0.9", "placeholder_count": 10, "status": "待校验", "field_mapping_summary": "风险等级 / 批次号 / 责任人 / 证据摘要", }, ], } def read_governance_yaml() -> dict: raw_path = getattr(settings, "GOVERNANCE_CONFIG_PATH", "") if not raw_path: return {} config_path = Path(raw_path) if not config_path.exists() or not config_path.is_file(): return {} with config_path.open("r", encoding="utf-8") as file: return yaml.safe_load(file) or {} def load_governance_config() -> dict: defaults = governance_defaults() config = read_governance_yaml() for key, default_value in defaults.items(): configured_value = config.get(key) if isinstance(default_value, list) and configured_value: defaults[key] = configured_value return defaults