/// <summary> /// 判斷是否連續八周前3。 /// 如果本週沒有前3,則次數歸零。 /// 如果本週有前三: /// a. 如果上週沒有資料,則上週次數視為 0 /// b. 如果上週的 needReset 欄位為 true,表示上周已經完成,所以上週次數視為 0 /// c. 否則: /// 1. 如果上週已經連七週三,則本週會連八週達成,所以次數為8,且 needReset 欄位為 true。 /// 2.否則,就上週的次數 + 1 /// </summary> /// <param name="wr"></param> private void checkIfTop3In8Weeks(UDT.WeeklyRank wr) { // 如果本週沒有前3 if (wr.Rank > 3) { wr.Top3InARow = 0; } else { // 找出此班級上週的排名 UDT.WeeklyRank wrLast = null; if (_dicLastWeeklyRankByClassID.ContainsKey("" + wr.RefClassID)) { wrLast = this._dicLastWeeklyRankByClassID["" + wr.RefClassID]; } // 如果上週沒有資料,或上週的 needReset 欄位為 true,則上週次數視為 0 if (wrLast == null || wrLast.NeedReset) { wr.Top3InARow = 1; return; } wr.Top3InARow = wrLast.Top3InARow + 1; // 如果上週已經連四週二,則本週會連五週達成,所以次數為5,且 needReset 欄位為 true。 if (wrLast.Top3InARow >= 7) { wr.NeedReset = true; } } }
public void Execute() { List <UDT.WeeklyRank> listInsertData = new List <UDT.WeeklyRank>(); // 1.對於每個年級 foreach (int grade in _dicAllClassByGrade.Keys) { List <UDT.WeeklyStats> weeklyStats = new List <UDT.WeeklyStats>(); // 建立分數名次清單 List <decimal> listScoreRank = new List <decimal>(); // 2.找出該年級所有班級 foreach (string classID in _dicAllClassByGrade[grade]) { // 3.找出班級週統計成績 weeklyStats.Add(this._dicWeeklyStatsByClassID[classID]); // 該年級所有統計資 listScoreRank.Add(this._dicWeeklyStatsByClassID[classID].WeekTotal); // 記錄該年級所有分數 } // 4.計算排名 // 4.0 排序分數名次清單 listScoreRank.Sort(new ScoreSort()); foreach (UDT.WeeklyStats ws in weeklyStats) { // 找出分數所對應的排名 int rank = listScoreRank.IndexOf(ws.WeekTotal) + 1; // 4.1 建立排名物件 UDT.WeeklyRank wr = this.createRankObject(ws, rank, grade); // 5. 判斷是否前5週連2 checkIfTop2In5Weeks(wr); // 6. 判斷是否連8週前三 checkIfTop3In8Weeks(wr); listInsertData.Add(wr); } } // 0.刪除學年度、學期、週次的週排行資料 List <UDT.WeeklyRank> listRank = this._access.Select <UDT.WeeklyRank>(string.Format("school_year = {0} AND semester = {1} AND week_number = {2}", this._schoolYear, this._semester, this._weekNumber)); this._access.DeletedValues(listRank); // 5.寫入資料庫 this._access.InsertValues(listInsertData); }
private UDT.WeeklyRank createRankObject(UDT.WeeklyStats ws, int rank, int grade) { UDT.WeeklyRank wr = new UDT.WeeklyRank(); wr.RefWeeklyStatsID = int.Parse(ws.UID); wr.SchoolYear = int.Parse(this._schoolYear); wr.Semester = int.Parse(this._semester); wr.RefClassID = ws.RefClassID; wr.GradeYear = grade; wr.WeekTotal = ws.WeekTotal; wr.WeekNumber = this._weekNumber; wr.CreateTime = DateTime.Now; wr.CreatedBy = this._userAccount; wr.PublicTime = DateTime.Now; wr.PublicBy = this._userAccount; wr.Rank = rank; return(wr); }