using System.Security.Claims; 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 { /// /// JWT 中标识登录类型的 Claim 名称。 /// public const string LoginTypeClaim = "loginType"; /// /// JWT 中 RBAC mapId Claim 名称(与 FakeClaimTypes.UserId 对齐)。 /// public const string MapIdClaim = "mapId"; private const string CustomerLoginType = "1"; private const string CustomerRoleName = "Customer"; /// /// 当前会话是否为客户门户登录。 /// public static bool IsCustomerLogin(ICurrentUser currentUser) { if (string.Equals( currentUser.FindClaimOrNull(LoginTypeClaim)?.Value, CustomerLoginType, StringComparison.Ordinal)) { return true; } // 兼容 loginType 丢失但 role=Customer 仍在的令牌 var role = currentUser.FindClaimOrNull(ClaimTypes.Role)?.Value ?? currentUser.FindClaimOrNull("role")?.Value; return string.Equals(role, CustomerRoleName, StringComparison.OrdinalIgnoreCase); } /// /// 客户登录时返回 mapId(对应 t_customer.UserId / 订单 CreateUserId);管理员返回 null。 /// public static int? TryGetCustomerMapId(ICurrentUser currentUser) { if (!IsCustomerLogin(currentUser)) { return null; } var userId = currentUser.GetId(); if (userId > 0) { return userId; } // GetId 未绑到 mapId 时,直接读 claim,避免客户会话被当成管理员(不过滤) var mapIdRaw = currentUser.FindClaimOrNull(MapIdClaim)?.Value; if (int.TryParse(mapIdRaw, out var mapId) && mapId > 0) { return mapId; } return 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("客户ID非法"); } 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; } /// /// 小红书模块客户上下文:客户登录返回 t_customer.Id;管理员无客户上下文时返回 0(系统级)。 /// public static async Task ResolveXhsCustomerIdAsync( ICustomerRepository customerRepository, ICurrentUser currentUser, int? requestedCustomerId = null) { var customerId = await ResolveListCustomerIdAsync(customerRepository, currentUser, requestedCustomerId); return customerId ?? 0; } }