Нравится
Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу
Добрый день, Петр!
В базовой конфигурации есть поле "Фактические трудозатраты" (ActualWorkingTime), которое подсчитывается на основании активностей по инциденту/запросу на обслуживание. Если Вам нужна именно разница между датой разрешения и регистрации, то нужно самостоятельно добавить это поле, и рассчитывать или на странице, или в процессе объекта.
А среднее по всем или за какой-то период удобно будет смотреть с помощью построения графика на вкладке "Аналитика".
Петр, а что конкретно Вас интересует в способе реализации? Вроде бы ничего особенно сложного...
Петр, тут зависит от специфики отработки инцидентов в Вашей компании. Можно реализовать эту логику либо в процессе объекта, тогда изменения будут только после созранения записи в разрешенном состоянии , либо в процессе карточки, тогда заполнять поле можно будет сразу на карточке при изменении состояния на разрешенное.
Для процесса объекта код будет выглядеть примерно следующим образом:
var solvedStatusId = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "StatusOfSolvedIncident"); //разрешенное состояние var statusOfIncidentId = Entity.GetTypedColumnValue<Guid>("StatusOfIncidentId"); //текущее состояние if (statusOfIncidentId == solvedStatusId) { DateTime registeredDt = Entity.GetTypedColumnValue<DateTime>("RegisteredOn"); DateTime solutionProvidedDt = Entity.GetTypedColumnValue<DateTime>("SolutionProvidedOn"); TimeSpan timeForSolution = solutionProvidedDt - registeredDt; //промежуток времени, затраченный на решение int minutesForSolution = timeForSolution.TotalMinutes; //целое число минут, затраченных на решение Entity.SetColumnValue("MinutesForSolution", minutesForSolution); //установка значения в поле "MinutesForSolution" типа "Целое число" }
Здесь, как видно, работа происходит с конкретным экземпляром записи. Выполнять эти действия нужно в обработчике события Сохранения (ServiceRequestSaving).
При реализации данной логики на карточке редактирования, данные будут получаться и устанавливаться из контролов страницы. Пример:
var solvedStatusId = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "StatusOfSolvedIncident"); //разрешенное состояние var statusOfIncidentId = (Guid)Page.StatusOfIncidentEdit.Value; //текущее состояние if (statusOfIncidentId == solvedStatusId) { DateTime registeredDt = (DateTime)Page.RegisteredOnEdit.Value; DateTime solutionProvidedDt = (DateTime)Page.SolutionProvidedOnEdit.Value; TimeSpan timeForSolution = solutionProvidedDt - registeredDt; //промежуток времени, затраченный на решение int minutesForSolution = timeForSolution.TotalMinutes; //целое число минут, затраченных на решение Page.MinutesForSolutionEdit.Value = minutesForSolution;//установка значения в поле "MinutesForSolution" типа "Целое число" }
Это можно делать, к примеру, в обработчике события изменения поля "Статус".
Здравтсвуйте, Петр!
1. Попробуйте добавить поле на карточку путем перетягивания поля из источника данных. Таким образом сразу добавляется поле нужного типа с привязкой.
2. Да, оптимальным решением будет выполнить SQL-скрипт, который бы пересчитал поле для других записей.
Петр, а если ввести в нее значение, в реестре увидите изменения?
Попробуйте колонку в источник данных передобавить.
Петр, не могли бы Вы экспортировать и выложить схемы страницы и объекта для анализа?
Если нет такой возможности, предлагаю Вам обратиться в службу тех. поддержки, организуем удаленное подключение и решим проблему.
Здравствуйте, Петр!
Проблему с отображением значения поля мы решили в ходе удаленного подключения.
Во поводу выходных. Можно подсчет реализовать следующим образом, используя LINQ:
DateTime dateTimeStart = Entity.GetTypedColumnValue<DateTime>("RegisteredOn"); DateTime dateTimeEnd = Entity.GetTypedColumnValue<DateTime>("SolutionProvidedOn"); var workingDayStart = ((DateTime)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "WorkingDayStartTime")).TimeOfDay; //системная настройка начала рабочего дня var workingDayEnd = ((DateTime)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "WorkingDayEndTime")).TimeOfDay; //системная настройка конца рабочего дня var offset = UserConnection.CurrentUser.TimeZone.BaseUtcOffset; workingDayStart = workingDayStart.Add(offset); workingDayEnd = workingDayEnd.Add(offset); int minutes = Enumerable.Range(1, (int)(dateTimeEnd - dateTimeStart).TotalMinutes) .Where(h => { var dt = dateTimeStart.AddMinutes(h); return dt.DayOfWeek != DayOfWeek.Saturday //исключаем субботу и воскресенье && dt.DayOfWeek != DayOfWeek.Sunday && dt.TimeOfDay >= workingDayStart && dt.TimeOfDay <= workingDayEnd; //исключаем нерабочее время }).Count();
Для того, чтобы этот код работал, необходимо добавить в Usings пространство имен "System.Linq".