feat(shopro_huifu): 支持汇付分账配置rule_origin双模式

支持汇付分账配置的两种模式:
- rule_origin=01:接口发起模式,不带接收方列表,接收方在confirm时指定
- rule_origin=02:控台配置模式,需带acct_split_bunch_list固定接收方

更新SyncSplitReceivers命令支持--rule-origin选项,调整分账配置提交逻辑,
新增配置项split_config_rule_origin默认为01模式,并完善相关文档说明

BREAKING CHANGE: 分账配置流程调整,需重新配置相关参数
```
这个提交包含在:
可乐加冰
2026-10-13 10:35:02 +08:00
父节点 161d6f7e90
当前提交 b66b74b4f2
共有 4 个文件被更改,包括 97 次插入 和 38 次删除

查看文件

@@ -16,10 +16,11 @@ class SyncSplitReceivers extends Command
{
$this->setName('shopro_huifu:sync-split-receivers')
->addOption('dry-run', null, Option::VALUE_NONE, '仅预览将提交的接收方与参数,不调汇付')
->addOption('init-only', null, Option::VALUE_NONE, '仅提交主商户分账开关(rule_origin=01),不带接收方列表')
->addOption('init-only', null, Option::VALUE_NONE, '同默认:仅提交 split/config,不带 acct_split_bunch_list')
->addOption('rule-origin', null, Option::VALUE_OPTIONAL, '01=接口发起(默认) 02=控台配置且提交接收方列表')
->addOption('huifu-id', null, Option::VALUE_OPTIONAL, '主商户汇付号,默认 platform_huifu_id 或插件 huifu_id')
->addOption('scene', null, Option::VALUE_OPTIONAL, '分账模式 scene,默认插件 split_config_scene(A5)')
->setDescription('Submit v2/merchant/split/config and bind approved onboard huifu_ids as split receivers');
->setDescription('Submit v2/merchant/split/config (01=open split; 02=with receiver list)');
}
protected function execute(Input $input, Output $output)
@@ -40,24 +41,35 @@ class SyncSplitReceivers extends Command
$scene = $sceneOpt !== '' ? $sceneOpt : $service->resolveSplitConfigScene();
$output->writeln('scene(分账模式): ' . $scene);
$ruleOriginOpt = trim((string) $input->getOption('rule-origin'));
$ruleOrigin = $ruleOriginOpt !== '' ? $ruleOriginOpt : $service->resolveRuleOrigin([]);
$output->writeln('rule_origin: ' . $ruleOrigin . ($ruleOrigin === '01' ? '(接口发起,confirm 传 acct_split_bunch)' : '(控台配置,须带接收方列表)'));
$dryRun = (bool) $input->getOption('dry-run');
$initOnly = (bool) $input->getOption('init-only');
$options = [
'dry_run' => $dryRun,
'main_huifu_id' => $main,
'scene' => $scene,
'rule_origin' => $ruleOrigin,
];
if ($initOnly) {
$output->writeln('模式: init-only(不带 acct_split_bunch_list)');
$result = $service->submitSplitConfig([], $options);
if ($initOnly || $ruleOrigin === '01') {
$output->writeln('模式: 提交分账配置(rule_origin=01 不传 acct_split_bunch_list)');
if ($ruleOrigin === '01') {
$result = $service->syncAllApprovedReceivers($options);
} else {
$result = $service->submitSplitConfig([], $options);
}
} else {
$output->writeln('模式: 全量(远端已绑 + 本地已进件 approved)');
$output->writeln('模式: rule_origin=02,合并远端+本地进件后提交接收方列表');
$result = $service->syncAllApprovedReceivers($options);
}
if (!empty($result['dry_run'])) {
$output->writeln('[DRY-RUN] 将提交接收方 ' . count($result['receivers'] ?? []) . ' 个');
$localCount = count($result['receivers'] ?? []);
$output->writeln('[DRY-RUN] 本地/合并进件 huifu_id 共 ' . $localCount . ' 个'
. ($ruleOrigin === '01' ? '(01 模式不会写入 split/config 请求体)' : ''));
$output->writeln(json_encode($result['data'] ?? [], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
return 0;
}
@@ -66,9 +78,12 @@ class SyncSplitReceivers extends Command
if (isset($result['resp_code'])) {
$output->writeln('resp_code: ' . $result['resp_code']);
}
if (isset($result['submitted'])) {
$output->writeln('提交接收方数量: ' . $result['submitted']
if (isset($result['submitted']) && ($result['rule_origin'] ?? $ruleOrigin) === '02') {
$output->writeln('split/config 提交接收方: ' . $result['submitted']
. '(远端已有 ' . ($result['remote'] ?? 0) . ',本地进件 ' . ($result['local'] ?? 0) . ')');
} elseif (!empty($result['receivers'])) {
$output->writeln('本地已进件子户(confirm 时作为 acct_split_bunch 接收方,非 split/config 明细): '
. count($result['receivers']));
}
if (!empty($result['receivers'])) {
foreach ($result['receivers'] as $hid) {