예제 #1
0
        public async Task <IActionResult> ScoreSummaryByDepartment(Department department)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest("Body JSON content invalid"));
            }

            var counselor = await unitOfWork.CounselorRepository.FirstOrDefaultAsync(c => c.Department == department);

            if (counselor == null)
            {
                return(NotFound());
            }

            return(Json(await ScoreSummaryByDepartmentViewModel.GetAsync(unitOfWork, counselor)));
        }
        public async Task <IActionResult> CreateExcelOfAllDepartments()
        {
            string sWebRootFolder = Startup.Environment.WebRootPath;
            string sFileName      = @"excel/" + "ScoreSummaryOfAllDepartments.xlsx";


            FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));

            if (!file.Exists)
            {
                var datatable = unitOfWork.DbContext.Counselors.Select(m => ScoreSummaryByDepartmentViewModel.GetAsync(unitOfWork, m)).ToList();
                using (ExcelPackage package = new ExcelPackage(file))
                {
                    // 添加worksheet
                    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("1");
                    //添加头
                    worksheet.Cells[1, 1].Value = "院系";
                    worksheet.Cells[1, 2].Value = "辅导员";
                    worksheet.Cells[1, 3].Value = "最高分";
                    worksheet.Cells[1, 4].Value = "平均分";
                    worksheet.Cells[1, 5].Value = ">=90";
                    worksheet.Cells[1, 6].Value = ">=75";
                    worksheet.Cells[1, 7].Value = ">=60";
                    worksheet.Cells[1, 8].Value = "不及格";
                    worksheet.Cells[1, 9].Value = "未测试";

                    //添加值
                    int number = 2;
                    foreach (var scoreSummarytask in datatable)
                    {
                        var scoreSummary = await scoreSummarytask;
                        worksheet.Cells[number, 1].Value = scoreSummary.DepartmentID;
                        worksheet.Cells[number, 2].Value = scoreSummary.CounselorName;
                        worksheet.Cells[number, 3].Value = scoreSummary.MaxScore;
                        worksheet.Cells[number, 4].Value = scoreSummary.AverageScore;
                        worksheet.Cells[number, 5].Value = scoreSummary.ScoreBandCount.HigherThan90;
                        worksheet.Cells[number, 6].Value = scoreSummary.ScoreBandCount.HigherThan75;
                        worksheet.Cells[number, 7].Value = scoreSummary.ScoreBandCount.HigherThan60;
                        worksheet.Cells[number, 8].Value = scoreSummary.ScoreBandCount.Failed;
                        worksheet.Cells[number, 9].Value = scoreSummary.ScoreBandCount.NotTested;


                        number++;
                    }

                    number++;
                    //最后空一行添加去全校概况
                    worksheet.Cells[number, 2].Value = "最高分";
                    worksheet.Cells[number, 3].Value = "平均分";
                    worksheet.Cells[number, 4].Value = ">=90";
                    worksheet.Cells[number, 5].Value = ">=75";
                    worksheet.Cells[number, 6].Value = ">=60";
                    worksheet.Cells[number, 7].Value = "不及格";
                    worksheet.Cells[number, 8].Value = "未测试";
                    worksheet.Cells[number, 9].Value = "更新时间";

                    number++;

                    var model = await ScoreSummaryOfSchoolViewModel.GetAsync(unitOfWork);

                    worksheet.Cells[number, 1].Value = "全校分数概况";
                    worksheet.Cells[number, 2].Value = model.MaxScore;
                    worksheet.Cells[number, 3].Value = model.AverageScore;
                    worksheet.Cells[number, 4].Value = model.ScoreBandCount.HigherThan90;
                    worksheet.Cells[number, 5].Value = model.ScoreBandCount.HigherThan75;
                    worksheet.Cells[number, 6].Value = model.ScoreBandCount.HigherThan60;
                    worksheet.Cells[number, 7].Value = model.ScoreBandCount.Failed;
                    worksheet.Cells[number, 8].Value = model.ScoreBandCount.NotTested;
                    worksheet.Cells[number, 9].Value = model.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss");

                    worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
                    worksheet.View.ShowGridLines           = false;                         //去掉sheet的网格线
                    worksheet.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid;
                    worksheet.Cells.Style.Fill.BackgroundColor.SetColor(Color.LightYellow); //设置背景色

                    package.Save();
                }

                using (ExcelPackage package = new ExcelPackage(file))
                {
                    // 添加worksheet
                    ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
                    var            rowCnt    = worksheet.Dimension.End.Row;
                    var            colCnt    = worksheet.Dimension.End.Column;
                    for (int i = 1; i <= rowCnt; i++)
                    {
                        if (i % 2 == 0)
                        {
                            for (int j = 1; j <= colCnt; j++)
                            {
                                worksheet.Cells[i, j].Style.Fill.PatternType = ExcelFillStyle.Solid;
                                worksheet.Cells[i, j].Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
                            }
                        }
                    }

                    package.Save();
                }
            }
            return(null);
        }
예제 #3
0
        public async Task <IActionResult> CountScore([FromBody] List <SubmittedAnswerViewModel> submittedAnswers)
        {
            var timeElapsed = DateTime.Now - this.Session().TestBeginTime;

            if (timeElapsed >= unitOfWork.Configuration.TestTime + TimeSpan.FromMinutes(3) || timeElapsed <= TimeSpan.FromMinutes(3))
            {
                return(BadRequest("Test time not in the proper range!"));
            }

            var size = unitOfWork.Configuration.QuestionCount.Choice + unitOfWork.Configuration.QuestionCount.TrueFalse;

            if (!ModelState.IsValid || submittedAnswers.Count != size)
            {
                return(BadRequest("Body JSON content invalid or does not fit the size: " + size));
            }

            if (this.Session().TestState == TestState.Tested)
            {
                return(Forbid());
            }

            string studentID = this.Session().ID;

            if (studentID == null)
            {
                return(BadRequest("Student ID not set in the session, please login again"));
            }

            if (await unitOfWork.Cache.Database.StringGetAsync("CountingScore:" + studentID) == "true")
            {
                return(BadRequest("Score has already been counting"));
            }
            await unitOfWork.Cache.Database.StringSetAsync("CountingScore:" + studentID, "true");

            try
            {
                var seed = this.Session().SeedID;
                if (seed == null)
                {
                    await unitOfWork.Cache.Database.KeyDeleteAsync("CountingScore:" + studentID);

                    return(BadRequest("Question seed not created"));
                }

                #region calculate score and update student data
                var studentDictionary = unitOfWork.Cache.StudentEntities(studentID.ToDepartment());
                var student           = await studentDictionary.GetAsync(studentID);

                student.Score            = 0;
                student.QuestionSeedID   = (int)seed;
                student.DateTimeFinished = DateTime.Now;
                student.Choices          = submittedAnswers.Select(a => (byte)a.Answer).ToArray();

                if (this.Session().TestBeginTime == null)
                {
                    await unitOfWork.Cache.Database.KeyDeleteAsync("CountingScore:" + studentID);

                    return(BadRequest("Test begin time not set in the session"));
                }
                student.TimeConsumed = student.DateTimeFinished - this.Session().TestBeginTime;

                var correctAnswers = await questionSeedService.GetAnswersBySeedID((int)seed);

                var model = new ResultViewModel
                {
                    Details      = new List <ResultDetailViewModel>(capacity: size),
                    TimeFinished = (DateTime)student.DateTimeFinished,
                    TimeConsumed = (TimeSpan)student.TimeConsumed
                };
                for (int i = 0; i < submittedAnswers.Count; ++i)
                {
                    var submit  = submittedAnswers[i];
                    var correct = correctAnswers[i];
                    if (submit.ID != correct.ID)
                    {
                        await unitOfWork.Cache.Database.KeyDeleteAsync("CountingScore:" + studentID);

                        return(BadRequest("Encounter improper ID in your answer set: " + submit.ID + " at " + i));
                    }
                    student.Score += submit.Answer == correct.Answer ? correct.Points : 0;
                    model.Details.Add(new ResultDetailViewModel {
                        ID = correct.ID, Correct = correct.Answer, Submit = submit.Answer
                    });
                }
                model.Score = (int)student.Score;
                #endregion

                #region save data
                var summary = await ScoreSummaryByDepartmentViewModel.GetAsync(unitOfWork, student.Counselor);

                await summary.UpdateAsync(unitOfWork, student);                                          // 更新院系概况,放在前面防止重复计算

                await unitOfWork.Cache.StudentEntities(student.Department).SetAsync(studentID, student); // 更新Student

                await unitOfWork.Cache.StudentViewModels(student.Department).SetAsync(studentID, (StudentViewModel)student);

                await unitOfWork.Cache.Database.ListRightPushAsync("StudentIDsToUpdate", studentID); // 学生ID放入待更新列表

                await unitOfWork.Cache.Results().SetAsync(studentID, model);                         // result存入缓存

                new ExcelExportService(unitOfWork).UpdateExcelByStudent(student);
                #endregion
                this.Session().TestState = TestState.Tested;

                #region logout
                HttpContext.Session.Clear(); // 注销账户
                await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

                await unitOfWork.Cache.Database.KeyDeleteAsync("CountingScore:" + studentID); // 表示没有正在计算

                #endregion
                return(Json(model));
            }
            catch (Exception ex)
            {
                this.Session().TestState = TestState.Testing;
                await unitOfWork.Cache.Database.KeyDeleteAsync("CountingScore:" + studentID);

                Console.WriteLine(ex.ToString());
                return(BadRequest(ex.ToString()));
            }
        }