# 状态流程 **Repository Path**: ejoyinfo/machine ## Basic Information - **Project Name**: 状态流程 - **Description**: 处理状态跳转的轮子 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-07-01 - **Last Updated**: 2024-07-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 状态流程 #### 介绍 处理状态跳转的轮子(见使用说明.doc),状态处理核心类【FlowContext.java】 传统工作流不适用于不定状态的跳转,往往在固定数量状态时才能使用。 但是在开发中往往有多个状态交叉跳转,并且随着业务的变更,进行大量业务逻辑变化的场景。而此时传统的工作流组件就不够灵活了。 如:1(初始化),2(审批中),3(结束) 三个状态1->2->3。 在大量业务代码定型后,需要增加4(经理审批)状态,成为1->2->4->3流程。 再增加4-1(经理审批后发个消息),这个新增的4-1逻辑,又在指定的部门才会触发,否则没有该节点。 再增加4-2。。。。。。 此时一个状态的添加必然造成大量代码的重写。在耦合严重的情况下,状态增加频繁,业务足够复杂的情况下,引发连锁bug成为必然。 写这个组件的初衷,就是想将各个状态组件化,将整体业务切分成单独的低耦合的逻辑,从而达到降低状态间耦合性,达到通用,复用的目的。 #### 软件架构 Machine中是状态机的核心逻辑,其中FlowContext、FlowAspect是业务核心。 BaseFlowHanlder:作为切面核心,搭配注解@FlowAspectAnno,在运行时跑每个具体执行类,适用于改变状态的前置或者后置业务需求。 主要方法run(执行方法)、needExecute(判断在某些条件下运行本类)、needThrowException(是否抛出异常回滚事务) Eg:@FlowAspectAnno(prefixCheckNames = {CheckFlowHanlder.class}, suffixCheckNames = {CheckFlowHanlder.class}) @StateService:处理状态为state的状态。 执行状态变化的主逻辑: 1、遍历需要进行状态变化的实体List。 2、获取相应状态的处理类 3、获取该处理类所有方法,由注解TargetStateMethod查看是否支持该状态的转换。 注:由于可能出现代理,所以拿到被代理类的方法才能拿到注解 4、如果找不到相应状态变化方法,给出统一提示。 5、调用状态变更方法,控制事务回滚,统一将异常信息加入error提示。(注:一个对象抛异常,记录报错原因返回,并continue下一个) #### 安装教程 -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1; #### 使用说明 在controller中有简单的测试数据,启动项目后,调用地址http://localhost:8080/test?state=21 即可看到更改到目标状态的提示。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request