JBPM4.4学习笔记-3

      欢迎转载,转载请注明出处,谢谢

       这一篇博客接着以前的JBPM写,很不好意思,中间间隔了那么久,实在是有的忙了,或许我自己太懒了,见谅,哈哈.....

      之前两篇简单讲了下JBPM的环境搭建,由于前段时间项目也用到了JBPM,所以今天我们回顾一下JBPM与业务系统的用户,权限集成的问题。

       首先,我们要搞明白为什么把JBPM的用户体系集成到自己的业务系统,也就是抛弃JBPM自己的用户体系,稍有研究的同学肯定也小得JBPM自带的用户权限太简单了,就只有三张表,而且字段也过于简单。

       在集成之前我们先回顾下JBPM自己的用户体系,它一共有三张表,jbpm4_id_user,jbpm4_id_group,jbpm4_id_membership,也就是用户表,组表,用户与组关系表,那么想要集成,在我们业务系统里面肯定得有与这三张表类似的表,用户表业务系统肯定有(你懂的),组这个表业务系统不一定有,但是考虑到业务系统一般都有角色表,那么我们是不是可以把角色当作组,答案是肯定的,我接下来要讲的也就是这样子的,组与用户的关系表就不说了,有角色表的话,关系也肯定有。

      表的问题解决了,我们要做的第一步就是让我们业务系统的User实体实现JBPM的User接口:

/**
 *用户实体表
 *已实现org.jbpm.api.identity.User接口,与JBPM公用用户对象
 */
@Entity
@Table(name = "T_USER")
public class User extends BaseEntity implements org.jbpm.api.identity.User {

 实现该接口后,由于org.jbpm.api.identity.User里有个方法

public String getId();

 一般来说我们的User实体id都是int型的,但是接口里的都是String型的,所以这个要做个转换

@Override
public String getId() {
     return id.toString();
}

 同时setId方法也要改一点点:

public void setId(String id) {
      this.id = NumberUtils.toInt(id);
}

 同时Role这个实体也要实现JBPM的Group接口:

/**
 *角色实体类
 *已实现org.jbpm.api.identity.Group接口,与JBPM公用用户组概念
 *@author LuoYu
 */
@Entity
@Table(name = "T_ROLE")
public class Role extends BaseEntity implements Group 

 Role里面的id问题与User一样,做一点点修改,这里不再赘述.

值得得注意的是:既然我们修改了JBPM用户,组的指向,那么之前JBPM自带的创建用户,组等方法肯定不好使,我们得重写这些方法,怎么重写?JBPM其实也提供了一个接口来做这个事情,IdentitySession。

我们需要创建一个类来实现该接口,下面的我系统里的相关代码:

/**
 * 自定义的JBPM,identitySession引擎
 * 继承JBPM的IdentitySession接口,以实现外挂配餐系统自己的用户系统
 * @author LuoYu
 */
@Service
@Component(value = "sessionService")
public class JbpmSessionEngine implements IdentitySession {

	@Autowired
	private IBaseDao baseDao;

	@Override
	public String createGroup(String groupName, String groupType, String groupParentId) {
		Role role = new Role();
		role.setRoleName(groupName);
		return (String) this.baseDao.save(role);
	}

	public void createMembership(String userId,String groupId){
		UserRole userRole = new UserRole();
		com.tlj.pcxt.entity.admin.User user =  new com.tlj.pcxt.entity.admin.User();
		user.setId(userId);
		userRole.setUser(user);
		Role role = new Role();
		role.setId(groupId);
		this.baseDao.save(userRole);
	}

	@Override
	public void deleteGroup(String groupId) {

	}

	@Override
	public void deleteMembership(String userId, String groupId, String role) {

	}

	@Override
	public Group findGroupById(String groupId) {
		return (Group) this.baseDao.getObjectByID(Role.class, NumberUtils.toInt(groupId));
	}

	/**
	 * 通过userId查询所在的用户组
	 *@author LuoYu
	 *@date 2013-4-25
	 *@param arg
	 *@return String
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Group> findGroupsByUser(String userId) {
		String hql = "select o.role from UserRole o where o.user.id = "+NumberUtils.toInt(userId);
		return (List<Group>) this.baseDao.getObjectList(hql);
	}


	@Override
	public User findUserById(String userId) {
		Object obj = this.baseDao.getObjectByID(com.tlj.pcxt.entity.admin.User.class, NumberUtils.toInt(userId));
		if(obj!=null){
			return (User)obj;
		}
		return new UserImpl();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<User> findUsers() {
		return (List<User>)this.baseDao.getAllObjects(com.tlj.pcxt.entity.admin.User.class);
	}

	public com.tlj.pcxt.entity.admin.User getUserById(String userId){
		return (com.tlj.pcxt.entity.admin.User) this.baseDao.getObjectByID(com.tlj.pcxt.entity.admin.User.class, Integer.parseInt(userId));
	}


	@Override
	public List<User> findUsersByGroup(String groupId) {
		return null;
	}

	/**
	 * 通过用户组id查询下属所有用户
	 *@author LuoYu
	 *@date 2013-4-25
	 *@param arg
	 *@return String
	 */
	@SuppressWarnings("unchecked")
	public List<com.tlj.pcxt.entity.admin.User> getUsersByGroup(String groupId){
		String hql = "select o.user from UserRole o where o.role.id="+NumberUtils.toInt(groupId);
		List<com.tlj.pcxt.entity.admin.User> list = (List<com.tlj.pcxt.entity.admin.User>) baseDao.getObjectList(hql);
		return list;
	}

	@SuppressWarnings("unchecked")
	public List<ProcessDefinitionInfo> getAllDeployDefinition(){
		List<ProcessDefinitionInfo> list = new ArrayList<ProcessDefinitionInfo>();
		String hql = "from ProcessDefinitionInfo o where o.isDelete=0";
		list = (List<ProcessDefinitionInfo>) this.baseDao.getObjectList(hql);
		return list;
	}

	public void saveProcessDefinitionInfo(ProcessDefinitionInfo processDefinitionInfo){
		this.baseDao.save(processDefinitionInfo);
	}

	@SuppressWarnings("unchecked")
	public ListVo<ProcessInfo> getAllProcessInstance(Map<String, Object> paramMap){
		ListVo<ProcessInfo> listVo = new ListVo<ProcessInfo>();
		List<ProcessInfo> list = new ArrayList<ProcessInfo>();
		StringBuffer hqlList = new StringBuffer();
		StringBuffer hqlCount = new StringBuffer();

		Map<Object, Object> map = new HashMap<Object, Object>();
		int start = NumberUtils.toInt((String) paramMap.get("start"));
		int limit = NumberUtils.toInt((String) paramMap.get("limit"));
		String status = (String) paramMap.get("status");

		hqlList.append("select w from ProcessInfo w where w.isDelete=0 ");
		hqlCount.append("select count(w.id) from ProcessInfo w where w.isDelete=0 ");

		if(!StringUtils.isBlank(status)){
			hqlList.append("and w.status = :status ");
			hqlCount.append("and w.status = :status ");
			map.put("status", status);
		}

		hqlList.append("order by w.status asc,w.createDate desc");
		list = (List<ProcessInfo>) this.baseDao.findPageByQuery(start, limit, hqlList.toString(), map);
		int count = this.baseDao.getTotalCount(hqlCount.toString(), map);
		listVo.setList(list);
		listVo.setTotalSize(count);
		return listVo;
	}

	public void deleteDefinition(String ids) {
		this.baseDao.delete(ProcessDefinitionInfo.class, ids);
	}

	@SuppressWarnings("unchecked")
	public String getDefinitionIdByObjectName(String name){
		String sql = "select j.DEPLOYMENT_ from jbpm4_deployprop j where j.OBJNAME_ = '"+name+"' and j.KEY_ = 'pdid'";
		List<Object> list = (List<Object>) this.baseDao.getObjectsByNativeSql(sql);
		if(list!=null){
			return list.get(0).toString();
		}
		return null;
	}

	public IBaseDao getBaseDao() {
		return baseDao;
	}

	public void setBaseDao(IBaseDao baseDao) {
		this.baseDao = baseDao;
	}

	@Override
	public String createUser(String s, String s1, String s2, String s3) {
		return null;
	}

	@Override
	public List<User> findUsersById(String... as) {
		return null;
	}

	@Override
	public void deleteUser(String s) {

	}

	@Override
	public List<Group> findGroupsByUserAndGroupType(String s, String s1) {
		return null;
	}

	@Override
	public void createMembership(String s, String s1, String s2) {

	}

}

 这里面需要实现的方法很多,自己斟酌,重写你需要用到的方法即可。

这些步骤完成之后,再回家最初的配置,找到jbpm.cfg.xml,在里面添加如下代码,用来指向我们刚刚创建的类

<transaction-context>
	<hibernate-session current="true" />
	<Object class="com.tlj.pcxt.service.jbpm.identity.JbpmSessionEngine" />
</transaction-context>

 完成这一步,基本上就属于万事具备,只欠东风了

在我们需要用到jbpm的地方,注入我们刚刚创建的service,任务JBPM操作都通过我们刚刚创建的类提供的方法来完成!

好了,以上就是把JBPM的用户体系集成自己业务系统的所有过程,,欢迎拍砖!

猜你喜欢

转载自luoyu-ds.iteye.com/blog/1926004