定制直播软件,一步步实现审批流框架
通过Maven打包
安装到本地Maven仓库:
#jar包方式安装(安装安装记得用resource下的pom文件覆盖本地仓库的) mvn install:install-file -Dfile=jar包路径 -DgroupId=com.shallowUniverse -DartifactId=process-spring-boot-starter -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar
#在文件夹中安装
mvn clean install
导入启动器中的flowdesign.sql文件到自己的数据库
创建SpringBoot工程引入依赖
<dependency><groupId>com.qianyu</groupId><artifactId>process-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version> </dependency>
配置文件(application.yml)配置流程引擎需要的环境
#配置流程引擎数据库对象参数、处理器扫描路径 process:database: flowdesignuser-table: system_useruser-id: iduser-name: realNamerole-table: system_rolerole-id: idrole-name: rnamedept-table: deptdept-id: iddept-name: namehandler-packages: com.example.testflow.handler
启动类开启流程引擎自动配置(@EnableProcess)
@SpringBootApplication @EnableProcess @MapperScan(basePackages = {"com.example.process.mapper"}) public class TestFlowApplication {public static void main(String[] args) {SpringApplication.run(TestFlowApplication.class, args);} }
自定义拦截器(实现ProcessInterceptor接口)
@Component public class ProcessUserInterceptor implements ProcessInterceptor {@Resourceprivate ProcessUserManager processUserManager;@Overridepublic void beforeExecuteProcessor(HttpServletRequest httpServletRequest) {//这里正常情况是从request解析token或者session拿到用户信息,此处为测试ProcessUser processUser = new ProcessUser();processUser.setId(1L);processUser.setRealName("gs");processUser.setUsername("gs");processUser.setUserRoles("1");processUser.setDeptId(1L);processUserManager.setSysUser(processUser);}@Overridepublic void postExecuteProcessor(Method method, Object returnValue) {if ("findByRole".equals(method.getName())) {System.out.println("转换之前=========>");System.out.println(returnValue);System.out.println("转换之后=========>");List<Approval> approvals = (List<Approval>) returnValue;approvals.clear();returnValue = approvals;}} }
拦截器放入流程引擎
@Configuration public class ProcessConfig implements ProcessInterceptorConfigurer {@Resourceprivate ProcessUserInterceptor processUserInterceptor;@Overridepublic void configurer(ProcessEngine processEngine) {//增加用户校验拦截器 processEngine.addInterceptor(processUserInterceptor);} }
自己的数据库用户表对应的实体实现SysUser接口(可以不实现直接使用ProcessUser对象封装数据)
public class SystemUser implements SysUser {private Long id;private String username;private Long dept;private String realName;private String userRoles;@Overridepublic Long getId() {return id;}@Overridepublic Long getDept() {return dept;}@Overridepublic String getUsername() {return username;}@Overridepublic String getUserRoles() {return userRoles;}@Overridepublic String getRealName() {return realName;} }
在需要开启审批的方法上加上注解
@Service public class LeavesService extends ServiceImpl<LeavesMapper, Leaves> {@Resourceprivate LeavesMapper leavesMapper;@ProcessBegin(value = "leaves")@Overridepublic boolean save(@ProcessEntry(primaryKey = "leavesId", processField = "flowId",underscoreToCamelCase = true) Leaves leaves) {return leavesMapper.insert(leaves) > 0;} }
编写后置处理器
//实现FlowFinishedHandler接口 //要加上component注解,因为处理器是全部放在spring容器中,后续加载也会从spring容器加载 @ProcessHandler("leaves") @Component public class LeavesFlowHandler implements ProcessFinishedHandler { //审批同意后的自动回调 @Overridepublic void postAllowHandle(String jsonApproval, ApprovalDetails approvalDetails) {System.out.println(JSON.parseObject(jsonApproval, Leaves.class));}//审批拒绝后的自动回调 @Overridepublic void postRefuseHandle(String jsonApproval,ApprovalDetails approvalDetails) {System.out.println("拒绝");} }
在需要使用的地方引入FlowEngine对象
@Autowiredprivate FlowEngine flowEngine; //此处为测试代码,实际场景由客户端发送请求controller处理 @Testpublic void contextLoads() throws FormNotExistException {Emp emp = new Emp();emp.setEid(1);flowEngine.login(emp);Leaves leaves = new Leaves();leaves.setContent("请假");leaves.setIsvalid(1);leavesService.save(leaves);}
@ProcessBegin
value:要做流程的表名,和数据库对应
@ProcessEntry
primaryKey:实体主键字段名
underscoreToCamelCase:主键是否驼峰
processField:实体流程字段名
@ProcessHandler
value:做流程的表名,和@ProcessBegin填写的对应
SysUser
Long getId();
当前用户id
Long getDept();
当前用户部门id
String getUsername();
当前用户用户名
String getUserRoles();
当前用户角色id字符串,格式1,2,3
String getRealName();
当前用户真实姓名
ProcessInterceptor
void beforeExecuteProcessor(HttpServletRequest httpServletRequest);
这里主要用于解析token或者session拿到用户信息
void postExecuteProcessor(Method method, Object returnValue);
可以对拿到的返回值进行过滤
ProcessInterceptorConfigurer
void configurer(ProcessEngine processEngine)
可以在加载时拿到ProcessEngine对象,添加拦截器或进行改造扩展
ProcessFinishedHandler
void postAllowHandle(String jsonForm, ApprovalDetails formAudit)
审批全部同意以后的回调方法,第一个参数为目标表数据json串,可自行转回对象
void postRefuseHandle(String jsonForm, ApprovalDetails formAudit)
审批中途拒绝以后的回调方法,第一个参数为目标表数据json串,可自行转回对象
ProcessUserManager
SysUser getSysUser();
拿到当前用户
void setSysUser(SysUser sysUser);
设置当前用户
应用程序启动扫描配置文件配置的处理器包路径从Spring容器中加载所有@ProcessHandler对应的类存入ProcessHandlerManager容器
自定义拦截器在流程引擎方法被调用前将用户信息存入ProcessUserManager
执行加了@ProcessBegin的方法时通过SpringAOP环绕通知解析@ProcessEntry的实体并将其封装为审批单对象存入数据库
ProcessEngine的executeApproval()方法执行过程中发现审批流程结束从ProcessHandlerManager中通过源表名获取处理器
获取到处理器后调用postAllowHandle或postRefuseHandle,至此流程结束
至少要编写一个自定义拦截器解析token或者session拿到用户信息并放入ProcessUserManager,否则无法正常做审批流,启动类上要加上@EnableProcess注解,否则不会加载ProcessEngine对象,配置文件的dept相关的字段可不配置,不配置的情况下不会根据部门进行节点匹配,可根据需求自行配置,用户管理器ProcessUserManager的默认作用域为审批流框架内部方法,如需增加作用域请编写切面,参考如下:
@Aspect @Component public class MyAspect {@Resourceprivate ProcessEngine processEngine;@Pointcut("execution(* com.example.process.service.*.*(..))")public void pointCut() {}@Before("pointCut()")public void before() throws AuthenticationException {processEngine.autoWriedUser();} }
以上就是定制直播软件,一步步实现审批流框架, 更多内容欢迎关注之后的文章