feat(pk): implement PK (Player-Killer) system with lifecycle management

- Add PK entity fields: winner, scores, and setting_id
- Implement force start/end API endpoints for clerk PK
- Add PK lifecycle service with auto-start/end scheduling
- Add Redis-based PK state management
- Implement PK detail service with live/history/upcoming queries
- Add WeChat PK controller with history and live PK endpoints
- Add comprehensive PK integration tests
- Create PK setting management with tenant-specific configs
- Add database migrations for PK scores, winner, settings, and menu
- Add PK-related DTOs and enums (status, menu paths)
- Add TenantScope utility for tenant context management
This commit is contained in:
irving
2026-01-02 01:34:03 -05:00
parent a7e567e9b4
commit 17a8c358a8
54 changed files with 5391 additions and 37 deletions

View File

@@ -0,0 +1,26 @@
CREATE TABLE `play_clerk_pk_settings` (
`id` varchar(32) NOT NULL COMMENT 'UUID',
`tenant_id` varchar(32) NOT NULL COMMENT '租户ID',
`name` varchar(255) NOT NULL COMMENT '设置名称',
`recurrence_type` varchar(32) NOT NULL COMMENT '循环类型',
`day_of_week` varchar(16) DEFAULT NULL COMMENT '星期几',
`day_of_month` int DEFAULT NULL COMMENT '每月第N天',
`month_of_year` int DEFAULT NULL COMMENT '每年月份',
`start_time_of_day` time NOT NULL COMMENT '每日开始时间',
`duration_minutes` int NOT NULL COMMENT '持续分钟数',
`effective_start_date` date NOT NULL COMMENT '生效开始日期',
`effective_end_date` date DEFAULT NULL COMMENT '生效结束日期',
`timezone` varchar(64) NOT NULL COMMENT '时区',
`clerk_a_id` varchar(255) NOT NULL COMMENT '店员A ID',
`clerk_b_id` varchar(255) NOT NULL COMMENT '店员B ID',
`status` varchar(32) NOT NULL COMMENT '状态',
`created_by` varchar(32) DEFAULT NULL COMMENT '创建人的id',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_by` varchar(32) DEFAULT NULL COMMENT '修改人的id',
`updated_time` datetime DEFAULT NULL COMMENT '修改时间',
`deleted` varchar(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1已删除 0未删除',
`version` int NOT NULL DEFAULT '1' COMMENT '数据版本',
PRIMARY KEY (`id`) USING BTREE,
KEY `key_tenant_id` (`tenant_id`) USING BTREE,
KEY `idx_pk_settings_status` (`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='店员PK排期设置';

View File

@@ -0,0 +1,3 @@
ALTER TABLE `play_clerk_pk`
ADD COLUMN `setting_id` varchar(32) DEFAULT NULL COMMENT 'PK排期设置ID' AFTER `status`,
ADD KEY `idx_pk_setting_id` (`setting_id`);

View File

@@ -0,0 +1,288 @@
-- Add PK management menus for PC tenant.
SET @pk_root_id := (
SELECT menu_id
FROM sys_menu
WHERE menu_name = 'PK管理' AND parent_id = 0 AND deleted = 0
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
menu_code,
icon,
permission,
menu_level,
sort,
parent_id,
menu_type,
status,
remark,
path,
component,
router_query,
is_frame,
visible,
updated_time,
updated_by,
created_time,
created_by,
deleted,
version,
perms
)
SELECT
'PK管理',
'PkManage',
'el-icon-trophy',
'',
1,
90,
0,
0,
0,
'PK管理',
'play/pk',
'Layout',
'',
0,
1,
NOW(),
'migration_v22_pk_menu',
NOW(),
'migration_v22_pk_menu',
0,
1,
''
WHERE @pk_root_id IS NULL;
SET @pk_root_id := (
SELECT menu_id
FROM sys_menu
WHERE menu_name = 'PK管理' AND parent_id = 0 AND deleted = 0
LIMIT 1
);
SET @pk_schedule_id := (
SELECT menu_id
FROM sys_menu
WHERE menu_name = '排期管理' AND parent_id = @pk_root_id AND deleted = 0
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
menu_code,
icon,
permission,
menu_level,
sort,
parent_id,
menu_type,
status,
remark,
path,
component,
router_query,
is_frame,
visible,
updated_time,
updated_by,
created_time,
created_by,
deleted,
version,
perms
)
SELECT
'排期管理',
'PkSchedule',
'el-icon-date',
'play:pk:schedule:list',
2,
1,
@pk_root_id,
1,
0,
'排期管理',
'schedule',
'play/pk/schedule/index',
'',
0,
1,
NOW(),
'migration_v22_pk_menu',
NOW(),
'migration_v22_pk_menu',
0,
1,
''
WHERE @pk_root_id IS NOT NULL AND @pk_schedule_id IS NULL;
SET @pk_live_id := (
SELECT menu_id
FROM sys_menu
WHERE menu_name = '实时监控' AND parent_id = @pk_root_id AND deleted = 0
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
menu_code,
icon,
permission,
menu_level,
sort,
parent_id,
menu_type,
status,
remark,
path,
component,
router_query,
is_frame,
visible,
updated_time,
updated_by,
created_time,
created_by,
deleted,
version,
perms
)
SELECT
'实时监控',
'PkLive',
'el-icon-video-play',
'play:pk:live:list',
2,
2,
@pk_root_id,
1,
0,
'实时监控',
'live',
'play/pk/live/index',
'',
0,
1,
NOW(),
'migration_v22_pk_menu',
NOW(),
'migration_v22_pk_menu',
0,
1,
''
WHERE @pk_root_id IS NOT NULL AND @pk_live_id IS NULL;
SET @pk_history_id := (
SELECT menu_id
FROM sys_menu
WHERE menu_name = '战绩列表' AND parent_id = @pk_root_id AND deleted = 0
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
menu_code,
icon,
permission,
menu_level,
sort,
parent_id,
menu_type,
status,
remark,
path,
component,
router_query,
is_frame,
visible,
updated_time,
updated_by,
created_time,
created_by,
deleted,
version,
perms
)
SELECT
'战绩列表',
'PkHistory',
'el-icon-data-analysis',
'play:pk:history:list',
2,
3,
@pk_root_id,
1,
0,
'战绩列表',
'history',
'play/pk/history/index',
'',
0,
1,
NOW(),
'migration_v22_pk_menu',
NOW(),
'migration_v22_pk_menu',
0,
1,
''
WHERE @pk_root_id IS NOT NULL AND @pk_history_id IS NULL;
SET @pk_settings_id := (
SELECT menu_id
FROM sys_menu
WHERE menu_name = '规则设置' AND parent_id = @pk_root_id AND deleted = 0
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
menu_code,
icon,
permission,
menu_level,
sort,
parent_id,
menu_type,
status,
remark,
path,
component,
router_query,
is_frame,
visible,
updated_time,
updated_by,
created_time,
created_by,
deleted,
version,
perms
)
SELECT
'规则设置',
'PkSettings',
'el-icon-setting',
'play:pk:settings:list',
2,
4,
@pk_root_id,
1,
0,
'规则设置',
'settings',
'play/pk/settings/index',
'',
0,
1,
NOW(),
'migration_v22_pk_menu',
NOW(),
'migration_v22_pk_menu',
0,
1,
''
WHERE @pk_root_id IS NOT NULL AND @pk_settings_id IS NULL;

View File

@@ -0,0 +1,10 @@
-- Fix PK root menu path to ensure correct routing.
UPDATE sys_menu
SET path = '/play/pk',
updated_time = NOW(),
updated_by = 'migration_v23_fix_pk_path'
WHERE menu_name = 'PK管理'
AND parent_id = 0
AND deleted = 0
AND path = 'play/pk';