Главная > Oracle e-Business Suite, Workflow > Workflow: Отправка уведомления


Workflow: Отправка уведомления

Данная статья описывает процесс создания workflow процесса для отправки уведомления.

Версия Oracle Workflow Builder 2.6.3.5

1 Создание нового Workflow

Открываем Oracle Workflow Builder


Открываем файл WF\DATA\US\WFSTD (находится в директории установленного workflow)


2 Создаем новый Item Type


    Заполняем поля:

  • Internal Name: XX_DEMO
  • Display Name: XX Demo
  • Description: Тестовый пример



3 Создаем новый Process



    Заполняем поля:

  • Internal Name: XX_DEMO_PROCESS
  • Display Name: XX Demo process
  • Description: Тестовый пример



4 Создаём Attrubute



    Заполняем поля:

  • Internal Name: P_NUMBER
  • Display Name: Number
  • Description: Число
  • Type: Number



Создаём еще один атрибут:

    Заполняем поля:

  • Internal Name: P_TEXT
  • Display Name: Text
  • Description: Текст
  • Type: Text
  • Lenght: 400


Создали два атрибута:


5 Заполняем логику процесса



Выполняем double click по иконке процесса, откроется окно содержания процесса


Теперь необходимо создать функции Start и Stop. Их можно создать вручную или же перетащить из workflow Standart




Открываем свойства функции Start и переходим на вкладку Node


Для свойства Start/End выставляем значение Start.


Открываем свойства функции End,переходим на вкладку Node, для свойства Start/End выставляем значение End.



6 Создаем Message



Создаем новое сообщение

    Заполняем поля:

  • Internal Name: XX_FIRST_MESSAGE
  • Display Name: XX First Message
  • Description: Тестовое сообщение



Переходим на вкладку Body и заполняем текст сообщения



Непосредственно в сообщение надо перетащить атрибуты.



7 Создаем Notification



Создаем уведомление

    Заполняем поля:

  • Internal Name: XX_FIRST_NOTIFICATION
  • Display Name: XX First Notification
  • Description: Тестовое уведомление
  • Message: XX First Message



Помещаем уведомление в процесс



C помощью стрелочек задаем последовательность действий. Стрелки создаются с помощью правой кнопки мыши.


Открываем свойства уведомления и задаем получателя.

Получателем можно устанавливать недосредственно USER_NAME или же роль.


8 Сохраняем Workflow



Можно сохранить на локальный компьютер (затем загрузить в базу через wfload), а можно сразу в базу.



9 Запуск Workflow



Запуск workflow из pl/sql

DECLARE
  p_itemtype varchar2(100) := 'XX_DEMO';
  p_itemkey  NUMBER := 1; -- уникальный id, должен меняться
BEGIN

  wf_engine.threshold := 2;

  wf_engine.createprocess(p_itemtype, p_itemkey, 'XX_DEMO_PROCESS');

  --set the attribute values in workflow so that you can use them in notifications
  wf_engine.setitemattrtext(p_itemtype, p_itemkey, 'P_NUMBER', 1);
  wf_engine.setitemattrtext(p_itemtype, p_itemkey, 'P_TEXT','А роза упала на лапу Азора');

  -- start the workflow process
  wf_engine.startprocess(p_itemtype, p_itemkey);
  -- для немедленной обработки workflow
  wf_engine.background(p_itemtype);

END;


10 Просмотр уведомления



Полномочия Системный администратор. Поток операций : Поток операций администратора: Уведомления



Для того, чтобы уведомление приходило на почту — назначить пользователю сотрудника; заполнить email сотруднику; в параметрах пользователя установить Стиль электронной почты — Сообщения HTML с вложениями.

Похожие записи:

  1. Надежда
    18 Январь 2011 в 17:17 | #1

    не подскажете как привязать уведомление к потоку операций
    надо чтоб в конце потока (статус строк станет «закрыто») отправлялись уведомления менеджерам

  2. rudev
    19 Январь 2011 в 08:10 | #2

    @Надежда
    Находите стандартный workflow для вашего процесса, далее:

    1) Копируем его, создавая кастомный workflow. Теперь мы можем менять наш вновь созданный workflow как хотим.
    2) Добавляем в нужном месте уведомление, как описано в статье.
    3) В настройках модуля меняем вызов стандартного workflow на наш.
    4) Уведомление настраиваем либо на конкретного пользователя или на роль.

    ИЛИ более простой способ, но менее рекомендованный (Oracle позволяет). Если отсутствует явная форма настроки вызова нужного workflow, то

    1) Сохраняем исходную версию workflow, для backup’a.
    2) Меняем процесс, добавляя нужные уведомления.
    3) Сохраняем workflow в базе.

  3. strAnger
    13 Апрель 2011 в 07:00 | #3

    Можно вопрос, есть какой — либо способ убрать (сделать не активной) конопочку на форме уведомления. А конкретно кнопку «Переназначение»?

  4. rudev
    13 Апрель 2011 в 12:39 | #4

    @strAnger
    Вот что говорит нам Developer’s Guide 2.6.4:
    You can use a special message attribute with the internal name #HIDE_REASSIGN to
    hide the Reassign button in the Notification Details Web page

    Создал тестовое уведомление. На уровне message добавил атрибут #HIDE_REASSIGN со значением «Y».
    В результате кнопка «Переназначение» перестала отображаться.

    Следует так же помнить, что если на пользователе висят права админа workflow (назначены конкретно на него или стоят для всех «*»), то кнопка «Переназначение» будет доступна всегда.

  5. strAnger
    20 Апрель 2011 в 08:33 | #5

    @rudev
    Реально помогло, большое спасибо, буду теперь часто вопросы задавать ))

  6. strAnger
    20 Апрель 2011 в 11:13 | #6

    Можно еще один вопрос, а где редактируются права Админа workflow? Просто попробывал на тестовой базе кнопка исчезла, на реальной — нет. Заранее спасибо!

  7. rudev
    20 Апрель 2011 в 11:14 | #7

    @strAnger
    System Administrator — Workflow : Administrator Workflow — Administration

  8. strAnger
    20 Апрель 2011 в 12:06 | #8

    ДА и лучше наврено ставить value = ‘B’, что бы делегирование прав продолжало работать, а то с ‘Y’ перестает…

  9. Мария
    11 Ноябрь 2011 в 07:51 | #9

    Подскажите пожалуйста, а если «Открываем файл WF\DATA\US\WFSTD (находится в директории установленного workflow)» — данного пути нет. но я 100% знаю что у нас workflow используется для утверждения документов, Где мне можно найти Oracle Workflow Builder???

  10. 11 Ноябрь 2011 в 08:25 | #10

    @Мария
    Oracle Workflow Builder надо устанавливать отдельно на клиент.
    Скачать его можно через металинк:
    How To Download and Install the Latest Oracle Workflow Builder (Client Tool) and XML Gateway Message Designer for E-Business [ID 261028.1]

  11. Мария
    11 Ноябрь 2011 в 08:54 | #11

    спасибисимус!!! хочется героев-помощников знать по имени ) нигде не нашла как зовут автора данного блога. На мой взгляд один из лучших русскоязычных сайтов по OEBS. Спасибо Вам .

  12. Гена
    6 Сентябрь 2012 в 11:41 | #12

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

  13. 6 Сентябрь 2012 в 15:05 | #13

    @Гена
    Если нет возможности настройками отключить вызов стандартного workflow, то можно зайти непосредственно в wf процесс в билдере и перекинуть стрелки минуя рассылку уведомления.

  14. Arhangel
    23 Декабрь 2013 в 14:25 | #14

    Доброго времени суток!
    Дело в том, что у нас настроен кастомный процесс, пользователю приходит уведомление с двумя кнопками (Утвердить/Отклонить), но при делегировании этих кнопок у конечного пользователя (зама) нет. Не подскажете как их добавить?
    Заранее спасибо!

  15. 23 Декабрь 2013 в 15:56 | #15

    @Arhangel
    А добавлен атрибут #HIDE_REASSIGN (#WF_REASSIGN_LOV)?

  16. Arhangel
    23 Декабрь 2013 в 15:59 | #16

    @rudev
    Нет, атрибутов #HIDE_REASSIGN нет вообще

  17. Arhangel
    24 Декабрь 2013 в 10:38 | #17

    Добрый день! Ну как, вариантов нет?

  18. 24 Декабрь 2013 в 10:54 | #18

    @Arhangel
    А если зайти под админом workflow (назначены конкретно на пользователя или стоят для всех “*”), кнопка видна? Если нет, то возможно персонализацией скрывается.

  19. Arhangel
    24 Декабрь 2013 в 12:53 | #19

    @rudev
    Это назначено на SYSADMIN.
    Я извиняюсь, но суть проблемы я описал не верно. Дело в том, что кнопки отсутствуют когда заму предоставляется доступ к рабочему списку начальника и зам переключает пользователя.
    И еще вопрос, на скрине:

  20. Arhangel
    24 Декабрь 2013 в 12:58 | #20

    Опять))

  21. 24 Декабрь 2013 в 13:58 | #21
  22. Лариса
    19 Ноябрь 2014 в 11:18 | #22

    Подскажите, пожалуйста:
    Как в Сведении об уведомлении в Строках Заявки вместо одного поля вывести другое.
    Attribute =’REQ_LINES_DETAILS’. В пакете PO_WF_REQ_NOTIFICATION пробовала менять, но ничего не получается

  23. Ирина
    25 Июнь 2015 в 18:56 | #23

    Доброго времени суток! Подскажите, пожалуйста, как можно сделать так, чтобы в одном конкретном процессе уведомления типа FYI не закрывались в рабочем списке после отсылки на e-mail, если в notification mailer при этом стоит галка автозакрытия таких уведомлений?

  24. Сергей
    22 Январь 2016 в 17:47 | #24

    День добрый!
    Может подскажите такой вопрос?

    Создаю рассылку адресатам из селекта
    чтобы зациклить этот процесс добавил в Вашем примере функцию у которой Result Type назначил Логический. От этой функции отправил стрелки с Истина на Notifiction и соответсвенно обратно.
    Для функции создал процедуру, которая по счетчику (CURRENT_TARGET) выбирает адресата из селекта

    procedure built_list_forsend(itemtype in varchar2, itemkey in varchar2, actid in number, funcmode in varchar2, resultout out nocopy varchar2) is
    l_cnt number; l_user_name varchar2(30); l_sends varchar2(150); cnt_trg number;
    begin
    l_cnt:= wf_engine.GetItemAttrNumber(
    itemtype => itemtype,
    itemkey => itemkey,
    aname => ‘CURRENT_TARGET’);

    l_user_name:= wf_engine.GetItemAttrText(
    itemtype => itemtype,
    itemkey => itemkey,
    aname => ‘TMP1’);

    for i in(
    select rownum rn, user_name, full_name
    from xxt.xx_tableA a1
    where level between 2 and 3
    connect by prior kurator_id = person_id
    and kurator_id != person_id
    start with user_name = l_user_name
    )
    loop
    if l_cnt = i.rn then
    wf_engine.SetItemAttrText(itemtype, itemkey, ‘EMAIL_ASG’, i.user_name);
    end if;

    end loop;

    if l_cnt > cnt_trg or l_cnt > 8 then resultout := ‘COMPLETE:F’; else resultout := ‘COMPLETE:T’; end if;

    exception when others then resultout := ‘COMPLETE:F’;
    end built_list_forsend;

    Для Notification создал свою процедуру которая счетчик увеличивает на 1.

    procedure plus_level(itemtype in varchar2, itemkey in varchar2, actid in number, funcmode in varchar2, resultout out nocopy varchar2) is
    l_cnt number;
    begin
    l_cnt:= wf_engine.GetItemAttrNumber(
    itemtype => itemtype,
    itemkey => itemkey,
    aname => ‘CURRENT_TARGET’);

    wf_engine.SetItemAttrNumber (itemtype, itemkey, ‘CURRENT_TARGET’, l_cnt + 1);

    end plus_level;

    Вроде кажется все должно крутиться, но результат обескуражил

    Notification создает уведомление, но WF_SYSTEM тут же этот NOTIFICATION_ID отменяет… и в результате никто сообщения не получает..

    Не подскажите, с чем может быть связано?

  25. 25 Январь 2016 в 20:07 | #25

    @Сергей
    Я так понял требуется разослать параллельные уведомления? в этом случае можно сделать отдельный процесс, и вызывать его в цикле, передавая адресата.

  26. Сергей
    26 Январь 2016 в 18:24 | #26

    Добрый день!
    В общем приблизительно так я и поступил.. жаль нельзя приложить картинки…

    Проблема вот в чем — все созданные сообщения сразу откатываются процессом WF_SYSTEM в статус CANCEL.
    или лучше так запрос после отработки WORKFLOW

    select STATUS, MAIL_STATUS
    from apps.wf_notifications
    where NOTIFICATION_ID = 999999

    вместо

    OPEN MAIL

    возвращает
    CANCELED NULL

    А запрос

    select c.sequence h_sequence, c.to_role h_to_role, c.to_user h_to_user,
    wf_core.translate (c.action) h_action, c.user_comment h_comment, c.comment_date h_action_date, c.action, ias.process_activity
    from apps.wf_item_activity_statuses_h ias, apps.wf_comments c
    where ias.item_type = ‘XX01’
    and ias.item_key = 1905
    and ias.notification_id = c.notification_id

    выдает странный результат

    58 USER-1 Станислав Отправить 26.01.2016 17:01:02 SEND_FIRST 218559
    59 WF_SYSTEM Поток операций: система Отмена 26.01.2016 17:01:02 CANCEL 218559

    Из чего и возникло предположение о блокировке процесса. Но как это событие обойти бьюсь третий день…

  27. cranium
    27 Январь 2016 в 15:09 | #27

    @Сергей
    Есть следующий метод рассылки параллельных уведомлений:
    1. Создаем еще один процесс, скажем XX_SUBPROCESS, в котором и будет осуществляться рассылка уведомлений. Переносим туда из основного процесса все, что касается отправки и обработки ответов.
    В общем случае первой операцией нового процесса(после Start-a) и будет отправка уведомления.
    2. В основном процессе вызываем функцию, которая в цикле стартует этот процесс для каждого получателя

          
    FOR i IN 1 .. l_all_approver_list.COUNT LOOP  --l_all_approver_list - массив получателей
            
            l_approver_user_name := l_all_approver_list(i).name;  --l_approver_user_name - получатель уведомления
    
            l_sub_process_itemkey := itemkey||'-'||l_approver_user_name;
            wf_engine.createprocess(itemtype, l_sub_process_itemkey, 'XX_SUBPROCESS');      
            
            --Копируем все атрибуты в новый процесс
            FOR j IN 1 .. l_item_attributes_tbl.COUNT LOOP
              l_item_attributes_rec := l_item_attributes_tbl(j);
              CASE 
                WHEN l_item_attributes_rec.type IN ('VARCHAR2','URL', 'ROLE') THEN
                  wf_engine.SetItemAttrText(itemtype => itemtype, 
                                            itemkey  => l_sub_process_itemkey, 
                                            aname    => l_item_attributes_rec.name, 
                                            avalue   => wf_engine.GetItemAttrText(itemtype => itemtype,
                                                                                  itemkey  => itemkey,
                                                                                  aname    => l_item_attributes_rec.name)
                                           );
                                                            
                WHEN l_item_attributes_rec.type =  'NUMBER' THEN
                   wf_engine.SetItemAttrNumber(itemtype => itemtype, 
                                              itemkey  => l_sub_process_itemkey, 
                                              aname    => l_item_attributes_rec.name, 
                                              avalue   => wf_engine.GetItemAttrNumber(itemtype => itemtype,
                                                                                      itemkey  => itemkey,
                                                                                      aname    => l_item_attributes_rec.name)
                                             );              
                WHEN l_item_attributes_rec.type = 'DATE' THEN
                   wf_engine.SetItemAttrDate(itemtype => itemtype, 
                                              itemkey  => l_sub_process_itemkey, 
                                              aname    => l_item_attributes_rec.name, 
                                              avalue   => wf_engine.GetItemAttrDate(itemtype => itemtype,
                                                                                    itemkey  => itemkey,
                                                                                    aname    => l_item_attributes_rec.name)
                                             );                  
               ELSE
                NULL;
              END CASE; 
              
            END LOOP;
            
            --устанавливаем новое значение получателя     
            wf_engine.setitemattrtext(itemtype, l_sub_process_itemkey, 'APPROVER_USER', l_approver_user_name);  
            
            --помечаем стартуемый процесс как дочерний                          
            wf_engine.SetItemParent(itemtype         => itemtype, 
                                    itemkey          => l_sub_process_itemkey, 
                                    parent_itemtype  => itemtype, 
                                    parent_itemkey   => itemkey, 
                                    parent_context   => NULL,
                                    masterdetail     => NULL
                                    );                                                               
            
            wf_engine.startprocess(itemtype, l_sub_process_itemkey);
            
          END LOOP;

    3. В итоге для каждого получателя имеем свой экземпляр процесса, который отправляет уведомление и обрабатывает ответ.

  28. Сергей
    28 Январь 2016 в 12:02 | #28

    Всем день добрый!
    cranium спсб за предложенный вариант, я его попробовал он рабочий, и действительно письма отправляются в этом случае. Но есть два момента, возможно я, что-то не правильно сделал, но подпроцессы запускаются если выполнен запуск основного процесса, уже следующего. Т.е. письма от предыдущего процесса-подпроцесса, запускаются если выполнен другой — новый процесс с новым itemkey, иначе в потоке операций не видно, что все процессы от старого завершены. Причем, поля в потоке операций Начато и завершено отображаются со временем основного процесса уже после запуска нового процесса. Но их не видно, пока не запущен новый процесс. И письма приходят с задержкой.
    И второй, важный момент, мне сказано, что не удобно контролировать выполнение рассылок в потоке когда несколько процессов. Тут еще играет роль не просто отправить, но и еще отслеживать через поток операций.
    Если есть возможность подсказать, чтобы было без создания подпроцессов, очень бы выручило..
    Я постараюсь сейчас приложить картинку..

  29. Сергей
    28 Январь 2016 в 12:36 | #29

    К сожалению приложить рисунок не получилось
    могу приложить только ссылку, вдруг она поможет раскрыть, что пытаюсь сделать..
    https://cloud.mail.ru/public/G1bo/tAiFTrQ9P

  30. cranium
    28 Январь 2016 в 19:29 | #30

    @Сергей
    Что касается неудобства дочерних процессов: указывая им родителя(при запуске), мы добиваемся того, что в списке потоков операций появляется соответствующая иконка в колонке «Дочерние потоки операций», и можно увидеть всех дочек.
    По первой части вопроса не очень понял. Основной процесс должен только лишь запустить подпроцессы и на этом завершиться.

    Пример

  31. Сергей
    29 Январь 2016 в 11:30 | #31

    Всем добрый день!
    cranium Спсб, предложенный метод, действительно работает, очень благодарен.
    И все же, если вернутся к картинке
    https://cloud.mail.ru/public/G1bo/tAiFTrQ9P
    может такой подход иметь рабочее решение?
    При запуске WF процесса определялся атрибут с адресом для отправки первого сообщения и атрибут по которому определялось число выполнения цикла.
    Далее в DEFINE_RECJPT по запросу генерился новый адрес.
    Напомню, проблема в нем заключалась в том, что сообщения отправлялись, но не доходили до адресатов.
    По завершении процесса, когда смотрел ID отправленного сообщения

    select STATUS, MAIL_STATUS
    from apps.wf_notifications
    where NOTIFICATION_ID = 999999

    вместо
    OPEN MAIL

    получал
    CANCELED NULL

  32. cranium
    29 Январь 2016 в 14:07 | #32

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

  33. Сергей
    29 Январь 2016 в 18:17 | #33

    cranium
    Спсб, до ответа верил, что должно было работать… просто где-то что-то не включил..
    вроде схема самая простая и вроде все на поверхности…
    еще раз огромное спсб…

  34. 2 Апрель 2016 в 00:16 | #34

    Добрый день! господа просьба в инструкцию добавить информацию о заполнении след. полей:
    а) Владелец потока операций
    б) От кого отправлено сообщение — на первом уведомлении его нет, по этой инструкции…:

    1) ) Для того чтобы исправить владельца потока операций, как оказалось надо при запуске его указать =))

    wf_engine.createprocess(p_itemtype, p_itemkey, ‘название потока’, null, fnd_global.user_name);

    2) От кого отправлено сообщение:
    а) через workflow builder создать свой атрибут (attributes). — создал автор запроса (REQUESTOR)
    б) Создать в Messages свой атрибут с обязательным названием #FROM_ROLE.
    значения выбирать из item attributes
    у меня это автор запроса, type- Роль

    в) в процедуре вызова заполнить этот атрибут с ФИО. , т.е. так :
    wf_engine.setItemAttrText(p_itemtype, p_itemkey, ‘REQUESTOR’, wf_directory.GetRoleDisplayName(fnd_global.user_name)

  1. Пока что нет уведомлений.