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:
@@ -22,14 +22,34 @@ public sealed class WmsController : ControllerBase
|
||||
_transportTasks = transportTasks;
|
||||
}
|
||||
|
||||
[HttpGet("warehouses")]
|
||||
public Task<List<Warehouse>> Warehouses([FromQuery] string? q) => _service.Warehouses(q);
|
||||
|
||||
[HttpPost("warehouses")]
|
||||
public async Task<IActionResult> SaveWarehouse([FromBody] MasterDataRequest req) =>
|
||||
Ok(await _service.SaveWarehouse(req, User.ActorName()));
|
||||
|
||||
[HttpPut("warehouses/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateWarehouse(Guid id, [FromBody] MasterDataRequest req) =>
|
||||
Ok(await _service.SaveWarehouse(req with { Id = id }, User.ActorName()));
|
||||
|
||||
[HttpDelete("warehouses/{id:guid}")]
|
||||
public async Task<IActionResult> DeleteWarehouse(Guid id, [FromQuery] long? version)
|
||||
{
|
||||
await _service.DeleteEntity<Warehouse>(id, version, User.ActorName());
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpGet("areas")]
|
||||
public Task<List<WarehouseArea>> Areas([FromQuery] string? q) => _service.Areas(q);
|
||||
public Task<List<WarehouseArea>> Areas([FromQuery] string? q, [FromQuery] Guid? warehouseId) =>
|
||||
_service.Areas(q, warehouseId);
|
||||
|
||||
[HttpPost("areas")]
|
||||
public async Task<IActionResult> SaveArea([FromBody] MasterDataRequest req) => Ok(await _service.SaveArea(req, User.ActorName()));
|
||||
public async Task<IActionResult> SaveArea([FromBody] AreaRequest req) =>
|
||||
Ok(await _service.SaveArea(req, User.ActorName()));
|
||||
|
||||
[HttpPut("areas/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateArea(Guid id, [FromBody] MasterDataRequest req) =>
|
||||
public async Task<IActionResult> UpdateArea(Guid id, [FromBody] AreaRequest req) =>
|
||||
Ok(await _service.SaveArea(req with { Id = id }, User.ActorName()));
|
||||
|
||||
[HttpDelete("areas/{id:guid}")]
|
||||
@@ -40,10 +60,12 @@ public sealed class WmsController : ControllerBase
|
||||
}
|
||||
|
||||
[HttpGet("storages")]
|
||||
public Task<List<Storage>> Storages([FromQuery] string? q) => _service.Storages(q);
|
||||
public Task<List<Storage>> Storages([FromQuery] string? q, [FromQuery] Guid? areaId, [FromQuery] string? locationKind) =>
|
||||
_service.Storages(q, areaId, locationKind);
|
||||
|
||||
[HttpPost("storages")]
|
||||
public async Task<IActionResult> SaveStorage([FromBody] StorageRequest req) => Ok(await _service.SaveStorage(req, User.ActorName()));
|
||||
public async Task<IActionResult> SaveStorage([FromBody] StorageRequest req) =>
|
||||
Ok(await _service.SaveStorage(req, User.ActorName()));
|
||||
|
||||
[HttpPut("storages/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateStorage(Guid id, [FromBody] StorageRequest req) =>
|
||||
@@ -56,14 +78,35 @@ public sealed class WmsController : ControllerBase
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpPost("areas/{id:guid}/generate-bins")]
|
||||
public async Task<IActionResult> GenerateBins(Guid id, [FromBody] GenerateBinsRequest req) =>
|
||||
Ok(new { created = await _service.GenerateBins(id, req, User.ActorName()) });
|
||||
|
||||
[HttpPost("storages/{id:guid}/lock")]
|
||||
public async Task<IActionResult> LockStorage(Guid id, [FromQuery] long? version) =>
|
||||
Ok(await _service.SetStorageLock(id, true, version, User.ActorName()));
|
||||
|
||||
[HttpPost("storages/{id:guid}/unlock")]
|
||||
public async Task<IActionResult> UnlockStorage(Guid id, [FromQuery] long? version) =>
|
||||
Ok(await _service.SetStorageLock(id, false, version, User.ActorName()));
|
||||
|
||||
[HttpPost("storages/{id:guid}/enable")]
|
||||
public async Task<IActionResult> EnableStorage(Guid id, [FromQuery] long? version) =>
|
||||
Ok(await _service.SetStorageEnabled(id, true, version, User.ActorName()));
|
||||
|
||||
[HttpPost("storages/{id:guid}/disable")]
|
||||
public async Task<IActionResult> DisableStorage(Guid id, [FromQuery] long? version) =>
|
||||
Ok(await _service.SetStorageEnabled(id, false, version, User.ActorName()));
|
||||
|
||||
[HttpGet("containers")]
|
||||
public Task<List<Container>> Containers([FromQuery] string? q) => _service.Containers(q);
|
||||
|
||||
[HttpPost("containers")]
|
||||
public async Task<IActionResult> SaveContainer([FromBody] MasterDataRequest req) => Ok(await _service.SaveContainer(req, User.ActorName()));
|
||||
public async Task<IActionResult> SaveContainer([FromBody] ContainerRequest req) =>
|
||||
Ok(await _service.SaveContainer(req, User.ActorName()));
|
||||
|
||||
[HttpPut("containers/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateContainer(Guid id, [FromBody] MasterDataRequest req) =>
|
||||
public async Task<IActionResult> UpdateContainer(Guid id, [FromBody] ContainerRequest req) =>
|
||||
Ok(await _service.SaveContainer(req with { Id = id }, User.ActorName()));
|
||||
|
||||
[HttpDelete("containers/{id:guid}")]
|
||||
@@ -73,11 +116,35 @@ public sealed class WmsController : ControllerBase
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpGet("material-types")]
|
||||
public Task<List<MaterialType>> MaterialTypes([FromQuery] string? q) => _service.MaterialTypes(q);
|
||||
|
||||
[HttpPost("material-types")]
|
||||
public async Task<IActionResult> SaveMaterialType([FromBody] MaterialTypeRequest req) =>
|
||||
Ok(await _service.SaveMaterialType(req, User.ActorName()));
|
||||
|
||||
[HttpPut("material-types/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateMaterialType(Guid id, [FromBody] MaterialTypeRequest req) =>
|
||||
Ok(await _service.SaveMaterialType(req with { Id = id }, User.ActorName()));
|
||||
|
||||
[HttpDelete("material-types/{id:guid}")]
|
||||
public async Task<IActionResult> DeleteMaterialType(Guid id, [FromQuery] long? version)
|
||||
{
|
||||
await _service.DeleteEntity<MaterialType>(id, version, User.ActorName());
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpGet("materials")]
|
||||
public Task<List<Material>> Materials([FromQuery] string? q) => _service.Materials(q);
|
||||
public Task<List<Material>> Materials(
|
||||
[FromQuery] string? q,
|
||||
[FromQuery] string? lifecycle,
|
||||
[FromQuery] bool? onlyUnbound,
|
||||
[FromQuery] bool? onlyBound) =>
|
||||
_service.Materials(q, lifecycle, onlyUnbound, onlyBound);
|
||||
|
||||
[HttpPost("materials")]
|
||||
public async Task<IActionResult> SaveMaterial([FromBody] MaterialRequest req) => Ok(await _service.SaveMaterial(req, User.ActorName()));
|
||||
public async Task<IActionResult> SaveMaterial([FromBody] MaterialRequest req) =>
|
||||
Ok(await _service.SaveMaterial(req, User.ActorName()));
|
||||
|
||||
[HttpPut("materials/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateMaterial(Guid id, [FromBody] MaterialRequest req) =>
|
||||
@@ -90,6 +157,17 @@ public sealed class WmsController : ControllerBase
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpPost("materials/{id:guid}/archive")]
|
||||
public async Task<IActionResult> ArchiveMaterial(Guid id, [FromQuery] long? version) =>
|
||||
Ok(await _service.ArchiveMaterial(id, version, User.ActorName()));
|
||||
|
||||
[HttpPost("materials/purge-archived")]
|
||||
public async Task<IActionResult> PurgeArchivedMaterials([FromQuery] int take = 200)
|
||||
{
|
||||
await _service.PurgeArchivedMaterials(User.ActorName(), take);
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpGet("container-locations")]
|
||||
public Task<List<ContainerLocation>> ContainerLocations([FromQuery] string? locationType, [FromQuery] string? q) =>
|
||||
_service.ContainerLocations(locationType, q);
|
||||
@@ -110,23 +188,34 @@ public sealed class WmsController : ControllerBase
|
||||
}
|
||||
|
||||
[HttpGet("container-materials")]
|
||||
public Task<List<ContainerMaterial>> ContainerMaterials([FromQuery] string? q) => _service.ContainerMaterials(q);
|
||||
public Task<List<ContainerMaterial>> ContainerMaterials([FromQuery] string? q, [FromQuery] Guid? containerId) =>
|
||||
_service.ContainerMaterials(q, containerId);
|
||||
|
||||
[HttpPost("container-materials")]
|
||||
public async Task<IActionResult> SaveContainerMaterial([FromBody] ContainerMaterialRequest req) =>
|
||||
Ok(await _service.SaveContainerMaterial(req, User.ActorName()));
|
||||
public async Task<IActionResult> SaveContainerMaterial([FromBody] BindMaterialRequest req) =>
|
||||
Ok(await _service.BindMaterial(req, User.ActorName()));
|
||||
|
||||
[HttpPut("container-materials/{id:guid}")]
|
||||
public async Task<IActionResult> UpdateContainerMaterial(Guid id, [FromBody] ContainerMaterialRequest req) =>
|
||||
Ok(await _service.SaveContainerMaterial(req with { Id = id }, User.ActorName()));
|
||||
[HttpPost("container-materials/bind")]
|
||||
public async Task<IActionResult> BindMaterial([FromBody] BindMaterialRequest req) =>
|
||||
Ok(await _service.BindMaterial(req, User.ActorName()));
|
||||
|
||||
[HttpDelete("container-materials/{id:guid}")]
|
||||
public async Task<IActionResult> UnloadContainerMaterial(Guid id, [FromQuery] string? reason)
|
||||
public async Task<IActionResult> UnbindMaterial(Guid id, [FromQuery] string? reason, [FromQuery] bool archive = false)
|
||||
{
|
||||
await _service.UnloadMaterial(id, User.ActorName(), reason ?? "");
|
||||
await _service.UnbindMaterial(id, User.ActorName(), reason ?? "", archive);
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpGet("inventory/materials")]
|
||||
public Task<List<InventoryMaterialRow>> InventoryMaterials(
|
||||
[FromQuery] Guid? areaId, [FromQuery] Guid? storageId, [FromQuery] string? q) =>
|
||||
_service.InventoryMaterials(areaId, storageId, q);
|
||||
|
||||
[HttpGet("stock-events")]
|
||||
public Task<List<StockEvent>> StockEvents(
|
||||
[FromQuery] string? eventType, [FromQuery] Guid? materialId, [FromQuery] Guid? containerId) =>
|
||||
_service.StockEvents(eventType, materialId, containerId);
|
||||
|
||||
[HttpGet("container-location-history")]
|
||||
public Task<List<ContainerLocationHistory>> ContainerLocationHistory([FromQuery] Guid? containerId) =>
|
||||
_service.LocationHistory(containerId);
|
||||
|
||||
Reference in New Issue
Block a user