示例#1
0
        private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            _worker.ReportProgress(0, "開始列印 五育獎報表...");

            _worker.ReportProgress(20, "取得本學期開設的班級課程...");

            // 本學期 班級開設的 課程清單
            _courseList = K12.Data.Course.SelectByClass(int.Parse(_school_year), int.Parse(_semester), _classList);

            // 課程ID List
            List <string> courseIDList = new List <string>();

            foreach (K12.Data.CourseRecord cr in _courseList)
            {
                courseIDList.Add(cr.ID);
            }



            _worker.ReportProgress(40, "取得本學期科目成績...");

            // 取得學生清單(依班級)
            _studentList = K12.Data.Student.SelectByClasses(_classList);

            // 學生ID List
            List <string> stuIDList = new List <string>();

            //整理學生清單(依照班級ID 分類)
            foreach (K12.Data.StudentRecord sr in _studentList)
            {
                // 若非一般生 不列入排名學生清單
                if (sr.Status != K12.Data.StudentRecord.StudentStatus.一般)
                {
                    continue;
                }

                if (!_studentDict.ContainsKey(sr.Class.ID))
                {
                    _studentDict.Add(sr.Class.ID, new List <K12.Data.StudentRecord>());

                    _studentDict[sr.Class.ID].Add(sr);
                }
                else
                {
                    _studentDict[sr.Class.ID].Add(sr);
                }

                stuIDList.Add(sr.ID);
            }

            // 排序(依照座號)

            foreach (string classID in _studentDict.Keys)
            {
                _studentDict[classID].Sort((x, y) => { return(x.SeatNo.HasValue ? x.SeatNo.Value.CompareTo(y.SeatNo) : -1); });
            }

            // 取得 這群學生本學期 評量成績
            _subjectScoreList = K12.Data.SemesterScore.SelectBySchoolYearAndSemester(stuIDList, int.Parse(_school_year), int.Parse(_semester));

            // 整理學期科目成績
            foreach (K12.Data.SemesterScoreRecord semesterRecord in _subjectScoreList)
            {
                if (semesterRecord.Subjects.Keys.Count > 0)
                {
                    foreach (string subject in semesterRecord.Subjects.Keys)
                    {
                        // 只有在本次選擇的科目才納入
                        if (!_selsubjectList.Contains(subject))
                        {
                            continue;
                        }

                        if (!_subjectScoreDict.ContainsKey(semesterRecord.RefStudentID))
                        {
                            _subjectScoreDict.Add(semesterRecord.RefStudentID, new List <K12.Data.SubjectScore>());

                            _subjectScoreDict[semesterRecord.RefStudentID].Add(semesterRecord.Subjects[subject]);
                        }
                        else
                        {
                            _subjectScoreDict[semesterRecord.RefStudentID].Add(semesterRecord.Subjects[subject]);
                        }
                    }
                }
            }


            _worker.ReportProgress(60, "成績排序中...");


            int progress     = 100 / (_subjectScoreDict.Keys.Count != 0 ? _subjectScoreDict.Keys.Count : 100);
            int studentCount = 0;

            foreach (string stuID in _subjectScoreDict.Keys)
            {
                if (!_awardScoreDict.ContainsKey(stuID))
                {
                    _awardScoreDict.Add(stuID, new List <AwardScore>());

                    foreach (K12.Data.SubjectScore subjectRecord in _subjectScoreDict[stuID])
                    {
                        AwardScore awardScore;

                        awardScore = _awardScoreDict[stuID].Find(awardscore => awardscore.ScoreType == "學期總成績");

                        // 舊的沒有的話, 第一筆 新增
                        if (awardScore == null)
                        {
                            awardScore = new AwardScore();

                            decimal?credit = subjectRecord.Credit;

                            awardScore.ScoreType = "學期總成績";

                            awardScore.Score = subjectRecord.Score * credit;

                            _awardScoreDict[stuID].Add(awardScore);
                        }
                        // 已經有成績的話 繼續 加總
                        else
                        {
                            decimal?credit = subjectRecord.Credit;
                            awardScore.Score += subjectRecord.Score * credit;
                        }
                    }
                }

                studentCount++;

                _worker.ReportProgress(progress * studentCount, "計算總成績中...");
            }



            _worker.ReportProgress(70, "填寫報表...");

            // 取得 系統預設的樣板
            Workbook wb = new Workbook(new MemoryStream(Properties.Resources.小五育獎樣板));

            #region 填表

            FillProgressScoreExcelColunm(wb);

            #endregion

            //// 把當作樣板的 第一張 移掉
            wb.Worksheets.RemoveAt("樣板");

            wb.Worksheets.RemoveAt("理想產生結果");

            e.Result = wb;

            _worker.ReportProgress(100, "五育獎報表列印完成。");
        }
        private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            _worker.ReportProgress(0, "開始列印 進步獎報表...");

            _worker.ReportProgress(20, "取得本學期開設的班級課程...");

            // 本學期 班級開設的 課程清單
            _courseList = K12.Data.Course.SelectByClass(int.Parse(_school_year), int.Parse(_semester), _classList);

            // 課程ID List
            List <string> courseIDList = new List <string>();

            foreach (K12.Data.CourseRecord cr in _courseList)
            {
                courseIDList.Add(cr.ID);

                AssessmentSetupDict.Add(cr.ID, cr.AssessmentSetup);
            }



            _worker.ReportProgress(40, "取得本學期評量成績...");

            // 取得學生清單(依班級)
            _studentList = K12.Data.Student.SelectByClasses(_classList);

            // 學生ID List
            List <string> stuIDList = new List <string>();

            //整理學生清單(依照班級ID 分類)
            foreach (K12.Data.StudentRecord sr in _studentList)
            {
                // 若非一般生 不列入排名學生清單
                if (sr.Status != K12.Data.StudentRecord.StudentStatus.一般)
                {
                    continue;
                }

                if (!_studentDict.ContainsKey(sr.Class.ID))
                {
                    _studentDict.Add(sr.Class.ID, new List <K12.Data.StudentRecord>());

                    _studentDict[sr.Class.ID].Add(sr);
                }
                else
                {
                    _studentDict[sr.Class.ID].Add(sr);
                }

                stuIDList.Add(sr.ID);
            }

            // 排序(依照座號)

            foreach (string classID in _studentDict.Keys)
            {
                _studentDict[classID].Sort((x, y) => { return(x.SeatNo.HasValue ? x.SeatNo.Value.CompareTo(y.SeatNo) : -1); });
            }

            // 取得評量成績
            _sceList = K12.Data.SCETake.SelectByStudentAndCourse(stuIDList, courseIDList);

            // 整理評量成績
            foreach (K12.Data.SCETakeRecord scetRecord in _sceList)
            {
                // 只有在本次選擇的科目才納入
                if (!_selsubjectList.Contains(scetRecord.Course.Subject))
                {
                    continue;
                }

                if (!_sceDict.ContainsKey(scetRecord.RefStudentID))
                {
                    _sceDict.Add(scetRecord.RefStudentID, new List <K12.Data.SCETakeRecord>());

                    _sceDict[scetRecord.RefStudentID].Add(scetRecord);
                }
                else
                {
                    _sceDict[scetRecord.RefStudentID].Add(scetRecord);
                }
            }


            _worker.ReportProgress(60, "成績排序中...");


            int progress     = 100 / (_sceDict.Keys.Count != 0 ? _sceDict.Keys.Count:100);
            int studentCount = 0;

            foreach (string stuID in _sceDict.Keys)
            {
                if (!_awardScoreDict.ContainsKey(stuID))
                {
                    _awardScoreDict.Add(stuID, new List <AwardScore>());

                    // 2019/06/12 穎驊筆記, 這邊的程式碼還可以再優化, 待目前城版本測試後 ,再調整
                    foreach (K12.Data.SCETakeRecord scetRecord in _sceDict[stuID])
                    {
                        // 第一次評量成績
                        if (scetRecord.Exam.Name == _examName1)
                        {
                            AwardScore awardScore;

                            awardScore = _awardScoreDict[stuID].Find(awardscore => awardscore.ScoreType == _examName1 + "總成績");

                            // 舊的沒有的話, 第一筆 新增
                            if (awardScore == null)
                            {
                                awardScore = new AwardScore();

                                decimal?credit = scetRecord.Course.Credit;

                                // 效率太慢,另外整理
                                //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup;

                                K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID)? AssessmentSetupDict[scetRecord.RefCourseID] :null;

                                if (assessmentsetup == null)
                                {
                                    continue;
                                }

                                // 定期的比例
                                int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup));

                                // 平時的比例 (兩者相加 為100)
                                int assignmentScoreRatio = 100 - scoreRatio;

                                awardScore.ScoreType = _examName1 + "總成績";

                                if (awardScore.Score.HasValue)
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score += totalScore;
                                }
                                else
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score = totalScore;
                                }

                                _awardScoreDict[stuID].Add(awardScore);
                            }
                            // 已經有成績的話 繼續 加總
                            else
                            {
                                decimal?credit = scetRecord.Course.Credit;

                                // 效率太慢,另外整理
                                //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup;

                                K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID) ? AssessmentSetupDict[scetRecord.RefCourseID] : null;

                                if (assessmentsetup == null)
                                {
                                    continue;
                                }

                                // 定期的比例
                                int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup));

                                // 平時的比例 (兩者相加 為100)
                                int assignmentScoreRatio = 100 - scoreRatio;

                                if (awardScore.Score.HasValue)
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score += totalScore;
                                }
                                else
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score = totalScore;
                                }
                            }
                        }

                        // 第二次評量成績
                        if (scetRecord.Exam.Name == _examName2)
                        {
                            AwardScore awardScore;

                            awardScore = _awardScoreDict[stuID].Find(awardscore => awardscore.ScoreType == _examName2 + "總成績");

                            // 舊的沒有的話, 第一筆 新增
                            if (awardScore == null)
                            {
                                awardScore = new AwardScore();

                                decimal?credit = scetRecord.Course.Credit;

                                // 效率太慢,另外整理
                                //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup;

                                K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID) ? AssessmentSetupDict[scetRecord.RefCourseID] : null;

                                if (assessmentsetup == null)
                                {
                                    continue;
                                }

                                // 定期的比例
                                int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup));

                                // 平時的比例 (兩者相加 為100)
                                int assignmentScoreRatio = 100 - scoreRatio;

                                awardScore.ScoreType = _examName2 + "總成績";

                                if (awardScore.Score.HasValue)
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score += totalScore;
                                }
                                else
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score = totalScore;
                                }

                                _awardScoreDict[stuID].Add(awardScore);
                            }
                            // 已經有成績的話 繼續 加總
                            else
                            {
                                decimal?credit = scetRecord.Course.Credit;

                                // 效率太慢,另外整理
                                //K12.Data.AssessmentSetupRecord assessmentsetup = scetRecord.Course.AssessmentSetup;

                                K12.Data.AssessmentSetupRecord assessmentsetup = AssessmentSetupDict.ContainsKey(scetRecord.RefCourseID) ? AssessmentSetupDict[scetRecord.RefCourseID] : null;

                                if (assessmentsetup == null)
                                {
                                    continue;
                                }

                                // 定期的比例
                                int scoreRatio = int.Parse(GetScoreRatio(assessmentsetup));

                                // 平時的比例 (兩者相加 為100)
                                int assignmentScoreRatio = 100 - scoreRatio;

                                if (awardScore.Score.HasValue)
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score += totalScore;
                                }
                                else
                                {
                                    decimal?score;
                                    decimal?assignmentScore;

                                    if (isOriScore)
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * (decimal?)scoreRatio : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * (decimal?)assignmentScoreRatio : null;
                                    }
                                    else
                                    {
                                        score = GetScore(scetRecord) != "" ? decimal.Parse(GetScore(scetRecord)) * scoreRatio * credit : null;

                                        assignmentScore = GetAssignmentScore(scetRecord) != "" ? decimal.Parse(GetAssignmentScore(scetRecord)) * assignmentScoreRatio * credit : null;
                                    }

                                    decimal?totalScore = new decimal();

                                    if (score != null)
                                    {
                                        totalScore += score;
                                    }
                                    if (assignmentScore != null)
                                    {
                                        totalScore += assignmentScore;
                                    }

                                    awardScore.Score = totalScore;
                                }
                            }
                        }
                    }
                }

                studentCount++;

                _worker.ReportProgress(progress * studentCount, "計算總成績中...");
            }


            // 上面 加權計算完 第一次 、 第二次考試成績後 (除回定期平時的比例100) , 這邊來算 計算進步分數
            foreach (string studentID in _awardScoreDict.Keys)
            {
                decimal?score1 = new decimal();

                decimal?score2 = new decimal();;

                foreach (AwardScore awardScore in _awardScoreDict[studentID])
                {
                    if (awardScore.ScoreType == _examName1 + "總成績")
                    {
                        awardScore.Score = awardScore.Score / 100;

                        score1 = awardScore.Score;
                    }

                    if (awardScore.ScoreType == _examName2 + "總成績")
                    {
                        awardScore.Score = awardScore.Score / 100;

                        score2 = awardScore.Score;
                    }
                }

                // 假如兩次評量都有分數 進步分數為 第二次的總分 減掉 第一次的總分
                if (score1.HasValue && score2.HasValue)
                {
                    AwardScore awardScore = new AwardScore();

                    awardScore.ScoreType = "進步分數";

                    awardScore.Score = score2 - score1;

                    _awardScoreDict[studentID].Add(awardScore);
                }
            }



            _worker.ReportProgress(70, "填寫報表...");

            // 取得 系統預設的樣板
            Workbook wb = new Workbook(new MemoryStream(Properties.Resources.小進步獎樣板));

            #region 填表

            FillProgressScoreExcelColunm(wb);

            #endregion

            //// 把當作樣板的 第一張 移掉
            wb.Worksheets.RemoveAt("樣板");

            wb.Worksheets.RemoveAt("理想產生結果");

            e.Result = wb;

            _worker.ReportProgress(100, "進步獎報表列印完成。");
        }