using SqlSugar; using Yitter.IdGenerator; namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt; /// /// C7 移动任务 upsert 的原始 SQL 工具(**不管理事务**;由调用方在既有事务内使用)。 /// 幂等:DB UNIQUE (tenant_id, domain_code, task_id) + `INSERT … ON DUPLICATE KEY UPDATE` /// (复刻 LIVE `exists(TaskID)→UPDATE 否则 INSERT`,避免先查后插竞态)。**Phase 5B 未实库验证。** /// public static class MobileTaskSqlWriter { public static Task UpsertAsync(ISqlSugarClient db, MobileTaskCommand t) { if (t == null) throw new ArgumentNullException(nameof(t)); var now = DateTime.Now; return db.Ado.ExecuteCommandAsync( """ INSERT INTO ado_inventory_mobile_task (id,tenant_id,domain_code,posting_id,fbillno,task_id,type_id,name,description,executer,executer_type_id,plan_date,status,receiver,rct_qc_nbr,create_time,create_user) VALUES (@id,@t,@d,@pid,@fb,@tid,@ty,@nm,@ds,@ex,@et,@now,@st,@rcv,@qc,@now,@u) ON DUPLICATE KEY UPDATE executer=@ex, plan_date=@now, executer_type_id=@et, description=@ds, status=@st, update_time=@now, update_user=@u """, new SugarParameter("@id", YitIdHelper.NextId()), new SugarParameter("@t", t.TenantId), new SugarParameter("@d", t.DomainCode ?? ""), new SugarParameter("@pid", t.PostingId), new SugarParameter("@fb", t.Fbillno), new SugarParameter("@tid", t.TaskId ?? ""), new SugarParameter("@ty", t.TypeId), new SugarParameter("@nm", t.Name), new SugarParameter("@ds", t.Description), new SugarParameter("@ex", t.Executer), new SugarParameter("@et", t.ExecuterTypeId), new SugarParameter("@now", now), new SugarParameter("@st", t.Status), new SugarParameter("@rcv", t.Receiver), new SugarParameter("@qc", t.RctQcNbr), new SugarParameter("@u", t.User ?? "")); } }