feat(aihr): complete phase two pilot readiness
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
import type { CandidateMaterial, InterviewRecord } from '@/types/api';
|
||||
|
||||
export const candidateRoutes = {
|
||||
index: '/pages/candidate/index/index',
|
||||
interview: '/pages/candidate/interview/index',
|
||||
materials: '/pages/candidate/materials/index',
|
||||
progress: '/pages/candidate/progress/index',
|
||||
study: '/pages/candidate/study/index'
|
||||
} as const;
|
||||
|
||||
export type CandidateStage = 'interview' | 'materials' | 'review' | 'complete';
|
||||
|
||||
export interface CandidateFlow {
|
||||
stage: CandidateStage;
|
||||
badge: string;
|
||||
title: string;
|
||||
desc: string;
|
||||
progress: number;
|
||||
progressText: string;
|
||||
notice: string;
|
||||
cta: string;
|
||||
route: string;
|
||||
}
|
||||
|
||||
export interface CandidateStep {
|
||||
index: number;
|
||||
title: string;
|
||||
desc: string;
|
||||
status: 'complete' | 'current' | 'pending';
|
||||
}
|
||||
|
||||
export const buildCandidateFlow = (
|
||||
records: InterviewRecord[],
|
||||
materials: CandidateMaterial[]
|
||||
): CandidateFlow => {
|
||||
if (!records.length) {
|
||||
return {
|
||||
stage: 'interview',
|
||||
badge: '待面试',
|
||||
title: '完成结构化面试',
|
||||
desc: '按岗位题目完成回答,提交后生成正式面试记录。',
|
||||
progress: 0,
|
||||
progressText: '0/2',
|
||||
notice: '待完成结构化面试',
|
||||
cta: '开始面试',
|
||||
route: candidateRoutes.interview
|
||||
};
|
||||
}
|
||||
|
||||
const materialStatus = materials[0]?.status || '';
|
||||
if (!materials.length || materialStatus === '已驳回') {
|
||||
const rejected = materialStatus === '已驳回';
|
||||
return {
|
||||
stage: 'materials',
|
||||
badge: rejected ? '资料被驳回' : '待补资料',
|
||||
title: rejected ? '重新提交资料' : '上传补充资料',
|
||||
desc: rejected ? '请按审核结果补充或替换资料。' : '上传简历、证书或相关图片,供 HR 审核。',
|
||||
progress: 50,
|
||||
progressText: '1/2',
|
||||
notice: rejected ? '资料被驳回,请重新上传' : '面试已完成,请上传补充资料',
|
||||
cta: rejected ? '重新上传' : '上传资料',
|
||||
route: candidateRoutes.materials
|
||||
};
|
||||
}
|
||||
|
||||
if (materialStatus === '已通过') {
|
||||
return {
|
||||
stage: 'complete',
|
||||
badge: '资料已通过',
|
||||
title: '等待后续通知',
|
||||
desc: '面试和补充资料已完成,请留意 HR 后续通知。',
|
||||
progress: 100,
|
||||
progressText: '2/2',
|
||||
notice: '资料已通过,等待后续通知',
|
||||
cta: '查看进度',
|
||||
route: candidateRoutes.progress
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
stage: 'review',
|
||||
badge: '审核中',
|
||||
title: '资料审核中',
|
||||
desc: '资料已提交,审核结果会同步到进度页。',
|
||||
progress: 75,
|
||||
progressText: '1/2',
|
||||
notice: '资料已提交,等待 HR 审核',
|
||||
cta: '查看进度',
|
||||
route: candidateRoutes.progress
|
||||
};
|
||||
};
|
||||
|
||||
export const buildCandidateSteps = (flow: CandidateFlow): CandidateStep[] => {
|
||||
const interviewComplete = flow.stage !== 'interview';
|
||||
const materialsComplete = flow.stage === 'complete';
|
||||
const materialsCurrent = flow.stage === 'materials' || flow.stage === 'review';
|
||||
|
||||
return [
|
||||
{
|
||||
index: 1,
|
||||
title: '完成面试',
|
||||
desc: '按岗位题目作答并生成面试记录',
|
||||
status: interviewComplete ? 'complete' : 'current'
|
||||
},
|
||||
{
|
||||
index: 2,
|
||||
title: '提交资料',
|
||||
desc: '上传简历、证书或相关图片',
|
||||
status: materialsComplete ? 'complete' : materialsCurrent ? 'current' : 'pending'
|
||||
},
|
||||
{
|
||||
index: 3,
|
||||
title: '等待通知',
|
||||
desc: 'HR 审核后同步展示最新状态',
|
||||
status: materialsComplete ? 'current' : 'pending'
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
export const formatCandidateFileSize = (size: number) => {
|
||||
if (!size) return '0KB';
|
||||
if (size < 1024 * 1024) return `${Math.ceil(size / 1024)}KB`;
|
||||
return `${(size / 1024 / 1024).toFixed(1)}MB`;
|
||||
};
|
||||
|
||||
export const materialStatusTone = (status: string) => {
|
||||
if (status === '已通过') return 'passed';
|
||||
if (status === '已驳回') return 'rejected';
|
||||
return 'pending';
|
||||
};
|
||||
Reference in New Issue
Block a user