コード例 #1
0
 public void AddHeat(int HeatSheetEventID)
 {
     Heat heat = new Heat();
     heat.HeatNumber = 0;
     heat.HeatSheetEventID = HeatSheetEventID;
     Ctx.HeatManager.HeatSave(heat);
 }
コード例 #2
0
        public void SeedHeatSheetEvent(int HeatSheetEventID, List<int> SwimmerTeamSeasonIDs)
        {
            //Get Stroke to determine whether it's a relay or not
            Stroke stroke = Ctx.StrokeManager.StrokeGetByHeatSheetEventID(HeatSheetEventID);
            bool IsRelay = stroke.IsRelay;

            //Get dictionary of swimmers grouped by teamSeasonID(Key), swimmer list is sorted by lowest (fastest) seed time first, except swimmers with O seed time are last
            Dictionary<int, List<Result>> teamResults = new Dictionary<int, List<Result>>();
            HeatSheetTeamCollection heatSheetTeams = Ctx.HeatSheetTeamManager.HeatSheetTeamGetAllByHeatSheetEventID(HeatSheetEventID);

            //TODO: Determine How to persist the SeedTimeType (HeatSheetTeam? SwimMeetTeam?) default to most recent for now
            SwimomaticBusinessManager.SeedTimeType seedTimeType = SwimomaticBusinessManager.SeedTimeType.MostRecent;
            if (heatSheetTeams.Count > 0)
            {
                teamResults = GetTeamResults(HeatSheetEventID, SwimmerTeamSeasonIDs, seedTimeType);
            }
            else
            {
                //if there are no HeatSheetTeams, there was a problem creating the heat sheet
                throw new Exception("No Teams have been assigned to the Heat Sheet");
            }

            //Get dictionary of currently Available Lanes grouped by teamID(Key), for any existing heats
            Dictionary<int, List<AvailableLane>> teamAvailableLanes = GetTeamAvailableLanes(HeatSheetEventID, heatSheetTeams);

            //Determine if additional new heats are needed and create them if necessary
            int heatsNeededForThisTeam = 0;
            int totalHeatsNeeded = 0;
            HeatSheetTeam heatSheetTeam = null;
            if (IsRelay) //If the event is an Individual event, the number of needed heats is calculated differently from a relay
            {
                foreach (int TeamSeasonID in teamResults.Keys)
                {
                    //if the number of realy teams (4 swimmers) for this team exceeds the number of available lanes for this team...
                    if (teamResults[TeamSeasonID].Count / 4 > teamAvailableLanes[TeamSeasonID].Count)
                    {
                        heatSheetTeam = (HeatSheetTeam)heatSheetTeams.Where(h => h.TeamSeasonID == TeamSeasonID).First();

                        //heats needed for the current team = number of relay teams (4 swimmers) divided by available lanes, + 1 more if there is any remainder
                        heatsNeededForThisTeam = ((teamResults[TeamSeasonID].Count / 4) % heatSheetTeam.LaneList.Count == 0) ? (teamResults[TeamSeasonID].Count / 4) / heatSheetTeam.LaneList.Count : ((teamResults[TeamSeasonID].Count / 4) / heatSheetTeam.LaneList.Count) + 1;
                    }
                }
            }
            else
            {
                foreach (int TeamSeasonID in teamResults.Keys)
                {
                    //if the number of swimmers for this team exceeds the number of available lanes for this team...
                    if (teamResults[TeamSeasonID].Count > teamAvailableLanes[TeamSeasonID].Count)
                    {
                        heatSheetTeam = (HeatSheetTeam)heatSheetTeams.Where(h => h.TeamSeasonID == TeamSeasonID).First();

                        //heats needed for the current team = number of swimmers divided by available lanes, + 1 more if there is any remainder
                        heatsNeededForThisTeam = (teamResults[TeamSeasonID].Count % heatSheetTeam.LaneList.Count == 0) ? teamResults[TeamSeasonID].Count / heatSheetTeam.LaneList.Count : (teamResults[TeamSeasonID].Count / heatSheetTeam.LaneList.Count) + 1;
                    }
                }
            }
            totalHeatsNeeded = Math.Max(totalHeatsNeeded, heatsNeededForThisTeam);
            Heat ht;
            for (int i = 0; i < totalHeatsNeeded; i++)
            {
                ht = new Heat();
                ht.HeatSheetEventID = HeatSheetEventID;
                Ctx.HeatManager.HeatSave(ht);
            }

            //Finally, assign swimmers to heats

            //first, refresh Available Lanes now that new heats may have been added
            teamAvailableLanes = GetTeamAvailableLanes(HeatSheetEventID, heatSheetTeams);
            List<AvailableLane> availableLanes;
            int j = 0;
            if (IsRelay)
            {
                int leg = 0;
                List<int> swimmerTeamSeasonIDs = new List<int>();
                List<List<int>> relayTeams = null;
                foreach (int TeamID in teamResults.Keys)
                {
                    leg = 0;
                    relayTeams = new List<List<int>>();
                    foreach (Result r in teamResults[TeamID])
                    {
                        swimmerTeamSeasonIDs.Add(r.SwimmerTeamSeasonID);
                        leg++;
                        //add 4 swimmers to each swimmerIDs list then add that list to the relayTeams list
                        //if there are less than an even 4 swimmers at the end of the list, they get left off (input validation should require even groups of 4 for seeding relays)
                        //TODO:input validation should require even groups of 4 swimmers for seeding relays
                        if (leg == 4)
                        {
                            relayTeams.Add(swimmerTeamSeasonIDs);
                            swimmerTeamSeasonIDs = new List<int>();
                            leg = 0;
                        }
                    }
                    availableLanes = teamAvailableLanes[TeamID];
                    j = 0;
                    foreach (List<int> swmrTSIDs in relayTeams)
                    {
                        leg = 1;
                        foreach (int swimmerTeamSeasonID in swmrTSIDs)
                        {
                            if (availableLanes.Count > j)
                            {
                                AddHeatSwimmer(availableLanes[j].HeatID, swimmerTeamSeasonID, leg, availableLanes[j].LaneNumber);
                                leg++;
                            }
                        }
                        j++;
                    }
                }
            }
            else
            {
                foreach (int TeamID in teamResults.Keys)
                {
                    j = 0;
                    availableLanes = teamAvailableLanes[TeamID];
                    foreach (Result r in teamResults[TeamID])
                    {
                        if (availableLanes.Count > j)
                        {
                            AddHeatSwimmer(availableLanes[j].HeatID, r.SwimmerTeamSeasonID, 0, availableLanes[j].LaneNumber);
                            j++;
                        }
                    }
                }
            }
        }
コード例 #3
0
 public int SaveHeat(Heat heat)
 {
     return Ctx.HeatManager.HeatSave(heat);
 }