101 lines
5.5 KiB
MySQL
101 lines
5.5 KiB
MySQL
|
|
-- 仅为测试库中的赛事“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;
|