From 322b17137831948714a20795bb41035b3a4b8827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=BF=97?= Date: Tue, 6 Jan 2026 15:38:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/MatchService.php | 129 ++++++++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 11 deletions(-) diff --git a/app/service/MatchService.php b/app/service/MatchService.php index 2af5797..9f12fb7 100644 --- a/app/service/MatchService.php +++ b/app/service/MatchService.php @@ -172,6 +172,22 @@ class MatchService 'education_count' => count($resume['education'] ?? []), 'birth_date' => $resume['birth_date'] ?? '', 'gender' => $resume['gender'] ?? '', + 'education_details' => array_map(function($edu) { + return [ + 'education_level' => $edu['education_level'] ?? '', + 'degree' => $edu['degree'] ?? '', + 'majors_name' => $edu['majors_name'] ?? '', + 'majors_code' => $edu['majors_code'] ?? '', + 'majors_category' => $edu['majors_category'] ?? '', + 'school_name' => $edu['school_name'] ?? '', + ]; + }, $resume['education'] ?? []), + 'education_raw' => array_map(function($edu) { + // 返回原始数据的前几个字段用于调试(避免数据过大) + $raw = $edu['_raw'] ?? []; + // 只返回前15个字段 + return array_slice($raw, 0, 15, true); + }, $resume['education'] ?? []), ], 'first_zero_reason' => $firstZeroScoreReason ] @@ -265,6 +281,40 @@ class MatchService } } + // 3.1 如果教育经历里有专业代码,预先加载专业表(da_majors)以便解析专业名称 + $majorCodeMap = []; + $majorCodes = []; + foreach ($educations as $education) { + $codeFields = ['major_code', 'majors_code', 'code', 'major_id', 'majors_id', 'major_no']; + foreach ($codeFields as $field) { + if (!empty($education[$field])) { + $majorCodes[] = $education[$field]; + } + } + } + $majorCodes = array_values(array_unique($majorCodes)); + + if (!empty($majorCodes)) { + try { + $majors = Db::name('da_majors') + ->whereIn('code', $majorCodes) + ->select() + ->toArray(); + foreach ($majors as $major) { + $code = $major['code'] ?? $major['major_code'] ?? null; + if (!$code) { + continue; + } + $majorCodeMap[$code] = [ + 'name' => $major['major_name'] ?? $major['name'] ?? $major['title'] ?? '', + 'category' => $major['category_name'] ?? $major['category'] ?? $major['major_category'] ?? '', + ]; + } + } catch (\Exception $e) { + // da_majors 表不存在或字段不匹配时忽略 + } + } + // 构建简历数据结构 $resume = [ 'user_id' => $userId, @@ -281,12 +331,51 @@ class MatchService // 处理教育经历数据,确保字段名正确 foreach ($educations as $education) { + // 尝试多种可能的专业字段名 + $majorName = ''; + $possibleMajorFields = [ + 'majors_name', 'major_name', 'major', 'major_field', + 'specialty', 'profession', 'discipline', 'subject', + '专业名称', '专业', '学科专业', '专业类别' + ]; + foreach ($possibleMajorFields as $field) { + if (!empty($education[$field])) { + $majorName = $education[$field]; + break; + } + } + + // 如果有专业代码但没有名称,尝试从 da_majors 映射获取 + if (empty($majorName)) { + $codeFields = ['major_code', 'majors_code', 'code', 'major_id', 'majors_id', 'major_no']; + foreach ($codeFields as $field) { + if (!empty($education[$field]) && isset($majorCodeMap[$education[$field]])) { + $majorName = $majorCodeMap[$education[$field]]['name'] ?? ''; + $education['major_category'] = $majorCodeMap[$education[$field]]['category'] ?? ''; + break; + } + } + } + + // 保存专业代码,便于后续调试 + $majorCode = ''; + foreach (['major_code', 'majors_code', 'code', 'major_id', 'majors_id', 'major_no'] as $field) { + if (!empty($education[$field])) { + $majorCode = $education[$field]; + break; + } + } + $resume['education'][] = [ - 'education_level' => $education['education_level'] ?? $education['education'] ?? '', - 'degree' => $education['degree'] ?? '', - 'majors_name' => $education['majors_name'] ?? $education['major'] ?? $education['major_name'] ?? '', - 'school_name' => $education['school_name'] ?? $education['school'] ?? '', - 'graduation_date' => $education['graduation_date'] ?? '', + 'education_level' => $education['education_level'] ?? $education['education'] ?? $education['学历'] ?? '', + 'degree' => $education['degree'] ?? $education['学位'] ?? '', + 'majors_name' => $majorName, + 'majors_code' => $majorCode, + 'majors_category' => $education['major_category'] ?? $education['专业类别'] ?? '', + 'school_name' => $education['school_name'] ?? $education['school'] ?? $education['学校名称'] ?? '', + 'graduation_date' => $education['graduation_date'] ?? $education['毕业时间'] ?? '', + // 保存原始数据用于调试 + '_raw' => $education ]; } @@ -659,8 +748,16 @@ class MatchService $matchedMajors = []; foreach ($educations as $education) { - $majorName = $education['majors_name'] ?? ''; - if ($this->isMajorCategoryMatch($majorName, $requirement)) { + // 尝试多种可能的专业字段名 + $majorName = $education['majors_name'] ?? + $education['major_name'] ?? + $education['major'] ?? + $education['major_field'] ?? + $education['specialty'] ?? + $education['profession'] ?? + $education['majors_category'] ?? ''; + + if (!empty($majorName) && $this->isMajorCategoryMatch($majorName, $requirement)) { $matchedMajors[] = $majorName; } } @@ -673,10 +770,20 @@ class MatchService ]; } - $actualMajors = array_map(function($edu) { - return $edu['majors_name'] ?? ''; - }, $educations); - $actualMajors = array_filter($actualMajors); + // 收集所有专业名称用于错误信息 + $actualMajors = []; + foreach ($educations as $edu) { + $majorName = $edu['majors_name'] ?? + $edu['major_name'] ?? + $edu['major'] ?? + $edu['major_field'] ?? + $edu['specialty'] ?? + $edu['profession'] ?? + $edu['majors_category'] ?? ''; + if (!empty($majorName)) { + $actualMajors[] = $majorName; + } + } return [ 'passed' => false,