2026-06-07 17:39:02 +08:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
from app.services.fl_analysis_report import build_report_document, build_report_summary_payload
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _sample_report_data() -> dict[str, object]:
|
|
|
|
|
return {
|
|
|
|
|
"line": {
|
|
|
|
|
"name": "示例线路",
|
|
|
|
|
"code": "XL-001",
|
|
|
|
|
"voltage_kv": 220,
|
|
|
|
|
},
|
|
|
|
|
"report": {
|
|
|
|
|
"job_name": "示例线路-报告",
|
|
|
|
|
"generated_at": datetime(2026, 6, 7, 17, 30, 0),
|
|
|
|
|
"source_job_id": "risk-job-1",
|
|
|
|
|
"source_job_type": "risk",
|
|
|
|
|
"source_job_name": "示例线路-风险评估",
|
|
|
|
|
"risk_job_id": "risk-job-1",
|
|
|
|
|
"risk_job_name": "示例线路-风险评估",
|
|
|
|
|
"mitigation_job_id": "mit-job-1",
|
|
|
|
|
"mitigation_job_name": "示例线路-措施推荐",
|
2026-06-07 23:48:32 +08:00
|
|
|
"scenario_job_id": "scenario-job-1",
|
|
|
|
|
"scenario_job_name": "示例线路-加装避雷器复算",
|
|
|
|
|
"scenario_base_job_type": "normal",
|
2026-06-07 17:39:02 +08:00
|
|
|
},
|
|
|
|
|
"risk_rows": [
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-1",
|
|
|
|
|
"tower_no": "001",
|
|
|
|
|
"risk_level": "high",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"score": 88,
|
|
|
|
|
"cause_analysis": "接地电阻偏高;保护角暴露偏大",
|
|
|
|
|
"mitigation_recommendation": "优先降低接地电阻;优化避雷线与保护角配置",
|
|
|
|
|
"reason_details": [
|
|
|
|
|
{"code": "ground_resistance", "label": "接地电阻", "grade": 1, "triggered": True},
|
|
|
|
|
{"code": "protection_angle", "label": "保护角", "grade": 2, "triggered": True},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-2",
|
|
|
|
|
"tower_no": "002",
|
|
|
|
|
"risk_level": "medium",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"score": 56,
|
|
|
|
|
"cause_analysis": "地闪密度中等偏高",
|
|
|
|
|
"mitigation_recommendation": "按高雷区口径校核绝缘与屏蔽配置",
|
|
|
|
|
"reason_details": [
|
|
|
|
|
{"code": "lightning_density", "label": "地闪密度", "grade": 2, "triggered": True},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-3",
|
|
|
|
|
"tower_no": "003",
|
|
|
|
|
"risk_level": "low",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"score": 18,
|
|
|
|
|
"cause_analysis": "主要输入参数处于低风险区间",
|
|
|
|
|
"mitigation_recommendation": "维持现有防雷配置并保持常规巡检",
|
|
|
|
|
"reason_details": [],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"selected_risk_rows": [
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-1",
|
|
|
|
|
"tower_no": "001",
|
|
|
|
|
"risk_level": "high",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"score": 88,
|
|
|
|
|
"cause_analysis": "接地电阻偏高;保护角暴露偏大",
|
|
|
|
|
"mitigation_recommendation": "优先降低接地电阻;优化避雷线与保护角配置",
|
|
|
|
|
"reason_details": [
|
|
|
|
|
{"code": "ground_resistance", "label": "接地电阻", "grade": 1, "triggered": True},
|
|
|
|
|
{"code": "protection_angle", "label": "保护角", "grade": 2, "triggered": True},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-2",
|
|
|
|
|
"tower_no": "002",
|
|
|
|
|
"risk_level": "medium",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"score": 56,
|
|
|
|
|
"cause_analysis": "地闪密度中等偏高",
|
|
|
|
|
"mitigation_recommendation": "按高雷区口径校核绝缘与屏蔽配置",
|
|
|
|
|
"reason_details": [
|
|
|
|
|
{"code": "lightning_density", "label": "地闪密度", "grade": 2, "triggered": True},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"selected_mitigation_rows": [
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-1",
|
|
|
|
|
"tower_no": "001",
|
|
|
|
|
"risk_level": "medium",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"current_risk_level": "high",
|
|
|
|
|
"expected_risk_level": "medium",
|
|
|
|
|
"recommendation_result": "需要安装避雷器",
|
|
|
|
|
"mitigation_actions": [
|
|
|
|
|
{"code": "grounding_upgrade", "label": "接地治理", "summary": "降低接地电阻"},
|
|
|
|
|
{"code": "arrester_install", "label": "安装避雷器", "summary": "关键相增设避雷器"},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
],
|
2026-06-07 23:48:32 +08:00
|
|
|
"selected_scenario_rows": [
|
|
|
|
|
{
|
|
|
|
|
"tower_id": "tower-1",
|
|
|
|
|
"tower_no": "001",
|
|
|
|
|
"risk_level": "low",
|
|
|
|
|
"result_json": {
|
|
|
|
|
"counterstrike_withstand_ka": 112.45,
|
|
|
|
|
"counterstrike_trip_rate": 0.0215,
|
|
|
|
|
"shielding_withstand_ka": 136.2,
|
|
|
|
|
"shielding_trip_rate": 0.0085,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
],
|
2026-06-07 17:39:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_build_report_summary_payload_counts_risk_and_actions() -> None:
|
|
|
|
|
summary = build_report_summary_payload(_sample_report_data())
|
|
|
|
|
|
|
|
|
|
assert summary["selected_tower_count"] == 2
|
|
|
|
|
assert summary["risk_counts"] == {"high": 1, "medium": 1, "low": 1}
|
|
|
|
|
assert summary["selected_risk_counts"] == {"high": 1, "medium": 1, "low": 0}
|
|
|
|
|
assert summary["post_mitigation_risk_counts"] == {"high": 0, "medium": 1, "low": 0}
|
|
|
|
|
assert summary["selected_factor_trigger_counts"]["接地电阻"] == 1
|
|
|
|
|
assert summary["selected_factor_trigger_counts"]["保护角"] == 1
|
|
|
|
|
assert summary["selected_cause_counts"]["接地电阻偏高"] == 1
|
|
|
|
|
assert summary["mitigation_action_counts"]["接地治理"] == 1
|
|
|
|
|
assert summary["mitigation_action_counts"]["安装避雷器"] == 1
|
|
|
|
|
assert summary["has_mitigation_data"] is True
|
2026-06-07 23:48:32 +08:00
|
|
|
assert summary["scenario_row_count"] == 1
|
|
|
|
|
assert summary["post_recalc_risk_counts"] == {"high": 0, "medium": 0, "low": 1}
|
|
|
|
|
assert summary["has_scenario_data"] is True
|
2026-06-07 17:39:02 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_build_report_document_renders_word_compatible_html() -> None:
|
|
|
|
|
filename, content = build_report_document(_sample_report_data())
|
|
|
|
|
html = content.decode("utf-8")
|
|
|
|
|
|
|
|
|
|
assert filename.endswith(".doc")
|
|
|
|
|
assert "示例线路-报告" in filename
|
|
|
|
|
assert "示例线路" in html
|
|
|
|
|
assert "雷害风险评估结果" in html
|
|
|
|
|
assert "差异化防雷措施与预期效果" in html
|
|
|
|
|
assert "安装避雷器" in html
|
2026-06-07 23:48:32 +08:00
|
|
|
assert "表14 采取措施后的计算结果表" in html
|
|
|
|
|
assert "反击耐雷水平(kA)" in html
|
2026-06-07 17:39:02 +08:00
|
|
|
assert "001" in html
|