-- ============================================================================= -- 平板作业(保洁 / 维修)与作业人员 -- 1) 保洁复用既有 gy_clean_task(房态重算已依赖它:PENDING→3 待清扫 / PROCESSING→6 保洁中), -- 这里补「执行人、开始时间、备注、来源、房号快照」; -- 2) 维修新建 apt_repair_order(REPORTED→ASSIGNED→IN_PROGRESS→DONE/CANCELLED), -- 维修期间房态置 4(不能入住)并在 disabled_reason 标记 REPAIR:; -- 3) 作业人员 apt_staff(保洁/维修,可绑后台账号与平板设备); -- 4) 状态流水 apt_job_event(两类作业共用,便于追溯与统计)。 -- 5) 权限点挂在既有父菜单 3000(公寓端)下,menu_type=F。 -- 幂等:列/表/权限均做存在性判断,可重复执行。 -- ============================================================================= SET NAMES utf8mb4; -- ----------------------------------------------------------------------------- -- 1. 保洁任务补列(沿用 gy_clean_task) -- ----------------------------------------------------------------------------- CALL apt_add_column_if_missing('gy_clean_task', 'assignee_staff_id', "assignee_staff_id VARCHAR(64) NULL COMMENT '保洁员(apt_staff.staff_id)'"); CALL apt_add_column_if_missing('gy_clean_task', 'started_at', "started_at DATETIME(3) NULL COMMENT '开始保洁时间'"); CALL apt_add_column_if_missing('gy_clean_task', 'remark', "remark VARCHAR(255) NULL COMMENT '平板备注'"); CALL apt_add_column_if_missing('gy_clean_task', 'source', "source VARCHAR(20) NOT NULL DEFAULT 'TABLET' COMMENT 'TABLET=平板上报 / MANUAL=后台补录'"); CALL apt_add_column_if_missing('gy_clean_task', 'room_no', "room_no VARCHAR(32) NULL COMMENT '房号快照(便于按房号查询与展示)'"); -- ----------------------------------------------------------------------------- -- 2. 作业人员 -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS apt_staff ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, staff_id VARCHAR(64) NOT NULL COMMENT '人员业务键 ST-<12位>', staff_type VARCHAR(20) NOT NULL COMMENT 'CLEANER / REPAIRMAN / BOTH', name VARCHAR(64) NOT NULL, work_no VARCHAR(32) NULL COMMENT '工号(同公寓内唯一,可空)', phone VARCHAR(32) NULL, sys_user_id BIGINT NULL COMMENT '绑定的后台账号(sys_user.user_id),用于权限归属', device_code VARCHAR(64) NULL COMMENT '绑定的平板设备(X-Device-Code)', duty_state VARCHAR(20) NOT NULL DEFAULT 'IDLE' COMMENT 'IDLE / BUSY / OFFLINE', state VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT 'ACTIVE / DISABLED', remark VARCHAR(255) NULL, biz_version BIGINT NOT NULL DEFAULT 1, deleted TINYINT NOT NULL DEFAULT 0, create_by VARCHAR(64) NULL, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_staff_gyid_id (gyid, staff_id), UNIQUE KEY uk_staff_gyid_workno (gyid, work_no), KEY idx_staff_gyid_type (gyid, staff_type, state), KEY idx_staff_gyid_device (gyid, device_code), CONSTRAINT ck_staff_type CHECK (staff_type IN ('CLEANER','REPAIRMAN','BOTH')), CONSTRAINT ck_staff_state CHECK (state IN ('ACTIVE','DISABLED')), CONSTRAINT ck_staff_duty CHECK (duty_state IN ('IDLE','BUSY','OFFLINE')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='公寓作业人员(保洁/维修)'; -- ----------------------------------------------------------------------------- -- 3. 维修工单 -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS apt_repair_order ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, order_id VARCHAR(64) NOT NULL COMMENT '工单号 RO-<12位>', room_id VARCHAR(64) NOT NULL, room_no VARCHAR(32) NOT NULL, category VARCHAR(20) NOT NULL DEFAULT 'OTHER' COMMENT 'ELECTRIC/PLUMBING/DOOR_WINDOW/AIRCON/OTHER', description VARCHAR(500) NOT NULL, priority VARCHAR(10) NOT NULL DEFAULT 'NORMAL' COMMENT 'NORMAL / URGENT', source VARCHAR(20) NOT NULL DEFAULT 'TABLET' COMMENT 'TABLET / MANUAL', reporter_staff_id VARCHAR(64) NULL, reporter_name VARCHAR(64) NULL, assignee_staff_id VARCHAR(64) NULL, assignee_name VARCHAR(64) NULL, state VARCHAR(20) NOT NULL DEFAULT 'REPORTED' COMMENT 'REPORTED/ASSIGNED/IN_PROGRESS/DONE/CANCELLED', room_status_before VARCHAR(2) NULL, room_status_after VARCHAR(2) NULL, result VARCHAR(255) NULL COMMENT '维修结果(DONE 必填)', remark VARCHAR(500) NULL, reported_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), assigned_at DATETIME(3) NULL, started_at DATETIME(3) NULL, finished_at DATETIME(3) NULL, duration_sec BIGINT NULL COMMENT '作业时长(开始→完成)', version INT NOT NULL DEFAULT 0, deleted TINYINT NOT NULL DEFAULT 0, create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_repair_gyid_order (gyid, order_id), KEY idx_repair_gyid_state (gyid, state, reported_at), KEY idx_repair_gyid_room (gyid, room_id, state), KEY idx_repair_gyid_assignee (gyid, assignee_staff_id, state), CONSTRAINT ck_repair_state CHECK (state IN ('REPORTED','ASSIGNED','IN_PROGRESS','DONE','CANCELLED')), CONSTRAINT ck_repair_priority CHECK (priority IN ('NORMAL','URGENT')), CONSTRAINT ck_repair_category CHECK (category IN ('ELECTRIC','PLUMBING','DOOR_WINDOW','AIRCON','OTHER')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='维修工单(维修期间房态 4=不能入住)'; -- ----------------------------------------------------------------------------- -- 4. 作业状态流水(保洁 + 维修共用) -- ----------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS apt_job_event ( id BIGINT NOT NULL AUTO_INCREMENT, gyid VARCHAR(32) NOT NULL, event_id VARCHAR(64) NOT NULL, biz_type VARCHAR(20) NOT NULL COMMENT 'CLEAN / REPAIR', biz_id VARCHAR(64) NOT NULL COMMENT 'task_id / order_id', room_id VARCHAR(64) NULL, from_state VARCHAR(20) NULL, to_state VARCHAR(20) NOT NULL, operator_staff VARCHAR(64) NULL, operator_name VARCHAR(64) NULL, device_code VARCHAR(64) NULL, remark VARCHAR(255) NULL, occurred_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_jobevent_gyid_id (gyid, event_id), KEY idx_jobevent_gyid_biz (gyid, biz_type, biz_id, occurred_at), CONSTRAINT ck_jobevent_type CHECK (biz_type IN ('CLEAN','REPAIR')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='作业状态流水(保洁/维修)'; -- ----------------------------------------------------------------------------- -- 5. 权限点(挂在 3000 公寓端下,menu_type=F) -- ----------------------------------------------------------------------------- INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3230, '作业工单查看', 3000, 30, 'F', '0', '0', 'apt:workorder:list', 'IT-5', NOW(3), '保洁/维修工单列表' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:workorder:list'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3231, '作业工单详情', 3000, 31, 'F', '0', '0', 'apt:workorder:query', 'IT-5', NOW(3), NULL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:workorder:query'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3232, '作业派单', 3000, 32, 'F', '0', '0', 'apt:workorder:assign', 'IT-5', NOW(3), '维修派单/改派' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:workorder:assign'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3233, '作业处置', 3000, 33, 'F', '0', '0', 'apt:workorder:handle', 'IT-5', NOW(3), '开始/完成/取消' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:workorder:handle'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3234, '作业统计', 3000, 34, 'F', '0', '0', 'apt:workorder:stats', 'IT-5', NOW(3), '按类型/状态/人员统计' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:workorder:stats'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3235, '作业人员列表', 3000, 35, 'F', '0', '0', 'apt:staff:list', 'IT-5', NOW(3), '保洁/维修人员' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:staff:list'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3236, '作业人员详情', 3000, 36, 'F', '0', '0', 'apt:staff:query', 'IT-5', NOW(3), NULL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:staff:query'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3237, '作业人员新增', 3000, 37, 'F', '0', '0', 'apt:staff:add', 'IT-5', NOW(3), NULL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:staff:add'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3238, '作业人员编辑', 3000, 38, 'F', '0', '0', 'apt:staff:edit', 'IT-5', NOW(3), NULL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:staff:edit'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3239, '作业人员删除', 3000, 39, 'F', '0', '0', 'apt:staff:remove', 'IT-5', NOW(3), NULL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:staff:remove'); INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, menu_type, visible, status, perms, create_by, create_time, remark) SELECT 3240, '作业人员启停', 3000, 40, 'F', '0', '0', 'apt:staff:changeStatus', 'IT-5', NOW(3), NULL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'apt:staff:changeStatus'); -- ----------------------------------------------------------------------------- -- 6. 校验 -- ----------------------------------------------------------------------------- SELECT '=== 46. 作业相关表(应 3)===' AS section; SELECT COUNT(*) AS tables_cnt FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN ('apt_staff','apt_repair_order','apt_job_event'); SELECT '=== 47. 保洁任务补列(应 5)===' AS section; SELECT COUNT(*) AS clean_columns FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_clean_task' AND COLUMN_NAME IN ('assignee_staff_id','started_at','remark','source','room_no'); SELECT '=== 48. 新增权限点(应 11)===' AS section; SELECT COUNT(*) AS perms_cnt FROM sys_menu WHERE perms IN ('apt:workorder:list','apt:workorder:query','apt:workorder:assign', 'apt:workorder:handle','apt:workorder:stats', 'apt:staff:list','apt:staff:query','apt:staff:add','apt:staff:edit', 'apt:staff:remove','apt:staff:changeStatus');