This commit is contained in:
张成
2025-12-26 13:12:53 +08:00
parent 6253abc617
commit 6efd77d2b5
3 changed files with 131 additions and 0 deletions

View File

@@ -48,6 +48,15 @@ class ResumeInfoServer {
analyzeWithAI(resumeId) { analyzeWithAI(resumeId) {
return window.framework.http.post('/resume/analyze-with-ai', { resumeId }) return window.framework.http.post('/resume/analyze-with-ai', { resumeId })
} }
/**
* 同步在线简历
* @param {String} resumeId - 简历ID
* @returns {Promise}
*/
syncOnline(resumeId) {
return window.framework.http.post('/resume/sync-online', { resumeId })
}
} }
export default new ResumeInfoServer() export default new ResumeInfoServer()

View File

@@ -8,6 +8,7 @@
@back="handleBack" @back="handleBack"
> >
<template #header-right> <template #header-right>
<Button type="info" @click="handleSyncOnline" :loading="syncing" style="margin-right: 8px;">同步在线简历</Button>
<Button type="primary" @click="handleAnalyzeAI" :loading="analyzing">AI 分析</Button> <Button type="primary" @click="handleAnalyzeAI" :loading="analyzing">AI 分析</Button>
</template> </template>
@@ -272,6 +273,7 @@ export default {
return { return {
loading: false, loading: false,
analyzing: false, analyzing: false,
syncing: false,
resumeData: null, resumeData: null,
skillTags: [], skillTags: [],
workExperience: [], workExperience: [],
@@ -317,6 +319,32 @@ export default {
} }
return field return field
}, },
async handleSyncOnline() {
if (!this.resumeData || !this.resumeData.resumeId) {
this.$Message.warning('简历ID不存在')
return
}
if (!this.resumeData.sn_code) {
this.$Message.warning('该简历未绑定设备,无法同步在线简历')
return
}
this.syncing = true
try {
const res = await resumeInfoServer.syncOnline(this.resumeData.resumeId)
this.$Message.success(res.message || '同步在线简历成功')
// 重新加载数据
await this.loadResumeData(this.resumeData.resumeId)
} catch (error) {
console.error('同步在线简历失败:', error)
// 优先从 error.response.data.message 获取,然后是 error.message
const errorMsg = error.response?.data?.message || error.message || '请稍后重试'
this.$Message.error(errorMsg)
} finally {
this.syncing = false
}
},
async handleAnalyzeAI() { async handleAnalyzeAI() {
if (!this.resumeData || !this.resumeData.resumeId) { if (!this.resumeData || !this.resumeData.resumeId) {
this.$Message.warning('简历ID不存在') this.$Message.warning('简历ID不存在')

View File

@@ -358,6 +358,100 @@ return ctx.success({ message: '简历删除成功' });
console.error('AI 分析失败:', error); console.error('AI 分析失败:', error);
return ctx.fail('AI 分析失败: ' + error.message); return ctx.fail('AI 分析失败: ' + error.message);
} }
},
/**
* @swagger
* /admin_api/resume/sync-online:
* post:
* summary: 同步在线简历
* description: 通过MQTT指令获取用户在线简历并更新到数据库
* tags: [后台-简历管理]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - resumeId
* properties:
* resumeId:
* type: string
* description: 简历ID
* responses:
* 200:
* description: 同步成功
*/
'POST /resume/sync-online': 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('简历不存在');
}
const { sn_code, platform } = resume;
if (!sn_code) {
return ctx.fail('该简历未绑定设备SN码');
}
try {
const scheduleManager = require('../middleware/schedule');
const resumeManager = require('../middleware/job/resumeManager');
// 检查 MQTT 客户端是否已初始化
if (!scheduleManager.mqttClient) {
return ctx.fail('MQTT客户端未初始化请检查调度系统是否正常启动');
}
// 检查设备是否在线
// const deviceManager = require('../middleware/schedule/deviceManager');
// if (!deviceManager.isDeviceOnline(sn_code)) {
// return ctx.fail('设备离线,无法同步在线简历');
// }
// 调用简历管理器获取并保存简历
const resumeData = await resumeManager.get_online_resume(sn_code, scheduleManager.mqttClient, {
platform: platform || 'boss'
});
// 重新获取更新后的简历数据
const updatedResume = await resume_info.findOne({ where: { resumeId } });
if (!updatedResume) {
return ctx.fail('同步成功但未找到更新后的简历记录');
}
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({
message: '同步在线简历成功',
data: resumeDetail
});
} catch (error) {
console.error('同步在线简历失败:', error);
return ctx.fail('同步在线简历失败: ' + (error.message || '未知错误'));
}
} }
}; };