项目介绍
课题方向:运维工单系统的开发
课题背景介绍 目前企业有大量的运维工作,为了规范生产和管理,需要严格按单施工,逐层审批,操作留痕,需要通过系统进行管理。 为此需要开发一个运维工单管理系统,支持省市各部门发起维护工单申请(如故障、需求等),然后经过各层级审批,通过后提交到操作单位,操作人员执行后及时回单。每个操作人员登录后及时看到各自待办工单信息,也可以派单到其他单位协助处理。每日每周提供工单流转完成情况统计报表和超时预警工单。需要支持电脑WEB门户和手机APP门户等使用模式。
参考资料推荐:
工作流引擎 硬件要求: PC机 1台:4C 8GB 内存 20GB硬盘 智能手机 1台 数据要求: 无 测试环境: 连接互联网
项目进度
可行性分析
项目计划
指定开发计划,确定项目的大小、范围、复杂程度,分配任务,安排进度,确定环境和工具
需求分析
完成《需求分析规格说明书》
-
用例视图(用例图),逻辑视图(ER图/类图),进程视图(活动图/顺序图),实现视图(部件图),部署视图(部署图)
- 参与者:各部门单位、各级审批单位、操作人员单位
- 用例:
- 申请部门
- 查看流程模板🆗
- 提交申请工单🆗
- 查看流程进度🆗
- 撤销申请流程🆗
- 查看申请历史信息🆗
- 审批部门
- 查看审批任务🆗
- 审批申请🆗
- 查看审批历史🆗
- 操作人员
- 查看执行任务🆗
- 派发回单🆗
- 分派工单
- 自动派单
- 管理员派单
- 执行人员抢单
- 查看操作历史🆗
- 操作人员查看统计报表
- 操作人员查看超时预警工单
- 管理人员管理流程模板和表单模板
概要设计
- 申请部门
完成《概要设计文档》
详细设计
完成《详细设计说明书》
backend
|__src
| |__main
| | |__java
| | | |__com.whaler.oasys
| | | |__config
| | | |__model
| | | | |__param
| | | | | |__LoginParam.java
| | | | | |__UserParam.java
| | | | | |__GroupParam.java
| | | | |__entity
| | | | | |__BaseEntity.java
| | | | | |__UserEntity.java
| | | | | |__PermissionEntity.java
| | | | | |__ApplicantEntity.java
| | | | | |__ApprovalEntity.java
| | | | | |__OperatorEntity.java
| | | | | |__AdministratorEntity.java
| | | | | |__UserPermissionEntity.java
| | | | | |__GroupEntity.java
| | | | |__vo
| | | | | |__ResultVo.java
| | | | | |__UserVo.java
| | | | | |__ApplicantVo.java
| | | | | |__ApproverVo.java
| | | | | |__OperatorVo.java
| | | | | |__GroupVo.java
| | | | | |__ProcessDefinitionVo.java
| | | | | |__ProcessInstanceVo.java
| | | | | |__TaskVo.java
| | | | | |__FormVo.java
| | | | | |__FormInfoVo.java
| | | | |__enums
| | | | | |__ResultCode.java
| | | | |__exception
| | | | | |__ApiException.java
| | | |__security
| | | | |__UserContext.java
| | | | |__JwtManager.java
| | | | |__LoginInterceptor.java
| | | | |__AuthInterceptor.java
| | | |__task
| | | | |__SetLeaderDelegate.java
| | | | |__SetManagerDelegate.java
| | | |__mapper
| | | | |__AdministratorMapper.java
| | | | |__UserMapper.java
| | | | |__PermissionMapper.java
| | | | |__ApplicantMapper.java
| | | | |__ApproverMapper.java
| | | | |__OperatorMapper.java
| | | |__service
| | | | |__impl
| | | | | |__AdministratorServiceImpl.java
| | | | | |__UserServiceImpl.java
| | | | | |__PermissionServiceImpl.java
| | | | | |__ApplicantServiceImpl.java
| | | | | |__ApproverServiceImpl.java
| | | | | |__OperatorServiceImpl.java
| | | | | |__IdmGroupService.java
| | | | |__AdministratorService.java
| | | | |__UserService.java
| | | | |__PermissionService.java
| | | | |__ApplicantService.java
| | | | |__ApproverService.java
| | | | |__OperatorService.java
| | | | |__IdmGroupService.java
| | | |__controller
| | | | |__api
| | | | |__ResultControllerAdvice.java
| | | | |__ExceptionControllerAdvice.java
| | | |__Main.java
| | |__resource
| | |__mapper
| | | |__ApplicantMapper.xml
| | | |__ApproverMapper.xml
| | | |__OperatorMapper.xml
| | | |__AdministratorMapper.xml
| | |__processes
| | | |__leaveProcess.bpmn20.xml
| | |__forms
| | | |__leaveAsk.form
| | | |__leaderApproval.form
| | | |__managerApproval.form
| | | |__.form
| | |__application.yml
| |__test
| |__java.com.whaler.oasys
| |__mapper
| |__service
| |__controller
|__target
|__sql
| |__oasys.sql
|__pom.xml
- 详细设计和编码一起进行,先建立数据库表,现在确定了用户表,权限表,用户-权限表,申请人-流程实例表,审批人-流程实例表,执行人-流程实例表,🆗需要根据需求建人员和流程的关系表,流程的其他信息尽可能放在上下文中,所以要先确定上下文要放什么消息,是否能用h2持久化,不能就用redis。
- 建立基本的管理系统,包括用户登录、会话信息保存、用户信息获取,entity类编码(mapper层存储结果,包括连表结果)🆗,mapper层及其单元测试🆗,vo类编码(一对多的实体关系,service层,返回结果)、param类(controller层,传入参数)🆗完成登录认证拦截器🆗,service层基础功能及其单元测试🆗,用户相关基础controller🆗,拦截配置、全局异常处理,mock模拟接口测试🆗,权限过滤,密码编码存储
- 增加用户组表,表示角色和用户组的多对多的关系🆗用户任务的委派对象包括candidateuser和group两类🆗审批人和操作人获得任务表单,上传任务表单和任务id,service层完成任务,自动化部分交给网关处理,
- 开发关键业务,明确需求并编写接口,测试挂载表单。先预设流程和表单,做好部署,根据需求编码数据结构和处理方法,
- 管理员上传部署流程和表单🆗,返回部署结果🆗,预设变量(委派对象使用表单存储)🆗
- 获取所有部署(部署key+部署描述),申请人选择部署🆗,获得startForm🆗,提交startForm🆗,流程变量startForm
- 审批人查询所有任务(包括assign和candidate)🆗,获取开始表单🆗,获取任务表单🆗,完成任务🆗
- 操作人查询所有任务(包括assign和candidate)🆗,获取开始表单🆗,获取任务表单🆗,完成任务🆗,派单🆗
- 申请人查询流程进度🆗,获取流程状态🆗,获取回单🆗,流程变量formList维护(将集合序列化为json后存储),考虑使用JPA
- 用户权限接口前端渲染🆗,服务任务自动化派单🆗,按照职能增加至少5个流程,做好群组管理,返回流程图显示流程进度🆗
- 日报周报生成🆗,涉及到数据库查询操作🆗,消息文本生成🆗,消息持久化🆗,消息推送,推送对象可以面向全体用户,所以考虑使用消息队列向客户端推送,超时警告使用邮箱推送🆗+消息队列客户端推送
- 分离委派任务和完成任务业务,amqp 协议实现消息推送🆗
- 应该分为两个模块:委托任务和任务池,从任务池中 claim 或者 unclaim 回到任务池;只能完成委托任务,如果不想做,可以委派给 candidate 或者扔回 任务池🆗
- 增加 owner、assign字段🆗,主人提交(暂存🆗+完成🆗),修改assign🆗 获取candidate🆗,设置assignee🆗,取消assign🆗, 委托人,暂存🆗,完成(取消assign)🆗,完成委托任务后提醒 任务池candidate,申领(设置assign+owner)🆗 放弃任务(取消assign+owner)🆗 获得已填写的表单信息🆗 增加派单协作模块,当决定派单时,设置 assignee,只有 owner 才能提交表单,assignee 只能 savedata🆗
- 解决放弃任务时清空已填写表单的bug🆗,设置endEvent名称🆗,委派协作候选人🆗,审批不通过监听器🆗,增加流程节点🆗,消息任务过期时间,解决返回 List 数据类型抛出异常问题🆗
- 登录校验bug修复,管理面板实时信息(运行的流程实例,每个流程有多少个实例,任务分为审批、执行、未超时、超时、)
- 注意:流程结束后 RuntimeService、TaskService 查询不到流程、执行、任务任何信息,只能找到表单信息,需要使用 HistoryService 查找完成/未完成的流程实例或用户任务
编码
确定开发语言,遵循代码规范、命名规范、注释规范
测试
制定测试数据,完成《测试说明书》
部署
- 网络环境:端口开放,跨域请求
- 运行环境:openjdk8,maven,mysql
相关资料
开源工单系统ferry
Java开源工单管理系统sigma
三分钟看懂什么是运维
运维管理系统有什么功能?运维系统对企业有什么帮助?
Spring 实战(第 5 版)
云程BPM
spring 中常见设计模式详解
从零开始做运维——运维平台需求分析
Springboot-Notebook 基础开发框架
工作流引擎
一文读懂工作流
Spring Boot 集成 Activiti - 快速实现工作流
轻量级工作流引擎的设计与实现
org.w3c.dom(java dom)
解析XML文档
mldong-关于工作流的管理系统
开源流程引擎哪个好,如何选型?
flowable 中文文档
Spring Boot 集成 Flowable 并自定义数据源
> 如果官方文档配置教程不全,可分析配置日志了解默认配置的过程,重写对应配置类即可
Flowable Open Source Documentation
Activiti 用户手册
一文看懂开源工作流引擎 Flowable
workflow-bpmn-modeler 基于 flowable+vue 实现的流程设计器
bpmn.js 的 demo
Flowable高级篇 - Flowable表结构
Flowable 任务如何认领,回退?
activiti6.0 处理人assignee和候选人candidate users的区别
Activiti任务认领
在 Java 代码中来一段 JavaScript?聊聊 Flowable 中的脚本任务
activiti学习之task与execution的关系
Activiti源码分析
flowable BPMN 2.0结构中的事件
flowable边界定时器
Flowable执行监听器
Flowable 任务监听器实践使用
flowable 6.4.1 流程图展示(动态流程图)乱码问题
flowable 修改流程添加节点并修改样式
flowable 设置流程跟踪高亮线的颜色
表单引擎
Flowable 表单
Flowable实战(五)表单和流程变量
Flowable工作流之加签(委派)、转签(转办)
Spring Boot 定时任务 @Scheduled
十:定时器事件
Java 代理服务任务
基于activiti 引擎及Flowable引擎bean注入问题
flowable集成spring boot —- 意见表与附件表
工作流activiti中任务的过期时间
身份引擎
手把手教大家在 Spring Boot 中处理 flowable 中的用户和组!
Flowable工作流之加签(委派)、转签(转办)
认证授权
【项目实践】一文带你搞定Session和JWT的登录认证方式
Java Practice Projects(SSM、Spring Boot、Spring Security、MinIO、Vue)
菜鸟教程|Servlet Session 跟踪
Spring Security-全面详解(学习总结—从入门到深化)
消息推送
【RabbitMQ 实战】10 消息持久化和存储原理
我有 7种 实现web实时消息推送的方案,7种!
未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践
超详细的RabbitMQ入门,看这篇就够了!
AMPQ与MQTT比较
Flutter之使用RabbitMQ
在linux下进行Rabbitmq的安装与配置
RabbitMq的序列化和反序列化(springBoot)
数据库管理
mybatisplus比mybatis到底好在哪里?
Mybatis(真的超级超级详细)
廖雪峰-JDBC编程
【Mybatis源码阅读】从源码角度分析mybatis核心工作流程
MybatisPlus源码详解
Spring + MyBatis 框架下处理数据库异常
【原创】纯干货,Spring-data-jpa详解,全方位介绍
Spring data jpa 的使用与详解(一):框架整合及基本使用
日志管理
接口文档
【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口
Spring MVC之@ControllerAdvice详解
客户端开发
测试
SpringBoot Test 人类使用指南
【保姆级教程】Spring Boot 单元测试
使用 Spring Boot 和 @SpringBootTest 进行测试
com.alibaba.fastjson.JSONObject之对象与JSON转换方法
同一个测试类内部或者不同测试类之间的@Test执行顺序
关于SpringBoot整合Mybatis时@Repository注入失败的问题
@Mapper和@Repository的区别与使用
Mybatis 与 MybatisPlus 打印sql日志配置
Spring boot Mybatis-Plus数据库单测实战(三种方式)
swagger系列教程一
mockMvc的上传和下载
版本管理和部署
如何解决 Git 仓库嵌套问题
本地 Git 仓库与 GitHub 关联
解决GitHub does not provide shell access.
SpringBoot 中实现跨域的5种方式
Linux 打开端口方法(防火墙操作)
SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?
HTML实时预览-LiveReload完整使用方法
宝塔面板部署vue项目
项目文档
部署一个私有的在线绘图服务
推荐几款文档生成框架工具
吃透8图1模板,人人可以做架构
UML序列图总结(Loop、Opt、Par和Alt)
其他
SpringBoot使用@ResponseBody返回图片
【译】10. Java反射——数组
Spring boot开启定时任务的三种方式
轻松搞定SpringBoot的邮件服务
SpringBoot中如何优雅的使用多线程
如何读取resources目录下的文件路径(九种方式)
为什么 Windows 是用 C 语言编写的,却默认对文件大小写不敏感?
BrainStorming
- 项目初步框架:
- 设计数据库表,申请表、工单表、各级单位表、审批单位表、操作单位表,确定主要字段
- 缓存数据库的搭建,保存登录状态
- 确定开发环境,后端springboot+mybatis,前端vue,客户端android,考虑使用跨平台的flutter开发
- 用户登录校验、鉴权、注册
- controller层接收请求,分离数据,service层实现具体逻辑,dao层数据访问
- 工作流引擎用于将工作流程标准化格式化可视化,以审批流程为例,用户可以自己编写配置文件,自定义审批规则、分派规则、处理规则,
然后引擎生成bean
- 工作流引擎有开源的spring-activiti,也可以自己手搓一个轻量级别的引擎
- flowable 比较轻量,遵循 bpmn2.0 协议,文档完整,适配 spring,扩展性好,考虑配合流程设计器使用
-
目前项目主要分为两部分:后端基本功能构建、工作流引擎的开发部署,然后可以适当完善后端的负载功能、安全性等方面
- 一个轻量级的工作流引擎,包括
- 定义流程的 xml 文档,将 xml 作为 dom 处理的 w3c.dom 包,XmlUtil 类从 Node 类中获得子节点、属性
- 流程图结点 PeNode 类,边 PeEdge 类作为xml元素的数据结构,结点包括结点id、type、进出的edge,边包括id、两端的from、to
- XmlProcessBuilder使用 HashMap 存储工作流数据结构,id 作为索引的 key,通过 buildPeNode、buildPeEdge 方法构建结点和边,PeProcess 数据结构存储工作流的起点和 id
- IOperator 算子接口,包括算子类型和任务,特别的,对于 gateway 算子,使用 ScriptEngine 来解析表达式,算子决定工作流结点的更新方式;PeContext 数据结构包括 一个 HashMap,记录工作流的上下文数据
- ProcessEngine 工作流引擎封装了 xml 文档路径、存储 PeNode、PeEdge、IOperator 的哈希表 type2PeNode、type2PeEdge、type2Operator、上下文 PeContext、工作流阻塞队列、PeProcess,实现了工作线程方法、结点执行方法、注册算子方法
- 后端架构采用 Spring+SpringMVC+Mybatis 的 SSM 架构,可以简化为 SpringBoot+MyBatisPlus,使用swagger生成接口文档和功能测试,使用部分 Spring Security 实现认证授权的功能
- 设计模式和spring打配合,将模式中的对象交给spring管理。单例模式注入单个对象,责任链模式注入集合,可用于请求鉴权的filter基础,策略模式注入Map,可用于工作流引擎的设计。
- 规范化接口,全局处理类利用aop的思想解耦边缘逻辑和业务逻辑。validator+自动抛出异常参与参数校验,全局异常处理+自定义异常规范异常处理,数据统一响应规范数据响应,swagger生成接口文档,上述操作能够更好地构建后端接口,解耦业务层逻辑代码。
- sesssion 有状态,在服务端保存了数据;jwt 无状态,仅仅在客户端保存了数据
- session 是存储在服务器的数据结构,通过 sessionID 唯一确定,比 cookie 存储更多的会话信息,sessionID 可以存放在 cookie、url、隐藏表单中传送。从 request 中通过 sessionID 获得 session,session 可以提供上下文信息,然后使用上下文对象进行封装,被后端程序使用。
- jwt 是包含了请求响应的上下文信息的加密字符串,客户端在登录成功后获得 jwt,将 jwt 放在请求头的 Authorization 字段,服务端 Interceptor 解析 jwt 获得 claims,从中获得上下文信息,进行业务逻辑。
- 资源权限按照颗粒度划分,分为页面、操作、数据级别的权限;页面权限存储采用 RBAC 表设计方式,ACL模型通过设计中间表描述实体间关系,RBAC模型在ACL模型中增加中间层;操作权限存储使用接口扫描类获得 API 接口,根据接口的自定义注解将 API 信息写入数据库,使用拦截器进行权限的统一管理;数据权限使用 mybatis-plus 的拦截器,通过自定义内部拦截器实现 sql 的软编码
- mybatis 使用 xml 配置文件编写底层 jdbc 的 preStatement 语句,将 sql 映射到特定的查询方法,支持批处理,比使用方法注解解耦性更好。
- mybatis-plus:Mapper 类继承 BaseMapper 基类,绑定 pojo 类,提供基本按照id或批处理的 crud,有些表连接的操作还是需要 mybatis;Service 接口继承 IService 模板接口,绑定 pojo 类,提供了基本的 crud 方法和 lambda 方法;ServiceImpl 类继承 ServiceImpl 模板类,绑定 mapper 和 pojo 类,默认注入 mapper 的 bean 对象。
- 设计模式和spring打配合,将模式中的对象交给spring管理。单例模式注入单个对象,责任链模式注入集合,可用于请求鉴权的filter基础,策略模式注入Map,可用于工作流引擎的设计。
- flowable 开发文档分为入门demo、Flowable API、集成 Spring、集成 Spring Boot、BPMN 2.0、表单、JPA、身份管理、Restful API若干部分组成
- flowable 从 ProcessEngineConfiguration 配置对象创建一个 ProcessEngine 流程引擎对象;流程引擎的 RepositoryService 服务对象通过 xml 流程定义资源部署流程,并通过 ProcessDefinition 对象获取部署的流程信息;流程引擎的 RuntimeService 服务对象启动流程实例,使用流程定义作为“蓝图”传入 ProcessInstance 流程实例对象;流程在 UserTask 阻塞等待 complete,ServiceTask 自动通过
- 流程引擎和服务对象线程安全,流程引擎通过 flowable 标准构建或 spring 构建,所有的服务都是无状态的
- Repository Service 负责管理控制部署和流程定义,部署是引擎的包装单元,先检查流程再存储至数据库,此外该服务还可以暂停激活流程,获取部署文件或流程图、流程 POJO,提供静态信息
- Runtime Service 启动流程实例,读取存储流程变量,查询流程实例和执行(execution,流程实例当前位置指针),在外部触发时通知等待(wait states)的流程实例
- Task Service 查询分派给用户、组的任务,创建流程实例无关(standalone)任务,决定任务执行用户(assignee),认领(claim)或完成(complete)任务,通常是填写表单,流程核心是人类操作的任务
- History Service 提供流程实例执行路径、流程实例启动时间、谁在执行哪个任务等信息
- Flowable的异常基类是org.flowable.engine.FlowableException,任何时候都会抛出异常,有若干异常子类
- 引擎查询数据 API 支持链式查询,所有条件使用 AND 逻辑。流程实例数据称为变量(variables),通过 Runtime Service 获取设置,Task Service 中也有类似的方法
- 流程实例可持有变量(process variable),在实例创建设置
- 用户任务和执行(execution)可持有变量,给定 executionId 设置
- 流程实例由一棵执行的树构成,执行可持有局部变量,不暴露给实例中其他执行(并行路径)
- 瞬时变量 transient variable 类似于普通变量,但不会被持久化,基本不用
- flowable 使用 UEL(unified expression lang)表达式解析,表达式用于 Java服务任务、执行监听器、任务监听器、条件顺序流
- 值表达式:解析为值,任何流程变量,包括 bean
- 方法表达式:调用方法,会被自动解析,支持容器、集合、bean
- 集成 Spring
- 事务:DataSource 传递给 SpringProcessEngineConfiguration 时,flowable 内部使用 TransactionAwareDataSourceProxy 对数据源包装(wrap),保证从数据源获取 SQL 连接和 Spring 的事务协同工作
- 表达式:使用 ProcessEngineFactoryBean 时,默认 BPMN 流程中的表达式对所有 SpringBean 可见;可设置 Configuration 的 bean 参数为空。
- 自动部署资源:默认部署中的一个流程改变,其他流程版本号跟着刷新,Configuration 中提供额外的参数 deploymentMode,single-resource: 为每个资源创建一个单独的部署,并用于重复检测过滤
- 集成 SpringBoot
- 自动创建 h2 内存数据库,类路径包含了对应驱动;创建并以 bean 的形式暴露了 flowable 的引擎和 API;创建 Spring Excutor Job;processes 目录下的 BPMN 流程定义自动部署;CommandLineRunner 特殊 bean,应用启动时执行
- 连接池默认使用 HikariCP,重写 SpringProcessEngineConfiguration 配置覆盖默认设置
- 支持 REST API、JPA、Spring Boot Actuator Endpoint
- 部署
- 业务存档(BAR,business archive),流程引擎的部署单元,ZIP 文件,具名资源,包含流程定义、表单、DMN 规则;ZipInputStream + Deploy Service 部署
- 外部资源:流程定义在服务任务、执行监听器,引用委托类
- BPMN 2.0
- 通过 RepositoryService 获得 BPMN 模型,即 BpmnModel 类,该类是 bpmn20.xml 流程定义文件反序列化后的数据结构,包括流程节点信息和 GraphInfo 流程图可视化布局数据
- flowable 事件
- 事件 event 用于为流程生命周期发生的事情建模,图像化为圆圈,主要分为捕获 catching 事件和抛出 throwing 事件,又分为五大类,开始事件、结束事件、中间事件、边界事件、边界补偿事件
- 中间事件以节点的形式出现在流程图中,但不会产生实际的节点;边界事件和节点共存。中间事件可以当作任务的发起前置监听,边界事件可以当作是对整个节点的监听
- 补偿事件,用于对已完成的流程做回退处理
- 捕获:流程执行到这个事件,等待触发器的动作;抛出:流程执行到这个事件,会抛出一个触发器
- 事件定义 eventDefinition,定义事件的语义。如果没有事件定义,事件就“不做什么特别的事情”
- 定时器事件定义:定时器触发的事件,可用于开始、中间、边界事件,可以指定 timeDuration、timeCycle,只有异步执行器启用时才能触发
- 主要用到的还是定时器事件,如果需要
- 错误事件定义:用于建模业务异常
- 信号事件定义:信号事件,引用具名信号的事件。信号是全局广播的事件,会被激活并传递给所有处理器,比如中间事件抛出、捕获信号
- 定时器事件定义:定时器触发的事件,可用于开始、中间、边界事件,可以指定 timeDuration、timeCycle,只有异步执行器启用时才能触发
- 事件 event 用于为流程生命周期发生的事情建模,图像化为圆圈,主要分为捕获 catching 事件和抛出 throwing 事件,又分为五大类,开始事件、结束事件、中间事件、边界事件、边界补偿事件
- flowable 的 idm 模块可用于身份群组管理,解耦流程定义业务和平台代码,可以开放另一个接口维护权限组,具体思路是管理员通过 api 调用 IdentityService 对角色和角色群组进行管理;定义流程时从群组中选择委派对象。
- 解决了一个 bug,经过异常输出栈定位代码和调试分析,发现问题出现在 SaveUserCmd 在 new 的过程中,抛出了 invocation target exception,也就是初始化失败,以为是构造参数 IdmEngineConfiguration 出现问题,解决无果。在更换使用 IdentityService 的 newUser 方法后解决问题,这个方法返回一个临时对象 User,文档指出该对象必须被 saveUser 保存。使用了这个临时对象作为 SaveUser 的参数就可以了,原来问题在 User 的声明上,网上的博客写的有问题。
- 解决了 java 服务任务注入依赖失败的问题,原因是服务任务在依赖注入之前就启动了,需要把任务类声明为原型bean对象,在bpmn.xml 中使用 UEL 表达式调用任务类 Component
- 解决了流程图绘制了修改画布尺寸的问题,flowable 通过一个 DefinitonModelCanven 类和 DefinitionModelDrawer 类实现,底层是基于 java.awt 和 java. 实现,由于 font、width、color 等参数都以静态 final 类型硬编码写死,所以必须对整个类重写覆盖
- 解决了 mockmvc 测试框架上传下载文件的问题,上传文件以 multipart 属性上传,下载文件需要重写 ResultHandler,从 response 的 content 中获取字节数组,使用 ImageIO 流转图片,需要在返回拦截器通过反射+类型检查增加对字节数组类型的过滤
-
开启多线程处理邮件发送任务
- 修改任务委派实现,增加抢单功能,首先用户查询自己为 candidate 的任务,然后选择任务申领 assign,然后在申领界面选择任务完成,