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; } }