72 lines
2.9 KiB
Python
72 lines
2.9 KiB
Python
|
|
# ============================================================
|
||
|
|
# 工程目录深度解析 + 按目录排产意图
|
||
|
|
# ============================================================
|
||
|
|
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
|