using Fake.Application; using Fake.DependencyInjection; using Oms.Domain.MarketingAggregate.Entities; using Oms.Domain.MarketingAggregate.Enums; using Oms.Domain.MarketingAggregate.Repositories; namespace Oms.Application.Shared; public static class MarketingInviteCodeHelper { private const string Alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; public static string GenerateCode() { Span buffer = stackalloc char[8]; for (var i = 0; i < buffer.Length; i++) { buffer[i] = Alphabet[Random.Shared.Next(Alphabet.Length)]; } return new string(buffer); } } public class MarketingReferralCodeProvisioner : IScopedDependency { private readonly ICustomerReferralCodeRepository _referralCodeRepository; public MarketingReferralCodeProvisioner(ICustomerReferralCodeRepository referralCodeRepository) { _referralCodeRepository = referralCodeRepository; } public async Task GetOrCreateAsync(int mainCustomerId, CancellationToken cancellationToken = default) { var existing = await _referralCodeRepository.GetByCustomerIdAsync(mainCustomerId, cancellationToken); if (existing != null) { return existing; } for (var i = 0; i < 10; i++) { var code = MarketingInviteCodeHelper.GenerateCode(); if (await _referralCodeRepository.ExistsInviteCodeAsync(code, null, cancellationToken)) { continue; } var entity = new CustomerReferralCode { CustomerId = mainCustomerId, InviteCode = code, Status = ReferralCodeStatus.Enabled }; await _referralCodeRepository.InsertAsync(entity, cancellationToken); return entity; } throw new BusinessException("邀请码生成失败"); } }