×

一个基于 PHP 开发的灵活及可扩展的交易/利润分账组件

独孤求败 独孤求败 发表于2026-09-03 12:39:08 浏览12 评论0

抢沙发发表评论

一个 灵活、可扩展 的交易/利润分账组件。内置百分比、固定金额、阶梯与递归分账策略,并支持注册 自定义策略

适用于多级分润、电商结算、平台佣金、代理分账等业务场景。

项目地址: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): array
SplitContext
分账上下文,包含totalparticipants
Allocation
分账结果对象,包含nameamountratio,提供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

该脚本演示了四种内置策略的用法。


💡 制作初衷

这个组件诞生于我在做多层分润逻辑时被各种“写死”的分账规则折磨的经历。我希望能有一个结构清晰、可插拔、可复用的分账组件,能在任何项目中快速接入,而不是再去重复造轮子。

感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。



群贤毕至

访客