UFLO是一套基于JAVA的流程引擎,它即可以用在基于J2EE的B/S系统之上,也可以用于基于J2EE的C/S系统之中。所以UFLO在设计之初就不与任何UI表现层绑定,它所要做的就是提供一系列的可供外部调用的API接口,对于我们的业务系统而言,可以调用UFLO中提供的API,实现业务流程的开启、任务的开始与完成等操作。

       我们知道,UFLO中有三个子项目,分别是uflo-core、uflo-console与uflo-client。uflo-core提供了流程运行的核心环境,负责整个流程生命周期的管理工作;uflo-console则是一个基于dorado7表现层的分支项目,这个项目中提供了B/S项目中基于dorado7的流程模版控制与测试中心、提供了用户待办页面及节假日配置等流程引擎运行的辅助模块;最后一个uflo-client则是提供给我们的程序员使用的,通过调用uflo-client模块中的ProcessClient与其中的TaskClient就可实现在我们的业务系统与流程引擎的交互。

       前面提到,UFLO的使用支持嵌入式与独立服务两种方式,但对于我们程序员来说,它只需要使用uflo-client模块中的ProcessClient与其中的TaskClient与我们的业务系统交互即可,究竟项目做好之后,采用哪种部署方式,我们的uflo-client模块中的ProcessClient与其中的TaskClient都可以通过设置一个外部属性实现自由转换,这个属性就是uflo.restAccessBaseUrl,该属性值的作用就是指定独立部署的远程uflo server的地址。默认该属性值为空,那么我们的引擎就会认为我们采用的是嵌入式模式,所以它会通过访问我们项目内部配置的数据源实现与流程引擎数据库的互动;一旦我们定义了该属性的值,那么UFLO引擎就知道我们采用的是独立服务模式,它会通过该属性定义的URL值来访问远程的uflo server,实现本地业务逻辑与远程流程引擎的交互。

       uflo-client模块中的ProcessClient与其中的TaskClient都是配置在Spring当中,如果需要调用它们,那么对于ProcessClient我们只需要获取名为"uflo.processClient"的bean即可,对于TaskClient它在Spring中配置的bean的id为“uflo.taskClient”。

       ProcessClient对于我们程序员来说,主要是实现业务流程的开启、流程模版与实例的删除、流程模版与变量的获取等操作;而TaskClient则提供了大量针对人工任务的操作,该接口的源码如下:

package com.bstek.uflo.client.service;
import java.util.List;
import java.util.Map;
import com.bstek.uflo.command.impl.jump.JumpNode;
import com.bstek.uflo.model.task.Task;
import com.bstek.uflo.model.task.TaskAppointor;
import com.bstek.uflo.model.task.TaskParticipator;
import com.bstek.uflo.model.task.reminder.TaskReminder;
import com.bstek.uflo.query.TaskQuery;
import com.bstek.uflo.service.TaskOpinion;
/**
 * @author Jacky.gao
 * @since 2013年9月22日
 */
public interface TaskClient {
	public static final String BEAN_ID="uflo.taskClient";
	
	/**
	 * 向现有的会签任务中再添加一个新的会签任务
	 * @param taskId 参考的任务ID
	 * @param username 新的任务的处理人
	 * @return 返回加签产生的新的任务对象
	 */
	Task addCountersign(long taskId,String username);
	
	/**
	 * 删除一个会签任务
	 * @param taskId 要删除的会签任务的ID
	 */
	void deleteCountersign(long taskId);
	/**
	 * 完成指定ID的任务,回退到指定的目标节点,同时设置回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 * @param variables 变量集合
	 * @param opinion 任务处理意见
	 */
	void rollback(long taskId,String targetNodeName,Map<String,Object> variables,TaskOpinion opinion);
	
	/**
	 * 完成指定ID的任务,回退到指定的目标节点,同时设置回写到流程实例中的变量集合
	 * @param task 任务对象
	 * @param targetNodeName 指定的目标节点名称
	 * @param variables 变量集合
	 * @param opinion 任务处理意见
	 */
	void rollback(Task task,String targetNodeName,Map<String,Object> variables,TaskOpinion opinion);
	
	/**
	 * 完成指定ID的任务,回退到指定的目标节点,同时设置回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 * @param variables 变量集合
	 */
	void rollback(long taskId,String targetNodeName,Map<String,Object> variables);
	
	/**
	 * 完成指定ID的任务,回退到指定的目标节点
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 * @param variables 变量集合
	 */
	void rollback(long taskId,String targetNodeName);
	
	/**
	 * 获取当前任务可以跳转的任务节点名称
	 * @param taskId 任务ID
	 * @return 可跳转的目标任务节点集合
	 */
	List<JumpNode> getAvaliableForwardTaskNodes(long taskId);
	
	/**
	 * 获取指定任务ID对应的可回退的目标任务节点名列表
	 * @param taskId 要回退的任务ID
	 * @return 返回可回退的目标任务节点名列表
	 */
	List<JumpNode> getAvaliableRollbackTaskNodes(long taskId);
	
	/**
	 * 批量完成指定ID的任务,并写入指定的流程变量
	 * @param taskIds 要完成的任务的ID集合
	 * @param variables 回写到要完成任务的变量集合
	 */
	void batchComplete(List<Long> taskIds,Map<String,Object> variables);
	
	/**
	 * 批量开始一批任务
	 * @param taskIds 要开始的任务的ID集合
	 */
	void batchStart(List<Long> taskIds);
	
	/**
	 * 批量开始并完成一批指定的任务,并可写入指定的流程变量
	 * @param taskIds 要完成的任务的ID集合
	 * @param variables 要回写的流程变量
	 */
	void batchStartAndComplete(List<Long> taskIds,Map<String,Object> variables);
	
	/**
	 * 完成指定ID的任务,同时设置下一步流向名称
	 * @param taskId 要完成的任务ID
	 * @param flowName 下一步流向名称
	 */
	void complete(long taskId, String flowName);
	
	/**
	 * 批量完成指定ID的任务,并写入指定的流程变量
	 * @param taskIds 要完成的任务的ID集合
	 * @param variables 回写到要完成任务的变量集合
	 * @param opinion 任务处理意见
	 */
	void batchComplete(List<Long> taskIds,Map<String,Object> variables,TaskOpinion opinion);

	/**
	 * 批量开始并完成一批指定的任务,并可写入指定的流程变量
	 * @param taskIds 要完成的任务的ID集合
	 * @param variables 要回写的流程变量
	 * @param opinion 任务处理意见
	 */
	void batchStartAndComplete(List<Long> taskIds,Map<String,Object> variables,TaskOpinion opinion);
	/**
	 * 完成指定ID的任务,同时设置下一步流向名称
	 * @param taskId 要完成的任务ID
	 * @param flowName 下一步流向名称
	 * @param opinion 任务处理意见
	 */
	void complete(long taskId, String flowName,TaskOpinion opinion);
	
	/**
	 * 完成指定ID的任务,同时设置下一步流向名称及回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param flowName 下一步流向名称
	 * @param variables 回写的变量集合
	 * @param opinion 任务处理意见
	 */
	void complete(long taskId, String flowName,Map<String,Object> variables,TaskOpinion opinion);
	
	
	/**
	 * 完成指定ID的任务
	 * @param taskId 要完成的任务ID
	 * @param opinion 任务处理意见
	 */
	void complete(long taskId,TaskOpinion opinion);
	
	/**
	 * 完成指定ID的任务,同时设置回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param variables 变量集合
	 * @param opinion 任务处理意见
	 */
	void complete(long taskId,Map<String,Object> variables,TaskOpinion opinion);
	
	/**
	 * 完成指定ID的任务,同时设置下一步流向名称及回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param flowName 下一步流向名称
	 * @param variables 回写的变量集合
	 */
	void complete(long taskId, String flowName,Map<String,Object> variables);
	
	/**
	 * 完成指定ID的任务
	 * @param taskId 要完成的任务ID
	 */
	void complete(long taskId);
	
	/**
	 * 完成指定ID的任务,同时设置回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param variables 变量集合
	 */
	void complete(long taskId,Map<String,Object> variables);
	
	/**
	 * 完成指定ID的任务,跳转到指定的目标节点
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 */
	void forward(long taskId,String targetNodeName);
	
	/**
	 * 完成指定ID的任务,跳转到指定的目标节点
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 * @param opinion 任务处理意见
	 */
	void forward(long taskId,String targetNodeName,TaskOpinion opinion);
	
	
	/**
	 * 完成指定ID的任务,跳转到指定的目标节点,同时设置回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 * @param variables 变量集合
	 * @param opinion 任务处理意见
	 */
	void forward(long taskId,String targetNodeName,Map<String,Object> variables,TaskOpinion opinion);
	
	/**
	 * 完成指定ID的任务,跳转到指定的目标节点,同时设置回写到流程实例中的变量集合
	 * @param taskId 任务ID
	 * @param targetNodeName 指定的目标节点名称
	 * @param variables 变量集合
	 */
	void forward(long taskId,String targetNodeName,Map<String,Object> variables);
	
	/**
	 * 将指定ID的任务撤回到上一个任务节点,并填充变量
	 * @param taskId 任务的ID
	 * @param variables 变量集合
	 */
	void withdraw(long taskId,Map<String,Object> variables);
	
	/**
	 * 将指定ID的任务撤回到上一个任务节点
	 * @param taskId 任务的ID
	 */
	void withdraw(long taskId);
	
	/**
	 * 将指定ID的任务撤回到上一个任务节点
	 * @param taskId 任务的ID
	 * @param opinion 任务处理意见
	 */
	void withdraw(long taskId,TaskOpinion opinion);
	
	/**
	 * 将指定ID的任务撤回到上一个任务节点,并填充变量
	 * @param taskId 任务的ID
	 * @param variables 变量集合
	 * @param opinion 任务处理意见
	 */
	void withdraw(long taskId,Map<String,Object> variables,TaskOpinion opinion);
	
	/**
	 * 判断当前任务是否可回退到上一任务节点
	 * @param taskId 任务的ID
	 * @return
	 */
	boolean canWithdraw(long taskId);
	
	/**
	 * 根据ID获取一个任务对象
	 * @param taskId 任务ID
	 * @return 返回任务对象
	 */
	Task getTask(long taskId);
	
	/**
	 * 认领一个任务
	 * @param taskId 要认领任务的ID
	 * @param username 认领任务的人的用户名
	 */
	void claim(long taskId, String username);
	/**
	 * 对认领后的任务进行释放,从而允许其它人认领
	 * @param taskId 要释放任务的ID
	 * @param username 任务的释放人
	 */
	void release(long taskId);
	/**
	 * 开始处理一个任务
	 * @param taskId 任务的ID
	 */
	void start(long taskId);
	/**
	 * 将一个任务挂起
	 * @param taskId 要挂起的任务的ID
	 * @param username 扶起任务的人的用户名
	 */
	void suspend(long taskId);
	/**
	 * 让处于挂起状态的任务恢复正常
	 * @param taskId 要操作的任务的ID
	 * @param username
	 */
	void resume(long taskId);
	
	/**
	 * 根据任务ID取得当前任务潜在处理人列表
	 * @param taskId 任务ID
	 * @return 处理人列表
	 */
	List<TaskParticipator> getTaskParticipators(long taskId);
	
	/**
	 * 获取指定流程实例下任务节点的通过指派的任务处理人信息
	 * @param taskNodeName 任务节点名称
	 * @param processInstanceId 流程实例ID
	 * @return TaskAppointor集合
	 */
	List<TaskAppointor> getTaskAppointors(String taskNodeName,long processInstanceId);
	/**
	 * 更改任务处理人
	 * @param taskId 任务ID
	 * @param username 新的处理人用户名
	 */
	void changeTaskAssignee(long taskId,String username);
	
	TaskQuery createTaskQuery();
	
	TaskReminder getTaskReminders(long taskId);
	
	void deleteTaskReminder(long taskReminderId);
	
	List<TaskReminder> getAllTaskReminders();
}