2026-05-14 02:58:35 +00:00
|
|
|
import { apiRequest, pickSafeHeaderValue } from './api.js'
|
2026-05-11 06:32:38 +00:00
|
|
|
|
|
|
|
|
const AUTH_USER_STORAGE_KEY = 'x-financial-auth-user'
|
|
|
|
|
|
|
|
|
|
function readActorName() {
|
|
|
|
|
if (typeof window === 'undefined') {
|
|
|
|
|
return 'system'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const raw = window.sessionStorage.getItem(AUTH_USER_STORAGE_KEY)
|
|
|
|
|
if (!raw) {
|
|
|
|
|
return 'system'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const payload = JSON.parse(raw)
|
2026-05-14 02:58:35 +00:00
|
|
|
return (
|
|
|
|
|
pickSafeHeaderValue(payload?.name, payload?.username) ||
|
|
|
|
|
pickSafeHeaderValue(payload?.username, 'system') ||
|
|
|
|
|
'system'
|
|
|
|
|
)
|
2026-05-11 06:32:38 +00:00
|
|
|
} catch {
|
|
|
|
|
return 'system'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function buildWriteHeaders(options = {}) {
|
|
|
|
|
const actor = String(options.actor || readActorName()).trim() || 'system'
|
|
|
|
|
const headers = {
|
|
|
|
|
'x-actor': actor
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (options.requestId) {
|
|
|
|
|
headers['x-request-id'] = String(options.requestId).trim()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return headers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function buildQuery(params = {}) {
|
|
|
|
|
const search = new URLSearchParams()
|
|
|
|
|
|
|
|
|
|
if (params.assetType) {
|
|
|
|
|
search.set('asset_type', params.assetType)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (params.status) {
|
|
|
|
|
search.set('status', params.status)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (params.domain) {
|
|
|
|
|
search.set('domain', params.domain)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (params.keyword) {
|
|
|
|
|
search.set('keyword', params.keyword)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (params.limit) {
|
|
|
|
|
search.set('limit', String(params.limit))
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-18 02:48:51 +00:00
|
|
|
if (params.version) {
|
|
|
|
|
search.set('version', String(params.version))
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
if (params.agent) {
|
|
|
|
|
search.set('agent', params.agent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (params.source) {
|
|
|
|
|
search.set('source', params.source)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const query = search.toString()
|
|
|
|
|
return query ? `?${query}` : ''
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function fetchAgentAssets(params = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets${buildQuery(params)}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function fetchAgentAssetDetail(assetId) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}`)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-19 16:19:03 +00:00
|
|
|
export function fetchAgentAssetSpreadsheetOnlyOfficeConfig(assetId) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/spreadsheet/onlyoffice-config`)
|
2026-05-18 02:48:51 +00:00
|
|
|
}
|
|
|
|
|
|
2026-05-19 16:19:03 +00:00
|
|
|
export function fetchAgentAssetSpreadsheetBlob(assetId, disposition = 'inline') {
|
2026-05-18 02:48:51 +00:00
|
|
|
const search = new URLSearchParams()
|
|
|
|
|
if (disposition) {
|
|
|
|
|
search.set('disposition', String(disposition).trim())
|
|
|
|
|
}
|
|
|
|
|
const query = search.toString()
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/spreadsheet/content${query ? `?${query}` : ''}`, {
|
|
|
|
|
responseType: 'blob',
|
|
|
|
|
contentType: null
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function uploadAgentAssetSpreadsheet(assetId, file, options = {}) {
|
|
|
|
|
return apiRequest(
|
|
|
|
|
`/agent-assets/${assetId}/spreadsheet/upload?filename=${encodeURIComponent(file.name)}`,
|
|
|
|
|
{
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: file,
|
|
|
|
|
contentType: file.type || 'application/octet-stream',
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function importAgentAssetSpreadsheetContent(assetId, file, options = {}) {
|
|
|
|
|
return apiRequest(
|
|
|
|
|
`/agent-assets/${assetId}/spreadsheet/import-content?filename=${encodeURIComponent(file.name)}`,
|
|
|
|
|
{
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: file,
|
|
|
|
|
contentType: file.type || 'application/octet-stream',
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
export function fetchAgentAssetVersions(assetId, limit = 5) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/versions${buildQuery({ limit })}`)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-18 02:48:51 +00:00
|
|
|
export function fetchAgentAssetVersionTimeline(assetId) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/version-timeline`)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-19 15:41:53 +00:00
|
|
|
export function fetchAgentAssetRuleJson(assetId) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/rule-json`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function saveAgentAssetRuleJson(assetId, payload, options = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/rule-json`, {
|
|
|
|
|
method: 'PUT',
|
|
|
|
|
body: JSON.stringify(payload),
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-23 19:54:42 +08:00
|
|
|
export function generateRiskRuleAsset(payload, options = {}) {
|
|
|
|
|
return apiRequest('/agent-assets/risk-rules/generate', {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: JSON.stringify(payload),
|
|
|
|
|
headers: buildWriteHeaders(options),
|
|
|
|
|
timeoutMs: options.timeoutMs || 60000,
|
|
|
|
|
timeoutMessage: '风险规则生成时间较长,请稍后查看是否已生成草稿。'
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-18 09:42:23 +00:00
|
|
|
export function fetchAgentAssetSpreadsheetChangeRecords(assetId, limit = 30) {
|
|
|
|
|
return apiRequest(
|
|
|
|
|
`/agent-assets/${assetId}/spreadsheet/change-records${buildQuery({ limit })}`
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
export function updateAgentAsset(assetId, payload, options = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}`, {
|
|
|
|
|
method: 'PATCH',
|
|
|
|
|
body: JSON.stringify(payload),
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function createAgentAssetVersion(assetId, payload, options = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/versions`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: JSON.stringify(payload),
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function createAgentAssetReview(assetId, payload, options = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/reviews`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
body: JSON.stringify(payload),
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function activateAgentAsset(assetId, options = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/activate`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-18 02:48:51 +00:00
|
|
|
export function restoreAgentAssetVersion(assetId, version, options = {}) {
|
|
|
|
|
return apiRequest(`/agent-assets/${assetId}/versions/${encodeURIComponent(version)}/restore`, {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: buildWriteHeaders(options)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
export function fetchAgentRuns(params = {}) {
|
|
|
|
|
return apiRequest(`/agent-runs${buildQuery(params)}`)
|
|
|
|
|
}
|
2026-05-15 09:36:16 +00:00
|
|
|
|
|
|
|
|
export function fetchAgentRunDetail(runId) {
|
|
|
|
|
return apiRequest(`/agent-runs/${encodeURIComponent(runId)}`)
|
|
|
|
|
}
|