using System.Data; using AgileObjects.AgileMapper; using MongoDB.Driver.Linq; using SqlSugar; using Tiobon.Core.IRepository.Base; using Tiobon.Core.IServices; using Tiobon.Core.Model; using Tiobon.Core.Model.Models; using Tiobon.Core.Services.BASE; namespace Tiobon.Core.Services { /// /// 试卷 (服务) /// public class Ghre_ExamPaperServices : BaseServices, IGhre_ExamPaperServices { private IGhre_ExamPaperConfigServices _ghre_ExamPaperConfigServices; private IGhre_ExamPaperQuestionServices _ghre_ExamPaperQuestionServices; private IGhre_QuestionServices _ghre_QuestionServices; readonly IGhrs_UserServices _ghrs_UserServices; private IGhre_QuestionAnswerServices _ghre_QuestionAnswerServices; private readonly IBaseRepository _dal; public Ghre_ExamPaperServices(IBaseRepository dal, IGhre_ExamPaperConfigServices ghre_ExamPaperConfigServices, IGhre_QuestionServices ghre_QuestionServices, IGhre_QuestionAnswerServices ghre_QuestionAnswerServices, IGhre_ExamPaperQuestionServices ghre_ExamPaperQuestionServices, IGhrs_UserServices ghrs_UserServices) { this._dal = dal; base.BaseDal = dal; _ghre_ExamPaperConfigServices = ghre_ExamPaperConfigServices; _ghre_ExamPaperQuestionServices = ghre_ExamPaperQuestionServices; _ghre_QuestionServices = ghre_QuestionServices; _ghre_QuestionAnswerServices = ghre_QuestionAnswerServices; _ghrs_UserServices = ghrs_UserServices; } public async Task> QueryDefault(long Id) { var input = new DefaultGhre_ExamPaperInput(); #region baseColumns var baseColumns = new List { new DefaultGhre_ExamPaperColumn() { label = "试卷编号", field = "PaperNo", elementType = "Input", required = false, multipleSelect = false, editable = false, }, new DefaultGhre_ExamPaperColumn() { label = "试卷名称", field = "PaperName", elementType = "Input", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "答题时间", field = "AnswerTime", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "评分方式", field = "ScoreMethod", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, dataSource = "api/Common/GetSelect/ScoreMethod?FW=DOTNETCORE" }, new DefaultGhre_ExamPaperColumn() { label = "卷面总分", field = "TotalScore", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "及格分", field = "PassScore", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "可重考次数", field = "RetakeTimes", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "试卷说明", field = "RemarkSz", elementType = "InputTextArea", required = false, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "关联课程", field = "LinkType", elementType = "CourseRadioBox", required = false, multipleSelect = false, editable = true, }, new DefaultGhre_ExamPaperColumn() { label = "课程名称", field = "CourseId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, dataSource = "api/Common/GetSelect/Ghre_Course?FW=DOTNETCORE" }, new DefaultGhre_ExamPaperColumn() { label = "课程场景", field = "CourseSceneId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, dataSource = "api/Common/GetSelect/Ghre_CourseScene?FW=DOTNETCORE" } }; #endregion #region randomSetColumns var randomSetColumns = new List { new DefaultGhre_ExamPaperColumn() { label = "课程名称", field = "CourseId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType=1, dataSource = "api/Common/GetSelect/Ghre_Course?FW=DOTNETCORE" }, new DefaultGhre_ExamPaperColumn() { label = "题目类型", field = "QuestionType", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType=2, dataSource = "api/Common/GetSelect/QuestionType?FW=DOTNETCORE" }, new DefaultGhre_ExamPaperColumn() { label = "难易程度", field = "DifficultyLevel", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType=2, dataSource = "api/Common/GetSelect/DifficultyLevel?FW=DOTNETCORE" }, new DefaultGhre_ExamPaperColumn() { label = "数量", field = "Quantity", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, displayType=2 }, new DefaultGhre_ExamPaperColumn() { label = "分值", field = "Score", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, displayType=2 } }; #endregion #region manualSetColumns var manualSetColumns = new List { new DefaultGhre_ExamPaperColumn() { label = "课程名称", field = "CourseId", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType=1 }, new DefaultGhre_ExamPaperColumn() { label = "题目类型", field = "QuestionType", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType= 2 }, new DefaultGhre_ExamPaperColumn() { label = "题目内容", field = "QuestionContent", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType=2 }, new DefaultGhre_ExamPaperColumn() { label = "难易程度", field = "DifficultyLevel", elementType = "ApiSelect", required = true, multipleSelect = false, editable = true, displayType=2 }, new DefaultGhre_ExamPaperColumn() { label = "分值", field = "Score", elementType = "InputNumber", required = true, multipleSelect = false, editable = true, displayType=2 } }; #endregion #region pageData if (Id == 0) { var baseData = new DefaultGhre_ExamPaperBaseData(); baseData.PaperNo = null; baseData.PaperName = null; baseData.AnswerTime = null; baseData.ScoreMethod = null; baseData.TotalScore = null; baseData.PassScore = null; baseData.RetakeTimes = null; baseData.RemarkSz = null; baseData.LinkType = "CourseId"; baseData.CourseId = null; baseData.CourseSceneId = null; input.pageData.baseData = baseData; input.pageData.examPaperSetType = "random"; } else if (Id != 0) { var exampaper = await base.QueryById(Id); 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.LinkId; baseData.CourseSceneId = exampaper.LinkId; input.pageData.baseData = baseData; input.CreateDataInfo = exampaper.CreateDataInfo; input.UpdateDataInfo = exampaper.UpdateDataInfo; input.pageData.styleInfo.coverImage = exampaper.CoverUrl; input.pageData.styleInfo.paperStyle = exampaper.Style; input.pageData.examPaperSetType = exampaper.SetMethod; input.pageData.examPaperSetData = await _ghre_ExamPaperConfigServices.Query(x => x.ExamPaperId == Id, "TaxisNo ASC"); var questions = await _ghre_ExamPaperQuestionServices.Query(x => x.ExamPaperId == Id, "TaxisNo ASC"); 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 }).ToList(); var questionIds = previews.Select(x => x.QuestionId).Distinct().ToList(); var questions1 = await _ghre_QuestionServices.Query(x => questionIds.Contains(x.Id)); var answers = await _ghre_QuestionAnswerServices.Query(x => x.QuestionId != null && questionIds.Contains(x.QuestionId.Value), "TaxisNo ASC"); 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; //var detail = questions1.Select(o => //new FromGhre_QuestionQuestionTypeDetail() //{ // Id = o.Id, // difficulty = o.DifficultyLevel, // RemarkSz = o.QuestionAnalysis, // content = o.QuestionContent, //}).ToList(); //detail.ForEach(y => //{ // y.answer = answers1.Where(x => x.IsCorrect == true).FirstOrDefault()?.QuestionNo; // y.answer1 = answers1.Where(x => x.IsCorrect == true).Select(x => x.QuestionNo).ToList(); // y.answerList = answers.Select(x => new FromGhre_QuestionQuestionAnswerList() // { // No = x.QuestionNo, // label = x.AnswerContent, // imageUrl = x.ImageUrl, // imgWidthPc = x.ImageWidthPc, // imgWidthApp = x.ImageWidthApp, // }).ToList(); //}); 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; }); input.pageData.previewList = previews; } #endregion input.baseColumns = baseColumns; input.randomSetColumns = randomSetColumns; input.manualSetColumns = manualSetColumns; return ServiceResult.OprateSuccess("查询成功!", input); } public async Task> InsertConfig(InsertGhre_ExamPaperConfigInput insert) { var input = new InsertExamPaperConfigInput(); long parentId = SnowFlakeSingle.instance.getID(); input.tableData = Mapper.Map(insert).ToANew(); input.tableData.Id = parentId; if (insert.QuestionId != null) insert.Quantity = 1; string sql = $@"SELECT TOP {insert.Quantity} *,NEWID() AS GuidValue FROM Ghre_Question WHERE IsEnable=1"; if (!string.IsNullOrWhiteSpace(insert.DifficultyLevel)) sql += $" AND DifficultyLevel='{insert.DifficultyLevel}'"; if (!string.IsNullOrWhiteSpace(insert.QuestionType)) sql += $" AND QuestionType='{insert.QuestionType}'"; if (insert.CourseId != null) sql += $" AND CourseId='{insert.CourseId}'"; if (insert.QuestionId != null) sql += $" AND Id='{insert.QuestionId}'"; sql += $" ORDER BY GuidValue ASC"; var questions = await Db.Ado.SqlQueryAsync(sql); var previews = questions.Select(x => new DefaultGhre_ExamPaperPreview() { Id = x.Id, parentId = parentId, QuestionId = x.Id, QuestionType = x.QuestionType, QuestionContent = x.QuestionContent, }).ToList(); var questionIds = previews.Select(x => x.QuestionId).Distinct().ToList(); var questions1 = await _ghre_QuestionServices.Query(x => questionIds.Contains(x.Id)); var answers = await _ghre_QuestionAnswerServices.Query(x => x.QuestionId != null && questionIds.Contains(x.QuestionId.Value), "TaxisNo ASC"); previews.ForEach(x => { var answers1 = answers.Where(y => y.QuestionId == x.QuestionId).ToList(); var detail = new FromGhre_QuestionQuestionTypeDetail(); 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(); detail.content = x.QuestionContent; x.detail = detail; }); input.previewList = previews; return ServiceResult.OprateSuccess("查询成功!", input); } public async Task> Insert1(DefaultGhre_ExamPaperPageData insertModel) { await Db.Ado.BeginTranAsync(); try { var insert = new InsertGhre_ExamPaperInput(); insert = Mapper.Map(insertModel.baseData).ToANew(); insert.PaperNo = await GenerateContinuousSequence("Ghre_ExamPaper", "PaperNo", "P"); insert.LinkId = insertModel.baseData.LinkType == "CourseId" ? insertModel.baseData.CourseId : insertModel.baseData.CourseSceneId; insert.CoverUrl = insertModel.styleInfo.coverImage; insert.Style = insertModel.styleInfo.paperStyle; insert.SetMethod = insertModel.examPaperSetType; insert.Status = "Draft"; var id = await Add(insert); var configs = Mapper.Map(insertModel.examPaperSetData).ToANew>(); configs.ForEach(x => x.ExamPaperId = id); var insertConfigs = Db.Insertable(configs); string sql = insertConfigs.ToSqlString(); long row = await Db.Ado.ExecuteCommandAsync(sql); var questions = insertModel.previewList .Select(x => new InsertGhre_ExamPaperQuestionInput { ExamPaperId = id, QuestionId = x.QuestionId, ConfigId = x.parentId, }).ToList(); await _ghre_ExamPaperQuestionServices.Add(questions); await Db.Ado.CommitTranAsync(); return ServiceResult.OprateSuccess("新增成功!", id); } catch (Exception) { await Db.Ado.RollbackTranAsync(); throw; } } public async Task Update1(long id, DefaultGhre_ExamPaperPageData insertModel) { await Db.Ado.BeginTranAsync(); try { Db.Ado.ExecuteCommand($@"delete from Ghre_ExamPaperConfig WHERE ExamPaperId='{id}'; delete from Ghre_ExamPaperQuestion WHERE ExamPaperId='{id}';"); var insert = new EditGhre_ExamPaperInput(); insert = Mapper.Map(insertModel.baseData).ToANew(); insert.PaperNo = await GenerateContinuousSequence("Ghre_ExamPaper", "PaperNo", "P"); insert.LinkId = insertModel.baseData.LinkType == "CourseId" ? insertModel.baseData.CourseId : insertModel.baseData.CourseSceneId; insert.CoverUrl = insertModel.styleInfo.coverImage; insert.Style = insertModel.styleInfo.paperStyle; insert.SetMethod = insertModel.examPaperSetType; insert.Status = "Draft"; await Update(id, insert); var configs = Mapper.Map(insertModel.examPaperSetData).ToANew>(); configs.ForEach(x => x.ExamPaperId = id); var insertConfigs = Db.Insertable(configs); string sql = insertConfigs.ToSqlString(); long row = await Db.Ado.ExecuteCommandAsync(sql); var questions = insertModel.previewList .Select(x => new InsertGhre_ExamPaperQuestionInput { ExamPaperId = id, QuestionId = x.QuestionId, ConfigId = x.parentId, }).ToList(); await _ghre_ExamPaperQuestionServices.Add(questions); await Db.Ado.CommitTranAsync(); return ServiceResult.OprateSuccess("修改成功!"); } catch (Exception) { await Db.Ado.RollbackTranAsync(); throw; } } public static string ConvertQuestionType(string type) { string questionTypeName = string.Empty; if (type == "Single") questionTypeName = "单选题"; else if (type == "Multiple") questionTypeName = "多选题"; else if (type == "TrueOrFalse") questionTypeName = "判断题"; else if (type == "Completion") questionTypeName = "填空题"; else if (type == "ShortAnswer") questionTypeName = "简答题"; return questionTypeName; } } }