using Fake.Application; using Newtonsoft.Json; using Oms.Application.Dtos.Orders; using Oms.Application.Messaging; using Oms.Application.Services.Orders.Batch; using Oms.Application.Services.Orders.Templates; using Oms.Domain.OrdersAggregate.Consts; namespace Oms.Application.Services.Orders; public partial class OrderService { private IOrderBatchJobPublisher BatchJobPublisher => LazyServiceProvider.GetRequiredService(); /// /// 批量 Worker 导入单行 Excel 数据(内部方法,勿暴露为 HTTP API)。 /// internal async Task ImportRowForBatchAsync( OrderBatchImportRowPayload payload, int operatorUserId, CancellationToken cancellationToken = default) { var template = await OrderTemplateRepository.FirstOrDefaultAsync(x => x.Id == payload.TemplateId, cancellationToken) ?? throw new BusinessException("模板不存在"); OrderTemplateImportMapping.EnsureTemplateReadyForImport(template); var mapping = OrderTemplateImportMapping.Resolve(template); var sourceValues = JsonConvert.DeserializeObject>(payload.RowDataJson) ?? throw new BusinessException("行数据无效"); var input = OrderTemplateRowMapper.MapToParcelCreateInput(sourceValues, mapping, payload.CustomerId); if (payload.CustomerSenderAddressId is > 0) { await ApplyCustomerSenderAddressToParcelInputAsync( input, payload.CustomerId, payload.CustomerSenderAddressId.Value, cancellationToken); } return await CreateParcelForBatchAsync( input, operatorUserId, orderSource: null, customerSenderAddressId: payload.CustomerSenderAddressId, cancellationToken); } internal async Task TryResolveImportOrderIdAsync( OrderBatchImportRowPayload payload, CancellationToken cancellationToken = default) { try { var template = await OrderTemplateRepository.FirstOrDefaultAsync(x => x.Id == payload.TemplateId, cancellationToken); if (template == null) { return null; } var mapping = OrderTemplateImportMapping.Resolve(template); var sourceValues = JsonConvert.DeserializeObject>(payload.RowDataJson); if (sourceValues == null || sourceValues.Count == 0) { return null; } var input = OrderTemplateRowMapper.MapToParcelCreateInput(sourceValues, mapping, payload.CustomerId); if (string.IsNullOrWhiteSpace(input.ClientNo)) { return null; } var order = await OrderRepository.GetByCustomerAndClientNoAsync( payload.CustomerId, input.ClientNo.Trim(), cancellationToken); return order?.Id; } catch { return null; } } /// /// 批量 Worker 创建小包订单。 /// internal Task CreateParcelForBatchAsync( OrderParcelCreateInput input, int operatorUserId, CancellationToken cancellationToken = default) => CreateParcelForBatchAsync(input, operatorUserId, orderSource: null, customerSenderAddressId: null, cancellationToken); /// /// 批量 Worker 创建小包订单(可指定 与默认发件地址)。 /// internal async Task CreateParcelForBatchAsync( OrderParcelCreateInput input, int operatorUserId, string? orderSource, int? customerSenderAddressId, CancellationToken cancellationToken = default) { ParcelCreateContext? createContext = null; if (!string.IsNullOrWhiteSpace(orderSource) || customerSenderAddressId is > 0) { createContext = new ParcelCreateContext { OrderSource = string.IsNullOrWhiteSpace(orderSource) ? null : orderSource.Trim(), CustomerSenderAddressId = customerSenderAddressId, }; } return await CreateParcelCoreAsync(input, operatorUserId, createContext); } }