All checks were successful
Build and Deploy / deploy (push) Successful in 1m5s
Co-authored-by: Cursor <cursoragent@cursor.com>
719 lines
16 KiB
C#
719 lines
16 KiB
C#
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; }
|
||
|
||
/// <summary>
|
||
/// 出口申报要素。
|
||
/// </summary>
|
||
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; }
|
||
|
||
/// <summary>
|
||
/// 出口申报要素。
|
||
/// </summary>
|
||
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; }
|
||
|
||
/// <summary>
|
||
/// 收货状态:forecasted / received / completed;空或 all 表示全部。
|
||
/// </summary>
|
||
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<WarehouseInboundLineSaveInput> Lines { get; set; } = [];
|
||
}
|
||
|
||
public class WarehouseInboundSaveInput
|
||
{
|
||
public int Id { get; set; }
|
||
|
||
public int? CustomerId { get; set; }
|
||
|
||
[Required]
|
||
public int WarehouseId { get; set; }
|
||
|
||
/// <summary>唛头/快递单号,选填。</summary>
|
||
public string? MarkReference { get; set; }
|
||
|
||
public string InboundType { get; set; } = "normal";
|
||
|
||
public DateTime? ExpectedArrivalTime { get; set; }
|
||
|
||
public string? Remark { get; set; }
|
||
|
||
public List<WarehouseInboundBoxSaveInput> 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<WarehouseInboundLineOutput> Lines { get; set; } = [];
|
||
}
|
||
|
||
public class WarehouseInboundDetailOutput : WarehouseInboundOutput
|
||
{
|
||
public List<WarehouseInboundBoxOutput> 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<WarehouseInboundConfirmLineInput> Lines { get; set; } = [];
|
||
}
|
||
|
||
public class WarehouseInboundConfirmReceiveInput
|
||
{
|
||
[Required]
|
||
public int InboundNoticeId { get; set; }
|
||
|
||
public int? CustomerId { get; set; }
|
||
|
||
public List<WarehouseInboundConfirmBoxInput> Boxes { get; set; } = [];
|
||
}
|
||
|
||
public class WarehouseInboundSummaryOutput
|
||
{
|
||
public int Forecasted { get; set; }
|
||
|
||
public int Received { get; set; }
|
||
|
||
public int Completed { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打印库内 SKU 标签入参。
|
||
/// </summary>
|
||
public class WarehouseSkuPrintLabelInput
|
||
{
|
||
/// <summary>
|
||
/// SKU ID。
|
||
/// </summary>
|
||
[Required]
|
||
public int Id { get; set; }
|
||
|
||
/// <summary>
|
||
/// 客户 ID(管理端可选)。
|
||
/// </summary>
|
||
public int? CustomerId { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打印库内 SKU 标签出参。
|
||
/// </summary>
|
||
public class WarehouseSkuPrintLabelOutput
|
||
{
|
||
/// <summary>
|
||
/// 可打印的 PDF 公网地址。
|
||
/// </summary>
|
||
public string PrintUrl { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// SKU 编码。
|
||
/// </summary>
|
||
public string SkuCode { get; set; } = string.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打印入库箱唛标签入参。
|
||
/// </summary>
|
||
public class WarehouseInboundPrintLabelsInput
|
||
{
|
||
/// <summary>
|
||
/// 入库预报 ID。
|
||
/// </summary>
|
||
[Required]
|
||
public int Id { get; set; }
|
||
|
||
/// <summary>
|
||
/// 客户 ID(管理端可选)。
|
||
/// </summary>
|
||
public int? CustomerId { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打印入库箱唛标签出参(多箱合并为一个多页 PDF)。
|
||
/// </summary>
|
||
public class WarehouseInboundPrintLabelsOutput
|
||
{
|
||
/// <summary>
|
||
/// 可打印的 PDF 公网地址。
|
||
/// </summary>
|
||
public string PrintUrl { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 预报单号。
|
||
/// </summary>
|
||
public string NoticeNo { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// PDF 页数(通常等于箱数)。
|
||
/// </summary>
|
||
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; }
|
||
|
||
/// <summary>
|
||
/// 生命周期状态:inTransit / arrived / stored;空或 all 表示全部。
|
||
/// </summary>
|
||
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; }
|
||
|
||
/// <summary>商品图片 URL。</summary>
|
||
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; }
|
||
|
||
/// <summary>商品图片 URL。</summary>
|
||
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; }
|
||
|
||
/// <summary>商品总数量。</summary>
|
||
public int TotalQty { get; set; }
|
||
|
||
/// <summary>已冻结数量(订单绑定占用)。</summary>
|
||
public int FrozenQty { get; set; }
|
||
|
||
/// <summary>可用数量 = 总量 - 冻结。</summary>
|
||
public int AvailableQty { get; set; }
|
||
|
||
public List<WarehouseParcelItemOutput> 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<WarehouseParcelItemSaveInput> 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<WarehouseParcelPutawayItemInput> 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; }
|
||
|
||
/// <summary>
|
||
/// 流水类型:all / inbound / deduct;空视为 all。
|
||
/// </summary>
|
||
public string? MovementType { get; set; }
|
||
}
|
||
|
||
public class WarehouseInventoryHistoryOutput
|
||
{
|
||
/// <summary>inbound 入库 / deduct 扣减。</summary>
|
||
public string MovementType { get; set; } = string.Empty;
|
||
|
||
/// <summary>变动数量(入库为正,扣减为正数,前端按类型展示符号)。</summary>
|
||
public int Qty { get; set; }
|
||
|
||
/// <summary>关联单号:入库预报号 / 物流单号。</summary>
|
||
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
|
||
{
|
||
/// <summary>已废弃:到仓按仓库+快递单号定位包裹,客户归属取自包裹。</summary>
|
||
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; }
|
||
|
||
/// <summary>
|
||
/// 到仓包裹已绑定的代发物流单(bound 状态)。
|
||
/// </summary>
|
||
public List<WarehouseParcelArrivalLinkedOrderOutput> 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; }
|
||
}
|