StdInventoryTransactionReader.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using Microsoft.Extensions.Options;
  2. using SqlSugar;
  3. namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
  4. public interface IInventoryTransactionReader
  5. {
  6. Task<InventoryTransactionPage> QueryPageAsync(
  7. InventoryTransactionQuery query,
  8. CancellationToken cancellationToken = default);
  9. }
  10. /// <summary>进出存只读标准层 mdp_std_inv_trans。</summary>
  11. public sealed class StdInventoryTransactionReader : IInventoryTransactionReader, ITransient
  12. {
  13. private readonly ISqlSugarClient _db;
  14. private readonly AidopInventoryOptions _opt;
  15. public StdInventoryTransactionReader(ISqlSugarClient db, IOptions<AidopInventoryOptions> opt)
  16. {
  17. _db = db;
  18. _opt = opt.Value;
  19. }
  20. public async Task<InventoryTransactionPage> QueryPageAsync(
  21. InventoryTransactionQuery query,
  22. CancellationToken cancellationToken = default)
  23. {
  24. var page = query.Page <= 0 ? 1 : query.Page;
  25. var pageSize = query.PageSize <= 0 ? 10 : query.PageSize;
  26. var offset = (page - 1) * pageSize;
  27. var sourceSystem = string.IsNullOrWhiteSpace(_opt.SourceCode) ? "DOPDEMORQ_SQLSERVER" : _opt.SourceCode.Trim();
  28. var months = _opt.TransBootstrapMonths <= 0 ? 12 : _opt.TransBootstrapMonths;
  29. var fallbackHistoryFrom = DateTime.Now.Date.AddMonths(-months);
  30. var historyFrom = (await _db.Ado.SqlQueryAsync<DateTime?>(
  31. """
  32. SELECT MIN(history_from)
  33. FROM mdp_std_inv_trans
  34. WHERE tenant_id=@TenantId AND source_system=@SourceSystem AND domain=@Domain
  35. """,
  36. new List<SugarParameter>
  37. {
  38. new("@TenantId", query.TenantId),
  39. new("@SourceSystem", sourceSystem),
  40. new("@Domain", query.Domain)
  41. })).FirstOrDefault() ?? fallbackHistoryFrom;
  42. if (historyFrom < new DateTime(2000, 1, 1))
  43. historyFrom = fallbackHistoryFrom;
  44. var where = new List<string>
  45. {
  46. "a.tenant_id = @TenantId",
  47. "a.source_system = @SourceSystem",
  48. "a.domain = @Domain",
  49. "a.trans_time >= @HistoryFrom"
  50. };
  51. var pars = new List<SugarParameter>
  52. {
  53. new("@TenantId", query.TenantId),
  54. new("@SourceSystem", sourceSystem),
  55. new("@Domain", query.Domain),
  56. new("@HistoryFrom", historyFrom)
  57. };
  58. if (!string.IsNullOrWhiteSpace(query.MaterialCode))
  59. {
  60. where.Add("a.item_num LIKE @MaterialCode");
  61. pars.Add(new SugarParameter("@MaterialCode", $"%{query.MaterialCode.Trim()}%"));
  62. }
  63. if (!string.IsNullOrWhiteSpace(query.Location))
  64. {
  65. where.Add("a.location = @Location");
  66. pars.Add(new SugarParameter("@Location", query.Location.Trim()));
  67. }
  68. if (!string.IsNullOrWhiteSpace(query.BatchNo))
  69. {
  70. where.Add("IFNULL(a.lot_serial,'') LIKE @BatchNo");
  71. pars.Add(new SugarParameter("@BatchNo", $"%{query.BatchNo.Trim()}%"));
  72. }
  73. if (!string.IsNullOrWhiteSpace(query.WorkOrderNo))
  74. {
  75. where.Add("IFNULL(a.work_ord,'') LIKE @WorkOrderNo");
  76. pars.Add(new SugarParameter("@WorkOrderNo", $"%{query.WorkOrderNo.Trim()}%"));
  77. }
  78. if (!string.IsNullOrWhiteSpace(query.TransType))
  79. {
  80. where.Add("a.trans_type = @TransType");
  81. pars.Add(new SugarParameter("@TransType", query.TransType.Trim()));
  82. }
  83. if (!string.IsNullOrWhiteSpace(query.CreateTime))
  84. {
  85. where.Add("a.trans_time >= @CreateFrom AND a.trans_time < DATE_ADD(@CreateFrom, INTERVAL 1 DAY)");
  86. pars.Add(new SugarParameter("@CreateFrom", $"{query.CreateTime.Trim()} 00:00:00"));
  87. }
  88. if (!string.IsNullOrWhiteSpace(query.CreateUser))
  89. {
  90. where.Add("IFNULL(a.create_user,'') LIKE @CreateUser");
  91. pars.Add(new SugarParameter("@CreateUser", $"%{query.CreateUser.Trim()}%"));
  92. }
  93. var whereSql = string.Join(" AND ", where);
  94. var total = await _db.Ado.GetIntAsync(
  95. $"SELECT COUNT(1) FROM mdp_std_inv_trans a WHERE {whereSql}", pars);
  96. var asOf = (await _db.Ado.SqlQueryAsync<DateTime?>(
  97. $"SELECT MAX(as_of) FROM mdp_std_inv_trans a WHERE {whereSql}", pars)).FirstOrDefault()
  98. ?? DateTime.Now;
  99. var list = await _db.Ado.SqlQueryAsync<InventoryTransactionRow>(
  100. $"""
  101. SELECT
  102. a.trans_time AS TransTime,
  103. a.item_num AS MaterialCode,
  104. i.Descr AS MaterialName,
  105. a.location AS Location,
  106. IFNULL(l.descr,'') AS LocationName,
  107. a.lot_serial AS BatchNo,
  108. a.begin_balance AS BeginQty,
  109. (CASE WHEN a.qty_change > 0 THEN a.qty_change ELSE 0 END) AS InQty,
  110. (CASE WHEN a.qty_change < 0 THEN ABS(a.qty_change) ELSE 0 END) AS OutQty,
  111. a.end_balance AS EndQty,
  112. i.UM AS Unit,
  113. COALESCE(b.Comments, a.trans_type) AS TransType,
  114. a.work_ord AS WorkOrderNo,
  115. a.shipper_num AS DeliveryNo,
  116. a.ship_type AS DeliveryType,
  117. a.remark AS Remark,
  118. a.create_user AS CreateUser
  119. FROM mdp_std_inv_trans a
  120. LEFT JOIN GeneralizedCodeMaster b
  121. ON a.domain = b.Domain AND a.trans_type = b.Val AND b.FldName = 'TransType'
  122. AND b.tenant_id = a.tenant_id
  123. LEFT JOIN LocationMaster l
  124. ON a.domain = l.Domain AND a.location = l.location AND l.tenant_id = a.tenant_id
  125. LEFT JOIN ItemMaster i
  126. ON a.domain = i.Domain AND a.item_num = i.ItemNum
  127. WHERE {whereSql}
  128. ORDER BY a.trans_time DESC, CAST(a.src_rec_id AS UNSIGNED) DESC
  129. LIMIT {pageSize} OFFSET {offset}
  130. """,
  131. pars);
  132. return new InventoryTransactionPage
  133. {
  134. Total = total,
  135. Page = page,
  136. PageSize = pageSize,
  137. List = list,
  138. AsOf = asOf,
  139. HistoryFrom = historyFrom
  140. };
  141. }
  142. }