账户规则计算模型
- 规则算子
规则算子目前有5种:
FIXED(固定档位,不关心传入的金额是多少,比如充值了100块,fixed设定了200积分,那么只送200积分);
FIXED_OVER(固定赠送档位,不关心传入的金额是多少,比如充值了100块,fixed_overlay设定了20积分,那么只送20积分);
MANUAL(人工调整,不关心金额,只关心本次调整的虚拟资产)
EXCHANGE(为金钱的比例,与传入的值有关)
MULTIPLE(倍率,与余额相关,是有子节点的计算产生的)
- 数据结构
说明:采用json格式,递归查找,深度优先计算
MANUAL在最上层节点,MANUAL没有子节点,不参与父节点计算
EXCHANGE没有子节点,因为只和传入的金额相关,可以参与父节点计算
FIXED没有子节点,自身要么是最上层节点,自身要么是最深度节点,可以参与父节点计算
MULTIPLE必须拥子节点,自身不能成为最深度节点,可以参与父节点计算,但是该节点只膨胀子节点增值的部分,子节点送了100积分,比如该节点膨胀1倍,那么只计算增值的部分100积分
1.可以同一层级的有MANUAL,EXCHANGE,FIXED,样例:新华充值200块,固定200虚拟币,赠送2块,按照比率计算2000.2=40,人工调整500,总共200+2+40+500=742
{
"ruleNodes":[{
"ruleName":"新华充值",
"ruleDes":"新华苹果充值赠送",
"ruleType":"FIXED_OVERLAY",
"ruleDefin":"2",
"duration":"P1Y"
},
{
"ruleName":"新华充值",
"ruleDes":"新华苹果基础充值",
"ruleType":"FIXED",
"ruleDefin":"200",
"duration":"P1Y"
},
{
"ruleName":"新华充值",
"ruleDes":"金钱比率兑换",
"ruleType":"EXCHANGE",
"ruleDefin":"2000",//单位:万分之
"duration":"P1Y"
},
{
"ruleName":"新华充值",
"ruleDes":"人工调整",
"ruleType":"MANUAL",
"ruleDefin":"500
"duration":"P1Y"
}
]
}
2.MULTIPLE必须有子节点,子节点计算的余额才可以翻倍,例如新华充值200块虚拟币,最深层节点:固定兑换200,比率计算2000.2=40,人工调整不参与任何节点的计算人工调整50,父节点的计算(200+40)*0.1=24,
总金额就是50+24+40+200=314
{
"ruleNodes":[
{
"ruleName":"新华充值",
"ruleDes":"新华苹果充值赠送",
"ruleType":"MULTIPLE",
"ruleDefin":"1000", //单位万分之
"duration":"P1Y",
"ruleNodes":[
{
"ruleName":"新华充值",
"ruleDes":"新华苹果基础充值",
"ruleType":"FIXED",
"ruleDefin":"200",
"duration":"P1Y"
},
{
"ruleName":"新华充值",
"ruleDes":"金钱比率兑换",
"ruleType":"EXCHANGE",
"ruleDefin":"2000",//单位:万分之
"duration":"P1Y"
}]
},
{
"ruleName":"新华充值",
"ruleDes":"人工调整",
"ruleType":"MANUAL",
"ruleDefin":"50",
"duration":"P1Y"
}]
}
-
流程
文章图片
image -
sequece diagram
文章图片
image - 规则节点json参数
|
参数名称
|
描述
|
类型
|
|
ruleName
|
规则算子名称
|
string
|
|
ruleDes
|
规则描述
|
string
|
|
ruleType
|
规则算子类型
|
string
|
|
ruleDefin
|
规则算子计算参数
|
number
|
|
ruleNode
|
子节点
|
object
|
6. 运行期参数calucateContext
|
参数名称
|
描述
|
类型
|
|
currentNodeCalFee
|
当前节点计算资产金额
|
Number
|
|
childNodeSumFee
|
子节点传输过来参与当前节点计算的金额
|
Number
|
|
nodeLevel
|
当前节点层级
|
【账户规则计算模型】Number
|
|
calculater
|
算子
|
对象
|
|
outputContent
|
需要输出生成明细的参数
|
对象
|
|
parentCalucateContext
|
父节点的运行期参数,通过递归获取,根节点没有父节点的运行期参数
|
对象
|
|
inputContent
|
入参
|
对象
|
7. 计算原则
从高层级到低层级获取计算因子;8.规则样本
计算时深度优先,根据层级(nodeLevel)将运行期参数分组,最先计算的是深度最大的node,calucateContext记录了父节点的运行期参数,以原子的方式累加childNodeSumFee
{"ruleNodes":[
{
"ruleName":"新华充值","ruleDes":"新华苹果充值赠送","ruleType":"FIXED_OVERLAY","ruleDefin":"200","duration":"P1Y"
},
{
"ruleName":"新华充值","ruleDes":"新华苹果基础充值","ruleType":"FIXED","ruleDefin":"20000","duration":"P1Y"
},
{
"ruleName":"新华充值","ruleDes":"金钱比率兑换","ruleType":"EXCHANGE","ruleDefin":"2000","duration":"P1Y"
},
{
"ruleName":"新华充值","ruleDes":"人工调整","ruleType":"MANUAL","ruleDefin":"500","duration":"P1Y"
}
]}
推荐阅读
- 难道你仅会钻规则的漏洞吗()
- 使用协程爬取网页,计算网页数据大小
- ACSL|ACSL 美国计算机科学联赛 2016-2017 R4 摩天大楼-Skyscraper 题解
- 首屏时间,你说你优化了,那你倒是计算出给给我看啊!
- 亲情账户开通第一百四十三天
- SwiftUI|SwiftUI iOS 瀑布流组件之仿CollectionView不规则图文混合(教程含源码)
- ATAN2根据xy坐标计算角度
- 历史上的今天|【历史上的今天】2 月 16 日(世界上第一个 BBS 诞生;中国计算机教育开端;IBM 机器人赢得智能竞赛)
- 整理大部分Eslint规则
- 计算机网络基础TCP\HTTP\HTTPS