优化代码结构

This commit is contained in:
马梓彭 2026-04-10 10:54:47 +08:00
parent f9b5e8e1ee
commit 12bbaf5efd
22 changed files with 271 additions and 543 deletions

View File

@ -4,10 +4,12 @@ using Microsoft.Extensions.Logging;
using YD_Event.Application.Client.Dtos;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
using YD_Event.Core.Utils;
using Easy.Core;
using YD_Event.Core.Infrastructure.WeChat;
using YD_Event.Core.Infrastructure.WeChat.Dto;
using YD_Event.Core.Options;
using YD_Event.Core.Domain.Pricing;
using YD_Event.Core.Domain.Pricing.Models;
using SqlSugar;
using Furion.DatabaseAccessor;
using Microsoft.AspNetCore.Authorization;
@ -496,7 +498,7 @@ public class EventClientController : IDynamicApiController
int totalParticipantCount = input.Items.Sum(i => i.PersonCount);
// 构建定价服务输入
var pricingInput = new YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput
var pricingInput = new PricingInput
{
ChargeMode = evt.ChargeMode,
ParticipantCount = totalParticipantCount,
@ -511,7 +513,7 @@ public class EventClientController : IDynamicApiController
var bp = baseProjects.FirstOrDefault(p => p.Id == ep.ProjectId);
pricingInput.Projects.Add(new YD_Event.Core.Domain.Pricing.EventPricingService.ProjectPricingInfo
pricingInput.Projects.Add(new ProjectPricingInfo
{
ProjectId = ep.Id,
ProjectName = bp?.Name ?? "",
@ -713,7 +715,7 @@ public class EventClientController : IDynamicApiController
int totalPerson = input.Items.Sum(i => i.Persons!.Count);
// 构建定价服务输入
var pricingInput = new YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput
var pricingInput = new PricingInput
{
ChargeMode = evt.ChargeMode,
ParticipantCount = totalPerson,
@ -728,7 +730,7 @@ public class EventClientController : IDynamicApiController
if (ep != null)
{
pricingInput.Projects.Add(new YD_Event.Core.Domain.Pricing.EventPricingService.ProjectPricingInfo
pricingInput.Projects.Add(new ProjectPricingInfo
{
ProjectId = ep.Id,
ProjectName = bp?.Name ?? "",

View File

@ -2,7 +2,7 @@ using YD_Event.Application.Event.Dtos;
using YD_Event.Application.Project.Dtos;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
using YD_Event.Core.Utils;
using Easy.Core;
using MiniExcelLibs;
using SqlSugar;
using Mapster;

View File

@ -5,7 +5,7 @@ using System.Threading.Tasks;
using YD_Event.Application.Event.Dtos;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
using YD_Event.Core.Utils;
using Easy.Core;
using SqlSugar;
using Mapster;
using YD_Event.Application.Auth;

View File

@ -7,7 +7,8 @@ using YD_Event.Application.Project;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
using YD_Event.Core.Domain.Pricing;
using YD_Event.Core.Utils;
using YD_Event.Core.Domain.Pricing.Models;
using Easy.Core;
using SqlSugar;
using Mapster;
using YD_Event.Application.Auth;
@ -1591,7 +1592,7 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient
var baseProjects = await _projectRepository.GetListAsync(x => projectIds.Contains(x.Id));
// 构建统一计算服务的输入参数
var pricingInput = new EventPricingService.PricingInput
var pricingInput = new PricingInput
{
ChargeMode = feeConfig.ChargeMode,
ParticipantCount = input.ParticipantCount,
@ -1602,7 +1603,7 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient
foreach (var eventProject in eventProjects)
{
var baseProject = baseProjects.FirstOrDefault(p => p.Id == eventProject.ProjectId);
pricingInput.Projects.Add(new EventPricingService.ProjectPricingInfo
pricingInput.Projects.Add(new ProjectPricingInfo
{
ProjectId = eventProject.ProjectId,
ProjectName = baseProject?.Name ?? "未知项目",

View File

@ -1,4 +1,4 @@
global using Furion;
global using Furion;
global using Furion.DataEncryption;
global using Furion.DataValidation;
global using Furion.DependencyInjection;
@ -28,4 +28,3 @@ global using System.Collections;
global using Newtonsoft.Json;
global using Newtonsoft.Json.Linq;
global using System.Text.RegularExpressions;
global using YD_Event.Core.Config;

View File

@ -37,7 +37,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="MiniExcel" Version="1.42.0" />
<PackageReference Include="MiniWord" Version="0.9.2" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.16.0" />
<PackageReference Include="EPPlus" Version="7.1.0" />
</ItemGroup>

View File

@ -1,67 +0,0 @@
using System;
using System.Collections.Generic;
namespace YD_Event.Core.Config;
public class BlogSetting
{
/// <summary>
/// 网站Logo
/// </summary>
public string Logo { get; set; }
/// <summary>
/// 站点图标
/// </summary>
public string Favicon { get; set; }
/// <summary>
/// 开启打赏
/// </summary>
public bool? IsRewards { get; set; }
/// <summary>
/// 支付宝
/// </summary>
public string AliPay { get; set; }
/// <summary>
/// 微信收款码
/// </summary>
public string WxPay { get; set; }
/// <summary>
/// 允许留言
/// </summary>
public bool? IsAllowMessage { get; set; }
/// <summary>
/// 允许评论
/// </summary>
public bool? IsAllowComments { get; set; }
/// <summary>
/// 公告
/// </summary>
public string Announcement { get; set; }
/// <summary>
/// 站点名称
/// </summary>
public string SiteName { get; set; }
/// <summary>
/// 首页格言
/// </summary>
public string Motto { get; set; }
/// <summary>
/// 网站运营时间
/// </summary>
public DateTime RunTime { get; set; }
/// <summary>
/// 站点版权
/// </summary>
public string Copyright { get; set; }
/// <summary>
/// 站点描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 关键词
/// </summary>
public string Keyword { get; set; }
/// <summary>
/// 备案号
/// </summary>
public string Filing { get; set; }
}

View File

@ -1,35 +0,0 @@
using System;
using System.Collections.Generic;
namespace YD_Event.Core.Config;
public class BloggerInfo
{
/// <summary>
/// 头像
/// </summary>
public string Avatar { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NikeName { get; set; }
/// <summary>
/// QQ
/// </summary>
public string QQ { get; set; }
/// <summary>
/// Github
/// </summary>
public string Github { get; set; }
/// <summary>
/// 码云
/// </summary>
public string Gitee { get; set; }
/// <summary>
/// 个性签名
/// </summary>
public string Motto { get; set; }
/// <summary>
/// 关于我
/// </summary>
public string About { get; set; }
}

View File

@ -1,27 +0,0 @@
using System;
using System.Collections.Generic;
namespace YD_Event.Core.Config;
public class SysSecuritySetting
{
/// <summary>
/// 用户默认密码
/// </summary>
public string Password { get; set; }
/// <summary>
/// 密码错误次数
/// </summary>
public int Times { get; set; }
/// <summary>
/// 密码规则
/// </summary>
public string PasswordRule { get; set; }
/// <summary>
/// 密码规则提示语
/// </summary>
public string RuleMessage { get; set; }
/// <summary>
/// Token有效期(分钟)
/// </summary>
public int? TokenExpired { get; set; }
}

View File

@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

View File

@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Drawing.Wordprocessing;
using Furion.DependencyInjection;
namespace YD_Event.Core.Domain.Certificate

View File

@ -1,6 +1,4 @@
using System.Collections.Generic;
namespace YD_Event.Core.Domain.Certificate;
namespace YD_Event.Core.Domain.Certificate.Models;
/// <summary>
/// 证书模型

View File

@ -1,4 +1,3 @@
using System;
using System.IO;
using QRCoder;
using Furion.DependencyInjection;

View File

@ -1,4 +1,5 @@
using YD_Event.Core.Enum;
using YD_Event.Core.Domain.Pricing.Models;
namespace YD_Event.Core.Domain.Pricing;
@ -8,110 +9,6 @@ namespace YD_Event.Core.Domain.Pricing;
/// </summary>
public static class EventPricingService
{
/// <summary>
/// 定价计算输入参数
/// </summary>
public class PricingInput
{
/// <summary>
/// 收费模式
/// </summary>
public ChargeMode ChargeMode { get; set; }
/// <summary>
/// 参赛人数
/// </summary>
public int ParticipantCount { get; set; }
/// <summary>
/// 赛事定价(用于定价(赛事)和单价(赛事)模式)
/// </summary>
public decimal EventPrice { get; set; }
/// <summary>
/// 项目列表(单价项目模式使用)
/// </summary>
public List<ProjectPricingInfo> Projects { get; set; } = new List<ProjectPricingInfo>();
}
/// <summary>
/// 项目定价信息
/// </summary>
public class ProjectPricingInfo
{
/// <summary>
/// 项目ID
/// </summary>
public long ProjectId { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string ProjectName { get; set; } = string.Empty;
/// <summary>
/// 项目单价(元)
/// </summary>
public decimal UnitPrice { get; set; }
}
/// <summary>
/// 定价计算结果
/// </summary>
public class PricingResult
{
/// <summary>
/// 总金额(精确到分)
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 总人数
/// </summary>
public int TotalPersonCount { get; set; }
/// <summary>
/// 费用明细
/// </summary>
public List<PricingDetailItem> Details { get; set; } = new List<PricingDetailItem>();
/// <summary>
/// 计算日志(用于审计)
/// </summary>
public List<string> CalculationLogs { get; set; } = new List<string>();
}
/// <summary>
/// 费用明细项
/// </summary>
public class PricingDetailItem
{
/// <summary>
/// 项目名称
/// </summary>
public string ItemName { get; set; } = string.Empty;
/// <summary>
/// 单价
/// </summary>
public decimal UnitPrice { get; set; }
/// <summary>
/// 数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 小计
/// </summary>
public decimal Subtotal { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? Remark { get; set; }
}
/// <summary>
/// 计算赛事报名费用
/// </summary>
@ -142,7 +39,6 @@ public static class EventPricingService
break;
}
// 确保金额精确到分
result.TotalAmount = Math.Round(result.TotalAmount, 2, MidpointRounding.AwayFromZero);
result.CalculationLogs.Add($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 最终总金额: {result.TotalAmount:F2} 元");
@ -230,7 +126,6 @@ public static class EventPricingService
var totalAmount = totalProjectPrice * input.ParticipantCount;
result.TotalAmount = totalAmount;
// 添加汇总项
result.Details.Add(new PricingDetailItem
{
ItemName = input.ParticipantCount == 1 ? "项目总价" : "项目总价 × 人数",

View File

@ -0,0 +1,32 @@
namespace YD_Event.Core.Domain.Pricing.Models;
/// <summary>
/// 费用明细项
/// </summary>
public class PricingDetailItem
{
/// <summary>
/// 项目名称
/// </summary>
public string ItemName { get; set; } = string.Empty;
/// <summary>
/// 单价
/// </summary>
public decimal UnitPrice { get; set; }
/// <summary>
/// 数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 小计
/// </summary>
public decimal Subtotal { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? Remark { get; set; }
}

View File

@ -0,0 +1,29 @@
using YD_Event.Core.Enum;
namespace YD_Event.Core.Domain.Pricing.Models;
/// <summary>
/// 定价计算输入参数
/// </summary>
public class PricingInput
{
/// <summary>
/// 收费模式
/// </summary>
public ChargeMode ChargeMode { get; set; }
/// <summary>
/// 参赛人数
/// </summary>
public int ParticipantCount { get; set; }
/// <summary>
/// 赛事定价(用于定价(赛事)和单价(赛事)模式)
/// </summary>
public decimal EventPrice { get; set; }
/// <summary>
/// 项目列表(单价项目模式使用)
/// </summary>
public List<ProjectPricingInfo> Projects { get; set; } = new List<ProjectPricingInfo>();
}

View File

@ -0,0 +1,27 @@
namespace YD_Event.Core.Domain.Pricing.Models;
/// <summary>
/// 定价计算结果
/// </summary>
public class PricingResult
{
/// <summary>
/// 总金额(精确到分)
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 总人数
/// </summary>
public int TotalPersonCount { get; set; }
/// <summary>
/// 费用明细
/// </summary>
public List<PricingDetailItem> Details { get; set; } = new List<PricingDetailItem>();
/// <summary>
/// 计算日志(用于审计)
/// </summary>
public List<string> CalculationLogs { get; set; } = new List<string>();
}

View File

@ -0,0 +1,22 @@
namespace YD_Event.Core.Domain.Pricing.Models;
/// <summary>
/// 项目定价信息
/// </summary>
public class ProjectPricingInfo
{
/// <summary>
/// 项目ID
/// </summary>
public long ProjectId { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string ProjectName { get; set; } = string.Empty;
/// <summary>
/// 项目单价(元)
/// </summary>
public decimal UnitPrice { get; set; }
}

View File

@ -1,4 +1,4 @@
namespace YD_Event.Core.Utils;
namespace Easy.Core;
/// <summary>
/// 金额处理工具类
@ -18,8 +18,6 @@ public static class AmountHelper
/// <returns>金额(分)</returns>
public static int YuanToFen(decimal amount)
{
// 使用四舍五入到最近的整数,使用银行家舍入法(四舍六入五成双)
// 这里先确保精度,然后乘以100,再四舍五入
var roundedAmount = Math.Round(amount, DecimalPlaces, MidpointRounding.AwayFromZero);
return (int)Math.Round(roundedAmount * 100, MidpointRounding.AwayFromZero);
}

View File

@ -20,8 +20,6 @@
<PackageReference Include="Furion.Pure" Version="4.9.7.211" />
<PackageReference Include="Hashids.net" Version="1.7.0" />
<PackageReference Include="Lazy.Captcha.Core" Version="2.2.2" />
<PackageReference Include="log4net" Version="3.2.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.5" />
<PackageReference Include="MrHuo.OAuth.QQ" Version="1.1.1" />
<PackageReference Include="Polly" Version="8.6.6" />
<PackageReference Include="QuestPDF" Version="2025.12.1" />
@ -31,7 +29,6 @@
<PackageReference Include="SkiaSharp" Version="3.119.1" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="3.119.1" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.210" />
<PackageReference Include="UAParser" Version="3.1.47" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.16.0" />
</ItemGroup>

View File

@ -4,141 +4,6 @@
<name>YD_Event.Core</name>
</assembly>
<members>
<member name="P:YD_Event.Core.Config.BloggerInfo.Avatar">
<summary>
头像
</summary>
</member>
<member name="P:YD_Event.Core.Config.BloggerInfo.NikeName">
<summary>
昵称
</summary>
</member>
<member name="P:YD_Event.Core.Config.BloggerInfo.QQ">
<summary>
QQ
</summary>
</member>
<member name="P:YD_Event.Core.Config.BloggerInfo.Github">
<summary>
Github
</summary>
</member>
<member name="P:YD_Event.Core.Config.BloggerInfo.Gitee">
<summary>
码云
</summary>
</member>
<member name="P:YD_Event.Core.Config.BloggerInfo.Motto">
<summary>
个性签名
</summary>
</member>
<member name="P:YD_Event.Core.Config.BloggerInfo.About">
<summary>
关于我
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Logo">
<summary>
网站Logo
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Favicon">
<summary>
站点图标
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.IsRewards">
<summary>
开启打赏
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.AliPay">
<summary>
支付宝
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.WxPay">
<summary>
微信收款码
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.IsAllowMessage">
<summary>
允许留言
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.IsAllowComments">
<summary>
允许评论
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Announcement">
<summary>
公告
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.SiteName">
<summary>
站点名称
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Motto">
<summary>
首页格言
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.RunTime">
<summary>
网站运营时间
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Copyright">
<summary>
站点版权
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Description">
<summary>
站点描述
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Keyword">
<summary>
关键词
</summary>
</member>
<member name="P:YD_Event.Core.Config.BlogSetting.Filing">
<summary>
备案号
</summary>
</member>
<member name="P:YD_Event.Core.Config.SysSecuritySetting.Password">
<summary>
用户默认密码
</summary>
</member>
<member name="P:YD_Event.Core.Config.SysSecuritySetting.Times">
<summary>
密码错误次数
</summary>
</member>
<member name="P:YD_Event.Core.Config.SysSecuritySetting.PasswordRule">
<summary>
密码规则
</summary>
</member>
<member name="P:YD_Event.Core.Config.SysSecuritySetting.RuleMessage">
<summary>
密码规则提示语
</summary>
</member>
<member name="P:YD_Event.Core.Config.SysSecuritySetting.TokenExpired">
<summary>
Token有效期(分钟)
</summary>
</member>
<member name="F:YD_Event.Core.Const.AuthClaimsConst.AuthIdKey">
<summary>
用户唯一ID
@ -179,36 +44,6 @@
自定义配置缓存键
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Certificate.CertificateModel">
<summary>
证书模型
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.CertificateModel.Name">
<summary>
证书名称
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.CertificateModel.Code">
<summary>
证书编号
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.CertificateModel.BackgroundImageUrl">
<summary>
背景图片URL
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.CertificateModel.Width">
<summary>
宽度
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.CertificateModel.Height">
<summary>
高度
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Certificate.DocxTemplateParser">
<summary>
DOCX模板解析器
@ -330,6 +165,36 @@
模板验证结果
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Certificate.Models.CertificateModel">
<summary>
证书模型
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.Models.CertificateModel.Name">
<summary>
证书名称
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.Models.CertificateModel.Code">
<summary>
证书编号
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.Models.CertificateModel.BackgroundImageUrl">
<summary>
背景图片URL
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.Models.CertificateModel.Width">
<summary>
宽度
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Certificate.Models.CertificateModel.Height">
<summary>
高度
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Certificate.QRCodeService">
<summary>
二维码服务
@ -494,134 +359,134 @@
所有金额计算均以此服务为准,确保计算结果的一致性
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput">
<summary>
定价计算输入参数
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput.ChargeMode">
<summary>
收费模式
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput.ParticipantCount">
<summary>
参赛人数
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput.EventPrice">
<summary>
赛事定价(用于定价(赛事)和单价(赛事)模式)
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput.Projects">
<summary>
项目列表(单价项目模式使用)
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.EventPricingService.ProjectPricingInfo">
<summary>
项目定价信息
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.ProjectPricingInfo.ProjectId">
<summary>
项目ID
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.ProjectPricingInfo.ProjectName">
<summary>
项目名称
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.ProjectPricingInfo.UnitPrice">
<summary>
项目单价(元)
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult">
<summary>
定价计算结果
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult.TotalAmount">
<summary>
总金额(精确到分)
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult.TotalPersonCount">
<summary>
总人数
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult.Details">
<summary>
费用明细
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult.CalculationLogs">
<summary>
计算日志(用于审计)
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.EventPricingService.PricingDetailItem">
<summary>
费用明细项
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingDetailItem.ItemName">
<summary>
项目名称
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingDetailItem.UnitPrice">
<summary>
单价
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingDetailItem.Quantity">
<summary>
数量
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingDetailItem.Subtotal">
<summary>
小计
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.EventPricingService.PricingDetailItem.Remark">
<summary>
备注
</summary>
</member>
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.Calculate(YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput)">
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.Calculate(YD_Event.Core.Domain.Pricing.Models.PricingInput)">
<summary>
计算赛事报名费用
</summary>
<param name="input">定价计算输入</param>
<returns>定价计算结果</returns>
</member>
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateFreeMode(YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult)">
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateFreeMode(YD_Event.Core.Domain.Pricing.Models.PricingResult)">
<summary>
免费模式
</summary>
</member>
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateFixedPriceMode(YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult,YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput)">
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateFixedPriceMode(YD_Event.Core.Domain.Pricing.Models.PricingResult,YD_Event.Core.Domain.Pricing.Models.PricingInput)">
<summary>
定价(赛事)模式:固定为赛事设定价格/场,无论参赛主体是个人还是单位,也无论参赛项目数量多少,均统一按固定价格计算
</summary>
</member>
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateUnitPriceEventMode(YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult,YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput)">
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateUnitPriceEventMode(YD_Event.Core.Domain.Pricing.Models.PricingResult,YD_Event.Core.Domain.Pricing.Models.PricingInput)">
<summary>
单价(赛事)模式:按照赛事设定的单价乘以实际报名人数计算总金额
</summary>
</member>
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateUnitPriceProjectMode(YD_Event.Core.Domain.Pricing.EventPricingService.PricingResult,YD_Event.Core.Domain.Pricing.EventPricingService.PricingInput)">
<member name="M:YD_Event.Core.Domain.Pricing.EventPricingService.CalculateUnitPriceProjectMode(YD_Event.Core.Domain.Pricing.Models.PricingResult,YD_Event.Core.Domain.Pricing.Models.PricingInput)">
<summary>
单价(项目)模式:根据每个项目的单独定价和报名人数进行计算。
将每个报名项目的单价相加得到单人总费用,再乘以报名人数得出最终金额
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.Models.PricingDetailItem">
<summary>
费用明细项
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingDetailItem.ItemName">
<summary>
项目名称
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingDetailItem.UnitPrice">
<summary>
单价
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingDetailItem.Quantity">
<summary>
数量
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingDetailItem.Subtotal">
<summary>
小计
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingDetailItem.Remark">
<summary>
备注
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.Models.PricingInput">
<summary>
定价计算输入参数
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingInput.ChargeMode">
<summary>
收费模式
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingInput.ParticipantCount">
<summary>
参赛人数
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingInput.EventPrice">
<summary>
赛事定价(用于定价(赛事)和单价(赛事)模式)
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingInput.Projects">
<summary>
项目列表(单价项目模式使用)
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.Models.PricingResult">
<summary>
定价计算结果
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingResult.TotalAmount">
<summary>
总金额(精确到分)
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingResult.TotalPersonCount">
<summary>
总人数
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingResult.Details">
<summary>
费用明细
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.PricingResult.CalculationLogs">
<summary>
计算日志(用于审计)
</summary>
</member>
<member name="T:YD_Event.Core.Domain.Pricing.Models.ProjectPricingInfo">
<summary>
项目定价信息
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.ProjectPricingInfo.ProjectId">
<summary>
项目ID
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.ProjectPricingInfo.ProjectName">
<summary>
项目名称
</summary>
</member>
<member name="P:YD_Event.Core.Domain.Pricing.Models.ProjectPricingInfo.UnitPrice">
<summary>
项目单价(元)
</summary>
</member>
<member name="T:YD_Event.Core.Entities.Entity`1">
<summary>
表实体继承
@ -5806,39 +5671,39 @@
子选项
</summary>
</member>
<member name="T:YD_Event.Core.Utils.AmountHelper">
<member name="T:Easy.Core.AmountHelper">
<summary>
金额处理工具类
统一处理货币单位转换、精度控制和四舍五入规则
</summary>
</member>
<member name="F:YD_Event.Core.Utils.AmountHelper.DecimalPlaces">
<member name="F:Easy.Core.AmountHelper.DecimalPlaces">
<summary>
金额精度小数位数
</summary>
</member>
<member name="M:YD_Event.Core.Utils.AmountHelper.YuanToFen(System.Decimal)">
<member name="M:Easy.Core.AmountHelper.YuanToFen(System.Decimal)">
<summary>
将元转换为分
</summary>
<param name="amount">金额(元)</param>
<returns>金额(分)</returns>
</member>
<member name="M:YD_Event.Core.Utils.AmountHelper.FenToYuan(System.Int32)">
<member name="M:Easy.Core.AmountHelper.FenToYuan(System.Int32)">
<summary>
将分转换为元
</summary>
<param name="amount">金额(分)</param>
<returns>金额(元)</returns>
</member>
<member name="M:YD_Event.Core.Utils.AmountHelper.FenToYuan(System.Nullable{System.Int32})">
<member name="M:Easy.Core.AmountHelper.FenToYuan(System.Nullable{System.Int32})">
<summary>
将分转换为元(可为空)
</summary>
<param name="amount">金额(分)</param>
<returns>金额(元)</returns>
</member>
<member name="M:YD_Event.Core.Utils.AmountHelper.Round(System.Decimal,System.Int32)">
<member name="M:Easy.Core.AmountHelper.Round(System.Decimal,System.Int32)">
<summary>
四舍五入金额到指定小数位
</summary>
@ -5846,14 +5711,14 @@
<param name="decimalPlaces">小数位数,默认2位</param>
<returns>四舍五入后的金额</returns>
</member>
<member name="M:YD_Event.Core.Utils.AmountHelper.IsValidAmount(System.Decimal)">
<member name="M:Easy.Core.AmountHelper.IsValidAmount(System.Decimal)">
<summary>
验证金额格式是否正确(最多保留2位小数)
</summary>
<param name="amount">金额</param>
<returns>是否有效</returns>
</member>
<member name="M:YD_Event.Core.Utils.AmountHelper.IsValidPositiveAmount(System.Decimal)">
<member name="M:Easy.Core.AmountHelper.IsValidPositiveAmount(System.Decimal)">
<summary>
验证金额是否大于0且格式正确
</summary>

View File

@ -10,19 +10,16 @@ using SqlSugar;
using System.Text;
using System.Threading.Tasks;
using AspNetCoreRateLimit;
using Easy.Core;
using YD_Event.Core.Logging;
using YD_Event.Core.Options;
using Easy.Core;
using Furion.Logging;
using Lazy.Captcha.Core;
using Lazy.Captcha.Core.Generator;
using Mapster;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using MrHuo.OAuth;
using MrHuo.OAuth.QQ;
using QuestPDF;
using QuestPDF.Infrastructure;
using SkiaSharp;
namespace YD_Event.Web.Core;