From 76cd29b0887522843d4d570776ddaa1e091c8102 Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Thu, 26 Mar 2026 17:20:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Distribution/CommissionQueryRequest.cs | 10 +++++++ .../Services/DistributionService.cs | 12 ++++++++ .../distribution/commission/index.vue | 20 ++++++------- .../wwwroot/css/pages/learning-abilities.css | 2 ++ .../Services/InviteService.cs | 30 ++++++++++--------- .../Modules/ServiceModule.cs | 3 +- uniapp/pages/invite/index.vue | 21 ++++++++----- 7 files changed, 65 insertions(+), 33 deletions(-) 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() }) 请输入提现金额 - + - 每次提现最低一元起 + 提现金额支持2位小数 申请提现