WMS主数据结构升级,支持仓库/物料类型等新实体
后端:重构WmsController/WmsService,新增仓库、库区、货位、物料类型等实体及其增删改查接口,支持批量生成网格货位、货位/容器锁定与启用、物料归档与批量清理。数据库模型新增Warehouse、MaterialType、StockEvent等表,调整索引和字段,支持SQLite自动补表/补列及数据迁移,接口兼容旧语义。 前端:wms.ts/types/wms.ts全面适配新结构,升级API路由和类型定义。WarehouseManagementView.vue重构,支持仓库、物料类型管理、货位网格可视化、库存事件展示等。WmsEntityDialog.vue支持新字段编辑及联动选择。新增AreaFacadePanel.vue实现库区网格立面可视化。wmsOptions.ts新增相关常量及UI优化。 兼容性:后端自动迁移旧数据,接口兼容旧绑定语义,提升灵活性、可维护性和可视化能力。
This commit is contained in:
@@ -58,6 +58,131 @@ public static class PlatformPersistence
|
||||
await EnsureSimpleFieldsTableAsync(db);
|
||||
await EnsureUserDashboardShortcutsTableAsync(db);
|
||||
await EnsureWmsTransportSchemaAsync(db);
|
||||
await EnsureWmsStructureSchemaAsync(db);
|
||||
await MigrateWmsLegacyAsync(scope.ServiceProvider);
|
||||
}
|
||||
|
||||
private static async Task MigrateWmsLegacyAsync(IServiceProvider sp)
|
||||
{
|
||||
try
|
||||
{
|
||||
var wms = sp.GetRequiredService<WmsService>();
|
||||
await wms.MigrateLegacyAsync("system");
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 首次建库或缺列时忽略,后续请求可再触发
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>补建仓库/物料类型/库存事件及结构扩展列(幂等,SQLite)。</summary>
|
||||
private static async Task EnsureWmsStructureSchemaAsync(PlatformDbContext db)
|
||||
{
|
||||
if (!db.Database.IsSqlite()) return;
|
||||
|
||||
await db.Database.ExecuteSqlRawAsync("""
|
||||
CREATE TABLE IF NOT EXISTS wms_warehouses (
|
||||
Id TEXT NOT NULL CONSTRAINT PK_wms_warehouses PRIMARY KEY,
|
||||
Code TEXT NOT NULL,
|
||||
Name TEXT NOT NULL,
|
||||
Type TEXT NOT NULL,
|
||||
Enabled INTEGER NOT NULL,
|
||||
SortOrder INTEGER NOT NULL,
|
||||
CreatedAt TEXT NOT NULL,
|
||||
UpdatedAt TEXT NOT NULL,
|
||||
IsDeleted INTEGER NOT NULL,
|
||||
DeletedAt TEXT,
|
||||
DeletedBy TEXT NOT NULL DEFAULT '',
|
||||
Version INTEGER NOT NULL,
|
||||
IsLock INTEGER NOT NULL,
|
||||
CreatedBy TEXT NOT NULL DEFAULT '',
|
||||
UpdatedBy TEXT NOT NULL DEFAULT '',
|
||||
Remark TEXT NOT NULL DEFAULT '',
|
||||
Extend TEXT NOT NULL DEFAULT '{{}}'
|
||||
);
|
||||
""");
|
||||
await db.Database.ExecuteSqlRawAsync("CREATE UNIQUE INDEX IF NOT EXISTS IX_wms_warehouses_Code ON wms_warehouses (Code);");
|
||||
|
||||
await db.Database.ExecuteSqlRawAsync("""
|
||||
CREATE TABLE IF NOT EXISTS wms_material_types (
|
||||
Id TEXT NOT NULL CONSTRAINT PK_wms_material_types PRIMARY KEY,
|
||||
Code TEXT NOT NULL,
|
||||
Name TEXT NOT NULL,
|
||||
Spec TEXT NOT NULL DEFAULT '',
|
||||
Unit TEXT NOT NULL DEFAULT 'pcs',
|
||||
Category TEXT NOT NULL DEFAULT '',
|
||||
BarcodePrefix TEXT NOT NULL DEFAULT '',
|
||||
Enabled INTEGER NOT NULL,
|
||||
CreatedAt TEXT NOT NULL,
|
||||
UpdatedAt TEXT NOT NULL,
|
||||
IsDeleted INTEGER NOT NULL,
|
||||
DeletedAt TEXT,
|
||||
DeletedBy TEXT NOT NULL DEFAULT '',
|
||||
Version INTEGER NOT NULL,
|
||||
IsLock INTEGER NOT NULL,
|
||||
CreatedBy TEXT NOT NULL DEFAULT '',
|
||||
UpdatedBy TEXT NOT NULL DEFAULT '',
|
||||
Remark TEXT NOT NULL DEFAULT '',
|
||||
Extend TEXT NOT NULL DEFAULT '{{}}'
|
||||
);
|
||||
""");
|
||||
await db.Database.ExecuteSqlRawAsync("CREATE UNIQUE INDEX IF NOT EXISTS IX_wms_material_types_Code ON wms_material_types (Code);");
|
||||
|
||||
await db.Database.ExecuteSqlRawAsync("""
|
||||
CREATE TABLE IF NOT EXISTS wms_stock_events (
|
||||
Id TEXT NOT NULL CONSTRAINT PK_wms_stock_events PRIMARY KEY,
|
||||
EventType TEXT NOT NULL,
|
||||
MaterialId TEXT,
|
||||
MaterialCode TEXT NOT NULL DEFAULT '',
|
||||
MaterialName TEXT NOT NULL DEFAULT '',
|
||||
MaterialBarcode TEXT NOT NULL DEFAULT '',
|
||||
MaterialTypeCode TEXT NOT NULL DEFAULT '',
|
||||
ContainerId TEXT,
|
||||
ContainerCode TEXT NOT NULL DEFAULT '',
|
||||
ContainerName TEXT NOT NULL DEFAULT '',
|
||||
StorageId TEXT,
|
||||
StorageCode TEXT NOT NULL DEFAULT '',
|
||||
StorageName TEXT NOT NULL DEFAULT '',
|
||||
AreaCode TEXT NOT NULL DEFAULT '',
|
||||
FromStorageId TEXT,
|
||||
FromStorageCode TEXT NOT NULL DEFAULT '',
|
||||
FromStorageName TEXT NOT NULL DEFAULT '',
|
||||
ToStorageId TEXT,
|
||||
ToStorageCode TEXT NOT NULL DEFAULT '',
|
||||
ToStorageName TEXT NOT NULL DEFAULT '',
|
||||
RefType TEXT NOT NULL DEFAULT 'Manual',
|
||||
RefId TEXT,
|
||||
RefCode TEXT NOT NULL DEFAULT '',
|
||||
Operator TEXT NOT NULL DEFAULT '',
|
||||
OperatedAt TEXT NOT NULL,
|
||||
Reason TEXT NOT NULL DEFAULT ''
|
||||
);
|
||||
""");
|
||||
await db.Database.ExecuteSqlRawAsync("CREATE INDEX IF NOT EXISTS IX_wms_stock_events_OperatedAt ON wms_stock_events (OperatedAt);");
|
||||
|
||||
await EnsureSqliteColumnAsync(db, "wms_areas", "WarehouseId", "TEXT NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'");
|
||||
await EnsureSqliteColumnAsync(db, "wms_areas", "LayoutMode", "TEXT NOT NULL DEFAULT 'Flat'");
|
||||
await EnsureSqliteColumnAsync(db, "wms_areas", "State", "TEXT NOT NULL DEFAULT 'Default'");
|
||||
|
||||
await EnsureSqliteColumnAsync(db, "wms_storages", "LocationKind", "TEXT NOT NULL DEFAULT 'Station'");
|
||||
await EnsureSqliteColumnAsync(db, "wms_storages", "ColumnNo", "INTEGER NOT NULL DEFAULT 0");
|
||||
await EnsureSqliteColumnAsync(db, "wms_storages", "LevelNo", "INTEGER NOT NULL DEFAULT 1");
|
||||
await EnsureSqliteColumnAsync(db, "wms_storages", "DepthNo", "INTEGER NOT NULL DEFAULT 1");
|
||||
await EnsureSqliteColumnAsync(db, "wms_storages", "SiteCode", "TEXT NOT NULL DEFAULT ''");
|
||||
await EnsureSqliteColumnAsync(db, "wms_storages", "Barcode", "TEXT NOT NULL DEFAULT ''");
|
||||
|
||||
await EnsureSqliteColumnAsync(db, "wms_containers", "AreaId", "TEXT");
|
||||
await EnsureSqliteColumnAsync(db, "wms_containers", "Barcode", "TEXT NOT NULL DEFAULT ''");
|
||||
await EnsureSqliteColumnAsync(db, "wms_containers", "Length", "REAL NOT NULL DEFAULT 0");
|
||||
await EnsureSqliteColumnAsync(db, "wms_containers", "Width", "REAL NOT NULL DEFAULT 0");
|
||||
await EnsureSqliteColumnAsync(db, "wms_containers", "Height", "REAL NOT NULL DEFAULT 0");
|
||||
|
||||
await EnsureSqliteColumnAsync(db, "wms_materials", "TypeCode", "TEXT NOT NULL DEFAULT ''");
|
||||
await EnsureSqliteColumnAsync(db, "wms_materials", "Barcode", "TEXT NOT NULL DEFAULT ''");
|
||||
await EnsureSqliteColumnAsync(db, "wms_materials", "LifecycleStatus", "TEXT NOT NULL DEFAULT 'Active'");
|
||||
await EnsureSqliteColumnAsync(db, "wms_materials", "UnboundAt", "TEXT");
|
||||
|
||||
await EnsureSqliteColumnAsync(db, "wms_container_materials", "BoundAt", "TEXT NOT NULL DEFAULT ''");
|
||||
}
|
||||
|
||||
/// <summary>为已存在的数据库补建 simple_fields 表(幂等)。</summary>
|
||||
|
||||
Reference in New Issue
Block a user