using Fake.Application; using Fake.Domain.Exceptions; using Microsoft.AspNetCore.Mvc; using Oms.Application.Dtos.Orders; using Oms.Application.Integrations.Itfx; using Oms.Application.Shared; namespace Oms.Application.Services.Orders; public partial class OrderService { private OrderDownstreamCredentialResolver OrderDownstreamCredentialResolver => LazyServiceProvider.GetRequiredService(); private IItfxForwardClient ItfxForwardClient => LazyServiceProvider.GetRequiredService(); /// /// 按订单 Id 从数据库组装 createOrderOne 请求体(预览,不调用下游)。 /// [HttpGet("/order/downstream-create-one-body")] public async Task GetDownstreamCreateOneBodyAsync([FromQuery] int id) { var (order, body) = await LoadDownstreamCreateOneContextAsync(id); var creds = await OrderDownstreamCredentialResolver.ResolveAsync(order); return new OrderDownstreamCreateOneBodyOutput { OrderId = order.Id, ServiceNo = order.ServiceNo, SupplierCode = creds.SupplierCode, Body = body }; } /// /// 按订单 Id 组装 createOrderOne 并转发至 itfx 下游。 /// [HttpPost("/order/downstream-forward-create-one")] public async Task DownstreamForwardCreateOneAsync([FromBody] OrderActionInput input) { var (order, body) = await LoadDownstreamCreateOneContextAsync(input.Id); if (string.IsNullOrWhiteSpace(order.ServiceNo)) { throw new BusinessException("订单运单号为空,无法预报下游"); } var creds = await OrderDownstreamCredentialResolver.ResolveAsync(order); var forward = await ItfxForwardClient.ForwardCreateOrderOneAsync( creds.SupplierCode, creds.AppKey, creds.AppSecret, body); return new OrderDownstreamForwardResult { Success = forward.Success, SupplierCode = creds.SupplierCode, Url = forward.Url, RequestJson = forward.RequestJson, StatusCode = forward.StatusCode, ResponseBody = forward.ResponseBody }; } private async Task<(Domain.OrdersAggregate.Entities.Order order, OrderParcelCreateInput body)> LoadDownstreamCreateOneContextAsync( int orderId) { var order = await GetOrderOrThrowAsync(orderId); var orderIds = new[] { order.Id }; var senders = await OrderRepository.GetSendersByOrderIdsAsync(orderIds); var recipients = await OrderRepository.GetRecipientsByOrderIdsAsync(orderIds); var declarations = await OrderRepository.GetDeclarationsByOrderIdsAsync(orderIds); var weights = await OrderRepository.GetWeightsByOrderIdsAsync(orderIds); var body = await OrderDownstreamCreateOneBodyBuilder.BuildAsync( order, senders.FirstOrDefault(), recipients.FirstOrDefault(), declarations, weights, CountryRepository); return (order, body); } }