From 933cbb91d82550f36d5cab4c2e2194ca863c2aaa Mon Sep 17 00:00:00 2001 From: chenchun Date: Thu, 30 Oct 2025 14:38:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B0=8A=E4=BA=AB?= =?UTF-8?q?=E5=8C=85=E5=88=A9=E6=B6=A6=E7=BB=9F=E8=AE=A1=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8F=8A=20ElCollapseTransition=20=E7=B1=BB=E5=9E=8B=E5=A3=B0?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 AiAccountService 中新增 GetProfitStatisticsAsync 接口(GET account/profit-statistics),注入 PremiumPackage 仓储并统计尊享包已消耗/剩余、总成本、总收益、利润率及按200售价的成本估算。接口受授权控制。 - 注入 ISqlSugarRepository 并在构造函数中赋值。 - 在 types/components.d.ts 中新增 ElCollapseTransition 类型声明,补充前端组件类型提示。 - 注意:接口中对用户权限的判断使用了 "CurrentUser.UserName != \"Guo\" || CurrentUser.UserName != \"cc\"",该逻辑可能有误(应为 &&),建议确认并修正权限校验。 --- .../Services/AiAccountService.cs | 78 ++++++++++++++++++- Yi.Ai.Vue3/types/components.d.ts | 1 + 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/AiAccountService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/AiAccountService.cs index 30b453ff..a95f5a2f 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/AiAccountService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/AiAccountService.cs @@ -17,15 +17,18 @@ public class AiAccountService : ApplicationService private IAccountService _accountService; private ISqlSugarRepository _userRepository; private ISqlSugarRepository _rechargeRepository; + private ISqlSugarRepository _premiumPackageRepository; public AiAccountService( IAccountService accountService, ISqlSugarRepository userRepository, - ISqlSugarRepository rechargeRepository) + ISqlSugarRepository rechargeRepository, + ISqlSugarRepository premiumPackageRepository) { _accountService = accountService; _userRepository = userRepository; _rechargeRepository = rechargeRepository; + _premiumPackageRepository = premiumPackageRepository; } /// @@ -72,4 +75,77 @@ public class AiAccountService : ApplicationService return output; } + + /// + /// 获取利润统计数据 + /// + /// 当前成本(RMB) + /// + [Authorize] + [HttpGet("account/profit-statistics")] + public async Task GetProfitStatisticsAsync([FromQuery] decimal currentCost) + { + if (CurrentUser.UserName != "Guo" || CurrentUser.UserName != "cc") + { + throw new UserFriendlyException("您暂无权限访问"); + } + + // 1. 获取尊享包总消耗和剩余库存 + var premiumPackages = await _premiumPackageRepository._DbQueryable.ToListAsync(); + long totalUsedTokens = premiumPackages.Sum(p => p.UsedTokens); + long totalRemainingTokens = premiumPackages.Sum(p => p.RemainingTokens); + + // 2. 计算1亿Token成本 + decimal costPerHundredMillion = totalUsedTokens > 0 + ? currentCost / (totalUsedTokens / 100000000m) + : 0; + + // 3. 计算总成本(剩余+已使用的总成本) + long totalTokens = totalUsedTokens + totalRemainingTokens; + decimal totalCost = totalTokens > 0 + ? (totalTokens / 100000000m) * costPerHundredMillion + : 0; + + // 4. 获取总收益(RechargeType=PremiumPackage的充值金额总和) + decimal totalRevenue = await _rechargeRepository._DbQueryable + .Where(x => x.RechargeType == Domain.Shared.Enums.RechargeTypeEnum.PremiumPackage) + .SumAsync(x => x.RechargeAmount); + + // 5. 计算利润率 + decimal profitRate = totalCost > 0 + ? (totalRevenue / totalCost - 1) * 100 + : 0; + + // 6. 按200售价计算成本 + decimal costAt200Price = totalRevenue > 0 + ? (totalCost / totalRevenue) * 200 + : 0; + + // 7. 格式化输出 + var today = DateTime.Now; + string dayOfWeek = today.ToString("dddd", new System.Globalization.CultureInfo("zh-CN")); + string weekDay = dayOfWeek switch + { + "星期一" => "周1", + "星期二" => "周2", + "星期三" => "周3", + "星期四" => "周4", + "星期五" => "周5", + "星期六" => "周6", + "星期日" => "周日", + _ => dayOfWeek + }; + + var result = $@"{today:M月d日} {weekDay} +尊享包已消耗({totalUsedTokens / 100000000m:F2}亿){totalUsedTokens} +尊享包剩余库存({totalRemainingTokens / 100000000m:F2}亿){totalRemainingTokens} +当前成本:{currentCost:F2}RMB +1亿Token成本:{costPerHundredMillion:F2} RMB=1亿 Token +总成本:{totalCost:F2} RMB +总收益:{totalRevenue:F2}RMB +利润率: {profitRate:F1}% +按200售价来算,成本在{costAt200Price:F2}"; + + return result; + } } \ No newline at end of file diff --git a/Yi.Ai.Vue3/types/components.d.ts b/Yi.Ai.Vue3/types/components.d.ts index 702505a4..dd59173e 100644 --- a/Yi.Ai.Vue3/types/components.d.ts +++ b/Yi.Ai.Vue3/types/components.d.ts @@ -19,6 +19,7 @@ declare module 'vue' { ElCard: typeof import('element-plus/es')['ElCard'] ElCollapse: typeof import('element-plus/es')['ElCollapse'] ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] + ElCollapseTransition: typeof import('element-plus/es')['ElCollapseTransition'] ElContainer: typeof import('element-plus/es')['ElContainer'] ElDialog: typeof import('element-plus/es')['ElDialog'] ElDivider: typeof import('element-plus/es')['ElDivider']