Просмотр исходного кода

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

tangjiang 2 недель назад
Родитель
Сommit
7fea7fad66

+ 49 - 11
src/Hotline.Application/Exam/Service/ExamManages/UserExamService.cs

@@ -42,6 +42,7 @@ using DocumentFormat.OpenXml.Office2013.Excel;
 using Hotline.Share.Enums.Exams;
 using DocumentFormat.OpenXml.Wordprocessing;
 using Hotline.Repository.SqlSugar.Exam.Repositories.ExamManages;
+using Hotline.Exams.Questions;
 
 namespace Hotline.Application.Exam.Service.ExamManages
 {
@@ -90,17 +91,24 @@ namespace Hotline.Application.Exam.Service.ExamManages
         public async Task<ExamQuestionDto> GetExamQuestionDto(ExamQuestionRequest examQuestionRequest)
         {
             var expression = examQuestionRequest.GetExpression();
-            var quesetion = await new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression).FirstAsync();
+            var question = await new ExamRepository<Exams.ExamManages.ExamQuestionBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(expression).FirstAsync();
 
-            if (quesetion != null)
+            if (question != null)
             {
-                var examQuestionDto = _mapper.Map<ExamQuestionDto>(quesetion);
+                var examQuestionDto = _mapper.Map<ExamQuestionDto>(question);
+
+                var questionScore = await new ExamRepository<ExamQuestionScoreBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).GetAsync(x=>x.QuestionType == question.QuestionType && x.ExamManageId == examQuestionRequest.ExamId);
+
+                if (questionScore != null)
+                {
+                    examQuestionDto.Score = questionScore.Score;
+                }               
 
                 if (examQuestionDto.QuestionType.CheckSelectType())
                 {
-                    var questionOptions = await new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.ExamQuestionId == quesetion.Id).ToListAsync();
+                    var questionOptions = await new ExamRepository<ExamQuestionOptionsBak>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable().Where(x => x.ExamQuestionId == question.Id).ToListAsync();
 
-                    List<ExamUserExamItemOptions> userItemItemOptions = await GetUserExteamItemOptios(quesetion);
+                    List<ExamUserExamItemOptions> userItemItemOptions = await GetUserExteamItemOptios(question);
 
                     if (questionOptions != null)
                     {
@@ -163,7 +171,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var userItemItemOptions = await userExamItemOptionsTable
                 .InnerJoin(userExamItemTable, (o, u) => o.UserExamItemId == u.Id)
                 .InnerJoin(userExamTable, (o, u, e) => u.UserExamId == e.Id)
-                .Where((o, u, e) => u.QuestionId == quesetion.QuestionId && e.UserId == _sessionContext.UserId).
+                .Where((o, u, e) => u.QuestionId == quesetion.QuestionId && e.UserId == _sessionContext.UserId && e.ExamStatus == EExamStatus.Executing).
                 Select((o, u, e) => o).ToListAsync();
             return userItemItemOptions;
         }
@@ -320,7 +328,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             {
                 await UpdateExamAsync(_userExamItemRepository, updateUserExamItemDto, cancellationToken);
             }
-            
+
             await CalcuteExamItemScore(_userExamItemRepository, updateUserExamItemDto, cancellationToken);
 
             return startExamViewResponse;
@@ -344,7 +352,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 IsJoin = false
             };
 
-            if (userExam.StartTime == null)
+            if (userExam.StartTime == null || userExam.ExamStatus == EExamStatus.Complete)
                 userExam.StartTime = DateTime.Now;
 
             var startExamViewResponse = await CheckExamValid(userExam, cancellationToken);
@@ -365,6 +373,11 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
 
             }
+            // TODO: 删除之前选项和答案
+            else if(userExam.ExamStatus == EExamStatus.Complete)
+            {
+                await ReExam(userExam, cancellationToken);
+            }
             var examManage = await _examManageRepository.GetAsync(x => x.Id == userExam.ExamId);
 
             return new StartExamViewResponse
@@ -375,6 +388,29 @@ namespace Hotline.Application.Exam.Service.ExamManages
             };
         }
 
+        /// <summary>
+        /// 重考
+        /// </summary>
+        /// <param name="userExam"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        private async Task ReExam(ExamUserExam userExam, CancellationToken cancellationToken)
+        {
+            //新增重考记录
+            var reExamUserExam = _mapper.Map<ExamUserExam, ExamUserExam>(userExam);
+
+            reExamUserExam.IsCheck = false;
+            reExamUserExam.IsSubmit = false;
+            reExamUserExam.IsSuccess = false;
+            reExamUserExam.IsReExam = true;
+            reExamUserExam.Score = 0;
+            reExamUserExam.ExamStatus = EExamStatus.NoStart;
+
+            reExamUserExam.ToInsert(_sessionContext);
+
+            await _repository.AddWithValidateAsync(reExamUserExam, cancellationToken);
+        }
+
         private async Task<StartExamViewResponse> CheckExamValid(ExamUserExam examUserExam, CancellationToken cancellationToken)
         {
 
@@ -719,7 +755,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
         public async Task<GradingResultPageViewResponse> GetGradingResultPagedList(GradingPagedRequest gradingPagedRequest)
         {
             // 只要有阅卷记录就在已阅卷列表中,已阅卷和未阅卷会有重复数据,只有所有记录都已阅卷才会从未阅卷列表中排除
-            var userExamTable = _repository.Queryable().WhereIF(gradingPagedRequest.IsCheck != null, x => x.IsCheck == gradingPagedRequest.IsCheck).Where(x=>x.IsSubmit);
+            var userExamTable = _repository.Queryable().Where(x => x.IsSubmit);
 
             var examManageTable = new ExamRepository<ExamManage>(_uow, _dataPermissionFilterBuilder, _serviceProvider).Queryable();
 
@@ -741,7 +777,9 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 IsCheck = SqlFunc.Subqueryable<ExamUserExam>().Where(x => x.ExamId == e.Id && !x.IsCheck).Count() <= 0,
                 Id = e.Id,
                 Remark = e.Remark
-            });
+            }).MergeTable();
+
+            queryable = queryable.WhereIF(gradingPagedRequest.IsCheck != null, x => x.IsCheck == gradingPagedRequest.IsCheck);
 
             var list = await queryable.ToPageListAsync(gradingPagedRequest.PageIndex, gradingPagedRequest.PageSize);
             var total = await queryable.CountAsync();
@@ -1262,7 +1300,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 Status = u.Status,
                 SortIndex = u.SortIndex,
                 ExamStatus = u.ExamStatus,
-                IsSuccess = u.IsCheck? u.IsSuccess:null,
+                IsSuccess = u.IsCheck ? u.IsSuccess : null,
                 EndTime = e.EndTime,
                 StartTime = e.StartTime,
                 TimeSpan = e.TimeSpan,

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

@@ -274,7 +274,7 @@ namespace Hotline.Application.Exam.Service.Trains
                     SortIndex = r.SortIndex,
                     Status = r.Status,
                     TrainTime = p.TrainEndTime
-                });
+                }).MergeTable();
 
             var calcuteRateResult = new TrainResultRateViewResponse
             {

+ 1 - 1
src/Hotline.Application/Exam/Strategy/CheckValidateCountStrategy.cs

@@ -35,7 +35,7 @@ namespace Hotline.Application.Exam.Strategy
 
         public bool Validate()
         {
-            if (_count>=_validateCount)
+            if (_count>_validateCount)
             {
                 ErroMessage = "已超过可考次数,考试结束";
                 _current = this;

+ 1 - 1
src/Hotline.Application/Exam/Strategy/ExamStrategyProxy.cs

@@ -50,7 +50,7 @@ namespace Hotline.Application.Exam.Strategy
             var current = examStrategys.FirstOrDefault();
             if (current != null)
             {
-                for (var i = 1; i < examStrategys.Count - 1; i++)
+                for (var i = 1; i <= examStrategys.Count - 1; i++)
                 {
                     current.SetNext(examStrategys[i]);
                     current = examStrategys[i];

+ 2 - 1
src/Hotline.Application/OrderApp/OrderApplication.cs

@@ -985,7 +985,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 d.Order.SourceChannelCode == "SZMHD" && d.Order.IsProvince == true) //政民互动
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Order.Source == ESource.ProvinceStraight &&
                 d.Order.SourceChannelCode == "S12345" && d.Order.IsProvince == true) //省12345
-            .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)
+            .WhereIF(dto.PublishState.HasValue , d=>d.PublishState == dto.PublishState.Value) //发布范围 是否公开
+			.OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)
             .OrderByIF(dto is { SortRule: 0, SortField: "creationTime" }, d => d.Order.CreationTime, OrderByType.Asc)   //受理时间
             .OrderByIF(dto is { SortRule: 1, SortField: "creationTime" }, d => d.Order.CreationTime, OrderByType.Desc)
             .OrderByIF(dto is { SortRule: 0, SortField: "filedTime" }, d => d.Order.FiledTime, OrderByType.Asc)  //办结时间

+ 2 - 3
src/Hotline.Application/Snapshot/BiSnapshotApplication.cs

@@ -568,7 +568,7 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
             CommunityCode = it.Id,
             CommunityName = it.Name,
             CommunityFullName = it.FullName,
-            SumCount = SqlFunc.Subqueryable<OrderSnapshot>().Where(snapshot => snapshot.CommunityFullName!.Contains(it.FullName)).Count(),
+            SumCount = SqlFunc.Subqueryable<OrderSnapshot>().Where(s => s.CommunityFullName!.Contains(it.FullName) && s.CreationTime >= dto.StartTime && s.CreationTime <= dto.EndTime).Count(),
             HasChild = SqlFunc.Subqueryable<CommunityInfo>().Where(c => c.ParentCode == it.Id).Any()
         });
 #if DEBUG
@@ -579,10 +579,9 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
 
     public ISugarQueryable<CommunityStatisticsDetailsOutDto> GetCommunityStatisticsDetails(CommunityStatisticsDetailsInDto dto)
     {
-        var communityFullName = _communityInfoRepository.Queryable().Where(c => c.Id == dto.CommunityCode).Select(c => c.FullName).First();
         var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
-            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && snapshot.CommunityFullName!.Contains(communityFullName))
+            .Where((snapshot, order) => snapshot.CreationTime >= dto.StartTime && snapshot.CreationTime <= dto.EndTime && snapshot.CommunityFullName!.Contains(dto.CommunityFullName))
             .WhereIF(dto.IndustryId.NotNullOrEmpty(), (snapshot, order) => snapshot.IndustryId == dto.IndustryId)
             .Select((snapshot, order) => new CommunityStatisticsDetailsOutDto(), true);
 #if DEBUG

+ 1 - 1
src/Hotline.Share/Dtos/Snapshot/StatisticsDto.cs

@@ -2092,7 +2092,7 @@ public record CommunityStatisticsDetailsInDto : PagedRequest
     /// 社区全称
     /// </summary>
     [Required]
-    public string CommunityCode { get; set; }
+    public string CommunityFullName { get; set; }
 
     /// <summary>
     /// 行业Id

+ 5 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -318,6 +318,11 @@ public record PublishedPagedRequest : PagedKeywordRequest
     /// 省来源分类 1:政民互动直派 2:政民互动  3:省12345
     /// </summary>
     public string? ProvinceChannel { get; set; }
+
+	/// <summary>
+	/// 发布范围 是否公开
+	/// </summary>
+	public bool? PublishState { get; set; }
 }
 
 public record HotspotSubtotalReportPagedRequest : ReportPagedRequest

+ 14 - 2
src/Hotline/Snapshot/Services/NotificationDomainService.cs

@@ -1,7 +1,9 @@
-using Hotline.Share.Dtos.Snapshot;
+using Exam.Infrastructure.Extensions;
+using Hotline.Share.Dtos.Snapshot;
 using Hotline.Snapshot.Contracts;
 using Hotline.Snapshot.IRepository;
 using Mapster;
+using Microsoft.Extensions.Logging;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -15,16 +17,26 @@ public class NotificationDomainService : INotificationDomainService, IScopeDepen
 {
     private readonly INotificationRepository _notificationRepository;
     private readonly INotificationReceiverRepository _notificationReceiverRepository;
+    private readonly ILogger<NotificationDomainService> _logger;
 
-    public NotificationDomainService(INotificationRepository notificationRepository, INotificationReceiverRepository notificationReceiverRepository)
+    public NotificationDomainService(INotificationRepository notificationRepository, INotificationReceiverRepository notificationReceiverRepository, ILogger<NotificationDomainService> logger)
     {
         _notificationRepository = notificationRepository;
         _notificationReceiverRepository = notificationReceiverRepository;
+        _logger = logger;
     }
 
     public async Task AddNotifyAsync(AddNotifyInDto inDto, CancellationToken token)
     {
         var entity = inDto.Adapt<Notification>();
+        var hasOld = await _notificationRepository.Queryable()
+            .Where(m => m.ExternalId == inDto.ExternalId)
+            .AnyAsync();
+        if (hasOld) 
+        {
+            _logger.LogInformation("通知消息已存在, 不重复通知用户. " + inDto.ToJson());
+            return;
+        }
         var id = await _notificationRepository.AddAsync(entity, token);
         var items = new List<NotificationReceiver>();
         foreach (var userId in inDto.UserIds)

+ 1 - 1
test/Hotline.Tests/Application/BiSnapshotApplicationTest.cs

@@ -60,7 +60,7 @@ public class BiSnapshotApplicationTest : TestBase
             if (hasChild.SumCount != 0)
             {
                 var inDto2 = inDto.Adapt<CommunityStatisticsDetailsInDto>();
-                inDto2.CommunityCode = hasChild.CommunityCode;
+                inDto2.CommunityFullName = hasChild.CommunityFullName;
                 var details = await _biSnapshotApplication.GetCommunityStatisticsDetails(inDto2).ToListAsync();
                 details.Count.ShouldBe(hasChild.SumCount);
             }

+ 5 - 1
test/Hotline.Tests/Application/SnapshotApplicationTest.cs

@@ -8,6 +8,7 @@ using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Repository.SqlSugar.Snapshot;
 using Hotline.Settings;
 using Hotline.Share.Dtos.Article;
 using Hotline.Share.Dtos.Snapshot;
@@ -41,6 +42,7 @@ public class SnapshotApplicationTest : TestBase
     private readonly IIndustryRepository _industryRepository;
     private readonly IFileRepository _fileRepository;
     private readonly OrderServiceMock _orderServiceMock;
+    private readonly IInviteCodeRecordRepository _inviteCodeRecordRepository;
     private readonly IOrderRepository _orderRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
     private readonly ISessionContext _sessionContext;
@@ -52,7 +54,7 @@ public class SnapshotApplicationTest : TestBase
     private readonly IOrderSnapshotApplication _orderSnapshotApplication;
     private readonly ICitizenRepository _citizenRepository;
 
-    public SnapshotApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, ISnapshotApplication snapshotApplication, IIdentityAppService identityAppService, IRepository<RedPackRecord> redPackRecordRepository, IIndustryApplication industryApplication, IIndustryRepository industryRepository, IFileRepository fileRepository, OrderServiceMock orderServiceMock, IOrderRepository orderRepository, IOrderSnapshotRepository orderSnapshotRepository, IThirdIdentiyService thirdService, IThirdAccountRepository thirdAccount, ISessionContext sessionContext, IGuiderSystemService guiderSystemService, ISystemSettingCacheManager systemSettingCacheManager, ICommunityInfoRepository communityInfoRepository, IIndustryLogRepository industryLogRepository, IRedPackApplication redPackApplication, IOrderSnapshotApplication orderSnapshotApplication, ITypedCache<SystemSetting> cacheSettingData, ThirdAccounSupplierFactory thirdAccountDomainFactory, ICitizenRepository citizenRepository, IServiceProvider serviceProvider) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount, cacheSettingData, thirdAccountDomainFactory, serviceProvider)
+    public SnapshotApplicationTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IHttpContextAccessor httpContextAccessor, ISnapshotApplication snapshotApplication, IIdentityAppService identityAppService, IRepository<RedPackRecord> redPackRecordRepository, IIndustryApplication industryApplication, IIndustryRepository industryRepository, IFileRepository fileRepository, OrderServiceMock orderServiceMock, IOrderRepository orderRepository, IOrderSnapshotRepository orderSnapshotRepository, IThirdIdentiyService thirdService, IThirdAccountRepository thirdAccount, ISessionContext sessionContext, IGuiderSystemService guiderSystemService, ISystemSettingCacheManager systemSettingCacheManager, ICommunityInfoRepository communityInfoRepository, IIndustryLogRepository industryLogRepository, IRedPackApplication redPackApplication, IOrderSnapshotApplication orderSnapshotApplication, ITypedCache<SystemSetting> cacheSettingData, ThirdAccounSupplierFactory thirdAccountDomainFactory, ICitizenRepository citizenRepository, IServiceProvider serviceProvider, IInviteCodeRecordRepository inviteCodeRecordRepository) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount, cacheSettingData, thirdAccountDomainFactory, serviceProvider)
     {
         _snapshotApplication = snapshotApplication;
         _identityAppService = identityAppService;
@@ -72,6 +74,7 @@ public class SnapshotApplicationTest : TestBase
         _redPackApplication = redPackApplication;
         _orderSnapshotApplication = orderSnapshotApplication;
         _citizenRepository = citizenRepository;
+        _inviteCodeRecordRepository = inviteCodeRecordRepository;
     }
 
     /// <summary>
@@ -376,6 +379,7 @@ public class SnapshotApplicationTest : TestBase
     public async Task SaveInvitationCode_Test()
     {
         var code = new Random().Next(100, 200).ToString();
+        await _inviteCodeRecordRepository.RemoveAsync(m => m.InviteCode == code);
         try
         {
             await _citizenRepository.Updateable()