using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tiku.Api.Contracts; using Tiku.Application.Growth; using Tiku.Application.Security; namespace Tiku.Api.Controllers; [ApiController] [Authorize(Policy = BackendPermissions.TenantCommissionManage)] [Tiku.Api.Security.RequireSaasFeature(SaasFeatureCatalog.ReferralCommission)] [Produces("application/json")] [Route("api/commission")] public sealed class CommissionController( ICommissionService commissionService, ICurrentUser currentUser, ITenantContext currentTenant) : ControllerBase { [HttpGet("settings")] [EndpointSummary("查询佣金配置")] public async Task> Settings(CancellationToken cancellationToken) => Ok(await commissionService.GetSettingsAsync(ResolveActor(), cancellationToken)); [HttpPut("settings")] [EndpointSummary("保存佣金配置")] public async Task> UpdateSettings(UpdateCommissionSettingsDto request, CancellationToken cancellationToken) => Ok(await commissionService.UpdateSettingsAsync(ResolveActor(), request.ToCommand(), cancellationToken)); [HttpPut("member-rate")] [EndpointSummary("调整成员佣金比例")] public async Task> MemberRate(UpdateMemberCommissionRateDto request, CancellationToken cancellationToken) => Ok(await commissionService.UpdateMemberRateAsync(ResolveActor(), request.ToCommand(), cancellationToken)); [HttpGet("summary")] [EndpointSummary("查询佣金统计摘要")] public async Task> Summary([FromQuery] CommissionPeriodQueryDto query, CancellationToken cancellationToken) => Ok(await commissionService.GetSummaryAsync(ResolveActor(), query.ToQuery(), cancellationToken)); [HttpGet("orders")] [EndpointSummary("查询佣金来源订单")] public async Task>> Orders([FromQuery] CommissionPeriodQueryDto query, CancellationToken cancellationToken) => Ok(await commissionService.GetOrdersAsync(ResolveActor(), query.ToQuery(), cancellationToken)); [HttpGet("settlements")] [EndpointSummary("查询佣金结算单")] public async Task>> Settlements([FromQuery] CommissionSettlementsQueryDto query, CancellationToken cancellationToken) => Ok(await commissionService.GetSettlementsAsync(ResolveActor(), query.ToQuery(), cancellationToken)); [HttpGet("settlements/export")] [EndpointSummary("导出佣金结算单")] public async Task> Export([FromQuery] CommissionSettlementExportQueryDto query, CancellationToken cancellationToken) => Ok(await commissionService.ExportSettlementAsync(ResolveActor(), query.SettlementId, query.Format, cancellationToken)); [HttpPost("settlements/generate")] [EndpointSummary("生成佣金结算单")] public async Task> Generate(GenerateCommissionSettlementDto request, CancellationToken cancellationToken) => Ok(await commissionService.GenerateSettlementAsync(ResolveActor(), request.ToCommand(), cancellationToken)); [HttpPost("settlements/status")] [EndpointSummary("更新佣金结算单状态")] public async Task> UpdateStatus(UpdateCommissionSettlementStatusDto request, CancellationToken cancellationToken) => Ok(await commissionService.UpdateSettlementStatusAsync(ResolveActor(), request.ToCommand(), cancellationToken)); [HttpGet("settlements/proofs")] [EndpointSummary("查询佣金结算凭证")] public async Task>> Proofs([FromQuery] CommissionSettlementProofQueryDto query, CancellationToken cancellationToken) => Ok(await commissionService.GetProofsAsync(ResolveActor(), query.SettlementId, cancellationToken)); [HttpPost("settlements/proofs")] [EndpointSummary("创建佣金结算凭证")] public async Task> CreateProof(CreateCommissionProofDto request, CancellationToken cancellationToken) => Ok(await commissionService.CreateProofAsync(ResolveActor(), request.ToCommand(), cancellationToken)); [HttpPost("settlements/proofs/status")] [EndpointSummary("更新佣金结算凭证状态")] public async Task> UpdateProofStatus(UpdateCommissionProofStatusDto request, CancellationToken cancellationToken) => Ok(await commissionService.UpdateProofStatusAsync(ResolveActor(), request.ToCommand(), cancellationToken)); private CommissionAdminActor ResolveActor() { if (currentTenant.TenantId is null || currentUser.UserId is null) { throw new CommissionException("Commission admin actor was not resolved.", "commission_access_denied"); } return new CommissionAdminActor(currentTenant.TenantId.Value, currentUser.UserId.Value); } }