Files
Yi.Framework/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/InvitationCodeManager.cs
2024-11-03 15:27:01 +08:00

89 lines
2.7 KiB
C#

using Volo.Abp.Domain.Services;
using Yi.Framework.DigitalCollectibles.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.DigitalCollectibles.Domain.Managers;
/// <summary>
/// 邀请码领域服务
/// </summary>
public class InvitationCodeManager : DomainService
{
public readonly ISqlSugarRepository<InvitationCodeAggregateRoot> _repository;
public InvitationCodeManager(ISqlSugarRepository<InvitationCodeAggregateRoot> repository)
{
_repository = repository;
}
/// <summary>
/// 填写邀请码
/// </summary>
public async Task SetAsync(Guid writeUserId, string invitationCode)
{
//统一大写
invitationCode= invitationCode.ToUpper();
var entityOrNull = await _repository.GetFirstAsync(x => x.InvitationCode == invitationCode);
if (entityOrNull is null)
{
throw new UserFriendlyException("无效邀请码,请检查");
}
if (entityOrNull.UserId==writeUserId)
{
throw new UserFriendlyException("你不能邀请自己");
}
//被邀请的人
var entity = entityOrNull;
entity.SetInvited();
//填写邀请码的人
var writeEntity = await TryGetOrAddAsync(writeUserId);
writeEntity.SetInvite();
await _repository.UpdateRangeAsync(new List<InvitationCodeAggregateRoot> { entity, writeEntity });
}
public async Task<InvitationCodeAggregateRoot> TryGetOrAddAsync(Guid userId, int InitPointsNumber = 0)
{
var entity = await _repository.FindAsync(x => x.UserId == userId);
if (entity is null)
{
string invitationCode = string.Empty;
//循环到邀请码没有重复为止
var isExist = true;
while (isExist)
{
invitationCode = CreateInvitationCode(4);
if (!await _repository.IsAnyAsync(x => x.InvitationCode == invitationCode))
{
isExist = false;
}
}
var insertEntity = new InvitationCodeAggregateRoot(userId, invitationCode)
{
PointsNumber = InitPointsNumber
};
entity = await _repository.InsertReturnEntityAsync(insertEntity);
}
return entity;
}
private string CreateInvitationCode(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
char[] stringChars = new char[length];
for (int i = 0; i < length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
return new string(stringChars);
}
}