bug
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
18631081161 2026-03-26 14:35:57 +08:00
parent 81f38874c8
commit 32f5bce9cc
8 changed files with 73 additions and 37 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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,

View File

@ -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>

View File

@ -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>

View File

@ -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;
}

View File

@ -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
{

View File

@ -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);
// 无间接上级:直接上级获得 directRate40%
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);
}