Нравится

14 комментариев

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу

Добрый день, Петр!
В базовой конфигурации есть поле "Фактические трудозатраты" (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".

Показать все комментарии