-- backend/scripts/migrate_20260814_duty_schedule.sql -- 值班排班 V1:按日链接 + 班次名额 + 报名 CREATE TABLE IF NOT EXISTS `duty_day` ( `id` varchar(64) NOT NULL COMMENT '主键ID(UUID)', `duty_date` date NOT NULL COMMENT '值班日期', `access_token` varchar(64) NOT NULL COMMENT '公开访问令牌', `link_status` varchar(16) NOT NULL DEFAULT 'open' COMMENT 'open/closed', `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号', `order_num` int(11) DEFAULT NULL COMMENT '排序号', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `create_by` varchar(64) DEFAULT NULL COMMENT '创建者', `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标志', PRIMARY KEY (`id`), UNIQUE KEY `uk_token` (`access_token`), UNIQUE KEY `uk_tenant_duty_date` (`tenant_no`, `duty_date`, `del_flag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='值班日(一天一条公开链接)'; CREATE TABLE IF NOT EXISTS `duty_slot` ( `id` varchar(64) NOT NULL COMMENT '主键ID(UUID)', `duty_day_id` varchar(64) NOT NULL COMMENT '值班日ID', `shift_type` varchar(32) NOT NULL COMMENT 'morning/evening/duty', `capacity` int(11) NOT NULL DEFAULT 1 COMMENT '名额', `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号', `order_num` int(11) DEFAULT NULL COMMENT '排序号', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `create_by` varchar(64) DEFAULT NULL COMMENT '创建者', `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标志', PRIMARY KEY (`id`), UNIQUE KEY `uk_day_shift` (`duty_day_id`, `shift_type`, `del_flag`), KEY `idx_day` (`duty_day_id`, `del_flag`), KEY `idx_tenant` (`tenant_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='值班班次名额'; CREATE TABLE IF NOT EXISTS `duty_assignment` ( `id` varchar(64) NOT NULL COMMENT '主键ID(UUID)', `duty_slot_id` varchar(64) NOT NULL COMMENT '班次名额ID', `source` varchar(16) NOT NULL COMMENT 'assign/grab', `user_id` varchar(64) DEFAULT NULL COMMENT '系统用户ID(指定时)', `person_name` varchar(64) NOT NULL COMMENT '展示姓名', `tenant_no` varchar(64) NOT NULL DEFAULT 'shanxia2.0' COMMENT '租户编号', `order_num` int(11) DEFAULT NULL COMMENT '排序号', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `create_by` varchar(64) DEFAULT NULL COMMENT '创建者', `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新者', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `del_flag` smallint(6) NOT NULL DEFAULT '0' COMMENT '删除标志', PRIMARY KEY (`id`), KEY `idx_slot` (`duty_slot_id`, `del_flag`), KEY `idx_tenant` (`tenant_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='值班占位(指定或抢班)'; -- 菜单:一级「值班管理」+ 叶子「值班排班」(门户首页按一级模块出卡片) INSERT INTO `sys_menu` ( `id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) VALUES ( 'DUTY000000000000000000000000000', '值班管理', '2', 'M', '/duty', '/index/index', NULL, 1, '1', '1', 'shanxia2.0', 85, '值班一级模块(门户首页分区)', 'system', '', NOW(), NULL, NOW(), 0 ) ON DUPLICATE KEY UPDATE `menu_name`=VALUES(`menu_name`), `component`=VALUES(`component`), `path`=VALUES(`path`); INSERT INTO `sys_menu` ( `id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) VALUES ( 'DUTY000000000000000000000000001', '值班排班', 'DUTY000000000000000000000000000', 'C', 'schedule', '/duty/schedule/index', 'duty:schedule:list', 1, '1', '1', 'shanxia2.0', 1, '日历排班与公开抢班链接', 'system', '', NOW(), NULL, NOW(), 0 ) ON DUPLICATE KEY UPDATE `menu_name`=VALUES(`menu_name`), `parent_id`=VALUES(`parent_id`), `component`=VALUES(`component`), `perms`=VALUES(`perms`), `path`=VALUES(`path`);