第六阶段开发。

This commit is contained in:
zfjia committed 2026-11-12 13:36:24 +08:00
1 parent 35751b4f00
commit bacdd15f3a
93 files changed
+10190 -22

No files matched your search

+183
View File
@@ -0,0 +1,183 @@
-- =============================================================================
-- 平板作业(保洁 / 维修)与作业人员
-- 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');