Compare commits
3 Commits
7ee92b8905
...
933f1618ca
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
933f1618ca | ||
|
|
c43bf79e2d | ||
|
|
55ef28440a |
968
_doc/MQTT指令列表.md
Normal file
968
_doc/MQTT指令列表.md
Normal file
@@ -0,0 +1,968 @@
|
||||
# 自动找工作系统 - MQTT指令列表
|
||||
|
||||
> 版本: v1.0 | 更新日期: 2025-12-25
|
||||
|
||||
## 文档说明
|
||||
|
||||
本文档定义了服务端通过MQTT向客户端下发的所有指令格式和规范。所有操作都通过任务和指令的方式异步执行。
|
||||
|
||||
---
|
||||
|
||||
## 一、MQTT通信架构
|
||||
|
||||
### 1.1 通信流程
|
||||
|
||||
```
|
||||
┌──────────────┐ ┌──────────────┐
|
||||
│ 服务端 │ │ 客户端 │
|
||||
│ (Node.js) │ │ (设备端) │
|
||||
└──────┬───────┘ └──────┬───────┘
|
||||
│ │
|
||||
│ ① 创建任务(task_status表) │
|
||||
│ ② 生成指令(task_commands表) │
|
||||
│ │
|
||||
│ ③ MQTT Publish │
|
||||
│ Topic: {sn_code}/command │
|
||||
│ ─────────────────────────────> │
|
||||
│ │
|
||||
│ ④ 执行指令 │
|
||||
│ ⑤ 生成结果 │
|
||||
│ │
|
||||
│ ⑥ MQTT Publish │
|
||||
│ Topic: response │
|
||||
│ <───────────────────────────── │
|
||||
│ │
|
||||
│ ⑦ 更新指令状态(task_commands) │
|
||||
│ ⑧ 更新任务状态(task_status) │
|
||||
│ │
|
||||
```
|
||||
|
||||
### 1.2 MQTT配置
|
||||
|
||||
- **Broker地址**: `mqtt://192.144.167.231:1883`
|
||||
- **订阅主题**:
|
||||
- `heartbeat` - 设备心跳信息
|
||||
- `response` - 设备响应信息
|
||||
- **发布主题**:
|
||||
- `{sn_code}/command` - 向指定设备发送指令
|
||||
|
||||
### 1.3 消息格式
|
||||
|
||||
**服务端 → 客户端 (指令)**
|
||||
```json
|
||||
{
|
||||
"commandId": "uuid",
|
||||
"taskId": "uuid",
|
||||
"platform": "boss",
|
||||
"action": "search_jobs",
|
||||
"data": {
|
||||
"keyword": "全栈工程师",
|
||||
"city": "101020100",
|
||||
"page": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**客户端 → 服务端 (响应)**
|
||||
```json
|
||||
{
|
||||
"commandId": "uuid",
|
||||
"taskId": "uuid",
|
||||
"code": 200,
|
||||
"message": "执行成功",
|
||||
"data": {
|
||||
// 返回数据
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**客户端 → 服务端 (心跳)**
|
||||
```json
|
||||
{
|
||||
"sn_code": "device001",
|
||||
"platform": "boss",
|
||||
"timestamp": 1672531200000,
|
||||
"status": "online",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、已实现指令列表
|
||||
|
||||
### 2.1 用户登录指令
|
||||
|
||||
#### get_login_qr_code - 获取登录二维码
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_login_qr_code",
|
||||
"platform": "boss",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "二维码获取成功",
|
||||
"data": {
|
||||
"qrCode": "https://example.com/qrcode.png",
|
||||
"qr_code_url": "https://example.com/qrcode.png",
|
||||
"expire_time": 300
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取登录二维码,用户扫码登录后客户端需要保存cookies/token
|
||||
|
||||
---
|
||||
|
||||
#### get_user_info - 获取用户信息
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_user_info",
|
||||
"platform": "boss",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"userId": "123456",
|
||||
"userName": "张三",
|
||||
"phone": "138****5678",
|
||||
"isLoggedIn": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取当前登录用户的基本信息,验证登录状态
|
||||
|
||||
---
|
||||
|
||||
### 2.2 简历管理指令
|
||||
|
||||
#### get_online_resume - 获取在线简历
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_online_resume",
|
||||
"platform": "boss",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"baseInfo": {
|
||||
"name": "张三",
|
||||
"gender": 1,
|
||||
"age": 28,
|
||||
"account": "138****5678",
|
||||
"emailBlur": "zhang***@qq.com",
|
||||
"workYears": 5,
|
||||
"workYearDesc": "5年",
|
||||
"degreeCategory": "本科"
|
||||
},
|
||||
"expectList": [{
|
||||
"positionName": "全栈工程师",
|
||||
"locationName": "上海",
|
||||
"salaryDesc": "20-30K",
|
||||
"industryDesc": "互联网"
|
||||
}],
|
||||
"workExpList": [{
|
||||
"companyName": "XX科技公司",
|
||||
"positionName": "高级前端工程师",
|
||||
"startDate": "2020-01",
|
||||
"endDate": "2023-12",
|
||||
"workContent": "负责前端架构设计和开发..."
|
||||
}],
|
||||
"projectExpList": [{
|
||||
"name": "电商平台项目",
|
||||
"roleName": "技术负责人",
|
||||
"startDate": "2022-01",
|
||||
"endDate": "2023-06",
|
||||
"projectDesc": "项目描述...",
|
||||
"performance": "项目成果..."
|
||||
}],
|
||||
"educationExpList": [{
|
||||
"school": "XX大学",
|
||||
"major": "计算机科学与技术",
|
||||
"degreeName": "本科",
|
||||
"endYear": 2018
|
||||
}],
|
||||
"userDesc": "熟悉Vue、React、Node.js等技术栈...",
|
||||
"certificationList": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取用户在招聘平台上的完整简历信息
|
||||
|
||||
---
|
||||
|
||||
### 2.3 岗位搜索指令
|
||||
|
||||
#### search_jobs - 搜索岗位 (已实现但需完善)
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "search_jobs",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"keyword": "全栈工程师",
|
||||
"city": "101020100",
|
||||
"page": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "搜索成功",
|
||||
"data": {
|
||||
"total": 150,
|
||||
"page": 1,
|
||||
"jobList": [{
|
||||
"jobId": "job123456",
|
||||
"jobTitle": "全栈工程师",
|
||||
"companyName": "XX科技公司",
|
||||
"companySize": "100-499人",
|
||||
"salary": "20-30K",
|
||||
"location": "上海·浦东新区",
|
||||
"experience": "3-5年",
|
||||
"education": "本科",
|
||||
"jobRequirements": "1. 熟悉Vue/React...",
|
||||
"jobDescription": "岗位职责...",
|
||||
"bossName": "张经理",
|
||||
"bossTitle": "技术总监"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 当前实现基础,需要扩展支持更多搜索条件
|
||||
|
||||
---
|
||||
|
||||
#### get_job_list - 获取岗位列表
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_job_list",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"page": 1,
|
||||
"pageSize": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"total": 50,
|
||||
"page": 1,
|
||||
"jobList": [
|
||||
// 同 search_jobs 的 jobList 格式
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取推荐岗位列表
|
||||
|
||||
---
|
||||
|
||||
### 2.4 投递管理指令
|
||||
|
||||
#### apply_job - 投递岗位 (基础实现)
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "apply_job",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"jobId": "job123456",
|
||||
"expectSalary": "20-30K"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "投递成功",
|
||||
"data": {
|
||||
"applyId": "apply123456",
|
||||
"jobId": "job123456",
|
||||
"applyTime": "2025-12-25 10:30:00",
|
||||
"status": "success"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**错误码**
|
||||
- `400` - 参数错误
|
||||
- `403` - 已投递过该岗位
|
||||
- `429` - 投递次数达到上限
|
||||
- `500` - 投递失败
|
||||
|
||||
**说明**: 向指定岗位投递简历
|
||||
|
||||
---
|
||||
|
||||
### 2.5 聊天管理指令
|
||||
|
||||
#### get_chat_list - 获取聊天列表
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_chat_list",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"page": 1,
|
||||
"pageSize": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"total": 15,
|
||||
"chatList": [{
|
||||
"conversationId": "conv123456",
|
||||
"jobId": "job123456",
|
||||
"jobTitle": "全栈工程师",
|
||||
"companyName": "XX科技",
|
||||
"bossName": "张经理",
|
||||
"lastMessage": "您好,请问...",
|
||||
"lastMessageTime": "2025-12-25 10:30:00",
|
||||
"unreadCount": 2,
|
||||
"hasInterview": false
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取与HR的聊天会话列表
|
||||
|
||||
---
|
||||
|
||||
#### send_chat_message - 发送聊天消息
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "send_chat_message",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"conversationId": "conv123456",
|
||||
"jobId": "job123456",
|
||||
"content": "您好,我对这个岗位很感兴趣..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "发送成功",
|
||||
"data": {
|
||||
"messageId": "msg123456",
|
||||
"sendTime": "2025-12-25 10:30:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 向HR发送聊天消息
|
||||
|
||||
---
|
||||
|
||||
### 2.6 测试和调试指令
|
||||
|
||||
#### open_bot_detection - 打开测试页
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "open_bot_detection",
|
||||
"platform": "boss",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "测试页已打开",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 打开测试页面,用于调试
|
||||
|
||||
---
|
||||
|
||||
## 三、待开发指令列表
|
||||
|
||||
### 3.1 搜索投递增强指令 (优先级: HIGH)
|
||||
|
||||
#### search_jobs_enhanced - 增强搜索岗位 ⭐⭐⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "search_jobs_enhanced",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"keyword": "全栈工程师",
|
||||
"city": "101020100",
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
|
||||
// 新增搜索条件
|
||||
"experience": "3",
|
||||
"degree": "203",
|
||||
"salary": "406",
|
||||
"scale": "303",
|
||||
"stage": "807",
|
||||
"position": "100109",
|
||||
|
||||
// 滚动加载方式
|
||||
"scrollLoadType": "auto",
|
||||
"maxScrollPages": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**参数说明**
|
||||
| 参数 | 说明 | 示例值 |
|
||||
|------|------|--------|
|
||||
| keyword | 搜索关键词 | "全栈工程师" |
|
||||
| city | 城市代码 | "101020100" (上海) |
|
||||
| page | 页码 | 1 |
|
||||
| pageSize | 每页数量 | 20 |
|
||||
| experience | 工作经验 | "1"=1年以下, "3"=1-3年, "4"=3-5年, "5"=5-10年, "6"=10年以上 |
|
||||
| degree | 学历要求 | "202"=不限, "203"=大专, "204"=本科, "205"=硕士, "206"=博士 |
|
||||
| salary | 薪资范围 | "402"=3-5K, "403"=5-10K, "404"=10-15K, "405"=15-20K, "406"=20-30K, "407"=30-50K, "408"=50K以上 |
|
||||
| scale | 公司规模 | "302"=0-20人, "303"=20-99人, "304"=100-499人, "305"=500-999人, "306"=1000人以上 |
|
||||
| stage | 融资阶段 | "801"=未融资, "802"=天使轮, "803"=A轮, "804"=B轮, "805"=C轮, "806"=D轮及以上, "807"=已上市, "808"=不需要融资 |
|
||||
| position | 职位类型 | "100109"=全栈, "100110"=前端, "100111"=后端, "100112"=移动端 |
|
||||
| scrollLoadType | 加载方式 | "auto"=自动滚动, "manual"=手动翻页 |
|
||||
| maxScrollPages | 最大滚动页数 | 5 |
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "搜索成功",
|
||||
"data": {
|
||||
"total": 150,
|
||||
"page": 1,
|
||||
"hasMore": true,
|
||||
"jobList": [{
|
||||
"jobId": "job123456",
|
||||
"jobTitle": "全栈工程师",
|
||||
"companyName": "XX科技公司",
|
||||
"companySize": "100-499人",
|
||||
"companyIndustry": "互联网",
|
||||
"companyStage": "已上市",
|
||||
"salary": "20-30K",
|
||||
"salaryMonth": "14薪",
|
||||
"location": "上海·浦东新区",
|
||||
"longitude": 121.5273,
|
||||
"latitude": 31.2172,
|
||||
"experience": "3-5年",
|
||||
"education": "本科",
|
||||
"skills": ["Vue", "React", "Node.js"],
|
||||
"jobRequirements": "1. 熟悉Vue/React...",
|
||||
"jobDescription": "岗位职责...",
|
||||
"welfare": ["五险一金", "带薪年假", "弹性工作"],
|
||||
"bossName": "张经理",
|
||||
"bossTitle": "技术总监",
|
||||
"bossActiveStatus": "刚刚活跃",
|
||||
"publishTime": "2025-12-25",
|
||||
"viewCount": 150,
|
||||
"applyCount": 30,
|
||||
"isOutsourcing": false,
|
||||
"jobLink": "https://www.zhipin.com/job_detail/xxx"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 支持Boss直聘完整的搜索筛选条件
|
||||
- 支持自动滚动加载更多岗位
|
||||
- 返回更详细的岗位信息
|
||||
|
||||
---
|
||||
|
||||
#### search_by_url - 通过URL搜索岗位 ⭐⭐⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "search_by_url",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"url": "https://www.zhipin.com/web/geek/jobs?city=101020100&query=%E5%85%A8%E6%A0%88%E5%B7%A5%E7%A8%8B%E5%B8%88",
|
||||
"scrollLoadType": "auto",
|
||||
"maxScrollPages": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "搜索成功",
|
||||
"data": {
|
||||
// 同 search_jobs_enhanced 返回格式
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 直接使用Boss直聘的搜索URL
|
||||
- 自动解析URL参数
|
||||
- 支持所有筛选条件
|
||||
|
||||
---
|
||||
|
||||
### 3.2 批量投递指令 (优先级: HIGH)
|
||||
|
||||
#### batch_apply_jobs - 批量投递岗位 ⭐⭐⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "batch_apply_jobs",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"jobIds": ["job001", "job002", "job003"],
|
||||
"expectSalary": "20-30K",
|
||||
"applyInterval": 30,
|
||||
"maxApplyCount": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**参数说明**
|
||||
| 参数 | 说明 | 示例值 |
|
||||
|------|------|--------|
|
||||
| jobIds | 岗位ID数组 | ["job001", "job002"] |
|
||||
| expectSalary | 期望薪资 | "20-30K" |
|
||||
| applyInterval | 投递间隔(秒) | 30 |
|
||||
| maxApplyCount | 最大投递数量 | 10 |
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "批量投递完成",
|
||||
"data": {
|
||||
"total": 10,
|
||||
"success": 8,
|
||||
"failed": 2,
|
||||
"results": [{
|
||||
"jobId": "job001",
|
||||
"status": "success",
|
||||
"applyId": "apply001",
|
||||
"message": "投递成功"
|
||||
}, {
|
||||
"jobId": "job002",
|
||||
"status": "failed",
|
||||
"message": "已投递过该岗位"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 批量投递多个岗位
|
||||
- 控制投递间隔避免被限制
|
||||
- 返回每个岗位的投递结果
|
||||
|
||||
---
|
||||
|
||||
### 3.3 简历刷新指令 (优先级: HIGH)
|
||||
|
||||
#### refresh_resume - 刷新简历 ⭐⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "refresh_resume",
|
||||
"platform": "boss",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "简历刷新成功",
|
||||
"data": {
|
||||
"refreshTime": "2025-12-25 10:30:00",
|
||||
"nextRefreshTime": "2025-12-25 12:30:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 刷新简历提升排名
|
||||
- 每2小时可刷新一次
|
||||
|
||||
---
|
||||
|
||||
### 3.4 账号保活指令 (优先级: HIGH)
|
||||
|
||||
#### auto_active - 自动活跃账号 ⭐⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "auto_active",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"actionType": "random",
|
||||
"actions": ["browse_jobs", "view_company", "search_keyword", "update_visibility"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**参数说明**
|
||||
| 参数 | 说明 | 可选值 |
|
||||
|------|------|--------|
|
||||
| actionType | 动作类型 | "random"=随机, "sequence"=顺序 |
|
||||
| actions | 动作列表 | ["browse_jobs", "view_company", "search_keyword", "update_visibility"] |
|
||||
|
||||
**动作说明**
|
||||
- `browse_jobs` - 浏览岗位(随机点击5-10个岗位)
|
||||
- `view_company` - 查看公司主页
|
||||
- `search_keyword` - 搜索关键词(随机关键词)
|
||||
- `update_visibility` - 修改简历可见性
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "活跃操作完成",
|
||||
"data": {
|
||||
"executedActions": ["browse_jobs", "view_company"],
|
||||
"duration": 120,
|
||||
"timestamp": "2025-12-25 10:30:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 模拟真实用户行为
|
||||
- 随机时间间隔
|
||||
- 避免账号被标记为机器人
|
||||
|
||||
---
|
||||
|
||||
### 3.5 聊天增强指令 (优先级: MEDIUM)
|
||||
|
||||
#### get_chat_detail - 获取聊天详情 ⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_chat_detail",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"conversationId": "conv123456",
|
||||
"page": 1,
|
||||
"pageSize": 50
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"conversationId": "conv123456",
|
||||
"jobId": "job123456",
|
||||
"messages": [{
|
||||
"messageId": "msg001",
|
||||
"senderId": "boss123",
|
||||
"senderType": "boss",
|
||||
"content": "您好,请问什么时候方便面试?",
|
||||
"sendTime": "2025-12-25 10:30:00",
|
||||
"isRead": true,
|
||||
"messageType": "text",
|
||||
"isInterviewInvitation": true
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取完整的聊天历史记录
|
||||
|
||||
---
|
||||
|
||||
#### send_greeting - 发送打招呼 ⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "send_greeting",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"jobId": "job123456",
|
||||
"content": "您好,我对这个岗位很感兴趣,期待能有机会详聊。"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "打招呼成功",
|
||||
"data": {
|
||||
"conversationId": "conv123456",
|
||||
"messageId": "msg001",
|
||||
"sendTime": "2025-12-25 10:30:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 主动向HR发起沟通
|
||||
|
||||
---
|
||||
|
||||
### 3.6 数据采集指令 (优先级: MEDIUM)
|
||||
|
||||
#### get_job_detail - 获取岗位详情 ⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_job_detail",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"jobId": "job123456"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"jobId": "job123456",
|
||||
// 完整的岗位详情(同search_jobs_enhanced中的jobList项)
|
||||
"companyDetail": {
|
||||
"companyId": "company123",
|
||||
"companyName": "XX科技公司",
|
||||
"companyLogo": "https://...",
|
||||
"companySize": "100-499人",
|
||||
"companyIndustry": "互联网",
|
||||
"companyStage": "已上市",
|
||||
"companyAddress": "上海市浦东新区...",
|
||||
"companyDesc": "公司介绍..."
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取岗位的完整详情信息
|
||||
|
||||
---
|
||||
|
||||
#### get_company_info - 获取公司信息 ⭐⭐⭐
|
||||
|
||||
**指令格式**
|
||||
```json
|
||||
{
|
||||
"action": "get_company_info",
|
||||
"platform": "boss",
|
||||
"data": {
|
||||
"companyId": "company123"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**返回格式**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"companyId": "company123",
|
||||
"companyName": "XX科技公司",
|
||||
"companyLogo": "https://...",
|
||||
"companySize": "100-499人",
|
||||
"companyIndustry": "互联网",
|
||||
"companyStage": "已上市",
|
||||
"companyAddress": "上海市浦东新区...",
|
||||
"companyDesc": "公司介绍...",
|
||||
"companyBenefit": ["五险一金", "带薪年假"],
|
||||
"companyPhotos": ["https://...", "https://..."],
|
||||
"jobCount": 50,
|
||||
"isVerified": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**说明**: 获取公司的详细信息
|
||||
|
||||
---
|
||||
|
||||
## 四、指令执行规范
|
||||
|
||||
### 4.1 指令生命周期
|
||||
|
||||
```
|
||||
1. 创建 (pending)
|
||||
↓
|
||||
2. 下发 (sent)
|
||||
↓
|
||||
3. 执行中 (executing)
|
||||
↓
|
||||
4. 完成 (completed) / 失败 (failed) / 超时 (timeout)
|
||||
```
|
||||
|
||||
### 4.2 超时设置
|
||||
|
||||
| 指令类型 | 超时时间 | 重试次数 |
|
||||
|---------|----------|----------|
|
||||
| 登录类指令 | 60秒 | 1次 |
|
||||
| 简历获取 | 30秒 | 2次 |
|
||||
| 岗位搜索 | 60秒 | 2次 |
|
||||
| 岗位投递 | 30秒 | 1次 |
|
||||
| 聊天消息 | 30秒 | 2次 |
|
||||
| 保活操作 | 120秒 | 0次 |
|
||||
|
||||
### 4.3 错误码规范
|
||||
|
||||
| 错误码 | 说明 | 处理方式 |
|
||||
|--------|------|----------|
|
||||
| 200 | 成功 | - |
|
||||
| 400 | 参数错误 | 不重试 |
|
||||
| 401 | 未登录 | 触发重新登录 |
|
||||
| 403 | 无权限/已操作 | 不重试 |
|
||||
| 429 | 请求过于频繁 | 延迟后重试 |
|
||||
| 500 | 服务器错误 | 重试 |
|
||||
| 503 | 服务不可用 | 延迟后重试 |
|
||||
| 600 | 网络超时 | 重试 |
|
||||
| 700 | 客户端错误 | 记录日志,不重试 |
|
||||
|
||||
### 4.4 重试策略
|
||||
|
||||
- **指数退避**: `delay = min(1000 * 2^(retryCount-1), 30000ms)`
|
||||
- **最大重试次数**: 根据指令类型决定(见4.2表格)
|
||||
- **可重试错误**: 429, 500, 503, 600
|
||||
- **不可重试错误**: 400, 401, 403, 700
|
||||
|
||||
---
|
||||
|
||||
## 五、客户端实现要求
|
||||
|
||||
### 5.1 MQTT客户端
|
||||
|
||||
- **连接保持**: 断线自动重连
|
||||
- **心跳间隔**: 10秒
|
||||
- **订阅主题**: `{sn_code}/command`
|
||||
- **发布主题**: `response`, `heartbeat`
|
||||
|
||||
### 5.2 指令处理
|
||||
|
||||
1. **接收指令**
|
||||
- 解析JSON格式
|
||||
- 验证必需字段
|
||||
- 记录指令日志
|
||||
|
||||
2. **执行指令**
|
||||
- 根据action分发到对应处理器
|
||||
- 更新执行状态
|
||||
- 捕获异常错误
|
||||
|
||||
3. **返回响应**
|
||||
- 统一响应格式
|
||||
- 包含commandId用于追踪
|
||||
- 返回详细的执行结果
|
||||
|
||||
### 5.3 异常处理
|
||||
|
||||
- **网络异常**: 自动重试
|
||||
- **登录过期**: 通知服务端重新登录
|
||||
- **页面加载失败**: 刷新页面重试
|
||||
- **元素定位失败**: 记录截图,返回错误
|
||||
|
||||
### 5.4 日志记录
|
||||
|
||||
- **请求日志**: 记录所有接收到的指令
|
||||
- **响应日志**: 记录所有返回的响应
|
||||
- **错误日志**: 记录所有异常和错误
|
||||
- **操作日志**: 记录关键操作步骤
|
||||
|
||||
---
|
||||
|
||||
## 六、开发优先级
|
||||
|
||||
### P0 - 立即开发 (投递核心功能)
|
||||
|
||||
1. ✅ `search_jobs_enhanced` - 增强搜索
|
||||
2. ✅ `search_by_url` - URL搜索
|
||||
3. ✅ `batch_apply_jobs` - 批量投递
|
||||
4. ✅ `refresh_resume` - 简历刷新
|
||||
|
||||
### P1 - 短期开发 (保活和聊天)
|
||||
|
||||
5. ✅ `auto_active` - 账号保活
|
||||
6. ✅ `send_greeting` - 发送打招呼
|
||||
7. ✅ `get_chat_detail` - 聊天详情
|
||||
|
||||
### P2 - 中期开发 (数据采集)
|
||||
|
||||
8. ⭐ `get_job_detail` - 岗位详情
|
||||
9. ⭐ `get_company_info` - 公司信息
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 开发团队
|
||||
**最后更新**: 2025-12-25
|
||||
874
_doc/功能规划文档.md
Normal file
874
_doc/功能规划文档.md
Normal file
@@ -0,0 +1,874 @@
|
||||
# 自动找工作系统 - 功能规划文档
|
||||
|
||||
> 版本: v1.0 | 规划日期: 2025-12-25 | 状态: 待开发
|
||||
|
||||
## 文档说明
|
||||
|
||||
本文档规划了自动找工作系统的未开发功能,按优先级分为4个方向共20项功能。每项功能包含现状分析、待开发内容和预期价值,可直接转化为开发任务。
|
||||
|
||||
## 优先级说明
|
||||
|
||||
- **HIGH**: 核心功能,对系统价值提升明显,建议优先开发
|
||||
- **MEDIUM**: 重要优化,提升用户体验和系统性能,可分阶段实施
|
||||
- **LOW**: 未来规划,可根据实际需求决定是否开发
|
||||
|
||||
---
|
||||
|
||||
## 第一部分: 功能完善和补充
|
||||
|
||||
**优先级: HIGH** | **预计工期: 4-6周**
|
||||
|
||||
### 1.1 自动聊天功能完善 ⭐⭐⭐⭐⭐
|
||||
|
||||
**现状分析**
|
||||
- ✅ 聊天记录表结构完整 (`chat_records`)
|
||||
- ✅ AI聊天内容生成基础框架 (`aiService.generateChatContent`)
|
||||
- ✅ 聊天类型分类 (greeting/followup/interview/reply)
|
||||
- ❌ AI生成器未完整实现
|
||||
- ❌ 聊天时机判断逻辑缺失
|
||||
- ❌ 多轮对话上下文管理未实现
|
||||
|
||||
**待开发内容**
|
||||
1. **AI聊天内容生成器完整实现**
|
||||
- 完善 Prompt 模板(不同场景)
|
||||
- 集成简历信息和岗位描述
|
||||
- 个性化内容生成(根据HR回复调整策略)
|
||||
- 长度和语气控制
|
||||
|
||||
2. **聊天时机智能判断**
|
||||
- HR查看后多久发消息(规则+AI预测)
|
||||
- 避免过于频繁或过晚联系
|
||||
- 根据不同平台特性调整策略
|
||||
- 工作时间优先发送
|
||||
|
||||
3. **多轮对话上下文管理**
|
||||
- 记录对话历史
|
||||
- 上下文理解(避免重复询问)
|
||||
- 话题延续和自然过渡
|
||||
- 面试邀约智能识别和响应
|
||||
|
||||
4. **情感分析和回复策略调整**
|
||||
- 分析HR回复的情感倾向
|
||||
- 根据情感调整后续策略
|
||||
- 识别拒绝信号(及时停止沟通)
|
||||
- 识别兴趣信号(加大沟通力度)
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/chatManager.js`
|
||||
- 依赖: `aiService.js`, `chat_records表`
|
||||
- 预计工期: 2周
|
||||
|
||||
**预期价值**
|
||||
- 📈 HR回复率提升 30%+
|
||||
- 📈 面试邀约率提升 20%+
|
||||
- 💡 减少人工沟通成本 80%+
|
||||
- ✨ 提供24小时自动化沟通能力
|
||||
|
||||
---
|
||||
|
||||
### 1.2 账号保活任务 ⭐⭐⭐⭐⭐
|
||||
|
||||
**现状分析**
|
||||
- ✅ 配置项已有 (`pla_account.auto_active`, `active_interval`, `active_actions_json`)
|
||||
- ✅ 任务类型定义 (`auto_active_account`)
|
||||
- ❌ 执行逻辑未实现
|
||||
- ❌ 行为模拟策略缺失
|
||||
|
||||
**待开发内容**
|
||||
1. **定时浏览岗位模拟真实用户**
|
||||
- 随机浏览岗位详情
|
||||
- 模拟点击、滚动行为
|
||||
- 页面停留时间随机化(10-60秒)
|
||||
- 每日浏览次数控制(5-20次)
|
||||
|
||||
2. **随机时间间隔访问**
|
||||
- 避免固定时间访问(容易被识别)
|
||||
- 工作时间随机分布
|
||||
- 模拟午休和下班后的访问
|
||||
- 周末降低活跃频率
|
||||
|
||||
3. **多样化操作行为**
|
||||
- 搜索岗位(随机关键词)
|
||||
- 查看推荐岗位
|
||||
- 浏览公司主页
|
||||
- 修改简历可见性
|
||||
- 更新最后活跃时间
|
||||
|
||||
4. **避免账号被标记为机器人**
|
||||
- 行为模式随机化
|
||||
- 添加鼠标轨迹模拟
|
||||
- 操作速度人性化(不要太快)
|
||||
- 避免连续大量操作
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/schedule/taskHandlers.js` (新增 `handleAutoActiveTask`)
|
||||
- MQTT指令: 新增 `auto_active` 操作类型
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📉 账号封禁风险降低 70%+
|
||||
- 📈 简历曝光率提升 40%+
|
||||
- 🔒 账号在线状态保持稳定
|
||||
- ✨ 自动维护账号活跃度
|
||||
|
||||
---
|
||||
|
||||
### 1.3 简历自动更新 ⭐⭐⭐⭐
|
||||
|
||||
**现状分析**
|
||||
- ✅ 简历同步功能完整
|
||||
- ✅ 简历信息存储完善
|
||||
- ❌ 简历刷新逻辑未实现
|
||||
- ❌ 简历优化建议缺失
|
||||
|
||||
**待开发内容**
|
||||
1. **定时刷新简历排名**
|
||||
- 每天自动刷新简历(提升排名)
|
||||
- 最佳刷新时间智能选择(如早上9点)
|
||||
- 通过MQTT下发刷新指令
|
||||
- 记录刷新历史和效果
|
||||
|
||||
2. **简历内容优化建议**
|
||||
- AI分析当前简历不足
|
||||
- 给出具体优化建议(哪些技能需要补充)
|
||||
- 对比同类岗位的简历特征
|
||||
- 建议调整项目经验描述
|
||||
|
||||
3. **A/B测试不同简历版本效果**
|
||||
- 支持多个简历版本
|
||||
- 自动切换测试
|
||||
- 统计不同版本的查看率和回复率
|
||||
- 推荐最优版本
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/resumeManager.js` (新增刷新方法)
|
||||
- MQTT指令: 新增 `refresh_resume` 操作
|
||||
- 数据库: `resume_info` 新增 `last_refresh_time` 字段
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 简历曝光率提升 50%+
|
||||
- 📈 查看率提升 30%+
|
||||
- 💡 简历质量持续优化
|
||||
- ✨ 自动维护简历新鲜度
|
||||
|
||||
---
|
||||
|
||||
### 1.4 岗位黑名单和收藏 ⭐⭐⭐⭐
|
||||
|
||||
**现状分析**
|
||||
- ❌ 黑名单功能未实现
|
||||
- ❌ 收藏功能未实现
|
||||
- ❌ 岗位对比功能缺失
|
||||
|
||||
**待开发内容**
|
||||
1. **公司黑名单**
|
||||
- 不再投递某公司的岗位
|
||||
- 黑名单原因记录(薪资虚标、工作内容不符等)
|
||||
- 支持批量添加
|
||||
- 黑名单导入导出
|
||||
|
||||
2. **岗位类型黑名单**
|
||||
- 不再投递某类岗位(如外包、销售)
|
||||
- 支持自定义黑名单关键词
|
||||
- 黑名单优先级高于匹配规则
|
||||
|
||||
3. **收藏感兴趣岗位**
|
||||
- 标记收藏岗位
|
||||
- 收藏原因备注
|
||||
- 收藏夹分类管理
|
||||
- 收藏岗位状态跟踪(是否还在招聘)
|
||||
|
||||
4. **岗位对比功能**
|
||||
- 多个岗位并排对比
|
||||
- 对比维度: 薪资、技能要求、公司、地点、福利
|
||||
- AI给出推荐意见
|
||||
- 导出对比报告
|
||||
|
||||
**技术实现**
|
||||
- 数据库: 新增 `job_blacklist`, `job_favorites` 表
|
||||
- 文件路径: `api/controller_admin/` 新增相关API
|
||||
- 前端: `admin/src/views/work/` 新增黑名单和收藏页面
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 投递精准度提升 40%+
|
||||
- 📉 无效投递减少 60%+
|
||||
- 💡 提供个性化岗位管理
|
||||
- ✨ 提高求职效率
|
||||
|
||||
---
|
||||
|
||||
### 1.5 多轮面试跟踪 ⭐⭐⭐⭐
|
||||
|
||||
**现状分析**
|
||||
- ✅ `apply_records` 表有 `hasInterview` 字段
|
||||
- ❌ 只记录是否有面试,未细分轮次
|
||||
- ❌ Offer管理功能缺失
|
||||
- ❌ 入职状态未追踪
|
||||
|
||||
**待开发内容**
|
||||
1. **一面/二面/三面状态追踪**
|
||||
- 新增面试轮次字段 (`interview_round`)
|
||||
- 每轮面试时间、地点、面试官记录
|
||||
- 面试类型(电话、视频、现场)
|
||||
- 面试状态(待面试、已面试、通过、淘汰)
|
||||
|
||||
2. **面试反馈记录**
|
||||
- 面试官反馈内容
|
||||
- 面试问题记录
|
||||
- 自我评价
|
||||
- 改进建议
|
||||
|
||||
3. **Offer管理**
|
||||
- Offer详情(薪资、福利、入职时间)
|
||||
- 接受/拒绝/谈薪状态
|
||||
- 谈薪记录(几轮谈判,最终结果)
|
||||
- Offer对比(如有多个Offer)
|
||||
|
||||
4. **入职状态追踪**
|
||||
- 入职日期
|
||||
- 试用期状态
|
||||
- 转正时间
|
||||
- 离职时间(如有)
|
||||
|
||||
**技术实现**
|
||||
- 数据库: `apply_records` 新增字段或新增 `interview_records`, `offer_records` 表
|
||||
- 文件路径: `api/controller_admin/apply_records.js` 扩展
|
||||
- 前端: `admin/src/views/work/apply_records.vue` 新增详情面板
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- 📊 完整的求职生命周期管理
|
||||
- 📈 面试准备更充分
|
||||
- 💡 Offer决策更科学
|
||||
- ✨ 提供长期职业数据积累
|
||||
|
||||
---
|
||||
|
||||
## 第二部分: AI能力增强
|
||||
|
||||
**优先级: HIGH** | **预计工期: 5-7周**
|
||||
|
||||
### 2.1 简历智能优化 ⭐⭐⭐⭐⭐
|
||||
|
||||
**现状分析**
|
||||
- ✅ 简历AI分析基础功能 (`aiService.analyzeResume`)
|
||||
- ✅ 竞争力评分、技能提取、优劣势分析
|
||||
- ❌ 优化建议深度不足
|
||||
- ❌ 针对性改进方案缺失
|
||||
|
||||
**待开发内容**
|
||||
1. **AI简历分析深度提升**
|
||||
- 细粒度分析(每个项目、每段经历)
|
||||
- 识别简历中的弱项和亮点
|
||||
- 对比行业优秀简历
|
||||
- 生成详细分析报告
|
||||
|
||||
2. **简历改进建议(针对性)**
|
||||
- 针对目标岗位给出定制化建议
|
||||
- 建议补充哪些技能关键词
|
||||
- 建议如何重写工作描述
|
||||
- 建议哪些内容需要精简
|
||||
|
||||
3. **技能关键词优化建议**
|
||||
- 分析热门技能关键词
|
||||
- 建议替换为更专业的术语
|
||||
- 建议技能顺序排列
|
||||
- 建议补充相关技能
|
||||
|
||||
4. **项目经验描述优化**
|
||||
- 使用STAR法则重写项目描述
|
||||
- 量化项目成果(如提升XX%性能)
|
||||
- 突出个人贡献和技术难点
|
||||
- 精简冗长描述
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/aiService.js` 新增 `optimizeResume` 方法
|
||||
- Prompt工程: 设计专业的简历优化Prompt
|
||||
- 前端: `resume_info_detail.vue` 新增优化建议面板
|
||||
- 预计工期: 2周
|
||||
|
||||
**预期价值**
|
||||
- 📈 简历竞争力提升 20%+
|
||||
- 📈 查看率提升 35%+
|
||||
- 📈 回复率提升 25%+
|
||||
- 💡 简历质量专业化
|
||||
|
||||
---
|
||||
|
||||
### 2.2 面试问题预测 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **基于岗位描述预测面试问题**
|
||||
- 分析岗位职责和要求
|
||||
- 预测技术问题(如React性能优化、数据库索引等)
|
||||
- 预测行为问题(如团队合作、项目经验)
|
||||
- 预测HR问题(如离职原因、职业规划)
|
||||
|
||||
2. **提供参考答案**
|
||||
- 给出专业、结构化的答案
|
||||
- 提供多种回答思路
|
||||
- 标注答案亮点和注意事项
|
||||
- 面试官可能的追问
|
||||
|
||||
3. **根据简历生成个性化回答**
|
||||
- 结合简历中的项目经验
|
||||
- 使用简历中的真实案例
|
||||
- 避免空洞的回答
|
||||
- 突出个人优势
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/aiService.js` 新增 `predictInterviewQuestions` 方法
|
||||
- 数据来源: `job_postings.jobDescription`, `resume_info`
|
||||
- 前端: 新增 `interview_prep.vue` 面试准备页面
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- 📈 面试通过率提升 30%+
|
||||
- ⏱️ 面试准备时间减少 70%+
|
||||
- 💡 回答更专业、更自信
|
||||
- ✨ 提供全方位面试辅导
|
||||
|
||||
---
|
||||
|
||||
### 2.3 薪资谈判策略 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **AI分析岗位薪资合理范围**
|
||||
- 根据岗位要求和地区计算合理薪资
|
||||
- 参考行业薪资数据(如拉勾、Boss薪资报告)
|
||||
- 考虑公司规模和融资阶段
|
||||
- 给出薪资范围建议(如18-22K)
|
||||
|
||||
2. **给出谈薪建议和话术**
|
||||
- 什么时候开始谈薪(面试哪个阶段)
|
||||
- 如何提薪资要求(不卑不亢)
|
||||
- 谈判策略(如先等对方报价)
|
||||
- 具体话术模板
|
||||
|
||||
3. **根据市场行情评估Offer价值**
|
||||
- 对比市场平均薪资
|
||||
- 综合评估(薪资+福利+发展空间)
|
||||
- 识别低于市场价的Offer
|
||||
- 给出接受/拒绝建议
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/aiService.js` 新增 `analyzeSalary` 方法
|
||||
- 数据源: 岗位描述、地区、公司、市场数据
|
||||
- 前端: `offer_analysis.vue` Offer分析页面
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 💰 薪资平均提升 10-15%
|
||||
- 📈 谈判成功率提升 40%+
|
||||
- 💡 避免接受低薪Offer
|
||||
- ✨ 提供科学的薪资决策
|
||||
|
||||
---
|
||||
|
||||
### 2.4 公司背景调查 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **整合企查查/天眼查数据**
|
||||
- 调用企查查API获取公司信息
|
||||
- 公司基本信息(注册资本、成立时间、法人)
|
||||
- 融资情况(融资轮次、投资方)
|
||||
- 诉讼记录、欠薪记录
|
||||
|
||||
2. **AI分析公司发展前景**
|
||||
- 根据融资情况评估发展阶段
|
||||
- 根据招聘规模判断业务状态
|
||||
- 根据行业趋势预测前景
|
||||
- 给出公司评级(A/B/C/D)
|
||||
|
||||
3. **风险预警**
|
||||
- 识别高风险公司(如多次欠薪、频繁裁员)
|
||||
- 识别虚假招聘(如招聘周期异常长)
|
||||
- 识别外包公司(尽管岗位描述未标注)
|
||||
- 给出风险提示和建议
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/services/company_background_service.js`
|
||||
- 数据源: 企查查API、`company_info` 表
|
||||
- 前端: `job_postings.vue` 新增公司背调入口
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- 📉 入职风险降低 80%+
|
||||
- 💡 避免进入高风险公司
|
||||
- ✨ 提供全面的公司情报
|
||||
- 🔍 识别隐藏的问题公司
|
||||
|
||||
---
|
||||
|
||||
### 2.5 职业发展路径 ⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **基于简历和目标生成职业规划**
|
||||
- 分析当前职业阶段(初级/中级/高级)
|
||||
- 根据目标岗位生成发展路径
|
||||
- 列出需要补充的技能和经验
|
||||
- 给出时间线规划(1年/3年/5年)
|
||||
|
||||
2. **技能提升建议**
|
||||
- 推荐学习资源(课程、书籍、开源项目)
|
||||
- 建议考取的证书
|
||||
- 建议参加的技术社区
|
||||
- 建议做的练手项目
|
||||
|
||||
3. **转行可行性分析**
|
||||
- 评估转行难度
|
||||
- 分析已有技能的可迁移性
|
||||
- 给出转行路径建议
|
||||
- 预测转行后的薪资变化
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/aiService.js` 新增 `generateCareerPath` 方法
|
||||
- 数据源: `resume_info`, 目标岗位描述
|
||||
- 前端: 新增 `career_plan.vue` 职业规划页面
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- 📊 提供长期职业指导
|
||||
- 💡 明确发展方向和目标
|
||||
- 📈 技能提升更有针对性
|
||||
- ✨ 降低职业迷茫感
|
||||
|
||||
---
|
||||
|
||||
## 第三部分: 用户体验优化
|
||||
|
||||
**优先级: MEDIUM** | **预计工期: 4-5周**
|
||||
|
||||
### 3.1 数据可视化增强 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **投递转化漏斗图**
|
||||
- 投递数 → 查看数 → 回复数 → 面试数 → Offer数
|
||||
- 每个环节的转化率
|
||||
- 识别漏斗中的薄弱环节
|
||||
- 对比不同平台的漏斗差异
|
||||
|
||||
2. **面试成功率趋势**
|
||||
- 按时间展示面试通过率变化
|
||||
- 分析成功率提升/下降原因
|
||||
- 识别面试表现最好的时间段
|
||||
- 给出改进建议
|
||||
|
||||
3. **薪资分布统计**
|
||||
- 投递岗位的薪资分布
|
||||
- Offer薪资分布
|
||||
- 对比期望薪资和实际薪资
|
||||
- 不同技能栈的薪资对比
|
||||
|
||||
4. **不同平台效果对比**
|
||||
- Boss、猎聘等平台的效果对比
|
||||
- 投递量、回复率、面试率对比
|
||||
- 平台特点分析
|
||||
- 推荐最优平台
|
||||
|
||||
**技术实现**
|
||||
- 前端: `admin/src/views/statistics/` 新增统计页面
|
||||
- ECharts图表: 漏斗图、折线图、柱状图、饼图
|
||||
- API: `statistics_server.js` 新增统计接口
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📊 数据洞察更直观
|
||||
- 💡 快速发现问题环节
|
||||
- 📈 数据驱动优化决策
|
||||
- ✨ 提供专业的数据分析
|
||||
|
||||
---
|
||||
|
||||
### 3.2 实时通知系统 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **浏览器通知**
|
||||
- 面试邀约即时通知
|
||||
- Offer通知
|
||||
- 重要聊天消息通知
|
||||
- 任务执行状态通知
|
||||
|
||||
2. **邮件通知**
|
||||
- 每日投递报告
|
||||
- 面试提醒(提前1天)
|
||||
- 重要事件邮件
|
||||
- 周报月报
|
||||
|
||||
3. **企业微信/钉钉集成**
|
||||
- 通过企业微信机器人推送
|
||||
- 支持快捷操作(如快速回复)
|
||||
- 群组通知
|
||||
- @指定人员
|
||||
|
||||
4. **关键事件提醒**
|
||||
- 面试邀约(立即通知)
|
||||
- Offer(立即通知)
|
||||
- 简历被查看(可配置)
|
||||
- 任务执行失败(立即通知)
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/services/notification_service.js`
|
||||
- 浏览器通知: Web Notification API
|
||||
- 邮件: nodemailer
|
||||
- 企业微信: 企业微信Webhook
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- ⏱️ 响应时间缩短 90%+
|
||||
- 📲 不错过任何重要消息
|
||||
- 💡 多渠道及时触达
|
||||
- ✨ 提供主动式消息推送
|
||||
|
||||
---
|
||||
|
||||
### 3.3 批量操作功能 ⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **批量启用/禁用账号**
|
||||
- 勾选多个账号
|
||||
- 一键启用/禁用
|
||||
- 批量设置自动化开关
|
||||
- 操作日志记录
|
||||
|
||||
2. **批量设置投递策略**
|
||||
- 批量修改投递时间范围
|
||||
- 批量修改每日上限
|
||||
- 批量设置关键词过滤
|
||||
- 应用模板到多个账号
|
||||
|
||||
3. **批量导出数据**
|
||||
- 勾选导出字段
|
||||
- 导出为CSV/Excel
|
||||
- 定时导出任务
|
||||
- 导出历史管理
|
||||
|
||||
**技术实现**
|
||||
- 前端: 各列表页面新增批量操作工具栏
|
||||
- API: 各模块新增批量操作接口
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- ⏱️ 管理效率提升 80%+
|
||||
- 💡 降低重复操作
|
||||
- ✨ 提供便捷的批量工具
|
||||
|
||||
---
|
||||
|
||||
### 3.4 移动端适配 ⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **响应式布局优化**
|
||||
- 适配手机、平板屏幕
|
||||
- 菜单改为抽屉式
|
||||
- 表格改为卡片式
|
||||
- 图表自适应尺寸
|
||||
|
||||
2. **移动端专属操作界面**
|
||||
- 大图标按钮
|
||||
- 手势操作(滑动、长按)
|
||||
- 底部操作栏
|
||||
- 快捷入口
|
||||
|
||||
3. **快捷操作入口**
|
||||
- 快捷查看今日统计
|
||||
- 快捷查看任务状态
|
||||
- 快捷回复聊天
|
||||
- 快捷查看面试安排
|
||||
|
||||
**技术实现**
|
||||
- 前端: 响应式CSS
|
||||
- 使用 iView 的响应式组件
|
||||
- 新增移动端专属组件
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- 📱 随时随地管理
|
||||
- 💡 提升移动端体验
|
||||
- ✨ 扩大使用场景
|
||||
|
||||
---
|
||||
|
||||
### 3.5 智能推荐 ⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **推荐最适合的岗位**
|
||||
- 基于简历和历史投递记录
|
||||
- AI预测岗位匹配度
|
||||
- 推荐优先投递的岗位
|
||||
- 推荐理由说明
|
||||
|
||||
2. **推荐最佳投递时间**
|
||||
- 分析不同时间投递的效果
|
||||
- 推荐最佳投递时段
|
||||
- 避开竞争激烈的时段
|
||||
- 根据平台特性调整
|
||||
|
||||
3. **推荐优化策略**
|
||||
- 分析数据找出问题
|
||||
- 推荐具体改进措施
|
||||
- 预测改进后的效果
|
||||
- 跟踪改进效果
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/job/recommendService.js`
|
||||
- AI模型: 基于历史数据训练
|
||||
- 前端: 首页新增推荐面板
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 投递效果提升 25%+
|
||||
- 💡 降低决策成本
|
||||
- ✨ 提供智能化建议
|
||||
|
||||
---
|
||||
|
||||
## 第四部分: 系统性能提升
|
||||
|
||||
**优先级: MEDIUM** | **预计工期: 3-4周**
|
||||
|
||||
### 4.1 缓存策略优化 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **Redis缓存热点数据**
|
||||
- 缓存职位类型配置(5分钟→实时)
|
||||
- 缓存统计数据(避免重复计算)
|
||||
- 缓存简历信息(减少数据库查询)
|
||||
- 缓存设备状态
|
||||
|
||||
2. **职位类型配置缓存**
|
||||
- 当前5分钟缓存改为即时失效
|
||||
- 配置更新时清除缓存
|
||||
- 预加载常用配置
|
||||
|
||||
3. **简历信息缓存**
|
||||
- 缓存最近查询的简历
|
||||
- LRU淘汰策略
|
||||
- 简历更新时清除缓存
|
||||
|
||||
**技术实现**
|
||||
- Redis集成: `ioredis`
|
||||
- 文件路径: `api/middleware/cache/cacheManager.js`
|
||||
- 缓存策略: LRU, TTL
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 响应速度提升 50%+
|
||||
- 📉 数据库压力降低 60%+
|
||||
- 💡 提升系统吞吐量
|
||||
- ✨ 提供更快的用户体验
|
||||
|
||||
---
|
||||
|
||||
### 4.2 数据库查询优化 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **慢查询分析和优化**
|
||||
- 开启MySQL慢查询日志
|
||||
- 分析TOP 10慢查询
|
||||
- 优化SQL语句
|
||||
- 添加必要索引
|
||||
|
||||
2. **索引优化**
|
||||
- 分析现有索引使用情况
|
||||
- 添加复合索引
|
||||
- 删除冗余索引
|
||||
- 定期索引维护
|
||||
|
||||
3. **分表分库策略**
|
||||
- 大表分表(如 `chat_records` 按月分表)
|
||||
- 历史数据归档
|
||||
- 读写分离(可选)
|
||||
|
||||
**技术实现**
|
||||
- 使用 `EXPLAIN` 分析查询
|
||||
- Sequelize 索引配置优化
|
||||
- 数据库迁移脚本
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 查询性能提升 3-5倍
|
||||
- 📉 慢查询数量减少 80%+
|
||||
- 💡 数据库可支撑更大数据量
|
||||
- ✨ 提升系统稳定性
|
||||
|
||||
---
|
||||
|
||||
### 4.3 任务队列扩展 ⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **支持更多任务类型**
|
||||
- 定时报告生成
|
||||
- 数据清理任务
|
||||
- 批量操作任务
|
||||
- 自定义任务
|
||||
|
||||
2. **任务优先级动态调整**
|
||||
- 根据紧急程度调整优先级
|
||||
- VIP用户任务优先执行
|
||||
- 失败任务降低优先级
|
||||
- 长时间等待的任务提升优先级
|
||||
|
||||
3. **任务失败自动重试优化**
|
||||
- 更智能的重试策略
|
||||
- 不同错误类型不同重试间隔
|
||||
- 重试次数动态调整
|
||||
- 重试失败后的降级处理
|
||||
|
||||
**技术实现**
|
||||
- 文件路径: `api/middleware/schedule/taskQueue.js` 优化
|
||||
- 新增任务类型处理器
|
||||
- 优化优先级算法
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 任务处理更稳定
|
||||
- 💡 支持更复杂的任务场景
|
||||
- ✨ 提供更灵活的任务管理
|
||||
|
||||
---
|
||||
|
||||
### 4.4 并发控制优化 ⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **增加并发设备数**
|
||||
- 当前最多5个设备
|
||||
- 支持动态配置并发数
|
||||
- 根据服务器性能自动调整
|
||||
- 支持分布式部署
|
||||
|
||||
2. **更精细的限流策略**
|
||||
- 不同任务类型不同限流
|
||||
- 不同平台不同限流
|
||||
- 根据时间段动态调整
|
||||
- API请求限流
|
||||
|
||||
3. **分布式锁机制**
|
||||
- 避免多实例冲突
|
||||
- Redis分布式锁
|
||||
- 锁超时自动释放
|
||||
- 死锁检测
|
||||
|
||||
**技术实现**
|
||||
- Redis分布式锁: `redlock`
|
||||
- 配置动态化
|
||||
- 负载均衡策略
|
||||
- 预计工期: 1周
|
||||
|
||||
**预期价值**
|
||||
- 📈 系统吞吐量提升 2-3倍
|
||||
- 💡 支持更大规模部署
|
||||
- ✨ 提供企业级并发控制
|
||||
|
||||
---
|
||||
|
||||
### 4.5 日志和监控 ⭐⭐⭐⭐
|
||||
|
||||
**待开发内容**
|
||||
1. **完善日志记录**
|
||||
- 统一日志格式(JSON)
|
||||
- 日志级别分级(DEBUG/INFO/WARN/ERROR)
|
||||
- 敏感信息脱敏
|
||||
- 日志文件按日期切割
|
||||
|
||||
2. **性能监控面板**
|
||||
- API响应时间监控
|
||||
- 数据库查询时间监控
|
||||
- 任务执行时间监控
|
||||
- 内存和CPU监控
|
||||
|
||||
3. **异常告警机制**
|
||||
- 错误率超过阈值告警
|
||||
- 任务失败立即告警
|
||||
- 系统资源不足告警
|
||||
- 钉钉/企业微信告警
|
||||
|
||||
4. **操作审计日志**
|
||||
- 记录所有关键操作
|
||||
- 操作人、操作时间、操作内容
|
||||
- 敏感操作二次确认
|
||||
- 审计日志导出
|
||||
|
||||
**技术实现**
|
||||
- 日志库: `winston`
|
||||
- 监控: `prometheus` + `grafana` (可选)
|
||||
- 告警: `api/services/alert_service.js`
|
||||
- 预计工期: 1.5周
|
||||
|
||||
**预期价值**
|
||||
- 🔍 问题定位效率提升 80%+
|
||||
- 📊 系统运行状态可视化
|
||||
- 🚨 及时发现和处理异常
|
||||
- ✨ 提供运维级别的监控
|
||||
|
||||
---
|
||||
|
||||
## 附录: 开发优先级建议
|
||||
|
||||
### 短期(1-2个月)
|
||||
**优先开发高价值、低成本功能**
|
||||
|
||||
| 功能 | 优先级 | 预计工期 | 价值 |
|
||||
|------|--------|----------|------|
|
||||
| 自动聊天功能完善 | ⭐⭐⭐⭐⭐ | 2周 | HR回复率+30% |
|
||||
| 账号保活任务 | ⭐⭐⭐⭐⭐ | 1周 | 封禁风险-70% |
|
||||
| 简历智能优化 | ⭐⭐⭐⭐⭐ | 2周 | 竞争力+20% |
|
||||
| 缓存策略优化 | ⭐⭐⭐⭐ | 1周 | 响应速度+50% |
|
||||
|
||||
**预计总工期: 6周**
|
||||
|
||||
### 中期(3-4个月)
|
||||
**完善核心功能和AI能力**
|
||||
|
||||
| 功能 | 优先级 | 预计工期 | 价值 |
|
||||
|------|--------|----------|------|
|
||||
| 简历自动更新 | ⭐⭐⭐⭐ | 1周 | 曝光率+50% |
|
||||
| 岗位黑名单和收藏 | ⭐⭐⭐⭐ | 1周 | 精准度+40% |
|
||||
| 多轮面试跟踪 | ⭐⭐⭐⭐ | 1.5周 | 完整生命周期 |
|
||||
| 面试问题预测 | ⭐⭐⭐⭐ | 1.5周 | 通过率+30% |
|
||||
| 数据可视化增强 | ⭐⭐⭐⭐ | 1周 | 数据洞察更直观 |
|
||||
|
||||
**预计总工期: 6周**
|
||||
|
||||
### 长期(5-6个月)
|
||||
**提升体验和系统性能**
|
||||
|
||||
| 功能 | 优先级 | 预计工期 | 价值 |
|
||||
|------|--------|----------|------|
|
||||
| 薪资谈判策略 | ⭐⭐⭐⭐ | 1周 | 薪资+10-15% |
|
||||
| 公司背景调查 | ⭐⭐⭐⭐ | 1.5周 | 风险-80% |
|
||||
| 实时通知系统 | ⭐⭐⭐⭐ | 1.5周 | 响应时间-90% |
|
||||
| 日志和监控 | ⭐⭐⭐⭐ | 1.5周 | 定位效率+80% |
|
||||
| 数据库查询优化 | ⭐⭐⭐⭐ | 1周 | 性能+3-5倍 |
|
||||
|
||||
**预计总工期: 6.5周**
|
||||
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
本规划文档共列出 **20项待开发功能**,分为4个优先级方向:
|
||||
|
||||
- **功能完善和补充** (5项, HIGH): 完善核心业务流程
|
||||
- **AI能力增强** (5项, HIGH): 提升智能化水平
|
||||
- **用户体验优化** (5项, MEDIUM): 改善交互和便捷性
|
||||
- **系统性能提升** (5项, MEDIUM): 优化性能和稳定性
|
||||
|
||||
**预期开发周期**:
|
||||
- 短期(1-2月): 6周
|
||||
- 中期(3-4月): 6周
|
||||
- 长期(5-6月): 6.5周
|
||||
- **总计**: 约4.5个月
|
||||
|
||||
**预期收益**:
|
||||
- 📈 整体求职成功率提升 **50%+**
|
||||
- 📈 用户使用效率提升 **80%+**
|
||||
- 📈 系统性能提升 **3-5倍**
|
||||
- 💰 用户平均薪资提升 **10-15%**
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 开发团队
|
||||
**最后更新**: 2025-12-25
|
||||
1174
_doc/客户端待开发功能.md
Normal file
1174
_doc/客户端待开发功能.md
Normal file
File diff suppressed because it is too large
Load Diff
387
_doc/项目功能总结.md
Normal file
387
_doc/项目功能总结.md
Normal file
@@ -0,0 +1,387 @@
|
||||
# 自动找工作系统 - 项目功能总结
|
||||
|
||||
> 版本: v1.0 | 更新日期: 2025-12-25
|
||||
|
||||
## 一、项目概述
|
||||
|
||||
自动找工作系统(autoAiWorkSys)是一个基于AI的智能求职助手平台,通过自动化技术帮助求职者高效管理多个招聘平台账号、智能筛选匹配岗位、自动投递简历,并提供全流程的求职数据分析。系统集成Qwen 2.5 AI模型,实现简历智能分析、岗位匹配度评分、聊天内容生成等功能,大幅提升求职效率和成功率。
|
||||
|
||||
## 二、技术栈
|
||||
|
||||
### 前端技术
|
||||
- **框架**: Vue 2.6.14 + Vuex 3.6.2 + Vue Router 3.5.3
|
||||
- **UI组件**: View Design (iView) 4.7.0
|
||||
- **构建工具**: Webpack 5
|
||||
- **图表库**: ECharts
|
||||
- **HTTP客户端**: 自定义 framework.http
|
||||
|
||||
### 后端技术
|
||||
- **运行时**: Node.js
|
||||
- **Web框架**: Koa 2.16.3
|
||||
- **ORM**: Sequelize 5.22.5
|
||||
- **数据库**: MySQL 8.0
|
||||
- **消息队列**: MQTT (mqtt://192.144.167.231:1883)
|
||||
- **AI模型**: Qwen 2.5 (阿里云DashScope)
|
||||
- **缓存**: Redis (规划中)
|
||||
- **存储**: Ali OSS
|
||||
|
||||
### 核心框架
|
||||
- **Node Core Framework**: 自研框架,提供统一的API路由、数据库管理、日志管理
|
||||
|
||||
## 三、核心特性
|
||||
|
||||
1. **多平台账号管理** - 支持Boss直聘、猎聘等多个招聘平台,统一管理账号和授权
|
||||
2. **智能简历分析** - AI评估简历竞争力(0-100分),提取技能标签,给出优势劣势和职业建议
|
||||
3. **自动岗位投递** - 基于技能匹配和AI评分自动筛选岗位并投递,支持每日上限和时间范围控制
|
||||
4. **AI岗位匹配** - 多维度评分(技能、经验、薪资、公司质量),自动识别外包岗位
|
||||
5. **任务调度系统** - 优先级队列+MQTT通信,设备内串行、设备间并行执行
|
||||
6. **数据可视化统计** - 投递成功率、面试转化率、不同平台效果对比等多维度分析
|
||||
7. **设备实时监控** - 在线状态、健康度、错误信息、心跳检测
|
||||
8. **完整审计日志** - 任务执行、投递记录、聊天记录全链路追踪
|
||||
|
||||
## 四、功能模块一览
|
||||
|
||||
### 4.1 前端功能模块
|
||||
|
||||
| 模块 | 页面路径 | 主要功能 |
|
||||
|------|---------|----------|
|
||||
| **首页/仪表板** | `/home` | 设备选择、账户信息卡片、今日统计、当前任务列表、近7天趋势图 |
|
||||
| **账号管理** | `/account/pla_account` | 账号列表、新增/编辑、授权管理、批量位置解析、停止任务 |
|
||||
| **账号详情** | `/account/pla_account_detail` | 账号基本信息、任务历史、自动化配置、运行操作面板 |
|
||||
| **简历管理** | `/account/resume_info` | 简历列表、查看详情、AI分析结果展示、删除 |
|
||||
| **简历详情** | `/account/resume_info_detail` | 个人信息、教育背景、工作经验、期望信息、AI评分和建议 |
|
||||
| **岗位管理** | `/work/job_postings` | 岗位列表、过滤查询、打招呼、查看详情 |
|
||||
| **投递记录** | `/work/apply_records` | 投递状态追踪、反馈状态、面试/Offer信息 |
|
||||
| **职位类型** | `/work/job_types` | 职位类型配置、技能关键词、排除关键词 |
|
||||
| **任务管理** | `/task/task_status` | 任务列表、指令详情、取消/重试操作 |
|
||||
| **聊天管理** | `/chat/chat_list` | 双面板聊天界面、会话列表、AI生成回复 |
|
||||
| **聊天记录** | `/chat/chat_records` | 聊天历史记录、消息类型、发送状态 |
|
||||
| **系统配置** | `/system/system_config` | 系统参数配置、AI服务配置、MQTT配置 |
|
||||
|
||||
### 4.2 后端API模块
|
||||
|
||||
| 模块 | 接口前缀 | 主要功能 |
|
||||
|------|---------|----------|
|
||||
| **账号管理** | `/admin_api/account` | 列表、详情、新增、更新、删除、授权、停止任务、位置解析 |
|
||||
| **简历管理** | `/admin_api/resume` | 列表、详情、统计、删除、AI分析、按设备获取 |
|
||||
| **岗位管理** | `/admin_api/job` | 列表、详情、统计、删除、打招呼 |
|
||||
| **投递记录** | `/admin_api/apply` | 列表、详情、统计、删除 |
|
||||
| **聊天记录** | `/admin_api/chat` | 列表、详情、统计、删除 |
|
||||
| **设备监控** | `/admin_api/device` | 列表、概览、配置更新、错误重置 |
|
||||
| **任务状态** | `/admin_api/task` | 列表、详情、统计、更新、删除 |
|
||||
| **数据统计** | `/admin_api/dashboard` | 综合统计、投递转化率、平台对比、设备排名 |
|
||||
| **系统配置** | `/admin_api/system` | 配置列表、新增、更新、删除 |
|
||||
|
||||
### 4.3 核心业务流程
|
||||
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ 账号配置和授权 │
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 获取在线简历(MQTT) │ → AI分析 → 竞争力评分、技能提取、优劣势分析
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 创建自动投递任务 │
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 搜索岗位(MQTT) │ → 保存到job_postings表
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 岗位过滤和匹配 │ → 技能匹配+AI评分+外包识别
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 自动投递(MQTT) │ → 记录apply_records
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 聊天和面试跟踪 │ → AI生成聊天内容
|
||||
└──────────┬──────────┘
|
||||
↓
|
||||
┌─────────────────────┐
|
||||
│ 数据统计和分析 │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
## 五、已实现功能清单
|
||||
|
||||
### 5.1 账号管理模块 ✅
|
||||
|
||||
- ✅ 多平台账号绑定(Boss直聘、猎聘)
|
||||
- ✅ 账号状态管理(启用/禁用、在线/离线、登录状态)
|
||||
- ✅ 自动化开关(自动投递、自动聊天、自动活跃)
|
||||
- ✅ 授权管理(设置授权日期、天数、过期时间计算)
|
||||
- ✅ 职位类型配置(关联job_types)
|
||||
- ✅ 投递配置(时间范围、每日上限、薪资范围、关键词过滤)
|
||||
- ✅ 沟通配置(时间范围、是否沟通外包岗位)
|
||||
- ✅ 活跃配置(活跃间隔、活跃动作)
|
||||
- ✅ 位置解析(单个/批量,经纬度获取)
|
||||
- ✅ 停止任务(取消该账号所有运行中任务)
|
||||
|
||||
### 5.2 简历管理模块 ✅
|
||||
|
||||
- ✅ 简历信息存储(个人信息、教育背景、工作经验、期望信息)
|
||||
- ✅ 简历获取(通过MQTT从设备获取在线简历)
|
||||
- ✅ AI竞争力评分(0-100分)
|
||||
- ✅ AI技能标签提取
|
||||
- ✅ AI优势劣势分析
|
||||
- ✅ AI职业建议生成
|
||||
- ✅ 简历与岗位匹配度计算
|
||||
- ✅ 简历统计(平均竞争力、工作年限分布、竞争力分布)
|
||||
- ✅ 按设备和平台查询简历
|
||||
|
||||
### 5.3 岗位管理模块 ✅
|
||||
|
||||
- ✅ 岗位信息存储(基本信息、要求、描述、薪资、地点)
|
||||
- ✅ 岗位搜索(通过MQTT下发搜索指令)
|
||||
- ✅ 岗位列表获取(通过MQTT获取列表)
|
||||
- ✅ AI岗位匹配评分(技能、经验、薪资、公司质量)
|
||||
- ✅ 外包岗位识别(规则+AI双层识别)
|
||||
- ✅ 岗位过滤(技能关键词匹配、排除关键词检测)
|
||||
- ✅ 综合评分计算(多维度权重评分)
|
||||
- ✅ 岗位统计(总数、平均匹配度、外包比例)
|
||||
- ✅ 打招呼功能(初次沟通)
|
||||
|
||||
### 5.4 自动投递模块 ✅
|
||||
|
||||
- ✅ 自动投递任务创建和调度
|
||||
- ✅ 每日投递上限控制
|
||||
- ✅ 投递时间范围控制(工作日/周末)
|
||||
- ✅ 简历刷新检查(2小时内刷新)
|
||||
- ✅ 岗位过滤和排序
|
||||
- ✅ 投递指令下发(MQTT)
|
||||
- ✅ 投递状态追踪(待投递、投递中、成功、失败、重复)
|
||||
- ✅ 反馈状态管理(无反馈、已查看、感兴趣、不合适、面试邀约)
|
||||
- ✅ 投递统计(成功率、面试转化率、Offer转化率)
|
||||
|
||||
### 5.5 AI分析模块 ✅
|
||||
|
||||
- ✅ Qwen 2.5模型集成(阿里云DashScope)
|
||||
- ✅ 简历智能分析
|
||||
- ✅ 技能标签提取
|
||||
- ✅ 竞争力评分(0-100)
|
||||
- ✅ 优势劣势分析
|
||||
- ✅ 职业发展建议
|
||||
- ✅ 岗位智能匹配
|
||||
- ✅ 技能匹配度(0-100)
|
||||
- ✅ 经验匹配度(0-100)
|
||||
- ✅ 薪资合理性(0-100)
|
||||
- ✅ 公司质量评分(0-100)
|
||||
- ✅ 外包岗位识别
|
||||
- ✅ 聊天内容生成(基础框架)
|
||||
|
||||
### 5.6 任务调度模块 ✅
|
||||
|
||||
- ✅ 优先级任务队列(堆实现,O(log n)性能)
|
||||
- ✅ 并发控制(全局5设备,每设备1任务)
|
||||
- ✅ 设备内串行、设备间并行执行
|
||||
- ✅ 任务状态管理(待执行、执行中、成功、失败、超时、取消)
|
||||
- ✅ 指数退避重试机制(最多3次)
|
||||
- ✅ 任务超时检测(10分钟)
|
||||
- ✅ 错误分类(可重试/不可重试)
|
||||
- ✅ 任务恢复(启动时恢复未完成任务)
|
||||
- ✅ 任务统计(岗位搜索数、过滤数、投递数、聊天数)
|
||||
|
||||
### 5.7 设备监控模块 ✅
|
||||
|
||||
- ✅ 设备状态追踪(在线/离线)
|
||||
- ✅ 心跳检测(通过MQTT)
|
||||
- ✅ 健康度评分
|
||||
- ✅ 错误信息记录
|
||||
- ✅ 最后心跳时间
|
||||
- ✅ 设备配置更新
|
||||
- ✅ 设备错误重置
|
||||
- ✅ 设备概览统计(在线数、离线数、健康度排名)
|
||||
|
||||
### 5.8 数据统计模块 ✅
|
||||
|
||||
- ✅ 投递成功率统计
|
||||
- ✅ 面试转化率统计
|
||||
- ✅ Offer转化率统计
|
||||
- ✅ 不同平台数据对比
|
||||
- ✅ 设备活跃度排名
|
||||
- ✅ 简历竞争力分布
|
||||
- ✅ 岗位外包比例统计
|
||||
- ✅ 近7天趋势图(投递、搜索、聊天)
|
||||
- ✅ 今日统计(实时刷新)
|
||||
|
||||
### 5.9 聊天管理模块 ✅
|
||||
|
||||
- ✅ 聊天记录存储
|
||||
- ✅ 聊天类型分类(打招呼、跟进、面试、回复)
|
||||
- ✅ 发送状态追踪
|
||||
- ✅ 回复检测和记录
|
||||
- ✅ 回复时长统计
|
||||
- ✅ 面试邀约识别
|
||||
- ✅ 情感分析(积极/中性/消极)
|
||||
- ✅ 效果评分
|
||||
- ✅ AI生成标记
|
||||
- ✅ 双面板聊天界面
|
||||
|
||||
### 5.10 其他功能 ✅
|
||||
|
||||
- ✅ 用户邀请和推广系统
|
||||
- ✅ 公司信息库(上市公司数据)
|
||||
- ✅ 版本管理
|
||||
- ✅ 邮件服务集成
|
||||
- ✅ OSS存储集成
|
||||
- ✅ 地理位置服务(百度地图API)
|
||||
- ✅ Swagger API文档
|
||||
- ✅ 数据导出(CSV)
|
||||
|
||||
## 六、数据模型
|
||||
|
||||
### 6.1 核心表结构
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|---------|
|
||||
| **pla_account** | 平台账号表 | sn_code, platform_type, is_online, auto_deliver, deliver_config |
|
||||
| **resume_info** | 简历信息表 | resumeId, account_id, aiCompetitiveness, aiSkillTags, aiStrengths |
|
||||
| **job_postings** | 岗位信息表 | jobId, platform, aiMatchScore, isOutsourcing, applyStatus |
|
||||
| **apply_records** | 投递记录表 | resumeId, jobId, applyStatus, feedbackStatus, hasInterview, hasOffer |
|
||||
| **chat_records** | 聊天记录表 | conversationId, chatType, isAiGenerated, hasReply, sentiment |
|
||||
| **task_status** | 任务状态表 | taskType, status, priority, retryCount, progress |
|
||||
| **task_commands** | 任务指令表 | taskId, commandType, commandData, response, executeTime |
|
||||
| **job_types** | 职位类型表 | name, commonSkills, excludeKeywords, sortOrder |
|
||||
| **device_monitor** | 设备监控表 | sn_code, is_online, health_score, last_heartbeat_time |
|
||||
| **company_info** | 公司信息表 | company_name, is_listed, market_value, risk_level |
|
||||
|
||||
### 6.2 表关联关系
|
||||
|
||||
```
|
||||
pla_account (1) ──→ (N) resume_info
|
||||
│
|
||||
├─→ (N) apply_records ←── (1) job_postings
|
||||
│ │
|
||||
│ └─→ (N) chat_records
|
||||
│
|
||||
└─→ (N) task_status ──→ (N) task_commands
|
||||
|
||||
pla_account (1) ──→ (1) job_types (职位类型配置)
|
||||
pla_account (1) ──→ (N) device_monitor (设备监控)
|
||||
```
|
||||
|
||||
## 七、快速开始
|
||||
|
||||
### 7.1 环境要求
|
||||
|
||||
- Node.js >= 14.x
|
||||
- MySQL >= 8.0
|
||||
- Redis (可选,用于缓存)
|
||||
- MQTT Broker (已配置: mqtt://192.144.167.231:1883)
|
||||
|
||||
### 7.2 安装步骤
|
||||
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone <repository-url>
|
||||
cd autoAiWorkSys
|
||||
|
||||
# 2. 安装后端依赖
|
||||
npm install
|
||||
|
||||
# 3. 安装前端依赖
|
||||
cd admin
|
||||
npm install
|
||||
|
||||
# 4. 配置数据库
|
||||
# 编辑 config/config.js
|
||||
# 设置MySQL连接信息
|
||||
|
||||
# 5. 初始化数据库
|
||||
# 执行 _sql 目录下的SQL脚本
|
||||
|
||||
# 6. 启动后端服务
|
||||
npm run dev
|
||||
|
||||
# 7. 启动前端服务(新终端)
|
||||
cd admin
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 7.3 核心配置
|
||||
|
||||
**config/config.js** - 主配置文件
|
||||
```javascript
|
||||
{
|
||||
db: {
|
||||
host: 'localhost',
|
||||
port: 3306,
|
||||
database: 'auto_job',
|
||||
username: 'root',
|
||||
password: 'your_password'
|
||||
},
|
||||
mqtt: {
|
||||
host: 'mqtt://192.144.167.231:1883',
|
||||
clientId: 'autoAiWorkSys_server'
|
||||
},
|
||||
ai: {
|
||||
apiKey: 'your_dashscope_api_key',
|
||||
model: 'qwen-turbo' // qwen-turbo/qwen-plus/qwen-max
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7.4 访问地址
|
||||
|
||||
- 前端管理后台: http://localhost:8080
|
||||
- 后端API: http://localhost:3000/admin_api
|
||||
- API文档: http://localhost:3000/api/docs
|
||||
|
||||
## 八、项目文件结构
|
||||
|
||||
```
|
||||
autoAiWorkSys/
|
||||
├── admin/ # 前端管理后台
|
||||
│ ├── src/
|
||||
│ │ ├── views/ # 页面组件
|
||||
│ │ ├── api/ # API调用
|
||||
│ │ ├── router/ # 路由配置
|
||||
│ │ └── store/ # Vuex状态管理
|
||||
│ └── package.json
|
||||
│
|
||||
├── api/ # 后端服务
|
||||
│ ├── controller_admin/ # 后台管理API
|
||||
│ ├── middleware/ # 核心业务逻辑
|
||||
│ │ ├── job/ # 岗位、简历、聊天管理
|
||||
│ │ ├── schedule/ # 任务调度系统
|
||||
│ │ └── mqtt/ # MQTT通信
|
||||
│ ├── model/ # 数据库模型
|
||||
│ ├── services/ # 业务服务层
|
||||
│ └── utils/ # 工具函数
|
||||
│
|
||||
├── config/ # 配置文件
|
||||
├── framework/ # 核心框架
|
||||
├── _doc/ # 文档目录
|
||||
├── _sql/ # 数据库脚本
|
||||
└── package.json
|
||||
```
|
||||
|
||||
## 九、技术亮点
|
||||
|
||||
1. **优先级队列** - 堆实现,O(log n)性能,比数组提升10-100倍
|
||||
2. **双层过滤** - 规则过滤+AI评分,平衡性能和准确性
|
||||
3. **智能重试** - 指数退避策略,区分可重试和不可重试错误
|
||||
4. **MQTT通信** - 异步消息队列,高效的设备指令下发和响应
|
||||
5. **AI多场景应用** - 简历分析、岗位匹配、聊天生成、外包识别
|
||||
6. **完整审计** - 任务、投递、聊天全链路追踪
|
||||
7. **模块化设计** - 清晰的分层架构,易于扩展和维护
|
||||
|
||||
## 十、性能指标
|
||||
|
||||
- 任务调度延迟: < 100ms
|
||||
- 数据库查询: 95%在100ms内
|
||||
- MQTT消息延迟: < 50ms
|
||||
- 前端页面加载: < 2s
|
||||
- 并发支持: 最多5个设备同时执行
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 开发团队
|
||||
**最后更新**: 2025-12-25
|
||||
**联系方式**: 项目Issues
|
||||
@@ -861,7 +861,9 @@ export default {
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('位置解析失败:', error)
|
||||
this.$Message.error('位置解析失败:' + (error.message || '请稍后重试'))
|
||||
// 优先从 error.response.data.message 获取,然后是 error.message
|
||||
const errorMsg = error.response?.data?.message || error.message || '请稍后重试'
|
||||
this.$Message.error(errorMsg)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -908,7 +910,9 @@ export default {
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('批量位置解析失败:', error)
|
||||
this.$Message.error('批量位置解析失败:' + (error.message || '请稍后重试'))
|
||||
// 优先从 error.response.data.message 获取,然后是 error.message
|
||||
const errorMsg = error.response?.data?.message || error.message || '请稍后重试'
|
||||
this.$Message.error(errorMsg)
|
||||
} finally {
|
||||
this.batchParseLoading = false
|
||||
}
|
||||
|
||||
@@ -331,7 +331,9 @@ export default {
|
||||
await this.loadResumeData(this.resumeData.resumeId)
|
||||
} catch (error) {
|
||||
console.error('AI 分析失败:', error)
|
||||
this.$Message.error('AI 分析失败: ' + (error.message || '请稍后重试'))
|
||||
// 优先从 error.response.data.message 获取,然后是 error.message
|
||||
const errorMsg = error.response?.data?.message || error.message || '请稍后重试'
|
||||
this.$Message.error(errorMsg)
|
||||
} finally {
|
||||
this.analyzing = false
|
||||
}
|
||||
|
||||
@@ -316,41 +316,118 @@ class ResumeManager {
|
||||
|
||||
const resume_info = db.getModel('resume_info');
|
||||
|
||||
// 解析 JSON 字段
|
||||
let skillsArray = [];
|
||||
let workExpArray = [];
|
||||
let projectExpArray = [];
|
||||
|
||||
try {
|
||||
if (resumeInfo.skills) {
|
||||
skillsArray = typeof resumeInfo.skills === 'string' ? JSON.parse(resumeInfo.skills) : resumeInfo.skills;
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn(`[简历管理] 解析技能字段失败:`, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (resumeInfo.workExperience) {
|
||||
workExpArray = typeof resumeInfo.workExperience === 'string' ? JSON.parse(resumeInfo.workExperience) : resumeInfo.workExperience;
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn(`[简历管理] 解析工作经历字段失败:`, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (resumeInfo.projectExperience) {
|
||||
projectExpArray = typeof resumeInfo.projectExperience === 'string' ? JSON.parse(resumeInfo.projectExperience) : resumeInfo.projectExperience;
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn(`[简历管理] 解析项目经历字段失败:`, e);
|
||||
}
|
||||
|
||||
// 构建工作经历文本
|
||||
const workExpText = workExpArray.map((work, index) => {
|
||||
return `${index + 1}. ${work.company || ''} - ${work.position || ''} (${work.startDate || ''} ~ ${work.endDate || '至今'})
|
||||
工作内容:${work.content || ''}
|
||||
行业:${work.industry || ''}`;
|
||||
}).join('\n\n');
|
||||
|
||||
// 构建项目经历文本
|
||||
const projectExpText = projectExpArray.map((project, index) => {
|
||||
return `${index + 1}. ${project.name || ''} - ${project.role || ''} (${project.startDate || ''} ~ ${project.endDate || '至今'})
|
||||
项目描述:${project.description || ''}
|
||||
项目成果:${project.performance || ''}`;
|
||||
}).join('\n\n');
|
||||
|
||||
// 构建分析提示词
|
||||
const prompt = `请分析以下简历,提供专业的评估:
|
||||
|
||||
姓名:${resumeInfo.fullName}
|
||||
工作年限:${resumeInfo.workYears}
|
||||
当前职位:${resumeInfo.currentPosition}
|
||||
期望职位:${resumeInfo.expectedPosition}
|
||||
期望薪资:${resumeInfo.expectedSalary}
|
||||
学历:${resumeInfo.education}
|
||||
技能:${resumeInfo.skills}
|
||||
【基本信息】
|
||||
姓名:${resumeInfo.fullName || ''}
|
||||
性别:${resumeInfo.gender || ''}
|
||||
年龄:${resumeInfo.age || ''}
|
||||
所在地:${resumeInfo.location || ''}
|
||||
工作年限:${resumeInfo.workYears || ''}
|
||||
|
||||
个人优势:
|
||||
${resumeInfo.skillDescription}
|
||||
【教育背景】
|
||||
学历:${resumeInfo.education || ''}
|
||||
专业:${resumeInfo.major || ''}
|
||||
毕业院校:${resumeInfo.school || ''}
|
||||
毕业年份:${resumeInfo.graduationYear || ''}
|
||||
|
||||
请从以下几个方面进行分析:
|
||||
1. 核心技能标签(提取5-10个关键技能)
|
||||
2. 优势分析(100字以内)
|
||||
3. 劣势分析(100字以内)
|
||||
4. 职业建议(150字以内)
|
||||
5. 竞争力评分(0-100分)`;
|
||||
【当前状态】
|
||||
当前职位:${resumeInfo.currentPosition || ''}
|
||||
当前公司:${resumeInfo.currentCompany || ''}
|
||||
当前薪资:${resumeInfo.currentSalary || ''}
|
||||
|
||||
【求职期望】
|
||||
期望职位:${resumeInfo.expectedPosition || ''}
|
||||
期望薪资:${resumeInfo.expectedSalary || ''}
|
||||
期望地点:${resumeInfo.expectedLocation || ''}
|
||||
期望行业:${resumeInfo.expectedIndustry || ''}
|
||||
|
||||
【技能标签】
|
||||
${skillsArray.length > 0 ? skillsArray.join('、') : '无'}
|
||||
|
||||
【个人优势描述】
|
||||
${resumeInfo.skillDescription || ''}
|
||||
|
||||
【工作经历】
|
||||
${workExpText || '无'}
|
||||
|
||||
【项目经历】
|
||||
${projectExpText || '无'}
|
||||
|
||||
请从以下几个方面进行专业分析,并返回 JSON 格式结果:
|
||||
1. skillTags: 核心技能标签数组(提取5-10个最关键的技术技能,如:Vue、React、Node.js等)
|
||||
2. strengths: 优势分析(100字以内,基于工作经历、项目经历、技能水平等综合评估)
|
||||
3. weaknesses: 劣势分析(100字以内,指出需要改进的地方或不足)
|
||||
4. careerSuggestion: 职业建议(150字以内,基于期望职位和当前能力给出职业发展建议)
|
||||
5. competitiveness: 竞争力评分(0-100的整数,综合考虑工作年限、技能深度、项目经验、学历等因素)
|
||||
|
||||
要求:
|
||||
- 竞争力评分要客观公正,基于实际能力评估
|
||||
- 优势分析要突出核心亮点和技术能力
|
||||
- 劣势分析要指出真实存在的问题
|
||||
- 职业建议要具有针对性和可操作性`;
|
||||
|
||||
try {
|
||||
// 调用AI服务进行分析
|
||||
const aiAnalysis = await aiService.analyzeResume(prompt);
|
||||
|
||||
// 解析AI返回的结果
|
||||
// 解析AI返回的结果,如果AI没返回有效数据,直接抛出错误
|
||||
const analysis = this.parse_ai_analysis(aiAnalysis, resumeInfo);
|
||||
|
||||
if (!analysis) {
|
||||
throw new Error('AI分析结果为空,无法处理');
|
||||
}
|
||||
|
||||
// 确保所有字段都有值
|
||||
const updateData = {
|
||||
aiSkillTags: JSON.stringify(analysis.skillTags || []),
|
||||
aiStrengths: analysis.strengths || '',
|
||||
aiWeaknesses: analysis.weaknesses || '',
|
||||
aiCareerSuggestion: analysis.careerSuggestion || '',
|
||||
aiCompetitiveness: parseInt(analysis.competitiveness || 70, 10)
|
||||
aiCompetitiveness: parseInt(analysis.competitiveness || 0, 10)
|
||||
};
|
||||
|
||||
// 确保竞争力评分在 0-100 范围内
|
||||
@@ -363,105 +440,44 @@ ${resumeInfo.skillDescription}
|
||||
console.log(`[简历管理] AI分析完成 - 竞争力评分: ${updateData.aiCompetitiveness}, 技能标签: ${updateData.aiSkillTags}`);
|
||||
|
||||
return analysis;
|
||||
} catch (error) {
|
||||
console.error(`[简历管理] AI分析失败:`, error, {
|
||||
resumeId: resumeId,
|
||||
fullName: resumeInfo.fullName
|
||||
});
|
||||
|
||||
// 如果AI分析失败,使用基于规则的默认分析,并保存到数据库
|
||||
const defaultAnalysis = this.get_default_analysis(resumeInfo);
|
||||
|
||||
// 保存默认分析结果到数据库
|
||||
const updateData = {
|
||||
aiSkillTags: JSON.stringify(defaultAnalysis.skillTags || []),
|
||||
aiStrengths: defaultAnalysis.strengths || '',
|
||||
aiWeaknesses: defaultAnalysis.weaknesses || '',
|
||||
aiCareerSuggestion: defaultAnalysis.careerSuggestion || '',
|
||||
aiCompetitiveness: parseInt(defaultAnalysis.competitiveness || 70, 10)
|
||||
};
|
||||
|
||||
// 确保竞争力评分在 0-100 范围内
|
||||
if (updateData.aiCompetitiveness < 0) updateData.aiCompetitiveness = 0;
|
||||
if (updateData.aiCompetitiveness > 100) updateData.aiCompetitiveness = 100;
|
||||
|
||||
await resume_info.update(updateData, { where: { resumeId: resumeId } });
|
||||
|
||||
console.log(`[简历管理] 使用默认分析结果 - 竞争力评分: ${updateData.aiCompetitiveness}`);
|
||||
|
||||
return defaultAnalysis;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析AI分析结果
|
||||
* @param {object} aiResponse - AI响应对象
|
||||
* @param {object} resumeInfo - 简历信息
|
||||
* @returns {object} 解析后的分析结果
|
||||
* @returns {object|null} 解析后的分析结果,如果AI没返回有效数据则返回null
|
||||
*/
|
||||
parse_ai_analysis(aiResponse, resumeInfo) {
|
||||
try {
|
||||
// aiService.analyzeResume 返回格式: { analysis: {...} } 或 { analysis: { content: "...", parseError: true } }
|
||||
const analysis = aiResponse.analysis;
|
||||
const analysis = aiResponse?.analysis;
|
||||
|
||||
// 如果解析失败,analysis 会有 parseError 标记
|
||||
if (analysis && analysis.parseError) {
|
||||
console.warn(`[简历管理] AI分析结果解析失败,使用默认分析`);
|
||||
return this.get_default_analysis(resumeInfo);
|
||||
// 如果解析失败,analysis 会有 parseError 标记,直接返回 null
|
||||
if (!analysis || analysis.parseError) {
|
||||
console.warn(`[简历管理] AI分析结果解析失败或为空`);
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果解析成功,analysis 直接是解析后的对象
|
||||
if (analysis && typeof analysis === 'object' && !analysis.parseError) {
|
||||
if (typeof analysis === 'object' && !analysis.parseError) {
|
||||
// 检查是否有必要的字段
|
||||
if (analysis.competitiveness === undefined && analysis.竞争力评分 === undefined) {
|
||||
console.warn(`[简历管理] AI分析结果缺少竞争力评分字段`);
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
skillTags: analysis.skillTags || analysis.技能标签 || [],
|
||||
strengths: analysis.strengths || analysis.优势 || analysis.优势分析 || '',
|
||||
weaknesses: analysis.weaknesses || analysis.劣势 || analysis.劣势分析 || '',
|
||||
careerSuggestion: analysis.careerSuggestion || analysis.职业建议 || '',
|
||||
competitiveness: parseInt(analysis.competitiveness || analysis.竞争力评分 || 70, 10)
|
||||
competitiveness: parseInt(analysis.competitiveness || analysis.竞争力评分 || 0, 10)
|
||||
};
|
||||
}
|
||||
|
||||
// 如果 analysis 是字符串,尝试解析
|
||||
const content = analysis?.content || analysis || '';
|
||||
if (typeof content === 'string' && content.includes('{') && content.includes('}')) {
|
||||
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
||||
if (jsonMatch) {
|
||||
const parsed = JSON.parse(jsonMatch[0]);
|
||||
return {
|
||||
skillTags: parsed.skillTags || parsed.技能标签 || [],
|
||||
strengths: parsed.strengths || parsed.优势 || parsed.优势分析 || '',
|
||||
weaknesses: parsed.weaknesses || parsed.劣势 || parsed.劣势分析 || '',
|
||||
careerSuggestion: parsed.careerSuggestion || parsed.职业建议 || '',
|
||||
competitiveness: parseInt(parsed.competitiveness || parsed.竞争力评分 || 70, 10)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 如果无法解析JSON,尝试从文本中提取信息
|
||||
if (typeof content === 'string') {
|
||||
const skillTagsMatch = content.match(/技能标签[::](.*?)(?:\n|$)/);
|
||||
const strengthsMatch = content.match(/优势[分析]*[::](.*?)(?:\n|劣势)/s);
|
||||
const weaknessesMatch = content.match(/劣势[分析]*[::](.*?)(?:\n|职业)/s);
|
||||
const suggestionMatch = content.match(/职业建议[::](.*?)(?:\n|竞争力)/s);
|
||||
const scoreMatch = content.match(/竞争力评分[::](\d+)/);
|
||||
|
||||
return {
|
||||
skillTags: skillTagsMatch ? skillTagsMatch[1].split(/[,,、]/).map(s => s.trim()) : [],
|
||||
strengths: strengthsMatch ? strengthsMatch[1].trim() : '',
|
||||
weaknesses: weaknessesMatch ? weaknessesMatch[1].trim() : '',
|
||||
careerSuggestion: suggestionMatch ? suggestionMatch[1].trim() : '',
|
||||
competitiveness: scoreMatch ? parseInt(scoreMatch[1], 10) : 70
|
||||
};
|
||||
}
|
||||
|
||||
// 如果所有解析都失败,使用默认分析
|
||||
console.warn(`[简历管理] 无法解析AI分析结果,使用默认分析`);
|
||||
return this.get_default_analysis(resumeInfo);
|
||||
} catch (error) {
|
||||
console.error(`[简历管理] 解析AI分析结果失败:`, error);
|
||||
// 解析失败时使用默认分析
|
||||
return this.get_default_analysis(resumeInfo);
|
||||
}
|
||||
// 如果格式不对,返回 null
|
||||
console.warn(`[简历管理] AI分析结果格式不正确`);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -156,23 +156,6 @@ class DeviceWorkStatusNotifier {
|
||||
await mqttClient.publish(topic, message);
|
||||
|
||||
|
||||
if (workStatus.currentActivity) {
|
||||
const activity = workStatus.currentActivity;
|
||||
const activityInfo = activity.type === 'command'
|
||||
? `指令[${activity.name}]`
|
||||
: `任务[${activity.name}]`;
|
||||
console.log(` - 当前活动: ${activityInfo}`);
|
||||
} else {
|
||||
console.log(` - 当前活动: 无`);
|
||||
}
|
||||
|
||||
if (workStatus.waitingMessage) {
|
||||
console.log(` - 等待消息: ${workStatus.waitingMessage.message}`);
|
||||
}
|
||||
|
||||
console.log(` - 待执行: ${workStatus.pendingQueue.totalCount}个`);
|
||||
console.log(` - 下次执行: ${workStatus.pendingQueue.nextExecuteTimeText}`);
|
||||
console.log(` - 消息大小: ${message.length} 字节`);
|
||||
} catch (error) {
|
||||
// 通知失败不影响任务执行,只记录日志
|
||||
console.warn(`[设备工作状态] 推送失败:`, error.message);
|
||||
|
||||
@@ -1 +1 @@
|
||||
import{a as t}from"./index-CMiak5Ls.js";class s{async getConfig(r){try{return await t.post("/user/delivery-config/get",{sn_code:r})}catch(e){throw console.error("获取投递配置失败:",e),e}}async saveConfig(r,e){try{return await t.post("/user/delivery-config/save",{sn_code:r,deliver_config:e})}catch(o){throw console.error("保存投递配置失败:",o),o}}}const i=new s;export{i as default};
|
||||
import{a as t}from"./index-BEa_v6Fs.js";class s{async getConfig(r){try{return await t.post("/user/delivery-config/get",{sn_code:r})}catch(e){throw console.error("获取投递配置失败:",e),e}}async saveConfig(r,e){try{return await t.post("/user/delivery-config/save",{sn_code:r,deliver_config:e})}catch(o){throw console.error("保存投递配置失败:",o),o}}}const i=new s;export{i as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{a as t}from"./index-Cia_UppJ.js";class s{async getConfig(r){try{return await t.post("/user/delivery-config/get",{sn_code:r})}catch(e){throw console.error("获取投递配置失败:",e),e}}async saveConfig(r,e){try{return await t.post("/user/delivery-config/save",{sn_code:r,deliver_config:e})}catch(o){throw console.error("保存投递配置失败:",o),o}}}const i=new s;export{i as default};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 334 KiB |
Binary file not shown.
Binary file not shown.
@@ -1,32 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>boss - 远程监听服务</title>
|
||||
<script type="module" crossorigin src="/app/assets/index-Cia_UppJ.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/app/assets/index--P_P-eHg.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- 启动加载动画 -->
|
||||
<div id="loading-screen" class="loading-screen">
|
||||
<div class="loading-content">
|
||||
<div class="loading-logo">
|
||||
<div class="logo-circle"></div>
|
||||
</div>
|
||||
<div class="loading-text">正在启动...</div>
|
||||
<div class="loading-progress">
|
||||
<div class="progress-bar-animated"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vue 应用挂载点 -->
|
||||
<div id="app" ></div>
|
||||
|
||||
<!-- 在 body 底部加载 Vue 应用脚本 -->
|
||||
|
||||
</body>
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>boss - 远程监听服务</title>
|
||||
<script type="module" crossorigin src="/app/assets/index-CMiak5Ls.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/app/assets/index-DDAU-aR1.css">
|
||||
<script type="module" crossorigin src="/app/assets/index-BEa_v6Fs.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/app/assets/index-BHUtbpCz.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
Reference in New Issue
Block a user