Files
junhong_cmp_fiber/migrations/000135_create_export_task_tables.up.sql
huang 60debb7505
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m4s
统一导出任务
2026-04-27 09:47:03 +08:00

150 lines
6.6 KiB
SQL

-- 创建统一导出主任务表与分片任务表
CREATE TABLE IF NOT EXISTS tb_export_task (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
creator BIGINT NOT NULL DEFAULT 0,
updater BIGINT NOT NULL DEFAULT 0,
task_no VARCHAR(50) NOT NULL,
scene VARCHAR(50) NOT NULL,
format VARCHAR(20) NOT NULL,
status INT NOT NULL DEFAULT 1,
progress INT NOT NULL DEFAULT 0,
total_rows INT NOT NULL DEFAULT 0,
processed_rows INT NOT NULL DEFAULT 0,
total_shards INT NOT NULL DEFAULT 0,
success_shards INT NOT NULL DEFAULT 0,
failed_shards INT NOT NULL DEFAULT 0,
cancel_requested BOOLEAN NOT NULL DEFAULT FALSE,
query_json JSONB NOT NULL DEFAULT '{}'::jsonb,
scope_shop_ids JSONB NOT NULL DEFAULT '[]'::jsonb,
creator_user_id BIGINT NOT NULL,
creator_user_type INT NOT NULL,
creator_shop_id BIGINT,
creator_enterprise_id BIGINT,
file_key VARCHAR(500) NOT NULL DEFAULT '',
file_size BIGINT NOT NULL DEFAULT 0,
error_message TEXT,
started_at TIMESTAMP,
completed_at TIMESTAMP
);
CREATE TABLE IF NOT EXISTS tb_export_shard_task (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
creator BIGINT NOT NULL DEFAULT 0,
updater BIGINT NOT NULL DEFAULT 0,
task_id BIGINT NOT NULL,
shard_no INT NOT NULL,
status INT NOT NULL DEFAULT 1,
cursor_start BIGINT NOT NULL DEFAULT 0,
cursor_end BIGINT NOT NULL DEFAULT 0,
row_count INT NOT NULL DEFAULT 0,
processed_rows INT NOT NULL DEFAULT 0,
file_key VARCHAR(500) NOT NULL DEFAULT '',
file_size BIGINT NOT NULL DEFAULT 0,
error_message TEXT,
started_at TIMESTAMP,
completed_at TIMESTAMP
);
-- 主任务索引
CREATE UNIQUE INDEX IF NOT EXISTS idx_export_task_no
ON tb_export_task(task_no)
WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_export_task_scene_status_created_at
ON tb_export_task(scene, status, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_export_task_creator_user_id
ON tb_export_task(creator_user_id);
CREATE INDEX IF NOT EXISTS idx_export_task_creator_shop_id
ON tb_export_task(creator_shop_id);
CREATE INDEX IF NOT EXISTS idx_export_task_creator_enterprise_id
ON tb_export_task(creator_enterprise_id);
CREATE INDEX IF NOT EXISTS idx_export_task_cancel_requested
ON tb_export_task(cancel_requested);
CREATE INDEX IF NOT EXISTS idx_export_task_deleted_at
ON tb_export_task(deleted_at);
-- 分片任务索引
CREATE UNIQUE INDEX IF NOT EXISTS idx_export_shard_task_task_shard_no
ON tb_export_shard_task(task_id, shard_no)
WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_export_shard_task_task_status
ON tb_export_shard_task(task_id, status);
CREATE INDEX IF NOT EXISTS idx_export_shard_task_deleted_at
ON tb_export_shard_task(deleted_at);
CREATE INDEX IF NOT EXISTS idx_export_shard_task_created_at
ON tb_export_shard_task(created_at DESC);
-- 表注释
COMMENT ON TABLE tb_export_task IS '统一导出主任务表';
COMMENT ON TABLE tb_export_shard_task IS '统一导出分片任务表';
-- 主任务字段注释
COMMENT ON COLUMN tb_export_task.id IS '主键ID';
COMMENT ON COLUMN tb_export_task.created_at IS '创建时间';
COMMENT ON COLUMN tb_export_task.updated_at IS '更新时间';
COMMENT ON COLUMN tb_export_task.deleted_at IS '删除时间(软删除)';
COMMENT ON COLUMN tb_export_task.creator IS '创建人ID';
COMMENT ON COLUMN tb_export_task.updater IS '更新人ID';
COMMENT ON COLUMN tb_export_task.task_no IS '任务编号(EXP-YYYYMMDD-XXXXXX)';
COMMENT ON COLUMN tb_export_task.scene IS '导出场景(device/iot_card)';
COMMENT ON COLUMN tb_export_task.format IS '导出格式(xlsx/csv)';
COMMENT ON COLUMN tb_export_task.status IS '任务状态 1-待处理 2-处理中 3-已完成 4-已失败 5-已取消';
COMMENT ON COLUMN tb_export_task.progress IS '任务进度(0-100)';
COMMENT ON COLUMN tb_export_task.total_rows IS '总行数';
COMMENT ON COLUMN tb_export_task.processed_rows IS '已处理行数';
COMMENT ON COLUMN tb_export_task.total_shards IS '总分片数';
COMMENT ON COLUMN tb_export_task.success_shards IS '成功分片数';
COMMENT ON COLUMN tb_export_task.failed_shards IS '失败分片数';
COMMENT ON COLUMN tb_export_task.cancel_requested IS '是否请求取消';
COMMENT ON COLUMN tb_export_task.query_json IS '导出查询参数(JSON)';
COMMENT ON COLUMN tb_export_task.scope_shop_ids IS '导出时的数据权限店铺范围快照';
COMMENT ON COLUMN tb_export_task.creator_user_id IS '创建人用户ID';
COMMENT ON COLUMN tb_export_task.creator_user_type IS '创建人用户类型 2-平台 3-代理 4-企业';
COMMENT ON COLUMN tb_export_task.creator_shop_id IS '创建人店铺ID快照';
COMMENT ON COLUMN tb_export_task.creator_enterprise_id IS '创建人企业ID快照';
COMMENT ON COLUMN tb_export_task.file_key IS '最终产物文件Key';
COMMENT ON COLUMN tb_export_task.file_size IS '最终产物文件大小(字节)';
COMMENT ON COLUMN tb_export_task.error_message IS '错误信息';
COMMENT ON COLUMN tb_export_task.started_at IS '开始处理时间';
COMMENT ON COLUMN tb_export_task.completed_at IS '完成时间';
-- 分片任务字段注释
COMMENT ON COLUMN tb_export_shard_task.id IS '主键ID';
COMMENT ON COLUMN tb_export_shard_task.created_at IS '创建时间';
COMMENT ON COLUMN tb_export_shard_task.updated_at IS '更新时间';
COMMENT ON COLUMN tb_export_shard_task.deleted_at IS '删除时间(软删除)';
COMMENT ON COLUMN tb_export_shard_task.creator IS '创建人ID';
COMMENT ON COLUMN tb_export_shard_task.updater IS '更新人ID';
COMMENT ON COLUMN tb_export_shard_task.task_id IS '主任务ID';
COMMENT ON COLUMN tb_export_shard_task.shard_no IS '分片序号(从1开始)';
COMMENT ON COLUMN tb_export_shard_task.status IS '分片状态 1-待处理 2-处理中 3-已成功 4-已失败 5-已取消';
COMMENT ON COLUMN tb_export_shard_task.cursor_start IS '分片游标起点(不含)';
COMMENT ON COLUMN tb_export_shard_task.cursor_end IS '分片游标终点(含)';
COMMENT ON COLUMN tb_export_shard_task.row_count IS '分片行数';
COMMENT ON COLUMN tb_export_shard_task.processed_rows IS '分片已处理行数';
COMMENT ON COLUMN tb_export_shard_task.file_key IS '分片产物文件Key';
COMMENT ON COLUMN tb_export_shard_task.file_size IS '分片产物文件大小(字节)';
COMMENT ON COLUMN tb_export_shard_task.error_message IS '分片错误信息';
COMMENT ON COLUMN tb_export_shard_task.started_at IS '开始处理时间';
COMMENT ON COLUMN tb_export_shard_task.completed_at IS '完成时间';