# ============================================================ # 工程目录深度解析 + 按目录排产意图 # ============================================================ from __future__ import annotations import os from pathlib import Path from server.agent_core.intent import parse_fast from server.aps_domain.folder_pack import analyze_work_dir from server.state.seed import seed_world def test_analyze_work_dir_reads_xlsx(tmp_path: Path, monkeypatch): # 最小可解析 CSV 订单表 orders = tmp_path / "订单.csv" orders.write_text( "订单号,产品编码,数量,交期,客户\n" "SO001,P-1,10,2026-08-01,甲\n", encoding="utf-8-sig", ) mats = tmp_path / "物料.csv" mats.write_text( "编码,名称,类型,单位,库存\n" "P-1,成品A,FINISHED_PRODUCT,件,100\n", encoding="utf-8-sig", ) class FakePS: def snapshot(self, include_messages=False): return { "projects": [{"id": "p1", "name": "测", "workDir": str(tmp_path)}], "sessions": [{"id": "s1", "projectId": "p1"}], "files": [], } monkeypatch.setattr("server.state.projects.get_project_store", lambda: FakePS()) world = seed_world() report = analyze_work_dir(world, "s1") assert report["ok"] is True assert report["totalOk"] >= 1 assert any(f["name"] == "订单.csv" for f in report["files"]) assert "字段" in report["markdown"] or any(f.get("headers") for f in report["files"]) assert "样例" in report["markdown"] or any(f.get("samples") for f in report["files"]) def test_schedule_intent_from_messy_zh(): world = seed_world() assert parse_fast("以上数据根据排产你要怎么数据", world).intent == "folder.schedule" assert parse_fast("解析工程目录", world).intent == "folder.analyze" def test_kangni_style_headers_soft_preview(): """康尼现场表头(料号/订单数量/计划结束时间…)应被 soft 识别为有效行。""" from server.aps_domain.importers import preview_file, detect_field_map world = seed_world() csv = ( "订单代码,WBS号,料号,物料描述,计划结束时间,订单数量,项目名称\n" "102285668,WBS1,28200003654300,承载机构,2026-08-08,1,穗莞深项目\n" ).encode("utf-8-sig") preview = preview_file("订单.csv", csv, world, soft=True, kind_hint="orders") assert preview["totalOk"] == 1 row = preview["batches"][0]["okRows"][0] assert row["productCode"] == "28200003654300" assert row["quantity"] == 1 assert row["deliveryDate"].startswith("2026-08-08") assert row["customerName"] == "穗莞深项目" fmap = detect_field_map("orders", ["订单代码", "料号", "订单数量", "计划结束时间", "项目名称"]) targets = {m["target"] for m in fmap} assert {"productCode", "quantity", "deliveryDate", "customerName", "orderNo"} <= targets