using System.Text.Json;
using Yitter.IdGenerator;
namespace Admin.NET.Plugin.AiDOP.Infrastructure;
/// 统一写入 aidop_action_run_log。
public class AidopActionRunLogWriter : ITransient
{
private readonly ISqlSugarClient _db;
public AidopActionRunLogWriter(ISqlSugarClient db)
{
_db = db;
}
public async Task StartAsync(
string actionCode,
long tenantId,
string bizType,
long? bizId,
string? bizNo)
{
var id = YitIdHelper.NextId();
var now = DateTime.Now;
await _db.Ado.ExecuteCommandAsync(
"""
INSERT INTO aidop_action_run_log
(id, tenant_id, action_code, biz_type, biz_id, biz_no, status, start_time, create_time)
VALUES
(@Id, @TenantId, @ActionCode, @BizType, @BizId, @BizNo, 'RUNNING', @Now, @Now)
""",
new SugarParameter("@Id", id),
new SugarParameter("@TenantId", tenantId),
new SugarParameter("@ActionCode", actionCode),
new SugarParameter("@BizType", bizType),
new SugarParameter("@BizId", bizId ?? (object)DBNull.Value),
new SugarParameter("@BizNo", bizNo ?? string.Empty),
new SugarParameter("@Now", now));
return id;
}
public async Task SuccessAsync(long id, string message, object? detail = null) =>
await FinishAsync(id, "SUCCESS", message, detail);
public async Task FailedAsync(long id, string message, object? detail = null) =>
await FinishAsync(id, "FAILED", message, detail);
private async Task FinishAsync(long id, string status, string message, object? detail)
{
var now = DateTime.Now;
await _db.Ado.ExecuteCommandAsync(
"""
UPDATE aidop_action_run_log
SET status = @Status, message = @Message, detail_json = @Detail, end_time = @Now
WHERE id = @Id
""",
new SugarParameter("@Status", status),
new SugarParameter("@Message", Truncate(message, 1000)),
new SugarParameter("@Detail", detail is null ? (object)DBNull.Value : JsonSerializer.Serialize(detail)),
new SugarParameter("@Now", now),
new SugarParameter("@Id", id));
}
private static string Truncate(string? s, int max) =>
string.IsNullOrEmpty(s) || s.Length <= max ? s ?? string.Empty : s[..max];
}