面试功能开发
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled

This commit is contained in:
francis-fh
2026-06-25 13:32:03 +08:00
parent 5ecce431db
commit ed37133c69
9 changed files with 246 additions and 5 deletions

View File

@@ -0,0 +1,154 @@
import React, { useRef } from 'react';
import { Tag } from 'antd';
import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components';
import { getCmsInterviewList } from '@/services/Management/list';
const interviewStatusMap: Record<string, { text: string; color: string }> = {
pending: { text: '待确认', color: 'blue' },
accepted: { text: '已接受', color: 'green' },
rejected: { text: '已拒绝', color: 'red' },
completed: { text: '已完成', color: 'purple' },
};
const interviewMethodMap: Record<string, { text: string; color: string }> = {
online: { text: '线上', color: 'blue' },
offline: { text: '线下', color: 'orange' },
};
const InterviewList: React.FC = () => {
const actionRef = useRef<ActionType>();
const columns: ProColumns<API.Management.InterviewInvitation>[] = [
{
title: '求职者姓名',
dataIndex: 'applicantName',
valueType: 'text',
align: 'center',
width: 100,
render: (_, record) => record.applicantName || '-',
},
{
title: '联系方式',
dataIndex: 'applicantPhone',
valueType: 'text',
align: 'center',
width: 130,
hideInSearch: true,
render: (_, record) => record.applicantPhone || '-',
},
{
title: '应聘岗位',
dataIndex: 'jobTitle',
valueType: 'text',
align: 'center',
width: 150,
render: (_, record) => record.jobTitle || record.jobName || '-',
},
{
title: '公司名称',
dataIndex: 'companyName',
valueType: 'text',
align: 'center',
width: 150,
hideInSearch: true,
},
{
title: '面试时间',
dataIndex: 'interviewTime',
valueType: 'text',
align: 'center',
width: 160,
hideInSearch: true,
},
{
title: '面试方式',
dataIndex: 'interviewMethod',
valueType: 'text',
align: 'center',
width: 80,
hideInSearch: true,
render: (_, record) => {
const m = interviewMethodMap[record.interviewMethod || ''];
if (!m) return '-';
return <Tag color={m.color}>{m.text}</Tag>;
},
},
{
title: '面试官姓名',
dataIndex: 'interviewerName',
valueType: 'text',
align: 'center',
width: 100,
hideInSearch: true,
render: (_, record) => record.interviewerName || '-',
},
{
title: '面试官联系方式',
dataIndex: 'contactPhone',
valueType: 'text',
align: 'center',
width: 140,
hideInSearch: true,
},
{
title: '状态',
dataIndex: 'status',
valueType: 'text',
align: 'center',
width: 80,
render: (_, record) => {
const st = interviewStatusMap[record.status || ''];
if (!st) return <Tag color="default"></Tag>;
return <Tag color={st.color}>{st.text}</Tag>;
},
},
{
title: '备注',
dataIndex: 'remark',
valueType: 'text',
align: 'center',
width: 150,
hideInSearch: true,
render: (_, record) => record.remark || '-',
},
{
title: '创建时间',
dataIndex: 'createTime',
valueType: 'text',
align: 'center',
width: 160,
hideInSearch: true,
},
];
return (
<ProTable<API.Management.InterviewInvitation>
actionRef={actionRef}
rowKey="id"
columns={columns}
headerTitle="面试列表"
request={async (params) => {
const { current, pageSize, ...searchParams } = params;
const response = await getCmsInterviewList({
...searchParams,
pageNum: current,
pageSize,
});
return {
data: response.rows || [],
total: response.total || 0,
success: true,
};
}}
search={{
labelWidth: 'auto',
}}
pagination={{
defaultPageSize: 10,
showSizeChanger: true,
}}
/>
);
};
export default InterviewList;

View File

@@ -1,6 +1,6 @@
import React, { Fragment, useEffect, useRef, useState } from 'react';
import { FormattedMessage, useAccess, useParams } from '@umijs/max';
import { Button, FormInstance, message } from 'antd';
import { Button, FormInstance, message, Tag } from 'antd';
import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components';
import { FormOutlined, PlusOutlined,AlignLeftOutlined } from '@ant-design/icons';
import { getDictValueEnum } from '@/services/system/dict';
@@ -167,6 +167,25 @@ function ManagementList() {
<>{similarityJobs.calculationMatchingDegreeJob(record).overallMatch}</>
),
},
{
title: '面试状态',
dataIndex: 'interviewStatus',
valueType: 'text',
hideInSearch: true,
align: 'center',
width: 100,
render: (_, record) => {
const statusMap: Record<string, { text: string; color: string }> = {
pending: { text: '待确认', color: 'blue' },
accepted: { text: '已接受', color: 'green' },
rejected: { text: '已拒绝', color: 'red' },
completed: { text: '已完成', color: 'purple' },
};
const st = statusMap[record.interviewStatus || ''];
if (!st) return <Tag color="default"></Tag>;
return <Tag color={st.color}>{st.text}</Tag>;
},
},
{
title: '操作',
hideInSearch: true,

View File

@@ -102,6 +102,7 @@ const listEdit: React.FC<ListFormProps> = (props) => {
meetingPassword: values.meetingPassword,
interviewLocation: values.interviewLocation,
contactPhone: values.contactPhone,
interviewerName: values.interviewerName,
status: 'pending',
remark: values.remark,
};
@@ -250,6 +251,14 @@ const listEdit: React.FC<ListFormProps> = (props) => {
<TextArea rows={3} placeholder="选填,如有其他注意事项可在此说明" />
</Form.Item>
<Form.Item
name="interviewerName"
label="面试官姓名"
rules={[{ required: true, message: '请输入面试官姓名' }]}
>
<Input placeholder="请输入面试官姓名" />
</Form.Item>
<Form.Item
name="contactPhone"
label="面试官联系方式"

View File

@@ -51,7 +51,7 @@ const listEdit: React.FC<ListFormProps> = (props) => {
});
}
}
}, [form, props.values?.jobId,props.open]);
}, [form, props.values?.jobId,props.open]);
// 在查看模式和编辑模式下调用API获取详情
useEffect(() => {
@@ -335,7 +335,7 @@ const listEdit: React.FC<ListFormProps> = (props) => {
}}
placeholder="请输入公司名称选择公司"
rules={[{ required: true, message: '请输入公司名称选择公司!' }]}
label="招聘公司"
label="招聘公司"
/>
<ProFormDigit
name="minSalary"