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();
}