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