using System.ComponentModel.DataAnnotations;
namespace Oms.Application.Dtos.Warehouse;
public class WarehousePageInput
{
public int Page { get; set; } = 1;
public int PageSize { get; set; } = 30;
public int? CustomerId { get; set; }
}
// --- SKU ---
public class WarehouseSkuListInput : WarehousePageInput
{
public string? Keyword { get; set; }
}
public class WarehouseSkuOutput
{
public int Id { get; set; }
public int CustomerId { get; set; }
public string? CustomerName { get; set; }
public string? CustomerCode { get; set; }
public string SkuCode { get; set; } = string.Empty;
public string SkuName { get; set; } = string.Empty;
public string? SkuNameEn { get; set; }
public string? SkuImageUrl { get; set; }
public decimal? UnitPrice { get; set; }
public string? ExHsCode { get; set; }
public string? ImHsCode { get; set; }
///
/// 出口申报要素。
///
public string? DeclareElement { get; set; }
public decimal? WeightG { get; set; }
public decimal? LengthCm { get; set; }
public decimal? WidthCm { get; set; }
public decimal? HeightCm { get; set; }
public string? Remark { get; set; }
public int? TotalQty { get; set; }
public DateTime CreateTime { get; set; }
public DateTime? UpdateTime { get; set; }
}
public class WarehouseSkuSaveInput
{
public int Id { get; set; }
public int? CustomerId { get; set; }
[Required]
public string SkuCode { get; set; } = string.Empty;
[Required]
public string SkuName { get; set; } = string.Empty;
public string? SkuNameEn { get; set; }
public string? SkuImageUrl { get; set; }
public decimal? UnitPrice { get; set; }
public string? ExHsCode { get; set; }
public string? ImHsCode { get; set; }
///
/// 出口申报要素。
///
public string? DeclareElement { get; set; }
public decimal? WeightG { get; set; }
public decimal? LengthCm { get; set; }
public decimal? WidthCm { get; set; }
public decimal? HeightCm { get; set; }
public string? Remark { get; set; }
}
public class WarehouseSkuBindMappingInput
{
public int? CustomerId { get; set; }
[Required]
public int StoreId { get; set; }
[Required]
public string PlatformSku { get; set; } = string.Empty;
[Required]
public int SkuId { get; set; }
}
public class WarehouseSkuMappingOutput
{
public int Id { get; set; }
public int StoreId { get; set; }
public string PlatformSku { get; set; } = string.Empty;
public int SkuId { get; set; }
public string SkuCode { get; set; } = string.Empty;
}
// --- Bin Location ---
public class WarehouseBinLocationListInput
{
public int WarehouseId { get; set; }
public string? Keyword { get; set; }
public bool? IsEnabled { get; set; }
}
public class WarehouseBinLocationOutput
{
public int Id { get; set; }
public int WarehouseId { get; set; }
public string BinCode { get; set; } = string.Empty;
public string? BinName { get; set; }
public string? ZoneCode { get; set; }
public bool IsEnabled { get; set; }
public string? Remark { get; set; }
}
public class WarehouseBinLocationSaveInput
{
public int Id { get; set; }
[Required]
public int WarehouseId { get; set; }
[Required]
public string BinCode { get; set; } = string.Empty;
public string? BinName { get; set; }
public string? ZoneCode { get; set; }
public bool IsEnabled { get; set; } = true;
public string? Remark { get; set; }
}
// --- Inbound ---
public class WarehouseInboundListInput : WarehousePageInput
{
public int? WarehouseId { get; set; }
///
/// 收货状态:forecasted / received / completed;空或 all 表示全部。
///
public string? ReceiptStatus { get; set; }
public string? Keyword { get; set; }
}
public class WarehouseInboundOutput
{
public int Id { get; set; }
public int CustomerId { get; set; }
public string? CustomerName { get; set; }
public string? CustomerCode { get; set; }
public int WarehouseId { get; set; }
public string NoticeNo { get; set; } = string.Empty;
public string? MarkReference { get; set; }
public string InboundType { get; set; } = string.Empty;
public string ReceiptStatus { get; set; } = string.Empty;
public DateTime? ExpectedArrivalTime { get; set; }
public DateTime? ActualArrivalTime { get; set; }
public string? Remark { get; set; }
public int BoxCount { get; set; }
public int PlannedQty { get; set; }
public DateTime CreateTime { get; set; }
}
public class WarehouseInboundLineSaveInput
{
public int SkuId { get; set; }
public string SkuCode { get; set; } = string.Empty;
public int PlannedQty { get; set; }
}
public class WarehouseInboundBoxSaveInput
{
public string BoxSeqNo { get; set; } = string.Empty;
public string? MarkBoxNo { get; set; }
public decimal? WeightG { get; set; }
public decimal? LengthCm { get; set; }
public decimal? WidthCm { get; set; }
public decimal? HeightCm { get; set; }
public List Lines { get; set; } = [];
}
public class WarehouseInboundSaveInput
{
public int Id { get; set; }
public int? CustomerId { get; set; }
[Required]
public int WarehouseId { get; set; }
/// 唛头/快递单号,选填。
public string? MarkReference { get; set; }
public string InboundType { get; set; } = "normal";
public DateTime? ExpectedArrivalTime { get; set; }
public string? Remark { get; set; }
public List Boxes { get; set; } = [];
}
public class WarehouseInboundLineOutput
{
public int Id { get; set; }
public int SkuId { get; set; }
public string SkuCode { get; set; } = string.Empty;
public int PlannedQty { get; set; }
public int? ReceivedQty { get; set; }
public int? BinLocationId { get; set; }
}
public class WarehouseInboundBoxOutput
{
public int Id { get; set; }
public string BoxSeqNo { get; set; } = string.Empty;
public string? MarkBoxNo { get; set; }
public decimal? WeightG { get; set; }
public decimal? LengthCm { get; set; }
public decimal? WidthCm { get; set; }
public decimal? HeightCm { get; set; }
public bool IsReceived { get; set; }
public List Lines { get; set; } = [];
}
public class WarehouseInboundDetailOutput : WarehouseInboundOutput
{
public List Boxes { get; set; } = [];
}
public class WarehouseInboundConfirmLineInput
{
public int LineId { get; set; }
public int ReceivedQty { get; set; }
public int BinLocationId { get; set; }
}
public class WarehouseInboundConfirmBoxInput
{
public int BoxId { get; set; }
public List Lines { get; set; } = [];
}
public class WarehouseInboundConfirmReceiveInput
{
[Required]
public int InboundNoticeId { get; set; }
public int? CustomerId { get; set; }
public List Boxes { get; set; } = [];
}
public class WarehouseInboundSummaryOutput
{
public int Forecasted { get; set; }
public int Received { get; set; }
public int Completed { get; set; }
}
///
/// 打印库内 SKU 标签入参。
///
public class WarehouseSkuPrintLabelInput
{
///
/// SKU ID。
///
[Required]
public int Id { get; set; }
///
/// 客户 ID(管理端可选)。
///
public int? CustomerId { get; set; }
}
///
/// 打印库内 SKU 标签出参。
///
public class WarehouseSkuPrintLabelOutput
{
///
/// 可打印的 PDF 公网地址。
///
public string PrintUrl { get; set; } = string.Empty;
///
/// SKU 编码。
///
public string SkuCode { get; set; } = string.Empty;
}
///
/// 打印入库箱唛标签入参。
///
public class WarehouseInboundPrintLabelsInput
{
///
/// 入库预报 ID。
///
[Required]
public int Id { get; set; }
///
/// 客户 ID(管理端可选)。
///
public int? CustomerId { get; set; }
}
///
/// 打印入库箱唛标签出参(多箱合并为一个多页 PDF)。
///
public class WarehouseInboundPrintLabelsOutput
{
///
/// 可打印的 PDF 公网地址。
///
public string PrintUrl { get; set; } = string.Empty;
///
/// 预报单号。
///
public string NoticeNo { get; set; } = string.Empty;
///
/// PDF 页数(通常等于箱数)。
///
public int PageCount { get; set; }
}
public class WarehouseParcelSummaryOutput
{
public int InTransit { get; set; }
public int Arrived { get; set; }
public int Stored { get; set; }
}
// --- Parcel ---
public class WarehouseParcelListInput : WarehousePageInput
{
public int? WarehouseId { get; set; }
///
/// 生命周期状态:inTransit / arrived / stored;空或 all 表示全部。
///
public string? LifecycleStatus { get; set; }
public string? Keyword { get; set; }
}
public class WarehouseParcelItemSaveInput
{
public int Id { get; set; }
public string? ProductName { get; set; }
public string? AttributeText { get; set; }
/// 商品图片 URL。
public string? ImageUrl { get; set; }
public int Quantity { get; set; }
public string? Remark { get; set; }
}
public class WarehouseParcelItemOutput
{
public int Id { get; set; }
public string? ProductName { get; set; }
public string? AttributeText { get; set; }
/// 商品图片 URL。
public string? ImageUrl { get; set; }
public int Quantity { get; set; }
public int FrozenQty { get; set; }
public int AvailableQty { get; set; }
public int? SkuId { get; set; }
public string? SkuCode { get; set; }
public int? BinLocationId { get; set; }
public string? Remark { get; set; }
}
public class WarehouseParcelOutput
{
public int Id { get; set; }
public int CustomerId { get; set; }
public string? CustomerName { get; set; }
public string? CustomerCode { get; set; }
public int WarehouseId { get; set; }
public string TrackingNo { get; set; } = string.Empty;
public string? CarrierName { get; set; }
public string LifecycleStatus { get; set; } = string.Empty;
public DateTime? ArrivalTime { get; set; }
public string? Remark { get; set; }
/// 商品总数量。
public int TotalQty { get; set; }
/// 已冻结数量(订单绑定占用)。
public int FrozenQty { get; set; }
/// 可用数量 = 总量 - 冻结。
public int AvailableQty { get; set; }
public List Items { get; set; } = [];
public DateTime CreateTime { get; set; }
}
public class WarehouseParcelSaveInput
{
public int Id { get; set; }
public int? CustomerId { get; set; }
[Required]
public int WarehouseId { get; set; }
[Required]
public string TrackingNo { get; set; } = string.Empty;
public string? CarrierName { get; set; }
public string LifecycleStatus { get; set; } = "inTransit";
public string? Remark { get; set; }
public List Items { get; set; } = [];
}
public class WarehouseParcelPutawayItemInput
{
public int ItemId { get; set; }
public int SkuId { get; set; }
public int BinLocationId { get; set; }
}
public class WarehouseParcelPutawayInput
{
[Required]
public int ParcelId { get; set; }
public int? CustomerId { get; set; }
public List Items { get; set; } = [];
}
// --- Inventory ---
public class WarehouseInventoryListInput : WarehousePageInput
{
public int? WarehouseId { get; set; }
public string? Keyword { get; set; }
}
public class WarehouseInventoryOutput
{
public int CustomerId { get; set; }
public string? CustomerName { get; set; }
public string? CustomerCode { get; set; }
public int SkuId { get; set; }
public string SkuCode { get; set; } = string.Empty;
public string SkuName { get; set; } = string.Empty;
public int WarehouseId { get; set; }
public int TotalQty { get; set; }
public int FrozenQty { get; set; }
public int AvailableQty { get; set; }
public int BinCount { get; set; }
}
public class WarehouseInventoryBinDetailOutput
{
public int Id { get; set; }
public int BinLocationId { get; set; }
public string BinCode { get; set; } = string.Empty;
public string? BinName { get; set; }
public int Qty { get; set; }
public int FrozenQty { get; set; }
public int AvailableQty { get; set; }
}
public class WarehouseInventoryRelocateInput
{
public int? CustomerId { get; set; }
[Required]
public int WarehouseId { get; set; }
[Required]
public int SkuId { get; set; }
[Required]
public int SourceBinLocationId { get; set; }
[Required]
public int TargetBinLocationId { get; set; }
[Range(1, int.MaxValue)]
public int Qty { get; set; }
}
public class WarehouseInventoryHistoryInput : WarehousePageInput
{
[Required]
public int SkuId { get; set; }
[Required]
public int WarehouseId { get; set; }
///
/// 流水类型:all / inbound / deduct;空视为 all。
///
public string? MovementType { get; set; }
}
public class WarehouseInventoryHistoryOutput
{
/// inbound 入库 / deduct 扣减。
public string MovementType { get; set; } = string.Empty;
/// 变动数量(入库为正,扣减为正数,前端按类型展示符号)。
public int Qty { get; set; }
/// 关联单号:入库预报号 / 物流单号。
public string? RefNo { get; set; }
public string? Remark { get; set; }
public DateTime OccurredAt { get; set; }
}
// --- Parcel arrival(快递到仓)---
public class WarehouseParcelArrivalListInput : WarehousePageInput
{
public int? WarehouseId { get; set; }
public string? Keyword { get; set; }
}
public class WarehouseParcelArrivalCreateInput
{
/// 已废弃:到仓按仓库+快递单号定位包裹,客户归属取自包裹。
public int? CustomerId { get; set; }
[Required]
public int WarehouseId { get; set; }
[Required]
public string TrackingNo { get; set; } = string.Empty;
}
public class WarehouseParcelArrivalOutput
{
public int Id { get; set; }
public int CustomerId { get; set; }
public int WarehouseId { get; set; }
public string? WarehouseName { get; set; }
public int? ParcelId { get; set; }
public string TrackingNo { get; set; } = string.Empty;
public DateTime CreateTime { get; set; }
public int CreateUserId { get; set; }
public string? CreateBy { get; set; }
///
/// 到仓包裹已绑定的代发物流单(bound 状态)。
///
public List LinkedOrders { get; set; } = [];
}
public class WarehouseParcelArrivalLinkedOrderOutput
{
public int OrderId { get; set; }
public string ServiceNo { get; set; } = string.Empty;
public string? ClientNo { get; set; }
public string? FulfillProgress { get; set; }
}