【流程】考勤、请假、加班、转正与离职
考勤、请假、加班、转正与离职,由 yudao-module-oa 后端模块的 attendance、leave、overtime、regular、resign 包实现,前端实现在 @/views/oa/attendance/list、@/views/oa/leave、@/views/oa/overtime、@/views/oa/regular、@/views/oa/resign 目录。
OA 考勤记录后台用户的上下班打卡,并提供团队查询和周报、月报,不走 BPM。请假、加班、转正、离职分别保存申请并通过 BPM 审批;请假/出差审批通过后写入考勤记录。这里使用 System 用户和部门,不以 HRM 员工档案作为主档。请假、加班、转正、离职在驳回后不能再编辑(与用品领用、出差申请不同)。
本文涉及表如下图所示:
# 1. 考勤管理
考勤管理,由 OaAttendanceController 提供接口(/oa/attendance)。
# 1.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
考勤记录表 oa_attendance,按次保存上下班打卡时间和正常、迟到、早退等考勤状态:
CREATE TABLE `oa_attendance` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
`type` tinyint NOT NULL COMMENT '考勤类型',
`status` tinyint NOT NULL COMMENT '考勤状态',
`attendance_time` datetime NOT NULL COMMENT '考勤时间',
`attendance_ip` varchar(64) DEFAULT NULL COMMENT '考勤 IP',
`remark` varchar(500) DEFAULT NULL COMMENT '考勤备注',
PRIMARY KEY (`id`),
KEY `idx_user_id_attendance_time` (`user_id`, `attendance_time`),
KEY `idx_attendance_time_type_status` (`attendance_time`, `type`, `status`)
) ENGINE=InnoDB COMMENT='OA 考勤记录';
① user_id 关联 system_users 表的 id 字段。本表没有 process_instance_id,不走 BPM。
② 枚举 type 考勤类型(OaAttendanceTypeEnum):
| 值 | 枚举 | 说明 |
|---|---|---|
1 | CLOCK_IN | 上班打卡 |
2 | CLOCK_OUT | 下班打卡 |
3 | LEAVE | 请假(审批写入) |
4 | TRAVEL | 出差(审批写入) |
③ 枚举 status 考勤状态(OaAttendanceStatusEnum):
| 值 | 枚举 | 说明 |
|---|---|---|
1 | NORMAL | 正常 |
2 | LATE | 迟到 |
3 | EARLY | 早退 |
4 | LEAVE | 请假 |
5 | TRAVEL | 出差 |
④ 打卡由 clockAttendance 控制:当天首次打卡创建上班记录,再次打卡创建下班记录,重复下班打卡刷新下班时间和状态。请假、出差审批通过时调用 createApplyAttendance 插入对应类型记录,不增加上下班打卡次数。周报、月报复用本表与申请数据,不建立单独统计表。
打卡窗口与迟到早退
配置前缀 yudao.oa.attendance,默认:
clockBeginTime = 05:00、workBeginTime = 08:00、workEndTime = 17:00- 允许打卡区间为开区间
(clockBeginTime, workEndTime),即默认 05:00 之后 ~ 17:00 之前(整点 05:00、17:00 不可打) - 上班时间晚于
workBeginTime→ 迟到;下班时间早于workEndTime→ 早退 - 记录客户端 IP 到
attendance_ip
# 1.2 管理后台
对应 [OA 办公协同 -> 考勤管理 -> 我的考勤 / 考勤记录 / 考勤报表] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/attendance 目录。
# 我的考勤与打卡
对应 [OA 办公协同 -> 考勤管理 -> 我的考勤] 菜单,页面在 @/views/oa/attendance/my。本人打卡调用 POST /oa/attendance/clock,首页的【立即打卡】也使用同一接口;列表由 /oa/attendance/my-page、/oa/attendance/my-today-list 提供数据。

# 考勤记录与修改
对应 [OA 办公协同 -> 考勤管理 -> 考勤记录] 菜单,页面在 @/views/oa/attendance/list。按员工、考勤类型、考勤状态和时间范围查询管理范围内的记录。点击【修改】打开 OaAttendanceForm.vue,维护考勤状态和备注,不修改员工和原打卡时间;点击【删除】移除误录入的记录,两者分别受 oa:attendance:update、oa:attendance:delete 权限控制。

# 考勤报表
对应 [OA 办公协同 -> 考勤管理 -> 考勤报表] 菜单,页面在 @/views/oa/attendance/report。切换【周报】【月报】,由 /oa/attendance/week-report、/oa/attendance/month-report 提供数据。月报展示打卡次数、异常次数、请假、出差和缺少下班打卡天数;请假和出差天数按审批通过记录整笔归入申请开始月份。

# 2. 请假申请
请假申请,由 OaLeaveApplyController 提供接口(/oa/leave-apply)。
# 2.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
请假申请表 oa_leave_apply,保存请假类型、起止时间、请假天数和审批状态:
CREATE TABLE `oa_leave_apply` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`title` varchar(255) DEFAULT NULL COMMENT '申请标题',
`urgency` int DEFAULT NULL COMMENT '紧急程度',
`type` int DEFAULT NULL COMMENT '请假类型',
`start_time` datetime DEFAULT NULL COMMENT '请假开始时间',
`end_time` datetime DEFAULT NULL COMMENT '请假结束时间',
`days` int DEFAULT NULL COMMENT '请假天数',
`reason` text COMMENT '申请原因',
`status` int DEFAULT NULL COMMENT '审批状态',
`process_instance_id` varchar(255) DEFAULT NULL COMMENT 'BPM 流程实例编号',
`file_urls` json DEFAULT NULL COMMENT '附件地址列表',
PRIMARY KEY (`id`),
KEY `idx_creator` (`tenant_id`, `creator`, `deleted`, `create_time`, `id`),
KEY `idx_process_instance` (`process_instance_id`)
) ENGINE=InnoDB COMMENT='请假申请';
① 申请保存标题、紧急程度、请假类型、起止时间、天数、原因和附件。days 为 Integer,由 getDaysBetweenCeiling 计算。紧急程度对应字典 oa_apply_urgency(1 正常 / 2 重要 / 3 紧急)。
② 枚举 type 请假类型(OaLeaveTypeEnum),对应字典 oa_leave_type。maxDays 是单次上限(不校验年度累计):
| 值 | 枚举说明 | maxDays |
|---|---|---|
1 | 年假 | 不限 |
2 | 事假 | 4 |
3 | 病假 | 不限 |
4 | 婚假 | 10 |
5 | 产假及哺乳假 | 不限 |
6 | 陪产假 | 10 |
7 | 丧假 | 不限 |
③ status 与 BPM 流程状态一致,process_instance_id 关联流程实例。详见 §2.2 状态流转。
④ file_urls 是 JSON 附件地址列表:
file_urls(附件)
["http://xxx/leave-proof.pdf"]
# 2.2 状态流转
请假审批状态由 OaLeaveApplyServiceImpl 与 BPM 共同控制,status 复用 BpmProcessInstanceStatusEnum,对应字典 bpm_process_instance_status(字典数据通常不含 -1):
| 状态值 | 枚举 | 说明 | 可执行操作 |
|---|---|---|---|
-1 | NOT_START | 未开始(草稿) | 编辑、提交 |
1 | RUNNING | 审批中 | — |
2 | APPROVE | 审批通过 | —(已写请假考勤) |
3 | REJECT | 审批不通过 | —(不可再编辑) |
4 | CANCEL | 已取消 | — |
流程定义 Key 为 oa_leave_apply。仅草稿可修改和提交;驳回后不能再编辑(与用品/出差不同)。
状态流转说明
新增申请 ──→ 草稿(-1) ──提交──→ 审批中(1) ──┬──通过──→ 审批通过(2) → createApplyAttendance(LEAVE)
├──不通过──→ 审批不通过(3)(终态,不可再改)
└──取消──→ 已取消(4)
- 创建(
createLeaveApply):status = 未开始(-1),按类型校验maxDays。 - 编辑 / 提交(
updateLeaveApply/submitLeaveApply):validateLeaveApplyEditable仅放行草稿;提交后审批中(1),流程变量含days。 - 审批回调(
updateLeaveApplyStatus,监听器OaLeaveApplyStatusListener):仅审批通过(2)调用createApplyAttendance(..., LEAVE, startTime)。
# 2.3 管理后台
对应 [OA 办公协同 -> 流程管理 -> 请假申请] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/leave 目录。
# 列表

# 新增与修改
点击【新增】打开 OaLeaveApplyForm.vue,填写标题、类型、紧急程度、起止时间和申请原因,可上传附件。保存时创建未提交草稿。

# 提交与查看
在列表点击【提交】,调用 POST /oa/leave-apply/submit 发起 oa_leave_apply 流程。仅未提交草稿允许修改、提交;详情页在 @/views/oa/leave/detail/index.vue,展示申请信息和流程结果。
# 3. 加班申请
加班申请,由 OaOvertimeApplyController 提供接口(/oa/overtime-apply)。
# 3.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
加班申请表 oa_overtime_apply,保存加班类型、起止时间、加班时长和审批状态:
CREATE TABLE `oa_overtime_apply` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`title` varchar(255) DEFAULT NULL COMMENT '申请标题',
`urgency` int DEFAULT NULL COMMENT '紧急程度',
`type` int DEFAULT NULL COMMENT '加班类型',
`start_time` datetime DEFAULT NULL COMMENT '加班开始时间',
`end_time` datetime DEFAULT NULL COMMENT '加班结束时间',
`days` decimal(10,1) DEFAULT NULL COMMENT '加班天数',
`reason` text COMMENT '申请原因',
`status` int DEFAULT NULL COMMENT '审批状态',
`process_instance_id` varchar(255) DEFAULT NULL COMMENT 'BPM 流程实例编号',
PRIMARY KEY (`id`),
KEY `idx_creator` (`tenant_id`, `creator`, `deleted`, `create_time`, `id`),
KEY `idx_process_instance` (`process_instance_id`)
) ENGINE=InnoDB COMMENT='加班申请';
① 申请保存加班类型、起止时间、天数和原因。days 为 decimal(10,1),由 getDaysBetween(..., 1) 计算,保留一位小数。加班属于审批单据,不直接生成薪资或加班费。
② 加班类型对应字典 oa_overtime_type(无 Java 枚举):
| 值 | 说明 |
|---|---|
1 | 工作日 |
2 | 休息日 |
3 | 节假日 |
4 | 其他 |
③ urgency 对应字典 oa_apply_urgency。status 为 BPM 审批状态,详见 §3.2 状态流转。
# 3.2 状态流转
流程定义 Key 为 oa_overtime_apply。status 为 BpmProcessInstanceStatusEnum(-1/1/2/3/4)/ 字典 bpm_process_instance_status。仅草稿可编辑提交;驳回后不能再改。审批通过不写考勤。
| 状态值 | 枚举 | 说明 | 可执行操作 |
|---|---|---|---|
-1 | NOT_START | 未开始(草稿) | 编辑、提交 |
1 | RUNNING | 审批中 | — |
2 | APPROVE | 审批通过 | —(不写考勤) |
3 | REJECT | 审批不通过 | —(不可再编辑) |
4 | CANCEL | 已取消 | — |
状态流转说明
新增申请 ──→ 草稿(-1) ──提交──→ 审批中(1) ──┬──通过──→ 审批通过(2)(不写考勤)
├──不通过──→ 审批不通过(3)
└──取消──→ 已取消(4)
- 提交(
submitOvertimeApply):流程变量含days。 - 审批回调(
updateOvertimeApplyStatus,监听器OaOvertimeApplyStatusListener):只更新status,不调用createApplyAttendance。
# 3.3 管理后台
对应 [OA 办公协同 -> 流程管理 -> 加班申请] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/overtime 目录。
# 列表

# 新增与修改
点击【新增】打开 OaOvertimeApplyForm.vue,填写标题、紧急程度、加班类型、起止时间和原因,页面根据时间展示天数。

# 提交与查看
保存草稿后,在列表点击【提交】,调用 POST /oa/overtime-apply/submit 发起 oa_overtime_apply 流程。详情页在 @/views/oa/overtime/detail/index.vue,查看申请资料和审批进度。
# 4. 转正申请
转正申请,由 OaRegularApplyController 提供接口(/oa/regular-apply)。
# 4.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
转正申请表 oa_regular_apply,保存试用起止时间、各项工作总结和审批状态:
CREATE TABLE `oa_regular_apply` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`title` varchar(255) DEFAULT NULL COMMENT '申请标题',
`urgency` int DEFAULT NULL COMMENT '紧急程度',
`start_time` datetime DEFAULT NULL COMMENT '试用开始时间',
`end_time` datetime DEFAULT NULL COMMENT '试用结束时间',
`days` int DEFAULT NULL COMMENT '试用天数',
`experience` varchar(255) DEFAULT NULL COMMENT '试用期或实习期心得体会',
`understanding` varchar(255) DEFAULT NULL COMMENT '对本岗位职责要求的理解',
`growth` varchar(255) DEFAULT NULL COMMENT '试用期或实习期的成长',
`deficiency` varchar(255) DEFAULT NULL COMMENT '目前存在的不足',
`improvement` varchar(255) DEFAULT NULL COMMENT '本岗位工作改进计划',
`suggestion` varchar(255) DEFAULT NULL COMMENT '对公司产品的意见及建议',
`status` int DEFAULT NULL COMMENT '审批状态',
`process_instance_id` varchar(255) DEFAULT NULL COMMENT 'BPM 流程实例编号',
PRIMARY KEY (`id`),
KEY `idx_creator` (`tenant_id`, `creator`, `deleted`, `create_time`, `id`),
KEY `idx_process_instance` (`process_instance_id`)
) ENGINE=InnoDB COMMENT='转正申请';
① 申请保存试用期间、天数以及工作经历、岗位认识、成长、不足、改进和建议。days 由起止时间 ceiling 计算。审批结果只保存在本申请中,不直接修改 HRM 员工状态。
② urgency 对应字典 oa_apply_urgency。status 为 BPM 审批状态,详见 §4.2 状态流转。
# 4.2 状态流转
流程定义 Key 为 oa_regular_apply。status 为 BpmProcessInstanceStatusEnum(-1/1/2/3/4)/ 字典 bpm_process_instance_status。仅草稿可编辑提交;驳回后不能再改。
| 状态值 | 枚举 | 说明 | 可执行操作 |
|---|---|---|---|
-1 | NOT_START | 未开始(草稿) | 编辑、提交 |
1 | RUNNING | 审批中 | — |
2 | APPROVE | 审批通过 | — |
3 | REJECT | 审批不通过 | —(不可再编辑) |
4 | CANCEL | 已取消 | — |
状态流转说明
新增申请 ──→ 草稿(-1) ──提交──→ 审批中(1) ──┬──通过──→ 审批通过(2)
├──不通过──→ 审批不通过(3)
└──取消──→ 已取消(4)
- 提交(
submitRegularApply):流程变量含days。 - 审批回调(
updateRegularApplyStatus,监听器OaRegularApplyStatusListener):只回写status。
# 4.3 管理后台
对应 [OA 办公协同 -> 流程管理 -> 转正申请] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/regular 目录。
# 列表

# 新增与修改
点击【新增】打开 OaRegularApplyForm.vue,填写标题、紧急程度、试用起止时间及各项工作总结,保存为草稿。

# 提交与查看
在列表点击【提交】,调用 POST /oa/regular-apply/submit 发起 oa_regular_apply 流程。详情页在 @/views/oa/regular/detail/index.vue,已提交申请按流程结果展示。
# 5. 离职申请
离职申请,由 OaResignApplyController 提供接口(/oa/resign-apply)。
# 5.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
离职申请表 oa_resign_apply,保存离职原因、交接人、交接内容和审批状态:
CREATE TABLE `oa_resign_apply` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`title` varchar(255) DEFAULT NULL COMMENT '申请标题',
`urgency` int DEFAULT NULL COMMENT '紧急程度',
`reason` text COMMENT '申请原因',
`handover_user_id` bigint DEFAULT NULL COMMENT '工作交接人用户编号',
`unfinished_work` text COMMENT '未完成事宜',
`has_pending_reimbursement` bit(1) DEFAULT NULL COMMENT '是否有未完成的费用报销',
`suggestion` varchar(255) DEFAULT NULL COMMENT '申请人的意见及建议',
`status` int DEFAULT NULL COMMENT '审批状态',
`process_instance_id` varchar(255) DEFAULT NULL COMMENT 'BPM 流程实例编号',
PRIMARY KEY (`id`),
KEY `idx_creator` (`tenant_id`, `creator`, `deleted`, `create_time`, `id`),
KEY `idx_process_instance` (`process_instance_id`)
) ENGINE=InnoDB COMMENT='离职申请';
① handover_user_id 关联 system_users 表的 id 字段,创建/更新时由 adminUserApi.validateUser 校验。has_pending_reimbursement 表示是否存在未完成的费用报销(勾选 ≠ 报销已完成)。
② 审批通过只更新本申请的审批结果,不直接禁用账号或办理 HRM 离职。urgency 对应字典 oa_apply_urgency。
# 5.2 状态流转
流程定义 Key 为 oa_resign_apply。status 为 BpmProcessInstanceStatusEnum(-1/1/2/3/4)/ 字典 bpm_process_instance_status。仅草稿可编辑提交;驳回后不能再改。
| 状态值 | 枚举 | 说明 | 可执行操作 |
|---|---|---|---|
-1 | NOT_START | 未开始(草稿) | 编辑、提交 |
1 | RUNNING | 审批中 | — |
2 | APPROVE | 审批通过 | — |
3 | REJECT | 审批不通过 | —(不可再编辑) |
4 | CANCEL | 已取消 | — |
状态流转说明
新增申请 ──→ 草稿(-1) ──提交──→ 审批中(1) ──┬──通过──→ 审批通过(2)
├──不通过──→ 审批不通过(3)
└──取消──→ 已取消(4)
- 提交(
submitResignApply):流程变量含hasPendingReimbursement。 - 审批回调(
updateResignApplyStatus,监听器OaResignApplyStatusListener):只回写status。
# 5.3 管理后台
对应 [OA 办公协同 -> 流程管理 -> 离职申请] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/oa/resign 目录。
# 列表

# 新增与修改
点击【新增】打开 OaResignApplyForm.vue,填写标题、紧急程度、离职原因,选择交接人,补充交接内容和未完成报销情况。

# 提交与查看
保存草稿后,在列表点击【提交】,调用 POST /oa/resign-apply/submit 发起 oa_resign_apply 流程。详情页在 @/views/oa/resign/detail/index.vue,查看申请信息与审批结果。