using System.Text.Json; using Volo.Abp.Domain.Services; using Volo.Abp.Users; using Yi.Framework.AiHub.Domain.Entities; using Yi.Framework.AiHub.Domain.Entities.Pay; using Yi.Framework.AiHub.Domain.Shared.Enums; using Yi.Framework.SqlSugarCore.Abstractions; using Yi.Framework.AiHub.Domain.Extensions; namespace Yi.Framework.AiHub.Domain.Managers; /// /// 支付管理器 /// public class PayManager : DomainService { private readonly ISqlSugarRepository _payNoticeRepository; private readonly ICurrentUser _currentUser; private readonly ISqlSugarRepository _payOrderRepository; private readonly ISqlSugarRepository _rechargeRepository; public PayManager( ISqlSugarRepository payNoticeRepository, ICurrentUser currentUser, ISqlSugarRepository payOrderRepository, ISqlSugarRepository rechargeRepository) { _payNoticeRepository = payNoticeRepository; _currentUser = currentUser; _payOrderRepository = payOrderRepository; _rechargeRepository = rechargeRepository; } /// /// 创建订单 /// /// 商品类型 /// 订单信息 public async Task CreateOrderAsync(GoodsTypeEnum goodsType) { // 验证用户是否登录 if (!_currentUser.IsAuthenticated) { throw new UserFriendlyException("用户未登录"); } var userId = _currentUser.GetId(); // 如果是尊享包商品,需要验证用户是否为VIP if (goodsType.IsPremiumPackage()) { if (!_currentUser.IsAiVip()) { throw new UserFriendlyException("购买尊享包需要VIP资格,请先开通VIP"); } } // 生成订单号 var outTradeNo = GenerateOutTradeNo(); // 获取商品信息 var goodsName = goodsType.GetDisplayName(); // 计算订单金额(尊享包使用折扣价格,VIP服务使用原价) decimal totalAmount; if (goodsType.IsPremiumPackage()) { // 获取用户累加充值金额 var totalRechargeAmount = await GetUserTotalRechargeAmountAsync(userId); // 使用折扣后的价格 totalAmount = goodsType.GetDiscountedPrice(totalRechargeAmount); } else { // VIP服务使用原价 totalAmount = goodsType.GetTotalAmount(); } // 创建订单实体 var payOrder = new PayOrderAggregateRoot { OutTradeNo = outTradeNo, UserId = userId, UserName = _currentUser.UserName ?? string.Empty, TotalAmount = totalAmount, GoodsName = goodsName, GoodsType = goodsType }; // 保存订单 await _payOrderRepository.InsertAsync(payOrder); return payOrder; } /// /// 更新订单状态 /// /// 商户订单号 /// 交易状态 /// 支付宝交易号 /// public async Task UpdateOrderStatusAsync(string outTradeNo, TradeStatusEnum tradeStatus, string? tradeNo = null) { var order = await _payOrderRepository.GetFirstAsync(x => x.OutTradeNo == outTradeNo); if (order == null) { throw new UserFriendlyException($"订单不存在:{outTradeNo}"); } order.TradeStatus = tradeStatus; if (!string.IsNullOrEmpty(tradeNo)) { order.TradeNo = tradeNo; } await _payOrderRepository.UpdateAsync(order); return order; } /// /// 记录支付通知 /// /// 通知数据 /// /// public async Task RecordPayNoticeAsync(Dictionary notifyData, string signStr) { var payNotice = new PayNoticeRecordAggregateRoot { NotifyTime = DateTime.Parse(notifyData.GetValueOrDefault("notify_time", string.Empty)), TradeNo = notifyData.GetValueOrDefault("trade_no", string.Empty), OutTradeNo = notifyData.GetValueOrDefault("out_trade_no", string.Empty), BuyerId = notifyData.GetValueOrDefault("buyer_id", string.Empty), TradeStatus = ParseTradeStatus(notifyData.GetValueOrDefault("trade_status", string.Empty)), TotalAmount = decimal.TryParse(notifyData.GetValueOrDefault("total_amount", "-1"), out var amount) ? amount : 0, NotifyData = JsonSerializer.Serialize(notifyData), SignStr = signStr }; await _payNoticeRepository.InsertAsync(payNotice); } /// /// 生成商户订单号 /// /// private string GenerateOutTradeNo() { return $"YI_{DateTime.Now:yyyyMMddHHmmss}_{Random.Shared.Next(1000, 9999)}"; } /// /// 解析交易状态 /// /// 状态字符串 /// private TradeStatusEnum ParseTradeStatus(string tradeStatus) { if (Enum.TryParse(tradeStatus, out var result)) { return result; } return TradeStatusEnum.WAIT_TRADE; } /// /// 获取用户累加充值金额 /// /// 用户ID /// 累加充值金额 public async Task GetUserTotalRechargeAmountAsync(Guid userId) { var totalAmount = await _rechargeRepository ._DbQueryable .Where(x => x.UserId == userId ) .SumAsync(x => x.RechargeAmount); return totalAmount; } }