Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Свойства страницы
Статус

Статус
colourYellow
titleВ РАБОТЕ

Автор
Комментарий
панель

На этой странице:

Оглавление



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

Описание шаблона кастомной кнопкиСоздать действие, по нажатию на которое выдастся диалоговое окно для ввода комментария и введенный комментарий сохраниться в текущий объект.

Инструмент

Палитра XML

Реализация

ПримечаниеЕсли есть какие-то нюансы по реализации, указать. Если нет, то удалить данный пункт
  1. Создать handler (JS-Обработчик операций)

    Блок кода
    languagejs
importClass(Packages.ru.
  1. titleШаблон кода кнопки
    linenumberstrue
    collapsetrue
    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.
  1. 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
  1. af.
impl
  1. misc.
WorkflowProcessServiceImpl
  1. AFDateTime);
    
importClass
  1. importPackage(Packages.ru.intertrust.cmj.
wf
  1. af.
api.ProcessUserTask
  1. utils);
    
importClass
  1. importPackage(Packages.ru.intertrust.cmj.
wf
  1. af.
api.TaskVariables
  1. tuning);
    
importClass
  1. importPackage(Packages.ru.intertrust.cmj.
af
  1. rest.
misc.AFDateTime
  1. tuning);
    importPackage(Packages.
ru.intertrust.cmj.af.utils)
  1. java.util);
    importPackage(Packages.
ru.intertrust.cmj.af.tuning.impl
  1. java.lang);
    
importPackage(Packages.ru.intertrust.cmj.af.tuning
  1. importClass(<Название класса>);
    importPackage(
Packages.ru.intertrust.cmj.rest.tuning
  1. <Название пакета>);
    
importPackage(Packages.java.util); importPackage(Packages.java.lang); importClass(Packages.org.apache.commons.lang3.exception.ExceptionUtils);
  1. 
    
    /**
     * Стартовая функция
     */
    function process(paramsResource, returnResource) {
    
        if (paramsResource == null) {
            throw new IllegalArgumentException("paramsResource must no be null.");
        }
  1. 
    	
paramPackageId = "";
  1. 
    	var systemNames = ['ClientContextRequest','
RSHBWFDialogOkCancel
  1. <Custom Dialog>','
RSHBRequestDialogInfo
  1. dlgInfo','dlgError','dlgWarning'];
    	
    	paramSchemaName = paramsResource.tuning().getSchema().getName();
    	var paramPackageId = "";
    	if (systemNames.indexOf(paramSchemaName)
=
  1. !=-1) {
    		paramPackageId = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("counter"));
    	} else {
    		paramPackageId = "contextWithResource";
    	}
    
    	if (paramPackageId.equals("context")) {
    		createContextResourceRequest(returnResource);
  1.  	
}
  1.  
else
  1. //Создание открытого контекстного объекта
    	} else if (paramPackageId.equals("contextWithResource")) {
    		process_
dlg
  1. dlgCustom(paramsResource, returnResource);	 //Вызов кастомного диалога
    	} else if (paramPackageId.equals("answer")) {
    		process_context(paramsResource, returnResource); //Основная обработка объекта
    	} else if (paramPackageId.equals("exit")) {
    		process_refresh(paramsResource, returnResource); //Выход и обновление объекта
    	}
    }
    
    /**
     * 
Обработка
  1. Инициализация 
первого
  1. контекста 
пакета данных с клиента.
  1. открытого документа
     * @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);
    }
    
    /**
     * Проверка объекта 
Вывод
  1. на 
диалога
  1. актуальность
     * @id 
@param
  1. идентификатор 
paramsResource
  1. объекта
     * 
@return ресурс первого диалога сценария
  1. @version текущая версия контекста
     * @return статус актуальности
     */
     function 
process_dlg
  1. isActualObject(
paramsResource
  1. id, 
returnResource
  1. version)
  1. {
    	var versionObj 
  1. = "";
    	
    	var 
appTNObject
  1. appdp = AFSession.get().getApplication(
TunableObjectApplication
  1. DPApplication.class);
    	var 
id
  1. obj = 
TunableObjectHelper
  1. appdp.
getAFInstanceValue(paramsResource.tuning().getValues().get("$id"))
  1. getEntityByUNID(id);
    	
    	var 
ids
  1. versionParts = 
Utils
  1. version.
newArrayList
  1. split('$$');
    	
ids.add(id)
  1. var versionContext = versionParts[0];
    	
    	
var appdp
  1. if (obj != null){
    		versionObj = 
AFSession
  1. obj.
get
  1. getVersionStamp().
getApplication
  1. toString(
DPApplication.class
  1. ); 
    	}
    	
    	return versionContext 
var version = paramsResource.getVersion(); if (!isActualObject(id, version)){
  1. == versionObj;
    }
     
    
    /**
     * Диалог Информации
     * @ids текущий идентификатор документа
     * @resultMessage сообщение
     * @return ресурс
     */
    function process_dlginfo(ids,
"<Информация>"
  1.  resultMessage,returnResource)
;
  1. {
    	
return returnResource.resource; }
  1. var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class);
    	var message = appTNObject.composeDialog("
RSHBWFDialogOkCancel
  1. dlgInfo", null, null, null);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "
message
  1. selectIds", 
"Комментарий:"
  1. ids);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "
isCommentNotRequired
  1. message", 
true
  1. resultMessage);
    	TunableObjectHelper.putAFInstanceValue(message
.tuning()
  1. , "
selectIds
  1. counter", 
ids
  1. "exit");
    	
TunableObjectHelper.putAFInstanceValue(message.tuning(), "versionContext", version); TunableObjectHelper.putAFInstanceValue(message, "counter", "answer"); returnResource.setResource(TunableObjectREST.Resource.create(message))
  1. returnResource.resource = TunableObjectREST.Resource.create(message);
    	return returnResource.resource;
    }
    
    /**
     * 
Проверка документа на актуальность
  1. Диалог Предупреждение
     * @ids 
@id
  1. текущий 
индентификатор
  1. идентификатор 
объекта
  1. документа
     * 
@version
  1. @resultMessage 
текущая
  1. сообщение
     
версия
  1. * 
контекста *
  1. @return 
статус актуальности
  1. ресурс
     */
    
  1. function 
isActualObject
  1. process_dlgWarning(
id
  1. ids, 
version
  1. resultMessage,returnResource){
    	var 
appdp
  1. appTNObject = AFSession.get().getApplication(
DPApplication
  1. TunableObjectApplication.class);
  1. 
    	var 
versionParts
  1. message = 
version
  1. appTNObject.
split('$$'); var versionContext = versionParts[0]; var obj = appdp.getEntityByUNID(id); if (obj != null){ var versionObj = obj.getVersionStamp().toString(); } return versionContext == versionObj; }
  1. composeDialog("dlgWarning", null, null, null);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", resultMessage);
    	TunableObjectHelper.putAFInstanceValue(message, "counter", "exit");
    	returnResource.resource = TunableObjectREST.Resource.create(message);
    	return returnResource.resource;
    }
    
    /**
     * Диалог 
Cообщение
  1. Ошибка
     * @ids текущий идентификатор документа
     * @resultMessage сообщение
     * @return ресурс
     */
    function process_
dlginfo
  1. dlgError(ids, resultMessage,returnResource){
    	var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class);
    	var message = appTNObject.composeDialog("
RSHBRequestDialogInfo
  1. dlgEror", null, null, null);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", resultMessage);
    	TunableObjectHelper.putAFInstanceValue(message, "counter", "exit");
    	returnResource.resource = TunableObjectREST.Resource.create(message);
    	return returnResource.resource;
    }
    
    /**
     * Вывод 
Диалог
  1. настраиваемого 
Предупреждение
  1. диалога
     * 
@ids текущий идентификатор документа
  1. @param paramsResource
     * 
@resultMessage
  1. @return 
сообщение
  1. ресурс 
*
  1. первого 
@return
  1. диалога 
ресурс
  1. сценария
     */
    function process_
dlgWarning
  1. dlgCustom(
ids
  1. paramsResource, 
resultMessage,
  1. returnResource) {
    
  1.     var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class);
    	var 
message
  1. id = 
appTNObject.composeDialog("RSHBRequestDialogInfo", null, null, null);
  1. TunableObjectHelper.
putAFInstanceValue
  1. getAFInstanceValue(
message
  1. paramsResource.tuning(
), "selectIds", ids
  1. )
; TunableObjectHelper
  1. .
putAFInstanceValue
  1. getValues(
message
  1. ).
tuning
  1. get(
),
  1. "
message
  1. $id"
, resultMessage
  1. ));
TunableObjectHelper.putAFInstanceValue(message, "counter", "exit"); returnResource.resource = TunableObjectREST.Resource.create(message); return returnResource.resource; } /** * Диалог Ошибка * @ids текущий идентификатор документа * @resultMessage сообщение * @return ресурс */ function process_dlgError(ids, resultMessage,returnResource){ var appTNObject = AFSession.get().getApplication(TunableObjectApplication.class);
  1.  //id объекта открытого в web
    	var ids = Utils.newArrayList(); 
    	ids.add(id);
    	
    	//Проверка на актуальность документа
        var version = paramsResource.getVersion();
    	if (!isActualObject(ids.get(0), version)){
    		process_dlginfo(ids,"<>",returnResource);
    		return returnResource.resource;
    	}
    
    	//Кастомный диалог
    	var message = appTNObject.composeDialog("
RSHBRequestDialogInfo
  1. <Custom Dialog>", null, null, null);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "message", "Комментарий:");
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "selectIds", ids);
    	TunableObjectHelper.putAFInstanceValue(message.tuning(), "
message
  1. versionContext", 
resultMessage
  1. version);
    	TunableObjectHelper.putAFInstanceValue(message, "counter", "
exit
  1. answer");
    
    	returnResource.
resource =
  1. setResource(TunableObjectREST.Resource.create(message
); return returnResource.resource
  1. ));
    }
    
    /**
     * Обработка данных 
     * @param paramsResource
     * @return ресурс
     */
    function process_context(paramsResource, returnResource) {
        var ids = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("selectIds"));
var comment
  1.  //Идентификатор отрытого объекта
    	var comment = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("comment")); //Комментарий из кастомного диалога
    	var version = TunableObjectHelper.getAFInstanceValue(paramsResource.tuning().getValues().get("versionContext")); //Версия открытого объекта
    
    	var appdp = AFSession.get().getApplication(DPApplication.class);
    	var obj = appdp.getEntityByUNID(ids.get(0));
    
    	//Проверка на актуальность документа
    	if (!isActualObject(ids.get(0), version)){
            process_dlgWarning(ids,"
<Информация Предупреждение>
  1. Данная версия объекта/документа была изменена. Требуется обновить документ!",returnResource);
    		return returnResource.resource;
    	}
else {
  1. 
    
    	
process_dlgError(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 wf_status = "-"; if (wf.getValues().containsKey("status") && wf.getValues().get("status") != null ) { wf_status = wf.getValues().get("status").getValue(); } var wf_starttime = new AFDateTime(Calendar.getInstance()); if (wf.getValues().containsKey("actiontime") && wf.getValues().get("actiontime") != null ) { wf_starttime = wf.getValues().get("actiontime").getValue(); } else if (wf.getValues().containsKey("starttime") && wf.getValues().get("starttime") != null ){ wf_starttime = wf.getValues().get("starttime").getValue(); } // Получаем задачу var taskId = wf.getValues().get("task_id").getValue(); var workflowProcessService = BeansUtils.getBean("workflowProcessServiceImpl"); var task = workflowProcessService.getTaskById(taskId); // Должна быть только одна задача, завершаем ее, установив переменную if (task != null){ //Запускаем WF task.getTaskVariables().put(task_name + "Result", true); var ProcessActionResult = workflowProcessService.completeUserTask(task); if (ProcessActionResult.hasError()) { rollbackWF(appdp, ids.get(0), obj); var exception = ProcessActionResult.getException(); var stacktrace = ExceptionUtils.getStackTrace(exception); throw new RuntimeException("Не удалось продолжить процесс. Обратитесь к администратору. Ошибка: " + stacktrace); } obj = appdp.getEntityByUNID(ids.get(0)); //запись в Жизненный цикл var currentUser = AFSession.get().currentUser().getBeard(); var executors = wf.getValues().get("assignee").getValues(); var executor = executors.get(0).getValue(); if (task_name.equals("ownerISNegotiationTask")) { if (obj.tuning().getValues().get("servOwnerISBoss") != null && obj.tuning().getValues().get("servOwnerISBoss").getValue() != null) { executor = obj.tuning().getValues().get("servOwnerISBoss").getValue(); } else { executor = null; } } else if (executor.originalData().getType().toString().equals("SYS_ROLE")){ executor = currentUser; } else { if (executors.size() > 1) { for (var i = 0; i < executors.size(); i++) { if (executors.get(i).getValue() == currentUser) { var executor = currentUser; } } } } var startDate = wf_starttime; var endDate = new AFDateTime(Calendar.getInstance()); var result = "Согласовано"; var information = comment; setLifeCycle(obj, startDate, endDate, wf_status, executor, currentUser, result, information); var time = new AFDateTime(Calendar.getInstance()); TunableObjectHelper.putAFInstanceValue(obj.tuning(), "wf.actiontime",time); var approvalBeard = null; var approvalTime = null; if (task_name.equals("initDepHeadNegotiationTask")) { approvalBeard = "approvalByHeadBeard"; approvalTime = "approvalByHeadTime"; } else if (task_name.equals("ownerISNegotiationTask")) { approvalBeard = "approvalByOwnerBeard"; approvalTime = "approvalByOwnerTime"; } if (approvalBeard != null && approvalTime != null) { var propertyBeard = obj.tuning().getSchema().getProperty(approvalBeard); var beardValue = TuningHelper.createPropertyValue(AFSession.get().currentUser().getBeard(), propertyBeard); obj.tuning().getValues().put(approvalBeard, beardValue); var propertyTime = obj.tuning().getSchema().getProperty(approvalTime); var beardTime = TuningHelper.createPropertyValue(new AFDateTime(), propertyTime); obj.tuning().getValues().put(approvalTime, beardTime); } try { obj.save(); } catch (e) { process_dlgError(ids,"<Информация об ошибке>",returnResource); return returnResource.resource; } 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)); } } /** * Откатить статусное состояние WF * @obj объект * id идентификатор объекта * @appdp приложение */ function rollbackWF(appdp, id, obj){ var document = appdp.getEntityByUNID(id); var wf = obj.tuning().getValues().get("wf"); var assignee = null; var task = ""; var status = wf.getValues().get("status").getValue(); var stage = ""; var duration = null; var starttime = null; var finishtime = null; if (wf.getValues().get("assignee") != null) { assignee = wf.getValues().get("assignee").getValues(); task = wf.getValues().get("task").getValue(); stage = wf.getValues().get("stage").getValue(); duration = wf.getValues().get("duration").getValue(); starttime = wf.getValues().get("starttime").getValue(); if (wf.getValues().get("finishtime") != null) { finishtime = wf.getValues().get("finishtime").getValue(); } } TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.assignee", assignee); TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.task", task); TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.status", status); TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.stage", stage); TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.duration", duration); TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.starttime", starttime); TunableObjectHelper.putAFInstanceValue(document.tuning(), "wf.finishtime", finishtime); document.save(); } /** * Запись в Жизненный цикл * @obj объект * @startDate дата начала действия * @endDate дата окончания действия * @action действие * @assignee исполнитель * @currentUser пользователь, выполнивший действие * @result Результат * @information Доп. информация */ function setLifeCycle(obj, startDate, endDate, action, assignee, currentUser, result, information) { var propertyLifecycle = obj.tuning().getSchema().getProperty("wf_lifecycle"); var lifecycle = null; if (obj.tuning().getValues().containsKey("wf_lifecycle") && obj.tuning().getValues().get("wf_lifecycle") != null) { lifecycle = obj.tuning().getValues().get("wf_lifecycle").getValues(); } else { lifecycle = Utils.newArrayList(); } var propertyStartDate = propertyLifecycle.getSchema().getProperty("lifecycle_start_date"); var propertyDate = propertyLifecycle.getSchema().getProperty("lifecycle_date"); var propertyAction = propertyLifecycle.getSchema().getProperty("lifecycle_action"); var propertyAssignee = propertyLifecycle.getSchema().getProperty("lifecycle_assignee"); var propertyCurrentUser = propertyLifecycle.getSchema().getProperty("lifecycle_current_user"); var propertyResult = propertyLifecycle.getSchema().getProperty("lifecycle_result"); var propertyInformation = propertyLifecycle.getSchema().getProperty("lifecycle_information"); var startDateValue = TuningHelper.createPropertyValue(startDate, propertyStartDate); var endDateValue = TuningHelper.createPropertyValue(endDate, propertyDate); var actionValue = TuningHelper.createPropertyValue(action, propertyAction); var currentUserValue = TuningHelper.createPropertyValue(currentUser, propertyCurrentUser); var assigneeValue = TuningHelper.createPropertyValue(assignee, propertyAssignee); var resultValue = TuningHelper.createPropertyValue(result, propertyResult); var informationValue = TuningHelper.createPropertyValue(information, propertyInformation); var wf_lifecycle = new AFInstanceObjectImpl(propertyLifecycle.getSchema()); wf_lifecycle.getValues().put("lifecycle_start_date", startDateValue); wf_lifecycle.getValues().put("lifecycle_date", endDateValue); wf_lifecycle.getValues().put("lifecycle_action", actionValue); wf_lifecycle.getValues().put("lifecycle_assignee", assigneeValue); wf_lifecycle.getValues().put("lifecycle_current_user", currentUserValue); wf_lifecycle.getValues().put("lifecycle_result", resultValue); wf_lifecycle.getValues().put("lifecycle_information", informationValue); lifecycle.add(wf_lifecycle); var lifecycleValue = new AFInstanceArrayImpl(propertyLifecycle.getSchema(), lifecycle); obj.tuning().getValues().put("wf_lifecycle", lifecycleValue); }
  1. /*
    	Алгоритм 
    	*/	
    
    	//Проверка при сохранении
    	try {
    	    obj.save();
    	} catch (e) {
    		process_dlgError(ids,"Произошел конфликт при сохранении документа. Требуется обновить документ!",returnResource);
    		return returnResource.resource;
    	}
    }
  2. В форме создать секцию RootMenu
  3. В RootMenu создать button и подключить к нему handler

    Информация
    titleКоды иконок

    https://conf.inttrust.ru:8443/pages/viewpage.action?pageId=59704445

    Блок кода
    languagexml
    <section id="RootMenu">
        <component>
            <button name="${<Form Name>.RootMenu.button.<Name>:Новая кнопка}">
                <icon code="37"/>
                <action>
                    <custom>
                        <operation>
                            <handler-ref ref="<Handler Name>"/>
                        </operation>
                    </custom>
                </action>
            </button>
        </component>
    </section>