完成这个功能以前,我负责公司的流程管理模板,在众多的解决方案当中,我选择了Activiti 缘由有:css
Springboot已经成为开发后端不可缺乏的一部分,它是如此完美,如此优秀!html
1.官方文档:https://www.activiti.org/userguide/java
2.下载一份官方准备的demo:https://www.activiti.org/get-started 选择5.X downloadmysql
这里选择旧版本的缘由是:新的版本会若是忽然出现一些不知名的错误,或者是版本问题,会让你头皮发麻不知道怎么解决,网上新版本这一类的错误博客也不多,很浪费时间!git
打开wars文件夹,复制war文件包到tomcat,利用tomcat对war包进行一个解压,咱们也能够不着急,能够登陆官方的demo进行尝试一把spring
放置到tomcat启动后产生的文件夹sql
地址:htpp://localhost:你的端口号/activiti-explorer数据库
用户名:kermit 密码:kermitapache
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
按照官网文档的指示,咱们引入springboot-starter 依赖 就是这么方便canvas
spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
##每次应用启动不检查Activiti数据表是否存在及版本号是否匹配 第一次设置为true 会自动建立表结构,以后便可设置为false 提升运行速度
spring.activiti.database-schema-update=true
复制咱们刚才放到tomcat解压后的文件,选择如下文件夹和文件复制到springboot static文件夹下
复制这三个文件到任意包下,而且为这三个文件加入注解:@RequestMapping("/service")
修改editor-app/app-cfg.js文件,修改其请求路径 和刚才修改的请求路径保持一致
@SpringBootApplication(exclude = { org.activiti.spring.boot.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class })
25张表结构建立完毕,我简单引用一下别人的博客内容以下:
u ACT_GE_* : “GE”表明“General”(通用),用在各类状况下;
u ACT_HI_* : “HI”表明“History”(历史),这些表中保存的都是历史数据,好比执行过的流程实例、变量、任务,等等。Activit默认提供了4种历史级别:
Ø none: 不保存任何历史记录,能够提升系统性能;
Ø activity:保存全部的流程实例、任务、活动信息;
Ø audit:也是Activiti的默认级别,保存全部的流程实例、任务、活动、表单属性;
Ø full:最完整的历史记录,除了包含audit级别的信息以外还能保存详细,例如:流程变量。
这位大神的连接地址:https://www.cnblogs.com/telwanggs/p/7491564.html 查看更详细的表结构介绍
@Configuration @EnableWebMvc public class StaticResourceConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } }
建立模型呢可谓是流程管理的第一项,建立一个模型,咱们呢须要在这个模型上进行流程图的设计与修改,首先把模型建立好
这里只展现部分代码,展现主要的功能,其余的具体内容,在文章尾部clone项目后进行查看
1 @RequestMapping("createModel") 2 public String createModel(HttpServletRequest request, HttpServletResponse response){ 3 4 String name = "请假流程"; 5 String description = "这是一个请假流程"; 6 7 String id = null; 8 try { 9 Model model = repositoryService.newModel(); 10 String key = name; 11 //版本号 12 String revision = "1"; 13 ObjectNode modelNode = objectMapper.createObjectNode(); 14 modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); 15 modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description); 16 modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision); 17 18 model.setName(name); 19 model.setKey(key); 20 //模型分类 结合本身的业务逻辑 21 //model.setCategory(category); 22 23 model.setMetaInfo(modelNode.toString()); 24 25 repositoryService.saveModel(model); 26 id = model.getId(); 27 28 //完善ModelEditorSource 29 ObjectNode editorNode = objectMapper.createObjectNode(); 30 editorNode.put("id", "canvas"); 31 editorNode.put("resourceId", "canvas"); 32 ObjectNode stencilSetNode = objectMapper.createObjectNode(); 33 stencilSetNode.put("namespace", 34 "http://b3mn.org/stencilset/bpmn2.0#"); 35 editorNode.put("stencilset", stencilSetNode); 36 repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8")); 37 38 response.sendRedirect(request.getContextPath() + "/static/modeler.html?modelId=" + id); 39 } catch (Exception e) { 40 e.printStackTrace(); 41 } 42 43 return "index"; 44 }
一个最简单的请假流程 开始---》人事部审批----》总经理审批------》结束
这张图表示在这个流程开始时候须要填写的一些表单属性 这些都是能够动态加载的!
任务派遣:就表示的意思是:这个任务究竟是指派给谁去执行? 我这里指派给张三去执行 当有人提交这个流程的时候 提交的内容填写完 就会有一个信息到张三这儿!
1 @RequestMapping("deploymentModel") 2 @ResponseBody 3 public JSONObject deploymentModel(String id) throws Exception { 4 5 //获取模型 6 Model modelData = repositoryService.getModel(id); 7 byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); 8 9 if (bytes == null) { 10 return JsonUtil.getFailJson("模型数据为空,请先设计流程并成功保存,再进行发布。"); 11 } 12 JsonNode modelNode = modelNode = new ObjectMapper().readTree(bytes); 13 14 BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); 15 if (model.getProcesses().size() == 0) { 16 return JsonUtil.getFailJson("数据模型不符要求,请至少设计一条主线流程。"); 17 } 18 byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model); 19 20 //发布流程 21 String processName = modelData.getName() + ".bpmn20.xml"; 22 Deployment deployment = repositoryService.createDeployment() 23 .name(modelData.getName()) 24 .addString(processName, new String(bpmnBytes, "UTF-8")) 25 .deploy(); 26 modelData.setDeploymentId(deployment.getId()); 27 repositoryService.saveModel(modelData); 28 return JsonUtil.getSuccessJson("流程发布成功"); 29 }
部署后的流程定义会显示部署ID 这个时候 模板就变成了流程定义
记住这个单词 后面用到的地方特别多!!!!
这里给解释一下这两个词的意思
开启流程的时候 咱们须要一个页面展现这个流程须要填写的字段等 而后提交进行流程的下一步操做
启动一个流程,这里加载的是咱们在画流程图时候输入的表单,这里的提交人就是当前登陆的用户(我这里没有整合安全框架 随便写了一个作测试!)
这里是派遣给张三的任务,刚才提交的任务如今到张三的下面 进行一个审核,而后把这个任务提交到下一级(总经理审核)
这里须要张三进行流程的审批。咱们填写表单后,进行提交,如今打开总经理(李四)的任务列表,发现有一个须要待处理的任务!
这里咱们既能够看到人事部审核的意见,也能够看到流程开始时候用户提交的内容。流程图也作了相应的更新。
做为一个刚接触流程的小白,第一次打开这个流程啥都不懂,也慢慢摸索一些,从网上关于流程Activiti的资料不多。
总的来讲就是:
这是博主最近才接触到的一个国内的流程开源版本,整体来讲比国外这款Activiti好用,简洁 Api较多,简易
也不能说Activiti人家很差,就是说白了有点复杂,小白一会儿上手不了,推荐从这款开源版本开始学习
http://www.javashuo.com/article/p-cqmwlyeh-eg.html
http://www.javashuo.com/article/p-fmbzvrtl-mk.html
https://www.jianshu.com/p/701056e672a4
http://www.javashuo.com/article/p-cineuvbi-ex.html
解决方案:建立这个processes文件夹到resources下 随便丢个文件进去
解决方案:剔除启动校验问题,向上看第六点
解决方案:
依赖文件引入缺乏问题 引入一下便可
<dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-codec</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-css</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-svg-dom</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-svggen</artifactId> <version>1.7</version> </dependency>