feat: 添加分销奖励功能 - 下级用户RMB支付后给上级发放哈尼券
This commit is contained in:
parent
4830b57a79
commit
20156803da
|
|
@ -494,10 +494,21 @@ public class PaymentNotifyService : IPaymentNotifyService
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理成功后,调用微信发货接口
|
// 处理成功后的后续操作
|
||||||
if (processResult && !string.IsNullOrEmpty(notifyData.OpenId))
|
if (processResult)
|
||||||
{
|
{
|
||||||
await UploadWechatShippingInfoAsync(notifyData.OpenId, orderNo);
|
// 分销奖励(仅对抽盒子订单生效,不包括充值、运费等)
|
||||||
|
if (attach.StartsWith("order_") || attach.StartsWith("infinite_") ||
|
||||||
|
LotteryOrderTypes.Contains(attach) || InfiniteOrderTypes.Contains(attach))
|
||||||
|
{
|
||||||
|
await ProcessDistributionRewardAsync(orderNo, user.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用微信发货接口
|
||||||
|
if (!string.IsNullOrEmpty(notifyData.OpenId))
|
||||||
|
{
|
||||||
|
await UploadWechatShippingInfoAsync(notifyData.OpenId, orderNo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return processResult;
|
return processResult;
|
||||||
|
|
@ -1501,5 +1512,128 @@ public class PaymentNotifyService : IPaymentNotifyService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理分销奖励
|
||||||
|
/// 下级用户用RMB支付后,根据配置的分销比例给上级用户发放哈尼券奖励
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderNo">订单号</param>
|
||||||
|
/// <param name="userId">下级用户ID</param>
|
||||||
|
private async Task ProcessDistributionRewardAsync(string orderNo, int userId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 1. 获取订单信息
|
||||||
|
var order = await _dbContext.Orders
|
||||||
|
.Where(o => o.OrderNum == orderNo)
|
||||||
|
.Select(o => new { o.Price, o.UserId })
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
if (order == null || order.Price <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 获取分销比例配置
|
||||||
|
var fxBili = await GetDistributionRatioAsync();
|
||||||
|
if (fxBili <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 计算奖励金额
|
||||||
|
// fx_bili 是百分比,如 3 表示 3%
|
||||||
|
var ratio = fxBili / 100m;
|
||||||
|
var rewardRmb = Math.Round(order.Price * ratio, 2);
|
||||||
|
if (rewardRmb <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 获取上级用户ID
|
||||||
|
var pid = await _dbContext.Users
|
||||||
|
.Where(u => u.Id == userId)
|
||||||
|
.Select(u => u.Pid)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
if (pid <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 发放哈尼券奖励(1 RMB = 100 哈尼券)
|
||||||
|
var rewardIntegral = rewardRmb * 100;
|
||||||
|
var result = await _paymentService.AddIntegralAsync(
|
||||||
|
pid,
|
||||||
|
rewardIntegral,
|
||||||
|
" ·", // PHP 代码中的内容就是 " ·"
|
||||||
|
orderNo,
|
||||||
|
5, // type=5 表示推荐奖励
|
||||||
|
userId // share_uid 记录下级用户ID
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
_logger.LogInformation(
|
||||||
|
"分销奖励发放成功: OrderNo={OrderNo}, 下级UserId={UserId}, 上级Pid={Pid}, 支付金额={Price}, 奖励比例={Ratio}%, 奖励哈尼券={Reward}",
|
||||||
|
orderNo, userId, pid, order.Price, fxBili, rewardIntegral);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.LogWarning(
|
||||||
|
"分销奖励发放失败: OrderNo={OrderNo}, 下级UserId={UserId}, 上级Pid={Pid}",
|
||||||
|
orderNo, userId, pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "处理分销奖励异常: OrderNo={OrderNo}, UserId={UserId}", orderNo, userId);
|
||||||
|
// 分销奖励失败不影响主流程
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取分销比例配置
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>分销比例(百分比),如 3 表示 3%</returns>
|
||||||
|
private async Task<decimal> GetDistributionRatioAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var config = await _dbContext.Configs
|
||||||
|
.Where(c => c.ConfigKey == "base")
|
||||||
|
.Select(c => c.ConfigValue)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(config))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var jsonDoc = JsonSerializer.Deserialize<JsonElement>(config);
|
||||||
|
if (jsonDoc.TryGetProperty("fx_bili", out var fxBiliElement))
|
||||||
|
{
|
||||||
|
// fx_bili 可能是字符串或数字
|
||||||
|
if (fxBiliElement.ValueKind == JsonValueKind.Number)
|
||||||
|
{
|
||||||
|
return fxBiliElement.GetDecimal();
|
||||||
|
}
|
||||||
|
else if (fxBiliElement.ValueKind == JsonValueKind.String)
|
||||||
|
{
|
||||||
|
var fxBiliStr = fxBiliElement.GetString();
|
||||||
|
if (decimal.TryParse(fxBiliStr, out var fxBili))
|
||||||
|
{
|
||||||
|
return fxBili;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogWarning(ex, "获取分销比例配置失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user