Files
TakeoutSaaS.AdminApi/src/Domain/TakeoutSaaS.Domain/Tenants/Entities/BillingLineItem.cs
MSuMshk 4b53862ded feat: 完成账单管理模块后端功能开发及API优化
核心功能:
- 账单CRUD操作(创建、查询、详情、更新状态、删除)
- 支付记录管理(创建支付、审核支付)
- 批量操作支持(批量更新账单状态)
- 统计分析功能(账单统计、逾期账单查询)
- 导出功能(Excel/PDF/CSV)

API端点 (16个):
- GET /api/admin/v1/billings - 账单列表(分页、筛选、排序)
- POST /api/admin/v1/billings - 创建账单
- GET /api/admin/v1/billings/{id} - 账单详情
- DELETE /api/admin/v1/billings/{id} - 删除账单
- PUT /api/admin/v1/billings/{id}/status - 更新状态
- POST /api/admin/v1/billings/batch/status - 批量更新
- GET /api/admin/v1/billings/{id}/payments - 支付记录
- POST /api/admin/v1/billings/{id}/payments - 创建支付
- PUT /api/admin/v1/billings/payments/{paymentId}/verify - 审核支付
- GET /api/admin/v1/billings/statistics - 统计数据
- GET /api/admin/v1/billings/overdue - 逾期账单
- POST /api/admin/v1/billings/export - 导出账单

架构优化:
- 采用CQRS模式分离读写(MediatR + Dapper + EF Core)
- 完整的领域模型设计(TenantBillingStatement, TenantPayment等)
- FluentValidation请求验证
- 状态机管理账单和支付状态流转

API设计优化 (三项改进):
1. 导出API响应Content-Type改为application/octet-stream
2. 支付审核API添加Approved和Notes可选参数,支持通过/拒绝
3. 移除TenantBillings API中重复的TenantId参数

数据库变更:
- 新增账单相关表及关系
- 支持Snowflake ID主键
- 完整的审计字段支持

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 11:24:44 +08:00

85 lines
2.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace TakeoutSaaS.Domain.Tenants.Entities;
/// <summary>
/// 账单明细项(值对象)。
/// 用于记录账单中的单项费用明细,如套餐费用、配额包费用等。
/// </summary>
public sealed class BillingLineItem
{
/// <summary>
/// 明细项类型(如:套餐费、配额包、其他费用)。
/// </summary>
public string ItemType { get; set; } = string.Empty;
/// <summary>
/// 明细项描述。
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// 数量。
/// </summary>
public decimal Quantity { get; set; }
/// <summary>
/// 单价。
/// </summary>
public decimal UnitPrice { get; set; }
/// <summary>
/// 金额(数量 × 单价)。
/// </summary>
public decimal Amount { get; set; }
/// <summary>
/// 折扣率0-1 之间,如 0.1 表示 10% 折扣)。
/// </summary>
public decimal DiscountRate { get; set; }
/// <summary>
/// 创建账单明细项。
/// </summary>
/// <param name="itemType">明细项类型。</param>
/// <param name="description">描述。</param>
/// <param name="quantity">数量。</param>
/// <param name="unitPrice">单价。</param>
/// <param name="discountRate">折扣率。</param>
/// <returns>账单明细项实例。</returns>
public static BillingLineItem Create(
string itemType,
string description,
decimal quantity,
decimal unitPrice,
decimal discountRate = 0)
{
var amount = quantity * unitPrice * (1 - discountRate);
return new BillingLineItem
{
ItemType = itemType,
Description = description,
Quantity = quantity,
UnitPrice = unitPrice,
Amount = amount,
DiscountRate = discountRate
};
}
/// <summary>
/// 计算折扣后的金额。
/// </summary>
/// <returns>折扣后金额。</returns>
public decimal CalculateDiscountedAmount()
{
return Quantity * UnitPrice * (1 - DiscountRate);
}
/// <summary>
/// 获取折扣金额。
/// </summary>
/// <returns>折扣金额。</returns>
public decimal GetDiscountAmount()
{
return Quantity * UnitPrice * DiscountRate;
}
}