Files
jcgl-dev/dev/sql/apt_rev01/26_jobs_staff.sql
T
2026-11-12 13:36:24 +08:00

184 lines
12 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- 平板作业(保洁 / 维修)与作业人员
-- 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');