Нравится
Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу
Добрый день, Петр!
В базовой конфигурации есть поле "Фактические трудозатраты" (ActualWorkingTime), которое подсчитывается на основании активностей по инциденту/запросу на обслуживание. Если Вам нужна именно разница между датой разрешения и регистрации, то нужно самостоятельно добавить это поле, и рассчитывать или на странице, или в процессе объекта.
А среднее по всем или за какой-то период удобно будет смотреть с помощью построения графика на вкладке "Аналитика".
Петр, а что конкретно Вас интересует в способе реализации? Вроде бы ничего особенно сложного...
Петр, тут зависит от специфики отработки инцидентов в Вашей компании. Можно реализовать эту логику либо в процессе объекта, тогда изменения будут только после созранения записи в разрешенном состоянии , либо в процессе карточки, тогда заполнять поле можно будет сразу на карточке при изменении состояния на разрешенное.
Для процесса объекта код будет выглядеть примерно следующим образом:
[csharp]
var solvedStatusId = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "StatusOfSolvedIncident"); //разрешенное состояние
var statusOfIncidentId = Entity.GetTypedColumnValue("StatusOfIncidentId"); //текущее состояние
if (statusOfIncidentId == solvedStatusId) {
DateTime registeredDt = Entity.GetTypedColumnValue("RegisteredOn");
DateTime solutionProvidedDt = Entity.GetTypedColumnValue("SolutionProvidedOn");
TimeSpan timeForSolution = solutionProvidedDt - registeredDt; //промежуток времени, затраченный на решение
int minutesForSolution = timeForSolution.TotalMinutes; //целое число минут, затраченных на решение
Entity.SetColumnValue("MinutesForSolution", minutesForSolution); //установка значения в поле "MinutesForSolution" типа "Целое число"
}
[/csharp]
Здесь, как видно, работа происходит с конкретным экземпляром записи. Выполнять эти действия нужно в обработчике события Сохранения (ServiceRequestSaving).
При реализации данной логики на карточке редактирования, данные будут получаться и устанавливаться из контролов страницы. Пример:
[csharp]
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" типа "Целое число"
}
[/csharp]
Это можно делать, к примеру, в обработчике события изменения поля "Статус".
Здравтсвуйте, Петр!
1. Попробуйте добавить поле на карточку путем перетягивания поля из источника данных. Таким образом сразу добавляется поле нужного типа с привязкой.
2. Да, оптимальным решением будет выполнить SQL-скрипт, который бы пересчитал поле для других записей.
Петр, а если ввести в нее значение, в реестре увидите изменения?
Попробуйте колонку в источник данных передобавить.
Петр, не могли бы Вы экспортировать и выложить схемы страницы и объекта для анализа?
Если нет такой возможности, предлагаю Вам обратиться в службу тех. поддержки, организуем удаленное подключение и решим проблему.
Здравствуйте, Петр!
Проблему с отображением значения поля мы решили в ходе удаленного подключения.
Во поводу выходных. Можно подсчет реализовать следующим образом, используя LINQ:
[csharp]
DateTime dateTimeStart = Entity.GetTypedColumnValue("RegisteredOn");
DateTime dateTimeEnd = Entity.GetTypedColumnValue("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();
[/csharp]
Для того, чтобы этот код работал, необходимо добавить в Usings пространство имен "System.Linq".