public void AddEntry(SemesterEntryScoreInfo info) { if (info.GradeYear == this._grade_year) { if (!this._entries.ContainsKey(info.Entry)) { this._entries.Add(info.Entry, new ScoreData()); } ScoreData data = this._entries[info.Entry]; decimal score = info.Score; if (!((info.Score <= 100M) || this._config.AllowOver)) { score = 100M; } data.SetInfo(info.Entry, info.Semester, score); } }
void bkw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bkw = ((BackgroundWorker)sender); int schoolyear = (int)((object[])e.Argument)[0]; int semester = (int)((object[])e.Argument)[1]; AccessHelper helper = (AccessHelper)((object[])e.Argument)[2]; List <StudentRecord> selectedStudents = (List <StudentRecord>)((object[])e.Argument)[3]; bool registerSemesterHistory = (bool)((object[])e.Argument)[4]; AngelDemonComputer computer = new AngelDemonComputer(); int packageSize = 50; int packageCount = 0; List <StudentRecord> package = null; List <List <StudentRecord> > packages = new List <List <StudentRecord> >(); bkw.ReportProgress(1, null); #region 切package foreach (StudentRecord s in selectedStudents) { if (packageCount == 0) { package = new List <StudentRecord>(packageSize); packages.Add(package); packageCount = packageSize; packageSize += 50; if (packageSize > _MaxPackageSize) { packageSize = _MaxPackageSize; } } package.Add(s); packageCount--; } #endregion double maxStudents = selectedStudents.Count; if (maxStudents == 0) { maxStudents = 1; } double computedStudents = 0; bool allPass = true; List <SmartSchool.Feature.Score.AddScore.InsertInfo> insertList = new List <SmartSchool.Feature.Score.AddScore.InsertInfo>(); List <SmartSchool.Feature.Score.EditScore.UpdateInfo> updateList = new List <SmartSchool.Feature.Score.EditScore.UpdateInfo>(); XmlDocument doc = new XmlDocument(); foreach (List <StudentRecord> var in packages) { if (registerSemesterHistory) { #region 重設學期歷程 if (var.Count > 0) { helper.StudentHelper.FillField("SemesterHistory", var); List <StudentRecord> editList = new List <StudentRecord>(); #region 檢查並編及每個選取學生的學期歷程 foreach (StudentRecord stu in var) { int gyear; if (stu.RefClass != null && int.TryParse(stu.RefClass.GradeYear, out gyear)) { XmlElement semesterHistory = (XmlElement)stu.Fields["SemesterHistory"]; XmlElement historyElement = null; foreach (XmlElement history in new DSXmlHelper(semesterHistory).GetElements("History")) { int year, sems, gradeyear; if ( int.TryParse(history.GetAttribute("SchoolYear"), out year) && int.TryParse(history.GetAttribute("Semester"), out sems) && year == schoolyear && sems == semester ) { historyElement = history; } } if (historyElement == null) { historyElement = semesterHistory.OwnerDocument.CreateElement("History"); historyElement.SetAttribute("SchoolYear", "" + schoolyear); historyElement.SetAttribute("Semester", "" + semester); historyElement.SetAttribute("GradeYear", "" + gyear); semesterHistory.AppendChild(historyElement); editList.Add(stu); } else { if (historyElement.GetAttribute("GradeYear") != "" + gyear) { historyElement.SetAttribute("GradeYear", "" + gyear); editList.Add(stu); } } } } #endregion string req = "<UpdateStudentList>"; foreach (StudentRecord stu in var) { int tryParseInt; req += "<Student><Field><SemesterHistory>" + ((XmlElement)stu.Fields["SemesterHistory"]).InnerXml + "</SemesterHistory></Field><Condition><ID>" + stu.StudentID + "</ID></Condition></Student>"; } req += "</UpdateStudentList>"; DSRequest dsreq = new DSRequest(req); SmartSchool.Feature.EditStudent.Update(dsreq); } #endregion } Dictionary <StudentRecord, List <string> > errormessages = new Dictionary <StudentRecord, List <string> >(); computedStudents += var.Count; //計算德行分項成績 computer.FillDemonScore(helper, schoolyear, semester, var); //抓學生學期歷程 helper.StudentHelper.FillField("SemesterHistory", var); //抓學生學期分項成績 helper.StudentHelper.FillSemesterEntryScore(false, var); foreach (StudentRecord stu in var) { //成績年級 int? gradeYear = null; bool canCalc = true; #region 處理成績年級 XmlElement semesterHistory = (XmlElement)stu.Fields["SemesterHistory"]; if (semesterHistory == null) { LogError(stu, errormessages, "沒有學期歷程紀錄,無法判斷成績年級。"); canCalc &= false; } else { foreach (XmlElement history in new DSXmlHelper(semesterHistory).GetElements("History")) { int year, sems, gradeyear; if ( int.TryParse(history.GetAttribute("SchoolYear"), out year) && int.TryParse(history.GetAttribute("Semester"), out sems) && int.TryParse(history.GetAttribute("GradeYear"), out gradeyear) && year == schoolyear && sems == semester ) { gradeYear = gradeyear; } } if (gradeYear == null) { LogError(stu, errormessages, "學期歷程中沒有" + schoolyear + "學年度第" + semester + "學期的紀錄,無法判斷成績年級。"); canCalc &= false; } } #endregion if (canCalc) { if (stu.Fields.ContainsKey("DemonScore")) { XmlElement scoreElement = (XmlElement)stu.Fields["DemonScore"]; if (scoreElement != null) { SemesterEntryScoreInfo updateEntryScore = null; //找被更新的資料 foreach (SemesterEntryScoreInfo entryscore in stu.SemesterEntryScoreList) { if (entryscore.Entry == "德行" && entryscore.SchoolYear == schoolyear && entryscore.Semester == semester) { updateEntryScore = entryscore; } } if (updateEntryScore == null) { //產生新增的資料 XmlElement element = doc.CreateElement("SemesterEntryScore"); XmlElement entry = doc.CreateElement("Entry"); entry.SetAttribute("分項", "德行"); entry.SetAttribute("成績", scoreElement.GetAttribute("Score")); element.AppendChild(entry); insertList.Add(new SmartSchool.Feature.Score.AddScore.InsertInfo("" + stu.StudentID, "" + schoolyear, "" + semester, "" + gradeYear, "行為", element)); } else { bool lockScore = false; //沒有指定是否鎖定或鎖定為否 if (bool.TryParse(updateEntryScore.Detail.GetAttribute("鎖定"), out lockScore) == false || lockScore == false) { Dictionary <int, Dictionary <int, Dictionary <string, string> > > scoreID = (Dictionary <int, Dictionary <int, Dictionary <string, string> > >)stu.Fields["SemesterEntryScoreID"]; string id = scoreID[updateEntryScore.SchoolYear][updateEntryScore.Semester]["行為"]; XmlElement element = doc.CreateElement("SemesterEntryScore"); XmlElement entry = doc.CreateElement("Entry"); entry.SetAttribute("分項", "德行"); entry.SetAttribute("成績", scoreElement.GetAttribute("Score")); entry.SetAttribute("鎖定", "False"); element.AppendChild(entry); updateList.Add(new SmartSchool.Feature.Score.EditScore.UpdateInfo(id, "" + gradeYear, element)); } } } } } } if (errormessages.Count > 0) { allPass = false; } if (bkw.CancellationPending) { break; } else { bkw.ReportProgress((int)((computedStudents * 100.0) / maxStudents), errormessages); } } if (allPass) { e.Result = new object[] { insertList, updateList, selectedStudents } } ; else { e.Result = null; } }