1
This commit is contained in:
@@ -104,10 +104,8 @@ module.exports = {
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
count: result.count,
|
||||
total: result.count,
|
||||
rows: result.rows,
|
||||
list: result.rows
|
||||
count: result.count
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -150,8 +150,8 @@ module.exports = {
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
total: result.count,
|
||||
list: list
|
||||
rows: list,
|
||||
count: result.count
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -686,6 +686,86 @@ module.exports = {
|
||||
end_date: end_date
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /admin_api/pla_account/parse-resume:
|
||||
* post:
|
||||
* summary: 解析账号在线简历
|
||||
* description: 获取指定账号的在线简历并进行AI分析,返回简历详情
|
||||
* tags: [后台-账号管理]
|
||||
* requestBody:
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* required:
|
||||
* - id
|
||||
* properties:
|
||||
* id:
|
||||
* type: integer
|
||||
* description: 账号ID
|
||||
* responses:
|
||||
* 200:
|
||||
* description: 解析成功,返回简历ID
|
||||
*/
|
||||
'POST /pla_account/parse-resume': async (ctx) => {
|
||||
const { id } = ctx.getBody();
|
||||
const models = await Framework.getModels();
|
||||
const { pla_account } = models;
|
||||
const mqttClient = require('../middleware/mqtt/mqttClient');
|
||||
const resumeManager = require('../middleware/job/resumeManager');
|
||||
|
||||
if (!id) {
|
||||
return ctx.fail('账号ID不能为空');
|
||||
}
|
||||
|
||||
// 获取账号信息
|
||||
const account = await pla_account.findOne({ where: { id } });
|
||||
|
||||
if (!account) {
|
||||
return ctx.fail('账号不存在');
|
||||
}
|
||||
|
||||
const { sn_code, platform_type } = account;
|
||||
|
||||
if (!sn_code) {
|
||||
return ctx.fail('该账号未绑定设备');
|
||||
}
|
||||
|
||||
try {
|
||||
// 调用简历管理器获取并保存简历
|
||||
const resumeData = await resumeManager.get_online_resume(sn_code, mqttClient, {
|
||||
platform: platform_type || 'boss'
|
||||
});
|
||||
|
||||
// 从返回数据中获取 resumeId
|
||||
// resumeManager 已经保存了简历到数据库,我们需要查询获取 resumeId
|
||||
const resume_info = models.resume_info;
|
||||
const savedResume = await resume_info.findOne({
|
||||
where: {
|
||||
sn_code,
|
||||
platform: platform_type || 'boss',
|
||||
isActive: true
|
||||
},
|
||||
order: [['syncTime', 'DESC']]
|
||||
});
|
||||
|
||||
if (!savedResume) {
|
||||
return ctx.fail('简历解析失败:未找到保存的简历记录');
|
||||
}
|
||||
|
||||
return ctx.success({
|
||||
message: '简历解析成功',
|
||||
resumeId: savedResume.resumeId,
|
||||
data: resumeData
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('[解析简历] 失败:', error);
|
||||
return ctx.fail('解析简历失败: ' + (error.message || '未知错误'));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -69,8 +69,8 @@ const result = await resume_info.findAndCountAll({
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
total: result.count,
|
||||
list: result.rows
|
||||
rows: result.rows,
|
||||
count: result.count
|
||||
});
|
||||
|
||||
},
|
||||
@@ -153,24 +153,45 @@ return ctx.success({
|
||||
* 200:
|
||||
* description: 获取成功
|
||||
*/
|
||||
'GET /resume/detail': async (ctx) => {
|
||||
'POST /resume/detail': async (ctx) => {
|
||||
const models = Framework.getModels();
|
||||
const { resume_info } = models;
|
||||
const { resumeId } = ctx.query;
|
||||
const { resumeId } = ctx.getBody();
|
||||
|
||||
if (!resumeId) {
|
||||
return ctx.fail('简历ID不能为空');
|
||||
}
|
||||
|
||||
|
||||
const resume = await resume_info.findOne({ where: { resumeId } });
|
||||
const resume = await resume_info.findOne({ where: { resumeId } });
|
||||
|
||||
if (!resume) {
|
||||
return ctx.fail('简历不存在');
|
||||
}
|
||||
if (!resume) {
|
||||
return ctx.fail('简历不存在');
|
||||
}
|
||||
|
||||
return ctx.success(resume);
|
||||
// 解析 JSON 字段
|
||||
const resumeDetail = resume.toJSON();
|
||||
const jsonFields = ['skills', 'certifications', 'projectExperience', 'workExperience', 'aiSkillTags'];
|
||||
|
||||
jsonFields.forEach(field => {
|
||||
if (resumeDetail[field]) {
|
||||
try {
|
||||
resumeDetail[field] = JSON.parse(resumeDetail[field]);
|
||||
} catch (e) {
|
||||
console.error(`解析字段 ${field} 失败:`, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 解析原始数据(如果存在)
|
||||
if (resumeDetail.originalData) {
|
||||
try {
|
||||
resumeDetail.originalData = JSON.parse(resumeDetail.originalData);
|
||||
} catch (e) {
|
||||
console.error('解析原始数据失败:', e);
|
||||
}
|
||||
}
|
||||
|
||||
return ctx.success(resumeDetail);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -269,6 +290,74 @@ return ctx.success({ message: '简历删除成功' });
|
||||
});
|
||||
|
||||
return ctx.success(resumeDetail);
|
||||
},
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /admin_api/resume/analyze-with-ai:
|
||||
* post:
|
||||
* summary: AI 分析简历
|
||||
* description: 使用 AI 分析简历并更新 AI 字段
|
||||
* tags: [后台-简历管理]
|
||||
* requestBody:
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* required:
|
||||
* - resumeId
|
||||
* properties:
|
||||
* resumeId:
|
||||
* type: string
|
||||
* description: 简历ID
|
||||
* responses:
|
||||
* 200:
|
||||
* description: 分析成功
|
||||
*/
|
||||
'POST /resume/analyze-with-ai': async (ctx) => {
|
||||
const models = Framework.getModels();
|
||||
const { resume_info } = models;
|
||||
const { resumeId } = ctx.getBody();
|
||||
|
||||
if (!resumeId) {
|
||||
return ctx.fail('简历ID不能为空');
|
||||
}
|
||||
|
||||
const resume = await resume_info.findOne({ where: { resumeId } });
|
||||
|
||||
if (!resume) {
|
||||
return ctx.fail('简历不存在');
|
||||
}
|
||||
|
||||
try {
|
||||
const resumeManager = require('../middleware/job/resumeManager');
|
||||
const resumeData = resume.toJSON();
|
||||
|
||||
// 调用 AI 分析
|
||||
await resumeManager.analyze_resume_with_ai(resumeId, resumeData);
|
||||
|
||||
// 重新获取更新后的数据
|
||||
const updatedResume = await resume_info.findOne({ where: { resumeId } });
|
||||
const resumeDetail = updatedResume.toJSON();
|
||||
|
||||
// 解析 JSON 字段
|
||||
const jsonFields = ['skills', 'certifications', 'projectExperience', 'workExperience', 'aiSkillTags'];
|
||||
jsonFields.forEach(field => {
|
||||
if (resumeDetail[field]) {
|
||||
try {
|
||||
resumeDetail[field] = JSON.parse(resumeDetail[field]);
|
||||
} catch (e) {
|
||||
console.error(`解析字段 ${field} 失败:`, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return ctx.success(resumeDetail);
|
||||
} catch (error) {
|
||||
console.error('AI 分析失败:', error);
|
||||
return ctx.fail('AI 分析失败: ' + error.message);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user