R52 A1-A6:完成 AP 运营深度操作

- AP 概览页 Tab 工作台化(待付款/异常付款/风险标记/对账异常)
- AP 导出端点支持 CSV/XLSX 与筛选
- 风险标记 resolve/dismiss 支持说明审计留痕
- 支付批次深链、高风险复核提示、对账确认权限收口
- OpenClaw 浏览器级回归全部通过
这个提交包含在:
2026-04-07 09:37:17 +08:00
父节点 02c01dadb9
当前提交 64d9ded024
共修改 9 个文件,包含 2325 行新增和 63 行删除
+42
查看文件
@@ -35,6 +35,25 @@ export type PrecheckResponse = {
nextActions: string[];
};
export type RiskFlagListResponse = {
items: RiskFlag[];
};
function buildRiskFlagsSearch(query: {
entityType?: string;
entityId?: string;
status?: "open" | "resolved" | "dismissed";
source?: string;
}) {
const params = new URLSearchParams();
if (query.entityType) params.set("entityType", query.entityType);
if (query.entityId) params.set("entityId", query.entityId);
if (query.status) params.set("status", query.status);
if (query.source) params.set("source", query.source);
const search = params.toString();
return search ? `?${search}` : "";
}
export async function precheckEntity(payload: {
entityType: "reimbursement" | "purchase_request" | "travel_request";
entityId: string;
@@ -44,3 +63,26 @@ export async function precheckEntity(payload: {
body: JSON.stringify(payload),
});
}
export async function fetchRiskFlags(query: {
entityType?: string;
entityId?: string;
status?: "open" | "resolved" | "dismissed";
source?: string;
} = {}) {
return apiRequestData<RiskFlagListResponse>(`/api/risk-flags${buildRiskFlagsSearch(query)}`);
}
export async function resolveRiskFlag(riskFlagId: string, payload: { note?: string | null } = {}) {
return apiRequestData<{ item: RiskFlag }>(`/api/risk-flags/${riskFlagId}/resolve`, {
method: "POST",
body: JSON.stringify(payload),
});
}
export async function dismissRiskFlag(riskFlagId: string, payload: { note?: string | null } = {}) {
return apiRequestData<{ item: RiskFlag }>(`/api/risk-flags/${riskFlagId}/dismiss`, {
method: "POST",
body: JSON.stringify(payload),
});
}