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}
字段比对
| Field | Status | COBOL | Java | Suggestion |
{rows}
{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,
"branch_rate": run.branch_rate, "paragraph_rate": run.paragraph_rate,
"decision_rate": run.decision_rate, "quality_score": run.quality_score,
"hina_type": run.hina_type, "hina_confidence": run.hina_confidence,
"heal_retry": run.heal_retry, "simple_retry": run.simple_retry,
"total_retry": run.total_retry}
p.write_text(json.dumps(d))
return p