## ADDED Requirements ### Requirement: 资产域操作日志使用独立数据模型 系统 SHALL 为资产域操作日志使用独立数据模型与数据表,不得复用账号域日志表;资产日志模型 MUST 支持记录资产类型、资产ID、资产标识符、操作动作、操作结果、前后镜像和请求上下文。 #### Scenario: 新增资产日志表并独立于账号日志 - **WHEN** 系统初始化资产域审计能力 - **THEN** 系统使用独立的 `tb_asset_operation_log` 存储资产日志,且不写入 `tb_account_operation_log` #### Scenario: 资产日志表不使用外键约束 - **WHEN** 创建资产日志表结构 - **THEN** 表间关联通过 ID 字段维护,不创建数据库外键和 GORM 关联标签 ### Requirement: 资产敏感写操作必须全量记录 系统 SHALL 对卡和设备相关敏感写操作进行全量审计记录,结果态 MUST 覆盖 `success`、`failed`、`denied`。 #### Scenario: 成功操作写入 success 日志 - **WHEN** 设备分配、卡绑定、手动实名、停用等写操作执行成功 - **THEN** 系统写入 `result_status=success` 的资产操作日志 #### Scenario: 业务失败写入 failed 日志 - **WHEN** 写操作执行过程中发生网关失败或数据库失败 - **THEN** 系统写入 `result_status=failed` 的资产操作日志,并记录错误码与错误摘要 #### Scenario: 权限或规则拒绝写入 denied 日志 - **WHEN** 操作被权限规则、保护期规则或业务前置条件拒绝 - **THEN** 系统写入 `result_status=denied` 的资产操作日志,并记录拒绝原因 ### Requirement: 审计日志必须包含完整上下文 系统 SHALL 在资产日志中记录“谁、何时、做了什么、从什么变成什么”,并包含请求链路上下文。 #### Scenario: 记录操作人和时间 - **WHEN** 生成任一资产操作日志 - **THEN** 日志包含 `operator_id`、`operator_type`、`operator_name` 与 `created_at` #### Scenario: 记录前后镜像 - **WHEN** 记录状态流转或配置修改类操作 - **THEN** 日志同时包含 `before_data` 和 `after_data`,可直接体现变更差异 #### Scenario: 记录请求上下文 - **WHEN** 记录资产操作日志 - **THEN** 日志包含 `request_id`、`ip_address`、`user_agent`、`request_path`、`request_method` ### Requirement: 审计写入异步且不阻塞主流程 系统 SHALL 采用异步方式写入资产审计日志,日志写入失败 MUST 不影响业务主流程结果。 #### Scenario: 异步写入 - **WHEN** 业务操作完成并触发审计记录 - **THEN** 主流程先返回业务结果,日志由异步流程落库 #### Scenario: 日志写入失败降级 - **WHEN** 资产日志落库失败 - **THEN** 系统仅记录 Error 级别应用日志,不回滚已成功的主业务操作 ### Requirement: 敏感字段脱敏与日志体积控制 系统 SHALL 对敏感字段执行脱敏处理,并对日志体积设置上限,避免泄露与性能风险。 #### Scenario: 远程配置敏感字段脱敏 - **WHEN** 记录设备 WiFi/密码等敏感配置变更日志 - **THEN** `before_data`/`after_data` 中不得出现明文密码,仅保留掩码或摘要 #### Scenario: 超长数据裁剪 - **WHEN** 业务上下文数据超过日志体积阈值 - **THEN** 系统对超长字段进行裁剪并保留裁剪标记,保证日志写入稳定