240 lines
7.1 KiB
Markdown
240 lines
7.1 KiB
Markdown
# 简历存储功能 - 前置条件和使用说明
|
||
|
||
## ⚠️ 重要前置条件
|
||
|
||
在使用简历存储功能之前,必须确保以下条件已满足:
|
||
|
||
### 1. 数据库表已创建
|
||
|
||
#### ✅ `pla_account` 表(平台账户表)
|
||
|
||
此表存储设备与平台账户的绑定关系,**必须先有记录**才能存储简历。
|
||
|
||
**表结构**:
|
||
```sql
|
||
CREATE TABLE `pla_account` (
|
||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
|
||
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '账户名',
|
||
`sn_code` varchar(50) NOT NULL DEFAULT '' COMMENT '设备SN码',
|
||
`platform_type` varchar(50) NOT NULL DEFAULT '' COMMENT '平台类型(boss/liepin)',
|
||
`login_name` varchar(50) NOT NULL DEFAULT '' COMMENT '登录名',
|
||
`pwd` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',
|
||
`keyword` varchar(50) NOT NULL DEFAULT '' COMMENT '关键词',
|
||
`search_url` varchar(50) NOT NULL DEFAULT '' COMMENT '搜索页网址',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
```
|
||
|
||
**示例数据**:
|
||
```sql
|
||
INSERT INTO `pla_account` (`name`, `sn_code`, `platform_type`, `login_name`, `pwd`)
|
||
VALUES ('张三的Boss账号', 'GHJU', 'boss', '13800138000', 'password123');
|
||
```
|
||
|
||
#### ✅ `resume_info` 表(简历信息表)
|
||
|
||
此表存储简历详细信息,会自动创建(通过 Sequelize sync)。
|
||
|
||
**关键字段**:
|
||
- `id` - 简历UUID(主键)
|
||
- `sn_code` - 设备SN码(关联设备)
|
||
- `account_id` - 账户ID(**关联 pla_account.id**)
|
||
- `platform` - 平台类型(boss/liepin)
|
||
|
||
### 2. 数据关联关系
|
||
|
||
```
|
||
┌─────────────────┐ ┌──────────────────┐
|
||
│ pla_account │ │ resume_info │
|
||
├─────────────────┤ ├──────────────────┤
|
||
│ id (自增) │◄────────│ account_id │
|
||
│ sn_code │ │ sn_code │
|
||
│ platform_type │ │ platform │
|
||
│ login_name │ │ fullName │
|
||
│ pwd │ │ ... │
|
||
└─────────────────┘ └──────────────────┘
|
||
```
|
||
|
||
**查询逻辑**:
|
||
1. 通过 `sn_code` + `platform` 查询 `pla_account` 表
|
||
2. 获取 `pla_account.id` 作为 `account_id`
|
||
3. 将 `account_id` 存入 `resume_info` 表
|
||
|
||
### 3. 环境配置
|
||
|
||
#### 数据库连接
|
||
确保数据库连接配置正确(`config/config.js`)
|
||
|
||
#### AI服务配置(可选)
|
||
如需AI分析功能,需配置 DeepSeek API:
|
||
|
||
```env
|
||
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxx
|
||
DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat/completions
|
||
DEEPSEEK_MODEL=deepseek-chat
|
||
```
|
||
|
||
## 🚀 使用流程
|
||
|
||
### 步骤1: 创建平台账户记录
|
||
|
||
在调用简历存储功能之前,必须先在 `pla_account` 表中创建账户记录:
|
||
|
||
```javascript
|
||
const db = require('./api/middleware/dbProxy');
|
||
const pla_account = db.getModel('pla_account');
|
||
|
||
// 创建账户记录
|
||
await pla_account.create({
|
||
name: '张三的Boss账号',
|
||
sn_code: 'GHJU',
|
||
platform_type: 'boss',
|
||
login_name: '13800138000',
|
||
pwd: 'password123',
|
||
keyword: '前端工程师',
|
||
search_url: 'https://www.zhipin.com/web/geek/job'
|
||
});
|
||
```
|
||
|
||
### 步骤2: 同步数据库表结构
|
||
|
||
运行同步脚本确保表结构正确:
|
||
|
||
```bash
|
||
node scripts/sync_resume_table.js
|
||
```
|
||
|
||
### 步骤3: 调用简历存储功能
|
||
|
||
```javascript
|
||
const jobManager = require('./api/middleware/job/jobManager');
|
||
|
||
// 获取在线简历(自动存储)
|
||
const resumeData = await jobManager.get_online_resume(
|
||
'GHJU', // 设备SN码(必须在 pla_account 中存在)
|
||
mqttClient, // MQTT客户端
|
||
{ platform: 'boss' } // 平台类型(必须与 pla_account.platform_type 匹配)
|
||
);
|
||
```
|
||
|
||
## ❌ 常见错误
|
||
|
||
### 错误1: "未找到设备 GHJU 在平台 boss 的账户信息"
|
||
|
||
**原因**: `pla_account` 表中没有对应的记录
|
||
|
||
**解决方案**:
|
||
```javascript
|
||
// 检查是否存在账户记录
|
||
const account = await pla_account.findOne({
|
||
where: { sn_code: 'GHJU', platform_type: 'boss' }
|
||
});
|
||
|
||
if (!account) {
|
||
// 创建账户记录
|
||
await pla_account.create({
|
||
name: '账户名称',
|
||
sn_code: 'GHJU',
|
||
platform_type: 'boss',
|
||
login_name: '登录名',
|
||
pwd: '密码'
|
||
});
|
||
}
|
||
```
|
||
|
||
### 错误2: "Unknown column 'sn_code' in 'field list'"
|
||
|
||
**原因**: 数据库表结构未同步
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 运行同步脚本
|
||
node scripts/sync_resume_table.js
|
||
|
||
# 或手动执行SQL
|
||
ALTER TABLE `resume_info`
|
||
ADD COLUMN `sn_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '设备SN码',
|
||
ADD COLUMN `account_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户ID';
|
||
```
|
||
|
||
### 错误3: "account_id 不能为空"
|
||
|
||
**原因**: `pla_account` 查询失败或返回 null
|
||
|
||
**解决方案**:
|
||
1. 确认 `sn_code` 和 `platform_type` 匹配
|
||
2. 检查 `pla_account` 表中是否有对应记录
|
||
3. 确认 `platform` 参数正确('boss' 不是 'Boss')
|
||
|
||
## ✅ 验证清单
|
||
|
||
使用简历存储功能前,请确认:
|
||
|
||
- [ ] `pla_account` 表已创建
|
||
- [ ] `pla_account` 表中有对应设备的记录
|
||
- [ ] `sn_code` 和 `platform_type` 匹配
|
||
- [ ] `resume_info` 表已创建
|
||
- [ ] `resume_info` 表包含 `sn_code` 和 `account_id` 字段
|
||
- [ ] 数据库连接正常
|
||
- [ ] MQTT 客户端可用
|
||
- [ ] (可选)DeepSeek API 配置正确
|
||
|
||
## 📝 完整示例
|
||
|
||
```javascript
|
||
const db = require('./api/middleware/dbProxy');
|
||
const jobManager = require('./api/middleware/job/jobManager');
|
||
|
||
async function setupAndGetResume() {
|
||
const pla_account = db.getModel('pla_account');
|
||
|
||
// 1. 检查或创建账户记录
|
||
let account = await pla_account.findOne({
|
||
where: { sn_code: 'GHJU', platform_type: 'boss' }
|
||
});
|
||
|
||
if (!account) {
|
||
console.log('创建账户记录...');
|
||
account = await pla_account.create({
|
||
name: '测试账号',
|
||
sn_code: 'GHJU',
|
||
platform_type: 'boss',
|
||
login_name: '13800138000',
|
||
pwd: 'password123'
|
||
});
|
||
console.log('账户创建成功,ID:', account.id);
|
||
} else {
|
||
console.log('账户已存在,ID:', account.id);
|
||
}
|
||
|
||
// 2. 获取简历(自动存储)
|
||
console.log('获取在线简历...');
|
||
const resumeData = await jobManager.get_online_resume(
|
||
'GHJU',
|
||
mqttClient,
|
||
{ platform: 'boss' }
|
||
);
|
||
|
||
console.log('简历获取成功!');
|
||
console.log('姓名:', resumeData.baseInfo?.name);
|
||
|
||
// 3. 验证存储结果
|
||
const resume_info = db.getModel('resume_info');
|
||
const savedResume = await resume_info.findOne({
|
||
where: { sn_code: 'GHJU', platform: 'boss', isActive: true }
|
||
});
|
||
|
||
console.log('简历已保存,ID:', savedResume.id);
|
||
console.log('关联账户ID:', savedResume.account_id);
|
||
console.log('竞争力评分:', savedResume.aiCompetitiveness);
|
||
}
|
||
```
|
||
|
||
## 🔗 相关文档
|
||
|
||
- 详细功能说明: `_doc/简历存储和分析功能说明.md`
|
||
- 数据库同步指南: `_doc/数据库表同步指南.md`
|
||
- 快速参考: `_doc/简历功能快速参考.md`
|
||
- 示例代码: `examples/resume_storage_example.js`
|
||
|