public async Task <Equipment> ById(int id)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql    = new TaskSqls();
                var result = await conn.QueryFirstOrDefaultAsync <Equipment>(_sql.ById(id));

                return(result);
            }
        }
        /// <summary>
        /// Получить все таски
        /// </summary>
        public async Task <List <TrainTask> > GetAllTrainTask()
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql   = new TaskSqls();
                var tasks = await conn.QueryAsync <TrainTask>(sql.GetAllTrainTask);

                return(tasks.ToList());
            }
        }
        public async Task <TrainTask> GetTrainTaskWithoutAttributes(int id)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql  = new TaskSqls();
                var task = await conn.QueryFirstOrDefaultAsync <TrainTask>(sql.GetTaskWithoutAttributes,
                                                                           new { id });

                return(task);
            }
        }
        /// <summary>
        /// получить атрибуты по id задачи
        /// </summary>
        public async Task <List <TrainTaskAttribute> > GetTrainTaskAttributes(int trainTaskId)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql        = new TaskSqls();
                var attributes = await conn.QueryAsync <TrainTaskAttribute>(sql.GetTrainTaskAttributes,
                                                                            new { trainTaskId });

                return(attributes.ToList());
            }
        }
        public async Task <TrainTaskAttribute> GetTrainTaskAttribute(int attributeId)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql       = new TaskSqls();
                var attribute = await conn.QueryFirstOrDefaultAsync <TrainTaskAttribute>(sql.GetTrainTaskAttributeById,
                                                                                         new { attributeId });

                return(attribute);
            }
        }
        public async Task <TrainTaskAttribute> AddAttributesToTrainTask(TrainTask trainTask, TaskRepository.TrainTaskaddUi input)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql         = new TaskSqls();
                var attributeId = await conn.QueryFirstOrDefaultAsync <int>(sql.AddAtributeToTask,
                                                                            new
                {
                    faultId     = input.FaultId,
                    trainTaskId = trainTask.Id,
                    userId      = trainTask.UserId,
                    taskLevel   = input.TaskLevel
                });

                var result = await GetTrainTaskAttribute(attributeId);

                return(result);
            }
        }
        public async Task <TrainTask> AddTrainTaskWithoutAttributes(TrainTaskaddUi input, User user)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sql    = new TaskSqls();
                var taskId = await conn.QueryFirstOrDefaultAsync <int>(sql.AddTaskWithoutAttributes,
                                                                       new
                {
                    carriageId       = input.CarriageId,
                    description      = input.Text,
                    equipmentModelId = input.EquipmentId,
                    taskType         = input.TaskType,
                    userId           = user.Id
                });

                var result = await GetTrainTaskWithoutAttributes(taskId);

                return(result);
            }
        }
        public async Task <TaskByIdDto> GetTaskById(int id, int permissions = -1)
        {
            using (var conn = new SqlConnection(AppSettings.ConnectionString))
            {
                var sqlRExecutor   = new ExecutorRepository(_logger);
                var sqlRTaskStatus = new TaskStatusRepository(_logger);
                var sqlRTask       = new TaskSqls();


                var fromSql = (await conn.QueryAsync <TaskDetailFromSql>(sqlRTask.GetTrainTaskByIdAndAttributeId(id))).ToList();

                var task = fromSql.First();

                var result = new TaskByIdDto
                {
                    Id             = task.Id,
                    Data           = task.CreateDate,
                    InitiatorName  = task.InitiatorName,
                    TrainName      = task.TrainName,
                    EquipmentName  = task.EquipmentName,
                    CarriageSerial = task.CarriageSerial, //CreateCarriageName(task.TrainName, task.CarriageNumber),
                    TaskType       = task.TaskType
                };

                //Текущий статус
                var taskStatuses = await sqlRTaskStatus.ByTaskId(id);

                var currentTaskStatus = taskStatuses.Last().Status;
                result.StatusId = (int)currentTaskStatus;

                //Текущий исполнитель
                var taskExecutors = await sqlRExecutor.GetByTaskId(id);

                BrigadeType currentTaskExecutor = 0;
                if (taskExecutors.Count > 0)
                {
                    currentTaskExecutor = taskExecutors.Last().BrigadeType;
                    result.BrigadeType  = (int)currentTaskExecutor;
                }

                //Уровень задачи
                var taskLevel = fromSql.OrderBy(x => x.TaskLevel).Select(x => x.TaskLevel).First();
                result.TaskLevel = taskLevel.HasValue ? (int)taskLevel : 0;

                //Доступные статусы
                var possibleTaskStatuses = sqlRTaskStatus.GetAvailableStatusesNewTask(currentTaskStatus, currentTaskExecutor, permissions);
                result.PossibleTaskStatuses = possibleTaskStatuses.Select(x => (int)x).ToList();

                //Неисправности из атрибутов
                result.Faults      = new List <FaultTaskDto>();
                result.Inspections = new List <InspectionTaskDto>();
                foreach (var item in fromSql)
                {
                    if (item.AttributeFaultId != null)
                    {
                        await AddFaultData(result, item);
                    }

                    if (item.AttributeInspectionId != 0)
                    {
                        await AddInspectionData(result, item);
                    }
                }
                //Добавить в фаулты данные по чеклистам из инпекции
                var withCheckListEquipmentId = fromSql.Where(x => x.AttributeCheckListEquipmentId != null)
                                               .DistinctBy(y => y.AttributeCheckListEquipmentId).ToList();
                foreach (var item in withCheckListEquipmentId)
                {
                    await AddFaultDataFromCheckListEquipmentId(result, item);
                }

                result.History = await AddHistoryData(id);

                return(result);
            }
        }