|
|
|
|
@ -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,12 +106,17 @@ class UpdateUserTalentTags extends Command
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 按顺序尝试匹配每个课程,直到找到有对应报名用户的课程
|
|
|
|
|
$courseSign = null;
|
|
|
|
|
$matchedCourseName = null;
|
|
|
|
|
$matchedCourse = null;
|
|
|
|
|
|
|
|
|
|
foreach ($courseNames as $courseName) {
|
|
|
|
|
// 通过课程名称查找课程
|
|
|
|
|
$course = Course::where('name', $courseName)->first();
|
|
|
|
|
|
|
|
|
|
if (!$course) {
|
|
|
|
|
$this->warn("第 {$rowNum} 行: 未找到课程 '{$courseName}'(原始值: '{$courseNameRaw}'),跳过");
|
|
|
|
|
$notFoundCount++;
|
|
|
|
|
$this->info("第 {$rowNum} 行: 未找到课程 '{$courseName}',尝试下一个...");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -123,8 +128,22 @@ class UpdateUserTalentTags extends Command
|
|
|
|
|
->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}',尝试下一个...");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果所有课程都找不到匹配的用户,跳过
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|