This commit is contained in:
2026-07-21 12:49:59 +08:00 Unverified
parent 97bbe07789
commit ae528b20e9
24 changed files with 770 additions and 30 deletions
+37 -2
View File
@@ -47,7 +47,7 @@ export const sqliteSchema = `
username TEXT NOT NULL UNIQUE,
candidate_number TEXT UNIQUE,
password_hash TEXT NOT NULL,
role TEXT NOT NULL CHECK (role IN ('admin', 'candidate')),
role TEXT NOT NULL CHECK (role IN ('admin', 'candidate', 'admission_school')),
admin_level TEXT CHECK (admin_level IN ('super', 'school', 'class')),
school_id TEXT REFERENCES schools(id) ON DELETE SET NULL,
class_id TEXT REFERENCES school_classes(id) ON DELETE SET NULL,
@@ -90,6 +90,9 @@ export const sqliteSchema = `
postal_code TEXT,
guardian_name TEXT,
guardian_phone TEXT,
specialty_types TEXT NOT NULL DEFAULT '[]',
specialty_certificate TEXT,
policy_eligibility TEXT,
profile_completed INTEGER NOT NULL DEFAULT 0 CHECK (profile_completed IN (0, 1)),
status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected')),
review_note TEXT,
@@ -426,6 +429,18 @@ export const sqliteSchema = `
created_at TEXT NOT NULL
) STRICT;
CREATE TABLE IF NOT EXISTS admission_records (
id TEXT PRIMARY KEY,
kind TEXT NOT NULL CHECK (kind IN ('setting', 'plan', 'preference', 'placement', 'notification')),
exam_id TEXT NOT NULL REFERENCES exams(id) ON DELETE CASCADE,
user_id TEXT REFERENCES users(id) ON DELETE CASCADE,
school_id TEXT REFERENCES schools(id) ON DELETE CASCADE,
status TEXT NOT NULL,
payload_json TEXT NOT NULL DEFAULT '{}',
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
) STRICT;
CREATE INDEX IF NOT EXISTS idx_profiles_status ON candidate_profiles(status);
CREATE INDEX IF NOT EXISTS idx_users_archive_scope ON users(role, school_id, class_id, archived_at);
CREATE INDEX IF NOT EXISTS idx_exams_archive ON exams(archived_at, exam_end);
@@ -446,6 +461,7 @@ export const sqliteSchema = `
CREATE INDEX IF NOT EXISTS idx_account_batch_items ON candidate_account_batch_items(batch_id, class_id, position);
CREATE INDEX IF NOT EXISTS idx_results_registration ON results(registration_id, published);
CREATE INDEX IF NOT EXISTS idx_audit_created ON audit_logs(created_at);
CREATE INDEX IF NOT EXISTS idx_admission_records_lookup ON admission_records(kind, exam_id, school_id, user_id, status);
CREATE TRIGGER IF NOT EXISTS trg_results_lock_archived_insert
BEFORE INSERT ON results
@@ -536,7 +552,7 @@ export const mysqlSchema = [
username VARCHAR(100) NOT NULL,
candidate_number VARCHAR(120) NULL,
password_hash VARCHAR(255) NOT NULL,
role ENUM('admin', 'candidate') NOT NULL,
role ENUM('admin', 'candidate', 'admission_school') NOT NULL,
admin_level ENUM('super', 'school', 'class') NULL,
school_id VARCHAR(64) NULL,
class_id VARCHAR(64) NULL,
@@ -586,6 +602,9 @@ export const mysqlSchema = [
postal_code VARCHAR(20) NULL,
guardian_name VARCHAR(100) NULL,
guardian_phone VARCHAR(60) NULL,
specialty_types JSON NOT NULL DEFAULT (JSON_ARRAY()),
specialty_certificate VARCHAR(255) NULL,
policy_eligibility VARCHAR(255) NULL,
profile_completed BOOLEAN NOT NULL DEFAULT FALSE,
status ENUM('pending', 'approved', 'rejected') NOT NULL,
review_note VARCHAR(500) NULL,
@@ -987,6 +1006,22 @@ export const mysqlSchema = [
CONSTRAINT fk_workflow_action_from FOREIGN KEY (from_assignee_id) REFERENCES users(id) ON DELETE SET NULL,
CONSTRAINT fk_workflow_action_to FOREIGN KEY (to_assignee_id) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci`,
`CREATE TABLE IF NOT EXISTS admission_records (
id VARCHAR(64) NOT NULL,
kind ENUM('setting', 'plan', 'preference', 'placement', 'notification') NOT NULL,
exam_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64) NULL,
school_id VARCHAR(64) NULL,
status VARCHAR(40) NOT NULL,
payload_json JSON NOT NULL,
created_at VARCHAR(35) NOT NULL,
updated_at VARCHAR(35) NOT NULL,
PRIMARY KEY (id),
KEY idx_admission_records_lookup (kind, exam_id, school_id, user_id, status),
CONSTRAINT fk_admission_record_exam FOREIGN KEY (exam_id) REFERENCES exams(id) ON DELETE CASCADE,
CONSTRAINT fk_admission_record_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
CONSTRAINT fk_admission_record_school FOREIGN KEY (school_id) REFERENCES schools(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci`,
`CREATE TABLE IF NOT EXISTS audit_logs (
id VARCHAR(64) NOT NULL,
actor_id VARCHAR(64) NULL,