赞
踩
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
本系列文章主要记录项目过程中重点的项目技术
讲述流程设计的整个过程
流程设计过程大致如下图
如下图,点击流程管控下的流程分类管理菜单,查看流程分类
因为我已经创建了,所以下图是编辑页面的数据
点击流程管控下的流程模型设计,可以查看已有的流程模型,如下图
点击创建流程,进入流程创建页面,如下图,需要输入流程模型名称和key
1.双击圆形,选择对应的节点,如下图
2.设计后的图形
1.计划编辑
2.安全部部长审批
3.安全总监审批
4.副总经理审核
点击发布按钮,将会自动发布,如下图
选择发布的流程分类,如下图
点击流程定义管理,查看页面,并点击业务关联,具体见下图
点击上图中的业务关联,查看流程表单,具体如下图
在上图中第三步,点击流程事件,添加流程事件
具体事件
任务创建
流程完成
流程取消
在save方法中添加如下代码,具体说明见下图以及代码
具体代码见如下
@Transactional(readOnly=false) public String newSave(TrainingPlan trainingPlan) { // 如果未设置状态,则指定状态为审核状态,以提交审核流程 if (StringUtils.isBlank(trainingPlan.getStatus())){ trainingPlan.setStatus(TrainingPlan.STATUS_AUDIT); } // 如果状态为正常,则代表不正常操作,可能前端进行了数据参数修改 if (TrainingPlan.STATUS_NORMAL.equals(trainingPlan.getStatus())){ throw new ServiceException(text("非法操作,前端数据被劫持!")); } // 如果状态为草稿或审核状态,才可以保存业务数据 if (TrainingPlan.STATUS_DRAFT.equals(trainingPlan.getStatus()) || TrainingPlan.STATUS_AUDIT.equals(trainingPlan.getStatus())){ super.save(trainingPlan); } // 如果为审核状态,则进行审批流操作 if (TrainingPlan.STATUS_AUDIT.equals(trainingPlan.getStatus())){ // 指定流程变量,作为流程条件,决定流转方向 Map<String, Object> variables = MapUtils.newHashMap(); //获得当前用户的所属的机构 String officeCode = EmpUtils.getEmployee().getOffice().getOfficeCode(); if(officeCode==null) { return "当前用户为超级管理员,请切换账号"; }else { //默认集团公司编码crcebg,长度为6位,二级公司crcebg10,长度为8位,三级机构为crcebg1001为10位 if(officeCode.length()==6) {//一级机构 trainingPlan.setBpmKey(ProcessIdConstants.TRAINING_PLAN_GROUP); //安全部部长 List<ResultPost > ministerSecurity = dao.findEmployPost(new ResultPost("ministerSecurity", officeCode)); if(ministerSecurity.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(ministerSecurity.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("ministerSecurity", ministerSecurity.get(0).getEmpCode()); //安全总监 List<ResultPost > securityDirector = dao.findEmployPost(new ResultPost("securityDirector", officeCode)); if(securityDirector.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(securityDirector.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("securityDirector", securityDirector.get(0).getEmpCode()); //副总经理 List<ResultPost > viceGeneralManager = dao.findEmployPost(new ResultPost("viceGeneralManager", officeCode)); if(viceGeneralManager.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(viceGeneralManager.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("viceGeneralManager", viceGeneralManager.get(0).getEmpCode()); }else if(officeCode.length()==8) {//二级机构 trainingPlan.setBpmKey(ProcessIdConstants.TRAINING_PLAN_COMPANY); //安全部部长 List<ResultPost > ministerSecurity = dao.findEmployPost(new ResultPost("ministerSecurity", officeCode)); if(ministerSecurity.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(ministerSecurity.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("ministerSecurity", ministerSecurity.get(0).getEmpCode()); //安全总监 List<ResultPost > securityDirector = dao.findEmployPost(new ResultPost("securityDirector", officeCode)); if(securityDirector.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(securityDirector.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("securityDirector", securityDirector.get(0).getEmpCode()); }else { trainingPlan.setBpmKey(ProcessIdConstants.TRAINING_PLAN_DEPARTMENT); //安全总监 List<ResultPost > securityDirector = dao.findEmployPost(new ResultPost("securityDirector", officeCode)); if(securityDirector.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(securityDirector.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("securityDirector", securityDirector.get(0).getEmpCode()); //项目经理 List<ResultPost > projectManager = dao.findEmployPost(new ResultPost("projectManager", officeCode)); if(projectManager.isEmpty()) { return "提交失败,没有指定安全部部长!"; } if(projectManager.size() >1) { return "提交失败,存在多个安全部部长!"; } variables.put("projectManager", projectManager.get(0).getEmpCode()); } } // 如果流程实例为空,任务编号也为空,则:启动流程 if (StringUtils.isBlank(trainingPlan.getBpm().getProcInsId()) && StringUtils.isBlank(trainingPlan.getBpm().getTaskId())){ BpmUtils.start(trainingPlan, trainingPlan.getBpmKey(), variables, null); } // 如果有任务信息,则:提交任务 else{ BpmUtils.complete(trainingPlan, variables, null); trainingPlan = super.get(trainingPlan); if(trainingPlan.getStatus().equals("0")) { //设置变更状态的计划为非变更 trainingPlan.setChangeStatus("2"); super.save(trainingPlan); } } } return "保存培训计划成功!"; }
1.如果跟我一样出现一个业务应为机构的不同需要对应不同的流程,那么form页面和list页面必须动态的显示不同的流程key
到此,一个完成流程的业务基本讲述完成了。
至此,本文章结束
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。