新增面试邀约功能。
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-24 09:31:10 +08:00
parent 3b1877f302
commit ebfb4fa580
7 changed files with 396 additions and 3 deletions

View File

@@ -298,6 +298,7 @@ function ManagementList() {
<ResumeView
values={currentRow}
open={resumeVisible}
matching={{ jobId, companyId: (jobInfo as any)?.companyId, applyId: currentRow?.applyId }}
onClose={() => {
setResumeVisible(false);
setCurrentRow(undefined);

View File

@@ -1,9 +1,15 @@
import {Modal, Card, Descriptions, List, Button} from 'antd';
import {Modal, Card, Descriptions, List, Button, Divider, Form, Select, Input, DatePicker, message} from 'antd';
import React, { useEffect, useRef,useState } from 'react';
import { ProDescriptions} from '@ant-design/pro-components';
import {
addCmsUserWorkExperiencesList
addCmsUserWorkExperiencesList,
addCmsInterview,
} from '@/services/Management/list';
import dayjs from 'dayjs';
const { TextArea } = Input;
const { Option } = Select;
export type ListFormProps = {
onClose: (flag?: boolean, formVals?: unknown) => void;
open: boolean;
@@ -17,10 +23,18 @@ const listEdit: React.FC<ListFormProps> = (props) => {
const [loading, setLoading] = useState(false);
const [contactInfoList, setContactInfoList] = useState<API.Management.WorkExperence[]>([]);
// 面试邀约相关状态
const [interviewForm] = Form.useForm();
const [interviewMethod, setInterviewMethod] = useState<string>('online');
const [submitting, setSubmitting] = useState<boolean>(false);
useEffect(() => {
if (props.open && props.values) {
console.log(props.values);
fetchResumeDetail();
// 重置面试邀约表单
interviewForm.resetFields();
setInterviewMethod('online');
}
}, [props.values,props.open]);
@@ -41,6 +55,44 @@ const listEdit: React.FC<ListFormProps> = (props) => {
}
};
// 发送面试邀约
const handleInterviewSubmit = async () => {
try {
const values = await interviewForm.validateFields();
setSubmitting(true);
const payload: API.Management.InterviewInvitation = {
companyId: props.matching?.companyId,
jobId: Number(props.matching?.jobId),
userId: props.values?.userId,
applyId: props.values?.applyId ? Number(props.values.applyId) : undefined,
interviewTime: values.interviewTime
? dayjs(values.interviewTime).format('YYYY-MM-DD HH:mm:ss')
: undefined,
interviewMethod: values.interviewMethod,
meetingLink: values.meetingLink,
meetingPassword: values.meetingPassword,
interviewLocation: values.interviewLocation,
contactPhone: values.contactPhone,
status: 'pending',
remark: values.remark,
};
const response = await addCmsInterview(payload);
if (response.code === 200) {
message.success('面试邀约已发送');
interviewForm.resetFields();
setInterviewMethod('online');
} else {
message.error(response.msg || '发送失败');
}
} catch (error) {
console.error('发送面试邀约失败:', error);
} finally {
setSubmitting(false);
}
};
return (
<Modal
open={props.open}
@@ -98,6 +150,91 @@ const listEdit: React.FC<ListFormProps> = (props) => {
/>
}
</ProDescriptions>
<Divider />
<Card title="面试邀约" bordered style={{ marginTop: 16 }}>
<Form
form={interviewForm}
layout="vertical"
initialValues={{ interviewMethod: 'online' }}
>
<Form.Item
name="interviewMethod"
label="面试方式"
rules={[{ required: true, message: '请选择面试方式' }]}
>
<Select
placeholder="请选择面试方式"
onChange={(value) => setInterviewMethod(value)}
>
<Option value="online">线</Option>
<Option value="offline">线</Option>
</Select>
</Form.Item>
<Form.Item
name="interviewTime"
label="面试时间"
rules={[{ required: true, message: '请选择面试时间' }]}
>
<DatePicker
showTime
style={{ width: '100%' }}
placeholder="请选择面试时间"
/>
</Form.Item>
{interviewMethod === 'online' && (
<>
<Form.Item
name="meetingLink"
label="腾讯会议链接"
rules={[{ required: true, message: '请输入腾讯会议链接' }]}
>
<Input placeholder="请输入腾讯会议链接" />
</Form.Item>
<Form.Item
name="meetingPassword"
label="会议密码"
rules={[{ required: true, message: '请输入会议密码' }]}
>
<Input placeholder="请输入会议密码" />
</Form.Item>
</>
)}
{interviewMethod === 'offline' && (
<Form.Item
name="interviewLocation"
label="面试地点"
rules={[{ required: true, message: '请输入面试地点' }]}
>
<Input placeholder="请输入面试地点" />
</Form.Item>
)}
<Form.Item
name="remark"
label="备注"
>
<TextArea rows={3} placeholder="选填,如有其他注意事项可在此说明" />
</Form.Item>
<Form.Item
name="contactPhone"
label="面试官联系方式"
rules={[{ required: true, message: '请输入面试官联系方式' }]}
>
<Input placeholder="请输入手机号或微信等联系方式" />
</Form.Item>
<Form.Item>
<Button type="primary" loading={submitting} onClick={handleInterviewSubmit}>
</Button>
</Form.Item>
</Form>
</Card>
</Modal>
);
};