diff --git a/app/Console/Commands/UpdateUserTalentTags.php b/app/Console/Commands/UpdateUserTalentTags.php index d34fdff..ac108f2 100644 --- a/app/Console/Commands/UpdateUserTalentTags.php +++ b/app/Console/Commands/UpdateUserTalentTags.php @@ -86,12 +86,12 @@ class UpdateUserTalentTags extends Command continue; } - // 提取第一个课程名称(可能包含多个课程,用换行符、顿号、逗号等分隔) - $courseName = $this->extractFirstCourseName($courseNameRaw); + // 提取所有课程名称(可能包含多个课程,用换行符、顿号、逗号等分隔) + $courseNames = $this->extractAllCourseNames($courseNameRaw); - // 如果提取的课程名称与原始不同,记录日志 - if ($courseName !== $courseNameRaw) { - $this->info("第 {$rowNum} 行: 检测到多个课程名称,使用第一个: '{$courseName}'"); + // 如果提取到多个课程名称,记录日志 + if (count($courseNames) > 1) { + $this->info("第 {$rowNum} 行: 检测到多个课程名称,将按顺序尝试匹配: " . implode(', ', $courseNames)); } if (empty($userName)) { @@ -106,25 +106,44 @@ class UpdateUserTalentTags extends Command continue; } - // 通过课程名称查找课程 - $course = Course::where('name', $courseName)->first(); - - if (!$course) { - $this->warn("第 {$rowNum} 行: 未找到课程 '{$courseName}'(原始值: '{$courseNameRaw}'),跳过"); - $notFoundCount++; - continue; + // 按顺序尝试匹配每个课程,直到找到有对应报名用户的课程 + $courseSign = null; + $matchedCourseName = null; + $matchedCourse = null; + + foreach ($courseNames as $courseName) { + // 通过课程名称查找课程 + $course = Course::where('name', $courseName)->first(); + + if (!$course) { + $this->info("第 {$rowNum} 行: 未找到课程 '{$courseName}',尝试下一个..."); + continue; + } + + // 通过课程ID和姓名查找用户(通过CourseSign关联) + $courseSign = CourseSign::where('course_id', $course->id) + ->whereHas('user', function ($query) use ($userName) { + $query->where('name', $userName); + }) + ->with('user') + ->first(); + + if ($courseSign && $courseSign->user) { + // 找到匹配的课程和用户,停止循环 + $matchedCourseName = $courseName; + $matchedCourse = $course; + if (count($courseNames) > 1) { + $this->info("第 {$rowNum} 行: 在课程 '{$matchedCourseName}' 中找到用户 '{$userName}'"); + } + break; + } else { + $this->info("第 {$rowNum} 行: 课程 '{$courseName}' 中未找到用户 '{$userName}',尝试下一个..."); + } } - // 通过课程ID和姓名查找用户(通过CourseSign关联) - $courseSign = CourseSign::where('course_id', $course->id) - ->whereHas('user', function ($query) use ($userName) { - $query->where('name', $userName); - }) - ->with('user') - ->first(); - + // 如果所有课程都找不到匹配的用户,跳过 if (!$courseSign || !$courseSign->user) { - $this->warn("第 {$rowNum} 行: 未找到用户 '{$userName}' 在课程 '{$courseName}' 中的报名记录,跳过"); + $this->warn("第 {$rowNum} 行: 在所有课程中都未找到用户 '{$userName}' 的报名记录(原始值: '{$courseNameRaw}'),跳过"); $notFoundCount++; continue; } @@ -254,13 +273,15 @@ class UpdateUserTalentTags extends Command } /** - * 从可能包含多个课程名称的字符串中提取第一个课程名称 + * 从可能包含多个课程名称的字符串中提取所有课程名称 * * @param string $courseNameRaw 原始课程名称字符串 - * @return string 第一个课程名称 + * @return array 所有课程名称数组 */ - protected function extractFirstCourseName($courseNameRaw) + protected function extractAllCourseNames($courseNameRaw) { + $courseNames = []; + // 先按换行符分割(\n, \r\n, \r) $parts = preg_split('/[\r\n]+/', $courseNameRaw); @@ -269,17 +290,21 @@ class UpdateUserTalentTags extends Command $parts = preg_split('/[、,,]+/', $courseNameRaw); } - // 取第一个非空部分 + // 提取所有非空部分 foreach ($parts as $part) { $part = trim($part); // 去除末尾可能的标点符号(顿号、逗号等) $part = rtrim($part, '、,,'); if (!empty($part)) { - return $part; + $courseNames[] = $part; } } - // 如果所有部分都为空,返回原始值 - return trim($courseNameRaw); + // 如果所有部分都为空,返回原始值作为单个元素 + if (empty($courseNames)) { + $courseNames[] = trim($courseNameRaw); + } + + return $courseNames; } }