using Oms.Application.Dtos.Orders; using Oms.Domain.OrdersAggregate.Consts; using Oms.Domain.OrdersAggregate.Entities; using Oms.Domain.SystemAggregate.Entities; namespace Oms.Application.Services.Orders; /// /// 揽收订单 → 小包创建入参组装。 /// public static class PickupOrderParcelBuilder { public static OrderParcelCreateInput Build( OrderPickupCreateInput input, CustomerSenderAddress senderAddress, WarehouseAddress warehouse, int customerId, string? senderCountryCode) { var cargoName = input.CargoName.Trim(); var weight = input.ActualWeight; var clientNo = string.IsNullOrWhiteSpace(input.ClientNo) ? $"PK{DateTime.Now:yyyyMMddHHmmss}{Random.Shared.Next(1000, 9999)}" : input.ClientNo.Trim(); var warehouseContact = string.IsNullOrWhiteSpace(warehouse.Recipient) ? warehouse.WarehouseName : warehouse.Recipient!.Trim(); var warehouseStreet = string.IsNullOrWhiteSpace(warehouse.ShippingAddress) ? warehouse.WarehouseName : warehouse.ShippingAddress!.Trim(); var isReverse = string.Equals( PickupDirectionCodes.NormalizeOrDefault(input.Direction), PickupDirectionCodes.Reverse, StringComparison.OrdinalIgnoreCase); // 正向:客户揽收地址 → 仓库;逆向:仓库 → 客户揽收地址 var sender = isReverse ? new OrderParcelSenderInput { SenderName = warehouseContact, Phone = warehouse.ContactPhone, CountryCode = "CN", StreetAddress1 = warehouseStreet, ZipCode = "000000" } : new OrderParcelSenderInput { SenderName = senderAddress.SenderName, Company = senderAddress.Company, Phone = senderAddress.Phone, TelePhone = senderAddress.TelePhone, Email = senderAddress.Email, CountryCode = senderCountryCode ?? "CN", Province = senderAddress.Province, City = senderAddress.City, ZipCode = senderAddress.ZipCode, StreetAddress1 = senderAddress.StreetAddress1, StreetAddress2 = senderAddress.StreetAddress2, StreetAddress3 = senderAddress.StreetAddress3, HouseNumber = senderAddress.HouseNumber }; var receiver = isReverse ? new OrderParcelReceiverInput { RecipientsName = senderAddress.SenderName, CompanyName = senderAddress.Company, Phone = senderAddress.Phone, TelePhone = senderAddress.TelePhone, Email = senderAddress.Email, CountryCode = senderCountryCode ?? "CN", Province = senderAddress.Province, City = senderAddress.City, ZipCode = senderAddress.ZipCode ?? "000000", StreetAddress1 = senderAddress.StreetAddress1, StreetAddress2 = senderAddress.StreetAddress2, StreetAddress3 = senderAddress.StreetAddress3, StreetNumber = senderAddress.HouseNumber } : new OrderParcelReceiverInput { RecipientsName = warehouseContact, Phone = warehouse.ContactPhone, CountryCode = "CN", ZipCode = "000000", StreetAddress1 = warehouseStreet }; return new OrderParcelCreateInput { RequestId = string.IsNullOrWhiteSpace(input.RequestId) ? null : input.RequestId.Trim(), ClientNo = clientNo, ProductCode = input.ProductCode.Trim(), WarehouseId = input.WarehouseId, CustomerId = customerId, Length = 1, Width = 1, Height = 1, ActualWeight = weight, CargoAttribute = string.IsNullOrWhiteSpace(input.CargoAttribute) ? CargoAttributeCodes.General : input.CargoAttribute.Trim(), DeclaredCurrency = "CNY", DeclaredSum = 1, Quantity = 1, InboundMethod = OrderInboundMethodCodes.DoorPickup, SenderAddressId = input.SenderAddressId, ExpectPickupTime = input.PickupTime, PickupDirection = PickupDirectionCodes.NormalizeOrDefault(input.Direction), Sender = sender, Receiver = receiver, Items = [ new OrderParcelItemInput { CnName = cargoName, EnName = cargoName, UnitPrice = 1, UnitWeight = weight, Quantity = 1, Amount = 1, Weight = weight } ] }; } }