using System.ComponentModel.DataAnnotations; using MiGu.Server.Persistence; namespace MiGu.Server.Wms; public abstract class WarehouseHistoryBase { public Guid Id { get; set; } = Guid.NewGuid(); public Guid? RelationId { get; set; } public string EventType { get; set; } = ""; public string BeforeJson { get; set; } = "{}"; public string AfterJson { get; set; } = "{}"; public Guid? ContainerId { get; set; } public string Operator { get; set; } = ""; public DateTimeOffset OperatedAt { get; set; } public string Source { get; set; } = "Manual"; public string Reason { get; set; } = ""; public string Remark { get; set; } = ""; public string Extend { get; set; } = "{}"; } public sealed class WarehouseArea : EntityBase { [MaxLength(64)] public string Code { get; set; } = ""; [MaxLength(128)] public string Name { get; set; } = ""; [MaxLength(64)] public string Type { get; set; } = "Storage"; public bool Enabled { get; set; } = true; public int SortOrder { get; set; } } public sealed class Storage : EntityBase { public Guid AreaId { get; set; } [MaxLength(64)] public string Code { get; set; } = ""; [MaxLength(128)] public string Name { get; set; } = ""; [MaxLength(64)] public string StorageType { get; set; } = "Storage"; [MaxLength(64)] public string SiteId { get; set; } = ""; public int Capacity { get; set; } public bool Enabled { get; set; } = true; } public sealed class Container : EntityBase { [MaxLength(64)] public string Code { get; set; } = ""; [MaxLength(128)] public string Name { get; set; } = ""; [MaxLength(64)] public string ContainerType { get; set; } = "Box"; [MaxLength(64)] public string Status { get; set; } = "Idle"; public bool Enabled { get; set; } = true; } public sealed class Material : EntityBase { [MaxLength(64)] public string Code { get; set; } = ""; [MaxLength(128)] public string Name { get; set; } = ""; [MaxLength(128)] public string Spec { get; set; } = ""; [MaxLength(32)] public string Unit { get; set; } = "pcs"; [MaxLength(64)] public string Category { get; set; } = ""; public bool Enabled { get; set; } = true; } public sealed class ContainerLocation : EntityBase { public Guid ContainerId { get; set; } [MaxLength(32)] public string LocationType { get; set; } = ContainerLocationTypes.Storage; [MaxLength(64)] public string LocationId { get; set; } = ""; [MaxLength(64)] public string LocationCode { get; set; } = ""; [MaxLength(128)] public string LocationName { get; set; } = ""; [MaxLength(32)] public string Status { get; set; } = ContainerLocationStatuses.Active; public DateTimeOffset EnteredAt { get; set; } } public sealed class ContainerMaterial : EntityBase { public Guid ContainerId { get; set; } public Guid MaterialId { get; set; } public decimal Quantity { get; set; } [MaxLength(64)] public string BatchNo { get; set; } = ""; [MaxLength(64)] public string SerialNo { get; set; } = ""; [MaxLength(32)] public string Status { get; set; } = ContainerMaterialStatuses.Loaded; public DateTimeOffset LoadedAt { get; set; } public DateTimeOffset? UnloadedAt { get; set; } } public sealed class ContainerLocationHistory : WarehouseHistoryBase { [MaxLength(32)] public string FromLocationType { get; set; } = ""; [MaxLength(64)] public string FromLocationId { get; set; } = ""; [MaxLength(32)] public string ToLocationType { get; set; } = ""; [MaxLength(64)] public string ToLocationId { get; set; } = ""; } public sealed class ContainerMaterialHistory : WarehouseHistoryBase { public Guid? MaterialId { get; set; } public decimal QuantityDelta { get; set; } } public static class ContainerLocationTypes { public const string Storage = "Storage"; public const string Car = "Car"; public static readonly HashSet All = new(StringComparer.OrdinalIgnoreCase) { Storage, Car }; } public static class ContainerLocationStatuses { public const string Active = "Active"; public const string Locked = "Locked"; public const string Exception = "Exception"; public static readonly HashSet All = new(StringComparer.OrdinalIgnoreCase) { Active, Locked, Exception }; } public static class ContainerMaterialStatuses { public const string Loaded = "Loaded"; public const string Unloaded = "Unloaded"; public const string Adjusted = "Adjusted"; public const string Frozen = "Frozen"; public static readonly HashSet All = new(StringComparer.OrdinalIgnoreCase) { Loaded, Unloaded, Adjusted, Frozen }; }