Browse Source

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

tangjiang 2 weeks ago
parent
commit
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 Hotline.Share.Enums.Exams;
 using DocumentFormat.OpenXml.Wordprocessing;
 using DocumentFormat.OpenXml.Wordprocessing;
 using Hotline.Repository.SqlSugar.Exam.Repositories.ExamManages;
 using Hotline.Repository.SqlSugar.Exam.Repositories.ExamManages;
+using Hotline.Exams.Questions;
 
 
 namespace Hotline.Application.Exam.Service.ExamManages
 namespace Hotline.Application.Exam.Service.ExamManages
 {
 {
@@ -90,17 +91,24 @@ namespace Hotline.Application.Exam.Service.ExamManages
         public async Task<ExamQuestionDto> GetExamQuestionDto(ExamQuestionRequest examQuestionRequest)
         public async Task<ExamQuestionDto> GetExamQuestionDto(ExamQuestionRequest examQuestionRequest)
         {
         {
             var expression = examQuestionRequest.GetExpression();
             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())
                 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)
                     if (questionOptions != null)
                     {
                     {
@@ -163,7 +171,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             var userItemItemOptions = await userExamItemOptionsTable
             var userItemItemOptions = await userExamItemOptionsTable
                 .InnerJoin(userExamItemTable, (o, u) => o.UserExamItemId == u.Id)
                 .InnerJoin(userExamItemTable, (o, u) => o.UserExamItemId == u.Id)
                 .InnerJoin(userExamTable, (o, u, e) => u.UserExamId == e.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();
                 Select((o, u, e) => o).ToListAsync();
             return userItemItemOptions;
             return userItemItemOptions;
         }
         }
@@ -320,7 +328,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
             {
             {
                 await UpdateExamAsync(_userExamItemRepository, updateUserExamItemDto, cancellationToken);
                 await UpdateExamAsync(_userExamItemRepository, updateUserExamItemDto, cancellationToken);
             }
             }
-            
+
             await CalcuteExamItemScore(_userExamItemRepository, updateUserExamItemDto, cancellationToken);
             await CalcuteExamItemScore(_userExamItemRepository, updateUserExamItemDto, cancellationToken);
 
 
             return startExamViewResponse;
             return startExamViewResponse;
@@ -344,7 +352,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 IsJoin = false
                 IsJoin = false
             };
             };
 
 
-            if (userExam.StartTime == null)
+            if (userExam.StartTime == null || userExam.ExamStatus == EExamStatus.Complete)
                 userExam.StartTime = DateTime.Now;
                 userExam.StartTime = DateTime.Now;
 
 
             var startExamViewResponse = await CheckExamValid(userExam, cancellationToken);
             var startExamViewResponse = await CheckExamValid(userExam, cancellationToken);
@@ -365,6 +373,11 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 await _repository.UpdateWithValidateAsync(userExam, cancellationToken);
                 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);
             var examManage = await _examManageRepository.GetAsync(x => x.Id == userExam.ExamId);
 
 
             return new StartExamViewResponse
             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)
         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)
         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();
             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,
                 IsCheck = SqlFunc.Subqueryable<ExamUserExam>().Where(x => x.ExamId == e.Id && !x.IsCheck).Count() <= 0,
                 Id = e.Id,
                 Id = e.Id,
                 Remark = e.Remark
                 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 list = await queryable.ToPageListAsync(gradingPagedRequest.PageIndex, gradingPagedRequest.PageSize);
             var total = await queryable.CountAsync();
             var total = await queryable.CountAsync();
@@ -1262,7 +1300,7 @@ namespace Hotline.Application.Exam.Service.ExamManages
                 Status = u.Status,
                 Status = u.Status,
                 SortIndex = u.SortIndex,
                 SortIndex = u.SortIndex,
                 ExamStatus = u.ExamStatus,
                 ExamStatus = u.ExamStatus,
-                IsSuccess = u.IsCheck? u.IsSuccess:null,
+                IsSuccess = u.IsCheck ? u.IsSuccess : null,
                 EndTime = e.EndTime,
                 EndTime = e.EndTime,
                 StartTime = e.StartTime,
                 StartTime = e.StartTime,
                 TimeSpan = e.TimeSpan,
                 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,
                     SortIndex = r.SortIndex,
                     Status = r.Status,
                     Status = r.Status,
                     TrainTime = p.TrainEndTime
                     TrainTime = p.TrainEndTime
-                });
+                }).MergeTable();
 
 
             var calcuteRateResult = new TrainResultRateViewResponse
             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()
         public bool Validate()
         {
         {
-            if (_count>=_validateCount)
+            if (_count>_validateCount)
             {
             {
                 ErroMessage = "已超过可考次数,考试结束";
                 ErroMessage = "已超过可考次数,考试结束";
                 _current = this;
                 _current = this;

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

@@ -50,7 +50,7 @@ namespace Hotline.Application.Exam.Strategy
             var current = examStrategys.FirstOrDefault();
             var current = examStrategys.FirstOrDefault();
             if (current != null)
             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.SetNext(examStrategys[i]);
                     current = 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) //政民互动
                 d.Order.SourceChannelCode == "SZMHD" && d.Order.IsProvince == true) //政民互动
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Order.Source == ESource.ProvinceStraight &&
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Order.Source == ESource.ProvinceStraight &&
                 d.Order.SourceChannelCode == "S12345" && d.Order.IsProvince == true) //省12345
                 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: 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: 1, SortField: "creationTime" }, d => d.Order.CreationTime, OrderByType.Desc)
             .OrderByIF(dto is { SortRule: 0, SortField: "filedTime" }, d => d.Order.FiledTime, OrderByType.Asc)  //办结时间
             .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,
             CommunityCode = it.Id,
             CommunityName = it.Name,
             CommunityName = it.Name,
             CommunityFullName = it.FullName,
             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()
             HasChild = SqlFunc.Subqueryable<CommunityInfo>().Where(c => c.ParentCode == it.Id).Any()
         });
         });
 #if DEBUG
 #if DEBUG
@@ -579,10 +579,9 @@ public class BiSnapshotApplication : IBiSnapshotApplication, IScopeDependency
 
 
     public ISugarQueryable<CommunityStatisticsDetailsOutDto> GetCommunityStatisticsDetails(CommunityStatisticsDetailsInDto dto)
     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)
         var query = _orderSnapshotRepository.Queryable(includeDeleted: true)
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
             .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)
             .WhereIF(dto.IndustryId.NotNullOrEmpty(), (snapshot, order) => snapshot.IndustryId == dto.IndustryId)
             .Select((snapshot, order) => new CommunityStatisticsDetailsOutDto(), true);
             .Select((snapshot, order) => new CommunityStatisticsDetailsOutDto(), true);
 #if DEBUG
 #if DEBUG

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

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

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

@@ -318,6 +318,11 @@ public record PublishedPagedRequest : PagedKeywordRequest
     /// 省来源分类 1:政民互动直派 2:政民互动  3:省12345
     /// 省来源分类 1:政民互动直派 2:政民互动  3:省12345
     /// </summary>
     /// </summary>
     public string? ProvinceChannel { get; set; }
     public string? ProvinceChannel { get; set; }
+
+	/// <summary>
+	/// 发布范围 是否公开
+	/// </summary>
+	public bool? PublishState { get; set; }
 }
 }
 
 
 public record HotspotSubtotalReportPagedRequest : ReportPagedRequest
 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.Contracts;
 using Hotline.Snapshot.IRepository;
 using Hotline.Snapshot.IRepository;
 using Mapster;
 using Mapster;
+using Microsoft.Extensions.Logging;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
@@ -15,16 +17,26 @@ public class NotificationDomainService : INotificationDomainService, IScopeDepen
 {
 {
     private readonly INotificationRepository _notificationRepository;
     private readonly INotificationRepository _notificationRepository;
     private readonly INotificationReceiverRepository _notificationReceiverRepository;
     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;
         _notificationRepository = notificationRepository;
         _notificationReceiverRepository = notificationReceiverRepository;
         _notificationReceiverRepository = notificationReceiverRepository;
+        _logger = logger;
     }
     }
 
 
     public async Task AddNotifyAsync(AddNotifyInDto inDto, CancellationToken token)
     public async Task AddNotifyAsync(AddNotifyInDto inDto, CancellationToken token)
     {
     {
         var entity = inDto.Adapt<Notification>();
         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 id = await _notificationRepository.AddAsync(entity, token);
         var items = new List<NotificationReceiver>();
         var items = new List<NotificationReceiver>();
         foreach (var userId in inDto.UserIds)
         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)
             if (hasChild.SumCount != 0)
             {
             {
                 var inDto2 = inDto.Adapt<CommunityStatisticsDetailsInDto>();
                 var inDto2 = inDto.Adapt<CommunityStatisticsDetailsInDto>();
-                inDto2.CommunityCode = hasChild.CommunityCode;
+                inDto2.CommunityFullName = hasChild.CommunityFullName;
                 var details = await _biSnapshotApplication.GetCommunityStatisticsDetails(inDto2).ToListAsync();
                 var details = await _biSnapshotApplication.GetCommunityStatisticsDetails(inDto2).ToListAsync();
                 details.Count.ShouldBe(hasChild.SumCount);
                 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.Identity.Roles;
 using Hotline.Orders;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Repository.SqlSugar.Snapshot;
 using Hotline.Settings;
 using Hotline.Settings;
 using Hotline.Share.Dtos.Article;
 using Hotline.Share.Dtos.Article;
 using Hotline.Share.Dtos.Snapshot;
 using Hotline.Share.Dtos.Snapshot;
@@ -41,6 +42,7 @@ public class SnapshotApplicationTest : TestBase
     private readonly IIndustryRepository _industryRepository;
     private readonly IIndustryRepository _industryRepository;
     private readonly IFileRepository _fileRepository;
     private readonly IFileRepository _fileRepository;
     private readonly OrderServiceMock _orderServiceMock;
     private readonly OrderServiceMock _orderServiceMock;
+    private readonly IInviteCodeRecordRepository _inviteCodeRecordRepository;
     private readonly IOrderRepository _orderRepository;
     private readonly IOrderRepository _orderRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
     private readonly ISessionContext _sessionContext;
     private readonly ISessionContext _sessionContext;
@@ -52,7 +54,7 @@ public class SnapshotApplicationTest : TestBase
     private readonly IOrderSnapshotApplication _orderSnapshotApplication;
     private readonly IOrderSnapshotApplication _orderSnapshotApplication;
     private readonly ICitizenRepository _citizenRepository;
     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;
         _snapshotApplication = snapshotApplication;
         _identityAppService = identityAppService;
         _identityAppService = identityAppService;
@@ -72,6 +74,7 @@ public class SnapshotApplicationTest : TestBase
         _redPackApplication = redPackApplication;
         _redPackApplication = redPackApplication;
         _orderSnapshotApplication = orderSnapshotApplication;
         _orderSnapshotApplication = orderSnapshotApplication;
         _citizenRepository = citizenRepository;
         _citizenRepository = citizenRepository;
+        _inviteCodeRecordRepository = inviteCodeRecordRepository;
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -376,6 +379,7 @@ public class SnapshotApplicationTest : TestBase
     public async Task SaveInvitationCode_Test()
     public async Task SaveInvitationCode_Test()
     {
     {
         var code = new Random().Next(100, 200).ToString();
         var code = new Random().Next(100, 200).ToString();
+        await _inviteCodeRecordRepository.RemoveAsync(m => m.InviteCode == code);
         try
         try
         {
         {
             await _citizenRepository.Updateable()
             await _citizenRepository.Updateable()