# 资产操作审计日志功能总结

## 1. 功能目标

为资产域（IoT 卡/设备）补齐统一审计落库能力，解决“谁在什么时间对哪个资产做了什么变更、结果如何”的追溯问题。

## 2. 数据模型与落库

- 新增表：`tb_asset_operation_log`
- 关键字段：
  - 操作人：`operator_id/operator_type/operator_name`
  - 资产：`asset_type/asset_id/asset_identifier`
  - 操作：`operation_type/operation_desc`
  - 镜像：`before_data/after_data`（JSONB）
  - 请求上下文：`request_id/ip_address/user_agent/request_path/request_method`
  - 结果：`result_status/error_code/error_msg`
  - 批量统计：`batch_total/success_count/fail_count`
- 索引：
  - `idx_asset_log_asset_created`
  - `idx_asset_log_identifier_created`
  - `idx_asset_log_operator_created`
  - `idx_asset_log_operation_created`
  - `idx_asset_log_result_created`

## 3. 统一封装设计

### 3.1 基础设施统一入口

- `internal/service/asset_audit/service.go`
  - 统一 `LogOperation(ctx, log)` 异步写入
  - 写入失败只打 Error 日志，不阻断业务
- `internal/service/asset_audit/builder.go`
  - 统一组装 `before/after`、请求上下文、错误码摘要
  - 统一脱敏与裁剪

### 3.2 业务侧统一 helper

- IoT 卡：`internal/service/iot_card/audit.go`
- 设备：`internal/service/device/audit.go`
- 统一资产入口轮询：`internal/service/polling/asset_polling_service.go` 内部 helper
- 资产停用：`internal/service/asset/lifecycle_service.go` 内部 helper
- 导入任务：
  - `internal/service/device_import/audit.go`
  - `internal/service/iot_card_import/audit.go`

业务函数只传结构化参数，避免日志拼装散落在各分支。

## 4. 覆盖范围

### 4.1 IoT 卡

- 分配/回收、系列绑定、轮询开关、实名策略、手动实名状态、删除/批量删除
- 自动停复机 + 手动停复机（含 denied/failed）

### 4.2 设备

- 删除、分配/回收、系列绑定、绑卡/解绑
- 设备停机/复机（含成功数、失败数、失败摘要）
- 远程控制：限速、WiFi、切卡、切卡模式、重启、恢复出厂

### 4.3 统一资产入口与导入

- 统一入口：停用、轮询状态、实名策略
- 导入任务创建：设备导入、卡导入

## 5. 脱敏与体积控制

- 敏感键脱敏：`password/passwd/pwd/secret/token/wifi_password/wifipwd`
- WiFi 场景使用 `password` 键传参，落库前统一掩码处理
- `before_data/after_data` 超过阈值时裁剪并标记 `_truncated=true`

## 6. 查询与排障示例

### 6.1 审计日志查询 API（前端）

- 路径：`GET /api/admin/assets/:identifier/operation-logs`
- 操作人相关字段：
  - `operator_type` 返回中文标准文案（如平台用户、代理账号、企业账号、个人客户、系统）
  - `operator_type_code` 保留底层枚举编码（如 `admin_user`、`agent_user`）
  - `operator_name` 优先返回可读名称，历史 `类型#ID` 占位值会在查询时尽量补全
- 建议前端优先使用：
  - `operation_content_before`（操作内容变更前）
  - `operation_content_after`（操作内容变更后）
  - `operation_fields_desc`（字段中文说明）
- 原始字段 `before_data/after_data` 建议仅用于调试回放。
- 字段明细文档：`docs/add-asset-operation-audit-log/操作内容字段说明.md`

### 6.2 SQL 排障示例

完整 SQL 见：

- `docs/add-asset-operation-audit-log/手工验收脚本.sql`

常用排障问题：

1. 某资产最近操作：按 `asset_type + asset_id` 查询
2. 某操作人近期高风险动作：按 `operator_id` + `result_status in ('failed','denied')`
3. WiFi 明文泄露检查：检索 `after_data::text ILIKE '%\"password\":\"%'` 并人工确认是否掩码
