setName('sync_wechat_work_bills') ->setDescription('同步企业微信对外收款到订单(按天拉取)') ->addOption('date', 'd', Option::VALUE_OPTIONAL, '指定日期 Y-m-d,默认今天', '') ->addOption('days', null, Option::VALUE_OPTIONAL, '拉取最近N天,每天单独请求', '1') ->addOption( 'fill-order-creators-only', null, Option::VALUE_NONE, '仅补全订单创建人:creator_id 为空时用 payee_userid 匹配 admin.work_wechat_userid(可单独做定时任务)' ); } protected function execute(Input $input, Output $output) { if ($input->getOption('fill-order-creators-only')) { $fixed = $this->fillOrderCreatorsFromPayee(); $output->writeln("补全创建人完成,共更新 {$fixed} 条订单"); return; } $dateStr = $input->getOption('date'); $days = (int)$input->getOption('days'); $days = $days > 0 ? min($days, 31) : 1; $totalCreated = 0; $totalUpdated = 0; $totalSkipped = 0; $errors = []; if ($dateStr) { $dates = [$dateStr]; } else { $dates = []; for ($i = 0; $i < $days; $i++) { $dates[] = date('Y-m-d', strtotime("-{$i} days")); } } foreach ($dates as $d) { $beginTime = strtotime($d . ' 00:00:00'); $endTime = strtotime($d . ' 23:59:59'); $output->writeln("同步 {$d} ..."); $result = OrderLogic::syncFromWechatWorkBills($beginTime, $endTime); $totalCreated += $result['created']; $totalUpdated += $result['updated']; $totalSkipped += $result['skipped']; if (!empty($result['errors'])) { $errors = array_merge($errors, $result['errors']); } $output->writeln(" -> 新增 {$result['created']} 更新 {$result['updated']} 跳过 {$result['skipped']}"); } $output->writeln("完成: 共新增 {$totalCreated} 更新 {$totalUpdated} 跳过 {$totalSkipped}"); if (!empty($errors)) { foreach ($errors as $e) { $output->writeln("{$e}"); Log::error('sync_wechat_work_bills: ' . $e); } } } /** * creator_id 为空的订单,用 payee_userid 匹配管理员 work_wechat_userid 写入 creator_id */ protected function fillOrderCreatorsFromPayee(): int { $fixed = 0; Order::whereRaw('(creator_id IS NULL OR creator_id = 0)') ->whereNotNull('payee_userid') ->where('payee_userid', '<>', '') ->chunk(200, function ($orders) use (&$fixed) { foreach ($orders as $order) { $payee = trim((string) $order->getAttr('payee_userid')); if ($payee === '') { continue; } $admin = Admin::where('work_wechat_userid', $payee)->whereNull('delete_time')->find(); if (!$admin) { continue; } $order->creator_id = (int) $admin->getAttr('id'); $order->save(); $fixed++; } }); return $fixed; } }