BatchUpdateTalentAction.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace App\Module\UrsPromotion\AdminControllers\Actions;
  3. use App\Module\UrsPromotion\Models\UrsUserTalent;
  4. use App\Module\UrsPromotion\Services\UrsTalentService;
  5. use App\Module\UrsPromotion\Enums\UrsTalentLevel;
  6. use UCore\DcatAdmin\Grid\BatchAction;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\Log;
  9. use Dcat\Admin\Admin;
  10. /**
  11. * 批量更新达人等级操作
  12. *
  13. * 提供批量更新选中用户达人等级的功能
  14. */
  15. class BatchUpdateTalentAction extends BatchAction
  16. {
  17. /**
  18. * 操作按钮标题
  19. *
  20. * @var string
  21. */
  22. protected $title = '批量更新达人等级';
  23. /**
  24. * 确认弹窗信息
  25. *
  26. * @return string
  27. */
  28. public function confirm()
  29. {
  30. return '确定要批量更新选中用户的达人等级吗?系统将重新计算每个用户的团队数据并更新达人等级。';
  31. }
  32. /**
  33. * 处理批量更新请求
  34. *
  35. * @param Request $request
  36. * @return mixed
  37. */
  38. public function handle(Request $request)
  39. {
  40. $keys = $this->getKey();
  41. if (empty($keys)) {
  42. return $this->response()->error('请选择要更新的用户');
  43. }
  44. try {
  45. // 获取选中的达人记录
  46. $talents = UrsUserTalent::whereIn('id', $keys)->get();
  47. if ($talents->isEmpty()) {
  48. return $this->response()->error('未找到要更新的用户达人记录');
  49. }
  50. // 提取用户ID数组
  51. $ursUserIds = $talents->pluck('user_id')->toArray();
  52. // 批量更新达人等级
  53. $results = UrsTalentService::batchUpdateTalentLevels($ursUserIds);
  54. // 统计更新结果
  55. $successCount = 0;
  56. $failureCount = 0;
  57. $upgradedUsers = [];
  58. $errorMessages = [];
  59. foreach ($results as $ursUserId => $result) {
  60. if ($result['success']) {
  61. $successCount++;
  62. // 检查是否有等级变化
  63. $originalTalent = $talents->where('user_id', $ursUserId)->first();
  64. if ($originalTalent && $originalTalent->talent_level !== $result['talent_level']) {
  65. $oldLevelName = UrsTalentLevel::getLevelName($originalTalent->talent_level);
  66. $newLevelName = UrsTalentLevel::getLevelName($result['talent_level']);
  67. $upgradedUsers[] = "URS用户{$ursUserId}: {$oldLevelName} → {$newLevelName}";
  68. }
  69. } else {
  70. $failureCount++;
  71. $errorMessages[] = "URS用户{$ursUserId}: {$result['error']}";
  72. }
  73. }
  74. // 构建响应消息
  75. $message = "批量更新完成!成功更新 {$successCount} 个用户";
  76. if ($failureCount > 0) {
  77. $message .= ",失败 {$failureCount} 个用户";
  78. }
  79. if (!empty($upgradedUsers)) {
  80. $message .= "\n\n等级变化:\n" . implode("\n", $upgradedUsers);
  81. }
  82. if (!empty($errorMessages)) {
  83. $message .= "\n\n失败详情:\n" . implode("\n", array_slice($errorMessages, 0, 5));
  84. if (count($errorMessages) > 5) {
  85. $message .= "\n...还有 " . (count($errorMessages) - 5) . " 个错误";
  86. }
  87. }
  88. // 记录操作日志
  89. Log::info('批量更新URS达人等级', [
  90. 'operator' => Admin::user()->username ?? 'system',
  91. 'selected_count' => count($keys),
  92. 'success_count' => $successCount,
  93. 'failure_count' => $failureCount,
  94. 'urs_user_ids' => $ursUserIds,
  95. 'upgraded_users' => $upgradedUsers,
  96. ]);
  97. if ($failureCount === 0) {
  98. return $this->response()
  99. ->success($message)
  100. ->refresh();
  101. } else {
  102. return $this->response()
  103. ->warning($message)
  104. ->refresh();
  105. }
  106. } catch (\Exception $e) {
  107. Log::error('批量更新URS达人等级失败', [
  108. 'operator' => Admin::user()->username ?? 'system',
  109. 'selected_keys' => $keys,
  110. 'error' => $e->getMessage(),
  111. 'trace' => $e->getTraceAsString()
  112. ]);
  113. return $this->response()->error('批量更新失败:' . $e->getMessage());
  114. }
  115. }
  116. }