feat: ship self-hosted KOC LOOP workflows

This commit is contained in:
巫凤萍
2026-08-11 23:07:26 +08:00
parent 1f1887c860
commit ddad4b7659
88 changed files with 6056 additions and 8938 deletions

195
mysql/0001_init.sql Normal file
View File

@@ -0,0 +1,195 @@
CREATE TABLE IF NOT EXISTS partners (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
wecom_name VARCHAR(255) NOT NULL,
owner VARCHAR(255) NOT NULL DEFAULT '运营组',
claimed_total INT NOT NULL DEFAULT 0,
completed_total INT NOT NULL DEFAULT 0,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS tasks (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
brand VARCHAR(255) NOT NULL,
quantity INT NOT NULL,
claimed_quantity INT NOT NULL DEFAULT 0,
due_at VARCHAR(32) NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'active',
source_url TEXT NOT NULL DEFAULT (''),
source_sheet_id VARCHAR(255) NOT NULL DEFAULT '',
source_sheet_name VARCHAR(255) NOT NULL DEFAULT '',
source_synced_at DATETIME(3) NULL,
share_token VARCHAR(128) NULL,
collection_start_date VARCHAR(32) NULL,
collection_days TEXT NOT NULL DEFAULT ('[]'),
collection_schedule_updated_at DATETIME(3) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE KEY tasks_share_token_idx (share_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS contents (
id VARCHAR(64) PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
title TEXT NOT NULL,
body LONGTEXT NOT NULL DEFAULT (''),
image_assets LONGTEXT NOT NULL DEFAULT ('[]'),
status VARCHAR(32) NOT NULL DEFAULT 'available',
source VARCHAR(255) NOT NULL DEFAULT '飞书内容表',
source_row INT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY contents_task_status_idx (task_id, status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS accounts (
id VARCHAR(64) PRIMARY KEY,
platform VARCHAR(32) NOT NULL DEFAULT '小红书',
platform_uid VARCHAR(255) NOT NULL,
public_account_id VARCHAR(255) NOT NULL DEFAULT '',
nickname VARCHAR(255) NOT NULL,
profile_url TEXT NOT NULL DEFAULT (''),
ip_location VARCHAR(255) NOT NULL DEFAULT '待识别',
followers INT NOT NULL DEFAULT 0,
post_count INT NOT NULL DEFAULT 0,
avg_views INT NOT NULL DEFAULT 0,
first_seen_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
last_seen_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE KEY accounts_platform_uid_idx (platform, platform_uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS claims (
id VARCHAR(64) PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
partner_id VARCHAR(64) NOT NULL,
claimant_name VARCHAR(255) NOT NULL,
claim_token VARCHAR(128) NOT NULL,
quantity INT NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE KEY claims_claim_token_idx (claim_token),
KEY claims_task_partner_created_idx (task_id, partner_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS delegation_bundles (
id VARCHAR(64) PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
claim_id VARCHAR(64) NOT NULL,
partner_id VARCHAR(64) NOT NULL,
label VARCHAR(255) NOT NULL,
share_token VARCHAR(128) NOT NULL,
quantity INT NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'active',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
revoked_at DATETIME(3) NULL,
UNIQUE KEY delegation_bundles_share_token_idx (share_token),
KEY delegation_bundles_claim_created_idx (claim_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS distributions (
id VARCHAR(64) PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
content_id VARCHAR(64) NOT NULL,
partner_id VARCHAR(64) NOT NULL,
claim_id VARCHAR(64) NULL,
delegation_bundle_id VARCHAR(64) NULL,
account_id VARCHAR(64) NULL,
publish_url TEXT NULL,
publish_time DATETIME(3) NULL,
publish_screenshot_key VARCHAR(512) NULL,
status VARCHAR(32) NOT NULL DEFAULT 'claimed',
claimed_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
screenshot_key VARCHAR(512) NULL,
ocr_status VARCHAR(32) NOT NULL DEFAULT 'none',
exposure INT NULL,
views INT NULL,
d2_likes INT NULL,
d2_comments INT NULL,
d2_collects INT NULL,
d5_likes INT NULL,
d5_comments INT NULL,
d5_collects INT NULL,
d7_likes INT NULL,
d7_comments INT NULL,
d7_collects INT NULL,
latest_likes INT NULL,
latest_comments INT NULL,
latest_collects INT NULL,
collection_status VARCHAR(32) NOT NULL DEFAULT 'pending',
collection_status_description TEXT NULL,
collection_updated_at DATETIME(3) NULL,
last_collection_day INT NULL,
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY distributions_task_status_idx (task_id, status),
KEY distributions_content_idx (content_id),
KEY distributions_account_idx (account_id),
KEY distributions_claim_idx (claim_id),
KEY distributions_delegation_idx (delegation_bundle_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS collection_runs (
id VARCHAR(64) PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
distribution_id VARCHAR(64) NOT NULL,
scheduled_date VARCHAR(32) NOT NULL,
schedule_day INT NULL,
scheduled_at DATETIME(3) NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'pending',
likes INT NULL,
comments INT NULL,
collects INT NULL,
status_description TEXT NULL,
started_at DATETIME(3) NULL,
completed_at DATETIME(3) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE KEY collection_runs_distribution_date_idx (distribution_id, scheduled_date),
KEY collection_runs_task_date_idx (task_id, scheduled_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS users (
id VARCHAR(64) PRIMARY KEY,
username VARCHAR(255) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
password_salt VARCHAR(255) NOT NULL,
password_iterations INT NOT NULL,
role VARCHAR(32) NOT NULL,
super_admin_guard TINYINT GENERATED ALWAYS AS (
CASE WHEN role = 'super_admin' THEN 1 ELSE NULL END
) STORED,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE KEY users_username_idx (username),
UNIQUE KEY users_single_super_admin_idx (super_admin_guard)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS auth_sessions (
token_hash VARCHAR(128) PRIMARY KEY,
user_id VARCHAR(64) NOT NULL,
expires_at DATETIME(3) NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY auth_sessions_user_id_idx (user_id),
KEY auth_sessions_expires_at_idx (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS mcp_export_tokens (
token_hash VARCHAR(128) PRIMARY KEY,
kind VARCHAR(64) NOT NULL,
payload LONGTEXT NOT NULL,
expires_at DATETIME(3) NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY mcp_export_tokens_expires_at_idx (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- statement-breakpoint
CREATE TABLE IF NOT EXISTS background_jobs (
id VARCHAR(64) PRIMARY KEY,
type VARCHAR(64) NOT NULL,
payload LONGTEXT NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'pending',
attempts INT NOT NULL DEFAULT 0,
available_at DATETIME(3) NOT NULL,
locked_at DATETIME(3) NULL,
completed_at DATETIME(3) NULL,
last_error TEXT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY background_jobs_pending_idx (status, available_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

View File

@@ -0,0 +1,2 @@
ALTER TABLE accounts
ADD COLUMN cooperation_source VARCHAR(500) NOT NULL DEFAULT '' AFTER avg_views;

View File

@@ -0,0 +1,8 @@
ALTER TABLE tasks
ADD COLUMN task_type VARCHAR(32) NOT NULL DEFAULT 'content_publish' AFTER status;
-- statement-breakpoint
ALTER TABLE distributions
ADD COLUMN result_screenshot_key VARCHAR(512) NULL AFTER publish_screenshot_key;
-- statement-breakpoint
ALTER TABLE distributions
ADD COLUMN result_submitted_at DATETIME(3) NULL AFTER result_screenshot_key;

View File

@@ -0,0 +1,2 @@
ALTER TABLE distributions
MODIFY COLUMN result_screenshot_key TEXT NULL;