feat: 更新岗位面试状态数据源

- 导入岗位面试状态.json文件数据
- 创建transformInterviewStatus函数转换面试状态数据
- 从企业内推岗位库中移除已有面试状态的岗位(避免重复显示)
- 更新服务层使用新的interviewStatus数据源
- 面试状态板块现在显示真实的面试进度数据

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
KQL
2025-09-08 05:12:37 +08:00
parent b907586435
commit 19e1143fe2
4 changed files with 211 additions and 3 deletions

View File

@@ -0,0 +1,77 @@
[
{
"查询岗位名称": "会展策划师",
"阶段日期": "2025/9/16",
"面试状态": "收到Offer"
},
{
"查询岗位名称": "商业会展执行专员",
"阶段日期": "2025/7/30",
"面试状态": "拒绝Offer"
},
{
"查询岗位名称": "活动策划师",
"阶段日期": "2025/7/26",
"面试状态": "收到Offer"
},
{
"查询岗位名称": "SEO专员",
"阶段日期": "2025/7/28",
"面试状态": "拒绝Offer"
},
{
"查询岗位名称": "新媒体运营专员",
"阶段日期": "2025/7/31",
"面试状态": "拒绝Offer"
},
{
"查询岗位名称": "ip运营",
"阶段日期": "2025/7/10",
"面试状态": "收到Offer"
},
{
"查询岗位名称": "二次元周边店店长",
"阶段日期": "2025/6/27",
"面试状态": "HR初筛未通过"
},
{
"查询岗位名称": "社群运营",
"阶段日期": "2025/7/23",
"面试状态": "收到Offer"
},
{
"查询岗位名称": "品牌推广专员",
"阶段日期": "2025/8/2",
"面试状态": "面试未通过"
},
{
"查询岗位名称": "会展策划师",
"阶段日期": "2025/9/16",
"面试状态": "收到Offer"
},
{
"查询岗位名称": "客服",
"阶段日期": "2025/8/2",
"面试状态": "拒绝Offer"
},
{
"查询岗位名称": "境外展会操作助理",
"阶段日期": "2025/8/9",
"面试状态": "面试未通过"
},
{
"查询岗位名称": "海外活动策划专员",
"阶段日期": "2025/7/17",
"面试状态": "收到Offer"
},
{
"查询岗位名称": "品牌公关",
"阶段日期": "2025/9/7",
"面试状态": "等待面试"
},
{
"查询岗位名称": "景区运营专员",
"阶段日期": "2025/8/12",
"面试状态": "面试未通过"
}
]

View File

@@ -1,17 +1,70 @@
// 导入JSON数据
import companyJobsData from './companyJobs.json';
import companyJobsNewData from './companyJobsNew.json';
import interviewStatusData from './interviewStatus.json';
import calendarCoursesData from './calendarCourses.json';
import aiCoursesData from '../../网页未导入数据/文旅产业/ai课程表.json';
import marketingCoursesData from './marketingCourses.json';
// 转换函数将JSON数据转换为页面所需格式
// 转换面试状态数据
const transformInterviewStatus = (statusData, jobsData) => {
return statusData.map((status, index) => {
// 从岗位数据中查找匹配的岗位详情
const matchedJob = jobsData.find(job =>
job["内推岗位名称"] === status["查询岗位名称"]
);
// 解析日期
const dateParts = status["阶段日期"].split('/');
const formattedDate = `${dateParts[0]}-${dateParts[1].padStart(2, '0')}-${dateParts[2].padStart(2, '0')}`;
// 根据面试状态确定状态码和文本
let statusCode = 'PENDING';
let statusText = status["面试状态"];
if (status["面试状态"] === "收到Offer") {
statusCode = 'OFFER';
} else if (status["面试状态"] === "拒绝Offer") {
statusCode = 'REJECTED_OFFER';
} else if (status["面试状态"] === "HR初筛未通过" || status["面试状态"] === "面试未通过") {
statusCode = 'FAILED';
}
return {
id: index + 1,
position: status["查询岗位名称"],
interviewTime: formattedDate,
status: statusCode,
statusText: statusText,
job: matchedJob ? {
salary: matchedJob["薪资"],
tags: matchedJob["职位标签"] || [],
location: matchedJob["工作地点"],
education: matchedJob["学历要求"],
companyInfo: matchedJob["公司介绍"]
} : {
salary: "面议",
tags: [],
location: "待定",
education: "待定",
companyInfo: ""
}
};
});
};
const transformCompanyJobs = (jobsData) => {
// 获取今天的日期(只保留日期部分)
const today = new Date();
today.setHours(0, 0, 0, 0);
// 获取所有有面试状态的岗位名称
const interviewedPositions = interviewStatusData.map(status => status["查询岗位名称"]);
return jobsData
// 过滤掉已有面试状态的岗位
.filter(job => !interviewedPositions.includes(job["内推岗位名称"]))
.map((job, index) => {
// 处理截止时间格式2025/8/28 -> Date对象
const deadlineParts = job["截止时间"].split('/');
@@ -2212,6 +2265,7 @@ export const mockData = {
title: "企业内推岗位",
subtitle: "基于AI智能匹配的企业内推岗位推荐系统",
companyPositions: transformCompanyJobs(companyJobsNewData),
interviewStatus: transformInterviewStatus(interviewStatusData, companyJobsNewData),
},
// 用户简历数据

View File

@@ -13,9 +13,9 @@ export async function getCompanyJobsPageData(params) {
total: mockData.companyJobs.companyPositions?.length || 0
},
interviews: {
list: mockData.companyJobs.internalPositions || [],
list: mockData.companyJobs.interviewStatus || [],
hasMore: false,
total: mockData.companyJobs.internalPositions?.length || 0
total: mockData.companyJobs.interviewStatus?.length || 0
}
}
});
@@ -62,7 +62,7 @@ export async function getJobsDetail(id) {
// 获取企业内推岗位面试
export async function getInterviewsList(params) {
// 使用mock数据
const allInterviews = mockData.companyJobs.internalPositions || [];
const allInterviews = mockData.companyJobs.interviewStatus || [];
const page = params.page || 1;
const pageSize = params.pageSize || 10;
const startIndex = (page - 1) * pageSize;