需求

流程绘制

一、配置流程

在流程工具类ActUtils.java中配置(添加)流程信息

二、在前台leaveList页面添加使用流程的触发事件(提交按钮)

三、编写代码【本文仅针对流程(提交事件),其他功能此处不做详细说明】

1、触发事件(启动流程)

(1)业务的controller

 /* 发起流程: 提交按钮的触发事件 */@RequiresPermissions("flow:leave:start")@RequestMapping(value = "start")public String start(String ids, RedirectAttributes redirectAttributes)throws Exception {String idArray[] = ids.split(",");for (String id : idArray) {leaveService.start(leaveService.get(id));} addMessage(redirectAttributes, "提交请假申请成功");return "redirect:" + Global.getAdminPath() + "/flow/leave/?repage";}

(2)业务的service

public void start(Leave leave) {leave.preUpdate();Map<String,Object> vars = Maps.newHashMap();System.out.println(UserUtils.getRoleList());vars.put("user0",UserUtils.getUser().getLoginName()); //重新调整的发起人for (int i = 0; i < UserUtils.getRoleList().size(); i++) {if(UserUtils.getRoleList().get(i).getId().contains("c7de52dc20ea43ccafea3db315197c52")){//部门领导leave.setState("2");  //  改变状态:改为公司领导审批vars.put("roleType","leader");}else{leave.setState("1");  //  改变状态:改为部门领导审批//普通员工vars.put("roleType","staff"); //不同环节的流程vars.put("user1",userDao.searchLeader(leave.getOfficeBy().getId(),leave.getCompanyBy().getId(),"depar"+ "tment").getLoginName()); //部门领导}}dao.update(leave);vars.put("user2",userDao.searchLeader(leave.getCompanyBy().getId(),leave.getCompanyBy().getId(),"administration").getLoginName());//公司领导Taskuser taskuser=new Taskuser();//任务分配taskuser.setTaskindex("leave");//  任务分配中的 标识名List<Taskuser> list=taskuserService.findList(taskuser);for(Taskuser taskusers:list){vars.put(taskusers.getTaskver(),taskusers.getExauser().getLoginName());}//开启流程actTaskService.startProcess(ActUtils.PD_Leave[0],ActUtils.PD_Leave[1],leave.getId(),UserUtils.getUser().getName()+"|"+UserUtils.getUser().getOffice(),vars);}

(3)流程的Service(jeeplus框架自带)

2、审核环节(需要注意的是流程开启后每个环节都要带上流程信息)

(1)前台界面(需要注意的已用截图标注)

①:流程信息的携带

②流程详情的回显

③不同环节的提示(四的实操中可看具体效果)

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/webpage/include/taglib.jsp"%>
<html>
<head>
<title>审核界面</title>
<meta name="decorator" content="default" />
<script type="text/javascript" src="${ctxStatic}/webuploader-0.1.5/imageupload.js.jsp"></script><script type="text/javascript">var validateForm;function doSubmit() {//回调函数,在编辑和保存动作时,供openDialog调用提交表单。if (validateForm.form()) {$("#inputForm").submit();return true;}return false;}$(document).ready(function() {$("#text1").html(tohtml($("#haltreason").val()));$("#text2").html(tohtml($("#auditopinion").val()));$("#text3").html(tohtml($("#ratifyopinion").val()));$("#text4").html(tohtml($("#remarks").val()));function tohtml(text) {var img = "";if (text == "") {return null;} else {if (text.indexOf("|") == -1) {return "<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+ text + "</p>";} else if (text.split('|')[0] == "同意") {img = "<img src=\"../../../userfiles/1/images/同意.png\" style=\"height:45px;width:120px;margin-top:-63px;filter:alpha(opacity=60);-moz-opacity:0.6;-khtml-opacity:0.6;opacity:0.6;\">"return "<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+ text.split('|')[1]+ "</p><p style=\"text-align:right;\">"+ text.split('|')[2]+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>"+ text.split('|')[3]+ "<br/>"+ img + "</p>";} else if (text.split('|')[0] == "不同意") {img = "<img src=\"../../../userfiles/1/images/不同意.png\" style=\"height:45px;width:80px;margin-right:18px;margin-top:-63px;filter:alpha(opacity=60);-moz-opacity:0.6;-khtml-opacity:0.6;opacity:0.6;\">"return "<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+ text.split('|')[1]+ "</p><p style=\"text-align:right;\">"+ text.split('|')[2]+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>"+ text.split('|')[3]+ "<br/>"+ img + "</p>";}}}var Max = [ $("#text1").height(), $("#text2").height() ];for (var i = 1; i < Max.length; i++) {if (Max[i] > Max[0]) {Max[0] = Max[i];}}$("#text1").height(Max[0]);$("#text2").height(Max[0]);$("#text3").height(Max[0]);$("#text4").height(Max[0]);validateForm = $("#inputForm").validate({submitHandler : function(form) {loading('正在提交,请稍等...');form.submit();},errorContainer : "#messageBox",errorPlacement : function(error, element) {$("#messageBox").text("输入有误,请先更正。");if (element.is(":checkbox")|| element.is(":radio")|| element.parent().is(".input-append")) {error.appendTo(element.parent().parent());} else {error.insertAfter(element);}}});});
</script>
</head>
<body class="gray-bg"><form:form id="inputForm" modelAttribute="leave"action="${ctx}/flow/leave/saveAudit" method="post"class="form-horizontal"><form:hidden path="id" /><form:hidden path="act.taskId" /><form:hidden path="act.taskName" /><form:hidden path="act.taskDefKey" /><form:hidden path="act.procInsId" /><form:hidden path="act.procDefId" /> <sys:message content="${message}" /><div class="row"><div class="col-sm-9"><div class="wrapper wrapper-content animated fadeInUp"><div class="ibox"><div class="ibox-content"><div class="row"><div class="col-sm-12"><div class="m-b-md"><dd style="text-align:center;"><span><h2>请假申请</h2></span></dd></div></div></div><div class="row m-t-sm"><div class="col-sm-12"><div class="panel blank-panel"><div class="panel-body"><div class="tab-content"><div class="tab-pane active" id="tab-1"><tableclass="table table-bordered  table-condensed dataTables-example dataTable no-footer"><tbody><tr><td class="width-15 active"><label class="pull-right">开始时间:</label></td><td class="width-35"><input id="startTime" name="startTime" type="text" maxlength="20" class="laydate-icon form-control layer-date "value="<fmt:formatDate value="${leave.startTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td><td class="width-15 active"><label class="pull-right">截止时间:</label></td><td class="width-35"><input id="endTime" name="endTime" type="text" maxlength="20" class="laydate-icon form-control layer-date "value="<fmt:formatDate value="${leave.endTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td></tr><tr><td class="width-15 active"><label class="pull-right">天数:</label></td><td class="width-35"><form:input path="Days" htmlEscape="false"    class="form-control "/></td><td class="width-15 active"><label class="pull-right">事由:</label></td><td class="width-35"><form:input path="Reason" htmlEscape="false"    class="form-control "/></td></tr></tbody></table><act:histoicFlow procInsId="${leave.act.procInsId}" /></div></div></div></div></div></div></div></div></div></div><div class="col-sm-3"><div class="wrapper wrapper-content project-manager"><c:choose><c:when test="${leave.act.taskDefKey eq 'testtask-0' }"><h4>调整结果</h4><div class="col-sm-12"><input id="flag1" name="act.flag"  type="radio" class="i-checks required" value="yes" checked/><label>重新申请</label>&nbsp;&nbsp;&nbsp;<input id="flag2" name="act.flag"  type="radio" class="i-checks required" value="no"/><label>放弃申请</label></div><h4>备注</h4></c:when><c:otherwise><h4>审批结果</h4><div class="col-sm-12"><input id="flag1" name="act.flag"  type="radio" class="i-checks required" value="yes" checked/><label>同意</label>&nbsp;&nbsp;&nbsp;<input id="flag2" name="act.flag"  type="radio" class="i-checks required" value="no"/><label>不同意</label></div><h4>您的意见</h4></c:otherwise></c:choose><div class="col-sm-12"><form:textarea path="act.comment" class="required" rows="5" maxlength="255" cssClass="form-control "/><br/><input id="btnSubmit" class="btn btn-primary" type="submit" value="提交" /><button class="btn btn-default" data-toggle="tooltip" data-placement="left" type="button" onclick="history.go(-1)" title="返回">返回</button></div></div></div></div></form:form></body>
</html>

(2)业务代码

①controller

 @RequestMapping(value = "saveAudit")public String saveAudit(Leave leave,Model model) throws Exception {if("testtask-0".equals(leave.getAct().getTaskDefKey())){}else{if ("no".equals(leave.getAct().getFlag()) && StringUtils.isBlank(leave.getAct().getComment())){addMessage(model, "请填写审核意见。");return form(leave, model);} }leaveService.saveAudit(leave);return "redirect:" + adminPath + "/act/task/todo/";}

②Service

//保存审批public void saveAudit(Leave leave){if(StringUtils.isBlank(leave.getId())){}// 设置意见leave.getAct().setComment(("yes".equals(leave.getAct().getFlag())?"同意| ":"不同意| ")+leave.getAct().getComment());leave.preUpdate();// 对不同环节的业务逻辑进行操作String taskDefKey = leave.getAct().getTaskDefKey();//获取当前任务编号String taskId = leave.getAct().getTaskId();//获取当前流程实例String procInsId = leave.getAct().getProcInsId();//获取态度String flag = leave.getAct().getFlag();//获取意见String comment = leave.getAct().getComment();// 审核环节testtask-1:部门经理    testtask-2:公司领导if ("testtask-1".equals(taskDefKey)){if("yes".equals(flag)){leave.setState("2");  //部门经理审核}else{//不同意leave.setState("5");}}else if("testtask-2".equals(taskDefKey)){if("yes".equals(flag)){leave.setState("4");   //公司领导审核}else{//不同意leave.setState("5");}}else if("testtask-0".equals(taskDefKey)){if("yes".equals(flag)){//发起人的调整for (int i = 0; i < UserUtils.getRoleList().size(); i++) {if(UserUtils.getRoleList().get(i).getId().contains("c7de52dc20ea43ccafea3db315197c52")){//部门领导leave.setState("2");  //  改变状态:改为公司领导审批}else{leave.setState("1");  //  改变状态:改为部门领导审批}}}else{//放弃调整leave.setState("3");}}dao.update(leave);// 提交流程任务Map<String, Object> vars = Maps.newHashMap();vars.put("pass", "yes".equals(leave.getAct().getFlag())? "1" : "0");actTaskService.complete(taskId, procInsId, comment, vars);}  

3、form表单:可进行增、改、看操作

(1)前台页面【同样包含了流程信息的携带与回显】

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/webpage/include/taglib.jsp"%>
<html>
<head><title>请假表单</title><meta name="decorator" content="default"/><script type="text/javascript">var validateForm;function doSubmit(){//回调函数,在编辑和保存动作时,供openDialog调用提交表单。if(validateForm.form()){$("#inputForm").submit();return true;}return false;}$(document).ready(function() {validateForm = $("#inputForm").validate({submitHandler: function(form){loading('正在提交,请稍等...');form.submit();},errorContainer: "#messageBox",errorPlacement: function(error, element) {$("#messageBox").text("输入有误,请先更正。");if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){error.appendTo(element.parent().parent());} else {error.insertAfter(element);}}});laydate({elem: '#startTime' ,type: 'datetime', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'event: 'focus' //响应事件。如果没有传入event,则按照默认的click});laydate({elem: '#endTime' ,type: 'datetime', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class'type:'datetime',event: 'focus' //响应事件。如果没有传入event,则按照默认的click});});</script>
</head>
<body class="hideScroll"><form:form id="inputForm" modelAttribute="leave" action="${ctx}/flow/leave/save" method="post" class="form-horizontal"><form:hidden path="id"/><form:hidden path="act.taskId"/><form:hidden path="act.taskName"/><form:hidden path="act.taskDefKey"/><form:hidden path="act.procInsId"/><form:hidden path="act.procDefId"/><sys:message content="${message}"/>    <table class="table table-bordered  table-condensed dataTables-example dataTable no-footer"><tbody><tr><%-- <td class="width-15 active"><label class="pull-right">备注信息:</label></td><td class="width-35"><form:textarea path="remarks" htmlEscape="false" rows="4"    class="form-control "/></td> --%><td class="width-15 active"><label class="pull-right">开始时间:</label></td><td class="width-35"><input id="startTime" name="startTime" type="text" maxlength="20" class="laydate-icon form-control layer-date "value="<fmt:formatDate value="${leave.startTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td><td class="width-15 active"><label class="pull-right">截止时间:</label></td><td class="width-35"><input id="endTime" name="endTime" type="text" maxlength="20" class="laydate-icon form-control layer-date "value="<fmt:formatDate value="${leave.endTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td></tr><tr><td class="width-15 active"><label class="pull-right">天数:</label></td><td class="width-35"><form:input path="Days" htmlEscape="false"    class="form-control "/></td><td class="width-15 active"><label class="pull-right">事由:</label></td><td class="width-35"><form:input path="Reason" htmlEscape="false"    class="form-control "/></td></tr></tbody></table><c:if test="${not empty leave.processInstanceId  }"><act:histoicFlow procInsId="${leave.processInstanceId}"/></c:if></form:form>
</body>
</html>

(2)后台:根据不同的业务需求调整不同的页面

 /*** 查看,增加,编辑请假表单页面*/@RequiresPermissions(value={"flow:leave:view","flow:leave:add","flow:leave:edit"},logical=Logical.OR)@RequestMapping(value = "form")public String form(Leave leave, Model model) {String view = "leaveForm"; //新增or修改// 查看审批清单if (StringUtils.isNotBlank(leave.getId())) {String taskDefKey = leave.getAct().getTaskDefKey();// 环节编号if ("testtask-1".equals(taskDefKey)) {if (("1").equals(leave.getState())) {//状态等于1,等待部门领导审核view = "leaveAudit";} else {view = "leaveView"; //不是审核环节,查看详情即可}}else if ("testtask-2".equals(taskDefKey)) {// 审核环节2【总领导审批】if (("2").equals(leave.getState())) {//状态等于2,等待公司领导审核view = "leaveAudit";} else {view = "leaveView";}}else if ("testtask-0".equals(taskDefKey)) {// 发起人重新调整if (("5").equals(leave.getState())) {//状态等于5,等待重新提交view = "leaveAudit";} else {view = "leaveView";}}}model.addAttribute("leave", leave);return "modules/flow/" + view;}

四、实操看效果

以普通职员为例(售前1号)

1、提交申请

2、提交后开启流程

3、部门领导审核:售前经理

①售前经理可在自己的待办任务中进行任务办理操作

②审核结果:此处选择不同意

4、发起人调整申请

①看到自己的申请未通过

②去待办任务中进行任务办理操作

③调整申请:重新申请

5、部门领导审核:同意申请,进入下一环节

6、公司领导申请:也是在待办任务中进行任务办理操作,同意申请,进行下一环节

7、流程完毕,发起人可看到流程已通过

五、补充

一些标签是框架自己的东西,如下图,可直接按住ctrl+具体标签,点进去查看具体的内容

1、提交按钮

包含但不限于对于提交的验证

2、流程信息的回显

对应的是具体的界面绘制

jeeplus代码中配置并开发流程相关推荐

  1. SpringBoot中配置为开发模式,代码修改后不用重新运行

    场景 SpringBoot中配置为开发模式,修改代码后不用重新运行. 实现 打开pom.xml,添加依赖 <!-- 添加如下依赖,配置为开发模式,代码做了修改,不用重新运行--><! ...

  2. eclipse配置python开发环境_Eclipse中配置python开发环境详解

    Eclipse中配置python开发环境详解 1.下载python安装包.python-2.6.6.msi.并安装. 默认python会安装在C:\Python26下,查看环境变量,如果没有在path ...

  3. eclipse中配置c++开发环境 Eclipse + CDT + MinGW

    转自eclipse中配置c++开发环境 Eclipse + CDT + MinGW 基本框架:Eclipse + CDT + MinGW 背景知识: CDT:CDT 是完全用 Java 实现的开放源码 ...

  4. 微信小程序中配置云开发

    微信小程序中配置云开发 一.配置 app.js 文件 onLaunch() {wx.cloud.init({env: 'cloud1-xxxxxxxxxx', // 云开发 环境IDtraceUser ...

  5. QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

    本文主要记录一下如何在 QT5.14.2 中配置 MSVC2017 构建套件,以及在VS2017中配置QT的开发环境.开发环境为 Win10 +  QT5.14.2 + Visual Studio 2 ...

  6. 零代码平台基于模型驱动开发流程和概念

    当前零代码平台/低代码平台比较流行,这些平台主要的实现原理就是基于模型驱动开发,需要平台提供数据建模.表单建模.流程建模.页面建模.报表建模等一系列可视化在线设计工具,基于这些工具,无需掌握编程技能也 ...

  7. 软件工程中新功能开发流程

    在软件生命周期内,根据市场和客户的需求,会不断的引入新的功能.由于经验.技术.视野.开发流程等方面的差异,不同的软件工程师的开发出的功能质量各不相同;经常出现功能不全.稳定性差.并发低.容错性差等缺点 ...

  8. IDEA中配置hadoop开发环境

    IDEA中整合hadoop开发环境 前言: hadoop程序运行在分布式环境下,运行调试MapReduce只需要对应的hadoop相应的依赖jar包就可以,下面以是在伪分布模式下hadoop程序的开发 ...

  9. 利用流水线改进代码中的if处理流程

    本文用到的编程语言为C#,具体思路不限制编程语言. 刚才正在浏览http://ruby-china.org/topics/7384的时候,看到5楼的回复,突然有一种想法,不知道优劣,请大家帮忙评判一下 ...

最新文章

  1. linux基础-延时命令:sleep
  2. 机器学习顶刊文献_人工智能顶刊TPAMI2019最新《多模态机器学习综述》
  3. android camera工程师,Android从Camera中获取图片的两种方法
  4. 闲来无事写写-Huffman树的生成过程
  5. 图解Linux字符设备驱动
  6. Kotlin — 实现JavaEE 开发Web工程
  7. 自然之州阿肯色及温泉国家公园
  8. 20190105 东非大裂谷
  9. 软件工程复习笔记——项目计划
  10. 软件工程作业--网上书店
  11. mt7601驱动使用(二)
  12. 【国家电网】2021年国家电网有限公司招聘高校毕业生公告
  13. c4droid入门教程(2022干货)- 手机C4DROID编辑器
  14. 华为过程可信cib是指_【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程...
  15. 智能血糖仪行业调研报告 - 市场现状分析与发展前景预测
  16. 腾讯小小警告Groupon:中国地盘听我的
  17. 医疗门诊ERP系统源码
  18. L_TO_CREATE_POSTING_CHANGE
  19. 碎碎念 2022.4.25
  20. 【实战】烂泥:网络版杀毒软件部署

热门文章

  1. 解决WPS中的VBA支持库安装问题
  2. linux普通用户libusb访问usb,linux – 使用libusb-1.0作为非root用户访问USB设备
  3. 苹果证实黄牛雇上千人排队抢购iPhone 4
  4. css 中ex,规格 - css'ex'单位的价值是多少?
  5. [更新]18号将去绵竹已经回来了!
  6. 支付宝小程序跳转H5连接(无需添加白名单)
  7. int与long long之间的转换
  8. 塞纳商务车改装后让人爱不释手
  9. C#通过Nopi操作EXCEL表
  10. 《数字手环》智能互动装置2018天翼博览会科技圆环互动定制互动体验跳跃互动企业展厅声光电创意科技数字体感触控手势捕捉tioyo