feat(shopro_huifu): 新增分账配置依赖检查命令并完善online_busi_type支持 - 新增ProbeSplitConfigDeps命令用于检查split/config提交前的依赖项 (online_busi_type、运营媒介等) - 在SyncSplitReceivers命令中添加--online-busi-type选项 - 更新QuerySplitConfig显示online_busi_type信息并调整后续步骤提示 - 完善HuifuMerchantSplitService中的online_busi_type解析逻辑 - 添加extended_material_list配置支持 - 在数据库升级脚本中增加新的配置项 ```
120 行
5.7 KiB
PHP
120 行
5.7 KiB
PHP
<?php
|
||
|
||
namespace addons\shopro_huifu\command;
|
||
|
||
use addons\shopro_huifu\library\Bridge;
|
||
use addons\shopro_huifu\library\HuifuClient;
|
||
use addons\shopro_huifu\library\split\HuifuMerchantSplitService;
|
||
use think\console\Command;
|
||
use think\console\Input;
|
||
use think\console\input\Option;
|
||
use think\console\Output;
|
||
|
||
class SyncSplitReceivers extends Command
|
||
{
|
||
protected function configure()
|
||
{
|
||
$this->setName('shopro_huifu:sync-split-receivers')
|
||
->addOption('dry-run', null, Option::VALUE_NONE, '仅预览将提交的接收方与参数,不调汇付')
|
||
->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)')
|
||
->addOption('online-busi-type', null, Option::VALUE_OPTIONAL, '线上业务类型编码 online_busi_type(40%分账必填)')
|
||
->setDescription('Submit v2/merchant/split/config (01=open split; 02=with receiver list)');
|
||
}
|
||
|
||
protected function execute(Input $input, Output $output)
|
||
{
|
||
if (!Bridge::isEnabled()) {
|
||
$output->writeln('[FAIL] 汇付插件未启用');
|
||
return 1;
|
||
}
|
||
|
||
$service = new HuifuMerchantSplitService();
|
||
$main = trim((string) $input->getOption('huifu-id'));
|
||
if ($main === '') {
|
||
$main = $service->resolveMainHuifuId();
|
||
}
|
||
$output->writeln('主商户 huifu_id: ' . $main);
|
||
$output->writeln('apply_ratio(最大分账比例%): ' . $service->resolveApplyRatio());
|
||
$sceneOpt = trim((string) $input->getOption('scene'));
|
||
$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)' : '(控台配置,须带接收方列表)'));
|
||
$onlineBusiOpt = trim((string) $input->getOption('online-busi-type'));
|
||
$onlineBusiType = $onlineBusiOpt !== ''
|
||
? $onlineBusiOpt
|
||
: $service->resolveOnlineBusiType(['main_huifu_id' => $main], $main);
|
||
$output->writeln('online_busi_type: ' . ($onlineBusiType !== '' ? $onlineBusiType : '(未配置,40%分账将失败)'));
|
||
|
||
$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,
|
||
'online_busi_type' => $onlineBusiType !== '' ? $onlineBusiType : null,
|
||
];
|
||
if ($onlineBusiType === '') {
|
||
unset($options['online_busi_type']);
|
||
}
|
||
|
||
try {
|
||
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('模式: rule_origin=02,合并远端+本地进件后提交接收方列表');
|
||
$result = $service->syncAllApprovedReceivers($options);
|
||
}
|
||
} catch (\InvalidArgumentException $e) {
|
||
$output->writeln('[FAIL] ' . $e->getMessage());
|
||
return 1;
|
||
}
|
||
|
||
if (!empty($result['dry_run'])) {
|
||
$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;
|
||
}
|
||
|
||
$output->writeln('resp: ' . ($result['message'] ?? ''));
|
||
if (isset($result['resp_code'])) {
|
||
$output->writeln('resp_code: ' . $result['resp_code']);
|
||
}
|
||
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) {
|
||
$output->writeln(' - ' . $hid);
|
||
}
|
||
}
|
||
|
||
if (empty($result['ok'])) {
|
||
$output->writeln('[FAIL] 提交未成功,请查看日志 [shopro_huifu] split/config');
|
||
return 1;
|
||
}
|
||
|
||
$output->writeln('');
|
||
$output->writeln('下一步: php think shopro_huifu:query-split-config --huifu-id=' . $main);
|
||
$output->writeln('(配置若走异步审核,需等待生效后再测 delaytrans/confirm)');
|
||
return 0;
|
||
}
|
||
}
|