using System.Globalization; using Yitter.IdGenerator; namespace Admin.NET.Plugin.AiDOP.Supply; /// /// 采购申请外部事务推送服务。P5 初版只写 QadTracking,不直接调用 SAP/QAD。 /// public class PurchaseRequestExternalPushService : ITransient { private readonly ISqlSugarClient _db; public PurchaseRequestExternalPushService(ISqlSugarClient db) { _db = db; } public async Task CreateQadTrackingForGeneratedRequestsAsync(List requests, string account) { var candidates = SelectPushCandidates(requests); if (candidates.Count == 0) return new PurchaseRequestExternalPushResult(); var pushedIds = new List(); foreach (var group in candidates.GroupBy(x => x.TenantId.ToString())) { var seqId = GenerateSeqId(); foreach (var pr in group) { await _db.Ado.ExecuteCommandAsync( """ INSERT INTO QadTracking (Ufld1, Domain, SeqID, TransType, Subject, `Order`, Int1, CreateTime, CreateUser, UpdateTime, UpdateUser) VALUES ('C', @Domain, @SeqID, 'nbr-pr-mes', '请购单', @Order, @Int1, @Now, @User, @Now, @User) """, new SugarParameter("@Domain", group.Key), new SugarParameter("@SeqID", seqId), new SugarParameter("@Order", pr.PrBillNo), new SugarParameter("@Int1", pr.Id), new SugarParameter("@Now", DateTime.Now), new SugarParameter("@User", account ?? string.Empty)); pr.State = 2; pr.UpdateByName = account; pr.UpdateTime = DateTime.Now; pushedIds.Add(pr.Id); seqId++; } } return new PurchaseRequestExternalPushResult { TrackingCount = pushedIds.Count, PushedPrIds = pushedIds }; } public static List SelectPushCandidates(IEnumerable requests) { return requests .Where(x => x.IsRequireGoods == 0 && !string.IsNullOrWhiteSpace(x.PrBillNo)) .ToList(); } private static long GenerateSeqId() { var now = DateTime.Now; var value = string.Concat( now.ToString("yyMMddHHmmss", CultureInfo.InvariantCulture), now.Millisecond.ToString("D3", CultureInfo.InvariantCulture), Random.Shared.Next(0, 1000).ToString("D3", CultureInfo.InvariantCulture)); return long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var seqId) ? seqId + 1 : YitIdHelper.NextId(); } } public sealed class PurchaseRequestExternalPushResult { public int TrackingCount { get; set; } public List PushedPrIds { get; set; } = new(); }