InoutQueryService.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using Admin.NET.Plugin.AiDOP.Infrastructure;
  2. using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
  3. using Microsoft.Extensions.Options;
  4. namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
  5. /// <summary>
  6. /// S5 进出存查询:只读 mdp_std_inv_trans;响应带 historyFrom/asOf。
  7. /// </summary>
  8. [ApiDescriptionSettings(Order = 303, Description = "进出存查询")]
  9. [Route("api/S5InoutQuery")]
  10. [NonUnify]
  11. public class InoutQueryService : IDynamicApiController, ITransient
  12. {
  13. private const long MainTenantId = 1300000000001L;
  14. private readonly ISqlSugarClient _db;
  15. private readonly UserManager _userManager;
  16. private readonly IInventoryTransactionReader _txReader;
  17. private readonly SourceDomainTenantResolver _domainTenant;
  18. private readonly AidopInventoryOptions _opt;
  19. public InoutQueryService(
  20. ISqlSugarClient db,
  21. UserManager userManager,
  22. IInventoryTransactionReader txReader,
  23. SourceDomainTenantResolver domainTenant,
  24. IOptions<AidopInventoryOptions> opt)
  25. {
  26. _db = db;
  27. _userManager = userManager;
  28. _txReader = txReader;
  29. _domainTenant = domainTenant;
  30. _opt = opt.Value;
  31. }
  32. private long ResolveTenantOrThrow()
  33. {
  34. var tid = _userManager.TenantId;
  35. if (tid <= 0)
  36. throw Oops.Oh("无法确定当前租户,请重新登录或选择目标租户");
  37. if (_userManager.SuperAdmin && tid == MainTenantId)
  38. throw Oops.Oh("超级管理员操作前必须选择目标租户");
  39. return tid;
  40. }
  41. private async Task<string> ResolveDomainOrThrowAsync(long tenantId, CancellationToken ct = default)
  42. {
  43. var sourceCode = string.IsNullOrWhiteSpace(_opt.SourceCode) ? "DOPDEMORQ_SQLSERVER" : _opt.SourceCode.Trim();
  44. try
  45. {
  46. return await _domainTenant.ResolveDomainAsync(sourceCode, tenantId, ct);
  47. }
  48. catch (Exception ex)
  49. {
  50. throw Oops.Oh($"无法解析当前租户 Domain 映射:{ex.Message}");
  51. }
  52. }
  53. [DisplayName("进出存查询列表")]
  54. [HttpGet("list")]
  55. public async Task<object> GetList([FromQuery] InoutQueryListInput input, CancellationToken ct)
  56. {
  57. var tenantId = ResolveTenantOrThrow();
  58. var domain = await ResolveDomainOrThrowAsync(tenantId, ct);
  59. var page = await _txReader.QueryPageAsync(new InventoryTransactionQuery
  60. {
  61. TenantId = tenantId,
  62. Domain = domain,
  63. MaterialCode = input.MaterialCode,
  64. Location = input.Location,
  65. BatchNo = input.BatchNo,
  66. WorkOrderNo = input.WorkOrderNo,
  67. TransType = input.TransType,
  68. CreateTime = input.CreateTime,
  69. CreateUser = input.CreateUser,
  70. Page = input.Page,
  71. PageSize = input.PageSize
  72. }, ct);
  73. return new
  74. {
  75. total = page.Total,
  76. page = page.Page,
  77. pageSize = page.PageSize,
  78. list = page.List.Select(x => new InoutQueryListRow
  79. {
  80. TransTime = x.TransTime,
  81. MaterialCode = x.MaterialCode,
  82. MaterialName = x.MaterialName,
  83. Location = x.Location,
  84. LocationName = x.LocationName,
  85. BatchNo = x.BatchNo,
  86. BeginQty = x.BeginQty,
  87. InQty = x.InQty,
  88. OutQty = x.OutQty,
  89. EndQty = x.EndQty,
  90. Unit = x.Unit,
  91. TransType = x.TransType,
  92. WorkOrderNo = x.WorkOrderNo,
  93. DeliveryNo = x.DeliveryNo,
  94. DeliveryType = x.DeliveryType,
  95. Remark = x.Remark,
  96. CreateUser = x.CreateUser
  97. }).ToList(),
  98. asOf = page.AsOf,
  99. historyFrom = page.HistoryFrom,
  100. dataSource = InventoryDataSources.Std,
  101. isRealtime = false
  102. };
  103. }
  104. [DisplayName("进出存查询货位选项")]
  105. [HttpGet("loc-options")]
  106. public async Task<object> GetLocationOptions(CancellationToken ct)
  107. {
  108. var tenantId = ResolveTenantOrThrow();
  109. var domain = await ResolveDomainOrThrowAsync(tenantId, ct);
  110. var list = await _db.Ado.SqlQueryAsync<InoutQueryLocationOption>(
  111. """
  112. SELECT location AS Val, descr AS Label
  113. FROM LocationMaster
  114. WHERE Domain = @Domain AND tenant_id = @TenantId AND IFNULL(location,'') <> ''
  115. ORDER BY location
  116. """,
  117. new List<SugarParameter> { new("@Domain", domain), new("@TenantId", tenantId) });
  118. return list;
  119. }
  120. [DisplayName("进出存查询交易类型选项")]
  121. [HttpGet("transtype-options")]
  122. public async Task<object> GetTransTypeOptions(CancellationToken ct)
  123. {
  124. var tenantId = ResolveTenantOrThrow();
  125. var domain = await ResolveDomainOrThrowAsync(tenantId, ct);
  126. var list = await _db.Ado.SqlQueryAsync<InoutQueryTransTypeOption>(
  127. """
  128. SELECT Val AS Val, Comments AS Label
  129. FROM GeneralizedCodeMaster
  130. WHERE FldName = 'TransType' AND Domain = @Domain AND tenant_id = @TenantId AND IFNULL(Val,'') <> ''
  131. ORDER BY Val
  132. """,
  133. new List<SugarParameter> { new("@Domain", domain), new("@TenantId", tenantId) });
  134. return list;
  135. }
  136. }