Настройка исключений в графике обслуживания
Добавить дату исключения из общего графика обслуживания
Описание
Для учета праздничных дней, переносов при выпадении праздничных дней на рабочие или локальных изменений графика работы организаций можно задать исключение, т.е. календарный день, в рамках которого обслуживание будет предоставлять по нестандартному графику. Аналогично периодам обслуживания в рамках дня исключения можно задать конкретные временные периоды, в течение которых будет происходить отсчет регламентного времени.
Исключение – календарный день, в течение которого обслуживание производится не в рамках стандартного графика (используется для учета выходных и праздничных дней).
Период исключения – временной промежуток обслуживания в течение исключения, когда происходит отсчет регламентного времени.
Если задано исключение, то время отсчитывается по периодам исключения:
- отсутствие периодов означает, что время не учитывается;
- если задан период, то время учитывается в указанный период;
- если указан период 0:00 — 24:00, то отсчет производится в течение всего дня исключения.
Исключения в графике обслуживания могут быть настроены в двух вариантах:
- календарный день — если указана только дата и в рамках этой даты не указан ни один период, то весь этот день считается нерабочим;
- периоды исключений — если указаны дата и периоды исключений, то это периоды обслуживания в этот конкретный день.
Место настройки в интерфейсе
Меню навигации "Справочники" → "Системные справочники" → "Классы обслуживания" → страница класса обслуживания → блок "Исключения в графике обслуживания".
Для списка применяется сортировка по убыванию дат.
Выполнение настройки
В блоке "Исключения в графике обслуживания" нажмите кнопку Добавить исключение. На форме добавления исключения выберите дату исключения и нажмите Сохранить. Форма добавления закроется, карточка класса обслуживания обновится.
Добавить период исключения
В рамках одного календарного дня можно добавить несколько периодов исключения:
Место настройки в интерфейсе
Меню навигации "Справочники" → "Системные справочники" → "Классы обслуживания" → , страница класса обслуживания → блок "Исключения в графике обслуживания".
Выполнение настройки
В блоке "Исключения в графике обслуживания" нажмите иконку добавления
в строке дня исключения. На форме добавления периода исключения выберите рамки периода обслуживания. Для выбора значения можно воспользоваться поиском в поле выбора.
Нажмите Сохранить. Форма добавления закроется, карточка класса обслуживания обновится.
Изменить период исключения в рамках одной даты
Место настройки в интерфейсе
Меню навигации "Справочники" → "Системные справочники" → "Классы обслуживания" → , страница класса обслуживания → блок "Исключения в графике обслуживания".
Выполнение настройки
В блоке "Исключения в графике обслуживания" нажмите иконку редактирования
в строке дня исключения.
На форме редактирования периодов исключения:
- Чтобы изменить временные границы периода исключения, выберите новые значения в списках. Для выбора значения можно воспользоваться поиском в поле выбора.
- Чтобы удалить период исключения, нажмите иконку удаления
в строке периода исключения.
Нажмите Сохранить. Форма редактирования закроется, внесенные изменения будут применены, карточка класса обслуживания обновится.
Удалить дату исключения
Чтобы удалить исключение в графике обслуживания, в карточке класса обслуживания в блоке "Исключения в графике обслуживания" нажмите иконку удаления
в строке с датой исключения.
Примеры добавления исключений в класс обслуживания
Пример 1
Скрипт изменяет класс обслуживания у всех открытых запросов, независимо от того, какой класс обслуживания был настроен ранее (например, 8х5 или 24х7).
Если необходимо обновить класс обслуживания с учетом текущего класса, используйте скрипт из Примера 2.
Условие: Класс "Запрос", системный атрибут "Класс обслуживания" (serviceTime).
Исключения в класс обслуживания добавляются через файл (Загрузка и выгрузка исключений для классов обслуживания) или вручную в элементе справочника "Классы обслуживания" (servicetime). В этом случае автоматически создается черновик класса обслуживания, который затем утверждает технолог.
После добавления исключений в класс обслуживания запускается скрипт, который изменяет класс обслуживания на указанный по UUID у всех открытых запросов с любым классом обслуживания.
При большом количестве запросов обновление выполняется постепенно. Чтобы процесс проходил стабильно и без перегрузки системы, следует выполнять актуализацию пачками по N объектов (оптимально — по 50). Для этого создайте временную задачу планировщика, которая с заданной периодичностью будет обрабатывать еще не обновленные объекты.
def newClassUuid = 'servicetime$123'
// получаем объекты так, чтобы не получать уже актуализированные и те, актуализация которых не требуется
def scs = api.db.query("SELECT 'serviceCall\$' || id FROM serviceCall WHERE state != 'closed' AND serviceTime.id != :classId")
.set('classId', newClassUuid.split('\\$')[1])
.setMaxResults(50)
.list()
def newClass = utils.get(newClassUuid)
for (def sc : scs) {
try {
utils.editWithoutEventActions(sc, ['serviceTime': newClass], true)
} catch (Exception e) {
logger.error("[Изменение класса обслуживания] Не удалось выполнить для ${sc}!", e)
}
}
logger.info("[Изменение класса обслуживания] Успешно завершено для ${scs.size()} запросов.")
return scs.size()
Если у счетчика времени установлен флажок в параметре "Разрешить пересчет временных характеристик при смене класса обслуживания объекта", то после обновления будет выполнен пересчет временных характеристик обратного счетчика, ссылающегося на данный класс обслуживания.
Пример 2
Условие: Класс "Запрос", системный атрибут "Класс обслуживания" (serviceTime).
После добавления исключений в класс обслуживания запускается скрипт, который изменяет класс обслуживания на указанный по UUID у всех открытых запросов с учетом их текущего класса обслуживания.
Скрипт выбирает запросы с текущим классом обслуживания и обновляет их на новую версию соответствующего класса обслуживания. Обработка выполняется пачками по N объектов, что позволяет избежать перегрузки системы и ошибок при массовых изменениях.
// ПАРАМЕТРЫ ------------------------------------------------------------
def METACLASS = 'serviceCall'
def SERVICE_TIME = 'serviceTime' // Атрибут типа Элемент справочника, на класс обслуживания
def EDIT_NUM = 10; // Число объектов редактируемых в одной транзакции
def LIMIT = 1000; // Число объектов редактируемых за один запуск скрипта
// ФУНКЦИИ --------------------------------------------------------------
def editObjects = { objectUuids ->
def count = 0
for (uuid in objectUuids)
{
try
{
def object = utils.get(uuid);
def oldServiceTime = object[SERVICE_TIME]
def newServiceTime = utils.get('servicetime', ['title': oldServiceTime.title, 'status': 'active'])
if (newServiceTime)
{
utils.editWithoutEventActions(object, [(SERVICE_TIME): newServiceTime]);
logger.info("[Обновление класса обслуживания] Объект ${uuid} отредактирован: ${oldServiceTime?.UUID} -> ${newServiceTime?.UUID}");
count += 1;
}
else
{
logger.info("[Обновление класса обслуживания] Объект ${uuid} не отредактирован: для ${oldServiceTime?.UUID} нет актуальной версии");
}
}
catch (Exception e)
{
logger.warn("[Обновление класса обслуживания] Не удалось отредактировать объект ${uuid}: ${e.toString()}", e);
}
}
return count
}
// ОСНОВНОЙ БЛОК --------------------------------------------------------
try
{
// получаем все объекты в статусах отличных от Закрыт (closed), у которых класс обслуживания является устаревшим (old)
def uuids = api.db.query("SELECT '${METACLASS}\$'||cast(o.id as string) FROM ${METACLASS} o WHERE o.state <> 'closed' AND o.${SERVICE_TIME} IS NOT NULL AND o.${SERVICE_TIME}.status = 'old'")
.setMaxResult(LIMIT)
.list();
logger.info("[Обновление класса обслуживания] Всего найдено объектов для обновления класса обслуживания (ограничение - ${LIMIT}): ${uuids.size()}")
// Разделяем объекты на пачки по EDIT_NUM
def uuidBatches = uuids.collate(EDIT_NUM);
def batchCount = uuidBatches.size()
logger.info("[Обновление класса обслуживания] Количество пачек объектов: ${batchCount}")
// Выполняем обработку объектов пачками
for (int i = 0; i < batchCount; i++)
{
try
{
def count = api.tx.call { editObjects(uuidBatches[i]) };
logger.info("[Обновление класса обслуживания] [${i + 1}/${batchCount}] Изменено ${count} объектов из ${Math.min(uuidBatches[i].size(), EDIT_NUM)}");
}
catch (Exception e) {
logger.info("[Обновление класса обслуживания] [${i + 1}/${batchCount}] Получена ошибка: ${e.toString()}", e);
}
}
logger.info("[Обновление класса обслуживания] Редактирование объектов завершено");
}
catch (Exception e)
{
logger.warn("[Обновление класса обслуживания] Получена ошибка: ${e.toString()}", e);
}
Пример 3
Для запроса установлен класс обслуживания, как значение пользовательского атрибута типа "Элемент справочника".
В этом случае при добавлении исключения черновик класса обслуживания не создается.
Рекомендуется выполнить следующие действия:
- Создать копию класса обслуживания, в который нужно внести исключение.
- Добавить исключение.
- Применить скрипт, меняющий класс обслуживания в незакрытых запросах на новый.
Если у счетчика времени установлен флажок в параметре "Разрешить пересчет временных характеристик при смене класса обслуживания объекта", то после обновления будет выполнен пересчет временных характеристик обратного счетчика, ссылающегося на данный класс обслуживания.