using System.Text.Json; namespace Admin.NET.Plugin.AiDOP.Infrastructure; /// 业务动作运行日志查询 API。 [ApiDescriptionSettings(Order = 120, Description = "业务动作运行日志")] [Route("api/Aidop")] [AllowAnonymous] [NonUnify] public class AidopActionRunLogQueryService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; private readonly UserManager _userManager; public AidopActionRunLogQueryService(ISqlSugarClient db, UserManager userManager) { _db = db; _userManager = userManager; } [DisplayName("业务动作运行日志列表")] [HttpGet("action-run-log/list")] public async Task GetList([FromQuery] AidopActionRunLogListInput input) { var tenantId = _userManager.TenantId > 0 ? _userManager.TenantId : AidopTenantHelper.Resolve(App.HttpContext); var page = input.Page <= 0 ? 1 : input.Page; var pageSize = input.PageSize <= 0 ? 20 : Math.Min(input.PageSize, 100); var offset = (page - 1) * pageSize; var pars = new List { new("@TenantId", tenantId) }; var where = new List { "tenant_id = @TenantId" }; if (!string.IsNullOrWhiteSpace(input.ActionCode)) { where.Add("action_code LIKE @ActionCode"); pars.Add(new SugarParameter("@ActionCode", $"%{input.ActionCode.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.Status)) { where.Add("status = @Status"); pars.Add(new SugarParameter("@Status", input.Status.Trim().ToUpperInvariant())); } if (!string.IsNullOrWhiteSpace(input.BizNo)) { where.Add("biz_no LIKE @BizNo"); pars.Add(new SugarParameter("@BizNo", $"%{input.BizNo.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.StartTimeFrom)) { where.Add("start_time >= @StartFrom"); pars.Add(new SugarParameter("@StartFrom", input.StartTimeFrom.Trim())); } if (!string.IsNullOrWhiteSpace(input.StartTimeTo)) { where.Add("start_time <= @StartTo"); pars.Add(new SugarParameter("@StartTo", input.StartTimeTo.Trim())); } var whereSql = string.Join(" AND ", where); var total = await _db.Ado.GetIntAsync( $"SELECT COUNT(*) FROM aidop_action_run_log WHERE {whereSql}", pars); var list = await _db.Ado.SqlQueryAsync( $""" SELECT id AS Id, tenant_id AS TenantId, action_code AS ActionCode, biz_type AS BizType, biz_id AS BizId, biz_no AS BizNo, status AS Status, message AS Message, detail_json AS DetailJson, start_time AS StartTime, end_time AS EndTime, create_time AS CreateTime FROM aidop_action_run_log WHERE {whereSql} ORDER BY start_time DESC, id DESC LIMIT {pageSize} OFFSET {offset} """, pars); return new { total, page, pageSize, list }; } [DisplayName("业务动作运行日志详情")] [HttpGet("action-run-log/{id:long}")] public async Task GetDetail(long id) { var tenantId = _userManager.TenantId > 0 ? _userManager.TenantId : AidopTenantHelper.Resolve(App.HttpContext); var row = (await _db.Ado.SqlQueryAsync( """ SELECT id AS Id, tenant_id AS TenantId, action_code AS ActionCode, biz_type AS BizType, biz_id AS BizId, biz_no AS BizNo, status AS Status, message AS Message, detail_json AS DetailJson, start_time AS StartTime, end_time AS EndTime, create_time AS CreateTime FROM aidop_action_run_log WHERE id = @Id AND tenant_id = @TenantId LIMIT 1 """, new SugarParameter("@Id", id), new SugarParameter("@TenantId", tenantId))).FirstOrDefault() ?? throw Oops.Oh("运行日志不存在"); object? detail = null; if (!string.IsNullOrWhiteSpace(row.DetailJson)) { try { detail = JsonSerializer.Deserialize(row.DetailJson); } catch { detail = row.DetailJson; } } return new { row, detail }; } [DisplayName("业务动作编码选项")] [HttpGet("action-run-log/action-codes")] public async Task GetActionCodes() { var tenantId = _userManager.TenantId > 0 ? _userManager.TenantId : AidopTenantHelper.Resolve(App.HttpContext); var codes = await _db.Ado.SqlQueryAsync( """ SELECT DISTINCT action_code FROM aidop_action_run_log WHERE tenant_id = @TenantId ORDER BY action_code """, new SugarParameter("@TenantId", tenantId)); return new { list = codes }; } } public class AidopActionRunLogListInput { public int Page { get; set; } = 1; public int PageSize { get; set; } = 20; public string? ActionCode { get; set; } public string? Status { get; set; } public string? BizNo { get; set; } public string? StartTimeFrom { get; set; } public string? StartTimeTo { get; set; } } public sealed class AidopActionRunLogListRow { public long Id { get; set; } public long? TenantId { get; set; } public string? ActionCode { get; set; } public string? BizType { get; set; } public long? BizId { get; set; } public string? BizNo { get; set; } public string? Status { get; set; } public string? Message { get; set; } public string? DetailJson { get; set; } public DateTime? StartTime { get; set; } public DateTime? EndTime { get; set; } public DateTime? CreateTime { get; set; } }