文件
Henglianshutong/addons/shopro/console/PartnerSettle.php

81 行
3.9 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?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;
}
}
}