上一篇文章《实战项目之使用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个模块就是我们搭建好的积木,每一个积木都是单独的代码,直接可以进行组合使用。


还没有评论,来说两句吧...