感谢于以恒提供本节教程

一、注册规则

1. 在pom.xml文件中添加规则依赖

<dependency>
    <groupId>cn.flyrise</groupId>
    <artifactId>pai-common-rules</artifactId>
    <version>1.7.3</version>
</dependency>

2. 通过实现Rule接口注册规则

/**
 * 注册规则
 */
public class PointRule implements Rule {
    @Override
    public String getProjectName() {
        //返回工程名称
        return "pai-yyh-park";
    }

    @Override
    public String getRuleName() {
        //返回规则名称
        return "积分规则";
    }
}

3. 创建数据源

package cn.flyrise.pai.yyhpark.model.vo;

import cn.flyrise.common.rules.annotation.RuleModel;
import cn.flyrise.pai.yyhpark.rule.PointRule;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

/**
 * 积分规则决策数据源
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@RuleModel(rules = {PointRule.class}, desc = "积分明细信息")
public class PointRuleVO implements Serializable {
    @ApiModelProperty("当天是否第一次签到 0:不是 1:是")
    private Integer dayFirstSignScope;
    @ApiModelProperty("连续签到天数")
    private Integer continuousSignDays;
    @ApiModelProperty("连续签到得分")
    private Integer continuousSignPoints;
    @ApiModelProperty("每天签到得分")
    private Integer dayFirstSignPoint;
    @ApiModelProperty("目前签到总分")
    private Integer totalPoint;
}

4. 启动项目

启动项目控制台提示以下内容表示规则注册成功
15:10:38.342 [main] INFO  c.f.c.r.c.RuleRegister -
 [afterSingletonsInstantiated,51] - >>>>>>>>>>> 规则注册成功,共发现1个规则

5. 规则管理

登陆开发者平台进入应用套件->>我的套件->>规则管理

6. 查看规则和数据源

二、配置规则

1. 规则记录列表

2. 添加规则

3. 添加条件

  • 添加条件

  • 条件配置

  • 添加事件-赋值

  • 赋值1

  • 赋值2

  • 配置好的条件

  • 规则调试

  • 保存条件

三、代码调用

代码执行规则

package cn.flyrise.pai.yyhpark.rule;

import cn.flyrise.common.core.domain.Reply;
import cn.flyrise.common.rules.service.RuleService;
import cn.flyrise.common.rules.vo.business.BusinessRuleVO;
import cn.flyrise.pai.yyhpark.model.vo.PointRuleVO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@Api(tags = "规则测试controller")
@RestController
@RequestMapping("ruleTest")
public class PointRuleTestController {

    @Resource
    private RuleService ruleService;


    @ApiOperation("规则测试")
    @PostMapping("/test")
    public Reply test() {
        PointRuleVO ruleVO = new PointRuleVO();
        ruleVO.setTotalPoint(1);
        ruleVO.setContinuousSignDays(7);
        ruleVO.setDayFirstSignPoint(0);
        ruleVO.setContinuousSignPoints(0);
        ruleVO.setDayFirstSignScope(1);

        //执行规则得到返回值
        //套件是入驻企业安装时使用这个接口
        //Reply<BusinessRuleVO> reply = ruleService.execute(new TestRule(), userInfoVO);
        //执行规则得到返回值
        //套件是运营企业安装时使用这个接口,parkId前端切换园区产生
        Reply<BusinessRuleVO> reply =
                ruleService.execute(new PointRule(), null, ruleVO);
        if (reply.isSuccess()) {
            //继续业务逻辑
            BusinessRuleVO businessRuleVO = reply.getData();
            JSONObject jsonObject = businessRuleVO.getObjectMap().get(ruleVO.getClass().getSimpleName());
            ruleVO = JSONObject.toJavaObject(jsonObject, PointRuleVO.class);
            System.out.println(JSON.toJSONString(ruleVO));
        } else {
            //异常处理
        }
        return reply;
    }


}

四、支持函数

1. 字符串函数

(1)charAt函数:返回字符串中指定的某个字符。
(2)indexOf函数:返回字符串中第一个查找到的下标index,从左边开始查找。
(3)lastIndexOf函数:返回字符串中第一个查找到的下标index,从右边开始查找。
(4)length函数:返回字符串的长度。(不用带括号)
(5)substr函数:返回字符串从指定位置开始,截取几个字符。
(6)substring函数:返回字符串中指定的几个字符。
(7)trim函数:清除字符串中的空格。
(8)toLowerCase函数:将字符串转换为小写。
(9)toUpperCase函数:将字符串转换为大写。
(10)endsWith函数:返回字符串是否以某段结尾。
(11)contains函数:返回字符串是否包含某段。

实现方式:利用java脚本引擎ScriptEngineManager,执行js内置的字符串函数
使用方式:编辑器输入字符串类型的值.会弹出提示

2. 日期函数

(1)getDate函数:返回日期的“日”部分,值为1~31
(2)getDay函数:返回星期几,值为0~6,其中0表示星期日,1表示星期一,…,6表示星期六
(3)getHours函数:返回日期的“小时”部分,值为0~23。
(4)getMinutes函数:返回日期的“分钟”部分,值为0~59。
(5)getMonth函数:返回日期的“月”部分,值为0~11。其中0表示1月,2表示3月,…,11表示12月。
(6)getSeconds函数:返回日期的“秒”部分,值为0~59。
(7)getTime函数:返回系统时间。
(8)getTimezoneOffset函数:返回此地区的时差(当地时间与GMT格林威治标准时间的地区时差),单位为分钟。
(9)getYear函数:返回日期的“年”部分。返回值以1900年为基数,例如1999年为99。
(10)parse函数:返回从1970年1月1日零时整算起的毫秒数(当地时间)。
(11)setDate函数:设定日期的“日”部分,值为0~31。
(12)setHours函数:设定日期的“小时”部分,值为0~23。
(13)setMinutes函数:设定日期的“分钟”部分,值为0~59。
(14)setMonth函数:设定日期的“月”部分,值为0~11。其中0表示1月,…,11表示12月。
(15)setSeconds函数:设定日期的“秒”部分,值为0~59。
(16)setTime函数:设定时间。时间数值为1970年1月1日零时整算起的毫秒数。
(17)setYear函数:设定日期的“年”部分。
(18)toGMTString函数:转换日期成为字符串,为GMT格林威治标准时间。

实现方式:利用java脚本引擎ScriptEngineManager,执行js内置的日期函数
使用方式:编辑器输入日期类型的值.会弹出提示

3. 数学函数

(1)abs函数:即Math.abs(以下同),返回一个数字的绝对值。
(2)acos函数:返回一个数字的反余弦值,结果为0~π弧度(radians)。
(3)asin函数:返回一个数字的反正弦值,结果为-π/2~π/2弧度。
(4)atan函数:返回一个数字的反正切值,结果为-π/2~π/2弧度。
(5)atan2函数:返回一个坐标的极坐标角度值。
(6)ceil函数:返回一个数字的最小整数值(大于或等于)。
(7)cos函数:返回一个数字的余弦值,结果为-11。
(8)exp函数:返回e(自然对数)的乘方值。
(9)floor函数:返回一个数字的最大整数值(小于或等于)。
(10)log函数:自然对数函数,返回一个数字的自然对数(e)值。
(11)max函数:返回两个数的最大值。
(12)min函数:返回两个数的最小值。
(13)pow函数:返回一个数字的乘方值。
(14)random函数:返回一个01的随机数值。
(15)round函数:返回一个数字的四舍五入值,类型是整数。
(16)sin函数:返回一个数字的正弦值,结果为-11。
(17)sqrt函数:返回一个数字的平方根值。
(18)tan函数:返回一个数字的正切值。

实现方式:利用java脚本引擎ScriptEngineManager,执行js内置的数学函数
使用方式:编辑器输入Math.会弹出提示

4. 数组或集合函数

(1)join函数:转换并连接数组中的所有元素为一个字符串。
(2)length函数:数组的长度(不用带括号)。
(3)[index]:根据数组小标index获取元素。
(4)sort函数:将数组元素从小到大排序。
(5)includes函数:判断数组是否包含某元素

实现方式:利用java脚本引擎ScriptEngineManager,执行js内置的数组函数
使用方式:编辑器数组或集合类型的值.会弹出提示

5. 自定义统计函数

(1) max函数

返回给定数组或数组元素某属性的最大值。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计最小值的数组 Array元素类型的可以是整型、浮点、时间、字符串、布尔和对象类型,当元素是对象类型时需指定key
key 字符串 对象类型元素的属性 Array元素是对象类型时必须,且该属性的类型是整型、浮点、时间、字符串、布尔。

(2) min函数

返回给定数组或数组元素某属性的最小值。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计最小值的数组 Array元素类型的可以是整型、浮点、时间、字符串、布尔和对象类型,当元素是对象类型时需指定key
key 字符串 对象类型元素的属性 Array元素是对象类型时必须,且该属性的类型是整型、浮点、时间、字符串、布尔。

(3) sum函数

返回给定数组或数组元素某属性的和值。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计和值的数组 Array元素类型的可以是整型、浮点和对象类型,当元素是对象类型时需指定key
key 字符串 对象类型元素的属性 Array元素是对象类型时必须,且该属性的类型是整型、浮点。

(4) average函数

返回给定数组或数组元素某属性的平均值(保留两位小数浮点型)。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计平均值的数组 Array元素类型的可以是整型、浮点和对象类型,当元素是对象类型时需指定key
key 字符串 对象类型元素的属性 Array元素是对象类型时必须,且该属性的类型是整型、浮点。

(5) median函数

返回给定数组的中值(保留两位小数浮点型)。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计中值的数组 Array元素类型的可以是整型、浮点类型

(6) rank函数

返回一个数值在给数组中的排位(小的排在前面)。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计排名的数组 Array元素类型的可以是整型、浮点、时间、字符串、布尔类型
value 同Array元素类型 统计排名的值

(7) avedev函数

返回给定数组的平均绝对误差值(保留两位小数浮点型)。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计平均绝对误差值的数组 Array元素类型的可以是整型、浮点类型

(8) frequency函数

返回给定数组中出现次数最多的值。

请求参数

名称 类型 描述 是否必需 备注
array Array<> 统计出现次数最多值的数组 Array元素类型的可以是整型、浮点、时间、字符串、布尔类型

实现方式:编写自定义的函数,利用java脚本引擎ScriptEngineManager执行
使用方式:编辑器输入Statistic.会弹出提示

文档更新时间: 2023-02-28 11:29   作者:欧阳少海