PurchaseRequestExternalPushService.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.Globalization;
  2. using Yitter.IdGenerator;
  3. namespace Admin.NET.Plugin.AiDOP.Supply;
  4. /// <summary>
  5. /// 采购申请外部事务推送服务。P5 初版只写 QadTracking,不直接调用 SAP/QAD。
  6. /// </summary>
  7. public class PurchaseRequestExternalPushService : ITransient
  8. {
  9. private readonly ISqlSugarClient _db;
  10. public PurchaseRequestExternalPushService(ISqlSugarClient db)
  11. {
  12. _db = db;
  13. }
  14. public async Task<PurchaseRequestExternalPushResult> CreateQadTrackingForGeneratedRequestsAsync(List<PurchaseRequestMain> requests, string account)
  15. {
  16. var candidates = SelectPushCandidates(requests);
  17. if (candidates.Count == 0) return new PurchaseRequestExternalPushResult();
  18. var pushedIds = new List<long>();
  19. foreach (var group in candidates.GroupBy(x => x.TenantId.ToString()))
  20. {
  21. var seqId = GenerateSeqId();
  22. foreach (var pr in group)
  23. {
  24. await _db.Ado.ExecuteCommandAsync(
  25. """
  26. INSERT INTO QadTracking
  27. (Ufld1, Domain, SeqID, TransType, Subject, `Order`, Int1, CreateTime, CreateUser, UpdateTime, UpdateUser)
  28. VALUES
  29. ('C', @Domain, @SeqID, 'nbr-pr-mes', '请购单', @Order, @Int1, @Now, @User, @Now, @User)
  30. """,
  31. new SugarParameter("@Domain", group.Key),
  32. new SugarParameter("@SeqID", seqId),
  33. new SugarParameter("@Order", pr.PrBillNo),
  34. new SugarParameter("@Int1", pr.Id),
  35. new SugarParameter("@Now", DateTime.Now),
  36. new SugarParameter("@User", account ?? string.Empty));
  37. pr.State = 2;
  38. pr.UpdateByName = account;
  39. pr.UpdateTime = DateTime.Now;
  40. pushedIds.Add(pr.Id);
  41. seqId++;
  42. }
  43. }
  44. return new PurchaseRequestExternalPushResult
  45. {
  46. TrackingCount = pushedIds.Count,
  47. PushedPrIds = pushedIds
  48. };
  49. }
  50. public static List<PurchaseRequestMain> SelectPushCandidates(IEnumerable<PurchaseRequestMain> requests)
  51. {
  52. return requests
  53. .Where(x => x.IsRequireGoods == 0 && !string.IsNullOrWhiteSpace(x.PrBillNo))
  54. .ToList();
  55. }
  56. private static long GenerateSeqId()
  57. {
  58. var now = DateTime.Now;
  59. var value = string.Concat(
  60. now.ToString("yyMMddHHmmss", CultureInfo.InvariantCulture),
  61. now.Millisecond.ToString("D3", CultureInfo.InvariantCulture),
  62. Random.Shared.Next(0, 1000).ToString("D3", CultureInfo.InvariantCulture));
  63. return long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var seqId)
  64. ? seqId + 1
  65. : YitIdHelper.NextId();
  66. }
  67. }
  68. public sealed class PurchaseRequestExternalPushResult
  69. {
  70. public int TrackingCount { get; set; }
  71. public List<long> PushedPrIds { get; set; } = new();
  72. }