using Microsoft.EntityFrameworkCore; using MiGu.Server.Persistence; namespace MiGu.Server.Wms; public sealed class WmsReferenceValidator { private readonly MiGuDbContext _db; public WmsReferenceValidator(MiGuDbContext db) { _db = db; } public async Task EnsureWarehouseAsync(Guid id) { if (!await _db.Warehouses.AnyAsync(x => x.Id == id)) throw new InvalidOperationException("仓库不存在"); } public async Task EnsureAreaAsync(Guid id) { if (!await _db.WarehouseAreas.AnyAsync(x => x.Id == id)) throw new InvalidOperationException("库区不存在"); } public async Task EnsureStorageAsync(Guid id) { if (!await _db.Storages.AnyAsync(x => x.Id == id)) throw new InvalidOperationException("库位不存在"); } public async Task EnsureContainerAsync(Guid id) { if (!await _db.Containers.AnyAsync(x => x.Id == id)) throw new InvalidOperationException("容器不存在"); } public async Task EnsureMaterialAsync(Guid id) { if (!await _db.Materials.AnyAsync(x => x.Id == id)) throw new InvalidOperationException("物料不存在"); } public async Task EnsureMaterialTypeCodeAsync(string typeCode) { if (!await _db.MaterialTypes.AnyAsync(x => x.Code == typeCode)) throw new InvalidOperationException("物料类型不存在"); } public async Task<(string Code, string Name)> ResolveLocationSnapshotAsync(string locationType, string locationId) { if (!ContainerLocationTypes.IsDefined(locationType)) throw new InvalidOperationException("位置类型无效"); if (string.IsNullOrWhiteSpace(locationId)) throw new InvalidOperationException("位置 ID 不能为空"); if (ContainerLocationTypes.EqualsString(ContainerLocationTypes.Storage, locationType)) { if (!Guid.TryParse(locationId, out var id)) throw new InvalidOperationException("库位 ID 格式无效"); var s = await _db.Storages.FirstOrDefaultAsync(x => x.Id == id); if (s == null) throw new InvalidOperationException("库位不存在"); return (s.Code, s.Name); } // 车辆来自现有调度/投影系统,首期不建库内外键,保留原始 ID 并作为快照展示。 return (locationId, locationId); } }