- Создатель Васильев Антон, отредактировано 10.04.2025
Постановка задачи
Прекратить процесс
Инструмент: Палитра XML
Статус | ГОТОВО |
---|---|
Раздел | WorkFlow |
Комментарий |
Реализация
Результат

Необходимо сначало выполнить Старт процесса
Создать handler (JS-Обработчик операций)
Обработчик операций
<?xml version='1.0' encoding='UTF-8'?> <ui xmlns="http://www.intertrust.ru/schema/palette/tn-ui"> <handler name="WF-кнопка" id="WFCustomHandlerName"> <meta> <documentation></documentation> </meta> <script lang="JavaScript"><![CDATA[код кнопки]]></script> </handler> </ui>
Шаблон кода кнопки
Развернуть исходный код
importClass(Packages.ru.intertrust.cmj.af.core.AFSession); importClass(Packages.ru.intertrust.cmj.af.exceptions.AFDaoBadParameterException); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.TunableObjectREST); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.TunableObjectREST.Resource); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.action.TunableOperation); importClass(Packages.ru.intertrust.cmj.tunable.object.AnyTunableObject); importClass(Packages.ru.intertrust.cmj.tunable.object.TunableObjectApplication); importClass(Packages.ru.intertrust.cmj.tunable.object.TunableObjectApplication.ClientContextKey); importClass(Packages.ru.intertrust.cmj.tunable.object.common.TunableObjectHelper); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.action.OperationJScriptREST); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.action.OperationJScriptREST.ReturnParamsResource); importClass(Packages.ru.intertrust.cmj.dp.DPApplication); importClass(Packages.ru.intertrust.cmj.rest.rkk.RkkResource); importClass(Packages.ru.intertrust.cmj.af.utils.BeansUtils); importClass(Packages.ru.intertrust.cmj.wf.impl.WorkflowProcessServiceImpl); importClass(Packages.ru.intertrust.cmj.wf.api.ProcessUserTask); importClass(Packages.ru.intertrust.cmj.wf.api.TaskVariables); importClass(Packages.ru.intertrust.cmj.af.misc.AFDateTime); importPackage(Packages.ru.intertrust.cmj.af.utils); importPackage(Packages.ru.intertrust.cmj.af.tuning.impl); importPackage(Packages.ru.intertrust.cmj.af.tuning); importPackage(Packages.ru.intertrust.cmj.rest.tuning); importPackage(Packages.java.util); importPackage(Packages.java.lang); importClass(Packages.org.apache.commons.lang3.exception.ExceptionUtils); importClass(Packages.ru.intertrust.cmj.wf.api.ProcessVariables); importClass(Packages.ru.intertrust.cmj.wf.api.ProcessUserTask); function process(paramsResource, returnResource) { if (paramsResource == null) { throw new IllegalArgumentException("paramsResource must no be null."); } var dialogNameList = new ArrayList(); dialogNameList.add("ClientContextRequest"); dialogNameList.add("ExampleDialogStandart"); dialogNameList.add("ExampleDialogInfo"); paramPackageId = ""; paramSchemaName = paramsResource.tuning().getSchema().getName(); if (dialogNameList.contains(paramSchemaName)) { paramPackageId = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("counter")); } else { paramPackageId = "contextWithResource"; } if (paramPackageId.equals("context")) { createContextResourceRequest(returnResource); } else if (paramPackageId.equals("contextWithResource")) { process_dialog(paramsResource, returnResource); } else if (paramPackageId.equals("answer")) { process_context(paramsResource, returnResource); } else if (paramPackageId.equals("exit_update")) { process_refresh(paramsResource, returnResource); } else if (paramPackageId.equals("exit")) { return process_exit(paramsResource, returnResource); } } /** * Обработка первого пакета данных с клиента. * @return возвращение контекста открытого документа */ function createContextResourceRequest(returnResource) { var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var afObjectContextRequest = appTNObject.createClientContextRequest(TunableObjectApplication.ClientContextKey.resourceid, TunableObjectApplication.ClientContextKey.resource); TunableObjectHelper.putAFInstanceValue(afObjectContextRequest, "counter", "contextWithResource"); returnResource.setResource(TunableObjectREST.Resource.create(afObjectContextRequest)); } /** * Обновление объекта * @param paramsResource * @return ресурс первого диалога сценария */ function process_refresh(paramsResource, returnResource) { var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds")); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); var res = RkkResource.valueOf(obj); returnResource.setResource(res); } /** * Завершение обработки в случае ошибки * @param paramsResource * @return ресурс первого диалога сценария */ function process_exit(paramsResource, returnResource) { var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds")); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); returnResource.setResource(null); } /** * Диалог Информации c обновлением документа * @ids текущий идентификатор документа * @resultMessage сообщение * @return ресурс */ function process_dlginfo_refresh(ids, resultMessage,returnResource){ var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var message = appTNObject.composeDialog("ExampleDialogInfo", null, null, null); TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", resultMessage); TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids); TunableObjectHelper.putAFInstanceValue(message, "counter", "exit_update"); returnResource.resource = TunableObjectREST.Resource.create(message); return returnResource.resource; } /** * Диалог Информации c обновлением документа * @ids текущий идентификатор документа * @resultMessage сообщение * @return ресурс */ function process_dlginfo(ids, resultMessage,returnResource){ var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var message = appTNObject.composeDialog("ExampleDialogInfo", null, null, null); TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", resultMessage); TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids); TunableObjectHelper.putAFInstanceValue(message, "counter", "exit"); returnResource.resource = TunableObjectREST.Resource.create(message); return returnResource.resource; } /** * Обработка контекста * @param paramsResource * @return ресурс первого диалога сценария */ function process_dialog(paramsResource, returnResource) { var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var id = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("$id")); var ids = Utils.newArrayList(); ids.add(id); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); var version = paramsResource.getVersion(); var versionParts = version.split('$$'); var versionContext = versionParts[0]; var versionCurrent = ''; try { versionCurrent = obj.getVersionStamp().toString(); } catch (e) { versionCurrent = versionContext; } if (versionContext != versionCurrent){ process_dlginfo(ids,"Данная версия объекта/документа была изменена. Требуется обновить!",returnResource); return returnResource.resource; } var message = appTNObject.composeDialog("ExampleDialogStandart", null, null, null); TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", "Комментарий:"); TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids); TunableObjectHelper.putAFInstanceValue(message.tuning(), "versionContext", versionContext); TunableObjectHelper.putAFInstanceValue(message, "counter", "answer"); returnResource.setResource(TunableObjectREST.Resource.create(message)); } /** * Обработка к * @param paramsResource * @return ресурс */ function process_context(paramsResource, returnResource) { var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds")); var comment = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("comment")); var versionContext = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("versionContext")); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); var versionCurrent = ''; try { versionCurrent = obj.getVersionStamp().toString(); } catch (e) { versionCurrent = versionContext; } if (versionContext != versionCurrent){ process_dlginfo(ids,"Данная версия объекта/документа была изменена. Требуется обновить!",returnResource); return returnResource.resource; } // Необходимо выдать исключение, если объект удален или прекращен в WD if ("Webdocs2.0".equals(AFSession.get().currentUser().extendedAttributes().get("ClientAlias"))) { var isTerminate = obj.tuning().getValues().get("wf") == null ? false : obj.tuning().getValues().get("wf").getValues().get("stage") == null ? false : obj.tuning().getValues().get("wf").getValues().get("stage").getValue().equals("Прекращена") ? true : false; if (obj.isDeleted() || isTerminate) { process_dlginfo(ids,"Документ был удален обратитесь к администратору",returnResource); return returnResource.resource; } } if (obj.tuning().getValues().containsKey("wf") && obj.tuning().getValues().get("wf") != null) { var wf = obj.tuning().getValues().get("wf"); var task_name = wf.getValues().get("task").getValue(); // Получаем задачу var taskId = wf.getValues().get("task_id").getValue(); var workflowProcessService = BeansUtils.getBean("workflowProcessServiceImpl"); var task = workflowProcessService.getTaskById(taskId); // Должна быть только одна задача, завершаем ее, установив переменную if (task != null){ var workflowProcessName = task.processName; var workflowProcessService = BeansUtils.getBean("workflowProcessServiceImpl"); var params = new ProcessVariables(); params.put("result", "Прекращена"); params.put("information", comment); workflowProcessService.sendProcessMessage(workflowProcessName, "END_PROCESS", ids.get(0),params); obj = appdp.getEntityByUNID(ids.get(0)); var res = RkkResource.valueOf(obj); returnResource.setResource(res); } else { throw new RuntimeException("Не найдена задача. Обратитесь к администратору. Идентификатор: " + taskId); } } else { throw new RuntimeException("Не запущен процесс согласования. Обратитесь к администратору. Идентификатор: " + ids.get(0)); } }
Добавить кастомную кнопку и подключить кастомную операцию
- В форме создать секцию RootMenu
В RootMenu создать button и подключить к нему handler
<section id="RootMenu"> <component> <button name="${<Form Name>.RootMenu.button.<Name>:Новая кнопка}"> <icon code="37"/> <action> <custom> <operation> <handler-ref ref="WFCustomHandlerName"/> </operation> </custom> </action> </button> </component> </section>
Подключить скрипт в WF-процесс
Скрипт устанавливает статус и заполняет жизненный цикл.
Script task
Развернуть исходный код
importClass(Packages.ru.intertrust.cmj.af.core.AFSession); importClass(Packages.ru.intertrust.cmj.af.exceptions.AFDaoBadParameterException); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.TunableObjectREST); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.TunableObjectREST.Resource); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.action.TunableOperation); importClass(Packages.ru.intertrust.cmj.tunable.object.AnyTunableObject); importClass(Packages.ru.intertrust.cmj.tunable.object.TunableObjectApplication); importClass(Packages.ru.intertrust.cmj.tunable.object.TunableObjectApplication.ClientContextKey); importClass(Packages.ru.intertrust.cmj.tunable.object.common.TunableObjectHelper); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.action.OperationJScriptREST); importClass(Packages.ru.intertrust.cmj.rest.tunable.object.action.OperationJScriptREST.ReturnParamsResource); importClass(Packages.ru.intertrust.cmj.dp.DPApplication); importClass(Packages.ru.intertrust.cmj.rest.rkk.RkkResource); importClass(Packages.ru.intertrust.cmj.af.utils.BeansUtils); importClass(Packages.ru.intertrust.cmj.wf.impl.WorkflowProcessServiceImpl); importClass(Packages.ru.intertrust.cmj.wf.api.ProcessUserTask); importClass(Packages.ru.intertrust.cmj.wf.api.TaskVariables); importClass(Packages.ru.intertrust.cmj.af.misc.AFDateTime); importPackage(Packages.ru.intertrust.cmj.af.utils); importPackage(Packages.ru.intertrust.cmj.af.tuning.impl); importPackage(Packages.ru.intertrust.cmj.af.tuning); importPackage(Packages.ru.intertrust.cmj.rest.tuning); importPackage(Packages.java.util); importPackage(Packages.java.lang); importClass(Packages.org.apache.commons.lang3.exception.ExceptionUtils); importClass(Packages.ru.intertrust.cmj.wf.api.ProcessVariables); importClass(Packages.ru.intertrust.cmj.wf.api.ProcessUserTask); function process(paramsResource, returnResource) { if (paramsResource == null) { throw new IllegalArgumentException("paramsResource must no be null."); } var dialogNameList = new ArrayList(); dialogNameList.add("ClientContextRequest"); dialogNameList.add("WFDialogStandart"); dialogNameList.add("WFDialogInfo"); paramPackageId = ""; paramSchemaName = paramsResource.tuning().getSchema().getName(); if (dialogNameList.contains(paramSchemaName)) { paramPackageId = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("counter")); } else { paramPackageId = "contextWithResource"; } if (paramPackageId.equals("context")) { createContextResourceRequest(returnResource); } else if (paramPackageId.equals("contextWithResource")) { process_dialog(paramsResource, returnResource); } else if (paramPackageId.equals("answer")) { process_context(paramsResource, returnResource); } else if (paramPackageId.equals("exit_update")) { process_refresh(paramsResource, returnResource); } else if (paramPackageId.equals("exit")) { return process_exit(paramsResource, returnResource); } } /** * Обработка первого пакета данных с клиента. * @return возвращение контекста открытого документа */ function createContextResourceRequest(returnResource) { var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var afObjectContextRequest = appTNObject.createClientContextRequest(TunableObjectApplication.ClientContextKey.resourceid, TunableObjectApplication.ClientContextKey.resource); TunableObjectHelper.putAFInstanceValue(afObjectContextRequest, "counter", "contextWithResource"); returnResource.setResource(TunableObjectREST.Resource.create(afObjectContextRequest)); } /** * Обновление объекта * @param paramsResource * @return ресурс первого диалога сценария */ function process_refresh(paramsResource, returnResource) { var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds")); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); var res = RkkResource.valueOf(obj); returnResource.setResource(res); } /** * Завершение обработки в случае ошибки * @param paramsResource * @return ресурс первого диалога сценария */ function process_exit(paramsResource, returnResource) { var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds")); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); returnResource.setResource(null); } /** * Диалог Информации c обновлением документа * @ids текущий идентификатор документа * @resultMessage сообщение * @return ресурс */ function process_dlginfo_refresh(ids, resultMessage,returnResource){ var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var message = appTNObject.composeDialog("WFDialogInfo", null, null, null); TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", resultMessage); TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids); TunableObjectHelper.putAFInstanceValue(message, "counter", "exit_update"); returnResource.resource = TunableObjectREST.Resource.create(message); return returnResource.resource; } /** * Диалог Информации c обновлением документа * @ids текущий идентификатор документа * @resultMessage сообщение * @return ресурс */ function process_dlginfo(ids, resultMessage,returnResource){ var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var message = appTNObject.composeDialog("WFDialogInfo", null, null, null); TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", resultMessage); TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids); TunableObjectHelper.putAFInstanceValue(message, "counter", "exit"); returnResource.resource = TunableObjectREST.Resource.create(message); return returnResource.resource; } /** * Обработка контекста * @param paramsResource * @return ресурс первого диалога сценария */ function process_dialog(paramsResource, returnResource) { var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class); var id = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("$id")); var ids = Utils.newArrayList(); ids.add(id); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); var version = paramsResource.getVersion(); var versionParts = version.split('$$'); var versionContext = versionParts[0]; var versionCurrent = ''; try { versionCurrent = obj.getVersionStamp().toString(); } catch (e) { versionCurrent = versionContext; } if (versionContext != versionCurrent){ process_dlginfo(ids,"Данная версия объекта/документа была изменена. Требуется обновить!",returnResource); return returnResource.resource; } var message = appTNObject.composeDialog("WFDialogStandart", null, null, null); TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", "Комментарий:"); TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids); TunableObjectHelper.putAFInstanceValue(message.tuning(), "versionContext", versionContext); TunableObjectHelper.putAFInstanceValue(message, "counter", "answer"); returnResource.setResource(TunableObjectREST.Resource.create(message)); } /** * Обработка к * @param paramsResource * @return ресурс */ function process_context(paramsResource, returnResource) { var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds")); var comment = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("comment")); var versionContext = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("versionContext")); var appdp = AFSession.get().getApplication(DPApplication.class); var obj = appdp.getEntityByUNID(ids.get(0)); var versionCurrent = ''; try { versionCurrent = obj.getVersionStamp().toString(); } catch (e) { versionCurrent = versionContext; } if (versionContext != versionCurrent){ process_dlginfo(ids,"Данная версия объекта/документа была изменена. Требуется обновить!",returnResource); return returnResource.resource; } // Необходимо выдать исключение, если объект удален или прекращен в WD if ("Webdocs2.0".equals(AFSession.get().currentUser().extendedAttributes().get("ClientAlias"))) { var isTerminate = obj.tuning().getValues().get("wf") == null ? false : obj.tuning().getValues().get("wf").getValues().get("stage") == null ? false : obj.tuning().getValues().get("wf").getValues().get("stage").getValue().equals("Прекращена") ? true : false; if (obj.isDeleted() || isTerminate) { process_dlginfo(ids,"Документ был удален обратитесь к администратору",returnResource); return returnResource.resource; } } if (obj.tuning().getValues().containsKey("wf") && obj.tuning().getValues().get("wf") != null) { var wf = obj.tuning().getValues().get("wf"); var task_name = wf.getValues().get("task").getValue(); // Получаем задачу var taskId = wf.getValues().get("task_id").getValue(); var workflowProcessService = BeansUtils.getBean("workflowProcessServiceImpl"); var task = workflowProcessService.getTaskById(taskId); // Должна быть только одна задача, завершаем ее, установив переменную if (task != null){ var workflowProcessName = task.processName; var workflowProcessService = BeansUtils.getBean("workflowProcessServiceImpl"); var params = new ProcessVariables(); params.put("result", "Прекращена"); params.put("information", comment); workflowProcessService.sendProcessMessage(workflowProcessName, "END_PROCESS", ids.get(0),params); obj = appdp.getEntityByUNID(ids.get(0)); var res = RkkResource.valueOf(obj); returnResource.setResource(res); } else { throw new RuntimeException("Не найдена задача. Обратитесь к администратору. Идентификатор: " + taskId); } } else { throw new RuntimeException("Не запущен процесс согласования. Обратитесь к администратору. Идентификатор: " + ids.get(0)); } }