Exemple #1
0
        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
        }
Exemple #2
0
        /// <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);
                }
            }
        }
Exemple #3
0
        /// <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
            }
        }