Files
Neo-ZQYY/db/zqyy_app/migrations/20250715_create_admin_web_tables.sql

108 lines
4.8 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- 迁移脚本:创建 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;