YD_Event.Web/scripts/dev/seed-event-59-results.sql

101 lines
5.5 KiB
MySQL
Raw Normal View History

-- 仅为测试库中的赛事“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;