引擎常量
5 | * 6 | *@author JPX 7 | *@since 2022/11/28 9:55 8 | */ 9 | public interface EngineConstant { 10 | 11 | String LINE_VALUE = "lineValue"; 12 | 13 | String STR_Y = "Y"; 14 | 15 | String STR_N = "N"; 16 | 17 | String STR_Y_CN = "是"; 18 | 19 | String STR_N_CN = "否"; 20 | 21 | String DEFAULT = "default"; 22 | 23 | String STR_KEY = "key"; 24 | 25 | String STR_VALUE = "value"; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-common/src/main/java/com/fibo/rule/common/dto/EngineDto.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.common.dto; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | *引擎配置传输对象
9 | * 10 | * @author JPX 11 | * @since 2022-11-18 14:14 12 | */ 13 | @Data 14 | public class EngineDto { 15 | 16 | private Long id; 17 | private String engineName; 18 | private List节点传输对象
7 | * 8 | * @author JPX 9 | * @since 2022-11-18 14:14 10 | */ 11 | @Data 12 | public class EngineNodeDto { 13 | 14 | private Long id; 15 | private String nodeName; 16 | private String beanName; 17 | private String nodeCode; 18 | private Long engineId; 19 | private Integer nodeType; 20 | private String preNodes; 21 | private String nextNodes; 22 | private String nodeConfig; 23 | private String nodeClazz; 24 | //后续节点对应的分支值-[{"key":"Y",value:"node1"}] 25 | private String nextNodeValue; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-common/src/main/java/com/fibo/rule/common/dto/FiboBeanDto.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.common.dto; 2 | 3 | import com.fibo.rule.common.enums.NodeTypeEnum; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | *节点定义信息传输对象
11 | * 12 | * @author JPX 13 | * @since 2022-12-01 13:36 14 | */ 15 | @Data 16 | public class FiboBeanDto { 17 | 18 | /**节点类型*/ 19 | private NodeTypeEnum type; 20 | /**节点名称*/ 21 | private String name; 22 | /**节点描述*/ 23 | private String desc; 24 | /**节点类名,类名场景下不重复*/ 25 | private String clazzName; 26 | /**节点类全路径*/ 27 | private String nodeClazz; 28 | /**节点需要配置的属性*/ 29 | private List节点配置属性
8 | * 9 | * @author JPX 10 | * @since 2022-12-01 13:40 11 | */ 12 | @Data 13 | public class FiboFieldDto { 14 | 15 | /**展示*/ 16 | private String name; 17 | /**存储*/ 18 | private String fieldName; 19 | /**描述*/ 20 | private String desc; 21 | /**类型-枚举*/ 22 | private FieldTypeEnum type; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /fiborule/fiborule-common/src/main/java/com/fibo/rule/common/dto/FiboNioDto.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.common.dto; 2 | 3 | import com.fibo.rule.common.enums.NioOperationTypeEnum; 4 | import com.fibo.rule.common.enums.NioTypeEnum; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | *nio数据传输
12 | * 13 | * @author JPX 14 | * @since 2022-12-01 13:52 15 | */ 16 | @Data 17 | public class FiboNioDto { 18 | 19 | /**请求唯一标识:发出request,返回的response的id需相同*/ 20 | private String id; 21 | /**Nio请求类型:request/response*/ 22 | private NioTypeEnum type; 23 | /**Nio操作类型:初始化、更新信息、心跳包*/ 24 | private NioOperationTypeEnum operationType; 25 | /**appId*/ 26 | private Long appId; 27 | /**app地址*/ 28 | private String address; 29 | /**场景对应的节点信息 key:场景名称 value:自定义组件*/ 30 | private Map节点字段类型枚举类
11 | * 12 | *@author JPX 13 | *@since 2022/11/18 14:21 14 | */ 15 | public enum FieldTypeEnum { 16 | 17 | /**默认类型*/ 18 | DEFAULT, 19 | /**数值型*/ 20 | NUMBER, 21 | /**字符型*/ 22 | STRING, 23 | /**时间型*/ 24 | DATE; 25 | 26 | private static Set节点字段类型枚举类
5 | * 6 | *@author JPX 7 | *@since 2022/11/18 14:21 8 | */ 9 | public enum NioTypeEnum { 10 | 11 | //request 12 | REQ, 13 | //response 14 | RSP 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /fiborule/fiborule-common/src/main/java/com/fibo/rule/common/enums/NodeTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.common.enums; 2 | 3 | import java.util.HashMap; 4 | import java.util.HashSet; 5 | import java.util.Map; 6 | import java.util.Set; 7 | 8 | /** 9 | *节点类型枚举类
10 | * 11 | *@author JPX 12 | *@since 2022/11/18 14:21 13 | */ 14 | public enum NodeTypeEnum { 15 | 16 | /**开始节点*/ 17 | START(1), 18 | /**结束节点*/ 19 | END(2), 20 | /**普通节点*/ 21 | NORMAL(3), 22 | /**IF节点*/ 23 | IF(4), 24 | /**SWITCH节点*/ 25 | SWITCH(5), 26 | /**并行节点*/ 27 | ALL(6), 28 | /**聚合节点*/ 29 | POLY(7); 30 | 31 | private static final Mapnio操作类
13 | * 14 | *@author JPX 15 | *@since 2022/12/5 15:42 16 | */ 17 | @Slf4j 18 | public final class FiboNioUtils { 19 | 20 | public static FiboNioDto readNioModel(ByteBuf buf) { 21 | try { 22 | return JSON.parseObject(getNioModelJsonBytes(buf), FiboNioDto.class); 23 | } catch (Exception e) { 24 | log.warn("nio解析数据失败", e); 25 | } 26 | return null; 27 | } 28 | 29 | public static void writeNioModel(ChannelHandlerContext ctx, FiboNioDto fiboNio) { 30 | //向服务端/客户端传输FiboNioDto 31 | writeNioModel(ctx.channel(), fiboNio); 32 | } 33 | 34 | public static void writeNioModel(Channel channel, FiboNioDto fiboNio) { 35 | //向服务端/客户端传输FiboNioDto 36 | byte[] bytes = JSON.toJSONBytes(fiboNio); 37 | if (bytes != null) { 38 | ByteBuf buf = Unpooled.buffer(bytes.length); 39 | buf.writeInt(bytes.length); 40 | buf.writeBytes(bytes); 41 | channel.writeAndFlush(buf); 42 | } 43 | } 44 | 45 | public static byte[] getNioModelJsonBytes(ByteBuf buf) { 46 | byte[] bytes = new byte[buf.readableBytes()]; 47 | buf.readBytes(bytes); 48 | return bytes; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /fiborule/fiborule-common/src/main/java/com/fibo/rule/common/utils/LOGOPrinter.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.common.utils; 2 | 3 | import java.util.Optional; 4 | 5 | /** 6 | *logo打印器
7 | * 8 | *@author JPX 9 | *@since 2022/12/8 13:46 10 | */ 11 | public class LOGOPrinter { 12 | /** 13 | * 当前版本号 14 | */ 15 | private static final String VERSION_NO = getVersion(); 16 | 17 | public static void print() { 18 | StringBuilder str = new StringBuilder("\n"); 19 | str.append(" ______ _ _ _____ _ \n"); 20 | str.append(" | ____| (_) | | | __ \\ | | \n"); 21 | str.append(" | |__ _ | |__ ___ | |__) | _ _ | | ___ \n"); 22 | str.append(" | __| | | | '_ \\ / _ \\ | _ / | | | | | | / _ \\\n"); 23 | str.append(" | | | | | |_) | | (_) | | | \\ \\ | |_| | | | | __/\n"); 24 | str.append(" |_| |_| |_.__/ \\___/ |_| \\_\\ \\__,_| |_| \\___|\n"); 25 | str.append("\n Version: " + VERSION_NO + "\n"); 26 | System.out.println(str); 27 | } 28 | 29 | private static String getVersion(){ 30 | return Optional.ofNullable(LOGOPrinter.class.getPackage()) 31 | .map(Package::getImplementationVersion) 32 | .orElse("DEV"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 |组件注解
10 | * 11 | * name默认为实际类名,同一场景下不可重复 12 | * 13 | *@author JPX 14 | *@since 2022/11/22 15:25 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ElementType.TYPE}) 18 | public @interface FiboBean { 19 | 20 | String name() default ""; 21 | 22 | String desc() default ""; 23 | } 24 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/annotation/FiboField.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.annotation; 2 | 3 | import com.fibo.rule.common.enums.FieldTypeEnum; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | /** 11 | *需配置属性注解
12 | * 13 | * name默认为实际字段名,同一类下不可重复客户端操作类
13 | * 14 | *@author JPX 15 | *@since 2022/12/6 10:46 16 | */ 17 | @Slf4j 18 | public final class FiboNioClientService { 19 | 20 | /** 21 | * 发布引擎 22 | * @param engineDtoList 23 | * @return 24 | */ 25 | public static String releaseEngine(List引擎执行过程中默认参数
7 | * 8 | *@author JPX 9 | *@since 2022/11/18 13:22 10 | */ 11 | public class DefaultParamBean { 12 | 13 | private final ConcurrentHashMap引擎执行组件抽象类
10 | * 11 | * @author JPX 12 | * @since 2022-11-18 10:55 13 | */ 14 | public abstract class FiboCondition implements FiboRunnable { 15 | 16 | private Long id; 17 | 18 | private String name; 19 | 20 | /**可执行节点*/ 21 | private ListIF组件执行
12 | * 13 | * @author JPX 14 | * @since 2022-11-18 11:00 15 | */ 16 | @Data 17 | public class FiboIfCondition extends FiboCondition { 18 | 19 | private FiboSerialCondition trueBranch; 20 | private FiboSerialCondition falseBranch; 21 | 22 | @Override 23 | public void runner(Integer contextIndex) { 24 | this.getIfNode().runner(contextIndex); 25 | FiboContext context = Contextmanager.getContext(contextIndex); 26 | boolean result = context.getIfResult(this.getIfNode().getNodeCode()); 27 | if(result) { 28 | if(ObjectUtil.isNotNull(trueBranch)) { 29 | trueBranch.runner(contextIndex); 30 | } 31 | } else { 32 | if(ObjectUtil.isNotNull(falseBranch)) { 33 | falseBranch.runner(contextIndex); 34 | } 35 | } 36 | } 37 | 38 | private FiboEngineNode getIfNode() { 39 | return (FiboEngineNode) this.getRunnableList().get(0); 40 | } 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/engine/condition/FiboSerialCondition.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.engine.condition; 2 | 3 | import com.fibo.rule.core.engine.element.FiboRunnable; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | /** 7 | *串行执行
8 | * 9 | * @author JPX 10 | * @since 2022-11-18 11:00 11 | */ 12 | @Slf4j 13 | public class FiboSerialCondition extends FiboCondition { 14 | 15 | @Override 16 | public void runner(Integer contextIndex) { 17 | for (FiboRunnable runnable : this.getRunnableList()) { 18 | runnable.runner(contextIndex); 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/engine/condition/FiboSwitchCondition.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.engine.condition; 2 | 3 | import cn.hutool.core.util.ObjectUtil; 4 | import com.fibo.rule.core.context.Contextmanager; 5 | import com.fibo.rule.core.context.FiboContext; 6 | import com.fibo.rule.core.engine.element.FiboEngineNode; 7 | import com.fibo.rule.core.engine.element.FiboRunnable; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | /** 13 | *switch组件执行
14 | * 15 | * @author JPX 16 | * @since 2022-11-18 11:00 17 | */ 18 | public class FiboSwitchCondition extends FiboCondition { 19 | 20 | private Map引擎可执行类
14 | * 15 | * @author JPX 16 | * @since 2022-11-18 10:47 17 | */ 18 | @Data 19 | public class FiboEngine implements FiboRunnable { 20 | 21 | private Long engineId; 22 | 23 | private String engineName; 24 | 25 | private FiboSerialCondition serialCondition; 26 | 27 | @Override 28 | public void runner(Integer contextIndex) { 29 | if(ObjectUtil.isNull(serialCondition)) { 30 | throw new EngineSystemException(StrUtil.format("引擎[{}]没有可执行节点", engineId)); 31 | } 32 | FiboContext context = Contextmanager.getContext(contextIndex); 33 | try { 34 | context.setEngineId(engineId); 35 | serialCondition.runner(contextIndex); 36 | } catch (Exception e) { 37 | context.setException(e); 38 | throw e; 39 | } 40 | } 41 | 42 | @Override 43 | public Long getRunnableId() { 44 | return engineId; 45 | } 46 | 47 | @Override 48 | public String getRunnableName() { 49 | return engineName; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/engine/element/FiboRunnable.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.engine.element; 2 | 3 | /** 4 | * 可执行接口 5 | */ 6 | public interface FiboRunnable { 7 | 8 | void runner(Integer contextIndex); 9 | 10 | Long getRunnableId(); 11 | 12 | String getRunnableName(); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/engine/id/IdGeneratorHolder.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.engine.id; 2 | 3 | import cn.hutool.core.util.IdUtil; 4 | 5 | /** 6 | *id生成器
7 | * 8 | *@author JPX 9 | *@since 2022/11/29 10:40 10 | */ 11 | public class IdGeneratorHolder { 12 | 13 | private static IdGeneratorHolder INSTANCE; 14 | 15 | public static void init(){ 16 | INSTANCE = new IdGeneratorHolder(); 17 | } 18 | 19 | public static IdGeneratorHolder getInstance() { 20 | return INSTANCE; 21 | } 22 | 23 | public String generate() { 24 | return IdUtil.fastSimpleUUID(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/ContextNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *没有context实体异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 13:52 8 | */ 9 | public class ContextNotFoundException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public ContextNotFoundException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/EngineBuildException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *引擎构建异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 14:24 8 | */ 9 | public class EngineBuildException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public EngineBuildException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/EngineNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *没有引擎异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 13:52 8 | */ 9 | public class EngineNotFoundException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public EngineNotFoundException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/EngineSystemException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *引擎执行异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 14:24 8 | */ 9 | public class EngineSystemException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public EngineSystemException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/FiboApplicationNotInitException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | public class FiboApplicationNotInitException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | /** 异常信息 */ 8 | private String message; 9 | 10 | public FiboApplicationNotInitException(String message) { 11 | this.message = message; 12 | } 13 | 14 | @Override 15 | public String getMessage() { 16 | return message; 17 | } 18 | 19 | public void setMessage(String message) { 20 | this.message = message; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/FiboBeanNameRepeatException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *节点名称重复异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 14:24 8 | */ 9 | public class FiboBeanNameRepeatException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public FiboBeanNameRepeatException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/FiboFieldNameRepeatException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *节点属性名称重复异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 14:24 8 | */ 9 | public class FiboFieldNameRepeatException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public FiboFieldNameRepeatException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/MonitorManagerNotInitException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *监控类未初始化异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 18:04 8 | */ 9 | public class MonitorManagerNotInitException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public MonitorManagerNotInitException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/NoAvailableContextException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *没有可用context异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 10:19 8 | */ 9 | public class NoAvailableContextException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 14 | * 异常信息 15 | */ 16 | private String message; 17 | 18 | public NoAvailableContextException(String message) { 19 | this.message = message; 20 | } 21 | 22 | @Override 23 | public String getMessage() { 24 | return message; 25 | } 26 | 27 | public void setMessage(String message) { 28 | this.message = message; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/NodeAllExecuteException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | /** 4 | *并行节点执行异常
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 14:24 8 | */ 9 | public class NodeAllExecuteException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 异常信息 */ 14 | private String message; 15 | 16 | public NodeAllExecuteException(String message) { 17 | this.message = message; 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return message; 23 | } 24 | 25 | public void setMessage(String message) { 26 | this.message = message; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/exception/NullParamException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.exception; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | *参数为空异常
7 | * 8 | *@author JPX 9 | *@since 2022/11/29 10:34 10 | */ 11 | public class NullParamException extends RuntimeException implements Serializable { 12 | 13 | private static final long serialVersionUID = -864259139568071245L; 14 | 15 | private String message; 16 | 17 | public NullParamException(String message) { 18 | this.message = message; 19 | } 20 | 21 | @Override 22 | public String getMessage() { 23 | return message; 24 | } 25 | 26 | public void setMessage(String message) { 27 | this.message = message; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/monitor/MonitorTimerTask.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.monitor; 2 | 3 | import java.util.TimerTask; 4 | 5 | /** 6 | *监控器线程
7 | * 8 | *@author JPX 9 | *@since 2022/11/29 17:42 10 | */ 11 | public class MonitorTimerTask extends TimerTask { 12 | 13 | private MonitorManager monitorManager; 14 | 15 | public MonitorTimerTask(MonitorManager monitorManager) { 16 | this.monitorManager = monitorManager; 17 | } 18 | 19 | @Override 20 | public void run() { 21 | monitorManager.printStatistics(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/monitor/NodeStatistics.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.monitor; 2 | 3 | /** 4 | *统计类
5 | * 6 | *@author JPX 7 | *@since 2022/11/29 17:41 8 | */ 9 | public class NodeStatistics implements ComparableIF节点抽象类
5 | * 6 | * @author JPX 7 | * @since 2022-11-18 10:42 8 | */ 9 | public abstract class FiboIfNode extends FiboNode { 10 | 11 | /** 12 | * 需要用到nodeCode参数,重写带参数runnerStep方法 13 | * @param nodeCode 14 | */ 15 | @Override 16 | void runnerStep(String nodeCode) { 17 | boolean result = this.runnerStepIf(); 18 | //将结果放到参数池中 19 | this.getContext().setIfResult(nodeCode, result); 20 | } 21 | 22 | @Override 23 | public void runnerStep() {} 24 | 25 | public abstract boolean runnerStepIf(); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/node/FiboSwitchNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.node; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | *switch节点抽象类
7 | * 8 | * @author JPX 9 | * @since 2022-11-18 10:42 10 | */ 11 | public abstract class FiboSwitchNode extends FiboNode { 12 | 13 | /** 14 | * 需要用到nodeCode参数,重写带参数runnerStep方法 15 | * @param nodeCode 16 | */ 17 | @Override 18 | void runnerStep(String nodeCode) { 19 | String result = this.runnerStepSwitch(); 20 | //将结果放到参数池中 21 | this.getContext().setSwitchResult(nodeCode, result); 22 | } 23 | 24 | @Override 25 | public void runnerStep() {} 26 | 27 | public abstract String runnerStepSwitch(); 28 | 29 | public abstract MapFiborule配置获取
7 | * 8 | *@author JPX 9 | *@since 2022/11/28 17:17 10 | */ 11 | public class FiboRuleConfigGetter { 12 | 13 | private static FiboRuleConfig fiboRuleConfig; 14 | 15 | public static FiboRuleConfig get(){ 16 | if (ObjectUtil.isNull(fiboRuleConfig)){ 17 | fiboRuleConfig = new FiboRuleConfig(); 18 | } 19 | return fiboRuleConfig; 20 | } 21 | 22 | public static void clean(){ 23 | fiboRuleConfig = null; 24 | } 25 | 26 | public static void setFiboRuleConfig(FiboRuleConfig fiboRuleConfig){ 27 | FiboRuleConfigGetter.fiboRuleConfig = fiboRuleConfig; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/property/FiboSceneConfig.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.property; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *场景配置信息
7 | * 8 | * @author JPX 9 | * @since 2022-11-28 16:57 10 | */ 11 | @Data 12 | public class FiboSceneConfig { 13 | 14 | /** 15 | * 场景名称 16 | */ 17 | private String name; 18 | /** 19 | * 场景路径 20 | */ 21 | private String path; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/runner/FiboApplicationHolder.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.runner; 2 | 3 | import cn.hutool.core.util.ObjectUtil; 4 | import com.fibo.rule.core.exception.FiboApplicationNotInitException; 5 | import com.fibo.rule.core.property.FiboRuleConfig; 6 | 7 | public class FiboApplicationHolder { 8 | 9 | private static FiboApplication application; 10 | 11 | public static FiboApplication loadInstance(FiboRuleConfig config){ 12 | if (ObjectUtil.isNull(application)){ 13 | application = new FiboApplication(config); 14 | } 15 | return application; 16 | } 17 | 18 | public static FiboApplication loadInstance(){ 19 | if (ObjectUtil.isNull(application)){ 20 | throw new FiboApplicationNotInitException("执行器未初始化"); 21 | } 22 | return application; 23 | } 24 | 25 | public static void setHolder(FiboApplication application){ 26 | FiboApplicationHolder.application = application; 27 | } 28 | 29 | public static void clean(){ 30 | application = null; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /fiborule/fiborule-core/src/main/java/com/fibo/rule/core/util/FiboBeanUtils.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.core.util; 2 | 3 | /** 4 | *fibo bean 生成工具类
5 | * 6 | *@author JPX 7 | *@since 2022/12/16 10:31 8 | */ 9 | public final class FiboBeanUtils { 10 | 11 | private static FiboBeanFactory factory; 12 | 13 | private FiboBeanUtils() { 14 | } 15 | 16 | public static void autowireBean(Object existingBean) { 17 | if (factory == null) { 18 | return; 19 | } 20 | factory.autowireBean(existingBean); 21 | } 22 | 23 | public static boolean containsBean(String name) { 24 | if (factory == null) { 25 | return false; 26 | } 27 | return factory.containsBean(name); 28 | } 29 | 30 | public static Object getBean(String name) { 31 | if (factory == null) { 32 | return null; 33 | } 34 | return factory.getBean(name); 35 | } 36 | 37 | public static void setFactory(FiboBeanFactory factory) { 38 | FiboBeanUtils.factory = factory; 39 | } 40 | 41 | public interface FiboBeanFactory { 42 | 43 | void autowireBean(Object existingBean); 44 | 45 | boolean containsBean(String name); 46 | 47 | Object getBean(String name); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /fiborule/fiborule-server/src/main/java/com/fibo.rule/server/FiboruleServerApplication.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.server; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.context.annotation.ComponentScan; 7 | import org.springframework.scheduling.annotation.EnableAsync; 8 | import org.springframework.transaction.annotation.EnableTransactionManagement; 9 | 10 | 11 | @SpringBootApplication 12 | @EnableTransactionManagement 13 | @MapperScan({"com.fibo.rule.server.dao"}) 14 | @ComponentScan(basePackages = "com.fibo.rule.server.**") 15 | @EnableAsync 16 | public class FiboruleServerApplication { 17 | public static void main(String[] args) { 18 | SpringApplication.run(FiboruleServerApplication.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-server/src/main/java/com/fibo.rule/server/config/ControllerException.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.server.config; 2 | 3 | import com.fibo.rule.server.enums.ErrorCodeEnum; 4 | import com.fibo.rule.server.model.ResponseEntityBuilder; 5 | import org.springframework.web.bind.MethodArgumentNotValidException; 6 | import org.springframework.web.bind.annotation.ControllerAdvice; 7 | import org.springframework.web.bind.annotation.ExceptionHandler; 8 | import org.springframework.web.bind.annotation.ResponseBody; 9 | 10 | @ControllerAdvice 11 | public class ControllerException { 12 | 13 | @ResponseBody 14 | @ExceptionHandler(MethodArgumentNotValidException.class) 15 | public Object handleValidException(MethodArgumentNotValidException e) { 16 | //将错误信息返回给前台 17 | return ResponseEntityBuilder.buildErrorResponse(ErrorCodeEnum.PARAMS_EXCEPTION.getCode(), e.getBindingResult().getFieldError().getDefaultMessage()); 18 | } 19 | 20 | 21 | } 22 | -------------------------------------------------------------------------------- /fiborule/fiborule-server/src/main/java/com/fibo.rule/server/config/ServerProperties.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.server.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | @Data 8 | @Component 9 | @ConfigurationProperties(prefix = "fibo") 10 | public class ServerProperties { 11 | 12 | private String host = "0.0.0.0"; 13 | //nio port 14 | private int port = 18121; 15 | //if there is no read request for readerIdleTime, close the client 16 | private int readerIdleTime; 17 | //default 16M, size bigger than this may dirty data 18 | private int maxFrameLength = 16 * 1024 * 1024; 19 | //timeout for client response 20 | private int clientRspTimeOut = 3000; 21 | //thread pool 22 | private ServerThreadPoolProperties pool = new ServerThreadPoolProperties(); 23 | 24 | private ServerHaProperties ha = new ServerHaProperties(); 25 | 26 | @Data 27 | public static class ServerThreadPoolProperties { 28 | private int coreSize = 4; 29 | private int maxSize = 4; 30 | private int keepAliveSeconds = 60; 31 | private int queueCapacity = 60000; 32 | } 33 | 34 | @Data 35 | public static class ServerHaProperties { 36 | private String address; 37 | private int baseSleepTimeMs = 1000; 38 | private int maxRetries = 3; 39 | private int maxSleepMs = 10000; 40 | private int connectionTimeoutMs = 5000; 41 | private String host; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /fiborule/fiborule-server/src/main/java/com/fibo.rule/server/config/SessionInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.server.config; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 7 | 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | 11 | /** 12 | * 会话拦截器 13 | */ 14 | @Component 15 | public class SessionInterceptor extends HandlerInterceptorAdapter { 16 | 17 | private Logger logger = LoggerFactory.getLogger(this.getClass()); 18 | 19 | @Override 20 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 21 | return true; 22 | } 23 | 24 | 25 | } -------------------------------------------------------------------------------- /fiborule/fiborule-server/src/main/java/com/fibo.rule/server/config/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.server.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 | 7 | import javax.annotation.Resource; 8 | 9 | @Configuration 10 | public class WebMvcConfig implements WebMvcConfigurer { 11 | 12 | @Resource 13 | private SessionInterceptor sessionInterceptor; 14 | 15 | @Override 16 | public void addInterceptors(InterceptorRegistry registry) { 17 | // 添加拦截器 18 | registry.addInterceptor(sessionInterceptor) 19 | .excludePathPatterns("") // 排除拦截器要拦截的路径 20 | .excludePathPatterns("/operations") 21 | .excludePathPatterns("/swagger") 22 | .excludePathPatterns("/swagger-ui.html") 23 | .excludePathPatterns("/configuration/ui") 24 | .excludePathPatterns("/swagger-resources") 25 | .excludePathPatterns("/configuration/security") 26 | .excludePathPatterns("/v2/api-docs") 27 | .excludePathPatterns("/error") 28 | .excludePathPatterns("/webjars/**") 29 | .excludePathPatterns("/swagger-resources/configuration/ui") 30 | .excludePathPatterns("/swagger-resources/configuration/security"); 31 | // .addPathPatterns("/**"); // 添加拦截器需要要拦截的路径 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /fiborule/fiborule-server/src/main/java/com/fibo.rule/server/dao/mapper/AppMapper.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.server.dao.mapper; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import com.fibo.rule.server.dao.model.entity.App; 6 | import com.fibo.rule.server.dao.model.param.AppListParam; 7 | 8 | import java.util.List; 9 | 10 | public interface AppMapper extends BaseMapper参数配置
8 | * 9 | *@author JPX 10 | *@since 2022/11/28 16:45 11 | */ 12 | @Data 13 | @ConfigurationProperties(prefix = "fiborule.monitor", ignoreUnknownFields = true) 14 | public class FiboRuleMonitorProperty { 15 | 16 | /**是否打印监控log,默认false*/ 17 | private Boolean enableLog; 18 | /**监控存储信息最大队列数量,默认200*/ 19 | private Integer queueLimit; 20 | /**监控信息延迟多少秒打印,默认5分钟*/ 21 | private Long delay; 22 | /**监控信息每隔多少秒打印,默认5分钟*/ 23 | private Long period; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /fiborule/fiborule-spring-boot-starter/src/main/java/com/fibo/rule/springboot/FiboRuleProperty.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.springboot; 2 | 3 | import com.fibo.rule.core.property.FiboSceneConfig; 4 | import lombok.Data; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *参数配置
11 | * 12 | *@author JPX 13 | *@since 2022/11/28 16:45 14 | */ 15 | @Data 16 | @ConfigurationProperties(prefix = "fiborule", ignoreUnknownFields = true) 17 | public class FiboRuleProperty { 18 | 19 | /**appId*/ 20 | private Long app; 21 | /**服务端地址host:port*/ 22 | private String server; 23 | /**是否打印fiborule logo,默认true*/ 24 | private Boolean printBanner; 25 | /**context数量,默认1024*/ 26 | private Integer contextSize; 27 | /**场景列表,默认场景default,扫描全包*/ 28 | private Listspring bean 工厂
10 | * 11 | *@author JPX 12 | *@since 2022/12/16 10:31 13 | */ 14 | public class FiboSpringBeanFactory implements FiboBeanUtils.FiboBeanFactory, ApplicationContextAware { 15 | 16 | private AutowireCapableBeanFactory beanFactory; 17 | 18 | @Override 19 | public void autowireBean(Object existingBean) { 20 | this.beanFactory.autowireBean(existingBean); 21 | } 22 | 23 | @Override 24 | public boolean containsBean(String name) { 25 | return this.beanFactory.containsBean(name); 26 | } 27 | 28 | @Override 29 | public Object getBean(String name) { 30 | return beanFactory.getBean(name); 31 | } 32 | 33 | @Override 34 | public void setApplicationContext(ApplicationContext applicationContext) { 35 | this.beanFactory = applicationContext.getAutowireCapableBeanFactory(); 36 | FiboBeanUtils.setFactory(this); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/FiboRuleMallTestApplication.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class FiboRuleMallTestApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(FiboRuleMallTestApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/context/PriceContext.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.context; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import com.fibo.rule.test.mall.vo.AmountStepVo; 5 | import com.fibo.rule.test.mall.vo.DiscountVo; 6 | import com.fibo.rule.test.mall.vo.GoodsVo; 7 | import lombok.Data; 8 | 9 | import java.math.BigDecimal; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.concurrent.CopyOnWriteArrayList; 13 | 14 | /** 15 | *价格计算结果
16 | * 17 | *@author JPX 18 | *@since 2022/12/14 11:16 19 | */ 20 | @Data 21 | public class PriceContext { 22 | 23 | /**订单号*/ 24 | private String orderNo; 25 | /**是否境外*/ 26 | private boolean isAboard; 27 | /**是否会员*/ 28 | private boolean isVip; 29 | /**商品信息*/ 30 | private List金额类型
5 | * 6 | *@author JPX 7 | *@since 2022/12/14 13:26 8 | */ 9 | public enum AmountTypeEnum { 10 | 11 | ORIGINAL(0, "原始价格"), 12 | COUPON_DISCOUNT(1, "抵扣券"), 13 | FULL_DECREMENT(2, "满减券"), 14 | FULL_DISCOUNT(3, "打折券"), 15 | MEMBER_DISCOUNT(4, "会员折扣"), 16 | POSTAGE(5, "国内运费"), 17 | OVERSEAS_POSTAGE(6, "海外运费"), 18 | POSTAGE_FREE(7, "运费减免"); 19 | 20 | private Integer code; 21 | 22 | private String name; 23 | 24 | AmountTypeEnum(Integer code, String name) { 25 | this.code = code; 26 | this.name = name; 27 | } 28 | 29 | public Integer getCode() { 30 | return code; 31 | } 32 | 33 | public String getName(){ 34 | return name; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/node/AbroadFreightNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.node; 2 | 3 | import com.fibo.rule.core.annotation.FiboBean; 4 | import com.fibo.rule.core.annotation.FiboField; 5 | import com.fibo.rule.core.node.FiboNode; 6 | import com.fibo.rule.test.mall.context.PriceContext; 7 | import com.fibo.rule.test.mall.enums.AmountTypeEnum; 8 | import com.fibo.rule.test.mall.vo.AmountStepVo; 9 | import lombok.Data; 10 | 11 | import java.math.BigDecimal; 12 | import java.util.List; 13 | 14 | /** 15 | *海外运费计算
16 | * 17 | * @author JPX 18 | * @since 2022-12-14 14:15 19 | */ 20 | @Data 21 | @FiboBean(name = "海外运费计算", desc = "海外运费计算") 22 | public class AbroadFreightNode extends FiboNode { 23 | 24 | @FiboField(name = "海外运费", desc = "海外运费") 25 | private BigDecimal freightValue; 26 | 27 | @Override 28 | public void runnerStep() { 29 | //获取context 30 | PriceContext priceContext = this.getContextBean(PriceContext.class); 31 | 32 | BigDecimal prePrice = priceContext.getLastestAmountStep().getCurrPrice(); 33 | 34 | List是否海外地址
11 | * 12 | * @author JPX 13 | * @since 2022-12-14 14:15 14 | */ 15 | @Data 16 | @FiboBean(name = "是否海外地址", desc = "是否海外地址") 17 | public class AddressJudgeNode extends FiboIfNode { 18 | @Override 19 | public boolean runnerStepIf() { 20 | //获取context 21 | PriceContext priceContext = this.getContextBean(PriceContext.class); 22 | if(ObjectUtil.isNotNull(priceContext.isAboard())) { 23 | return priceContext.isAboard(); 24 | } 25 | return false; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/node/CouponDiscountNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.node; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.annotation.FiboField; 6 | import com.fibo.rule.core.node.FiboNode; 7 | import com.fibo.rule.test.mall.context.PriceContext; 8 | import com.fibo.rule.test.mall.enums.AmountTypeEnum; 9 | import com.fibo.rule.test.mall.vo.DiscountVo; 10 | import lombok.Data; 11 | 12 | import java.math.BigDecimal; 13 | import java.util.List; 14 | 15 | /** 16 | *抵扣券计算
17 | * 18 | * @author JPX 19 | * @since 2022-12-14 14:15 20 | */ 21 | @Data 22 | @FiboBean(name = "抵扣券计算", desc = "抵扣劵计算") 23 | public class CouponDiscountNode extends FiboNode { 24 | 25 | @FiboField(name = "抵扣劵金额", desc = "抵扣劵金额") 26 | private BigDecimal couponValue; 27 | 28 | @Override 29 | public void runnerStep() { 30 | //获取context 31 | PriceContext priceContext = this.getContextBean(PriceContext.class); 32 | List最终金额计算
12 | * 13 | *@author JPX 14 | *@since 2022/12/14 15:30 15 | */ 16 | @FiboBean(name = "最终金额计算", desc = "最终金额计算") 17 | public class FinalAmountNode extends FiboNode { 18 | @Override 19 | public void runnerStep() { 20 | //获取context 21 | PriceContext priceContext = this.getContextBean(PriceContext.class); 22 | BigDecimal finalPrice = new BigDecimal(0); 23 | for (AmountStepVo amountStepVo : priceContext.getAmountStepList()) { 24 | finalPrice = finalPrice.add(amountStepVo.getPriceChange()); 25 | } 26 | priceContext.setFinalPrice(finalPrice); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/node/FullDecrementNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.node; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.annotation.FiboField; 6 | import com.fibo.rule.core.node.FiboNode; 7 | import com.fibo.rule.test.mall.context.PriceContext; 8 | import com.fibo.rule.test.mall.enums.AmountTypeEnum; 9 | import com.fibo.rule.test.mall.vo.DiscountVo; 10 | import lombok.Data; 11 | 12 | import java.math.BigDecimal; 13 | import java.util.List; 14 | 15 | /** 16 | *满减券计算
17 | * 18 | * @author JPX 19 | * @since 2022-12-14 14:15 20 | */ 21 | @Data 22 | @FiboBean(name = "满减券计算", desc = "满减券计算") 23 | public class FullDecrementNode extends FiboNode { 24 | 25 | @FiboField(name = "满足金额", desc = "满足金额") 26 | private BigDecimal fullValue; 27 | @FiboField(name = "减免金额", desc = "减免金额") 28 | private BigDecimal decrementValue; 29 | 30 | @Override 31 | public void runnerStep() { 32 | //获取context 33 | PriceContext priceContext = this.getContextBean(PriceContext.class); 34 | //不满足条件 35 | if(priceContext.getOriginalPrice().compareTo(fullValue) < 0) { 36 | return; 37 | } 38 | List是否会员
11 | * 12 | * @author JPX 13 | * @since 2022-12-14 14:15 14 | */ 15 | @Data 16 | @FiboBean(name = "是否会员", desc = "是否会员") 17 | public class MemberJudgeNode extends FiboIfNode { 18 | @Override 19 | public boolean runnerStepIf() { 20 | //获取context 21 | PriceContext priceContext = this.getContextBean(PriceContext.class); 22 | if(ObjectUtil.isNotNull(priceContext.isVip())) { 23 | return priceContext.isVip(); 24 | } 25 | return false; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/service/SendService.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.service; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.stereotype.Service; 5 | 6 | import java.math.BigDecimal; 7 | 8 | /** 9 | *发送消息
10 | * 11 | *@author JPX 12 | *@since 2022/12/16 14:03 13 | */ 14 | @Service 15 | @Slf4j 16 | public class SendService { 17 | 18 | public boolean sendOriginalPrice(String orderNo, BigDecimal value) { 19 | //do send amount 20 | log.info("=======send original Price orderNo:{}, value:{}", orderNo, value); 21 | return true; 22 | } 23 | 24 | public boolean sendFinalPrice(String orderNo, BigDecimal value) { 25 | //do send point 26 | log.info("=======send final Price orderNo:{}, value:{}", orderNo, value); 27 | return true; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/vo/AmountStepVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.vo; 2 | 3 | import com.fibo.rule.test.mall.enums.AmountTypeEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | import java.math.BigDecimal; 8 | 9 | /** 10 | *折扣信息实体
11 | * 12 | * @author JPX 13 | * @since 2022-12-14 13:27 14 | */ 15 | @Data 16 | @AllArgsConstructor 17 | public class AmountStepVo { 18 | 19 | /**折扣类型*/ 20 | private AmountTypeEnum amountType; 21 | /**上一步的订单总价格*/ 22 | private BigDecimal prePrice; 23 | /**价格变动值*/ 24 | private BigDecimal priceChange; 25 | /**这步价格计算后的订单总价格*/ 26 | private BigDecimal currPrice; 27 | /**价格步骤描述*/ 28 | private String stepDesc; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/vo/DiscountVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.vo; 2 | 3 | import com.fibo.rule.test.mall.enums.AmountTypeEnum; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | import java.math.BigDecimal; 8 | 9 | /** 10 | *折扣信息实体
11 | * 12 | * @author JPX 13 | * @since 2022-12-14 13:27 14 | */ 15 | @Data 16 | @AllArgsConstructor 17 | public class DiscountVo { 18 | 19 | /**折扣类型*/ 20 | private AmountTypeEnum amountType; 21 | /**价格变动值*/ 22 | private BigDecimal priceChange; 23 | /**折扣描述*/ 24 | private String desc; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/vo/GoodsVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | 7 | /** 8 | *商品信息
9 | * 10 | * @author JPX 11 | * @since 2022-12-14 11:05 12 | */ 13 | @Data 14 | public class GoodsVo { 15 | 16 | /**商品id*/ 17 | private Long goodsId; 18 | /**商品编码*/ 19 | private String goodsCode; 20 | /**SKU ID*/ 21 | private Long skuId; 22 | /**SKU CODE*/ 23 | private String skuCode; 24 | /**SKU名称*/ 25 | private String skuName; 26 | /**价格*/ 27 | private BigDecimal goodsPrice; 28 | /**数量*/ 29 | private Integer count; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-mall/src/main/java/com/fibo/rule/test/mall/vo/OrderVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.mall.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | *订单信息
9 | * 10 | * @author JPX 11 | * @since 2022-12-14 11:04 12 | */ 13 | @Data 14 | public class OrderVo { 15 | 16 | private Long id; 17 | /**订单号*/ 18 | private String orderNo; 19 | /**是否境外*/ 20 | private boolean isAboard; 21 | /**是否会员*/ 22 | private boolean isVip; 23 | /**商品信息*/ 24 | private List营销活动结果
9 | * 10 | *@author JPX 11 | *@since 2022/12/14 11:16 12 | */ 13 | @Data 14 | public class MarketContext { 15 | 16 | /**交易信息*/ 17 | private TradeVo tradeVo; 18 | /**活动结果*/ 19 | private ResultVo result; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/node/ConsumeAmountJudgeNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.node; 2 | 3 | import com.fibo.rule.core.annotation.FiboBean; 4 | import com.fibo.rule.core.annotation.FiboField; 5 | import com.fibo.rule.core.node.FiboIfNode; 6 | import com.fibo.rule.test.market.context.MarketContext; 7 | import lombok.Data; 8 | 9 | import java.math.BigDecimal; 10 | 11 | /** 12 | *累计消费金额判断节点
13 | * 14 | * @author JPX 15 | * @since 2023-01-05 15:58 16 | */ 17 | @Data 18 | @FiboBean(name = "累计消费金额判断节点", desc = "累计消费金额判断") 19 | public class ConsumeAmountJudgeNode extends FiboIfNode { 20 | 21 | @FiboField(name = "累计消费金额", desc = "累计消费金额") 22 | private BigDecimal consumeAmount; 23 | 24 | @Override 25 | public boolean runnerStepIf() { 26 | MarketContext marketContext = this.getContextBean(MarketContext.class); 27 | //可从redis内存数据库中获取累计消费金额,获取之后进行累计,现mock一个值 28 | BigDecimal curConsumeAmount = new BigDecimal(7000); 29 | //判断累计消费金额是否达标 30 | if(curConsumeAmount.compareTo(consumeAmount) >= 0) { 31 | return true; 32 | } 33 | //设置未命中原因 34 | marketContext.getResult().setHit(false); 35 | marketContext.getResult().setUnHitCause("累计消费金额不达标"); 36 | return false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/node/ContextInitNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.node; 2 | 3 | import com.fibo.rule.core.annotation.FiboBean; 4 | import com.fibo.rule.core.node.FiboNode; 5 | import com.fibo.rule.test.market.context.MarketContext; 6 | import com.fibo.rule.test.market.vo.ResultVo; 7 | import lombok.Data; 8 | 9 | /** 10 | *初始化节点
11 | * 12 | * @author JPX 13 | * @since 2023-01-05 15:58 14 | */ 15 | @Data 16 | @FiboBean(name = "初始化节点", desc = "初始化节点") 17 | public class ContextInitNode extends FiboNode { 18 | @Override 19 | public void runnerStep() { 20 | MarketContext marketContext = this.getContextBean(MarketContext.class); 21 | marketContext.setTradeVo(this.getRequestData()); 22 | marketContext.setResult(new ResultVo()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/node/DateJudgeNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.node; 2 | 3 | import cn.hutool.core.date.DateUtil; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.annotation.FiboField; 6 | import com.fibo.rule.core.node.FiboIfNode; 7 | import com.fibo.rule.test.market.context.MarketContext; 8 | import lombok.Data; 9 | 10 | import java.time.LocalDateTime; 11 | import java.util.Date; 12 | 13 | /** 14 | *活动时间判断节点
15 | * 16 | * @author JPX 17 | * @since 2023-01-05 15:58 18 | */ 19 | @Data 20 | @FiboBean(name = "时间判断节点", desc = "时间判断") 21 | public class DateJudgeNode extends FiboIfNode { 22 | 23 | @FiboField(name = "开始时间", desc = "开始时间") 24 | private Date startDate; 25 | @FiboField(name = "结束时间", desc = "结束时间") 26 | private Date endDate; 27 | 28 | @Override 29 | public boolean runnerStepIf() { 30 | MarketContext marketContext = this.getContextBean(MarketContext.class); 31 | LocalDateTime localTradeDate = marketContext.getTradeVo().getLocalTradeDate(); 32 | LocalDateTime startDateTime = DateUtil.toLocalDateTime(startDate); 33 | LocalDateTime endDateTime = DateUtil.toLocalDateTime(endDate); 34 | //判断交易时间是否在时间范围内 35 | if(!startDateTime.isAfter(localTradeDate) && !endDateTime.isBefore(localTradeDate)) { 36 | return true; 37 | } 38 | //设置未命中原因 39 | marketContext.getResult().setHit(false); 40 | marketContext.getResult().setUnHitCause("交易时间不在活动时间范围内"); 41 | return false; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/node/EnrollJudgeNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.node; 2 | 3 | import com.fibo.rule.core.annotation.FiboBean; 4 | import com.fibo.rule.core.node.FiboIfNode; 5 | import com.fibo.rule.test.market.context.MarketContext; 6 | import lombok.Data; 7 | 8 | /** 9 | *是否报名判断
10 | * 11 | * @author JPX 12 | * @since 2023-01-05 15:58 13 | */ 14 | @Data 15 | @FiboBean(name = "是否报名节点", desc = "是否报名判断") 16 | public class EnrollJudgeNode extends FiboIfNode { 17 | 18 | @Override 19 | public boolean runnerStepIf() { 20 | MarketContext marketContext = this.getContextBean(MarketContext.class); 21 | //可调用接口判断是否报名,现mock为已报名 22 | boolean isEnroll = true; 23 | if(isEnroll) { 24 | return true; 25 | } 26 | //设置未命中原因 27 | marketContext.getResult().setHit(false); 28 | marketContext.getResult().setUnHitCause("未报名该活动"); 29 | return false; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/node/MerchantJudgeNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.node; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.annotation.FiboField; 6 | import com.fibo.rule.core.node.FiboIfNode; 7 | import com.fibo.rule.test.market.context.MarketContext; 8 | import lombok.Data; 9 | 10 | import java.util.HashSet; 11 | import java.util.List; 12 | 13 | /** 14 | *指定商户判断节点
15 | * 16 | * @author JPX 17 | * @since 2023-01-05 15:58 18 | */ 19 | @Data 20 | @FiboBean(name = "指定商户判断节点", desc = "指定商户判断") 21 | public class MerchantJudgeNode extends FiboIfNode { 22 | 23 | @FiboField(name = "商户编码", desc = "商户编码") 24 | private String merchantCodes; 25 | 26 | @Override 27 | public boolean runnerStepIf() { 28 | MarketContext marketContext = this.getContextBean(MarketContext.class); 29 | List返现结果
9 | * 10 | * @author JPX 11 | * @since 2023-01-05 10:56 12 | */ 13 | @Data 14 | public class CashBackVo { 15 | 16 | /**返现金额*/ 17 | private BigDecimal cashBackAmount; 18 | /**返现支付方式 1:红包,2:消费冲抵*/ 19 | private Integer cashbackPayType; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/vo/ResultVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | *营销活动结果
7 | * 8 | * @author JPX 9 | * @since 2023-01-05 10:56 10 | */ 11 | @Data 12 | public class ResultVo { 13 | 14 | /**是否命中*/ 15 | private boolean isHit; 16 | /**返现结果*/ 17 | private CashBackVo cashBack; 18 | /**未命中原因*/ 19 | private String unHitCause; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/java/com/fibo/rule/test/market/vo/TradeVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.market.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | import java.time.LocalDateTime; 7 | import java.util.Date; 8 | 9 | /** 10 | *交易信息
11 | * 12 | * @author JPX 13 | * @since 2023-01-05 11:02 14 | */ 15 | @Data 16 | public class TradeVo { 17 | 18 | /**交易流水号*/ 19 | private String bankTradeCode; 20 | /** 21 | * 持卡人交易类别代码 00:消费,01:取现,10:转出交易,20:退货,21:存款,28:转入交易,29:代付交易,30:余额查询,39:留作将来使用,40:转账交易 22 | */ 23 | private String tradeType; 24 | /**交易金额*/ 25 | private BigDecimal tradeAmount; 26 | /**交易时间*/ 27 | private LocalDateTime localTradeDate; 28 | /**交易时间*/ 29 | private String tradeDate; 30 | /**卡号*/ 31 | private String cardNumber; 32 | /**客户编号*/ 33 | private String customerNumber; 34 | /**商户编号*/ 35 | private String merchantCode; 36 | /**商户名称*/ 37 | private String merchantName; 38 | /**卡片产品名称*/ 39 | private String cardProductName; 40 | /**卡片产品编号*/ 41 | private String cardProductNumber; 42 | /**卡片受理方城市或商户所在城市*/ 43 | private String merchantCityCode; 44 | /**ATM或商户所在国家代码*/ 45 | private String merchantCountryCode; 46 | /**交易地域-省*/ 47 | private String tradePlaceProvince; 48 | /**交易地域-城市*/ 49 | private String tradePlaceCity; 50 | 51 | } 52 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | fiborule.app=38 2 | fiborule.server=localhost:18121 3 | fiborule.scene-list[0].name=market 4 | fiborule.scene-list[0].path=com.fibo.rule.test.market -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/resources/application-test.properties: -------------------------------------------------------------------------------- 1 | fiborule.app=39 2 | fiborule.server=localhost:18121 3 | fiborule.scene-list[0].name=market 4 | fiborule.scene-list[0].path=com.fibo.rule.test.market -------------------------------------------------------------------------------- /fiborule/fiborule-test-market/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8085 2 | 3 | spring.profiles.active=dev -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/FiboRulePayTestApplication.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.scheduling.annotation.EnableAsync; 6 | 7 | @SpringBootApplication 8 | //@EnableAsync 9 | public class FiboRulePayTestApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(FiboRulePayTestApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/context/PayRequest.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay.context; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | import java.time.LocalDate; 7 | 8 | /** 9 | *价格计算结果
10 | * 11 | * @author JPX 12 | * @since 2022/12/14 11:16 13 | */ 14 | @Data 15 | public class PayRequest { 16 | 17 | /** 18 | * 充值金额 19 | */ 20 | private BigDecimal payAmount; 21 | 22 | /** 23 | * 充值时间 24 | */ 25 | private LocalDate payTime; 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/node/MoneyAwardNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay.node; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.fibo.rule.common.enums.FieldTypeEnum; 5 | import com.fibo.rule.core.annotation.FiboBean; 6 | import com.fibo.rule.core.annotation.FiboField; 7 | import com.fibo.rule.core.node.FiboNode; 8 | import com.fibo.rule.test.pay.vo.ResultVo; 9 | import lombok.Data; 10 | 11 | import java.math.BigDecimal; 12 | import java.util.List; 13 | 14 | 15 | @Data 16 | @FiboBean(name = "金额奖励", desc = "金额奖励") 17 | public class MoneyAwardNode extends FiboNode { 18 | 19 | @FiboField(name = "奖励金额", desc = "奖励金额", type = FieldTypeEnum.NUMBER) 20 | private BigDecimal awardMoney; 21 | 22 | @Override 23 | public void runnerStep() { 24 | ResultVo resultVo = this.getContextBean(ResultVo.class); 25 | resultVo.setAwardMoney(awardMoney); 26 | resultVo.setStepDesc("获得金额奖励:" + awardMoney + ";"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/node/PayIfNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay.node; 2 | 3 | import cn.hutool.core.util.ObjectUtil; 4 | import com.fibo.rule.common.enums.FieldTypeEnum; 5 | import com.fibo.rule.core.annotation.FiboBean; 6 | import com.fibo.rule.core.annotation.FiboField; 7 | import com.fibo.rule.core.node.FiboIfNode; 8 | import com.fibo.rule.test.pay.context.PayRequest; 9 | import lombok.Data; 10 | 11 | import java.math.BigDecimal; 12 | import java.time.LocalDate; 13 | import java.util.Date; 14 | 15 | @Data 16 | @FiboBean(name = "是否满足条件", desc = "是否满足条件") 17 | public class PayIfNode extends FiboIfNode { 18 | 19 | @FiboField(name = "充值金额", desc = "充值金额", type = FieldTypeEnum.NUMBER) 20 | private BigDecimal payAmount; 21 | @FiboField(name = "活动开始时间", desc = "活动开始时间", type = FieldTypeEnum.DATE) 22 | private LocalDate beginTime; 23 | @FiboField(name = "活动结束时间", desc = "活动结束时间", type = FieldTypeEnum.DATE) 24 | private LocalDate endTime; 25 | 26 | @Override 27 | public boolean runnerStepIf() { 28 | //获取请求参数 29 | PayRequest payRequest = this.getRequestData(); 30 | if (ObjectUtil.isNotNull(payRequest) && null != payRequest.getPayAmount() && null != payRequest.getPayTime()) { 31 | if (payRequest.getPayAmount().compareTo(payAmount) >= 0 && 32 | payRequest.getPayTime().compareTo(beginTime) >= 0 && 33 | payRequest.getPayTime().compareTo(endTime) <= 0) { 34 | return true; 35 | } 36 | } 37 | return false; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/node/PointsAwardNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay.node; 2 | 3 | import com.fibo.rule.common.enums.FieldTypeEnum; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.annotation.FiboField; 6 | import com.fibo.rule.core.node.FiboNode; 7 | import com.fibo.rule.test.pay.vo.ResultVo; 8 | import lombok.Data; 9 | 10 | import java.math.BigDecimal; 11 | 12 | 13 | @Data 14 | @FiboBean(name = "积分奖励", desc = "积分奖励") 15 | public class PointsAwardNode extends FiboNode { 16 | 17 | @FiboField(name = "积分奖励", desc = "积分奖励", type = FieldTypeEnum.NUMBER) 18 | private BigDecimal awardPoints; 19 | 20 | @Override 21 | public void runnerStep() { 22 | //获取context 23 | ResultVo resultVo = this.getContextBean(ResultVo.class); 24 | resultVo.setAwardPoints(awardPoints); 25 | resultVo.setStepDesc("获得积分奖励:" + awardPoints + ";"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/node/RandomAwardNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay.node; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.annotation.FiboField; 6 | import com.fibo.rule.core.node.FiboNode; 7 | import com.fibo.rule.test.pay.vo.ResultVo; 8 | import lombok.Data; 9 | 10 | import java.math.BigDecimal; 11 | import java.util.List; 12 | 13 | 14 | @Data 15 | @FiboBean(name = "随机奖励", desc = "随机奖励") 16 | public class RandomAwardNode extends FiboNode { 17 | 18 | @FiboField(name = "随机奖励", desc = "随机奖励") 19 | private String randomAward; 20 | 21 | @Override 22 | public void runnerStep() { 23 | //获取context 24 | ResultVo priceContext = this.getContextBean(ResultVo.class); 25 | priceContext.setRandomAward(randomAward); 26 | priceContext.setStepDesc(priceContext.getStepDesc() + "获得随机奖励:" + randomAward + ";"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/java/com/fibo/rule/test/pay/vo/ResultVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.pay.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | import java.math.BigDecimal; 7 | 8 | /** 9 | *折扣信息实体
10 | * 11 | * @author JPX 12 | * @since 2022-12-14 13:27 13 | */ 14 | @Data 15 | @AllArgsConstructor 16 | public class ResultVo { 17 | 18 | /**金额奖励*/ 19 | private BigDecimal awardMoney; 20 | /**积分奖励*/ 21 | private BigDecimal awardPoints; 22 | /**随机奖励*/ 23 | private String randomAward; 24 | /**奖励过程描述*/ 25 | private String stepDesc; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | fiborule.app=3 2 | fiborule.server=localhost:18121 3 | fiborule.scene-list[0].name=test-pay 4 | fiborule.scene-list[0].path=com.fibo.rule.test.pay -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/resources/application-test.properties: -------------------------------------------------------------------------------- 1 | fiborule.app=38 2 | fiborule.server=localhost:18121 3 | fiborule.scene-list[0].name=test-pay 4 | fiborule.scene-list[0].path=com.fibo.rule.test.pay -------------------------------------------------------------------------------- /fiborule/fiborule-test-pay/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8084 2 | 3 | spring.profiles.active=dev -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/JarTestApplication.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.scheduling.annotation.EnableAsync; 6 | 7 | @SpringBootApplication 8 | @EnableAsync 9 | public class JarTestApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(JarTestApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/alltest/context/AllTestContext.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.alltest.context; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 7 | * 8 | * @author JPX 9 | * @since 2022-11-30 10:58 10 | */ 11 | @Data 12 | public class AllTestContext { 13 | 14 | private String a; 15 | private String b; 16 | private String c; 17 | private String d; 18 | private String e; 19 | private String f; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/alltest/node/AllTestA.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.alltest.node; 2 | 3 | import com.fibo.rule.alltest.context.AllTestContext; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.node.FiboNode; 6 | import com.fibo.rule.request.TestRequest; 7 | 8 | /** 9 | * 10 | * 11 | * @author JPX 12 | * @since 2022-11-30 10:45 13 | */ 14 | @FiboBean(name = "AllTestA", desc = "AllTestA") 15 | public class AllTestA extends FiboNode { 16 | @Override 17 | public void runnerStep() { 18 | TestRequest req = this.getRequestData(); 19 | AllTestContext contextBean = this.getContextBean(AllTestContext.class); 20 | contextBean.setA(req.getA()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/alltest/node/AllTestB.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.alltest.node; 2 | 3 | import com.fibo.rule.alltest.context.AllTestContext; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.node.FiboNode; 6 | import com.fibo.rule.request.TestRequest; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * 12 | * @author JPX 13 | * @since 2022-11-30 10:45 14 | */ 15 | @Data 16 | @FiboBean(name = "AllTestB", desc = "AllTestB") 17 | public class AllTestB extends FiboNode { 18 | 19 | @Override 20 | public void runnerStep() { 21 | TestRequest req = this.getRequestData(); 22 | AllTestContext contextBean = this.getContextBean(AllTestContext.class); 23 | contextBean.setB(req.getB()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/alltest/node/AllTestC.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.alltest.node; 2 | 3 | import com.fibo.rule.alltest.context.AllTestContext; 4 | import com.fibo.rule.core.annotation.FiboBean; 5 | import com.fibo.rule.core.node.FiboNode; 6 | import com.fibo.rule.request.TestRequest; 7 | 8 | /** 9 | * 10 | * 11 | * @author JPX 12 | * @since 2022-11-30 10:45 13 | */ 14 | @FiboBean(name = "AllTestC", desc = "AllTestC") 15 | public class AllTestC extends FiboNode { 16 | @Override 17 | public void runnerStep() { 18 | TestRequest req = this.getRequestData(); 19 | AllTestContext contextBean = this.getContextBean(AllTestContext.class); 20 | contextBean.setC(req.getC()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/alltest/node/AllTestD.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.alltest.node; 2 | 3 | import com.fibo.rule.alltest.context.AllTestContext; 4 | import com.fibo.rule.core.node.FiboNode; 5 | import com.fibo.rule.request.TestRequest; 6 | 7 | /** 8 | * 9 | * 10 | * @author JPX 11 | * @since 2022-11-30 10:45 12 | */ 13 | public class AllTestD extends FiboNode { 14 | @Override 15 | public void runnerStep() { 16 | TestRequest req = this.getRequestData(); 17 | AllTestContext contextBean = this.getContextBean(AllTestContext.class); 18 | contextBean.setD(req.getD()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/alltest/node/AllTestE.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.alltest.node; 2 | 3 | import com.fibo.rule.alltest.context.AllTestContext; 4 | import com.fibo.rule.core.node.FiboNode; 5 | import com.fibo.rule.request.TestRequest; 6 | 7 | /** 8 | * 9 | * 10 | * @author JPX 11 | * @since 2022-11-30 10:45 12 | */ 13 | public class AllTestE extends FiboNode { 14 | @Override 15 | public void runnerStep() { 16 | TestRequest req = this.getRequestData(); 17 | AllTestContext contextBean = this.getContextBean(AllTestContext.class); 18 | contextBean.setE(req.getE()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/complex/context/ComplexContext.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.complex.context; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 7 | * 8 | * @author JPX 9 | * @since 2022-12-07 16:22 10 | */ 11 | @Data 12 | public class ComplexContext { 13 | 14 | private String a; 15 | private String c; 16 | private String d; 17 | private String e; 18 | private String f; 19 | private String h; 20 | private String i; 21 | private String j; 22 | private String k; 23 | private String l; 24 | private String m; 25 | private String n; 26 | private String o; 27 | private String p; 28 | private String r; 29 | private String s; 30 | private String t; 31 | private String u; 32 | private String v; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/complex/node/ComplexA.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.complex.node; 2 | 3 | import com.fibo.rule.complex.context.ComplexContext; 4 | import com.fibo.rule.complex.request.ComplexRequest; 5 | import com.fibo.rule.core.node.FiboNode; 6 | 7 | /** 8 | * 9 | * 10 | * @author JPX 11 | * @since 2022-12-07 16:21 12 | */ 13 | public class ComplexA extends FiboNode { 14 | @Override 15 | public void runnerStep() { 16 | ComplexRequest req = this.getRequestData(); 17 | ComplexContext contextBean = this.getContextBean(ComplexContext.class); 18 | contextBean.setA(req.getA()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/complex/node/ComplexC.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.complex.node; 2 | 3 | import com.fibo.rule.complex.context.ComplexContext; 4 | import com.fibo.rule.complex.request.ComplexRequest; 5 | import com.fibo.rule.core.node.FiboNode; 6 | 7 | /** 8 | * 9 | * 10 | * @author JPX 11 | * @since 2022-12-07 16:21 12 | */ 13 | public class ComplexC extends FiboNode { 14 | @Override 15 | public void runnerStep() { 16 | ComplexRequest req = this.getRequestData(); 17 | ComplexContext contextBean = this.getContextBean(ComplexContext.class); 18 | contextBean.setC(req.getC()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/complex/node/ComplexD.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.complex.node; 2 | 3 | import com.fibo.rule.complex.context.ComplexContext; 4 | import com.fibo.rule.complex.request.ComplexRequest; 5 | import com.fibo.rule.core.node.FiboNode; 6 | 7 | /** 8 | * 9 | * 10 | * @author JPX 11 | * @since 2022-12-07 16:21 12 | */ 13 | public class ComplexD extends FiboNode { 14 | @Override 15 | public void runnerStep() { 16 | ComplexRequest req = this.getRequestData(); 17 | ComplexContext contextBean = this.getContextBean(ComplexContext.class); 18 | contextBean.setD(req.getD()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/complex/node/ComplexE.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.complex.node; 2 | 3 | import com.fibo.rule.complex.context.ComplexContext; 4 | import com.fibo.rule.complex.request.ComplexRequest; 5 | import com.fibo.rule.core.node.FiboNode; 6 | 7 | /** 8 | * 9 | * 10 | * @author JPX 11 | * @since 2022-12-07 16:21 12 | */ 13 | public class ComplexE extends FiboNode { 14 | @Override 15 | public void runnerStep() { 16 | ComplexRequest req = this.getRequestData(); 17 | ComplexContext contextBean = this.getContextBean(ComplexContext.class); 18 | contextBean.setE(req.getE()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/complex/node/ComplexF.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.complex.node; 2 | 3 | import com.fibo.rule.complex.context.ComplexContext; 4 | import com.fibo.rule.complex.request.ComplexRequest; 5 | import com.fibo.rule.core.node.FiboNode; 6 | import com.fibo.rule.core.node.FiboSwitchNode; 7 | 8 | import java.util.HashMap; 9 | import java.util.Map; 10 | 11 | /** 12 | * 13 | * 14 | * @author JPX 15 | * @since 2022-12-07 16:21 16 | */ 17 | public class ComplexF extends FiboSwitchNode { 18 | 19 | @Override 20 | public String runnerStepSwitch() { 21 | ComplexRequest req = this.getRequestData(); 22 | ComplexContext contextBean = this.getContextBean(ComplexContext.class); 23 | contextBean.setF(req.getF()); 24 | return req.getF(); 25 | } 26 | 27 | @Override 28 | public Map奖励结果context
10 | * 11 | * @author JPX 12 | * @since 2022-11-22 10:56 13 | */ 14 | @Data 15 | public class RewardContext { 16 | 17 | /**充值金额*/ 18 | private BigDecimal rechargeNum; 19 | /**充值时间*/ 20 | private Date rechargeDate; 21 | /**奖励金额*/ 22 | private BigDecimal rewardMoney; 23 | /**奖励积分*/ 24 | private Integer integral; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/test/node/ContextInitNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.node; 2 | 3 | import com.fibo.rule.core.annotation.FiboBean; 4 | import com.fibo.rule.core.node.FiboNode; 5 | import com.fibo.rule.test.context.RewardContext; 6 | import com.fibo.rule.test.request.RechargeRequestVo; 7 | 8 | /** 9 | *参数初始化节点
10 | * 11 | * @author JPX 12 | * @since 2022-11-18 10:42 13 | */ 14 | @FiboBean(name = "contextInitNode", desc = "参数初始化节点") 15 | public class ContextInitNode extends FiboNode { 16 | 17 | @Override 18 | public void runnerStep() { 19 | RechargeRequestVo req = this.getRequestData(); 20 | RewardContext contextBean = this.getContextBean(RewardContext.class); 21 | contextBean.setRechargeDate(req.getRechargeDate()); 22 | contextBean.setRechargeNum(req.getRechargeNum()); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/test/node/RechargeDateJudgeNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.node; 2 | 3 | import com.fibo.rule.core.annotation.FiboBean; 4 | import com.fibo.rule.core.annotation.FiboField; 5 | import com.fibo.rule.core.node.FiboIfNode; 6 | import com.fibo.rule.test.context.RewardContext; 7 | import lombok.Data; 8 | 9 | import java.math.BigDecimal; 10 | import java.util.Date; 11 | 12 | /** 13 | *充值时间阈值判断
14 | * 15 | * @author JPX 16 | * @since 2022-11-18 10:42 17 | */ 18 | @Data 19 | @FiboBean(name = "rechargeDateJudgeNode", desc = "充值时间判断节点") 20 | public class RechargeDateJudgeNode extends FiboIfNode { 21 | 22 | /**充值时间阈值*/ 23 | @FiboField(name = "beforeDate", desc = "大于等于时间") 24 | private Date beforeDate; 25 | /**充值时间阈值*/ 26 | @FiboField(name = "afterDate", desc = "小于等于时间") 27 | private Date afterDate; 28 | 29 | @Override 30 | public boolean runnerStepIf() { 31 | RewardContext contextBean = this.getContextBean(RewardContext.class); 32 | if(!contextBean.getRechargeDate().before(beforeDate) 33 | && !contextBean.getRechargeDate().after(afterDate)) { 34 | return true; 35 | } else { 36 | return false; 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/test/node/RechargeJudgeNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.node; 2 | 3 | import com.fibo.rule.core.node.FiboIfNode; 4 | import com.fibo.rule.test.context.RewardContext; 5 | import lombok.Data; 6 | 7 | import java.math.BigDecimal; 8 | 9 | /** 10 | *充值阈值判断
11 | * 12 | * @author JPX 13 | * @since 2022-11-18 10:42 14 | */ 15 | @Data 16 | public class RechargeJudgeNode extends FiboIfNode { 17 | 18 | /**充值金额判断阈值*/ 19 | private BigDecimal threshold; 20 | 21 | @Override 22 | public boolean runnerStepIf() { 23 | RewardContext contextBean = this.getContextBean(RewardContext.class); 24 | if(contextBean.getRechargeNum().compareTo(threshold) >= 0) { 25 | return true; 26 | } else { 27 | return false; 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/test/node/RewardIntegralNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.node; 2 | 3 | import com.fibo.rule.core.node.FiboNode; 4 | import com.fibo.rule.test.context.RewardContext; 5 | import lombok.Data; 6 | 7 | /** 8 | *奖励积分节点
9 | * 10 | * @author JPX 11 | * @since 2022-11-18 10:42 12 | */ 13 | @Data 14 | public class RewardIntegralNode extends FiboNode { 15 | 16 | private Integer threshold; 17 | 18 | @Override 19 | public void runnerStep() { 20 | RewardContext contextBean = this.getContextBean(RewardContext.class); 21 | contextBean.setIntegral(threshold); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/test/node/RewardMoneyNode.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.node; 2 | 3 | import com.fibo.rule.core.node.FiboNode; 4 | import com.fibo.rule.test.context.RewardContext; 5 | import lombok.Data; 6 | 7 | import java.math.BigDecimal; 8 | 9 | /** 10 | *奖励余额节点
11 | * 12 | * @author JPX 13 | * @since 2022-11-18 10:42 14 | */ 15 | @Data 16 | public class RewardMoneyNode extends FiboNode { 17 | 18 | private BigDecimal threshold; 19 | 20 | @Override 21 | public void runnerStep() { 22 | RewardContext contextBean = this.getContextBean(RewardContext.class); 23 | contextBean.setRewardMoney(threshold); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/java/com/fibo/rule/test/request/RechargeRequestVo.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.test.request; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | import java.util.Date; 7 | 8 | /** 9 | * 10 | * 11 | * @author JPX 12 | * @since 2022-11-22 11:35 13 | */ 14 | @Data 15 | public class RechargeRequestVo { 16 | 17 | /**充值金额*/ 18 | private BigDecimal rechargeNum; 19 | /**充值时间*/ 20 | private Date rechargeDate; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | fiborule.app=1 2 | fiborule.server=localhost:18121 3 | fiborule.scene-list[0].name=iftest 4 | fiborule.scene-list[0].path=com.fibo.rule.iftest 5 | fiborule.scene-list[1].name=switchtest 6 | fiborule.scene-list[1].path=com.fibo.rule.switchtest 7 | fiborule.scene-list[2].name=alltest 8 | fiborule.scene-list[2].path=com.fibo.rule.alltest 9 | fiborule.scene-list[3].name=complex 10 | fiborule.scene-list[3].path=com.fibo.rule.complex -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/resources/application-test.properties: -------------------------------------------------------------------------------- 1 | fiborule.app=40 2 | fiborule.server=localhost:18121 3 | fiborule.scene-list[0].name=iftest 4 | fiborule.scene-list[0].path=com.fibo.rule.iftest 5 | fiborule.scene-list[1].name=switchtest 6 | fiborule.scene-list[1].path=com.fibo.rule.switchtest 7 | fiborule.scene-list[2].name=alltest 8 | fiborule.scene-list[2].path=com.fibo.rule.alltest 9 | fiborule.scene-list[3].name=complex 10 | fiborule.scene-list[3].path=com.fibo.rule.complex -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8081 2 | 3 | spring.profiles.active=dev -------------------------------------------------------------------------------- /fiborule/fiborule-test/src/test/java/com/fibo/rule/scannerTest/ScannerTest.java: -------------------------------------------------------------------------------- 1 | package com.fibo.rule.scannerTest; 2 | 3 | import com.fibo.rule.core.client.FiboNodeScanner; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.junit4.SpringRunner; 9 | 10 | import java.io.IOException; 11 | import java.util.Set; 12 | 13 | @RunWith(SpringRunner.class) 14 | @SpringBootTest(classes = ScannerTest.class) 15 | @EnableAutoConfiguration 16 | public class ScannerTest { 17 | 18 | @Test 19 | public void test() throws IOException { 20 | Set节点名称:
11 |