namespace Admin.NET.Plugin.AiDOP.WorkOrder; /// 工单齐套检查动作。 public class WorkOrderKittingCheckService : ITransient { private readonly ISqlSugarClient _db; public WorkOrderKittingCheckService(ISqlSugarClient db) { _db = db; } public async Task CheckTenantWorkOrdersAsync(long tenantId, string account) { var workOrds = await _db.Ado.SqlQueryAsync( """ SELECT WorkOrd FROM WorkOrdMaster WHERE tenant_id = @TenantId AND LOWER(TRIM(IFNULL(Status,''))) IN ('p', 'r') ORDER BY WorkOrd """, new SugarParameter("@TenantId", tenantId)); var result = new KittingCheckResult(); foreach (var wo in workOrds) { var one = await CheckSingleAsync(tenantId, wo, account); result.CheckedCount++; if (one.IsKitted) result.KittedCount++; else result.ShortageCount++; } return result; } public async Task CheckSingleAsync(long tenantId, string workOrd, string account) { var now = DateTime.Now; var shortage = await _db.Ado.GetIntAsync( """ SELECT COUNT(*) FROM b_examine_result ber INNER JOIN b_bom_child_examine bce ON ber.Id = bce.examine_id AND bce.is_use = 1 WHERE ber.tenant_id = @TenantId AND ber.IsDeleted = 0 AND ber.morder_no = @WorkOrd AND IFNULL(bce.lack_qty, 0) > 0 """, new SugarParameter("@TenantId", tenantId), new SugarParameter("@WorkOrd", workOrd.Trim())); var isKitted = shortage == 0; var situation = isKitted ? "齐套" : "缺料"; await _db.Ado.ExecuteCommandAsync( """ UPDATE mes_morder SET MaterialSituation = @Situation, update_by_name = @User, update_time = @Now WHERE tenant_id = @TenantId AND morder_no = @WorkOrd AND IsDeleted = 0 """, new SugarParameter("@Situation", situation), new SugarParameter("@User", account), new SugarParameter("@Now", now), new SugarParameter("@TenantId", tenantId), new SugarParameter("@WorkOrd", workOrd.Trim())); return new SingleKittingCheckResult { WorkOrd = workOrd, IsKitted = isKitted, ShortageLineCount = shortage, MaterialSituation = situation }; } public sealed class KittingCheckResult { public int CheckedCount { get; set; } public int KittedCount { get; set; } public int ShortageCount { get; set; } } public sealed class SingleKittingCheckResult { public string WorkOrd { get; set; } = string.Empty; public bool IsKitted { get; set; } public int ShortageLineCount { get; set; } public string MaterialSituation { get; set; } = string.Empty; } }