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;
}
}