以下只是示例代码,具体封装要根据需求设计,将工作流接口调用限制在封装类中,如下代码中所示工作流功能封装类名称为WFUtil
:
场景一:初始化客户端
代码如下:
private long APP_ID = CiticWF.APP_ID;
private long BIZ_ID = CiticWF.BIZ_ID;
private String orgID;
private String userID = "sa";
private SunflowClient client;
private CiticWF wf;
public WFUtil(String orgID, String userID) throws SunflowException {
this.orgID = orgID;
this.userID = userID;
client = SunflowClientFactory.newSunflowClient();
client.connect(BIZ_ID, userID);
wf = new CiticWF(client);
}
场景二:创建、启动流程实例
通过流程定义名称创建流程实例,然后修改流程变量,最后启动流程实例
public Map<Long, List<WorkItemContext>> createAndStartProcess
(String proDefName, String proInsName, String desc, Map<String, Object> params) throws Exception {
return wf.createAndStartProcess(proDefName, proInsName, desc, params);
}
场景三:查看流程轨迹
场景二得到流程实例id,根据流程实例id查看流程的运行轨迹,查看工作项列表
public List<WorkItemContext> listWorkitemsByProInsID(long proInsID) throws SunflowException {
System.out.println("listWorkitemsByProInsID...");
List<WorkItemContext> workitemS = client.listWorkItemsLowCost("wki_priid=" + proInsID +
" order by wki_createTime");
printWorkitems(workitemS);
return workitemS;
}
private void printWorkitems(List<WorkItemContext> workitemS) {
for (WorkItemContext w : workitemS) {
System.out.println("procInsID=" + w.getProInstanceID()
+ ", workitemID=" + w.getWorkItemID()
+ ", workitemName=" + w.getWorkItemName()
+ ",\t State=" + w.getWorkItemState()
+ ", checkOutTime=" + w.getWorkItemCheckedOutTime()
+ ", checkInTime=" + w.getWorkItemCheckedInTime()
+ ", prdName=" + w.getProDefinitionName()
+ ", executor=" + w.getExecutorUserInfo());
}
}
场景四:查看工作项待办人
场景三中选出状态为2的工作项,根据工作项id查看待办人情况——代码如下:
public List<UserInfo> getApplyman(long workitemID) throws SunflowException {
List<UserInfo> applyman = client.getApplyExecutor(workitemID);
System.out.println("applyman=" + applyman);
return applyman;
}
场景五:查看当前用户的待办列表
某个操作员应该先查看属于自己的待办任务列表
public List<WorkItemContext> queryWaitingTaskList(int begin, int pageSize) throws SunflowException {
String orderBy = "order by wki_createTime";
List<WorkItemContext> workitemS = CiticWF.listWaitingTasksByRoleAndUser(orgID, userID, orderBy, begin, pageSize);
return workitemS;
}
场景六:申请待办工作项
根据工作项id申请到手一个待办项,代码如下:
public void applyWorkitem(long workitemID)
throws SunflowException {
client.applyWorkitemByOrg(orgID, workitemID);
}
场景七:查看已经被自己申请到的工作项
查看自己申请到的工作项列表,代码如下:
public List<WorkItemContext> queryAppliedTaskList() throws SunflowException {
String filter = "wki_state=4 and wki_bizid="+BIZ_ID+" and wki_user='"+userID+"' and wki_appid=" + APP_ID;
List<WorkItemContext> workitemS = client.listWorkItemsLowCost(filter, 0, 10);
// 打印
printWorkitems(workitemS);
return workitemS;
}
场景八:修改流程变量、提交工作项
提交工作项,封装了修改流程实例变量、提交工作项两步,流程实例id和工作项id都放到map里传递过来——代码如下:
public List<WorkItemContext> checkInWorkitemWithProcVar(long proInsId, Long workitemID, Map<String, Object> params) throws Exception {
wf.checkInWorkitemWithProcVar(proInsId, workitemID, params);
List<WorkItemContext> nextWkiList = client.checkInWorkItem(workitemID);
return nextWkiList;
}
场景九:查看结束的工作项列表
需注意:
结束工作项查询必须限制checkIn时间段为不大于一周——代码如下:
public List<WorkItemContext> queryCompletedTaskList(int begin, int pageSize) throws SunflowException {
// 结束工作项查询必须限制checkIn时间区间段为不大于一周
String filter = "wki_state=6 and wki_bizid="+BIZ_ID
+" and wki_user='"+userID+"' and wki_appid=" + APP_ID
+" and wki_checkInTime between TIMESTAMP('2014-09-09 00:00:00')" +
" and TIMESTAMP('2014-09-16 00:00:00')";
List<WorkItemContext> workitemS = client.listWorkItemsLowCost(filter, begin, pageSize);
// 打印
printWorkitems(workitemS);
return workitemS;
}
场景十:废弃后续工作项
工作项a刚刚被checkIn提交,后续工作项b未被apply时将处于待办状态,此时可以废弃掉b工作项,同时a工作项将被重新激活,注意,参数为a的工作项id:
public void discardSuccessorWorkitem(long workitemID) throws SunflowException {
client.discardSuccessorWorkItems(workitemID);
}
场景十一:终止流程实例
流程实例没有必要继续流转下去,为防止其干扰正常任务的查询、办理,可以调用下面的接口对流程实例进行终止:
public void terminateProInstance(long priID) throws Exception {
client.terminateProcessInstance(priID);
}
场景十二:修改工作项执行人
工作项任务被人申领后,申领人即为当前工作项的唯一执行人,此时如有需要修改该执行人为其他人,则可参考下面代码:
public void modifyExecutor(long workitemID, String userid) throws Exception {
WMTWflParticipant newExecutor = new WMTWflParticipant();
newExecutor.setBizID(BIZ_ID);
newExecutor.setParticipantID(userid);
client.modifyWorkItemExecutor(workitemID, newExecutor);
}