184 lines
12 KiB
SQL
184 lines
12 KiB
SQL
-- =============================================================================
|
||
-- 平板作业(保洁 / 维修)与作业人员
|
||
-- 1) 保洁复用既有 gy_clean_task(房态重算已依赖它:PENDING→3 待清扫 / PROCESSING→6 保洁中),
|
||
-- 这里补「执行人、开始时间、备注、来源、房号快照」;
|
||
-- 2) 维修新建 apt_repair_order(REPORTED→ASSIGNED→IN_PROGRESS→DONE/CANCELLED),
|
||
-- 维修期间房态置 4(不能入住)并在 disabled_reason 标记 REPAIR:<orderId>;
|
||
-- 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');
|