Работа со статусами. Управление статусами заявок, сущностей в личных кабинетах пользователей

Демо компонента переключения статусов некой сущности - https://demo.web-automation.ru/list/watch/upravlenie-statusom-nekoego-ob-ekta---113

Введение в сущности

Сущность - это некий объект, который должен иметь возможность последовательно менять свой статус.

При этом возможна реализация разграничения полномочий на смену статуса между ролями. А также автоматизация дополнительных функционалов при смене статуса сущностью (например, отправка уведомлений, формирование неких других объектов, добавление комментариев, и т. д.).

В системе автоматически ведется лог изменения статусов сущности.

Реализация механизма Сущности

Будем рассматривать на примере. Допустим есть такой объект в нашей системе как Проект. Мы хотим реализовать Проект как Сущность.

1. Создание новой сущности, описание возможных статусов

В меню Компоненты / Статусы добавим запись о новой сущности Проект, указав её код project. При этом в БД добавится новая запись в системную таблицу as_en_entities.

Далее перейдем на страницу со статусами новой сущности и добавим там последовательно все необходимые статусы. Физически статусы сущности хранятся в системной таблице as_en_statuses.

При добавлении статуса указывается его код, желательно уникальный в системе, чтобы не перепутать его со статусом имеющим такое же название для какой-то другой сущности в системе.

Обязательно указывайте номер по порядку для статуса, а также цвет.

Далее необходимо заполнить возможные переходы из каждого статуса в меню Доступные статусы.

Например, из статуса Черновик проект можно перевести только в статус Опубликован, либо в Аннулирован. Причем право на выполнение этого перехода есть только у роли customer. На кнопках выбора следующих статусов будет написано соответственно Опубликовать и Аннулировать.

2. Экземпляры сущности

Сама сущность Проект - это одна запись в таблице as_en_entities с кодом project.

Экземпляры сущности, например, Проект №1, Проект №2, Проект №3, и т. д., будут храниться в таблице as_en_entityInstances.

В первом пункте мы создали сущность Проект. Необходимо теперь привязать это понятие к нашим проектам в базе данных. Делается это следующим образом.

Допустим наши проекты и вся информация по ним лежит в таблице au_projects. Теперь необходимо добавить в эту таблицу еще одно поле - instanceID. Это будет внешний ключ к таблице as_en_entityInstances. Таким образом, создастся связь типа “один к одному” между au_projects и as_en_entityInstances.

3. Добавление нового экземпляра сущности

Самый простой способ создания нового экземпляра сущности - это реализация FastCreate в таблице с перечнем экземпляров данной сущности.

Например, в таблице проектов projects быстрым созданием по названию будет создаваться новый проект. При этом необходимо в crud_projects_fastCreate прописать вставку новой записи не только в au_projects, но и предварительно вставку новой записи в as_en_entityInstances. И только потом с полученным новым instanceID вставлять новую запись в au_projects.

4. Страница экземпляра сущности

Для формирования страницы для работы с отдельным экземпляром сущности необходимо предварительно создать форму объекта, который выступает сущностью. Форма объекта, как обычно, будет содержать поля объекта для просмотра или редактирования.

В нашем случае создадим форму entityProject для управления полями объекта Проект.

После этого создадим страницу для экземпляра сущности, на которой расположим сниппеты:

  • Обычный сниппет формы:
    <div class="as-form" data-code="{formCode}" data-itemid="falcon-space--rabota-s-sushchnostyami"></div>
  • Cниппет для управления статусами экземпляра сущности:
    <div class="entity" data-code="{entityCode}" data-itemid="falcon-space--rabota-s-sushchnostyami" data-type="item"></div>

5. Переход от страницы с перечнем сущностей к странице с выбранным экземпляром

Очень важно правильно настроить переход на страницу выбранного экземпляра сущности из таблицы с перечнем. Тут есть следующий нюанс.

Когда вы делаете одну из колонок таблицы ссылкой на страницу экземпляра, то под видом itemID следует передавать не id из проектной таблицы экземпляров, а именно instanceID.

6. Логирование смены статусов

Запись о смене статуса в лог as_en_statusesLog производится автоматически только в случае естественного перевода экземпляра в следующий статус - нажатием пользователем соответствующей кнопки перевода в статус.

Если где-либо вы программно прописываете реализацию принудительного перехода экземпляра в статус, то не забывайте также вставлять соответствующую запись в as_en_statusesLog.

7. Таблицы БД 

Это все таблицы с префиксом as_en_

Хранимые процедуры для работы с сущностями

Процедура ДО изменения статуса

Процедура en_{entityCode}_checkStatus вызывается для выполнения необходимых проверок перед сменой статуса у экземпляра сущности.

Параметры: instanceID, fromStatusCode, toStatusCode, username

Результат Select: msg, result, bit softMode, withoutConfirm, okButtonStyle, okButtonText, cancelButtonStyle, cancelButtonText.

Параметр softMode:

  • Если softMode = 1, то это означает, что ограничение является нежестким и можно по подтверждению все равно сменить статус.
  • Если softMode = 0, то в случае невозможности сменить статус, идет сообщение об этом, без возможности принудительно сменить статус.

withoutConfirm - если 1, то подтверждение операции не будет запрошено у пользователя (по умолчанию 0)

okButtonText,cancelButtonText - задают текст кнопки для Отмены и для Подтверждения действия.

okButtonStyle, cancelButtonStyle - задают стиль кнопки. Значения - danger, warning,success, secondary, primary, info, light

Процедура ПОСЛЕ изменения статуса

Процедура en_{entityCode}_afterChangeStatus вызывается после успешной смены статуса у экземпляра сущности.

Параметры: instanceID, statusCode, username

Результат

SELECT 1:

  • msg,
  • result,
  • icon - задает иконку в окне результата (например, 'fa-code'),
  • refreshContainer (после смены статуса идет обновление некоего контейнера на странице, чей селектор указан в параметре),
  • redirectUrl (если указан, то после смены статуса пользователь перенаправляется на указанную страницу).

SELECT 2: вызовы внешних действий (почта, смс, уведомление и т.д.). См. вызов внешних действий.

Например, в эту процедуру удобно вставить вызов процедуры для формирования уведомлений участникам операции в системе, либо автоматизацию формирования каких-либо документов.

На клиентскую сторону (в коллбек afterChangeStatus) передаются параметр Msg из хранимки (если непустой) и параметр AdditionalData как результат выполнения внешних действий.  

Процедура вывода дополнительной панели для статуса

Процедура en_{entityCode}_getStatusAdditionalToolbar содержит в себе вывод дополнительной разметки под кнопками переходов в доступные статусы.

Параметры: instanceID, entityCode, statusCode, username, langID

Результат Select: msg, result

В данном случае msg содержит строку разметки дополнительной панели.

Например, когда проект будет переведен в статус Выполнен, можно добавить в дополнительную панель кнопку “Добавить отзыв”. Тогда msg должна содержать, к примеру, вызов модальной формы на добавление отзыва исполнителю проекта.

CREATE PROCEDURE [dbo].[en_project_getStatusAdditionalToolbar]
	@instanceID int,
	@entityCode nvarchar(32),
	@statusCode nvarchar(32),
	@username nvarchar(32),
	@langID int = 1
AS
BEGIN
	if @statusCode = 'done'
           SELECT 'Добавить отзыв' Msg,
                   1 Result
        else
           SELECT '' Msg, 0 Result
END

Хранимая процедура вывода доступных статусов

По умолчанию используется стандартная процедура as_en_getAvailableStatusesForInstance.

Если вам необходима своя процедура, то вы устанавливаете режим Кастомная процедура AvailStatuses = ДА (поле useCustomStatusSP в таблице as_en_entities) и реализуете процедуру en_{entityCode}_getAvailableStatusesForInstance (столбец SQL доступных статусов)

Как сделать JS коллбек после смены статуса 

Для этого объявляем функцию 

$(function(){
   as.entitycallbacks["{entityCode}_afterChangeStatus"]=function(data, params){
       // data - то что пришло от сервера, params - code, itemID, statusCode
   }
});

Обновление апрель 2021. Вместо объекта  as.entity.callbacks теперь используется as.entitycallbacks

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.