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