InterviewSchedule 面试安排模块设计与实现
这篇笔记记录我在 interview-guide 项目中对 InterviewSchedule 模块的实现思路。目标是把“邀约解析、记录管理、状态维护、提醒协同”整合成一条稳定可维护的链路。
模块能力概览
- 邀请解析:规则引擎 + AI 双通道,支持飞书/腾讯会议/Zoom 文本格式,自动提取公司、岗位、时间、会议链接。
- 日历管理:支持日/周/月视图、拖拽调整与列表视图协同。
- 状态维护:支持手动标记与定时任务自动过期。
- 提醒机制:支持可配置提醒,降低漏面试风险。
状态转换
关键接口设计
POST /api/interview-schedule/parse 解析面试邀约文本
核心逻辑:
parseService.parse(request.getRawText(), request.getSource());
tryRuleParsing(rawText, source);
parseWithAI(rawText, source);
- 规则解析优先处理飞书/腾讯/Zoom 结构化片段。
- AI 解析作为补充通道,增强对非标准文本的适配能力。
- 在 AI 解析前做输入边界约束与注入防护。
POST /api/interview-schedule 创建面试记录
用途:
- 支持用户直接输入信息创建面试安排。
调用链:
scheduleService.create(request);
请求体(核心字段):
public class CreateInterviewRequest {
@NotBlank(message = "公司名称不能为空")
private String companyName;
@NotBlank(message = "岗位不能为空")
private String position;
@NotNull(message = "面试时间不能为空")
@com.fasterxml.jackson.annotation.JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm[:ss]")
private java.time.LocalDateTime interviewTime;
private String interviewType; // ONSITE, VIDEO, PHONE
private String meetingLink;
private Integer roundNumber = 1;
private String interviewer;
private String notes;
}
GET /api/interview-schedule/{id} 根据 ID 获取面试记录
处理流程:
- Controller 接收
id - 调用
scheduleService.getById(id) - Service 从 Repository 查询单条记录,不存在则抛业务异常
- 返回
Result<InterviewScheduleDTO>
调用链:
scheduleService.getById(id);
GET /api/interview-schedule 获取面试记录列表
处理流程:
- Controller 接收可选筛选参数:
status/start/end - 调用
scheduleService.getAll(status, start, end) - Service 按条件查询并转换 DTO
- 返回
Result<List<InterviewScheduleDTO>>
调用链:
scheduleService.getAll(status, start, end);
PUT /api/interview-schedule/{id} 更新面试记录
处理流程:
- Controller 接收
id + CreateInterviewRequest(@Valid校验) - 调用
scheduleService.update(id, request) - Service 查询旧记录,更新字段并保存
- 返回更新后的
Result<InterviewScheduleDTO>
调用链:
scheduleService.update(id, request);
DELETE /api/interview-schedule/{id} 删除面试记录
处理流程:
- Controller 接收
id - 调用
scheduleService.delete(id) - Service 查到后删除,不存在则抛异常
- 返回
Result<Void>
调用链:
scheduleService.delete(id);
PATCH/PUT /api/interview-schedule/{id}/status 更新面试状态
接口实现:
@RequestMapping(path = "/{id}/status", method = {RequestMethod.PATCH, RequestMethod.PUT})
public Result<InterviewScheduleDTO> updateStatus(
@PathVariable Long id,
@RequestParam InterviewStatus status
) {
log.info("更新面试状态: ID={}, status={}", id, status);
InterviewScheduleDTO dto = scheduleService.updateStatus(id, status);
return Result.success(dto);
}
核心调用:
scheduleService.updateStatus(id, status);
小结
InterviewSchedule 模块的核心价值在于把“邀约文本理解”和“面试过程管理”连接起来。对我来说,这一层做好之后,前端日历交互、提醒策略和后续面试评估才能形成连续体验,避免信息散落在聊天记录和手工备忘里。