20261030 #18

Merged
zzh merged 9 commits from test into master 2026-10-30 17:37:30 +08:00
5 changed files with 59 additions and 25 deletions
Showing only changes of commit 4b237c1374 - Show all commits

View File

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

View File

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

View File

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

View File

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

View File

@ -53,6 +53,23 @@ public class OrderRepository : OmsSqlSugarRepository<Order>, IOrderRepository, I
query = query.Where(x => x.AgentId == agentId); 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 status = filter.Status?.Trim();
var isDeletedTab = string.Equals(status, OrderStatusCodes.Deleted, StringComparison.OrdinalIgnoreCase); var isDeletedTab = string.Equals(status, OrderStatusCodes.Deleted, StringComparison.OrdinalIgnoreCase);
if (isDeletedTab) if (isDeletedTab)
@ -1510,6 +1527,7 @@ public class OrderRepository : OmsSqlSugarRepository<Order>, IOrderRepository, I
CreateTimeEnd = filter.CreateTimeEnd, CreateTimeEnd = filter.CreateTimeEnd,
CustomerId = filter.CustomerId, CustomerId = filter.CustomerId,
AgentId = filter.AgentId, AgentId = filter.AgentId,
OwnedByAgentId = filter.OwnedByAgentId,
FieldFilters = filter.FieldFilters, FieldFilters = filter.FieldFilters,
SortField = filter.SortField, SortField = filter.SortField,
SortOrder = filter.SortOrder, SortOrder = filter.SortOrder,
@ -1557,6 +1575,7 @@ public class OrderRepository : OmsSqlSugarRepository<Order>, IOrderRepository, I
CreateTimeEnd = filter.CreateTimeEnd, CreateTimeEnd = filter.CreateTimeEnd,
CustomerId = filter.CustomerId, CustomerId = filter.CustomerId,
AgentId = filter.AgentId, AgentId = filter.AgentId,
OwnedByAgentId = filter.OwnedByAgentId,
WarehouseId = filter.WarehouseId, WarehouseId = filter.WarehouseId,
FulfillmentType = filter.FulfillmentType, FulfillmentType = filter.FulfillmentType,
StockBindStatus = filter.StockBindStatus, StockBindStatus = filter.StockBindStatus,