using Fake.Rbac.Infrastructure;
using Microsoft.EntityFrameworkCore;
using Oms.Domain.CustomersAggregate.Entities;
namespace Oms.Application.Shared;
///
/// 顾问邀请绑定:注册时把所属顾问(CustomerService)写成员工登录账号。
///
public static class StaffAdvisorBinder
{
///
/// 仅在 CustomerService 为空时绑定;advisorCode 为员工 Account(来自 ?advisor=)。
/// 无效账号静默跳过,不阻断注册。
///
public static async Task BindAdvisorOnCreateAsync(
Customer entity,
string? advisorCode,
FakeRbacDbContext rbacDbContext,
CancellationToken cancellationToken = default)
{
if (!string.IsNullOrWhiteSpace(entity.CustomerService))
{
return;
}
var key = advisorCode?.Trim();
if (string.IsNullOrWhiteSpace(key))
{
return;
}
var account = await ResolveStaffAccountAsync(rbacDbContext, key, cancellationToken);
if (string.IsNullOrWhiteSpace(account))
{
return;
}
entity.CustomerService = account;
}
private static async Task ResolveStaffAccountAsync(
FakeRbacDbContext rbacDbContext,
string key,
CancellationToken cancellationToken)
{
const string sql = """
SELECT u.`Account` AS `Account`
FROM `user` u
WHERE u.`IsDeleted` = 0
AND u.`Account` = {0}
ORDER BY u.`CreateTime` ASC
LIMIT 1
""";
var row = await rbacDbContext.Database
.SqlQueryRaw(sql, key)
.FirstOrDefaultAsync(cancellationToken);
return string.IsNullOrWhiteSpace(row?.Account) ? null : row.Account.Trim();
}
private sealed class AccountRow
{
public string? Account { get; set; }
}
}