MdpSyncLogService.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. namespace Admin.NET.Plugin.AiDOP.DataPlatform;
  2. [ApiDescriptionSettings(Order = 321, Description = "数据中台同步日志")]
  3. [Route("api/DataPlatform")]
  4. [NonUnify]
  5. public class MdpSyncLogService : IDynamicApiController, ITransient
  6. {
  7. private readonly ISqlSugarClient _db;
  8. private readonly UserManager _user;
  9. public MdpSyncLogService(ISqlSugarClient db, UserManager user)
  10. {
  11. _db = db;
  12. _user = user;
  13. }
  14. [DisplayName("同步日志列表")]
  15. [HttpGet("sync-logs")]
  16. public async Task<object> GetList(
  17. [FromQuery] string? taskCode,
  18. [FromQuery] long? entityId,
  19. [FromQuery] string? entityCode,
  20. [FromQuery] string? sourceCode,
  21. [FromQuery] string? status,
  22. [FromQuery] string? triggerType,
  23. [FromQuery] DateTime? startTime,
  24. [FromQuery] DateTime? endTime,
  25. [FromQuery] int page = 1,
  26. [FromQuery] int pageSize = 20)
  27. {
  28. await EnsureMenuAsync();
  29. page = page < 1 ? 1 : page;
  30. pageSize = Math.Clamp(pageSize, 1, 100);
  31. var offset = (page - 1) * pageSize;
  32. var where = new List<string>();
  33. var pars = new List<SugarParameter> { new("@limit", pageSize), new("@offset", offset) };
  34. if (!_user.SuperAdmin && !_user.SysAdmin)
  35. {
  36. where.Add("tenant_id=@tenantId");
  37. pars.Add(new SugarParameter("@tenantId", _user.TenantId));
  38. }
  39. if (entityId is > 0)
  40. {
  41. where.Add("entity_id=@entityId");
  42. pars.Add(new SugarParameter("@entityId", entityId.Value));
  43. }
  44. if (!string.IsNullOrWhiteSpace(entityCode))
  45. {
  46. where.Add("entity_name=@entityCode");
  47. pars.Add(new SugarParameter("@entityCode", entityCode.Trim()));
  48. }
  49. if (!string.IsNullOrWhiteSpace(sourceCode))
  50. {
  51. where.Add("source_code=@sourceCode");
  52. pars.Add(new SugarParameter("@sourceCode", sourceCode.Trim()));
  53. }
  54. if (!string.IsNullOrWhiteSpace(taskCode))
  55. {
  56. where.Add("sync_batch_id LIKE @taskCode");
  57. pars.Add(new SugarParameter("@taskCode", "%" + taskCode.Trim() + "%"));
  58. }
  59. if (!string.IsNullOrWhiteSpace(status))
  60. {
  61. where.Add("status=@status");
  62. pars.Add(new SugarParameter("@status", status.Trim()));
  63. }
  64. if (!string.IsNullOrWhiteSpace(triggerType))
  65. {
  66. where.Add("trigger_type=@triggerType");
  67. pars.Add(new SugarParameter("@triggerType", triggerType.Trim()));
  68. }
  69. if (startTime.HasValue)
  70. {
  71. where.Add("sync_start>=@startTime");
  72. pars.Add(new SugarParameter("@startTime", startTime.Value));
  73. }
  74. if (endTime.HasValue)
  75. {
  76. where.Add("sync_start<=@endTime");
  77. pars.Add(new SugarParameter("@endTime", endTime.Value));
  78. }
  79. var whereSql = where.Count == 0 ? "1=1" : string.Join(" AND ", where);
  80. var countPars = pars.Where(p => p.ParameterName is not ("@limit" or "@offset")).ToList();
  81. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM mdp_sync_log WHERE {whereSql}", countPars);
  82. var list = await _db.Ado.SqlQueryAsync<dynamic>(
  83. $"""
  84. SELECT id, entity_id AS entityId, source_code AS sourceCode, entity_name AS entityName,
  85. sync_batch_id AS batchId, sync_type AS syncType, trigger_type AS triggerType,
  86. sync_start AS syncStart, sync_end AS syncEnd, duration_ms AS durationMs,
  87. rows_read AS rowsRead, COALESCE(rows_written, rows_insert, 0) AS rowsWritten,
  88. rows_error AS rowsError, status, COALESCE(error_message, error_msg) AS errorMessage
  89. FROM mdp_sync_log
  90. WHERE {whereSql}
  91. ORDER BY id DESC
  92. LIMIT @limit OFFSET @offset
  93. """,
  94. pars);
  95. return new { total, page, pageSize, list };
  96. }
  97. [DisplayName("同步日志详情")]
  98. [HttpGet("sync-logs/{id:long}")]
  99. public async Task<object> Get(long id)
  100. {
  101. await EnsureMenuAsync();
  102. var rows = await _db.Ado.SqlQueryAsync<dynamic>(
  103. """
  104. SELECT id, tenant_id AS tenantId, entity_id AS entityId, source_code AS sourceCode,
  105. entity_name AS entityName, sync_batch_id AS batchId, sync_type AS syncType,
  106. trigger_type AS triggerType, sync_start AS syncStart, sync_end AS syncEnd,
  107. duration_ms AS durationMs, rows_read AS rowsRead,
  108. COALESCE(rows_written, rows_insert, 0) AS rowsWritten,
  109. rows_error AS rowsError, status, COALESCE(error_message, error_msg) AS errorMessage
  110. FROM mdp_sync_log
  111. WHERE id=@id AND (@admin=1 OR tenant_id=@tenantId)
  112. """,
  113. new SugarParameter("@id", id),
  114. new SugarParameter("@tenantId", _user.TenantId),
  115. new SugarParameter("@admin", _user.SuperAdmin || _user.SysAdmin ? 1 : 0));
  116. return rows.FirstOrDefault() ?? throw Oops.Oh("同步日志不存在");
  117. }
  118. private async Task EnsureMenuAsync()
  119. {
  120. if (_user.SuperAdmin || _user.SysAdmin)
  121. return;
  122. var roleIds = await _db.Queryable<SysUserRole>().Where(x => x.UserId == _user.UserId).Select(x => x.RoleId).ToListAsync();
  123. var allowed = roleIds.Count > 0 && await _db.Queryable<SysRoleMenu>()
  124. .Where(x => roleIds.Contains(x.RoleId) && x.MenuId == MdpDbSyncRules.SyncLogMenuId)
  125. .AnyAsync();
  126. if (!allowed)
  127. throw Oops.Oh("没有同步日志权限");
  128. }
  129. }