using Microsoft.Extensions.Caching.Memory;
using YD_Event.Application.Auth;
using YD_Event.Application.Merchant.Dtos;
using YD_Event.Core.Infrastructure.Aliyun.Sms;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
namespace YD_Event.Application.Merchant;
///
/// 商户管理
///
public class MerchantService : BaseService, ITransient
{
private readonly ISqlSugarRepository _repository;
private readonly ISqlSugarRepository _userCouponRepository;
private readonly AuthManager _authManager;
private readonly IIdGenerator _idGenerator;
private readonly IMemoryCache _memoryCache;
private readonly AliyunSmsService _smsService;
public MerchantService(ISqlSugarRepository repository,
ISqlSugarRepository userCouponRepository,
AuthManager authManager,
IIdGenerator idGenerator,
IMemoryCache memoryCache,
AliyunSmsService smsService) : base(repository)
{
_repository = repository;
_userCouponRepository = userCouponRepository;
_authManager = authManager;
_idGenerator = idGenerator;
_memoryCache = memoryCache;
_smsService = smsService;
}
///
/// 发送验证码
///
[DisplayName("发送验证码")]
[HttpPost("sendVerificationCode")]
[AllowAnonymous]
public async Task SendVerificationCode([FromQuery] string phone)
{
if (string.IsNullOrWhiteSpace(phone) || !System.Text.RegularExpressions.Regex.IsMatch(phone, @"^1[3456789]\d{9}$"))
throw Oops.Bah("手机号格式不正确");
// 生成6位验证码
var code = new Random().Next(100000, 999999).ToString();
// 存入缓存,有效期5分钟
_memoryCache.Set($"verification_code_{phone}", code, TimeSpan.FromMinutes(5));
// 发送短信
await _smsService.SendVerificationCodeAsync(phone, code);
}
///
/// 提交单位认证
///
[DisplayName("提交单位认证")]
[HttpPost("submitCertification")]
public async Task SubmitCertification(SubmitCertificationInput input)
{
// 验证验证码
if (!_memoryCache.TryGetValue($"verification_code_{input.ContactPhone}", out string? cachedCode) || cachedCode != input.VerificationCode)
{
throw Oops.Bah("验证码错误或已过期");
}
// 获取当前用户关联的商户信息
var userId = _authManager.UserId;
var merchant = await _repository.GetFirstAsync(m => m.CreatedUserId == userId);
if (merchant == null)
{
// 新增商户
merchant = new YD_Event.Core.Entities.Merchant
{
Id = _idGenerator.NextId(),
MerchantName = input.MerchantName,
CreditCode = input.CreditCode,
BusinessLicenseUrl = input.BusinessLicenseUrl,
Address = input.Address,
ContactPhone = input.ContactPhone,
BankName = "", // 默认为空,后续完善
AccountNumber = "", // 默认为空,后续完善
AuditStatus = AuditStatus.PendingAudit, // 待审核
Status = AvailabilityStatus.Enable,
CreatedUserId = userId,
CreatedTime = DateTime.Now
};
await _repository.InsertAsync(merchant);
}
else
{
// 更新商户信息
merchant.MerchantName = input.MerchantName;
merchant.CreditCode = input.CreditCode;
merchant.BusinessLicenseUrl = input.BusinessLicenseUrl;
merchant.Address = input.Address;
merchant.ContactPhone = input.ContactPhone;
merchant.AuditStatus = AuditStatus.PendingAudit; // 重新提交后变为待审核
merchant.UpdatedUserId = userId;
merchant.UpdatedTime = DateTime.Now;
await _repository.UpdateAsync(merchant);
}
// 清除验证码
_memoryCache.Remove($"verification_code_{input.ContactPhone}");
}
///
/// 获取我的认证信息
///
[DisplayName("获取我的认证信息")]
[HttpGet("myCertification")]
public async Task GetMyCertification()
{
var userId = _authManager.UserId;
var merchant = await _repository.GetFirstAsync(m => m.CreatedUserId == userId);
return merchant;
}
///
/// 商户分页查询
///
[DisplayName("商户分页查询")]
[HttpGet("page")]
public async Task> Page([FromQuery] MerchantQueryInput input)
{
return await _repository.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.MerchantName), x => x.MerchantName.Contains(input.MerchantName))
.WhereIF(!string.IsNullOrWhiteSpace(input.ContactPhone), x => x.ContactPhone.Contains(input.ContactPhone))
.WhereIF(input.AuditStatus.HasValue, x => x.AuditStatus == input.AuditStatus)
.WhereIF(input.StartTime.HasValue, x => x.CreatedTime >= input.StartTime)
.WhereIF(input.EndTime.HasValue, x => x.CreatedTime <= input.EndTime)
.OrderByDescending(x => x.CreatedTime)
.ToPagedListAsync(input);
}
///
/// 添加商户
///
[DisplayName("添加商户")]
[HttpPost("add")]
public async Task Add(AddMerchantInput input)
{
var entity = input.Adapt();
entity.Id = _idGenerator.NextId();
await _repository.InsertAsync(entity);
}
///
/// 更新商户
///
[DisplayName("更新商户")]
[HttpPut("edit")]
public async Task Update(UpdateMerchantInput input)
{
var entity = await _repository.GetByIdAsync(input.Id);
if (entity == null) throw Oops.Bah("商户不存在");
input.Adapt(entity);
await _repository.UpdateAsync(entity);
}
///
/// 删除商户
///
[DisplayName("删除商户")]
[HttpPost("delete")]
public async Task Delete([FromBody] List ids)
{
await _repository.DeleteAsync(x => ids.Contains(x.Id));
}
///
/// 获取商户详情
///
[DisplayName("获取商户详情")]
[HttpGet("detail")]
public async Task Detail([FromQuery] long id)
{
var entity = await _repository.GetByIdAsync(id);
if (entity == null) throw Oops.Bah("商户不存在");
return entity;
}
///
/// 审核商户
///
[HttpPost("audit")]
[UnitOfWork]
public async Task Audit([FromBody] MerchantAuditInput input)
{
if (input.Ids == null || !input.Ids.Any()) return;
await _repository.UpdateAsync(u => new YD_Event.Core.Entities.Merchant
{
AuditStatus = input.Status,
AuditRemark = input.Remark,
UpdatedTime = DateTime.Now,
UpdatedUserId = _authManager.UserId
}, u => input.Ids.Contains(u.Id));
}
///
/// 发放优惠券
///
[HttpPost("issueCoupon")]
[UnitOfWork]
public async Task IssueCoupon([FromBody] IssueCouponInput input)
{
if (input.MerchantIds == null || !input.MerchantIds.Any()) return;
if (input.Count <= 0) throw Oops.Bah("发放数量必须大于0");
var merchants = await _repository.GetListAsync(m => input.MerchantIds.Contains(m.Id));
if (!merchants.Any()) return;
var coupons = new List();
var now = DateTime.Now;
foreach (var merchant in merchants)
{
for (int i = 0; i < input.Count; i++)
{
coupons.Add(new UserCoupon
{
Id = _idGenerator.NextId(),
UserId = merchant.CreatedUserId, // Issue to the creator of the merchant
CouponId = input.CouponId,
Status = 0, // Unused
ClaimTime = now,
CreatedTime = now,
CreatedUserId = _authManager.UserId
});
}
}
await _userCouponRepository.InsertRangeAsync(coupons);
}
}