⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 documentmanagerimpl.java

📁 这是一个jbpm的高级应用,是一个oa工作流的系统,里面用到了spring,hibernate技术等.实为学习jbpm的好资料!
💻 JAVA
字号:
package com.bjsxt.oa.managers.impl;

import java.util.Date;
import java.util.List;

import com.bjsxt.oa.PagerModel;
import com.bjsxt.oa.managers.DocumentManager;
import com.bjsxt.oa.managers.SystemException;
import com.bjsxt.oa.managers.WorkflowManager;
import com.bjsxt.oa.model.ApproveInfo;
import com.bjsxt.oa.model.Document;
import com.bjsxt.oa.model.User;

public class DocumentManagerImpl extends AbstractManager implements
		DocumentManager {

	private WorkflowManager workflowManager;
	
	public void addDocument(Document document, int creator) {
		if(document.getWorkflow() == null){
			throw new SystemException("公文对应的流程不能为空!");
		}
		
		if(creator == 0){
			throw new SystemException("创建者不能为空!");
		}
		
		document.setCreator((User)getHibernateTemplate().load(User.class, creator));
		document.setCreateTime(new Date());
		document.setStatus(Document.STATUS_NEW);
		
		getHibernateTemplate().save(document);
		
		//根据公文标识,创建流程实例
		workflowManager.addProcessInstance(document.getId());
	}

	//记录审批信息
	public void addOrUpdateApproveInfo(int documentId, int approverId,
			String approveInfo) {
		ApproveInfo ai = findApproveInfo(documentId,approverId);
		if(ai == null){
			ai = new ApproveInfo();
			ai.setApproveDoc(
					(Document)getHibernateTemplate().load(Document.class, documentId)
					);
			ai.setApprover(
					(User)getHibernateTemplate().load(User.class, approverId)
					);
			ai.setApproveInfo(approveInfo);
			ai.setApproveTime(new Date());
			getHibernateTemplate().save(ai);
			return;
		}
		
		//能找到相关的对象,则直接更新即可
		ai.setApproveInfo(approveInfo);
		getHibernateTemplate().update(ai);
	}

	public void delDocument(int documentId) {
		
		//先删除工作流引擎中对应的流程实例
		workflowManager.delProcessInstance(documentId);
		
		//再删除公文对象
		getHibernateTemplate().delete(
				getHibernateTemplate().load(Document.class, documentId)
		);
		
	}

	/**
	 * 查找经过用户审批的记录(本方法主要用于打开审批界面的时候,如果用户已经审批,应该
	 * 加载其前一次审批的信息,以便用户能够修改其审批信息)
	 * 
	 * 即尚未提交的用户审批记录,只可能是0或1条记录
	 */
	public ApproveInfo findApproveInfo(int documentId, int approverId) {

		return (ApproveInfo)getSession()
			.createQuery(
				"select ai from ApproveInfo ai where " +
				"ai.approver.id = ? and ai.approveDoc.id = ? " +
				"and ai.submit = ? "
			)
			.setParameter(0, approverId)
			.setParameter(1, documentId)
			.setParameter(2, false)
			.uniqueResult();
		
	}
	
	//查看是否已有审批记录(而且已提交)
	private long findApproveInfoSize(int documentId,int approverId){
		return (Long)getSession()
		.createQuery(
			"select count(*) from ApproveInfo ai where " +
			"ai.approver.id = ? and ai.approveDoc.id = ? " +
			"and ai.submit = ? "
		)
		.setParameter(0, approverId)
		.setParameter(1, documentId)
		.setParameter(2, true)
		.uniqueResult();
	}

	//查找某个特定的文档
	public Document findDocument(int documentId) {
		return (Document)getHibernateTemplate().load(Document.class, documentId);
	}

	//查看某个文档的审批历史
	public List searchApproveHistory(int documentId) {
		return getHibernateTemplate().find("from ApproveInfo ai where ai.approveDoc.id = ?", documentId);
	}

	//我的公文列表
	public PagerModel searchMyDocuments(int userId) {
		return searchPaginated("select d from Document d where d.creator.id = ?", userId);
	}

	//经我审批的公文列表
	public PagerModel searchProcessedDocuments(int userId) {
		
		/**
		 * 1、必须是已经提交的审批记录
		 * 2、同一个文档,只需要列出一条记录即可
		 */
		return searchPaginated("select distinct ai.approveDoc from ApproveInfo ai where ai.submit = true and ai.approver.id = ?",userId);
	}

	//搜索正在等待审批的公文
	public List searchProcessingDocuments(int userId) {
		
		User user = (User)getHibernateTemplate().load(User.class, userId);
		
		List docIds = workflowManager.searchCurrentProcessInstances(user.getUsername());
		
		if(docIds == null || docIds.isEmpty()){
			return null;
		}
		
		return getSession()
			.createQuery("select d from Document d where d.id in (:ids)")
			.setParameterList("ids", docIds)
			.list();
	}

	/**
	 * 提交到流程
	 * 1、如果不是新创建的公文,而且尚未审批,则不能提交
	 * 2、如果已经提交,则不能重复提交
	 */
	public void submitToWorkflow(int documentId, int userId,String transitionName) {
		
		//首先看是否已有审批记录
		ApproveInfo info = findApproveInfo(documentId,userId);
		
		/**
		 * 没有未提交的审批记录,有两种可能:
		 * 1、已有审批记录,但是审批记录已经提交,这种情况下,需要抛出异常,因为不允许重复提交
		 * 2、尚未有任何审批记录,这种情况属于第一次提交到流程,这时候,不需要创建审批记录,
		 *    但需要更改公文的状态(即将状态更改为当前节点!即提交之后的节点名称,我们可以在
		 *    workflowManager中改变这个名称)
		 */
		if(info == null){
			//如果已有审批记录,即重复提交
			if(findApproveInfoSize(documentId, userId) > 0){
				throw new SystemException("文档已提交,您不能重复提交相同的文档");
			}
			
			
			Document document = (Document)getHibernateTemplate().load(Document.class, documentId);
			
			//没有审批记录,而且又不是第一次提交,则应该抛出异常
			if(!document.getStatus().equals(Document.STATUS_NEW)){
				throw new SystemException("您尚未审批,无法执行提交操作!");
			}
		}else{
			//改为已提交
			info.setSubmit(true);
			getHibernateTemplate().update(info);
		}
		
		//让流程流向下一步
		workflowManager.flowToNextStep(documentId, transitionName);
	}

	public void setWorkflowManager(WorkflowManager workflowManager) {
		this.workflowManager = workflowManager;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -