using FrameworkDAL.DTO.DirectAction; using FrameworkDAL.Query.DirectAction; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace FrameworkDAL.CustomCode.DirectAction { public class DirectActionConfigDAL : IDirectActionConfigDAL { private readonly IQueryExecutor _qe; public DirectActionConfigDAL(IQueryExecutor qe) => _qe = qe; public async Task GetHeaderByIdAsync( int directActionId, LoginDTO login, CancellationToken ct = default) { return await _qe.QuerySingleAsync( login, DirectActionConfigQB.GET_HEADER_BY_ID, new { DirectActionId = directActionId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } public async Task> GetDetailsByDirectActionIdAsync( int directActionId, LoginDTO login, CancellationToken ct = default) { return await _qe.QueryAsync( login, DirectActionConfigQB.GET_DETAILS_BY_DIRECTACTIONID, new { DirectActionId = directActionId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } public async Task GetDetailByActionCodeAsync( string actionCode, LoginDTO login, CancellationToken ct = default) { return await _qe.QuerySingleAsync( login, DirectActionConfigQB.GET_DETAIL_BY_ACTIONCODE, new { ActionCode = actionCode, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } public async Task> GetAllActiveDetailsAsync( LoginDTO login, CancellationToken ct = default) { return await _qe.QueryAsync( login, DirectActionConfigQB.GET_ALL_ACTIVE_DETAILS, new { TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } public async Task<(int WorkflowTaskId, int AssigneeUserId)?> GetPendingWorkflowTaskAsync( int objectId, LoginDTO login, CancellationToken ct = default) { const string sql = @" SELECT TOP 1 WT.WORKFLOWTASKID AS WorkflowTaskId, WT.ASSIGNEDTOUSERID AS AssigneeUserId FROM TWORKFLOWTASK WT JOIN TWORKFLOWINSTANCE WI ON WI.WORKFLOWINSTANCEID = WT.WORKFLOWINSTANCEID WHERE WI.OBJECTID = @ObjectId AND WT.WORKFLOWTASKSTATUS = 0 ORDER BY WT.WORKFLOWTASKID DESC"; var row = await _qe.QuerySingleAsync( login, sql, new { ObjectId = objectId }, cancellationToken: ct).ConfigureAwait(false); return row is null ? null : (row.WorkflowTaskId, row.AssigneeUserId); } private sealed class PendingTaskRow { public int WorkflowTaskId { get; set; } public int AssigneeUserId { get; set; } } public async Task GetFlowCodeByFlowIdAsync( int flowId, int tenantId, LoginDTO login, CancellationToken ct = default) { if (flowId <= 0) return null; return await _qe.ExecuteScalarAsync( login, DirectActionConfigQB.GET_FLOWCODE_BY_FLOWID, new { FlowId = flowId, TenantId = tenantId }, cancellationToken: ct).ConfigureAwait(false); } } }