using Fake.DependencyInjection; using Oms.Domain.CustomersAggregate.Entities; using Oms.Domain.CustomersAggregate.Repositories; using Oms.SqlSugarCore.Repositories; namespace Oms.SqlSugarCore.Customers; public class CustomerRepository : OmsSqlSugarRepository, ICustomerRepository, IScopedDependency { public Task GetByCustomerCodeAsync(string customerCode, CancellationToken cancellationToken = default) { return FirstOrDefaultAsync(x => x.CustomerCode == customerCode, cancellationToken); } public Task GetByPhoneAsync(string phone, CancellationToken cancellationToken = default) { return FirstOrDefaultAsync(x => x.Phone == phone, cancellationToken); } public Task GetByEmailAsync(string email, CancellationToken cancellationToken = default) { return FirstOrDefaultAsync(x => x.Email == email, cancellationToken); } public Task GetByWechatOpenidAsync(string wechatOpenid, CancellationToken cancellationToken = default) { return FirstOrDefaultAsync(x => x.WechatOpenid == wechatOpenid, cancellationToken); } public Task ExistsPhoneAsync(string phone, CancellationToken cancellationToken = default) { return AnyAsync(x => x.Phone == phone, cancellationToken); } public async Task ExistsPhoneAnyAsync(string phone, CancellationToken cancellationToken = default) { var db = await GetDbContextAsync(cancellationToken); var hit = await db.Ado.SqlQuerySingleAsync( "SELECT 1 FROM t_customer WHERE Phone = @phone LIMIT 1", new { phone }); return hit.HasValue; } public async Task ExistsEmailAnyAsync(string email, CancellationToken cancellationToken = default) { var db = await GetDbContextAsync(cancellationToken); var hit = await db.Ado.SqlQuerySingleAsync( "SELECT 1 FROM t_customer WHERE Email = @email LIMIT 1", new { email }); return hit.HasValue; } public async Task ExistsWechatOpenidAnyAsync(string wechatOpenid, CancellationToken cancellationToken = default) { var db = await GetDbContextAsync(cancellationToken); var hit = await db.Ado.SqlQuerySingleAsync( "SELECT 1 FROM t_customer WHERE WechatOpenid = @wechatOpenid LIMIT 1", new { wechatOpenid }); return hit.HasValue; } public async Task GetMaxCustomerCodeSequenceForPrefixAsync( string prefix, CancellationToken cancellationToken = default) { var expectedLength = prefix.Length + 3; var db = await GetDbContextAsync(cancellationToken); var codes = await db.Queryable() .Where(x => x.CustomerCode.StartsWith(prefix) && x.CustomerCode.Length == expectedLength) .Select(x => x.CustomerCode) .ToListAsync(cancellationToken); var max = 0; foreach (var code in codes) { if (code.Length <= prefix.Length) { continue; } var suffix = code[prefix.Length..]; if (int.TryParse(suffix, out var seq) && seq > max) { max = seq; } } return max; } }