diff --git a/src/api/modules/asset.ts b/src/api/modules/asset.ts index 90a8752..5ae7cd3 100644 --- a/src/api/modules/asset.ts +++ b/src/api/modules/asset.ts @@ -19,7 +19,9 @@ import type { AssetOrdersParams, AssetOrdersResponse, UpdateAssetRealnameStatusRequest, - DtoUpdateAssetRealnameStatusResponse + DtoUpdateAssetRealnameStatusResponse, + AssetOperationLogsResponse, + AssetOperationLogsParams } from '@/types/api' export class AssetService extends BaseService { @@ -231,4 +233,22 @@ export class AssetService extends BaseService { data ) } + + // ========== 资产操作审计日志 ========== + + /** + * 查询资产操作审计日志 + * GET /api/admin/assets/:identifier/operation-logs + * @param identifier 资产标识符 + * @param params 查询参数 + */ + static getOperationLogs( + identifier: string, + params?: AssetOperationLogsParams + ): Promise> { + return this.get>( + `/api/admin/assets/${identifier}/operation-logs`, + params + ) + } } diff --git a/src/types/api/asset.ts b/src/types/api/asset.ts index 898669a..dbdd3a4 100644 --- a/src/types/api/asset.ts +++ b/src/types/api/asset.ts @@ -434,3 +434,52 @@ export interface DtoUpdateAssetRealnameStatusResponse { real_name_status: number // 更新后的实名状态 (0:未实名, 1:已实名) real_name_status_name: string // 实名状态名称(中文) } + +// ========== 资产操作审计日志 ========== + +/** + * 操作审计日志项 + */ +export interface AssetOperationLogItem { + id: number // 日志ID + asset_id: number // 资产ID + asset_identifier: string // 资产标识符 + asset_type: string // 资产类型 + operation_type: string // 操作类型 + operation_desc: string // 操作描述 + result_status: 'success' | 'failed' | 'denied' // 执行结果 + created_at: string // 创建时间 + operator_id?: number // 操作人ID + operator_name: string // 操作人名称 + operator_type: string // 操作人类型 + before_data: Record // 操作前数据(原始) + after_data: Record // 操作后数据(原始) + operation_content_before?: Record // 操作内容(变更前) + operation_content_after?: Record // 操作内容(变更后) + operation_fields_desc?: Record // 字段中文说明 + batch_total: number // 批量总数 + success_count: number // 成功数量 + fail_count: number // 失败数量 + failed_items?: Array<{ iccid?: string; reason?: string }> // 失败明细 + reason?: string // 原因说明 +} + +/** + * 资产操作审计日志响应 + */ +export interface AssetOperationLogsResponse { + items: AssetOperationLogItem[] // 日志列表 + page: number // 当前页码 + page_size: number // 每页数量 + total: number // 总记录数 +} + +/** + * 资产操作审计日志查询参数 + */ +export interface AssetOperationLogsParams { + page?: number // 页码,默认1 + page_size?: number // 每页条数,默认20,最大100 + operation_type?: string // 操作类型 + result_status?: 'success' | 'failed' | 'denied' // 执行结果 +} diff --git a/src/views/asset-management/asset-information/components/OperationLogsCard.vue b/src/views/asset-management/asset-information/components/OperationLogsCard.vue new file mode 100644 index 0000000..0032af1 --- /dev/null +++ b/src/views/asset-management/asset-information/components/OperationLogsCard.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/src/views/asset-management/asset-information/index.vue b/src/views/asset-management/asset-information/index.vue index d329858..a18d7b7 100644 --- a/src/views/asset-management/asset-information/index.vue +++ b/src/views/asset-management/asset-information/index.vue @@ -82,6 +82,14 @@ @navigate-to-device="handleNavigateToDevice" /> + + +
+ +
@@ -162,6 +170,7 @@ import CurrentPackageCard from './components/CurrentPackageCard.vue' import PackageListCard from './components/PackageListCard.vue' import WalletTransactionCard from './components/WalletTransactionCard.vue' + import OperationLogsCard from './components/OperationLogsCard.vue' // 引入对话框组件 import { diff --git a/src/views/package-management/package-list/index.vue b/src/views/package-management/package-list/index.vue index 4528673..ac76b7f 100644 --- a/src/views/package-management/package-list/index.vue +++ b/src/views/package-management/package-list/index.vue @@ -672,7 +672,7 @@ { prop: 'package_name', label: '套餐名称', - minWidth: 160, + width: 200, showOverflowTooltip: true, formatter: (row: PackageResponse) => { const hasPermission = hasAuth('package:detail') diff --git a/src/views/package-management/package-series/index.vue b/src/views/package-management/package-series/index.vue index 4246678..8dda9fc 100644 --- a/src/views/package-management/package-series/index.vue +++ b/src/views/package-management/package-series/index.vue @@ -564,7 +564,8 @@ { prop: 'series_name', label: '系列名称', - minWidth: 150, + minWidth: 200, + showOverflowTooltip: true, formatter: (row: PackageSeriesResponse) => { const hasPermission = hasAuth('package_series:detail') return h( diff --git a/src/views/package-management/series-grants/index.vue b/src/views/package-management/series-grants/index.vue index 727353e..2b11d39 100644 --- a/src/views/package-management/series-grants/index.vue +++ b/src/views/package-management/series-grants/index.vue @@ -1141,7 +1141,8 @@ { prop: 'series_name', label: '系列名称', - minWidth: 150, + width: 200, + showOverflowTooltip: true, formatter: (row: ShopSeriesGrantResponse) => { const hasPermission = hasAuth('series_grants:detail') return h(