在上一篇中介绍了采用业务存储模式一的方式在流程中绑定业务;接下来该篇将记录实战中我是如何控制在流程运作的时候更新业务的
创建CustomBusinessService接口
为了能够在一个Controller中映射所有的流程请求,需要创建一个属于所有业务的公共服务接口CustomBusinessService, 在处理所有业务的CURD时,采用接口泛型的方式,统一由父类CustomBusinessService处理;
public interface CustomBusinessService {
//启动流程的时候在业务表里插入数据,variables是申请表单的值;
public Map<String,Object> startBusiness(Map<String,Object> variables);
//用于更新业务表;
public Map<String,Object> updateBusiness(Map<String,Object> variables);
//从业务表中获取任务表单的一些默认值;
public Map<String, Object> getTaskForm(String businessKey);
//获取重新申请的任务表单默认值;
public Map<String, Object> getFormProperties(String businessKey);
}
然后在创建相应业务的Service时,让其继承CustomBusinessService接口;
public interface RPBusinessService extends CustomBusinessService{
//插入业务;
int insert(RPBusiness RPBusiness);
//根据用户Id查询相关业务列表
List<RPBusiness> findByUserId(String employeeNo);
//更新业务
int update(RPBusiness bs);
//由业务Id获取业务实体
RPBusiness findById(int id);
//删除业务
int delete(int id);
}
其中RPBusiness类是一个业务实体Entity,它与业务表一一对应;
建立流程定义Key与业务Service的关系
在构建流程模型的时候,我们需要根据规则(自己定义的)来给定流程的Key值(方便在代码中获取Key值),然后通过配置表配置Key对应的Service,并创建对应的业务服务配置实体;
/**
*业务服务配置实体
*/
public class BusinessServiceConfig implements Serializable{
private static final long serialVersionUID = 1941666300038602903L;
//流程定义的Key
private String processDefinitionKey;
//业务的Service名称
private String serviceName;
public String getProcessDefinitionKey() {
return processDefinitionKey;
}
public void setProcessDefinitionKey(String processDefinitionKey) {
this.processDefinitionKey = processDefinitionKey;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}
泛化业务处理
举个例子:如图,在业务申请填写好后,单击触发“申请”按钮,请求将映射到后台服务器中的Controller进行方法处理,并更新业务;
//从业务配置服务中获取流程定义Key对应的BusinessService名称(这里对应的是RPBusinessService)
String customBean=businessServiceConfigService.getBusinessServiceConfigByKey(processDefinitionKey).getServiceName();
if(customBean !=null) {
//从Spring容器的上下文中获取对应的Bean
CustomBusinessService customService=(CustomBusinessService)applicationContext.getBean(customBean);
//variable中包含着表单中需要更新的键值对
//如上面表单中的开始时间、类型、奖惩类型、理由分别都对应着业务表的相应列
variables=customService.startBusiness(variables);
}
总结
该篇包括以下要点:
- 采用接口泛型,保证所有业务都继承同一父类接口;
- 在配置表中记录流程Key和业务Service的对应关系;
(注:更多有关activiti的项目开发内容请等下次更新,欢迎点评,共同进步哦!)