Простая обработка событий процесса

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(События плагина mobile)
 
(5 промежуточных версий не показаны.)
Строка 1: Строка 1:
 +
== Общие события ==
Разрешение на правку процесса в различных статусах различным группам, исполнителю либо администратору и запрет правки закрытого процесса.
Разрешение на правку процесса в различных статусах различным группам, исполнителю либо администратору и запрет правки закрытого процесса.
<source lang="bash">
<source lang="bash">
Строка 66: Строка 67:
   dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
   dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
   dao.updateParamList(process.getId(), 63, {1});
   dao.updateParamList(process.getId(), 63, {1});
 +
END
 +
</source>
 +
 +
Удаление из процесса исполнителя с кодом 2 и группы с кодом 37.
 +
<source lang="bash">
 +
onProcessEvent.3.doExpression=<<END
 +
  deleteExecutors({2});
 +
  deleteGroups({37}); 
 +
END
 +
</source>
 +
 +
После изменения статуса если списковый параметр процесса 63 не содержит значений с кодами 1, 2 и 3
 +
установка значения 1 в этот параметр.
 +
<source lang="bash">
 +
onProcessEvent.1.events=statusChanged
 +
onProcessEvent.1.ifExpression=empty(cu.intersection(processParam.listValueIds(63), {1,2,3}))
 +
onProcessEvent.1.doExpression=<<END
 +
  dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
 +
  dao.updateParamList(process.getId(), 63, {1});
 +
END
 +
</source>
 +
 +
При создании процесса внесение в параметр типа "date" с кодом 51 значения текущей даты + два дня,
 +
не учитывая вторников.
 +
<source lang="bash">
 +
onProcessEvent.1.events=created
 +
onProcessEvent.1.doExpression=<<END
 +
  dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
 +
  cal = new("java.util.GregorianCalendar");
 +
  addDays = 2;
 +
  while (addDays > 0) {
 +
      var dw = cal.get(cal.DAY_OF_WEEK);
 +
      if (dw != cal.TUESDAY)
 +
          addDays = addDays - 1;
 +
      cal.add(cal.DAY_OF_YEAR, 1);
 +
  }
 +
  dao.updateParamDate(process.getId(), 51, cal.getTime());
 +
END
 +
</source>
 +
 +
Пример проверки класса события:
 +
<source lang="bash">
 +
if (event.getClass().getName() == "ru.bgcrm.event.process.ProcessMessageAddedEvent") {
 +
  text += '<b>Сообщение</b>: ' + u.maskNull(event.getMessage().getText()) + ';';
 +
}
 +
</source>
 +
 +
Поиск процесса, к которому привязан текущий процесс и если он найден - смена его статуса.
 +
<source lang="bash">
 +
onProcessEvent.3.events=statusChanged
 +
onProcessEvent.3.doExpression=<<END
 +
  pld = new("ru.bgcrm.dao.process.ProcessLinkDAO", conSet.getConnection());
 +
  linked = u.getFirst(pld.getLinkedProcessList(process.getId(), null, false, {1}));
 +
  if (linked != null) {
 +
        change = new("ru.bgcrm.model.process.StatusChange");
 +
change.setDate(new("java.util.Date"));
 +
change.setProcessId(linked.getId());
 +
change.setUserId(event.getUser().getId());
 +
change.setStatusId(9);
 +
        change.setComment("Автоматическая смена статуса");
 +
 +
        pa = ru.bgcrm.struts.action.ProcessAction;
 +
        pa.processStatusUpdate(event.getForm(), conSet.getConnection(), linked, change);
 +
  }
 +
END
 +
</source>
 +
 +
== События плагина mobile ==
 +
 +
Отправляем уведомление с параметрами процесса диспетчеру аварийной бригады. Установлена проверка типа работ из параметра list id 26, передаются номер процесса, адрес, телефоны, тип работ, дата и время приема, комментарий
 +
<source lang="bash">
 +
onProcessEvent.5.events=createFinished
 +
onProcessEvent.5.ifExpression=cu.intersection(processParam.listValueIds(26), {2,3,7}).size() > 0
 +
onProcessEvent.5.doExpression=<<END
 +
body=process.getTypeTitle();
 +
text="№ " + process.getId().toString() + " Адрес: " + processParam.addressValues(1).toString() + " т. " + processParam.getValue(20) + " " + processParam.listValueTitles(26) + " Принята: " + process.getCreateTime() + " Комментарий: " + process.getDescription() + user.;
 +
mobile.sendMessageToUsers(body, text, {5});
END
END
</source>
</source>

Текущая версия на 02:08, 29 октября 2017

Общие события

Разрешение на правку процесса в различных статусах различным группам, исполнителю либо администратору и запрет правки закрытого процесса.

onProcessEvent.1.checkExpression=process.getStatusId() !~ [9, 13, 36,39] or 8 =~ user.getGroupIds()
onProcessEvent.1.checkErrorMessage=В этом статусе разрешена правка только сотрудникам КС
onProcessEvent.2.checkExpression=process.getStatusId() != 9 or user.getId()  =~ process.getExecutorIds() or 33 =~ user.getPermsetIds()
onProcessEvent.2.checkErrorMessage=В этом статусе разрешена правка только исполнителем процесса либо администратором КС
onProcessEvent.3.checkExpression=empty process.getCloseTime()
onProcessEvent.3.checkErrorMessage=Запрещена правка закрытого процесса

Добавление текущего пользователя в исполнители и установка в статус с кодом 40, если процесс создан как привязанный к другому процессу.

onProcessEvent.1.events=createdAsLink
onProcessEvent.1.commands=addExecutors:{@ctxUserId};setStatus:40

Изменение статуса процесса на 3 при получении в него нового сообщения. При привязке договора - копирование значений параметров с кодами 27 и 12 в описание процесса.

onProcessEvent.1.events=messageAdded
onProcessEvent.1.ifExpression=process.getStatusId() != 3
onProcessEvent.1.commands=setStatus:3
#
onProcessEvent.2.events=linkAdded
onProcessEvent.2.commands=bgbilling:linkedContractParamToDescription:bg:27;bgbilling:linkedContractParamToDescription:bg:12

Отправка EMail по появлению нового сообщения в процессе.

onProcessEvent.1.events=messageAdded
onProcessEvent.1.commands=emailNotifyExecutors:21:Новые сообщения в процессе

Команда может быть предварена префиксом, изменяющим изменяемый процесс.

linkedProcess:<typeId> - процесс с типом <typeId>, к которому привязан данный процесс, пример:
#
# закрытие БП, если закрыты три процесса "Контроль возврата", "Изготовение бух. акт", "Знакомстов с аккаунт менеджером"
onProcessEvent.{@inc:cnt}.events=statusChanged:3
onProcessEvent.{@cnt}.ifExpression=processLink.getStatusProcessLinkedForSame( 6, 30 ) == 3 && processLink.getStatusProcessLinkedForSame( 6, 31 ) == 3 && processLink.getStatusProcessLinkedForSame( 6, 32 ) == 3
onProcessEvent.{@cnt}.commands=linkedProcess:6:setStatus:3

Отправка СМС сообщения по созданию процесса, в случае наличия в значениях спискового параметра с кодом 26 1, 2 или 3. Используется операция пересечения множеств. Номер для СМС получается из параметра с кодом 20 типа Phone.

onProcessEvent.1.events=createFinished
onProcessEvent.1.ifExpression=cu.intersection(processParam.listValueIds(26), {1,2,3}).size() > 0
onProcessEvent.1.doExpression=<<END
phone=processParam.getParamPhoneNoFormat(20);
if(phone) {
mtsc.sendSms(phone, "Заявка №".concat( process.getId().toString() ).concat( " принята" ));
}
END

Установка значения параметра типа text.

onProcessEvent.2.doExpression=<<END
  dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
  dao.updateParamText(process.getId(), 63, "тест");
END

Установка значения параметра типа list.

onProcessEvent.2.doExpression=<<END
  dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
  dao.updateParamList(process.getId(), 63, {1});
END

Удаление из процесса исполнителя с кодом 2 и группы с кодом 37.

onProcessEvent.3.doExpression=<<END
  deleteExecutors({2});
  deleteGroups({37});  
END

После изменения статуса если списковый параметр процесса 63 не содержит значений с кодами 1, 2 и 3 установка значения 1 в этот параметр.

onProcessEvent.1.events=statusChanged
onProcessEvent.1.ifExpression=empty(cu.intersection(processParam.listValueIds(63), {1,2,3}))
onProcessEvent.1.doExpression=<<END
  dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
  dao.updateParamList(process.getId(), 63, {1});
END

При создании процесса внесение в параметр типа "date" с кодом 51 значения текущей даты + два дня, не учитывая вторников.

onProcessEvent.1.events=created
onProcessEvent.1.doExpression=<<END
  dao = new("ru.bgcrm.dao.ParamValueDAO", conSet.getConnection());
  cal = new("java.util.GregorianCalendar");
  addDays = 2;
  while (addDays > 0) {
      var dw = cal.get(cal.DAY_OF_WEEK);
      if (dw != cal.TUESDAY)
          addDays = addDays - 1;
      cal.add(cal.DAY_OF_YEAR, 1);
  } 
  dao.updateParamDate(process.getId(), 51, cal.getTime());
END

Пример проверки класса события:

if (event.getClass().getName() == "ru.bgcrm.event.process.ProcessMessageAddedEvent") {
   text += '<b>Сообщение</b>: ' + u.maskNull(event.getMessage().getText()) + ';';
}

Поиск процесса, к которому привязан текущий процесс и если он найден - смена его статуса.

onProcessEvent.3.events=statusChanged
onProcessEvent.3.doExpression=<<END
   pld = new("ru.bgcrm.dao.process.ProcessLinkDAO", conSet.getConnection());
   linked = u.getFirst(pld.getLinkedProcessList(process.getId(), null, false, {1}));
   if (linked != null) {
        change = new("ru.bgcrm.model.process.StatusChange");
	change.setDate(new("java.util.Date"));
	change.setProcessId(linked.getId());
	change.setUserId(event.getUser().getId());
	change.setStatusId(9);
        change.setComment("Автоматическая смена статуса");
 
        pa = ru.bgcrm.struts.action.ProcessAction;
        pa.processStatusUpdate(event.getForm(), conSet.getConnection(), linked, change); 
   }
END

События плагина mobile

Отправляем уведомление с параметрами процесса диспетчеру аварийной бригады. Установлена проверка типа работ из параметра list id 26, передаются номер процесса, адрес, телефоны, тип работ, дата и время приема, комментарий

onProcessEvent.5.events=createFinished
onProcessEvent.5.ifExpression=cu.intersection(processParam.listValueIds(26), {2,3,7}).size() > 0
onProcessEvent.5.doExpression=<<END
body=process.getTypeTitle();
text="№ " + process.getId().toString() + " Адрес: " + processParam.addressValues(1).toString() + " т. " + processParam.getValue(20) + " " + processParam.listValueTitles(26) + " Принята: " + process.getCreateTime() + " Комментарий: " + process.getDescription() + user.;
mobile.sendMessageToUsers(body, text, {5});
END
Личные инструменты