This commit is contained in:
杨志
2026-01-06 15:19:16 +08:00
parent bcabbcd40a
commit 8013a2aad0

View File

@@ -111,7 +111,7 @@ class MatchService
*/
private function getUserResumeFromDb(int $userId): array
{
// 获取用户基本信息
// 1. 获取用户基本信息t_user表
$user = Db::name('t_user')->where('uid', $userId)->find();
if (empty($user)) {
return [];
@@ -122,140 +122,130 @@ class MatchService
$user = $user->toArray();
}
// 2. 获取用户简历信息t_user_curriculum_vitae表
// 尝试使用uid或user_id字段
$curriculumVitae = null;
try {
$curriculumVitae = Db::name('t_user_curriculum_vitae')
->where('uid', $userId)
->find();
} catch (\Exception $e) {
// 如果uid字段不存在尝试user_id字段
try {
$curriculumVitae = Db::name('t_user_curriculum_vitae')
->where('user_id', $userId)
->find();
} catch (\Exception $e2) {
// 如果都不存在curriculumVitae保持为null
}
}
// 转换为数组
if (is_object($curriculumVitae)) {
$curriculumVitae = $curriculumVitae->toArray();
} elseif ($curriculumVitae === null) {
$curriculumVitae = [];
}
// 3. 获取用户教育经历t_user_education表
// 尝试使用uid或user_id字段
$educations = [];
try {
$educations = Db::name('t_user_education')
->where('uid', $userId)
->order('education_level desc') // 按学历等级降序,最高学历在前
->select()
->toArray();
} catch (\Exception $e) {
// 如果uid字段不存在尝试user_id字段
try {
$educations = Db::name('t_user_education')
->where('user_id', $userId)
->order('education_level desc')
->select()
->toArray();
} catch (\Exception $e2) {
// 如果都不存在educations保持为空数组
}
}
// 构建简历数据结构
$resume = [
'user_id' => $userId,
'birth_date' => $user['birth_date'] ?? '',
'gender' => $user['gender'] ?? '',
'ethnicity' => $user['ethnicity'] ?? '',
'political_status' => $user['political_status'] ?? '',
'work_experience' => $user['work_experience'] ?? '',
// 从用户表获取基本信息
'birth_date' => $user['birth_date'] ?? $curriculumVitae['birth_date'] ?? '',
'gender' => $user['gender'] ?? $curriculumVitae['gender'] ?? '',
'ethnicity' => $user['ethnicity'] ?? $curriculumVitae['ethnicity'] ?? '',
'political_status' => $user['political_status'] ?? $curriculumVitae['political_status'] ?? '',
// 从简历表获取工作经历等信息
'work_experience' => $curriculumVitae['work_experience'] ?? $user['work_experience'] ?? '',
// 教育经历从t_user_education表获取
'education' => []
];
// 获取教育经历(假设有教育经历表,表名可能是 t_user_education 或类似)
// 先尝试常见的表名
$educationTables = ['t_user_education', 'user_education', 't_education', 'education'];
$educations = [];
foreach ($educationTables as $tableName) {
try {
$educations = Db::name($tableName)->where('user_id', $userId)->select()->toArray();
if (!empty($educations)) {
break;
}
} catch (\Exception $e) {
// 表不存在,继续尝试下一个
continue;
}
// 处理教育经历数据,确保字段名正确
foreach ($educations as $education) {
$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'] ?? '',
];
}
// 如果没有找到教育经历表尝试从用户表的JSON字段获取
if (empty($educations) && isset($user['education'])) {
$educationData = is_string($user['education']) ? json_decode($user['education'], true) : $user['education'];
if (is_array($educationData)) {
$educations = $educationData;
}
}
$resume['education'] = $educations;
return $resume;
}
/**
* 从数据库快速过滤岗位
* @param array $resume 简历信息
* 从数据库获取所有岗位(用于匹配)
* @param array $resume 简历信息(用于可选的快速过滤)
* @return array
*/
private function filterPositionsFromDb(array $resume): array
{
$query = Db::name('no_notice_position')
->whereNull('deleted_at'); // 排除已删除的岗位
// 获取所有未删除的岗位(no_notice_position表)
// 注意:根据用户要求,需要匹配所有岗位,所以这里不做严格过滤
// 只排除已删除的岗位,其他过滤在详细匹配时进行
$query = Db::name('no_notice_position');
// 计算年龄
$age = 0;
if (!empty($resume['birth_date'])) {
$age = $this->calculateAge($resume['birth_date']);
// 排除已删除的岗位如果表中有deleted_at字段
// 使用where条件如果字段不存在SQL会报错但我们可以通过查询表结构来判断
// 为了安全,先尝试查询,如果失败则查询所有记录
try {
// 尝试添加deleted_at条件
$query->whereNull('deleted_at');
$positions = $query->select()->toArray();
} catch (\Exception $e) {
// 如果字段不存在或其他错误,查询所有记录
$query = Db::name('no_notice_position');
$positions = $query->select()->toArray();
}
// 学历过滤(如果简历有学历信息)
if (!empty($resume['education'])) {
$highestEducation = $this->getHighestEducation($resume['education']);
$educationLevel = $highestEducation['education_level'] ?? '';
// 学历等级映射
$educationLevels = [
'普通本科' => 3,
'本科' => 3,
'大学本科' => 3,
'本科学历' => 3,
'硕士研究生' => 4,
'硕士' => 4,
'研究生' => 4,
'博士研究生' => 5,
'博士' => 5,
];
$actualLevel = $educationLevels[$educationLevel] ?? 0;
// 学历要求过滤:岗位要求的学历等级 <= 简历实际学历等级
// 这里简化处理,实际可以根据数据库中的具体值调整
if ($actualLevel >= 3) {
// 如果是本科及以上,可以匹配"本科"、"本科及以上"等要求
// 使用数组形式的 where 条件,这是 ThinkPHP 的标准用法
$query->where([
['education_require', 'like', '%本科%'],
['education_require', 'like', '%硕士%'],
['education_require', 'like', '%博士%'],
['education_require', '=', ''],
], 'or');
}
}
// 年龄过滤(年龄要求是文本格式,如"18周岁以上、35周岁以下"
// 这里先不过滤在详细匹配时再检查因为文本格式难以用SQL精确匹配
// 如果需要优化,可以在数据库中添加 age_min 和 age_max 字段
// 性别过滤
if (!empty($resume['gender'])) {
$query->where([
['sex_require', '=', '不限制'],
['sex_require', '=', $resume['gender']],
['sex_require', '=', ''],
], 'or');
}
// 获取过滤后的岗位
$positions = $query->select()->toArray();
// 解析JSON字段
// 解析JSON字段构建position_require结构
foreach ($positions as &$position) {
// 处理position_other_require字段可能是JSON格式
$otherRequire = [];
if (!empty($position['position_other_require'])) {
$otherRequire = is_string($position['position_other_require'])
? json_decode($position['position_other_require'], true)
: $position['position_other_require'];
// 将JSON数据合并到position_require中
$position['position_require'] = [
'学历要求' => $position['education_require'] ?? '',
'学位要求' => $position['degree_require'] ?? '',
'年龄要求' => $position['age_require'] ?? '',
'性别要求' => $position['sex_require'] ?? '',
'专业(学科)类别' => $otherRequire['专业(学科)类别'] ?? '',
'专业-本科' => $otherRequire['专业-本科'] ?? '',
'专业-硕士' => $otherRequire['专业-硕士'] ?? '',
'其他资格条件' => $otherRequire['其他资格条件'] ?? '',
'专业资格条件' => $otherRequire['专业资格条件'] ?? '',
];
} else {
$position['position_require'] = [
'学历要求' => $position['education_require'] ?? '',
'学位要求' => $position['degree_require'] ?? '',
'年龄要求' => $position['age_require'] ?? '',
'性别要求' => $position['sex_require'] ?? '',
];
if (is_string($position['position_other_require'])) {
$otherRequire = json_decode($position['position_other_require'], true) ?: [];
} else {
$otherRequire = $position['position_other_require'];
}
}
// 构建统一的position_require结构
$position['position_require'] = [
'学历要求' => $position['education_require'] ?? '',
'学位要求' => $position['degree_require'] ?? '',
'年龄要求' => $position['age_require'] ?? '',
'性别要求' => $position['sex_require'] ?? '',
'专业(学科)类别' => $otherRequire['专业(学科)类别'] ?? '',
'专业-本科' => $otherRequire['专业-本科'] ?? '',
'专业-硕士' => $otherRequire['专业-硕士'] ?? '',
'其他资格条件' => $otherRequire['其他资格条件'] ?? '',
'专业资格条件' => $otherRequire['专业资格条件'] ?? '',
];
}
return $positions;