using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using WiDAL.DTOs; using WiDAL.Query.Wi; namespace WiDAL.CustomCode.WiWorkOrder; public class WiWorkOrderDAL : IWiWorkOrderDAL { private readonly IQueryExecutor _qe; public WiWorkOrderDAL(IQueryExecutor qe) => _qe = qe; public async Task GetWorkOrderDetail(int indentDetailId, LoginDTO login, CancellationToken ct) { return await _qe.QuerySingleAsync(login, WiWorkOrderQB.GET_WORKORDER_DETAIL, new { IndentDetailId = indentDetailId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } public async Task> GetWorkOrderGroup(int combineIndentId, LoginDTO login, CancellationToken ct) { return await _qe.QueryAsync(login, WiWorkOrderQB.GET_WORKORDER_GROUP_BY_COMBINEID, new { CombineIndentId = combineIndentId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } // RoutingDetailId != -1 tries the precise MLINEOPERATIONMAP mapping first; falls back to // the coarser WorkCenter-wide candidate set when RoutingDetailId is unset or has no mapping // row yet. Never mixes precise and coarse results in one response. public async Task> ResolveWorkstationsForWorkOrder( WiWorkOrderInfoDTO workOrder, LoginDTO login, CancellationToken ct) { if (workOrder.RoutingDetailId != -1) { var precise = await _qe.QueryAsync(login, WiWorkOrderQB.GET_PRECISE_WORKSTATIONS_BY_ROUTINGDETAIL, new { RoutingDetailId = workOrder.RoutingDetailId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); var preciseList = precise.ToList(); if (preciseList.Count > 0) { foreach (var c in preciseList) c.IsPrecise = true; return preciseList; } } var coarse = await _qe.QueryAsync(login, WiWorkOrderQB.GET_COARSE_WORKSTATIONS_BY_WORKCENTER, new { WorkCenterId = workOrder.WorkCenterId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); var coarseList = coarse.ToList(); foreach (var c in coarseList) c.IsPrecise = false; return coarseList; } }