From 2786202212fc4ee2e2a0c1dcb271603b4617c9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Mon, 29 Dec 2025 17:02:53 +0800 Subject: [PATCH] 1 --- .gitignore | 3 +- _doc/搜索列表和投递功能开发规划.md | 529 +++++++++++++++++++++++++++++ 2 files changed, 531 insertions(+), 1 deletion(-) create mode 100644 _doc/搜索列表和投递功能开发规划.md diff --git a/.gitignore b/.gitignore index 3b46747..0ee545c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ logs/ node_modules.* dist.zip dist/ -admin/node_modules/ \ No newline at end of file +admin/node_modules/ +app/ \ No newline at end of file diff --git a/_doc/搜索列表和投递功能开发规划.md b/_doc/搜索列表和投递功能开发规划.md new file mode 100644 index 0000000..32a286d --- /dev/null +++ b/_doc/搜索列表和投递功能开发规划.md @@ -0,0 +1,529 @@ +# 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` - 账号数据模型 +