using Admin.NET.Plugin.AiDOP.Entity;
using Admin.NET.Plugin.AiDOP.Infrastructure;
using SqlSugar;
namespace Admin.NET.Plugin.AiDOP.Controllers;
///
/// 业务事实字典:KpiMaster 公式中 $FactCode 的引用来源。
///
[ApiController]
[Route("api/[controller]")]
[AllowAnonymous]
[NonUnify]
public class AdoSmartOpsBusinessFactController : ControllerBase
{
private readonly ISqlSugarClient _db;
public AdoSmartOpsBusinessFactController(ISqlSugarClient db)
{
_db = db;
}
/// 分页 / 按条件查询
[HttpGet("page")]
public async Task Page(
[FromQuery] int page = 1,
[FromQuery] int size = 50,
[FromQuery] string? keyword = null,
[FromQuery] string? moduleCode = null)
{
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
var q = _db.Queryable().Where(x => x.TenantId == tenantId);
if (!string.IsNullOrWhiteSpace(moduleCode))
q = q.Where(x => x.ModuleCode == moduleCode);
if (!string.IsNullOrWhiteSpace(keyword))
q = q.Where(x => x.FactCode.Contains(keyword) || x.FactName.Contains(keyword));
RefAsync total = 0;
var rows = await q.OrderBy(x => x.ModuleCode).OrderBy(x => x.SortNo).ToPageListAsync(page, size, total);
return Ok(new { total = total.Value, rows });
}
/// 下拉选择器精简列表(公式编辑器 $ 补全用)
[HttpGet("picker")]
public async Task Picker([FromQuery] string? moduleCode = null)
{
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
var q = _db.Queryable()
.Where(x => x.TenantId == tenantId && x.IsEnabled);
if (!string.IsNullOrWhiteSpace(moduleCode))
q = q.Where(x => x.ModuleCode == moduleCode || x.ModuleCode == "COMMON" || x.ModuleCode == null);
var list = await q.OrderBy(x => x.ModuleCode).OrderBy(x => x.SortNo)
.Select(x => new { x.FactCode, x.FactName, x.ModuleCode, x.Unit, x.AggType }).ToListAsync();
return Ok(list);
}
/// 单条详情
[HttpGet("{id:long}")]
public async Task Detail(long id)
{
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
var row = await _db.Queryable()
.Where(x => x.Id == id && x.TenantId == tenantId).FirstAsync();
if (row == null) return NotFound(new { message = "事实不存在" });
return Ok(row);
}
/// 新增
[HttpPost("add")]
public async Task Add([FromBody] AdoSmartOpsBusinessFact input)
{
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
if (string.IsNullOrWhiteSpace(input.FactCode) || string.IsNullOrWhiteSpace(input.FactName))
return BadRequest(new { message = "FactCode / FactName 必填" });
var dup = await _db.Queryable()
.Where(x => x.TenantId == tenantId && x.FactCode == input.FactCode).AnyAsync();
if (dup) return BadRequest(new { message = $"FactCode '{input.FactCode}' 已存在" });
input.TenantId = tenantId;
input.CreatedAt = DateTime.Now;
input.UpdatedAt = DateTime.Now;
await _db.Insertable(input).ExecuteCommandAsync();
return Ok(new { id = input.Id });
}
/// 更新
[HttpPost("update")]
public async Task Update([FromBody] AdoSmartOpsBusinessFact input)
{
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
var row = await _db.Queryable()
.Where(x => x.Id == input.Id && x.TenantId == tenantId).FirstAsync();
if (row == null) return NotFound(new { message = "事实不存在" });
row.FactName = input.FactName ?? row.FactName;
row.ModuleCode = input.ModuleCode;
row.Unit = input.Unit;
row.AggType = input.AggType;
row.DataSource = input.DataSource;
row.Description = input.Description;
row.IsEnabled = input.IsEnabled;
row.SortNo = input.SortNo;
row.UpdatedAt = DateTime.Now;
await _db.Updateable(row).ExecuteCommandAsync();
return Ok(new { ok = true });
}
/// 删除(软删?此处做硬删;如有引用将在下批检查)
[HttpPost("delete")]
public async Task Delete([FromBody] DeleteIn input)
{
var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
await _db.Deleteable()
.Where(x => x.Id == input.Id && x.TenantId == tenantId).ExecuteCommandAsync();
return Ok(new { ok = true });
}
public sealed class DeleteIn
{
public long Id { get; set; }
}
}