如何自己实现一个可自定义业务流程步骤的工作流
2017-02-07 14:00
609 查看
项目功能需求简述
由于业务需要,需要一个申请-审批的工作流,并且业务流程是不固定的,需要能灵活配置,比如现在是:开始->部门经理审批->结束,可能之后就会变为开始->部门经理审批->部门领导审批->结束。因此不能把代码写死,必须做成高可配置的。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; }
部门经理审批
有待审批任务的人点击待我审批任务后就会列出来在审核界面可以选择同意或者拒绝
如果同意的话会判断目前是不是最后一个步骤,是就选泽车辆,不是就选择下一步的处理角色。
如果不同意的话则直接结束流程。
目前还不是最后一步
更新任务列表
历史任务插入一条数据
部门领导审批
部门领导以及是这个审批流程中的最后一个审批所以选择车辆而不是下一步处理人
更新任务列表
插入历史纪录
审批代码
部门经理审批和部门领导审批的代码都是一样的,就算在新增其他流程代码也是不需要修改的。/** * 选择下一步审批人,流程继续 */ @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; }
相关文章推荐
- 讨论一个问题:对于复杂的业务流程Sharepoint如何实现?
- 在家看孩子,10分钟生成一个业务管理系统【能支持多数据库,大数据,流程审批,权限控制,即时提醒】,视频讲解详细实现步骤
- 实例演示如何使用AgileEAS.NET SOA平台工作流进行业务流程自定义
- 让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑.
- ASP.NET MVC:如何实现一个自己的ModelBinder?
- [SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(三):工作流开发
- 自己写一个strcpy(char*dest,char*src),如何在函数内部实现防御性溢出?
- 如何自定义协议从自己的一个app打开另一个app
- 开源Jbpm4.4+ssh2+oracle10实现表单、流程自定义开发流程业务
- 如何自定义协议从自己的一个app打开另一个app
- 写出自己自定义类型转换器的实现步骤及代码
- 简单工作流引擎是按一个单据的(类型),单据的(主键) 来处理流程步骤的,这个就是工作流设计的核心思想
- [SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(四):任务表单、流转的简要图示
- 工作流中的流程和业务功能图中自己新增的模块没有出现的解决方法
- 如何实现一个简单的工作流审批引擎
- 简单工作流引擎是按一个单据的(类型),单据的(主键) 来处理流程步骤的,这个就是工作流设计的核心思想
- 如何自定义一个Remoting中Sink对象实现特定协议上的消息转发
- ASP.NET MVC:如何实现一个自己的ModelBinder?
- [SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(二):关联设置与启动设置
- 简单工作流引擎是按一个单据的(类型),单据的(主键) 来处理流程步骤的,这个就是工作流设计的核心思想