# Boss直聘搜索列表和投递功能开发规划 ## 📋 功能概述 基于Boss直聘Web端职位搜索页面(`https://www.zhipin.com/web/geek/jobs`),完善搜索列表获取和职位投递功能,包括服务端任务创建、指令生成和完整流程实现。 ## 🎯 目标功能 ### 1. 搜索列表功能 - 支持多条件搜索(关键词、城市、薪资、经验、学历等) - 支持分页获取职位列表 - 自动保存职位到数据库 - 支持职位去重和更新 ### 2. 投递功能 - 单个职位投递 - 批量职位投递 - 投递状态跟踪 - 投递记录管理 ## 📊 功能架构 ``` 用户/系统触发 ↓ 创建任务 (task_status) ↓ 生成指令序列 (task_commands) ↓ 执行指令 (通过MQTT发送到设备) ↓ 设备执行并返回结果 ↓ 保存数据到数据库 ↓ 更新任务和指令状态 ``` ## 🔧 技术实现 ### 一、搜索列表功能完善 #### 1.1 指令参数扩展 **文件**: `api/middleware/job/jobManager.js` **方法**: `get_job_list()` **需要支持的参数**: ```javascript { keyword: '全栈工程师', // 搜索关键词 city: '101020100', // 城市代码(上海) cityName: '上海', // 城市名称 salary: '20-30K', // 薪资范围 experience: '3-5年', // 工作经验 education: '本科', // 学历要求 industry: '互联网', // 公司行业 companySize: '100-499人', // 公司规模 financingStage: 'B轮', // 融资阶段 page: 1, // 页码 pageSize: 20, // 每页数量 pageCount: 3 // 获取页数(用于批量获取) } ``` #### 1.2 任务创建接口 **文件**: `api/services/pla_account_service.js` **新增方法**: `createSearchJobListTask()` ```javascript /** * 创建搜索职位列表任务 * @param {Object} params - 任务参数 * @param {number} params.id - 账号ID * @param {string} params.keyword - 搜索关键词 * @param {string} params.city - 城市代码 * @param {Object} params.searchParams - 搜索条件(薪资、经验、学历等) * @param {number} params.pageCount - 获取页数 * @returns {Promise} 任务创建结果 */ async createSearchJobListTask(params) { // 1. 验证账号和授权 // 2. 创建任务记录 // 3. 生成搜索指令 // 4. 执行指令 // 5. 返回任务ID } ``` #### 1.3 指令生成逻辑 **文件**: `api/middleware/schedule/taskHandlers.js` **需要完善**: `handleAutoDeliverTask()` 中的搜索指令生成 **当前实现**: ```javascript const getJobListCommand = { command_type: 'getJobList', command_name: '获取职位列表', command_params: JSON.stringify({ sn_code: sn_code, keyword: keyword || accountConfig.keyword || '', platform: platform || 'boss', pageCount: pageCount || 3 }), priority: config.getTaskPriority('search_jobs') || 5 }; ``` **需要扩展为**: ```javascript const getJobListCommand = { command_type: 'get_job_list', // 统一使用下划线命名 command_name: '获取职位列表', command_params: JSON.stringify({ sn_code: sn_code, platform: platform || 'boss', keyword: keyword || accountConfig.keyword || '', city: city || accountConfig.city || '101020100', // 默认上海 cityName: cityName || accountConfig.cityName || '上海', salary: searchParams?.salary || '', experience: searchParams?.experience || '', education: searchParams?.education || '', industry: searchParams?.industry || '', companySize: searchParams?.companySize || '', financingStage: searchParams?.financingStage || '', page: 1, pageSize: 20, pageCount: pageCount || 3 }), priority: config.getTaskPriority('get_job_list') || 5, sequence: 1 }; ``` #### 1.4 职位数据保存优化 **文件**: `api/middleware/job/jobManager.js` **方法**: `saveJobsToDatabase()` **需要完善**: - 支持更多字段映射(从Boss直聘响应数据) - 优化位置解析逻辑 - 支持职位状态更新(已投递、已查看等) - 添加职位匹配度计算 ### 二、投递功能完善 #### 2.1 单个职位投递 **文件**: `api/middleware/job/jobManager.js` **方法**: `applyJob()` **当前状态**: ✅ 已实现基础功能 **需要完善**: - 支持更多投递参数(期望薪资、求职信等) - 优化错误处理 - 添加投递前检查(是否已投递、是否满足条件等) #### 2.2 批量职位投递任务 **文件**: `api/middleware/schedule/taskHandlers.js` **方法**: `handleAutoDeliverTask()` **当前状态**: ✅ 已实现基础功能 **需要完善**: 1. **搜索条件完善** - 支持城市、薪资、经验、学历等筛选条件 - 从账号配置中读取默认搜索条件 - 支持任务参数覆盖账号配置 2. **职位匹配算法优化** - 完善距离计算(基于经纬度) - 完善薪资匹配(解析薪资范围字符串) - 完善工作年限匹配 - 完善学历匹配 - 完善权重评分系统 3. **投递指令生成** - 为每个匹配的职位生成投递指令 - 支持批量投递(一次任务投递多个职位) - 添加投递间隔控制(避免频繁投递) #### 2.3 投递任务创建接口 **文件**: `api/services/pla_account_service.js` **新增方法**: `createDeliverTask()` ```javascript /** * 创建投递任务 * @param {Object} params - 任务参数 * @param {number} params.id - 账号ID * @param {string} params.keyword - 搜索关键词 * @param {Object} params.searchParams - 搜索条件 * @param {Object} params.filterRules - 过滤规则 * @param {number} params.maxCount - 最大投递数量 * @returns {Promise} 任务创建结果 */ async createDeliverTask(params) { // 1. 验证账号和授权 // 2. 创建任务记录 // 3. 生成搜索指令(获取职位列表) // 4. 生成投递指令序列(根据匹配结果) // 5. 执行任务 // 6. 返回任务ID } ``` ## 📝 具体开发任务 ### 任务1: 完善搜索参数支持 **文件**: `api/middleware/job/jobManager.js` **修改方法**: `get_job_list()` **任务内容**: 1. 扩展参数支持(城市、薪资、经验、学历等) 2. 构建完整的搜索参数对象 3. 传递给MQTT指令 **代码位置**: 第153-206行 **预计工作量**: 2小时 --- ### 任务2: 优化职位数据保存 **文件**: `api/middleware/job/jobManager.js` **修改方法**: `saveJobsToDatabase()` **任务内容**: 1. 完善字段映射(从Boss直聘响应数据提取更多字段) 2. 优化位置解析(减少API调用,添加缓存) 3. 添加职位状态管理 4. 添加职位匹配度字段 **代码位置**: 第215-308行 **预计工作量**: 3小时 --- ### 任务3: 完善自动投递任务搜索条件 **文件**: `api/middleware/schedule/taskHandlers.js` **修改方法**: `handleAutoDeliverTask()` **任务内容**: 1. 从账号配置读取默认搜索条件 2. 支持任务参数覆盖 3. 构建完整的搜索参数 4. 传递给搜索指令 **代码位置**: 第220-233行 **预计工作量**: 2小时 --- ### 任务4: 优化职位匹配算法 **文件**: `api/middleware/schedule/taskHandlers.js` **修改方法**: `handleAutoDeliverTask()` **任务内容**: 1. 完善距离计算(使用经纬度计算实际距离) 2. 完善薪资匹配(解析"20-30K"格式,转换为数值范围) 3. 完善工作年限匹配(解析"3-5年"格式) 4. 完善学历匹配(学历等级映射) 5. 优化权重评分计算 **代码位置**: 第255-400行(职位评分和过滤逻辑) **预计工作量**: 4小时 --- ### 任务5: 创建搜索任务接口 **文件**: `api/services/pla_account_service.js` **新增方法**: `createSearchJobListTask()` **任务内容**: 1. 验证账号和授权 2. 创建任务记录 3. 生成搜索指令 4. 执行指令 5. 返回任务信息 **代码位置**: 在 `runCommand()` 方法后添加 **预计工作量**: 3小时 --- ### 任务6: 创建投递任务接口 **文件**: `api/services/pla_account_service.js` **新增方法**: `createDeliverTask()` **任务内容**: 1. 验证账号和授权 2. 创建任务记录 3. 生成搜索指令(获取职位列表) 4. 等待搜索完成 5. 获取匹配的职位 6. 生成投递指令序列 7. 执行投递指令 8. 返回任务信息 **代码位置**: 在 `createSearchJobListTask()` 方法后添加 **预计工作量**: 4小时 --- ### 任务7: 完善指令类型映射 **文件**: `api/middleware/schedule/command.js` **修改位置**: 指令执行逻辑 **任务内容**: 1. 确保 `get_job_list` 指令类型正确映射到 `jobManager.get_job_list()` 2. 确保 `search_jobs` 指令类型正确映射到 `jobManager.search_jobs()` 3. 确保 `apply_job` 指令类型正确映射到 `jobManager.applyJob()` **代码位置**: 第150-250行(指令执行逻辑) **预计工作量**: 1小时 --- ### 任务8: 添加搜索条件配置管理 **文件**: `api/model/pla_account.js` **任务内容**: 1. 添加搜索条件配置字段(如果不存在) 2. 支持在账号配置中保存默认搜索条件 3. 支持在任务参数中覆盖搜索条件 **相关字段**: - `search_config` (JSON): 搜索条件配置 ```json { "city": "101020100", "cityName": "上海", "defaultSalary": "20-30K", "defaultExperience": "3-5年", "defaultEducation": "本科" } ``` **预计工作量**: 1小时 --- ## 🔄 工作流程 ### 搜索职位列表流程 ``` 1. 用户/系统调用 createSearchJobListTask() ↓ 2. 创建任务记录 (task_status) ↓ 3. 生成搜索指令 (task_commands) - command_type: 'get_job_list' - command_params: { keyword, city, salary, ... } ↓ 4. 执行指令 (通过MQTT发送到设备) ↓ 5. 设备执行搜索并返回职位列表 ↓ 6. 保存职位到数据库 (job_postings) - 去重处理 - 位置解析 - 字段映射 ↓ 7. 更新指令状态为完成 ↓ 8. 更新任务状态为完成 ``` ### 投递职位流程 ``` 1. 用户/系统调用 createDeliverTask() ↓ 2. 创建任务记录 (task_status) ↓ 3. 生成搜索指令 (获取职位列表) - command_type: 'get_job_list' ↓ 4. 执行搜索指令 ↓ 5. 获取职位列表并保存到数据库 ↓ 6. 根据简历信息和过滤规则匹配职位 - 距离匹配 - 薪资匹配 - 工作年限匹配 - 学历匹配 - 权重评分 ↓ 7. 为每个匹配的职位生成投递指令 - command_type: 'apply_job' - command_params: { jobId, encryptBossId, ... } ↓ 8. 批量执行投递指令(带间隔控制) ↓ 9. 保存投递记录 (apply_records) ↓ 10. 更新职位状态 (job_postings.applyStatus) ↓ 11. 更新任务状态为完成 ``` ## 📊 数据库字段说明 ### job_postings 表需要完善的字段 | 字段名 | 类型 | 说明 | 状态 | |--------|------|------|------| | `city` | VARCHAR | 城市代码 | 待添加 | | `cityName` | VARCHAR | 城市名称 | 待添加 | | `salaryMin` | INT | 最低薪资(元) | 待添加 | | `salaryMax` | INT | 最高薪资(元) | 待添加 | | `experienceMin` | INT | 最低工作年限 | 待添加 | | `experienceMax` | INT | 最高工作年限 | 待添加 | | `educationLevel` | VARCHAR | 学历等级 | 待添加 | | `matchScore` | DECIMAL | 匹配度评分 | 待添加 | ### pla_account 表需要添加的字段 | 字段名 | 类型 | 说明 | 状态 | |--------|------|------|------| | `search_config` | JSON | 搜索条件配置 | 待添加 | | `city` | VARCHAR | 默认城市代码 | 待添加 | | `cityName` | VARCHAR | 默认城市名称 | 待添加 | ## 🧪 测试计划 ### 单元测试 1. 测试搜索参数构建 2. 测试职位数据保存 3. 测试职位匹配算法 4. 测试投递指令生成 ### 集成测试 1. 测试完整搜索流程 2. 测试完整投递流程 3. 测试任务创建和执行 4. 测试MQTT通信 ### 功能测试 1. 测试多条件搜索 2. 测试分页获取 3. 测试批量投递 4. 测试错误处理 ## 📅 开发时间估算 | 任务 | 预计时间 | 优先级 | |------|----------|--------| | 任务1: 完善搜索参数支持 | 2小时 | 高 | | 任务2: 优化职位数据保存 | 3小时 | 高 | | 任务3: 完善自动投递任务搜索条件 | 2小时 | 高 | | 任务4: 优化职位匹配算法 | 4小时 | 高 | | 任务5: 创建搜索任务接口 | 3小时 | 中 | | 任务6: 创建投递任务接口 | 4小时 | 中 | | 任务7: 完善指令类型映射 | 1小时 | 中 | | 任务8: 添加搜索条件配置管理 | 1小时 | 低 | **总计**: 约20小时 ## 🚀 开发优先级 ### 第一阶段(核心功能) 1. 任务1: 完善搜索参数支持 2. 任务2: 优化职位数据保存 3. 任务3: 完善自动投递任务搜索条件 4. 任务4: 优化职位匹配算法 ### 第二阶段(接口完善) 5. 任务5: 创建搜索任务接口 6. 任务6: 创建投递任务接口 7. 任务7: 完善指令类型映射 ### 第三阶段(配置管理) 8. 任务8: 添加搜索条件配置管理 ## 📌 注意事项 1. **命名规范**: 统一使用下划线命名(`get_job_list` 而不是 `getJobList`) 2. **错误处理**: 所有方法都需要完善的错误处理和日志记录 3. **数据验证**: 所有输入参数都需要验证 4. **性能优化**: 批量操作需要考虑性能,避免阻塞 5. **MQTT通信**: 确保指令参数格式正确,与客户端协议一致 6. **数据库事务**: 批量操作需要使用事务保证数据一致性 ## 🔗 相关文件 - `api/middleware/job/jobManager.js` - 工作管理核心逻辑 - `api/middleware/schedule/taskHandlers.js` - 任务处理器 - `api/middleware/schedule/command.js` - 指令管理器 - `api/services/pla_account_service.js` - 账号服务 - `api/model/job_postings.js` - 职位数据模型 - `api/model/pla_account.js` - 账号数据模型