From ba280b3d5ea4d71e2f15fdb56ce60c4a05f422c1 Mon Sep 17 00:00:00 2001 From: yan9651688 <174289968+yan9651688@users.noreply.github.com> Date: Thu, 8 Oct 2026 01:10:22 -0700 Subject: [PATCH] feat(ops): show account names in request details table --- frontend/src/i18n/locales/en/admin/ops.ts | 1 + frontend/src/i18n/locales/zh/admin/ops.ts | 1 + .../ops/components/OpsRequestDetailsModal.vue | 33 +++++++++++++++++++ .../__tests__/OpsRequestDetailsModal.spec.ts | 31 ++++++++++++++--- .../views/admin/ops/utils/accountNameMap.ts | 33 +++++++++++++++++++ 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 frontend/src/views/admin/ops/utils/accountNameMap.ts diff --git a/frontend/src/i18n/locales/en/admin/ops.ts b/frontend/src/i18n/locales/en/admin/ops.ts index c68b7ebea9..acfdcb2078 100644 --- a/frontend/src/i18n/locales/en/admin/ops.ts +++ b/frontend/src/i18n/locales/en/admin/ops.ts @@ -428,6 +428,7 @@ export default { kind: 'Kind', platform: 'Platform', model: 'Model', + account: 'Account', duration: 'Duration', status: 'Status', requestId: 'Request ID', diff --git a/frontend/src/i18n/locales/zh/admin/ops.ts b/frontend/src/i18n/locales/zh/admin/ops.ts index bc37c12453..e3c14b598a 100644 --- a/frontend/src/i18n/locales/zh/admin/ops.ts +++ b/frontend/src/i18n/locales/zh/admin/ops.ts @@ -428,6 +428,7 @@ export default { kind: '类型', platform: '平台', model: '模型', + account: '账号', duration: '耗时', status: '状态码', requestId: '请求ID', diff --git a/frontend/src/views/admin/ops/components/OpsRequestDetailsModal.vue b/frontend/src/views/admin/ops/components/OpsRequestDetailsModal.vue index d388829897..8d2d266216 100644 --- a/frontend/src/views/admin/ops/components/OpsRequestDetailsModal.vue +++ b/frontend/src/views/admin/ops/components/OpsRequestDetailsModal.vue @@ -8,6 +8,7 @@ import { useClipboard } from '@/composables/useClipboard' import { useAppStore } from '@/stores' import { opsAPI, type OpsRequestDetailsParams, type OpsRequestDetail } from '@/api/admin/ops' import { parseTimeRangeMinutes, formatDateTime } from '../utils/opsFormatters' +import { getAccountNameMap } from '../utils/accountNameMap' export interface OpsRequestDetailsPreset { title: string @@ -44,6 +45,7 @@ const items = ref([]) const total = ref(0) const page = ref(1) const pageSize = ref(10) +const accountNameById = ref>(new Map()) const close = () => emit('update:modelValue', false) @@ -93,6 +95,7 @@ const fetchData = async () => { const res = await opsAPI.listRequestDetails(params) items.value = res.items || [] total.value = res.total || 0 + refreshAccountNames() } catch (e: any) { console.error('[OpsRequestDetailsModal] Failed to fetch request details', e) appStore.showError(e?.message || t('admin.ops.requestDetails.failedToLoad')) @@ -159,6 +162,27 @@ const kindBadgeClass = (kind: string) => { if (kind === 'error') return 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300' return 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300' } + +// 明细行只带 account_id;账号名来自 lite 账号列表映射,缺项时强制刷新一次缓存(新建账号场景)。 +async function refreshAccountNames() { + const ids = items.value + .map(row => row.account_id) + .filter((id): id is number => typeof id === 'number' && id > 0) + if (ids.length === 0) return + try { + let map = await getAccountNameMap() + if (ids.some(id => !map.has(id))) map = await getAccountNameMap(true) + accountNameById.value = map + } catch (e) { + console.warn('[OpsRequestDetailsModal] Failed to load account names', e) + } +} + +function accountLabel(row: OpsRequestDetail): string { + const id = row.account_id + if (typeof id !== 'number' || id <= 0) return '-' + return accountNameById.value.get(id) || `#${id}` +}