refactor: remove admin recommendation summaries

This commit is contained in:
Lan
2026-06-03 10:24:07 +08:00
parent fcda596973
commit 08d8f200f8
9 changed files with 48 additions and 1401 deletions
+1 -155
View File
@@ -22,10 +22,6 @@ import type {
AdminFileStatusFilter,
AdminFileSummary,
AdminFileTypeFilter,
AdminFileViewSummary,
AdminFileViewSummaryItem,
AdminFileViewSummaryViewData,
AdminFileViewSummaryViewItem,
AdminFileViewPreset,
AdminFileViewPresetParams,
AdminFileViewPresetRequest,
@@ -62,18 +58,6 @@ const emptySummary = (): AdminFileSummary => ({
usedCount: 0
})
const emptyViewSummary = (): AdminFileViewSummaryViewData => ({
total: 0,
filteredTotal: 0,
allTotal: 0,
activeFilterCount: 0,
hasFilters: false,
strongestSeverity: 'success',
summary: emptySummary(),
cards: [],
actions: []
})
const normalizeCount = (value: number | string | null | undefined) => Number(value || 0)
const isExpiredByDate = (value: string | null | undefined) => {
@@ -228,7 +212,6 @@ export function useAdminFiles() {
const isLoading = ref(false)
const isSaving = ref(false)
const summary = ref<AdminFileSummary>(emptySummary())
const viewSummary = ref<AdminFileViewSummaryViewData>(emptyViewSummary())
const params = ref<AdminFileListParams & { total: number }>({
page: 1,
size: 10,
@@ -540,7 +523,7 @@ export function useAdminFiles() {
}
const normalizeInsightSeverity = (
severity: AdminFileInsightSeverity | string | undefined
severity: AdminFileInsightSeverity | undefined
): AdminFileInsightSeverity => {
if (severity === 'success' || severity === 'warning' || severity === 'danger') {
return severity
@@ -551,131 +534,6 @@ export function useAdminFiles() {
return 'neutral'
}
const normalizeViewSummaryItems = (
items: AdminFileViewSummaryItem[] = []
): AdminFileViewSummaryViewItem[] =>
items
.filter((item) => item && item.key)
.map((item) => {
const actionTypeValue = item.actionType ?? item.action_type ?? 'filter'
const sourceKeyValue = item.sourceKey ?? item.source_key ?? item.key
const suggestedActionValue = item.suggestedAction ?? item.suggested_action ?? sourceKeyValue
const targetHealthValue = item.targetHealth ?? item.target_health ?? item.health ?? 'all'
return {
...item,
count: normalizeCount(item.count),
priority: normalizeCount(item.priority),
severity: normalizeInsightSeverity(item.severity),
actionTypeValue,
sourceKeyValue,
suggestedActionValue,
targetHealthValue
}
})
const buildFallbackViewSummary = (
files: AdminFileViewItem[],
total: number,
rawSummary?: Partial<AdminFileSummary>
): AdminFileViewSummaryViewData => {
const normalizedSummary = normalizeSummary(rawSummary, files, total)
const cards: AdminFileViewSummaryItem[] = [
{
key: 'storage_issue',
severity: 'danger',
priority: 100,
count: normalizedSummary.storageIssueCount,
targetHealth: 'storage_issue'
},
{
key: 'expired',
severity: normalizedSummary.expiredCount >= 10 ? 'danger' : 'warning',
priority: 90,
count: normalizedSummary.expiredCount,
targetHealth: 'expired'
},
{
key: 'expiring_soon',
severity: 'warning',
priority: 80,
count: normalizedSummary.expiringSoonCount,
targetHealth: 'expiring_soon'
},
{
key: 'never_retrieved',
severity: 'neutral',
priority: 60,
count: normalizedSummary.neverRetrievedCount,
targetHealth: 'never_retrieved'
}
].filter((item) => item.count > 0)
if (cards.length === 0) {
cards.push({
key: normalizedSummary.totalFiles > 0 ? 'healthy' : 'empty',
severity: normalizedSummary.totalFiles > 0 ? 'success' : 'neutral',
priority: 10,
count: normalizedSummary.totalFiles,
targetHealth: normalizedSummary.totalFiles > 0 ? 'healthy' : 'all'
})
}
const normalizedCards = normalizeViewSummaryItems(cards)
return {
total,
filteredTotal: total,
allTotal: summary.value.totalFiles || total,
activeFilterCount: hasActiveFilters.value ? 1 : 0,
hasFilters: hasActiveFilters.value,
strongestSeverity: normalizedCards[0]?.severity ?? 'success',
summary: normalizedSummary,
cards: normalizedCards,
actions: normalizedCards.filter((item) => item.severity !== 'success')
}
}
const normalizeViewSummary = (
rawViewSummary: AdminFileViewSummary | undefined,
files: AdminFileViewItem[],
total: number,
rawSummary?: Partial<AdminFileSummary>
): AdminFileViewSummaryViewData => {
if (!rawViewSummary) {
return buildFallbackViewSummary(files, total, rawSummary)
}
const cards = normalizeViewSummaryItems(rawViewSummary.cards ?? rawViewSummary.items ?? [])
const actions = normalizeViewSummaryItems(rawViewSummary.actions ?? [])
const rawSummarySource =
rawViewSummary.summary ??
rawViewSummary.healthSummary ??
rawViewSummary.health_summary ??
rawSummary
const filteredTotal = rawViewSummary.filteredTotal ?? rawViewSummary.filtered_total ?? total
const allTotal = rawViewSummary.allTotal ?? rawViewSummary.all_total ?? summary.value.totalFiles
const strongestSeverity =
rawViewSummary.strongestSeverity ??
rawViewSummary.strongest_severity ??
cards[0]?.severity ??
'success'
const normalizedSummary = normalizeSummary(rawSummarySource, files, total)
return {
total: normalizeCount(rawViewSummary.total ?? total),
filteredTotal: normalizeCount(filteredTotal),
allTotal: normalizeCount(allTotal),
activeFilterCount: normalizeCount(
rawViewSummary.activeFilterCount ?? rawViewSummary.active_filter_count
),
hasFilters: Boolean(rawViewSummary.hasFilters ?? rawViewSummary.has_filters),
strongestSeverity: normalizeInsightSeverity(strongestSeverity),
summary: normalizedSummary,
cards: cards.length > 0 ? cards : buildFallbackViewSummary(files, total, rawSummary).cards,
actions
}
}
const createFileViewItem = (file: FileListItem): AdminFileViewItem => {
const isTextFile = inferIsText(file)
const isExpiredFile = inferIsExpired(file)
@@ -1242,17 +1100,6 @@ export function useAdminFiles() {
tableData.value = res.detail.data.map(createFileViewItem)
params.value.total = res.detail.total
summary.value = normalizeSummary(res.detail.summary, tableData.value, res.detail.total)
viewSummary.value = normalizeViewSummary(
res.detail.viewSummary ??
res.detail.view_summary ??
res.detail.currentViewSummary ??
res.detail.current_view_summary ??
res.detail.actionSummary ??
res.detail.action_summary,
tableData.value,
res.detail.total,
res.detail.summary
)
syncSelectedFilesWithCurrentPage()
} catch (error) {
hasLoadError.value = true
@@ -1820,7 +1667,6 @@ export function useAdminFiles() {
selectedViewPresetId,
storageUsedText,
summary,
viewSummary,
showBatchEditModal,
showEditModal,
showFileDetailModal,
+43 -205
View File
@@ -7,13 +7,6 @@ import type {
DashboardActivityViewItem,
DashboardData,
DashboardHealthSummary,
DashboardInsightSeverity,
DashboardMaintenanceQueue,
DashboardMaintenanceQueueItem,
DashboardMaintenanceQueueSummary,
DashboardMaintenanceQueueViewItem,
DashboardOperationalInsight,
DashboardOperationalInsightViewItem,
DashboardViewData
} from '@/types'
import { formatFileSize, getErrorMessage } from '@/utils/common'
@@ -25,54 +18,49 @@ type UseDashboardStatsOptions = {
const activityTimelineLimit = 40
function emptyDashboardData(): DashboardViewData {
return {
hasExtendedStats: false,
totalFiles: 0,
storageUsed: 0,
yesterdayCount: 0,
todayCount: 0,
yesterdaySize: 0,
todaySize: 0,
sysUptime: null,
activeCount: 0,
expiredCount: 0,
textCount: 0,
fileCount: 0,
chunkedCount: 0,
usedCount: 0,
storageBackend: '-',
uploadSizeLimit: 0,
openUpload: 0,
enableChunk: 0,
maxSaveSeconds: 0,
healthAttentionCount: 0,
healthDangerCount: 0,
healthWarningCount: 0,
expiringSoonCount: 0,
storageIssueCount: 0,
neverRetrievedCount: 0,
healthyCount: 0,
permanentCount: 0,
topSuffixes: [],
recentFiles: [],
recentActivities: [],
operationalInsights: [],
maintenanceItems: [],
maintenanceSummary: emptyMaintenanceSummary(),
storageUsedText: '0 Bytes',
yesterdaySizeText: '0 Bytes',
todaySizeText: '0 Bytes',
uploadSizeLimitText: '0 Bytes',
sysUptimeText: '-',
activeRatio: 0,
textRatio: 0,
fileRatio: 0,
healthyRatio: 0,
healthAttentionRatio: 0,
todaySizeRatio: 0
}
}
const emptyDashboardData = (): DashboardViewData => ({
hasExtendedStats: false,
totalFiles: 0,
storageUsed: 0,
yesterdayCount: 0,
todayCount: 0,
yesterdaySize: 0,
todaySize: 0,
sysUptime: null,
activeCount: 0,
expiredCount: 0,
textCount: 0,
fileCount: 0,
chunkedCount: 0,
usedCount: 0,
storageBackend: '-',
uploadSizeLimit: 0,
openUpload: 0,
enableChunk: 0,
maxSaveSeconds: 0,
healthAttentionCount: 0,
healthDangerCount: 0,
healthWarningCount: 0,
expiringSoonCount: 0,
storageIssueCount: 0,
neverRetrievedCount: 0,
healthyCount: 0,
permanentCount: 0,
topSuffixes: [],
recentFiles: [],
recentActivities: [],
storageUsedText: '0 Bytes',
yesterdaySizeText: '0 Bytes',
todaySizeText: '0 Bytes',
uploadSizeLimitText: '0 Bytes',
sysUptimeText: '-',
activeRatio: 0,
textRatio: 0,
fileRatio: 0,
healthyRatio: 0,
healthAttentionRatio: 0,
todaySizeRatio: 0
})
const toNumber = (value: number | string | null | undefined) => Number(value || 0)
@@ -121,150 +109,6 @@ const normalizeActivityOptions = (
count: toNumber(option.count)
}))
const insightSeverities: DashboardInsightSeverity[] = ['danger', 'warning', 'success', 'neutral']
const normalizeInsightSeverity = (severity: string | undefined): DashboardInsightSeverity =>
insightSeverities.includes(severity as DashboardInsightSeverity)
? (severity as DashboardInsightSeverity)
: 'neutral'
const normalizeOperationalInsights = (
insights: DashboardOperationalInsight[] = []
): DashboardOperationalInsightViewItem[] =>
insights
.filter((insight) => insight && insight.key)
.map((insight) => {
const action = insight.action && typeof insight.action === 'object' ? insight.action : {}
const actionTypeValue =
insight.actionType ??
insight.action_type ??
action.actionType ??
action.action_type ??
action.type ??
'file_queue'
const targetHealthValue =
insight.targetHealth ??
insight.target_health ??
action.targetHealth ??
action.target_health ??
action.health ??
null
return {
...insight,
count: toNumber(insight.count),
priority: toNumber(insight.priority),
severity: normalizeInsightSeverity(insight.severity),
actionTypeValue,
targetHealthValue
}
})
function emptyMaintenanceSummary(): DashboardMaintenanceQueueSummary {
return {
total: 0,
actionableCount: 0,
dangerCount: 0,
warningCount: 0,
successCount: 0,
neutralCount: 0,
fileQueueCount: 0,
settingsCount: 0,
strongestSeverity: 'success'
}
}
const normalizeMaintenanceQueueItems = (
items: DashboardMaintenanceQueueItem[] = []
): DashboardMaintenanceQueueViewItem[] =>
items
.filter((item) => item && item.key)
.map((item) => {
const action = item.action && typeof item.action === 'object' ? item.action : {}
const actionTypeValue =
item.actionType ??
item.action_type ??
action.actionType ??
action.action_type ??
action.type ??
'file_queue'
const targetHealthValue =
item.targetHealth ??
item.target_health ??
action.targetHealth ??
action.target_health ??
action.health ??
null
const suggestedActionValue =
item.suggestedAction ??
item.suggested_action ??
action.suggestedAction ??
action.suggested_action ??
'monitor'
return {
...item,
count: toNumber(item.count),
priority: toNumber(item.priority),
severity: normalizeInsightSeverity(item.severity),
actionTypeValue,
suggestedActionValue,
targetHealthValue
}
})
const normalizeMaintenanceSummary = (
summary: Partial<DashboardMaintenanceQueueSummary> | undefined,
items: DashboardMaintenanceQueueViewItem[]
): DashboardMaintenanceQueueSummary => ({
total: toNumber(summary?.total ?? items.length),
actionableCount: toNumber(summary?.actionableCount ?? summary?.actionable_count),
actionable_count: toNumber(summary?.actionableCount ?? summary?.actionable_count),
dangerCount: toNumber(summary?.dangerCount ?? summary?.danger_count),
danger_count: toNumber(summary?.dangerCount ?? summary?.danger_count),
warningCount: toNumber(summary?.warningCount ?? summary?.warning_count),
warning_count: toNumber(summary?.warningCount ?? summary?.warning_count),
successCount: toNumber(summary?.successCount ?? summary?.success_count),
success_count: toNumber(summary?.successCount ?? summary?.success_count),
neutralCount: toNumber(summary?.neutralCount ?? summary?.neutral_count),
neutral_count: toNumber(summary?.neutralCount ?? summary?.neutral_count),
fileQueueCount: toNumber(summary?.fileQueueCount ?? summary?.file_queue_count),
file_queue_count: toNumber(summary?.fileQueueCount ?? summary?.file_queue_count),
settingsCount: toNumber(summary?.settingsCount ?? summary?.settings_count),
settings_count: toNumber(summary?.settingsCount ?? summary?.settings_count),
strongestSeverity: normalizeInsightSeverity(
summary?.strongestSeverity ?? summary?.strongest_severity
),
strongest_severity: normalizeInsightSeverity(
summary?.strongestSeverity ?? summary?.strongest_severity
)
})
const normalizeMaintenanceQueue = (
detail: DashboardData | DashboardMaintenanceQueue
): Pick<DashboardViewData, 'maintenanceItems' | 'maintenanceSummary'> => {
const source = detail as DashboardData & DashboardMaintenanceQueue
const queue = source.maintenanceQueue ?? source.maintenance_queue ?? source
const items = normalizeMaintenanceQueueItems(
queue?.items ??
queue?.maintenanceItems ??
queue?.maintenance_items ??
source.maintenanceItems ??
source.maintenance_items ??
[]
)
const rawSummary =
queue?.summary ??
queue?.maintenanceSummary ??
queue?.maintenance_summary ??
source.maintenanceSummary ??
source.maintenance_summary
return {
maintenanceItems: items,
maintenanceSummary: normalizeMaintenanceSummary(rawSummary, items)
}
}
const healthSummaryKeys: (keyof DashboardHealthSummary)[] = [
'healthAttentionCount',
'healthDangerCount',
@@ -366,12 +210,6 @@ export function useDashboardStats(options: UseDashboardStatsOptions = {}) {
dashboardData.recentActivities = normalizeRecentActivities(
detail.recentActivities ?? detail.recent_activities ?? []
)
dashboardData.operationalInsights = normalizeOperationalInsights(
detail.operationalInsights ?? detail.operational_insights ?? detail.insights ?? []
)
const maintenanceQueue = normalizeMaintenanceQueue(detail)
dashboardData.maintenanceItems = maintenanceQueue.maintenanceItems
dashboardData.maintenanceSummary = maintenanceQueue.maintenanceSummary
dashboardData.storageUsedText = formatFileSize(dashboardData.storageUsed)
dashboardData.yesterdaySizeText = formatFileSize(dashboardData.yesterdaySize)