From 8e4bf994833b4db012780fb6ccdde4545fe14bd3 Mon Sep 17 00:00:00 2001 From: WuYongJie <549727955@qq.com> Date: Mon, 19 Oct 2026 18:14:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=AC=E4=B8=9C=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E9=A6=96=E6=AC=A1=E6=B1=87=E6=80=BB=E4=B8=8E=E5=80=99?= =?UTF-8?q?=E9=80=89=E6=9F=A5=E8=AF=A2=E7=9A=84=E8=A6=86=E7=9B=96=E7=B4=A2?= =?UTF-8?q?=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00_cover_jd_daily_bill_summary_filters.php | 40 +++++++++++++++++++ .../Unit/EcommerceFinance/JdDailyBillTest.php | 2 + 2 files changed, 42 insertions(+) create mode 100644 database/migrations/2026_10_19_181000_cover_jd_daily_bill_summary_filters.php diff --git a/database/migrations/2026_10_19_181000_cover_jd_daily_bill_summary_filters.php b/database/migrations/2026_10_19_181000_cover_jd_daily_bill_summary_filters.php new file mode 100644 index 00000000..9722dc1e --- /dev/null +++ b/database/migrations/2026_10_19_181000_cover_jd_daily_bill_summary_filters.php @@ -0,0 +1,40 @@ +hasTable('jd_daily_bill_rows')) return; + if (collect($schema->getIndexes('jd_daily_bill_rows'))->contains('name', 'jd_daily_summary_cover')) return; + $columns = ['generation', 'occurred_at', 'income', 'expense', 'store_name', 'bill_item']; + $connection = $schema->getConnection(); + if ($connection->getDriverName() === 'mysql') { + // Platform scope reads store_name: without it SUM must fetch every wide JSON row. + $wait = (int) $connection->selectOne('SELECT @@SESSION.lock_wait_timeout AS seconds')->seconds; + $connection->statement('SET SESSION lock_wait_timeout=5'); + try { + $table = $connection->getQueryGrammar()->wrapTable('jd_daily_bill_rows'); + $connection->statement('ALTER TABLE ' . $table . ' ADD INDEX jd_daily_summary_cover (generation, occurred_at, income, expense, store_name, bill_item), ALGORITHM=INPLACE, LOCK=NONE'); + } finally { + $connection->statement('SET SESSION lock_wait_timeout=' . $wait); + } + } else { + $schema->table('jd_daily_bill_rows', fn (Blueprint $table) => $table->index($columns, 'jd_daily_summary_cover')); + } + } + + public function down(): void + { + if (config('system_database.mode', 'bootstrap') === 'bootstrap') return; + $schema = Schema::connection((string) config('upstream_mirrors.connection', 'business_mirror')); + if ($schema->hasTable('jd_daily_bill_rows') && collect($schema->getIndexes('jd_daily_bill_rows'))->contains('name', 'jd_daily_summary_cover')) { + $schema->table('jd_daily_bill_rows', fn (Blueprint $table) => $table->dropIndex('jd_daily_summary_cover')); + } + } +}; diff --git a/tests/Unit/EcommerceFinance/JdDailyBillTest.php b/tests/Unit/EcommerceFinance/JdDailyBillTest.php index 25ae397b..07884a4a 100644 --- a/tests/Unit/EcommerceFinance/JdDailyBillTest.php +++ b/tests/Unit/EcommerceFinance/JdDailyBillTest.php @@ -20,6 +20,8 @@ class JdDailyBillTest extends TestCase config(['database.connections.business_mirror' => ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '']]); DB::purge('business_mirror'); (require database_path('migrations/2026_09_18_140000_create_jd_daily_bill_mirror_tables.php'))->up(); + config(['system_database.mode' => 'shared']); + (require database_path('migrations/2026_10_19_181000_cover_jd_daily_bill_summary_filters.php'))->up(); } protected function tearDown(): void