81 行
3.9 KiB
PHP
81 行
3.9 KiB
PHP
<?php
|
||
|
||
namespace addons\shopro\console;
|
||
|
||
use think\console\Input;
|
||
use think\console\Output;
|
||
use think\console\input\Option;
|
||
use think\console\Command;
|
||
use addons\shopro\service\partner\DailySettleService;
|
||
use addons\shopro\service\partner\PartnerCompensateService;
|
||
|
||
class PartnerSettle extends Command
|
||
{
|
||
protected function configure()
|
||
{
|
||
$this->setName('shopro:partner:settle')
|
||
->addOption('date', 'd', Option::VALUE_OPTIONAL, '结算日期 Y-m-d,默认昨天')
|
||
->addOption('rerun', 'r', Option::VALUE_NONE, '删除当天日结后重算')
|
||
->addOption('minute', 'm', Option::VALUE_NONE, '执行分钟级增量结算与兑换券释放(联调测试用)')
|
||
->addOption('compensate', 'c', Option::VALUE_NONE, '执行未结算订单自动对账与补偿发放')
|
||
->addOption('check', null, Option::VALUE_NONE, '收益中心与队列运行健康度体检诊断')
|
||
->setDescription('收益中心日结(DMEPA/馆县均分/兑换券释放,默认每日结算昨天)');
|
||
}
|
||
|
||
protected function execute(Input $input, Output $output)
|
||
{
|
||
$date = $input->getOption('date');
|
||
$rerun = (bool) $input->getOption('rerun');
|
||
$isMinute = (bool) $input->getOption('minute');
|
||
$isCompensate = (bool) $input->getOption('compensate');
|
||
$isCheck = (bool) $input->getOption('check');
|
||
|
||
// 1. 系统健康度与漏单诊断体检模式
|
||
if ($isCheck) {
|
||
$output->writeln('[' . date('Y-m-d H:i:s') . '] partner health check start...');
|
||
$health = (new PartnerCompensateService())->checkHealth();
|
||
$output->writeln('partner health check done: ' . json_encode($health, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
|
||
return 0;
|
||
}
|
||
|
||
// 2. 独立对账补偿模式
|
||
if ($isCompensate) {
|
||
$output->writeln('[' . date('Y-m-d H:i:s') . '] partner compensation start...');
|
||
$compensateReport = (new PartnerCompensateService())->compensateAll(200);
|
||
$output->writeln('partner compensation done: ' . json_encode($compensateReport, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
|
||
return 0;
|
||
}
|
||
|
||
// 3. 显式指定分钟级调度模式(联调调试测试)
|
||
if ($isMinute) {
|
||
$output->writeln('[' . date('Y-m-d H:i:s') . '] partner minute settle start');
|
||
try {
|
||
$result = (new DailySettleService())->runMinute();
|
||
$output->writeln('[' . date('Y-m-d H:i:s') . '] partner minute settle done: ' . json_encode($result, JSON_UNESCAPED_UNICODE));
|
||
return 0;
|
||
} catch (\Exception $e) {
|
||
$output->writeln('[' . date('Y-m-d H:i:s') . '] partner minute settle fail: ' . $e->getMessage());
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
// 4. 默认原标准日结模式(每日凌晨结算昨天,支持 -d 指定日期与 -r 重跑)
|
||
$settleDate = $date ?: date('Y-m-d', strtotime('-1 day'));
|
||
$output->writeln('partner daily settle start ' . $settleDate . ($rerun ? ' rerun' : ''));
|
||
try {
|
||
// 日结前置:扫描并补偿未结算即时奖订单,避免影响大盘 GMV 统计与分红池
|
||
$compensateReport = (new PartnerCompensateService())->compensateAll(100);
|
||
if (!empty($compensateReport['success_count'])) {
|
||
$output->writeln(" [✓] 日结前置补偿已完成: 成功补发 {$compensateReport['success_count']} 笔订单即时奖");
|
||
}
|
||
|
||
$report = (new DailySettleService())->run($date, $rerun);
|
||
$output->writeln('partner daily settle done: ' . json_encode($report ? $report->toArray() : [], JSON_UNESCAPED_UNICODE));
|
||
return 0;
|
||
} catch (\Exception $e) {
|
||
$output->writeln('partner daily settle fail: ' . $e->getMessage());
|
||
return 1;
|
||
}
|
||
}
|
||
}
|