Exemple #1
0
            public HistoryUtil(JHSemesterHistoryRecord historyRecord)
            {
                _sems = new SemesterDataCollection();

                foreach (SemesterHistoryItem item in historyRecord.SemesterHistoryItems)
                {
                    _sems.Add(new SemesterData(item.GradeYear, item.SchoolYear, item.Semester));
                }

                _sems = _sems.GetGradeYearSemester();

                SemesterData last   = SemesterData.Empty;
                bool         delete = false;

                foreach (SemesterData sem in _sems)
                {
                    if (sem.GradeYear == 3 && sem.Semester == 2)
                    {
                        last   = sem;
                        delete = true;
                    }
                }
                if (delete)
                {
                    _sems.Remove(last);
                }
            }
Exemple #2
0
        /// <summary>
        /// 取得學期歷程資料。
        /// </summary>
        /// <param name="students"></param>
        public static void FillSemesterHistory(this List <StudentExcess> students)
        {
            Dictionary <string, XElement> dicSemsHistory = GetSemesterHistory(students);

            students.ForEach(x => //將學生的學期歷程 Xml 轉換為 SemesterDataCollection。
            {
                SemesterDataCollection semester = new SemesterDataCollection();

                if (dicSemsHistory.ContainsKey(x.StudentID))
                {
                    XElement xmlsems = dicSemsHistory[x.StudentID];

                    foreach (XElement sems in xmlsems.Elements("History"))
                    {
                        //<History GradeYear="2" SchoolYear="96" Semester="2"/>
                        int sy = int.Parse(sems.Attribute("SchoolYear").Value);
                        int ss = int.Parse(sems.Attribute("Semester").Value);
                        int gy = int.Parse(sems.Attribute("GradeYear").Value);

                        semester.Add(new SemesterData(gy, sy, ss));
                    }
                }

                x.Semesters = semester;
            });
        }
Exemple #3
0
        public decimal?GetScore(ReportStudent student)
        {
            SemesterDataCollection semesters = new SemesterDataCollection();

            foreach (SemesterData each in student.SHistory.GetGradeYearSemester().GetSemesters(RequestSemesters))
            {
                semesters.Add(new SemesterData(0, each.SchoolYear, each.Semester));
            }

            if (student.SemestersScore.AvgLearningDomainScore(semesters).HasValue)
            {
                //return student.SemestersScore.AvgLearningDomainScore(semesters).Value;
                // 修改讀取成績計算規則進位方式
                if (student.CalculationRule == null)
                {
                    return(student.SemestersScore.AvgLearningDomainScore(semesters).Value);
                }
                else
                {
                    return(student.CalculationRule.ParseLearnDomainScore(student.SemestersScore.AvgLearningDomainScore(semesters).Value));
                }
            }
            else
            {
                return(0);
            }
            //SemesterDataCollection semesters = new SemesterDataCollection();
            //foreach (SemesterData each in student.SHistory.GetGradeYearSemester().GetSemesters(RequestSemesters))
            //    semesters.Add(new SemesterData(0, each.SchoolYear, each.Semester));

            //return student.SemestersScore.AvgLearningDomainScore(semesters);
        }
Exemple #4
0
        public static void CalcCadre(this List <StudentExcess> students)
        {
            foreach (StudentExcess student in students)
            {
                SemesterDataCollection allSems = student.SixSemester.ToSemesterOnly();

                //每學期的成績。
                decimal score = 0;
                foreach (SemesterData sems in allSems)
                {
                    if (student.Cadre.ContainsKey(sems))
                    {
                        score += student.Cadre[sems] * 2;
                    }
                }

                //限制總分上限。
                if (score > 10)
                {
                    score = 10;
                }

                student.CadreFinal = score;
            }
        }
 public StudentExcess()
 {
     DomainScore     = new Dictionary <SemesterData, DomainScore>();
     ServiceLearning = new Dictionary <SemesterData, decimal>();
     Fitness         = new Dictionary <int, FitnessDegree>();
     Cadre           = new Dictionary <SemesterData, int>();
     Semesters       = new SemesterDataCollection();
 }
Exemple #6
0
        public decimal?GetScore(ReportStudent student)
        {
            SemesterDataCollection semesters = new SemesterDataCollection();

            foreach (SemesterData each in student.SHistory.GetGradeYearSemester().GetSemesters(RequestSemesters))
            {
                semesters.Add(new SemesterData(0, each.SchoolYear, each.Semester));
            }

            return(student.SemestersScore.AvgLearningDomainScore(semesters));
        }
Exemple #7
0
        /// <summary>
        /// 計算服務學期時數積分。
        /// </summary>
        /// <param name="students"></param>
        public static void CalcServiceLearning(this List <StudentExcess> students)
        {
            foreach (StudentExcess student in students)
            {
                SemesterDataCollection allSems = student.SixSemester.ToSemesterOnly();

                //每學年的時數。
                Dictionary <int, decimal> yearScore = new Dictionary <int, decimal>();
                foreach (SemesterData sems in allSems)
                {
                    if (student.ServiceLearning.ContainsKey(sems))
                    {
                        if (!yearScore.ContainsKey(sems.SchoolYear))
                        {
                            yearScore[sems.SchoolYear] = 0;
                        }

                        yearScore[sems.SchoolYear] += student.ServiceLearning[sems];
                    }
                }

                //計算積分。
                foreach (int year in yearScore.Keys.ToArray())
                {
                    yearScore[year] = Math.Floor(yearScore[year] / 3);
                }

                //限制每學年積分上限。
                foreach (int year in yearScore.Keys.ToArray())
                {
                    if (yearScore[year] > 4)
                    {
                        yearScore[year] = 4;
                    }
                }

                //計算總分。
                decimal score = 0;
                foreach (int year in yearScore.Keys)
                {
                    score += yearScore[year];
                }

                //限制總分上限。
                if (score > 10)
                {
                    score = 10;
                }

                student.ServiceLearningFinal = score;
            }
        }
Exemple #8
0
        public static void CalcFitness(this List <StudentExcess> students)
        {
            //得分項目。
            HashSet <string> lookup = new HashSet <string>(new string[] {
                "金牌",
                "銀牌",
                "銅牌",
                "中等",
                "免測"
            });

            foreach (StudentExcess student in students)
            {
                SemesterDataCollection allSems = student.SixSemester.ToSemesterOnly();

                HashSet <int> years = new HashSet <int>();
                foreach (SemesterData sems in allSems)
                {
                    if (!years.Contains(sems.SchoolYear))
                    {
                        years.Add(sems.SchoolYear);
                    }
                }

                decimal score = 0;
                foreach (int year in years) //每個年度。
                {
                    if (!student.Fitness.ContainsKey(year))
                    {
                        continue;
                    }

                    //指定學年度的所有常模項目。
                    foreach (string item in student.Fitness[year].Values)
                    {
                        if (lookup.Contains(item))
                        {
                            score += 3;
                        }
                    }
                }

                //限制總分上限。
                if (score > 20)
                {
                    score = 20;
                }

                student.FitnessFinal = score;
            }
        }
Exemple #9
0
        public List <StudentScore> Valid()
        {
            List <StudentScore> noValid = new List <StudentScore>();

            foreach (StudentScore student in Students)
            {
                //取得六個學期的學期資訊。
                SemesterDataCollection sixSemester = student.SHistory.GetGradeYearSemester();

                //依學生的起始年級整理出六個學期應該有的資料。
                Dictionary <int, bool> validSet = GetValidSet(sixSemester.FirstSemester.GradeYear);

                //對六個學期進行檢查。
                foreach (SemesterData sems in sixSemester)
                {
                    //只用年級、學期檢查。
                    int key = (sems.GradeYear << 24) + (sems.Semester);
                    if (validSet.ContainsKey(key))
                    {
                        validSet[key] = true;                            //將正確的年級、學期標示為 True。
                    }
                }

                bool success = true;
                foreach (bool flag in validSet.Values)
                {
                    success &= flag; //只要有一個學期沒有正確標示,表示學期歷程資訊不完整。
                }
                if (!success)
                {
                    noValid.Add(student);
                }
            }

            return(noValid);
        }
Exemple #10
0
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper()))
            {
                return;
            }

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

            //如果合併值不是 ReportStudent 就跳過...意思是有問題...。
            if (student == null)
            {
                return;
            }

            builder.MoveToField(e.Field, true);
            e.Field.Remove();

            if (e.FieldName == "Fix:科目資訊")
            {
                #region 列印年級學期資訊(有點複雜)。
                SemesterDataCollection semses = student.SHistory.GetGradeYearSemester();
                //Row SemesterRow = builder.CurrentParagraph.ParentNode.ParentNode.NextSibling as Row; //下一個 Row。
                //Paragraph originParagraph = builder.CurrentParagraph;

                int count = 0;//, offset = 1;

                foreach (SemesterData each in semses)
                {
                    //string currentGradeyear = Util.GetGradeyearString(each.GradeYear.ToString());

                    ////如果沒有年級,就跳過。
                    //if (string.IsNullOrEmpty(currentGradeyear)) continue;

                    //builder.Write(currentGradeyear + "年級");
                    Paragraph nextPh = Util.NextCell(builder.CurrentParagraph);
                    if (nextPh == null)
                    {
                        break;                 //沒有下一個 Cell ,就不印資料了。
                    }
                    builder.MoveTo(nextPh);

                    //Paragraph resetParagraph = builder.CurrentParagraph;
                    //SemesterRow.Cells[count + offset].Write(builder, GetSemesterString(each));

                    SemesterData semester = new SemesterData(0, each.SchoolYear, each.Semester);
                    if (!student.HeaderList.ContainsKey(semester))
                    {
                        student.HeaderList.AddRaw(each, count); //不要懷疑,這是對的。
                    }
                    //builder.MoveTo(resetParagraph);
                    count++;
                }

                //builder.MoveTo(originParagraph);
                //Paragraph nextParagrap = originParagraph;
                //string previousGradeyear = GetText(originParagraph);
                //while ((nextParagrap = Util.NextCell(nextParagrap)) != null)
                //{
                //    if (GetText(nextParagrap) == previousGradeyear)
                //        (nextParagrap.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                //    previousGradeyear = GetText(nextParagrap);
                //}
                #endregion

                #region 列印科目資料(爆炸複雜)

                Row   template = builder.CurrentParagraph.ParentNode.ParentNode as Row;
                Table table    = template.ParentNode as Table;

                if (PrintSetting.ListMethod == ListMethod.DomainOnly)
                {
                    PrintDomainOnly(builder, student, template, table);
                }
                else
                {
                    PrintSubjectOnly(builder, student, template, table);
                }

                //設定表格下方線寬。
                double borderWidth = (template.NextSibling as Row).Cells[0].CellFormat.Borders.Bottom.LineWidth;
                foreach (Cell each in (template.PreviousSibling as Row).Cells)
                {
                    each.CellFormat.Borders.Bottom.LineWidth = borderWidth;
                }

                template.NextSibling.Remove();
                template.Remove();
                #endregion
            }
            if (e.FieldName == "Fix:照片")
            {
                if (student.GraduatePhoto != null)
                {
                    Shape photo = builder.InsertImage(student.GraduatePhoto);
                    Cell  cell  = builder.CurrentParagraph.ParentNode as Cell;
                    Row   row   = cell.ParentRow;

                    double rectHeight = row.RowFormat.Height, rectWidth = cell.CellFormat.Width;

                    double heightRate = (rectHeight / photo.Height);
                    double widthRate  = (rectWidth / photo.Width);
                    double rate       = 0;
                    if (heightRate < widthRate)
                    {
                        rate = heightRate;
                    }
                    else
                    {
                        rate = widthRate;
                    }

                    photo.Width  = photo.Width * rate;
                    photo.Height = photo.Height * rate;
                }
            }
        }
Exemple #11
0
        private void PrintDomainOnly(DocumentBuilder builder, ReportStudent student, Row template, Table table)
        {
            #region 列印領域
            UniqueSet <RowHeader> RowIndexs = new UniqueSet <RowHeader>();

            #region 列印 RowHeader
            foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
            {
                SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);

                //如果不包含該學期成績資料,就跳過。
                if (!student.SemestersScore.Contains(sysems))
                {
                    continue;
                }

                SemesterScore semsscore = student.SemestersScore[sysems];

                //準備彈性課程的科目(要詳列出來)。
                foreach (string strSubject in semsscore.Subject)
                {
                    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                    if (DetailDomain.Contains(subject.Domain))
                    {
                        RowHeader header = new RowHeader(subject.Domain, strSubject);
                        header.IsDomain = false;

                        if (!RowIndexs.Contains(header))
                        {
                            RowIndexs.Add(header);
                        }
                    }
                }

                //準備領域資料。
                foreach (string strDomain in semsscore.Domain)
                {
                    if (!Subj.Domains.Contains(strDomain))
                    {
                        continue;
                    }

                    SemesterDomainScore domain = semsscore.Domain[strDomain];

                    if (!DetailDomain.Contains(strDomain))
                    {
                        RowHeader header = new RowHeader(strDomain, string.Empty);
                        header.IsDomain = true;

                        if (!RowIndexs.Contains(header))
                        {
                            RowIndexs.Add(header);
                        }
                    }
                }
            }

            List <RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());

            //產生 Row。
            List <RowHeader> indexHeaders = new List <RowHeader>();
            Row current  = template;
            int rowIndex = 0;
            foreach (RowHeader header in sortedHeaders)
            {
                RowHeader indexH = header;
                indexH.Index = rowIndex++;
                indexHeaders.Add(indexH);
                bool   hasGroup  = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                string groupName = Subj.GetDomainGroup(header.Domain);

                Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                if (header.IsDomain)
                {
                    string domainCName = header.Domain;
                    //string domainEName = Subj.GetDomainEnglish(header.Domain);
                    string domainEName  = _SubjDomainEngNameMapping.GetDomainEngName(header.Domain);
                    string domainString = domainCName + (string.IsNullOrEmpty(domainEName) ? "" : domainEName);

                    if (hasGroup)
                    {
                        string gn = groupName;

                        if (groupName == "語文")
                        {
                            gn = "語文\nLanguage";
                        }

                        datarow.Cells[0].Write(builder, gn);
                        datarow.Cells[1].Write(builder, domainString);
                    }
                    else
                    {
                        datarow.Cells[0].Write(builder, domainString);
                    }
                }
                else
                {
                    string gn = "";
                    //Additional Classes

                    if (IsFlexible(header.Domain))
                    {
                        gn = "彈性課程\nAdditional Classes";
                    }
                    else
                    {
                        gn = header.Domain;
                    }

                    string subjCName = header.Subject;
                    //string subjEName = Subj.GetSubjectEnglish(header.Subject);
                    string subjEName  = _SubjDomainEngNameMapping.GetSubjectEngName(header.Subject);
                    string subjString = header.Subject + (string.IsNullOrEmpty(subjEName) ? "" : "\n" + subjEName);

                    //把空白的領域當成「彈性課程」。
                    string domain      = gn;
                    string domainEName = _SubjDomainEngNameMapping.GetDomainEngName(domain);
                    domain += string.IsNullOrWhiteSpace(domainEName) ? "" : "\n" + domainEName;
                    datarow.Cells[0].Write(builder, domain);
                    datarow.Cells[1].Write(builder, subjString);
                }
            }
            #endregion

            #region 填資料
            //Row RatingRow = null;
            foreach (RowHeader header in indexHeaders)
            {
                SemesterDataCollection semesters = new SemesterDataCollection();
                Row row = table.Rows[header.Index + DataRowOffset];
                foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                    semesters.Add(sysems);

                    if (!student.SemestersScore.Contains(sysems))
                    {
                        continue;
                    }
                    if (!student.HeaderList.ContainsKey(sysems))
                    {
                        continue;
                    }

                    int           columnIndex = student.HeaderList[sysems];
                    SemesterScore semsscore   = student.SemestersScore[sysems];

                    decimal?score  = null;
                    decimal?weight = null;

                    if (header.IsDomain)
                    {
                        if (semsscore.Domain.Contains(header.Domain))
                        {
                            score  = semsscore.Domain[header.Domain].Value;
                            weight = semsscore.Domain[header.Domain].Weight;
                        }
                    }
                    else
                    {
                        if (semsscore.Subject.Contains(header.Subject))
                        {
                            score  = semsscore.Subject[header.Subject].Value;
                            weight = semsscore.Subject[header.Subject].Weight;
                        }
                    }

                    if (!score.HasValue)
                    {
                        continue;
                    }
                    if (!weight.HasValue)
                    {
                        weight = 0;
                    }

                    //if (PrintScore)
                    //    row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                    //else
                    //    row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));

                    if (PrintScore)
                    {
                        if (Global.ShowCredit)
                        {
                            row.Cells[columnIndex * 2 + 2].Write(builder, score.Value + "");
                            row.Cells[columnIndex * 2 + 3].Write(builder, weight.Value + "");
                        }
                        else
                        {
                            row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                        }
                    }
                    else
                    {
                        if (Global.ShowCredit)
                        {
                            row.Cells[columnIndex * 2 + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                            row.Cells[columnIndex * 2 + 3].Write(builder, weight.Value + "");
                        }
                        else
                        {
                            row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                        }
                    }
                }
            }

            #endregion

            #region 合併相關欄位。
            string previousCellDomain = string.Empty;
            foreach (RowHeader header in indexHeaders)
            {
                bool   hasGroup  = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                string groupName = Subj.GetDomainGroup(header.Domain);

                Row row = table.Rows[header.Index + DataRowOffset];

                if (previousCellDomain == row.Cells[0].ToTxt())
                {
                    row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                }
                else
                {
                    row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;
                }

                if (header.IsDomain)
                {
                    if (!hasGroup)
                    {
                        row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                        row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                    }
                }

                previousCellDomain = row.Cells[0].ToTxt();
            }
            #endregion

            #endregion
        }
Exemple #12
0
        private void PrintSubjectOnly(DocumentBuilder builder, ReportStudent student, Row template, Table table)
        {
            #region 列印科目
            UniqueSet <RowHeader> RowIndexs = new UniqueSet <RowHeader>();

            #region 列印 RowHeader
            Dictionary <string, string> subjToDomain = new Dictionary <string, string>();
            foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
            {
                SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                if (!student.SemestersScore.Contains(sysems))
                {
                    continue;
                }

                SemesterScore semsscore = student.SemestersScore[sysems];

                foreach (string strSubject in semsscore.Subject)
                {
                    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                    if (!subjToDomain.ContainsKey(strSubject))
                    {
                        subjToDomain.Add(strSubject, subject.Domain);
                    }

                    RowHeader header = new RowHeader(subjToDomain[strSubject], strSubject);
                    header.IsDomain = false;

                    if (!RowIndexs.Contains(header))
                    {
                        RowIndexs.Add(header);
                    }
                }
            }

            List <RowHeader> sortedHeaders = RowIndexs.ToList();
            sortedHeaders.Sort(delegate(RowHeader x, RowHeader y)
            {
                Subj xx = new JHSchool.Evaluation.Subject(x.Subject, x.Domain);
                Subj yy = new JHSchool.Evaluation.Subject(y.Subject, y.Domain);

                return(xx.CompareTo(yy));
            });

            //產生 Row。
            List <RowHeader> indexHeaders = new List <RowHeader>();
            Row current  = template;
            int rowIndex = 0;
            foreach (RowHeader header in sortedHeaders)
            {
                RowHeader indexH = header;
                indexH.Index = rowIndex++;
                indexHeaders.Add(indexH);

                Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                string gn = "";
                //Additional Classes

                string subjCName = header.Subject;
                //string subjEName = Subj.GetSubjectEnglish(header.Subject);
                string subjEName = _SubjDomainEngNameMapping.GetSubjectEngName(header.Subject);

                string subjString = header.Subject + (string.IsNullOrEmpty(subjEName) ? "" : " " + subjEName);

                datarow.Cells[0].Write(builder, subjString);

                //if (IsFlexible(header.Domain))
                //{
                //    gn = "彈性課程\nAdditional Classes";
                //    //把空白的領域當成「彈性課程」。
                //    datarow.Cells[0].Write(builder, gn);
                //    datarow.Cells[1].Write(builder, subjString);
                //}
                //else
                //{
                //}
            }
            #endregion

            #region 填資料
            //填資料
            foreach (RowHeader header in indexHeaders)
            {
                SemesterDataCollection semesters = new SemesterDataCollection();
                Row row = table.Rows[header.Index + DataRowOffset];
                foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                    semesters.Add(sysems);

                    if (!student.SemestersScore.Contains(sysems))
                    {
                        continue;
                    }
                    if (!student.HeaderList.ContainsKey(sysems))
                    {
                        continue;
                    }

                    int           columnIndex = student.HeaderList[sysems];
                    SemesterScore semsscore   = student.SemestersScore[sysems];

                    decimal?score  = null;
                    decimal?weight = null;

                    //if (header.IsDomain)
                    //{
                    //    if (semsscore.Domain.Contains(header.Domain))
                    //    {
                    //        score = semsscore.Domain[header.Domain].Value;
                    //        weight = semsscore.Domain[header.Domain].Weight;
                    //    }
                    //}
                    //else
                    //{
                    if (semsscore.Subject.Contains(header.Subject))
                    {
                        score  = semsscore.Subject[header.Subject].Value;
                        weight = semsscore.Subject[header.Subject].Weight;
                    }
                    //}

                    if (!score.HasValue)
                    {
                        continue;
                    }
                    if (!weight.HasValue)
                    {
                        weight = 0;
                    }

                    //if (PrintScore)
                    //    row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                    //else
                    //    row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                    if (PrintScore)
                    {
                        if (Global.ShowCredit)
                        {
                            row.Cells[columnIndex * 2 + 2].Write(builder, score.Value + "");
                            row.Cells[columnIndex * 2 + 3].Write(builder, weight.Value + "");
                        }
                        else
                        {
                            row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                        }
                    }
                    else
                    {
                        if (Global.ShowCredit)
                        {
                            row.Cells[columnIndex * 2 + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                            row.Cells[columnIndex * 2 + 3].Write(builder, weight.Value + "");
                        }
                        else
                        {
                            row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                        }
                    }
                }
            }
            #endregion

            #region 合併相關欄位。
            string previousCellDomain = string.Empty;
            foreach (RowHeader header in indexHeaders)
            {
                Row row = table.Rows[header.Index + DataRowOffset];

                //if (IsFlexible(header.Domain))
                //{
                //    if (previousCellDomain == row.Cells[0].ToTxt())
                //        row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                //    else
                //        row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;
                //}
                //else
                {
                    row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                    row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                }

                previousCellDomain = row.Cells[0].ToTxt();
            }
            #endregion

            #endregion
        }
Exemple #13
0
        public static void CalcDomainScore(this List <StudentExcess> students)
        {
            //得分項目。
            HashSet <string> lookup = new HashSet <string>(new string[] {
                "健康與體育",
                "藝術與人文", //藝術與人文
                "綜合活動"
            });

            foreach (StudentExcess student in students) //所有學生。
            {
                SemesterDataCollection allSems = student.FiveSemester.ToSemesterOnly();
                Dictionary <string, DomainAvgCalculator> calculate = new Dictionary <string, DomainAvgCalculator>();

                foreach (SemesterData sems in allSems) //所有學期
                {
                    if (!student.DomainScore.ContainsKey(sems))
                    {
                        continue;
                    }

                    DomainScore ds = student.DomainScore[sems];

                    foreach (string dn in ds.Keys) //所有領域成績
                    {
                        string name = dn.Trim();

                        if (!lookup.Contains(name)) //非需要的領域不處理。
                        {
                            continue;
                        }

                        if (!calculate.ContainsKey(name))
                        {
                            calculate[dn] = new DomainAvgCalculator();
                        }

                        //將指定領域的成績加入到計算機中。
                        calculate[name].AddScore(ds[name]);
                    }
                }

                int passCount = 0;
                foreach (DomainAvgCalculator avg in calculate.Values)
                {
                    if (avg.IsPassed)
                    {
                        passCount++;
                    }
                }

                decimal score = 0;

                switch (passCount)
                {
                case 1:
                    score = 3;
                    break;

                case 2:
                    score = 6;
                    break;

                case 3:
                    score = 10;
                    break;
                }

                student.DomainScoreFinal = score;
            }
        }
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper())) return;

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

            //如果合併值不是 ReportStudent 就跳過...意思是有問題...。
            if (student == null) return;

            builder.MoveToField(e.Field, true);
            e.Field.Remove();

            if (e.FieldName == "Fix:年級學期")
            {
                #region 列印年級學期資訊(有點複雜)。
                SemesterDataCollection semesters = student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters);
                Row SemesterRow = builder.CurrentParagraph.ParentNode.ParentNode.NextSibling as Row; //下一個 Row。
                Paragraph originParagraph = builder.CurrentParagraph;

                int count = 0, offset = 1;

                foreach (SemesterData each in semesters)
                {
                    string currentGradeyear = Util.GetGradeyearString(each.GradeYear.ToString());

                    //如果沒有年級,就跳過。
                    if (string.IsNullOrEmpty(currentGradeyear)) continue;

                    builder.Write(currentGradeyear + "年級");
                    Paragraph nextPh = Util.NextCell(builder.CurrentParagraph);
                    if (nextPh == null) break; //沒有下一個 Cell ,就不印資料了。
                    builder.MoveTo(nextPh);

                    Paragraph resetParagraph = builder.CurrentParagraph;
                    SemesterRow.Cells[count + offset].Write(builder, GetSemesterString(each));

                    SemesterData semester = new SemesterData(0, each.SchoolYear, each.Semester);
                    if (!student.HeaderList.ContainsKey(semester))
                        student.HeaderList.AddRaw(each, count); //不要懷疑,這是對的。

                    builder.MoveTo(resetParagraph);
                    count++;
                }

                builder.MoveTo(originParagraph);
                (originParagraph.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                Paragraph nextParagrap = originParagraph;
                string previousGradeyear = GetText(originParagraph);
                while ((nextParagrap = Util.NextCell(nextParagrap)) != null)
                {
                    if (GetText(nextParagrap) == previousGradeyear && !string.IsNullOrEmpty(previousGradeyear))
                    {
                        (nextParagrap.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                        (nextParagrap.ParentNode as Cell).Paragraphs[0].Runs.Clear();
                    }
                    else
                        (nextParagrap.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;

                    previousGradeyear = GetText(nextParagrap);
                }
                #endregion
            }
            else if (e.FieldName == "Fix:科目資訊")
            {
                #region 列印科目資料(爆炸複雜)

                Row template = builder.CurrentParagraph.ParentNode.ParentNode as Row;
                Table table = template.ParentNode as Table;

                if (PrintSetting.ListMethod == ListMethod.DomainOnly)
                {
                    #region 列印領域
                    UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();
                    //Environment.OSVersion.Platform
                    #region 列印 RowHeader
                    foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                    {
                        SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);

                        //如果不包含該學期成績資料,就跳過。
                        if (!student.SemestersScore.Contains(sysems)) continue;

                        SemesterScore semsscore = student.SemestersScore[sysems];

                        ////準備彈性課程的科目(要詳列出來)。
                        //foreach (string strSubject in semsscore.Subject)
                        //{
                        //    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                        //    if (DetailDomain.Contains(subject.Domain))
                        //    {
                        //        RefineDomain(subject);

                        //        RowHeader header = new RowHeader(subject.Domain, strSubject);
                        //        header.IsDomain = false;

                        //        if (!RowIndexs.Contains(header))
                        //            RowIndexs.Add(header);
                        //    }
                        //}

                        //準備領域資料。
                        foreach (string strDomain in semsscore.Domain)
                        {
                            if (!Subj.Domains.Contains(strDomain)) continue;

                            SemesterDomainScore domain = semsscore.Domain[strDomain];

                            if (!DetailDomain.Contains(strDomain))
                            {
                                RowHeader header = new RowHeader(strDomain, string.Empty);
                                header.IsDomain = true;

                                if (!RowIndexs.Contains(header))
                                    RowIndexs.Add(header);
                            }
                        }
                    }

                    RowHeader lheader = new RowHeader(LearningDomainName, string.Empty);
                    RowHeader lheader1 = new RowHeader(LearningDomainNameSpcAdd, string.Empty);
                    RowHeader lheader2 = new RowHeader(LearningDomainNameP, string.Empty);
                    RowHeader lheader3 = new RowHeader(LearningDomainNameSpcAddP, string.Empty);
                    RowHeader lheader4 = new RowHeader(CalcMessage, string.Empty);

                    lheader.IsDomain = true;
                    lheader1.IsDomain = true;
                    lheader2.IsDomain = true;
                    lheader3.IsDomain = true;
                    lheader4.IsDomain = true;
                    RowIndexs.Add(lheader);
                    RowIndexs.Add(lheader1);
                    RowIndexs.Add(lheader2);
                    RowIndexs.Add(lheader3);
                    RowIndexs.Add(lheader4);

                    List<RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());

                    //產生 Row。
                    List<RowHeader> indexHeaders = new List<RowHeader>();
                    Row current = template;
                    int rowIndex = 0;
                    foreach (RowHeader header in sortedHeaders)
                    {
                        RowHeader indexH = header;
                        indexH.Index = rowIndex++;
                        indexHeaders.Add(indexH);
                        bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                        string groupName = Subj.GetDomainGroup(header.Domain);

                        Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                        //if (header.Domain == LearningDomainName)
                        //{
                        //    string headerName = string.Empty;

                        //    if (PrintSetting.PrintRank)
                        //        headerName = "學期成績平均排名";

                        //    if (PrintSetting.PrintRankPercentage)
                        //        headerName = "學期成績平均百分比";

                        //    if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                        //        headerName = "學期成績平均排名/百分比";

                        //    if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                        //    {
                        //        Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                        //        lrow.Cells[0].Write(builder, headerName);
                        //        rowIndex++;
                        //    }
                        //}

                        //if (header.Domain == LearningDomainNameSpcAdd)
                        //{
                        //    string headerName = string.Empty;

                        //    if (PrintSetting.PrintRank)
                        //        headerName = "特種身分加分後之學期成績平均排名";

                        //    if (PrintSetting.PrintRankPercentage)
                        //        headerName = "特種身分加分後之學期成績平均百分比";

                        //    if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                        //        headerName = "特種身分加分後之學期成績平均排名/百分比";

                        //    if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                        //    {
                        //        Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                        //        lrow.Cells[0].Write(builder, headerName);
                        //        rowIndex++;
                        //    }
                        //}

                        if (header.IsDomain)
                        {
                            if (hasGroup)
                            {
                                datarow.Cells[0].Write(builder, groupName);
                                datarow.Cells[1].Write(builder, header.Domain);
                            }
                            else
                            {
                                datarow.Cells[0].Write(builder, header.Domain);
                            }
                        }
                        else
                        {
                            if (header.Domain == LearningDomainNameP)
                            {
                                string headerName = string.Empty;

                                if (PrintSetting.PrintRank)
                                    headerName = "學期成績平均排名";

                                if (PrintSetting.PrintRankPercentage)
                                    headerName = "學期成績平均百分比";

                                if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                                    headerName = "學期成績平均排名/百分比";

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                    lrow.Cells[0].Write(builder, headerName);
                                    rowIndex++;
                                }
                            }

                            if (header.Domain == LearningDomainNameSpcAddP)
                            {
                                string headerName = string.Empty;

                                if (PrintSetting.PrintRank)
                                    headerName = "特種身分加分後之學期成績平均排名";

                                if (PrintSetting.PrintRankPercentage)
                                    headerName = "特種身分加分後之學期成績平均百分比";

                                if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                                    headerName = "特種身分加分後之學期成績平均排名/百分比";

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                    lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                    lrow.Cells[0].Write(builder, headerName);
                                    rowIndex++;
                                }
                            }

                            //把空白的領域當成「彈性課程」。
                            string domain = IsFlexible(header.Domain) ? "彈性課程" : header.Domain;

                            // 修改不需要彈性課程,標頭
                            datarow.Cells[0].Write(builder, "^^");
                            datarow.Cells[1].Write(builder, "^_^");
                        }
                    }
                    #endregion

                    #region 填資料
                    Row RatingRow = null;
                    // 用在加分後
                    Row RatingRowAdd = null;
                    // 是否已有年排名資料
                    List<DAL.UserDefData> uddList = new List<JointAdmissionModule.DAL.UserDefData>();
                    if (_StudRankData.ContainsKey(student.StudentID))
                        uddList = _StudRankData[student.StudentID];

                    foreach (RowHeader header in indexHeaders)
                    {
                        SemesterDataCollection semesters = new SemesterDataCollection();
                        Row row = table.Rows[header.Index + 3];
                        foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                        {
                            SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                            semesters.Add(sysems);

                            if (!student.SemestersScore.Contains(sysems)) continue;
                            if (!student.HeaderList.ContainsKey(sysems)) continue;

                            int columnIndex = student.HeaderList[sysems];
                            SemesterScore semsscore = student.SemestersScore[sysems];

                            decimal? score = null;
                            decimal? weight = null;

                            if (header.IsDomain)
                            {
                                if (semsscore.Domain.Contains(header.Domain))
                                {
                                    score = semsscore.Domain[header.Domain].Value;
                                    weight = semsscore.Domain[header.Domain].Weight;
                                }
                            }
                            else
                            {
                                // 這段在顯示彈性課程成績,先註。
                                //if (semsscore.Subject.Contains(header.Subject))
                                //{
                                //    score = semsscore.Subject[header.Subject].Value;
                                //    weight = semsscore.Subject[header.Subject].Weight;
                                //}
                            }

                            if (header.Domain == LearningDomainName)
                            {
                                score = semsscore.LearnDomainScore;

                                row.Cells[columnIndex * 3 + 2].CellFormat.FitText = false;
                                row.Cells[columnIndex * 3 + 2].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[columnIndex * 3 + 3].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (!score.HasValue) continue;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    RatingRow = row.NextSibling as Row;
                                    RatingRow = RatingRow.NextSibling as Row;
                                }
                            }
                            else if (header.Domain == LearningDomainNameSpcAdd)
                            {
                                // 加分後填入值
                                score = semsscore.LearnDomainScore;

                                row.Cells[columnIndex * 3 + 2].CellFormat.FitText = false;
                                row.Cells[columnIndex * 3 + 2].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[columnIndex * 3 + 3].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (!score.HasValue) continue;
                                // 處理加分
                                decimal sc = score.Value;
                                if (student.AddWeight.HasValue)
                                    sc = Math.Round(sc * student.AddWeight.Value, 2,MidpointRounding.AwayFromZero); ;

                                // 一般生填空白
                                if (string.IsNullOrEmpty(student.SpcStudTypeName))
                                {
                                    row.Cells[columnIndex * 3 + 2].Write(builder, "");
                                    row.Cells[columnIndex * 3 + 4].Write(builder, "");
                                }
                                else
                                {
                                    // 特種身
                                    row.Cells[columnIndex * 3 + 2].Write(builder, sc + "");
                                    row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(sc)));
                                }

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    if (RatingRow != null)
                                    {
                                        RatingRowAdd = RatingRow.NextSibling as Row;

                                    }
                                }
                            }
                            else
                            {
                                if (!score.HasValue) continue;
                                if (!weight.HasValue) weight = 0;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)weight) + "");
                                row.Cells[columnIndex * 3 + 3].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));
                            }
                        }

                        //算平均...
                        decimal? avgScore = null;
                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                avgScore = student.SemestersScore.AvgLearningDomainScore(semesters);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseLearnDomainScore(avgScore.Value);
                            }
                            else
                            {
                                avgScore = student.SemestersScore.AvgDomainScore(semesters, header.Domain);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseDomainScore(avgScore.Value);
                            }
                        }
                        else
                        {
                            // 這段在處理彈性課程平均,先註。
                            //avgScore = student.SemestersScore.AvgSubjectScore(semesters, header.Subject);

                            //if (!avgScore.HasValue) continue;

                            //if (student.CalculationRule == null)
                            //    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                            //else
                            //    avgScore = student.CalculationRule.ParseSubjectScore(avgScore.Value);
                        }

                        if (avgScore.HasValue)
                        {
                            row.Cells[20].Write(builder, (double)avgScore + "");
                            row.Cells[21].Write(builder, Util.GetDegree(avgScore.Value));
                            //decimal scAddScore = 0;
                            //// 特種身分
                            //if (student.AddWeight.HasValue)
                            //{
                            //    Row RowSp = row.NextSibling as Row;
                            //    scAddScore = student.AddWeight.Value * avgScore.Value;
                            //    RowSp.Cells[20].Write(builder, (double)scAddScore + "");
                            //    RowSp.Cells[21].Write(builder, Util.GetDegree(scAddScore));

                            //}
                        }
                    }

                    // 處理特種分身平均顯示
                    decimal scAddScore = 0;
                    // 特種身分
                    int rrIdx = 0;
                    foreach(RowHeader rh in indexHeaders)
                    {
                        if (rh.Domain == LearningDomainNameSpcAdd)
                        {
                            rrIdx = rh.Index + 3;
                            break;
                        }
                    }

                    if (student.AddWeight.HasValue && rrIdx >0)
                    {
                        // 顯示平均
                        if (student.Places.NS("年排名").Contains("學習領域"))
                        {
                            scAddScore = Math.Round(student.Places.NS("年排名")["學習領域"].Score * student.AddWeight.Value,2,MidpointRounding.AwayFromZero);
                            table.Rows[rrIdx].Cells[20].Write(builder, (double)scAddScore + "");
                            table.Rows[rrIdx].Cells[21].Write(builder, Util.GetDegree(scAddScore));
                        }

                    }

                    // 處理年排名與百分比
                    if (RatingRow != null)
                    {
                        PlaceCollection places = student.Places.NS("年排名");

                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            Cell datacell = RatingRow.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            bool UseRatingRank = true;
                            // 處理已有年排名(在UDT有存資料)
                            if (uddList.Count > 0 && student.LastEnterSemester.HasValue)
                            {
                                foreach (DAL.UserDefData udd in uddList)
                                {
                                    if (udd.SchoolYear == semsIndex.SchoolYear && udd.Semester == semsIndex.Semester)
                                    {
                                        datacell.Write(builder, GetPlaceString2(udd.GradeRank, udd.GradeRankPercent));
                                        UseRatingRank = false;
                                    }
                                }
                            }

                            // 判斷轉入生
                            if (student.LastEnterGradeYear.HasValue && student.LastEnterSchoolyear.HasValue)
                            {
                                if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                {

                                        bool clear = true;

                                        // 當有資料
                                        foreach (DAL.UserDefData udd in (from data in uddList where data.SchoolYear== semsIndex.SchoolYear && data.Semester== semsIndex.Semester select data))
                                                clear = false;

                                        if (clear)
                                        {
                                            // 和異動同年同學期不動
                                            if (semsIndex.SchoolYear == student.LastEnterSchoolyear && semsIndex.Semester == student.LastEnterSemester)
                                                clear = false;
                                        }

                                        if (clear)
                                        {
                                            // 當同一學年第2學期,如果維持不清空
                                            if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester == 2)
                                                clear = false;
                                        }

                                        if (clear)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }

                                }

                                if (uddList.Count == 0)
                                {
                                    if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                    {
                                        if (semsIndex.SchoolYear < student.LastEnterSchoolyear.Value)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                        else if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester < student.LastEnterSemester)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                    }
                                }
                            }

                            // 使用即時運算排名與百分比
                            if(UseRatingRank)
                                if (places.Contains(placeKey))
                                    datacell.Write(builder, GetPlaceString(places, placeKey));
                        }

                        // 顯示平均
                        if (places.Contains("學習領域"))
                            RatingRow.Cells[20].Write(builder, GetPlaceString(places, "學習領域"));
                    }

                    int? LevelAdd=null,PercentageAdd=null;
                    // 處理年排名與百分比(加分後)
                    if (RatingRowAdd != null)
                    {
                        PlaceCollection places = student.Places.NS("年排名");

                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            //if (!places.Contains(placeKey))
                            //    continue;

                            Cell datacell = RatingRowAdd.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            // 如果是一般生直接填空白
                            if (string.IsNullOrEmpty(student.SpcStudTypeName))
                            {
                                datacell.Write(builder, "");
                                continue;
                            }
                            int Level=1,Percentage=1;

                            // 處理加分後
                            if (places.Contains(placeKey))
                            {
                                if (student.AddWeight.HasValue)
                                {
                                    List<Place> PList = new List<Place>();
                                    decimal sc = places[placeKey].Score * student.AddWeight.Value;
                                    if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(student.GradeYear))
                                    {
                                        if (DAL.DALTransfer.StudRankScoreDict[student.GradeYear].ContainsKey(placeKey))
                                        {
                                            PList = (from data in DAL.DALTransfer.StudRankScoreDict[student.GradeYear][placeKey] where data.Place.Score >= sc orderby data.Place.Score ascending select data.Place).ToList();
                                            if (PList.Count > 0)
                                            {
                                                PList.OrderBy(x => x.Score);
                                                Level = PList[0].Level;
                                                Percentage = PList[0].Percentage;
                                            }
                                            else
                                            {
                                                Level = 1;
                                                Percentage = 1;
                                            }
                                        }
                                    }
                                }
                            }

                            bool UseRatingRank = true;
                            // 處理已有年排名(UDT)
                            if (uddList.Count > 0 && student.LastEnterSemester.HasValue)
                            {
                                foreach (DAL.UserDefData udd in uddList)
                                {
                                    if (udd.SchoolYear == semsIndex.SchoolYear && udd.Semester == semsIndex.Semester)
                                    {
                                        datacell.Write(builder, GetPlaceString2(udd.GradeRankAdd, udd.GradeRankPercentAdd));
                                        UseRatingRank = false;
                                    }
                                }
                            }

                            // 判斷轉入生
                            if (student.LastEnterGradeYear.HasValue && student.LastEnterSchoolyear.HasValue)
                            {
                                if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                {

                                    bool clear = true;

                                    // 當有資料
                                    foreach (DAL.UserDefData udd in (from data in uddList where data.SchoolYear == semsIndex.SchoolYear && data.Semester == semsIndex.Semester select data))
                                        clear = false;

                                    if (clear)
                                    {
                                        // 和異動同年同學期不動
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear && semsIndex.Semester == student.LastEnterSemester)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        // 當同一學年第2學期,如果維持不清空
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester == 2)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        datacell.Write(builder, "");
                                        UseRatingRank = false;
                                    }

                                }

                                if (uddList.Count == 0)
                                {
                                    if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                    {
                                        if (semsIndex.SchoolYear < student.LastEnterSchoolyear.Value)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                        else if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester < student.LastEnterSemester)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                    }
                                }
                            }

                            //// 使用即時運算排名與百分比
                            if (UseRatingRank)
                            {
                                if (places.Contains(placeKey))
                                {
                                    if (student.AddWeight.HasValue)
                                        datacell.Write(builder, GetPlaceString2(Level, Percentage));
                                    else
                                        datacell.Write(builder, GetPlaceString(places, placeKey));

                                }
                            }

                            //// 每學期加分後
                            //if (places.Contains(placeKey))
                            //    datacell.Write(builder, "^_^");

                        }

                        //這是加分後平均
                        //if (places.Contains(LearningDomainNameSpcAddP))
                        //    RatingRowAdd.Cells[20].Write(builder, GetPlaceString(places, LearningDomainNameSpcAddP));

                        // 加分後
                        if (student.AddWeight.HasValue)
                        {
                            decimal sc1=0;
                            PercentageAdd = null; LevelAdd = null;
                            List<Place> PList = new List<Place>();
                            if(places.Contains("學習領域"))
                                sc1 = places["學習領域"].Score * student.AddWeight.Value;
                            if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(student.GradeYear))
                            {
                                if (DAL.DALTransfer.StudRankScoreDict[student.GradeYear].ContainsKey("學期總平均"))
                                {
                                    PList = (from data in DAL.DALTransfer.StudRankScoreDict[student.GradeYear]["學期總平均"] where data.Place.Score >= sc1 orderby data.Place.Score ascending select data.Place).ToList();
                                    if (PList.Count > 0)
                                    {
                                        PList.OrderBy(x => x.Score);
                                        LevelAdd = PList[0].Level;
                                        PercentageAdd = PList[0].Percentage;
                                    }
                                    else
                                    {
                                        LevelAdd = 1;
                                        PercentageAdd = 1;
                                    }
                                }
                                if(LevelAdd.HasValue && PercentageAdd.HasValue )
                                    RatingRowAdd.Cells[20].Write(builder, GetPlaceString2(LevelAdd.Value, PercentageAdd.Value));
                            }
                        }

                    }

                    // 樂學計分方式
                    if(RatingRowAdd !=null )
                    {
                        //string str = "單一學期學習領域成績計分=100-(名次百分比)×100+1";
                        Row RowStr = RatingRowAdd.NextSibling as Row;
                        //RowStr.Cells[2].Write(builder, str);

                        PlaceCollection places = student.Places.NS("年排名");
                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            Cell datacell = RowStr.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            bool UseRatingRank = true;

                            // 處理已有年排名(在UDT有存資料)
                            if (uddList.Count > 0 && student.LastEnterSemester.HasValue)
                            {
                                foreach (DAL.UserDefData udd in uddList)
                                {
                                    if (udd.SchoolYear == semsIndex.SchoolYear && udd.Semester == semsIndex.Semester)
                                    {
                                        if(student.AddWeight.HasValue )
                                            datacell.Write(builder, GetPlaceString3(udd.GradeRankPercentAdd));
                                        else
                                            datacell.Write(builder, GetPlaceString3(udd.GradeRankPercent));
                                        UseRatingRank = false;
                                    }
                                }
                            }

                            // 判斷轉入生
                            if (student.LastEnterGradeYear.HasValue && student.LastEnterSchoolyear.HasValue )
                            {
                                if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                {

                                    bool clear = true;

                                    // 當有資料
                                    foreach (DAL.UserDefData udd in (from data in uddList where data.SchoolYear == semsIndex.SchoolYear && data.Semester == semsIndex.Semester select data))
                                        clear = false;

                                    if (clear)
                                    {
                                        // 和異動同年同學期不動
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear && semsIndex.Semester == student.LastEnterSemester)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        // 當同一學年第2學期,如果維持不清空
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester == 2)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        datacell.Write(builder, "");
                                        UseRatingRank = false;
                                    }

                                }

                                if (uddList.Count == 0)
                                {
                                    if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                    {
                                        if (semsIndex.SchoolYear < student.LastEnterSchoolyear.Value)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                        else if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester < student.LastEnterSemester)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                    }
                                }
                            }

                            if (UseRatingRank)
                            {

                                // 處理樂學計算
                                if (student.AddWeight.HasValue == false)
                                    if (places.Contains(placeKey))
                                        datacell.Write(builder, GetPlaceString3(places[placeKey].Percentage));

                                int Level = 1, Percentage = 1;

                                // 處理加分後
                                if (places.Contains(placeKey))
                                {
                                    if (student.AddWeight.HasValue)
                                    {
                                        List<Place> PList = new List<Place>();
                                        decimal sc = places[placeKey].Score * student.AddWeight.Value;
                                        if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(student.GradeYear))
                                        {
                                            if (DAL.DALTransfer.StudRankScoreDict[student.GradeYear].ContainsKey(placeKey))
                                            {
                                                PList = (from data in DAL.DALTransfer.StudRankScoreDict[student.GradeYear][placeKey] where data.Place.Score >= sc orderby data.Place.Score ascending select data.Place).ToList();
                                                if (PList.Count > 0)
                                                {
                                                    PList.OrderBy(x => x.Score);
                                                    Level = PList[0].Level;
                                                    Percentage = PList[0].Percentage;
                                                }
                                                else
                                                {
                                                    Level = 1;
                                                    Percentage = 1;
                                                }
                                            }
                                        }
                                        datacell.Write(builder, GetPlaceString3(Percentage));
                                    }
                                }
                            }

                        }

                        //// 顯示平均
                        //Place p;
                        //if (places.Contains("學習領域"))
                        //{
                            //if (student.AddWeight.HasValue)
                            //{
                            //    if(PercentageAdd.HasValue )
                            //        RowStr.Cells[20].Write(builder, GetPlaceString3(PercentageAdd.Value));
                            //}
                            //else
                            //{
                        //        p = places["學習領域"];
                        //        RowStr.Cells[20].Write(builder, GetPlaceString3(p.Percentage));
                        //    //}
                        //}
                    }
                    #endregion

                    #region 合併相關欄位。
                    string previousCellDomain = string.Empty;
                    foreach (RowHeader header in indexHeaders)
                    {
                        bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                        string groupName = Subj.GetDomainGroup(header.Domain);

                        Row row = table.Rows[header.Index + 3];

                        if (previousCellDomain == row.Cells[0].ToTxt())
                            row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                        else
                            row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;

                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                #region 學習領域
                                // 這段在處理 header
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                #endregion
                            }
                            else if (header.Domain == LearningDomainNameSpcAdd)
                            {
                                #region 學習領域(加分後)
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                #endregion
                            }
                            else if (header.Domain == LearningDomainNameP)
                            {
                                // 學成成績排名與百分比
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {

                                    //Row lrow = row.NextSibling as Row;
                                    Row lrow = row;
                                    lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    lrow.Cells[0].CellFormat.FitText = false;
                                    lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                    Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                    for (int i = 0; i < (3 * 6); i++)
                                    {
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                        mp = Util.NextCell(mp as Paragraph);
                                    }
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                    mp = Util.NextCell(mp as Paragraph);
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                                }

                            }
                            else if (header.Domain == LearningDomainNameSpcAddP)
                            {
                                // 學習成績排名與百分比(加分後)
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    //Row lrow = row.NextSibling as Row;

                                    Row lrow = row;
                                    lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    lrow.Cells[0].CellFormat.FitText = false;
                                    lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                    Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                    for (int i = 0; i < (3 * 6); i++)
                                    {
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                        mp = Util.NextCell(mp as Paragraph);
                                    }
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                    mp = Util.NextCell(mp as Paragraph);
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                                }

                            }
                            else if (header.Domain==CalcMessage)
                            {
                                // 文字字串
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                Row lrow = row;
                                lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                lrow.Cells[0].CellFormat.FitText = false;
                                lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                for (int i = 0; i < (3 * 6); i++)
                                {
                                   // if (i % 18 == 0)
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                    mp = Util.NextCell(mp as Paragraph);
                                }
                                (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                mp = Util.NextCell(mp as Paragraph);
                                (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                            }
                            else
                            {
                                if (!hasGroup)
                                {
                                    row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                }
                            }
                        }

                        previousCellDomain = row.Cells[0].ToTxt();
                    }
                    #endregion

                    #endregion
                }
                else if (PrintSetting.ListMethod == ListMethod.SubjectOnly)
                {
                    #region 列印科目
                    UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();

                    foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                    {
                        SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                        if (!student.SemestersScore.Contains(sysems)) continue;

                        SemesterScore semsscore = student.SemestersScore[sysems];

                        foreach (string strSubject in semsscore.Subject)
                        {
                            SemesterSubjectScore subject = semsscore.Subject[strSubject];

                            RowHeader header;
                            if (IsFlexible(subject.Domain))
                                header = new RowHeader("彈性課程", strSubject);
                            else
                                header = new RowHeader(subject.Domain, strSubject);

                            header.IsDomain = false;

                            if (!RowIndexs.Contains(header))
                                RowIndexs.Add(header);
                        }
                    }

                    RowHeader lheader = new RowHeader(LearningDomainName, string.Empty);
                    lheader.IsDomain = true;
                    //RowIndexs.Add(lheader);

                    //List<RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());
                    List<RowHeader> sortedHeaders = RowIndexs.ToList();

                    sortedHeaders.Sort(delegate(RowHeader x, RowHeader y)
                    {
                        Subj xx = new JHSchool.Evaluation.Subject(x.Subject, x.Domain);
                        Subj yy = new JHSchool.Evaluation.Subject(y.Subject, y.Domain);

                        return xx.CompareTo(yy);
                    });
                    //sortedHeaders.Sort(Util.SortSubject);
                    //sortedHeaders.Sort(Util.SortDomain);

                    //把學習領域放在正確的地方。
                    foreach (RowHeader eachHeader in sortedHeaders.ToArray())
                    {
                        if (IsFlexible(eachHeader.Domain))
                        {
                            int index = sortedHeaders.IndexOf(eachHeader);
                            sortedHeaders.Insert(index, lheader);
                            break;
                        }
                    }
                    if (sortedHeaders.IndexOf(lheader) < 0)
                        sortedHeaders.Add(lheader);

                    //產生 Row。
                    List<RowHeader> indexHeaders = new List<RowHeader>();
                    Row current = template;
                    int rowIndex = 0;
                    foreach (RowHeader header in sortedHeaders)
                    {
                        RowHeader indexH = header;
                        indexH.Index = rowIndex++;
                        indexHeaders.Add(indexH);

                        Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                        if (header.Domain == LearningDomainName)
                        {
                            string headerName = string.Empty;

                            if (PrintSetting.PrintRank)
                                headerName = "學習領域排名";

                            if (PrintSetting.PrintRankPercentage)
                                headerName = "學習領域百分比";

                            if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                                headerName = "學習領域排名/百分比";

                            if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                            {
                                Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                lrow.Cells[0].Write(builder, headerName);
                                rowIndex++;
                            }
                        }

                        if (IsFlexible(header.Domain))
                        {
                            datarow.Cells[0].Write(builder, header.Domain);
                            datarow.Cells[1].Write(builder, header.Subject);
                        }
                        else if (header.Domain == LearningDomainName)
                            datarow.Cells[0].Write(builder, header.Domain);
                        else
                            datarow.Cells[0].Write(builder, header.Subject);
                    }

                    //填資料
                    Row RatingRow = null;
                    foreach (RowHeader header in indexHeaders)
                    {
                        SemesterDataCollection semesters = new SemesterDataCollection();
                        Row row = table.Rows[header.Index + 3];
                        foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                        {
                            SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                            semesters.Add(sysems);

                            if (!student.SemestersScore.Contains(sysems)) continue;
                            if (!student.HeaderList.ContainsKey(sysems)) continue;

                            int columnIndex = student.HeaderList[sysems];
                            SemesterScore semsscore = student.SemestersScore[sysems];

                            decimal? score = null;
                            decimal? weight = null;

                            if (header.IsDomain)
                            {
                                if (semsscore.Domain.Contains(header.Domain))
                                {
                                    score = semsscore.Domain[header.Domain].Value;
                                    weight = semsscore.Domain[header.Domain].Weight;
                                }
                            }
                            else
                            {
                                if (semsscore.Subject.Contains(header.Subject))
                                {
                                    score = semsscore.Subject[header.Subject].Value;
                                    weight = semsscore.Subject[header.Subject].Weight;
                                }
                            }

                            if (header.Domain == LearningDomainName)
                            {
                                score = semsscore.LearnDomainScore;

                                row.Cells[columnIndex * 3 + 2].CellFormat.FitText = false;
                                row.Cells[columnIndex * 3 + 2].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[columnIndex * 3 + 3].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (!score.HasValue) continue;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                    RatingRow = row.NextSibling as Row;
                            }
                            else
                            {
                                if (!score.HasValue) continue;
                                if (!weight.HasValue) weight = 0;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)weight) + "");
                                row.Cells[columnIndex * 3 + 3].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));
                            }
                        }

                        //算平均...
                        decimal? avgScore = null;
                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                avgScore = student.SemestersScore.AvgLearningDomainScore(semesters);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseLearnDomainScore(avgScore.Value);
                            }
                            else
                            {
                                avgScore = student.SemestersScore.AvgDomainScore(semesters, header.Domain);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseDomainScore(avgScore.Value);
                            }
                        }
                        else
                        {
                            avgScore = student.SemestersScore.AvgSubjectScore(semesters, header.Subject);

                            if (!avgScore.HasValue) continue;

                            if (student.CalculationRule == null)
                                avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                            else
                                avgScore = student.CalculationRule.ParseSubjectScore(avgScore.Value);
                        }

                        row.Cells[20].Write(builder, (double)avgScore + "");
                        row.Cells[21].Write(builder, Util.GetDegree(avgScore.Value));
                    }
                    if (RatingRow != null)
                    {
                        PlaceCollection places = student.Places.NS("年排名");

                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            Cell datacell = RatingRow.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            if (places.Contains(placeKey))
                                datacell.Write(builder, GetPlaceString(places, placeKey));
                        }

                        if (places.Contains(LearningDomainName))
                            RatingRow.Cells[20].Write(builder, GetPlaceString(places, LearningDomainName));
                    }

                    //合併相關欄位。
                    string previousCellDomain = string.Empty;
                    foreach (RowHeader header in indexHeaders)
                    {
                        Row row = table.Rows[header.Index + 3];

                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    Row lrow = row.NextSibling as Row;
                                    lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    lrow.Cells[0].CellFormat.FitText = false;
                                    lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                    Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                    for (int i = 0; i < (3 * 6); i++)
                                    {
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                        mp = Util.NextCell(mp as Paragraph);
                                    }
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                    mp = Util.NextCell(mp as Paragraph);
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                                }
                            }
                        }
                        else if (IsFlexible(header.Domain))
                        {
                            if (previousCellDomain == header.Domain)
                                row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                            else
                                row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;

                            previousCellDomain = header.Domain;
                        }
                        else
                        {
                            //row.Cells[0].CellFormat.FitText = true;
                            row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                            row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                        }
                    }
                    #endregion
                }

                template.NextSibling.Remove();
                template.Remove();
                #endregion
            }
            else if (e.FieldName == "Fix:缺曠獎懲")
            {
                #region 列印獎懲資料
                int Offset = 2;
                Row MeritA = builder.CurrentParagraph.ParentNode.ParentNode as Row;
                Row MeritB = MeritA.NextSibling as Row;
                Row MeritC = MeritB.NextSibling as Row;
                Row DemeritA = MeritC.NextSibling as Row;
                Row DemeritB = DemeritA.NextSibling as Row;
                Row DemeritC = DemeritB.NextSibling as Row;
                Row DisciplineSet = DemeritC.NextSibling as Row;
                Row DisciplineNormal = DisciplineSet.NextSibling as Row;

                foreach (SemesterData each in student.Summaries.Keys)
                {
                    XmlElement summary = student.Summaries[each];

                    if (!student.HeaderList.ContainsKey(each)) continue;

                    int ColumnIndex = student.HeaderList[each];

                    XmlElement xmlmerit = summary.SelectSingleNode("DisciplineStatistics/Merit") as XmlElement;
                    XmlElement xmldemerit = summary.SelectSingleNode("DisciplineStatistics/Demerit") as XmlElement;

                    if (xmlmerit != null)
                    {
                        if (!string.IsNullOrEmpty(GetString(xmlmerit.GetAttribute("A"))))
                            MeritA.Cells[Offset + ColumnIndex].Write(builder, GetString(xmlmerit.GetAttribute("A")));
                        if (!string.IsNullOrEmpty(GetString(xmlmerit.GetAttribute("B"))))
                            MeritB.Cells[Offset + ColumnIndex].Write(builder, GetString(xmlmerit.GetAttribute("B")));
                        if (!string.IsNullOrEmpty(GetString(xmlmerit.GetAttribute("C"))))
                            MeritC.Cells[Offset + ColumnIndex].Write(builder, GetString(xmlmerit.GetAttribute("C")));
                    }

                    if (xmldemerit != null)
                    {
                        if (!string.IsNullOrEmpty(GetString(xmldemerit.GetAttribute("A"))))
                            DemeritA.Cells[Offset + ColumnIndex].Write(builder, GetString(xmldemerit.GetAttribute("A")));
                        if (!string.IsNullOrEmpty(GetString(xmldemerit.GetAttribute("B"))))
                            DemeritB.Cells[Offset + ColumnIndex].Write(builder, GetString(xmldemerit.GetAttribute("B")));
                        if (!string.IsNullOrEmpty(GetString(xmldemerit.GetAttribute("C"))))
                            DemeritC.Cells[Offset + ColumnIndex].Write(builder, GetString(xmldemerit.GetAttribute("C")));
                    }

                    StringBuilder normalString = new StringBuilder();
                    StringBuilder setString = new StringBuilder();

                    foreach (XmlElement absence in summary.SelectNodes("AttendanceStatistics/Absence"))
                    {
                        string count = absence.GetAttribute("Count");
                        string periodType = absence.GetAttribute("PeriodType");
                        string periodName = absence.GetAttribute("Name");

                        if (string.IsNullOrEmpty(count)) continue;
                        if (!PrintAbsences.ContainsKey(periodType)) continue;
                        if (!PrintAbsences[periodType].Contains(periodName)) continue;

                        if (periodType == "一般")
                        {
                            if (normalString.Length > 0) normalString.AppendLine();
                            normalString.Append(periodName + ":" + count);
                        }
                        else if (periodType == "集會")
                        {
                            if (setString.Length > 0) setString.AppendLine();
                            setString.Append(periodName + ":" + count);
                        }
                    }

                    DisciplineNormal.Cells[Offset + ColumnIndex].Write(builder, normalString.ToString());
                    DisciplineSet.Cells[Offset + ColumnIndex].Write(builder, setString.ToString());
                }
                #endregion
            }
        }
        /// <summary>
        /// 計算服務學期時數積分。
        /// 2021-10 Cynthia 採計以學年為單位,每滿3小時調整為採計2分,未滿3小時仍維持不予採計,並取消每一學年採計上限,為三學年採計上現仍為10分
        /// https://3.basecamp.com/4399967/buckets/15852426/todos/4240673684
        /// </summary>
        /// <param name="students"></param>
        public static void CalcServiceLearning(this List <StudentExcess> students)
        {
            foreach (StudentExcess student in students)
            {
                SemesterDataCollection allSems = student.SixSemester.ToSemesterOnly();


                //每學年的時數。
                Dictionary <int, decimal> yearScore = new Dictionary <int, decimal>();
                foreach (SemesterData sems in allSems)
                {
                    if (student.ServiceLearning.ContainsKey(sems))
                    {
                        if (!yearScore.ContainsKey(sems.SchoolYear))
                        {
                            yearScore[sems.SchoolYear] = 0;
                        }

                        yearScore[sems.SchoolYear] += student.ServiceLearning[sems];
                    }
                }

                //計算積分。
                //2021-10 因疫情影響,由1分改為2分、取消每學年上限
                // 2021-12 增加判斷,若學生為1或7年級,維持原本的判斷方式,若否則採用2021-10 規則
                if (student.GradeYear == "1" || student.GradeYear == "7")
                {
                    foreach (int year in yearScore.Keys.ToArray())
                    {
                        yearScore[year] = Math.Floor(yearScore[year] / 3);
                    }

                    //限制每學年積分上限。
                    foreach (int year in yearScore.Keys.ToArray())
                    {
                        if (yearScore[year] > 4)
                        {
                            yearScore[year] = 4;
                        }
                    }
                }
                else  //非1、7年級,採用因疫情的新規定
                {
                    foreach (int year in yearScore.Keys.ToArray())
                    {
                        yearScore[year] = (Math.Floor(yearScore[year] / 3)) * 2;
                    }
                }


                //計算總分。
                decimal score = 0;
                foreach (int year in yearScore.Keys)
                {
                    score += yearScore[year];
                }

                //限制總分上限。
                if (score > 10)
                {
                    score = 10;
                }

                student.ServiceLearningFinal = score;
            }
        }
        private void PrintDomainOnly(DocumentBuilder builder, ReportStudent student, Row template, Table table)
        {
            #region 列印領域
            UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();

            #region 列印 RowHeader
            foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
            {
                SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);

                //如果不包含該學期成績資料,就跳過。
                if (!student.SemestersScore.Contains(sysems)) continue;

                SemesterScore semsscore = student.SemestersScore[sysems];

                //準備彈性課程的科目(要詳列出來)。
                foreach (string strSubject in semsscore.Subject)
                {
                    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                    if (DetailDomain.Contains(subject.Domain))
                    {
                        RowHeader header = new RowHeader(subject.Domain, strSubject);
                        header.IsDomain = false;

                        if (!RowIndexs.Contains(header))
                            RowIndexs.Add(header);
                    }
                }

                //準備領域資料。
                foreach (string strDomain in semsscore.Domain)
                {
                    if (!Subj.Domains.Contains(strDomain)) continue;

                    SemesterDomainScore domain = semsscore.Domain[strDomain];

                    if (!DetailDomain.Contains(strDomain))
                    {
                        RowHeader header = new RowHeader(strDomain, string.Empty);
                        header.IsDomain = true;

                        if (!RowIndexs.Contains(header))
                            RowIndexs.Add(header);
                    }
                }
            }

            List<RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());

            //產生 Row。
            List<RowHeader> indexHeaders = new List<RowHeader>();
            Row current = template;
            int rowIndex = 0;
            foreach (RowHeader header in sortedHeaders)
            {
                RowHeader indexH = header;
                indexH.Index = rowIndex++;
                indexHeaders.Add(indexH);
                bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                string groupName = Subj.GetDomainGroup(header.Domain);

                Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                if (header.IsDomain)
                {
                    string domainCName = header.Domain;
                    string domainEName = Subj.GetDomainEnglish(header.Domain);
                    string domainString = domainCName + (string.IsNullOrEmpty(domainEName) ? "" : domainEName);

                    if (hasGroup)
                    {
                        string gn = groupName;

                        if (groupName == "語文")
                            gn = "語文\nLanguage";

                        datarow.Cells[0].Write(builder, gn);
                        datarow.Cells[1].Write(builder, domainString);
                    }
                    else
                        datarow.Cells[0].Write(builder, domainString);
                }
                else
                {
                    string gn = "";
                    //Additional Classes

                    if (IsFlexible(header.Domain))
                        gn = "彈性課程\nAdditional Classes";
                    else
                        gn = header.Domain;

                    string subjCName = header.Subject;
                    string subjEName = Subj.GetSubjectEnglish(header.Subject);
                    string subjString = header.Subject + (string.IsNullOrEmpty(subjEName) ? "" : "\n" + subjEName);

                    //把空白的領域當成「彈性課程」。
                    string domain = gn;
                    datarow.Cells[0].Write(builder, domain);
                    datarow.Cells[1].Write(builder, subjString);
                }
            }
            #endregion

            #region 填資料
            //Row RatingRow = null;
            foreach (RowHeader header in indexHeaders)
            {
                SemesterDataCollection semesters = new SemesterDataCollection();
                Row row = table.Rows[header.Index + DataRowOffset];
                foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                    semesters.Add(sysems);

                    if (!student.SemestersScore.Contains(sysems)) continue;
                    if (!student.HeaderList.ContainsKey(sysems)) continue;

                    int columnIndex = student.HeaderList[sysems];
                    SemesterScore semsscore = student.SemestersScore[sysems];

                    decimal? score = null;
                    decimal? weight = null;

                    if (header.IsDomain)
                    {
                        if (semsscore.Domain.Contains(header.Domain))
                        {
                            score = semsscore.Domain[header.Domain].Value;
                            weight = semsscore.Domain[header.Domain].Weight;
                        }
                    }
                    else
                    {
                        if (semsscore.Subject.Contains(header.Subject))
                        {
                            score = semsscore.Subject[header.Subject].Value;
                            weight = semsscore.Subject[header.Subject].Weight;
                        }
                    }

                    if (!score.HasValue) continue;
                    if (!weight.HasValue) weight = 0;

                    if (PrintScore)
                        row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                    else
                        row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                }

            }

            #endregion

            #region 合併相關欄位。
            string previousCellDomain = string.Empty;
            foreach (RowHeader header in indexHeaders)
            {
                bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                string groupName = Subj.GetDomainGroup(header.Domain);

                Row row = table.Rows[header.Index + DataRowOffset];

                if (previousCellDomain == row.Cells[0].ToTxt())
                    row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                else
                    row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;

                if (header.IsDomain)
                {
                    if (!hasGroup)
                    {
                        row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                        row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                    }
                }

                previousCellDomain = row.Cells[0].ToTxt();
            }
            #endregion

            #endregion
        }
        private void PrintSubjectOnly(DocumentBuilder builder, ReportStudent student, Row template, Table table)
        {
            #region 列印科目
            UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();

            #region 列印 RowHeader
            Dictionary<string, string> subjToDomain = new Dictionary<string, string>();
            foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
            {
                SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                if (!student.SemestersScore.Contains(sysems)) continue;

                SemesterScore semsscore = student.SemestersScore[sysems];

                foreach (string strSubject in semsscore.Subject)
                {
                    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                    if (!subjToDomain.ContainsKey(strSubject))
                        subjToDomain.Add(strSubject, subject.Domain);

                    RowHeader header = new RowHeader(subjToDomain[strSubject], strSubject);
                    header.IsDomain = false;

                    if (!RowIndexs.Contains(header))
                        RowIndexs.Add(header);
                }
            }

            List<RowHeader> sortedHeaders = RowIndexs.ToList();
            sortedHeaders.Sort(delegate(RowHeader x, RowHeader y)
            {
                Subj xx = new JHSchool.Evaluation.Subject(x.Subject, x.Domain);
                Subj yy = new JHSchool.Evaluation.Subject(y.Subject, y.Domain);

                return xx.CompareTo(yy);
            });

            //產生 Row。
            List<RowHeader> indexHeaders = new List<RowHeader>();
            Row current = template;
            int rowIndex = 0;
            foreach (RowHeader header in sortedHeaders)
            {
                RowHeader indexH = header;
                indexH.Index = rowIndex++;
                indexHeaders.Add(indexH);

                Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                string gn = "";
                //Additional Classes

                string subjCName = header.Subject;
                string subjEName = Subj.GetSubjectEnglish(header.Subject);
                string subjString = header.Subject + (string.IsNullOrEmpty(subjEName) ? "" : " " + subjEName);

                datarow.Cells[0].Write(builder, subjString);

                //if (IsFlexible(header.Domain))
                //{
                //    gn = "彈性課程\nAdditional Classes";
                //    //把空白的領域當成「彈性課程」。
                //    datarow.Cells[0].Write(builder, gn);
                //    datarow.Cells[1].Write(builder, subjString);
                //}
                //else
                //{
                //}
            }
            #endregion

            #region 填資料
            //填資料
            foreach (RowHeader header in indexHeaders)
            {
                SemesterDataCollection semesters = new SemesterDataCollection();
                Row row = table.Rows[header.Index + DataRowOffset];
                foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                    semesters.Add(sysems);

                    if (!student.SemestersScore.Contains(sysems)) continue;
                    if (!student.HeaderList.ContainsKey(sysems)) continue;

                    int columnIndex = student.HeaderList[sysems];
                    SemesterScore semsscore = student.SemestersScore[sysems];

                    decimal? score = null;
                    decimal? weight = null;

                    //if (header.IsDomain)
                    //{
                    //    if (semsscore.Domain.Contains(header.Domain))
                    //    {
                    //        score = semsscore.Domain[header.Domain].Value;
                    //        weight = semsscore.Domain[header.Domain].Weight;
                    //    }
                    //}
                    //else
                    //{
                    if (semsscore.Subject.Contains(header.Subject))
                    {
                        score = semsscore.Subject[header.Subject].Value;
                        weight = semsscore.Subject[header.Subject].Weight;
                    }
                    //}

                    if (!score.HasValue) continue;
                    if (!weight.HasValue) weight = 0;

                    if (PrintScore)
                        row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                    else
                        row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                }
            }
            #endregion

            #region 合併相關欄位。
            string previousCellDomain = string.Empty;
            foreach (RowHeader header in indexHeaders)
            {
                Row row = table.Rows[header.Index + DataRowOffset];

                //if (IsFlexible(header.Domain))
                //{
                //    if (previousCellDomain == row.Cells[0].ToTxt())
                //        row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                //    else
                //        row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;
                //}
                //else
                {
                    row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                    row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                }

                previousCellDomain = row.Cells[0].ToTxt();
            }
            #endregion

            #endregion
        }
Exemple #18
0
            /// <summary>
            /// 取得五學期領域成績平均
            /// </summary>
            /// <param name="sems"></param>
            /// <returns></returns>
            public decimal?GetAverage(SemesterDataCollection sems)
            {
                decimal sum, count;

                Dictionary <SemesterData, decimal?> semScores = new Dictionary <SemesterData, decimal?>();

                foreach (SemesterData sem in sems)
                {
                    sum = count = decimal.Zero;

                    if (!_scores.ContainsKey(sem))
                    {
                        continue;
                    }
                    foreach (string domain in Global.GetDomains())
                    {
                        if (!_scores[sem].Domains.ContainsKey(domain))
                        {
                            continue;
                        }

                        DomainScore domainScore = _scores[sem].Domains[domain];
                        if (!domainScore.Score.HasValue)
                        {
                            continue;
                        }
                        if (!domainScore.Credit.HasValue)
                        {
                            continue;
                        }
                        sum   += domainScore.Score.Value * domainScore.Credit.Value;
                        count += domainScore.Credit.Value;
                    }
                    if (count > 0)
                    {
                        semScores.Add(sem, sum / count);
                    }
                    else
                    {
                        semScores.Add(sem, null);
                    }
                }

                sum = count = decimal.Zero;
                foreach (decimal?score in semScores.Values)
                {
                    if (!score.HasValue)
                    {
                        continue;
                    }
                    sum += score.Value;
                    count++;
                }

                if (count > 0)
                {
                    return(sum / count);
                }
                else
                {
                    return(null);
                }
            }