using Admin.NET.Plugin.AiDOP.Entity.DataPlatform; namespace Admin.NET.Plugin.AiDOP.DataPlatform.Executors; /// Outbox 入队 + 立即唤醒推送。 public sealed class MdpOutboxEnqueueService : ITransient { private readonly ISqlSugarClient _db; private readonly MdpOutboxWakeSignal _wake; public MdpOutboxEnqueueService(ISqlSugarClient db, MdpOutboxWakeSignal wake) { _db = db; _wake = wake; } /// /// 幂等入队:已存在 status∈(0,1) 的同 idem_key 则跳过。 /// /// 为 false 时不立即 Pulse(供调用方在本地事务提交后再唤醒,见 WP10 S1)。默认 true 保持既有行为。 public async Task TryEnqueueAsync(MdpOutbox item, CancellationToken ct = default, bool pulse = true) { if (item == null) throw new ArgumentNullException(nameof(item)); if (string.IsNullOrWhiteSpace(item.IdemKey)) throw new ArgumentException("idem_key 不能为空", nameof(item)); var exists = await _db.Queryable() .Where(x => x.IdemKey == item.IdemKey && (x.Status == 0 || x.Status == 1)) .AnyAsync(ct); if (exists) return false; item.Status = 0; item.RetryCount = 0; item.CreateTime = DateTime.Now; item.UpdateTime = item.CreateTime; await _db.Insertable(item).ExecuteCommandAsync(ct); if (pulse) _wake.Pulse(); return true; } }