Автоматическое выполнение задачи в БП

Каким способом возможно реализовать автоматическое выполнение некоторых задач в БП?

Например, стоит задача о контроле оплаты до такого-то числа. И если оплата приходит (автоматически в систему), то необходимо, чтобы эта задача была отмечена как выполнена и сгенерировалась бы следущая (в зависимости от каких-либо условий-результата)

Как это было бы правильнее реализовать?

Нравится

17 комментариев

непонятно только , зачем в этом случае задача?

А как именно приходит оплата в систему?

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

Оплата может приходить двумя способами (вручную в систему или автоматически через банк).

Количество клиентов десятки тысяч, оплата ежемесячная.

Хранимая процедура, запускаемая по расписанию с помощью JOB, должна проверять наличие оплат и в случае обнаружения оплаты, закрывать задачу. Решение подходит для MSSQL и ORACLE, и не подходит для Firebird (там нет JOB-ов).

"Гамора Дмитрий" написал:Хранимая процедура

То есть самый оптимальный путь - это все select, update, insert в SQL процедуре?

Если речь идет о оплатах, импортируемых из посторонней системы без задействования бизнес-логики TS CRM, то это лучший путь.

Мне кажется, тут зависит от того, находится ли эта задача с оплатой "посередине" бизнес-процесса Террасофт (в WorkflowDiagram).
Если да, то наверное хранимая процедура не сможет продолжить выполнение БП...
А когда оплата приходит из банка, она пишется напрямую в базу, или через Террасофт?

Думаю, поскольку речь идёт об БП, правильнее будет решать средствами конфигурации. Хранимкой будет сложно запустить следующий элемент процесса.

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

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

"Валерий Андрусик" написал:Если да, то наверное хранимая процедура не сможет продолжить выполнение БП...

Думаю, что не всё так критично, ибо продолжение выполнения БП - это нечто вроде

1. установка состояния конкретной задачи БП в состояние "Выполнена" и соответствующим результатом (ну, и разные поля - типа "фактическое время выполнения и т.п.)
2. создание новой задачи (привязывая ее к БП).
3. наверное, изменение некоторого значения в БП, которое указывает на текущий элемент.

Я еще что-то упустил?

Минус, наверное, в том, что логика получается очень жесткая.

Вроде ничего не упустили, но такой алгоритм означает ручную вставку в tbl_WorkflowItem и изменение tbl_Workflow (возможно), что не совсем "красиво", и потенциально может привести к ошибкам в работе БП. Точнее конечно могут специалисты Террасофт сказать.
Предпочтительнее (как выше писал Олег) переходить к следующему элементу БП средствами конфигурации, вопрос только остается в способе синхронизации события "Оплачено" и, собственно, перехода дальше по БП.

Полностью согласен с Олегом. Хранимкой запускать продолжение БП - дело неблагодарное.

Я бы предложил следующее решение: хранимка генерирует напоминание (в идеале - "уведомление"): "Сергей, мы получили оплату по счету №2 (Задача №3). Зафиксируйте изменения".
Пользователь делает "Перейти к Задаче №3" и "Фиксирует ее выполнение".

"Глова Сергей" написал:
Я бы предложил следующее решение: хранимка генерирует напоминание (в идеале - "уведомление"): "Сергей, мы получили оплату по счету №2 (Задача №3). Зафиксируйте изменения".
Пользователь делает "Перейти к Задаче №3" и "Фиксирует ее выполнение".

Прекрасный вариант :twisted:

"Глова Сергей" написал:Пользователь делает "Перейти к Задаче №3" и "Фиксирует ее выполнение".

Боюсь, что после тысячной такой операции за день пользователь начнет выражаться нецензурно.
А количество запаздываемых платежей растет в геометрической последовательности.

Я бы только радовался 1000 оплаченным счетам в день :smile:

Владимир, представьте себе такую то ситуацию:
У меня вываливается 20 карточек задач, в которых надо поставить плановые даты выполнения (задачи сгенерированны по БП), потому что оплатили 20 счетов. Вы знаете, но в таком случае я сразу же буду выражаться нецензурно (не дожидаясь 1000 операции).

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

"Глова Сергей" написал:У меня вываливается 20 карточек задач, в которых надо поставить плановые даты выполнения

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

Что касается технической стороны реализации через хранимки:

"Владимир Соколов" написал:Думаю, что не всё так критично, ибо продолжение выполнения БП - это нечто вроде ...

- между первым и вторым пунктом нужно обязательно установить предыдущий элемент процесса в tbl_WorkflowItem в состояние "Выполнен" и создать новый элемент (в зависимости от результата выполненной задачи). Только после этого создавать новую задачу (кстати, в конфигурации после выполнения элемента процесса создаётся только новый элемент. Задача создаётся в результате нажатия "ОК" в карточке редактирования).

При такой реализации проблем быть не должно, но мне кажется, средствами конфигурации будет проще. К тому же, если следующий элемент БП не задача, а, допустим, скрипт, это нужно учитывать в хранимке. То же и с передачей параметров. В конфигурации всё это выполняется одной строчкой: WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Лабьяк Олег Игоревич пишет:

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

А как лучше завершать и запускать элемент процесса средствами конфигурации? 

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

На всякий случай уточню для читателей, что это обсуждение посвящено Terrasoft XRM 3.x, и никак не подходит для текущих версий bpm'online 7.x. А по теме - движок процессов в 3.х умеет выполнять команду "выполнить элемент процесса", которую описал Олег в сообщении выше:

WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

Каких-либо других подходящих средств для продолжения выполнения уже запущенного процесса в 3.х не предусмотрено.

Нужно отметить, что архитектура элементов процессов в 3.х такова, что допускает многократное выполнение элемента процесса. При каждой такой попытке элемент самостоятельно проверяет набор условий и самостоятельно готовит ответ на вопрос "выполнился ли элемент полностью?". Если да, то код элемента формирует результат "IsFinished" и это позволяет движку процессов передать управление на следующий шаг. В коде таких проверок для элемента Task (Задача) обычно присутствует проверка на состояние задачи "Выполнена" и считывается значение поля "Результат".  При желании вы можете внести дополнительные проверки для особых результатов, чтобы выполнение продолжалось только при определенном стечении обстоятельств.

Насчет изменения значений параметров извне - проще всего писать кастомный код в скриптах элементов процессов, который прочитает из БД нужные значения и присвоит значения параметров. Специальных функций API для такой задачи для уже запущенного процесса не припоминаю. Чаще всего такую задачу решают путём заполнения соответствующих полей записи Задачи, например, с последующим чтением полей этой записи в коде элемента процесса. Это проще, чем организовывать отдельную таблицу для таких значений.

 

P.S. Неужели до сих пор разрабатываете и поддерживаете проекты на 3.х?

Показать все комментарии