机器人显示名与站点标题可配;多段联运列表投影;协同群监听对账;工单附件落存;模板与工单后台补强

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-19 09:41:59 +08:00
co-authored by Cursor
parent 277cdc1c28
commit 2b528758b4
119 changed files with 6760 additions and 3516 deletions
@@ -0,0 +1,121 @@
"""
激活发群模版不得登记主账附件;正式有价出单必须登记。
验收:
- 激活路径 _render_and_send_sheet 默认 persist_attachment=False;
- 有价出单显式传 True;
- 确认落库 _persist_quote_sheet 传 True。
"""
from __future__ import annotations
from types import SimpleNamespace
from typing import Any
from unittest.mock import MagicMock
from agent.policy import sea_group_ops
class _Ledger:
def __init__(self) -> None:
self.calls: list[dict[str, Any]] = []
def render_quote(self, **kwargs: Any) -> dict[str, Any]:
self.calls.append(dict(kwargs))
return {
"ok": True,
"fileName": "WO1空运到港报价单",
"fileBase64": "UEsDBAoAAAAAA",
"objectKey": "inquiry/work-order-files/WO1.xlsx",
"attachmentSaved": bool(kwargs.get("persist_attachment")),
"templateId": "t1",
"templateName": "空运到港报价单",
}
def test_activate_send_does_not_persist_attachment(monkeypatch) -> None:
ledger = _Ledger()
flow = SimpleNamespace(ledger=ledger)
client = MagicMock()
client.send_group_file.return_value = {"ok": True}
monkeypatch.setattr(sea_group_ops, "group_client_of", lambda _f: client)
monkeypatch.setattr(
sea_group_ops,
"overlay_labeled_facts",
lambda **_k: {"filepath": "", "file_b64": "UEsDBAoAAAAAA"},
)
out = sea_group_ops._render_and_send_sheet(
flow=flow,
chat_id="chat-1",
work_order_no="WO202610170054",
facts={"weight_kg": "11"},
quote={},
sales_id="u1",
business_line="AIR",
)
assert out.get("ok") is True
assert len(ledger.calls) == 1
assert ledger.calls[0].get("persist_attachment") is False
def test_priced_send_persists_attachment(monkeypatch) -> None:
"""正式有价出单:群发 Excel 同时写后台附件(WO102 类缺附件回归)。"""
ledger = _Ledger()
flow = SimpleNamespace(ledger=ledger)
client = MagicMock()
client.send_group_file.return_value = {"ok": True}
monkeypatch.setattr(sea_group_ops, "group_client_of", lambda _f: client)
monkeypatch.setattr(
sea_group_ops,
"overlay_labeled_facts",
lambda **_k: {"filepath": "", "file_b64": "UEsDBAoAAAAAA"},
)
out = sea_group_ops._render_and_send_sheet(
flow=flow,
chat_id="chat-1",
work_order_no="WO202610170102",
facts={"weight_kg": "11"},
quote={"total": "9900", "currency": "CNY"},
sales_id="u1",
business_line="AIR",
persist_attachment=True,
)
assert out.get("ok") is True
assert len(ledger.calls) == 1
assert ledger.calls[0].get("persist_attachment") is True
def test_confirm_persist_quote_sheet_requests_attachment(monkeypatch) -> None:
ledger = _Ledger()
flow = SimpleNamespace(ledger=ledger)
monkeypatch.setattr(sea_group_ops, "_archive_file", lambda *_a, **_k: None)
ticket = {
"work_order_no": "WO202610170054",
"business_line": "AIR",
"facts": {"weight_kg": "11"},
"collab_facts": {},
"sales_wecom_id": "u1",
"sales_name": "张三",
}
sess = SimpleNamespace(
work_order_no="WO202610170054",
facts={"weight_kg": "11"},
collab_facts={},
sender_id="u1",
)
sea_group_ops._persist_quote_sheet(
flow=flow,
ticket=ticket,
sess=sess,
quote={"total": "100"},
sender_id="u1",
business_line="AIR",
)
assert len(ledger.calls) == 1
assert ledger.calls[0].get("persist_attachment") is True