decimal('valid_member_min_effective_bet', 24, 10)->nullable(); $t->decimal('indirect_bonus_rate', 8, 4)->nullable(); $t->date('activation_date')->nullable(); }); Schema::create('share_policies', function (Blueprint $t) { $t->id(); $t->date('effective_date')->unique(); $t->boolean('enabled')->default(false); $t->boolean('benefit_enabled')->default(false); $t->decimal('valid_member_min_deposit', 24, 10)->default(20); $t->decimal('valid_member_min_effective_bet', 24, 10)->nullable(); $t->decimal('indirect_bonus_rate', 8, 4)->nullable(); $t->json('rules'); $t->timestamps(); }); Schema::create('share_levels', function (Blueprint $t) { $t->id(); $t->unsignedInteger('level')->unique(); $t->string('name'); $t->string('image', 1000)->default(''); $t->decimal('incremental_commission', 24, 10)->default(0); $t->timestamps(); }); Schema::create('share_members', function (Blueprint $t) { $t->unsignedBigInteger('user_id')->primary(); $t->unsignedBigInteger('parent_user_id')->nullable()->index(); $t->string('invitation_code', 100)->default(''); $t->string('binding_status', 24)->default('root'); $t->unsignedInteger('level')->default(1); $t->dateTime('bound_at'); $t->timestamps(); }); Schema::create('share_tree', function (Blueprint $t) { $t->unsignedBigInteger('ancestor_user_id'); $t->unsignedBigInteger('descendant_user_id'); $t->unsignedInteger('depth'); $t->dateTime('bound_at')->default('1970-01-01 00:00:00'); $t->primary(['ancestor_user_id','descendant_user_id']); $t->index(['descendant_user_id','depth']); }); Schema::create('share_bet_facts', function (Blueprint $t) { $t->id(); $t->string('source',32); $t->string('source_id',64); $t->unique(['source','source_id']); $t->unsignedBigInteger('user_id')->index(); $t->string('member_id',64); $t->string('category',32); $t->dateTime('bet_at'); $t->date('bet_date')->index(); $t->dateTime('settled_at')->nullable(); foreach (['bet_amount','net_profit','effective_amount'] as $c) $t->decimal($c,24,10)->default(0); $t->boolean('settled')->default(false); $t->boolean('voided')->default(false); $t->string('currency',8)->default('CNY'); $t->string('source_version',64); $t->timestamps(); $t->index(['user_id','bet_date','category']); }); Schema::create('share_accounts', function (Blueprint $t) { $t->unsignedBigInteger('user_id')->primary(); foreach (['earned_amount','paid_amount','reserved_amount'] as $c) $t->decimal($c,24,10)->default(0); $t->timestamps(); }); Schema::create('share_settlements', function (Blueprint $t) { $t->id(); $t->unsignedBigInteger('user_id'); $t->date('bet_date'); $t->string('category',32); $t->unique(['user_id','bet_date','category']); foreach (['direct_performance','indirect_performance','direct_commission','indirect_commission'] as $c) $t->decimal($c,24,10)->default(0); $t->unsignedInteger('valid_direct_members')->default(0); $t->decimal('rate',8,4)->default(0); $t->decimal('indirect_bonus_rate',8,4)->default(0); $t->unsignedBigInteger('policy_id')->nullable(); $t->unsignedInteger('revision')->default(0); $t->string('input_hash',64)->default(''); $t->timestamps(); }); Schema::create('share_ledger', function (Blueprint $t) { $t->id(); $t->unsignedBigInteger('user_id')->index(); $t->unsignedBigInteger('settlement_id'); $t->unsignedInteger('revision'); $t->string('type',16); $t->decimal('amount',24,10); $t->date('bet_date'); $t->string('category',32); $t->timestamps(); $t->unique(['settlement_id','revision','type']); }); Schema::create('share_claims', function (Blueprint $t) { $t->id(); $t->unsignedBigInteger('user_id')->index(); $t->string('request_id',64); $t->unique(['user_id','request_id']); $t->unsignedBigInteger('active_user_id')->nullable()->unique(); $t->decimal('amount',24,10); $t->string('status',16)->default('pending')->index(); $t->unsignedBigInteger('audit_admin_id')->nullable(); $t->text('audit_remark')->nullable(); $t->dateTime('audited_at')->nullable(); $t->unsignedBigInteger('credited_log_id')->nullable(); $t->timestamps(); }); Schema::create('share_system_state', function (Blueprint $t) { $t->string('key',64)->primary(); $t->text('value'); $t->timestamps(); }); $now = date('Y-m-d H:i:s'); $minimum = DB::table('share_settings')->value('valid_member_min_deposit') ?? 20; // Legacy benefit_enabled never funded these rules. Explicitly configure and enable the new system. DB::table('share_settings')->update(['benefit_enabled'=>0]); DB::table('share_policies')->insert(['effective_date'=>'1970-01-01','enabled'=>0,'benefit_enabled'=>0, 'valid_member_min_deposit'=>$minimum,'rules'=>json_encode(ShareDefaults::rules()),'created_at'=>$now,'updated_at'=>$now]); DB::table('share_levels')->insert(['level'=>1,'name'=>'等级1','image'=>'','incremental_commission'=>0,'created_at'=>$now,'updated_at'=>$now]); DB::table('share_system_state')->insert(['key'=>'relations_lock','value'=>'1','created_at'=>$now,'updated_at'=>$now]); } public function down(): void { foreach (['share_system_state','share_claims','share_ledger','share_settlements','share_accounts','share_bet_facts','share_tree','share_members','share_levels','share_policies'] as $table) Schema::dropIfExists($table); Schema::table('share_settings', function (Blueprint $t) { $t->dropColumn(['valid_member_min_effective_bet','indirect_bonus_rate','activation_date']); }); } };