using Tiobon.Core.IServices; using Tiobon.Core.Model.Models; using Tiobon.Core.Services.BASE; using Tiobon.Core.IRepository.Base; using Tiobon.Core.Common.Caches; using Newtonsoft.Json.Linq; using Tiobon.Core.Common; using Tiobon.Core.Model; using Newtonsoft.Json; using System.Text.RegularExpressions; using System.Net; using Tiobon.Core.Common.Helper; using AgileObjects.AgileMapper.Extensions; namespace Tiobon.Core.Services; /// /// 考试记录 (服务) /// public class Ghre_ExamRecordServices : BaseServices, IGhre_ExamRecordServices { private readonly IBaseRepository _dal; //private readonly IGhre_ExamPaperServices _ghre_ExamPaperServices; public Ghre_ExamRecordServices(ICaching caching, //IGhre_ExamPaperServices ghre_ExamPaperServices, IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; base._caching = caching; //_ghre_ExamPaperServices = ghre_ExamPaperServices; } public override async Task> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true) { if (string.IsNullOrWhiteSpace(filter.orderBy)) filter.orderBy = "CreateTime1 DESC"; if (filter.pageSize == 0) filter.pageSize = 10000; var countSql = @$" SELECT COUNT(1) FROM Ghre_ExamRecord_V"; var sql = @$" SELECT * FROM Ghre_ExamRecord_V"; string conditions = " WHERE IsEnable = 1"; if (!string.IsNullOrEmpty(condition)) conditions += " AND " + condition; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (name == "DueDate") { var jsonParam = JsonConvert.DeserializeObject(value); conditions += $" AND FORMAT(DueDate, 'yyyy-MM-dd') = '{jsonParam.columnValue}'"; continue; } if (!string.IsNullOrWhiteSpace(value)) { var jsonParam = JsonConvert.DeserializeObject(value); switch (jsonParam.operationKey) { case "Include": conditions += $" AND {name} LIKE '%{jsonParam.columnValue}%'"; break; case "NotInclude": conditions += $" AND {name} NOT LIKE '%{jsonParam.columnValue}%'"; break; case "IsNull": conditions += $" AND {name} IS NULL"; break; case "NotNull": conditions += $" AND {name} IS NOT NULL"; break; case "Equal": conditions += $" AND {name} ='{jsonParam.columnValue}'"; break; case "NotEqual": conditions += $" AND {name} !='{jsonParam.columnValue}'"; break; default: break; } } } sql += conditions; countSql += conditions; int total = await Db.Ado.GetIntAsync(countSql); sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY " + filter.orderBy + ") NUM FROM (SELECT * FROM (" + sql + " "; sql += ") A ) B ) C"; sql += " WHERE NUM <= " + filter.pageNum * filter.pageSize + " AND NUM >" + (filter.pageNum - 1) * filter.pageSize; var entitys = await Db.Ado.SqlQueryAsync(sql); entitys.ForEach(async x => { x.ScoreStatus = await GetParaLabel("TrainingExamScoreStatus", x.ScoreStatus); //x.CourseStatusLabel = await GetParaLabel("TrainingCourseStatus", x.CourseStatus); //x.StudyStatusLabel = await GetParaLabel("TrainingStudyStatus", x.StudyStatus); x.IsPassLabel = x.IsPass == true ? "合格" : "不合格"; //x.InStatusLabel = x.InStatus == "1" ? "在职" : null; //x.InStatusLabel = x.InStatus == "2" ? "离职" : null; //x.InStatusLabel = x.InStatus == "0" ? "未入职" : null; if (x.BeginTime != null) x.ExamDate = x.BeginTime.Value.ToString("yyyy-MM-dd"); x.TotalScore += x.Score ?? 0; x.TotalScore += x.AdjustScore ?? 0; //if (x.DueDate != null) // x.DueDate1 = x.DueDate.Value.ToString("yyyy-MM-dd"); //if (x.ExamDate != null) // x.ExamDate1 = x.ExamDate.Value.ToString("yyyy-MM-dd"); }); return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } public async Task> Query(string examId, QueryBody body) { return await QueryFilterPage(body, $"ExamId='{examId}'"); } public async Task ModifyAdjustScore(string examRecordId, EditGhre_ExamRecordInput edit) { var entity = await QuerySingle(examRecordId); var paper = await Db.Queryable().FirstAsync(x => x.Id == entity.ExamPaperId); if (paper == null) return ServiceResult.OprateFailed("该考试管理的试卷已被删除,暂不可变更调整分!"); entity.AdjustScore = edit.AdjustScore; entity.Score += entity.AdjustScore; string score1 = Regex.Replace(entity.Score.ToString(), @"\.(0+)$", "") + "/" + Regex.Replace(entity.Score.ToString(), @"\.(0+)$", ""); if (entity.Score < 0) return ServiceResult.OprateFailed($"调整后得分为【{score1}】,得分不可小于0!"); if (entity.Score > paper.TotalScore) return ServiceResult.OprateFailed($"调整后得分为【{score1}】,不可大于卷面总分【{Regex.Replace(paper.TotalScore.ToString(), @"\.(0+)$", "") + "/" + Regex.Replace(paper.TotalScore.ToString(), @"\.(0+)$", "")}】!"); await Update(entity); return ServiceResult.OprateSuccess("修改成功!"); //return await QueryFilterPage(body, $"ExamId='{examId}'"); } public async Task> ExtendAsync(long examRecordId) { var extend = new Ghre_ExamRecordExtend(); var record = await QuerySingle(x => x.Id == examRecordId); var details = await Db.Queryable().Where(x => x.ExamRecordId == record.Id).ToListAsync(); var detailIds = details.Select(x => x.Id).ToList(); var recordAnswers = await Db.Queryable() .OrderBy(x => x.TaxisNo) .Where(x => x.ExamRecordDetailId != null && detailIds.Contains(x.ExamRecordDetailId.Value)) .ToListAsync(); await ExamHelper.SystemMarkAsync(Db, record, details, recordAnswers); var exampaper = await Db.Queryable().FirstAsync(x => x.Id == record.ExamPaperId); var baseData = new DefaultGhre_ExamPaperBaseData(); baseData.PaperNo = exampaper.PaperNo; baseData.PaperName = exampaper.PaperName; baseData.AnswerTime = exampaper.AnswerTime; baseData.ScoreMethod = exampaper.ScoreMethod; baseData.TotalScore = exampaper.TotalScore; baseData.PassScore = exampaper.PassScore; baseData.RetakeTimes = exampaper.RetakeTimes; baseData.RemarkSz = exampaper.RemarkSz; baseData.LinkType = exampaper.LinkType; baseData.CourseId = exampaper.LinkType == "CourseId" ? exampaper.LinkId : null; baseData.CourseSceneId = exampaper.LinkType == "CourseSceneId" ? exampaper.LinkId : null; extend.baseData = baseData; extend.styleInfo.coverImage = exampaper.CoverUrl; extend.styleInfo.paperStyle = exampaper.Style; extend.styleInfo.coverBackGround = exampaper.CoverBackGround; var questions = await Db.Queryable().Where(x => x.ExamPaperId == exampaper.Id).ToListAsync(); var previews = questions.Where(x => x.QuestionId != null).Select(x => new DefaultGhre_ExamPaperPreview() { Id = x.Id, ConfigId = x.ConfigId, parentId = x.ConfigId, QuestionId = x.QuestionId.Value, ExamPaperId = x.ExamPaperId, Score = x.Score, RealScore = details.Where(m => m.QuestionId == x.QuestionId).Sum(m => (m.Score ?? 0) + (m.AdjustScore ?? 0)) }).ToList(); var questionIds = previews.Select(x => x.QuestionId).Distinct().ToList(); var questions1 = await Db.Queryable().Where(x => questionIds.Contains(x.Id)).ToListAsync(); var answers = await Db.Queryable().Where(x => x.QuestionId != null && questionIds.Contains(x.QuestionId.Value)).OrderBy(x => x.TaxisNo).ToListAsync(); ; previews.ForEach(x => { var answers1 = answers.Where(y => y.QuestionId == x.QuestionId).ToList(); x.QuestionType = questions1.FirstOrDefault(a => a.Id == x.QuestionId)?.QuestionType; x.QuestionContent = questions1.FirstOrDefault(a => a.Id == x.QuestionId)?.QuestionContent; if (!string.IsNullOrEmpty(x.QuestionContent)) x.QuestionContent = WebUtility.HtmlDecode(x.QuestionContent); var detail = new FromGhre_QuestionQuestionTypeDetail(); detail.content = x.QuestionContent; detail.difficulty = questions1.FirstOrDefault(a => a.Id == x.QuestionId)?.DifficultyLevel; detail.answer = answers1.Where(x => x.IsCorrect == true).FirstOrDefault()?.QuestionNo; detail.answer1 = answers1.Where(x => x.IsCorrect == true).Select(x => x.QuestionNo).ToList(); detail.answerList = answers1.Select(x => new FromGhre_QuestionQuestionAnswerList() { No = x.QuestionNo, label = x.AnswerContent, imageUrl = x.ImageUrl, imgWidthPc = x.ImageWidthPc, imgWidthApp = x.ImageWidthApp, }).ToList(); x.detail = detail; var recordDetail = details.FirstOrDefault(m => m.ExamPaperQuestionId == x.Id); switch (x.QuestionType) { case "Completion": case "ShortAnswer": var answerIds1 = recordAnswers.Where(m => m.ExamRecordDetailId == recordDetail?.Id && m.QuestionAnswerId == null).Select(m => m.AnswerContent).ToList(); answerIds1.ForEach(m => { x.value1.Add(m); }); if (x.value1.Any()) x.value = x.value1.First(); break; default: var answerIds = recordAnswers.Where(m => m.ExamRecordDetailId == recordDetail?.Id && m.QuestionAnswerId != null).Select(m => m.QuestionAnswerId).ToList(); answers1.Where(m => answerIds.Contains(m.Id)).ForEach(m => { x.value1.Add(m.QuestionNo); }); if (x.value1.Any()) x.value = x.value1.First(); break; } }); extend.questionList = previews; string sql = @$"SELECT StaffNo, StaffName, dbo.FO_DeptInfo (DeptID, getdate (), 1, 'DeptNo') DeptNo, dbo.FO_DeptInfo (DeptID, getdate (), 1, 'DeptFullPateName') DepteName FROM Ghra_Staff WHERE StaffID = {record.StaffId}"; extend.StaffInfo = await Db.Ado.SqlQuerySingleAsync(sql); sql = @$"SELECT A.StaffNo, A.StaffName, dbo.FO_DeptInfo (A.DeptID, getdate (), 1, 'DeptNo') DeptNo, dbo.FO_DeptInfo (A.DeptID, getdate (), 1, 'DeptFullPateName') DepteName, A.PhotoUrl, B.TitleName FROM Ghra_Staff A LEFT JOIN Ghra_Title B ON B.TitleID = A.TitleID WHERE A.StaffID = {record.StaffId}"; extend.CommentData = await Db.Ado.SqlQuerySingleAsync(sql); if (record.ScoreStatus == "NoScore") extend.CommentData.IsFirstTime = true; var body = new QueryBody(); body.pageNum = 1; body.pageSize = 10000; var records = await QueryFilterPage(body, $"ExamId='{record.ExamId}'"); var records1 = records.result.DT_TableDataT1; int index = records1.FindIndex(x => x.Id == examRecordId); extend.PreviousRecordId = index - 1 >= 0 && records1.Count > 1 ? records1[index - 1].Id : null; extend.NextRecordId = records1.Count > index + 1 ? records1[index + 1].Id : null; return ServiceResult.OprateSuccess("查询成功!", extend); } }