feat(platform): close AI expense value loop

Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
caoxiaozhu
2026-07-17 14:14:08 +08:00
parent 242d68c36f
commit 787bc3a481
507 changed files with 82072 additions and 6344 deletions

View File

@@ -9,7 +9,7 @@ from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from app.api.deps import get_db
from app.api.deps import CurrentUserContext, get_current_user, get_db
from app.db.base import Base
from app.main import create_app
from app.models.financial_record import ExpenseClaim
@@ -299,6 +299,16 @@ def _create_steward_test_client_with_db():
db.close()
app.dependency_overrides[get_db] = override_db
app.dependency_overrides[get_current_user] = lambda: CurrentUserContext(
username="zhang.xiaoqing",
name="张小青",
role_codes=["user"],
is_admin=False,
tenant_id="default",
department_name="产品交付部",
employee_no="E-STEW-001",
employee_id="employee-steward-001",
)
return TestClient(app), TestingSessionLocal, app
@@ -756,22 +766,25 @@ def test_steward_planner_builds_travel_attachment_group_with_exclusions() -> Non
def test_steward_stream_endpoint_emits_thinking_before_plan(monkeypatch) -> None:
_patch_steward_endpoint_planner(monkeypatch)
client = TestClient(create_app())
client, _session_factory, app = _create_steward_test_client_with_db()
with client.stream(
"POST",
"/api/v1/steward/plans/stream",
json={
"message": "我要报销昨天的交通费",
"client_now_iso": "2026-06-04T09:30:00+08:00",
},
) as response:
assert response.status_code == 200
events = [
json.loads(line.decode("utf-8") if isinstance(line, bytes) else line)
for line in response.iter_lines()
if line
]
try:
with client.stream(
"POST",
"/api/v1/steward/plans/stream",
json={
"message": "我要报销昨天的交通费",
"client_now_iso": "2026-06-04T09:30:00+08:00",
},
) as response:
assert response.status_code == 200
events = [
json.loads(line.decode("utf-8") if isinstance(line, bytes) else line)
for line in response.iter_lines()
if line
]
finally:
app.dependency_overrides.clear()
assert [event["event"] for event in events][:2] == ["thinking", "thinking"]
assert events[0]["data"]["stage"] == "stream_start"
@@ -781,17 +794,20 @@ def test_steward_stream_endpoint_emits_thinking_before_plan(monkeypatch) -> None
def test_steward_plan_endpoint_persists_application_and_reimbursement_state(monkeypatch) -> None:
_patch_steward_endpoint_planner(monkeypatch)
client = TestClient(create_app())
client, _session_factory, app = _create_steward_test_client_with_db()
response = client.post(
"/api/v1/steward/plans",
json={
"message": "我想申请7月2日去北京出差并且我要报销昨天的交通费",
"user_id": "u-steward-state",
"client_now_iso": "2026-06-04T09:30:00+08:00",
"context_json": {"session_type": "steward", "entry_source": "personal_workbench"},
},
)
try:
response = client.post(
"/api/v1/steward/plans",
json={
"message": "我想申请7月2日去北京出差并且我要报销昨天的交通费",
"user_id": "u-steward-state",
"client_now_iso": "2026-06-04T09:30:00+08:00",
"context_json": {"session_type": "steward", "entry_source": "personal_workbench"},
},
)
finally:
app.dependency_overrides.clear()
assert response.status_code == 200
payload = response.json()