-- ============================================================= -- OA 考勤打卡 —— 表结构 -- -- 对应代码: -- models/oa_attendance.go -- controllers/backend_oa_attendance.go (打卡核心 + 后台考勤记录) -- controllers/app_oa_attendance.go (移动端 /api/oa/attendance/*) -- -- 执行顺序: -- 1) 本脚本:创建考勤表 -- 2) oa_attendance_menus.sql:注册「OA → 排班考勤 → 考勤记录 / 考勤打卡」菜单 -- -- 设计要点: -- 1. 一人一天一条:签到与签退写同一行,统计与列表都按「人 × 日期」聚合。 -- 2. 打卡时联动排班明细(yz_backend_oa_schedule_entry),把班次名称与 -- 上下班时间快照进本表;后续调班不影响历史考勤判定。 -- 3. 匹配不上排班(含员工档案缺失)不阻断打卡:match_status=2, -- clock_in_status/clock_out_status=3(无排班打卡),提醒文案落在 -- clock_in_note / clock_out_note,后台可据此筛选与备注。 -- 4. 唯一键 (tid, uid, attend_date):uid 是登录身份,保证员工档案未建 -- 也能先打卡(此时 employee_id=0,后台按账号/姓名检索)。 -- ============================================================= SET NAMES utf8mb4; CREATE TABLE IF NOT EXISTS `yz_backend_oa_attendance` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID', `uid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '登录身份ID(打卡主体)', `employee_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID(yz_backend_employee.id),0=未绑定员工档案', `employee_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '员工姓名快照', `employee_account` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '员工账号快照', `org_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属组织ID', `org_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '组织名称快照', `position` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '职位快照', `attend_date` DATE NOT NULL COMMENT '考勤日期', `entry_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '排班明细ID,0=未匹配排班', `shift_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '班次ID快照', `shift_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '班次名称快照', `short_name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '班次简称快照', `color` VARCHAR(20) NOT NULL DEFAULT '#409EFF' COMMENT '班次颜色快照', `work_start` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '上班时间快照 HH:mm', `work_end` VARCHAR(8) NOT NULL DEFAULT '' COMMENT '下班时间快照 HH:mm', `match_status` TINYINT NOT NULL DEFAULT 0 COMMENT '0=未知 1=已匹配排班 2=未匹配排班', `clock_in_time` DATETIME DEFAULT NULL COMMENT '签到时间', `clock_in_status` TINYINT NOT NULL DEFAULT 0 COMMENT '0=未打卡 1=正常 2=迟到 3=无排班打卡 4=不在班次时段', `clock_in_note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '签到提醒/异常说明', `clock_out_time` DATETIME DEFAULT NULL COMMENT '签退时间', `clock_out_status` TINYINT NOT NULL DEFAULT 0 COMMENT '0=未打卡 1=正常 2=早退 3=无排班打卡 4=不在班次时段', `clock_out_note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '签退提醒/异常说明', `location` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '打卡地点(预留)', `remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '管理员备注/异常说明', `source` TINYINT NOT NULL DEFAULT 1 COMMENT '1=移动端打卡 2=后台补录', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_tid_uid_date` (`tid`, `uid`, `attend_date`), KEY `idx_tid_date` (`tid`, `attend_date`), KEY `idx_tid_emp_date` (`tid`, `employee_id`, `attend_date`), KEY `idx_tid_org_date` (`tid`, `org_id`, `attend_date`), KEY `idx_tid_status` (`tid`, `clock_in_status`, `clock_out_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-考勤打卡记录'; -- ---------------- 校验 ---------------- SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_attendance';