| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- from app.services.document_processing import (
- _build_structured_summary,
- _compact_analysis_summary,
- extract_dust_dispersion_free_silica_plan,
- extract_safety_monitoring_ledger,
- normalize_extraction_result,
- resolve_effective_parse_mode,
- )
- def test_compact_analysis_summary_keeps_numbered_results() -> None:
- summary = (
- "1. 有效期:正常;2. 双机能力:一致;3. 单位资质:需核验;"
- "4. 授权签字人:合规;5. 检验仪器:有效;6. 特性曲线:完整;"
- "7. 证书证号:齐全;8. 风量风压:差异较小。"
- )
- compacted = _compact_analysis_summary(summary)
- assert "1. 有效期:正常" in compacted
- assert "8. 风量风压:差异较小" in compacted
- assert len(compacted.splitlines()) == 8
- def test_legacy_word_file_upgrades_to_precision_mode() -> None:
- assert resolve_effective_parse_mode("lightweight", ".doc") == "precision"
- assert resolve_effective_parse_mode("lightweight", ".docx") == "lightweight"
- def test_compact_summary_does_not_split_decimal_values() -> None:
- summary = "1. 主要路线:883.2Pa,误差2.58%;2. 次要路线:866.42Pa,误差0.63%。"
- compacted = _compact_analysis_summary(summary)
- assert "883.2Pa" in compacted
- assert "866.42Pa" in compacted
- def test_resistance_summary_uses_structured_results() -> None:
- summary = _build_structured_summary(
- "mine_ventilation_resistance_report",
- {
- "main_route_measured_resistance": "883.2 Pa",
- "main_route_relative_error": "2.58",
- "secondary_route_measured_resistance": "866.42 Pa",
- "secondary_route_relative_error": "0.63",
- "equivalent_orifice": "6.77",
- "ventilation_difficulty": "容易",
- "effective_airflow_rate": "94.6",
- "effective_airflow_rate_pass": "合格",
- "overall_assessment": "满足要求",
- },
- )
- assert "主要路线:883.2 Pa" in summary
- assert "次要路线:866.42 Pa" in summary
- def test_effective_airflow_rate_above_85_is_qualified() -> None:
- summary = _build_structured_summary(
- "airflow_measurement_decadal_report",
- {
- "measurement_date": "2025-05-16",
- "mine_name": "上湾煤矿",
- "effective_airflow_rate": "93.93",
- },
- )
- assert "有效风量率 93.93%,合格" in summary
- def test_safety_monitoring_ledger_deterministic_parser(tmp_path) -> None:
- from openpyxl import Workbook
- path = tmp_path / "安全监控系统台账202507.xlsx"
- workbook = Workbook()
- total = workbook.active
- total.title = "总台账"
- total.append(["编码", "安装地点", "设备名称", "安装位置", "单位", "报警值", "断电值", "复电值", "断电范围"])
- total.append([1, "主井变电所", "综合分站", "主井变电所", "---", "---", "---", "---", "---"])
- total.append([1, "主井变电所", "甲烷", "原煤仓", "%", ">=1.5%", ">=1.5%", "<1.5%", "原煤仓电源"])
- cover = workbook.create_sheet("台账封面")
- cover["A1"] = "上湾矿安全监测系统设备台账"
- cover["A2"] = "上湾煤矿通风队"
- workbook.save(path)
- workbook.close()
- result = extract_safety_monitoring_ledger(str(path))
- assert result is not None
- fields = {item["field_key"]: item["normalized_value"] for item in result["fields"]}
- assert fields["substation_count"] == 1
- assert fields["sensor_count"] == 1
- assert fields["gas_sensor_count"] == 1
- def test_dust_dispersion_free_silica_plan_parser(tmp_path) -> None:
- from openpyxl import Workbook
- path = tmp_path / "粉尘分散度游离二氧化硅监测计划.xlsx"
- workbook = Workbook()
- sheet = workbook.active
- sheet.title = "粉尘检测计划"
- sheet.append(["附件:2025年采掘作业场所粉尘分散度、游离二氧化硅含量监测计划表"])
- sheet.append(
- [
- "序号",
- "矿井名称",
- "现场采样时间",
- "检测地点",
- "检测项目",
- "频次/周期",
- "联系人及联系方式",
- "",
- "备注",
- "计划检测时间",
- "实际检测日期",
- ]
- )
- sheet.append(
- [
- 1,
- "上湾煤矿",
- "1-12月",
- "12煤、22煤采掘工作面",
- "总粉尘\n粉尘分散度\n游离二氧化硅",
- "1次/半年",
- "李玉福",
- "18047378769",
- "每个煤层至少选择一个采掘工作面",
- "",
- "",
- ]
- )
- sheet.append(["", "", "", "", "", "", "现场检测联系人", "王杰\n18047382145"])
- workbook.save(path)
- workbook.close()
- result = extract_dust_dispersion_free_silica_plan(str(path))
- assert result is not None
- fields = {item["field_key"]: item["normalized_value"] for item in result["fields"]}
- assert fields["monitoring_year"] == "2025"
- assert fields["mine_count"] == 1
- assert fields["plan_record_count"] == 1
- assert fields["monitoring_items"] == ["总粉尘", "粉尘分散度", "游离二氧化硅"]
- assert fields["onsite_contacts"][0]["contact_name"] == "王杰"
- assert fields["onsite_contacts"][0]["phone"] == "18047382145"
- def test_normalized_field_uses_template_chinese_name() -> None:
- result = normalize_extraction_result(
- {
- "fields": [
- {
- "field_key": "mine_count",
- "field_name": "mine_count",
- "field_value": 13,
- "normalized_value": 13,
- }
- ]
- },
- [
- {
- "key": "mine_count",
- "name": "覆盖矿井数量",
- "type": "number",
- "group_key": "plan_summary",
- "group_name": "监测计划汇总",
- "group_order": 2,
- "field_order": 0,
- }
- ],
- model_status="test",
- parsed_markdown="",
- template_code="dust_dispersion_free_silica_monitoring_ledger",
- )
- assert result["fields"][0]["field_name"] == "覆盖矿井数量"
|