/// <summary> /// 傳入分配 /// </summary> private bool Allocation(學生選社亂數檔 ran, int NumberIndex) { //社團選社資料 VolunteerRecord vr = ran._record; XmlElement xml = XmlHelper.LoadXml(vr.Content); //每一個社團 foreach (XmlElement each in xml.SelectNodes("Club")) { int index = 0; int.TryParse(each.GetAttribute("Index"), out index); //當進行第一輪志願分配時 if (index != NumberIndex) { continue; } string clubID = each.GetAttribute("Ref_Club_ID"); string StudentID = vr.RefStudentID; //2013/4/8號 //需建立一個ClubCount字典 //覆蓋 - 把本期除了鎖定學生之社團記錄清除 //略過 - 本期的社團記錄不予更動 //1.須檢查目前系統是否有要加入的社團(例如該社團被選社後刪除) //2.目前此社團是否已額滿或目前社團人數為可加入狀態 if (!CLUBDic.ContainsKey(clubID)) { continue; } //不存在社團記錄,表示可以新增 if (!SCJLockDic.ContainsKey(StudentID)) { #region 存在社團記錄,表示可以新增 SCJoin scj = new SCJoin(); 一個社團檢查 一社團 = CLUBCheckDic[clubID]; if (!一社團.人數未滿) { if (StudentDic.ContainsKey(StudentID)) { 一名學生 一學生 = StudentDic[StudentID]; sb_Log.AppendLine(string.Format("序號「{0}」班級「{1}」學生「{2}」開始進行第「{3}」志願分配", ran._Index, 一學生.class_name, 一學生.student_name, NumberIndex.ToString())); sb_Log.AppendLine(string.Format("分配失敗原因:社團「{0}」人數已滿", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); return(false); } } if (StudentDic.ContainsKey(StudentID)) { 一名學生 一學生 = StudentDic[StudentID]; //序號「{0}」 ran._Index sb_Log.AppendLine(string.Format("序號「{0}」班級「{1}」學生「{2}」開始進行第「{3}」志願分配", ran._Index, 一學生.class_name, 一學生.student_name, NumberIndex.ToString())); //你必須是本社團科別限制之學生 //Count大於0,表示有科別限制 if (一社團.DeptList.Count > 0) { if (!一社團.DeptList.Contains(一學生.dept_name)) { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」受到科別限制「{1}」", 一社團._ClubObj.ClubName, 一學生.dept_name)); sb_Log.AppendLine(""); //本社團選社失敗 continue; } } if (一社團.男女限制 == 一學生.gender || 一社團.男女限制 == GetVolunteerData.男女.限制) { if (一學生.grade_year == "1" || 一學生.grade_year == "7" || 一學生.grade_year == "10") { if (一社團.一年級未滿) { scj.RefClubID = clubID; scj.RefStudentID = StudentID; 一社團._Now_ClubStudentCount++; 一社團._Now_GradeYear1++; sb_Log.AppendLine(string.Format("已入選社團「{0}」", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); InsertList1.Add(scj); return(true); } else { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」年級「{1}」人數已滿", 一社團._ClubObj.ClubName, 一學生.grade_year)); sb_Log.AppendLine(""); } } else if (一學生.grade_year == "2" || 一學生.grade_year == "8" || 一學生.grade_year == "11") { if (一社團.二年級未滿) { scj.RefClubID = clubID; scj.RefStudentID = StudentID; 一社團._Now_ClubStudentCount++; 一社團._Now_GradeYear2++; sb_Log.AppendLine(string.Format("已入選社團「{0}」", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); InsertList1.Add(scj); return(true); } else { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」年級「{1}」人數已滿", 一社團._ClubObj.ClubName, 一學生.grade_year)); sb_Log.AppendLine(""); } } else if (一學生.grade_year == "3" || 一學生.grade_year == "9" || 一學生.grade_year == "12") { if (一社團.年級未滿) { scj.RefClubID = clubID; scj.RefStudentID = StudentID; 一社團._Now_ClubStudentCount++; 一社團._Now_GradeYear3++; sb_Log.AppendLine(string.Format("已入選社團「{0}」", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); InsertList1.Add(scj); return(true); } else { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」年級「{1}」人數已滿", 一社團._ClubObj.ClubName, 一學生.grade_year)); sb_Log.AppendLine(""); } } else { sb_Log.AppendLine(string.Format("分配社團「{0}」失敗,未符合年級設定", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); } } else { sb_Log.AppendLine(string.Format("分配社團「{0}」失敗,未符合男女限制「{1}」", 一社團._ClubObj.ClubName, 一社團.男女限制)); sb_Log.AppendLine(""); } } #endregion } else //已存在,要判斷是覆蓋還是略過 { #region 已存在,要判斷是覆蓋還是略過 //已有社團記錄時 - 覆蓋 if (By_V.已有社團記錄時) { #region 覆蓋 SCJoin scj_del = SCJLockDic[StudentID]; if (!scj_del.Lock) { #region 未鎖定 //新增一筆資料 SCJoin scj = new SCJoin(); //因為覆蓋所以 - 列入刪除 if (!DeleteList.Contains(scj_del)) { DeleteList.Add(scj_del); } 一個社團檢查 一社團 = CLUBCheckDic[clubID]; if (!一社團.人數未滿) { if (StudentDic.ContainsKey(StudentID)) { 一名學生 一學生 = StudentDic[StudentID]; sb_Log.AppendLine(string.Format("序號「{0}」班級「{1}」學生「{2}」開始進行第「{3}」志願分配", ran._Index, 一學生.class_name, 一學生.student_name, NumberIndex.ToString())); sb_Log.AppendLine(string.Format("分配失敗原因:社團「{0}」人數已滿", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); return(false); } } if (StudentDic.ContainsKey(StudentID)) { 一名學生 一學生 = StudentDic[StudentID]; string clubName = ""; if (CLUBDic.ContainsKey(scj_del.RefClubID)) { clubName = CLUBDic[scj_del.RefClubID].ClubName; } //序號「{0}」 ran._Index sb_Log.AppendLine(string.Format("序號「{0}」班級「{1}」學生「{2}」開始進行第「{3}」志願分配", ran._Index, 一學生.class_name, 一學生.student_name, NumberIndex.ToString())); sb_Log.AppendLine(string.Format("已是社團「{0}」參與學生,因「未被鎖定」將進行重新分配", clubName)); //你必須是本社團科別限制之學生 //Count大於0,表示有科別限制 if (一社團.DeptList.Count > 0) { if (!一社團.DeptList.Contains(一學生.dept_name)) { sb_Log.AppendLine(string.Format("社團「{0}」分配失敗!原因:志願「{1}」受到科別限制「{2}」", 一社團._ClubObj.ClubName, NumberIndex, 一學生.dept_name)); sb_Log.AppendLine(""); //本社團選社失敗 continue; } } if (一社團.男女限制 == 一學生.gender || 一社團.男女限制 == GetVolunteerData.男女.限制) { if (一學生.grade_year == "1" || 一學生.grade_year == "7" || 一學生.grade_year == "10") { if (一社團.一年級未滿) { scj.RefStudentID = StudentID; scj.RefClubID = clubID; 一社團._Now_ClubStudentCount++; 一社團._Now_GradeYear1++; InsertList2.Add(scj); sb_Log.AppendLine(string.Format("已入選社團「{0}」", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); return(true); } else { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」年級「{1}」人數已滿", 一社團._ClubObj.ClubName, 一學生.grade_year)); sb_Log.AppendLine(""); } } else if (一學生.grade_year == "2" || 一學生.grade_year == "8" || 一學生.grade_year == "11") { if (一社團.二年級未滿) { scj.RefStudentID = StudentID; scj.RefClubID = clubID; 一社團._Now_ClubStudentCount++; 一社團._Now_GradeYear2++; InsertList2.Add(scj); sb_Log.AppendLine(string.Format("已入選社團「{0}」", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); return(true); } else { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」年級「{1}」人數已滿", 一社團._ClubObj.ClubName, 一學生.grade_year)); sb_Log.AppendLine(""); } } else if (一學生.grade_year == "3" || 一學生.grade_year == "9" || 一學生.grade_year == "12") { if (一社團.年級未滿) { scj.RefStudentID = StudentID; scj.RefClubID = clubID; 一社團._Now_ClubStudentCount++; 一社團._Now_GradeYear3++; sb_Log.AppendLine(string.Format("已入選社團「{0}」", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); InsertList2.Add(scj); return(true); } else { sb_Log.AppendLine(string.Format("分配失敗原因:志願「{0}」年級「{1}」人數已滿", 一社團._ClubObj.ClubName, 一學生.grade_year)); sb_Log.AppendLine(""); } } else { sb_Log.AppendLine(string.Format("分配社團「{0}」失敗,未符合年級設定", 一社團._ClubObj.ClubName)); sb_Log.AppendLine(""); } } else { sb_Log.AppendLine(string.Format("分配社團「{0}」失敗,未符合男女限制「{1}」", 一社團._ClubObj.ClubName, 一社團.男女限制)); sb_Log.AppendLine(""); } } #endregion } else { //取得社團記錄 SCJoin scj = SCJLockDic[StudentID]; string clubName = ""; if (CLUBDic.ContainsKey(scj.RefClubID)) { clubName = CLUBDic[scj_del.RefClubID].ClubName; } // 2018/03/08 羿均 同步code //2017/9/1 - 修正Bug //這是多餘的程式邏輯 - By Dylan if (StudentDic.ContainsKey(StudentID)) { 一名學生 一學生 = StudentDic[StudentID]; //序號「{0}」 ran._Index sb_Log.AppendLine(string.Format("序號「{0}」班級「{1}」學生「{2}」開始進行第「{3}」志願分配", ran._Index, 一學生.class_name, 一學生.student_name, NumberIndex.ToString())); sb_Log.AppendLine(string.Format("已是社團「{0}」鎖定學生,將不變更社團", clubName)); sb_Log.AppendLine(""); return(true); } #region 鎖定 //一個社團檢查 一社團 = CLUBCheckDic[scj_del.RefClubID]; //if (StudentDic.ContainsKey(StudentID)) //{ // 一名學生 一學生 = StudentDic[StudentID]; // if (一學生.grade_year == "1" || 一學生.grade_year == "7" || 一學生.grade_year == "10") // { // 一社團._Now_ClubStudentCount++; // 一社團._Now_GradeYear1++; // return true; // } // else if (一學生.grade_year == "2" || 一學生.grade_year == "8" || 一學生.grade_year == "11") // { // 一社團._Now_ClubStudentCount++; // 一社團._Now_GradeYear2++; // return true; // } // else if (一學生.grade_year == "3" || 一學生.grade_year == "9" || 一學生.grade_year == "12") // { // 一社團._Now_ClubStudentCount++; // 一社團._Now_GradeYear3++; // return true; // } //} #endregion } #endregion } else { //2017/9/1 - 修正Bug //這是多餘的程式邏輯 - By Dylan #region 略過 //取得社團記錄 SCJoin scj = SCJLockDic[StudentID]; string clubName = ""; if (CLUBDic.ContainsKey(scj.RefClubID)) { clubName = CLUBDic[scj.RefClubID].ClubName; } if (StudentDic.ContainsKey(StudentID)) { 一名學生 一學生 = StudentDic[StudentID]; //序號「{0}」 ran._Index sb_Log.AppendLine(string.Format("目前設定:「略過」已入選學生,序號「{0}」學生「{1}」社團「{2}」將不變更", ran._Index, 一學生.student_name, clubName)); sb_Log.AppendLine(""); return(true); //if (一學生.grade_year == "1" || 一學生.grade_year == "7" || 一學生.grade_year == "10") //{ // 一社團._Now_ClubStudentCount++; // 一社團._Now_GradeYear1++; // return true; //} //else if (一學生.grade_year == "2" || 一學生.grade_year == "8" || 一學生.grade_year == "11") //{ // 一社團._Now_ClubStudentCount++; // 一社團._Now_GradeYear2++; // return true; //} //else if (一學生.grade_year == "3" || 一學生.grade_year == "9" || 一學生.grade_year == "12") //{ // 一社團._Now_ClubStudentCount++; // 一社團._Now_GradeYear3++; // return true; //} } #endregion } #endregion } } //選社失敗 return(false); }
private int SortRandom(學生選社亂數檔 r1, 學生選社亂數檔 r2) { return(r2._Number.CompareTo(r1._Number)); }
void BGW_Save_DoWork(object sender, DoWorkEventArgs e) { BGW_Save.ReportProgress(0, "志願分配作業..."); //已有社團參與者略過或覆蓋 DeleteList = new List <SCJoin>(); InsertList1 = new List <SCJoin>(); InsertList2 = new List <SCJoin>(); //增加退社相關作業(2015/9/14) if (By_V.已有社團記錄時) //有社團記錄時,不進行退社(True覆蓋,False略過) { //進行已選學生的退社處理 foreach (DataGridViewRow row in dataGridViewX1.SelectedRows) { if (row.DataBoundItem is 社團志願分配的Row) { 社團志願分配的Row 班級 = (社團志願分配的Row)row.DataBoundItem; foreach (一名學生 一學生 in 班級._StudentDic.Values) { if (SCJLockDic.ContainsKey(一學生.student_id)) { SCJoin scj_del = SCJLockDic[一學生.student_id]; if (!scj_del.Lock) //不是鎖定的學生 { scj_del.Deleted = true; scj_del.Save(); //設定社團人數 一個社團檢查 一社團 = CLUBCheckDic[scj_del.RefClubID]; SetClubGradeYearCount(一社團, 一學生, false); } } } } } } #region 社團參與依據 //用條件進行排序的物件 List <學生選社亂數檔> RunList = new List <學生選社亂數檔>(); if (By_V.社團分配優先序) { #region 使用獎懲依據 BGW_Save.ReportProgress(10, "取得獎懲資料..."); 獎懲換算機制 m = new 獎懲換算機制(); BGW_Save.ReportProgress(20, "取得資料模型..."); Dictionary <string, int> StudentMeritDic = m.GetMerit(StudentList); BGW_Save.ReportProgress(20, "取得資料模型..."); List <社團志願分配的Row> IsRowList = new List <社團志願分配的Row>(); foreach (DataGridViewRow row in dataGridViewX1.SelectedRows) { if (row.DataBoundItem is 社團志願分配的Row) { IsRowList.Add((社團志願分配的Row)row.DataBoundItem); } } foreach (社團志願分配的Row each in IsRowList) { foreach (VolunteerRecord vol in each._Volunteer.Values) { if (StudentMeritDic.ContainsKey(vol.RefStudentID)) { 學生選社亂數檔 rr = new 學生選社亂數檔(vol, StudentMeritDic[vol.RefStudentID]); RunList.Add(rr); } } } #endregion } else { #region 使用亂數依據 BGW_Save.ReportProgress(10, "使用亂數依據..."); Random _r = new Random(); BGW_Save.ReportProgress(20, "取得資料模型..."); List <社團志願分配的Row> IsRowList = new List <社團志願分配的Row>(); foreach (DataGridViewRow row in dataGridViewX1.SelectedRows) { if (row.DataBoundItem is 社團志願分配的Row) { IsRowList.Add((社團志願分配的Row)row.DataBoundItem); } } foreach (社團志願分配的Row each in IsRowList) { foreach (VolunteerRecord vol in each._Volunteer.Values) { 學生選社亂數檔 rr = new 學生選社亂數檔(vol, _r.Next(99999)); RunList.Add(rr); } } #endregion } BGW_Save.ReportProgress(30, "資料排序作業..."); RunList.Sort(SortRandom); int _index = 1; foreach (學生選社亂數檔 rr in RunList) { rr._Index = _index; _index++; } #endregion //2016/9/7 - 略過功能不需要再一次進行人數統計 //if (!By_V.已有社團記錄時) //True為覆蓋 //{ // //要略過的話 // //要先進行資料的檢查 // SetCount(RunList); //} #region 開始分配學生社團狀態(相關狀態與學生都應該已處理) if (By_V.已有社團記錄時) { sb_Log.AppendLine("選社設定:覆蓋"); } else { sb_Log.AppendLine("選社設定:略過"); } sb_Log.AppendLine("每名學生志願數:" + By_V.學生選填志願數.ToString()); //取志願 BGW_Save.ReportProgress(45, "志願選填作業..."); for (int x = 1; x <= By_V.學生選填志願數; x++) { BGW_Save.ReportProgress(65, string.Format("志願選填作業...{0}", x)); sb_Log.AppendLine(""); sb_Log.AppendLine(string.Format("═══開始進行第「{0}」志願分配═══", x.ToString())); sb_Log.AppendLine(""); Judge(RunList, x); } #endregion //新增資料 if (By_V.已有社團記錄時) //覆蓋 { BGW_Save.ReportProgress(77, "清除學生選社..."); //刪除學生社團參與記錄 tool._A.DeletedValues(DeleteList); //新增未選社之學生 BGW_Save.ReportProgress(84, "新增選社記錄..1"); tool._A.InsertValues(InsertList1); //新增已選社之學生 BGW_Save.ReportProgress(88, "新增選社記錄..2"); tool._A.InsertValues(InsertList2); } else //略過資料 { BGW_Save.ReportProgress(85, "新增選社記錄..1"); //只新增未選社之學生 tool._A.InsertValues(InsertList1); } BGW_Save.ReportProgress(100, "選社分配完成!!"); ApplicationLog.Log("社團志願序模組", "志願分配", sb_Log.ToString()); VolunteerLog logForm = new VolunteerLog(sb_Log.ToString()); logForm.ShowDialog(); }