-- ============================================================================= -- 迁移脚本:创建 Web 管理后台所需的 4 张表 -- 数据库:zqyy_app -- 关联需求:Requirements 1.1(用户认证)、4.1(任务队列)、5.1(调度任务) -- ============================================================================= BEGIN; -- --------------------------------------------------------------------------- -- admin_users 表:管理后台操作员账户 -- 每个 Operator 绑定一个门店(site_id),登录后 JWT 携带 site_id -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS admin_users ( id SERIAL PRIMARY KEY, username VARCHAR(64) UNIQUE NOT NULL, password_hash VARCHAR(256) NOT NULL, display_name VARCHAR(128), site_id BIGINT NOT NULL, -- 绑定的门店 ID is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_admin_users_site ON admin_users(site_id); -- --------------------------------------------------------------------------- -- task_queue 表:ETL 任务执行队列 -- 状态流转:pending → running → success / failed / cancelled -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS task_queue ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), site_id BIGINT NOT NULL, -- 门店隔离 config JSONB NOT NULL, -- 序列化的 TaskConfig status VARCHAR(20) NOT NULL DEFAULT 'pending', position INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMPTZ DEFAULT NOW(), started_at TIMESTAMPTZ, finished_at TIMESTAMPTZ, exit_code INTEGER, error_message TEXT ); -- 按状态查询(如获取所有 running 任务) CREATE INDEX IF NOT EXISTS idx_task_queue_status ON task_queue(status); -- 按门店 + 位置查询待执行任务(部分索引,仅 pending 状态) CREATE INDEX IF NOT EXISTS idx_task_queue_site_position ON task_queue(site_id, position) WHERE status = 'pending'; -- --------------------------------------------------------------------------- -- task_execution_log 表:任务执行历史记录 -- 每次执行(无论来自队列还是直接触发)都记录一条日志 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS task_execution_log ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), queue_id UUID REFERENCES task_queue(id), site_id BIGINT NOT NULL, -- 门店隔离 task_codes TEXT[] NOT NULL, status VARCHAR(20) NOT NULL, started_at TIMESTAMPTZ NOT NULL, finished_at TIMESTAMPTZ, exit_code INTEGER, duration_ms INTEGER, command TEXT, -- 实际执行的 CLI 命令 output_log TEXT, -- stdout 完整日志 error_log TEXT, -- stderr 日志 summary JSONB, -- 执行摘要 created_at TIMESTAMPTZ DEFAULT NOW() ); -- 按门店 + 开始时间倒序查询(执行历史列表) CREATE INDEX IF NOT EXISTS idx_execution_log_site_started ON task_execution_log(site_id, started_at DESC); -- --------------------------------------------------------------------------- -- scheduled_tasks 表:定时调度任务 -- 支持一次性 / 固定间隔 / 每日 / 每周 / Cron 五种调度类型 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS scheduled_tasks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), site_id BIGINT NOT NULL, -- 门店隔离 name VARCHAR(256) NOT NULL, task_codes TEXT[] NOT NULL, task_config JSONB NOT NULL, -- 序列化的 TaskConfig schedule_config JSONB NOT NULL, -- 序列化的 ScheduleConfig enabled BOOLEAN DEFAULT TRUE, last_run_at TIMESTAMPTZ, next_run_at TIMESTAMPTZ, run_count INTEGER DEFAULT 0, last_status VARCHAR(20), created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); -- 按门店查询调度任务 CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_site ON scheduled_tasks(site_id); -- 查询到期的已启用调度任务(部分索引) CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_next_run ON scheduled_tasks(next_run_at) WHERE enabled = TRUE; COMMIT;