YD_Event.Web/scripts/dev/seed-event-59-results.sql
ltx be8bafe1e0 feat(scoring): 完善成绩工作台与排名投屏展示
- 成绩工作台移除顶部标题和当前投屏状态栏,将实时同步、大屏配色与检录入口移到项目栏;展示接口返回的当前赛事名称,移除切换赛事按钮。
- 排名大屏展示前三名领奖台与第 4—8 名列表;使用排名行序号区分共用出场编号的选手,修复姓名和分数动画串位,改善长姓名布局。
- 排名持续展示期间增加领奖台光晕、台阶流光及列表扫光,并遵从系统的减少动态效果设置。
- 裁判分配保存及提交按钮增加加载状态和重复点击保护。
- 增加限定 QA 测试库的赛事 59 成绩补齐脚本,仅插入缺失成绩及对应版本,保留已有裁判评分单。

验证:npm run build:local 通过;git diff --check 无异常。
2026-11-04 16:24:01 +08:00

101 lines
5.5 KiB
Transact-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.

-- 仅为测试库中的赛事“59”补齐正式成绩,用于工作台和排名大屏调试。
-- 只插入尚无有效成绩的出场记录;不修改裁判评分单及已有成绩。
SET XACT_ABORT ON;
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @EventId bigint = 491967903178757;
IF DB_NAME() <> N'EventServerDB_QA'
THROW 51000, N'仅允许在 EventServerDB_QA 执行', 1;
IF NOT EXISTS (SELECT 1 FROM dbo.EventInfo WHERE Id = @EventId AND EventName = N'59' AND DeleteMark = 0)
THROW 51001, N'目标赛事不存在或名称不符', 1;
DECLARE @EntryCount int = (
SELECT COUNT(*) FROM dbo.EventSessionEntry e
JOIN dbo.EventSession s ON s.Id = e.SessionId
WHERE s.EventId = @EventId AND s.DeleteMark = 0 AND e.DeleteMark = 0
);
IF @EntryCount <> 10
THROW 51002, N'赛事出场人数已变化,请先复核脚本', 1;
-- 与应用相同的 2023-01-01 UTC 基准和 12 位尾段;预留调试专用 worker 63。
DECLARE @IdBase bigint = DATEDIFF_BIG(millisecond, '2023-01-01T00:00:00', SYSUTCDATETIME()) * 4096 + 63 * 64;
;WITH OrderedEntries AS (
SELECT e.Id AS EntryId, e.SessionId, s.EventProjectId, s.ScoreRuleId,
e.ParticipantName, e.GroupName, e.ParticipationRecordId,
ROW_NUMBER() OVER (PARTITION BY s.EventProjectId, e.GroupName ORDER BY s.CreatedTime, s.Id, e.PlayOrder, e.Id) AS GroupRank,
s.CreatedTime AS SessionCreatedTime, s.Id AS SessionOrderId, e.PlayOrder
FROM dbo.EventSessionEntry e
JOIN dbo.EventSession s ON s.Id = e.SessionId AND s.EventId = @EventId AND s.DeleteMark = 0
WHERE e.DeleteMark = 0 AND e.IsVoided = 0
), Missing AS (
SELECT o.*, ROW_NUMBER() OVER (ORDER BY o.SessionCreatedTime, o.SessionOrderId, o.PlayOrder, o.EntryId) AS SeedNo
FROM OrderedEntries o
WHERE NOT EXISTS (SELECT 1 FROM dbo.EventResult r WHERE r.SessionEntryId = o.EntryId AND r.DeleteMark = 0)
), Factors AS (
SELECT m.*, CAST(9.75 - (m.GroupRank - 1) * 0.60 AS decimal(18,4)) AS D,
CAST(0.64 - (m.GroupRank - 1) * 0.02 AS decimal(18,4)) AS P,
CAST(0.97 - (m.GroupRank - 1) * 0.01 AS decimal(18,4)) AS Q,
CAST(0.08 + (m.GroupRank - 1) * 0.02 AS decimal(18,4)) AS Deduction
FROM Missing m
)
SELECT f.*, ep.ProjectId, sr.RuleVersion,
CAST(ROUND(f.D * (1 + f.P) * f.Q * (1 - f.Deduction), 2) AS decimal(18,2)) AS FinalScore,
@IdBase + f.SeedNo AS ResultId,
@IdBase + 32 + f.SeedNo AS VersionId
INTO #Seed FROM Factors f
JOIN dbo.EventProject ep ON ep.Id = f.EventProjectId
JOIN dbo.ScoreRule sr ON sr.Id = f.ScoreRuleId;
IF (SELECT COUNT(*) FROM #Seed) > 10
THROW 51003, N'待补成绩数量异常', 1;
IF EXISTS (SELECT 1 FROM #Seed WHERE D <= 0 OR P < 0 OR Q <= 0 OR Deduction >= 1)
THROW 51004, N'模拟成绩因子超出允许范围', 1;
IF EXISTS (SELECT 1 FROM dbo.EventResult WHERE Id IN (SELECT ResultId FROM #Seed))
OR EXISTS (SELECT 1 FROM dbo.EventResultVersion WHERE Id IN (SELECT VersionId FROM #Seed))
THROW 51005, N'生成的主键发生冲突,请重试', 1;
INSERT dbo.EventResult (
Id, ParticipationRecordId, RegistrationId, RegistrationPersonId, EventId, ProjectId,
ParticipantName, GroupName, Score, Rank, AwardLevel, AwardStatus, CreatedTime,
ProjectTypeName, DeleteMark, CreatedUserId, Status, SessionId, SessionEntryId,
DifficultyScore, PerformanceScore, RequiredScore, DeductionScore, TotalScore,
IsDisqualified, ResultStatus, ResultVersion, CalculationJson
)
SELECT ResultId, COALESCE(ParticipationRecordId, 0), 0, 0, @EventId, ProjectId,
ParticipantName, GroupName, CONVERT(varchar(32), FinalScore), GroupRank, 0, 0, GETDATE(),
N'个人花样', 0, 0, 0, SessionId, EntryId,
D, P, Q, Deduction, FinalScore, 0, 20, 1,
CONCAT('{"ruleType":"FREESTYLE_SINGLE","totalMode":"factor","formula":"D × (1 + P) × Q × M","scoreDecimals":2,"debugSeed":true,"totalScore":',
CONVERT(varchar(32), FinalScore), ',"factors":{"d":', CONVERT(varchar(32), D),
',"p":', CONVERT(varchar(32), P), ',"q":', CONVERT(varchar(32), Q),
',"m":', CONVERT(varchar(32), CAST(1 - Deduction AS decimal(18,4))), '}}')
FROM #Seed;
INSERT dbo.EventResultVersion (
Id, EventResultId, EventId, SessionEntryId, ResultVersion,
DifficultyScore, PerformanceScore, RequiredScore, DeductionScore, TotalScore, Rank,
IsDisqualified, ResultStatus, SourceType, ScoreRuleId, RuleVersion, CalculationJson,
Remark, DeleteMark, CreatedUserId, CreatedTime
)
SELECT VersionId, ResultId, @EventId, EntryId, 1,
D, P, Q, Deduction, FinalScore, GroupRank,
0, 20, 0, ScoreRuleId, RuleVersion,
CONCAT('{"ruleType":"FREESTYLE_SINGLE","totalMode":"factor","formula":"D × (1 + P) × Q × M","scoreDecimals":2,"debugSeed":true,"totalScore":',
CONVERT(varchar(32), FinalScore), ',"factors":{"d":', CONVERT(varchar(32), D),
',"p":', CONVERT(varchar(32), P), ',"q":', CONVERT(varchar(32), Q),
',"m":', CONVERT(varchar(32), CAST(1 - Deduction AS decimal(18,4))), '}}'),
N'仅供调试的模拟成绩', 0, 0, SYSDATETIME()
FROM #Seed;
SELECT COUNT(*) AS InsertedResults FROM #Seed;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;