2026_10_26_110000_create_site_messages.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. <?php
  2. use Illuminate\Database\Migrations\Migration;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Support\Facades\Schema;
  5. return new class extends Migration {
  6. public function up(): void
  7. {
  8. Schema::table('agents', function (Blueprint $t) { $t->string('language', 8)->default('zh'); });
  9. Schema::create('site_messages', function (Blueprint $t) {
  10. $t->engine = 'InnoDB'; $t->id();
  11. $t->string('category', 24)->default('internal');
  12. $t->string('recipient_type', 24); $t->json('recipient_ids')->nullable();
  13. $t->dateTime('send_at'); $t->dateTime('sent_at')->nullable(); $t->dateTime('retracted_at')->nullable();
  14. $t->string('status', 16)->default('scheduled');
  15. $t->unsignedBigInteger('sender_id'); $t->string('sender_name', 100);
  16. $t->string('request_id', 64); $t->char('request_hash', 64);
  17. $t->unsignedInteger('recipient_count')->default(0); $t->unsignedInteger('skipped_count')->default(0);
  18. $t->timestamps();
  19. $t->unique(['sender_id', 'request_id'], 'site_message_request');
  20. $t->index(['status', 'send_at'], 'site_message_due');
  21. });
  22. Schema::create('site_message_translations', function (Blueprint $t) {
  23. $t->engine = 'InnoDB'; $t->id(); $t->unsignedBigInteger('message_id');
  24. $t->string('language', 8); $t->string('title', 500); $t->string('subtitle', 500)->default(''); $t->text('content');
  25. $t->unique(['message_id', 'language'], 'site_message_translation');
  26. });
  27. Schema::create('site_message_recipients', function (Blueprint $t) {
  28. $t->engine = 'InnoDB'; $t->id(); $t->unsignedBigInteger('message_id');
  29. $t->string('recipient_kind', 8); $t->unsignedBigInteger('recipient_id'); $t->string('language', 8);
  30. $t->dateTime('read_at')->nullable(); $t->dateTime('created_at');
  31. $t->unique(['message_id', 'recipient_kind', 'recipient_id'], 'site_message_delivery');
  32. $t->index(['recipient_kind', 'recipient_id', 'read_at'], 'site_message_inbox');
  33. });
  34. }
  35. public function down(): void
  36. {
  37. Schema::dropIfExists('site_message_recipients'); Schema::dropIfExists('site_message_translations'); Schema::dropIfExists('site_messages');
  38. Schema::table('agents', function (Blueprint $t) { $t->dropColumn('language'); });
  39. }
  40. };