当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

ssh2+jbpm4.4 完整请假流程

发表于: 2010-09-05   作者:zwllxs   来源:转载   浏览:
摘要:    自从前些日子发布了如何整合JBPM4.4+ssh2后,有些朋友问我有没有一个完整一点的实例,我看过贩卖你的jbpm的教程,我就参考那个请假的实例把它改装成ssh2版的吧。顺便也加入了模拟不同的角色登陆后能接到不同的待办任务,我也不多啰嗦,在这里我贴出action代码, package com.zwl.action; import java.io.File;
   自从前些日子发布了如何整合JBPM4.4+ssh2后,有些朋友问我有没有一个完整一点的实例,我看过贩卖你的jbpm的教程,我就参考那个请假的实例把它改装成ssh2版的吧。顺便也加入了模拟不同的角色登陆后能接到不同的待办任务,我也不多啰嗦,在这里我贴出action代码,

package com.zwl.action;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipInputStream;

import javax.servlet.ServletOutputStream;

import org.apache.struts2.ServletActionContext;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.zwl.vo.ProcessVo;

public class JbpmAction extends ActionSupport
{
    
    private ProcessEngine processEngine;
    private RepositoryService repositoryService;
    private ExecutionService executionService;
    private TaskService taskService ;
    private String id;
    private List<ProcessDefinition> processDefinitionList;
    private List<ProcessInstance> processInstanceList;
    private List<Task> taskList;
    private ActivityCoordinates ac; 
    private ProcessVo processVo;
    private Map<String, Object> map;
    private String result;
    
    public void setId(String id)
    {
        this.id = id;
    }

    public String getId()
    {
        return id;
    }

  

    public ActivityCoordinates getAc()
    {
        return ac;
    }

    public List<ProcessInstance> getProcessInstanceList()
    {
        return processInstanceList;
    }

    public List<Task> getTaskList()
    {
        return taskList;
    }

    private void init()
    {
        repositoryService=processEngine.getRepositoryService();
        executionService=processEngine.getExecutionService();
        taskService=processEngine.getTaskService();
    }
    
    public List<ProcessDefinition> getProcessDefinitionList()
    {
        return processDefinitionList;
    }

    private String userName;
    
    public String getUserName()
    {
        return userName;
    }


    public void setUserName(String userName)
    {
        this.userName = userName;
    }


    @SuppressWarnings("unchecked")
    public String login()
    {
        Map map=ActionContext.getContext().getSession();
        map.put("user", userName);
        return SUCCESS;
    }
    
    /**
     * 加载首页
     * @return
     */
    public String loadIndexPage()
    {
        init();
        processDefinitionList=repositoryService.createProcessDefinitionQuery().list();
        processInstanceList=executionService.createProcessInstanceQuery().list();
        
        
        //这里模拟不同的角色登陆系统,会接到不同的待办任务
        String manager="zwllxs1,zwllxs2,zwllxs3,zwllxs4";
        String boss="zhangweilin,zhangweilin2,zhangweilin3,zhangweilin4";
        String roleName="";//要按此名去查找它所在的节点
        
        String name=getLoginedUserName();
        
        //经理登陆
        if(manager.contains(name))
        {
            roleName="manager";
        }
        //老板登陆
        else if(boss.contains(name))
        {
            roleName="boss";
        }
        //普通用户
        else
        {
            roleName=name;
        }
        
        System.out.println("roleName: "+roleName);
        taskList=taskService.findPersonalTasks(roleName);
        System.out.println("taskList: "+taskList);
        return SUCCESS;
    }
    
    /**
     * 部署
     * @return
     */
    public String deploy()
    {
        System.out.println("部署");
        init();
//        String did=repositoryService.createDeployment().addResourceFromClasspath("leave2.jpdl.xml").deploy();
        ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
        //发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
        String did=repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
        
        //使用zip方式
//        ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
//        //发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
//        String did=repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
    
        System.out.println("did: "+did);
        return SUCCESS;
    }
    
    /**
     * 启动
     * @return
     */
    @SuppressWarnings("unchecked")
    public String start()
    {
        init();
        Map map = new HashMap();
        //在启动任务时,等于就是一个用户要请假了,那么,此时,要把流程信息关联到此用户上,在开始的下一个节点(也就是第一个任务节点),是指派给。所以用户名要与其对应的变量关联起来
        map.put("owner", getLoginedUserName());
        System.out.println("id_: "+id);
        ProcessInstance processInstance=executionService.startProcessInstanceById(id, map);
        System.out.println("启动时processInstance: "+processInstance.getId());
        return SUCCESS;  
    }
    
    /**
     * 
     * @return
     */
    public String manager()
    {
        init();
        Task task = taskService.getTask(id);
        String taskId=task.getId();
        Set<String> strSet=new HashSet<String>();
        strSet.add("owner");
        strSet.add("day");
        strSet.add("reason");
        strSet.add("name");
//        taskService.getVariable(taskId, "owner");
        map=taskService.getVariables(taskId, strSet);
        System.out.println("map: "+map);
        return SUCCESS;
    }
    
    /**
     * 老板来了
     * @return
     */
    public String boss()
    {
        init();
        Task task = taskService.getTask(id);
        String taskId=task.getId();
        Set<String> strSet=new HashSet<String>();
        strSet.add("owner");
        strSet.add("day");
        strSet.add("reason");
        strSet.add("name");
        strSet.add("sex");
        strSet.add("age");
//        taskService.getVariable(taskId, "owner");
        map=taskService.getVariables(taskId, strSet);
        return SUCCESS;
    }
    
    /**
     * 老板处理
     * @return
     */
    public String submitBoss()
    {
        init();
        taskService.completeTask(id);
        return SUCCESS;
    }
    
    /**
     * 经理提交 
     * @return
     */
    public String submitManager()
    {
        init();
        taskService.completeTask(id, result);
        return SUCCESS;
    }
    
    /**
     * 移除
     * @return
     */
    public String remove()
    {
        init();
        repositoryService.deleteDeploymentCascade(id);
        return SUCCESS;
    }
    
    /**
     * 显示
     * @return
     */
    public String view()
    {
        init();
      //通过id查到流程实例
        ProcessInstance processInstance = executionService.findProcessInstanceById(id);
        Set<String> activityNames = processInstance.findActiveActivityNames();
        
        //Coordinates为相依衣物
        ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),activityNames.iterator().next());
        return SUCCESS;
    }
    
    /**
     * 显示图片
     * @throws IOException
     */
    public void pic() throws IOException
    {
        init();
        ProcessInstance processInstance = executionService.findProcessInstanceById(id);
        String processDefinitionId = processInstance.getProcessDefinitionId();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).uniqueResult();
        
        String path=ServletActionContext.getRequest().getRealPath("");
//        String filePath=path+"\\WEB-INF\\classes\\leave2.png";
        String filePath="leave2.png";
        System.out.println("filePath: "+filePath);
        File file=new File(filePath);
        System.out.println("存在么: "+file.exists());
        
        //此处不知道为什么还要特别的通过repositoryService和processDefinition.getDeploymentId()来显示此图片
        InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),filePath);
        System.out.println("inputStream2: "+inputStream);
        //InputStream inputStream =new FileInputStream(new File("D:/program/java/servers/apache-tomcat-5.5.23/webapps/jbpm2/WEB-INF/classes/leave.png"));
        byte[] b = new byte[1024];
        int len = -1; 
        ServletOutputStream sos=ServletActionContext.getResponse().getOutputStream();
        while ((len = inputStream.read(b, 0, 1024)) != -1)
        {
            sos.write(b, 0, len);
        }
        sos.close();
    }
    
    
    /**
     * 提交
     * @return
     */
    @SuppressWarnings("unchecked")
    public String submit()
    {
        init();
        Map map = new HashMap();
        //此day, 在xml文件中,有一个decision标签,里面有一个表达式:expr="#{day > 3 ? '老板审批' : '结束'}" 
        //即它与表达式中的day关联
        map.put("day", processVo.getDay());
        map.put("reason", processVo.getReason());
        map.put("name", "张伟林submit");
        //如果第二个参数为字符串,则是指定要向哪个方向完成,此是指定要向testhaha完成,并且如果线条上指定了文字,
        //就只能按着文字去指定方向,如果没有文字,才能用map,
        //也就是说,如果传递的参数为map,则流程会去寻找没定义名称的线条走,如果没找到。就抛出No unnamed transitions were found for the task 异常
        //taskService.completeTask(taskId, "testhaha");
        //如果第二个参数为map,则表示只是传递参数而已
        System.out.println("提交完毕");
        taskService.completeTask(processVo.getTaskId(), map);
        return SUCCESS;
    }
    
    public String getLoginedUserName()
    {
        return (String) ActionContext.getContext().getSession().get("user");
    }
    
    public void setProcessEngine(ProcessEngine processEngine)
    {
        this.processEngine = processEngine;
    }

    /**
     * 
     */
    private static final long serialVersionUID = 7726442371304781094L;

    public ProcessVo getProcessVo()
    {
        return processVo;
    }

    public void setProcessVo(ProcessVo processVo)
    {
        this.processVo = processVo;
    }

    public Map<String, Object> getMap()
    {
        return map;
    }

    public String getResult()
    {
        return result;
    }

    public void setResult(String result)
    {
        this.result = result;
    }
    
    
    

}


完整的可运行项目代码下载地址为: http://download.csdn.net/source/2671401


  很多朋友要求我把jar包也上传,jar包下载地址为:
http://download.csdn.net/source/3084268 


zwllxs@163.com


ssh2+jbpm4.4 完整请假流程

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问
1、流程图 2、流程配置文件 -------------------------------------------------------------------
这是简单的流程图 下面是配置文件: <?xml version="1.0" encoding="UTF-8"?> <process na
这一节的任务是学习如何设计一个请假流程,并将流程引擎放到web项目中集成,使用JSP达到在网页上管理
流程教程 1.新建流程 现在我们做个请假流程,提交申请单到部门领导 如果申请日期较长呢 需要总经理审
我使用WF4.0有很长一段时间了,但是对WF3.0和WF3.5自知甚少,对状态机也不甚了解。今天生鱼片前辈的
我使用WF4.0有很长一段时间了,但是对WF3.0和WF3.5自知甚少,对状态机也不甚了解。今天 生鱼片前辈
1.1 拦截器的作用。 参考答案: 拦截器适合封装一些共通处理,便于重复利用.例如请求参数给Action属
本次,我们在web项目的基础上,设计一个请假流程。申请--->经理审批---->老板审批----->通
实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-WinForm   参
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号