"""七阶段业务流程:确定性执行,保存阶段结果,支持从指定阶段继续。""" from pathlib import Path import json import config from algorithms.main_fan.equivalence import (RulePolicy, normalize_and_validate_fan_data, compare_basic_parameters, analyze_fan_performance_curve, analyze_fan_switch_event, match_fan_rules_and_knowledge, assess_fan_equivalent_capability, trace_fan_evidence_and_review, envelope, evidence_id) from algorithms.main_fan.models import ScreeningInput, Screening from extensions.main_fan.pair_reporting import render_fan_assessment_report STAGES = ("data_preparation", "basic_parameters", "performance_curves", "switch_events", "rules", "overall_assessment", "report") def new_stages(): return [{"name":name,"status":"pending","result":None} for name in STAGES] def load_rules(): configured=config.get_str("MAIN_FAN_RULES_FILE") path=Path(configured) if configured else Path(__file__).resolve().parents[2]/'examples/main_fan/equivalence_rules.json' if configured and not path.is_absolute(): path=config.ROOT/path return RulePolicy.model_validate(json.loads(path.read_text(encoding="utf-8"))) def run_pipeline(context, *, stages=None, start_stage=1, save=None): if start_stage not in range(1,8): raise ValueError("重试阶段必须在1~7之间") stages=stages or new_stages() if any(s["result"] is None for s in stages[:start_stage-1]): raise ValueError("上游阶段尚未完成,不能跳过执行") for stage in stages[start_stage-1:]: stage.update(status="pending",result=None) data=ScreeningInput.model_validate(context["data"]) analysis=Screening.model_validate(context["analysis"]) policy=RulePolicy.model_validate(context["policy"]) dataset=normalize_and_validate_fan_data(data,policy,context.get("fan_names")) def execute(number, function): stage=stages[number-1] if number