diff --git a/config/routes.ts b/config/routes.ts
index 48a75d5..8b945fa 100644
--- a/config/routes.ts
+++ b/config/routes.ts
@@ -189,6 +189,11 @@ export default [
path: '/management/see-matching/index/:id',
component: './Management/List/SeeMatching',
},
+ {
+ name: '面试列表',
+ path: '/management/interview-list',
+ component: './Management/InterviewList',
+ },
],
},
{
diff --git a/src/pages/JobPortal/PersonalCenter/Interviews/index.tsx b/src/pages/JobPortal/PersonalCenter/Interviews/index.tsx
index 9e80321..44d46a1 100644
--- a/src/pages/JobPortal/PersonalCenter/Interviews/index.tsx
+++ b/src/pages/JobPortal/PersonalCenter/Interviews/index.tsx
@@ -8,6 +8,7 @@ import {
Typography,
Button,
Empty,
+ Modal,
message,
Spin
} from 'antd';
@@ -19,7 +20,7 @@ import {
} from '@ant-design/icons';
import { history } from '@umijs/max';
import JobPortalHeader from '@/components/JobPortalHeader';
-import { getAppInterviewList } from '@/services/Management/list';
+import { getAppInterviewList, updateAppInterviewStatus } from '@/services/Management/list';
import './index.less';
const { Title, Text } = Typography;
@@ -78,6 +79,27 @@ const InterviewsPage: React.FC = () => {
}
};
+ const handleStatusUpdate = (interviewId: number, status: string, statusText: string) => {
+ Modal.confirm({
+ title: '提示',
+ content: `确定${statusText}该面试邀约吗?`,
+ onOk: async () => {
+ try {
+ const response = await updateAppInterviewStatus(interviewId, status);
+ if (response.code === 200) {
+ message.success(status === 'accepted' ? '已接受面试邀请' : '已婉拒面试邀请');
+ fetchInterviews();
+ } else {
+ message.error(response.msg || '操作失败');
+ }
+ } catch (error) {
+ console.error('更新面试状态失败:', error);
+ message.error('操作失败,请重试');
+ }
+ },
+ });
+ };
+
const handleBack = () => {
history.push('/job-portal/personal-center');
};
@@ -131,7 +153,7 @@ const InterviewsPage: React.FC = () => {
{item.interviewMethod === 'online' ? '线上' : '线下'}
- {/* {st.text} */}
+ {st.text}
{item.interviewMethod === 'online' ? (
@@ -166,6 +188,25 @@ const InterviewsPage: React.FC = () => {
备注:{item.remark}
)}
+ {item.status === 'pending' && (
+
+
+
+
+
+
+ )}
diff --git a/src/pages/Management/InterviewList/index.tsx b/src/pages/Management/InterviewList/index.tsx
new file mode 100644
index 0000000..8c4c2dd
--- /dev/null
+++ b/src/pages/Management/InterviewList/index.tsx
@@ -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 = {
+ pending: { text: '待确认', color: 'blue' },
+ accepted: { text: '已接受', color: 'green' },
+ rejected: { text: '已拒绝', color: 'red' },
+ completed: { text: '已完成', color: 'purple' },
+};
+
+const interviewMethodMap: Record = {
+ online: { text: '线上', color: 'blue' },
+ offline: { text: '线下', color: 'orange' },
+};
+
+const InterviewList: React.FC = () => {
+ const actionRef = useRef();
+
+ const columns: ProColumns[] = [
+ {
+ 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 {m.text};
+ },
+ },
+ {
+ 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 未知;
+ return {st.text};
+ },
+ },
+ {
+ 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 (
+
+ 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;
diff --git a/src/pages/Management/List/SeeMatching/index.tsx b/src/pages/Management/List/SeeMatching/index.tsx
index d085a97..794727d 100644
--- a/src/pages/Management/List/SeeMatching/index.tsx
+++ b/src/pages/Management/List/SeeMatching/index.tsx
@@ -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 = {
+ pending: { text: '待确认', color: 'blue' },
+ accepted: { text: '已接受', color: 'green' },
+ rejected: { text: '已拒绝', color: 'red' },
+ completed: { text: '已完成', color: 'purple' },
+ };
+ const st = statusMap[record.interviewStatus || ''];
+ if (!st) return 未邀约;
+ return {st.text};
+ },
+ },
{
title: '操作',
hideInSearch: true,
diff --git a/src/pages/Management/List/SeeMatching/resumeView.tsx b/src/pages/Management/List/SeeMatching/resumeView.tsx
index 12e8b12..afdd374 100644
--- a/src/pages/Management/List/SeeMatching/resumeView.tsx
+++ b/src/pages/Management/List/SeeMatching/resumeView.tsx
@@ -102,6 +102,7 @@ const listEdit: React.FC = (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 = (props) => {
+
+
+
+
= (props) => {
});
}
}
- }, [form, props.values?.jobId,props.open]);
+ }, [form, props.values?.jobId,props.open]);
// 在查看模式和编辑模式下调用API获取详情
useEffect(() => {
@@ -335,7 +335,7 @@ const listEdit: React.FC = (props) => {
}}
placeholder="请输入公司名称选择公司"
rules={[{ required: true, message: '请输入公司名称选择公司!' }]}
- label="招聘会公司"
+ label="招聘公司"
/>
(`/api/app/interview/status/${id}`, {
+ method: 'PUT',
+ data: { status },
+ });
+}
diff --git a/src/types/Management/interview.d.ts b/src/types/Management/interview.d.ts
index a474e5e..d18ff10 100644
--- a/src/types/Management/interview.d.ts
+++ b/src/types/Management/interview.d.ts
@@ -13,6 +13,9 @@ declare namespace API.Management {
meetingPassword?: string;
interviewLocation?: string;
contactPhone?: string;
+ interviewerName?: string;
+ applicantName?: string;
+ applicantPhone?: string;
companyName?: string;
jobName?: string;
jobTitle?: string;
diff --git a/src/types/mobileusers/list.d.ts b/src/types/mobileusers/list.d.ts
index ef5ddfd..98db291 100644
--- a/src/types/mobileusers/list.d.ts
+++ b/src/types/mobileusers/list.d.ts
@@ -30,6 +30,8 @@ declare namespace API.MobileUser {
jobName?: string;
hire?:string;
idCard?:string;
+ interviewStatus?: string;
+ interviewId?: number;
}
export interface ListParams {