В компании, для автоматизации бизнес процессов применяется
Nintex и вот появилась задача, вывести на форме элемента кнопки согласования. В
интернете много решений с использованием InfoPaht, но так как я его не люблю,
то использовал javascript.
И так приступим.
Нам понадобится:
jQuery – для выполнения Ajax запроса и манипуляций с xml
(куда же без него).
Bootstrab – для приятного интерфейса (об этом писал ранее)
Для работы на клиенте Nintex нам предлагает набор
веб-сервисов, для текущей задачи использовал:
GetRunningWorkflowTasksForCurrentUserForListItem – для
получения задач текущего пользователя для текущего элемента.
ProcessFlexiTaskResponse – для записи решения в задачу.
Как работает скрипт, первым делом мы получаем активные
задачи текущего пользователя для текущего элемента. Если есть, то проверяем тип
задачи, нас интересует «MultiOutcome», если нашли, то добавляем кнопки.
При постановке Flexi задачи можно сделать несколько выходов,
по умолчанию это Утвердить и Отклонить.
Мне этого достаточно, поэтому и добавляем две кнопки, если понадобится
больше, то можно легко добавить новую. Кстати, если требуется указать свое значение,
то в кнопке вместо «Утвердить» можно указать свое значение.
1 | onclick="approvalDecision( '+ task.sharePointTaskId +' ,\'Утвердить\') |
Как этим пользоваться.
Добавляем на страницу элемента (DispForm.aspx) веб-часть «Редактор скрипта» и в
него добавляем ссылки:
1 2 3 | < script src = "/Style%20Library/Js/jquery-1.11.1.min.js" type = "text/javascript" ></ script > < link href = "/Style%20Library/bootstrap/css/bootstrap.min.css" rel = "stylesheet" type = "text/css" > < script src = "/Style%20Library/bootstrap/js/bootstrap.min.js" type = "text/javascript" ></ script > |
Так же в веб-часть вставляем скрип, предварительно изменив
название списка задач и GUID списка задач.
1 2 | var taskListTitle = "Задачи рабочего процесса" ; //change var taskListGUID = "92231e60-96fa-4220-98a6-8aa183e4c656" ; //change |
Все, пользуемся.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | 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 = '' + '<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' + ' <soap:body>' + ' <itemid>' + getCurrentItemId() + '</itemid>' + ' <listname>' + taskListGUID + '</listname>' + ' </getrunningworkflowtasksforcurrentuserforlistitem>' + ' </soap:body>' + '</soap:envelope>' ; 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 = '<div> ' + '' + '' + '<table style="width: 100%;"><tbody> <tr><td align="right" style="padding: 2px; width: 100%;">' + '<button class="btn btn-default" onclick="approvalDecision(' + task.sharePointTaskId + ',\'Отклонить\')" type="button">' + '<span aria-hidden="true" class="glyphicon glyphicon-remove"></span> Отклонить' + '</button>' + '</td><td align="right" style="padding: 2px; width: 100%;">' + '<button class="btn btn-success" onclick="approvalDecision(' + task.sharePointTaskId + ',\'Утвердить\')" type="button">' + '<span aria-hidden="true" class="glyphicon glyphicon-ok"></span> Утвердить' + '</button>' + '</td></tr> </tbody></table> </div> ' ; 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 = '' + '<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' + ' <soap:body>' + ' <comments></comments>' + ' <outcome>' + decision + '</outcome>' + ' <sptaskid>' + taskID + '</sptaskid>' + ' <tasklistname>' +taskListTitle + '</tasklistname>' + ' </processflexitaskresponse>' + ' </soap:body>' + '</soap:envelope>' ; var result = getDataViaNintexSoap(soap); result.done( function (docum, status, soapResponse){ data = soapResponse.responseText; console.log( "результат обновления задачи - " + jQuery(data).text()) jQuery( "[id*='diidIOGoBack']" ).click(); }); }; |
Комментариев нет:
Отправить комментарий