using YD_Event.Application.Auth; using YD_Event.Application.Merchant.Dtos; 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 ISqlSugarRepository _weChatPayConfigRepository; private readonly AuthManager _authManager; private readonly IIdGenerator _idGenerator; public MerchantService(ISqlSugarRepository repository, ISqlSugarRepository userCouponRepository, ISqlSugarRepository weChatPayConfigRepository, AuthManager authManager, IIdGenerator idGenerator) : base(repository) { _repository = repository; _userCouponRepository = userCouponRepository; _weChatPayConfigRepository = weChatPayConfigRepository; _authManager = authManager; _idGenerator = idGenerator; } /// /// 商户分页查询 /// [DisplayName("商户分页查询")] [HttpGet("page")] public async Task> Page([FromQuery] MerchantQueryInput input) { var pageResult = 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) .Select(x => new MerchantOutput { Id = x.Id, MerchantName = x.MerchantName, CreditCode = x.CreditCode, BankName = x.BankName, AccountNumber = x.AccountNumber, BusinessLicenseUrl = x.BusinessLicenseUrl, ContactPhone = x.ContactPhone, Address = x.Address, AuditStatus = x.AuditStatus, AuditRemark = x.AuditRemark, Status = x.Status, CreatedTime = x.CreatedTime, UpdatedTime = x.UpdatedTime }) .ToPagedListAsync(input); return pageResult; } /// /// 添加商户 /// [DisplayName("添加商户")] [HttpPost("add")] [UnitOfWork] public async Task Add(AddMerchantInput input) { var entity = input.Adapt(); entity.Id = _idGenerator.NextId(); await _repository.InsertAsync(entity); if (input.WeChatPayConfig != null) { var weChatPayConfig = input.WeChatPayConfig.Adapt(); weChatPayConfig.Id = _idGenerator.NextId(); weChatPayConfig.MerchantId = entity.Id; await _weChatPayConfigRepository.InsertAsync(weChatPayConfig); } } /// /// 更新商户 /// [DisplayName("更新商户")] [HttpPut("edit")] [UnitOfWork] 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); var existingWeChatPayConfig = await _weChatPayConfigRepository.GetFirstAsync(c => c.MerchantId == input.Id); if (input.WeChatPayConfig != null) { if (existingWeChatPayConfig != null) { input.WeChatPayConfig.Adapt(existingWeChatPayConfig); await _weChatPayConfigRepository.UpdateAsync(existingWeChatPayConfig); } else { var weChatPayConfig = input.WeChatPayConfig.Adapt(); weChatPayConfig.Id = _idGenerator.NextId(); weChatPayConfig.MerchantId = input.Id; await _weChatPayConfigRepository.InsertAsync(weChatPayConfig); } } else { if (existingWeChatPayConfig != null) { await _weChatPayConfigRepository.DeleteAsync(existingWeChatPayConfig); } } } /// /// 删除商户 /// [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("商户不存在"); var weChatPayConfig = await _weChatPayConfigRepository.GetFirstAsync(c => c.MerchantId == id); return new MerchantOutput { Id = entity.Id, MerchantName = entity.MerchantName, CreditCode = entity.CreditCode, BankName = entity.BankName, AccountNumber = entity.AccountNumber, BusinessLicenseUrl = entity.BusinessLicenseUrl, ContactPhone = entity.ContactPhone, Address = entity.Address, AuditStatus = entity.AuditStatus, AuditRemark = entity.AuditRemark, Status = entity.Status, CreatedTime = entity.CreatedTime, UpdatedTime = entity.UpdatedTime, WeChatPayConfig = weChatPayConfig != null ? weChatPayConfig.Adapt() : null }; } /// /// 发放优惠券 /// [DisplayName("发放优惠券")] [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); } }