Вычисление времени активной работы над обращением
Всем добрый день. Для статистики и анализа качества работы предприятия возникла потребность считать время активной работы персонала с обращениями (Case). Стандартные механизмы не годятся, ибо состояний у обращения может быть 7 (новое / переоткрыто / в работе / ждет ответа / решено / закрыто / отменено), а "активными" считаются только первые 3 из них. Т.е. интересует время именно от создания обращения до его решения, а не до закрытия (ибо закрытие делается автоматикой через неделю после решения при условии что продолжения за это время не последовало), да еще и за вычетом всех ожиданий. И плюс к тому по обращениям, которые в момент запроса находятся в активных состояниях, нужно считать время нахождения в этом состоянии на текущий момент (при этом в CaseLifeCycle в соответствующей записи обычно в поле "Дата завершения" стоит NULL)
В какой-то степени задача похожа на то, что обсуждалось вот тут: https://community.terrasoft.ru/questions/vychislenie-sredney-skorosti-zakrytiya-obrascheniya Я попробовал сделать что-то аналогичное - создать представление в БД для фильтрации записей в CaseLifeCycle нужным мне способом, но запутался и с формулировкой SQL-запроса, и с организацией создания необходимых объектов в базе. Помогите разобраться, пожалуйста.
Нравится
Коллеги, пожалуйста, помогите мне разобраться с этим вопросом. К сожалению, самостоятельно не получается.
Попробую дать побольше информации, чтобы было легче понять мою ситуацию и подсказать, что нужно сделать.
Итак, есть таблица "Обращения" (Case). В ней есть поле Id. Есть и еще поля, но для данной задачи они не важны.
К каждой записи по обращению есть несколько записей в таблице "Жизненный цикл обращения" (CaseLifecycle). В ней среди прочего есть поля CaseId (к какому обращению относится запись), StatusId (в каком состоянии было обращение), StartDate и EndDate (соответственно, время начала и окончания этого состояния). Остальные поля не важны.
Кроме того, есть таблица-справочник "Статусы обращений" (CaseStatus), в котором есть поле Id (идентификатор для ссылок на него) и 3 поля-признака IsPaused, IsResolved и IsFinal логического типа. (Все остальное, опять же, не важно).
Если бы я писал программу, которая сама обращается к базе данных и сама обрабатывает результат обращения, то я бы для данной задачи вставил в эту свою программу примерно такой запрос:
SELECT CaseId, SUM( NVL( EndDate, SYSDATE ) - StartDate ) as ActiveWorkTime FROM CaseLifecycle WHERE StatusId IN ( SELECT Id FROM CaseStatus WHERE IsPaused = false AND IsResolved = false AND IsFinal = false ) GROUP BY CaseId
Ну еще бы добавил к этому фильтрацию по тем обращениям, которые меня интересуют. Ну а с результатами этого запроса работал бы так, как хотел.
Неприятность (для меня) заключается в том, что соответствующую функциональность надо встроить в Creatio, причем так, чтобы конечный пользователь не заметил никакой разницы в том, что приходится делать лично ему, но при этом бы видел соответствующую цифру в информации по обращению.
Соответственно, вопрос: как это все организовать?
Добрый день, Григорий!
Хочу у вас уточнить, вам необходимо посчитать время от перевода обращения в состояние "В работе" до "Предоставлено решение", при этом учитывая время когда оно в "Ожидание ответа"?
Дима Вовченко,
Не совсем так. Грубо говоря, нужно посчитать, сколько времени мячик находился на нашей стороне. Обращение поступило - статус "новое" - считаем. Наши люди обращение заметили - статус "в работе" - считаем. Понадобились какие-то дополнительные подробности от обратившегося - статус "ожидает ответа" - не считаем. Пришел ответ с подробностями - статус "переоткрыто" - считаем. Придумали решение - статус "решено" - не считаем. Если клиент не удовлетворен и жалуется - статус "переоткрыто" - считаем. Статус "закрыто" присваивается автоматикой если клиент за неделю не пожаловался, поэтому учитывать время от "решено" до "закрыто" не имеет смысла.
В общем-то в предъявленном SQL-запросе уже написано все, что нужно. Вопрос только в том, как этот запрос и его результат прикрутить к существующей системе.
Добрый день, Григорий.
Рекомендую обратить внимание на класс CaseActiveIntervalReader и его метод GetActiveIntervals, если не ошибаюсь, то он показывает именно то, что вам нужно.
Дима Вовченко,
А где он живет, чтобы на него посмотреть?
Григорий Шпаков,
Его можно найти в конфигурации, пакет SLM
Дима Вовченко,
Вроде бы похоже на то, что нужно. Толком пока не разобрался. И в любом случае пока непонятно, как его нужно прикручивать к этому делу.