Histórico da Página
HTML |
---|
<div id="main-content" class="wiki-content group"> <h1 id="MecanismodeAtribuiçãoCustomizado-Índice">Índice</h1> <p> <style>Contents</h1><p><style type='text/css'>/*<![CDATA[*/ div.rbtoc1412695703823 { padding: 0px; } div.rbtoc1412695703823 ul { list-style: none; margin-left: 0px; } div.rbtoc1412695703823 li { margin-left: 0px; padding-left: 0px; } /*]]>*/ </style> <div style><div class='toc-macro rbtoc1412695703823'> <ul class='toc-indentation'> <li><span class='TOCOutline'>1</span> <a href='#MecanismodeAtribuiçãoCustomizado-Objetivo'>Objetivo<>Objective</a></li> <li><span class='TOCOutline'>2</span> <a href='#MecanismodeAtribuiçãoCustomizado-Pré-requisitos'>Prerrequisitos<>Requirements</a></li> <li><span class='TOCOutline'>3</span> <a href='#MecanismodeAtribuiçãoCustomizado-ConstruindoumMecanismoPersonalizado'>Construyendo un Mecanismo Personalizado<>Building a Custom Mechanism</a></li> <li><span class='TOCOutline'>4</span> <a href='#MecanismodeAtribuiçãoCustomizado-RetornandoumaListagemdeUsuários'>Retornando una Lista de Usuarios<>Returning a User List</a></li> <li><span class='TOCOutline'>5</span> <a href='#MecanismodeAtribuiçãoCustomizado-UtilizandoDatasets'>Utilizando >Using Datasets</a></li> <li><span class='TOCOutline'>6</span> <a href='#MecanismodeAtribuiçãoCustomizado-UtilizandoServiços/Webservices'>Utilizando Servicios>Using Services / Webservices</a></li> </ul> </div> </p> <h1div></p><h1 id="MecanismodeAtribuiçãoCustomizado-Objetivo">Objetivo</h1> <p> El objetivo de esta guía es orientar como construir un <em>script</em> con la finalidad de resolver los responsables por una tarea del proceso workflow y/o gestor de proceso. </p> <h1>Objective</h1><p>The purpose of this guide is to provide instructions on how to build a <em>script</em> with the purpose of solving a assignee for a workflow process task and/or process manager.</p><h1 id="MecanismodeAtribuiçãoCustomizado-Pré-requisitos"> Prerrequisitos<strong><br>Requirements<strong><br /></strong> </h1> <ul> <li>Conocimiento del lenguaje Javascript;</li> <li>Conocimiento sobre la construcción de flujos de proceso Workflow Fluig;</li> <li>Conceptos sobre la utilización de Datasets Fluig;</li> <li>Entendimiento sobre servicios de la Web, Webservices, SOAP y XML;</li> <li>Familiaridad con la herramienta de desarrollo, TOTVS Developer Studio o Eclipse;</li> <li>Instalación delstrong></h1><ul><li>Knowledge of JavaScript language;</li><li>Knowledge on the construction of Workflow Fluig process flows;</li><li>Knowledge on using Fluig Datasets;</li><li>Understanding of Web, Webservice, SOAP e XML services;</li><li>Familiarity with the development tool, TOTVS Developer Studio or Eclipse;</li><li>Installation of Fluig Studio.</li> </ul> <h1 li></ul><h1 id="MecanismodeAtribuiçãoCustomizado-ConstruindoumMecanismoPersonalizado">Construyendo un Mecanismo Personalizado</h1> <p>En algunas situaciones es necesario utilizar lógicas más complejas y específicas sobre quien será(n) el(los) responsable(s) por la ejecución de la actividad en la solicitud de proceso workflow. Para eso, existe el "Mecanismo de Atribución Personalizado".</p> <p> Para iniciar su construcción, se debe, en un proyecto existente, hacer clic en la carpeta <em>mechanisms</em> y acceder el menú <em>Archivo > Nuevo > Otros>Building a Custom Mechanism</h1><p>In some situations, a more complex and specific logic is required regarding the definition of who will be responsible for the execution of the activity in the workflow process request. That is the purpose of the "Custom Attribution Mechanism".</p><p>To start building this mechanism, one should, from an existing project, click on the folder <em>mechanisms</em> and access the menu <em>File > New > Other... </em>(accesibleaccessible por las teclas de atajo <em>CTRLthrough the shortcut<em>CTRL+N,</em> oor hacerby clicclicking conthe el botón derecho delfolder with the right mouse sobre la carpetabutton, ythen seguirfollowing porthe el menú suspendido), expandir eldrop-down menu), expand the <em>Fluig</em> grupogroup (carpetafolder) <em>Fluig</em>, seleccionar la opciónselect <em>Mecanismo<em>Custom PersonalizadoFluig Fluig<Mechanism</em> yand hacer clic en el botón <em>Avanzar. </em>En la pantalla siguiente, indicar el <em>Código<click on <em>Next. </em>In the following screen, enter the <em>Code</em> (obligatorio y no se puede alterar después) en el campo respectivo y su <em>Descripciónmandatory and cannot be changed at a later time) in the respective field and its <em>Description </em>(opcionaloptional) igualmente, y, and, finalmentelastly, hacer clic en el botón <em>Concluir<click <em>Finish</em>. </p> <p>p><p> </p> <div class="aui-message hint shadowed information-macro"> <p class="title">Nota<>Note</p> <span class="aui-icon icon-hint">Icon</span> <div class="message-content"> <p> El código para el mecanismo debe seguir la especificación de estandarización conforme al documento <a href="attachments/142804157/142935815.docx">Formularios Fluig</a>. </p> </div> </div> <p> </p> <p> Con eso, se creará la función básica que se debe implementar:<span> </span> </p> <p> <span> <br /></span> </p> <div class="code panel pdl" style="border-width: 1px;"> <div class="codeContent panelContent pdl"> <pre class="theme: Confluence; brush: javascript; gutter: false" style="font-size: 12px;">function resolve(process,colleague){ var userList = null; return userList; }</pre> </div> </div> <p> </p> <p> La función anterior <strong>no</strong> <strong>retorna ningún usuario</strong>. Su ejecución no permitirá elegir a nadie, por eso, esta función debe ser complementada. </p> <p> La función <strong>debe </strong>retornar una lista, del tipo <strong><em>ArrayList </em></strong>con las <strong>matrículas </strong>de los usuarios. La matrícula no es necesariamente igual al login de este usuario. La matrícula corresponde al valor existente en el campo del mismo nombre en el registro de este usuario y a la columna <em>colleaguePK.colleagueId</em> del Dataset <em>colleague</em>. </p> <p> </p> <div class="aui-message warning shadowed information-macro"> <p class="title">Atención</p> <span class="aui-icon icon-warning">Icon</span> <div class="message-content"> <p> Si ocurre cualquier error de sintaxis o en la ejecución del mecanismo, este se abortara y, consecuentemente, no devolverá ningún responsable para la próxima tarea/actividad del proceso. Es importante que toda la implementación pase por un tratamiento de errores y protección de ejecución. Una buena práctica es utilizar las cláusulas <em>try catch</em>. </p> </div> </div> <p> </p> <p> </p> <div class="aui-message hint shadowed information-macro"> <p class="title">Nota</p> <span class="aui-icon icon-hint">Icon</span> <div class="message-content"> <p> Ningún mensaje de error se puede emitir al usuario durante su ejecución, pues estos mecanismos se pueden invocar sin que exista la interacción con el usuario, como por ejemplo, las llamadas al webservice <em>ECMWorkflowEngineService</em> por medio de las integraciones externas. </p> </div> </div> <p> </p> <h1 id="MecanismodeAtribuiçãoCustomizado-RetornandoumaListagemdeUsuários">Retornando una Lista de Usuarios</h1> <p>Un ejemplo de retorno de una relación fija de usuarios se presenta a seguir:</p> <p> </p> <div <span class="aui-icon icon-hint">Icon</span> <div class="message-content"> <p>The code for the mechanism must follow the default specification, according to the <a href="attachments/142804157/142935815.docx">Fluig Forms</a> document.</p> </div> </div> <p> </p><p>Therefore, this basic function will be created, and must be implemented:<span> </span></p><p><span> <br /></span></p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <pre class="theme: Confluence; brush: javascript; gutter: false" style="font-size:12px;">function resolve(process,colleague){ var userList = null; return userList; }</pre> </div></div><p> </p><p>The function above <strong>does not</strong> <strong>return any user</strong>. Its execution will not enable the selection of a user, and therefore the function must be complemented.</p><p>The function <strong>should </strong>return an <strong><em>ArrayList </em></strong>with the <strong>registration </strong>of users. The registration is not necessarily the same as the user login. The registration corresponds to existing value in the field with the same name as the registration for this user and the column <em>colleaguePK.colleagueId</em>, of the Dataset <em>colleague</em>.</p><p> </p> <div class="aui-message warning shadowed information-macro"> <p class="title">Warning</p> <span class="aui-icon icon-warning">Icon</span> <div class="message-content"> <p>If a syntax error or error in executing the mechanism occurs, it will be aborted and therefore will not return anyone responsible for the next task/process activity. It is important that the entire implementation go through error handling and execution protection. A good practice is to use <em>try catch</em> clauses.</p> </div> </div> <p> </p><p> </p> <div class="aui-message hint shadowed information-macro"> <p class="title">Note</p> <span class="aui-icon icon-hint">Icon</span> <div class="message-content"> <p>No error message can be issued to the user during its execution, as these mechanisms may be invoked without interaction with the user, such as calls to <em>ECMWorkflowEngineService</em>, through external integrations.</p> </div> </div> <p> </p><h1 id="MecanismodeAtribuiçãoCustomizado-RetornandoumaListagemdeUsuários">Returning a User List</h1><p>An example of return for a fixed user list is shown below:</p><p> </p><div class="code panel pdl" style="border-width: 1px;"> <div><div class="codeContent panelContent pdl"> <pre class="theme: Confluence; brush: javascript; gutter: false" style="font-size: 12px;">function resolve(process,colleague){ var userList = new java.util.ArrayList(); userList.add('matricula_1'); userList.add('matricula_2'); userList.add('matricula_3'); return userList; }</pre> </div> </div> <p>div></div><p> </p> <h1p><h1 id="MecanismodeAtribuiçãoCustomizado-UtilizandoDatasets">Utilizando >Using Datasets</h1> <p> Es posible realizar la consultah1><p>It is possible to query a unPlatform <em>Dataset </em>de la Plataforma (internoem> (internal, formulariosforms oor personalizadocustomized), ain order finto dedraw elaborarup elthe resultado final deresult losof usuariosusers quethat semay podránbe listarlisted parafor laselection elecciónof de la ejecución de la próxima actividad. Este procedimiento se puede realizar conforme al ejemplo a seguir: </p> <p> <span><br /></span> </p> <divthe execution of the next activity. This procedure must be performed according to the example below:</p><p><span><br /></span></p><div class="code panel pdl" style="border-width: 1px;"> <div><div class="codeContent panelContent pdl"> <pre class="theme: Confluence; brush: javascript; gutter: false" style="font-size: 12px;">function resolve(process,colleague){ var userList = new java.util.ArrayList(); //-- CONSULTAQUERY TO A UN DATASET, DEOF GRUPOFLUIG DEUSERS USUARIOS FLUIGGROUP var dtsGroup = DatasetFactory.getDataset('group',null,null,null); for(var g = 0; g < dtsGroup.values.length; g++){ userList.add( 'Pool:Group:'+dtsGroup.getValue(g.toString(),"groupPK.groupId") ); } //-- CONSULTAQUERY TO A UN DATASET, DEOF PAPELESFLUIG DEUSERS USUARIOS FLUIGROLE var dtsRole = DatasetFactory.getDataset('workflowRole',null,null,null); for each(papel in dtsRole.values){ userList.add( 'Pool:Role:'+papel["workflowRolePK.roleId"] ); } return userList; }</pre> </div> </div> <p>div></div><p> </p> <p> En el ejemplo anterior, para que el(los) <strong>Grupop><p>In the example above, in order for the <strong>Group(s)</strong> se liste(n) es necesaria la inclusión del prefijo to be listed, it is necessary to include the prefix <strong><em>"Pool: Group:"</em></strong> concatenado al código de este Grupo. Con esto, al seleccionar el grupo, la actividad se atribuye al Grupo y una persona de este deberá asumirla. De la misma forma ocurre para el(s) <strong>Papel(es) Workflow</strong>, pero el prefijo debe ser concatenated to the code for this Group. With this, when the group is selected, the activity is attributed to the Group and someone from the group should assume it. The same is true for the <strong>Workflow Role(s)</strong>, however the prefix will be <strong><em>"Pool:Role:"</em></strong> más el código del Papel. </p> <p>, followed by the Role code.</p><p> </p> <h1 p><h1 id="MecanismodeAtribuiçãoCustomizado-UtilizandoServiços/Webservices">Utilizando Servicios>Using Services / Webservices</h1> <p> La construcción de un mecanismo aun posibilita la utilización de un <strong>Servicio de Integración Fluig<h1><p>The construction of a mechanism also enables the use of a <strong>Fluig Integration Service</strong>, quewhich podrámay consumirconsume un <strong>webservice </strong>del tipo <strong>SOAP </strong>o del tipo<strong> Progressa <strong>SOAP</strong> or <strong>Progress</strong> <strong>webservice </strong>parastrong>to obtenerretrieve losthe responsablesassignees, de acuerdoaccording conto una regla de negocio provista por ela business rule provided by the ERP, porfor ejemploexample. EsteThis métodomethod puede seguir el modelo a continuación: </p> <p>may follow the model below:</p><p> </p> <divp><div class="code panel pdl" style="border-width: 1px;"> <div><div class="codeContent panelContent pdl"> <pre class="theme: Confluence; brush: javascript; gutter: false" style="font-size: 12px;">function resolve(process,colleague){ var userList = new java.util.ArrayList(); //-- CALL LLAMADATO A UNFLUIG SERVICIOINTEGRATION DESERVICE, INTEGRACIÓNWITH FLUIG, CON UNA SPECIFIED WEBSERVICE ESPECIFICADO var biblioteca = ServiceManager.getService('ECMColleagueService').getBean(); var puntoendpoint = biblioteca. instanciar instantiate('com.totvs.technology.ecm. foundation.ws. ECMColleagueServiceServiceLocator'); var webservice = webservice endpoint. getColleagueServicePort (); var usuariosDtoArray = webservice.getSummaryColleagues(1); for each(usuario in usuariosDtoArray.getItem()){ userList.add( usuario.getColleagueId().toString() ); } return userList; }</pre> </div> </div> <p>div></div><p> </p> <p> En que los parámetrosp><p>Where the "process" yand "colleague" separameters refieren, respectivamenterefer, respectively, ato losthe objetosobjects <span style="color: rgb(38, 38, 38);">WorkflowProcess process and y Colleague colleague.</span> </p> <p>span></p><p> </p> <divp><div class="table-wrap"> <table><table class="confluenceTable"> <tbody> <tr> <th><tbody><tr><th colspan="2" style="text-align: center;" class="confluenceTh"><span style="color: rgb(0, 51, 102);">WorkflowProcess</span></th> </tr> <tr> <thth></tr><tr><th style="text-align: center;" class="confluenceTh">Parámetro</th> <th>Parameter</th><th style="text-align: center;" class="confluenceTh">Tipo</th> </tr> <tr> <td>Type</th></tr><tr><td class="confluenceTd"><span style="color: rgb(38, 38, 38);">companyId</span></td> <td/span></td><td class="confluenceTd">long</td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">processInstanceId</span></td> <tdtd><td colspan="1" class="confluenceTd">int</td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">processId</span></td> <tdtd><td colspan="1" class="confluenceTd">String</td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">Versión<>version</span></td> <tdtd><td colspan="1" class="confluenceTd">Integer</td> </tr> <tr> <td/td></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">requesterId</span></td> <tdtd><td colspan="1" class="confluenceTd">String</td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">active</span></td> <tdtd><td colspan="1" class="confluenceTd">Boolean</td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">attachmentSeqId </span></td> <tdtd><td colspan="1" class="confluenceTd">Integer</td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">sourceProcess </span></td> <tdtd><td colspan="1" class="confluenceTd"><span>Integer</span></td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">sourceThreadSequence </span></td> <tdtd><td colspan="1" class="confluenceTd"><span>Integer</span></td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd"><span style="color: rgb(38, 38, 38);">uuid</span></td> <tdtd><td colspan="1" class="confluenceTd">String</td> </tr> </tbody> </table> </div> <p>td></tr></tbody></table></div><p> </p> <p>p><p> </p> <divp><div class="table-wrap"> <table><table class="confluenceTable"> <tbody> <tr> <th><tbody><tr><th colspan="2" style="text-align: center;" class="confluenceTh"><span style="color: rgb(0, 51, 102);">Colleague</span></th> </tr> <tr> <thth></tr><tr><th style="text-align: center;" class="confluenceTh">Parámetro</th> <th>Parameter</th><th style="text-align: center;" class="confluenceTh">Tipo</th> </tr> <tr> <td>Type</th></tr><tr><td class="confluenceTd"><p>colleaguePK </p> <ulp><ul style="list-style-type: square;"> <li><span><span>long><li><span><span>long companyId</span></span></li> <li><span>privateli><li><span>private String colleagueId</span></li> </span></li></ul></td> <tdtd><td class="confluenceTd">ColleaguePK </td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">userTenantId</td> <tdtd><td colspan="1" class="confluenceTd">long </td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">colleagueName</td> <tdtd><td colspan="1" class="confluenceTd"><span>String</span></td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">mail</td> <tdtd><td colspan="1" class="confluenceTd"><span>String</span></td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">login</td> <td>login</td><td colspan="1" class="confluenceTd"><span>String</span></td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">passwd</td> <tdtd><td colspan="1" class="confluenceTd"><span>String</span></td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">active</td> <tdtd><td colspan="1" class="confluenceTd">Boolean </td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">adminUser</td> <tdtd><td colspan="1" class="confluenceTd">Boolean </td> </tr> <tr> <tdtd></tr><tr><td colspan="1" class="confluenceTd">groupId</td> <tdtd><td colspan="1" class="confluenceTd">String</td> </tr> </tbody> </table> </div> <p>td></tr></tbody></table></div><p> </p> <p> El ejemplo anterior utilizó elp><p>The example above used the webservice <em><strong>ECMColleagueService , </strong></em>deem>from lathe propiavery plataformaplatform, yand elthe <strong>Servicio<strong>Service </strong>fue creado utilizando lastrong>was created with <strong>API Axis</strong>, estándarstandard delin TOTVS ECM 3.0. </p> <p>p><p> </p> </div> |
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas