admin/src/Oms.Application/Services/Orders/PickupOrderParcelBuilder.cs
zzh 8d1e3ab17f
All checks were successful
Build and Deploy / deploy (push) Successful in 1m47s
feat: 揽收方向与地址类型,补充迁移并清理已落地 SQL
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-13 23:34:55 +08:00

130 lines
4.9 KiB
C#

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;
/// <summary>
/// 揽收订单 → 小包创建入参组装。
/// </summary>
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
}
]
};
}
}