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);