OA项目的审批流转模块实现

这个模块分了三个小模块逐步实现模块功能,分别是流程与表单管理/执行流程/查询

复习一下JBPM,工作流动包括:部署,启动,查询,执行(开始,结束),Signal

1.流程定义  
ProcessDefinition pd = ProcessDefinition.parseXmlResource("helloworld/processdefinition.xml");
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance("/jbpm.cfg.xml");
        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); // 创建Session,开始事务
        try {
        
            jbpmContext.deployProcessDefinition(pd);
        } catch (RuntimeException e) {
            jbpmContext.setRollbackOnly();
            throw e;
        } finally {
            jbpmContext.close(); // 提交/回滚 事务,关闭Session
        }

2.对于这个模块的要求  
1)方便的 定义/修改 与 管理 流程
2)方便的 定义/修改 与 管理 表单模板
3)执行审批流转(让表单(数据)按指定的流程进行流转,并且记录)
4)方便的查询所有的 表单实例 记录(查询流转过的表单)

3.分页  
先设计一个对象,其中包括这些属性.
//是直接传给对象的
private int currentPage; // 当前页
private int pageSize; // 页面大小(每页显示的数量)
// 查询数据库得来的
private int recordCount; // 总记录数
private List recordList; // 本页的数据列表
// 通过自己计算就能得来
private int totalPage; // 总页码
private int startPageIndex; // 页码列表的开始索引
private int endPageIndex; // 页码列表的结束索引

4.总页数的计算.  
分页在实现类中的数据准备过程要注意的事项
总数量对数据库的查询,用到了number
1)FROM 后跟的是 entity-name
2)entity-name是的属性。默认为类的全限定名
3)在有auto-import属性,配置在HQL中是否可以使用简单名称。
   默认为true。什么时候用false?
   在有多个类是同一个简单名称时,只能有一个为true。
    
其中需要查询数据库的操作实现

int count = ((Number) getSession().createQuery(//
        "SELECT COUNT(pd) FROM org.jbpm.graph.def.ProcessDefinition pd")//
        .uniqueResult())//
        .intValue();

int firstResult = PageView.calcFirstResult(pageNum, pageSize);
List list = getSession().createQuery(//
        "FROM org.jbpm.graph.def.ProcessDefinition pd")//
        .setFirstResult(firstResult)//
        .setMaxResults(pageSize)//
        .list();
在Action类中,直接向页面返回这个对象就行了.

5.审批流程管理  
在实现一个功能之前,要先分析需求,再分析出需要的实体,最后才能编码实现.
不要一上来就急着编码,这样很难成功实现.

流程定义在JBPM中是 ProcessDefinition
JBPM所有的实体都要用它自己的API来操作.我们不能用自己的Session来操作JBPM.

部署新的审批流程:
这里我们用struts的直接上传流程的.zip文件.

6.struts的文件上传  
1)HTML



在HTML中,别忘了声明enctype="multipart/form-data"
2)ActionForm
ProcessDefinitionActionForm actionForm = (ProcessDefinitionActionForm) form;

        try {
            ZipInputStream zipInputStream = new ZipInputStream(actionForm.getParResource().getInputStream());
            ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zipInputStream);
            processDefinitionService.deploy(pd);
        } catch (RuntimeException e) {
            ActionErrors errors = new ActionErrors();
            errors.add("deploy", new ActionMessage("请提供正确的流程定义文档(.zip)", false));
            saveErrors(request, errors);
            return mapping.findForward("deployUI");
        }
我们一定不能忘记判断上传的文件是否为.zip文件

7.查询流程定义文件Action 类的实现  
Long id = Long.parseLong(request.getParameter("id"));
        ProcessDefinition pd = processDefinitionService.getById(id);
        byte[] content = pd.getFileDefinition().getBytes("processdefinition.xml");

        response.setContentType("text/xml;charset=utf-8");
        response.getOutputStream().write(content);
        return null;
查询流程图片(processimage.jpg)
Long id = Long.parseLong(request.getParameter("id"));
        ProcessDefinition pd = processDefinitionService.getById(id);
        byte[] content = pd.getFileDefinition().getBytes("processimage.jpg");

        response.setContentType("image/jpeg");
        response.getOutputStream().write(content);
        return null;

这查看上传的流程文件和流程文件时,我们使用了一个打开小窗口 window.open()

你可能感兴趣的:(OA项目的审批流转模块实现)