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