Files
jcgl-dev/dev/sql/apt_rev01/28_job_automation.sql
T

87 lines
4.6 KiB
SQL
Raw Normal View History

2026-11-12 13:36:24 +08:00
-- =============================================================================
-- 保洁自动建单 / 报修自动流转(增量,可重放)
-- 口径:
-- 1) 离寓判定以 gy_jcxx 在寓事实为准:finish_ly='0' AND sjlysj IS NULL;
-- gy_rooms.in_person_count 由该口径重算,不再依赖 +1/-1。
-- 2) 同房同一时刻只允许一条活跃保洁任务(PENDING/PROCESSING):
-- active_room 生成列 + 唯一索引,服务层先判后插,库层兜底并发。
-- 3) source 增加 AUTO(全员离寓自动建单);TABLET=平板上报 / MANUAL=后台补录。
-- 幂等:列/索引均做 information_schema 判断,可重复执行。
-- =============================================================================
SET NAMES utf8mb4;
-- -----------------------------------------------------------------------------
-- 1. 保洁任务:活跃占位列 + 唯一索引(同房仅一条待处理/保洁中)
-- -----------------------------------------------------------------------------
CALL apt_add_column_if_missing('gy_clean_task', 'active_room',
"active_room VARCHAR(64) GENERATED ALWAYS AS (CASE WHEN state IN ('PENDING','PROCESSING') AND deleted = 0 THEN room_id END) STORED COMMENT '活跃任务房号占位:同房同时只允许一条待处理/保洁中'");
SET @apt_idx_active = (SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_clean_task'
AND INDEX_NAME = 'uk_cleantask_gyid_active_room');
SET @apt_sql_active = IF(@apt_idx_active = 0,
'ALTER TABLE gy_clean_task ADD UNIQUE KEY uk_cleantask_gyid_active_room (gyid, active_room)',
'SELECT 1');
PREPARE stmt_cleantask_active FROM @apt_sql_active;
EXECUTE stmt_cleantask_active;
DEALLOCATE PREPARE stmt_cleantask_active;
-- -----------------------------------------------------------------------------
-- 2. 查询索引:按房号找活跃任务 / 按房号统计在寓人数
-- -----------------------------------------------------------------------------
SET @apt_idx_room = (SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_clean_task'
AND INDEX_NAME = 'idx_cleantask_gyid_room_state');
SET @apt_sql_room = IF(@apt_idx_room = 0,
'ALTER TABLE gy_clean_task ADD KEY idx_cleantask_gyid_room_state (gyid, room_id, state, deleted)',
'SELECT 1');
PREPARE stmt_cleantask_room FROM @apt_sql_room;
EXECUTE stmt_cleantask_room;
DEALLOCATE PREPARE stmt_cleantask_room;
SET @apt_idx_stay = (SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
AND INDEX_NAME = 'idx_jcxx_gyid_room_leave');
SET @apt_sql_stay = IF(@apt_idx_stay = 0,
'ALTER TABLE gy_jcxx ADD KEY idx_jcxx_gyid_room_leave (gyid, fjh, finish_ly)',
'SELECT 1');
PREPARE stmt_jcxx_room FROM @apt_sql_stay;
EXECUTE stmt_jcxx_room;
DEALLOCATE PREPARE stmt_jcxx_room;
-- -----------------------------------------------------------------------------
-- 3. source 取值口径补充 AUTO
-- -----------------------------------------------------------------------------
ALTER TABLE gy_clean_task
MODIFY COLUMN source VARCHAR(20) NOT NULL DEFAULT 'TABLET'
COMMENT 'TABLET=平板上报 / MANUAL=后台补录 / AUTO=全员离寓自动建单';
-- -----------------------------------------------------------------------------
-- 4. 校验
-- -----------------------------------------------------------------------------
SELECT '=== 53. active_room 生成列(应 1:STORED GENERATED)===' AS section;
SELECT COLUMN_NAME, COLUMN_TYPE, EXTRA
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_clean_task'
AND COLUMN_NAME = 'active_room';
SELECT '=== 54. 同房唯一活跃任务索引(应 1)===' AS section;
SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_clean_task'
AND INDEX_NAME IN ('uk_cleantask_gyid_active_room','idx_cleantask_gyid_room_state')
GROUP BY INDEX_NAME;
SELECT '=== 55. 在寓判定索引(应 1)===' AS section;
SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
AND INDEX_NAME = 'idx_jcxx_gyid_room_leave'
GROUP BY INDEX_NAME;
SELECT '=== 56. 当前活跃保洁任务(每个房间应 <= 1)===' AS section;
SELECT gyid, room_id, COUNT(*) AS active_cnt
FROM gy_clean_task
WHERE state IN ('PENDING','PROCESSING') AND deleted = 0
GROUP BY gyid, room_id
HAVING active_cnt > 1;