如何自己实现一个可自定义业务流程步骤的工作流中大型企业

/ / 2015-10-25
项目功能需求简述 由于业务需要,需要一个申请-审批的工作流,并且业务流程是不固定的,需要能灵活配置,比如现在是:开始-部门经理审批-结束,可能之后就会变为开始-部门...

项目功能需求简述
由于业务需要,需要一个申请-审批的工作流,并且业务流程是不固定的,需要能灵活配置,比如现在是:开始->部门经理审批->结束,可能之后就会变为开始->部门经理审批->部门领导审批->结束。因此不能把代码写死,必须做成高可配置的。
 
UML设计
 
 
项目设计说明
车辆申请项目
一个项目名称,也可以是其他的,比如请假项目,报销项目等都可以。主要就是提出申请时需要填写的表单信息。
 
任务列表
当用户填完申请项目之后,王任务列表中插入一条数据,记录所属项目、当前步骤、任务状态(审批中、任务结束)、使用的流程版本、下一步执行的人,整个任务重申请到结束都只是在更新当前步骤、任务状态(审批中、任务结束)、下一步执行的人这几个字段,其他的都不变。也就是一次申请就只会有一条任务。
 
历史任务
每一次申请、或者审批步骤都往里边插入一条数据,记录当前的审判者、步骤、创建时间等信息。一个申请项目中会有多条记录。
 
流程列表
流程的添加,供申请时选择所属流程,流程可设置启用或不启用状态。
 
流程步骤
比如申请车辆这个流程的所有步骤。省内用车:开始->步骤1:部门经理审批->结束;长途用车:开始->步骤1:部门经理审批->步骤2:部门领导审批->结束
 
步骤处理角色
每个步骤由哪个角色来处理。比如:步骤:部门经理审批——部门经理,步骤:部门领导审批——部门领导。
 
角色
系统角色,主要做权限控制。
 
企业员工
系统用户。
 
车辆管理
企业的所有车辆。
 
初始化数据
角色
 
 
用户
 
 
车辆
 
 
步骤处理角色
 
 
流程
 
 
流程步骤
 
项目流程说明演示
这里演示一个开始->部门经理审批->部门领导审批->结束的流程
提出申请
先填写好信息,再点击确定申请,则开始申请,并往历史流程和任务列表插入一条数据
 
 
点击申请 
 
插入两条数据 
 
 
 
自己项目中的代码为:
 
 
    /**
     * 选泽下一步审批人
     */
    @RequestMapping(value="/submitApply")
    public ModelAndView submitApply() throws Exception{
        logBefore(logger, "提交Apply");
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        String APPLY_ID=pd.getString("APPLY_ID");//项目ID
 
        //根据项目ID查询项目基本信息 -> 找出这个项目使用的流程 -> 查看这个流程的第一步是那哪角色审批
        //-> 查询用户中是这个角色的所有用户供选择
        pd.put("nowCount","1");
        List<User> userList=userService.listAllUserByApply(pd);
 
 
        mv.setViewName("information/apply/tasklist_chooseUser");
        mv.addObject("msg","submitApplyresult");
        mv.addObject("pd", pd);
        mv.addObject("userList",userList);
        return mv;
    }
 
 
    /**
     * 提交申请
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/submitApplyresult")
    public ModelAndView submitApplyresult() throws Exception{
        logBefore(logger, "提交Apply");
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        String APPLY_ID=pd.getString("APPLY_ID");//项目ID
        String USER_ID=pd.getString("USER_ID");//选泽的用户ID
 
        //-------------往任务列表中插入一条数据--------------------
        pd.put("ITEMID", APPLY_ID); //任务ID
        pd.put("ACTORID", '1'); //步骤ID: -1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("STATE", "审核流程进行中"); //审核状态
 
        PageData pds=applyService.findById(pd);
        pd.put("VERSION", pds.getString("SQLX"));   //流程版本ID 也就是他的申请类型ID
 
        pd.put("NextUserID",USER_ID);//下一步审批者ID
 
        String TASKLIST_ID=this.get32UUID();
        pd.put("TASKLIST_ID",TASKLIST_ID ); //主键ID
        tasklistService.save(pd);
 
 
        //-------------往历史任务列表中插入一条数据--------------------
 
        Subject currentUser = SecurityUtils.getSubject();//shiro管理的session
        Session session = currentUser.getSession();
        String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString();  //获取当前登录者loginname
 
        pd.put("ITEMID", APPLY_ID); //任务ID
        pd.put("ACTORID","0");  //步骤ID:-1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("MEMO", USERNAME+"提出申请");    //备注
        pd.put("OPERATEUSERID", USERNAME);  //操作人
        pd.put("CREATEDATE", DateUtil.getTime());   //操作创建时间
        String TASKHISTORY_ID=this.get32UUID();
        pd.put("TASKHISTORY_ID",TASKHISTORY_ID );   //主键ID
        taskHistoryService.save(pd);
        //-----------------------------------------------------//
 
        mv.addObject("msg","success");
        mv.setViewName("save_result");
        return mv;
 
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
部门经理审批
有待审批任务的人点击待我审批任务后就会列出来 
 
 
在审核界面可以选择同意或者拒绝 
如果同意的话会判断目前是不是最后一个步骤,是就选泽车辆,不是就选择下一步的处理角色。 
如果不同意的话则直接结束流程。
 
目前还不是最后一步 
 
更新任务列表 
 
历史任务插入一条数据 
 
 
部门领导审批
部门领导以及是这个审批流程中的最后一个审批 
所以选择车辆而不是下一步处理人 
 
更新任务列表 
 
插入历史纪录 
 
 
审批代码
部门经理审批和部门领导审批的代码都是一样的,就算在新增其他流程代码也是不需要修改的。
 
/**
     * 选择下一步审批人,流程继续
     */
    @RequestMapping(value="/taskSubmitApply")
    public ModelAndView taskSubmitApply() throws Exception{
        logBefore(logger, "提交Apply");
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        String APPLY_ID=pd.getString("APPLY_ID");//项目ID
 
        //根据项目ID查询项目基本信息 -> 找出这个项目使用的流程 -> 查看这个流程的第一步是那哪角色审批
        //-> 查询用户中是这个角色的所有用户供选择
        int nowCount=tasklistService.findNowCount(pd);//当前步骤
        int allCount=tasklistService.findCount(pd);//总的步骤
 
        if(allCount==nowCount){//供页面判断是否是最后
            pd.put("iSLast",1);
        }else pd.put("iSLast",0);
 
        pd.put("nowCount",nowCount+1);
        List<User> userList=userService.listAllUserByApply(pd);
        List<Car> carList=carService.carlistAll();
 
        //如果当前次数+1是最后一次,则进入派车页面
//      if(nowCount+1==tasklistService.findCount(pd)){
//          mv.setViewName("information/car/list");
//          mv.addObject("msg","tasklist/submitApplyresult");
//          mv.addObject("pd", pd);
//      }else {//否则进入设置下一个审批者页面
 
 
            mv.setViewName("information/tasklist/tasklist_chooseUser");
 
            mv.addObject("pd", pd);
            mv.addObject("userList",userList);
            mv.addObject("carList",carList);
 
        if(allCount==nowCount) {//供页面判断是最后
            mv.addObject("msg","endtaskSubmitApplyresult");//同意 继续下一步的角色选择
        }else {
            mv.addObject("msg","taskSubmitApplyresult");//最后一个派车同意 继续下一步的角色选择
        }
 
        return mv;
    }
 
    /**
     * 同意派车,流程结束
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/endtaskSubmitApplyresult")
    public ModelAndView endtaskSubmitApplyresult() throws Exception{
        logBefore(logger, "提交Apply");
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
 
        String APPLY_ID=pd.getString("APPLY_ID");//项目ID
        String Car_ID=pd.getString("Car_ID");//选泽的车辆ID
        String TASKLIST_ID=pd.getString("TASKLIST_ID");//当前任务ID
 
        //-------------更新任务列表的下一个审批者和下一步的步骤ID--------------------
 
        int nowCount=tasklistService.findNowCount(pd);
        int allCount=tasklistService.findCount(pd);
 
//      if(nowCount<allCount){
        pd.put("ACTORID", -1);  //步骤ID: -1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("STATE", "流程结束,请提取车辆:"+Car_ID);  //审核状态
        pd.put("NextUserID","");//下一步审批者ID
        pd.put("TASKLIST_ID",TASKLIST_ID ); //主键ID
        tasklistService.edit(pd);
 
        //-------------往历史任务列表中插入一条数据--------------------
 
        Subject currentUser = SecurityUtils.getSubject();//shiro管理的session
        Session session = currentUser.getSession();
        String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString();  //获取当前登录者loginname
 
        pd.put("ITEMID", APPLY_ID); //任务ID
        pd.put("ACTORID",nowCount); //步骤ID:-1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("MEMO", USERNAME+"同意申请,审核流程结束"); //备注
        pd.put("OPERATEUSERID", USERNAME);  //操作人
        pd.put("CREATEDATE", DateUtil.getTime());   //操作创建时间
        String TASKHISTORY_ID=this.get32UUID();
        pd.put("TASKHISTORY_ID",TASKHISTORY_ID );   //主键ID
        taskHistoryService.save(pd);
        //-----------------------------------------------------//
 
        mv.addObject("msg","success");
        mv.setViewName("save_result");
        return mv;
    }
 
    /**
     * 同意的审核,继续下一个审批人选泽,流程继续
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/taskSubmitApplyresult")
    public ModelAndView taskSubmitApplyresult() throws Exception{
        logBefore(logger, "提交Apply");
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
 
        String APPLY_ID=pd.getString("APPLY_ID");//项目ID
        String USER_ID=pd.getString("USER_ID");//选泽的用户ID
        String TASKLIST_ID=pd.getString("TASKLIST_ID");//当前任务ID
 
        //-------------更新任务列表的下一个审批者和下一步的步骤ID--------------------
 
        int nowCount=tasklistService.findNowCount(pd);
        int allCount=tasklistService.findCount(pd);
 
//      if(nowCount<allCount){
            pd.put("ACTORID", nowCount+1);  //步骤ID: -1表示结束  其他则按照流程定义里的执行顺序来
            pd.put("STATE", "审核流程进行中"); //审核状态
            pd.put("NextUserID",USER_ID);//下一步审批者ID
            pd.put("TASKLIST_ID",TASKLIST_ID ); //主键ID
            tasklistService.edit(pd);
//      }else {
//          pd.put("ACTORID", "-1");    //步骤ID: -1表示结束  其他则按照流程定义里的执行顺序来
//          pd.put("STATE", "审核流程结束");  //审核状态
//          pd.put("NextUserID","");//下一步审批者ID
//          pd.put("TASKLIST_ID",TASKLIST_ID ); //主键ID
//          tasklistService.edit(pd);
//      }
 
 
 
 
        //-------------往历史任务列表中插入一条数据--------------------
 
        Subject currentUser = SecurityUtils.getSubject();//shiro管理的session
        Session session = currentUser.getSession();
        String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString();  //获取当前登录者loginname
 
        pd.put("ITEMID", APPLY_ID); //任务ID
        pd.put("ACTORID",nowCount); //步骤ID:-1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("MEMO", USERNAME+"同意申请");    //备注
        pd.put("OPERATEUSERID", USERNAME);  //操作人
        pd.put("CREATEDATE", DateUtil.getTime());   //操作创建时间
        String TASKHISTORY_ID=this.get32UUID();
        pd.put("TASKHISTORY_ID",TASKHISTORY_ID );   //主键ID
        taskHistoryService.save(pd);
        //-----------------------------------------------------//
 
        mv.addObject("msg","success");
        mv.setViewName("save_result");
        return mv;
 
    }
 
 
    /**
     * 不同意的审核,流程结束
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/refuseapply")
    public ModelAndView refuseapply() throws Exception{
        logBefore(logger, "提交Apply");
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
 
        String APPLY_ID=pd.getString("APPLY_ID");//项目ID
        String TASKLIST_ID=pd.getString("TASKLIST_ID");//当前任务ID
 
        pd.put("ACTORID", "-1");    //步骤ID: -1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("STATE", "流程结束");    //审核状态
        pd.put("NextUserID","");//下一步审批者ID
        pd.put("TASKLIST_ID",TASKLIST_ID ); //主键ID
        tasklistService.edit(pd);
 
        //-------------往历史任务列表中插入一条数据--------------------
 
        Subject currentUser = SecurityUtils.getSubject();//shiro管理的session
        Session session = currentUser.getSession();
        String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString();  //获取当前登录者loginname
 
        pd.put("ITEMID", APPLY_ID); //任务ID
        pd.put("ACTORID","-1"); //步骤ID:-1表示结束  其他则按照流程定义里的执行顺序来
        pd.put("MEMO", USERNAME+"不同意申请");   //备注
        pd.put("OPERATEUSERID", USERNAME);  //操作人
        pd.put("CREATEDATE", DateUtil.getTime());   //操作创建时间
        String TASKHISTORY_ID=this.get32UUID();
        pd.put("TASKHISTORY_ID",TASKHISTORY_ID );   //主键ID
        taskHistoryService.save(pd);
        //-----------------------------------------------------//
 
        mv.addObject("msg","success");
        mv.setViewName("save_result");
        return mv;
    }
 

1
产品试用

粤公网安备 44030502004850号