using FluentValidation; using TakeoutSaaS.Application.App.Billings.Commands; namespace TakeoutSaaS.Application.App.Billings.Validators; /// /// 创建账单命令验证器。 /// public sealed class CreateBillingCommandValidator : AbstractValidator { public CreateBillingCommandValidator() { // 1. 租户 ID 必填 RuleFor(x => x.TenantId) .GreaterThan(0) .WithMessage("租户 ID 必须大于 0"); // 2. 账单类型必填 RuleFor(x => x.BillingType) .IsInEnum() .WithMessage("账单类型无效"); // 3. 应付金额必须大于 0 RuleFor(x => x.AmountDue) .GreaterThan(0) .WithMessage("应付金额必须大于 0"); // 4. 到期日必须是未来时间 RuleFor(x => x.DueDate) .GreaterThan(DateTime.UtcNow) .WithMessage("到期日必须是未来时间"); // 5. 账单明细至少包含一项 RuleFor(x => x.LineItems) .NotEmpty() .WithMessage("账单明细不能为空"); // 6. 账单明细项验证 RuleForEach(x => x.LineItems) .ChildRules(lineItem => { lineItem.RuleFor(x => x.ItemType) .NotEmpty() .WithMessage("账单明细类型不能为空") .MaximumLength(50) .WithMessage("账单明细类型不能超过 50 个字符"); lineItem.RuleFor(x => x.Description) .NotEmpty() .WithMessage("账单明细描述不能为空") .MaximumLength(200) .WithMessage("账单明细描述不能超过 200 个字符"); lineItem.RuleFor(x => x.Quantity) .GreaterThan(0) .WithMessage("账单明细数量必须大于 0"); lineItem.RuleFor(x => x.UnitPrice) .GreaterThanOrEqualTo(0) .WithMessage("账单明细单价不能为负数"); lineItem.RuleFor(x => x.Amount) .GreaterThanOrEqualTo(0) .WithMessage("账单明细金额不能为负数"); }); // 7. 备注长度限制(可选) RuleFor(x => x.Notes) .MaximumLength(500) .WithMessage("备注不能超过 500 个字符") .When(x => !string.IsNullOrWhiteSpace(x.Notes)); } }