我的环境:
Alfresco Share v5.2.d(r134641-b15、Aikau 1.0.101.3、Spring Surf
5.2.d、Spring WebScripts 6.13、Freemarker 2.3.20-alfresco-patched、Rhino 1.7R4-alfresco-patched、Yui 2.9.0-alfresco-20141223)
Alfresco 社区 v5.2.0 (r134428-b13) 架构 10005
当我启动工作流程时,我可以分配执行者 - 将参与业务流程的用户列表。我需要获取所有这些用户的列表,并在 reviewTask 屏幕中显示该列表。
为了显示此数据,我有自定义 FreeMarker 模板。我将从此模板中调用我的 Web 脚本。
为了通过 REST 与存储库交互,我使用 Web 脚本框架 MVC - 该控制器执行接收用户列表和 JSON 响应的 FreeMarker 模板的逻辑。
我已被提供好主意 https://stackoverflow.com/questions/42745913/how-to-queries-all-the-assignments-from-the-repository,如何做到这一点。但我遇到了一些问题。
假设我启动了业务流程的多个实例。在工作流控制台中我可以看到以下内容:
id: activiti$1801 , desc: DESCRIPTION_1 , start date: Sun Mar 12 19:19:09 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti$2005 , desc: DESCRIPTION_2 , start date: Sun Mar 12 20:11:57 GST 2017 , def: activiti$activitiParallelReview v1
id: activiti$2138 , desc: DESCRIPTION_3 , start date: Sun Mar 12 20:12:55 GST 2017 , def: activiti$activitiParallelReview v1
因此我有三个ID:
activiti$1801
activiti$2005
activiti$2138
这些 ID 仅在工作流程控制台中可供我使用。
如何在控制器中获取这些标识符?
例如,我可以编写一个由 Activiti 调用的类吗?比方说,
public class SomeListener implements TaskListener {
...
@Override
public void notify(DelegateTask task) {
...
String taskId = task.getId();
...
}
}
然后将其附加到某个任务的完成事件并将 ID 传递给控制器。
这是正确的方法吗?...
我将非常感谢您提供的信息。谢谢大家。
我写了一个类来实现ExecutionListener http://docs.alfresco.com/5.1/concepts/wf-process-def-listeners-execution.html界面。然后将其添加为转换的侦听器mswf:submitParallelReviewTask
to mswf:activitiReviewTask
.
我需要的所有属性,我都可以在这里获得(感谢加格拉瓦尔 https://stackoverflow.com/users/685641/gagravarr为了他的answer https://stackoverflow.com/questions/33798544/alfresco-get-username-in-workflow):
public class PropertiesReceiver implements ExecutionListener {
private static final long serialVersionUID = 1L;
private static Log logger = LogFactory.getLog(PropertiesReceiver.class);
@Override
public void notify(DelegateExecution delegateExecution) throws Exception {
// TODO Auto-generated method stub
String processInstanceId = delegateExecution.getProcessInstanceId();
logger.debug("processInstanceId == " + processInstanceId);
ActivitiScriptNodeList assignees =
(ActivitiScriptNodeList) delegateExecution.getVariable("bpm_assignees");
for (ActivitiScriptNode personNode : assignees) {
String username = (String) personNode.getProperties().get("cm:userName");
logger.debug("username == " + username);
}
}
}
alfrescotomcat-stdout.2017-03-13.log:
...
2017-03-13 11:03:12,244 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] processInstanceId == 26205
2017-03-13 11:03:12,248 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == first
2017-03-13 11:03:12,250 DEBUG [mswf.bpm.PropertiesReceiver] [http-apr-8080-exec-3] username == second
...
但这是一个单独的项目,打包在 AMP 文件中。
好吧,另一种方式。我可以获取流程实例的 idScriptExecutionListener http://dev.alfresco.com/resource/docs/java/org/alfresco/repo/workflow/activiti/listener/ScriptExecutionListener.html:
execution.getProcessInstanceId();
并打电话露天 REST API https://api-explorer.alfresco.com/api-explorer从共享端检索我需要的所有信息(感谢马丁·埃赫 https://community.alfresco.com/people/mehe).
例如,此调用允许获取所有执行程序:
http://localhost:8080/alfresco/api/-default-/public/workflow/versions/1/processes/26205/variables
,where 26205 == id
流程实例的。
但是我应该在哪里保存这个 ID 才能从共享中访问它?我可以在工作流模型中添加方面吗?它是否正确?