fix: 代理运单列表按名下客户过滤
All checks were successful
Build and Deploy / deploy (push) Successful in 1m12s

门户可见范围改用客户当前 AgentId;返佣仍认订单快照 AgentId。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zzh 2026-10-30 10:52:16 +08:00
parent b6831bad1d
commit 4b237c1374
5 changed files with 59 additions and 25 deletions

View File

@ -111,31 +111,22 @@ public class AgentPortalService : ApplicationService
};
}
/// <summary>名下订单分页(强制 Order.AgentId;不含应付)。</summary>
/// <summary>名下订单分页(按当前绑定客户可见;不含应付)。</summary>
[HttpPost("/agent/portal/orders/list")]
public async Task<OmsPageResult<AgentPortalOrderOutput>> GetOrdersAsync(AgentPortalPageInput input)
{
var agent = await GetCurrentAgentOrThrowAsync();
var keyword = input.Keyword?.Trim();
Expression<Func<Order, bool>> predicate = string.IsNullOrWhiteSpace(keyword)
? x => x.AgentId == agent.Id
: x => x.AgentId == agent.Id
&& (x.ServiceNo.Contains(keyword!)
|| (x.TrackNo != null && x.TrackNo.Contains(keyword!))
|| (x.ProductCode != null && x.ProductCode.Contains(keyword!)));
var filter = new OrderListFilter
{
OwnedByAgentId = agent.Id,
Keyword = string.IsNullOrWhiteSpace(keyword) ? null : keyword,
Status = "all"
};
var page = OmsDocHelper.NormalizePage(input.Page);
var pageSize = OmsDocHelper.NormalizePageSize(input.PageSize);
var entities = await OrderRepository.GetPagedListAsync(
predicate,
page,
pageSize,
new Dictionary<string, bool>
{
[nameof(Order.CreateTime)] = false,
[nameof(Order.Id)] = false
});
var total = await OrderRepository.CountAsync(predicate);
var (entities, total) = await OrderRepository.GetFilteredPagedListAsync(page, pageSize, filter);
var customerIds = entities.Where(x => x.CustomerId.HasValue).Select(x => x.CustomerId!.Value).Distinct().ToList();
var customers = customerIds.Count == 0
@ -175,7 +166,7 @@ public class AgentPortalService : ApplicationService
public async Task<AgentWorkplaceStatsOutput> GetWorkplaceStatsAsync()
{
var agent = await GetCurrentAgentOrThrowAsync();
var filter = new OrderListFilter { AgentId = agent.Id };
var filter = new OrderListFilter { OwnedByAgentId = agent.Id };
var rows = await OrderRepository.GetStatusCountsByFilterAsync(filter);
var counts = rows
.Where(x => !string.Equals(x.Status, OrderStatusCodes.Deleted, StringComparison.OrdinalIgnoreCase))
@ -244,7 +235,7 @@ public class AgentPortalService : ApplicationService
{
var agent = await GetCurrentAgentOrThrowAsync();
days = Math.Clamp(days, 1, 31);
var filter = new OrderListFilter { AgentId = agent.Id };
var filter = new OrderListFilter { OwnedByAgentId = agent.Id };
var today = DateTime.Today;
var rangeStart = today.AddDays(-(days - 1));
var rangeEnd = today.AddDays(1);

View File

@ -1225,7 +1225,7 @@ public partial class OrderService
}
/// <summary>
/// 渠道代理门户:列表仅可见下单快照 AgentId=本代理的运单。
/// 渠道代理门户:列表按名下客户过滤(客户/主客户当前 AgentId);返佣仍认订单快照 AgentId。
/// </summary>
private async Task ApplyAgentOrderScopeAsync(OrderListFilter filter)
{
@ -1243,7 +1243,9 @@ public partial class OrderService
throw new BusinessException("代理不存在");
}
filter.AgentId = agent.Id;
filter.OwnedByAgentId = agent.Id;
// 避免与快照字段叠滤,导致换绑前历史单被挡掉
filter.AgentId = null;
if (filter.CustomerId is > 0)
{

View File

@ -1358,9 +1358,26 @@ public partial class OrderService : ApplicationService
{
var agentRepository =
LazyServiceProvider.GetRequiredService<Domain.AgentsAggregate.Repositories.IAgentRepository>();
var userId = OmsSessionHelper.ResolveMapUserId(CurrentUser);
var agent = userId > 0 ? await agentRepository.GetByUserIdAsync(userId) : null;
if (agent == null || order.AgentId != agent.Id)
if (order.CustomerId is not > 0)
{
throw new BusinessException("订单不存在");
}
var customer = await CustomerRepository.FirstOrDefaultAsync(x => x.Id == order.CustomerId.Value);
if (customer == null)
{
throw new BusinessException("订单不存在");
}
try
{
await OmsSessionHelper.EnsureAgentOwnsCustomerAsync(
CustomerRepository,
agentRepository,
CurrentUser,
customer);
}
catch (BusinessException)
{
throw new BusinessException("订单不存在");
}

View File

@ -35,10 +35,15 @@ public class OrderListFilter
public int? CustomerId { get; set; }
/// <summary>
/// 渠道代理 Id(门户列表强制按下单快照 AgentId 过滤)。
/// 按下单快照 Order.AgentId 过滤(返佣归属;历史单换绑后不变)。
/// </summary>
public int? AgentId { get; set; }
/// <summary>
/// 按名下客户可见:订单客户(或主客户)当前 AgentId = 此值。代理门户运单列表用此字段。
/// </summary>
public int? OwnedByAgentId { get; set; }
/// <summary>
/// 发货仓 ID(订单或绑定行所属仓)。
/// </summary>

View File

@ -53,6 +53,23 @@ public class OrderRepository : OmsSqlSugarRepository<Order>, IOrderRepository, I
query = query.Where(x => x.AgentId == agentId);
}
// 名下客户可见:本客户 AgentId,或子客户的主客户 AgentId
if (filter.OwnedByAgentId.HasValue)
{
var ownedByAgentId = filter.OwnedByAgentId.Value;
query = query.Where(o =>
SqlFunc.Subqueryable<Customer>()
.Where(c => c.Id == o.CustomerId && c.AgentId == ownedByAgentId)
.Any()
|| SqlFunc.Subqueryable<Customer>()
.Where(c => c.Id == o.CustomerId
&& c.ParentCustomerId != null
&& SqlFunc.Subqueryable<Customer>()
.Where(m => m.Id == c.ParentCustomerId && m.AgentId == ownedByAgentId)
.Any())
.Any());
}
var status = filter.Status?.Trim();
var isDeletedTab = string.Equals(status, OrderStatusCodes.Deleted, StringComparison.OrdinalIgnoreCase);
if (isDeletedTab)
@ -1510,6 +1527,7 @@ public class OrderRepository : OmsSqlSugarRepository<Order>, IOrderRepository, I
CreateTimeEnd = filter.CreateTimeEnd,
CustomerId = filter.CustomerId,
AgentId = filter.AgentId,
OwnedByAgentId = filter.OwnedByAgentId,
FieldFilters = filter.FieldFilters,
SortField = filter.SortField,
SortOrder = filter.SortOrder,
@ -1557,6 +1575,7 @@ public class OrderRepository : OmsSqlSugarRepository<Order>, IOrderRepository, I
CreateTimeEnd = filter.CreateTimeEnd,
CustomerId = filter.CustomerId,
AgentId = filter.AgentId,
OwnedByAgentId = filter.OwnedByAgentId,
WarehouseId = filter.WarehouseId,
FulfillmentType = filter.FulfillmentType,
StockBindStatus = filter.StockBindStatus,