Procházet zdrojové kódy

增加获取培训习题接口

guqiang před 6 dny
rodič
revize
20f6ca44be

+ 11 - 0
src/Hotline.Api/Controllers/Exam/TrainRecordController.cs

@@ -57,6 +57,17 @@ namespace Hotline.Api.Controllers.Exam
             return await _trainRecordService.GetTrainPracticeAsync(trainPracticeRequest);
         }
 
+        /// <summary>
+        /// 获取培训习题
+        /// </summary>
+        /// <param name="trainPracticeRequest"></param>
+        /// <returns></returns>
+        [HttpGet(TrainRecordApiRoute.GetSimpleTrainPractice)]
+        public async Task<SimpleTrainPracticeDto> GetSimpleTrainPractice([FromQuery] TrainPracticeRequest trainPracticeRequest)
+        {
+            return await _trainRecordService.GetSimpleTrainPracticeAsync(trainPracticeRequest);
+        }
+
         /// <summary>
         /// 完成培训课件学习
         /// </summary>

+ 2 - 0
src/Hotline.Application/Exam/Constants/ApiRoutes/TrainRecordApiRoute.cs

@@ -11,6 +11,8 @@ namespace Hotline.Application.Exam.Constants.ApiRoutes
 
         public const string GetTrainPractice = "GetTrainPractice";
 
+        public const string GetSimpleTrainPractice = "GetSimpleTrainPractice";
+
         public const string CompleteTrainKnowladge = "CompleteTrainKnowladge";
 
         public const string CompleteTrainRecord = "CompleteTrainRecord";

+ 7 - 0
src/Hotline.Application/Exam/Interface/Train/ITrainRecordService.cs

@@ -33,6 +33,13 @@ namespace Train.Application.Interface.Train
         /// <returns></returns>
         Task<TrainPracticeDto> GetTrainPracticeAsync(TrainPracticeRequest trainPracticeRequest);
 
+        /// <summary>
+        /// 获取培训习题
+        /// </summary>
+        /// <param name="trainPracticeRequest"></param>
+        /// <returns></returns>
+        Task<SimpleTrainPracticeDto> GetSimpleTrainPracticeAsync(TrainPracticeRequest trainPracticeRequest);
+
         /// <summary>
         /// 完成培训课件学习
         /// </summary>

+ 12 - 1
src/Hotline.Application/Exam/QueryExtensions/Trains/TrainRecordQueryExtensions.cs

@@ -29,6 +29,17 @@ namespace Hotline.Application.Exam.QueryExtensions.Trains
             return expression;
         }
 
+        public static Expression<Func<TrainRecord, bool>> GetTrainRecordExpression(this TrainRecordPagedRequest trainRecordPagedRequest)
+        {
+            Expression<Func<TrainRecord, bool>> expression = m => m.Id != null;
+
+            expression = ExpressionableUtility.CreateExpression<TrainRecord>()
+                .AndIF(trainRecordPagedRequest.UserId.IsNotNull(), x => x.UserId == trainRecordPagedRequest.UserId)
+                .ToExpression();
+
+            return expression;
+        }
+
         public static Expression<Func<TrainPractice, bool>> GetExpression(this TrainQuestionRequest trainQuestionRequest)
         {
             Expression<Func<TrainPractice, bool>> expression = m => m.Id != null;
@@ -44,7 +55,7 @@ namespace Hotline.Application.Exam.QueryExtensions.Trains
             Expression<Func<TrainPractice, bool>> expression = m => m.Id != null;
 
             expression = ExpressionableUtility.CreateExpression<TrainPractice>()
-                .AndIF(trainPracticeRequest.TrainPracticeId.IsNotNullOrEmpty(), x => x.Id == trainPracticeRequest.TrainPracticeId).ToExpression();
+                .AndIF(trainPracticeRequest.Id.IsNotNullOrEmpty(), x => x.Id == trainPracticeRequest.Id).ToExpression();
 
             return expression;
         }

+ 54 - 5
src/Hotline.Application/Exam/Service/Trains/TrainRecordService.cs

@@ -28,6 +28,10 @@ using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using Hotline.Share.Exams.Extensions;
 using NPOI.SS.Formula.Functions;
+using Hotline.Repository.SqlSugar.Exam.Repositories.Trains;
+using static NPOI.HSSF.Util.HSSFColor;
+using DocumentFormat.OpenXml.Drawing.Charts;
+using JiebaNet.Segmenter.Common;
 
 namespace Hotline.Application.Exam.Service.Trains
 {
@@ -131,14 +135,16 @@ namespace Hotline.Application.Exam.Service.Trains
 
         public async Task<TrainPracticeDto> GetTrainPracticeAsync(TrainPracticeRequest trainPracticeRequest)
         {
-            var trainPracticeRepostitory = new TrainPracticeRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            SqlSugar.ISugarQueryable<TrainPractice> trainPractices = GetTrainPractices(trainPracticeRequest);
 
-            var trainPractice = await trainPracticeRepostitory.GetAsync(trainPracticeRequest.TrainPracticeId);
+            var trainPractice = await trainPractices.FirstAsync();
 
             if (trainPractice == null) return null;
 
             var trainPracticeDto = _mapper.Map<TrainPracticeDto>(trainPractice);
 
+            trainPracticeRequest.TrainPracticeId = trainPractice.Id;
+
             trainPracticeDto.TrainPracticeOptionsDtos = await GetTrainQuestionOptions(trainPracticeRequest);
 
             trainPracticeDto.TrainPracticeSourcewareDtos = await GetTrainPracticeSourcewares(trainPracticeRequest);
@@ -148,6 +154,23 @@ namespace Hotline.Application.Exam.Service.Trains
             return trainPracticeDto;
         }
 
+        public async Task<SimpleTrainPracticeDto> GetSimpleTrainPracticeAsync(TrainPracticeRequest trainPracticeRequest)
+        {
+            SqlSugar.ISugarQueryable<TrainPractice> trainPractices = GetTrainPractices(trainPracticeRequest);
+
+            var trainPractice = await trainPractices.FirstAsync();
+
+            if (trainPractice == null) return null;
+
+            var trainPracticeDto = _mapper.Map<TrainPracticeDto>(trainPractice);
+
+            trainPracticeRequest.TrainPracticeId = trainPractice.Id;
+
+            trainPracticeDto.TrainPracticeOptionsDtos = await GetTrainQuestionOptions(trainPracticeRequest);
+
+            return trainPracticeDto;
+        }
+
         public async Task<TrainResultPagedViewResponse> AnalysisTrainResult(TrainResultReportPagedRequest trainResultReportPagedRequest)
         {
             trainResultReportPagedRequest.ResoleEndTime();
@@ -244,9 +267,11 @@ namespace Hotline.Application.Exam.Service.Trains
         private SqlSugar.ISugarQueryable<TrainRecordViewResponse> QueryResult(TrainRecordPagedRequest queryRequest)
         {
             var trainPlanRepository = new TrainPlanRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            queryRequest.UserId = _sessionContext.UserId;
             var expression = queryRequest.GetExpression();
             var trainPlanTable = trainPlanRepository.Queryable().Where(expression);
-            var trainRecordTable = _repository.Queryable();
+            var traiRecordExpression = queryRequest.GetTrainRecordExpression();
+            var trainRecordTable = _repository.Queryable().Where(traiRecordExpression);
 
             var queryResult = trainPlanTable.InnerJoin(trainRecordTable, (p, r) => p.Id == r.TrainPlanId)
                             .Select((p, r) => new TrainRecordViewResponse
@@ -358,12 +383,36 @@ namespace Hotline.Application.Exam.Service.Trains
             return trainPracticeDto;
         }
 
+        private SqlSugar.ISugarQueryable<TrainPractice> GetTrainPractices(TrainPracticeRequest trainPracticeRequest)
+        {
+            var trainPracticeRepostitory = new TrainPracticeRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var trainPlanRepository = new TrainPlanRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var trainPlanTemplateRepository = new TrainPlanTemplateRepository(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+
+            var trainRecordTable = _repository.Queryable().Where(x => x.Id == trainPracticeRequest.Id);
+            var trainPlanTable = trainPlanRepository.Queryable();
+            var trainPracticeTable = trainPracticeRepostitory.Queryable().WhereIF(!string.IsNullOrEmpty(trainPracticeRequest.TrainPracticeId),x=>x.Id == trainPracticeRequest.TrainPracticeId);
+            var tranPlanTemplateTable = trainPlanTemplateRepository.Queryable();
+
+            var trainPractices = trainPracticeTable.InnerJoin(tranPlanTemplateTable, (tp, tpt) => tp.TrainTemplateId == tpt.TrainTemplateId)
+                .InnerJoin(trainPlanTable, (tp, tpt, tpn) => tpt.TrainPlanId == tpn.Id)
+                .InnerJoin(trainRecordTable, (tp, tpt, tpn, tr) => tpn.Id == tr.TrainPlanId)
+                .Select((tp, tpt, tpn, tr) => tp)
+                .OrderBy(tp => tp.CreationTime);
+            return trainPractices;
+        }
+
         private async Task<List<SimpleTrainPracticeOptionsDto>> GetTrainQuestionOptions(TrainPracticeRequest trainPracticeRequest)
         {
-            var trainPracticeRepository = new ExamRepository<TrainPracticeOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
+            var trainPracticeOptionsRepository = new ExamRepository<TrainPracticeOptions>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
             var trainRecordAnswerRepository = new ExamRepository<TrainRecordAnswer>(_uow, _dataPermissionFilterBuilder, _serviceProvider);
             // TODO: 获取未阅卷的第一道题
-            var trainPracticeOptions = trainPracticeRepository.Queryable().Where(x => x.TrainPracticeId == trainPracticeRequest.TrainPracticeId);
+            var trainPractices = GetTrainPractices(trainPracticeRequest);
+
+            var trainPracticeOptions = await trainPracticeOptionsRepository.Queryable()
+                .InnerJoin(trainPractices, (tpo, tp) => tpo.TrainPracticeId == tp.Id)
+                .Where((tpo, tp)=> tp.Id == trainPracticeRequest.TrainPracticeId)
+                .Select((tpo, tp) => tpo).ToListAsync();
 
             var trainRecordOptions = await trainRecordAnswerRepository.Queryable()
                 .InnerJoin<TrainRecord>((t,x)=>t.TrainRecordId == x.Id)

+ 17 - 6
src/Hotline.Share/Dtos/Trains/TrainPracticeDto.cs

@@ -14,7 +14,7 @@ namespace Hotline.Share.Dtos.Trains
     /// 培训习题
     /// </summary>
     [Description("培训习题")]
-    public class TrainPracticeDto : UpdateTrainPracticeDto
+    public class TrainPracticeDto : SimpleTrainPracticeDto
     {
         // <summary>
         /// 关联课件
@@ -28,12 +28,16 @@ namespace Hotline.Share.Dtos.Trains
         [Description("关联知识")]
         public new List<TrainPracticeKnowladgeDto> TrainPracticeKnowladgeDtos { get; set; }
 
-        /// <summary>
-        /// 培训习题选项
-        /// </summary>
-        [Description("培训习题选项")]
-        public List<SimpleTrainPracticeOptionsDto> TrainPracticeOptionsDtos { get; set; }
 
+        
+    }
+
+    /// <summary>
+    /// 培训习题
+    /// </summary>
+    [Description("培训习题")]
+    public class SimpleTrainPracticeDto : UpdateTrainPracticeDto
+    {
         /// <summary>
         /// 题型
         /// </summary>
@@ -57,6 +61,13 @@ namespace Hotline.Share.Dtos.Trains
                 return DifficultyLevel.GetDescription();
             }
         }
+
+
+        /// <summary>
+        /// 培训习题选项
+        /// </summary>
+        [Description("培训习题选项")]
+        public List<SimpleTrainPracticeOptionsDto> TrainPracticeOptionsDtos { get; set; }
     }
 
     public class AddTrainPracticeDto : IAddRequest, IOperationStatus

+ 9 - 0
src/Hotline.Share/Requests/Train/TrainPracticeRequest.cs

@@ -1,10 +1,19 @@
 using Exam.Infrastructure.Data.Interface;
+using Newtonsoft.Json;
 using System.ComponentModel;
 
 namespace Hotline.Share.Requests.Train
 {
     public class TrainPracticeRequest:IQueryRequest
     {
+
+        /// <summary>
+        /// 培训记录Id
+        /// </summary>
+        [Description("培训记录Id")]
+        public string Id { get; set; }
+
+
         /// <summary>
         /// 培训习题Id
         /// </summary>

+ 9 - 0
src/Hotline.Share/Requests/Train/TrainRecordPagedRequest.cs

@@ -1,5 +1,6 @@
 using Exam.Infrastructure.Data.Interface;
 using System.ComponentModel;
+using System.Text.Json.Serialization;
 
 namespace Hotline.Share.Requests.Train
 {
@@ -40,5 +41,13 @@ namespace Hotline.Share.Requests.Train
         /// </summary>
         [Description("最大结束时间")]
         public DateTime? MaxEndTime { get; set; }
+
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        [Description("用户Id")]
+        [JsonIgnore]
+        public string UserId { get; set; }
+
     }
 }