Дерево страниц
Skip to end of metadata
Go to start of metadata

Постановка задачи

Прекратить процесс
Инструмент: Палитра 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));
	}
}


Добавить кастомную кнопку и подключить кастомную операцию

  1. В форме создать секцию RootMenu
  2. В 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));
	}
}