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); } }
/// <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; }); }
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); }
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(); }
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)); }
/// <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; } }
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; } }
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); }
//最好這程式有人能維護的了....... 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; } } }
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 }
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 }
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 }
/// <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); } }