MdpTenantStdSourceService.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using Microsoft.Extensions.Logging;
  2. namespace Admin.NET.Plugin.AiDOP.DataPlatform;
  3. /// <summary>租户标准对象来源登记。页面入口见 F-5「业务对象来源」。</summary>
  4. [ApiDescriptionSettings(Order = 325, Description = "租户标准对象来源登记")]
  5. [Route("api/DataPlatform")]
  6. [NonUnify]
  7. public class MdpTenantStdSourceService : IDynamicApiController, ITransient
  8. {
  9. private readonly ISqlSugarClient _db;
  10. private readonly UserManager _userManager;
  11. private readonly MdpNeutralSourceCleanup _cleanup;
  12. private readonly ILogger _logger;
  13. public MdpTenantStdSourceService(
  14. ISqlSugarClient db,
  15. UserManager userManager,
  16. MdpNeutralSourceCleanup cleanup,
  17. ILoggerFactory loggerFactory)
  18. {
  19. _db = db;
  20. _userManager = userManager;
  21. _cleanup = cleanup;
  22. _logger = loggerFactory.CreateLogger(nameof(MdpTenantStdSourceService));
  23. }
  24. [DisplayName("标准对象目录")]
  25. [HttpGet("std-objects")]
  26. public object Catalog() =>
  27. MdpStdObjectCatalog.All.Select(d => new
  28. {
  29. code = d.Code,
  30. module = d.Module,
  31. isS0 = d.IsS0,
  32. targetTable = d.Tables.FirstOrDefault()
  33. });
  34. [DisplayName("标准对象来源登记")]
  35. [HttpGet("tenant-std-sources")]
  36. public async Task<object> List([FromQuery] long? tenantId)
  37. {
  38. var tenant = tenantId ?? _userManager.TenantId;
  39. if (!_userManager.SuperAdmin && !_userManager.SysAdmin && tenant != _userManager.TenantId)
  40. throw Oops.Oh("不能查看其他租户的来源登记");
  41. return await _db.Ado.SqlQueryAsync<dynamic>(
  42. """
  43. SELECT tenant_id AS TenantId, std_object AS StdObject, source_system AS SourceSystem,
  44. source_scope AS SourceScope, remark AS Remark, update_time AS UpdateTime
  45. FROM mdp_tenant_std_source
  46. WHERE tenant_id=@tenant
  47. ORDER BY std_object
  48. """,
  49. new { tenant });
  50. }
  51. [DisplayName("修改标准对象来源登记")]
  52. [HttpPut("tenant-std-sources")]
  53. public async Task<object> Upsert([FromBody] MdpTenantStdSourceInput input)
  54. {
  55. if (input.TenantId <= 0 || string.IsNullOrWhiteSpace(input.StdObject) || string.IsNullOrWhiteSpace(input.SourceSystem))
  56. throw Oops.Oh("tenantId、stdObject、sourceSystem 必填");
  57. if (!_userManager.SuperAdmin && !_userManager.SysAdmin && input.TenantId != _userManager.TenantId)
  58. throw Oops.Oh("不能修改其他租户的来源登记");
  59. if (MdpStdObjectCatalog.Find(input.StdObject) == null)
  60. throw Oops.Oh($"未知标准对象 {input.StdObject}");
  61. var old = await _db.Ado.SqlQueryAsync<string>(
  62. "SELECT source_system FROM mdp_tenant_std_source WHERE tenant_id=@tenant AND std_object=@obj LIMIT 1",
  63. new { tenant = input.TenantId, obj = input.StdObject.Trim() });
  64. var previous = old.FirstOrDefault();
  65. await _db.Ado.ExecuteCommandAsync(
  66. """
  67. INSERT INTO mdp_tenant_std_source (tenant_id, std_object, source_system, source_scope, remark)
  68. VALUES (@tenant, @obj, @src, @scope, @remark)
  69. ON DUPLICATE KEY UPDATE
  70. source_system=VALUES(source_system),
  71. source_scope=VALUES(source_scope),
  72. remark=VALUES(remark)
  73. """,
  74. new
  75. {
  76. tenant = input.TenantId,
  77. obj = input.StdObject.Trim(),
  78. src = input.SourceSystem.Trim(),
  79. scope = input.SourceScope?.Trim() ?? "",
  80. remark = input.Remark
  81. });
  82. await _db.Ado.ExecuteCommandAsync(
  83. """
  84. INSERT INTO mdp_tenant_std_source_log
  85. (tenant_id, std_object, old_source_system, new_source_system, changed_by)
  86. VALUES (@tenant, @obj, @old, @src, @who)
  87. """,
  88. new
  89. {
  90. tenant = input.TenantId,
  91. obj = input.StdObject.Trim(),
  92. old = previous,
  93. src = input.SourceSystem.Trim(),
  94. who = string.IsNullOrWhiteSpace(_userManager.Account) ? "api" : _userManager.Account
  95. });
  96. var removed = 0;
  97. if (!string.Equals(previous, input.SourceSystem.Trim(), StringComparison.OrdinalIgnoreCase))
  98. removed = await _cleanup.PurgeObjectAsync(input.TenantId, input.StdObject.Trim());
  99. _logger.LogInformation(
  100. "来源登记 tenant={Tenant} object={Object} {Old} -> {New} purged={Purged}",
  101. input.TenantId, input.StdObject, previous, input.SourceSystem, removed);
  102. return new { tenantId = input.TenantId, stdObject = input.StdObject, purged = removed };
  103. }
  104. }
  105. public sealed class MdpTenantStdSourceInput
  106. {
  107. public long TenantId { get; set; }
  108. public string StdObject { get; set; } = "";
  109. public string SourceSystem { get; set; } = "";
  110. public string? SourceScope { get; set; }
  111. public string? Remark { get; set; }
  112. }