上一篇文章《实战项目之使用LiteFlow编写一个流程引擎(三)》我们已经把基本的springboot项目创建好了,从这篇文章开始,我们正式开始LiteFlow。首先来回顾下之前的流程图
从上图我们可以看到一共有10个节点,我们从前面的业务也可以看出,我们需要的是灵活 ,这里面的任何步骤我们都可以打散从组,那么如果来入手这个流程引擎的编写呢?其实我们总体采用的策略就是搭乐高积木的方式,所以我们首先需要先建造基础的积木。
既然首先是制作积木,也就是以上每一个节点我们都要实现他的功能。所以这里我们开始搭建积木。
一、点击录取
这个不是积木,这个是页面业务的功能,所以这个是不需要积木的。
二、判断年龄是否满15周岁
这里我们可以看到这是一个分支,那么他返回的肯定是true或者false,那么我们只需要根据判断的逻辑来操作返回true或者false即可。代码如下:
package com.school.admission.process; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.stereotype.Component; import com.school.admission.context.AdmissionContext; import com.school.admission.model.StudentPoJO; import com.yomahub.liteflow.core.NodeIfComponent; import lombok.extern.slf4j.Slf4j; /** * 判断年龄是否满足需求 * * @author Administrator * */ @Component("useragefunction") @Slf4j public class UserAgeFunction extends NodeIfComponent { /** * 是否成年 * * @param student * @return */ private Boolean canBeAdmission(StudentPoJO student) { try { // 获取身份证上的年月日 String dates = student.getUserIdCard().substring(6, 10) + "-" + student.getUserIdCard().substring(10, 12) + "-" + student.getUserIdCard().substring(12, 14); Date nowDate = new Date(); // 获取当前时间 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date birthDate = df.parse(dates); // 格式化出生日期 long diff = nowDate.getTime() - birthDate.getTime(); long ages = diff / (1000 * 60 * 60 * 24) / 365; // 获取用户年龄 if ((int) ages >= 15) { // 判断用户年龄是否满足15周岁 return true; } else { return false; } } catch (Exception e) { log.error(e.getMessage(), e); } return false; } @Override public boolean processIf() throws Exception { StudentPoJO student = this.getSlot().getRequestData(); log.info("节点获取到传递进来的学生信息是:{}", student); // 计算下是否满15周岁,如果满足则可以录取 Boolean canBeAdmission = this.canBeAdmission(student); if(!canBeAdmission) { AdmissionContext context = this.getContextBean(AdmissionContext.class); context.setErrorMsg("年龄不够"); } return canBeAdmission; } }
备注:
1、这里需要继承选择节点,因为会涉及到分支。
三、录取失败
这是一个长方形,也就是他是一个逻辑处理的function,所以我们直接继承node节点即可,并且完善里面的通用型代码
package com.school.admission.process; import org.springframework.stereotype.Component; import com.school.admission.context.AdmissionContext; import com.school.admission.model.AdmissionResult; import com.yomahub.liteflow.core.NodeComponent; import lombok.extern.slf4j.Slf4j; @Component("admissionfailfunction") @Slf4j public class AdmissionFailFunction extends NodeComponent { @Override public void process() throws Exception { log.info("录取失败"); AdmissionContext context = this.getContextBean(AdmissionContext.class); log.info(""); context.setCanBeAdmission(false); context.setResult(AdmissionResult.builder().result(false).msg("录取失败," + context.getErrorMsg()).build()); } }
四、判断是否填写预报名信息
这里是一个菱形,也是一个判断的条件,所以返回的还是true或者false。节点选择判断节点
package com.school.admission.process; import org.springframework.stereotype.Component; import com.school.admission.context.AdmissionContext; import com.school.admission.model.StudentPoJO; import com.yomahub.liteflow.core.NodeIfComponent; import lombok.extern.slf4j.Slf4j; /** * 判断是否预报名 * * @author Administrator * */ @Component("preregistrationfunction") @Slf4j public class PreRegistrationFunction extends NodeIfComponent { @Override public boolean processIf() throws Exception { log.info("预报名"); StudentPoJO stu = this.getSlot().getRequestData(); if (stu.getRegister() == null || !stu.getRegister().getRegistered()) { AdmissionContext context = this.getContextBean(AdmissionContext.class); context.setErrorMsg("当前用户未填写预报名信息"); return false; } else { return true; } } }
五、是否满足复读生的录取条件
这里一般会有一些固定的规则,为了模拟业务,我们做的简单一点,设置为全部满足
package com.school.admission.process; import org.springframework.stereotype.Component; import com.yomahub.liteflow.core.NodeIfComponent; import lombok.extern.slf4j.Slf4j; /** * 判断是否满足复读生的录取条件 * * @author Administrator * */ @Component("returnstudentfunction") @Slf4j public class ReturnStudentFunction extends NodeIfComponent { @Override public boolean processIf() throws Exception { // 默认都满足 log.info("复读生"); return true; } }
六、获取复读生的缴费规则
复读生的缴费规则一般都是提前生成的,在实际业务中按照这里的规则直接生成对应的账单即可
package com.school.admission.process; import org.springframework.stereotype.Component; import com.yomahub.liteflow.core.NodeComponent; import lombok.extern.slf4j.Slf4j; /** * 获取录取生的缴费规则 * * @author Administrator * */ @Component("returnstudentbillrulefunction") @Slf4j public class ReturnStudentBillRuleFunction extends NodeComponent { @Override public void process() throws Exception { log.info("获取复读生的缴费规则"); } }
七、生成复读生的缴费账单
根据缴费规则生成缴费账单即可
package com.school.admission.process; import java.util.HashMap; import org.springframework.stereotype.Component; import com.school.admission.context.AdmissionContext; import com.yomahub.liteflow.core.NodeComponent; import lombok.extern.slf4j.Slf4j; /** * 获取录取生的缴费规则 * * @author Administrator * */ @Component("returnstudentbillfunction") @Slf4j public class ReturnStudentBillFunction extends NodeComponent { @Override public void process() throws Exception { log.info("生成复读生的账单"); AdmissionContext context = this.getContextBean(AdmissionContext.class); HashMap<String, Object> bills = context.getResult().getBills(); bills.put("学费", "100.00"); bills.put("住宿费", "20.00"); } }
八、录取成功
这里我们简单的展示下,把账单和录取成功都返回去,方便前端展示
package com.school.admission.process; import org.springframework.stereotype.Component; import com.school.admission.context.AdmissionContext; import com.yomahub.liteflow.core.NodeComponent; import lombok.extern.slf4j.Slf4j; @Component("admissionsuccessfunction") @Slf4j public class AdmissionSuccessFunction extends NodeComponent { @Override public void process() throws Exception { log.info("录取成功"); AdmissionContext context = this.getContextBean(AdmissionContext.class); context.getResult().setResult(true); context.getResult().setMsg("录取成功"); } }
九、是否满足应届生的录取条件
同复读生一样,都有相应的规则
package com.school.admission.process; import org.springframework.stereotype.Component; import com.yomahub.liteflow.core.NodeIfComponent; import lombok.extern.slf4j.Slf4j; /** * 判断是否满足应届生的录取条件 * * @author Administrator * */ @Component("freshgraduatefunction") @Slf4j public class FreshGraduateFunction extends NodeIfComponent{ @Override public boolean processIf() throws Exception { //这里暂时做业务,默认都满足应届生的录取条件 log.info("应届生"); return true; } }
十、获取应届生的缴费规则
package com.school.admission.process; import org.springframework.stereotype.Component; import com.yomahub.liteflow.core.NodeComponent; import lombok.extern.slf4j.Slf4j; /** * 获取应届生的缴费规则 * @author Administrator * */ @Component("freshgraduatebillrulefunction") @Slf4j public class FreshGraduateBillRuleFunction extends NodeComponent{ @Override public void process() throws Exception { log.info("获取应届生的缴费规则"); } }
十一、生成应届生的缴费账单
同上,根据缴费规则生成缴费账单
package com.school.admission.process; import java.util.HashMap; import org.springframework.stereotype.Component; import com.school.admission.context.AdmissionContext; import com.yomahub.liteflow.core.NodeComponent; import lombok.extern.slf4j.Slf4j; /** * 生成应届生相关的账单 * * @author Administrator * */ @Component("freshgraduatebillfunction") @Slf4j public class FreshGraduateBillFunction extends NodeComponent { @Override public void process() throws Exception { log.info("生成应届生的账单"); AdmissionContext context = this.getContextBean(AdmissionContext.class); HashMap<String, Object> bills = context.getResult().getBills(); bills.put("学费", "100.00"); bills.put("住宿费", "20.00"); bills.put("床单费", "10.00"); } }
以上11个模块就是我们搭建好的积木,每一个积木都是单独的代码,直接可以进行组合使用。
还没有评论,来说两句吧...