using Admin.NET.Plugin.AiDOP.Dto.S8; using Admin.NET.Plugin.AiDOP.Entity.S8; namespace Admin.NET.Plugin.AiDOP.Service.S8; /// /// S8 业务维度元数据只读服务(S_STAGE / ORDER_FLOW)。 /// TenantId=0 / FactoryId=0 表示全局基线,与 tenant/factory 数据并存。 /// public class S8DimensionService : ITransient { private readonly SqlSugarRepository _dimRep; private readonly SqlSugarRepository _nodeRep; public S8DimensionService( SqlSugarRepository dimRep, SqlSugarRepository nodeRep) { _dimRep = dimRep; _nodeRep = nodeRep; } public async Task> GetDimensionsAsync(long tenantId, long factoryId) { var rows = await _dimRep.AsQueryable() .Where(x => (x.TenantId == 0 || x.TenantId == tenantId) && (x.FactoryId == 0 || x.FactoryId == factoryId) && x.Enabled) .OrderBy(x => x.SortNo) .OrderBy(x => x.Id) .ToListAsync(); return rows.Select(x => new AdoS8DimensionDto { DimensionCode = x.DimensionCode, DimensionName = x.DimensionName, Enabled = x.Enabled, SortNo = x.SortNo, Remark = x.Remark, }).ToList(); } public async Task> GetDimensionNodesAsync(long tenantId, long factoryId, string? dimensionCode) { if (string.IsNullOrWhiteSpace(dimensionCode)) return new List(); var nodes = await _nodeRep.AsQueryable() .Where(x => (x.TenantId == 0 || x.TenantId == tenantId) && (x.FactoryId == 0 || x.FactoryId == factoryId) && x.DimensionCode == dimensionCode && x.Enabled) .OrderBy(x => x.SortNo) .OrderBy(x => x.Id) .ToListAsync(); return BuildTree(nodes, null); } private static List BuildTree(List nodes, long? parentId) => nodes .Where(n => n.ParentId == parentId) .Select(n => new AdoS8DimensionNodeDto { Id = n.Id, DimensionCode = n.DimensionCode, NodeCode = n.NodeCode, NodeName = n.NodeName, ParentId = n.ParentId, Level = n.Level, Path = n.Path, IsSelectable = n.IsSelectable, Disabled = !n.IsSelectable, Enabled = n.Enabled, SortNo = n.SortNo, Remark = n.Remark, Children = BuildTree(nodes, n.Id), }) .ToList(); }