пятница, 5 июня 2015 г.

работа с Flexi Task Nintex с помощью javascript

В компании, для автоматизации бизнес процессов применяется Nintex и вот появилась задача, вывести на форме элемента кнопки согласования. В интернете много решений с использованием InfoPaht, но так как я его не люблю, то использовал javascript.


И так приступим.
Нам понадобится:
jQuery – для выполнения Ajax запроса и манипуляций с xml (куда же без него).
Bootstrab – для приятного интерфейса (об этом писал ранее)
Для работы на клиенте Nintex нам предлагает набор веб-сервисов, для текущей задачи использовал:

GetRunningWorkflowTasksForCurrentUserForListItem – для получения задач текущего пользователя для текущего элемента.
ProcessFlexiTaskResponse – для записи решения в задачу.

Как работает скрипт, первым делом мы получаем активные задачи текущего пользователя для текущего элемента. Если есть, то проверяем тип задачи, нас интересует «MultiOutcome», если нашли, то добавляем кнопки.
При постановке Flexi задачи можно сделать несколько выходов, по умолчанию это Утвердить и Отклонить.

Мне этого достаточно, поэтому и добавляем две кнопки, если понадобится больше, то можно легко добавить новую. Кстати, если требуется указать свое значение, то в кнопке вместо «Утвердить» можно указать свое значение.

onclick="approvalDecision('+ task.sharePointTaskId +',\'Утвердить\')

Как этим пользоваться.

Добавляем на страницу элемента (DispForm.aspx) веб-часть «Редактор скрипта» и в него добавляем ссылки:







Так же в веб-часть вставляем скрип, предварительно изменив название списка задач и GUID списка задач.
var taskListTitle = "Задачи рабочего процесса"; //change
var taskListGUID = "92231e60-96fa-4220-98a6-8aa183e4c656"; //change
Все, пользуемся.

var taskListTitle = "Задачи рабочего процесса"; //change
var taskListGUID = "92231e60-96fa-4220-98a6-8aa183e4c656"; //change
var webUrl = _spPageContextInfo.webAbsoluteUrl;

_spBodyOnLoadFunctionNames.push("postRender");
function postRender()
{

 // изменение класса кнопок 
 jQuery("[id*='diidIOSaveItem']").attr("class", "btn btn-success ms-ButtonHeightWidth");
 jQuery("[id*='diidIOGoBack']").attr("class", "btn btn-primary ms-ButtonHeightWidth");
 
 //меняем стиль таблицы
 jQuery("table.ms-formtable").attr("class", "ms-formtable table table-hover");

 addButton();

};

function addButton()
{
 //получаем задачи текущего пользователя на текущем элементе
 var soap = ''+
    ''+
    '  '+
    '    '+
    '      '+ getCurrentItemId() +''+
    '      ' + taskListGUID + ''+
    '    '+
    '  '+
    '';    
 var getTasks = getDataViaNintexSoap(soap); 
 getTasks.done(function (docum, status, soapResponse){
  data = soapResponse.responseText;
  console.log(data);
  var path =  jQuery(data).find("soap\\:Body").find("GetRunningWorkflowTasksForCurrentUserForListItemResponse").find("UserTask");
    var task = {
       sharePointTaskId :  path.find("SharePointTaskId").text(),
       TaskType :    path.find("TaskType").text(),
       HumanWorkflowID :  path.find("HumanWorkflowID").text(),
       UserID :    path.find("AssignedTo").find("UserID").text()      
    }  
  if (task.TaskType == "MultiOutcome")
  {
   //console.log(task);
   console.log("активная задача есть, добавляем кнопки");
    var customButton =  '
'+ ''+ ''+ '
'+ ''+ ''+ ''+ '
'; jQuery("table.ms-formtable").next().before(customButton); } }); } function getCurrentItemId(){ var docurl = document.URL; var beginindex = docurl.indexOf('ID=') + 3; var endindex = docurl.indexOf('&Source='); var itemid = docurl.substring(beginindex, endindex); console.log("ID текущего элемента - "+itemid); return itemid; } function getDataViaNintexSoap(soapRequest) { console.log(soapRequest) return jQuery.ajax({ type: "POST", url: webUrl +"/_vti_bin/NintexWorkFlow/WorkFlow.asmx", contentType: "text/xml;charset=UTF-8", contentLength: soapRequest.length, dataType: "xml", data: soapRequest, success: processSuccess, error: processError }); function processSuccess(data, status, req) {if (status == "success") console.log("запрос SOAP выполнен успешно")}; function processError(data, status, req) { console.log(req.responseText + " " + status); } ; } function approvalDecision(taskID,decision) { var soap = ''+ ''+ ' '+ ' '+ ' '+ ' '+ decision +''+ ' '+ taskID +''+ ' '+taskListTitle +''+ ' '+ ' '+ ''; var result = getDataViaNintexSoap(soap); result.done(function (docum, status, soapResponse){ data = soapResponse.responseText; console.log("результат обновления задачи - " + jQuery(data).text()) jQuery("[id*='diidIOGoBack']").click(); }); };