Skip to content

Instantly share code, notes, and snippets.

@anson0370
Created April 16, 2012 06:57
Show Gist options
  • Save anson0370/2396820 to your computer and use it in GitHub Desktop.
Save anson0370/2396820 to your computer and use it in GitHub Desktop.
PmcAccessor_interface
/**
* Project: pmc-api
*
* File Created at Apr 1, 2009
* $Id$
*
* Copyright 2009 Taobao.com Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Taobao Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Taobao.com.
*/
package com.taobao.pamirs.kongur.appclient.process;
import java.util.Map;
import com.taobao.pamirs.commons.dao.Query;
import com.taobao.pamirs.commons.dao.Result;
import com.taobao.pamirs.kongur.appclient.KongurException;
import com.taobao.pamirs.kongur.appclient.common.User;
import com.taobao.pamirs.kongur.model.ProcessInstance;
import com.taobao.pamirs.kongur.model.Variable;
/**
* 面向业务系统的流程实例相关访问入口
* <p>
* 该接口提供了发起、结束流程以及对流程进行查询的一系列方法
*
* @author jiale
*
*/
public interface ProcessAccessor {
public static final String SPRING_BEAN_NAME = "processAccessor";
/** 用于流程启动时向variables 里存返回值时的key */
public static final String PROCESS_START_RETURN_VARIABLES_MAP_KEY = "processId";
/**
* 依据流程模板名和参数来启动一个流程
* <p>
* 该方法根据流程模板名和bizApp找到对应的流程模板,并以该模板为依据启动一个流程
*
* @param key 流程模板名
* @param variables 启动流程时希望放入流程上下文的参数
* @param bizApp 流程模板对应的bizApp
* @param user 操作人
* @return 返回流程上下文<br>
* 需要注意的是,流程实例id是包含在返回的上下文中的,key为VariableKeys.CURRENT_PROCESS_INSTANCE_ID
*/
Map<String, Object> startBizProcess(String key, Map<String, Object> variables, String bizApp, User user)
throws KongurException;
/**
* 依据流程模板名和参数来启动一个流程
* <p>
* 该方法根据流程模板名和bizApp找到对应的流程模板,并以该模板为依据启动一个流程<br>
* 与{@link #startBizProcess(String, Map, String, User)}相比,
* 该方法还接收一个description参数,用来描述业务方自定义的流程实例的一些信息
*
* @param key 流程模板名
* @param variables 启动流程时希望放入流程上下文的参数
* @param bizApp 流程模板对应的bizApp
* @param user 操作人
* @param description 流程描述信息
* @return 返回流程上下文<br>
* 需要注意的是,流程实例id是包含在返回的上下文中的,key为VariableKeys.CURRENT_PROCESS_INSTANCE_ID
*/
Map<String, Object> startBizProcess(String key, Map<String, Object> variables, String bizApp, User user, String description)
throws KongurException;
/**
* 依据流程模板名和参数来启动一个流程
* <p>
* 该方法根据流程模板名和bizApp找到对应的流程模板,并以该模板为依据启动一个流程<br>
* 与{@link #startBizProcess(String, Map, String, User, String)}相比,
* 该方法还接收一个bizId参数,作为外部唯一标识来标识调用方的业务和流程的关联<br>
* 该bizId应该由调用方生成并保证在所使用的bizApp范围下惟一,如果bizId重复,创建流程实例会失败并抛出错误
*
* @param key 流程模板名
* @param variables 启动流程时希望放入流程上下文的参数
* @param bizApp 流程模板对应的bizApp
* @param user 操作人
* @param description 流程描述信息
* @param bizId 业务id 即外部惟一号 在bizApp中应该惟一
* @return 返回流程上下文<br>
* 需要注意的是,流程实例id是包含在返回的上下文中的,key为VariableKeys.CURRENT_PROCESS_INSTANCE_ID
*/
Map<String, Object> startBizProcess(String key, Map<String, Object> variables, String bizApp, User user, String description, String bizId)
throws KongurException;
/**
* 依据流程模板名和参数来启动一个流程
* <p>
* <b>
* 注意:该方法已经废弃,因为在测试时和发布后,对模板部署和获取方式的需求可能是不同的,
* 直接指定的做法会导致调用方代码中出现模板部署和获取方式的细节<br>
* 作为替代方案,应该使用PmcConfig.localProcess这个配置项为整个应用在不同的阶段指定不同的流程模板部署和获取方式<br>
* 同时使用{@link #startBizProcess(String, Map, String, User)}方法替代对此方法的调用
* </b>
* <p>
* 该方法根据流程模板名和bizApp找到对应的流程模板,并以该模板为依据启动一个流程<br>
* 与{@link #startBizProcess(String, Map, String, User)}相比,
* 该方法还接收一个localProcess参数,用来指定是从本地classpath中还是从数据库获取流程模板
*
* @param key 流程模板名
* @param variables 启动流程时希望放入流程上下文的参数
* @param bizApp 流程模板对应的bizApp
* @param user 操作人
* @param localProcess 是否使用本地classpath中的流程模板
* @return 返回流程上下文<br>
* 需要注意的是,流程实例id是包含在返回的上下文中的,key为VariableKeys.CURRENT_PROCESS_INSTANCE_ID
*/
@Deprecated
Map<String, Object> startBizProcess(String key, Map<String, Object> variables, String bizApp, User user,
boolean localProcess) throws KongurException;
/**
* 依据流程模板名和参数来启动一个流程
* <p>
* <b>
* 注意:该方法已经废弃,因为在测试时和发布后,对模板部署和获取方式的需求可能是不同的,
* 直接指定的做法会导致调用方代码中出现模板部署和获取方式的细节<br>
* 作为替代方案,应该使用PmcConfig.localProcess这个配置项为整个应用在不同的阶段指定不同的流程模板部署和获取方式<br>
* 同时使用{@link #startBizProcess(String, Map, String, User, String)}方法替代对此方法的调用
* </b>
* <p>
* 该方法根据流程模板名和bizApp找到对应的流程模板,并以该模板为依据启动一个流程<br>
* 与{@link #startBizProcess(String, Map, String, User, String)}相比,
* 该方法还接收一个localProcess参数,用来指定是从本地classpath中还是从数据库获取流程模板
*
* @param key 流程模板名
* @param variables 启动流程时希望放入流程上下文的参数
* @param bizApp 流程模板对应的bizApp
* @param user 操作人
* @param localProcess 是否使用本地classpath中的流程模板
* @param description 流程描述信息
* @return 返回流程上下文<br>
* 需要注意的是,流程实例id是包含在返回的上下文中的,key为VariableKeys.CURRENT_PROCESS_INSTANCE_ID
*/
@Deprecated
Map<String, Object> startBizProcess(String key, Map<String, Object> variables, String bizApp, User user,
boolean localProcess, String description) throws KongurException;
/**
* 依据流程模板名和参数来启动一个流程
* <p>
* <b>
* 注意:该方法已经废弃,因为在测试时和发布后,对模板部署和获取方式的需求可能是不同的,
* 直接指定的做法会导致调用方代码中出现模板部署和获取方式的细节<br>
* 作为替代方案,应该使用PmcConfig.localProcess这个配置项为整个应用在不同的阶段指定不同的流程模板部署和获取方式<br>
* 同时使用{@link #startBizProcess(String, Map, String, User, String, String)}方法替代对此方法的调用
* </b>
* <p>
* 该方法根据流程模板名和bizApp找到对应的流程模板,并以该模板为依据启动一个流程<br>
* 与{@link #startBizProcess(String, Map, String, User, String, String)}相比,
* 该方法还接收一个localProcess参数,用来指定是从本地classpath中还是从数据库获取流程模板
*
* @param key 流程模板名
* @param variables 启动流程时希望放入流程上下文的参数
* @param bizApp 流程模板对应的bizApp
* @param user 操作人
* @param localProcess 是否使用本地classpath中的流程模板
* @param description 流程描述信息
* @param bizId 业务id 即外部惟一号 在bizApp中应该惟一
* @return 返回流程上下文<br>
* 需要注意的是,流程实例id是包含在返回的上下文中的,key为VariableKeys.CURRENT_PROCESS_INSTANCE_ID
*/
@Deprecated
Map<String, Object> startBizProcess(String key, Map<String, Object> variables, String bizApp, User user,
boolean localProcess, String description, String bizId) throws KongurException;
/**
* 查询流程
* <p>
* 通过条件查询流程
*
* @param query 查询参数
* @return 查询结果
*/
Result<ProcessInstance> queryProcess(Query<ProcessInstance> query);
/**
* 按照流程实例ID获取流程实例
*
* @param processId 流程实例ID
* @return 流程实例
*/
ProcessInstance getProcessById(Long processId);
/**
* 按照流程的业务id获取流程实例
* <p>
* 业务id是由业务方生成的惟一标识,在bizApp应该是组合惟一的<br>
* 这种惟一性由业务方保证
*
* @param bizApp 所属应用
* @param bizId 业务id
* @return 流程实例
*/
ProcessInstance getProcessByBizId(String bizApp, String bizId);
/**
* 强制取消并结束流程
* <p>
* 流程会被直接结束,流程状态为canceled<br>
* 同时在结束前会对执行default=true的&lt;end-cancel /&gt;节点(如果有的话)中的start和end事件<br>
* 一般来说,只有当你的流程中并不存在&lt;end-cancel /&gt;节点时,才用此方法结束流程
*
* @param processId 流程实例id
* @param user 操作人
* @return 流程上下文
*
* @see #endProcessById(Long, User, String)
*/
Map<String, Object> endProcessById(Long processId, User user) throws KongurException;
/**
* 强制取消并结束流程
* <p>
* 流程会被直接结束,流程状态为canceled<br>
* 与{@link #endProcessById(Long, User)}不同的是,这个方法可以指定要结束到的节点<br>
* 通过传入指定的&lt;end-cancel /&gt;节点的name,流程会调用对应&lt;end-cancel /&gt;节点的start和end事件,并在此节点结束<br>
* 一般来说,当你的流程中存在&lt;end-cancel /&gt;节点时,应该用此方法以指定节点的方式结束流程
*
* @param processId 流程实例id
* @param user 操作人
* @param cancelNodeName 结束到的节点
* @return 流程上下文
*
* @see #endProcessById(Long, User)
*/
Map<String, Object> endProcessById(Long processId, User user, String cancelNodeName);
/**
* 通过流程变量搜索流程
* <p>
* 查找出流程中某一上下文变量的值为给定值的流程<br>
* 只支持基本类型,不包括浮点数
*
* @param query
* @return
*/
Result<ProcessInstance> searchProcessByVars(Query<Variable> query);
}
/**
* Project: pmc-api
*
* File Created at Apr 1, 2009
* $Id$
*
* Copyright 2009 Taobao.com Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Taobao Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Taobao.com.
*/
package com.taobao.pamirs.kongur.appclient.task;
import java.util.List;
import java.util.Map;
import com.taobao.pamirs.commons.dao.Query;
import com.taobao.pamirs.commons.dao.Result;
import com.taobao.pamirs.kongur.appclient.KongurException;
import com.taobao.pamirs.kongur.appclient.common.InvokeResult;
import com.taobao.pamirs.kongur.appclient.common.User;
import com.taobao.pamirs.kongur.model.HistTask;
import com.taobao.pamirs.kongur.model.ProcessInstance;
import com.taobao.pamirs.kongur.model.Task;
/**
* 面向业务系统的任务访问入口,屏蔽对第三方框架的依赖
* <p>
* 该接口提供了多个任务查询方法,另外还有完成、转交、申领等动作
*
* @author jiale
*
*/
public interface TaskAccessor {
public static final String SPRING_BEAN_NAME = "taskAccessor";
public static final int TIMEOUT_DAY = 0;
public static final int TIMEOUT_HOUR = 1;
public static final int TIMEOUT_MINUTE = 2;
/**
* 判断用户是否有权限处理给定的任务
* <p>
* 需注意的是,多用户任务在被申领后就只有申领人可通过校验
*
* @param task 任务
* @param currentUser 处理人
*/
public boolean hasTaskCompletePermission(Task task, User currentUser);
/**
* 完成一个任务
*
* @param taskId 任务Id
* @param outGoing 任务结束后的分支选择
* @param user 操作的用户
* @param memo 备注
* @return InvokeResult<Map<String, Object> 返回值包括是否成功,异常信息,以及流程上下文
*
* @see #completeTask(Long, String, User, String, Map)
*/
InvokeResult<Map<String, Object>> completeTask(Long taskId, String outGoing, User user, String memo)
throws KongurException;
/**
* 完成一个任务
* <p>
* 此接口与{@link #completeTask(Long, String, User, String)}相比可在完成任务的时候传入需要的上下文变量
*
* @param taskId 任务Id
* @param outGoing 任务结束后的分支选择
* @param user 操作的用户
* @param memo 备注
* @param context 上下文变量
* @return InvokeResult<Map<String, Object> 返回值包括是否成功,异常信息,以及流程上下文
*
* @see #completeTask(Long, String, User, String)
*/
InvokeResult<Map<String, Object>> completeTask(Long taskId, String outGoing, User user, String memo,
Map<String, Object> context) throws KongurException;
/**
* 未经权限判断处理任务,业务系统尽量不要使用此接口
*
* @param task 任务
* @param user 用户
* @param outGoing 分支选择
* @param memo 备注
* @return 返回上下文变量
*/
public Map<String, Object> innerCompleteTask(Task task, User user, String outGoing, String memo);
/**
* 当前所有人将任务转给指定用户
* <p>
* <b>
* 注意:该方法已经废弃,因为该方法不能返回转交动作成功与否的结果。同时该方法无法校验操作人是否是当前任务拥有者。<br>
* 该方法仍然提供正确的转交功能,但想要获取结果请使用{@link #assignTaskWithResult(Long, User, User, String)}
* </b>
*
* @param taskId 任务Id
* @param user 转给的用户
* @param memo 备注
*
* @see #assignTaskWithResult(Long, User, User, String)
*/
@Deprecated
void assignTask(Long taskId, User user, String memo) throws KongurException;
/**
* 当前所有人将任务转给指定用户
* <p>
* 每次转交都将使原任务失效同时创建一个新的任务<br>
* 只有当任务是单用户任务并且处于created或者taken状态的时候才允许转交
*
* @param taskId 任务Id
* @param currentUser 任务当前所属用户
* @param assignUser 转给的用户
* @param memo 备注
* @return 返回结果包括是否成功[isSuccess()]、提示信息[getInfo()]以及被转交的Task[getResultData()]
*/
InvokeResult<Task> assignTaskWithResult(Long taskId, User currentUser, User assignUser, String memo) throws KongurException;
/**
* 申领任务
* <p>
* <b>
* 注意:该方法已经废弃,因为该方法不能返回申领动作成功与否的结果。<br>
* 该方法仍然提供正确的申领功能,但想要获取结果请使用{@link #takeTaskWithResult(Long, User)}
* </b>
*
* @param taskId 任务id
* @param user 申领用户
* @throws KongurException
*
* @see #takeTaskWithResult(Long, User)
*/
@Deprecated
void takeTask(Long taskId, User user) throws KongurException;
/**
* 申领任务
* <p>
* 任务类型需要申领之后才能处理的,必须先申领再处理,减少任务处理并发的问题<br/>
* 不论是单人任务还是多人任务都可以申领<br/>
* 一旦任务被申领,多用户任务就会变成单用户任务,其余用户没有权限继续操作<br/>
* 此处任务类型需要申领的意思是在流程模板对应的task节点配置了taken='true'的属性<br/>
* 当任务被成功申领时,或者被已申领的人重复申领的时候,该方法会返回成功<br/>
* 当任务不存在、任务已被别人申领或者任务不属于可申领状态时该方法返回失败
* </p>
*
* @param taskId 任务id
* @param user 申领用户
* @return 返回结果包括是否成功[isSuccess()]、提示信息[getInfo()]以及被申领的Task[getResultData()]
* @throws KongurException
*
*/
InvokeResult<Task> takeTaskWithResult(Long taskId, User user) throws KongurException;
/**
* 将一个被申领的多用户任务撤销申领
* <p>
* <b>
* 注意:该方法已经废弃,因为该方法不能返回撤销申领动作成功与否的结果。<br>
* 该方法仍然提供正确的撤销申领功能,但想要获取结果请使用{@link #resetTakenTaskWithResult(Long, User)}
* </b>
*
* @param taskId 任务id
* @param user 操作用户
* @throws KongurException
*
* @see #resetTakenTaskWithResult(Long, User)
*/
void resetTakenTask(Long taskId, User user) throws KongurException;
/**
* 将一个被申领的多用户任务撤销申领
* <p>
* 撤销申领将使一个被申领任务变回多用户任务<br>
* 只有申领者有权限撤销被申领任务<br>
* 撤销后的任务仍然需要再次申领才能操作
*
* @param taskId 任务id
* @param user 操作用户
* @return 返回结果包括是否成功[isSuccess()]、提示信息[getInfo()]以及存放有被撤销的Task的collection[getDataList()]
* @throws KongurException
*
*/
Result<Task> resetTakenTaskWithResult(Long taskId, User user) throws KongurException;
/**
* 根据Id获取任务
*
* @param taskId 任务ID
* @return Task 任务
*/
Task getTask(Long taskId);
/**
* 根据Id获取历史任务
*
* @param taskId
* @return
*/
HistTask getHistTask(Long taskId);
/**
* 根据父任务Id获取子任务
* <p>
* 现在PMC暂时未实现父子任务,所以此接口无用
*
* @param parentId 父任务ID
* @return 子任务列表,只返回下一级,如果要拿所有的子任务,请自己递归
*/
Result<Task> getSubTask(Long parentId);
/**
* 查询任务
* <p>
* 通过条件查询任务<br>
* 需要注意的是,如果查询条件有userId,只能查询到单用户任务<br>
* 如果想在结果集中包含多用户任务,请使用{@link #queryTaskByUser(Query, Long)}
*
* @param taskQuery 查询条件
* @return 任务列表
*
* @see #queryTaskByUser(Query, Long)
*/
Result<Task> queryTask(Query<Task> taskQuery);
/**
* 查询任务,并包括子流程所属任务
* <p>
* 通过条件查询任务<br>
* 与queryTask所不同的是查询条件中应该包括processInstanceId<br>
* 返回结果中将包括该流程所属子流程及子子流程(递归)中符合条件的任务<br>
* 需要注意的是,如果查询条件有userId,只能查询到单用户任务<br>
* 如果想在结果集中包含多用户任务,请使用{@link #queryTaskByUserIncludeSubProcess(Query, Long)}
*
* @param taskQuery 查询条件
* @return 任务列表
*
* @see #queryTaskByUserIncludeSubProcess(Query, Long)
*/
Result<Task> queryTaskIncludeSubProcess(Query<Task> taskQuery);
/**
* 查询历史任务
* <p>
* 通过条件查询历史任务
*
* @param taskQuery 查询条件
* @return 任务结果
*/
Result<HistTask> queryHistTask(Query<HistTask> taskQuery);
/**
* 查询历史任务
* <p>
* 查询中会包含子流程的任务,只有在taskQuery中的queryObject.processInstanceId有值的情况下才有效
*
* @param taskQuery
* @return
*/
Result<HistTask> queryHistTaskInlcudeSubProcess(Query<HistTask> taskQuery);
/**
* 查询的任务包含多用户任务时使用此接口查询
* <p>
* 该接口使用时,taskQuery的userId无效<br>
* userId请通过单独参数传入<br>
* 通过此接口查询,单用户任务也是能够正确查询到的
*
* @param taskQuery 查询条件
* @param userId 用户id
* @return 查询结果
*/
Result<Task> queryTaskByUser(Query<Task> taskQuery, Long userId);
/**
* 查询的任务包含多用户任务,并且要在多个已知的流程实例内查询时使用此接口
* <p>
* 该接口使用时,taskQuery的userId和processInstanceId无效<br>
* userId和processInstanceId集合请通过单独参数传入<br>
* 通过此接口查询,单用户任务也是能够正确查询到的
*
* @param taskQuery
* @param userId
* @param ids
* @return
*/
Result<Task> queryTaskByUserAndProcessIds(Query<Task> taskQuery, Long userId, List<Long> ids);
/**
* 查询包含多用户任务,并包括子流程所属任务
* <p>
* 通过条件查询任务<br>
* 与queryTaskByUser所不同的是查询条件中应该包括processInstanceId<br>
* 返回结果中将包括该流程所属子流程及子子流程(递归)中符合条件的任务<br>
* 与queryTaskIncludeSubProcess接口不同的时该接口可正确查询到多用户任务<br>
* 因此该接口查询条件中的userId无效,请通过单独参数传入
*
* @param taskQuery 查询条件
* @param userId 用户id
* @return
*/
Result<Task> queryTaskByUserIncludeSubProcess(Query<Task> taskQuery, Long userId);
/**
* 根据任务Id获取流程实例
*
* @param taskId 任务id
* @return 流程实例
*/
ProcessInstance getProcessByTaskId(Long taskId);
/**
* 在多个已知的流程实例内查询任务
* <p>
* 该接口使用时,taskQuery的processInstanceId无效<br>
* processInstanceId集合请通过单独参数传入<br>
* 通过此接口查询,多用户任务不会包含在内<br>
* 如果需要查询多用户任务,请使用{@link #queryTaskByUserAndProcessIds(Query, Long, List)}
*
* @param taskQuery 查询条件
* @param processIds 流程实例id集
* @return
*
* @see #queryTaskByUserAndProcessIds(Query, Long, List)
*/
Result<Task> queryTaskByProcessIds(Query<Task> taskQuery,List<Long> processIds);
/**
* 从多个已知的流程实例内查询历史任务
* <p>
* 该接口使用时,taskQuery的processInstanceId无效<br>
* processInstanceId集合请通过单独参数传入
*
* @param taskQuery
* @param processIds
* @return
*/
Result<HistTask> queryHistTaskByProcessIds(Query<HistTask> taskQuery,List<Long> processIds);
/**
* 通过taskId修改该任务的超时时间(如果有的话)
* <p>
* 废弃,请使用{@link #addTaskTimeout(Long, int, int)}
*
* @param taskId 任务id
* @param timeOut 超时时间描述字串
*/
@Deprecated
void modifyTaskTimeout(Long taskId, String timeOut);
/**
* 通过taskId修改该任务的超时时间(如果有的话)
* <p>
* 为指定任务加上指定单位偏移量的超时时间,该方法不返回任何值,如果任务的超时动作不存在则NPE<br>
* 时间最多被减为0,不会被减为负数
*
* @param taskId 任务id
- * @param field 时间单位<br>
- * 包括{@link #TIMEOUT_DAY}, {@link #TIMEOUT_HOUR}, {@link #TIMEOUT_MINUTE}
* @param offset 偏移量
* @throws NullPointerException 如果任务并不存在超时动作
*/
void addTaskTimeout(Long taskId, int field, int offset);
/**
* 通过taskId获取该任务的超时剩余时间(如果有的话,当不存在超时动作的时候NPE)
* <p>
* 不存在超时设置时返回0
*
* @param taskId 任务id
* @return 超时剩余时间毫秒值
* @throws NullPointerException 如果任务并不存在超时动作
*/
Long getTaskRemainingTime(Long taskId);
/**
* 暂停或激活任务的超时完成处理
* <p>
* 暂停或激活一个任务的超时处理,不存在超时动作时NPE
*
* @param taskId 任务id
* @param active false为暂停 true为重新激活
* @return [!注意!]这里返回的并非操作是否成功,而是超时动作的原始状态,true为激活,false为暂停
* @throws NullPointerException 如果任务并不存在超时动作
*/
boolean activeTaskTimeout(Long taskId, boolean active);
/**
* 获取任务超时动作的状态
* <p>
* true为激活,false为暂停,不存在超时动作时NPE
*
* @param taskId 任务id
* @return true为激活,false为暂停
* @throws NullPointerException 如果任务并不存在超时动作
*/
boolean isTaskTimeoutRunning(Long taskId);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment