175 lines
7.6 KiB
TypeScript
175 lines
7.6 KiB
TypeScript
|
|
const allAppointments = [
|
|||
|
|
// 已预约
|
|||
|
|
{ id: 1, name: '能力提升面试', category: '模拟面试', time: '2025.08.10', session: '14:00:00-16:00:00', teacher: '李老师', location: '教室1', status: 'booked' },
|
|||
|
|
{ id: 2, name: '能力提升面试', category: '模拟面试', time: '2025.08.10', session: '14:00:00-16:00:00', teacher: '李老师', location: '教室1', status: 'booked' },
|
|||
|
|
{ id: 3, name: '能力提升面试', category: '模拟面试', time: '2025.08.10', session: '14:00:00-16:00:00', teacher: '李老师', location: '教室1', status: 'booked' },
|
|||
|
|
{ id: 4, name: '职业规划咨询', category: '职业咨询', time: '2025.08.12', session: '09:00:00-11:00:00', teacher: '王老师', location: '会议室A', status: 'booked' },
|
|||
|
|
{ id: 5, name: '简历修改指导', category: '简历指导', time: '2025.08.15', session: '10:00:00-12:00:00', teacher: '张老师', location: '教室3', status: 'booked' },
|
|||
|
|
// 预约待确认
|
|||
|
|
{ id: 6, name: '模拟群面练习', category: '模拟面试', time: '2025.08.18', session: '14:00:00-16:00:00', teacher: '赵老师', location: '教室2', status: 'pending' },
|
|||
|
|
{ id: 7, name: '行业分析讲座', category: '讲座', time: '2025.08.20', session: '09:00:00-11:00:00', teacher: '刘老师', location: '报告厅', status: 'pending' },
|
|||
|
|
{ id: 8, name: '职业规划咨询', category: '职业咨询', time: '2025.08.22', session: '14:00:00-16:00:00', teacher: '王老师', location: '会议室A', status: 'pending' },
|
|||
|
|
// 已完成
|
|||
|
|
{ id: 9, name: '能力提升面试', category: '模拟面试', time: '2025.07.20', session: '14:00:00-16:00:00', teacher: '李老师', location: '教室1', status: 'completed' },
|
|||
|
|
{ id: 10, name: '简历修改指导', category: '简历指导', time: '2025.07.15', session: '10:00:00-12:00:00', teacher: '张老师', location: '教室3', status: 'completed' },
|
|||
|
|
{ id: 11, name: '职业规划咨询', category: '职业咨询', time: '2025.07.10', session: '09:00:00-11:00:00', teacher: '王老师', location: '会议室A', status: 'completed' },
|
|||
|
|
{ id: 12, name: '模拟群面练习', category: '模拟面试', time: '2025.07.05', session: '14:00:00-16:00:00', teacher: '赵老师', location: '教室2', status: 'completed' },
|
|||
|
|
// 已取消
|
|||
|
|
{ id: 13, name: '行业分析讲座', category: '讲座', time: '2025.07.25', session: '09:00:00-11:00:00', teacher: '刘老师', location: '报告厅', status: 'cancelled' },
|
|||
|
|
{ id: 14, name: '能力提升面试', category: '模拟面试', time: '2025.07.22', session: '14:00:00-16:00:00', teacher: '李老师', location: '教室1', status: 'cancelled' },
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// 预约管理数据
|
|||
|
|
const specialManage = [
|
|||
|
|
{ id: 101, name: '能力提升面试', category: '模拟面试', startTime: '2025.09.01', endTime: '2026.10.01', remaining: 20, total: 300, sessions: 20, teacher: '李老师', status: 'ongoing' },
|
|||
|
|
{ id: 102, name: '能力提升面试', category: '模拟面试', startTime: '2025.09.01', endTime: '2026.10.01', remaining: 20, total: 300, sessions: 20, teacher: '李老师', status: 'ended' },
|
|||
|
|
{ id: 103, name: '能力提升面试', category: '模拟面试', startTime: '2025.09.01', endTime: '2026.10.01', remaining: 0, total: 300, sessions: 20, teacher: '李老师', status: 'ongoing' },
|
|||
|
|
];
|
|||
|
|
const categories = ['模拟面试', '职业咨询', '简历指导'];
|
|||
|
|
const teachers = ['李老师', '王老师', '张老师', '赵老师', '刘老师', '陈老师', '周老师', '吴老师'];
|
|||
|
|
const statuses = ['ongoing', 'notStarted', 'ongoing', 'ongoing', 'ongoing', 'ongoing', 'ended', 'ongoing'];
|
|||
|
|
const names = ['能力提升面试', '职业规划咨询', '简历修改指导', '模拟群面练习', '行业分析讲座', '求职技巧培训'];
|
|||
|
|
const manageAppointments = [
|
|||
|
|
...specialManage,
|
|||
|
|
...Array.from({ length: 97 }, (_, i) => ({
|
|||
|
|
id: 104 + i,
|
|||
|
|
name: names[i % names.length],
|
|||
|
|
category: categories[i % categories.length],
|
|||
|
|
startTime: '2025.09.01',
|
|||
|
|
endTime: '2026.10.01',
|
|||
|
|
remaining: 20 + (i % 50),
|
|||
|
|
total: 300,
|
|||
|
|
sessions: 10 + (i % 20),
|
|||
|
|
teacher: teachers[i % teachers.length],
|
|||
|
|
status: statuses[i % statuses.length],
|
|||
|
|
})),
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// 用户映射:userId=2 的用户没有任何预约数据
|
|||
|
|
const userAppointments: Record<number, number[]> = {
|
|||
|
|
1: allAppointments.map((a) => a.id), // 默认用户有所有数据
|
|||
|
|
2: [], // 空白用户
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
// 获取预约列表
|
|||
|
|
'GET /api/appointment/list': (req: any, res: any) => {
|
|||
|
|
const { status, name, student, date, page = 1, pageSize = 10, userId = 1 } = req.query;
|
|||
|
|
const uid = Number(userId);
|
|||
|
|
const userIds = userAppointments[uid] ?? userAppointments[1];
|
|||
|
|
|
|||
|
|
let filtered = allAppointments.filter((item) => userIds.includes(item.id));
|
|||
|
|
|
|||
|
|
// 按状态筛选
|
|||
|
|
if (status) {
|
|||
|
|
filtered = filtered.filter((item) => item.status === status);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 按预约名称模糊搜索
|
|||
|
|
if (name) {
|
|||
|
|
filtered = filtered.filter((item) => item.name.includes(name));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 按日期筛选
|
|||
|
|
if (date) {
|
|||
|
|
filtered = filtered.filter((item) => item.time === date);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const total = filtered.length;
|
|||
|
|
const start = (Number(page) - 1) * Number(pageSize);
|
|||
|
|
const end = start + Number(pageSize);
|
|||
|
|
const list = filtered.slice(start, end);
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
code: 0,
|
|||
|
|
data: {
|
|||
|
|
list,
|
|||
|
|
total,
|
|||
|
|
page: Number(page),
|
|||
|
|
pageSize: Number(pageSize),
|
|||
|
|
},
|
|||
|
|
message: 'ok',
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 预约管理列表
|
|||
|
|
'GET /api/appointment/manage': (req: any, res: any) => {
|
|||
|
|
const { name, category, teacher, status, page = 1, pageSize = 10 } = req.query;
|
|||
|
|
|
|||
|
|
let filtered = [...manageAppointments];
|
|||
|
|
|
|||
|
|
if (name) {
|
|||
|
|
filtered = filtered.filter((item) => item.name.includes(name));
|
|||
|
|
}
|
|||
|
|
if (category) {
|
|||
|
|
filtered = filtered.filter((item) => item.category === category);
|
|||
|
|
}
|
|||
|
|
if (teacher) {
|
|||
|
|
filtered = filtered.filter((item) => item.teacher.includes(teacher));
|
|||
|
|
}
|
|||
|
|
if (status) {
|
|||
|
|
filtered = filtered.filter((item) => item.status === status);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const total = filtered.length;
|
|||
|
|
const start = (Number(page) - 1) * Number(pageSize);
|
|||
|
|
const end = start + Number(pageSize);
|
|||
|
|
const list = filtered.slice(start, end);
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
code: 0,
|
|||
|
|
data: { list, total, page: Number(page), pageSize: Number(pageSize) },
|
|||
|
|
message: 'ok',
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 预约操作
|
|||
|
|
'POST /api/appointment/book': (req: any, res: any) => {
|
|||
|
|
const { id } = req.body;
|
|||
|
|
const item = manageAppointments.find((a) => a.id === Number(id));
|
|||
|
|
|
|||
|
|
if (!item) {
|
|||
|
|
res.json({ code: 404, message: '预约项目不存在' });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (item.status === 'ended') {
|
|||
|
|
res.json({ code: 400, message: '该项目已结束,不可预约' });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (item.remaining <= 0) {
|
|||
|
|
res.json({ code: 400, message: '名额已满,不可预约' });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
item.remaining -= 1;
|
|||
|
|
res.json({ code: 0, message: '预约成功' });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 取消预约
|
|||
|
|
'POST /api/appointment/cancel': (req: any, res: any) => {
|
|||
|
|
const { id } = req.body;
|
|||
|
|
const appointment = allAppointments.find((a) => a.id === Number(id));
|
|||
|
|
|
|||
|
|
if (!appointment) {
|
|||
|
|
res.json({ code: 404, message: '预约不存在' });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 已完成的不能取消
|
|||
|
|
if (appointment.status === 'completed') {
|
|||
|
|
res.json({ code: 400, message: '已结束的预约不能取消' });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 已取消的不能重复取消
|
|||
|
|
if (appointment.status === 'cancelled') {
|
|||
|
|
res.json({ code: 400, message: '该预约已取消' });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 只有 booked 和 pending 可以取消
|
|||
|
|
appointment.status = 'cancelled';
|
|||
|
|
res.json({ code: 0, message: '取消成功' });
|
|||
|
|
},
|
|||
|
|
};
|