# 简历存储和分析功能 - 快速参考

## 🚀 快速开始

### 1. 基本使用

```javascript
const jobManager = require('./api/middleware/job/jobManager');

// 获取在线简历（自动存储和分析）
const resumeData = await jobManager.get_online_resume(
    'GHJU',              // 设备SN码
    mqttClient,          // MQTT客户端
    { platform: 'boss' } // 平台（可选，默认boss）
);
```

### 2. 查询已存储的简历

```javascript
const db = require('./api/middleware/dbProxy');
const resume_info = db.getModel('resume_info');

// 查询指定设备的简历
const resume = await resume_info.findOne({
    where: {
        sn_code: 'GHJU',
        platform: 'boss',
        isActive: true
    }
});

console.log('姓名:', resume.fullName);
console.log('竞争力评分:', resume.aiCompetitiveness);
```

## 📋 主要字段说明

### 基本信息
- `fullName` - 姓名
- `gender` - 性别
- `age` - 年龄
- `phone` - 电话
- `email` - 邮箱

### 工作信息
- `workYears` - 工作年限
- `currentPosition` - 当前职位
- `currentCompany` - 当前公司
- `expectedPosition` - 期望职位
- `expectedSalary` - 期望薪资

### AI分析字段
- `aiSkillTags` - AI提取的技能标签（JSON数组）
- `aiStrengths` - 优势分析
- `aiWeaknesses` - 劣势分析
- `aiCareerSuggestion` - 职业建议
- `aiCompetitiveness` - 竞争力评分（0-100）

### 复杂数据（JSON格式）
- `skills` - 技能标签数组
- `projectExperience` - 项目经验数组
- `workExperience` - 工作经历数组
- `originalData` - 完整原始数据

## 🔍 常用查询示例

### 查询高竞争力简历
```javascript
const highScoreResumes = await resume_info.findAll({
    where: {
        aiCompetitiveness: { [db.models.op.gte]: 80 }
    },
    order: [['aiCompetitiveness', 'DESC']]
});
```

### 按技能搜索
```javascript
const vueResumes = await resume_info.findAll({
    where: {
        skills: { [db.models.op.like]: '%Vue%' }
    }
});
```

### 统计数据
```javascript
// 总数
const total = await resume_info.count();

// 按平台统计
const bossCount = await resume_info.count({ 
    where: { platform: 'boss' } 
});

// 平均竞争力
const avgScore = await resume_info.findAll({
    attributes: [
        [db.models.sequelize.fn('AVG', 
         db.models.sequelize.col('aiCompetitiveness')), 
         'avgScore']
    ]
});
```

## 🎯 数据处理技巧

### 解析JSON字段
```javascript
// 解析技能标签
const skills = JSON.parse(resume.skills || '[]');
console.log('技能:', skills.join(', '));

// 解析项目经验
const projects = JSON.parse(resume.projectExperience || '[]');
projects.forEach(p => {
    console.log(`项目: ${p.name} - ${p.role}`);
});

// 解析工作经历
const workExp = JSON.parse(resume.workExperience || '[]');
workExp.forEach(w => {
    console.log(`${w.company} - ${w.position}`);
});
```

### 获取原始数据
```javascript
const originalData = JSON.parse(resume.originalData);
console.log('完整Boss直聘数据:', originalData);
```

## ⚙️ 配置说明

### 环境变量（.env）
```env
# DeepSeek AI配置
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxx
DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat/completions
DEEPSEEK_MODEL=deepseek-chat
```

### 数据库配置
确保 `resume_info` 表已创建，字段定义参考：
`api/model/resume_info.js`

## 🐛 常见问题

### Q1: 简历保存失败怎么办？
A: 系统有容错机制，保存失败不会影响数据返回。检查日志：
```
[工作管理] 保存简历数据失败: [错误信息]
```

### Q2: AI分析失败怎么办？
A: 系统会自动使用基于规则的默认分析。检查：
- DeepSeek API配置是否正确
- API密钥是否有效
- 网络连接是否正常

### Q3: 如何更新已有简历？
A: 再次调用 `get_online_resume`，系统会自动检测并更新：
```javascript
// 同一设备同一平台会自动更新
await jobManager.get_online_resume('GHJU', mqttClient);
```

### Q4: 如何查看详细日志？
A: 查看控制台输出：
```
[工作管理] 开始获取设备 GHJU 的在线简历
[工作管理] 成功获取简历数据
[工作管理] 简历已创建/更新 - ID: xxx
[工作管理] AI分析完成 - 竞争力评分: 85
```

## 📊 性能优化建议

### 1. 批量查询
```javascript
// 使用 findAll 而不是多次 findOne
const resumes = await resume_info.findAll({
    where: { sn_code: { [db.models.op.in]: ['GHJU', 'ABCD'] } }
});
```

### 2. 选择性字段
```javascript
// 只查询需要的字段
const resumes = await resume_info.findAll({
    attributes: ['id', 'fullName', 'aiCompetitiveness'],
    where: { isActive: true }
});
```

### 3. 分页查询
```javascript
const resumes = await resume_info.findAndCountAll({
    limit: 20,
    offset: 0,
    order: [['aiCompetitiveness', 'DESC']]
});
```

## 🔗 相关文档

- 详细说明: `_doc/简历存储和分析功能说明.md`
- 实现总结: `_doc/简历功能实现总结.md`
- 示例代码: `examples/resume_storage_example.js`
- 模型定义: `api/model/resume_info.js`
- 响应示例: `_doc/在线简历响应文本.json`

## 💡 最佳实践

1. **总是检查返回值**
```javascript
const resume = await resume_info.findOne({...});
if (resume) {
    // 处理简历数据
}
```

2. **安全解析JSON**
```javascript
try {
    const skills = JSON.parse(resume.skills || '[]');
} catch (e) {
    console.error('解析失败:', e);
}
```

3. **使用事务处理批量操作**
```javascript
const t = await db.models.sequelize.transaction();
try {
    // 批量操作
    await t.commit();
} catch (error) {
    await t.rollback();
}
```

4. **定期清理旧数据**
```javascript
// 删除非活跃简历
await resume_info.destroy({
    where: { isActive: false }
});
```

