Создание workflow. Продолжение
В прошлый раз был рассмотрен пример создания простого бизнес-процесса. В этой статье хочу рассмотреть несколько модифицированный вариант: во-первых, предлагаю добавить отправку уведомлений по почте по мере прохождения статьи по пути согласования; во-вторых, создать интерфейс для работы с бизнес-процессом в Alfresco Share
Для начала нужно определиться, что конкретно потребуется сделать для реализации заявленного функционала. Нам понадобится новое свойство, в котором будем хранить хранить ответ пользователя на вопрос "Присылать уведомления?". Это свойство мы добавим к start-task:
<!-- Свойства --> <properties> <!-- Присылать письма --> <property name="tcwf:notifyMe"> <type>d:boolean</type> <default>false</default> </property> </properties>
Также дадим возможность редактору и корректоу писать комментарии к статье по ходу рассмотрения, для этого добавим новый аспект к CorrectTask, EditTask и ReviseTask(чтобы и пользователь мог прочитать эти комментарии):
<!-- Комментарий --> <aspect>tcwf:commentAspect</aspect>
Ну и добавим описание нового аспекта:
<aspect name="tcwf:commentAspect"> <title>TrashCo commentable aspect</title> <properties> <property name="tcwf:comments"> <type>d:text</type> <mandatory>false</mandatory> <multiple>false</multiple> </property> </properties> </aspect>
Таким образом, модель данных теперь выглядит вот так (extension/tcWorkflowModel.xml):
<?xml version="1.0" encoding="UTF-8"?> <!-- Описание модели бизнес-процесса --> <model name="tcwf:workflowmodel" xmlns="http://www.alfresco.org/model/dictionary/1.0"> <!-- Необязательные метаданные модели --> <description>TrashCo Workflow Model</description> <author>lx</author> <version>0.0</version> <!-- Импорт необходимых описаний --> <imports> <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" /> <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm" /> </imports> <!-- Описываем пространство имен для нашего процесса --> <namespaces> <namespace uri="http://www.trashco.com/model/workflow/1.0" prefix="tcwf" /> </namespaces> <types> <!-- Подача статьи --> <type name="tcwf:submitTask"> <!-- Наследуем от bpm:startTask --> <parent>bpm:startTask</parent> <!-- Свойства --> <properties> <!-- Присылать письма --> <property name="tcwf:notifyMe"> <type>d:boolean</type> <default>false</default> </property> </properties> <!-- Указываем обязательные аспекты --> <mandatory-aspects> <!-- Редактор --> <aspect>bpm:assignee</aspect> <!-- Статья может быть опубликована online --> <aspect>tcwf:webable</aspect> </mandatory-aspects> </type> <!-- Корректирование статьи --> <type name="tcwf:correctTask"> <!-- Наследуем от bpm:workflowTask --> <parent>bpm:workflowTask</parent> <!-- Документ может быть отредактирован --> <overrides> <property name="bpm:packageItemActionGroup"> <default>edit_package_item_actions</default> </property> </overrides> <mandatory-aspects> <!-- Статья может быть опубликована online --> <aspect>tcwf:webable</aspect> <!-- Комментарий --> <aspect>tcwf:commentAspect</aspect> </mandatory-aspects> </type> <!-- Техническое редактирование статьи --> <type name="tcwf:editTask"> <!-- Наследуем от bpm:workflowTask --> <parent>bpm:workflowTask</parent> <!-- Документ может быть отредактирован --> <overrides> <property name="bpm:packageItemActionGroup"> <default>edit_package_item_actions</default> </property> </overrides> <mandatory-aspects> <!-- Статья может быть опубликована online --> <aspect>tcwf:webable</aspect> <!-- Комментарий --> <aspect>tcwf:commentAspect</aspect> </mandatory-aspects> </type> <!-- Доработка статьи --> <type name="tcwf:reviseTask"> <!-- Наследуем от bpm:workflowTask --> <parent>bpm:workflowTask</parent> <!-- Документ может быть отредактирован --> <overrides> <property name="bpm:packageItemActionGroup"> <default>edit_package_item_actions</default> </property> </overrides> <mandatory-aspects> <!-- Статья может быть опубликована online --> <aspect>tcwf:webable</aspect> <!-- Комментарий --> <aspect>tcwf:commentAspect</aspect> </mandatory-aspects> </type> <!-- Публикация статьи --> <type name="tcwf:publishTask"> <!-- Наследуем от bpm:workflowTask --> <parent>bpm:workflowTask</parent> <!-- Документ может быть только просмотрен --> <overrides> <property name="bpm:packageItemActionGroup"> <default>read_package_item_actions</default> </property> </overrides> <mandatory-aspects> <!-- Статья может быть опубликована online --> <aspect>tcwf:webable</aspect> </mandatory-aspects> </type> </types> <!-- Описываем аспекты, которые будем использовать --> <aspects> <!-- Статью можно опубликовать online --> <aspect name="tcwf:webable"> <title>TrashCo webable aspect</title> <properties> <property name="tcwf:publishOnline"> <type>d:boolean</type> <mandatory>true</mandatory> <multiple>false</multiple> </property> </properties> </aspect> <aspect name="tcwf:commentAspect"> <title>TrashCo commentable aspect</title> <properties> <property name="tcwf:comments"> <type>d:text</type> <mandatory>false</mandatory> <multiple>false</multiple> </property> </properties> </aspect> </aspects> </model>
Теперь добавим в бизнес-процесс код, отвечающий за отправку уведомлений. Внутри javascript-кода переменные, объявленные в модели доступны в виде <префикс>_<имя> (к примеру, tcwf:notifyMe доступна как tcwf_notifyMe). Для отправки писем (как и для многих других вещей) в Alfresco используется механизм действий (actions). Вот таким образом нужно изменить CorrectTask, чтобы инициатор стал получать письма:
<task-node name="CorrectTask"> <!-- Задача для корректора --> <task name="tcwf:correctTask" swimlane="corrector" /> <!-- Одобрить статью --> <transition name="approve" to="EditTask"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Approved"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья прошла проверку редактора и отправлена техническому редактору на рассмотрение."; mail.execute(bpm_package); } ]]> </script> </action> </transition> <!-- Отклонить статью --> <transition name="reject" to="ReviseTask"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Rejected"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья не прошла проверку редактора и нуждается в доработке. nnКомментарии:n"+ tcwf_comments; mail.execute(bpm_package); } ]]> </script> </action> </transition> </task-node>
Как видно из кода, делается это достаточно просто. Внутрь <transition> добавляется скрипт, который срабатывает при соответствующем переходе. Внутри скрипта мы проверяем, нужно ли отправлять письмо: если да, то заполняем соответствующие поля письма и отправляем его. Всё просто, но не совсем :) Есть один неприятный момент: Alfresco отправляет письма от имени того пользователя, который инициировал переход (на багзилле это значится как "expected behaviour, not a bug"). Таким образом, отсылать письма с отправителем вида noreply@somehost.zz становится затруднительно. Могу предложить такие методы решение:
- использовать хорошо настроенный локальный почтовый сервер, который при отправке изменяет соответствующие поля
- использовать внешний сервер (gmail.com, например), но в таком случае отправитель будет @gmail.com ,что тоже не очень хорошо
- прописать всем пользователям системы одинаковый адрес email :)
- написать свой класс для отправки почты
Таким образом, файл (extension/workflows/PublishPaperProcess.xml) с описанием бизнес-процесса теперь выглядит вот так:
<?xml version="1.0" encoding="UTF-8"?> <!-- Начало описания процесса --> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="tcwf:publishpaper"> <!-- Исполнитель "инициатор" --> <swimlane name="initiator" /> <!-- Исполнитель "корректор", выбирается из группы correctors --> <swimlane name="corrector"> <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"> <pooledactors>#{people.getGroup('GROUP_correctors')}</pooledactors> </assignment> </swimlane> <!-- Исполнитель "редактор", выбирается при создании процесса --> <swimlane name="editor"> <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"> <actor>#{bpm_assignee}</actor> </assignment> </swimlane> <!-- Исполнитель "издатель", выбирается из группы publishers --> <swimlane name="publisher"> <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"> <pooledactors>#{people.getGroup('GROUP_publishers')}</pooledactors> </assignment> </swimlane> <!-- Начальный узел процесса --> <start-state name="Start"> <!-- Задание для инициатора --> <task name="tcwf:submitTask" swimlane="initiator" /> <!-- Подать статью на рассмотрение --> <transition name="" to="Submit" /> </start-state> <!-- Подача статьи на рассмотрение --> <node name="Submit"> <!-- Передать корректору --> <transition name="" to="CorrectTask"/> </node> <!-- Корректирование статьи --> <task-node name="CorrectTask"> <!-- Задача для корректора --> <task name="tcwf:correctTask" swimlane="corrector" /> <!-- Одобрить статью --> <transition name="approve" to="EditTask"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Approved"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья прошла проверку редактора и отправлена техническому редактору на рассмотрение."; mail.execute(bpm_package); } ]]> </script> </action> </transition> <!-- Отклонить статью --> <transition name="reject" to="ReviseTask"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Rejected"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья не прошла проверку редактора и нуждается в доработке. nnКомментарии:n"+ tcwf_comments; mail.execute(bpm_package); } ]]> </script> </action> </transition> </task-node> <!-- Техническое редактирование статьи --> <task-node name="EditTask"> <!-- Задача для редактора --> <task name="tcwf:editTask" swimlane="editor" /> <!-- Одобрить статью --> <transition name="approve" to="PublishTask"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Approved2"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья прошла проверку технического редактора и отправлена на публикацию."; mail.execute(bpm_package); } ]]> </script> </action> </transition> <!-- Отклонить статью --> <transition name="reject" to="ReviseTask"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Rejected2"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья не прошла проверку технического редактора и нуждается в доработке. nnКомментарии:n"+ tcwf_comments; mail.execute(bpm_package); } ]]> </script> </action> </transition> </task-node> <!-- Доработка статьи --> <task-node name="ReviseTask"> <!-- Задача для инициатора --> <task name="tcwf:reviseTask" swimlane="initiator" /> <!-- Подать статьи повторно --> <transition name="resubmit" to="Submit" /> <!-- Отменить процесс публикации статьи --> <transition name="cancel" to="End" /> </task-node> <!-- Публикация статьи --> <task-node name="PublishTask"> <!-- Задача для издателя --> <task name="tcwf:publishTask" swimlane="publisher" /> <!-- Конец процесса --> <transition name="done" to="End"> <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> <!-- Отправляем уведомление --> <script> <![CDATA[ logger.log("PublishPaperProcess: Published"); if (tcwf_notifyMe) { var mail = actions.create("mail"); mail.parameters.to = initiator.properties["cm:email"]; mail.parameters.subject = "Публикация статьи"; mail.parameters.text = "Добрый день.nnВаша статья опубликована."; mail.execute(bpm_package); } ]]> </script> </action> </transition> </task-node> <!-- Последний узел --> <end-state name="End"/> </process-definition> <!-- Конец описания процесса -->
Если для отправки почты мы используем действия, то нужно настроить соответствующим образом Alfresco ( alfresco-global.properties и extension/custom-email-context.xml):
mail.host=localhost #mail.username= #mail.password= mail.port=25 mail.protocol=smtp mail.smtps.starttls.enable=false mail.smtps.auth=false
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> <beans> <!-- Указываем, откуда брать параметры почтового сервера --> <bean id="mailService" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host"> <value>${mail.host}</value> </property> <property name="port"> <value>${mail.port}</value> </property> <property name="protocol"> <value>${mail.protocol}</value> </property> <property name="username"> <value>${mail.username}</value> </property> <property name="password"> <value>${mail.password}</value> </property> <property name="defaultEncoding"> <value>${mail.encoding}</value> </property> <property name="javaMailProperties"> <props> <prop key="mail.smtps.auth">${mail.smtps.auth}</prop> <prop key="mail.smtps.starttls.enable">${mail.smtps.starttls.enable}</prop> </props> </property> </bean> </beans>
После того, как код отправки уведомлений написан, нужно настроить пользовательский интерфейс. Ниже я привел конфигурационный файл web-extension/share-custom-config.xml, отвечающий за то, как этот бизнес-процесс будет выглядеть в Alfresco Share. В файле присутствуют минимальные комментарии, которых, как мне кажется, вполне достаточно для осознания происходящего :)
<!-- Настройки интерфейса --> <alfresco-config> <!-- Отображение информации при просмотре бизнес-процесса --> <config evaluator="string-compare" condition="jbpm$tcwf:publishpaper"> <forms> <form> <!-- Список видимых полей --> <field-visibility> <show id="bpm:workflowDescription" /> <show id="bpm:assignee"/> <show id="packageItems" /> <show id="tcwf:publishOnline" /> <show id="tcwf:notifyMe" /> </field-visibility> <appearance> <!-- Блоки --> <set id="" appearance="title" label-id="workflow.set.general" /> <set id="assignee" appearance="title" label-id="tcwf_assignee" /> <set id="items" appearance="title" label-id="tcwf_items" /> <!-- Отображение полей --> <field id="bpm:workflowDescription" label-id="tcwf_description"> <control template="/org/alfresco/components/form/controls/textarea.ftl"> <control-param name="style">width: 95%</control-param> </control> </field> <field id="tcwf:publishOnline" label-id="tcwf_publish_online" /> <field id="tcwf:notifyMe" label-id="tcwf_notify_me" /> <field id="bpm:assignee" label-id="tcwf_assign_to" set="assignee" /> <field id="packageItems" set="items" label="" /> </appearance> </form> </forms> </config> <!-- Подача статьи на рассмотрение --> <config evaluator="task-type" condition="tcwf:submitTask"> <forms> <form id="workflow-details"> <!-- Список видимых полей --> <field-visibility> <show id="tcwf:publishOnline" /> <show id="packageItems" /> </field-visibility> <appearance> <!-- Блоки --> <set id="" appearance="title" label-id="workflow.set.workflow.more_info" /> <set id="items" appearance="title" label-id="tcwf_items" /> <!-- Отображение полей --> <field id="tcwf:publishOnline" label-id="tcwf_publish_online"/> <field id="packageItems" set="items" label="tcwf_items_list"/> </appearance> </form> </forms> </config> <!-- Корректирование статьи --> <config evaluator="task-type" condition="tcwf:correctTask"> <forms> <form> <!-- Список видимых полей --> <field-visibility> <show id="bpm:taskId" /> <show id="bpm:status" /> <show id="packageItems" /> <show id="transitions" /> <show id="tcwf:publishOnline"/> <show id="tcwf:comments"/> </field-visibility> <appearance> <!-- Блоки --> <set id="" appearance="title" label-id="workflow.set.task.info" /> <set id="info" appearance="" template="/org/alfresco/components/form/3-column-set.ftl" /> <set id="items" appearance="title" label-id="tcwf_items" /> <set id="progress" appearance="title" label="" /> <set id="response" appearance="title" label-id="workflow.set.response" /> <!-- Отображение полей --> <field id="bpm:taskId" set="info" label-id="tcwf_task_id"> <control template="/org/alfresco/components/form/controls/info.ftl" /> </field> <field id="tcwf:comments" label-id="tcwf_comments" set="items"/> <field id="bpm:status" set="progress" label-id="tcwf_status"/> <field id="packageItems" set="items" label-id="tcwf_items_list"/> <field id="tcwf:publishOnline" label-id="tcwf_publish_online" set="items" read-only="true"/> <field id="transitions" set="response" /> </appearance> </form> </forms> </config> <!-- Техническое редактирование статьи --> <config evaluator="task-type" condition="tcwf:editTask"> <forms> <form> <!-- Список видимых полей --> <field-visibility> <show id="bpm:taskId" /> <show id="bpm:status" /> <show id="packageItems" /> <show id="transitions" /> <show id="tcwf:publishOnline"/> <show id="tcwf:comments"/> </field-visibility> <appearance> <!-- Блоки --> <set id="" appearance="title" label-id="workflow.set.task.info" /> <set id="info" appearance="" template="/org/alfresco/components/form/3-column-set.ftl" /> <set id="items" appearance="title" label-id="tcwf_items" /> <set id="progress" appearance="title" label="" /> <set id="response" appearance="title" label-id="workflow.set.response" /> <!-- Отображение полей --> <field id="bpm:taskId" set="info" label-id="tcwf_task_id"> <control template="/org/alfresco/components/form/controls/info.ftl" /> </field> <field id="tcwf:publishOnline" label-id="tcwf_publish_online" set="items"/> <field id="tcwf:comments" label-id="tcwf_comments" set="items"/> <field id="bpm:status" set="progress" label-id="tcwf_status"/> <field id="packageItems" set="items" label-id="tcwf_items_list"/> <field id="transitions" set="response" /> </appearance> </form> </forms> </config> <!-- Публикация статьи --> <config evaluator="task-type" condition="tcwf:publishTask"> <forms> <form> <!-- Список видимых полей --> <field-visibility> <show id="bpm:taskId" /> <show id="bpm:status" /> <show id="packageItems" /> <show id="transitions" /> <show id="tcwf:publishOnline"/> </field-visibility> <appearance> <!-- Блоки --> <set id="" appearance="title" label-id="workflow.set.task.info" /> <set id="info" appearance="" template="/org/alfresco/components/form/3-column-set.ftl" /> <set id="items" appearance="title" label-id="tcwf_items" /> <set id="progress" appearance="title" label="" /> <set id="response" appearance="title" label-id="workflow.set.response" /> <!-- Отображение полей --> <field id="bpm:taskId" set="info" label-id="tcwf_task_id"> <control template="/org/alfresco/components/form/controls/info.ftl" /> </field> <field id="tcwf:publishOnline" label-id="tcwf_publish_online" set="items" read-only="true"/> <field id="bpm:status" set="progress" label-id="tcwf_status"/> <field id="packageItems" set="items" label-id="tcwf_items_list"/> <field id="transitions" set="response" /> </appearance> </form> </forms> </config> <!-- Доработка статьи --> <config evaluator="task-type" condition="tcwf:reviseTask"> <forms> <form> <!-- Список видимых полей --> <field-visibility> <show id="bpm:taskId" /> <show id="bpm:status" /> <show id="packageItems" /> <show id="transitions" /> <show id="tcwf:publishOnline"/> <show id="tcwf:comments" /> </field-visibility> <appearance> <!-- Блоки --> <set id="" appearance="title" label-id="workflow.set.task.info" /> <set id="info" appearance="" template="/org/alfresco/components/form/3-column-set.ftl" /> <set id="items" appearance="title" label-id="tcwf_items" /> <set id="progress" appearance="title" label="" /> <set id="response" appearance="title" label-id="workflow.set.response" /> <!-- Отображение полей --> <field id="bpm:taskId" set="info" label-id="tcwf_task_id"> <control template="/org/alfresco/components/form/controls/info.ftl" /> </field> <field id="tcwf:publishOnline" label-id="tcwf_publish_online" set="items"/> <field id="bpm:status" set="progress" label-id="tcwf_status"/> <field id="packageItems" set="items" label-id="tcwf_items_list"/> <field id="tcwf:comments" label-id="tcwf_comments" set="items"/> <field id="transitions" set="response" /> </appearance> </form> </forms> </config> </alfresco-config>
Вот так теперь выглядит бизнес процесс публикации статьи:
Прикрепленные файлы | Размер |
---|---|
publish_paper_pt2.zip | 10.75 кб |
Комментарии
27/03/2011 - 18:00
Очень хорошая статья. Прекрасное дополнение к первой. Большое спасибо :-)
30/03/2011 - 11:27
Отличная статья!
А как можно сделать так, чтобы корректоры и публикаторы выбирались вовремя создания процесса?
05/04/2011 - 06:29
Вы хотите указать конкретного исполнителя прямо внутри описания?
05/04/2011 - 07:51
Да. Чтобы можно было указывать корректора, редактора и издателя во время подачи статьи. Я примерно понял как этого можно добится:
1) В файле "bpmModel.xml" добавил два новых аспекта, подобных "bpm:assignee". ("bpm:myassignee", и "bpm:newassignee")
2) В вашем файле "PublishPaperProcess.xml" заменил <pooledactors>#{people.getGroup('GROUP_correctors')}</pooledactors> на <actor>#{bpm_myassignee}</actor>. Тоже проделал и с people.getGroup('GROUP_publishers').
3) Откорректировал файлы tcWorkflowModel.xml и web-client-config-custom.xml (добавил новые аспекты).
Может немного замудрено :) Но работает! Теперь можно выбирать всех троих во время подачи статьи.
Хотел бы спросить... А можно ли поставить только 1 аспект "bpm:assignees" и выбрать сколько угодно исполнителей. Но чтобы статья к ним приходила также поочередно а не сразу. Или есть ли какие либо способы добится этого?
Списибо!
05/04/2011 - 16:44
Я думал, что вы хотите непосредственно в xml с описанием указать исполнителей. Методом добавления новых аспектов я тоже пользовался :) Можно использовать bpm:assignees, но тогда будет один диалог выбора для всех исполнителей, потом можно будет обращаться к bpm_assignees[i], но так не очень удобно с практической точки зрения. Над более красивым решением подумаю, потому что самому интересно :)
19/04/2011 - 14:56
А не подскажите как именно обращаться к bpm_assignees[i]? Сколько не пытался никак не получается... И там отсчет с ноля идет или с единицы?
20/04/2011 - 22:43
Если вы хотите использовать их при создании workflow, то можете воспользоваться вот такой конструкцией:
<action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
<foreach>#{bpm_assignees}</foreach>
<var>assignee</var>
</action>
Точно не помню, как обращаться к элементам bpm_assignees. Попробуйте bpm_assignees.children[i] и for each(assignee in bpm_assignees). Индексы всех массивов начинаются с 0.
21/04/2011 - 06:33
Большое спасибо! Буду пробовать...
12/05/2011 - 10:58
Наверно лучше "bpmModel.xml" не трогать, а добавить аспекты mywf:assignee1 ... mywf:assigneeN в модель своего процесса
<aspects>
<aspect name="mywf:assignee1">
<associations>
<association name="mywf:assignee1">
<source>
<mandatory>false</mandatory>
<many>false</many>
</source>
<target>
<class>cm:person</class>
<mandatory>true</mandatory>
<many>false</many>
</target>
</association>
</associations>
</aspect>
.....
</aspects>
08/04/2011 - 14:24
После добавления файлов Alfresco вообще не запустилась
08/04/2011 - 21:12
Что в логах по этому поводу написано?
26/09/2011 - 09:28
Здравствуйте, подскажите пожалуйста решение следующей проблемы,
Сделал бизнес процесс в соответствии со статьей, всемто префикса tcwf использовал itwf.
B share список процессов "Выбирите бизнес процесс" не открывается
А в логах появляется запись:
ERROR [org.springframework.extensions.webscripts.AbstractRuntime] Exception from executeScript - redirecting to status template error: Wrapped Exception (with status template): Namespace prefix tcwf is not mapped to a namespace URI
org.springframework.extensions.webscripts.WebScriptException: 08260002 Wrapped Exception (with status template): Namespace prefix tcwf is not mapped to a namespace URI
В файле tcWorkflowModel.xml:
<!-- Импорт необходимых описаний -->
<imports>
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
<import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm" />
</imports>
<!-- Описываем пространство имен для нашего процесса -->
<namespaces>
<namespace uri="http://lidia/model/content/2.0" prefix="itwf" />
</namespaces>
Если добавляю строку
<namespace uri="http://www.trashco.com/model/workflow/1.0" prefix="tcwf" />
То процесс открывается и показан в списке процессов, но там же присутствует и процес tcwf:publishpaper
Проверил все файлы в директориях extension и web-extension tcwf нигде не обнаружил.
Как избавится от старого процесса и необходимости добавлять namespase prefix="tcwf"
Заранее благодарен.
26/09/2011 - 09:35
Проблема именно в том, что в каком-то файле всё ещё присутствует префикс tcwf. Проверьте файл с описанием процесса, да и все остальные файлы тоже (use grep, Luke).
27/09/2011 - 00:59
Спасибо за оперативный ответ, однака проблема не решена
Файлы которые нашол grep либо логи либо базы данных, может быть пространство имен как то в базу данных попадает и ее вычищать.
Выдача grep -rl "tcwf" ./
./alf_data/lucene-indexes/workspace/SpacesStore/123/_0.cfs
./alf_data/backup-lucene-indexes/workspace/SpacesStore/123/_0.cfs
./mysql/data/ib_logfile1
./mysql/data/ibdata1
./tomcat/logs/catalina.out
./alfresco.log
В папках extension и web-extension точно нет никаких упоменаний о "tcwf"
При открытии http://localhost:8080/share/page/start-workflow?referrer=tasks "Выбитите бизнес процес" в логах появляется
ERROR [org.springframework.extensions.webscripts.AbstractRuntime] Exception from executeScript - redirecting to status template error: 08270005$
org.springframework.extensions.webscripts.WebScriptException: 08270005 Wrapped Exception (with status template): Namespace prefix tcwf is not mapped to a na$
Caused by: org.alfresco.service.namespace.NamespaceException: Namespace prefix tcwf is not mapped to a namespace URI
at org.alfresco.service.namespace.QName.createQName(QName.java:101)
27/09/2011 - 08:12
Попробуйте открыть workflow console и выполнить там команду "show definitions all".
29/09/2011 - 02:35
Спасибо это помогло.
Есть еще вопрос, как можно сделать так чтобы в форме "Бизнес процесса" отображалось имя initiator и bpm:assignee?
И как добавить в почтовые сообщения (уведомления) Пользователей bpm:assignees
В файле бизнес процесса
mail.parameters.text = " Бла бла. Исполнители:"+bpm_assignees; не работает.
Я так понимаю что нужно добавить аспект в workflow.xml но как это сделать для bpm:assignees ?
Заранее огромное спасибо.
29/09/2011 - 10:40
Не пробовал никогда отображать initiator в форме. Такой же способ, как и для bpm:assignee, не подходит?
По поводу второго вопроса: http://wiki.alfresco.com/wiki/WorkflowAdministration#Step_3:_Add_Behaviour_to_the_Process_Definition
01/11/2011 - 18:01
а как добавлять свои формы:как правильно их называть и куда ложить?
02/11/2011 - 18:46
Что конкретно вы хотите получить от добавления новых форм?
08/12/2011 - 16:40
Не подскажите ли как аналогично реализовать бизнес-процесс с помощью BPMN2.0 и плагина Activiti Designer для Eclipse?
12/12/2011 - 20:12
Можете почитать вот эту статью.
12/04/2012 - 17:16
Здравствуйте!
У меня такая глупая ситуация. Пытаюсь послать письмо из процесса вот так:
Письмо доходит. А вот прикрепленные к процессу файлы - нет Сообщений об ошибке нет. Т е просто письмо с заголовком и текстом, но без аттачмента. Что делать, куда смотреть?
15/04/2012 - 10:56
https://forums.alfresco.com/en/viewtopic.php?t=10386#p51285
16/04/2012 - 09:46
Спасибо большое!
04/02/2013 - 11:51
Разложил по папкам файлы из архива, но в Share бизнес процесс не появился! Подскажите пожалуйста, куда смотреть и что курить.
upd.
Изменил конфиг как написано тут http://www.ossportal.ru/technologies/alfresco/blogs/64#comment-2120
В списке процессов появился. Но при попытке начать процесс вылетает ошибка org.alfresco.service.cmr.workflow.WorkflowException: 01040136 Failed to signal transition null from workflow task jbpm$609.
upd2.
Группы не создал. Все работает!
05/02/2013 - 09:23
10/05/2013 - 17:52
У меня вопросик по поводу, как в модели локализации (*.properties) прописать свои названия для полей ввода т.е. как к ним обращаться? Я пока пробовал так: wf_workflowmodel.property.wf_description.title=бла бла бла, но, не чего не произошло. Буду дальше что-то пробовать =)
Зарание спасибо!
13/05/2013 - 13:16
13/05/2013 - 13:34
http://pixs.ru/showimage/workflowjp_5930775_7958323.jpg
05/11/2014 - 08:47