using Fake.Application; using Fake.Users; using Oms.Domain.CustomersAggregate.Entities; using Oms.Domain.CustomersAggregate.Repositories; namespace Oms.Application.Shared; /// /// 从 JWT Claims 解析当前会话类型(管理员 / 客户)。 /// public static class OmsSessionHelper { public const string LoginTypeClaim = "loginType"; private const string CustomerLoginType = "1"; public static bool IsCustomerLogin(ICurrentUser currentUser) => string.Equals( currentUser.FindClaimOrNull(LoginTypeClaim)?.Value, CustomerLoginType, StringComparison.Ordinal); /// /// 客户登录时返回 mapId(对应 t_customer.UserId / 订单 CreateUserId);管理员返回 null。 /// public static int? TryGetCustomerMapId(ICurrentUser currentUser) { if (!IsCustomerLogin(currentUser)) { return null; } var userId = currentUser.GetId(); return userId > 0 ? userId : null; } /// /// 客户登录时返回 mapId(对应订单 CreateUserId);管理员返回 null(不过滤)。 /// public static int? TryGetCustomerCreateUserId(ICurrentUser currentUser) => TryGetCustomerMapId(currentUser); /// /// 解析当前会话对应的 t_customer 记录(客户按 UserId=mapId;管理员可按 CustomerId 代提交)。 /// public static async Task ResolveSessionCustomerAsync( ICustomerRepository customerRepository, ICurrentUser currentUser, int? requestedCustomerId = null) { var mapId = TryGetCustomerMapId(currentUser); if (mapId.HasValue) { var sessionCustomer = await customerRepository.FirstOrDefaultAsync(x => x.UserId == mapId.Value); if (sessionCustomer == null) { throw new BusinessException("未找到客户信息"); } if (requestedCustomerId is > 0 && requestedCustomerId.Value != sessionCustomer.Id) { throw new BusinessException("无权为该客户提交充值"); } return sessionCustomer; } var customerId = requestedCustomerId ?? currentUser.GetId(); if (customerId <= 0) { throw new BusinessException("客户ID不能为空"); } var customer = await customerRepository.FirstOrDefaultAsync(x => x.Id == customerId); if (customer == null) { throw new BusinessException("客户不存在"); } return customer; } /// /// 客户登录时强制返回 t_customer.Id;管理员返回入参 customerId。 /// public static async Task ResolveListCustomerIdAsync( ICustomerRepository customerRepository, ICurrentUser currentUser, int? requestedCustomerId) { var mapId = TryGetCustomerMapId(currentUser); if (!mapId.HasValue) { return requestedCustomerId; } var customer = await customerRepository.FirstOrDefaultAsync(x => x.UserId == mapId.Value); if (customer == null) { throw new BusinessException("未找到客户信息"); } return customer.Id; } }