Browse Source

完善提供功能

guqiang 1 tháng trước cách đây
mục cha
commit
fbdbf74ac7
22 tập tin đã thay đổi với 309 bổ sung471 xóa
  1. 19 0
      src/Exam.Infrastructure.Web/Extensions/ExpressionableExtensions.cs
  2. 15 0
      src/Exam.Infrastructure.Web/Utilities/ExpressionableUtility.cs
  3. 26 0
      src/Exam.Infrastructure.Web/Utilities/TypeAdapterConfigUtility.cs
  4. 24 0
      src/Hotline.Application/Exam/Extensions/ActionRequestExtensions.cs
  5. 11 1
      src/Hotline.Application/Exam/Mappers/MapperConfigs.cs
  6. 12 6
      src/Hotline.Application/Exam/QueryExtensions/Questions/QuestionQueryExtesions.cs
  7. 6 3
      src/Hotline.Application/Exam/Service/ExamManages/ExamTagService.cs
  8. 0 77
      src/Hotline.Application/Exam/Service/Questions/QuestionAnswerService.cs
  9. 0 76
      src/Hotline.Application/Exam/Service/Questions/QuestionKnowladgeService.cs
  10. 0 79
      src/Hotline.Application/Exam/Service/Questions/QuestionOptionsService.cs
  11. 169 64
      src/Hotline.Application/Exam/Service/Questions/QuestionService.cs
  12. 0 76
      src/Hotline.Application/Exam/Service/Questions/QuestionSourcewareService.cs
  13. 0 75
      src/Hotline.Application/Exam/Service/Questions/QuestionTagService.cs
  14. 6 3
      src/Hotline.Application/Exam/Service/Sourcewares/SourcewareCategoryService.cs
  15. 2 1
      src/Hotline.Application/Exam/Service/Sourcewares/SourcewareService.cs
  16. 2 0
      src/Hotline.Repository.SqlSugar/Exam/Repositories/ExamRepository.cs
  17. 1 1
      src/Hotline.Repository.SqlSugar/Exam/Validators/Questions/QuestionValidator.cs
  18. 5 1
      src/Hotline.Repository.SqlSugar/Extensions/ApiServiceExtension.cs
  19. 9 5
      src/Hotline.Repository.SqlSugar/Service/ApiService.cs
  20. 0 1
      src/Hotline.Repository.SqlSugar/Validate/BaseValidator.cs
  21. 1 1
      src/Hotline.Share/Requests/Question/QuestionPagedRequest.cs
  22. 1 1
      src/Hotline/Exams/Questions/Question.cs

+ 19 - 0
src/Exam.Infrastructure.Web/Extensions/ExpressionableExtensions.cs

@@ -0,0 +1,19 @@
+using Exam.Infrastructure.Data.Entity;
+using SqlSugar;
+using XF.Domain.Entities;
+
+namespace Exam.Infrastructure.Web.Extensions
+{
+    public static class ExpressionableExtensions
+    {
+        public static EntityQueryRequest ToEntityQueryRequest<T>(this Expressionable<T> expressionable) where T:class,IEntity<string>,new()
+        {
+            var entityQueryRequest = new EntityQueryRequest
+            {
+                Expression = expressionable.ToExpression()
+            };
+
+            return entityQueryRequest;
+        }
+    }
+}

+ 15 - 0
src/Exam.Infrastructure.Web/Utilities/ExpressionableUtility.cs

@@ -0,0 +1,15 @@
+using SqlSugar;
+using XF.Domain.Entities;
+
+namespace Exam.Infrastructure.Web.Utilities
+{
+    public static class ExpressionableUtility
+    {
+        public static Expressionable<T> CreateExpression<T>() where T :class,IEntity<string>,new()
+        {
+            Expressionable<T> expressionable = new Expressionable<T>();
+
+            return expressionable;
+        }
+    }
+}

+ 26 - 0
src/Exam.Infrastructure.Web/Utilities/TypeAdapterConfigUtility.cs

@@ -0,0 +1,26 @@
+using Exam.Infrastructure.Data.Entity;
+using Mapster;
+using XF.Domain.Repository;
+
+namespace Exam.Infrastructure.Web.Utilities
+{
+    public class TypeAdapterConfigUtility
+    {
+        public static TypeAdapterConfig ForUpdate<TActionRequest, TEntity>()
+            where TActionRequest : ActionRequest
+            where TEntity : FullStateEntity
+        {
+            TypeAdapterConfig.GlobalSettings.ForType<TActionRequest, TEntity>()
+    .Ignore(x => x.CreationTime)
+                .Ignore(x => x.CreatorId)
+                .Ignore(x => x.CreatorName)
+                .Ignore(x => x.CreatorOrgId)
+                .Ignore(x => x.CreatorOrgLevel)
+                .Ignore(x => x.CreatorOrgName)
+                .Ignore(x => x.AreaId)
+                .Ignore(x => x.Id);
+
+            return TypeAdapterConfig.GlobalSettings;
+        }
+    }
+}

+ 24 - 0
src/Hotline.Application/Exam/Extensions/ActionRequestExtensions.cs

@@ -1,4 +1,5 @@
 using Exam.Infrastructure.Data.Entity;
+using Exam.Infrastructure.Data.Interface;
 using Exam.Infrastructure.Extensions;
 using XF.Domain.Authentications;
 
@@ -21,5 +22,28 @@ namespace Exam.Infrastructure.Data.Extensions
             actionRequest.OrgName = sessionContext.OrgName;
             actionRequest.OrgLevel = sessionContext.OrgLevel;
         }
+    
+    
+        public static void InitRequest<TDest,TSource>(this List<TDest> actionRequests, TSource actionRequest) 
+            where TDest : ActionRequest
+            where TSource : ActionRequest
+        {
+            foreach(var item in actionRequests)
+            {
+                item.InitRequest(actionRequest);
+            }
+        }
+
+        public static void InitRequest<TDest, TSource>(this TDest dest, TSource source) 
+            where TDest:ActionRequest
+            where TSource:ActionRequest
+        {
+            dest.UserId = source.UserId;
+            dest.UserName = source.UserName;
+            dest.OrgId = source.OrgId;
+            dest.AreaId = source.AreaId;
+            dest.OrgName = source.OrgName;
+            dest.OrgLevel = source.OrgLevel;
+        }
     }
 }

+ 11 - 1
src/Hotline.Application/Exam/Mappers/MapperConfigs.cs

@@ -1,4 +1,13 @@
-using Mapster;
+using Exam.Infrastructure.Data.Interface;
+using Exam.Infrastructure.Web.Utilities;
+using Exam.Questions;
+using Hotline.Share.Dtos.Questions;
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
+using Mapster;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using XF.Domain.Entities;
+using XF.Domain.Repository;
 
 namespace Exam.Application.Mappers
 {
@@ -6,6 +15,7 @@ namespace Exam.Application.Mappers
     {
         public void Register(TypeAdapterConfig config)
         {
+            config.ForType<QuestionDto, Question>().IgnoreNullValues(true);
         }
     }
 }

+ 12 - 6
src/Hotline.Application/Exam/QueryExtensions/Questions/QuestionQueryExtesions.cs

@@ -2,6 +2,8 @@
 using Exam.Infrastructure.Extensions;
 using Exam.Questions;
 using Hotline.Share.Requests.Question;
+using JiebaNet.Segmenter.Common;
+using SqlSugar;
 using System.Linq.Expressions;
 
 namespace Hotline.Application.Exam.QueryExtensions.Questions
@@ -12,9 +14,10 @@ namespace Hotline.Application.Exam.QueryExtensions.Questions
         {
             Expression<Func<Question, bool>> expression = m => m.Id != null;
 
-            expression = expression.And(x => questionPagedRequest.DifficultyLevel == x.DifficultyLevel, questionPagedRequest.DifficultyLevel);
-            expression = expression.And(x => questionPagedRequest.Title == x.Title, questionPagedRequest.Title);
-
+            Expressionable<Question> expressionable = new Expressionable<Question>();
+            expressionable.AndIF(questionPagedRequest.DifficultyLevel.IsNotNull(), x => questionPagedRequest.DifficultyLevel == x.DifficultyLevel);
+            expressionable.AndIF(questionPagedRequest.Title.IsNotNullOrEmpty(), x => x.Title.Contains(questionPagedRequest.Title));
+            expression = expressionable.ToExpression();
             return expression;
         }
 
@@ -22,8 +25,9 @@ namespace Hotline.Application.Exam.QueryExtensions.Questions
         {
             Expression<Func<QuestionTag, bool>> expression = m => m.Id != null;
 
-            expression = expression.And(x => questionPagedRequest.TagId == x.TagId, questionPagedRequest.TagId);
-
+            Expressionable<QuestionTag> expressionable = new Expressionable<QuestionTag>();
+            expressionable.AndIF(questionPagedRequest.TagId.IsNotNullOrEmpty(), x => questionPagedRequest.TagId == x.TagId);
+            expression = expressionable.ToExpression();
             return expression;
         }
 
@@ -31,7 +35,9 @@ namespace Hotline.Application.Exam.QueryExtensions.Questions
         {
             Expression<Func<ExamTag, bool>> expression = m => m.Id != null;
 
-            expression = expression.And(x => questionPagedRequest.TagId == x.Id, questionPagedRequest.TagId);
+            Expressionable<ExamTag> expressionable = new Expressionable<ExamTag>();
+            expressionable.AndIF(questionPagedRequest.TagId.IsNotNullOrEmpty(), x => questionPagedRequest.TagId == x.Id);
+            expression = expressionable.ToExpression();
 
             return expression;
         }

+ 6 - 3
src/Hotline.Application/Exam/Service/ExamManages/ExamTagService.cs

@@ -15,6 +15,7 @@ using Hotline.Share.Requests.Exam;
 using Hotline.Share.Requests.Sourceware;
 using Hotline.Share.ViewResponses.Exam;
 using Mapster;
+using MapsterMapper;
 using System.ComponentModel;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -28,16 +29,18 @@ namespace Hotline.Application.Exam.Service.ExamManages
     public class ExamTagService : ApiService<ExamTag, ExamTagDto,HotlineDbContext>,IExamTagService, IScopeDependency
     {
         private readonly IExamTagRepository _repository;
-        public ExamTagService(IExamTagRepository repository) : base(repository)
+        private readonly IMapper _mapper;
+        public ExamTagService(IExamTagRepository repository,IMapper mapper) : base(repository, mapper)
         {
             _repository = repository;
+            _mapper = mapper;
         }
 
         public async Task<ExamTagDto> GetAsync(EntityQueryRequest entityQueryRequest)
         {
             var entity = await _repository.GetAsync(entityQueryRequest.Id);
 
-            return entity.Adapt<ExamTagDto>();
+            return _mapper.Map<ExamTagDto>(entity);
         }
 
         public async Task<(int, List<ExamTagViewResponse>)> GetListAsync(ExamTagRequest queryRequest)
@@ -81,7 +84,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 ParentId = m.ParentId,
                 SortIndex = m.SortIndex,
                 Status = m.Status,
-                Children = m.Children.Adapt<List<ExamTagViewResponse>>()
+                Children = _mapper.Map<List<ExamTagViewResponse>>(m.Children)
             }).ToList();
 
 

+ 0 - 77
src/Hotline.Application/Exam/Service/Questions/QuestionAnswerService.cs

@@ -1,77 +0,0 @@
-using Exam.Application;
-using Exam.Infrastructure.Data.Entity;
-using Exam.Insfrastructure.Service.Service;
-using Exam.Questions;
-using Exam.Share;
-using Hotline.Application.Exam.QueryExtensions.Questions;
-using Hotline.Repository.SqlSugar;
-using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
-using Hotline.Share.Dtos.Questions;
-using Hotline.Share.Requests.Question;
-using Mapster;
-using System.ComponentModel;
-using XF.Domain.Dependency;
-
-namespace Hotline.Application.Exam.Service.Questions
-{
-    /// <summary>
-    /// 试题参考答案服务
-    /// </summary>
-    [Description("试题参考答案服务")]
-    public class QuestionAnswerService : ApiService<QuestionAnswer, QuestionAnswerDto,HotlineDbContext>,IQuestionAnswerService, IScopeDependency
-    {
-        private readonly IQuestionAnswerRepository _repository;
-        public QuestionAnswerService(IQuestionAnswerRepository repository) : base(repository)
-        {
-            _repository = repository;
-        }
-
-        public async Task<QuestionAnswerDto> GetAsync(EntityQueryRequest entityQueryRequest)
-        {
-            var entity = await _repository.GetAsync(entityQueryRequest.Id);
-
-            return entity.Adapt<QuestionAnswerDto>();
-        }
-
-        public async Task<(int, List<QuestionAnswerViewResponse>)> GetListAsync(QuestionAnswerPagedRequest queryRequest)
-        {
-            var query = _repository.Queryable();
-
-            var result = await query.Select(m => new QuestionAnswerViewResponse { 
-                				QuestionId = m.QuestionId,
-								Answer = m.Answer,
-								Id = m.Id,
-				            }).ToListAsync();
-
-            var total = await query.CountAsync();
-
-            return (total,result);
-        }
-
-        public async Task<PageViewResponse<QuestionAnswerViewResponse>> GetPagedListAsync(QuestionAnswerPagedRequest queryRequest)
-        {
-            var expression = queryRequest.GetExpression();
-            var questionAnswerTable = _repository.Queryable().Where(expression);
-
-            var queryable = questionAnswerTable.Select((m) => new QuestionAnswerViewResponse
-            {
-                				QuestionId = m.QuestionId,
-								Answer = m.Answer,
-								Id = m.Id,
-				            });
-
-            var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
-            var total = await queryable.CountAsync();
-
-            var result = new PageViewResponse<QuestionAnswerViewResponse>
-            {
-                Items = list,
-                Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
-            };
-
-            return result;
-        }
-    }
-}
-
-

+ 0 - 76
src/Hotline.Application/Exam/Service/Questions/QuestionKnowladgeService.cs

@@ -1,76 +0,0 @@
-using Exam.Infrastructure.Data.Entity;
-using Exam.Insfrastructure.Service.Service;
-using Exam.Questions;
-using Exam.Share;
-using Hotline.Application.Exam.QueryExtensions.Questions;
-using Hotline.Repository.SqlSugar;
-using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
-using Hotline.Share.Dtos.Questions;
-using Hotline.Share.Requests.Question;
-using Mapster;
-using System.ComponentModel;
-using XF.Domain.Dependency;
-
-namespace Exam.Application
-{
-    /// <summary>
-    /// 关联知识服务
-    /// </summary>
-    [Description("关联知识服务")]
-    public class QuestionKnowladgeService : ApiService<QuestionKnowladge, QuestionKnowladgeDto,HotlineDbContext>,IQuestionKnowladgeService, IScopeDependency
-    {
-        private readonly IQuestionKnowladgeRepository _repository;
-        public QuestionKnowladgeService(IQuestionKnowladgeRepository repository) : base(repository)
-        {
-            _repository = repository;
-        }
-
-        public async Task<QuestionKnowladgeDto> GetAsync(EntityQueryRequest entityQueryRequest)
-        {
-            var entity = await _repository.GetAsync(entityQueryRequest.Id);
-
-            return entity.Adapt<QuestionKnowladgeDto>();
-        }
-
-        public async Task<(int, List<QuestionKnowladgeViewResponse>)> GetListAsync(QuestionKnowladgePagedRequest queryRequest)
-        {
-            var query = _repository.Queryable();
-
-            var result = await query.Select(m => new QuestionKnowladgeViewResponse { 
-                				QuestionId = m.QuestionId,
-								KnowladgeId = m.KnowladgeId,
-								Id = m.Id,
-				            }).ToListAsync();
-
-            var total = await query.CountAsync();
-
-            return (total,result);
-        }
-
-        public async Task<PageViewResponse<QuestionKnowladgeViewResponse>> GetPagedListAsync(QuestionKnowladgePagedRequest queryRequest)
-        {
-            var expression = queryRequest.GetExpression();
-            var questionKnowladgeTable = _repository.Queryable().Where(expression);
-
-            var queryable = questionKnowladgeTable.Select((m) => new QuestionKnowladgeViewResponse
-            {
-                				QuestionId = m.QuestionId,
-								KnowladgeId = m.KnowladgeId,
-								Id = m.Id,
-				            });
-
-            var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
-            var total = await queryable.CountAsync();
-
-            var result = new PageViewResponse<QuestionKnowladgeViewResponse>
-            {
-                Items = list,
-                Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
-            };
-
-            return result;
-        }
-    }
-}
-
-

+ 0 - 79
src/Hotline.Application/Exam/Service/Questions/QuestionOptionsService.cs

@@ -1,79 +0,0 @@
-using Exam.Application;
-using Exam.Infrastructure.Data.Entity;
-using Exam.Insfrastructure.Service.Service;
-using Exam.Questions;
-using Exam.Share;
-using Hotline.Application.Exam.QueryExtensions.Questions;
-using Hotline.Repository.SqlSugar;
-using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
-using Hotline.Share.Dtos.Questions;
-using Hotline.Share.Requests.Question;
-using Mapster;
-using System.ComponentModel;
-using XF.Domain.Dependency;
-
-namespace Hotline.Application.Exam.Service.Questions
-{
-    /// <summary>
-    /// 试题选项服务
-    /// </summary>
-    [Description("试题选项服务")]
-    public class QuestionOptionsService : ApiService<QuestionOptions, QuestionOptionsDto,HotlineDbContext>,IQuestionOptionsService, IScopeDependency
-    {
-        private readonly IQuestionOptionsRepository _repository;
-        public QuestionOptionsService(IQuestionOptionsRepository repository) : base(repository)
-        {
-            _repository = repository;
-        }
-
-        public async Task<QuestionOptionsDto> GetAsync(EntityQueryRequest entityQueryRequest)
-        {
-            var entity = await _repository.GetAsync(entityQueryRequest.Id);
-
-            return entity.Adapt<QuestionOptionsDto>();
-        }
-
-        public async Task<(int, List<QuestionOptionsViewResponse>)> GetListAsync(QuestionOptionsPagedRequest queryRequest)
-        {
-            var query = _repository.Queryable();
-
-            var result = await query.Select(m => new QuestionOptionsViewResponse { 
-                				Content = m.Content,
-								IsAnswer = m.IsAnswer,
-								QuestionId = m.QuestionId,
-								Id = m.Id,
-				            }).ToListAsync();
-
-            var total = await query.CountAsync();
-
-            return (total,result);
-        }
-
-        public async Task<PageViewResponse<QuestionOptionsViewResponse>> GetPagedListAsync(QuestionOptionsPagedRequest queryRequest)
-        {
-            var expression = queryRequest.GetExpression();
-            var questionOptionsTable = _repository.Queryable().Where(expression);
-
-            var queryable = questionOptionsTable.Select((m) => new QuestionOptionsViewResponse
-            {
-                				Content = m.Content,
-								IsAnswer = m.IsAnswer,
-								QuestionId = m.QuestionId,
-								Id = m.Id,
-				            });
-
-            var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
-            var total = await queryable.CountAsync();
-
-            var result = new PageViewResponse<QuestionOptionsViewResponse>
-            {
-                Items = list,
-                Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
-            };
-
-            return result;
-        }
-    }
-}
-
-

+ 169 - 64
src/Hotline.Application/Exam/Service/Questions/QuestionService.cs

@@ -19,6 +19,16 @@ using Hotline.Share.Requests.Question;
 using Mapster;
 using SqlSugar;
 using XF.Domain.Dependency;
+using Exam.Infrastructure.Data.Extensions;
+using Exam.Infrastructure.Data.Interface;
+using Hotline.Import;
+using Exam.Infrastructure.Web.Utilities;
+using XF.Domain.Repository;
+using MapsterMapper;
+using XF.Domain.Entities;
+using Exam.Infrastructure.Extensions;
+using Exam.Infrastructure.Web.Extensions;
+using JiebaNet.Segmenter.Common;
 
 namespace Hotline.Application.Exam.Service.Questions
 {
@@ -33,14 +43,17 @@ namespace Hotline.Application.Exam.Service.Questions
         private readonly IQuestionKnowladgeRepository _questionKnowladgeRepository;
         private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
         private readonly IServiceProvider _serviceProvider;
+        private readonly IMapper _mapper;
+
         public QuestionService(IQuestionRepository repository,
             IQuestionTagRepository questionTagRepository,
             IQuestionOptionsRepository questionOptionsRepository,
             IQuestionAnswerRepository questionAnswerRepository,
             IQuestionSourcewareRepository questionSourcewareRepository,
             IQuestionKnowladgeRepository questionKnowladgeRepository,
-            IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider
-            ) : base(repository)
+            IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,
+            IMapper mapper
+            ) : base(repository,mapper)
         {
             _repository = repository;
             _questionTagRepository = questionTagRepository;
@@ -50,6 +63,7 @@ namespace Hotline.Application.Exam.Service.Questions
             _questionKnowladgeRepository = questionKnowladgeRepository;
             _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
             _serviceProvider = serviceProvider;
+            _mapper = mapper;
         }
         #endregion
 
@@ -58,7 +72,7 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             var entity = await _repository.GetAsync(entityQueryRequest.Id);
 
-            var questionDto = entity.Adapt<QuestionDto>();
+            var questionDto = _mapper.Map<QuestionDto>(entity);
 
             questionDto.QuestionTagDtos = await GetQuestionTags(entityQueryRequest);
 
@@ -114,20 +128,22 @@ namespace Hotline.Application.Exam.Service.Questions
             var examTagTable = new BaseRepository<ExamTag>(_repository.UOW, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(examTagExpression);
 
 
-            var queryable = questionTable.InnerJoin(questionTagTable, (s, d) => s.Id == d.QuestionId).InnerJoin(examTagTable, (f, s, t) => s.TagId == t.Id).Select((s, d, f) => new QuestionViewResponse
+            var queryable = questionTable.InnerJoin(questionTagTable, (s, d) => s.Id == d.QuestionId).InnerJoin(examTagTable, (s,d, t) => d.TagId == t.Id).Select((s, d, t) => new QuestionViewResponse
             {
                 DifficultyLevel = s.DifficultyLevel,
                 FormalEnable = s.FormalEnable,
                 SimulateEnable = s.SimulateEnable,
                 SortIndex = s.SortIndex,
                 Status = s.Status,
-                Tag = f.Name
+                Tag = t.Name,
+                Title = s.Title,
+                Id = s.Id
             });
 
             var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
             var total = await queryable.CountAsync();
 
-            var result = new PageViewResponse<QuestionViewResponse>
+            var result = new QuestionPageViewResponse
             {
                 Items = list,
                 Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
@@ -170,15 +186,40 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             await base.DeleteAsync(entityQueryRequest, cancellationToken);
 
-            await DeleteQuestionTags(entityQueryRequest, cancellationToken);
+            var tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<QuestionTag>()
+                .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.QuestionId == entityQueryRequest.Id)
+                .AndIF(entityQueryRequest.Ids.IsNotNull(), x => entityQueryRequest.Ids.Contains(x.QuestionId))
+                .ToEntityQueryRequest<QuestionTag>();
 
-            await DeleteQuestionOptions(entityQueryRequest, cancellationToken);
+            await DeleteQuestionTags(tmpEntityQueryRequest, cancellationToken);
 
-            await DeleteQuestionAnswer(entityQueryRequest, cancellationToken);
+            tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<QuestionOptions>()
+                .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.QuestionId == entityQueryRequest.Id)
+                .AndIF(entityQueryRequest.Ids.IsNotNull(), x => entityQueryRequest.Ids.Contains(x.QuestionId))
+                .ToEntityQueryRequest<QuestionOptions>();
 
-            await DeleteKnowladges(entityQueryRequest, cancellationToken);
+            await DeleteQuestionOptions(tmpEntityQueryRequest, cancellationToken);
 
-            await DeleteSourcewares(entityQueryRequest, cancellationToken);
+            tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<QuestionAnswer>()
+                .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.QuestionId == entityQueryRequest.Id)
+                .AndIF(entityQueryRequest.Ids.IsNotNull(), x => entityQueryRequest.Ids.Contains(x.QuestionId))
+                .ToEntityQueryRequest<QuestionAnswer>();
+
+            await DeleteQuestionAnswer(tmpEntityQueryRequest, cancellationToken);
+
+            tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<QuestionKnowladge>()
+                .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.QuestionId == entityQueryRequest.Id)
+                .AndIF(entityQueryRequest.Ids.IsNotNull(), x => entityQueryRequest.Ids.Contains(x.QuestionId))
+                .ToEntityQueryRequest<QuestionKnowladge>();
+
+            await DeleteKnowladges(tmpEntityQueryRequest, cancellationToken);
+
+            tmpEntityQueryRequest = ExpressionableUtility.CreateExpression<QuestionSourceware>()
+                .AndIF(entityQueryRequest.Id.IsNotNullOrEmpty(), x => x.QuestionId == entityQueryRequest.Id)
+                .AndIF(entityQueryRequest.Ids.IsNotNull(), x => entityQueryRequest.Ids.Contains(x.QuestionId))
+                .ToEntityQueryRequest<QuestionSourceware>();
+
+            await DeleteSourcewares(tmpEntityQueryRequest, cancellationToken);
         }
         #endregion
 
@@ -187,12 +228,19 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             if (actionRequest.QuestionTagDtos == null) return;
 
-            var questionTags = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionTag>();
+            var questionTagDtos = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Add).ToList();
+
+            var questionTags = _mapper.Map<List<QuestionTag>>(questionTagDtos);
 
-            questionTags.ToInsert(actionRequest);
+            questionTagDtos.InitRequest<QuestionTagDto, QuestionDto>(actionRequest);
+
+            questionTags.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionTags.ToInsert(questionTagDtos);
 
             await _questionTagRepository.AddWithValidateAsync(questionTags, cancellationToken);
         }
+
         private async Task AddQuestionOptions(QuestionDto actionRequest, CancellationToken cancellationToken)
         {
             if (actionRequest.QuestionOptionsDtos == null) return;
@@ -201,9 +249,15 @@ namespace Hotline.Application.Exam.Service.Questions
             if (actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Essay || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Blank)
                 return;
 
-            var questionOptionses = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionOptions>();
+            var questionOptionseDtos = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Add).ToList();
+
+            var questionOptionses = _mapper.Map<List<QuestionOptions>>(questionOptionseDtos);
 
-            questionOptionses.ToInsert(actionRequest);
+            questionOptionseDtos.InitRequest<QuestionOptionsDto,QuestionDto>(actionRequest);
+
+            questionOptionses.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionOptionses.ToInsert(questionOptionseDtos);
 
             await _questionOptionRepository.AddWithValidateAsync(questionOptionses, cancellationToken);
         }
@@ -215,8 +269,9 @@ namespace Hotline.Application.Exam.Service.Questions
             if (actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Multi
                 || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Single
                 || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Judge) return;
-
-            var questionAnswer = actionRequest.QuestionAnswerDto.Adapt<QuestionAnswer>();
+            actionRequest.QuestionAnswerDto.InitRequest<QuestionAnswerDto, QuestionDto>(actionRequest);
+            var questionAnswer = _mapper.Map<QuestionAnswer>(actionRequest.QuestionAnswerDto);
+            questionAnswer.QuestionId = actionRequest.Id;
 
             questionAnswer.ToInsert(actionRequest);
 
@@ -227,9 +282,15 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             if (actionRequest.QuestionSourcewareDtos == null) return;
 
-            var questionSourcewares = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionSourceware>();
+            var questionSourcewareDtos = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Add).ToList();
+
+            var questionSourcewares = _mapper.Map<List<QuestionSourceware>>(questionSourcewareDtos);
+
+            questionSourcewareDtos.InitRequest<QuestionSourcewareDto, QuestionDto>(actionRequest);
 
-            questionSourcewares.ToInsert(actionRequest);
+            questionSourcewares.ForEach(x => x.QuestionId = actionRequest.Id);
+            
+            questionSourcewares.ToInsert(questionSourcewareDtos);
 
             await _questionSourcewareRepository.AddWithValidateAsync(questionSourcewares, cancellationToken);
         }
@@ -237,9 +298,15 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             if (actionRequest.QuestionKnowladgeDtos == null) return;
 
-            var questionKnowladges = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionKnowladge>();
+            var questionKnoladgeDtos = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Add).ToList();
 
-            questionKnowladges.ToInsert(actionRequest);
+            var questionKnowladges = _mapper.Map<List<QuestionKnowladge>>(questionKnoladgeDtos);
+
+            questionKnoladgeDtos.InitRequest<QuestionKnowladgeDto, QuestionDto>(actionRequest);
+
+            questionKnowladges.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionKnowladges.ToInsert(questionKnoladgeDtos);
 
             await _questionKnowladgeRepository.AddWithValidateAsync(questionKnowladges, cancellationToken);
         }
@@ -247,9 +314,18 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             if (actionRequest.QuestionSourcewareDtos == null) return;
 
-            var questionSourcewares = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionSourceware>();
+            var questionSourcewareDtos = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Update).ToList();
+
+            var ids = questionSourcewareDtos.Select(x => x.Id);
 
-            questionSourcewares.ToUpdate(actionRequest);
+            var questionSourcewares = await _questionSourcewareRepository.Queryable().Where(x => ids.Contains(x.Id)).ToListAsync();
+
+            questionSourcewares = _mapper.Map<List<QuestionSourcewareDto>,List<QuestionSourceware>>(questionSourcewareDtos,questionSourcewares);
+
+
+            questionSourcewares.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionSourcewares.ToUpdate(questionSourcewareDtos);
 
             await _questionSourcewareRepository.UpdateWithValidateAsync(questionSourcewares, cancellationToken);
         }
@@ -257,9 +333,17 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             if (actionRequest.QuestionKnowladgeDtos == null) return;
 
-            var questionKnowladges = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionKnowladge>();
+            var questionKnowladgeDtos = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Add).ToList();
+
+            var ids = questionKnowladgeDtos.Select(x => x.Id);
 
-            questionKnowladges.ToUpdate(actionRequest);
+            var questionKnowladges = await _questionKnowladgeRepository.Queryable().Where(x => ids.Contains(x.Id)).ToListAsync();
+
+            questionKnowladges = _mapper.Map<List<QuestionKnowladgeDto>, List<QuestionKnowladge>>(questionKnowladgeDtos,questionKnowladges);
+
+            questionKnowladges.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionKnowladges.ToUpdate(questionKnowladgeDtos);
 
             await _questionKnowladgeRepository.UpdateWithValidateAsync(questionKnowladges, cancellationToken);
         }
@@ -272,7 +356,11 @@ namespace Hotline.Application.Exam.Service.Questions
                 || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Single
                 || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Judge) return;
 
-            var questionAnswer = actionRequest.QuestionAnswerDto.Adapt<QuestionAnswer>();
+            actionRequest.QuestionAnswerDto.InitRequest<QuestionAnswerDto, QuestionDto>(actionRequest);
+
+            var questionAnswer = _mapper.Map<QuestionAnswer>(actionRequest.QuestionAnswerDto);
+
+            questionAnswer.QuestionId = actionRequest.Id;            
 
             questionAnswer.ToUpdate(actionRequest);
 
@@ -286,19 +374,46 @@ namespace Hotline.Application.Exam.Service.Questions
             if (actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Essay || actionRequest.QuestionType == Share.Enums.Exams.EQuestionType.Blank)
                 return;
 
-            var questionOptionses = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Add).Adapt<QuestionOptions>();
+            var questionOptionsDtos = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Update).ToList();
+
+            var ids = questionOptionsDtos.Select(x => x.Id);
+
+            var questionOptionses = await _questionOptionRepository.Queryable().Where(x => ids.Contains(x.Id)).ToListAsync();
+
+            var entitys = new List<QuestionOptions>();
+            foreach(var questionOptionsDto in questionOptionsDtos)
+            {
+                var entity = questionOptionses.FirstOrDefault(x => x.Id == questionOptionsDto.Id);
+                entitys.Add(_mapper.Map<QuestionOptionsDto, QuestionOptions>(questionOptionsDto, entity));
+            }
+
+            //questionOptionses =  _mapper.Map<List<QuestionOptionsDto>, List<QuestionOptions>>(questionOptionsDtos,questionOptionses);
+
+            entitys.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionOptionsDtos.InitRequest(actionRequest);
 
-            questionOptionses.ToUpdate(actionRequest);
+            entitys.ToUpdate(questionOptionsDtos);
 
-            await _questionOptionRepository.UpdateWithValidateAsync(questionOptionses, cancellationToken);
+            await _questionOptionRepository.UpdateWithValidateAsync(entitys, cancellationToken);
         }
+
         private async Task UpdateQuestionTags(QuestionDto actionRequest, CancellationToken cancellationToken)
         {
             if (actionRequest.QuestionTagDtos == null) return;
 
-            var questionTags = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Update).Adapt<QuestionTag>();
+            var questionTagDtos = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Update).ToList();
+
+            var ids = questionTagDtos.Select(x => x.Id);
+
+            var questionTags = await _questionTagRepository.Queryable().Where(x => ids.Contains(x.Id)).ToListAsync();
+
+            questionTags = _mapper.Map<List<QuestionTagDto>, List<QuestionTag>>(questionTagDtos,questionTags);
+
 
-            questionTags.ToUpdate(actionRequest);
+            questionTags.ForEach(x => x.QuestionId = actionRequest.Id);
+
+            questionTags.ToUpdate(questionTagDtos);
 
             await _questionTagRepository.UpdateWithValidateAsync(questionTags, cancellationToken);
         }
@@ -328,14 +443,9 @@ namespace Hotline.Application.Exam.Service.Questions
 
             await UpdateSourcewares(actionRequest, cancellationToken);
 
-            Expressionable<QuestionSourceware> expressionable = new Expressionable<QuestionSourceware>();
             var questionSourcewareDtos = actionRequest.QuestionSourcewareDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
-            expressionable.AndIF(questionSourcewareDtos.Any(), x => questionSourcewareDtos.Select(m => m.Id).Contains(x.Id));
-
-            var entityQueryRequest = new EntityQueryRequest
-            {
-                Expression = expressionable.ToExpression()
-            };
+            var ids = questionSourcewareDtos.Select(m => m.Id);
+            EntityQueryRequest entityQueryRequest = ResovleDelete<QuestionSourceware>(ids);
 
             await DeleteSourcewares(entityQueryRequest, cancellationToken);
         }
@@ -346,14 +456,9 @@ namespace Hotline.Application.Exam.Service.Questions
 
             await UpdateKnowladges(actionRequest, cancellationToken);
 
-            Expressionable<QuestionKnowladge> expressionable = new Expressionable<QuestionKnowladge>();
             var questionKnowladgeDtos = actionRequest.QuestionKnowladgeDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
-            expressionable.AndIF(questionKnowladgeDtos.Any(), x => questionKnowladgeDtos.Select(m => m.Id).Contains(x.Id));
-
-            var entityQueryRequest = new EntityQueryRequest
-            {
-                Expression = expressionable.ToExpression()
-            };
+            var ids = questionKnowladgeDtos.Select(m => m.Id);
+            EntityQueryRequest entityQueryRequest = ResovleDelete<QuestionKnowladge>(ids);
 
             await DeleteKnowladges(entityQueryRequest, cancellationToken);
         }
@@ -382,14 +487,9 @@ namespace Hotline.Application.Exam.Service.Questions
 
             await UpdateQuestionOptions(actionRequest, cancellationToken);
 
-            Expressionable<QuestionOptions> expressionable = new Expressionable<QuestionOptions>();
-            var questionSourcewareDtos = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
-            expressionable.AndIF(questionSourcewareDtos.Any(), x => questionSourcewareDtos.Select(m => m.Id).Contains(x.Id));
-
-            var entityQueryRequest = new EntityQueryRequest
-            {
-                Expression = expressionable.ToExpression()
-            };
+            var questionOptionsDtos = actionRequest.QuestionOptionsDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
+            var ids = questionOptionsDtos.Select(m => m.Id);
+            EntityQueryRequest entityQueryRequest = ResovleDelete<QuestionOptions>(ids);
 
             await DeleteQuestionOptions(entityQueryRequest, cancellationToken);
         }
@@ -400,19 +500,24 @@ namespace Hotline.Application.Exam.Service.Questions
 
             await UpdateQuestionTags(actionRequest, cancellationToken);
 
-            Expressionable<QuestionTag> expressionable = new Expressionable<QuestionTag>();
-            var questionSourcewareDtos = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
-            expressionable.AndIF(questionSourcewareDtos.Any(), x => questionSourcewareDtos.Select(m => m.Id).Contains(x.Id));
-
-            var entityQueryRequest = new EntityQueryRequest
-            {
-                Expression = expressionable.ToExpression()
-            };
+            var questionTagDtos = actionRequest.QuestionTagDtos.Where(x => x.OperationStatus == OperationStatus.Delete);
+            var ids = questionTagDtos.Select(m => m.Id);
+            EntityQueryRequest entityQueryRequest = ResovleDelete<QuestionTag>(ids);
 
             await DeleteQuestionTags(entityQueryRequest, cancellationToken);
         }
 
+        private EntityQueryRequest ResovleDelete<T>(IEnumerable<string> ids) where T:class,IEntity<string>,new()
+        {
+            Expressionable<T> expressionable = ExpressionableUtility.CreateExpression<T>();
+            expressionable.AndIF(ids.Any(), x => ids.Contains(x.Id));
 
+            var entityQueryRequest = new EntityQueryRequest
+            {
+                Expression = ids.Any() ? expressionable.ToExpression() : null
+            };
+            return entityQueryRequest;
+        }
 
         private async Task<List<QuestionSourcewareDto>> GetQuestionSourcewares(EntityQueryRequest entityQueryRequest)
         {
@@ -435,7 +540,7 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             var questionOptionTable = await _questionOptionRepository.Queryable().Where(x => x.QuestionId == entityQueryRequest.Id).ToListAsync();
 
-            var questionOptions = questionOptionTable.Adapt<List<QuestionOptionsDto>>();
+            var questionOptions = _mapper.Map<List<QuestionOptionsDto>>(questionOptionTable);
 
             return questionOptions;
         }
@@ -444,7 +549,7 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             var questionKnowladgeTable = await _questionKnowladgeRepository.Queryable().Where(x => x.QuestionId == entityQueryRequest.Id).ToListAsync();
 
-            var questionKnowladges = questionKnowladgeTable.Adapt<List<QuestionKnowladgeDto>>();
+            var questionKnowladges = _mapper.Map<List<QuestionKnowladgeDto>>(questionKnowladgeTable);
 
             return questionKnowladges;
         }
@@ -453,7 +558,7 @@ namespace Hotline.Application.Exam.Service.Questions
         {
             var questionAnswer = await _questionAnswerRepository.GetAsync(entityQueryRequest.Id);
 
-            var questionAnswerDto = questionAnswer.Adapt<QuestionAnswerDto>();
+            var questionAnswerDto = _mapper.Map<QuestionAnswerDto>(questionAnswer);
 
             return questionAnswerDto;
         }

+ 0 - 76
src/Hotline.Application/Exam/Service/Questions/QuestionSourcewareService.cs

@@ -1,76 +0,0 @@
-using Exam.Application;
-using Exam.Infrastructure.Data.Entity;
-using Exam.Insfrastructure.Service.Service;
-using Exam.Questions;
-using Exam.Share;
-using Hotline.Repository.SqlSugar;
-using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
-using Hotline.Share.Dtos.Questions;
-using Hotline.Share.Requests.Question;
-using Mapster;
-using System.ComponentModel;
-using XF.Domain.Dependency;
-
-namespace Hotline.Application.Exam.Service.Questions
-{
-    /// <summary>
-    /// 关联课件服务
-    /// </summary>
-    [Description("关联课件服务")]
-    public class QuestionSourcewareService : ApiService<QuestionSourceware, QuestionSourcewareDto,HotlineDbContext>,IQuestionSourcewareService, IScopeDependency
-    {
-        private readonly IQuestionSourcewareRepository _repository;
-        public QuestionSourcewareService(IQuestionSourcewareRepository repository) : base(repository)
-        {
-            _repository = repository;
-        }
-
-        public async Task<QuestionSourcewareDto> GetAsync(EntityQueryRequest entityQueryRequest)
-        {
-            var entity = await _repository.GetAsync(entityQueryRequest.Id);
-
-            return entity.Adapt<QuestionSourcewareDto>();
-        }
-
-        public async Task<(int, List<QuestionSourcewareViewResponse>)> GetListAsync(QuestionSourcewarePagedRequest queryRequest)
-        {
-            var query = _repository.Queryable();
-
-            var result = await query.Select(m => new QuestionSourcewareViewResponse { 
-                				QuestionId = m.QuestionId,
-								SourcewareId = m.SourcewareId,
-								Id = m.Id,
-				            }).ToListAsync();
-
-            var total = await query.CountAsync();
-
-            return (total,result);
-        }
-
-        public async Task<PageViewResponse<QuestionSourcewareViewResponse>> GetPagedListAsync(QuestionSourcewarePagedRequest queryRequest)
-        {
-            var expression = queryRequest.GetExpression();
-            var questionSourcewareTable = _repository.Queryable().Where(expression);
-
-            var queryable = questionSourcewareTable.Select((m) => new QuestionSourcewareViewResponse
-            {
-                				QuestionId = m.QuestionId,
-								SourcewareId = m.SourcewareId,
-								Id = m.Id,
-				            });
-
-            var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
-            var total = await queryable.CountAsync();
-
-            var result = new PageViewResponse<QuestionSourcewareViewResponse>
-            {
-                Items = list,
-                Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
-            };
-
-            return result;
-        }
-    }
-}
-
-

+ 0 - 75
src/Hotline.Application/Exam/Service/Questions/QuestionTagService.cs

@@ -1,75 +0,0 @@
-using Exam.Infrastructure.Data.Entity;
-using Exam.Insfrastructure.Service.Service;
-using Exam.Questions;
-using Exam.Share;
-using Hotline.Repository.SqlSugar;
-using Hotline.Repository.SqlSugar.Exam.Interfaces.Questions;
-using Hotline.Share.Dtos.Questions;
-using Hotline.Share.Requests.Question;
-using Mapster;
-using System.ComponentModel;
-using XF.Domain.Dependency;
-
-namespace Exam.Application
-{
-    /// <summary>
-    /// 试题标签服务
-    /// </summary>
-    [Description("试题标签服务")]
-    public class QuestionTagService : ApiService<QuestionTag, QuestionTagDto,HotlineDbContext>,IQuestionTagService, IScopeDependency
-    {
-        private readonly IQuestionTagRepository _repository;
-        public QuestionTagService(IQuestionTagRepository repository) : base(repository)
-        {
-            _repository = repository;
-        }
-
-        public async Task<QuestionTagDto> GetAsync(EntityQueryRequest entityQueryRequest)
-        {
-            var entity = await _repository.GetAsync(entityQueryRequest.Id);
-
-            return entity.Adapt<QuestionTagDto>();
-        }
-
-        public async Task<(int, List<QuestionTagViewResponse>)> GetListAsync(QuestionTagPagedRequest queryRequest)
-        {
-            var query = _repository.Queryable();
-
-            var result = await query.Select(m => new QuestionTagViewResponse { 
-                				TagId = m.TagId,
-								QuestionId = m.QuestionId,
-								Id = m.Id,
-				            }).ToListAsync();
-
-            var total = await query.CountAsync();
-
-            return (total,result);
-        }
-
-        public async Task<PageViewResponse<QuestionTagViewResponse>> GetPagedListAsync(QuestionTagPagedRequest queryRequest)
-        {
-            var expression = queryRequest.GetExpression();
-            var questionTagTable = _repository.Queryable().Where(expression);
-
-            var queryable = questionTagTable.Select((m) => new QuestionTagViewResponse
-            {
-                				TagId = m.TagId,
-								QuestionId = m.QuestionId,
-								Id = m.Id,
-				            });
-
-            var list = await queryable.ToPageListAsync(queryRequest.PageIndex, queryRequest.PageSize);
-            var total = await queryable.CountAsync();
-
-            var result = new PageViewResponse<QuestionTagViewResponse>
-            {
-                Items = list,
-                Pagination = new Pagination(queryRequest.PageIndex, queryRequest.PageSize, total)
-            };
-
-            return result;
-        }
-    }
-}
-
-

+ 6 - 3
src/Hotline.Application/Exam/Service/Sourcewares/SourcewareCategoryService.cs

@@ -11,6 +11,7 @@ using Hotline.Repository.SqlSugar.Exam.Interfaces.Sourcewares;
 using Hotline.Share.Dtos.Sourcewares;
 using Hotline.Share.Requests.Sourceware;
 using Mapster;
+using MapsterMapper;
 using System.ComponentModel;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -24,16 +25,18 @@ namespace Exam.Application.Service.Sourcewares
     public class SourcewareCategoryService : ApiService<SourcewareCategory, SourcewareCategoryDto,HotlineDbContext>,ISourcewareCategoryService, IScopeDependency
     {
         private readonly ISourcewareCategoryRepository _repository;
-        public SourcewareCategoryService(ISourcewareCategoryRepository repository) : base(repository)
+        private readonly IMapper _mapper;
+        public SourcewareCategoryService(ISourcewareCategoryRepository repository,IMapper mapper) : base(repository,mapper)
         {
             _repository = repository;
+            _mapper = mapper;
         }
 
         public async Task<SourcewareCategoryDto> GetAsync(EntityQueryRequest entityQueryRequest)
         {
             var entity = await _repository.GetAsync(entityQueryRequest.Id);
 
-            return entity.Adapt<SourcewareCategoryDto>();
+            return _mapper.Map<SourcewareCategoryDto>(entity);
         }
 
         public async Task<(int, List<SourcewareCategoryViewResponse>)> GetListAsync(SourcewareCategoryRequest queryRequest)
@@ -76,7 +79,7 @@ namespace Exam.Application.Service.Sourcewares
                 ParentId = m.ParentId,
                 SortIndex = m.SortIndex,
                 LastModificationTime = m.LastModificationTime,
-                Children = m.Children.Adapt<List<SourcewareCategoryViewResponse>>()
+                Children = _mapper.Map<List<SourcewareCategoryViewResponse>>(m.Children)
             }).ToList();
 
 

+ 2 - 1
src/Hotline.Application/Exam/Service/Sourcewares/SourcewareService.cs

@@ -11,6 +11,7 @@ using Hotline.Share.Dtos.Sourcewares;
 using Hotline.Share.Requests.Sourceware;
 using Hotline.Share.ViewResponses.Sourcewares;
 using Mapster;
+using MapsterMapper;
 using SqlSugar;
 using System.ComponentModel;
 using XF.Domain.Dependency;
@@ -26,7 +27,7 @@ namespace Hotline.Application.Exam.Service.Sourcewares
         private readonly ISourcewareRepository _repository;
         private readonly IDataPermissionFilterBuilder _datePermissionFilterBuilder;
         private readonly IServiceProvider _serviceProvider;
-        public SourcewareService(ISourcewareRepository repository, IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider) : base(repository)
+        public SourcewareService(ISourcewareRepository repository, IDataPermissionFilterBuilder dataPermissionFilterBuilder, IServiceProvider serviceProvider,IMapper mapper) : base(repository, mapper)
         {
             _repository = repository;
             _datePermissionFilterBuilder = dataPermissionFilterBuilder;

+ 2 - 0
src/Hotline.Repository.SqlSugar/Exam/Repositories/ExamRepository.cs

@@ -70,6 +70,8 @@ namespace Exam.Repository.Sqlsugar.Repositories
             }
             else
             {
+                if (entityQueryRequest.Expression == null) return;
+
                 var entities = await base.QueryAsync((Expression<Func<TEntity, bool>>)entityQueryRequest.Expression);
 
                 await DoValidationAsync(entities, ValidatorTypeConstants.Remove);

+ 1 - 1
src/Hotline.Repository.SqlSugar/Exam/Validators/Questions/QuestionValidator.cs

@@ -53,7 +53,7 @@ namespace Exam.Repository.Sqlsugar.Validators.Questions
         {
             base.ValidateRuleWithModify();
             RuleFor(m => m.LastModificationTime).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(Question.LastModificationTime))));
-            RuleFor(m => m.Title).Must((q, v, ctx) => _questionRepository.Queryable().Where(x => x.Title ==v  && x.Id  != q.Id).Any()).WithMessage(x => string.Format(ErrorMessage.IsRepeat, x.GetType().GetDescription(nameof(Question.Title))));        }
+            RuleFor(m => m.Title).Must((q, v, ctx) => !_questionRepository.Queryable().Where(x => x.Title ==v  && x.Id  != q.Id).Any()).WithMessage(x => string.Format(ErrorMessage.IsRepeat, x.GetType().GetDescription(nameof(Question.Title))));        }
 
        
 

+ 5 - 1
src/Hotline.Repository.SqlSugar/Extensions/ApiServiceExtension.cs

@@ -1,4 +1,5 @@
 using Exam.Infrastructure.Data.Entity;
+using Exam.Infrastructure.Extensions;
 using XF.Domain.Entities;
 using XF.Domain.Repository;
 
@@ -9,7 +10,10 @@ namespace Hotline.Repository.SqlSugar.Extensions
         public static void ToInsert<T,TActionRequest>(this T entity, TActionRequest actionRequest) where T : class, IEntity<string>, new()
         where TActionRequest : ActionRequest
         {
-            entity.Id = Guid.NewGuid().ToString();
+            if (entity.Id.IsNullOrEmpty())
+            {
+                entity.Id = actionRequest.Id ?? Guid.NewGuid().ToString();
+            }
 
             if (entity is CreationEntity)
             {

+ 9 - 5
src/Hotline.Repository.SqlSugar/Service/ApiService.cs

@@ -4,6 +4,7 @@ using Hotline.Repository.SqlSugar.Entitys;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.Interface;
 using Mapster;
+using MapsterMapper;
 using SqlSugar;
 using XF.Domain.Entities;
 
@@ -17,10 +18,13 @@ namespace Exam.Insfrastructure.Service.Service
         private readonly IExamRepository<T, TDBContext> _repository;
 
         private AbstractValidator<T> _validator;
-        public ApiService(IExamRepository<T, TDBContext> repository)
+
+        private IMapper _mapper;
+        public ApiService(IExamRepository<T, TDBContext> repository,IMapper mapper)
         {
             _repository = repository;
             _validator = _repository.Validator;
+            _mapper = mapper;
         } 
         #endregion
 
@@ -49,7 +53,7 @@ namespace Exam.Insfrastructure.Service.Service
         /// <returns></returns>
         public virtual async Task AddAsync(List<TActionRequest> actionRequests, CancellationToken cancellationToken)
         {
-            var entities = actionRequests.Adapt<List<T>>();
+            var entities = _mapper.Map<List<T>>(actionRequests);
 
             entities.ToInsert(actionRequests);
 
@@ -77,7 +81,7 @@ namespace Exam.Insfrastructure.Service.Service
         {
             var entity = await _repository.GetAsync(actionRequest.Id);
 
-            entity = actionRequest.Adapt<TActionRequest, T>(entity);
+            entity = _mapper.Map<TActionRequest, T>(actionRequest,entity);
 
             entity.ToUpdate(actionRequest);
 
@@ -95,7 +99,7 @@ namespace Exam.Insfrastructure.Service.Service
             var ids = actionRequests.Select(x => x.Id).ToList();
             var entities = await _repository.QueryAsync(x => ids.Contains(x.Id));
 
-            entities = actionRequests.Adapt<List<TActionRequest>, List<T>>(entities);
+            entities = _mapper.Map<List<TActionRequest>, List<T>>(actionRequests,entities);
 
             entities.ToUpdate(actionRequests);
 
@@ -113,7 +117,7 @@ namespace Exam.Insfrastructure.Service.Service
             var ids = statusActionRequests.Select(x => x.Id).ToList();
             var entities = await _repository.QueryAsync(x => ids.Contains(x.Id));
 
-            entities = statusActionRequests.Adapt<List<StatusActionRequest>, List<T>>(entities);
+            entities = _mapper.Map<List<StatusActionRequest>, List<T>>(statusActionRequests,entities);
 
             entities.ToUpdate(statusActionRequests);
 

+ 0 - 1
src/Hotline.Repository.SqlSugar/Validate/BaseValidator.cs

@@ -19,7 +19,6 @@ namespace Hotline.Repository.SqlSugar.Validate
         protected virtual void BaseValidateRule()
         {
             RuleFor(m => m.Id).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(CreationEntity.Id))));
-            RuleFor(m => m.CreationTime).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(CreationEntity.CreationTime))));
             RuleFor(m => m.CreatorId).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(CreationEntity.CreatorId))));
             RuleFor(m => m.CreatorName).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(CreationEntity.CreatorName))));
             RuleFor(m => m.CreatorOrgId).NotEmpty().WithMessage(x => string.Format(ErrorMessage.IsRequired, x.GetType().GetDescription(nameof(CreationEntity.CreatorOrgId))));

+ 1 - 1
src/Hotline.Share/Requests/Question/QuestionPagedRequest.cs

@@ -7,7 +7,7 @@ namespace Hotline.Share.Requests.Question
     {
         public string TagId { get; set; }
 
-        public EDifficultyLevel DifficultyLevel { get; set; }
+        public EDifficultyLevel? DifficultyLevel { get; set; }
 
         public string Title { get; set; }
     }

+ 1 - 1
src/Hotline/Exams/Questions/Question.cs

@@ -52,7 +52,7 @@ namespace Exam.Questions
         /// </summary>
         [SugarColumn(ColumnDescription = "备注")]
         [Description("备注")]
-        public string Remark { get; set; }
+        public string? Remark { get; set; }
 
         /// <summary>
         /// 权重