private static 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 (IsFlexible(header.Domain)) { header.Domain = "彈性課程"; } 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.IsNullOrEmpty(_SubjDomainEngNameMapping.GetDomainEngName(header.Domain)) ? "" : "\n" + _SubjDomainEngNameMapping.GetDomainEngName(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; //先取得等第對照表 Dictionary <decimal, string> degreeTemplate = Util.GetDegreeTemplate(); 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, degreeTemplate)); } } } #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 == header.Domain) { 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 = header.Domain; } #endregion #endregion }
/// <summary> /// 計算領域成績 /// </summary> /// <param name="defaultRule"></param> //public void CalculateDomainScore(ScoreCalculator defaultRule,bool clearDomainScore) public void CalculateDomainScore(ScoreCalculator defaultRule, DomainScoreSetting setting) { EffortMap effortmap = new EffortMap(); //努力程度對照表。 foreach (StudentScore student in Students) { SemesterScore semsscore = student.SemestersScore[SemesterData.Empty]; SemesterDomainScoreCollection dscores = semsscore.Domain; SemesterSubjectScoreCollection jscores = semsscore.Subject; ScoreCalculator rule = student.CalculationRule; if (rule == null) { rule = defaultRule; } //各領域分數加總。 Dictionary <string, decimal> domainTotal = new Dictionary <string, decimal>(); //各領域原始分數加總。 Dictionary <string, decimal> domainOriginTotal = new Dictionary <string, decimal>(); //各領域權重加總。 Dictionary <string, decimal> domainWeight = new Dictionary <string, decimal>(); //各領域節數加總。 Dictionary <string, decimal> domainPeriod = new Dictionary <string, decimal>(); //文字評量串接。 Dictionary <string, string> domainText = new Dictionary <string, string>(); //各領域補考分數加總。 Dictionary <string, decimal> domainMakeUpScoreTotal = new Dictionary <string, decimal>(); //該領域的科目有補考成績清單 List <string> haveMakeUpScoreDomains = new List <string>(); // 只計算領域成績,不計算科目 bool OnlyCalcDomainScore = false; // 檢查科目成績是否有成績,當有成績且成績的科目領域名稱非空白才計算 int CheckSubjDomainisNotNullCot = 0; // 檢查是否有非科目領域是空白的科目 foreach (string str in jscores) { SemesterSubjectScore objSubj = jscores[str]; string strDomainName = objSubj.Domain.Trim(); if (!string.IsNullOrEmpty(strDomainName)) { CheckSubjDomainisNotNullCot++; } //該領域的科目有補考成績將被加入 if (objSubj.ScoreMakeup.HasValue && !haveMakeUpScoreDomains.Contains(strDomainName)) { haveMakeUpScoreDomains.Add(strDomainName); } } // 當沒有科目成績或科目成績內領域沒有非空白,只計算領域成績。 if (jscores.Count == 0 || CheckSubjDomainisNotNullCot == 0) { OnlyCalcDomainScore = true; } else { OnlyCalcDomainScore = false; } if (OnlyCalcDomainScore == false) { // 從科目計算到領域 #region 總計各領域的總分、權重、節數。 foreach (string strSubj in jscores) { SemesterSubjectScore objSubj = jscores[strSubj]; string strDomain = objSubj.Domain.Injection(); //不計算的領域就不算。 if (!IsValidItem(strDomain)) { continue; } if (objSubj.Value.HasValue && objSubj.Weight.HasValue && objSubj.Period.HasValue) { if (!objSubj.ScoreOrigin.HasValue) { objSubj.ScoreOrigin = objSubj.Value; } //// 針對高雄處理 國語文跟英語合成語文領域 //if (Program.Mode == ModuleMode.KaoHsiung && (strDomain == "國語文" || strDomain == "英語")) //{ // if (!domainTotal.ContainsKey(khDomain)) // { // domainTotal.Add(khDomain, 0); // domainOriginTotal.Add(khDomain, 0); // domainWeight.Add(khDomain, 0); // domainPeriod.Add(khDomain, 0); // domainText.Add(khDomain, string.Empty); // //領域補考成績 // domain_MakeUpScore_Total.Add(khDomain, 0); // } // domainTotal[khDomain] += objSubj.Value.Value * objSubj.Weight.Value; // //科目的原始成績加總 // domainOriginTotal[khDomain] += objSubj.ScoreOrigin.Value * objSubj.Weight.Value; // domainWeight[khDomain] += objSubj.Weight.Value; // domainPeriod[khDomain] += objSubj.Period.Value; // // 2016/2/26 經高雄繼斌與蔡主任討論,語文領域文字描述不需要儲存 // domainText[khDomain] = "";//+= GetDomainSubjectText(strSubj, objSubj.Text); // //領域補考成績總和 ,算法為 先用各科目的"成績" 加權計算 , 之後會再判斷, 此成績總和 是否含有"補考成績" 是否為"補考成績總和" // domain_MakeUpScore_Total[khDomain] += objSubj.Value.Value * objSubj.Weight.Value; //} if (!domainTotal.ContainsKey(strDomain)) { domainTotal.Add(strDomain, 0); domainOriginTotal.Add(strDomain, 0); domainWeight.Add(strDomain, 0); domainPeriod.Add(strDomain, 0); domainText.Add(strDomain, string.Empty); //領域補考成績 domainMakeUpScoreTotal.Add(strDomain, 0); } domainTotal[strDomain] += objSubj.Value.Value * objSubj.Weight.Value; //科目的原始成績加總 domainOriginTotal[strDomain] += objSubj.ScoreOrigin.Value * objSubj.Weight.Value; domainWeight[strDomain] += objSubj.Weight.Value; domainPeriod[strDomain] += objSubj.Period.Value; domainText[strDomain] += GetDomainSubjectText(strSubj, objSubj.Text); //領域補考成績總和 ,算法為 先用各科目的"成績" 加權計算 , 之後會再判斷, 此成績總和 是否含有"補考成績" 是否為"補考成績總和" domainMakeUpScoreTotal[strDomain] += objSubj.Value.Value * objSubj.Weight.Value; } } #endregion #region 計算各領域加權平均。 /* (2014/11/18 補考調整)調整為保留領域成績中的資訊,但是移除多的領域成績項目。 */ // 從科目算過來清空原來領域成績,以科目成績的領域為主 //dscores.Clear(); foreach (string strDomain in domainTotal.Keys) { decimal total = domainTotal[strDomain]; decimal totalOrigin = domainOriginTotal[strDomain]; decimal weight = domainWeight[strDomain]; decimal period = domainPeriod[strDomain]; string text = ""; // 補考總分 decimal makeupScoreTotal = domainMakeUpScoreTotal[strDomain]; if (domainText.ContainsKey(strDomain)) { text = string.Join(";", domainText[strDomain].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); } if (weight <= 0) { continue; //沒有權重就不計算,保留原來的成績。 } decimal weightOriginAvg = rule.ParseDomainScore(totalOrigin / weight); // 補考總分平均 decimal?makeup_score_total_Avg = rule.ParseDomainScore(makeupScoreTotal / weight); //將成績更新回學生。 SemesterDomainScore dscore = null; if (dscores.Contains(strDomain)) { dscore = dscores[strDomain]; } else { dscore = new SemesterDomainScore(); dscores.Add(strDomain, dscore); } //先將算好的成績帶入領域成績,後面的擇優判斷才不會有問題 dscore.ScoreOrigin = weightOriginAvg; dscore.Weight = weight; dscore.Period = period; dscore.Text = text; dscore.Effort = effortmap.GetCodeByScore(weightOriginAvg); dscore.ScoreMakeup = haveMakeUpScoreDomains.Contains(strDomain) ? makeup_score_total_Avg : dscore.ScoreMakeup;//補考成績若無更新則保留原值 //填入dscore.Value if (dscore.ScoreOrigin.HasValue || dscore.ScoreMakeup.HasValue) { dscore.BetterScoreSelection(setting.DomainScoreLimit); } } #endregion #region 高雄專用語文領域成績結算 //高雄市特有領域成績 if (Program.Mode == ModuleMode.KaoHsiung) { decimal total = 0; decimal totalOrigin = 0; decimal totalEffort = 0; decimal weight = 0; decimal period = 0; bool hasMakeupScore = false; foreach (var subDomain in new string[] { "國語文", "英語" }) { if (dscores.Contains(subDomain)) { var subScore = dscores[subDomain]; total += subScore.Value.Value * subScore.Weight.Value; totalOrigin += subScore.ScoreOrigin.Value * subScore.Weight.Value; totalEffort += subScore.Effort.Value * subScore.Weight.Value; weight += subScore.Weight.HasValue ? subScore.Weight.Value : 0; period += subScore.Period.HasValue ? subScore.Period.Value : 0; if (subScore.ScoreMakeup.HasValue) { hasMakeupScore = true; } } } if (weight > 0) { decimal weightValueAvg = rule.ParseDomainScore(total / weight); decimal weightOriginAvg = rule.ParseDomainScore(totalOrigin / weight); int effortAvg = Convert.ToInt32(decimal.Round(totalEffort / weight, 0, MidpointRounding.AwayFromZero)); var strDomain = "語文"; //將成績更新回學生。 SemesterDomainScore dscore = null; if (dscores.Contains(strDomain)) { dscore = dscores[strDomain]; } else { dscore = new SemesterDomainScore(); dscores.Add(strDomain, dscore, 0); } //先將算好的成績帶入領域成績,後面的擇優判斷才不會有問題 dscore.ScoreOrigin = weightOriginAvg; dscore.Weight = weight; dscore.Period = period; dscore.Text = ""; dscore.Effort = effortAvg; dscore.ScoreMakeup = hasMakeupScore ? weightValueAvg : dscore.ScoreMakeup;//補考成績若無更新則保留原值 //填入dscore.Value if (dscore.ScoreOrigin.HasValue || dscore.ScoreMakeup.HasValue) { dscore.BetterScoreSelection(setting.DomainScoreLimit); } } } #endregion //清除不應該存在領域成績 //if (clearDomainScore) if (setting.DomainScoreClear) { foreach (var domainName in dscores.ToArray()) { //如果新計算的領域成績中不包含在原領域清單中,就移除他。 if (!domainTotal.ContainsKey(domainName)) { dscores.Remove(domainName); } } } } //計算課程學習成績。 ScoreResult result = CalcDomainWeightAvgScore(dscores, new UniqueSet <string>()); if (result.Score.HasValue) { semsscore.CourseLearnScore = rule.ParseLearnDomainScore(result.Score.Value); } if (result.ScoreOrigin.HasValue) { semsscore.CourseLearnScoreOrigin = rule.ParseLearnDomainScore(result.ScoreOrigin.Value); } //計算學習領域成績。 result = CalcDomainWeightAvgScore(dscores, Util.VariableDomains); if (result.Score.HasValue) { semsscore.LearnDomainScore = rule.ParseLearnDomainScore(result.Score.Value); } if (result.ScoreOrigin.HasValue) { semsscore.LearnDomainScoreOrigin = rule.ParseLearnDomainScore(result.ScoreOrigin.Value); } } }
/// <summary> /// 計算領域成績 /// </summary> /// <param name="defaultRule"></param> public void CalculateDomainScore(ScoreCalculator defaultRule) { EffortMap effortmap = new EffortMap(); //努力程度對照表。 foreach (StudentScore student in Students) { SemesterScore semsscore = student.SemestersScore[SemesterData.Empty]; SemesterDomainScoreCollection dscores = semsscore.Domain; SemesterSubjectScoreCollection jscores = semsscore.Subject; ScoreCalculator rule = student.CalculationRule; if (rule == null) { rule = defaultRule; } //各領域分數加總。 Dictionary <string, decimal> domainTotal = new Dictionary <string, decimal>(); //各領域權重加總。 Dictionary <string, decimal> domainWeight = new Dictionary <string, decimal>(); //各領域節數加總。 Dictionary <string, decimal> domainPeriod = new Dictionary <string, decimal>(); //文字評量串接。 Dictionary <string, string> domainText = new Dictionary <string, string>(); // 只計算領域成績,不計算科目 bool OnlyCalcDomainScore = false; // 檢查科目成績是否有成績,當有成績且成績的科目領域名稱非空白才計算 int CheckSubjDomainisNotNullCot = 0; // 檢查是否有非科目領域是空白的科目 foreach (string str in jscores) { SemesterSubjectScore objSubj = jscores[str]; string strDomainName = objSubj.Domain.Trim(); if (!string.IsNullOrEmpty(strDomainName)) { CheckSubjDomainisNotNullCot++; } } // 當沒有科目成績或科目成績內領域沒有非空白,只計算領域成績。 if (jscores.Count == 0 || CheckSubjDomainisNotNullCot == 0) { OnlyCalcDomainScore = true; } else { OnlyCalcDomainScore = false; } if (OnlyCalcDomainScore == false) { // 從科目計算到領域 #region 總計各領域的總分、權重、節數。 foreach (string strSubj in jscores) { SemesterSubjectScore objSubj = jscores[strSubj]; string strDomain = objSubj.Domain.Injection(); //不計算的領域就不算。 if (!IsValidItem(strDomain)) { continue; } if (objSubj.Value.HasValue && objSubj.Weight.HasValue && objSubj.Period.HasValue) { if (!domainTotal.ContainsKey(strDomain)) { domainTotal.Add(strDomain, 0); domainWeight.Add(strDomain, 0); domainPeriod.Add(strDomain, 0); domainText.Add(strDomain, string.Empty); } domainTotal[strDomain] += objSubj.Value.Value * objSubj.Weight.Value; domainWeight[strDomain] += objSubj.Weight.Value; domainPeriod[strDomain] += objSubj.Period.Value; domainText[strDomain] += GetDomainSubjectText(strSubj, objSubj.Text); } } #endregion #region 計算各領域加權平均。 // 從科目算過來清空原來領域成績,以科目成績的領域為主 dscores.Clear(); foreach (string strDomain in domainTotal.Keys) { decimal total = domainTotal[strDomain]; decimal weight = domainWeight[strDomain]; decimal period = domainPeriod[strDomain]; string text = string.Join(";", domainText[strDomain].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); if (weight <= 0) { continue; //沒有權重就不計算,保留原來的成績。 } decimal weightAvg = rule.ParseDomainScore(total / weight); //將成績更新回學生。 SemesterDomainScore dscore = null; //if (dscores.Contains(strDomain)) // dscore = dscores[strDomain]; //else //{ dscore = new SemesterDomainScore(); dscores.Add(strDomain, dscore); //} dscore.Value = weightAvg; dscore.Weight = weight; dscore.Period = period; dscore.Text = text; dscore.Effort = effortmap.GetCodeByScore(weightAvg); } } else { // 因為原本就會計算學期領域成績,所以不處理。 } //計算課程學習成績。 decimal?result = CalcDomainWeightAvgScore(dscores, new UniqueSet <string>()); if (result.HasValue) { semsscore.CourseLearnScore = rule.ParseLearnDomainScore(result.Value); } //計算學習領域成績。 result = CalcDomainWeightAvgScore(dscores, Util.VariableDomains); if (result.HasValue) { semsscore.LearnDomainScore = rule.ParseLearnDomainScore(result.Value); } #endregion } }