|
|
@@ -0,0 +1,165 @@
|
|
|
+# 优化FundLogCollector管理员操作日志显示
|
|
|
+
|
|
|
+**时间**: 2025年06月21日 23:01
|
|
|
+**任务**: 日志收集器优化,解决日志ID 706280不知道钻石从哪里获取的问题
|
|
|
+
|
|
|
+## 问题分析
|
|
|
+
|
|
|
+### 原始问题
|
|
|
+用户日志ID 706280显示"获得钻石 10",但没有说明钻石的具体来源,用户不知道钻石是从哪里获取的。
|
|
|
+
|
|
|
+### 问题根源分析
|
|
|
+1. **数据查询结果**:
|
|
|
+ - 用户日志ID 706280对应fund_logs记录ID 508927
|
|
|
+ - fund_logs记录信息:
|
|
|
+ - operate_type = 3(对应LOG_TYPE::ADMIN,管理员操作)
|
|
|
+ - operate_id = 1387
|
|
|
+ - remark = "Admin Approved"
|
|
|
+
|
|
|
+2. **枚举理解错误**:
|
|
|
+ - 最初错误理解operate_type=3为"结算"操作
|
|
|
+ - 实际上operate_type=3对应LOG_TYPE::ADMIN(管理员操作)
|
|
|
+
|
|
|
+3. **数据不一致问题**:
|
|
|
+ - operate_id=1387指向的fund_admin记录不存在
|
|
|
+ - 可能是历史数据问题或记录已被删除
|
|
|
+
|
|
|
+4. **FundLogCollector处理不足**:
|
|
|
+ - 原有逻辑只能从备注中解析结构化信息
|
|
|
+ - 对于"Admin Approved"这样的简单备注无法提供有用信息
|
|
|
+ - 没有针对管理员操作的特殊处理逻辑
|
|
|
+
|
|
|
+## 优化方案
|
|
|
+
|
|
|
+### 1. 修正operate_type理解
|
|
|
+```php
|
|
|
+// 修正注释和逻辑
|
|
|
+// 特殊处理operate_type=3(管理员操作)的情况
|
|
|
+$operateTypeValue = is_object($record->operate_type) ? $record->operate_type->value : $record->operate_type;
|
|
|
+if ($operateTypeValue == 3) {
|
|
|
+ $sourceMessage = $this->getAdminOperationMessage($record, $action);
|
|
|
+ if ($sourceMessage) {
|
|
|
+ return "{$sourceMessage}{$action}{$fundName} {$amount}";
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 新增管理员操作消息处理方法
|
|
|
+```php
|
|
|
+private function getAdminOperationMessage(FundLogModel $record, string $action): ?string
|
|
|
+{
|
|
|
+ try {
|
|
|
+ // 尝试从fund_admin表获取详细信息
|
|
|
+ $adminOperation = \App\Module\Fund\Models\FundAdminModel::find($record->operate_id);
|
|
|
+
|
|
|
+ if ($adminOperation) {
|
|
|
+ // 如果找到管理员操作记录,使用其备注信息
|
|
|
+ if (!empty($adminOperation->remark) && $adminOperation->remark !== 'Admin Approved') {
|
|
|
+ return "管理员操作({$adminOperation->remark})";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取管理员信息
|
|
|
+ $adminInfo = $this->getAdminInfo($adminOperation->admin_id);
|
|
|
+ return "管理员操作({$adminInfo})";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有找到对应的管理员操作记录,尝试使用fund_logs的备注
|
|
|
+ if (!empty($record->remark) && $record->remark !== 'Admin Approved') {
|
|
|
+ return "管理员操作({$record->remark})";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果备注也没有有用信息,显示操作ID
|
|
|
+ return "管理员操作(ID:{$record->operate_id})";
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ return "管理员操作";
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 新增管理员信息获取方法
|
|
|
+```php
|
|
|
+private function getAdminInfo(int $adminId): string
|
|
|
+{
|
|
|
+ try {
|
|
|
+ // 尝试获取管理员用户信息
|
|
|
+ $adminUser = \Dcat\Admin\Models\Administrator::find($adminId);
|
|
|
+ if ($adminUser && !empty($adminUser->name)) {
|
|
|
+ return $adminUser->name;
|
|
|
+ }
|
|
|
+
|
|
|
+ return "管理员{$adminId}";
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ return "管理员{$adminId}";
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 测试验证
|
|
|
+
|
|
|
+### 1. 创建测试命令
|
|
|
+创建了`TestFundLogCollectorCommand`用于测试优化效果:
|
|
|
+```bash
|
|
|
+php artisan game:test-fund-log-collector {fund_log_id}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 测试结果
|
|
|
+
|
|
|
+#### 测试案例1:原问题记录(ID: 508927)
|
|
|
+- **优化前**:`获得钻石 10`
|
|
|
+- **优化后**:`管理员操作(ID:1387)获得钻石 10`
|
|
|
+- **说明**:清楚显示了钻石来源是管理员操作,并提供了操作ID
|
|
|
+
|
|
|
+#### 测试案例2:有管理员信息的记录(ID: 515700)
|
|
|
+- **优化后**:`管理员操作(Administrator)获得钻石 10000`
|
|
|
+- **说明**:显示了具体的管理员名称
|
|
|
+
|
|
|
+#### 测试案例3:有详细备注的记录(ID: 515273)
|
|
|
+- **优化后**:`管理员操作(系统充值 - 用于Transfer模块测试)获得钻石 10000`
|
|
|
+- **说明**:显示了详细的操作说明
|
|
|
+
|
|
|
+## 优化效果
|
|
|
+
|
|
|
+### 1. 问题解决
|
|
|
+- ✅ 解决了"不知道钻石从哪里获取"的问题
|
|
|
+- ✅ 为管理员操作提供了清晰的来源说明
|
|
|
+- ✅ 处理了数据不一致的历史问题
|
|
|
+
|
|
|
+### 2. 信息层次
|
|
|
+优化后的消息提供了三个层次的信息:
|
|
|
+1. **最佳情况**:`管理员操作(具体备注说明)获得钻石 X`
|
|
|
+2. **中等情况**:`管理员操作(管理员名称)获得钻石 X`
|
|
|
+3. **最低情况**:`管理员操作(ID:操作ID)获得钻石 X`
|
|
|
+
|
|
|
+### 3. 向后兼容
|
|
|
+- 保持了原有的处理逻辑
|
|
|
+- 只对operate_type=3的记录进行特殊处理
|
|
|
+- 不影响其他类型的日志收集
|
|
|
+
|
|
|
+## 技术要点
|
|
|
+
|
|
|
+### 1. 枚举处理
|
|
|
+正确处理了operate_type可能是枚举对象的情况:
|
|
|
+```php
|
|
|
+$operateTypeValue = is_object($record->operate_type) ? $record->operate_type->value : $record->operate_type;
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 异常处理
|
|
|
+添加了完善的异常处理,确保即使查询失败也能提供基本信息。
|
|
|
+
|
|
|
+### 3. 数据回退策略
|
|
|
+实现了多层回退策略:
|
|
|
+1. 优先使用fund_admin表的详细信息
|
|
|
+2. 回退到fund_logs表的备注信息
|
|
|
+3. 最后回退到显示操作ID
|
|
|
+
|
|
|
+## 总结
|
|
|
+
|
|
|
+通过这次优化,成功解决了用户日志中管理员操作来源不明确的问题。现在用户可以清楚地知道钻石是通过管理员操作获得的,并且能够看到具体的操作说明或管理员信息。这大大提升了日志的可读性和用户体验。
|
|
|
+
|
|
|
+优化后的FundLogCollector能够:
|
|
|
+- 正确识别管理员操作类型
|
|
|
+- 提供详细的操作来源信息
|
|
|
+- 处理历史数据不一致问题
|
|
|
+- 保持向后兼容性
|