From 49754cc17344fa002c3e2614bd6c52cf7dc515f9 Mon Sep 17 00:00:00 2001 From: zpc Date: Wed, 28 Aug 2024 15:53:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=85=85=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HuanMeng.MiaoYu.Code/Order/OrderBLL.cs | 124 ++++++++---------- .../Users/UserCurrencyBLL.cs | 17 ++- .../DbSqlServer/Db_MiaoYu/MiaoYuContext.cs | 4 + .../DbSqlServer/Db_MiaoYu/T_OrderItems.cs | 10 ++ .../DbSqlServer/Db_MiaoYu/T_User_Currency.cs | 6 +- .../Db_MiaoYu/T_User_Currency_Log.cs | 4 + .../Controllers/PaymentController.cs | 14 ++ .../Controllers/PayController.cs | 9 +- 8 files changed, 110 insertions(+), 78 deletions(-) diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Order/OrderBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Order/OrderBLL.cs index c2969f0..7fe61e1 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Order/OrderBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Order/OrderBLL.cs @@ -1,6 +1,8 @@ using HuanMeng.MiaoYu.Code.Cache.Special; using HuanMeng.MiaoYu.Code.DataAccess; using HuanMeng.MiaoYu.Code.Payment; +using HuanMeng.MiaoYu.Code.Users; +using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; using HuanMeng.MiaoYu.Model.Dto.Order; using Newtonsoft.Json; @@ -22,6 +24,15 @@ namespace HuanMeng.MiaoYu.Code.Order { } + /// + /// 创建订单 + /// + /// + /// + /// + /// + /// + /// public async Task> CreateOrder(string paymentMethod, string productId) { if (_UserId == 0) @@ -78,6 +89,21 @@ namespace HuanMeng.MiaoYu.Code.Order return new BaseResponse(ResonseCode.Success, "", intentOrderDto); } + + /// + /// 获取订单状态 + /// + /// + /// + public async Task> GetOrderRewardsInfo(string orderId) + { + var tips = await Dao.daoDbMiaoYu.context.T_OrderItems.Where(it => it.OrderId == orderId).Select(it => it.RewardTips).FirstOrDefaultAsync(); + if (string.IsNullOrEmpty(tips)) + { + return new BaseResponse(ResonseCode.Success, "", false); + } + return new BaseResponse(ResonseCode.Success, tips, true); + } } /// @@ -98,62 +124,17 @@ namespace HuanMeng.MiaoYu.Code.Order /// public static async Task OrderRewardsAsync(this T_Products product, T_User user, string pay, string orderId, decimal price, DateTime intentDate, DAO dao) { - var userId = user.Id; - var chargeMoneyCount = dao.daoDbMiaoYu.context.T_Order.Count(it => it.UserId == userId && it.ProductId == product.ProductId); - var productReward = await dao.daoDbMiaoYu.context.T_Products_Reward.Where(it => it.ProductId == product.ProductId).ToListAsync(); - - if (productReward != null && productReward.Count > 0) + using (IDbContextTransaction transaction = dao.daoDbMiaoYu.context.Database.BeginTransaction()) { - using (IDbContextTransaction transaction = dao.daoDbMiaoYu.context.Database.BeginTransaction()) + try { - try - { - //List user_Currencies = new List(); - foreach (var reward in productReward) - { - var money = reward.Money; - if (product.IsFirstCharge && chargeMoneyCount == 0) - { - money = reward.FirstChargeMoney ?? reward.Money; - } - var currency = (UserCurrencyType)reward.CurrencyType; - var userCurrency = new T_User_Currency(); - user.ConsumeMoneyNoWork(currency, money, dao, userCurrency, orderId); - } - T_Order order = new T_Order() - { - OrderId = orderId, - CreatedAt = DateTime.Now, - OrderDate = intentDate, - PaymentDate = DateTime.Now, - PaymentDay = DateOnly.FromDateTime(DateTime.Now), - PaymentMethod = pay, - ProductId = product.ProductId, - Status = (int)OrderState.已完成, - TenantId = product.TenantId, - TotalPrice = price, - UpdatedAt = DateTime.Now, - UserId = userId, - }; - T_OrderItems t_OrderItems = new T_OrderItems() - { - OrderId = orderId, - PaymentInfo = "", - Product = product.Id, - ProductId = product.ProductId, - RewardInfo = JsonConvert.SerializeObject(productReward), - TenantId = product.TenantId, - }; - dao.daoDbMiaoYu.context.T_OrderItems.Add(t_OrderItems); - dao.daoDbMiaoYu.context.T_Order.Add(order); - await dao.daoDbMiaoYu.context.SaveChangesAsync(); - await transaction.CommitAsync(); - } - catch (Exception ex) - { - await transaction.RollbackAsync(); - return false; - } + await OrderRewardsNoWorkAsync(product, user, pay, orderId, price, intentDate, dao); + await transaction.CommitAsync(); + } + catch (Exception ex) + { + await transaction.RollbackAsync(); + return false; } } return true; @@ -169,7 +150,7 @@ namespace HuanMeng.MiaoYu.Code.Order /// /// /// - public static async Task OrderRewardsNoWorkAsync(this T_Products product, T_User user, string pay, string orderId, decimal price, DateTime intentDate, DAO dao) + public static async Task OrderRewardsNoWorkAsync(this T_Products product, T_User user, string pay, string orderId, decimal price, DateTime intentDate, DAO dao, T_OrderItems orderItems = null) { var userId = user.Id; var chargeMoneyCount = dao.daoDbMiaoYu.context.T_Order.Count(it => it.UserId == userId && it.ProductId == product.ProductId); @@ -177,17 +158,22 @@ namespace HuanMeng.MiaoYu.Code.Order if (productReward != null && productReward.Count > 0) { + List tips = new List(); + //List user_Currencies = new List(); foreach (var reward in productReward) { var money = reward.Money; - if (product.IsFirstCharge && chargeMoneyCount == 0) - { - money = reward.FirstChargeMoney ?? reward.Money; - } var currency = (UserCurrencyType)reward.CurrencyType; var userCurrency = new T_User_Currency(); user.ConsumeMoneyNoWork(currency, money, dao, userCurrency, orderId); + tips.Add($"获得{currency}*{money}"); + if (product.IsFirstCharge && chargeMoneyCount == 0 && reward.FirstChargeMoney > 0) + { + user.ConsumeMoneyNoWork(currency, reward.FirstChargeMoney ?? 0, dao, userCurrency, orderId, $"首充赠送{currency}{reward.FirstChargeMoney}"); + tips.Add($"首充赠送{currency}*{money}"); + } } + var rewardTips = string.Join(',', tips.ToArray()); T_Order order = new T_Order() { OrderId = orderId, @@ -203,16 +189,18 @@ namespace HuanMeng.MiaoYu.Code.Order UpdatedAt = DateTime.Now, UserId = userId, }; - T_OrderItems t_OrderItems = new T_OrderItems() + if (orderItems == null) { - OrderId = orderId, - PaymentInfo = "", - Product = product.Id, - ProductId = product.ProductId, - RewardInfo = JsonConvert.SerializeObject(productReward), - TenantId = product.TenantId, - }; - dao.daoDbMiaoYu.context.T_OrderItems.Add(t_OrderItems); + orderItems = new T_OrderItems(); + } + orderItems.OrderId = orderId; + orderItems.RewardTips = rewardTips; + orderItems.Product = product.Id; + orderItems.TenantId = product.TenantId; + orderItems.ProductId = product.ProductId; + orderItems.RewardInfo = JsonConvert.SerializeObject(productReward); + orderItems.RewardTips = rewardTips; + dao.daoDbMiaoYu.context.T_OrderItems.Add(orderItems); dao.daoDbMiaoYu.context.T_Order.Add(order); await dao.daoDbMiaoYu.context.SaveChangesAsync(); } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs index 45ba2d8..5cbf269 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs @@ -105,17 +105,18 @@ namespace HuanMeng.MiaoYu.Code.Users /// 扣除金额(负数扣除,正数添加) /// 数据库 /// + /// 订单号 + /// /// /// - /// - public static bool ConsumeMoneyNoWork(this T_User user, UserCurrencyType userCurrencyType, decimal money, DAO dao, T_User_Currency? _currency = null, string remarks = "") + public static bool ConsumeMoneyNoWork(this T_User user, UserCurrencyType userCurrencyType, decimal money, DAO dao, T_User_Currency? _currency = null, string orderId = "", string title = "") { if (user == null || user.Id == 0) { throw new ArgumentNullException("用户不能为空"); } int userId = user.Id; - return ConsumeMoneyNoWork(userId, userCurrencyType, money, dao, _currency, remarks); + return ConsumeMoneyNoWork(userId, userCurrencyType, money, dao, _currency, orderId: orderId, title: title); } /// /// 扣除或者充值货币 @@ -170,7 +171,7 @@ namespace HuanMeng.MiaoYu.Code.Users /// 数据库 /// /// - public static bool ConsumeMoneyNoWork(int userId, UserCurrencyType userCurrencyType, decimal money, DAO dao, T_User_Currency? _currency = null, string remarks = "") + public static bool ConsumeMoneyNoWork(int userId, UserCurrencyType userCurrencyType, decimal money, DAO dao, T_User_Currency? _currency = null, string remarks = "", string title = "", string orderId = "") { var userCurrency = dao.daoDbMiaoYu.context.T_User_Currency.FirstOrDefault(it => it.UserId == userId && it.CurrencyType == (int)userCurrencyType); if (userCurrency == null) @@ -207,6 +208,10 @@ namespace HuanMeng.MiaoYu.Code.Users log = dao.daoDbMiaoYu.context.T_User_Currency_Log.Where(it => it.CreateTime > mintes && it.ConsumeType == (int)UserCurrencyConsumeType.消耗 && it.CurrencyType == (int)userCurrencyType).OrderByDescending(it => it.CreateTime).FirstOrDefault(); } var tempMoney = Math.Abs(money); + if (string.IsNullOrEmpty(title)) + { + title = $"{userCurrencyConsumeType}{money}{userCurrencyType}"; + } //消费 if (log == null) { @@ -219,7 +224,9 @@ namespace HuanMeng.MiaoYu.Code.Users TenantId = dao.daoDbMiaoYu.context.TenantInfo.TenantId, UpdateTime = DateTime.Now, UserId = userId, - Remarks = remarks + Remarks = remarks, + Title = title, + OrderId = orderId }; dao.daoDbMiaoYu.context.T_User_Currency_Log.Add(log); } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs index febdf84..337f935 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs @@ -888,12 +888,14 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.OrderId) .HasMaxLength(64) .HasComment("订单id"); + entity.Property(e => e.PayUrl).HasComment("支付地址"); entity.Property(e => e.PaymentInfo).HasComment("支付信息"); entity.Property(e => e.Product).HasComment("产品id、主键"); entity.Property(e => e.ProductId) .HasMaxLength(100) .HasComment("产品id"); entity.Property(e => e.RewardInfo).HasComment("发放奖励信息"); + entity.Property(e => e.RewardTips).HasComment("发放奖励提示"); entity.Property(e => e.TenantId).HasComment("租户"); //添加全局筛选器 if (this.TenantInfo != null) @@ -1118,10 +1120,12 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext .HasComment("创建时间") .HasColumnType("datetime"); entity.Property(e => e.CurrencyType).HasComment("金额类型"); + entity.Property(e => e.OrderId).HasMaxLength(64); entity.Property(e => e.Remarks) .HasMaxLength(200) .HasComment("备注"); entity.Property(e => e.TenantId).HasComment("租户"); + entity.Property(e => e.Title).HasMaxLength(200); entity.Property(e => e.UpdateTime) .HasComment("修改时间") .HasColumnType("datetime"); diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_OrderItems.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_OrderItems.cs index 9f84d65..34a5bf7 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_OrderItems.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_OrderItems.cs @@ -34,4 +34,14 @@ public partial class T_OrderItems: MultiTenantEntity /// 支付信息 /// public virtual string? PaymentInfo { get; set; } + + /// + /// 发放奖励提示 + /// + public virtual string? RewardTips { get; set; } + + /// + /// 支付地址 + /// + public virtual string? PayUrl { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency.cs index 7ce616d..9669557 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency.cs @@ -1,11 +1,11 @@ -using System; +using System; namespace HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; /// /// 用户货币表 /// -public partial class T_User_Currency : MultiTenantEntity +public partial class T_User_Currency: MultiTenantEntity { public virtual int Id { get; set; } @@ -40,4 +40,4 @@ public partial class T_User_Currency : MultiTenantEntity public virtual int UserId { get; set; } public override Guid TenantId { get; set; } -} + } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs index 390f0ad..4b3f281 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs @@ -45,4 +45,8 @@ public partial class T_User_Currency_Log: MultiTenantEntity /// 修改时间 /// public virtual DateTime UpdateTime { get; set; } + + public virtual string? Title { get; set; } + + public virtual string? OrderId { get; set; } } diff --git a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/PaymentController.cs b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/PaymentController.cs index 120a804..498c8af 100644 --- a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/PaymentController.cs +++ b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/PaymentController.cs @@ -5,6 +5,7 @@ using HuanMeng.MiaoYu.WebApi.Base; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; namespace HuanMeng.MiaoYu.WebApi.Controllers { @@ -31,5 +32,18 @@ namespace HuanMeng.MiaoYu.WebApi.Controllers OrderBLL orderBLL = new OrderBLL(ServiceProvider); return await orderBLL.CreateOrder(intentOrder.PaymentMethod, intentOrder.ProductId); } + + + /// + /// 获取订单状态 + /// + /// + /// + [HttpGet] + public async Task> GetOrderRewardsInfo(string orderId) + { + OrderBLL orderBLL = new OrderBLL(ServiceProvider); + return await orderBLL.GetOrderRewardsInfo(orderId); + } } } diff --git a/src/2-api/HuanMeng.MiaoYu.WebPayApi/Controllers/PayController.cs b/src/2-api/HuanMeng.MiaoYu.WebPayApi/Controllers/PayController.cs index 0ab52f2..4a311db 100644 --- a/src/2-api/HuanMeng.MiaoYu.WebPayApi/Controllers/PayController.cs +++ b/src/2-api/HuanMeng.MiaoYu.WebPayApi/Controllers/PayController.cs @@ -74,7 +74,7 @@ namespace HuanMeng.MiaoYu.WebPayApi.Controllers //重复请求锁 var baseKey = $"pay:lock:{orderId}"; var redis = RedisConnection.GetRedis(appConfig); - if (!redis.StringSetLock(baseKey, "", 3)) + if (!redis.StringSetLock(baseKey, "", 10)) { return "error;重复请求"; } @@ -113,7 +113,10 @@ namespace HuanMeng.MiaoYu.WebPayApi.Controllers { try { - await product.OrderRewardsNoWorkAsync(user, pay, orderId, intentOrder.Price, intentOrder.IntentDate, dao); + T_OrderItems orderItems = new T_OrderItems(); + orderItems.PayUrl = context.Request.Path; + //orderItems. + await product.OrderRewardsNoWorkAsync(user, pay, orderId, intentOrder.Price, intentOrder.IntentDate, dao, orderItems); intentOrder.Status = (int)OrderState.已完成; dao.daoDbMiaoYu.context.SaveChanges(); await dao.daoDbMiaoYu.context.SaveChangesAsync(); @@ -122,7 +125,9 @@ namespace HuanMeng.MiaoYu.WebPayApi.Controllers { intentOrder.Status = (int)OrderState.发货失败; dao.daoDbMiaoYu.context.SaveChanges(); + logger.LogError($"请求支付回调接口,发货失败,请求路径: {context.Request.Path}", ex); await dao.daoDbMiaoYu.context.SaveChangesAsync(); + return $"error;出现异常{ex.Message}"; } } redis.KeyDelete(baseKey);