Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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;
            }
        }