feat(shopro_huifu): 添加分账媒体文件上传命令并优化分账配置流程 - 新增 UploadSplitMedia 命令用于上传小程序运营媒介截图到汇付 - 在 SyncSplitReceivers 中添加异常处理和更清晰的日志输出 - 优化 HuifuMerchantSplitService 中的分账配置逻辑 - 当分账比例>20%时自动验证并上传运营媒介材料 - 添加相关配置项到数据库升级脚本 - 注册新命令到应用命令列表 ```
121 行
4.9 KiB
PHP
121 行
4.9 KiB
PHP
<?php
|
||
|
||
namespace addons\shopro_huifu\command;
|
||
|
||
use addons\shopro_huifu\library\Bridge;
|
||
use addons\shopro_huifu\library\HuifuConfig;
|
||
use addons\shopro_huifu\library\onboard\HuifuOnboardPicture;
|
||
use think\console\Command;
|
||
use think\console\Input;
|
||
use think\console\input\Option;
|
||
use think\console\Output;
|
||
use think\Db;
|
||
|
||
/**
|
||
* 上传小程序运营媒介截图到汇付,生成 split/config 所需的 online_media_info_list JSON
|
||
*/
|
||
class UploadSplitMedia extends Command
|
||
{
|
||
protected function configure()
|
||
{
|
||
$this->setName('shopro_huifu:upload-split-media')
|
||
->addOption('home-url', null, Option::VALUE_REQUIRED, '首页截图 HTTPS 地址')
|
||
->addOption('goods-url', null, Option::VALUE_REQUIRED, '商品/服务明细页截图')
|
||
->addOption('order-url', null, Option::VALUE_REQUIRED, '下单场景页截图')
|
||
->addOption('pay-url', null, Option::VALUE_REQUIRED, '支付页截图')
|
||
->addOption('media-name', null, Option::VALUE_OPTIONAL, '小程序名称,默认 雄戈小酒')
|
||
->addOption('media-type', null, Option::VALUE_OPTIONAL, '运营媒介类型,小程序默认 S3')
|
||
->addOption('file-type', null, Option::VALUE_OPTIONAL, '汇付图片上传 file_type,默认 F24')
|
||
->addOption('save-config', null, Option::VALUE_NONE, '写入 shopro_huifu_config.split_config_online_media_json')
|
||
->setDescription('Upload miniprogram media screenshots for split/config (apply_ratio>20%)');
|
||
}
|
||
|
||
protected function execute(Input $input, Output $output)
|
||
{
|
||
if (!Bridge::isEnabled()) {
|
||
$output->writeln('[FAIL] 汇付插件未启用');
|
||
return 1;
|
||
}
|
||
|
||
$urls = [
|
||
'media_front_page' => trim((string) $input->getOption('home-url')),
|
||
'media_service_page' => trim((string) $input->getOption('goods-url')),
|
||
'media_order_page' => trim((string) $input->getOption('order-url')),
|
||
'media_pay_page' => trim((string) $input->getOption('pay-url')),
|
||
];
|
||
$labels = [
|
||
'media_front_page' => 'home-url',
|
||
'media_service_page' => 'goods-url',
|
||
'media_order_page' => 'order-url',
|
||
'media_pay_page' => 'pay-url',
|
||
];
|
||
foreach ($urls as $key => $url) {
|
||
if ($url === '') {
|
||
$output->writeln('[FAIL] 缺少 --' . $labels[$key]);
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
$fileType = trim((string) $input->getOption('file-type'));
|
||
if ($fileType === '') {
|
||
$fileType = 'F24';
|
||
}
|
||
$mediaName = trim((string) $input->getOption('media-name'));
|
||
if ($mediaName === '') {
|
||
$mediaName = '雄戈小酒';
|
||
}
|
||
$mediaType = trim((string) $input->getOption('media-type'));
|
||
if ($mediaType === '') {
|
||
$mediaType = 'S3';
|
||
}
|
||
|
||
$picture = new HuifuOnboardPicture();
|
||
$fileIds = [];
|
||
foreach ($urls as $field => $url) {
|
||
$output->writeln('上传 ' . $field . ' ...');
|
||
$fileIds[$field] = $picture->uploadByUrl($fileType, $url);
|
||
$output->writeln(' file_id: ' . $fileIds[$field]);
|
||
}
|
||
|
||
$item = [
|
||
'media_type' => $mediaType,
|
||
'media_name' => $mediaName,
|
||
'media_mer_common_flag' => 'Y',
|
||
'media_front_page' => $fileIds['media_front_page'],
|
||
'media_service_page' => $fileIds['media_service_page'],
|
||
'media_order_page' => $fileIds['media_order_page'],
|
||
'media_pay_page' => $fileIds['media_pay_page'],
|
||
];
|
||
$appId = trim((string) Bridge::getMiniProgramAppId());
|
||
if ($appId !== '') {
|
||
$item['app_id'] = $appId;
|
||
}
|
||
|
||
$json = json_encode([$item], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||
$output->writeln('');
|
||
$output->writeln('split_config_online_media_json(可复制到 fa_shopro_huifu_config):');
|
||
$output->writeln($json);
|
||
|
||
if ($input->getOption('save-config')) {
|
||
$row = Db::name('shopro_huifu_config')->where('name', 'split_config_online_media_json')->find();
|
||
if ($row) {
|
||
Db::name('shopro_huifu_config')->where('name', 'split_config_online_media_json')->update(['value' => $json]);
|
||
} else {
|
||
Db::name('shopro_huifu_config')->insert([
|
||
'name' => 'split_config_online_media_json',
|
||
'value' => $json,
|
||
'group' => 'split',
|
||
'description' => 'split/config online_media_info_list JSON',
|
||
]);
|
||
}
|
||
HuifuConfig::reload();
|
||
$output->writeln('[OK] 已写入 split_config_online_media_json');
|
||
}
|
||
|
||
$output->writeln('');
|
||
$output->writeln('下一步: php think shopro_huifu:sync-split-receivers');
|
||
|
||
return 0;
|
||
}
|
||
}
|