This commit is contained in:
parent
81f38874c8
commit
32f5bce9cc
|
|
@ -20,6 +20,11 @@ public class CommissionDto
|
|||
/// </summary>
|
||||
public string? UserNickname { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得佣金的用户UID
|
||||
/// </summary>
|
||||
public string? UserUid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源用户ID
|
||||
/// </summary>
|
||||
|
|
@ -30,6 +35,11 @@ public class CommissionDto
|
|||
/// </summary>
|
||||
public string? FromUserNickname { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源用户UID
|
||||
/// </summary>
|
||||
public string? FromUserUid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关联订单ID
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -30,6 +30,11 @@ public class InviteCodeDto
|
|||
/// </summary>
|
||||
public string? AssignUserNickname { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分配给的用户UID
|
||||
/// </summary>
|
||||
public string? AssignUserUid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分配时间
|
||||
/// </summary>
|
||||
|
|
@ -45,6 +50,11 @@ public class InviteCodeDto
|
|||
/// </summary>
|
||||
public string? UseUserNickname { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 使用者用户UID
|
||||
/// </summary>
|
||||
public string? UseUserUid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 使用的订单ID
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -128,9 +128,11 @@ public class DistributionService : IDistributionService
|
|||
BatchNo = c.BatchNo,
|
||||
AssignUserId = c.AssignUserId,
|
||||
AssignUserNickname = c.AssignUser != null ? c.AssignUser.Nickname : null,
|
||||
AssignUserUid = c.AssignUser != null ? c.AssignUser.Uid : null,
|
||||
AssignTime = c.AssignTime,
|
||||
UseUserId = c.UseUserId,
|
||||
UseUserNickname = c.UseUser != null ? c.UseUser.Nickname : null,
|
||||
UseUserUid = c.UseUser != null ? c.UseUser.Uid : null,
|
||||
UseOrderId = c.UseOrderId,
|
||||
UseTime = c.UseTime,
|
||||
Status = c.Status,
|
||||
|
|
@ -264,9 +266,11 @@ public class DistributionService : IDistributionService
|
|||
BatchNo = c.BatchNo,
|
||||
AssignUserId = c.AssignUserId,
|
||||
AssignUserNickname = c.AssignUser != null ? c.AssignUser.Nickname : null,
|
||||
AssignUserUid = c.AssignUser != null ? c.AssignUser.Uid : null,
|
||||
AssignTime = c.AssignTime,
|
||||
UseUserId = c.UseUserId,
|
||||
UseUserNickname = c.UseUser != null ? c.UseUser.Nickname : null,
|
||||
UseUserUid = c.UseUser != null ? c.UseUser.Uid : null,
|
||||
UseOrderId = c.UseOrderId,
|
||||
UseTime = c.UseTime,
|
||||
Status = c.Status,
|
||||
|
|
@ -311,8 +315,10 @@ public class DistributionService : IDistributionService
|
|||
Id = c.Id,
|
||||
UserId = c.UserId,
|
||||
UserNickname = c.User != null ? c.User.Nickname : null,
|
||||
UserUid = c.User != null ? c.User.Uid : null,
|
||||
FromUserId = c.FromUserId,
|
||||
FromUserNickname = c.FromUser != null ? c.FromUser.Nickname : null,
|
||||
FromUserUid = c.FromUser != null ? c.FromUser.Uid : null,
|
||||
OrderId = c.OrderId,
|
||||
OrderNo = c.Order != null ? c.Order.OrderNo : null,
|
||||
OrderAmount = c.OrderAmount,
|
||||
|
|
@ -434,8 +440,10 @@ public class DistributionService : IDistributionService
|
|||
Id = c.Id,
|
||||
UserId = c.UserId,
|
||||
UserNickname = c.User != null ? c.User.Nickname : null,
|
||||
UserUid = c.User != null ? c.User.Uid : null,
|
||||
FromUserId = c.FromUserId,
|
||||
FromUserNickname = c.FromUser != null ? c.FromUser.Nickname : null,
|
||||
FromUserUid = c.FromUser != null ? c.FromUser.Uid : null,
|
||||
OrderId = c.OrderId,
|
||||
OrderNo = c.Order != null ? c.Order.OrderNo : null,
|
||||
OrderAmount = c.OrderAmount,
|
||||
|
|
|
|||
|
|
@ -68,13 +68,13 @@
|
|||
<el-table-column label="用户信息" min-width="120">
|
||||
<template #default="{ row }">
|
||||
<div>{{ row.userNickname }}</div>
|
||||
<div class="sub-text">ID: {{ row.userId }}</div>
|
||||
<div class="sub-text">UID: {{ row.userUid }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="来源用户" min-width="120">
|
||||
<template #default="{ row }">
|
||||
<div>{{ row.fromUserNickname }}</div>
|
||||
<div class="sub-text">ID: {{ row.fromUserId }}</div>
|
||||
<div class="sub-text">UID: {{ row.fromUserUid }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="订单信息" min-width="150">
|
||||
|
|
@ -84,7 +84,7 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="commissionRate" label="佣金比例" width="100" align="center">
|
||||
<template #default="{ row }">{{ (row.commissionRate * 100).toFixed(1) }}%</template>
|
||||
<template #default="{ row }">{{ row.commissionRate.toFixed(0) }}%</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="commissionAmount" label="佣金金额" width="100" align="right">
|
||||
<template #default="{ row }">
|
||||
|
|
@ -124,11 +124,11 @@
|
|||
<el-drawer v-model="detailVisible" title="佣金详情" size="450px">
|
||||
<el-descriptions :column="1" border v-if="detailData">
|
||||
<el-descriptions-item label="佣金ID">{{ detailData.id }}</el-descriptions-item>
|
||||
<el-descriptions-item label="用户">{{ detailData.userNickname }} (ID: {{ detailData.userId }})</el-descriptions-item>
|
||||
<el-descriptions-item label="来源用户">{{ detailData.fromUserNickname }} (ID: {{ detailData.fromUserId }})</el-descriptions-item>
|
||||
<el-descriptions-item label="用户">{{ detailData.userNickname }} (UID: {{ detailData.userUid }})</el-descriptions-item>
|
||||
<el-descriptions-item label="来源用户">{{ detailData.fromUserNickname }} (UID: {{ detailData.fromUserUid }})</el-descriptions-item>
|
||||
<el-descriptions-item label="订单号">{{ detailData.orderNo }}</el-descriptions-item>
|
||||
<el-descriptions-item label="订单金额">¥{{ detailData.orderAmount.toFixed(2) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="佣金比例">{{ (detailData.commissionRate * 100).toFixed(1) }}%</el-descriptions-item>
|
||||
<el-descriptions-item label="佣金比例">{{ detailData.commissionRate.toFixed(0) }}%</el-descriptions-item>
|
||||
<el-descriptions-item label="佣金金额">¥{{ detailData.commissionAmount.toFixed(2) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="层级">{{ detailData.levelName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="状态"><el-tag :type="detailData.status === 1 ? 'warning' : 'success'">{{ detailData.statusName }}</el-tag></el-descriptions-item>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
<el-input v-model.number="queryParams.assignUserId" placeholder="请输入用户ID" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<DictSelect v-model="queryParams.status" dict-type="invite_code_status" placeholder="请选择状态" clearable />
|
||||
<DictSelect v-model="queryParams.status" type="invite_code_status" placeholder="请选择状态" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleSearch"><el-icon><Search /></el-icon>搜索</el-button>
|
||||
|
|
@ -49,7 +49,7 @@
|
|||
<template #default="{ row }">
|
||||
<template v-if="row.assignUserId">
|
||||
<div>{{ row.assignUserNickname }}</div>
|
||||
<div class="sub-text">ID: {{ row.assignUserId }}</div>
|
||||
<div class="sub-text">UID: {{ row.assignUserUid }}</div>
|
||||
</template>
|
||||
<span v-else class="sub-text">-</span>
|
||||
</template>
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
<template #default="{ row }">
|
||||
<template v-if="row.useUserId">
|
||||
<div>{{ row.useUserNickname }}</div>
|
||||
<div class="sub-text">ID: {{ row.useUserId }}</div>
|
||||
<div class="sub-text">UID: {{ row.useUserUid }}</div>
|
||||
</template>
|
||||
<span v-else class="sub-text">-</span>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -43,27 +43,34 @@
|
|||
text-align: center;
|
||||
}
|
||||
|
||||
/* ---- 结论区域 ---- */
|
||||
/* ---- 结论区域(与其他结论页统一样式) ---- */
|
||||
.la-conclusion {
|
||||
background: #FFF5F5;
|
||||
border: 3px solid #C0392B;
|
||||
border-radius: 12px;
|
||||
padding: 16px 20px;
|
||||
margin-top: 8px;
|
||||
padding: 34px 20px 14px;
|
||||
position: relative;
|
||||
background: #FFF5F5;
|
||||
}
|
||||
|
||||
.la-conclusion-badge {
|
||||
display: inline-block;
|
||||
background: #E67E73;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%) translateY(-1px);
|
||||
padding: 5px 24px;
|
||||
border-radius: 0 0 8px 8px;
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
padding: 4px 16px;
|
||||
border-radius: 20px;
|
||||
margin-bottom: 10px;
|
||||
background: #C0392B;
|
||||
white-space: nowrap;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.la-conclusion-content {
|
||||
font-size: 13px;
|
||||
line-height: 1.8;
|
||||
color: #444;
|
||||
line-height: 1.7;
|
||||
color: #555;
|
||||
font-weight: 600;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ public class InviteService : IInviteService
|
|||
var userIds = invitedUsers.Select(u => u.Id).ToList();
|
||||
var commissions = await _dbContext.Commissions
|
||||
.AsNoTracking()
|
||||
.Where(c => c.UserId == userId && userIds.Contains((int)c.FromUserId) && !c.IsDeleted)
|
||||
.Where(c => c.UserId == userId && userIds.Contains(c.FromUserId) && !c.IsDeleted)
|
||||
.GroupBy(c => c.FromUserId)
|
||||
.Select(g => new
|
||||
{
|
||||
|
|
|
|||
|
|
@ -378,10 +378,12 @@ public class OrderService : IOrderService
|
|||
}
|
||||
|
||||
// 读取佣金比例配置
|
||||
var level1RateStr = await _configService.GetConfigValueAsync("commission_rate_level1");
|
||||
var level2RateStr = await _configService.GetConfigValueAsync("commission_rate_level2");
|
||||
var directRateStr = await _configService.GetConfigValueAsync("commission_rate_direct");
|
||||
var indirectRateStr = await _configService.GetConfigValueAsync("commission_rate_indirect");
|
||||
var directRate = decimal.TryParse(directRateStr, out var dr) ? dr : 0.30m;
|
||||
var indirectRate = decimal.TryParse(indirectRateStr, out var ir) ? ir : 0.10m;
|
||||
var level1Rate = decimal.TryParse(level1RateStr, out var l1) ? l1 : 0.30m; // 一级佣金30%
|
||||
var level2Rate = decimal.TryParse(level2RateStr, out var l2) ? l2 : 0.10m; // 二级佣金10%
|
||||
var directRate = decimal.TryParse(directRateStr, out var dr) ? dr : 0.40m; // 无上级时直接佣金40%
|
||||
|
||||
// 查找直接上级
|
||||
var parentUser = await _dbContext.Users
|
||||
|
|
@ -405,9 +407,9 @@ public class OrderService : IOrderService
|
|||
|
||||
if (grandParentUser != null)
|
||||
{
|
||||
// 有间接上级:直接上级30%,间接上级10%
|
||||
var directCommission = Math.Round(order.PayAmount * directRate, 2);
|
||||
var indirectCommission = Math.Round(order.PayAmount * indirectRate, 2);
|
||||
// 有间接上级:直接上级30%(level1),间接上级10%(level2)
|
||||
var directCommission = Math.Round(order.PayAmount * level1Rate, 2);
|
||||
var indirectCommission = Math.Round(order.PayAmount * level2Rate, 2);
|
||||
|
||||
// 直接上级佣金
|
||||
_dbContext.Commissions.Add(new MiAssessment.Model.Entities.Commission
|
||||
|
|
@ -416,7 +418,7 @@ public class OrderService : IOrderService
|
|||
FromUserId = user.Id,
|
||||
OrderId = order.Id,
|
||||
OrderAmount = order.PayAmount,
|
||||
CommissionRate = directRate * 100,
|
||||
CommissionRate = level1Rate * 100,
|
||||
CommissionAmount = directCommission,
|
||||
Level = 1,
|
||||
Status = 1,
|
||||
|
|
@ -434,7 +436,7 @@ public class OrderService : IOrderService
|
|||
FromUserId = user.Id,
|
||||
OrderId = order.Id,
|
||||
OrderAmount = order.PayAmount,
|
||||
CommissionRate = indirectRate * 100,
|
||||
CommissionRate = level2Rate * 100,
|
||||
CommissionAmount = indirectCommission,
|
||||
Level = 2,
|
||||
Status = 1,
|
||||
|
|
@ -445,14 +447,13 @@ public class OrderService : IOrderService
|
|||
grandParentUser.TotalIncome += indirectCommission;
|
||||
grandParentUser.UpdateTime = now;
|
||||
|
||||
_logger.LogInformation("佣金分配完成:直接上级{ParentId}获得{DirectAmount},间接上级{GrandParentId}获得{IndirectAmount},orderId: {OrderId}",
|
||||
_logger.LogInformation("佣金分配完成:直接上级{ParentId}获得{DirectAmount}(30%),间接上级{GrandParentId}获得{IndirectAmount}(10%),orderId: {OrderId}",
|
||||
parentUser.Id, directCommission, grandParentUser.Id, indirectCommission, order.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 无间接上级:直接上级获得 directRate + indirectRate
|
||||
var totalRate = directRate + indirectRate;
|
||||
var commission = Math.Round(order.PayAmount * totalRate, 2);
|
||||
// 无间接上级:直接上级获得 directRate(40%)
|
||||
var commission = Math.Round(order.PayAmount * directRate, 2);
|
||||
|
||||
_dbContext.Commissions.Add(new MiAssessment.Model.Entities.Commission
|
||||
{
|
||||
|
|
@ -460,7 +461,7 @@ public class OrderService : IOrderService
|
|||
FromUserId = user.Id,
|
||||
OrderId = order.Id,
|
||||
OrderAmount = order.PayAmount,
|
||||
CommissionRate = totalRate * 100,
|
||||
CommissionRate = directRate * 100,
|
||||
CommissionAmount = commission,
|
||||
Level = 1,
|
||||
Status = 1,
|
||||
|
|
@ -471,7 +472,7 @@ public class OrderService : IOrderService
|
|||
parentUser.TotalIncome += commission;
|
||||
parentUser.UpdateTime = now;
|
||||
|
||||
_logger.LogInformation("佣金分配完成:直接上级{ParentId}获得{Amount}(无间接上级),orderId: {OrderId}",
|
||||
_logger.LogInformation("佣金分配完成:直接上级{ParentId}获得{Amount}(40%,无间接上级),orderId: {OrderId}",
|
||||
parentUser.Id, commission, order.Id);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user