一个 灵活、可扩展 的交易/利润分账组件。内置百分比、固定金额、阶梯与递归分账策略,并支持注册 自定义策略。
适用于多级分润、电商结算、平台佣金、代理分账等业务场景。
项目地址:https://github.com/zxc7563598/php-trade-splitter
✨ 特性
🔧 多策略支持:内置 4 种常见分账方式 🧩 可扩展设计:支持自定义策略注册 ⚡ 简单易用:一个静态方法即可完成分账 🧠 清晰结构:使用面向对象与策略模式实现
📦 安装
composer require hejunjie/trade-splitter
🚀 快速开始
<?phprequire__DIR__ . '/vendor/autoload.php';use Hejunjie\TradeSplitter\Splitter;// 百分比分账(比例之和必须为 1.0)$allocations = Splitter::split(1000, [ ['name' => '平台', 'rate' => 0.1], ['name' => '作者', 'rate' => 0.9],], 'percentage');// 转换为数组查看结果$result = array_map(fn($a) => $a->toArray(), $allocations);print_r($result);
输出示例:
Array( [0] => Array ( [name] => 平台 [amount] => 100 [ratio] => 0.1 ) [1] => Array ( [name] => 作者 [amount] => 900 [ratio] => 0.9 ))
🧩 核心概念
Splitter StrategyInterface split(SplitContext $context): arraySplitContext total与participantsAllocation name、amount、ratio,提供toArray()方法
🧮 内置策略
百分比分账 percentage
按比例分配金额。比例之和必须等于 1.0。
$result = Splitter::split(1000, [ ['name' => '平台', 'rate' => 0.1], ['name' => '作者', 'rate' => 0.9],], 'percentage');echo json_encode(array_map(fn($r) => $r->toArray(), $result), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;// 输出:// [// {// "name": "平台",// "amount": 100,// "ratio": 0.1// },// {// "name": "作者",// "amount": 900,// "ratio": 0.9// }// ]固定金额分账 fixed
按固定金额分账,所有固定金额之和不得超过总额。
$result = Splitter::split(3000, [ ['name' => '代理A', 'amount' => 200], ['name' => '代理B', 'amount' => 300],], 'fixed');echo json_encode(array_map(fn($r) => $r->toArray(), $result), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;// 输出:// [// {// "name": "代理A",// "amount": 200,// "ratio": 0.0667// },// {// "name": "代理B",// "amount": 300,// "ratio": 0.1// }// ]阶梯分账 ladder
根据金额区间采用不同分成比例,null 为无上限
$result = Splitter::split(5000, [ [ 'name' => '代理A', 'ladders' => [ ['max' => 1000, 'rate' => 0.05], ['max' => 5000, 'rate' => 0.10], ['max' => null, 'rate' => 0.15], ], ], [ 'name' => '平台', 'rate' => 0.05, ],], 'ladder');echo json_encode(array_map(fn($r) => $r->toArray(), $result), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;// 输出:// [// {// "name": "代理A",// "amount": 500,// "ratio": 0.1// },// {// "name": "平台",// "amount": 250,// "ratio": 0.05// }// ]递归分账 recursive
每一层的收益基于上一层金额计算,适用于多级代理或渠道分润。
$result = Splitter::split(10000, [ ['name' => '一级', 'rate' => 0.2], ['name' => '二级', 'rate' => 0.2], ['name' => '三级', 'rate' => 0.2],], 'recursive');echo json_encode(array_map(fn($r) => $r->toArray(), $result), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;// 输出:// [// {// "name": "一级",// "amount": 1600,// "ratio": 0.2// },// {// "name": "二级",// "amount": 320,// "ratio": 0.2// },// {// "name": "三级",// "amount": 80,// "ratio": 0.2// }// ]🧠 自定义策略
实现 Hejunjie\TradeSplitter\Contracts\StrategyInterface 并注册:
use Hejunjie\TradeSplitter\Contracts\StrategyInterface;use Hejunjie\TradeSplitter\Models\SplitContext;use Hejunjie\TradeSplitter\Models\Allocation;use Hejunjie\TradeSplitter\Splitter;class MyStrategy implements StrategyInterface{ publicfunction split(SplitContext $context): array { // 自定义分账逻辑 // total: $context->total // participants: $context->participants return [ new Allocation('someone', $context->total, 1.0) ]; }}Splitter::registerStrategy('my_strategy', MyStrategy::class);// 调用$total = 1000;$participants = [];$result = Splitter::split($total, $participants, 'my_strategy');🧪 运行示例
仓库内提供演示脚本:
php tests/demo.php
该脚本演示了四种内置策略的用法。
💡 制作初衷
这个组件诞生于我在做多层分润逻辑时被各种“写死”的分账规则折磨的经历。我希望能有一个结构清晰、可插拔、可复用的分账组件,能在任何项目中快速接入,而不是再去重复造轮子。
感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。