chore: 整理数据库文件和Docker配置
Some checks failed
continuous-integration/drone/push Build was killed

- 更新Dockerfile
- 整合数据库SQL文件为martial_db.sql
- 添加docker-compose.yml
- 清理临时SQL脚本

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-19 14:43:48 +08:00
parent 3ae441c044
commit 0f0beaf62e
20 changed files with 9136 additions and 1465 deletions

View File

@@ -1,15 +1,3 @@
# 多阶段构建:编译阶段
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /build
# 复制主项目源码
COPY pom.xml .
COPY src ./src
# 编译项目(在 Drone 中已经编译好,这里只是复制)
RUN mkdir -p target
# 运行阶段:使用轻量级 JRE 镜像 # 运行阶段:使用轻量级 JRE 镜像
FROM eclipse-temurin:17-jre-jammy FROM eclipse-temurin:17-jre-jammy

View File

@@ -1,53 +0,0 @@
-- ================================================================
-- 【紧急修复】场地表字段缺失问题 - 直接复制执行此脚本
-- 问题Unknown column 'max_capacity' in 'field list'
-- 解决:重建 martial_venue 表,包含所有必需字段
-- 日期2025-12-06
-- ================================================================
-- 使用正确的数据库
USE martial_db;
-- 删除旧表(如果有重要数据,请先备份!)
DROP TABLE IF EXISTS `martial_venue`;
-- 创建新表,包含完整字段
CREATE TABLE `martial_venue` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
`competition_id` bigint(20) NOT NULL COMMENT '赛事ID',
`venue_name` varchar(100) NOT NULL COMMENT '场地名称',
`venue_code` varchar(50) DEFAULT NULL COMMENT '场地编码',
`max_capacity` int(11) DEFAULT 100 COMMENT '最大容纳人数',
`location` varchar(200) DEFAULT NULL COMMENT '位置/地点',
`description` varchar(500) DEFAULT NULL COMMENT '场地描述',
`facilities` varchar(500) DEFAULT NULL COMMENT '场地设施',
`sort_order` int(11) DEFAULT 0 COMMENT '排序',
`status` int(2) DEFAULT 1 COMMENT '状态(0-禁用,1-启用)',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`is_deleted` int(2) DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
KEY `idx_competition_id` (`competition_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='场地信息表';
-- 验证表已创建成功
DESC martial_venue;
-- 检查 max_capacity 字段
SELECT '✓ martial_venue 表已成功重建,包含 max_capacity 字段' AS ;
-- 显示所有字段
SELECT
COLUMN_NAME AS ,
COLUMN_TYPE AS ,
COLUMN_DEFAULT AS ,
COLUMN_COMMENT AS
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'martial_db'
AND TABLE_NAME = 'martial_venue'
ORDER BY ORDINAL_POSITION;

View File

@@ -1,73 +0,0 @@
-- 检查赛事基础数据是否完整
USE martial_db;
-- 1. 检查赛事信息
SELECT
'赛事信息' AS '检查项',
COUNT(*) AS '记录数'
FROM martial_competition
WHERE id = 200;
-- 2. 检查参赛者数据
SELECT
'参赛者数据' AS '检查项',
COUNT(*) AS '记录数'
FROM martial_athlete
WHERE competition_id = 200;
-- 3. 检查场地数据
SELECT
'场地数据' AS '检查项',
COUNT(*) AS '记录数'
FROM martial_venue
WHERE competition_id = 200;
-- 4. 检查项目数据
SELECT
'项目数据' AS '检查项',
COUNT(*) AS '记录数'
FROM martial_project
WHERE id IN (
SELECT DISTINCT project_id
FROM martial_athlete
WHERE competition_id = 200
);
-- 5. 检查赛事时间配置
SELECT
id AS '赛事ID',
competition_name AS '赛事名称',
competition_start_time AS '开始时间',
competition_end_time AS '结束时间',
CASE
WHEN competition_start_time IS NULL THEN '⚠ 未配置'
WHEN competition_end_time IS NULL THEN '⚠ 未配置'
ELSE '✓ 已配置'
END AS '时间配置状态'
FROM martial_competition
WHERE id = 200;
-- 6. 详细检查参赛者项目分布
SELECT
p.project_name AS '项目名称',
p.type AS '项目类型(1=个人,2=双人,3=集体)',
COUNT(*) AS '参赛人数'
FROM martial_athlete a
LEFT JOIN martial_project p ON a.project_id = p.id
WHERE a.competition_id = 200
GROUP BY p.id, p.project_name, p.type
ORDER BY p.type, p.project_name;
-- 7. 检查场地详情
SELECT
id AS '场地ID',
venue_name AS '场地名称',
venue_type AS '场地类型',
capacity AS '容量'
FROM martial_venue
WHERE competition_id = 200;
-- 总结
SELECT
'数据检查完成' AS '状态',
NOW() AS '检查时间';

View File

@@ -1,26 +0,0 @@
-- ================================================================
-- 场地表结构检查和修复脚本
-- 用途:检查 martial_venue 表是否存在 max_capacity 字段,如果不存在则添加
-- 日期2025-12-06
-- ================================================================
-- 检查表是否存在
SELECT
TABLE_NAME,
CASE
WHEN TABLE_NAME IS NOT NULL THEN '表存在'
ELSE '表不存在'
END AS status
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'martial_venue';
-- 查看当前表结构
DESC martial_venue;
-- 查看所有字段
SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT, IS_NULLABLE, COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'martial_venue'
ORDER BY ORDINAL_POSITION;

View File

@@ -1,85 +0,0 @@
-- ================================================================
-- 清理所有测试数据脚本
-- 用途:清空所有业务数据,保留表结构
-- 日期2025-12-06
-- 警告:此脚本会删除所有业务数据,请谨慎使用!
-- ================================================================
-- 设置外键检查为0允许删除有外键关联的数据
SET FOREIGN_KEY_CHECKS = 0;
-- 1. 清空赛事相关表
-- ================================================================
TRUNCATE TABLE `martial_competition`;
TRUNCATE TABLE `martial_banner`;
-- 2. 清空项目相关表
-- ================================================================
TRUNCATE TABLE `martial_project`;
-- 3. 清空场地相关表
-- ================================================================
TRUNCATE TABLE `martial_venue`;
-- 4. 清空参赛者/运动员相关表
-- ================================================================
TRUNCATE TABLE `martial_athlete`;
TRUNCATE TABLE `martial_participant`;
-- 5. 清空报名订单相关表
-- ================================================================
TRUNCATE TABLE `martial_registration_order`;
-- 6. 清空裁判相关表
-- ================================================================
TRUNCATE TABLE `martial_referee`;
-- 7. 清空成绩相关表
-- ================================================================
TRUNCATE TABLE `martial_score`;
-- 8. 清空赛程编排相关表(如果存在)
-- ================================================================
-- TRUNCATE TABLE `martial_schedule`;
-- TRUNCATE TABLE `martial_schedule_detail`;
-- 9. 清空信息发布相关表
-- ================================================================
TRUNCATE TABLE `martial_info_publish`;
-- 重新启用外键检查
SET FOREIGN_KEY_CHECKS = 1;
-- ================================================================
-- 验证清理结果
-- ================================================================
SELECT
'赛事数据' AS ,
COUNT(*) AS
FROM martial_competition
UNION ALL
SELECT '项目数据', COUNT(*) FROM martial_project
UNION ALL
SELECT '场地数据', COUNT(*) FROM martial_venue
UNION ALL
SELECT '参赛者数据', COUNT(*) FROM martial_athlete
UNION ALL
SELECT '报名订单数据', COUNT(*) FROM martial_registration_order
UNION ALL
SELECT '裁判数据', COUNT(*) FROM martial_referee
UNION ALL
SELECT '成绩数据', COUNT(*) FROM martial_score
UNION ALL
SELECT '信息发布数据', COUNT(*) FROM martial_info_publish;
-- ================================================================
-- 清理完成
-- ================================================================
-- 所有业务数据已清空,表结构保留
-- 您现在可以重新测试完整的业务流程:
-- 1. 创建赛事
-- 2. 配置场地
-- 3. 创建项目
-- 4. 添加参赛者
-- 5. 进行编排
-- ================================================================

View File

@@ -1,26 +0,0 @@
-- 调试检查脚本
USE martial_db;
-- 检查参赛者的project_id是否都有对应的项目
SELECT
'检查参赛者项目关联' AS check_item,
a.id,
a.project_id,
a.player_name,
p.id AS project_exists,
p.project_name,
p.type AS project_type
FROM martial_athlete a
LEFT JOIN martial_project p ON a.project_id = p.id
WHERE a.competition_id = 200
LIMIT 10;
-- 检查是否有参赛者的project_id为NULL或找不到对应项目
SELECT
'检查异常数据' AS check_item,
COUNT(*) AS total_athletes,
SUM(CASE WHEN project_id IS NULL THEN 1 ELSE 0 END) AS null_project_id,
SUM(CASE WHEN p.id IS NULL THEN 1 ELSE 0 END) AS project_not_found
FROM martial_athlete a
LEFT JOIN martial_project p ON a.project_id = p.id
WHERE a.competition_id = 200;

View File

@@ -1,93 +0,0 @@
@echo off
REM =============================================
REM 赛程编排系统数据库部署脚本
REM =============================================
echo.
echo ========================================
echo 赛程编排系统 - 数据库部署工具
echo ========================================
echo.
REM 检查MySQL是否安装
where mysql >nul 2>&1
if %errorlevel% neq 0 (
echo [错误] 未找到MySQL命令请确保MySQL已安装并添加到系统PATH
echo.
echo 常见MySQL安装路径:
echo - C:\Program Files\MySQL\MySQL Server 8.0\bin
echo - C:\xampp\mysql\bin
echo.
pause
exit /b 1
)
echo [1/3] 检测到MySQL...
REM 设置数据库信息
set DB_NAME=martial_db
set SCRIPT_PATH=%~dp0deploy_schedule_tables.sql
echo [2/3] 准备执行SQL脚本...
echo 数据库: %DB_NAME%
echo 脚本: %SCRIPT_PATH%
echo.
REM 提示用户输入密码
echo 请输入MySQL root密码 (如果没有密码直接按回车):
set /p MYSQL_PWD=密码:
echo.
echo [3/3] 正在执行SQL脚本...
echo.
REM 执行SQL脚本
if "%MYSQL_PWD%"=="" (
mysql -u root %DB_NAME% < "%SCRIPT_PATH%"
) else (
mysql -u root -p%MYSQL_PWD% %DB_NAME% < "%SCRIPT_PATH%"
)
if %errorlevel% equ 0 (
echo.
echo ========================================
echo ✓ 数据库表创建成功!
echo ========================================
echo.
echo 已创建以下4张表:
echo 1. martial_schedule_group - 赛程编排分组表
echo 2. martial_schedule_detail - 赛程编排明细表
echo 3. martial_schedule_participant - 参赛者关联表
echo 4. martial_schedule_status - 编排状态表
echo.
echo 下一步:
echo 1. 导入测试数据 (可选)
echo cd ..\..\..
echo cd martial-web\test-data
echo mysql -u root -p%MYSQL_PWD% martial_db ^< create_100_team_participants.sql
echo.
echo 2. 启动后端服务
echo cd martial-master
echo mvn spring-boot:run
echo.
echo 3. 访问前端页面
echo http://localhost:3000/martial/schedule?competitionId=200
echo.
) else (
echo.
echo ========================================
echo ✗ 数据库表创建失败!
echo ========================================
echo.
echo 可能的原因:
echo 1. 数据库 %DB_NAME% 不存在
echo 2. MySQL密码错误
echo 3. 权限不足
echo.
echo 解决方法:
echo 1. 先创建数据库: CREATE DATABASE martial_db;
echo 2. 检查MySQL密码是否正确
echo 3. 确保用户有CREATE TABLE权限
echo.
)
pause

View File

@@ -1,159 +0,0 @@
-- =============================================
-- 武术赛事赛程编排系统 - 数据库表创建脚本(带数据库选择)
-- =============================================
-- 创建日期: 2025-12-09
-- 版本: v1.1
-- 说明: 自动选择正确的数据库并创建赛程编排相关的4张核心表
-- =============================================
-- 选择数据库(根据实际情况修改)
USE martial_db;
-- 检查表是否已存在,如果存在则删除(可选,生产环境请注释掉)
-- DROP TABLE IF EXISTS martial_schedule_participant;
-- DROP TABLE IF EXISTS martial_schedule_detail;
-- DROP TABLE IF EXISTS martial_schedule_group;
-- DROP TABLE IF EXISTS martial_schedule_status;
-- 1. 赛程编排分组表
CREATE TABLE IF NOT EXISTS `martial_schedule_group` (
`id` bigint(0) NOT NULL COMMENT '主键ID',
`competition_id` bigint(0) NOT NULL COMMENT '赛事ID',
`group_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名称(如:太极拳男组)',
`project_id` bigint(0) NOT NULL COMMENT '项目ID',
`project_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目名称',
`category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组别(成年组、少年组等)',
`project_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '项目类型(1=个人 2=集体)',
`display_order` int(0) NOT NULL DEFAULT 0 COMMENT '显示顺序(集体项目优先,数字越小越靠前)',
`total_participants` int(0) NULL DEFAULT 0 COMMENT '总参赛人数',
`total_teams` int(0) NULL DEFAULT 0 COMMENT '总队伍数(仅集体项目)',
`estimated_duration` int(0) NULL DEFAULT 0 COMMENT '预计时长(分钟)',
`create_user` bigint(0) NULL DEFAULT NULL,
`create_dept` bigint(0) NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
`update_user` bigint(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
`status` int(0) NULL DEFAULT 1 COMMENT '状态(1-启用,2-禁用)',
`is_deleted` int(0) NULL DEFAULT 0,
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_competition` (`competition_id`) USING BTREE,
INDEX `idx_project` (`project_id`) USING BTREE,
INDEX `idx_display_order` (`display_order`) USING BTREE,
INDEX `idx_tenant` (`tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '赛程编排分组表' ROW_FORMAT = Dynamic;
-- 2. 赛程编排明细表(场地时间段分配)
CREATE TABLE IF NOT EXISTS `martial_schedule_detail` (
`id` bigint(0) NOT NULL COMMENT '主键ID',
`schedule_group_id` bigint(0) NOT NULL COMMENT '分组ID',
`competition_id` bigint(0) NOT NULL COMMENT '赛事ID',
`venue_id` bigint(0) NOT NULL COMMENT '场地ID',
`venue_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '场地名称',
`schedule_date` date NOT NULL COMMENT '比赛日期',
`time_period` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '时间段(morning/afternoon)',
`time_slot` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '时间点(08:30/13:30)',
`estimated_start_time` datetime(0) NULL DEFAULT NULL COMMENT '预计开始时间',
`estimated_end_time` datetime(0) NULL DEFAULT NULL COMMENT '预计结束时间',
`estimated_duration` int(0) NULL DEFAULT 0 COMMENT '预计时长(分钟)',
`participant_count` int(0) NULL DEFAULT 0 COMMENT '参赛人数',
`sort_order` int(0) NULL DEFAULT 0 COMMENT '场内顺序',
`create_user` bigint(0) NULL DEFAULT NULL,
`create_dept` bigint(0) NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
`update_user` bigint(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
`status` int(0) NULL DEFAULT 1 COMMENT '状态(1-未开始,2-进行中,3-已完成)',
`is_deleted` int(0) NULL DEFAULT 0,
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_group` (`schedule_group_id`) USING BTREE,
INDEX `idx_competition` (`competition_id`) USING BTREE,
INDEX `idx_venue_time` (`venue_id`, `schedule_date`, `time_slot`) USING BTREE,
INDEX `idx_tenant` (`tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '赛程编排明细表(场地时间段分配)' ROW_FORMAT = Dynamic;
-- 3. 赛程编排参赛者关联表
CREATE TABLE IF NOT EXISTS `martial_schedule_participant` (
`id` bigint(0) NOT NULL COMMENT '主键ID',
`schedule_detail_id` bigint(0) NOT NULL COMMENT '编排明细ID',
`schedule_group_id` bigint(0) NOT NULL COMMENT '分组ID',
`participant_id` bigint(0) NOT NULL COMMENT '参赛者ID(关联martial_athlete表)',
`organization` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '单位名称',
`player_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '选手姓名',
`project_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目名称',
`category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组别',
`performance_order` int(0) NULL DEFAULT 0 COMMENT '出场顺序',
`create_user` bigint(0) NULL DEFAULT NULL,
`create_dept` bigint(0) NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
`update_user` bigint(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
`status` int(0) NULL DEFAULT 1 COMMENT '状态(1-待出场,2-已出场)',
`is_deleted` int(0) NULL DEFAULT 0,
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_detail` (`schedule_detail_id`) USING BTREE,
INDEX `idx_group` (`schedule_group_id`) USING BTREE,
INDEX `idx_participant` (`participant_id`) USING BTREE,
INDEX `idx_tenant` (`tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '赛程编排参赛者关联表' ROW_FORMAT = Dynamic;
-- 4. 赛程编排状态表
CREATE TABLE IF NOT EXISTS `martial_schedule_status` (
`id` bigint(0) NOT NULL COMMENT '主键ID',
`competition_id` bigint(0) NOT NULL COMMENT '赛事ID(唯一)',
`schedule_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '编排状态(0=未编排 1=编排中 2=已保存锁定)',
`last_auto_schedule_time` datetime(0) NULL DEFAULT NULL COMMENT '最后自动编排时间',
`locked_time` datetime(0) NULL DEFAULT NULL COMMENT '锁定时间',
`locked_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '锁定人',
`total_groups` int(0) NULL DEFAULT 0 COMMENT '总分组数',
`total_participants` int(0) NULL DEFAULT 0 COMMENT '总参赛人数',
`create_user` bigint(0) NULL DEFAULT NULL,
`create_dept` bigint(0) NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
`update_user` bigint(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
`status` int(0) NULL DEFAULT 1 COMMENT '状态(1-启用,2-禁用)',
`is_deleted` int(0) NULL DEFAULT 0,
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_competition` (`competition_id`) USING BTREE,
INDEX `idx_tenant` (`tenant_id`) USING BTREE,
INDEX `idx_schedule_status` (`schedule_status`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '赛程编排状态表' ROW_FORMAT = Dynamic;
-- 验证表是否创建成功
SELECT
'表创建完成' AS message,
COUNT(*) AS table_count
FROM information_schema.tables
WHERE table_schema = 'martial_db'
AND table_name IN (
'martial_schedule_group',
'martial_schedule_detail',
'martial_schedule_participant',
'martial_schedule_status'
);
-- =============================================
-- 使用说明
-- =============================================
--
-- 1. 确认数据库名称
-- 如果你的数据库名称不是 martial_db,请修改第9行的 USE 语句
--
-- 2. 执行脚本
-- 方式1: 在MySQL客户端中直接执行
-- mysql -u root -p < deploy_schedule_tables.sql
--
-- 方式2: 在数据库管理工具中执行(Navicat/DBeaver等)
--
-- 3. 验证
-- 执行完成后应该看到 "table_count = 4" 的结果
--
-- 4. 下一步
-- 执行测试数据导入脚本:
-- mysql -u root -p martial_db < martial-web/test-data/create_100_team_participants.sql
--
-- =============================================

View File

@@ -1,19 +0,0 @@
-- ================================================================
-- 修复参赛选手表 order_id 字段约束
-- 问题Field 'order_id' doesn't have a default value
-- 解决:允许 order_id 为 NULL支持直接添加参赛选手无需订单
-- 日期2025-12-06
-- ================================================================
-- 使用正确的数据库
USE martial_db;
-- 修改 order_id 字段,允许为 NULL
ALTER TABLE martial_athlete
MODIFY COLUMN order_id bigint(20) NULL DEFAULT NULL COMMENT '订单ID';
-- 验证修改
DESC martial_athlete;
-- 显示修改结果
SELECT '✓ order_id 字段已修改为可空' AS ;

View File

@@ -1,40 +0,0 @@
-- ================================================================
-- 场地表字段修复脚本
-- 用途:为 martial_venue 表添加缺失的 max_capacity 字段
-- 问题Error: Unknown column 'max_capacity' in 'field list'
-- 日期2025-12-06
-- ================================================================
-- 方案1直接 DROP 表并重新创建(如果表中没有重要数据)
-- 如果表中有数据请跳过此步骤使用方案2
DROP TABLE IF EXISTS `martial_venue`;
CREATE TABLE `martial_venue` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
`competition_id` bigint(20) NOT NULL COMMENT '赛事ID',
`venue_name` varchar(100) NOT NULL COMMENT '场地名称',
`venue_code` varchar(50) DEFAULT NULL COMMENT '场地编码',
`max_capacity` int(11) DEFAULT 100 COMMENT '最大容纳人数',
`location` varchar(200) DEFAULT NULL COMMENT '位置/地点',
`description` varchar(500) DEFAULT NULL COMMENT '场地描述',
`facilities` varchar(500) DEFAULT NULL COMMENT '场地设施',
`sort_order` int(11) DEFAULT 0 COMMENT '排序',
`status` int(2) DEFAULT 1 COMMENT '状态(0-禁用,1-启用)',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`is_deleted` int(2) DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
KEY `idx_competition_id` (`competition_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='场地信息表';
-- ================================================================
-- 验证表结构
-- ================================================================
DESC martial_venue;
SELECT '场地表已重新创建,包含 max_capacity 字段' AS result;

View File

@@ -1,131 +0,0 @@
-- =============================================
-- 赛程编排系统 - 完整测试数据初始化
-- =============================================
USE martial_db;
-- 1. 确保赛事存在并配置了时间
UPDATE martial_competition
SET
competition_start_time = '2025-11-06 08:00:00',
competition_end_time = '2025-11-08 18:00:00'
WHERE id = 200;
-- 检查赛事是否存在
SELECT
'1. 检查赛事' AS step,
CASE
WHEN COUNT(*) > 0 THEN CONCAT('✓ 赛事ID=200存在, 名称: ', MAX(competition_name))
ELSE '✗ 赛事ID=200不存在,请先创建赛事'
END AS result
FROM martial_competition
WHERE id = 200;
-- 2. 创建场地数据(如果不存在)
INSERT IGNORE INTO martial_venue (id, competition_id, venue_name, venue_type, capacity, create_time, is_deleted)
VALUES
(1, 200, '一号场地', '主场地', 100, NOW(), 0),
(2, 200, '二号场地', '副场地', 100, NOW(), 0),
(3, 200, '三号场地', '副场地', 100, NOW(), 0),
(4, 200, '四号场地', '副场地', 100, NOW(), 0);
SELECT
'2. 检查场地' AS step,
CONCAT('✓ 已有 ', COUNT(*), ' 个场地') AS result
FROM martial_venue
WHERE competition_id = 200 AND is_deleted = 0;
-- 3. 创建项目数据(如果不存在)
INSERT IGNORE INTO martial_project (id, project_name, type, category, estimated_duration, create_time)
VALUES
(1001, '太极拳集体', 3, '成年组', 5, NOW()),
(1002, '长拳集体', 3, '成年组', 5, NOW()),
(1003, '剑术集体', 3, '成年组', 5, NOW()),
(1004, '刀术集体', 3, '成年组', 5, NOW()),
(1005, '棍术集体', 3, '少年组', 5, NOW());
SELECT
'3. 检查项目' AS step,
CONCAT('✓ 已有 ', COUNT(*), ' 个项目') AS result
FROM martial_project
WHERE id BETWEEN 1001 AND 1005;
-- 4. 创建测试参赛者数据(少量测试数据)
DELETE FROM martial_athlete WHERE competition_id = 200;
INSERT INTO martial_athlete (
competition_id, project_id, organization, team_name,
player_name, gender, age, phone, category, create_time, is_deleted
)
VALUES
-- 太极拳集体 - 队伍1: 少林寺武校 (5人)
(200, 1001, '少林寺武校', '少林寺武校', '张明远', '', 25, '13800001001', '成年组', NOW(), 0),
(200, 1001, '少林寺武校', '少林寺武校', '李华强', '', 26, '13800001002', '成年组', NOW(), 0),
(200, 1001, '少林寺武校', '少林寺武校', '王建国', '', 24, '13800001003', '成年组', NOW(), 0),
(200, 1001, '少林寺武校', '少林寺武校', '赵小明', '', 23, '13800001004', '成年组', NOW(), 0),
(200, 1001, '少林寺武校', '少林寺武校', '刘德华', '', 27, '13800001005', '成年组', NOW(), 0),
-- 太极拳集体 - 队伍2: 武当派 (5人)
(200, 1001, '武当派', '武当派', '陈剑锋', '', 28, '13800001011', '成年组', NOW(), 0),
(200, 1001, '武当派', '武当派', '周杰伦', '', 25, '13800001012', '成年组', NOW(), 0),
(200, 1001, '武当派', '武当派', '吴彦祖', '', 26, '13800001013', '成年组', NOW(), 0),
(200, 1001, '武当派', '武当派', '郑伊健', '', 24, '13800001014', '成年组', NOW(), 0),
(200, 1001, '武当派', '武当派', '谢霆锋', '', 27, '13800001015', '成年组', NOW(), 0),
-- 长拳集体 - 队伍1: 峨眉派 (5人)
(200, 1002, '峨眉派', '峨眉派', '小龙女', '', 22, '13800002001', '成年组', NOW(), 0),
(200, 1002, '峨眉派', '峨眉派', '黄蓉', '', 23, '13800002002', '成年组', NOW(), 0),
(200, 1002, '峨眉派', '峨眉派', '赵敏', '', 24, '13800002003', '成年组', NOW(), 0),
(200, 1002, '峨眉派', '峨眉派', '周芷若', '', 22, '13800002004', '成年组', NOW(), 0),
(200, 1002, '峨眉派', '峨眉派', '任盈盈', '', 23, '13800002005', '成年组', NOW(), 0),
-- 长拳集体 - 队伍2: 华山派 (5人)
(200, 1002, '华山派', '华山派', '令狐冲', '', 27, '13800002011', '成年组', NOW(), 0),
(200, 1002, '华山派', '华山派', '风清扬', '', 28, '13800002012', '成年组', NOW(), 0),
(200, 1002, '华山派', '华山派', '岳不群', '', 29, '13800002013', '成年组', NOW(), 0),
(200, 1002, '华山派', '华山派', '宁中则', '', 26, '13800002014', '成年组', NOW(), 0),
(200, 1002, '华山派', '华山派', '岳灵珊', '', 24, '13800002015', '成年组', NOW(), 0);
SELECT
'4. 检查参赛者' AS step,
CONCAT('✓ 已有 ', COUNT(*), ' 个参赛者 (', COUNT(DISTINCT organization), ' 个队伍)') AS result
FROM martial_athlete
WHERE competition_id = 200 AND is_deleted = 0;
-- 5. 清空旧的编排数据(如果有)
DELETE FROM martial_schedule_participant WHERE schedule_group_id IN (
SELECT id FROM martial_schedule_group WHERE competition_id = 200
);
DELETE FROM martial_schedule_detail WHERE competition_id = 200;
DELETE FROM martial_schedule_group WHERE competition_id = 200;
DELETE FROM martial_schedule_status WHERE competition_id = 200;
SELECT '5. 清理旧数据' AS step, '✓ 已清空旧的编排数据' AS result;
-- 6. 最终验证
SELECT
'6. 数据完整性检查' AS step,
CONCAT(
'✓ 赛事: ', (SELECT COUNT(*) FROM martial_competition WHERE id = 200),
', 场地: ', (SELECT COUNT(*) FROM martial_venue WHERE competition_id = 200 AND is_deleted = 0),
', 项目: ', (SELECT COUNT(*) FROM martial_project WHERE id BETWEEN 1001 AND 1005),
', 参赛者: ', (SELECT COUNT(*) FROM martial_athlete WHERE competition_id = 200 AND is_deleted = 0)
) AS result;
-- 7. 检查赛事时间配置
SELECT
'7. 赛事时间配置' AS step,
CONCAT(
'开始: ', IFNULL(competition_start_time, '未配置'),
', 结束: ', IFNULL(competition_end_time, '未配置')
) AS result
FROM martial_competition
WHERE id = 200;
SELECT
'========================================' AS '',
'✓ 测试数据初始化完成!' AS result,
'========================================' AS '';
SELECT
'下一步: 测试API' AS action,
'curl -X POST http://localhost:8123/martial/schedule/auto-arrange -H "Content-Type: application/json" -d "{\"competitionId\": 200}"' AS command;

View File

@@ -1,82 +0,0 @@
-- =====================================================
-- 插入测试裁判邀请数据
-- 执行时间: 2025-12-12
-- =====================================================
USE blade;
-- 首先确保有测试赛事数据
-- 假设已经有赛事ID为 1 的数据
-- 首先确保有测试裁判数据
-- 插入测试裁判(如果不存在)
INSERT IGNORE INTO martial_judge (id, name, gender, phone, id_card, referee_type, level, specialty, create_time, update_time, status, is_deleted)
VALUES
(1, '张三', 1, '13800138001', '110101199001011234', 2, '国家级', '太极拳', NOW(), NOW(), 1, 0),
(2, '李四', 1, '13800138002', '110101199002021234', 2, '一级', '长拳', NOW(), NOW(), 1, 0),
(3, '王五', 2, '13800138003', '110101199003031234', 2, '二级', '剑术', NOW(), NOW(), 1, 0),
(4, '赵六', 1, '13800138004', '110101199004041234', 1, '国家级', '刀术', NOW(), NOW(), 1, 0),
(5, '钱七', 2, '13800138005', '110101199005051234', 2, '三级', '棍术', NOW(), NOW(), 1, 0);
-- 插入测试邀请数据
INSERT INTO martial_judge_invite (
id,
competition_id,
judge_id,
invite_code,
role,
invite_status,
invite_time,
reply_time,
reply_note,
contact_phone,
contact_email,
invite_message,
expire_time,
is_used,
create_time,
update_time,
status,
is_deleted
)
VALUES
-- 待回复的邀请
(1, 1, 1, 'INV2025001', 'judge', 0, NOW(), NULL, NULL, '13800138001', 'zhangsan@example.com', '诚邀您担任本次武术比赛的裁判', DATE_ADD(NOW(), INTERVAL 30 DAY), 0, NOW(), NOW(), 1, 0),
(2, 1, 2, 'INV2025002', 'judge', 0, NOW(), NULL, NULL, '13800138002', 'lisi@example.com', '诚邀您担任本次武术比赛的裁判', DATE_ADD(NOW(), INTERVAL 30 DAY), 0, NOW(), NOW(), 1, 0),
-- 已接受的邀请
(3, 1, 3, 'INV2025003', 'judge', 1, DATE_SUB(NOW(), INTERVAL 2 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY), '很荣幸能参加,我会准时到场', '13800138003', 'wangwu@example.com', '诚邀您担任本次武术比赛的裁判', DATE_ADD(NOW(), INTERVAL 30 DAY), 1, DATE_SUB(NOW(), INTERVAL 2 DAY), NOW(), 1, 0),
(4, 1, 4, 'INV2025004', 'chief_judge', 1, DATE_SUB(NOW(), INTERVAL 3 DAY), DATE_SUB(NOW(), INTERVAL 2 DAY), '感谢邀请,我会认真履行裁判长职责', '13800138004', 'zhaoliu@example.com', '诚邀您担任本次武术比赛的裁判长', DATE_ADD(NOW(), INTERVAL 30 DAY), 1, DATE_SUB(NOW(), INTERVAL 3 DAY), NOW(), 1, 0),
-- 已拒绝的邀请
(5, 1, 5, 'INV2025005', 'judge', 2, DATE_SUB(NOW(), INTERVAL 5 DAY), DATE_SUB(NOW(), INTERVAL 4 DAY), '非常抱歉,那段时间有其他安排', '13800138005', 'qianqi@example.com', '诚邀您担任本次武术比赛的裁判', DATE_ADD(NOW(), INTERVAL 30 DAY), 0, DATE_SUB(NOW(), INTERVAL 5 DAY), NOW(), 1, 0);
-- 验证插入结果
SELECT
ji.id,
ji.invite_code,
j.name AS judge_name,
j.level AS judge_level,
ji.contact_phone,
ji.contact_email,
ji.invite_status,
CASE ji.invite_status
WHEN 0 THEN '待回复'
WHEN 1 THEN '已接受'
WHEN 2 THEN '已拒绝'
WHEN 3 THEN '已取消'
ELSE '未知'
END AS status_text,
ji.invite_time,
ji.reply_time,
ji.reply_note
FROM
martial_judge_invite ji
LEFT JOIN martial_judge j ON ji.judge_id = j.id
WHERE
ji.competition_id = 1
AND ji.is_deleted = 0
ORDER BY
ji.id;
SELECT 'Test data inserted successfully!' AS status;

View File

@@ -1,116 +0,0 @@
-- =====================================================
-- 测试邀请码生成功能
-- 执行时间: 2025-12-12
-- =====================================================
USE blade;
-- =====================================================
-- 1. 插入测试数据
-- =====================================================
-- 为评委生成测试邀请码(使用现有字段)
INSERT INTO martial_judge_invite (
id, competition_id, judge_id, invite_code, role,
venue_id, projects, expire_time, is_used,
status, create_time
) VALUES (
1001, 1, 1, 'TEST01', 'judge',
1, '["女子组长拳","男子组陈氏太极拳"]',
DATE_ADD(NOW(), INTERVAL 30 DAY), 0,
1, NOW()
);
-- 为裁判长生成邀请码
INSERT INTO martial_judge_invite (
id, competition_id, judge_id, invite_code, role,
venue_id, projects, expire_time, is_used,
status, create_time
) VALUES (
1002, 1, 2, 'ADMIN1', 'chief_judge',
NULL, NULL,
DATE_ADD(NOW(), INTERVAL 30 DAY), 0,
1, NOW()
);
-- =====================================================
-- 2. 查询测试
-- =====================================================
-- 查询某个评委的有效邀请码
SELECT
ji.id,
ji.invite_code,
ji.role,
ji.expire_time,
ji.is_used,
ji.status,
j.name AS judge_name,
c.competition_name
FROM martial_judge_invite ji
LEFT JOIN martial_judge j ON ji.judge_id = j.id
LEFT JOIN martial_competition c ON ji.competition_id = c.id
WHERE ji.competition_id = 1
AND ji.judge_id = 1
AND ji.status = 1
AND ji.is_deleted = 0
AND ji.expire_time > NOW()
ORDER BY ji.create_time DESC
LIMIT 1;
-- 查询所有有效邀请码
SELECT
ji.id,
ji.invite_code,
ji.role,
j.name AS judge_name,
ji.expire_time,
ji.is_used,
CASE
WHEN ji.is_used = 1 THEN '已使用'
WHEN ji.expire_time < NOW() THEN '已过期'
WHEN ji.status = 0 THEN '已禁用'
ELSE '待使用'
END AS status_text
FROM martial_judge_invite ji
LEFT JOIN martial_judge j ON ji.judge_id = j.id
WHERE ji.competition_id = 1
AND ji.is_deleted = 0
ORDER BY ji.create_time DESC;
-- =====================================================
-- 3. 统计查询
-- =====================================================
-- 统计某个赛事的邀请码状态
SELECT
COUNT(*) AS total,
SUM(CASE WHEN is_used = 0 AND status = 1 AND expire_time > NOW() THEN 1 ELSE 0 END) AS available,
SUM(CASE WHEN is_used = 1 THEN 1 ELSE 0 END) AS used,
SUM(CASE WHEN expire_time <= NOW() THEN 1 ELSE 0 END) AS expired,
SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS disabled
FROM martial_judge_invite
WHERE competition_id = 1
AND is_deleted = 0;
-- =====================================================
-- 4. 验证邀请码唯一性
-- =====================================================
-- 检查邀请码是否重复
SELECT
invite_code,
COUNT(*) AS count
FROM martial_judge_invite
WHERE is_deleted = 0
GROUP BY invite_code
HAVING COUNT(*) > 1;
-- =====================================================
-- 5. 清理测试数据(可选)
-- =====================================================
-- 删除测试数据
-- DELETE FROM martial_judge_invite WHERE id IN (1001, 1002);
SELECT 'Test data inserted successfully!' AS status;

View File

@@ -1,82 +0,0 @@
@echo off
REM =============================================
REM 赛程编排系统 - 数据库升级脚本
REM =============================================
echo.
echo ========================================
echo 赛程编排系统 - 数据库升级工具
echo ========================================
echo.
echo 说明: 此脚本会创建新的4张表,不会影响现有数据
echo - martial_schedule_group
echo - martial_schedule_detail
echo - martial_schedule_participant
echo - martial_schedule_status
echo.
REM 检查MySQL
where mysql >nul 2>&1
if %errorlevel% neq 0 (
echo [错误] 未找到MySQL命令
echo.
echo 请使用以下方法之一:
echo 方法1: 在Navicat/DBeaver中打开并执行 upgrade_schedule_system.sql
echo 方法2: 将MySQL添加到系统PATH后重新运行此脚本
echo.
pause
exit /b 1
)
set DB_NAME=martial_db
set SCRIPT_PATH=%~dp0upgrade_schedule_system.sql
echo [1/2] 检测到MySQL...
echo.
echo 请输入MySQL root密码 (无密码直接回车):
set /p MYSQL_PWD=密码:
echo.
echo [2/2] 正在执行升级脚本...
echo.
if "%MYSQL_PWD%"=="" (
mysql -u root %DB_NAME% < "%SCRIPT_PATH%"
) else (
mysql -u root -p%MYSQL_PWD% %DB_NAME% < "%SCRIPT_PATH%"
)
if %errorlevel% equ 0 (
echo.
echo ========================================
echo ✓ 数据库升级成功!
echo ========================================
echo.
echo 已创建/检查以下表:
echo [新] martial_schedule_group - 赛程编排分组表
echo [新] martial_schedule_detail - 赛程编排明细表
echo [新] martial_schedule_participant - 参赛者关联表
echo [新] martial_schedule_status - 编排状态表
echo.
echo [旧] martial_schedule - 保留(如果存在)
echo [旧] martial_schedule_athlete - 保留(如果存在)
echo.
echo 下一步:
echo 1. 重启后端服务以使新表生效
echo 2. 访问前端页面测试:
echo http://localhost:3000/martial/schedule?competitionId=200
echo.
) else (
echo.
echo ========================================
echo ✗ 升级失败!
echo ========================================
echo.
echo 请检查:
echo 1. 数据库 martial_db 是否存在
echo 2. MySQL密码是否正确
echo 3. 用户是否有CREATE TABLE权限
echo.
)
pause

View File

@@ -1,75 +0,0 @@
-- =====================================================
-- 升级 martial_judge_invite 表
-- 添加邀请状态、时间、联系方式等字段
-- 执行时间: 2025-12-12
-- =====================================================
USE blade;
-- 检查表是否存在
SELECT 'Checking martial_judge_invite table...' AS status;
-- 添加邀请状态字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS invite_status INT DEFAULT 0 COMMENT '邀请状态(0-待回复,1-已接受,2-已拒绝,3-已取消)';
-- 添加邀请时间字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS invite_time DATETIME COMMENT '邀请时间';
-- 添加回复时间字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS reply_time DATETIME COMMENT '回复时间';
-- 添加回复备注字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS reply_note VARCHAR(500) COMMENT '回复备注';
-- 添加联系电话字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS contact_phone VARCHAR(20) COMMENT '联系电话';
-- 添加联系邮箱字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS contact_email VARCHAR(100) COMMENT '联系邮箱';
-- 添加邀请消息字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS invite_message VARCHAR(1000) COMMENT '邀请消息';
-- 添加取消原因字段
ALTER TABLE martial_judge_invite
ADD COLUMN IF NOT EXISTS cancel_reason VARCHAR(500) COMMENT '取消原因';
-- 为邀请状态字段添加索引
ALTER TABLE martial_judge_invite
ADD INDEX IF NOT EXISTS idx_invite_status (invite_status);
-- 为赛事ID和邀请状态组合添加索引
ALTER TABLE martial_judge_invite
ADD INDEX IF NOT EXISTS idx_competition_status (competition_id, invite_status);
-- 验证字段是否添加成功
SELECT
COLUMN_NAME,
COLUMN_TYPE,
COLUMN_COMMENT
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'blade'
AND TABLE_NAME = 'martial_judge_invite'
AND COLUMN_NAME IN (
'invite_status',
'invite_time',
'reply_time',
'reply_note',
'contact_phone',
'contact_email',
'invite_message',
'cancel_reason'
)
ORDER BY
ORDINAL_POSITION;
SELECT 'Upgrade completed successfully!' AS status;

View File

@@ -1,179 +0,0 @@
-- =============================================
-- 赛程编排系统 - 增量升级脚本
-- =============================================
-- 说明: 检查并创建缺失的表,不影响现有数据
-- 版本: v1.1
-- 日期: 2025-12-09
-- =============================================
USE martial_db;
-- 检查当前已有的表
SELECT
table_name,
'已存在' AS status
FROM information_schema.tables
WHERE table_schema = 'martial_db'
AND table_name LIKE 'martial_schedule%';
-- =============================================
-- 创建新表(仅当不存在时)
-- =============================================
-- 1. 赛程编排分组表
CREATE TABLE IF NOT EXISTS `martial_schedule_group` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`competition_id` bigint(20) NOT NULL COMMENT '赛事ID',
`group_name` varchar(200) NOT NULL COMMENT '分组名称(如:太极拳男组)',
`project_id` bigint(20) NOT NULL COMMENT '项目ID',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称',
`category` varchar(50) DEFAULT NULL COMMENT '组别(成年组、少年组等)',
`project_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '项目类型(1=个人 2=集体)',
`display_order` int(11) NOT NULL DEFAULT '0' COMMENT '显示顺序(集体项目优先,数字越小越靠前)',
`total_participants` int(11) DEFAULT '0' COMMENT '总参赛人数',
`total_teams` int(11) DEFAULT '0' COMMENT '总队伍数(仅集体项目)',
`estimated_duration` int(11) DEFAULT '0' COMMENT '预计时长(分钟)',
`create_user` bigint(20) DEFAULT NULL,
`create_dept` bigint(20) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_user` bigint(20) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` int(11) DEFAULT '1' COMMENT '状态(1-启用,2-禁用)',
`is_deleted` int(11) DEFAULT '0',
`tenant_id` varchar(12) DEFAULT '000000',
PRIMARY KEY (`id`),
KEY `idx_competition` (`competition_id`),
KEY `idx_project` (`project_id`),
KEY `idx_display_order` (`display_order`),
KEY `idx_tenant` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='赛程编排分组表';
-- 2. 赛程编排明细表(场地时间段分配)
CREATE TABLE IF NOT EXISTS `martial_schedule_detail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`schedule_group_id` bigint(20) NOT NULL COMMENT '分组ID',
`competition_id` bigint(20) NOT NULL COMMENT '赛事ID',
`venue_id` bigint(20) NOT NULL COMMENT '场地ID',
`venue_name` varchar(100) DEFAULT NULL COMMENT '场地名称',
`schedule_date` date NOT NULL COMMENT '比赛日期',
`time_period` varchar(20) NOT NULL COMMENT '时间段(morning/afternoon)',
`time_slot` varchar(20) NOT NULL COMMENT '时间点(08:30/13:30)',
`estimated_start_time` datetime DEFAULT NULL COMMENT '预计开始时间',
`estimated_end_time` datetime DEFAULT NULL COMMENT '预计结束时间',
`estimated_duration` int(11) DEFAULT '0' COMMENT '预计时长(分钟)',
`participant_count` int(11) DEFAULT '0' COMMENT '参赛人数',
`sort_order` int(11) DEFAULT '0' COMMENT '场内顺序',
`create_user` bigint(20) DEFAULT NULL,
`create_dept` bigint(20) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_user` bigint(20) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` int(11) DEFAULT '1' COMMENT '状态(1-未开始,2-进行中,3-已完成)',
`is_deleted` int(11) DEFAULT '0',
`tenant_id` varchar(12) DEFAULT '000000',
PRIMARY KEY (`id`),
KEY `idx_group` (`schedule_group_id`),
KEY `idx_competition` (`competition_id`),
KEY `idx_venue_time` (`venue_id`,`schedule_date`,`time_slot`),
KEY `idx_tenant` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='赛程编排明细表(场地时间段分配)';
-- 3. 赛程编排参赛者关联表
CREATE TABLE IF NOT EXISTS `martial_schedule_participant` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`schedule_detail_id` bigint(20) NOT NULL COMMENT '编排明细ID',
`schedule_group_id` bigint(20) NOT NULL COMMENT '分组ID',
`participant_id` bigint(20) NOT NULL COMMENT '参赛者ID(关联martial_athlete表)',
`organization` varchar(200) DEFAULT NULL COMMENT '单位名称',
`player_name` varchar(100) DEFAULT NULL COMMENT '选手姓名',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称',
`category` varchar(50) DEFAULT NULL COMMENT '组别',
`performance_order` int(11) DEFAULT '0' COMMENT '出场顺序',
`create_user` bigint(20) DEFAULT NULL,
`create_dept` bigint(20) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_user` bigint(20) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` int(11) DEFAULT '1' COMMENT '状态(1-待出场,2-已出场)',
`is_deleted` int(11) DEFAULT '0',
`tenant_id` varchar(12) DEFAULT '000000',
PRIMARY KEY (`id`),
KEY `idx_detail` (`schedule_detail_id`),
KEY `idx_group` (`schedule_group_id`),
KEY `idx_participant` (`participant_id`),
KEY `idx_tenant` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='赛程编排参赛者关联表';
-- 4. 赛程编排状态表
CREATE TABLE IF NOT EXISTS `martial_schedule_status` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`competition_id` bigint(20) NOT NULL COMMENT '赛事ID(唯一)',
`schedule_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '编排状态(0=未编排 1=编排中 2=已保存锁定)',
`last_auto_schedule_time` datetime DEFAULT NULL COMMENT '最后自动编排时间',
`locked_time` datetime DEFAULT NULL COMMENT '锁定时间',
`locked_by` varchar(100) DEFAULT NULL COMMENT '锁定人',
`total_groups` int(11) DEFAULT '0' COMMENT '总分组数',
`total_participants` int(11) DEFAULT '0' COMMENT '总参赛人数',
`create_user` bigint(20) DEFAULT NULL,
`create_dept` bigint(20) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_user` bigint(20) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` int(11) DEFAULT '1' COMMENT '状态(1-启用,2-禁用)',
`is_deleted` int(11) DEFAULT '0',
`tenant_id` varchar(12) DEFAULT '000000',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_competition` (`competition_id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_schedule_status` (`schedule_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='赛程编排状态表';
-- =============================================
-- 验证结果
-- =============================================
SELECT
'升级完成' AS message,
COUNT(*) AS new_tables_count
FROM information_schema.tables
WHERE table_schema = 'martial_db'
AND table_name IN (
'martial_schedule_group',
'martial_schedule_detail',
'martial_schedule_participant',
'martial_schedule_status'
);
-- 显示所有赛程相关表
SELECT
table_name,
table_comment,
CASE
WHEN table_name IN ('martial_schedule_group', 'martial_schedule_detail',
'martial_schedule_participant', 'martial_schedule_status')
THEN '新系统'
ELSE '旧系统'
END AS system_version
FROM information_schema.tables
WHERE table_schema = 'martial_db'
AND table_name LIKE 'martial_schedule%'
ORDER BY system_version DESC, table_name;
-- =============================================
-- 说明
-- =============================================
--
-- 执行结果说明:
-- 1. 如果 new_tables_count = 4说明4张新表全部创建成功
-- 2. 如果 new_tables_count < 4说明部分表已存在或创建失败
-- 3. 最后一个查询会显示所有赛程相关表及其所属系统版本
--
-- 新旧系统对比:
-- - 旧系统: martial_schedule, martial_schedule_athlete (可能存在)
-- - 新系统: martial_schedule_group, martial_schedule_detail,
-- martial_schedule_participant, martial_schedule_status
--
-- 两个系统可以共存,不会互相影响
-- 新系统由后端Service层代码使用
--
-- =============================================

View File

@@ -1,113 +0,0 @@
-- ================================================================
-- 赛事编排智能化升级 SQL 脚本
-- 用途:支持智能编排算法(场地容纳人数 + 项目时长限制)
-- 日期2025-12-06
-- ================================================================
-- 1. 创建场地信息表(如果不存在)
-- ================================================================
-- 注意:使用 capacity 字段名以匹配现有数据库表结构
CREATE TABLE IF NOT EXISTS `martial_venue` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(12) DEFAULT '000000' COMMENT '租户ID',
`competition_id` bigint(20) NOT NULL COMMENT '赛事ID',
`venue_name` varchar(100) NOT NULL COMMENT '场地名称',
`venue_code` varchar(50) DEFAULT NULL COMMENT '场地编码',
`location` varchar(200) DEFAULT NULL COMMENT '位置/地点',
`capacity` int(11) DEFAULT 100 COMMENT '容纳人数',
`facilities` varchar(500) DEFAULT NULL COMMENT '场地设施',
`status` int(2) DEFAULT 1 COMMENT '状态(0-禁用,1-启用)',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`is_deleted` int(2) DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`),
KEY `idx_competition_id` (`competition_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='场地信息表';
-- 2. 确保 martial_project 表有 estimated_duration 字段
-- ================================================================
-- 检查字段是否存在,不存在则添加
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'martial_project'
AND COLUMN_NAME = 'estimated_duration';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE martial_project ADD COLUMN estimated_duration int(11) DEFAULT 5 COMMENT ''预估时长(分钟)'' AFTER max_participants',
'SELECT ''estimated_duration column already exists'' AS info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 3. 插入测试数据(仅用于开发测试)
-- ================================================================
-- 为赛事 ID=100 插入场地数据
INSERT INTO `martial_venue` (`competition_id`, `venue_name`, `venue_code`, `capacity`, `location`, `facilities`) VALUES
(100, '一号场地', 'VENUE_01', 50, '体育馆一楼东侧', '主会场,配备专业武术地毯,适合集体项目'),
(100, '二号场地', 'VENUE_02', 50, '体育馆一楼西侧', '次会场,配备专业武术地毯,适合集体项目'),
(100, '三号场地', 'VENUE_03', 30, '体育馆二楼东侧', '小型场地,适合个人项目'),
(100, '四号场地', 'VENUE_04', 30, '体育馆二楼西侧', '小型场地,适合个人项目')
ON DUPLICATE KEY UPDATE
venue_name = VALUES(venue_name),
capacity = VALUES(capacity),
location = VALUES(location),
facilities = VALUES(facilities);
-- 4. 更新现有项目的预估时长如果为NULL或0
-- ================================================================
UPDATE martial_project
SET estimated_duration = CASE
WHEN project_name LIKE '%太极%' THEN 5
WHEN project_name LIKE '%长拳%' THEN 5
WHEN project_name LIKE '%剑%' THEN 4
WHEN project_name LIKE '%刀%' THEN 4
WHEN project_name LIKE '%棍%' THEN 6
WHEN project_name LIKE '%枪%' THEN 6
ELSE 5
END
WHERE estimated_duration IS NULL OR estimated_duration = 0;
-- 5. 创建视图:场地使用统计(可选)
-- ================================================================
CREATE OR REPLACE VIEW v_venue_usage_stats AS
SELECT
v.id AS venue_id,
v.competition_id,
v.venue_name,
v.max_capacity,
COUNT(DISTINCT s.group_id) AS assigned_groups,
SUM(s.participant_count) AS total_participants,
SUM(s.estimated_duration) AS total_duration,
v.max_capacity - IFNULL(SUM(s.participant_count), 0) AS remaining_capacity
FROM martial_venue v
LEFT JOIN (
-- 这里假设将来会有 martial_schedule 表来存储编排结果
SELECT
venue_id,
group_id,
COUNT(*) AS participant_count,
SUM(estimated_duration) AS estimated_duration
FROM martial_schedule_detail
WHERE is_deleted = 0
GROUP BY venue_id, group_id
) s ON v.id = s.venue_id
WHERE v.is_deleted = 0
GROUP BY v.id, v.competition_id, v.venue_name, v.max_capacity;
-- ================================================================
-- 脚本执行完成
-- ================================================================
-- 说明:
-- 1. 场地表已创建,支持最大容纳人数配置
-- 2. 项目表 estimated_duration 字段已确保存在
-- 3. 测试数据已插入赛事ID=100
-- 4. 现有项目的预估时长已更新为合理默认值
-- ================================================================

View File

@@ -1,101 +0,0 @@
-- =============================================
-- 验证赛程编排系统表创建情况
-- =============================================
USE martial_db;
-- 1. 检查所有赛程相关表
SELECT
table_name AS '表名',
table_comment AS '说明',
CASE
WHEN table_name IN ('martial_schedule_group', 'martial_schedule_detail',
'martial_schedule_participant', 'martial_schedule_status')
THEN '✓ 新系统'
ELSE '旧系统'
END AS '系统版本',
table_rows AS '记录数'
FROM information_schema.tables
WHERE table_schema = 'martial_db'
AND table_name LIKE 'martial_schedule%'
ORDER BY
CASE
WHEN table_name IN ('martial_schedule_group', 'martial_schedule_detail',
'martial_schedule_participant', 'martial_schedule_status')
THEN 1
ELSE 2
END,
table_name;
-- 2. 验证新系统4张表是否全部创建
SELECT
CASE
WHEN COUNT(*) = 4 THEN '✓ 新系统表创建成功! 共4张表已就绪'
ELSE CONCAT('⚠ 警告: 只创建了 ', COUNT(*), ' 张表,应该是4张')
END AS '创建状态'
FROM information_schema.tables
WHERE table_schema = 'martial_db'
AND table_name IN (
'martial_schedule_group',
'martial_schedule_detail',
'martial_schedule_participant',
'martial_schedule_status'
);
-- 3. 检查各表的字段数量
SELECT
table_name AS '表名',
COUNT(*) AS '字段数'
FROM information_schema.columns
WHERE table_schema = 'martial_db'
AND table_name IN (
'martial_schedule_group',
'martial_schedule_detail',
'martial_schedule_participant',
'martial_schedule_status'
)
GROUP BY table_name
ORDER BY table_name;
-- 4. 检查索引创建情况
SELECT
table_name AS '表名',
COUNT(DISTINCT index_name) AS '索引数量',
GROUP_CONCAT(DISTINCT index_name ORDER BY index_name) AS '索引列表'
FROM information_schema.statistics
WHERE table_schema = 'martial_db'
AND table_name IN (
'martial_schedule_group',
'martial_schedule_detail',
'martial_schedule_participant',
'martial_schedule_status'
)
GROUP BY table_name
ORDER BY table_name;
-- 5. 检查是否有数据(应该为空,因为是新表)
SELECT
'martial_schedule_group' AS '表名',
COUNT(*) AS '记录数'
FROM martial_schedule_group
UNION ALL
SELECT
'martial_schedule_detail',
COUNT(*)
FROM martial_schedule_detail
UNION ALL
SELECT
'martial_schedule_participant',
COUNT(*)
FROM martial_schedule_participant
UNION ALL
SELECT
'martial_schedule_status',
COUNT(*)
FROM martial_schedule_status;
-- 6. 显示最终状态
SELECT
'🎉 数据库升级完成!' AS '状态',
DATABASE() AS '当前数据库',
NOW() AS '验证时间';

9057
database/martial_db.sql Normal file

File diff suppressed because one or more lines are too long

79
docker-compose.yml Normal file
View File

@@ -0,0 +1,79 @@
version: '3.8'
services:
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: martial-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: martial_db
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./database:/docker-entrypoint-initdb.d
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p123456"]
interval: 10s
timeout: 5s
retries: 5
networks:
- martial-network
# Redis 缓存
redis:
image: redis:7-alpine
container_name: martial-redis
restart: always
command: redis-server --requirepass 123456
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "123456", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- martial-network
# 后端应用
martial-api:
build:
context: .
dockerfile: Dockerfile
container_name: martial-api
restart: always
environment:
SPRING_PROFILE: dev
JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseG1GC"
# 覆盖数据库连接配置
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/martial_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 123456
# 覆盖 Redis 连接配置
SPRING_DATA_REDIS_HOST: redis
SPRING_DATA_REDIS_PORT: 6379
SPRING_DATA_REDIS_PASSWORD: 123456
ports:
- "8123:8123"
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
networks:
- martial-network
networks:
martial-network:
driver: bridge
volumes:
mysql_data:
redis_data: