admin/sql/install_xhs_module.sql

220 lines
12 KiB
SQL
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.

-- 小红书模块:建表 + 业务种子数据(在 OMS 库 fake_simple_admin / oms 执行)
-- 执行顺序:本文件 → seed_xhs_rbac_menu.sql(RBAC 库 menu 表)→ seed_xhs_role_permissions.sql
--
-- Navicat:选中 OMS 业务库后运行本文件
-- ========== 1. 建表 migrate_t_xhs.sql ==========
-- (内容与 migrate_t_xhs.sql 相同,便于一键安装)
CREATE TABLE IF NOT EXISTS `t_xhs_agent` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID → t_customer.Id',
`DeviceId` VARCHAR(64) NOT NULL COMMENT 'Agent 本机设备标识',
`DeviceName` VARCHAR(128) NULL COMMENT '用户自定义名称',
`AgentVersion` VARCHAR(32) NULL COMMENT 'Agent 版本号',
`BridgePort` INT NOT NULL DEFAULT 9333 COMMENT 'Bridge WebSocket 端口',
`Status` VARCHAR(16) NOT NULL DEFAULT 'offline' COMMENT 'online/offline',
`EngineRunning` TINYINT NOT NULL DEFAULT 0 COMMENT 'Bridge 引擎是否运行',
`ExtensionConnected` TINYINT NOT NULL DEFAULT 0 COMMENT 'Chrome 扩展是否连上 Bridge',
`XhsLoggedIn` TINYINT NOT NULL DEFAULT 0 COMMENT '小红书是否已登录',
`LastHeartbeatTime` DATETIME NULL COMMENT '最后心跳时间',
`LastError` VARCHAR(512) NULL COMMENT '最近一次 Agent 上报错误摘要',
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()) COMMENT '并发戳',
`CreateUserId` INT NOT NULL DEFAULT 0 COMMENT '创建人',
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`UpdateUserId` INT NULL COMMENT '更新人',
`UpdateTime` DATETIME NULL COMMENT '更新时间',
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_xhs_agent_device` (`DeviceId`),
KEY `idx_xhs_agent_customer` (`CustomerId`, `Status`)
) COMMENT='小红书本地 Agent 设备表';
CREATE TABLE IF NOT EXISTS `t_xhs_task` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID',
`AgentId` INT NULL COMMENT '指定执行的 Agent;NULL 表示任意在线 Agent',
`TaskType` VARCHAR(32) NOT NULL COMMENT '任务类型',
`ToolName` VARCHAR(64) NULL COMMENT 'LIKE AI 工具名',
`Priority` INT NOT NULL DEFAULT 0 COMMENT '越大越优先',
`Status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/claimed/running/succeeded/failed/cancelled',
`ArgumentsJson` JSON NOT NULL COMMENT '工具参数 JSON',
`ProgressText` VARCHAR(512) NULL COMMENT '执行过程摘要',
`ResultJson` JSON NULL COMMENT '成功时结构化结果',
`ErrorMessage` VARCHAR(1024) NULL COMMENT '失败原因',
`Source` VARCHAR(32) NOT NULL DEFAULT 'web' COMMENT 'web/schedule/skill',
`SourceRefId` VARCHAR(64) NULL COMMENT '来源关联 ID',
`ScheduledTime` DATETIME NULL COMMENT '计划执行时间',
`ClaimedAt` DATETIME NULL COMMENT 'Agent 认领时间',
`StartedAt` DATETIME NULL COMMENT '开始执行',
`FinishedAt` DATETIME NULL COMMENT '结束时间',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
KEY `idx_xhs_task_poll` (`CustomerId`, `Status`, `ScheduledTime`, `Priority`),
KEY `idx_xhs_task_agent` (`AgentId`, `Status`),
KEY `idx_xhs_task_source` (`Source`, `SourceRefId`)
) COMMENT='小红书 Agent 任务队列表';
CREATE TABLE IF NOT EXISTS `t_xhs_publish_record` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID',
`TaskId` INT NULL COMMENT '关联 t_xhs_task.Id',
`ToolName` VARCHAR(64) NOT NULL COMMENT 'publish_content / publish_with_video',
`Title` VARCHAR(256) NOT NULL COMMENT '笔记标题',
`ContentPreview` VARCHAR(512) NULL COMMENT '正文摘要',
`ContentFull` TEXT NULL COMMENT '完整正文',
`MediaJson` JSON NULL COMMENT '图片/视频 URL 列表',
`TagsJson` JSON NULL COMMENT '标签数组',
`Visibility` VARCHAR(32) NULL COMMENT '可见范围',
`Status` VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT 'draft/scheduled/publishing/succeeded/failed/cancelled',
`Success` TINYINT NULL COMMENT '最终是否成功',
`ResultSummary` VARCHAR(1024) NULL COMMENT 'Agent 回传结果摘要',
`ScheduledTime` DATETIME NULL COMMENT '定时发布时间',
`PublishedTime` DATETIME NULL COMMENT '实际发布完成时间',
`SkillId` INT NULL COMMENT '若来自技能卡片',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
KEY `idx_xhs_publish_customer_time` (`CustomerId`, `CreateTime`),
KEY `idx_xhs_publish_status_sched` (`CustomerId`, `Status`, `ScheduledTime`),
KEY `idx_xhs_publish_task` (`TaskId`)
) COMMENT='小红书发布记录表';
CREATE TABLE IF NOT EXISTS `t_xhs_analysis_session` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID',
`SessionName` VARCHAR(128) NULL COMMENT '用户备注名',
`AnalysisType` VARCHAR(32) NOT NULL COMMENT 'home_feed/search/my_feeds/feed_detail',
`Keyword` VARCHAR(128) NULL COMMENT '搜索关键词',
`TaskId` INT NULL COMMENT '采集任务 ID',
`FeedsJson` JSON NULL COMMENT '采集笔记列表',
`SelectedFeedId` VARCHAR(64) NULL COMMENT '当前选中笔记 ID',
`AiAnalysisMarkdown` MEDIUMTEXT NULL COMMENT 'AI 分析结果',
`SkillId` INT NULL COMMENT '技能配方 ID',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
KEY `idx_xhs_analysis_customer` (`CustomerId`, `CreateTime`)
) COMMENT='小红书内容分析会话表';
CREATE TABLE IF NOT EXISTS `t_xhs_skill` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID;0 表示系统预置',
`ExternalId` VARCHAR(32) NOT NULL COMMENT '对外稳定 ID',
`Title` VARCHAR(256) NOT NULL COMMENT '技能名称',
`SkillType` VARCHAR(32) NOT NULL DEFAULT 'ai_create' COMMENT '技能类型',
`PresetId` VARCHAR(64) NULL COMMENT '内置预设标识',
`RecipeJson` JSON NOT NULL COMMENT '配方 JSON',
`SortOrder` INT NOT NULL DEFAULT 0 COMMENT '排序',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_xhs_skill_external` (`CustomerId`, `ExternalId`),
KEY `idx_xhs_skill_customer` (`CustomerId`, `SortOrder`)
) COMMENT='小红书技能卡片表';
CREATE TABLE IF NOT EXISTS `t_xhs_human_config` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID',
`BehaviorJson` JSON NOT NULL COMMENT 'human_behavior 配置',
`GuardJson` JSON NOT NULL COMMENT 'human_guard 配置',
`Version` INT NOT NULL DEFAULT 1 COMMENT '配置版本',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_xhs_human_customer` (`CustomerId`)
) COMMENT='小红书拟人行为与防封配置表';
CREATE TABLE IF NOT EXISTS `t_xhs_ai_provider` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID;0 表示全局',
`ProviderKey` VARCHAR(32) NOT NULL COMMENT 'ai_chatgpt / ai_zhipu 等',
`ProviderType` VARCHAR(32) NOT NULL COMMENT 'chatgpt/doubao/deepseek/zhipu',
`DisplayName` VARCHAR(64) NOT NULL COMMENT '展示名',
`BaseUrl` VARCHAR(512) NOT NULL COMMENT 'API Base URL',
`ApiKeyEnc` VARCHAR(512) NULL COMMENT 'API Key(暂明文,后续可加密)',
`ApiSecretEnc` VARCHAR(512) NULL COMMENT 'Secret/模型名',
`IsDefault` TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认',
`Enabled` TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT (UUID()),
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_xhs_ai_provider` (`CustomerId`, `ProviderKey`),
KEY `idx_xhs_ai_customer` (`CustomerId`, `Enabled`)
) COMMENT='小红书 AI 提供商配置表';
CREATE TABLE IF NOT EXISTS `t_xhs_media` (
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
`CustomerId` INT NOT NULL COMMENT '客户ID',
`FileName` VARCHAR(256) NOT NULL COMMENT '原始文件名',
`StoragePath` VARCHAR(512) NOT NULL COMMENT '相对路径',
`PublicUrl` VARCHAR(512) NOT NULL COMMENT '对外 HTTPS URL',
`MimeType` VARCHAR(64) NULL COMMENT 'MIME',
`FileSizeBytes` BIGINT NULL COMMENT '字节数',
`IsDeleted` TINYINT NOT NULL DEFAULT 0,
`CreateUserId` INT NOT NULL DEFAULT 0,
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdateUserId` INT NULL,
`UpdateTime` DATETIME NULL,
PRIMARY KEY (`Id`),
KEY `idx_xhs_media_customer` (`CustomerId`, `CreateTime`)
) COMMENT='小红书创作上传媒体表';
-- ========== 2. 种子 seed_xhs_skills + seed_xhs_ai_providers ==========
INSERT INTO `t_xhs_skill` (
`CustomerId`, `ExternalId`, `Title`, `SkillType`, `PresetId`, `RecipeJson`, `SortOrder`,
`IsDeleted`, `CreateUserId`, `CreateTime`
) VALUES
(0, '5a9d3c012d50', '数字型/疑问型 · 物流知识 · 图文', 'ai_create', NULL,
'{"formula":["emotion","utility","visual","social"],"title_types":["number","question"],"body":{"domain":"物流知识","content_type":"干货教程","emotion":"生活场景","social":"知识炫耀"},"image_modes":["cover_impact"],"video_modes":[],"notes":"讲解9610的简易申报和汇总申报,退税,以及申报要求"}',
1, 0, 0, NOW()),
(0, '7dd58bfe4770', '效率工具 · 干货教程(新号)', 'ai_create', 'efficiency_tutorial',
'{"formula":["emotion","utility","visual","social"],"title_types":["number","question"],"body":{"domain":"效率工具","content_type":"干货教程","emotion":"焦虑共鸣","social":"价值传递"},"image_modes":["cover_impact","step_cards"],"video_modes":[],"notes":"话题示例:笔记工具提升效率"}',
2, 0, 0, NOW()),
(0, '3f6ed9f62afd', '职场发展 · 经验分享', 'ai_create', 'career_experience',
'{"formula":["emotion","utility","social"],"title_types":["story","compare"],"body":{"domain":"职场发展","content_type":"经验分享","emotion":"理想生活","social":"身份标签"},"image_modes":["cover_impact","lifestyle"],"video_modes":[],"notes":"话题示例:职场人际关系"}',
3, 0, 0, NOW()),
(0, '61a4d4febada', '情感共鸣 · 真实场景', 'ai_create', 'emotional_relatable',
'{"formula":["emotion","social"],"title_types":["story","question"],"body":{"domain":"情感共鸣","content_type":"经验分享","emotion":"生活场景","social":"情感支持"},"image_modes":["lifestyle"],"video_modes":["vlog_clip"],"notes":"让读者觉得这也太真实了"}',
4, 0, 0, NOW()),
(0, 'ec62cc03eea9', '避坑指南 · 观点表达', 'ai_create', 'pitfall_opinion',
'{"formula":["emotion","utility","visual","social"],"title_types":["number"],"body":{"domain":"职场发展","content_type":"避坑指南","emotion":"吐槽宣泄","social":"观点表达"},"image_modes":["info_chart"],"video_modes":["talking_head"],"notes":"话题示例:避坑指南"}',
5, 0, 0, NOW())
ON DUPLICATE KEY UPDATE `Title` = VALUES(`Title`), `RecipeJson` = VALUES(`RecipeJson`);
INSERT INTO `t_xhs_ai_provider` (
`CustomerId`, `ProviderKey`, `ProviderType`, `DisplayName`, `BaseUrl`,
`ApiKeyEnc`, `ApiSecretEnc`, `IsDefault`, `Enabled`,
`IsDeleted`, `CreateUserId`, `CreateTime`
) VALUES
(0, 'ai_zhipu', 'zhipu', '智谱 AI', 'https://open.bigmodel.cn/api/paas/v4', NULL, 'glm-4-flash', 1, 0, 0, 0, NOW()),
(0, 'ai_deepseek', 'deepseek', 'DeepSeek', 'https://api.deepseek.com/v1', NULL, 'deepseek-chat', 0, 0, 0, 0, NOW()),
(0, 'ai_chatgpt', 'chatgpt', 'OpenAI', 'https://api.openai.com/v1', NULL, 'gpt-4o-mini', 0, 0, 0, 0, NOW())
ON DUPLICATE KEY UPDATE `DisplayName` = VALUES(`DisplayName`), `BaseUrl` = VALUES(`BaseUrl`);