예제 #1
0
        public SemesterScore(JHSemesterScoreRecord record)
            : this(record.SchoolYear, record.Semester)
        {
            RawScore = record;

            foreach (SubjectScore eachSubject in RawScore.Subjects.Values)
            {
                string subjName = eachSubject.Subject.Trim();

                if (!Subject.Contains(subjName))
                {
                    Subject.Add(subjName, new SemesterSubjectScore(eachSubject));
                }
            }

            foreach (DomainScore eachDomian in RawScore.Domains.Values)
            {
                string domainName = eachDomian.Domain;

                if (!Domain.Contains(domainName))
                {
                    Domain.Add(domainName, new SemesterDomainScore(eachDomian));
                }
            }

            CourseLearnScore = RawScore.CourseLearnScore;
            LearnDomainScore = RawScore.LearnDomainScore;
        }
예제 #2
0
        private void button1_Click(object sender, EventArgs e)
        {
            JHSemesterScoreRecord record = listBox1.SelectedItem as JHSemesterScoreRecord;
            SemesterScoreEditor   editor = new SemesterScoreEditor(Student, record);

            editor.ShowDialog();
        }
        public void Add(JHSemesterScoreRecord record)
        {
            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                //if (!_config.ContainsKey(domain.Domain)) continue;

                if (!_domains.ContainsKey(domain.Domain))
                {
                    _domains.Add(domain.Domain, new DomainRow(domain.Domain));
                }

                DomainRow row = _domains[domain.Domain];

                row.Add(new SemesterData("" + record.SchoolYear, "" + record.Semester), domain);
            }

            foreach (K12.Data.SubjectScore subject in record.Subjects.Values)
            {
                //if (!_config.ContainsKey(subject.Domain)) continue;
                //if (_type == "Domain")
                //{
                //    if (!_config[subject.Domain].Contains(subject.Subject)) continue;
                //}

                if (!_domains.ContainsKey(subject.Domain))
                {
                    _domains.Add(subject.Domain, new DomainRow(subject.Domain));
                }

                DomainRow row = _domains[subject.Domain];
                row.Add(new SemesterData("" + record.SchoolYear, "" + record.Semester), subject);
            }
        }
예제 #4
0
        private void SaveLog(JHSemesterScoreRecord newRecord)
        {
            string        semester = string.Format("{0}學年度 第{1}學期", newRecord.SchoolYear, newRecord.Semester);
            StringBuilder builder  = new StringBuilder("");

            builder.Append(GetStudentInfo(_student));
            builder.Append(",新增「" + semester + "」的學期成績");

            FISCA.LogAgent.ApplicationLog.Log("成績系統.學期成績", "新增學期成績", "student", _student.ID, builder.ToString());
            //307(16號) 5550082 謝化挺,新增「97學年度 第1學期」的學期成績
        }
예제 #5
0
            /// <summary>
            /// 加入學期成績
            /// </summary>
            /// <param name="record"></param>
            public void Add(JHSemesterScoreRecord record)
            {
                if (_historyUtil.ExistBySchoolYear(record.SchoolYear, record.Semester) == false)
                {
                    return;
                }

                if (!_scores.ContainsKey(_historyUtil.SemesterData))
                {
                    _scores.Add(_historyUtil.SemesterData, record);
                }
            }
예제 #6
0
        private static JHSemesterScoreRecord GetJHSemesterScore(string studentID, SCSemsScore scsemsscore)
        {
            JHSemesterScoreRecord semsscore = scsemsscore.RawScore;

            if (semsscore == null)
            {
                semsscore = new JHSemesterScoreRecord();
                semsscore.RefStudentID = studentID;
                semsscore.SchoolYear   = scsemsscore.SchoolYear;
                semsscore.Semester     = scsemsscore.Semester;
            }

            return(semsscore);
        }
예제 #7
0
        //刪除
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (listView.SelectedItems.Count <= 0)
            {
                return;
            }
            ListViewItem item = listView.SelectedItems[0];

            string info = string.Format("{0}學年度 第{1}學期", item.SubItems[0].Text, item.SubItems[1].Text);

            if (Framework.MsgBox.Show("您確定要刪除「" + item.SubItems[0].Text + "學年度 第" + item.SubItems[1].Text + "學期」的學期成績嗎?", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                JHSemesterScoreRecord record = item.Tag as JHSemesterScoreRecord;
                JHSemesterScore.Delete(record);
                FISCA.LogAgent.ApplicationLog.Log("成績系統.學期成績", "刪除學期成績", "student", PrimaryKey, string.Format("{0},刪除「{1}」的學期成績", StudentInfoConvertor.GetInfoWithClass(_student), info));

                listView.Items.Remove(listView.SelectedItems[0]);
                listView.Refresh();
            }

            listView.Focus();
        }
예제 #8
0
        public RSemesterScore(JHSemesterScoreRecord record)
        {
            Subjects = new List <RSubjectScore>();
            Domains  = new List <RDomainScore>();

            RefStudentID = record.RefStudentID;
            SchoolYear   = record.SchoolYear;
            Semester     = record.Semester;

            foreach (K12.Data.SubjectScore each in record.Subjects.Values)
            {
                Subjects.Add(new RSubjectScore(each));
            }

            foreach (K12.Data.DomainScore each in record.Domains.Values)
            {
                Domains.Add(new RDomainScore(each));
            }

            Domains.Add(new RDomainScore(LearnDomainName, record.LearnDomainScore));
            Domains.Add(new RDomainScore(CourseLearnName, record.CourseLearnScore));
        }
        public void Add(JHSemesterScoreRecord record)
        {
            SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                if (!_domains.ContainsKey(domain.Domain))
                {
                    _domains.Add(domain.Domain, new DomainText(domain.Domain));
                }

                DomainText text = _domains[domain.Domain];
                text.Add(semester, domain.Text);
            }

            // 加入彈性課程文字評量
            string strDomainName = "彈性課程";
            // 存彈性課程用
            List <string> strTextList = new List <string> ();

            foreach (K12.Data.SubjectScore subj in record.Subjects.Values)
            {
                // 科目是彈性課程
                if (string.IsNullOrEmpty(subj.Domain))
                {
                    strTextList.Add(subj.Text);
                }
            }

            if (!_domains.ContainsKey(strDomainName))
            {
                _domains.Add(strDomainName, new DomainText(strDomainName));
            }
            DomainText text1 = _domains[strDomainName];

            text1.Add(semester, string.Join(";", strTextList.ToArray()));
        }
예제 #10
0
        public void Add(JHSemesterScoreRecord record)
        {
            SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

            //foreach (K12.Data.SubjectScore subject in record.Subjects.Values)
            //{
            //if (!_config.ContainsKey(subject.Domain)) continue;

            //if (!_config[subject.Domain].Contains(subject.Subject)) continue;
            //else
            //{
            //    if (!_removeDomains.Contains(subject.Domain))
            //        _removeDomains.Add(subject.Domain);
            //}

            //    if (!_domains.ContainsKey(subject.Subject))
            //        _domains.Add(subject.Subject, new DomainText(subject.Subject));

            //    DomainText text = _domains[subject.Subject];
            //    text.Add(semester, subject.Text);
            //}

            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                //if (!_config.ContainsKey(domain.Domain)) continue;
                //if (_removeDomains.Contains(domain.Domain)) continue;

                if (!_domains.ContainsKey(domain.Domain))
                {
                    _domains.Add(domain.Domain, new DomainText(domain.Domain));
                }

                DomainText text = _domains[domain.Domain];
                text.Add(semester, domain.Text);
            }
        }
        // 計算   預警、輔導及補救措施成效 (在本ischool 系統 只有補考)
        public bool EachJSRCalculator_For_MakeUp(JHSemesterScoreRecord JSR, JHSemesterScoreRecord JSR2, String DomainName)
        {
            JHSemesterScoreRecord jsr1 = JSR;
            JHSemesterScoreRecord jsr2 = JSR2;

            // 領域總分,領域總加權數
            decimal scoreSum = 0, creditCount = 0;

            if (jsr1.Domains.ContainsKey(DomainName))
            {
                scoreSum    += (decimal)jsr1.Domains[DomainName].Score * (decimal)jsr1.Domains[DomainName].Credit;
                creditCount += (decimal)jsr1.Domains[DomainName].Credit;
            }

            if (jsr2.Domains.ContainsKey(DomainName))
            {
                scoreSum    += (decimal)jsr2.Domains[DomainName].Score * (decimal)jsr2.Domains[DomainName].Credit;
                creditCount += (decimal)jsr2.Domains[DomainName].Credit;
            }

            bool pass = true;

            bool have_makeup_score = false;

            // 假如第一學期有補考成績
            if (jsr1.Domains.ContainsKey(DomainName))
            {
                if (jsr1.Domains[DomainName].ScoreMakeup.HasValue)
                {
                    have_makeup_score = true;

                    // 穎驊註解,會這樣處理,是因為 關於補考紀錄, 局端 要數的是"人頭" 而不是"人次",
                    // 也就是說,如果同一學生 上有五筆不同領域的補考紀錄, 其中三筆是補考後 全學年領域成績及格,
                    // 這樣 系統 會算 :
                    // 1.該年級已啟動預警、輔導及補救措施之人數+1
                    // 2.經由預警、輔導及補救措施而達及格標準之人數 +1
                    // 僅會 加1人頭

                    if (!Has_MakeUpStudentIDList.Contains(jsr1.Student.ID))
                    {
                        Has_MakeUpStudentIDList.Add(jsr1.Student.ID);

                        if (jsr1.Student.Class != null)
                        {
                            if (jsr1.Student.Class.GradeYear == 1)
                            {
                                EachGradeMakeUpStudentCount["Grade1"]++;
                            }
                            if (jsr1.Student.Class.GradeYear == 2)
                            {
                                EachGradeMakeUpStudentCount["Grade2"]++;
                            }
                            if (jsr1.Student.Class.GradeYear == 3)
                            {
                                EachGradeMakeUpStudentCount["Grade3"]++;
                            }
                        }
                    }
                    else
                    {
                    }
                }
            }

            // 假如第二學期有補考成績
            if (jsr2.Domains.ContainsKey(DomainName))
            {
                if (jsr2.Domains[DomainName].ScoreMakeup.HasValue)
                {
                    have_makeup_score = true;

                    // 穎驊註解,會這樣處理,是因為 關於補考紀錄, 局端 要數的是"人頭" 而不是"人次",
                    // 也就是說,如果同一學生 上有五筆不同領域的補考紀錄, 其中三筆是補考後 全學年領域成績及格,
                    // 這樣 系統 會算 :
                    // 1.該年級已啟動預警、輔導及補救措施之人數+1
                    // 2.經由預警、輔導及補救措施而達及格標準之人數 +1
                    // 僅會 加1人頭

                    if (!Has_MakeUpStudentIDList.Contains(jsr1.Student.ID))
                    {
                        Has_MakeUpStudentIDList.Add(jsr1.Student.ID);

                        if (jsr1.Student.Class != null)
                        {
                            if (jsr1.Student.Class.GradeYear == 1)
                            {
                                EachGradeMakeUpStudentCount["Grade1"]++;
                            }
                            if (jsr1.Student.Class.GradeYear == 2)
                            {
                                EachGradeMakeUpStudentCount["Grade2"]++;
                            }
                            if (jsr1.Student.Class.GradeYear == 3)
                            {
                                EachGradeMakeUpStudentCount["Grade3"]++;
                            }
                        }
                    }
                    else
                    {
                    }
                }
            }

            decimal SchoolYearDomainScore = 0;

            // 假如有補考成績 、但是總加權學分為0  當成沒有過(因為算出來的 學年領域成績 =0 <60)。
            if (creditCount == 0 && have_makeup_score)
            {
                return(false);
            }

            // 只要加權總學分 不為0,就算學年領域成績
            if (creditCount != 0)
            {
                SchoolYearDomainScore = Math.Round((scoreSum) / (creditCount), 2, MidpointRounding.AwayFromZero);
            }

            // 若有補考成績、 學年領域成績>  60 ,就是 補考及格成功 , 反之 若有補考成績 學年成績卻沒有 > 60 、或是 沒有補考成績 學年成績 本來就> 60 , 其都不代表 補考及格成功。
            if (SchoolYearDomainScore > 60 && have_makeup_score)
            {
                pass = true;
            }
            else
            {
                pass = false;
            }

            return(pass);
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!inputed)
            {
                MsgBox.Show("尚未輸入成績");
                return;
            }

            if (!IsValid())
            {
                return;
            }

            try
            {
                int schoolYear = int.Parse(cboSchoolYear.Text);
                int semester   = int.Parse(cboSemester.Text);
                //int gradeYear = 0;

                //SemesterScoreRecordEditor editor = new SemesterScoreRecordEditor(_student, schoolYear, semester, gradeYear);
                JHSemesterScoreRecord newRecord = new JHSemesterScoreRecord();
                newRecord.RefStudentID = _student.ID;
                newRecord.SchoolYear   = schoolYear;
                newRecord.Semester     = semester;

                // 2018.09.22 [ischoolKingdom] Vicky依據 [J成績][HC][03] 快速新增學期成績修正,將語文領域的子領域兩個項目欄位拿掉,僅保留輸入語文領域成績的單一功能。
                if (CheckDomainValid(textBoxPC1, textBoxScore1, textBoxEffort1))
                {
                    newRecord.Domains.Add("語文", GetDomainScore("語文", textBoxPC1, textBoxScore1, textBoxEffort1, textBoxText1));
                }
                if (CheckDomainValid(textBoxPC2, textBoxScore2, textBoxEffort2))
                {
                    newRecord.Domains.Add("數學", GetDomainScore("數學", textBoxPC2, textBoxScore2, textBoxEffort2, textBoxText2));
                }
                if (CheckDomainValid(textBoxPC3, textBoxScore3, textBoxEffort3))
                {
                    newRecord.Domains.Add("社會", GetDomainScore("社會", textBoxPC3, textBoxScore3, textBoxEffort3, textBoxText3));
                }
                //if (CheckDomainValid(textBoxPC4, textBoxScore4, textBoxEffort4))
                //    newRecord.Domains.Add("藝術與人文", GetDomainScore("藝術與人文", textBoxPC4, textBoxScore4, textBoxEffort4, textBoxText4));
                //if (CheckDomainValid(textBoxPC5, textBoxScore5, textBoxEffort5))
                //    newRecord.Domains.Add("自然與生活科技", GetDomainScore("自然與生活科技", textBoxPC5, textBoxScore5, textBoxEffort5, textBoxText5));
                if (CheckDomainValid(textBoxPC4, textBoxScore4, textBoxEffort4))
                {
                    newRecord.Domains.Add("藝術", GetDomainScore("藝術", textBoxPC4, textBoxScore4, textBoxEffort4, textBoxText4));
                }
                if (CheckDomainValid(textBoxPC5, textBoxScore5, textBoxEffort5))
                {
                    newRecord.Domains.Add("自然科學", GetDomainScore("自然科學", textBoxPC5, textBoxScore5, textBoxEffort5, textBoxText5));
                }
                if (CheckDomainValid(textBoxPC6, textBoxScore6, textBoxEffort6))
                {
                    newRecord.Domains.Add("健康與體育", GetDomainScore("健康與體育", textBoxPC6, textBoxScore6, textBoxEffort6, textBoxText6));
                }
                if (CheckDomainValid(textBoxPC7, textBoxScore7, textBoxEffort7))
                {
                    newRecord.Domains.Add("綜合活動", GetDomainScore("綜合活動", textBoxPC7, textBoxScore7, textBoxEffort7, textBoxText7));
                }
                if (CheckDomainValid(textBoxPC8, textBoxScore8, textBoxEffort8))
                {
                    newRecord.Domains.Add("科技", GetDomainScore("科技", textBoxPC8, textBoxScore8, textBoxEffort8, textBoxText8));
                }

                foreach (DataGridViewRow row in dgv.Rows)
                {
                    if (row.IsNewRow)
                    {
                        continue;
                    }
                    PeriodCredit pc = new PeriodCredit();
                    pc.Parse("" + row.Cells[chsPeriodCredit.Index].Value);
                    K12.Data.SubjectScore subject = new K12.Data.SubjectScore();
                    subject.Domain  = "" + row.Cells[chsDomain.Index].Value;
                    subject.Subject = "" + row.Cells[chsSubject.Index].Value;
                    subject.Period  = pc.Period;
                    subject.Credit  = pc.Credit;
                    subject.Score   = decimal.Parse("" + row.Cells[chsScore.Index].Value);
                    // 2018.09.22 [ischoolKingdom] Vicky 依據 [J成績][HC][03]快速新增學期成績修正 項目,使輸入成績一併儲存至原始成績。
                    subject.ScoreOrigin = decimal.Parse("" + row.Cells[chsScore.Index].Value);
                    //subject.Effort = int.Parse("" + row.Cells[chsEffort.Index].Value);
                    subject.Effort = 1;
                    subject.Text   = "" + row.Cells[chsText.Index].Value;

                    newRecord.Subjects.Add(subject.Subject, subject);
                }

                if (!string.IsNullOrEmpty(textBoxX33.Text))
                {
                    newRecord.Domains.Add("彈性課程", GetElasticDomain());
                }
                if (!string.IsNullOrEmpty(textBoxX34.Text))
                {
                    newRecord.LearnDomainScore = decimal.Parse(textBoxX34.Text);
                }
                if (!string.IsNullOrEmpty(textBoxX35.Text))
                {
                    newRecord.CourseLearnScore = decimal.Parse(textBoxX35.Text);
                }

                JHSemesterScore.Insert(newRecord);
                SaveLog(newRecord);
            }
            catch (Exception ex)
            {
                MsgBox.Show("儲存失敗");
                this.DialogResult = DialogResult.Cancel;
                this.Close();
                return;
            }

            this.DialogResult = DialogResult.OK;
        }
예제 #13
0
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!inputed)
            {
                MsgBox.Show("尚未輸入成績");
                return;
            }

            if (!IsValid())
            {
                return;
            }

            try
            {
                int schoolYear = int.Parse(cboSchoolYear.Text);
                int semester   = int.Parse(cboSemester.Text);
                //int gradeYear = 0;

                //SemesterScoreRecordEditor editor = new SemesterScoreRecordEditor(_student, schoolYear, semester, gradeYear);
                JHSemesterScoreRecord newRecord = new JHSemesterScoreRecord();
                newRecord.RefStudentID = _student.ID;
                newRecord.SchoolYear   = schoolYear;
                newRecord.Semester     = semester;

                K12.Data.DomainScore liter    = new K12.Data.DomainScore();
                PeriodCredit         literpc1 = new PeriodCredit();
                PeriodCredit         literpc2 = new PeriodCredit();
                literpc1.Parse(textBoxX25.Text);
                literpc2.Parse(textBoxX26.Text);
                //if (!int.TryParse(textBoxX25.Text, out literpc1))
                //    literpc1 = 0;
                //if (!int.TryParse(textBoxX26.Text, out literpc2))
                //    literpc2 = 0;
                int effort1, effort2;
                if (!int.TryParse(textBoxX17.Text, out effort1))
                {
                    effort1 = 0;
                }
                if (!int.TryParse(textBoxX18.Text, out effort2))
                {
                    effort2 = 0;
                }

                liter.Period = literpc1.Period + literpc2.Period;
                liter.Credit = literpc1.Credit + literpc2.Credit;
                liter.Domain = "語文";
                //liter.Effort = (int)((effort1 + effort2) / 2);
                liter.Effort = 1;
                decimal d;
                liter.Score = decimal.TryParse(labelX14.Text, out d) ? (decimal?)d : null;
                liter.Text  = textBoxX9.Text + " " + textBoxX10.Text;

                newRecord.Domains.Add("語文", liter);

                if (CheckDomainValid(textBoxX27, textBoxX3, textBoxX19))
                {
                    newRecord.Domains.Add("數學", GetDomainScore("語文", textBoxX27, textBoxX3, textBoxX19, textBoxX11));
                }
                if (CheckDomainValid(textBoxX28, textBoxX4, textBoxX20))
                {
                    newRecord.Domains.Add("社會", GetDomainScore("社會", textBoxX28, textBoxX4, textBoxX20, textBoxX12));
                }
                if (CheckDomainValid(textBoxX29, textBoxX5, textBoxX21))
                {
                    newRecord.Domains.Add("藝術與人文", GetDomainScore("藝術與人文", textBoxX29, textBoxX5, textBoxX21, textBoxX13));
                }
                if (CheckDomainValid(textBoxX30, textBoxX6, textBoxX22))
                {
                    newRecord.Domains.Add("自然與生活科技", GetDomainScore("自然與生活科技", textBoxX30, textBoxX6, textBoxX22, textBoxX14));
                }
                if (CheckDomainValid(textBoxX31, textBoxX7, textBoxX23))
                {
                    newRecord.Domains.Add("健康與體育", GetDomainScore("健康與體育", textBoxX31, textBoxX7, textBoxX23, textBoxX15));
                }
                if (CheckDomainValid(textBoxX32, textBoxX8, textBoxX24))
                {
                    newRecord.Domains.Add("綜合活動", GetDomainScore("綜合活動", textBoxX32, textBoxX8, textBoxX24, textBoxX16));
                }

                if (textBoxX25.Enabled)
                {
                    K12.Data.SubjectScore subject1 = new K12.Data.SubjectScore();
                    subject1.Domain  = "語文";
                    subject1.Subject = textBoxX36.Text;
                    subject1.Score   = decimal.Parse(textBoxX1.Text);
                    //subject1.Effort = int.Parse(textBoxX17.Text);
                    subject1.Effort = 1;
                    subject1.Text   = textBoxX9.Text;
                    //subject1.Period = subject1.Credit = int.Parse(textBoxX25.Text);
                    subject1.Period = literpc1.Period;
                    subject1.Credit = literpc1.Credit;
                    newRecord.Subjects.Add(subject1.Subject, subject1);
                }

                if (textBoxX26.Enabled)
                {
                    K12.Data.SubjectScore subject2 = new K12.Data.SubjectScore();
                    subject2.Domain  = "語文";
                    subject2.Subject = textBoxX37.Text;
                    subject2.Score   = decimal.Parse(textBoxX2.Text);
                    subject2.Effort  = int.Parse(textBoxX18.Text);
                    subject2.Text    = textBoxX10.Text;
                    //subject2.Period = subject2.Credit = int.Parse(textBoxX26.Text);
                    subject2.Period = literpc2.Period;
                    subject2.Credit = literpc2.Credit;
                    newRecord.Subjects.Add(subject2.Subject, subject2);
                }

                foreach (DataGridViewRow row in dgv.Rows)
                {
                    if (row.IsNewRow)
                    {
                        continue;
                    }
                    PeriodCredit pc = new PeriodCredit();
                    pc.Parse("" + row.Cells[chsPeriodCredit.Index].Value);
                    K12.Data.SubjectScore subject = new K12.Data.SubjectScore();
                    subject.Domain  = "" + row.Cells[chsDomain.Index].Value;
                    subject.Subject = "" + row.Cells[chsSubject.Index].Value;
                    subject.Period  = pc.Period;
                    subject.Credit  = pc.Credit;
                    subject.Score   = decimal.Parse("" + row.Cells[chsScore.Index].Value);
                    //subject.Effort = int.Parse("" + row.Cells[chsEffort.Index].Value);
                    subject.Effort = 1;
                    subject.Text   = "" + row.Cells[chsText.Index].Value;

                    newRecord.Subjects.Add(subject.Subject, subject);
                }

                if (!string.IsNullOrEmpty(textBoxX33.Text))
                {
                    newRecord.Domains.Add("彈性課程", GetElasticDomain());
                }
                if (!string.IsNullOrEmpty(textBoxX34.Text))
                {
                    newRecord.LearnDomainScore = decimal.Parse(textBoxX34.Text);
                }
                if (!string.IsNullOrEmpty(textBoxX35.Text))
                {
                    newRecord.CourseLearnScore = decimal.Parse(textBoxX35.Text);
                }

                JHSemesterScore.Insert(newRecord);
                SaveLog(newRecord);
            }
            catch (Exception ex)
            {
                MsgBox.Show("儲存失敗");
                this.DialogResult = DialogResult.Cancel;
                this.Close();
                return;
            }

            this.DialogResult = DialogResult.OK;
        }
예제 #14
0
        public override void InitializeImport(SmartSchool.API.PlugIn.Import.ImportWizard wizard)
        {
            Dictionary <string, int>             _ID_SchoolYear_Semester_GradeYear = new Dictionary <string, int>();
            Dictionary <string, List <string> >  _ID_SchoolYear_Semester_Subject   = new Dictionary <string, List <string> >();
            Dictionary <string, JHStudentRecord> _StudentCollection = new Dictionary <string, JHStudentRecord>();
            Dictionary <JHStudentRecord, Dictionary <int, decimal> > _StudentPassScore = new Dictionary <JHStudentRecord, Dictionary <int, decimal> >();
            Dictionary <string, List <JHSemesterScoreRecord> >       semsDict          = new Dictionary <string, List <JHSemesterScoreRecord> >();

            wizard.PackageLimit = 3000;
            //wizard.ImportableFields.AddRange("領域", "科目", "學年度", "學期", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記");
            //wizard.ImportableFields.AddRange("領域", "科目", "學年度", "學期", "權數", "節數", "分數評量", "文字描述", "註記");

            //2015.1.27 Cloud新增
            wizard.ImportableFields.AddRange("領域", "科目", "學年度", "學期", "權數", "節數", "成績", "原始成績", "補考成績", "努力程度", "文字描述", "註記");

            wizard.RequiredFields.AddRange("領域", "科目", "學年度", "學期");

            wizard.ValidateStart += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateStartEventArgs e)
            {
                #region ValidateStart
                _ID_SchoolYear_Semester_GradeYear.Clear();
                _ID_SchoolYear_Semester_Subject.Clear();
                _StudentCollection.Clear();

                List <JHStudentRecord> list = JHStudent.SelectByIDs(e.List);

                MultiThreadWorker <JHStudentRecord> loader = new MultiThreadWorker <JHStudentRecord>();
                loader.MaxThreads     = 3;
                loader.PackageSize    = 250;
                loader.PackageWorker += delegate(object sender1, PackageWorkEventArgs <JHStudentRecord> e1)
                {
                    foreach (var item in JHSemesterScore.SelectByStudents(e1.List))
                    {
                        if (!semsDict.ContainsKey(item.RefStudentID))
                        {
                            semsDict.Add(item.RefStudentID, new List <JHSchool.Data.JHSemesterScoreRecord>());
                        }
                        semsDict[item.RefStudentID].Add(item);
                    }
                };
                loader.Run(list);

                foreach (JHStudentRecord stu in list)
                {
                    if (!_StudentCollection.ContainsKey(stu.ID))
                    {
                        _StudentCollection.Add(stu.ID, stu);
                    }
                }
                #endregion
            };
            wizard.ValidateRow += delegate(object sender, SmartSchool.API.PlugIn.Import.ValidateRowEventArgs e)
            {
                #region ValidateRow
                int             t;
                decimal         d;
                JHStudentRecord student;
                if (_StudentCollection.ContainsKey(e.Data.ID))
                {
                    student = _StudentCollection[e.Data.ID];
                }
                else
                {
                    e.ErrorMessage = "壓根就沒有這個學生" + e.Data.ID;
                    return;
                }
                bool inputFormatPass = true;
                #region 驗各欄位填寫格式
                foreach (string field in e.SelectFields)
                {
                    string value = e.Data[field];
                    switch (field)
                    {
                    default:
                        break;

                    case "領域":
                        //if (value == "")
                        //{
                        //    inputFormatPass &= false;
                        //    e.ErrorFields.Add(field, "必須填寫");
                        //}
                        //else if (!Domains.Contains(value))
                        //{
                        //    inputFormatPass &= false;
                        //    e.ErrorFields.Add(field, "必須為七大領域");
                        //}
                        break;

                    case "科目":
                        if (value == "")
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填寫");
                        }
                        break;

                    case "學年度":
                        if (value == "" || !int.TryParse(value, out t))
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填入學年度");
                        }
                        break;

                    case "權數":
                    case "節數":
                        if (value == "" || !decimal.TryParse(value, out d))
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填入數值");
                        }
                        break;

                    //case "成績年級":
                    //    if (value == "" || !int.TryParse(value, out t))
                    //    {
                    //        inputFormatPass &= false;
                    //        e.ErrorFields.Add(field, "必須填入整數");
                    //    }
                    //    break;
                    case "學期":
                        if (value == "" || !int.TryParse(value, out t) || t > 2 || t < 1)
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填入1或2");
                        }
                        break;

                    //case "分數評量":
                    //    if (value != "" && !decimal.TryParse(value, out d))
                    //    {
                    //        inputFormatPass &= false;
                    //        e.ErrorFields.Add(field, "必須填入空白或數值");
                    //    }
                    //    break;
                    case "成績":
                        if (value != "" && !decimal.TryParse(value, out d))
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填入空白或數值");
                        }
                        break;

                    case "原始成績":
                        if (value != "" && !decimal.TryParse(value, out d))
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填入空白或數值");
                        }
                        break;

                    case "補考成績":
                        if (value != "" && !decimal.TryParse(value, out d))
                        {
                            inputFormatPass &= false;
                            e.ErrorFields.Add(field, "必須填入空白或數值");
                        }
                        break;
                        //case "努力程度":
                        //    if (value != "" && !int.TryParse(value, out t))
                        //    {
                        //        inputFormatPass &= false;
                        //        e.ErrorFields.Add(field, "必須填入空白或數值");
                        //    }
                        //    break;
                    }
                }
                #endregion
                //輸入格式正確才會針對情節做檢驗
                if (inputFormatPass)
                {
                    string errorMessage = "";

                    string subject    = e.Data["科目"];
                    string schoolYear = e.Data["學年度"];
                    string semester   = e.Data["學期"];
                    int?   sy         = null;
                    int?   se         = null;
                    if (int.TryParse(schoolYear, out t))
                    {
                        sy = t;
                    }
                    if (int.TryParse(semester, out t))
                    {
                        se = t;
                    }
                    if (sy != null && se != null)
                    {
                        string key = e.Data.ID + "_" + sy + "_" + se;
                        #region 驗證新增科目成績
                        List <JHSemesterScoreRecord> semsList;
                        if (semsDict.ContainsKey(student.ID))
                        {
                            semsList = semsDict[student.ID];
                        }
                        else
                        {
                            semsList = new List <JHSemesterScoreRecord>();
                        }
                        foreach (JHSemesterScoreRecord record in semsList)
                        {
                            if (record.SchoolYear != sy)
                            {
                                continue;
                            }
                            if (record.Semester != se)
                            {
                                continue;
                            }

                            bool   isNewSubjectInfo = true;
                            string message          = "";
                            foreach (K12.Data.SubjectScore s in record.Subjects.Values)
                            {
                                if (s.Subject == subject)
                                {
                                    isNewSubjectInfo = false;
                                }
                            }
                            if (isNewSubjectInfo)
                            {
                                if (!e.WarningFields.ContainsKey("查無此科目"))
                                {
                                    e.WarningFields.Add("查無此科目", "學生在此學期並無此筆科目成績資訊,將會新增此科目成績");
                                }
                                foreach (string field in new string[] { "領域", "科目", "學年度", "學期", "權數", "節數" })
                                {
                                    if (!e.SelectFields.Contains(field))
                                    {
                                        message += (message == "" ? "發現此學期無此科目,\n將會新增成績\n缺少成績必要欄位" : "、") + field;
                                    }
                                }
                                if (message != "")
                                {
                                    errorMessage += (errorMessage == "" ? "" : "\n") + message;
                                }
                            }
                        }
                        #endregion
                        #region 驗證重複科目資料
                        //string skey = subject + "_" + le;
                        string skey = subject;
                        if (!_ID_SchoolYear_Semester_Subject.ContainsKey(key))
                        {
                            _ID_SchoolYear_Semester_Subject.Add(key, new List <string>());
                        }
                        if (_ID_SchoolYear_Semester_Subject[key].Contains(skey))
                        {
                            errorMessage += (errorMessage == "" ? "" : "\n") + "同一學期不允許多筆相同科目的資料";
                        }
                        else
                        {
                            _ID_SchoolYear_Semester_Subject[key].Add(skey);
                        }
                        #endregion
                    }
                    e.ErrorMessage = errorMessage;
                }
                #endregion
            };

            wizard.ImportPackage += delegate(object sender, SmartSchool.API.PlugIn.Import.ImportPackageEventArgs e)
            {
                #region ImportPackage
                Dictionary <string, List <RowData> > id_Rows = new Dictionary <string, List <RowData> >();
                #region 分包裝
                foreach (RowData data in e.Items)
                {
                    if (!id_Rows.ContainsKey(data.ID))
                    {
                        id_Rows.Add(data.ID, new List <RowData>());
                    }
                    id_Rows[data.ID].Add(data);
                }
                #endregion
                //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>();
                List <JHSemesterScoreRecord> insertList = new List <JHSemesterScoreRecord>();
                List <JHSemesterScoreRecord> updateList = new List <JHSemesterScoreRecord>();
                //交叉比對各學生資料
                #region 交叉比對各學生資料
                foreach (string id in id_Rows.Keys)
                {
                    XmlDocument     doc        = new XmlDocument();
                    JHStudentRecord studentRec = _StudentCollection[id];
                    //該學生的學期科目成績
                    Dictionary <SemesterInfo, JHSemesterScoreRecord> semesterScoreDictionary = new Dictionary <SemesterInfo, JHSemesterScoreRecord>();
                    #region 整理現有的成績資料
                    List <JHSchool.Data.JHSemesterScoreRecord> semsList;
                    if (semsDict.ContainsKey(studentRec.ID))
                    {
                        semsList = semsDict[studentRec.ID];
                    }
                    else
                    {
                        semsList = new List <JHSchool.Data.JHSemesterScoreRecord>();
                    }
                    foreach (JHSemesterScoreRecord var in semsList)
                    {
                        SemesterInfo info = new SemesterInfo();
                        info.SchoolYear = var.SchoolYear;
                        info.Semester   = var.Semester;

                        if (!semesterScoreDictionary.ContainsKey(info))
                        {
                            semesterScoreDictionary.Add(info, var);
                        }

                        //string key = var.Subject + "_" + var.Level;
                        //if (!semesterScoreDictionary.ContainsKey(var.SchoolYear))
                        //    semesterScoreDictionary.Add(var.SchoolYear, new Dictionary<int, Dictionary<string, SemesterSubjectScoreInfo>>());
                        //if (!semesterScoreDictionary[var.SchoolYear].ContainsKey(var.Semester))
                        //    semesterScoreDictionary[var.SchoolYear].Add(var.Semester, new Dictionary<string, SemesterSubjectScoreInfo>());
                        //if (!semesterScoreDictionary[var.SchoolYear][var.Semester].ContainsKey(key))
                        //    semesterScoreDictionary[var.SchoolYear][var.Semester].Add(key, var);
                    }
                    #endregion

                    //要匯入的學期科目成績
                    Dictionary <SemesterInfo, Dictionary <string, RowData> > semesterImportScoreDictionary = new Dictionary <SemesterInfo, Dictionary <string, RowData> >();

                    #region 整理要匯入的資料
                    foreach (RowData row in id_Rows[id])
                    {
                        int    t;
                        string subject    = row["科目"];
                        string schoolYear = row["學年度"];
                        string semester   = row["學期"];
                        int    sy         = int.Parse(schoolYear);
                        int    se         = int.Parse(semester);

                        SemesterInfo info = new SemesterInfo();
                        info.SchoolYear = sy;
                        info.Semester   = se;

                        if (!semesterImportScoreDictionary.ContainsKey(info))
                        {
                            semesterImportScoreDictionary.Add(info, new Dictionary <string, RowData>());
                        }
                        if (!semesterImportScoreDictionary[info].ContainsKey(subject))
                        {
                            semesterImportScoreDictionary[info].Add(subject, row);
                        }
                    }
                    #endregion

                    //學期年級重整
                    //Dictionary<SemesterInfo, int> semesterGradeYear = new Dictionary<SemesterInfo, int>();
                    //要變更成績的學期
                    List <SemesterInfo> updatedSemester = new List <SemesterInfo>();
                    //在變更學期中新增加的成績資料
                    Dictionary <SemesterInfo, List <RowData> > updatedNewSemesterScore = new Dictionary <SemesterInfo, List <RowData> >();
                    //要增加成績的學期
                    Dictionary <SemesterInfo, List <RowData> > insertNewSemesterScore = new Dictionary <SemesterInfo, List <RowData> >();
                    //開始處理ImportScore
                    #region 開始處理ImportScore
                    foreach (SemesterInfo info in semesterImportScoreDictionary.Keys)
                    {
                        foreach (string subject in semesterImportScoreDictionary[info].Keys)
                        {
                            RowData data = semesterImportScoreDictionary[info][subject];
                            //如果是本來沒有這筆學期的成績就加到insertNewSemesterScore
                            if (!semesterScoreDictionary.ContainsKey(info))
                            {
                                if (!insertNewSemesterScore.ContainsKey(info))
                                {
                                    insertNewSemesterScore.Add(info, new List <RowData>());
                                }
                                insertNewSemesterScore[info].Add(data);
                            }
                            else
                            {
                                bool hasChanged = false;
                                //修改已存在的資料
                                if (semesterScoreDictionary[info].Subjects.ContainsKey(subject))
                                {
                                    JHSemesterScoreRecord record = semesterScoreDictionary[info];

                                    #region 直接修改已存在的成績資料的Detail
                                    foreach (string field in e.ImportFields)
                                    {
                                        K12.Data.SubjectScore score = record.Subjects[subject];
                                        string value = data[field];
                                        //"分數評量", "努力程度", "文字描述", "註記"
                                        switch (field)
                                        {
                                        default:
                                            break;

                                        case "領域":
                                            if (score.Domain != value)
                                            {
                                                score.Domain = value;
                                                hasChanged   = true;
                                            }
                                            break;

                                        case "權數":
                                            if ("" + score.Credit != value)
                                            {
                                                score.Credit = decimal.Parse(value);
                                                hasChanged   = true;
                                            }
                                            break;

                                        case "節數":
                                            if ("" + score.Period != value)
                                            {
                                                score.Period = decimal.Parse(value);
                                                hasChanged   = true;
                                            }
                                            break;

                                        //case "成績年級":
                                        //    int gy = int.Parse(data["成績年級"]);
                                        //    if (record.GradeYear != gy)
                                        //    {
                                        //        semesterGradeYear[info] = gy;
                                        //        hasChanged = true;
                                        //    }
                                        //    break;
                                        //case "分數評量":
                                        //    if ("" + score.Score != value)
                                        //    {
                                        //        decimal d;
                                        //        if (decimal.TryParse(value, out d))
                                        //            score.Score = d;
                                        //        else
                                        //            score.Score = null;
                                        //        hasChanged = true;
                                        //    }
                                        //    break;
                                        case "成績":
                                            if ("" + score.Score != value)
                                            {
                                                decimal d;
                                                if (decimal.TryParse(value, out d))
                                                {
                                                    score.Score = d;
                                                }
                                                else
                                                {
                                                    score.Score = null;
                                                }
                                                hasChanged = true;
                                            }
                                            break;

                                        case "原始成績":
                                            if ("" + score.ScoreOrigin != value)
                                            {
                                                decimal d;
                                                if (decimal.TryParse(value, out d))
                                                {
                                                    score.ScoreOrigin = d;
                                                }
                                                else
                                                {
                                                    score.ScoreOrigin = null;
                                                }
                                                hasChanged = true;
                                            }
                                            break;

                                        case "補考成績":
                                            if ("" + score.ScoreMakeup != value)
                                            {
                                                decimal d;
                                                if (decimal.TryParse(value, out d))
                                                {
                                                    score.ScoreMakeup = d;
                                                }
                                                else
                                                {
                                                    score.ScoreMakeup = null;
                                                }
                                                hasChanged = true;
                                            }
                                            break;

                                        //case "努力程度":
                                        //    if ("" + score.Effort != value)
                                        //    {
                                        //        int i;
                                        //        if (int.TryParse(value, out i))
                                        //            score.Effort = i;
                                        //        else
                                        //            score.Effort = null;
                                        //        hasChanged = true;
                                        //    }
                                        //    break;
                                        case "文字描述":
                                            if ("" + score.Text != value)
                                            {
                                                score.Text = value;
                                                hasChanged = true;
                                            }
                                            break;

                                        case "註記":
                                            if (score.Comment != value)
                                            {
                                                score.Comment = value;
                                                hasChanged    = true;
                                            }
                                            break;
                                        }
                                    }
                                    #endregion
                                }
                                else//加入新成績至已存在的學期
                                {
                                    if (!updatedNewSemesterScore.ContainsKey(info))
                                    {
                                        updatedNewSemesterScore.Add(info, new List <RowData>());
                                    }
                                    updatedNewSemesterScore[info].Add(data);
                                    hasChanged = true;
                                }
                                //真的有變更
                                if (hasChanged)
                                {
                                    #region 登錄有變更的學期
                                    if (!updatedSemester.Contains(info))
                                    {
                                        updatedSemester.Add(info);
                                    }
                                    #endregion
                                }
                            }
                        }
                    }
                    #endregion
                    //處理已登錄要更新的學期成績
                    #region 處理已登錄要更新的學期成績
                    foreach (SemesterInfo info in updatedSemester)
                    {
                        //Dictionary<int, Dictionary<int, string>> semeScoreID = (Dictionary<int, Dictionary<int, string>>)studentRec.Fields["SemesterSubjectScoreID"];
                        //string semesterScoreID = semeScoreID[sy][se];//從學期抓ID
                        //int gradeyear = semesterGradeYear[info];//抓年級
                        //XmlElement subjectScoreInfo = doc.CreateElement("SemesterSubjectScoreInfo");
                        #region 產生該學期科目成績的XML
                        //foreach (SemesterSubjectScoreInfo scoreInfo in semesterScoreDictionary[sy][se].Values)
                        //{
                        //    subjectScoreInfo.AppendChild(doc.ImportNode(scoreInfo.Detail, true));
                        //}

                        updateList.Add(semesterScoreDictionary[info]);

                        //if (updatedNewSemesterScore.ContainsKey(sy) && updatedNewSemesterScore[sy].ContainsKey(se))
                        if (updatedNewSemesterScore.ContainsKey(info))
                        {
                            foreach (RowData row in updatedNewSemesterScore[info])
                            {
                                //XmlElement newScore = doc.CreateElement("Subject");
                                K12.Data.SubjectScore subjectScore = new K12.Data.SubjectScore();
                                #region 建立newScore
                                //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記" })
                                //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "文字描述", "註記" })
                                foreach (string field in new string[] { "領域", "科目", "權數", "節數", "成績", "原始成績", "補考成績", "文字描述", "註記" })
                                {
                                    if (e.ImportFields.Contains(field))
                                    {
                                        decimal d;

                                        #region 填入科目資訊
                                        string value = row[field];
                                        switch (field)
                                        {
                                        default:
                                            break;

                                        case "領域":
                                            subjectScore.Domain = value;
                                            break;

                                        case "科目":
                                            subjectScore.Subject = value;
                                            break;

                                        case "權數":
                                            subjectScore.Credit = decimal.Parse(value);
                                            break;

                                        case "節數":
                                            subjectScore.Period = decimal.Parse(value);
                                            break;

                                        //case "分數評量":
                                        //    decimal d;
                                        //    if (decimal.TryParse(value, out d))
                                        //        subjectScore.Score = d;
                                        //    else
                                        //        subjectScore.Score = null;
                                        //    break;
                                        case "成績":
                                            if (decimal.TryParse(value, out d))
                                            {
                                                subjectScore.Score = d;
                                            }
                                            else
                                            {
                                                subjectScore.Score = null;
                                            }
                                            break;

                                        case "原始成績":
                                            if (decimal.TryParse(value, out d))
                                            {
                                                subjectScore.ScoreOrigin = d;
                                            }
                                            else
                                            {
                                                subjectScore.ScoreOrigin = null;
                                            }
                                            break;

                                        case "補考成績":
                                            if (decimal.TryParse(value, out d))
                                            {
                                                subjectScore.ScoreMakeup = d;
                                            }
                                            else
                                            {
                                                subjectScore.ScoreMakeup = null;
                                            }
                                            break;

                                        //case "努力程度":
                                        //    int i;
                                        //    if (int.TryParse(value, out i))
                                        //        subjectScore.Effort = i;
                                        //    else
                                        //        subjectScore.Effort = null;
                                        //    break;
                                        case "文字描述":
                                            subjectScore.Text = value;
                                            break;

                                        case "註記":
                                            subjectScore.Comment = value;
                                            break;
                                        }
                                        #endregion
                                    }
                                }
                                #endregion
                                //subjectScoreInfo.AppendChild(newScore);
                                JHSemesterScoreRecord record = semesterScoreDictionary[info];
                                if (!record.Subjects.ContainsKey(subjectScore.Subject))
                                {
                                    record.Subjects.Add(subjectScore.Subject, subjectScore);
                                }
                                else
                                {
                                    record.Subjects[subjectScore.Subject] = subjectScore;
                                }

                                updateList.Add(record);
                            }
                        }
                        #endregion
                        //updateList.Add(new SmartSchool.Feature.Score.EditScore.UpdateInfo(semesterScoreID, gradeyear, subjectScoreInfo));
                    }
                    #endregion
                    //處理新增成績學期
                    #region 處理新增成績學期
                    foreach (SemesterInfo info in insertNewSemesterScore.Keys)
                    {
                        //int gradeyear = semesterGradeYear[info];//抓年級
                        foreach (RowData row in insertNewSemesterScore[info])
                        {
                            K12.Data.SubjectScore subjectScore = new K12.Data.SubjectScore();
                            //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "努力程度", "文字描述", "註記" })
                            //foreach (string field in new string[] { "領域", "科目", "權數", "節數", "分數評量", "文字描述", "註記" })
                            foreach (string field in new string[] { "領域", "科目", "權數", "節數", "成績", "原始成績", "補考成績", "文字描述", "註記" })
                            {
                                if (e.ImportFields.Contains(field))
                                {
                                    decimal d;

                                    string value = row[field];
                                    switch (field)
                                    {
                                    default: break;

                                    case "領域":
                                        subjectScore.Domain = value;
                                        break;

                                    case "科目":
                                        subjectScore.Subject = value;
                                        break;

                                    case "權數":
                                        subjectScore.Credit = decimal.Parse(value);
                                        break;

                                    case "節數":
                                        subjectScore.Period = decimal.Parse(value);
                                        break;

                                    //case "分數評量":
                                    //    decimal d;
                                    //    if (decimal.TryParse(value, out d))
                                    //        subjectScore.Score = d;
                                    //    else
                                    //        subjectScore.Score = null;
                                    //    break;
                                    case "成績":
                                        if (decimal.TryParse(value, out d))
                                        {
                                            subjectScore.Score = d;
                                        }
                                        else
                                        {
                                            subjectScore.Score = null;
                                        }
                                        break;

                                    case "原始成績":
                                        if (decimal.TryParse(value, out d))
                                        {
                                            subjectScore.ScoreOrigin = d;
                                        }
                                        else
                                        {
                                            subjectScore.ScoreOrigin = null;
                                        }
                                        break;

                                    case "補考成績":
                                        if (decimal.TryParse(value, out d))
                                        {
                                            subjectScore.ScoreMakeup = d;
                                        }
                                        else
                                        {
                                            subjectScore.ScoreMakeup = null;
                                        }
                                        break;

                                    //case "努力程度":
                                    //    int i;
                                    //    if (int.TryParse(value, out i))
                                    //        subjectScore.Effort = i;
                                    //    else
                                    //        subjectScore.Effort = null;
                                    //    break;
                                    case "文字描述":
                                        subjectScore.Text = value;
                                        break;

                                    case "註記":
                                        subjectScore.Comment = value;
                                        break;
                                    }
                                }
                            }
                            //subjectScoreInfo.AppendChild(newScore);
                            JHSemesterScoreRecord record = new JHSemesterScoreRecord();
                            record.SchoolYear   = info.SchoolYear;
                            record.Semester     = info.Semester;
                            record.RefStudentID = studentRec.ID;
                            //record.GradeYear = gradeyear;

                            if (!record.Subjects.ContainsKey(subjectScore.Subject))
                            {
                                record.Subjects.Add(subjectScore.Subject, subjectScore);
                            }
                            else
                            {
                                record.Subjects[subjectScore.Subject] = subjectScore;
                            }

                            insertList.Add(record);
                        }
                        //insertList.Add(new SmartSchool.Feature.Score.AddScore.InsertInfo(studentRec.StudentID, "" + sy, "" + se, gradeyear, "", subjectScoreInfo));
                    }
                    #endregion
                }
                #endregion


                Dictionary <string, JHSemesterScoreRecord> iList = new Dictionary <string, JHSemesterScoreRecord>();
                Dictionary <string, JHSemesterScoreRecord> uList = new Dictionary <string, JHSemesterScoreRecord>();

                foreach (var record in insertList)
                {
                    string key = record.RefStudentID + "_" + record.SchoolYear + "_" + record.Semester;
                    if (!iList.ContainsKey(key))
                    {
                        iList.Add(key, new JHSemesterScoreRecord());
                    }
                    JHSemesterScoreRecord newRecord = iList[key];
                    newRecord.RefStudentID = record.RefStudentID;
                    newRecord.SchoolYear   = record.SchoolYear;
                    newRecord.Semester     = record.Semester;

                    foreach (var subject in record.Subjects.Keys)
                    {
                        if (!newRecord.Subjects.ContainsKey(subject))
                        {
                            newRecord.Subjects.Add(subject, record.Subjects[subject]);
                        }
                    }
                }

                foreach (var record in updateList)
                {
                    string key = record.RefStudentID + "_" + record.SchoolYear + "_" + record.Semester;
                    if (!uList.ContainsKey(key))
                    {
                        uList.Add(key, record);
                    }
                    JHSemesterScoreRecord newRecord = uList[key];
                    newRecord.RefStudentID = record.RefStudentID;
                    newRecord.SchoolYear   = record.SchoolYear;
                    newRecord.Semester     = record.Semester;
                    newRecord.ID           = record.ID;

                    foreach (var subject in record.Subjects.Keys)
                    {
                        if (!newRecord.Subjects.ContainsKey(subject))
                        {
                            newRecord.Subjects.Add(subject, record.Subjects[subject]);
                        }
                    }
                }

                List <string> ids = new List <string>(id_Rows.Keys);
                Dictionary <string, JHSemesterScoreRecord> origs = new Dictionary <string, JHSemesterScoreRecord>();
                foreach (var record in JHSemesterScore.SelectByStudentIDs(ids))
                {
                    if (!origs.ContainsKey(record.ID))
                    {
                        origs.Add(record.ID, record);
                    }
                }
                foreach (var record in uList.Values)
                {
                    if (origs.ContainsKey(record.ID))
                    {
                        foreach (var domain in origs[record.ID].Domains.Keys)
                        {
                            if (!record.Domains.ContainsKey(domain))
                            {
                                record.Domains.Add(domain, origs[record.ID].Domains[domain]);
                            }
                        }
                    }
                }

                JHSemesterScore.Insert(new List <JHSemesterScoreRecord>(iList.Values));

                JHSemesterScore.Update(new List <JHSemesterScoreRecord>(uList.Values));

                FISCA.LogAgent.ApplicationLog.Log("成績系統.匯入匯出", "匯入學期科目成績", "總共匯入" + (insertList.Count + updateList.Count) + "筆學期科目成績。");
                #endregion
            };
            wizard.ImportComplete += delegate
            {
                MsgBox.Show("匯入完成");
            };
        }
예제 #15
0
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!inputed)
            {
                MsgBox.Show("尚未輸入成績");
                return;
            }

            // 驗證所有權數欄位
            ValidAllPCTextBox();

            if (!IsValid())
            {
                return;
            }

            try
            {
                int schoolYear = int.Parse(cboSchoolYear.Text);
                int semester   = int.Parse(cboSemester.Text);
                //int gradeYear = 0;

                //SemesterScoreRecordEditor editor = new SemesterScoreRecordEditor(_student, schoolYear, semester, gradeYear);
                JHSemesterScoreRecord newRecord = new JHSemesterScoreRecord();
                newRecord.RefStudentID = _student.ID;
                newRecord.SchoolYear   = schoolYear;
                newRecord.Semester     = semester;

                List <string> checkSubjName = new List <string>();

                // 檢查科目名稱是否相同,因為科目名稱重複會造成新增錯誤,科目名稱是唯一值。
                foreach (DataGridViewRow row in dgv.Rows)
                {
                    if (row.Cells[chsSubject.Index].Value != null)
                    {
                        string tmpSubjName = "" + row.Cells[chsSubject.Index].Value;
                        if (checkSubjName.Contains(tmpSubjName))
                        {
                            FISCA.Presentation.Controls.MsgBox.Show("科目名稱重複,無法儲存。");
                            return;
                        }
                        else
                        {
                            checkSubjName.Add(tmpSubjName);
                        }
                    }
                }

                //2018/4/16 穎驊因應高雄項目[02-03][06]學期成績,快速新增功能如無原始成績,則結算學期領域成績時快速新增的成績都會變成"0"分
                // 新增原始成績登錄、語文領域,另外看來以前不流行 datagridView 這土法煉鋼有點驚人呀!!。

                //2018/5/22 穎驊再次註解,恩正說不必新增原始成績欄位給屬用者輸入,直接抓分數就好,所以將上一版的輸入格拿掉

                if (CheckDomainValid(txtPC1, txtScore1, txtScore1, txtEffort1))
                {
                    newRecord.Domains.Add("國語文", GetDomainScore("國語文", txtPC1, txtScore1, txtScore1, txtEffort1, txtText1));
                }
                if (CheckDomainValid(txtPC2, txtScore2, txtScore2, txtEffort2))
                {
                    newRecord.Domains.Add("英語", GetDomainScore("英語", txtPC2, txtScore2, txtScore2, txtEffort2, txtText2));
                }
                if (CheckDomainValid(txtPC3, txtScore3, txtScore3, txtEffort3))
                {
                    newRecord.Domains.Add("數學", GetDomainScore("數學", txtPC3, txtScore3, txtScore3, txtEffort3, txtText3));
                }
                if (CheckDomainValid(txtPC4, txtScore4, txtScore4, txtEffort4))
                {
                    newRecord.Domains.Add("社會", GetDomainScore("社會", txtPC4, txtScore4, txtScore4, txtEffort4, txtText4));
                }
                //if (CheckDomainValid(txtPC5, txtScore5, txtScore5, txtEffort5))
                //    newRecord.Domains.Add("藝術與人文", GetDomainScore("藝術與人文", txtPC5, txtScore5, txtScore5, txtEffort5, txtText5));
                //if (CheckDomainValid(txtPC6, txtScore6, txtScore6, txtEffort6))
                //    newRecord.Domains.Add("自然與生活科技", GetDomainScore("自然與生活科技", txtPC6, txtScore6, txtScore6, txtEffort6, txtText6));
                if (CheckDomainValid(txtPC5, txtScore5, txtScore5, txtEffort5))
                {
                    newRecord.Domains.Add("自然科學", GetDomainScore("自然科學", txtPC5, txtScore5, txtScore5, txtEffort5, txtText5));
                }
                if (CheckDomainValid(txtPC6, txtScore6, txtScore6, txtEffort6))
                {
                    newRecord.Domains.Add("藝術", GetDomainScore("藝術", txtPC6, txtScore6, txtScore6, txtEffort6, txtText6));
                }
                if (CheckDomainValid(txtPC7, txtScore7, txtScore7, txtEffort7))
                {
                    newRecord.Domains.Add("健康與體育", GetDomainScore("健康與體育", txtPC7, txtScore7, txtScore7, txtEffort7, txtText7));
                }
                if (CheckDomainValid(txtPC8, txtScore8, txtScore8, txtEffort8))
                {
                    newRecord.Domains.Add("綜合活動", GetDomainScore("綜合活動", txtPC8, txtScore8, txtScore8, txtEffort8, txtText8));
                }
                if (CheckDomainValid(txtPC9, txtScore9, txtScore9, txtEffort9))
                {
                    newRecord.Domains.Add("語文", GetDomainScore("語文", txtPC9, txtScore9, txtScore9, txtEffort9, txtText9));
                }
                if (CheckDomainValid(txtPC10, txtScore10, txtScore10, txtEffort10))
                {
                    newRecord.Domains.Add("科技", GetDomainScore("科技", txtPC10, txtScore10, txtScore10, txtEffort10, txtText10));
                }

                foreach (DataGridViewRow row in dgv.Rows)
                {
                    if (row.IsNewRow)
                    {
                        continue;
                    }

                    PeriodCredit pc = new PeriodCredit();
                    pc.Parse("" + row.Cells[chsPeriodCredit.Index].Value);
                    K12.Data.SubjectScore subject = new K12.Data.SubjectScore();
                    subject.Domain      = "" + row.Cells[chsDomain.Index].Value;
                    subject.Subject     = "" + row.Cells[chsSubject.Index].Value;
                    subject.Period      = pc.Period;
                    subject.Credit      = pc.Credit;
                    subject.Score       = decimal.Parse("" + row.Cells[chsScore.Index].Value);
                    subject.ScoreOrigin = decimal.Parse("" + row.Cells[chsScore.Index].Value); // 2018/5/22 穎華聽從恩正建議,原始成績直接抓取成績即可
                    subject.Effort      = int.Parse("" + row.Cells[chsEffort.Index].Value);
                    subject.Text        = "" + row.Cells[chsText.Index].Value;

                    newRecord.Subjects.Add(subject.Subject, subject);
                }

                if (!string.IsNullOrEmpty(txtElastic.Text))
                {
                    newRecord.Domains.Add("彈性課程", GetElasticDomain());
                }
                if (!string.IsNullOrEmpty(txtLearnDomain.Text))
                {
                    newRecord.LearnDomainScore = decimal.Parse(txtLearnDomain.Text);
                }
                if (!string.IsNullOrEmpty(txtCourseLearn.Text))
                {
                    newRecord.CourseLearnScore = decimal.Parse(txtCourseLearn.Text);
                }

                JHSemesterScore.Insert(newRecord);
                SaveLog(newRecord);
            }
            catch (Exception ex)
            {
                MsgBox.Show("儲存失敗");
                this.DialogResult = DialogResult.Cancel;
                this.Close();
                return;
            }

            this.DialogResult = DialogResult.OK;
        }
예제 #16
0
        public void Save()
        {
            List <JHSemesterScoreRecord> addSemsScore      = new List <JHSemesterScoreRecord>();
            List <JHSemesterScoreRecord> updateSemsScore   = new List <JHSemesterScoreRecord>();
            SubjectScoreLogFormater      subjLogFormater   = new SubjectScoreLogFormater();
            DomainScoreLogFormater       domainLogFormater = new DomainScoreLogFormater();

            foreach (StudentScore student in Students)
            {
                #region 決定要新增還是更新。
                JHSemesterScoreRecord JHScore = GetJHSemesterScore(student.Id, student.SemestersScore[SemesterData.Empty]);
                SCSemsScore           SCScore = student.SemestersScore[SemesterData.Empty];

                if (string.IsNullOrEmpty(JHScore.ID))
                {
                    addSemsScore.Add(JHScore);
                }
                else
                {
                    updateSemsScore.Add(JHScore);
                }
                #endregion

                #region 產生科目資料。
                JHScore.Subjects.Clear();
                foreach (string strSubject in SCScore.Subject)
                {
                    SemesterSubjectScore objSCSubject = SCScore.Subject[strSubject];
                    SubjectScore         objJHSubject = GetJHSubjectScore(strSubject, objSCSubject);
                    LogData subjLog = new LogData(strSubject);
                    subjLog.Formater = subjLogFormater;

                    decimal?score = objSCSubject.Value.HasValue ? (decimal?)(double)objSCSubject.Value : null;

                    //記錄 Log
                    subjLog.Add(new LogData("成績", objJHSubject.Score + "", score.ToString()));
                    subjLog.Add(new LogData("權重", objJHSubject.Credit + "", objSCSubject.Weight + ""));
                    subjLog.Add(new LogData("節數", objJHSubject.Period + "", objSCSubject.Period + ""));
                    if (Program.Mode == ModuleMode.KaoHsiung)
                    {
                        subjLog.Add(new LogData("努力程度", objJHSubject.Effort + "", objSCSubject.Effort + ""));
                    }
                    subjLog.Add(new LogData("文字評量", objJHSubject.Text + "", objSCSubject.Text));
                    subjLog.Add(new LogData("領域", objJHSubject.Domain + "", objSCSubject.Domain));
                    SCScore.Subject.Log.Add(subjLog);

                    objJHSubject.Score  = score;
                    objJHSubject.Credit = objSCSubject.Weight;
                    objJHSubject.Period = objSCSubject.Period;
                    objJHSubject.Effort = objSCSubject.Effort;
                    objJHSubject.Text   = objSCSubject.Text;
                    objJHSubject.Domain = objSCSubject.Domain;

                    JHScore.Subjects.Add(strSubject, objJHSubject);
                }

                //排序科目名稱。
                Dictionary <string, SubjectScore> orderSubject = new Dictionary <string, SubjectScore>(JHScore.Subjects);
                JHScore.Subjects.Clear();
                foreach (string subjName in Util.SortSubjectDomain(orderSubject.Keys))
                {
                    JHScore.Subjects.Add(subjName, orderSubject[subjName]);
                }
                #endregion

                #region 產生領域資料。
                JHScore.Domains.Clear();
                foreach (string strDomain in SCScore.Domain)
                {
                    //彈性課程不記錄領域領域。
                    if (Util.IsVariableDomain(strDomain))
                    {
                        continue;
                    }

                    SemesterDomainScore objSCDomain = SCScore.Domain[strDomain];
                    DomainScore         objJHDomain = GetJHDomainScore(strDomain, objSCDomain);
                    LogData             domainLog   = new LogData(strDomain);
                    domainLog.Formater = subjLogFormater;

                    decimal?score = objSCDomain.Value.HasValue ? (decimal?)(double)objSCDomain.Value : null;

                    //記錄 Log
                    domainLog.Add(new LogData("成績", objJHDomain.Score + "", score + ""));
                    domainLog.Add(new LogData("權重", objJHDomain.Credit + "", objSCDomain.Weight + ""));
                    domainLog.Add(new LogData("節數", objJHDomain.Period + "", objSCDomain.Period + ""));
                    if (Program.Mode == ModuleMode.KaoHsiung)
                    {
                        domainLog.Add(new LogData("努力程度", objJHDomain.Effort + "", objSCDomain.Effort + ""));
                    }
                    domainLog.Add(new LogData("文字評量", objJHDomain.Text + "", objSCDomain.Text));
                    SCScore.Domain.Log.Add(domainLog);

                    objJHDomain.Score  = score;
                    objJHDomain.Credit = objSCDomain.Weight;
                    objJHDomain.Period = objSCDomain.Period;
                    objJHDomain.Effort = objSCDomain.Effort;
                    objJHDomain.Text   = objSCDomain.Text;

                    JHScore.Domains.Add(strDomain, objJHDomain);
                }

                //記錄 Log
                SCScore.LearningLog.Formater    = domainLogFormater;
                SCScore.LearningLog.OriginValue = JHScore.CourseLearnScore + "";
                SCScore.LearningLog.NewValue    = SCScore.LearnDomainScore + "";
                SCScore.CourseLog.Formater      = domainLogFormater;
                SCScore.CourseLog.OriginValue   = JHScore.CourseLearnScore + "";
                SCScore.CourseLog.NewValue      = SCScore.CourseLearnScore + "";

                JHScore.LearnDomainScore = SCScore.LearnDomainScore;
                JHScore.CourseLearnScore = SCScore.CourseLearnScore;

                //排序領域名稱。
                Dictionary <string, DomainScore> orderDomain = new Dictionary <string, DomainScore>(JHScore.Domains);
                JHScore.Domains.Clear();
                foreach (string domainName in Util.SortSubjectDomain(orderDomain.Keys))
                {
                    JHScore.Domains.Add(domainName, orderDomain[domainName]);
                }
                #endregion
            }

            #region 新增科目成績
            FunctionSpliter <JHSemesterScoreRecord, JHSemesterScoreRecord> addSpliter =
                new FunctionSpliter <JHSemesterScoreRecord, JHSemesterScoreRecord>(500, 5);
            addSpliter.Function = delegate(List <JHSemesterScoreRecord> part)
            {
                // 加入檢查當科目與領域成績筆數0不新增
                List <JHSemesterScoreRecord> insertPart = new List <JHSemesterScoreRecord> ();

                foreach (JHSemesterScoreRecord rec in part)
                {
                    // 沒有任何領域或科目成績
                    if (rec.Domains.Count == 0 && rec.Subjects.Count == 0)
                    {
                        continue;
                    }

                    insertPart.Add(rec);
                }

                if (insertPart.Count > 0)
                {
                    JHSemesterScore.Insert(insertPart);
                }

                return(new List <JHSemesterScoreRecord>());
            };
            addSpliter.ProgressChange = delegate(int progress)
            {
                Reporter.Feedback("新增科目成績...", Util.CalculatePercentage(addSemsScore.Count, progress));
            };
            addSpliter.Execute(addSemsScore);
            #endregion

            #region 更新科目成績
            FunctionSpliter <JHSemesterScoreRecord, JHSemesterScoreRecord> updateSpliter =
                new FunctionSpliter <JHSemesterScoreRecord, JHSemesterScoreRecord>(500, 5);
            updateSpliter.Function = delegate(List <JHSemesterScoreRecord> part)
            {
                JHSemesterScore.Update(part);
                return(new List <JHSemesterScoreRecord>());
            };
            updateSpliter.ProgressChange = delegate(int progress)
            {
                Reporter.Feedback("更新科目成績...", Util.CalculatePercentage(updateSemsScore.Count, progress));
            };
            updateSpliter.Execute(updateSemsScore);
            #endregion
        }
        public bool EachJSRCalculator(JHSemesterScoreRecord JSR, JHSemesterScoreRecord JSR2, String DomainName)
        {
            JHSemesterScoreRecord jsr1 = JSR;
            JHSemesterScoreRecord jsr2 = JSR2;

            // 領域總分,領域總加權數
            decimal scoreSum = 0, creditCount = 0;

            if (jsr1.Domains.ContainsKey(DomainName))
            {
                scoreSum    += (decimal)jsr1.Domains[DomainName].Score * (decimal)jsr1.Domains[DomainName].Credit;
                creditCount += (decimal)jsr1.Domains[DomainName].Credit;
            }

            if (jsr2.Domains.ContainsKey(DomainName))
            {
                scoreSum    += (decimal)jsr2.Domains[DomainName].Score * (decimal)jsr2.Domains[DomainName].Credit;
                creditCount += (decimal)jsr2.Domains[DomainName].Credit;
            }

            bool pass = true;

            if (creditCount == 0)
            {
                return(true);
            }

            // 學年領域成績 ,因為國中 目前(2017/1/9) 並沒有 "學年領域成績" 的概念, 所以要在這邊手動算
            decimal SchoolYearDomainScore = Math.Round((scoreSum) / (creditCount), 2, MidpointRounding.AwayFromZero);

            if (SchoolYearDomainScore < 60)
            {
                pass = false;

                String FailedDomainBookKey = jsr1.Student.ID + "_" + jsr1.SchoolYear + "_" + DomainName;

                // 此物件用來記錄該學生該領域不及格詳情(穎驊在本程式自訂)
                StudentDomainFailRecord SDFR = new StudentDomainFailRecord();

                SDFR.Grade            = jsr1.Student.Class.GradeYear;
                SDFR.Class            = jsr1.Student.Class.Name;
                SDFR.Student          = jsr1.Student.Name;
                SDFR.SchoolYear       = jsr1.SchoolYear;
                SDFR.FailedDomainName = DomainName;

                if (jsr1.Domains.ContainsKey(DomainName))
                {
                    SDFR._first_domain_score  = jsr1.Domains[DomainName].Score;
                    SDFR._first_domain_credit = jsr1.Domains[DomainName].Credit;
                }
                else
                {
                    // 恩正說,備註暫時先不要用
                    //SDFR._memo = "學生在此項目的學期領域成績、權數資料不全,將導致系統計算錯誤,請至系統檢查核對";
                }

                if (jsr2.Domains.ContainsKey(DomainName))
                {
                    SDFR._second_domain_score  = jsr2.Domains[DomainName].Score;
                    SDFR._second_domain_credit = jsr2.Domains[DomainName].Credit;
                }
                else
                {
                    // 恩正說,備註暫時先不要用
                    //SDFR._memo = "學生在此項目的學期領域成績、權數資料不全,將導致系統計算錯誤,請至系統檢查核對";
                }

                SDFR._school_year_domain_score = SchoolYearDomainScore;

                StudentFailedDomainRecordList.Add(FailedDomainBookKey, SDFR);
            }
            else
            {
                pass = true;
            }


            // 此物件用來記錄  所有有的補考紀錄
            StudentMakeUpScoreRecord SMUSR = new StudentMakeUpScoreRecord();

            String MakeUpDomainBookKey = jsr1.Student.ID + "_" + jsr1.SchoolYear + "_" + DomainName;

            bool first_sem_has_makeup  = false;
            bool second_sem_has_makeup = false;

            // 假如第一學期有補考成績
            if (jsr1.Domains.ContainsKey(DomainName))
            {
                if (jsr1.Domains[DomainName].ScoreMakeup.HasValue)
                {
                    SMUSR.Grade                       = jsr1.Student.Class.GradeYear;
                    SMUSR.Class                       = jsr1.Student.Class.Name;
                    SMUSR.Student                     = jsr1.Student.Name;
                    SMUSR.SchoolYear                  = jsr1.SchoolYear;
                    SMUSR.MakeUpDomainName            = DomainName;
                    SMUSR._first_domain_score         = jsr1.Domains[DomainName].Score;
                    SMUSR._first_domain_origin_score  = jsr1.Domains[DomainName].ScoreOrigin;
                    SMUSR._first_domain_makeup_score  = jsr1.Domains[DomainName].ScoreMakeup;
                    SMUSR._first_domain_makeup_credit = jsr1.Domains[DomainName].Credit;
                    SMUSR._school_year_domain_score   = SchoolYearDomainScore;

                    first_sem_has_makeup = true;
                }
            }

            // 假如第二學期有補考成績
            if (jsr2.Domains.ContainsKey(DomainName))
            {
                if (jsr2.Domains[DomainName].ScoreMakeup.HasValue)
                {
                    SMUSR.Grade                        = jsr1.Student.Class.GradeYear;
                    SMUSR.Class                        = jsr1.Student.Class.Name;
                    SMUSR.Student                      = jsr1.Student.Name;
                    SMUSR.SchoolYear                   = jsr1.SchoolYear;
                    SMUSR.MakeUpDomainName             = DomainName;
                    SMUSR._second_domain_score         = jsr2.Domains[DomainName].Score;
                    SMUSR._second_domain_origin_score  = jsr2.Domains[DomainName].ScoreOrigin;
                    SMUSR._second_domain_makeup_score  = jsr2.Domains[DomainName].ScoreMakeup;
                    SMUSR._second_domain_makeup_credit = jsr2.Domains[DomainName].Credit;
                    SMUSR._school_year_domain_score    = SchoolYearDomainScore;

                    second_sem_has_makeup = true;
                }
            }
            if (first_sem_has_makeup || second_sem_has_makeup)
            {
                //加入 有補考紀錄學生 明細
                StudentMakeUpDomainRecordList.Add(MakeUpDomainBookKey, SMUSR);
            }

            return(pass);
        }
        private void CalcWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            bool error = false;

            List <StudentRecord> students    = _students;
            List <string>        student_ids = new List <string>();

            foreach (StudentRecord each in students)
            {
                student_ids.Add(each.ID);
            }
            double total = students.Count;
            double count = 0;

            #region 寫入學期歷程
            if (_studentHistoryDict != null && _studentHistoryDict.Count > 0)
            {
                try
                {
                    List <JHSchool.Data.JHSemesterHistoryRecord> list = new List <JHSchool.Data.JHSemesterHistoryRecord>();
                    int    size   = 50;
                    double count2 = 0;
                    double total2 = _studentHistoryDict.Count;
                    foreach (JHSchool.Data.JHSemesterHistoryRecord record in _studentHistoryDict.Values)
                    {
                        if (_calc_worker.CancellationPending)
                        {
                            return;
                        }

                        list.Add(record);
                        count2++;
                        if (list.Count == size)
                        {
                            JHSchool.Data.JHSemesterHistory.Update(list);
                            list.Clear();
                            _calc_worker.ReportProgress((int)(count2 * 100 / total2), "寫入學期歷程中…");
                        }
                    }
                    if (list.Count > 0)
                    {
                        JHSchool.Data.JHSemesterHistory.Update(list);
                        list.Clear();
                        _calc_worker.ReportProgress(100, "學期歷程寫入完成");
                    }
                }
                catch (Exception ex)
                {
                    MsgBox.Show("寫入學期歷程失敗。" + ex.Message);
                    e.Result = null;
                    return;
                }
            }
            #endregion

            #region 計算課程成績

            _viewer.Clear();
            _viewer.SetHeader("課程");

            _calc_worker.ReportProgress(0, "計算課程成績…");

            if (_calc_worker.CancellationPending)
            {
                return;
            }
            _raw_data = new CourseDataLoader();
            _raw_data.LoadCalculationData(this, _students, intSchoolYear.Value, intSemester.Value);

            foreach (CW.Course course in _raw_data.Courses.Values)
            {
                if (string.IsNullOrEmpty(course.ExamTemplateId) && course.ExamRequired)
                {
                    _viewer.SetMessage(course.CourseName, new List <string>(new string[] { "缺少評量設定" }));
                    error = true;
                }
            }

            if (error)
            {
                e.Result = error;
                return;
            }

            _viewer.Clear();
            if (_calc_worker.CancellationPending)
            {
                return;
            }
            CourseScoreCalculate calculate = new CourseScoreCalculate(_raw_data.Courses);
            calculate.Calculate();

            foreach (CW.Course course in _raw_data.Courses.Values)
            {
                Dictionary <string, string> examLacks       = new Dictionary <string, string>();
                Dictionary <string, int>    examScoreLacks  = new Dictionary <string, int>();
                Dictionary <string, int>    examEffortLacks = new Dictionary <string, int>();

                List <CW.SCAttend> scattends         = new List <CW.SCAttend>();
                List <CW.SCAttend> no_exam_scattends = new List <CW.SCAttend>();
                foreach (CW.SCAttend scattend in course.SCAttends.Values)
                {
                    if (student_ids.Contains(scattend.StudentIdentity))
                    {
                        if (scattend.ContainsLack)
                        {
                            scattends.Add(scattend);
                        }
                        if (scattend.NoExam)
                        {
                            no_exam_scattends.Add(scattend);
                        }
                    }
                }

                foreach (CW.SCAttend scattend in scattends)
                {
                    foreach (string exam in scattend.ScoreLack)
                    {
                        if (!examLacks.ContainsKey(exam))
                        {
                            examLacks.Add(exam, "");
                        }

                        if (!examScoreLacks.ContainsKey(exam))
                        {
                            examScoreLacks.Add(exam, 0);
                        }
                        examScoreLacks[exam]++;
                    }

                    foreach (string exam in scattend.EffortLack)
                    {
                        if (!examLacks.ContainsKey(exam))
                        {
                            examLacks.Add(exam, "");
                        }

                        if (!examEffortLacks.ContainsKey(exam))
                        {
                            examEffortLacks.Add(exam, 0);
                        }
                        examEffortLacks[exam]++;
                    }
                }

                if (scattends.Count > 0)
                {
                    List <string> msgs = new List <string>();
                    foreach (string exam in new List <string>(examLacks.Keys))
                    {
                        if (examScoreLacks.ContainsKey(exam))
                        {
                            examLacks[exam] += "有" + examScoreLacks[exam] + "位學生缺少分數評量,";
                        }
                        if (examEffortLacks.ContainsKey(exam))
                        {
                            examLacks[exam] += "有" + examEffortLacks[exam] + "位學生缺少努力程度,";
                        }
                        if (!string.IsNullOrEmpty(examLacks[exam]))
                        {
                            examLacks[exam] = examLacks[exam].Substring(0, examLacks[exam].Length - 1);
                        }

                        msgs.Add(exam + ":" + examLacks[exam]);
                    }
                    _viewer.SetMessage(course.CourseName, msgs);
                    error = true;
                }

                if (no_exam_scattends.Count > 0)
                {
                    _viewer.SetMessage(course.CourseName, new List <string>(new string[] { "沒有設定各次評量" }));
                    error = true;
                }
            }

            if (error)
            {
                e.Result = true;
                return;
            }

            if (_calc_worker.CancellationPending)
            {
                return;
            }
            CourseScoreUpdater updater = new CourseScoreUpdater(_raw_data.Courses, this, false);
            updater.UpdateToServer();
            #endregion

            #region 計算學期成績

            //List<SemesterScoreRecordEditor> editors = new List<SemesterScoreRecordEditor>();
            List <JHSemesterScoreRecord> semesterScoreRecordList = new List <JHSchool.Data.JHSemesterScoreRecord>();

            JHSchool.Evaluation.SCAttend.Instance.SyncAllBackground();

            Dictionary <string, List <JHSemesterScoreRecord> > studentSemesterScoreCache = new Dictionary <string, List <JHSchool.Data.JHSemesterScoreRecord> >();
            foreach (JHSemesterScoreRecord record in JHSemesterScore.SelectByStudentIDs(students.AsKeyList()))
            {
                if (!studentSemesterScoreCache.ContainsKey(record.RefStudentID))
                {
                    studentSemesterScoreCache.Add(record.RefStudentID, new List <JHSchool.Data.JHSemesterScoreRecord>());
                }
                studentSemesterScoreCache[record.RefStudentID].Add(record);
            }

            count = 0;
            foreach (StudentRecord each in students)
            {
                count++;

                ScoreCalcRuleRecord   old       = GetScoreCalcRuleRecord(each);
                JHScoreCalcRuleRecord dalrecord = null;
                if (old != null)
                {
                    List <JHScoreCalcRuleRecord> list = JHScoreCalcRule.SelectByIDs(new string[] { old.ID });
                    if (list.Count > 0)
                    {
                        dalrecord = list[0];
                    }
                }
                ScoreCalculator calculator = new ScoreCalculator(dalrecord);

                List <SCAttendRecord> scattends = new List <SCAttendRecord>();
                foreach (SCAttendRecord scattend in JHSchool.Evaluation.SCAttend.Instance.GetStudentAttend(each.ID))
                {
                    CourseRecord course = scattend.Course;
                    if (course.SchoolYear == intSchoolYear.Value &&
                        course.Semester == intSemester.Value &&
                        !string.IsNullOrEmpty(course.RefAssessmentSetupID) &&
                        course.CalculationFlag == "1"
                        )
                    {
                        scattends.Add(scattend);
                    }
                }

                if (scattends.Count > 0)
                {
                    List <K12.Data.SubjectScore> subjectScores = _inner_calculator.CalculateSubjectScore(scattends);
                    foreach (K12.Data.SubjectScore subject in subjectScores)
                    {
                        subject.Score = calculator.ParseSubjectScore((decimal)subject.Score);
                    }
                    List <K12.Data.DomainScore> domainScores = _inner_calculator.CalculateDomainScore(subjectScores);
                    foreach (K12.Data.DomainScore domain in domainScores)
                    {
                        domain.Score = calculator.ParseDomainScore((decimal)domain.Score);
                    }

                    List <K12.Data.DomainScore> domainListWithoutElastic = new List <K12.Data.DomainScore>();
                    bool hasElasticCourse = false;
                    foreach (K12.Data.DomainScore domain in domainScores)
                    {
                        if (domain.Domain == "彈性課程")
                        {
                            hasElasticCourse = true;
                        }
                        else
                        {
                            domainListWithoutElastic.Add(domain);
                        }
                    }

                    decimal?learnDomainScore = calculator.ParseLearnDomainScore(_inner_calculator.CalculateTotalDomainScore(domainListWithoutElastic));
                    decimal?courseLearnScore = null;
                    if (hasElasticCourse)
                    {
                        courseLearnScore = calculator.ParseLearnDomainScore(_inner_calculator.CalculateTotalDomainScore(domainScores));
                    }

                    JHSemesterScoreRecord current = null;
                    if (studentSemesterScoreCache.ContainsKey(each.ID))
                    {
                        foreach (JHSemesterScoreRecord record in studentSemesterScoreCache[each.ID])
                        {
                            if (record.SchoolYear == intSchoolYear.Value && record.Semester == intSemester.Value)
                            {
                                current = record;
                            }
                        }
                    }

                    if (current != null)
                    {
                        //editor = current.GetEditor();
                        current.Subjects = new Dictionary <string, K12.Data.SubjectScore>();
                        current.Domains  = new Dictionary <string, K12.Data.DomainScore>();
                    }
                    else
                    {
                        //current = new SemesterScoreRecordEditor(each, intSchoolYear.Value, intSemester.Value, _gradeYears[each.ID]);
                        current = new JHSchool.Data.JHSemesterScoreRecord();
                        current.RefStudentID = each.ID;
                        current.SchoolYear   = intSchoolYear.Value;
                        current.Semester     = intSemester.Value;
                    }

                    foreach (K12.Data.SubjectScore subject in subjectScores)
                    {
                        current.Subjects.Add(subject.Subject, subject);
                    }
                    foreach (K12.Data.DomainScore domain in domainScores)
                    {
                        current.Domains.Add(domain.Domain, domain);
                    }
                    current.LearnDomainScore = learnDomainScore;
                    current.CourseLearnScore = courseLearnScore;

                    //editors.Add(editor);
                    semesterScoreRecordList.Add(current);
                }

                _calc_worker.ReportProgress((int)((double)count * 100 / (double)total), "計算學期成績…");
            }

            e.Result = semesterScoreRecordList;
            #endregion
        }
예제 #19
0
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (!inputed)
            {
                MsgBox.Show("尚未輸入成績");
                return;
            }

            if (!IsValid())
            {
                return;
            }

            try
            {
                int schoolYear = int.Parse(cboSchoolYear.Text);
                int semester   = int.Parse(cboSemester.Text);
                //int gradeYear = 0;

                //SemesterScoreRecordEditor editor = new SemesterScoreRecordEditor(_student, schoolYear, semester, gradeYear);
                JHSemesterScoreRecord newRecord = new JHSemesterScoreRecord();
                newRecord.RefStudentID = _student.ID;
                newRecord.SchoolYear   = schoolYear;
                newRecord.Semester     = semester;

                List <string> checkSubjName = new List <string>();

                // 檢查科目名稱是否相同,因為科目名稱重複會造成新增錯誤,科目名稱是唯一值。
                foreach (DataGridViewRow row in dgv.Rows)
                {
                    if (row.Cells[chsSubject.Index].Value != null)
                    {
                        string tmpSubjName = "" + row.Cells[chsSubject.Index].Value;
                        if (checkSubjName.Contains(tmpSubjName))
                        {
                            FISCA.Presentation.Controls.MsgBox.Show("科目名稱重複,無法儲存。");
                            return;
                        }
                        else
                        {
                            checkSubjName.Add(tmpSubjName);
                        }
                    }
                }


                if (CheckDomainValid(txtPC1, txtScore1, txtEffort1))
                {
                    newRecord.Domains.Add("國語文", GetDomainScore("國語文", txtPC1, txtScore1, txtEffort1, txtText1));
                }
                if (CheckDomainValid(txtPC2, txtScore2, txtEffort2))
                {
                    newRecord.Domains.Add("英語", GetDomainScore("英語", txtPC2, txtScore2, txtEffort2, txtText2));
                }
                if (CheckDomainValid(txtPC3, txtScore3, txtEffort3))
                {
                    newRecord.Domains.Add("數學", GetDomainScore("數學", txtPC3, txtScore3, txtEffort3, txtText3));
                }
                if (CheckDomainValid(txtPC4, txtScore4, txtEffort4))
                {
                    newRecord.Domains.Add("社會", GetDomainScore("社會", txtPC4, txtScore4, txtEffort4, txtText4));
                }
                if (CheckDomainValid(txtPC5, txtScore5, txtEffort5))
                {
                    newRecord.Domains.Add("藝術與人文", GetDomainScore("藝術與人文", txtPC5, txtScore5, txtEffort5, txtText5));
                }
                if (CheckDomainValid(txtPC6, txtScore6, txtEffort6))
                {
                    newRecord.Domains.Add("自然與生活科技", GetDomainScore("自然與生活科技", txtPC6, txtScore6, txtEffort6, txtText6));
                }
                if (CheckDomainValid(txtPC7, txtScore7, txtEffort7))
                {
                    newRecord.Domains.Add("健康與體育", GetDomainScore("健康與體育", txtPC7, txtScore7, txtEffort7, txtText7));
                }
                if (CheckDomainValid(txtPC8, txtScore8, txtEffort8))
                {
                    newRecord.Domains.Add("綜合活動", GetDomainScore("綜合活動", txtPC8, txtScore8, txtEffort8, txtText8));
                }

                foreach (DataGridViewRow row in dgv.Rows)
                {
                    if (row.IsNewRow)
                    {
                        continue;
                    }

                    PeriodCredit pc = new PeriodCredit();
                    pc.Parse("" + row.Cells[chsPeriodCredit.Index].Value);
                    K12.Data.SubjectScore subject = new K12.Data.SubjectScore();
                    subject.Domain  = "" + row.Cells[chsDomain.Index].Value;
                    subject.Subject = "" + row.Cells[chsSubject.Index].Value;
                    subject.Period  = pc.Period;
                    subject.Credit  = pc.Credit;
                    subject.Score   = decimal.Parse("" + row.Cells[chsScore.Index].Value);
                    subject.Effort  = int.Parse("" + row.Cells[chsEffort.Index].Value);
                    subject.Text    = "" + row.Cells[chsText.Index].Value;

                    newRecord.Subjects.Add(subject.Subject, subject);
                }

                if (!string.IsNullOrEmpty(txtElastic.Text))
                {
                    newRecord.Domains.Add("彈性課程", GetElasticDomain());
                }
                if (!string.IsNullOrEmpty(txtLearnDomain.Text))
                {
                    newRecord.LearnDomainScore = decimal.Parse(txtLearnDomain.Text);
                }
                if (!string.IsNullOrEmpty(txtCourseLearn.Text))
                {
                    newRecord.CourseLearnScore = decimal.Parse(txtCourseLearn.Text);
                }

                JHSemesterScore.Insert(newRecord);
                SaveLog(newRecord);
            }
            catch (Exception ex)
            {
                MsgBox.Show("儲存失敗");
                this.DialogResult = DialogResult.Cancel;
                this.Close();
                return;
            }

            this.DialogResult = DialogResult.OK;
        }
        public void Add(JHSemesterScoreRecord record)
        {
            SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

            //foreach (K12.Data.SubjectScore subject in record.Subjects.Values)
            //{
                //if (!_config.ContainsKey(subject.Domain)) continue;

                //if (!_config[subject.Domain].Contains(subject.Subject)) continue;
                //else
                //{
                //    if (!_removeDomains.Contains(subject.Domain))
                //        _removeDomains.Add(subject.Domain);
                //}

            //    if (!_domains.ContainsKey(subject.Subject))
            //        _domains.Add(subject.Subject, new DomainText(subject.Subject));

            //    DomainText text = _domains[subject.Subject];
            //    text.Add(semester, subject.Text);
            //}

            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                //if (!_config.ContainsKey(domain.Domain)) continue;
                //if (_removeDomains.Contains(domain.Domain)) continue;

                if (!_domains.ContainsKey(domain.Domain))
                    _domains.Add(domain.Domain, new DomainText(domain.Domain));

                DomainText text = _domains[domain.Domain];
                text.Add(semester, domain.Text);
            }
        }
        public void Add(JHSemesterScoreRecord record)
        {
            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                //if (!_config.ContainsKey(domain.Domain)) continue;

                if (!_domains.ContainsKey(domain.Domain))
                    _domains.Add(domain.Domain, new DomainRow(domain.Domain));

                DomainRow row = _domains[domain.Domain];

                row.Add(new SemesterData("" + record.SchoolYear, "" + record.Semester), domain);
            }

            foreach (K12.Data.SubjectScore subject in record.Subjects.Values)
            {
                //if (!_config.ContainsKey(subject.Domain)) continue;
                //if (_type == "Domain")
                //{
                //    if (!_config[subject.Domain].Contains(subject.Subject)) continue;
                //}

                if (!_domains.ContainsKey(subject.Domain))
                    _domains.Add(subject.Domain, new DomainRow(subject.Domain));

                DomainRow row = _domains[subject.Domain];
                row.Add(new SemesterData("" + record.SchoolYear, "" + record.Semester), subject);
            }
        }