diff --git a/app/Console/Commands/RunAccountBillsExportTask.php b/app/Console/Commands/RunAccountBillsExportTask.php index 90214163..8c44d253 100644 --- a/app/Console/Commands/RunAccountBillsExportTask.php +++ b/app/Console/Commands/RunAccountBillsExportTask.php @@ -37,7 +37,7 @@ class RunAccountBillsExportTask extends Command return self::FAILURE; } - $task = $tasks->patch($task, ['status' => 'running', 'started_at' => now()->toDateTimeString()]); + $task = $tasks->patch($task, ['status' => 'running', 'started_at' => AccountBillsExportTasks::beijingNow()]); try { $columns = array_values((array) ($task['columns'] ?? [])); @@ -70,7 +70,7 @@ class RunAccountBillsExportTask extends Command 'status' => 'done', 'rows' => $written, 'size' => (int) @filesize($tasks->csvPath($task)), - 'finished_at' => now()->toDateTimeString(), + 'finished_at' => AccountBillsExportTasks::beijingNow(), 'error' => null, ]); $this->info('导出完成:' . $written . ' 行'); @@ -79,7 +79,7 @@ class RunAccountBillsExportTask extends Command } catch (Throwable $exception) { $tasks->patch($task, [ 'status' => 'failed', - 'finished_at' => now()->toDateTimeString(), + 'finished_at' => AccountBillsExportTasks::beijingNow(), 'error' => mb_substr($exception->getMessage(), 0, 200), ]); $this->error('导出失败:' . $exception->getMessage()); @@ -106,7 +106,9 @@ class RunAccountBillsExportTask extends Command { $tab = (string) ($task['tab'] ?? ''); $filters = (array) ($task['filters'] ?? []); - $sort = (string) ($filters['sort'] ?? 'occurred_at'); + // 后台导出固定按「记录编码」(数据库自增列)顺序取数: + // 整月按「发生时间」排序要先对上千万行排序,首批数据要几分钟,阶段进度长时间是 0;按自增列取数快很多。 + $sort = 'record_code'; $dir = strtolower((string) ($filters['dir'] ?? 'desc')) === 'asc' ? 'asc' : 'desc'; unset($filters['sort'], $filters['dir'], $filters['export'], $filters['token'], $filters['total'], $filters['columns']); diff --git a/modules/EcommerceFinance/Services/AccountBillsExportTasks.php b/modules/EcommerceFinance/Services/AccountBillsExportTasks.php index 4e71b1d1..5beb8ce1 100644 --- a/modules/EcommerceFinance/Services/AccountBillsExportTasks.php +++ b/modules/EcommerceFinance/Services/AccountBillsExportTasks.php @@ -18,6 +18,15 @@ class AccountBillsExportTasks /** 任务类型(列表里的「类型」列)。 */ public const TYPE_LABEL = '平台原始账单导出'; + /** + * 统一的「北京时间」时间戳:Web(Apache)和后台 CLI 的默认时区可能不一致, + * 任务列表里必须统一成北京时间,避免计划时间/执行时间差 8 小时。 + */ + public static function beijingNow(): string + { + return Carbon::now('Asia/Shanghai')->toDateTimeString(); + } + public function baseDir(int $userId): string { return storage_path('app/account-bills-exports/' . $userId); @@ -53,7 +62,7 @@ class AccountBillsExportTasks 'filters' => $filters, 'columns' => $columns, 'error' => null, - 'planned_at' => Carbon::now()->toDateTimeString(), + 'planned_at' => self::beijingNow(), 'started_at' => null, 'finished_at' => null, 'size' => 0, diff --git a/resources/assets/js/components/business/AccountBills.vue b/resources/assets/js/components/business/AccountBills.vue index 82cfcff8..679b2f56 100644 --- a/resources/assets/js/components/business/AccountBills.vue +++ b/resources/assets/js/components/business/AccountBills.vue @@ -78,7 +78,7 @@