using Fake.Application; using Fake.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Oms.Application.Dtos.Orders; using Oms.Application.Messaging; using Oms.Domain.OrdersAggregate.Consts; namespace Oms.Application.Services.Orders.Batch; /// /// 创建类批量操作(Excel 导入行、小包批量创建)执行器。 /// public sealed class OrderBatchCreateActionHandler(IServiceScopeFactory scopeFactory) : IScopedDependency { public async Task ExecuteImportRowAsync( OrderBatchJobMessage message, CancellationToken cancellationToken = default) { if (string.IsNullOrWhiteSpace(message.PayloadJson)) { return OrderBatchActionExecuteResult.BusinessFail("导入行消息体为空"); } var payload = JsonConvert.DeserializeObject(message.PayloadJson); if (payload == null) { return OrderBatchActionExecuteResult.BusinessFail("导入行消息体无效"); } try { using var scope = scopeFactory.CreateScope(); var orderService = scope.ServiceProvider.GetRequiredService(); var output = await orderService.ImportRowForBatchAsync(payload, message.OperatorUserId, cancellationToken); return OrderBatchActionExecuteResult.Ok( createdOrderId: output.OrderId, serviceNo: output.ServiceNo, clientNo: output.ClientNo, trackNo: output.TrackNo, labelUrl: output.LabelUrl); } catch (BusinessException ex) { using var scope = scopeFactory.CreateScope(); var orderService = scope.ServiceProvider.GetRequiredService(); var createdOrderId = await orderService.TryResolveImportOrderIdAsync(payload, cancellationToken); return OrderBatchActionExecuteResult.BusinessFail(ex.Message, createdOrderId); } catch (Exception ex) { return OrderBatchActionExecuteResult.SystemFail(ex.Message); } } public async Task ExecuteParcelCreateAsync( OrderBatchJobMessage message, CancellationToken cancellationToken = default) { if (string.IsNullOrWhiteSpace(message.PayloadJson)) { return OrderBatchActionExecuteResult.BusinessFail("小包创建消息体为空"); } var input = JsonConvert.DeserializeObject(message.PayloadJson); if (input == null) { return OrderBatchActionExecuteResult.BusinessFail("小包创建消息体无效"); } try { using var scope = scopeFactory.CreateScope(); var orderService = scope.ServiceProvider.GetRequiredService(); var output = await orderService.CreateParcelForBatchAsync( input, message.OperatorUserId, cancellationToken); return OrderBatchActionExecuteResult.Ok( createdOrderId: null, serviceNo: output.ServiceNo, clientNo: output.ClientNo, trackNo: output.TrackNo, labelUrl: output.LabelUrl); } catch (BusinessException ex) { return OrderBatchActionExecuteResult.BusinessFail(ex.Message); } catch (Exception ex) { return OrderBatchActionExecuteResult.SystemFail(ex.Message); } } }