个人花样计算逻辑调整

This commit is contained in:
马梓彭 2026-10-08 15:55:02 +08:00
parent efa941bf9e
commit f61d86550d
2 changed files with 27 additions and 12 deletions

View File

@ -161,7 +161,7 @@ public class EntryAggregateResult
/// <summary> /// <summary>
/// 花样赛的扣分因子 M = max(0, 1 - 最终扣分合计)。 /// 花样赛的扣分因子 M = max(0, 1 - 最终扣分合计)。
/// 含表现裁判失误项的规则会先取表现裁判失误平均数,再加主裁失误数并取整,最后与主裁其他扣分合并。 /// 含表现裁判失误项的规则会将所有表现裁判与主裁的失误次数一起平均,四舍五入取整数后换算,最后与主裁其他扣分合并。
/// </summary> /// </summary>
public decimal DeductionFactor { get; set; } = 1m; public decimal DeductionFactor { get; set; } = 1m;
@ -181,7 +181,7 @@ public class EntryAggregateResult
public record EntryRawFactors(decimal D, decimal P, decimal Q, decimal M); public record EntryRawFactors(decimal D, decimal P, decimal Q, decimal M);
/// <summary> /// <summary>
/// 花样赛表现裁判失误平均、主裁失误合并及扣分换算明细 /// 花样赛所有表现裁判与主裁失误平均及扣分换算明细
/// </summary> /// </summary>
public class EntryFailureAggregation public class EntryFailureAggregation
{ {
@ -201,7 +201,12 @@ public class EntryFailureAggregation
public int JudgeCount { get; set; } public int JudgeCount { get; set; }
/// <summary> /// <summary>
/// 兼容历史快照的字段;新快照表示“表现裁判平均失误数 + 主裁失误数”的未取整结果 /// 参与最终失误平均的裁判总人数(表现裁判 + 主裁)
/// </summary>
public int TotalJudgeCount { get; set; }
/// <summary>
/// 兼容历史快照的字段;新快照表示所有参与裁判的未取整平均失误数
/// </summary> /// </summary>
public decimal AverageFailureCount { get; set; } public decimal AverageFailureCount { get; set; }
@ -211,10 +216,15 @@ public class EntryFailureAggregation
public decimal PerformanceAverageFailureCount { get; set; } public decimal PerformanceAverageFailureCount { get; set; }
/// <summary> /// <summary>
/// 表现裁判平均失误次数与主裁失误次数之和,尚未取整 /// 所有表现裁判与主裁失误次数之和,尚未求平均
/// </summary> /// </summary>
public decimal CombinedFailureCount { get; set; } public decimal CombinedFailureCount { get; set; }
/// <summary>
/// 所有表现裁判与主裁按实际人数求得的未取整平均失误数
/// </summary>
public decimal FinalAverageFailureCount { get; set; }
/// <summary> /// <summary>
/// 四舍五入后用于阶梯扣分的失误次数 /// 四舍五入后用于阶梯扣分的失误次数
/// </summary> /// </summary>

View File

@ -7,7 +7,7 @@ namespace YD_Event.Application.Scoring;
/// 规定赛:T1=3 名创意编排裁判创意分的平均值,T2=3 名完成质量裁判完成分的平均值, /// 规定赛:T1=3 名创意编排裁判创意分的平均值,T2=3 名完成质量裁判完成分的平均值,
/// T3=主裁违例扣分(每项扣 5 分)合计,总分=T1+T2-T3,均四舍五入保留两位小数。 /// T3=主裁违例扣分(每项扣 5 分)合计,总分=T1+T2-T3,均四舍五入保留两位小数。
/// 花样赛:各难度裁判类型先聚合再按难度除数合并为 D,表现裁判平均分乘系数得 P(个人/车轮 0.05、交互绳 0.033), /// 花样赛:各难度裁判类型先聚合再按难度除数合并为 D,表现裁判平均分乘系数得 P(个人/车轮 0.05、交互绳 0.033),
/// 规定元素缺失数换算为 Q;扣分中的失误先取表现裁判平均数,再加主裁失误数,取整后换算,并加上主裁其他扣分, /// 规定元素缺失数换算为 Q;扣分中的失误按所有表现裁判与主裁的实际人数求平均,取整后换算,并加上主裁其他扣分,
/// 得到 M = max(0, 1 - 扣分),总分 = D × (1 + P) × Q × M(交互绳不计 Q)。 /// 得到 M = max(0, 1 - 扣分),总分 = D × (1 + P) × Q × M(交互绳不计 Q)。
/// 排名:总分高者在前,总分相同按规则配置的比较字段依次比较,全部相同则并列,其后名次按 N+M 规则顺延。 /// 排名:总分高者在前,总分相同按规则配置的比较字段依次比较,全部相同则并列,其后名次按 N+M 规则顺延。
/// </summary> /// </summary>
@ -61,7 +61,7 @@ public static class EntryResultCalculationService
total += role.Sign * symbol.Value; total += role.Sign * symbol.Value;
} }
// 表现裁判失误先求平均,再与主裁失误合计后计算阶梯扣分;其他扣分保持原值。 // 所有表现裁判与主裁的失误按实际人数求平均后计算阶梯扣分;其他扣分保持原值。
ApplyCombinedFailureDeduction(config, result, sheets, scoreDetails, ruleItems, scope); ApplyCombinedFailureDeduction(config, result, sheets, scoreDetails, ruleItems, scope);
result.TotalScore = config.IsFactorTotal ? ApplyFactorTotal(config, result) : config.Round(total); result.TotalScore = config.IsFactorTotal ? ApplyFactorTotal(config, result) : config.Round(total);
@ -78,7 +78,7 @@ public static class EntryResultCalculationService
} }
/// <summary> /// <summary>
/// 合并表现裁判与主裁记录的失误次数,并替换扣分因子中的失误部分。 /// 对所有表现裁判与主裁记录的失误次数求平均,并替换扣分因子中的失误部分。
/// 以评分项是否同时存在 P/FAILURE_COUNT 和 T/T_FAILURE 作为启用条件,规定赛等不含这些评分项的规则不受影响。 /// 以评分项是否同时存在 P/FAILURE_COUNT 和 T/T_FAILURE 作为启用条件,规定赛等不含这些评分项的规则不受影响。
/// </summary> /// </summary>
private static void ApplyCombinedFailureDeduction(ScoreRuleConfig config, EntryAggregateResult result, private static void ApplyCombinedFailureDeduction(ScoreRuleConfig config, EntryAggregateResult result,
@ -132,8 +132,10 @@ public static class EntryResultCalculationService
var chiefCount = FailureCount(chiefSheet.Id, ChiefFailureItemCode); var chiefCount = FailureCount(chiefSheet.Id, ChiefFailureItemCode);
var performanceJudgeCount = performanceCounts.Count; var performanceJudgeCount = performanceCounts.Count;
var performanceAverageCount = performanceCounts.Average(); var performanceAverageCount = performanceCounts.Average();
var combinedCount = performanceAverageCount + chiefCount; var totalJudgeCount = performanceJudgeCount + 1;
var roundedCount = (int)Math.Round(combinedCount, 0, MidpointRounding.AwayFromZero); var combinedCount = performanceCounts.Sum() + chiefCount;
var averageCount = combinedCount / totalJudgeCount;
var roundedCount = (int)Math.Round(averageCount, 0, MidpointRounding.AwayFromZero);
var chiefDefinition = ScoreSheetCalculationService.CreateDefinition(chiefFailureItem, scope); var chiefDefinition = ScoreSheetCalculationService.CreateDefinition(chiefFailureItem, scope);
var steps = chiefDefinition.StepDeductions; var steps = chiefDefinition.StepDeductions;
@ -157,10 +159,11 @@ public static class EntryResultCalculationService
PerformanceFailureCounts = performanceCounts, PerformanceFailureCounts = performanceCounts,
ChiefFailureCount = chiefCount, ChiefFailureCount = chiefCount,
JudgeCount = performanceJudgeCount, JudgeCount = performanceJudgeCount,
TotalJudgeCount = totalJudgeCount,
PerformanceAverageFailureCount = performanceAverageCount, PerformanceAverageFailureCount = performanceAverageCount,
CombinedFailureCount = combinedCount, CombinedFailureCount = combinedCount,
// 保留历史字段以兼容已有计算快照;新快照记录合并后的未取整失误数。 AverageFailureCount = averageCount,
AverageFailureCount = combinedCount, FinalAverageFailureCount = averageCount,
RoundedFailureCount = roundedCount, RoundedFailureCount = roundedCount,
OriginalChiefFailureDeduction = originalChiefFailureDeduction, OriginalChiefFailureDeduction = originalChiefFailureDeduction,
FailureDeduction = failureDeduction, FailureDeduction = failureDeduction,
@ -315,7 +318,7 @@ public static class EntryResultCalculationService
totalMode = config.TotalMode, totalMode = config.TotalMode,
formula = result.Formula, formula = result.Formula,
scoreDecimals = config.ScoreDecimals, scoreDecimals = config.ScoreDecimals,
calculationVersion = "54-69-70-71-v2", calculationVersion = "54-69-70-71-79-v1",
rawFactors = result.RawFactors, rawFactors = result.RawFactors,
totalScore = result.TotalScore, totalScore = result.TotalScore,
isDisqualified = result.IsDisqualified, isDisqualified = result.IsDisqualified,
@ -334,9 +337,11 @@ public static class EntryResultCalculationService
performanceFailureCounts = result.FailureAggregation.PerformanceFailureCounts, performanceFailureCounts = result.FailureAggregation.PerformanceFailureCounts,
chiefFailureCount = result.FailureAggregation.ChiefFailureCount, chiefFailureCount = result.FailureAggregation.ChiefFailureCount,
judgeCount = result.FailureAggregation.JudgeCount, judgeCount = result.FailureAggregation.JudgeCount,
totalJudgeCount = result.FailureAggregation.TotalJudgeCount,
averageFailureCount = result.FailureAggregation.AverageFailureCount, averageFailureCount = result.FailureAggregation.AverageFailureCount,
performanceAverageFailureCount = result.FailureAggregation.PerformanceAverageFailureCount, performanceAverageFailureCount = result.FailureAggregation.PerformanceAverageFailureCount,
combinedFailureCount = result.FailureAggregation.CombinedFailureCount, combinedFailureCount = result.FailureAggregation.CombinedFailureCount,
finalAverageFailureCount = result.FailureAggregation.FinalAverageFailureCount,
roundedFailureCount = result.FailureAggregation.RoundedFailureCount, roundedFailureCount = result.FailureAggregation.RoundedFailureCount,
originalChiefFailureDeduction = result.FailureAggregation.OriginalChiefFailureDeduction, originalChiefFailureDeduction = result.FailureAggregation.OriginalChiefFailureDeduction,
failureDeduction = result.FailureAggregation.FailureDeduction, failureDeduction = result.FailureAggregation.FailureDeduction,