// 修复智能制造数据结构问题 import fs from 'fs'; // 读取智能制造岗位简历数据 const manufacturingData = JSON.parse( fs.readFileSync('网页未导入数据/智能制造产业/智能制造岗位简历.json', 'utf8') ); // 按岗位群分组 const groupedData = {}; manufacturingData.forEach(item => { const groupName = item['简历岗位群']; if (!groupedData[groupName]) { groupedData[groupName] = []; } groupedData[groupName].push(item); }); // 转换为industries格式,添加avatar字段 const industries = Object.entries(groupedData).map(([groupName, positions], index) => { const groupId = `manufacturing_${index + 1}`; const positionList = positions.map((pos, posIndex) => ({ id: `${groupId}_${posIndex + 1}`, title: pos['岗位名称'], level: pos['岗位等级标签'], avatar: pos['简历头像url'] || "https://ddcz-1315997005.cos.ap-nanjing.myqcloud.com/static/img/butler_position_avatar/recuPFXZhkWje7.jpeg", // 添加avatar字段 department: groupName, type: "全职", experience: getExperienceByLevel(pos['岗位等级标签']), education: "大专", salary: pos['岗位等级标签'] === '技术骨干岗' ? "8-15K" : "5-10K", location: "苏州", updateTime: "2024-01-20", description: `负责${pos['岗位名称']}相关工作,包括${extractMainTasks(pos['简历内容'])}`, requirements: extractRequirements(pos['简历内容']) })); const questions = extractQuestions(positions[0]['面试题内容']); return { id: groupId, name: groupName, positions: positionList, questions: questions }; }); // 根据岗位等级获取经验要求 function getExperienceByLevel(level) { switch(level) { case '技术骨干岗': return "2-5年"; case '基础岗': return "0-2年"; default: return "1-3年"; } } // 提取主要任务描述 function extractMainTasks(resumeContent) { const taskMatch = resumeContent.match(/### (五)岗位职责[::]?\s*([\s\S]*?)(?=# 二、|$)/); if (taskMatch) { const tasks = taskMatch[1].split('\n') .filter(line => line.match(/^\d+\./)) .slice(0, 3) .map(line => line.replace(/^\d+\.\s*/, '').split(',')[0]) .join('、'); return tasks || "相关技术工作"; } return "相关技术工作"; } // 提取岗位要求 function extractRequirements(resumeContent) { const coreMatch = resumeContent.match(/### (一)核心能力\s*([\s\S]*?)(?=###|$)/); if (coreMatch) { const lines = coreMatch[1].split('\n') .filter(line => line.match(/^\d+\./)) .slice(0, 4) .map(line => line.replace(/^\d+\.\s*/, '').trim()); return lines.length > 0 ? lines : ["熟悉相关岗位工作", "具有良好的沟通能力", "有相关工作经验优先"]; } return ["熟悉相关岗位工作", "具有良好的沟通能力", "有相关工作经验优先"]; } // 提取面试题 function extractQuestions(questionContent) { if (!questionContent) return []; const sections = questionContent.split(/# \w+、/).filter(s => s.trim()); const questions = []; sections.forEach((section, sectionIndex) => { const lines = section.split('\n').filter(line => line.trim()); const title = lines[0] || `面试题组${sectionIndex + 1}`; const subQuestions = []; for (let i = 1; i < lines.length; i++) { if (lines[i].match(/^\d+\./)) { const question = lines[i].replace(/^\d+\.\s*/, '').trim(); let answer = "请根据实际情况回答"; // 查找答案 for (let j = i + 1; j < lines.length && j < i + 5; j++) { if (lines[j].includes('示例答案') || lines[j].includes('答案:')) { answer = lines[j].replace(/.*?示例答案[::]?\s*/, '').replace(/.*?答案[::]?\s*/, '').trim(); break; } } subQuestions.push({ id: `q${sectionIndex}_${subQuestions.length + 1}`, question: question, answer: answer }); } } if (subQuestions.length > 0) { questions.push({ id: `group_q${sectionIndex + 1}`, question: title, subQuestions: subQuestions.slice(0, 8) }); } }); return questions; } // 生成按行业分组的简历模板数据 - 按照原来的数据结构 const resumeTemplates = {}; manufacturingData.forEach((item) => { const industryName = item['简历岗位群']; // 使用岗位群作为行业名称 if (!resumeTemplates[industryName]) { resumeTemplates[industryName] = []; } // 提取项目经历 const projectMatch = item['简历内容'].match(/### (一)项目名称[::]?\s*(.+)/); const positionMatch = item['简历内容'].match(/### (二)实习岗位[::]?\s*(.+)/); const timeMatch = item['简历内容'].match(/### (三)实习时间[::]?\s*(.+)/); const companyMatch = item['简历内容'].match(/### (四)实习单位[::]?\s*(.+)/); const dutiesMatch = item['简历内容'].match(/### (五)岗位职责[::]?\s*([\s\S]*?)(?=# 二、|$)/); // 提取技能 const coreSkillsMatch = item['简历内容'].match(/### (一)核心能力\s*([\s\S]*?)(?=###|$)/); const compoundSkillsMatch = item['简历内容'].match(/### (二)复合能力\s*([\s\S]*?)(?=# 三、|$)/); // 提取个人总结 const summaryMatch = item['简历内容'].match(/# 三、个人总结\s*([\s\S]*?)$/); const templateItem = { position: item['岗位名称'], level: item['岗位等级标签'], avatar: item['简历头像url'], content: { original: item['简历内容'], modified: item['简历内容'] // 可以根据需要设置不同的内容 }, studentInfo: { project_experience: { project_name: projectMatch ? projectMatch[1].trim() : "智能制造项目", position: positionMatch ? positionMatch[1].trim() : item['岗位名称'], time_period: timeMatch ? timeMatch[1].trim() : "2023.09 - 2024.01", company: companyMatch ? companyMatch[1].trim() : "苏州智能制造有限公司", description: dutiesMatch ? dutiesMatch[1].trim() .split('\n') .filter(line => line.match(/^\d+\./)) .map(line => line.replace(/^\d+\.\s*/, '')) .join(';\n') : "" }, core_skills: coreSkillsMatch ? coreSkillsMatch[1].split('\n') .filter(line => line.match(/^\d+\./)) .map(line => line.replace(/^\d+\.\s*/, '').trim()) : [], compound_skills: compoundSkillsMatch ? compoundSkillsMatch[1].split('\n') .filter(line => line.match(/^\d+\./)) .map(line => line.replace(/^\d+\.\s*/, '').trim()) : [], personal_summary: summaryMatch ? summaryMatch[1].trim() : "" } }; resumeTemplates[industryName].push(templateItem); }); // 输出结果 const output = { industries, resumeTemplates, totalPositions: industries.reduce((sum, ind) => sum + ind.positions.length, 0), totalGroups: industries.length }; // 写入文件 fs.writeFileSync('fixedManufacturingDataStructure.json', JSON.stringify(output, null, 2), 'utf8'); console.log(`修复完成! - 岗位群数量: ${output.totalGroups} - 岗位总数: ${output.totalPositions} - 简历模板组数: ${Object.keys(resumeTemplates).length} - 简历模板总数: ${Object.values(resumeTemplates).reduce((sum, templates) => sum + templates.length, 0)} 修复内容: - ✅ 添加了岗位avatar字段 - ✅ 优化了岗位描述和经验要求 - ✅ 修复了简历模板数据结构 - 按行业分组 - ✅ 完善了面试题数据 `);