Нестандартные сообщения о результате выполнения задач в Alfresco и Activiti

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

Мы столкнулись с проблемой перевода статуса задачи, разрабатывая Alvex, наше решение для управления бизнес-процессами и проектами.

Давайте для примера рассмотрим бизнес-процесс с одной задачей:

image

Скорее всего, вам потребуются собственные надписи на кнопках при выполнении задачи и сообщения о результате ее выполнения в истории бизнес-процесса:

image

image

Загвоздка заключается в том, что Alfresco использует разные подходы к локализации этих строк, хотя они зачастую одинаковы.

1. Кнопки в форме задачи

Вам потребуется:

  • Заменить стандартное свойство bpm:outcomePropertyName на новое в своей модели задачи и наложить на новое свойство ограничение
  • Добавить строки локализации для ограничения
  • Настроить интерфейс Share

Шаг 1. Модель задачи

Для задачи ‘Approve’ (согласовать) модель задачи очень простая, пока мы не решим добавить в неё свои нестандартные кнопки:

<type name="alvexcourse:approveTask">
	<parent>bpm:workflowTask</parent>
</type>

При добавлении ограничения она становится чуть сложнее:

<type name="alvexcourse:approveTask">
	<!-- Заменяем родителя нашего типа задачи с bpm:workflowTask на bpm:activitiOutcomeTask -->
	<parent>bpm:activitiOutcomeTask</parent>
	<!-- Создаем новое свойство, накладывая на него ограничение со списком допустимых результатов выполнения задачи -->
	<properties>
		<property name="alvexcourse:okOutcome">
		<type>d:text</type>
			<default>OK</default>
			<constraints>
				<constraint type="LIST" name="alvexcourse:okOutcomeConstraint">
					<parameter name="allowedValues">
						<list>
							<value>OK</value>
						</list>
					</parameter>
				</constraint>
			</constraints>
		</property>
	</properties>
	<!-- Заменяем bpm:outcomePropertyName на наше новое свойство -->
	<overrides>
		<property name="bpm:outcomePropertyName">
			<default>{http://alvexcore.com/prefix/alvexcourse}okOutcome</default>
		</property>
	</overrides>
</type>

Шаг 2. Пакет локализации

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

listconstraint.alvexcourse_okOutcomeConstraint.OK = Approve document

Создаем аналогичный файл, где эта строка будет переведена на русский:

listconstraint.alvexcourse_okOutcomeConstraint.OK = Согласовать документ

'listconstraint' - неизменный префикс ограничения по списку допустимых значений, 'alvexcourse_okOutcomeConstraint' - префикс модели и имя ограничения, которые разделены не ':', а '_', 'OK' - значение.

Step 3. Конфигурация Share

Теперь нам нужно показать новое свойство с примененным ограничением вместо ‘transitions’. Заменяем <show id=”transitions” /> на:

<show id="alvexcourse:okOutcome" />

И отобразить новое свойство, используя контрол ‘activiti-transitions.ftl’. Заменяем <field id=”transitions” set=”response” /> на:

<field id="alvexcourse:okOutcome" set="response">
	<control template="/org/alfresco/components/form/controls/workflow/activiti-transitions.ftl" />
</field>

После того, как мы применили все изменения, надпись на кнопке стала правильной:

image

Но статус задачи в истории бизнес-процесса по-прежнему неправильный:

image

2. История бизнес-процесса

В пакет локализации модели задачи нужно добавить всего одну строку:

workflowtask.outcome.OK = Document approved

В русскоязычный пакет локализации:

workflowtask.outcome.OK = Документ согласован

'workflowtask.outcome' неизменный префикс, 'OK' - значение.

Теперь статус задачи в истории бизнес-процесса тоже правильный:

image

Материалы

Вы можете загрузить используемый в этой записи тип бизнес-процесса со всеми нужными файлами с GitHub.

Обратите внимание

Заметьте, что в пакете локализации в строках для истории бизнес-процесса отсутствует имя модели. Это означает, что при совпадении значений (id) с другими моделями задач, какие-то из значений будут затираться. Мы надеемся, что такое поведение системы будет исправлено в будущих версиях Alfresco.

Оригинал записи взят из блога компании ITD Systems.

2061

Комментарии

Мне кажется, что привязка надписей на кнопках к ограничению типа "список" нежелательна. Создавать новые сущности в модели только для изменения интерфейса - не лучший выход. 
По существу, в Activiti транзиций нет вообще (в отличие от jbpm), путь процесса выбирается в гейтвеях на основании тех или иных даных, накопленных процессом раннее. 
Теоретически можно иметь во всех задачах одну большую кнопку "Готово", а выбор осуществлять, например,  селектами или радиокнопками (чекбоксами).
Главное - чтобы результат выбора был записан в нужную переменную. Безусловно, вариант с выбором действия путем нажатия кнопок является наиболее привычным и ожидаемым для пользователя, поэтому попробуем использовать имеющийся функционал контрола activiti-transition.ftl. Если проанализировать файл activiti-transiti.js, отвечающий за отрисовку кнопок, то видно, что надписи на кнопках и связанные с ними значения получаются на строне клиента путем разбиения некоторой строки разделителем "#alf#" на подстроки, каждая из которых имеет вид "Идентификатор|Надпись". Эта строка генерируется на сервере, используя значения в списке ограничений и соответствующие строки локализации - но только в том случае, если в параметрах контрола не задано значение "option". Если же параметр указан напрямую, то будет использоваться он. Например:
<field id="my:outcome" label-id="workflow.field.outcome" set="response">
  <control template="/org/alfresco/components/form/controls/workflow/activiti-transitions.ftl" >
    <control-param name="options">way3|Передать консультантам#alf#reject|Отвергнуть с омерзением#alf#approve|Благословить</control-param>
  </control>
</field>
При этом поле "my:oucome" может быть обычным текстовым полем без всяких ограничений. При сабмите формы контрол запишет возвращаемое значение в переменную процесса my_outcome.
Минусом указанного подхода является жесткое кодирование надписей на кнопках, не зависящее от локали. Но в случае, если приложение делается под одну локаль, это не критично.
Что касается строк, которые возвращаются задачей после завершения, то в модели процесса определено свойство "bpm:outcomePropertyName", имеющее тип "d:qname". Переопределяя это свойство в конкретной задаче процесса, можно получить для каждого процесса требуемый набор возвращаемых значений. Например для "wf:activitiReviewTask" это выглядит так:
<overrides>
  <property name="bpm:outcomePropertyName">
    <default>{http://www.alfresco.org/model/workflow/1.0}reviewOutcome</default>
  </property>
</overrides>
P.S.
Вышел долгожданный релиз 4.2.d, с чем и поздравляю всех)