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

@@ -275,6 +275,32 @@ def test_server_preview_decision_detects_field_added_after_issuance() -> None:
assert {item["field_key"] for item in feedback.changed_fields_json} >= {"transport_mode"}
def test_server_preview_decision_records_cleared_suggestion_as_rejected() -> None:
client, session_factory = build_client()
with session_factory() as db:
seed_employee(db)
issued = issue_preview(client, request_id="issue-preview-rejected-field")
payload = build_action_payload(issued)
payload["message"] = payload["message"].replace("出行方式:飞机\n", "")
payload["context_json"]["application_preview"]["fields"]["transportMode"] = ""
response = client.post(
"/api/v1/reimbursements/application-preview-action",
headers=auth_headers(),
json=payload,
)
assert response.status_code == 200, response.text
with session_factory() as db:
feedback = db.scalar(select(AIDecisionFeedback))
assert feedback is not None
assert feedback.feedback_type == "rejected"
assert feedback.verification_status == "server_verified"
assert {item["field_key"] for item in feedback.changed_fields_json} == {
"transport_mode"
}
def test_server_preview_decision_rejects_cross_session_replay_without_writes() -> None:
client, session_factory = build_client()
with session_factory() as db: