qinchaoyue 4 months ago
parent
commit
3fd9bcc302

+ 8 - 0
src/Hotline.Api/Controllers/Snapshot/SnapshotController.cs

@@ -267,4 +267,12 @@ public class SnapshotController : BaseController
             { "jobType", _systemDicDataCacheManager.JobType },
         };
     }
+
+    /// <summary>
+    /// 用户自己保存邀请码
+    /// </summary>
+    /// <returns></returns>
+    [HttpPut("third/invitationcode")]
+    public async Task SaveInvitationCodeAsync([FromBody] SaveInvitationCodeInDto dto)
+        => await _snapshotApplication.SaveInvitationCodeAsync(dto);
 }

+ 14 - 1
src/Hotline.Application.Tests/Application/SnapshotApplicationTest.cs

@@ -21,6 +21,7 @@ using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.DependencyInjection;
 using Shouldly;
 using System;
+using XF.Domain.Authentications;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 
@@ -36,8 +37,9 @@ public class SnapshotApplicationTest : TestBase
     private readonly OrderServiceMock _orderServiceMock;
     private readonly IOrderRepository _orderRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
+    private readonly ISessionContext _sessionContext;
 
-    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) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount)
+    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) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount)
     {
         _snapshotApplication = snapshotApplication;
         _identityAppService = identityAppService;
@@ -49,6 +51,7 @@ public class SnapshotApplicationTest : TestBase
         _orderRepository = orderRepository;
         _orderSnapshotRepository = orderSnapshotRepository;
         SetWeiXin();
+        _sessionContext = sessionContext;
     }
 
     [Fact]
@@ -239,6 +242,7 @@ public class SnapshotApplicationTest : TestBase
     [Fact]
     public async Task AddVolunteerReport_Test()
     {
+        await _snapshotApplication.AddVolunteerAsync(new AddVolunteerInDto { Name = _sessionContext.UserName, PhoneNumber = _sessionContext.Phone }, CancellationToken.None);
         var inDto = _fixture.Create<AddVolunteerReportInDto>();
         foreach (var item in inDto.Files)
         {
@@ -249,6 +253,15 @@ public class SnapshotApplicationTest : TestBase
         result.Id.ShouldNotBeNull();
     }
 
+    [Fact]
+    public async Task SaveInvitationCode_Test()
+    {
+        var code = DateTime.Now.ToShortTimeString();
+        await _snapshotApplication.SaveInvitationCodeAsync(new SaveInvitationCodeInDto { InvitationCode = code });
+        var third = await _thirdAccountRepository.GetByOpenIdAsync(_sessionContext.OpenId);
+        third.InvitationCode.ShouldBe(code);
+    }
+
     [Fact]
     public async Task GetPractitionerItems_Test()
     {

+ 15 - 0
src/Hotline.Application/Snapshot/ISnapshotApplication.cs

@@ -139,6 +139,14 @@ public interface ISnapshotApplication
     /// <returns></returns>
     Task AddPractitionerAsync(IList<AddPractitionerInDto> dtos);
 
+    /// <summary>
+    /// 添加志愿者
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    Task<string> AddVolunteerAsync(AddVolunteerInDto dto, CancellationToken cancellationToken);
+
     /// <summary>
     /// 志愿者上报
     /// </summary>
@@ -146,4 +154,11 @@ public interface ISnapshotApplication
     /// <param name="requestAborted"></param>
     /// <returns></returns>
     Task<AddVolunteerReportOutDto> AddVolunteerReportAsync(AddVolunteerReportInDto dto, CancellationToken requestAborted);
+
+    /// <summary>
+    /// 保存用户自己的邀请码
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    Task SaveInvitationCodeAsync(SaveInvitationCodeInDto dto);
 }

+ 15 - 0
src/Hotline.Application/Snapshot/SnapshotApplicationBase.cs

@@ -459,6 +459,20 @@ public abstract class SnapshotApplicationBase
         await _bulletinRepository.UpdateAsync(bulletin);
     }
 
+    /// <summary>
+    /// 保存用户自己的邀请码
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public async Task SaveInvitationCodeAsync(SaveInvitationCodeInDto dto)
+    {
+        dto.ValidateObject();
+        var third = await _thirdAccountRepository.GetByOpenIdAsync(_sessionContext.OpenId)
+            ?? throw UserFriendlyException.SameMessage("用户不存在");
+        third.InvitationCode = dto.InvitationCode;
+        await _thirdAccountRepository.UpdateAsync(third);
+    }
+
     #region 从业人员
 
     /// <summary>
@@ -536,6 +550,7 @@ public abstract class SnapshotApplicationBase
     public async Task<string> AddVolunteerAsync(AddVolunteerInDto dto, CancellationToken cancellationToken)
     {
         var entity = dto.Adapt<Volunteer>();
+        entity.Id = await _volunteerRepository.AddAsync(entity);
         return entity.Id;
     }
 

+ 10 - 0
src/Hotline.Share/Dtos/Snapshot/ThirdTokenDto.cs

@@ -1,5 +1,6 @@
 using Hotline.Share.Enums.Snapshot;
 using Hotline.Share.Enums.User;
+using System.ComponentModel.DataAnnotations;
 
 namespace Hotline.Share.Dtos.Snapshot;
 
@@ -103,3 +104,12 @@ public class ThirdTokenDto : ThirdTokenInDto
     /// </summary>
     public string Secret { get; set; }
 }
+
+public class SaveInvitationCodeInDto
+{
+    /// <summary>
+    /// 邀请码
+    /// </summary>
+    [Required]
+    public string InvitationCode { get; set; }
+}