diff --git a/server/MiAssessment/src/MiAssessment.Admin.Business/Models/Distribution/CommissionQueryRequest.cs b/server/MiAssessment/src/MiAssessment.Admin.Business/Models/Distribution/CommissionQueryRequest.cs
index 3f3eb58..a08a41d 100644
--- a/server/MiAssessment/src/MiAssessment.Admin.Business/Models/Distribution/CommissionQueryRequest.cs
+++ b/server/MiAssessment/src/MiAssessment.Admin.Business/Models/Distribution/CommissionQueryRequest.cs
@@ -10,11 +10,21 @@ public class CommissionQueryRequest : PagedRequest
///
public long? UserId { get; set; }
+ ///
+ /// 获得佣金的用户UID
+ ///
+ public string? UserUid { get; set; }
+
///
/// 来源用户ID
///
public long? FromUserId { get; set; }
+ ///
+ /// 来源用户UID
+ ///
+ public string? FromUserUid { get; set; }
+
///
/// 关联订单ID
///
diff --git a/server/MiAssessment/src/MiAssessment.Admin.Business/Services/DistributionService.cs b/server/MiAssessment/src/MiAssessment.Admin.Business/Services/DistributionService.cs
index 153a1b7..2ae4bed 100644
--- a/server/MiAssessment/src/MiAssessment.Admin.Business/Services/DistributionService.cs
+++ b/server/MiAssessment/src/MiAssessment.Admin.Business/Services/DistributionService.cs
@@ -846,12 +846,24 @@ public class DistributionService : IDistributionService
query = query.Where(c => c.UserId == request.UserId.Value);
}
+ // 按获得佣金的用户UID筛选
+ if (!string.IsNullOrWhiteSpace(request.UserUid))
+ {
+ query = query.Where(c => c.User != null && c.User.Uid.Contains(request.UserUid));
+ }
+
// 按来源用户ID筛选
if (request.FromUserId.HasValue)
{
query = query.Where(c => c.FromUserId == request.FromUserId.Value);
}
+ // 按来源用户UID筛选
+ if (!string.IsNullOrWhiteSpace(request.FromUserUid))
+ {
+ query = query.Where(c => c.FromUser != null && c.FromUser.Uid.Contains(request.FromUserUid));
+ }
+
// 按订单ID筛选
if (request.OrderId.HasValue)
{
diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/distribution/commission/index.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/distribution/commission/index.vue
index dd57d5e..af78a80 100644
--- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/distribution/commission/index.vue
+++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/distribution/commission/index.vue
@@ -36,20 +36,20 @@
-
-
+
+
-
-
+
+
-
+
-
+
(null)
const queryParams = reactive({
page: 1,
pageSize: 10,
- userId: undefined,
- fromUserId: undefined,
+ userUid: undefined,
+ fromUserUid: undefined,
orderId: undefined,
level: undefined,
status: undefined,
@@ -217,8 +217,8 @@ const handleDateChange = (val: [string, string] | null) => {
const handleSearch = () => { queryParams.page = 1; fetchData() }
const handleReset = () => {
- queryParams.userId = undefined
- queryParams.fromUserId = undefined
+ queryParams.userUid = undefined
+ queryParams.fromUserUid = undefined
queryParams.orderId = undefined
queryParams.level = undefined
queryParams.status = undefined
diff --git a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-abilities.css b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-abilities.css
index eec6ab3..e297164 100644
--- a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-abilities.css
+++ b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-abilities.css
@@ -49,6 +49,8 @@
padding: 34px 20px 14px;
position: relative;
background: #FFF5F5;
+ flex: 1;
+ min-height: 0;
}
.la-conclusion-badge {
diff --git a/server/MiAssessment/src/MiAssessment.Core/Services/InviteService.cs b/server/MiAssessment/src/MiAssessment.Core/Services/InviteService.cs
index 1018d18..8365662 100644
--- a/server/MiAssessment/src/MiAssessment.Core/Services/InviteService.cs
+++ b/server/MiAssessment/src/MiAssessment.Core/Services/InviteService.cs
@@ -28,6 +28,7 @@ public class InviteService : IInviteService
private readonly IWechatService _wechatService;
private readonly HttpClient _httpClient;
private readonly IUploadConfigService _uploadConfigService;
+ private readonly IConfigService _configService;
// 微信小程序码API
private const string WxacodeUnlimitUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit";
@@ -35,23 +36,20 @@ public class InviteService : IInviteService
///
/// 构造函数
///
- /// 数据库上下文
- /// 日志记录器
- /// 微信服务
- /// HTTP客户端
- /// 上传配置服务
public InviteService(
MiAssessmentDbContext dbContext,
ILogger logger,
IWechatService wechatService,
HttpClient httpClient,
- IUploadConfigService uploadConfigService)
+ IUploadConfigService uploadConfigService,
+ IConfigService configService)
{
_dbContext = dbContext;
_logger = logger;
_wechatService = wechatService;
_httpClient = httpClient;
_uploadConfigService = uploadConfigService;
+ _configService = configService;
}
///
@@ -378,25 +376,29 @@ public class InviteService : IInviteService
{
_logger.LogDebug("申请提现,userId: {UserId}, amount: {Amount}", userId, amount);
- // 验证提现金额≥1元 (Requirement 13.2)
- if (amount < 1)
+ // 从配置读取最低提现金额
+ var minAmountStr = await _configService.GetConfigValueAsync("withdraw_min_amount");
+ var minAmount = decimal.TryParse(minAmountStr, out var ma) ? ma : 1m;
+
+ // 验证提现金额≥最低限额
+ if (amount < minAmount)
{
- _logger.LogWarning("提现金额小于最低限额,userId: {UserId}, amount: {Amount}", userId, amount);
+ _logger.LogWarning("提现金额小于最低限额,userId: {UserId}, amount: {Amount}, minAmount: {MinAmount}", userId, amount, minAmount);
return new ApplyWithdrawResponse
{
Success = false,
- ErrorMessage = "提现金额不能小于1元"
+ ErrorMessage = $"提现金额不能小于{minAmount}元"
};
}
- // 验证提现金额为整数 (Requirement 13.3)
- if (amount != Math.Floor(amount))
+ // 验证提现金额最多2位小数
+ if (Math.Round(amount, 2) != amount)
{
- _logger.LogWarning("提现金额不是整数,userId: {UserId}, amount: {Amount}", userId, amount);
+ _logger.LogWarning("提现金额小数位超过2位,userId: {UserId}, amount: {Amount}", userId, amount);
return new ApplyWithdrawResponse
{
Success = false,
- ErrorMessage = "提现金额必须为整数"
+ ErrorMessage = "提现金额最多保留2位小数"
};
}
diff --git a/server/MiAssessment/src/MiAssessment.Infrastructure/Modules/ServiceModule.cs b/server/MiAssessment/src/MiAssessment.Infrastructure/Modules/ServiceModule.cs
index a768426..aa1ff6b 100644
--- a/server/MiAssessment/src/MiAssessment.Infrastructure/Modules/ServiceModule.cs
+++ b/server/MiAssessment/src/MiAssessment.Infrastructure/Modules/ServiceModule.cs
@@ -230,7 +230,8 @@ public class ServiceModule : Module
var wechatService = c.Resolve();
var httpClientFactory = c.Resolve();
var uploadConfigService = c.Resolve();
- return new InviteService(dbContext, logger, wechatService, httpClientFactory.CreateClient(), uploadConfigService);
+ var configService = c.Resolve();
+ return new InviteService(dbContext, logger, wechatService, httpClientFactory.CreateClient(), uploadConfigService, configService);
}).As().InstancePerLifetimeScope();
// ========== 小程序系统模块服务注册 ==========
diff --git a/uniapp/pages/invite/index.vue b/uniapp/pages/invite/index.vue
index 581455c..2ff98cf 100644
--- a/uniapp/pages/invite/index.vue
+++ b/uniapp/pages/invite/index.vue
@@ -128,9 +128,9 @@ async function loadCommissionInfo() {
const res = await getCommission()
if (res.code === 0 && res.data) {
commissionInfo.value = {
- withdrawn: res.data.withdrawn || 0,
- pending: res.data.pending || 0,
- total: res.data.total || 0
+ withdrawn: res.data.withdrawnAmount || 0,
+ pending: res.data.pendingAmount || 0,
+ total: res.data.totalIncome || 0
}
}
} catch (error) {
@@ -302,9 +302,14 @@ function handleShowWithdraw() {
function handleCloseWithdraw() { showWithdrawPopup.value = false }
async function handleSubmitWithdraw() {
- const amount = parseInt(withdrawAmount.value)
- if (!amount || amount < 1) {
- uni.showToast({ title: '最低提现1元', icon: 'none' })
+ const amount = parseFloat(withdrawAmount.value)
+ if (!amount || isNaN(amount) || amount <= 0) {
+ uni.showToast({ title: '请输入有效金额', icon: 'none' })
+ return
+ }
+ // 最多2位小数
+ if (Math.round(amount * 100) / 100 !== amount) {
+ uni.showToast({ title: '金额最多保留2位小数', icon: 'none' })
return
}
if (amount > commissionInfo.value.pending) {
@@ -513,9 +518,9 @@ onMounted(() => { userStore.restoreFromStorage() })