S1KpiDailySnapshotStore.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. namespace Admin.NET.Plugin.AiDOP.SmartOps;
  2. public sealed class S1KpiDailySnapshotStore : IS1KpiDailySnapshotStore, ITransient
  3. {
  4. private readonly ISqlSugarClient _db;
  5. public S1KpiDailySnapshotStore(ISqlSugarClient db) => _db = db;
  6. public async Task ExecuteInTransactionAsync(Func<Task> action, CancellationToken ct = default)
  7. {
  8. await _db.Ado.BeginTranAsync();
  9. try
  10. {
  11. await action();
  12. await _db.Ado.CommitTranAsync();
  13. }
  14. catch
  15. {
  16. await _db.Ado.RollbackTranAsync();
  17. throw;
  18. }
  19. }
  20. public async Task<DateTime?> GetMaxBizDateAsync(int level, long tenantId, long factoryId, string moduleCode, CancellationToken ct = default)
  21. {
  22. var table = Table(level);
  23. return await _db.Ado.SqlQuerySingleAsync<DateTime?>(
  24. $"""
  25. SELECT MAX(biz_date) FROM {table}
  26. WHERE tenant_id=@TenantId AND factory_id=@FactoryId
  27. AND module_code=@ModuleCode AND is_deleted=0
  28. """,
  29. new SugarParameter("@TenantId", tenantId),
  30. new SugarParameter("@FactoryId", factoryId),
  31. new SugarParameter("@ModuleCode", moduleCode));
  32. }
  33. public async Task<List<S1KpiDailySnapshotRow>> ListLatestAsync(int level, long tenantId, long factoryId, DateTime bizDate, string moduleCode, CancellationToken ct = default)
  34. {
  35. var table = Table(level);
  36. return await _db.Ado.SqlQueryAsync<S1KpiDailySnapshotRow>(
  37. $"""
  38. SELECT metric_code AS MetricCode, biz_date AS BizDate, metric_value AS MetricValue
  39. FROM {table}
  40. WHERE tenant_id=@TenantId AND factory_id=@FactoryId
  41. AND module_code=@ModuleCode AND biz_date=@BizDate AND is_deleted=0
  42. """,
  43. new SugarParameter("@TenantId", tenantId),
  44. new SugarParameter("@FactoryId", factoryId),
  45. new SugarParameter("@ModuleCode", moduleCode),
  46. new SugarParameter("@BizDate", bizDate.Date));
  47. }
  48. public async Task<int> UpdateTargetsAsync(
  49. int level,
  50. long tenantId,
  51. long factoryId,
  52. DateTime bizDate,
  53. string metricCode,
  54. KpiTargetSnapshot snap,
  55. string moduleCode,
  56. CancellationToken ct = default)
  57. {
  58. var table = Table(level);
  59. var pars = new List<SugarParameter>
  60. {
  61. new("@TenantId", tenantId),
  62. new("@FactoryId", factoryId),
  63. new("@ModuleCode", moduleCode),
  64. new("@BizDate", bizDate.Date),
  65. new("@MetricCode", metricCode)
  66. };
  67. pars.AddRange(KpiTargetSnapshotSql.Parameters(snap));
  68. return await _db.Ado.ExecuteCommandAsync(
  69. $"""
  70. UPDATE {table}
  71. SET target_value=@TargetValue,
  72. target_config_id=@TargetConfigId,
  73. target_source=@TargetSource,
  74. target_resolved_at=@TargetResolvedAt,
  75. update_time=CURRENT_TIMESTAMP(3)
  76. WHERE tenant_id=@TenantId AND factory_id=@FactoryId
  77. AND module_code=@ModuleCode AND biz_date=@BizDate
  78. AND metric_code=@MetricCode AND is_deleted=0
  79. """,
  80. pars.ToArray());
  81. }
  82. private static string Table(int level) => level switch
  83. {
  84. 1 => "ado_s9_kpi_value_l1_day",
  85. 2 => "ado_s9_kpi_value_l2_day",
  86. 3 => "ado_s9_kpi_value_l3_day",
  87. 4 => "ado_s9_kpi_value_l4_day",
  88. _ => throw new ArgumentOutOfRangeException(nameof(level))
  89. };
  90. }