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)') ->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)' : '(控台配置,须带接收方列表)')); $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 || $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); } 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; } }