private void Worker_DoWork(object sender, DoWorkEventArgs e) { _worker.ReportProgress(0, "開始列印 五育獎報表..."); _worker.ReportProgress(20, "取得本學期開設的班級課程..."); // 本學期 班級開設的 課程清單 _courseList = K12.Data.Course.SelectByClass(int.Parse(_school_year), int.Parse(_semester), _classList); // 課程ID List List <string> courseIDList = new List <string>(); foreach (K12.Data.CourseRecord cr in _courseList) { courseIDList.Add(cr.ID); } _worker.ReportProgress(40, "取得本學期科目成績..."); // 取得學生清單(依班級) _studentList = K12.Data.Student.SelectByClasses(_classList); // 學生ID List List <string> stuIDList = new List <string>(); //整理學生清單(依照班級ID 分類) foreach (K12.Data.StudentRecord sr in _studentList) { // 若非一般生 不列入排名學生清單 if (sr.Status != K12.Data.StudentRecord.StudentStatus.一般) { continue; } if (!_studentDict.ContainsKey(sr.Class.ID)) { _studentDict.Add(sr.Class.ID, new List <K12.Data.StudentRecord>()); _studentDict[sr.Class.ID].Add(sr); } else { _studentDict[sr.Class.ID].Add(sr); } stuIDList.Add(sr.ID); } // 排序(依照座號) foreach (string classID in _studentDict.Keys) { _studentDict[classID].Sort((x, y) => { return(x.SeatNo.HasValue ? x.SeatNo.Value.CompareTo(y.SeatNo) : -1); }); } // 取得 這群學生本學期 評量成績 _subjectScoreList = K12.Data.SemesterScore.SelectBySchoolYearAndSemester(stuIDList, int.Parse(_school_year), int.Parse(_semester)); // 整理學期科目成績 foreach (K12.Data.SemesterScoreRecord semesterRecord in _subjectScoreList) { if (semesterRecord.Subjects.Keys.Count > 0) { foreach (string subject in semesterRecord.Subjects.Keys) { // 只有在本次選擇的科目才納入 if (!_selsubjectList.Contains(subject)) { continue; } if (!_subjectScoreDict.ContainsKey(semesterRecord.RefStudentID)) { _subjectScoreDict.Add(semesterRecord.RefStudentID, new List <K12.Data.SubjectScore>()); _subjectScoreDict[semesterRecord.RefStudentID].Add(semesterRecord.Subjects[subject]); } else { _subjectScoreDict[semesterRecord.RefStudentID].Add(semesterRecord.Subjects[subject]); } } } } _worker.ReportProgress(60, "成績排序中..."); int progress = 100 / (_subjectScoreDict.Keys.Count != 0 ? _subjectScoreDict.Keys.Count : 100); int studentCount = 0; foreach (string stuID in _subjectScoreDict.Keys) { if (!_awardScoreDict.ContainsKey(stuID)) { _awardScoreDict.Add(stuID, new List <AwardScore>()); foreach (K12.Data.SubjectScore subjectRecord in _subjectScoreDict[stuID]) { AwardScore awardScore; awardScore = _awardScoreDict[stuID].Find(awardscore => awardscore.ScoreType == "學期總成績"); // 舊的沒有的話, 第一筆 新增 if (awardScore == null) { awardScore = new AwardScore(); decimal?credit = subjectRecord.Credit; awardScore.ScoreType = "學期總成績"; awardScore.Score = subjectRecord.Score * credit; _awardScoreDict[stuID].Add(awardScore); } // 已經有成績的話 繼續 加總 else { decimal?credit = subjectRecord.Credit; awardScore.Score += subjectRecord.Score * credit; } } } studentCount++; _worker.ReportProgress(progress * studentCount, "計算總成績中..."); } _worker.ReportProgress(70, "填寫報表..."); // 取得 系統預設的樣板 Workbook wb = new Workbook(new MemoryStream(Properties.Resources.小五育獎樣板)); #region 填表 FillProgressScoreExcelColunm(wb); #endregion //// 把當作樣板的 第一張 移掉 wb.Worksheets.RemoveAt("樣板"); wb.Worksheets.RemoveAt("理想產生結果"); e.Result = wb; _worker.ReportProgress(100, "五育獎報表列印完成。"); }
private void Worker_DoWork(object sender, DoWorkEventArgs e) { _worker.ReportProgress(0, "開始列印 進步獎報表..."); _worker.ReportProgress(20, "取得本學期開設的班級課程..."); // 本學期 班級開設的 課程清單 _courseList = K12.Data.Course.SelectByClass(int.Parse(_school_year), int.Parse(_semester), _classList); // 課程ID List List <string> courseIDList = new List <string>(); foreach (K12.Data.CourseRecord cr in _courseList) { courseIDList.Add(cr.ID); AssessmentSetupDict.Add(cr.ID, cr.AssessmentSetup); } _worker.ReportProgress(40, "取得本學期評量成績..."); // 取得學生清單(依班級) _studentList = K12.Data.Student.SelectByClasses(_classList); // 學生ID List List <string> stuIDList = new List <string>(); //整理學生清單(依照班級ID 分類) foreach (K12.Data.StudentRecord sr in _studentList) { // 若非一般生 不列入排名學生清單 if (sr.Status != K12.Data.StudentRecord.StudentStatus.一般) { continue; } if (!_studentDict.ContainsKey(sr.Class.ID)) { _studentDict.Add(sr.Class.ID, new List <K12.Data.StudentRecord>()); _studentDict[sr.Class.ID].Add(sr); } else { _studentDict[sr.Class.ID].Add(sr); } stuIDList.Add(sr.ID); } // 排序(依照座號) foreach (string classID in _studentDict.Keys) { _studentDict[classID].Sort((x, y) => { return(x.SeatNo.HasValue ? x.SeatNo.Value.CompareTo(y.SeatNo) : -1); }); } // 取得評量成績 _sceList = K12.Data.SCETake.SelectByStudentAndCourse(stuIDList, courseIDList); // 整理評量成績 foreach (K12.Data.SCETakeRecord scetRecord in _sceList) { // 只有在本次選擇的科目才納入 if (!_selsubjectList.Contains(scetRecord.Course.Subject)) { continue; } if (!_sceDict.ContainsKey(scetRecord.RefStudentID)) { _sceDict.Add(scetRecord.RefStudentID, new List <K12.Data.SCETakeRecord>()); _sceDict[scetRecord.RefStudentID].Add(scetRecord); } else { _sceDict[scetRecord.RefStudentID].Add(scetRecord); } } _worker.ReportProgress(60, "成績排序中..."); int progress = 100 / (_sceDict.Keys.Count != 0 ? _sceDict.Keys.Count:100); int studentCount = 0; foreach (string stuID in _sceDict.Keys) { if (!_awardScoreDict.ContainsKey(stuID)) { _awardScoreDict.Add(stuID, new List <AwardScore>()); // 2019/06/12 穎驊筆記, 這邊的程式碼還可以再優化, 待目前城版本測試後 ,再調整 foreach (K12.Data.SCETakeRecord scetRecord in _sceDict[stuID]) { // 第一次評量成績 if (scetRecord.Exam.Name == _examName1) { AwardScore awardScore; awardScore = _awardScoreDict[stuID].Find(awardscore => awardscore.ScoreType == _examName1 + "總成績"); // 舊的沒有的話, 第一筆 新增 if (awardScore == null) { awardScore = new AwardScore(); decimal?credit = scetRecord.Course.Credit; // 效率太慢,另外整理 //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup; K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID)? AssessmentSetupDict[scetRecord.RefCourseID] :null; if (assessmentsetup == null) { continue; } // 定期的比例 int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup)); // 平時的比例 (兩者相加 為100) int assignmentScoreRatio = 100 - scoreRatio; awardScore.ScoreType = _examName1 + "總成績"; if (awardScore.Score.HasValue) { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score += totalScore; } else { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score = totalScore; } _awardScoreDict[stuID].Add(awardScore); } // 已經有成績的話 繼續 加總 else { decimal?credit = scetRecord.Course.Credit; // 效率太慢,另外整理 //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup; K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID) ? AssessmentSetupDict[scetRecord.RefCourseID] : null; if (assessmentsetup == null) { continue; } // 定期的比例 int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup)); // 平時的比例 (兩者相加 為100) int assignmentScoreRatio = 100 - scoreRatio; if (awardScore.Score.HasValue) { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score += totalScore; } else { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score = totalScore; } } } // 第二次評量成績 if (scetRecord.Exam.Name == _examName2) { AwardScore awardScore; awardScore = _awardScoreDict[stuID].Find(awardscore => awardscore.ScoreType == _examName2 + "總成績"); // 舊的沒有的話, 第一筆 新增 if (awardScore == null) { awardScore = new AwardScore(); decimal?credit = scetRecord.Course.Credit; // 效率太慢,另外整理 //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup; K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID) ? AssessmentSetupDict[scetRecord.RefCourseID] : null; if (assessmentsetup == null) { continue; } // 定期的比例 int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup)); // 平時的比例 (兩者相加 為100) int assignmentScoreRatio = 100 - scoreRatio; awardScore.ScoreType = _examName2 + "總成績"; if (awardScore.Score.HasValue) { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score += totalScore; } else { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score = totalScore; } _awardScoreDict[stuID].Add(awardScore); } // 已經有成績的話 繼續 加總 else { decimal?credit = scetRecord.Course.Credit; // 效率太慢,另外整理 //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup; K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID) ? AssessmentSetupDict[scetRecord.RefCourseID] : null; if (assessmentsetup == null) { continue; } // 定期的比例 int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup)); // 平時的比例 (兩者相加 為100) int assignmentScoreRatio = 100 - scoreRatio; if (awardScore.Score.HasValue) { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score += totalScore; } else { decimal?score; decimal?assignmentScore; if (isOriScore) { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null; } else { score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null; assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null; } decimal?totalScore = new decimal(); if (score != null) { totalScore += score; } if (assignmentScore != null) { totalScore += assignmentScore; } awardScore.Score = totalScore; } } } } } studentCount++; _worker.ReportProgress(progress * studentCount, "計算總成績中..."); } // 上面 加權計算完 第一次 、 第二次考試成績後 (除回定期平時的比例100) , 這邊來算 計算進步分數 foreach (string studentID in _awardScoreDict.Keys) { decimal?score1 = new decimal(); decimal?score2 = new decimal();; foreach (AwardScore awardScore in _awardScoreDict[studentID]) { if (awardScore.ScoreType == _examName1 + "總成績") { awardScore.Score = awardScore.Score / 100; score1 = awardScore.Score; } if (awardScore.ScoreType == _examName2 + "總成績") { awardScore.Score = awardScore.Score / 100; score2 = awardScore.Score; } } // 假如兩次評量都有分數 進步分數為 第二次的總分 減掉 第一次的總分 if (score1.HasValue && score2.HasValue) { AwardScore awardScore = new AwardScore(); awardScore.ScoreType = "進步分數"; awardScore.Score = score2 - score1; _awardScoreDict[studentID].Add(awardScore); } } _worker.ReportProgress(70, "填寫報表..."); // 取得 系統預設的樣板 Workbook wb = new Workbook(new MemoryStream(Properties.Resources.小進步獎樣板)); #region 填表 FillProgressScoreExcelColunm(wb); #endregion //// 把當作樣板的 第一張 移掉 wb.Worksheets.RemoveAt("樣板"); wb.Worksheets.RemoveAt("理想產生結果"); e.Result = wb; _worker.ReportProgress(100, "進步獎報表列印完成。"); }