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










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