import json from pathlib import Path from data.diff_result import VerificationRun class ReportGenerator: def generate_json(self, run: VerificationRun, p: Path) -> Path: d = {"program": run.program, "status": run.status, "exit_code": run.exit_code, "timestamp": run.timestamp, "duration_s": run.duration_s, "fields_matched": run.fields_matched, "fields_mismatched": run.fields_mismatched, "runner": run.runner, "branch_rate": run.branch_rate, "llm_cost": run.llm_cost, "field_results": [{"field_name": fr.field_name, "status": fr.status, "cobol_value": fr.cobol_value, "java_value": fr.java_value, "suggestion": fr.suggestion} for fr in run.field_results]} p.write_text(json.dumps(d, indent=2)) return p def generate_html(self, run: VerificationRun, p: Path) -> Path: rows = "".join( f'{fr.field_name}' f'{fr.status}{fr.cobol_value}{fr.java_value}' f'{fr.suggestion}' for fr in run.field_results) # 覆盖率卡片 coverage_html = "" if run.paragraph_rate > 0 or run.branch_rate > 0: mode = "静态+动态" if run.branch_rate > 0 else "仅静态" pcolor = "green" if run.paragraph_rate >= 1.0 else "orange" bcolor = "green" if run.branch_rate >= 0.9 else "orange" coverage_html = f"""

覆盖率

方式{mode}
段落覆盖率{run.paragraph_rate:.0%}
分支覆盖率{run.branch_rate:.0%}
决策点覆盖率{run.decision_rate:.0%}
""" # HINA 卡片 hina_html = "" if run.hina_type: hina_html = f"""

HINA 信息

判定类型{run.hina_type}
确信度{run.hina_confidence:.0%}
""" # 质量评分卡片 quality_html = "" if run.quality_score > 0: color = "green" if run.quality_score >= 0.8 else "orange" quality_html = f"""

质量评分

{run.quality_score:.0%}
""" # 重试历史卡片 retry_html = "" if run.total_retry > 0: retry_html = f"""

重试历史

heal_retry{run.heal_retry}
simple_retry{run.simple_retry}
total_retry{run.total_retry}
""" warn_html = "" if run.quality_warn: warn_html = f'
{run.quality_warn}
' html = f""" {run.program}

{run.program}

Status: {run.status} | Runner: {run.runner} | {run.fields_matched} matched | {run.duration_s:.0f}s
{warn_html}

字段比对

{rows}
FieldStatusCOBOLJavaSuggestion
{coverage_html} {hina_html} {quality_html} {retry_html} """ p.write_text(html) return p def generate_machine_json(self, run: VerificationRun, p: Path) -> Path: d = {"program": run.program, "status": run.status, "exit_code": run.exit_code, "timestamp": run.timestamp, "duration_s": run.duration_s, "runner": run.runner} p.write_text(json.dumps(d)) return p