我的环境:
Alfresco分享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 Community v5.2.0(r134428-b13)schema 10005
当我启动工作流程时,我可以分配执行程序 - 将参与业务流程的用户列表。我需要获取所有这些用户的列表,并在reviewTask屏幕中显示此列表。
要显示此数据,我有自定义FreeMarker模板。在这个模板中,我将调用我的Web脚本。
要通过REST与存储库交互,我使用Web Script Framework MVC - 执行接收用户列表逻辑的控制器和用于JSON响应的FreeMarker模板。
我已被提供the great idea,如何做到。但我遇到了一些问题。
我们说,我启动了业务流程的多个实例。在工作流程控制台中,我可以看到以下内容:
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
接口的类。然后将其添加为从mswf:submitParallelReviewTask
到mswf:activitiReviewTask
的转换的监听器。
我需要的所有属性,我可以到这里(感谢Gagravarr感谢他的answer):
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文件中。
好的,另一种方式。我可以在ScriptExecutionListener
中获取流程实例的ID:
execution.getProcessInstanceId();
从共享方面调用the Alfresco REST API以检索我需要的所有信息(感谢Martin Ehe)。
例如,此调用允许获取所有执行程序:
http://localhost:8080/alfresco/api/-default-/public/workflow/versions/1/processes/26205/variables
,流程实例的26205 == id
。
但是我应该在哪里保存此ID才能从Share访问它?我可以在工作流模型中添加方面吗?它是否正确?..
答案 0 :(得分:1)
请试试这个。
public JSONObject test(String userName) {
JSONObject allTasks = new JSONObject();
companyHome = repository.getCompanyHome();
try {
List<WorkflowTask> wft=serviceRegistry.getWorkflowService().getAssignedTasks(userName,WorkflowTaskState.IN_PROGRESS );
JSONArray ja = new JSONArray();
System.out.println("WF sizes = "+wft.size());
for (WorkflowTask temp : wft) {
JSONObject userWFDetails = new JSONObject();
userWFDetails.put("taskId", temp.getId());
userWFDetails.put("taskDesc", temp.getDescription());
userWFDetails.put("wfInstanceId", temp.getPath().getInstance().getId());
System.out.println("wf tasks-"+temp);
System.out.println("task id-"+temp.getId());
System.out.println("wf instance id-"+temp.getPath().getInstance().getId());
System.out.println("wf path id-"+temp.getPath().getId());
ja.put(userWFDetails);
}
allTasks.put("userTasksDetails", ja);
} catch (Exception e) {
e.printStackTrace();
}
return allTasks;
}
传递您的userName。并且您将获得所有用户任务详细信息。 json格式的工作流实例详细信息。