Automated Task

结算评委分

Type When entry is reviewed

Created 7/18/2024, 4:23:22 AM

Updated 7/25/2024, 7:31:01 AM

Description 收集并结算评委分。

Code
1
using Microsoft.Extensions.Logging;
2
using Microsoft.Extensions.DependencyInjection;
3
using PhiZoneApi.Models;
4
using PhiZoneApi.Interfaces;
5
using System;
6
using System.Linq;
7
using System.Globalization;
8

9
var target = (ValueTuple<EventResource, int>)Target;
10
var resource = target.Item1;
11
const int reviewerCount = 20;
12
await using (var scope = ServiceProvider.CreateAsyncScope())
13
{
14
    var eventTeamRepository = scope.ServiceProvider.GetRequiredService<IEventTeamRepository>();
15
    var eventResourceRepository = scope.ServiceProvider.GetRequiredService<IEventResourceRepository>();
16
    var leaderboardService = scope.ServiceProvider.GetRequiredService<ILeaderboardService>();
17
    var eventTeam = await eventTeamRepository.GetEventTeamAsync(resource.TeamId!.Value);
18
    var entries = await eventResourceRepository.GetEventResourcesAsync(predicate: e => e.TeamId == resource.TeamId);
19
    foreach (var entry in entries)
20
    {
21
        while (entry.Reserved.Count < 14 + reviewerCount)
22
        {
23
            entry.Reserved.Add(string.Empty);
24
        }
25

26
        var reviewerScores = Enumerable.Range(14, reviewerCount)
27
            .Select(i => entry.Reserved[i])
28
            .Where(e => !string.IsNullOrWhiteSpace(e) && double.TryParse(e, out var f) && f > 0)
29
            .Select(e => e!)
30
            .ToList();
31
        var reviewerAverage = reviewerScores.Count > 0 ? Math.Round(reviewerScores.Average(double.Parse), 2) : 0;
32
        entry.Reserved[1] = reviewerAverage.ToString(CultureInfo.InvariantCulture);
33
        var scores = Enumerable.Range(1, 3)
34
            .Select(i => entry.Reserved[i])
35
            .Select(e =>
36
            {
37
                if (!string.IsNullOrWhiteSpace(e) && double.TryParse(e, out var result)) return (double?)result;
38
                return null;
39
            })
40
            .ToList();
41
        var total = Math.Round((scores[0] ?? 0) * ((scores[2] ?? 0) + 100) / 100 + (scores[1] ?? 2.5) * 3, 2);
42
        entry.Reserved[0] = total.ToString(CultureInfo.InvariantCulture);
43
        if (eventTeam.IsUnveiled)
44
        {
45
            entry.Score = total;
46
        }
47

48
        await eventResourceRepository.UpdateEventResourceAsync(entry);
49
    }
50

51
    while (eventTeam.Reserved.Count < 14 + reviewerCount)
52
    {
53
        eventTeam.Reserved.Add(string.Empty);
54
    }
55

56
    for (var i = 0; i < reviewerCount; i++)
57
    {
58
        var index = i + 14;
59
        var scores = entries.Select(e => e.Reserved[index])
60
            .Where(e => !string.IsNullOrWhiteSpace(e) && double.TryParse(e, out var f) && f > 0)
61
            .Select(e => e!)
62
            .ToList();
63
        eventTeam.Reserved[index] =
64
            scores.Count > 0 ? Math.Round(scores.Average(double.Parse), 2).ToString(CultureInfo.InvariantCulture) : "0";
65
    }
66

67
    for (var i = 1; i <= 3; i++)
68
    {
69
        var entryScores = entries.Select(e => e.Reserved[i])
70
            .Where(e => !string.IsNullOrWhiteSpace(e) && double.TryParse(e, out _))
71
            .Select(e => e!)
72
            .ToList();
73
        eventTeam.Reserved[i] = entryScores.Count > 0
74
            ? Math.Round(entryScores.Average(double.Parse), 2).ToString(CultureInfo.InvariantCulture)
75
            : "0";
76
    }
77
    var teamScores = Enumerable.Range(1, 3)
78
        .Select(i => eventTeam.Reserved[i])
79
        .Select(e =>
80
        {
81
            if (!string.IsNullOrWhiteSpace(e) && double.TryParse(e, out var result)) return (double?)result;
82
            return null;
83
        })
84
        .ToList();
85
    var teamTotal = Math.Round((teamScores[0] ?? 0) * ((teamScores[2] ?? 0) + 100) / 100 + (teamScores[1] ?? 2.5) * 3, 2);
86
    eventTeam.Reserved[0] = teamTotal.ToString(CultureInfo.InvariantCulture);
87
    if (eventTeam.IsUnveiled)
88
    {
89
        eventTeam.Score = teamTotal;
90
    }
91

92
    await eventTeamRepository.UpdateEventTeamAsync(eventTeam);
93
    if (eventTeam.IsUnveiled)
94
    {
95
        leaderboardService.Add(eventTeam);
96
    }
97
}