/// <summary> /// Constructor /// 依課程規劃表開課。 /// </summary> public CreateCoursesByProgramPlan() { if (EachClassHasProgramPlan() == false) { return; //如果有班級沒有課程規劃,停止開課。 } InitializePreloaderAndResetEvent(); Preloader.RunWorkerAsync(); SelectSemesterForm form = new SelectSemesterForm(); if (form.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } Event.WaitOne(); InitializeWorker(); Worker.RunWorkerAsync(form); }
private void Worker_DoWork(object sender, DoWorkEventArgs e) { #region DoWork SelectSemesterForm opt = e.Argument as SelectSemesterForm; Worker.ReportProgress(0, "正在進行開課..."); double totalClass = K12.Presentation.NLDPanels.Class.SelectedSource.Count; if (totalClass <= 0) { totalClass = 0; } double classCount = 0; Dictionary <string, JHCourseRecord> subjectCourseDict = new Dictionary <string, JHCourseRecord>(); foreach (JHClassRecord cla in JHClass.SelectByIDs(K12.Presentation.NLDPanels.Class.SelectedSource)) { #region 班級開課 classCount++; int gradeYear = 0; //取得班級年級 if (!cla.GradeYear.HasValue) { continue; } gradeYear = cla.GradeYear.Value; // TODO: 先寫著,之後再討論… if (gradeYear >= 7) { gradeYear -= 6; } #region 取得班級內每個學生的課程規劃表 List <JHProgramPlanRecord> programPlanList = new List <JHProgramPlanRecord>(); List <JHStudentRecord> studentsInSchool = GetInSchoolStudents(cla.Students); if (studentsInSchool.Count > 0) //班級有學生,抓學生課程規劃表 { foreach (JHStudentRecord stu in studentsInSchool) { //取得學生的課程規劃表 JHProgramPlanRecord record = PPCollection.GetProgramPlanRecord(stu); if (record != null) { if (!programPlanList.Contains(record)) { programPlanList.Add(record); } } } } else //班級沒有學生,也是要開課的! { JHProgramPlanRecord record = PPCollection.GetProgramPlanRecord(cla); if (record != null) { if (!programPlanList.Contains(record)) { programPlanList.Add(record); } } } #endregion #region 所有課程規劃表中要開的課程 Dictionary <string, K12.Data.ProgramSubject> courseDict = new Dictionary <string, K12.Data.ProgramSubject>(); foreach (JHProgramPlanRecord record in programPlanList) { foreach (K12.Data.ProgramSubject subject in record.Subjects) { if (subject.GradeYear == gradeYear && subject.Semester == opt.Semester && subject.Period.HasValue && subject.Credit.HasValue) { string key = subject.SubjectName.Trim(); if (!courseDict.ContainsKey(key)) { courseDict.Add(key, subject); } } } } #endregion //快取來源學期課程先放這 Dictionary <string, JHCourseRecord> copySourceCourses = new Dictionary <string, JHCourseRecord>(); #region 取得本學期已開的課程 Dictionary <string, JHCourseRecord> existSubjects = new Dictionary <string, JHCourseRecord>(); foreach (JHCourseRecord course in JHCourse.SelectAll()) { #region 取得複製來源學期的課程,智慧型開課需要 if (opt.CopyOptionEnabled && (opt.CopyTeacher || opt.CopyAssessmentSetup)) { if (course.SchoolYear == opt.CopySchoolYear && course.Semester == opt.CopySemester && course.RefClassID == cla.ID) { if (!copySourceCourses.ContainsKey(course.Subject)) { copySourceCourses.Add(course.Subject, course); } } } #endregion //取得本學期的課程 if (course.SchoolYear == opt.SchoolYear && course.Semester == opt.Semester && course.RefClassID == cla.ID) { if (!existSubjects.ContainsKey(course.Subject)) { existSubjects.Add(course.Subject, course); } } } #endregion #region 開課(加入新課程) List <JHCourseRecord> insertCourseList = new List <JHCourseRecord>(); foreach (string key in courseDict.Keys) { //是原來沒有的課程 if (!existSubjects.ContainsKey(key)) { K12.Data.ProgramSubject subject = courseDict[key]; JHCourseRecord newCourse = new JHCourseRecord(); newCourse.Credit = subject.Credit; newCourse.Period = subject.Period; newCourse.Domain = subject.Domain; newCourse.Name = cla.Name + " " + subject.SubjectName; newCourse.SchoolYear = opt.SchoolYear; newCourse.Semester = opt.Semester; newCourse.Subject = subject.SubjectName.Trim(); newCourse.RefClassID = cla.ID; newCourse.CalculationFlag = subject.CalcFlag ? "1" : "2"; insertCourseList.Add(newCourse); } } if (insertCourseList.Count > 0) { JHCourse.Insert(insertCourseList); } #endregion #region 重新取得本學期已開的課程(包含這次新開的課程) JHCourse.RemoveAll(); Dictionary <string, JHCourseRecord> reloadedExistSubjects = new Dictionary <string, JHCourseRecord>(); List <string> courseIDs = new List <string>(); foreach (JHCourseRecord course in JHCourse.SelectAll()) { if (course.SchoolYear == opt.SchoolYear && course.Semester == opt.Semester && course.RefClassID == cla.ID) { string key = course.Subject; if (!reloadedExistSubjects.ContainsKey(key)) { reloadedExistSubjects.Add(key, course); } courseIDs.Add(course.ID); } } #endregion #region 加入學生修課 CourseAttendCollection caCollection = new CourseAttendCollection(); foreach (JHSCAttendRecord sca in JHSCAttend.SelectByCourseIDs(courseIDs)) { if (!caCollection.ContainsKey(sca.RefCourseID)) { caCollection.Add(sca.RefCourseID, new List <JHSCAttendRecord>()); } caCollection[sca.RefCourseID].Add(sca); } List <JHSCAttendRecord> insertSCAttendList = new List <JHSCAttendRecord>(); foreach (JHStudentRecord student in GetInSchoolStudents(cla.Students)) { if (PPCollection.GetProgramPlanRecord(student) == null) { continue; } foreach (K12.Data.ProgramSubject subject in PPCollection.GetProgramPlanRecord(student).Subjects) { string key = subject.SubjectName.Trim(); if (subject.GradeYear == gradeYear && subject.Semester == opt.Semester && reloadedExistSubjects.ContainsKey(key)) { bool found = false; foreach (JHStudentRecord attendStudent in caCollection.GetAttendStudents(reloadedExistSubjects[key])) { if (attendStudent.ID == student.ID) { found = true; break; } } if (found == false) { JHSCAttendRecord newSCAttend = new JHSCAttendRecord(); newSCAttend.RefStudentID = student.ID; newSCAttend.RefCourseID = reloadedExistSubjects[key].ID; insertSCAttendList.Add(newSCAttend); } } } } if (insertSCAttendList.Count > 0) { int t1 = Environment.TickCount; JHSCAttend.Insert(insertSCAttendList); Trace.WriteLine("寫入修課記錄時間:" + (Environment.TickCount - t1).ToString()); } #endregion #region 判斷是否進行智慧型開課 if (opt.CopyOptionEnabled) { CourseInstructCollection ciCollection = new CourseInstructCollection(); CourseInstructCollection currentCICollection = new CourseInstructCollection(); List <string> copyCourseIDs = new List <string>(); foreach (JHCourseRecord course in copySourceCourses.Values) { copyCourseIDs.Add(course.ID); } foreach (JHTCInstructRecord tc in JHTCInstruct.SelectByTeacherIDAndCourseID(new string[] { }, copyCourseIDs)) { if (!ciCollection.ContainsKey(tc.RefCourseID)) { ciCollection.Add(tc.RefCourseID, new List <JHTCInstructRecord>()); } ciCollection[tc.RefCourseID].Add(tc); } foreach (JHTCInstructRecord tc in JHTCInstruct.SelectByTeacherIDAndCourseID(new string[] { }, courseIDs)) { if (!currentCICollection.ContainsKey(tc.RefCourseID)) { currentCICollection.Add(tc.RefCourseID, new List <JHTCInstructRecord>()); } currentCICollection[tc.RefCourseID].Add(tc); } List <JHTCInstructRecord> insertTCList = new List <JHTCInstructRecord>(); List <JHTCInstructRecord> updateTCList = new List <JHTCInstructRecord>(); List <JHCourseRecord> updateCourseList = new List <JHCourseRecord>(); //針對目前這個班級在開課學年度學期的所有課程 foreach (JHCourseRecord course in reloadedExistSubjects.Values) { //如果課程不存在課程規劃表中,則不處理 if (!courseDict.ContainsKey(course.Subject)) { continue; } //複製來源課程中,如果有相同科目名稱,則進行複製 if (copySourceCourses.ContainsKey(course.Subject)) { JHCourseRecord copyCourseRecord = copySourceCourses[course.Subject]; #region 自動加入授課教師 if (opt.CopyTeacher == true) { for (int i = 1; i <= 3; i++) { //取得來源課程的授課教師 JHTeacherRecord teacherRecord = ciCollection.GetTeacher(copyCourseRecord, i); if (teacherRecord != null) { //取得開課課程的授課記錄 JHTCInstructRecord tc = currentCICollection.GetInstruct(course, i); if (tc == null) { tc = new JHTCInstructRecord(); tc.RefCourseID = course.ID; tc.RefTeacherID = teacherRecord.ID; tc.Sequence = i; insertTCList.Add(tc); } else { tc.RefTeacherID = teacherRecord.ID; updateTCList.Add(tc); } } } } #endregion #region 自動加入評量設定 if (opt.CopyAssessmentSetup == true) { course.RefAssessmentSetupID = copyCourseRecord.RefAssessmentSetupID; updateCourseList.Add(course); } #endregion } } if (insertTCList.Count > 0) { JHTCInstruct.Insert(insertTCList); } if (updateTCList.Count > 0) { JHTCInstruct.Update(updateTCList); } if (updateCourseList.Count > 0) { JHCourse.Update(updateCourseList); } } #endregion #endregion //回報進度 Worker.ReportProgress((int)(classCount * 100d / totalClass), "正在進行開課..."); } #endregion }
public RetakeWithCourseList() { this.Path = "重修資料"; this.Text = "隨堂重修課程表"; this.OnClick += delegate { SelectSemesterForm form = new SelectSemesterForm(); if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK) { int schoolYear = form.SchoolYear, semester = form.Semester; AccessHelper helper = new AccessHelper(); List <StudentRecord> studentList = helper.StudentHelper.GetSelectedStudent(); #region 資料 MultiThreadBackgroundWorker <StudentRecord> dataLoader = new MultiThreadBackgroundWorker <StudentRecord>(); //dataLoader.Loading = SmartSchool.Common.MultiThreadLoading.Heavy; dataLoader.PackageSize = 125; dataLoader.DoWork += delegate(object sender, PackageDoWorkEventArgs <StudentRecord> e) { helper.StudentHelper.FillSemesterSubjectScore(true, e.Items); helper.StudentHelper.FillAttendCourse(schoolYear, semester, e.Items); }; dataLoader.ProgressChanged += delegate(object sender, ProgressChangedEventArgs e) { SmartSchool.Customization.PlugIn.Global.SetStatusBarMessage("隨堂重修課程表產生中...", e.ProgressPercentage * 70 / 100); }; dataLoader.RunWorkerCompleted += delegate(object se, RunWorkerCompletedEventArgs ex) { if (ex.Error != null) { throw ex.Error; } #region 資料抓完就生張報表出來 Workbook template = new Workbook(); Workbook workBook = new Workbook(); template.Open(new MemoryStream(Properties.Resources.隨堂重修清單), FileFormatType.Excel2003); workBook.Open(new MemoryStream(Properties.Resources.隨堂重修清單), FileFormatType.Excel2003); BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.RunWorkerCompleted += delegate { SmartSchool.Customization.PlugIn.Global.SetStatusBarMessage("隨堂重修課程表產生完成"); Common.Excel.Save("隨堂重修課程表", workBook); }; worker.ProgressChanged += delegate(object sender, ProgressChangedEventArgs e) { SmartSchool.Customization.PlugIn.Global.SetStatusBarMessage("隨堂重修課程表產生中...", e.ProgressPercentage); }; worker.DoWork += delegate { #region 產生報表 #region 填入報表 int rowIndex = 1; int count = 0, sum = studentList.Count; foreach (StudentRecord studentRec in studentList) { foreach (StudentAttendCourseRecord attendRecord in studentRec.AttendCourseList) { foreach (SemesterSubjectScoreInfo subjectScore in studentRec.SemesterSubjectScoreList) { if ((subjectScore.SchoolYear * 10 + subjectScore.Semester) < (schoolYear * 10 + semester) && subjectScore.Subject == attendRecord.Subject && subjectScore.Level == attendRecord.SubjectLevel) { #region 如果需要換頁就填入下一頁的樣版 if (rowIndex % 45 == 0) { for (int i = 0; i < 45; i++) { workBook.Worksheets[0].Cells.CopyRow(template.Worksheets[0].Cells, i, rowIndex + i); workBook.Worksheets[0].Cells.SetRowHeight(rowIndex + i, template.Worksheets[0].Cells.GetRowHeight(i)); } workBook.Worksheets[0].HPageBreaks.Add(rowIndex, 7); rowIndex++; } #endregion workBook.Worksheets[0].Cells[rowIndex, 0].PutValue(studentRec.StudentNumber); workBook.Worksheets[0].Cells[rowIndex, 1].PutValue(studentRec.RefClass == null ? "" : studentRec.RefClass.ClassName); workBook.Worksheets[0].Cells[rowIndex, 2].PutValue(studentRec.SeatNo); workBook.Worksheets[0].Cells[rowIndex, 3].PutValue(studentRec.StudentName); workBook.Worksheets[0].Cells[rowIndex, 4].PutValue(attendRecord.CourseName); workBook.Worksheets[0].Cells[rowIndex, 5].PutValue(subjectScore.SchoolYear); workBook.Worksheets[0].Cells[rowIndex, 6].PutValue(subjectScore.Semester); rowIndex++; } } } worker.ReportProgress(70 + count * 30 / sum); } #endregion #endregion }; worker.RunWorkerAsync(); #endregion }; dataLoader.RunWorkerAsync(studentList); #endregion } }; }