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