AidopActionRunLogWriter.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System.Text.Json;
  2. using Yitter.IdGenerator;
  3. namespace Admin.NET.Plugin.AiDOP.Infrastructure;
  4. /// <summary>统一写入 aidop_action_run_log。</summary>
  5. public class AidopActionRunLogWriter : ITransient
  6. {
  7. private readonly ISqlSugarClient _db;
  8. public AidopActionRunLogWriter(ISqlSugarClient db)
  9. {
  10. _db = db;
  11. }
  12. public async Task<long> StartAsync(
  13. string actionCode,
  14. long tenantId,
  15. string bizType,
  16. long? bizId,
  17. string? bizNo)
  18. {
  19. var id = YitIdHelper.NextId();
  20. var now = DateTime.Now;
  21. await _db.Ado.ExecuteCommandAsync(
  22. """
  23. INSERT INTO aidop_action_run_log
  24. (id, tenant_id, action_code, biz_type, biz_id, biz_no, status, start_time, create_time)
  25. VALUES
  26. (@Id, @TenantId, @ActionCode, @BizType, @BizId, @BizNo, 'RUNNING', @Now, @Now)
  27. """,
  28. new SugarParameter("@Id", id),
  29. new SugarParameter("@TenantId", tenantId),
  30. new SugarParameter("@ActionCode", actionCode),
  31. new SugarParameter("@BizType", bizType),
  32. new SugarParameter("@BizId", bizId ?? (object)DBNull.Value),
  33. new SugarParameter("@BizNo", bizNo ?? string.Empty),
  34. new SugarParameter("@Now", now));
  35. return id;
  36. }
  37. public async Task SuccessAsync(long id, string message, object? detail = null) =>
  38. await FinishAsync(id, "SUCCESS", message, detail);
  39. public async Task FailedAsync(long id, string message, object? detail = null) =>
  40. await FinishAsync(id, "FAILED", message, detail);
  41. private async Task FinishAsync(long id, string status, string message, object? detail)
  42. {
  43. var now = DateTime.Now;
  44. await _db.Ado.ExecuteCommandAsync(
  45. """
  46. UPDATE aidop_action_run_log
  47. SET status = @Status, message = @Message, detail_json = @Detail, end_time = @Now
  48. WHERE id = @Id
  49. """,
  50. new SugarParameter("@Status", status),
  51. new SugarParameter("@Message", Truncate(message, 1000)),
  52. new SugarParameter("@Detail", detail is null ? (object)DBNull.Value : JsonSerializer.Serialize(detail)),
  53. new SugarParameter("@Now", now),
  54. new SugarParameter("@Id", id));
  55. }
  56. private static string Truncate(string? s, int max) =>
  57. string.IsNullOrEmpty(s) || s.Length <= max ? s ?? string.Empty : s[..max];
  58. }