aigeo_mysql8.sql 69.7 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ====================================================================================================
-- 1) 核心:公司、用户、权限、订阅
-- ====================================================================================================

-- 公司表(多租户根)
-- 存储企业客户的基本信息和订阅状态。
CREATE TABLE `ai_companies` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '公司主键ID',
  `name` VARCHAR(255) NOT NULL COMMENT '公司名称',
  `domain` VARCHAR(100) DEFAULT NULL COMMENT '公司域名,用于多租户访问',
  `status` ENUM('active','suspended','trial') DEFAULT 'trial' COMMENT '公司状态',
  `trial_expiry_date` DATE DEFAULT NULL COMMENT '试用到期日',
  `default_settings` JSON DEFAULT NULL COMMENT '企业默认设置(JSON)',
  `billing_email` VARCHAR(100) DEFAULT NULL COMMENT '账单邮箱',
  `contact_phone` VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
  `address` TEXT DEFAULT NULL COMMENT '公司地址',
  `logo_url` VARCHAR(255) DEFAULT NULL COMMENT '公司Logo URL',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_companies_domain` (`domain`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公司表(多租户根)';

-- 用户表
-- 存储用户信息,并关联到所属公司。
CREATE TABLE `ai_users` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '用户主键ID',
  `company_id` INT NOT NULL COMMENT '所属公司ID(外键)',
  `username` VARCHAR(50) NOT NULL COMMENT '登录用户名',
  `email` VARCHAR(100) NOT NULL COMMENT '用户邮箱',
  `password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希',
  `full_name` VARCHAR(100) DEFAULT NULL COMMENT '用户全名',
  `avatar_url` VARCHAR(255) DEFAULT NULL COMMENT '用户头像URL',
  `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
  `role` ENUM('admin','manager','editor','viewer') DEFAULT 'editor' COMMENT '用户角色',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用(1启用/0禁用)',
  `last_login` TIMESTAMP NULL DEFAULT NULL COMMENT '最近登录时间',
  `last_password_change` TIMESTAMP NULL DEFAULT NULL COMMENT '上次修改密码时间',
  `failed_login_attempts` INT DEFAULT 0 COMMENT '登录失败次数',
  `locked_until` TIMESTAMP NULL DEFAULT NULL COMMENT '锁定截止时间',
  `timezone` VARCHAR(50) DEFAULT 'Asia/Shanghai' COMMENT '用户时区',
  `preferences` JSON DEFAULT NULL COMMENT '用户个性化设置',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_users_username` (`username`),
  UNIQUE KEY `uk_users_email` (`email`),
  KEY `idx_users_company` (`company_id`),
  KEY `idx_users_company_role` (`company_id`, `role`),
  KEY `idx_users_active` (`is_active`),
  CONSTRAINT `fk_user_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

-- 角色表 (增强权限控制)
-- 允许公司自定义角色及其权限。
CREATE TABLE `ai_roles` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `company_id` INT NOT NULL COMMENT '所属公司',
  `name` VARCHAR(50) NOT NULL COMMENT '角色名称(如 admin, editor)',
  `description` VARCHAR(255) DEFAULT NULL,
  `permissions` JSON DEFAULT NULL COMMENT '该角色拥有的权限列表(JSON)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_roles_company_name` (`company_id`, `name`),
  CONSTRAINT `fk_role_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 用户-角色关联表 (支持多角色)
-- 一个用户可以拥有多个角色。
CREATE TABLE `ai_user_roles` (
  `user_id` INT NOT NULL,
  `role_id` INT NOT NULL,
  PRIMARY KEY (`user_id`, `role_id`),
  FOREIGN KEY (user_id) REFERENCES ai_users(id) ON DELETE CASCADE,
  FOREIGN KEY (role_id) REFERENCES ai_roles(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 审计日志表
-- 记录用户的关键操作,用于安全审计和追踪。
CREATE TABLE `ai_audit_logs` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '审计日志主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `user_id` INT NOT NULL COMMENT '操作用户ID(外键)',
  `action` VARCHAR(100) NOT NULL COMMENT '操作类型(create/update/delete/publish等)',
  `target_table` VARCHAR(100) NOT NULL COMMENT '被操作表名',
  `target_id` INT NOT NULL COMMENT '被操作记录ID',
  `details` JSON DEFAULT NULL COMMENT '操作详情(JSON,可记录前后值)',
  `ip_address` VARCHAR(45) DEFAULT NULL COMMENT '客户端IP',
  `user_agent` TEXT DEFAULT NULL COMMENT '浏览器信息',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  PRIMARY KEY (`id`),
  KEY `idx_audit_company` (`company_id`),
  KEY `idx_audit_user` (`user_id`),
  CONSTRAINT `fk_audit_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_audit_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='操作审计日志';

-- ====================================================================================================
-- 2) 订阅与计费系统
-- ====================================================================================================

-- 订阅计划定义表
-- 定义可用的订阅计划及其基本属性。
CREATE TABLE `ai_subscription_plans` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `plan_key` VARCHAR(50) NOT NULL COMMENT '计划标识符(如 free, basic, premium)',
  `name` VARCHAR(100) NOT NULL COMMENT '计划显示名称',
  `description` TEXT DEFAULT NULL COMMENT '计划描述',
  `price_monthly` DECIMAL(10,2) DEFAULT 0.00 COMMENT '月费价格',
  `price_yearly` DECIMAL(10,2) DEFAULT 0.00 COMMENT '年费价格',
  `max_users` INT DEFAULT 1 COMMENT '最大用户数',
  `max_storage_mb` INT DEFAULT 100 COMMENT '最大存储空间(MB)',
  `max_api_calls_per_day` INT DEFAULT 1000 COMMENT '每日API调用限制',
  `features` JSON DEFAULT NULL COMMENT '包含的功能列表(JSON)',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `sort_order` INT DEFAULT 0 COMMENT '排序权重',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_plans_plan_key` (`plan_key`),
  KEY `idx_plans_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订阅计划定义表';

-- 公司订阅记录表
-- 记录每个公司的订阅历史和当前状态。
CREATE TABLE `ai_company_subscriptions` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `company_id` INT NOT NULL COMMENT '公司ID',
  `plan_id` INT NOT NULL COMMENT '订阅计划ID',
  `plan_key` VARCHAR(50) NOT NULL COMMENT '冗余字段:计划标识符',
  `subscription_type` ENUM('monthly','yearly') DEFAULT 'monthly' COMMENT '订阅类型',
  `status` ENUM('active','cancelled','expired','suspended') DEFAULT 'active' COMMENT '订阅状态',
  `start_date` DATE NOT NULL COMMENT '订阅开始日期',
  `end_date` DATE DEFAULT NULL COMMENT '订阅结束日期',
  `next_billing_date` DATE DEFAULT NULL COMMENT '下次计费日期',
  `trial_start_date` DATE DEFAULT NULL COMMENT '试用开始日期',
  `trial_end_date` DATE DEFAULT NULL COMMENT '试用结束日期',
  `amount` DECIMAL(10,2) DEFAULT 0.00 COMMENT '订阅金额',
  `payment_method` VARCHAR(50) DEFAULT NULL COMMENT '支付方式',
  `payment_status` ENUM('pending','paid','failed','refunded') DEFAULT 'pending' COMMENT '支付状态',
  `auto_renew` TINYINT(1) DEFAULT 1 COMMENT '是否自动续费',
  `cancel_reason` TEXT DEFAULT NULL COMMENT '取消原因',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_subscriptions_company` (`company_id`),
  KEY `idx_subscriptions_status` (`status`),
  KEY `idx_subscriptions_next_billing` (`next_billing_date`),
  CONSTRAINT `fk_subscription_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_subscription_plan` FOREIGN KEY (`plan_id`) REFERENCES `ai_subscription_plans` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司订阅记录表';

-- 订阅支付记录表
-- 记录具体的支付交易。
CREATE TABLE `ai_subscription_payments` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `subscription_id` INT NOT NULL COMMENT '订阅ID',
  `company_id` INT NOT NULL COMMENT '公司ID',
  `amount` DECIMAL(10,2) NOT NULL COMMENT '支付金额',
  `currency` VARCHAR(3) DEFAULT 'CNY' COMMENT '货币类型',
  `payment_method` VARCHAR(50) DEFAULT NULL COMMENT '支付方式(如 alipay, wechat, stripe)',
  `transaction_id` VARCHAR(255) DEFAULT NULL COMMENT '交易ID',
  `payment_status` ENUM('pending','success','failed','refunded') DEFAULT 'pending' COMMENT '支付状态',
  `payment_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '支付时间',
  `period_start` DATE DEFAULT NULL COMMENT '计费周期开始日期',
  `period_end` DATE DEFAULT NULL COMMENT '计费周期结束日期',
  `invoice_url` VARCHAR(500) DEFAULT NULL COMMENT '发票URL',
  `failure_reason` TEXT DEFAULT NULL COMMENT '失败原因',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_payments_company` (`company_id`),
  KEY `idx_payments_subscription` (`subscription_id`),
  KEY `idx_payments_status` (`payment_status`),
  CONSTRAINT `fk_payment_subscription` FOREIGN KEY (`subscription_id`) REFERENCES `ai_company_subscriptions` (`id`),
  CONSTRAINT `fk_payment_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订阅支付记录表';

-- ====================================================================================================
-- 3) AI功能模块与权限控制
-- ====================================================================================================

-- AI功能模块定义表
-- 定义系统提供的所有AI功能模块。
CREATE TABLE `ai_features` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `feature_key` VARCHAR(50) NOT NULL COMMENT '功能标识符 (如 ai_copywriting, ai_landing_page)',
  `name` VARCHAR(100) NOT NULL COMMENT '功能名称',
  `description` TEXT DEFAULT NULL COMMENT '功能描述',
  `category` VARCHAR(50) DEFAULT NULL COMMENT '功能分类(如 content, marketing, website)',
  `is_premium` TINYINT(1) DEFAULT 0 COMMENT '是否为高级功能',
  `sort_order` INT DEFAULT 0 COMMENT '排序权重',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_features_key` (`feature_key`),
  KEY `idx_features_category` (`category`),
  KEY `idx_features_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI功能模块定义表';

-- 订阅计划功能权限表
-- 定义每个订阅计划对各AI功能的访问权限和使用限制。
CREATE TABLE `ai_plan_features` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `plan_id` INT NOT NULL COMMENT '订阅计划ID',
  `feature_id` INT NOT NULL COMMENT '功能ID',
  `is_allowed` TINYINT(1) DEFAULT 1 COMMENT '是否允许使用',
  `usage_limit` INT DEFAULT NULL COMMENT '使用限制(如每月次数,NULL为无限制)',
  `limit_period` ENUM('daily','monthly','yearly','total') DEFAULT 'monthly' COMMENT '限制周期',
  `custom_config` JSON DEFAULT NULL COMMENT '自定义配置(JSON)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_plan_feature` (`plan_id`, `feature_id`),
  CONSTRAINT `fk_planfeature_plan` FOREIGN KEY (`plan_id`) REFERENCES `ai_subscription_plans` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_planfeature_feature` FOREIGN KEY (`feature_id`) REFERENCES `ai_features` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订阅计划功能权限表';

-- 功能使用记录表
-- 记录用户对公司功能的具体使用情况,用于计费和分析。
CREATE TABLE `ai_feature_usage` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `company_id` INT NOT NULL COMMENT '公司ID',
  `user_id` INT DEFAULT NULL COMMENT '用户ID(可选)',
  `feature_id` INT NOT NULL COMMENT '功能ID',
  `usage_type` VARCHAR(50) DEFAULT NULL COMMENT '使用类型(如 generate, export, analyze)',
  `usage_count` INT DEFAULT 1 COMMENT '使用次数',
  `related_resource_id` VARCHAR(100) DEFAULT NULL COMMENT '相关资源ID(如文章ID、页面ID)',
  `ip_address` VARCHAR(45) DEFAULT NULL COMMENT '客户端IP',
  `user_agent` TEXT DEFAULT NULL COMMENT '用户代理',
  `metadata` JSON DEFAULT NULL COMMENT '额外元数据',
  `used_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '使用时间',
  PRIMARY KEY (`id`),
  KEY `idx_usage_company_feature` (`company_id`, `feature_id`),
  KEY `idx_usage_feature_date` (`feature_id`, `used_at`),
  KEY `idx_usage_user` (`user_id`),
  CONSTRAINT `fk_usage_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_usage_feature` FOREIGN KEY (`feature_id`) REFERENCES `ai_features` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='功能使用记录表';

-- 功能使用统计表(用于快速查询)
-- 按日统计功能使用量,提高查询效率。
CREATE TABLE `ai_feature_usage_stats` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `company_id` INT NOT NULL COMMENT '公司ID',
  `feature_id` INT NOT NULL COMMENT '功能ID',
  `stat_date` DATE NOT NULL COMMENT '统计日期',
  `usage_count` INT DEFAULT 0 COMMENT '当日使用次数',
  `last_used_at` TIMESTAMP DEFAULT NULL COMMENT '最后使用时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_stats_company_feature_date` (`company_id`, `feature_id`, `stat_date`),
  KEY `idx_stats_company` (`company_id`),
  KEY `idx_stats_feature` (`feature_id`),
  CONSTRAINT `fk_stats_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_stats_feature` FOREIGN KEY (`feature_id`) REFERENCES `ai_features` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='功能使用统计表';

-- ====================================================================================================
-- 4) AI内容生成核心:模型、Prompt、文件
-- ====================================================================================================

-- AI服务配置表
-- 存储连接到不同AI服务(如Dify, OpenAI)的配置信息。
CREATE TABLE `ai_dify_api_configs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT 'AI配置主键ID',
  `company_id` INT DEFAULT NULL COMMENT '公司ID(NULL 表示共享/通用)',
  `provider` ENUM('dify','openai','anthropic','google','azure_openai','other') DEFAULT 'dify' COMMENT 'AI 提供方',
  `name` VARCHAR(100) NOT NULL COMMENT '配置名称(便于识别)',
  `base_url` VARCHAR(255) DEFAULT NULL COMMENT 'API 基础地址(可选)',
  `api_key` VARCHAR(255) DEFAULT NULL COMMENT 'API Key/Token',
  `model_name` VARCHAR(100) DEFAULT NULL COMMENT '模型名称',
  `temperature` DECIMAL(3,2) DEFAULT 0.70 COMMENT '默认温度值',
  `top_p` DECIMAL(3,2) DEFAULT 1.00 COMMENT 'TopP 值',
  `max_tokens` INT DEFAULT 2048 COMMENT '最大生成 token 数',
  `request_headers` JSON DEFAULT NULL COMMENT '额外请求头(JSON)',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_dify_company` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI 服务配置(Dify/OpenAI 等)';

-- Prompt 模板表
-- 存储可复用的Prompt模板。
CREATE TABLE `ai_prompt_templates` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Prompt 模板主键ID',
  `company_id` INT DEFAULT NULL COMMENT '公司ID(NULL 表示系统模板)',
  `name` VARCHAR(100) NOT NULL COMMENT '模板名称',
  `description` VARCHAR(255) DEFAULT NULL COMMENT '模板描述',
  `language` VARCHAR(20) DEFAULT 'zh' COMMENT '默认语言编码(en/zh 等)',
  `content` LONGTEXT NOT NULL COMMENT '模板内容(可含变量占位符)',
  `variables` JSON DEFAULT NULL COMMENT '变量说明(JSON)',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_prompt_company` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Prompt 模板表';

-- 上传文件表
-- 管理用户上传的文件,如知识库、图片、视频等。
CREATE TABLE `ai_uploaded_files` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '上传文件主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `user_id` INT NOT NULL COMMENT '上传者用户ID(外键)',
  `file_name` VARCHAR(255) NOT NULL COMMENT '原始文件名',
  `file_path` VARCHAR(500) NOT NULL COMMENT '服务器存储路径或外部URL',
  `file_type` ENUM('knowledge','image','video','document','other') NOT NULL COMMENT '文件类型',
  `file_size` BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
  `mime_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME 类型',
  `checksum` VARCHAR(64) DEFAULT NULL COMMENT '校验和(可选)',
  `version` INT DEFAULT 1 COMMENT '版本号(用于版本控制)',
  `status` ENUM('active','archived','deleted') DEFAULT 'active' COMMENT '文件状态',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
  PRIMARY KEY (`id`),
  KEY `idx_files_company` (`company_id`),
  KEY `idx_files_user` (`user_id`),
  CONSTRAINT `fk_file_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_file_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='上传文件表(知识库/媒体等)';

-- ====================================================================================================
-- 5) AI内容生成:文章
-- ====================================================================================================

-- 文章类型表
-- 分类文章,如产品介绍、新闻稿等。
CREATE TABLE `ai_article_types` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章类型主键ID',
  `name` VARCHAR(50) NOT NULL COMMENT '文章类型名称(如产品介绍)',
  `description` VARCHAR(255) DEFAULT NULL COMMENT '类型说明',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_article_types_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章类型表';

-- 文章生成配置表
-- 存储文章生成的参数和偏好设置。
CREATE TABLE `ai_article_generation_configs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章生成配置主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `name` VARCHAR(100) NOT NULL COMMENT '配置名称',
  `platform_id` INT DEFAULT NULL COMMENT '适用发布平台ID(可选)',
  `article_type_id` INT DEFAULT NULL COMMENT '文章类型ID(外键)',
  `writing_language` VARCHAR(20) DEFAULT 'en' COMMENT '写作语言(en/zh)',
  `remove_ai_tone` TINYINT(1) DEFAULT 1 COMMENT '是否去除AI味道',
  `ai_taste_level` ENUM('colloquial','junior_high','senior_high','professional') DEFAULT 'junior_high' COMMENT 'AI风格等级',
  `article_length_min` INT DEFAULT 800 COMMENT '最小长度(字符)',
  `article_length_max` INT DEFAULT 1500 COMMENT '最大长度(字符)',
  `auto_seo_optimization` TINYINT(1) DEFAULT 1 COMMENT '自动SEO优化',
  `keyword_density_min` DECIMAL(5,2) DEFAULT 1.00 COMMENT '关键词密度下限(%)',
  `keyword_density_max` DECIMAL(5,2) DEFAULT 2.00 COMMENT '关键词密度上限(%)',
  `auto_geo_optimization` TINYINT(1) DEFAULT 1 COMMENT '是否自动GEO优化',
  `auto_structured_data` TINYINT(1) DEFAULT 1 COMMENT '是否自动生成结构化数据',
  `multi_version_count` INT DEFAULT 3 COMMENT '生成版本数量',
  `extra_options` JSON DEFAULT NULL COMMENT '额外选项(JSON)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_config_company` (`company_id`),
  KEY `idx_config_platform` (`platform_id`),
  KEY `idx_config_article_type` (`article_type_id`),
  CONSTRAINT `fk_config_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_config_platform` FOREIGN KEY (`platform_id`) REFERENCES `ai_publishing_platforms` (`id`),
  CONSTRAINT `fk_config_article_type` FOREIGN KEY (`article_type_id`) REFERENCES `ai_article_types` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI 文章生成配置';

-- 文章生成任务表
-- 记录每次文章生成的请求和状态。
CREATE TABLE `ai_article_generation_tasks` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章生成任务主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `user_id` INT NOT NULL COMMENT '发起用户ID(外键)',
  `config_id` INT DEFAULT NULL COMMENT '使用的生成配置ID(外键)',
  `article_theme` VARCHAR(255) DEFAULT NULL COMMENT '文章主题/标题(输入)',
  `topic_ids` TEXT DEFAULT NULL COMMENT '所选话题ID列表(逗号分隔)',
  `reference_urls` TEXT DEFAULT NULL COMMENT '参考URL列表(逗号分隔)',
  `reference_content` LONGTEXT DEFAULT NULL COMMENT '高度参考链接抓取到的内容摘要',
  `status` ENUM('pending','processing','completed','failed') DEFAULT 'pending' COMMENT '任务状态',
  `progress` TINYINT DEFAULT 0 COMMENT '进度(0-100)',
  `error_message` TEXT DEFAULT NULL COMMENT '错误信息',
  `dify_api_config_id` INT DEFAULT NULL COMMENT '调用的AI配置ID(外键)',
  `prompt_template_id` INT DEFAULT NULL COMMENT '使用的 Prompt 模板 ID(外键)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `completed_at` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间',
  PRIMARY KEY (`id`),
  KEY `idx_task_company_status` (`company_id`,`status`),
  KEY `idx_task_user` (`user_id`),
  KEY `idx_task_config` (`config_id`),
  CONSTRAINT `fk_task_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_task_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`),
  CONSTRAINT `fk_task_config` FOREIGN KEY (`config_id`) REFERENCES `ai_article_generation_configs` (`id`),
  CONSTRAINT `fk_task_ai_config` FOREIGN KEY (`dify_api_config_id`) REFERENCES `ai_dify_api_configs` (`id`),
  CONSTRAINT `fk_task_prompt_template` FOREIGN KEY (`prompt_template_id`) REFERENCES `ai_prompt_templates` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章生成任务';

-- 生成的文章表(多版本支持)
-- 存储AI生成的最终文章内容。
CREATE TABLE `ai_generated_articles` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '生成文章主键ID',
  `task_id` INT DEFAULT NULL COMMENT '来源生成任务ID(外键,可空)',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `version` INT DEFAULT 1 COMMENT '文章版本号(用于多版本)',
  `title` VARCHAR(255) DEFAULT NULL COMMENT '文章标题',
  `content` LONGTEXT DEFAULT NULL COMMENT '文章纯文本内容(不含HTML)',
  `html_content` LONGTEXT DEFAULT NULL COMMENT '文章HTML格式内容(含排版)',
  `faq_section` JSON DEFAULT NULL COMMENT 'FAQ 部分(JSON)',
  `structured_data` JSON DEFAULT NULL COMMENT '结构化数据 JSON-LD(全文)',
  `word_count` INT DEFAULT 0 COMMENT '文章字数统计',
  `keyword_density` JSON DEFAULT NULL COMMENT '关键词密度分析结果(JSON)',
  `is_selected` TINYINT(1) DEFAULT 0 COMMENT '是否被选为最终版本(1是)',
  `status` ENUM('draft','approved','archived','deleted') DEFAULT 'draft' COMMENT '文章状态',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_articles_company_status` (`company_id`,`status`),
  KEY `idx_articles_task` (`task_id`),
  CONSTRAINT `fk_article_task` FOREIGN KEY (`task_id`) REFERENCES `ai_article_generation_tasks` (`id`),
  CONSTRAINT `fk_article_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='生成的文章表(多版本支持)';

-- 文章FAQ列表
-- 存储文章的FAQ部分。
CREATE TABLE `ai_article_faqs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章 FAQ 主键ID',
  `article_id` INT NOT NULL COMMENT '文章ID(外键)',
  `question` VARCHAR(255) NOT NULL COMMENT 'FAQ 问题',
  `answer` TEXT NOT NULL COMMENT 'FAQ 回答',
  PRIMARY KEY (`id`),
  KEY `idx_article_faqs_article` (`article_id`),
  CONSTRAINT `fk_faq_article` FOREIGN KEY (`article_id`) REFERENCES `ai_generated_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章 FAQ 列表';

-- 文章结构化数据
-- 存储文章的结构化数据(JSON-LD)。
CREATE TABLE `ai_article_structured_data` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '结构化数据主键ID',
  `article_id` INT NOT NULL COMMENT '文章ID(外键)',
  `json_ld` JSON NOT NULL COMMENT 'JSON-LD 结构化数据内容',
  PRIMARY KEY (`id`),
  KEY `idx_structured_article` (`article_id`),
  CONSTRAINT `fk_structured_article` FOREIGN KEY (`article_id`) REFERENCES `ai_generated_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章结构化数据(单独表便于管理/更新)';

-- 文章媒体资源
-- 存储文章关联的图片、视频等媒体。
CREATE TABLE `ai_article_media` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章媒体资源主键ID',
  `article_id` INT NOT NULL COMMENT '文章ID(外键)',
  `media_type` ENUM('image','video','audio') NOT NULL COMMENT '媒体类型',
  `url` VARCHAR(500) NOT NULL COMMENT '媒体链接或存储路径',
  `prompt` TEXT DEFAULT NULL COMMENT '生成提示语(AI 配图时记录)',
  `source_type` ENUM('ai_generated','user_provided','external') DEFAULT 'external' COMMENT '资源来源类型',
  `alt_text` VARCHAR(255) DEFAULT NULL COMMENT '图片替代文本(SEO)',
  `caption` VARCHAR(255) DEFAULT NULL COMMENT '图片说明/标题',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_media_article` (`article_id`),
  CONSTRAINT `fk_media_article` FOREIGN KEY (`article_id`) REFERENCES `ai_generated_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章媒体资源(多张图片/多视频)';

-- 文章多语言翻译表
-- 存储文章的不同语言版本。
CREATE TABLE `ai_article_translations` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章翻译主键ID',
  `article_id` INT NOT NULL COMMENT '原文章ID(外键)',
  `language` VARCHAR(20) NOT NULL COMMENT '翻译目标语言(如 en/zh)',
  `title` VARCHAR(255) DEFAULT NULL COMMENT '译文标题',
  `content` LONGTEXT DEFAULT NULL COMMENT '译文纯文本内容',
  `html_content` LONGTEXT DEFAULT NULL COMMENT '译文 HTML 内容',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_article_language` (`article_id`,`language`),
  KEY `idx_translations_article` (`article_id`),
  CONSTRAINT `fk_translation_article` FOREIGN KEY (`article_id`) REFERENCES `ai_generated_articles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章多语言翻译表';

-- ====================================================================================================
-- 6) AI内容生成:落地页
-- ====================================================================================================

-- 落地页模板表
-- 存储可用的落地页布局模板。
CREATE TABLE `ai_landing_page_templates` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '落地页模板主键ID',
  `name` VARCHAR(100) NOT NULL COMMENT '模板名称(如:单栏布局)',
  `code` VARCHAR(50) NOT NULL COMMENT '模板代码(如:single-column)',
  `description` VARCHAR(255) DEFAULT NULL COMMENT '模板描述',
  `preview_image_url` VARCHAR(255) DEFAULT NULL COMMENT '预览图URL',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_lp_templates_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='落地页布局与设计模板';

-- 落地页项目表
-- 代表一个完整的落地页创建流程。
CREATE TABLE `ai_landing_page_projects` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '落地页项目主键ID',
  `company_id` INT NOT NULL COMMENT '所属公司ID(外键)',
  `user_id` INT NOT NULL COMMENT '创建者用户ID(外键)',
  `name` VARCHAR(255) NOT NULL COMMENT '落地页项目名称(用于内部识别)',
  `status` ENUM('draft','configuring','generated','published','archived') DEFAULT 'draft' COMMENT '项目状态',
  `last_step_completed` INT DEFAULT 0 COMMENT '最后完成的步骤号',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_lp_projects_company` (`company_id`),
  KEY `idx_lp_projects_user` (`user_id`),
  CONSTRAINT `fk_lp_project_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_lp_project_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI落地页构建项目表';

-- 落地页各步骤配置数据
-- 存储落地页构建过程中用户输入的所有配置信息。
CREATE TABLE `ai_landing_page_step_configs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '配置主键ID',
  `project_id` INT NOT NULL COMMENT '落地页项目ID(外键)',
  -- Step 1: 目标用户
  `target_audience_desc` TEXT COMMENT '目标用户描述',
  `user_pain_points` TEXT COMMENT '用户痛点(可JSON或换行分隔)',
  `user_expectations` TEXT COMMENT '用户期望结果',
  `age_groups` VARCHAR(255) DEFAULT NULL COMMENT '年龄段(逗号分隔)',
  `gender_preference` ENUM('male','female','balanced') DEFAULT 'balanced' COMMENT '性别倾向',
  `behavior_characteristics` VARCHAR(255) DEFAULT NULL COMMENT '用户行为特征(逗号分隔)',
  `decision_making_styles` VARCHAR(255) DEFAULT NULL COMMENT '用户决策方式(逗号分隔)',
  -- Step 2: 落地页目标
  `industry_primary` VARCHAR(100) DEFAULT NULL COMMENT '一级行业',
  `industry_secondary` VARCHAR(100) DEFAULT NULL COMMENT '二级行业',
  `industry_tertiary` VARCHAR(100) DEFAULT NULL COMMENT '子分类',
  `marketing_goal` VARCHAR(50) DEFAULT NULL COMMENT '营销目标(lead-collection, product-sales等)',
  -- Step 3: 风格与配色
  `design_style` VARCHAR(50) DEFAULT NULL COMMENT '设计风格(modern, professional等)',
  `primary_color` VARCHAR(20) DEFAULT NULL COMMENT '主色调',
  `accent_color` VARCHAR(20) DEFAULT NULL COMMENT '辅助色调',
  `template_id` INT DEFAULT NULL COMMENT '布局模板ID(外键)',
  -- Step 4: 核心卖点
  `unique_value_proposition` TEXT COMMENT '独特价值主张',
  `core_advantages` JSON DEFAULT NULL COMMENT '核心优势列表(JSON数组)',
  `primary_keyword` VARCHAR(255) DEFAULT NULL COMMENT '主要关键词',
  `secondary_keywords` JSON DEFAULT NULL COMMENT '次要关键词列表(JSON数组)',
  -- Step 5: 页面内容
  `content_generation_type` ENUM('ai','custom','upload') DEFAULT 'ai' COMMENT '内容生成方式',
  `company_name` VARCHAR(255) DEFAULT NULL COMMENT '公司全称',
  `brand_name` VARCHAR(255) DEFAULT NULL COMMENT '品牌名称',
  `company_description` TEXT COMMENT '公司介绍',
  `video_url` VARCHAR(500) DEFAULT NULL COMMENT '视频链接',
  `logo_file_id` INT DEFAULT NULL COMMENT '公司Logo文件ID(关联ai_uploaded_files)',
  `contact_info` JSON DEFAULT NULL COMMENT '联系信息(地址、电话、邮箱、工作时间)',
  `social_media_links` JSON DEFAULT NULL COMMENT '社交媒体链接(JSON数组)',
  -- Step 6: CTA
  `primary_cta_text` VARCHAR(100) DEFAULT NULL COMMENT '主要CTA按钮文案',
  `secondary_cta_texts` JSON DEFAULT NULL COMMENT '次要CTA按钮文案(JSON数组)',
  -- Step 7: 信任元素
  `testimonials` JSON DEFAULT NULL COMMENT '客户评价/推荐语(JSON数组,含姓名、职位、内容)',
  `social_proofs` JSON DEFAULT NULL COMMENT '社会证明数据(JSON数组,含标签、数值)',
  -- Step 8: 表单字段
  `form_fields` JSON DEFAULT NULL COMMENT '表单字段配置(JSON对象,key为字段名,value为是否启用)',
  -- Step 9: 生成与部署
  `page_title` VARCHAR(255) DEFAULT NULL COMMENT '页面SEO标题',
  `page_description` TEXT COMMENT '页面SEO描述',
  `ga_tracking_code` TEXT COMMENT '谷歌广告跟踪代码',
  `deployment_method` ENUM('ftp','link') DEFAULT 'link' COMMENT '部署方式',
  `deployment_config` JSON DEFAULT NULL COMMENT '部署配置(FTP信息或子域名)',
  `pricing_plan` VARCHAR(50) DEFAULT NULL COMMENT '选择的套餐(basic, pro, enterprise)',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_lp_config_project` (`project_id`),
  CONSTRAINT `fk_lp_config_project` FOREIGN KEY (`project_id`) REFERENCES `ai_landing_page_projects` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_lp_config_template` FOREIGN KEY (`template_id`) REFERENCES `ai_landing_page_templates` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='落地页各步骤配置数据';

-- 落地页AI生成任务表
-- 记录落地页生成的请求和状态。
CREATE TABLE `ai_landing_page_generation_tasks` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '任务主键ID',
  `project_id` INT NOT NULL COMMENT '落地页项目ID (外键)',
  `user_id` INT NOT NULL COMMENT '发起用户ID (外键)',
  `status` ENUM('pending','processing','completed','failed') DEFAULT 'pending' COMMENT '任务状态',
  `progress` TINYINT DEFAULT 0 COMMENT '进度 (0-100)',
  `dify_api_config_id` INT DEFAULT NULL COMMENT '调用的AI配置ID (外键, 关联 ai_dify_api_configs)',
  `prompt_template_id` INT DEFAULT NULL COMMENT '使用的Prompt模板ID (外键, 关联 ai_prompt_templates)',
  `final_prompt_snapshot` LONGTEXT DEFAULT NULL COMMENT '发送给AI的最终Prompt快照(用于调试和记录)',
  `error_message` TEXT DEFAULT NULL COMMENT '错误信息',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `completed_at` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间',
  PRIMARY KEY (`id`),
  KEY `idx_lp_task_project` (`project_id`),
  KEY `idx_lp_task_status` (`status`),
  CONSTRAINT `fk_lp_task_project` FOREIGN KEY (`project_id`) REFERENCES `ai_landing_page_projects` (`id`),
  CONSTRAINT `fk_lp_task_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`),
  CONSTRAINT `fk_lp_task_ai_config` FOREIGN KEY (`dify_api_config_id`) REFERENCES `ai_dify_api_configs` (`id`),
  CONSTRAINT `fk_lp_task_prompt_template` FOREIGN KEY (`prompt_template_id`) REFERENCES `ai_prompt_templates` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='落地页AI生成任务表';

-- 最终生成的落地页(支持多版本)
-- 存储AI生成的最终落地页HTML代码。
CREATE TABLE `ai_generated_landing_pages` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '生成落地页主键ID',
  `project_id` INT NOT NULL COMMENT '来源项目ID(外键)',
  `version_code` VARCHAR(20) NOT NULL DEFAULT 'A' COMMENT '版本标识(用于A/B测试,如A, B)',
  `html_content` LONGTEXT COMMENT '落地页HTML内容',
  `status` ENUM('draft','final','published') DEFAULT 'draft' COMMENT '版本状态',
  `publish_url` VARCHAR(500) DEFAULT NULL COMMENT '发布后的URL(使用link方式时)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '生成时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_lp_project_version` (`project_id`, `version_code`),
  CONSTRAINT `fk_lp_page_project` FOREIGN KEY (`project_id`) REFERENCES `ai_landing_page_projects` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='最终生成的落地页(支持多版本)';

-- 落地页项目关联的媒体资产
-- 存储落地页项目中使用的图片、Logo等文件。
CREATE TABLE `ai_landing_page_assets` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '资产主键ID',
  `project_id` INT NOT NULL COMMENT '落地页项目ID(外键)',
  `asset_type` ENUM('product_image','certification_logo','testimonial_avatar') NOT NULL COMMENT '资产类型',
  `uploaded_file_id` INT NOT NULL COMMENT '上传文件ID(外键)',
  `related_data` JSON DEFAULT NULL COMMENT '相关数据(如关联的产品名或评价人)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_lp_assets_project` (`project_id`),
  CONSTRAINT `fk_lp_asset_project` FOREIGN KEY (`project_id`) REFERENCES `ai_landing_page_projects` (`id`),
  CONSTRAINT `fk_lp_asset_file` FOREIGN KEY (`uploaded_file_id`) REFERENCES `ai_uploaded_files` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='落地页项目关联的媒体资产';

-- ====================================================================================================
-- 7) AI内容生成:网站 (简化版)
-- ====================================================================================================

-- AI网站构建项目总表
-- 代表一个完整的网站创建流程。
CREATE TABLE `ai_website_projects` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '网站项目主键ID',
  `company_id` INT NOT NULL COMMENT '所属公司ID (外键)',
  `user_id` INT NOT NULL COMMENT '创建者用户ID (外键)',
  `project_name` VARCHAR(255) NOT NULL COMMENT '项目名称 (用于内部识别)',
  `site_name` VARCHAR(255) DEFAULT NULL COMMENT '最终生成的网站名称',
  `status` ENUM('draft','configuring','generating','completed','published') DEFAULT 'draft' COMMENT '项目状态',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_website_projects_company` (`company_id`),
  CONSTRAINT `fk_website_project_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_website_project_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI网站构建项目总表';

-- AI网站构建器配置(存储站点地图)
-- 存储网站的全局配置和站点地图结构。
CREATE TABLE `ai_website_build_configs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '配置主键ID',
  `project_id` INT NOT NULL COMMENT '网站项目ID (外键)',
  `website_type` VARCHAR(50) DEFAULT NULL COMMENT '网站类型 (business, portfolio等)',
  `site_identity` JSON DEFAULT NULL COMMENT '网站身份信息 (名称, 标语, 描述, 关键词)',
  `design_preferences` JSON DEFAULT NULL COMMENT '设计偏好 (风格, 主色调)',
  `sitemap_structure` JSON DEFAULT NULL COMMENT '站点地图结构定义 (JSON, 描述栏目层级和类型)',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_website_config_project` (`project_id`),
  CONSTRAINT `fk_website_config_project` FOREIGN KEY (`project_id`) REFERENCES `ai_website_projects` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI网站构建器配置(存储站点地图)';

-- 网站栏目结构表 (支持无限层级)
-- 定义网站的栏目结构。
CREATE TABLE `ai_website_channels` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '网站栏目主键ID',
  `project_id` INT NOT NULL COMMENT '所属网站项目ID (外键)',
  `parent_id` INT DEFAULT NULL COMMENT '父栏目ID (用于实现层级结构)',
  `name` VARCHAR(100) NOT NULL COMMENT '栏目名称 (如: 公司介绍, 新闻中心)',
  `path` VARCHAR(100) NOT NULL COMMENT 'URL路径 (如: /about, /news)',
  `channel_type` ENUM('single_page', 'article_list', 'product_list', 'custom') NOT NULL COMMENT '栏目类型',
  `display_order` INT DEFAULT 0 COMMENT '显示顺序',
  `is_visible_in_nav` TINYINT(1) DEFAULT 1 COMMENT '是否在主导航中可见',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_channel_project` (`project_id`),
  KEY `idx_channel_parent` (`parent_id`),
  CONSTRAINT `fk_channel_project` FOREIGN KEY (`project_id`) REFERENCES `ai_website_projects` (`id`),
  CONSTRAINT `fk_channel_parent` FOREIGN KEY (`parent_id`) REFERENCES `ai_website_channels` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网站栏目结构表 (支持无限层级)';

-- 网站文章内容表
-- 存储网站栏目下的文章内容。
CREATE TABLE `ai_website_articles` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章主键ID',
  `project_id` INT NOT NULL COMMENT '所属网站项目ID (外键)',
  `channel_id` INT NOT NULL COMMENT '所属文章栏目ID (外键)',
  `title` VARCHAR(255) NOT NULL COMMENT '文章标题',
  `summary` TEXT DEFAULT NULL COMMENT '文章摘要',
  `content` LONGTEXT COMMENT '文章主体内容 (Markdown或HTML)',
  `status` ENUM('draft', 'published') DEFAULT 'draft' COMMENT '发布状态',
  `published_at` TIMESTAMP NULL DEFAULT NULL COMMENT '发布时间',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_article_project_channel` (`project_id`, `channel_id`),
  CONSTRAINT `fk_website_article_project` FOREIGN KEY (`project_id`) REFERENCES `ai_website_projects` (`id`),
  CONSTRAINT `fk_website_article_channel` FOREIGN KEY (`channel_id`) REFERENCES `ai_website_channels` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网站文章内容表';

-- 网站产品内容表
-- 存储网站栏目下的产品内容。
CREATE TABLE `ai_website_products` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '产品主键ID',
  `project_id` INT NOT NULL COMMENT '所属网站项目ID (外键)',
  `channel_id` INT NOT NULL COMMENT '所属产品栏目ID (外键)',
  `name` VARCHAR(255) NOT NULL COMMENT '产品名称',
  `description` LONGTEXT COMMENT '产品详细描述',
  `specifications` JSON DEFAULT NULL COMMENT '产品规格 (JSON格式)',
  `main_image_url` VARCHAR(255) DEFAULT NULL COMMENT '产品主图URL',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_product_project_channel` (`project_id`, `channel_id`),
  CONSTRAINT `fk_website_product_project` FOREIGN KEY (`project_id`) REFERENCES `ai_website_projects` (`id`),
  CONSTRAINT `fk_website_product_channel` FOREIGN KEY (`channel_id`) REFERENCES `ai_website_channels` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网站产品内容表';

-- 网站AI生成任务表(支持父子任务)
-- 记录网站生成的请求和状态。
CREATE TABLE `ai_website_generation_tasks` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '任务主键ID',
  `project_id` INT NOT NULL COMMENT '网站项目ID (外键)',
  `user_id` INT NOT NULL COMMENT '发起用户ID (外键)',
  `parent_task_id` INT DEFAULT NULL COMMENT '父任务ID (用于父子任务)',
  `task_type` ENUM('full_site', 'generate_shell', 'generate_page_content', 'regenerate_channel') NOT NULL COMMENT '任务类型',
  `target_id` INT DEFAULT NULL COMMENT '任务目标ID (如特定页面或栏目ID)',
  `status` ENUM('pending','processing','completed','failed', 'waiting_for_children') DEFAULT 'pending' COMMENT '任务状态',
  `dify_api_config_id` INT DEFAULT NULL COMMENT '调用的AI配置ID (外键)',
  `config_snapshot` JSON DEFAULT NULL COMMENT '生成时刻的配置快照',
  `error_message` TEXT DEFAULT NULL COMMENT '错误信息',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `completed_at` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间',
  PRIMARY KEY (`id`),
  KEY `idx_website_task_project` (`project_id`),
  KEY `idx_website_task_parent` (`parent_task_id`),
  CONSTRAINT `fk_website_task_project` FOREIGN KEY (`project_id`) REFERENCES `ai_website_projects` (`id`),
  CONSTRAINT `fk_website_task_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`),
  CONSTRAINT `fk_website_task_parent` FOREIGN KEY (`parent_task_id`) REFERENCES `ai_website_generation_tasks` (`id`),
  CONSTRAINT `fk_website_task_ai_config` FOREIGN KEY (`dify_api_config_id`) REFERENCES `ai_dify_api_configs` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网站AI生成任务表(支持父子任务)';

-- 生成的网站页面(映射到栏目或内容项)
-- 存储AI生成的最终网站页面HTML代码。
CREATE TABLE `ai_generated_website_pages` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '生成页面主键ID',
  `project_id` INT NOT NULL COMMENT '来源网站项目ID (外键)',
  `task_id` INT NOT NULL COMMENT '来源生成任务ID (外键)',
  `pageable_type` VARCHAR(100) NOT NULL COMMENT '关联类型 (Channel, Article, Product)',
  `pageable_id` INT NOT NULL COMMENT '关联类型ID',
  `file_name` VARCHAR(100) NOT NULL COMMENT '文件名 (如: index.html, news/article-1.html)',
  `html_content` LONGTEXT COMMENT '页面的完整HTML内容',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '生成时间',
  PRIMARY KEY (`id`),
  KEY `idx_pageable` (`pageable_type`, `pageable_id`),
  CONSTRAINT `fk_website_page_project` FOREIGN KEY (`project_id`) REFERENCES `ai_website_projects` (`id`),
  CONSTRAINT `fk_website_page_task` FOREIGN KEY (`task_id`) REFERENCES `ai_website_generation_tasks` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='生成的网站页面(映射到栏目或内容项)';

-- ====================================================================================================
-- 8) 内容发布系统
-- ====================================================================================================

-- 目标网站类型表
-- 对目标平台进行大类划分。
CREATE TABLE `ai_publishing_platform_types` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '平台类型主键ID',
  `name` VARCHAR(50) NOT NULL COMMENT '平台类型名称(如 Blog, Social, Video)',
  `description` VARCHAR(255) DEFAULT NULL COMMENT '类型描述',
  `icon` VARCHAR(100) DEFAULT NULL COMMENT '图标标识',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_platform_types_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='目标网站类型表';

-- 目标网站表
-- 定义支持发布的目标平台及其API配置模板。
CREATE TABLE `ai_publishing_platforms` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '目标网站主键ID',
  `type_id` INT NOT NULL COMMENT '目标网站类型ID(外键)',
  `name` VARCHAR(100) NOT NULL COMMENT '目标网站名称(如 WordPress, LinkedIn, 小红书)',
  `code` VARCHAR(50) NOT NULL COMMENT '目标网站代码(唯一)',
  `description` VARCHAR(255) DEFAULT NULL COMMENT '目标网站说明',
  `icon` VARCHAR(100) DEFAULT NULL COMMENT '目标网站图标',
  `auth_type` ENUM('oauth','api_key','basic','custom') NOT NULL COMMENT '认证类型',
  `api_config_template` JSON DEFAULT NULL COMMENT 'API 配置模板(JSON schema)',
  `character_limit` INT DEFAULT NULL COMMENT '目标网站字符限制(如微博)',
  `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_platforms_code` (`code`),
  KEY `idx_platforms_type` (`type_id`),
  CONSTRAINT `fk_platform_type` FOREIGN KEY (`type_id`) REFERENCES `ai_publishing_platform_types` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='目标网站表';

-- 企业在目标网站的配置(API key/Token等)
-- 存储公司对特定平台的授权信息。
CREATE TABLE `ai_company_platform_configs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '企业平台配置主键ID',
  `company_id` INT NOT NULL COMMENT '授权公司ID(外键)',
  `platform_id` INT NOT NULL COMMENT '目标网站ID(外键)',
  `config_data` JSON NOT NULL COMMENT '目标网站API配置信息(如 token、client_id)',
  `account_name` VARCHAR(100) DEFAULT NULL COMMENT '企业在该目标网站的账号名/展示名',
  `is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用该配置',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_company_platform` (`company_id`,`platform_id`),
  KEY `idx_company_platform_company` (`company_id`),
  KEY `idx_company_platform_platform` (`platform_id`),
  CONSTRAINT `fk_company_platform_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_company_platform_platform` FOREIGN KEY (`platform_id`) REFERENCES `ai_publishing_platforms` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='企业在目标网站的配置(API key/Token等)';

-- 定时发布任务表
-- 管理计划在未来某个时间点执行的发布任务。
CREATE TABLE `ai_scheduled_publishing_tasks` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '定时发布任务主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `publishable_type` VARCHAR(50) DEFAULT 'article' COMMENT '发布内容类型(article, landing_page)',
  `publishable_id` INT NOT NULL COMMENT '发布内容ID',
  `article_id` INT DEFAULT NULL COMMENT '要发布的文章ID(外键) - 兼容旧版',
  `platform_config_id` INT NOT NULL COMMENT '使用的企业平台配置ID(外键)',
  `schedule_time` TIMESTAMP NOT NULL COMMENT '计划发布时间',
  `status` ENUM('scheduled','processing','success','failed','cancelled') DEFAULT 'scheduled' COMMENT '任务状态',
  `retry_count` INT DEFAULT 0 COMMENT '已重试次数',
  `max_retries` INT DEFAULT 3 COMMENT '最大重试次数',
  `last_attempt_at` TIMESTAMP NULL DEFAULT NULL COMMENT '最近一次尝试执行时间',
  `error_message` TEXT DEFAULT NULL COMMENT '错误信息(失败时记录)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_schedule_company_time` (`company_id`, `schedule_time`),
  KEY `idx_schedule_status` (`status`),
  CONSTRAINT `fk_schedule_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_schedule_platform_config` FOREIGN KEY (`platform_config_id`) REFERENCES `ai_company_platform_configs` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='定时发布任务表';

-- 目标网站发布记录表(执行日志)
-- 记录所有发布操作的执行结果。
CREATE TABLE `ai_publishing_records` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '发布记录主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `publishable_type` VARCHAR(50) DEFAULT 'article' COMMENT '发布内容类型(article, landing_page)',
  `publishable_id` INT NOT NULL COMMENT '发布内容ID',
  `article_id` INT DEFAULT NULL COMMENT '文章ID(外键) - 兼容旧版',
  `platform_config_id` INT NOT NULL COMMENT '目标网站配置ID(外键)',
  `scheduled_task_id` INT DEFAULT NULL COMMENT '来源的定时任务ID(如果是定时发布则关联)',
  `status` ENUM('scheduled','published','failed') DEFAULT 'scheduled' COMMENT '发布记录状态',
  `publish_url` VARCHAR(500) DEFAULT NULL COMMENT '发布后目标网站返回的文章URL',
  `external_post_id` VARCHAR(255) DEFAULT NULL COMMENT '目标网站返回的外部帖文/文章ID',
  `publish_time` TIMESTAMP NULL DEFAULT NULL COMMENT '实际发布时间',
  `error_message` TEXT DEFAULT NULL COMMENT '失败原因(若失败)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_publishing_company_time` (`company_id`,`publish_time`),
  KEY `idx_publishing_status` (`status`),
  CONSTRAINT `fk_publishing_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_publishing_platform_config` FOREIGN KEY (`platform_config_id`) REFERENCES `ai_company_platform_configs` (`id`),
  CONSTRAINT `fk_publishing_scheduled_task` FOREIGN KEY (`scheduled_task_id`) REFERENCES `ai_scheduled_publishing_tasks` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='目标网站发布记录表(执行日志)';

-- ====================================================================================================
-- 9) 关键词与话题管理 (SEO/内容规划)
-- ====================================================================================================

-- 关键词表
-- 管理用于内容生成和SEO的关键词。
CREATE TABLE `ai_keywords` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '关键词主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `keyword` VARCHAR(255) NOT NULL COMMENT '关键词文本',
  `search_volume` INT DEFAULT 0 COMMENT '搜索量估算',
  `cpc` DECIMAL(10,2) DEFAULT 0.00 COMMENT '估计每次点击成本',
  `difficulty` TINYINT DEFAULT 0 COMMENT '关键词难度评分(0-100)',
  `source` ENUM('baidu','google','manual','expansion','import') DEFAULT 'manual' COMMENT '来源类型',
  `status` ENUM('pending','planned','generated','published') DEFAULT 'pending' COMMENT '关键词状态',
  `tags` VARCHAR(255) DEFAULT NULL COMMENT '关键词标签,逗号分隔',
  `usage_count` INT DEFAULT 0 COMMENT '关键词被文章使用次数',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_company_keyword` (`company_id`,`keyword`),
  KEY `idx_keywords_company_status` (`company_id`,`status`),
  CONSTRAINT `fk_keyword_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='关键词表';

-- 关键词扩展表(保存 related_searches)
-- 存储关键词的扩展词(如相关搜索词)。
CREATE TABLE `ai_keyword_expansions` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '关键词扩展主键ID',
  `keyword_id` INT NOT NULL COMMENT '原始关键词ID(外键)',
  `related_keyword` VARCHAR(255) NOT NULL COMMENT '扩展关键词(来自 related_searches 等)',
  `source` ENUM('baidu','google','import') DEFAULT 'google' COMMENT '扩展来源',
  `raw_response` JSON DEFAULT NULL COMMENT 'API 原始返回(便于溯源)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_keyword_exp_keyword` (`keyword_id`),
  CONSTRAINT `fk_keyword_expansion_keyword` FOREIGN KEY (`keyword_id`) REFERENCES `ai_keywords` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='关键词扩展表(保存 related_searches)';

-- 话题表
-- 管理更宽泛的内容主题。
CREATE TABLE `ai_topics` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '话题主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `source_task_id` INT DEFAULT NULL COMMENT '来源的抓取任务ID(外键,可空)',
  `title` VARCHAR(255) NOT NULL COMMENT '话题标题',
  `description` TEXT DEFAULT NULL COMMENT '话题描述或摘要',
  `source_url` VARCHAR(500) DEFAULT NULL COMMENT '原始来源链接(可选)',
  `status` ENUM('raw','curated','rejected') DEFAULT 'raw' COMMENT '话题状态',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_topics_company_status` (`company_id`,`status`),
  KEY `idx_topics_source_task` (`source_task_id`),
  CONSTRAINT `fk_topic_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_topic_source_task` FOREIGN KEY (`source_task_id`) REFERENCES `ai_search_sources_tasks` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='话题表';

-- 话题与关键词的多对多映射
-- 建立话题和关键词之间的关联。
CREATE TABLE `ai_topic_keywords` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '话题-关键词关联主键ID',
  `topic_id` INT NOT NULL COMMENT '话题ID(外键)',
  `keyword_id` INT NOT NULL COMMENT '关键词ID(外键)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_topic_keyword` (`topic_id`,`keyword_id`),
  KEY `idx_topic_keywords_topic` (`topic_id`),
  KEY `idx_topic_keywords_keyword` (`keyword_id`),
  CONSTRAINT `fk_topic_keyword_topic` FOREIGN KEY (`topic_id`) REFERENCES `ai_topics` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_topic_keyword_keyword` FOREIGN KEY (`keyword_id`) REFERENCES `ai_keywords` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='话题与关键词的多对多映射';

-- AI数据源配置表
-- 配置用于抓取话题的外部数据源(如SERP API)。
CREATE TABLE `ai_search_sources_api` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '数据源配置主键ID',
  `name` VARCHAR(100) NOT NULL COMMENT '数据来源名称 (如 百度前10、Google also ask)',
  `source_type` ENUM('serp_api', 'rss', 'custom_api', 'web_scraping', 'database') NOT NULL COMMENT '来源类型',
  `api_config` JSON NOT NULL COMMENT 'API 配置',
  `result_parser` JSON NOT NULL COMMENT '结果解析规则',
  `is_active` BOOLEAN DEFAULT TRUE COMMENT '是否启用',
  `priority` TINYINT UNSIGNED DEFAULT 10 COMMENT '优先级 (1-100, 数字越小优先级越高)',
  `rate_limit` JSON COMMENT '限流配置 {"requests": 100, "period": 3600}',
  `health_check` JSON COMMENT '健康检查配置',
  `metadata` JSON COMMENT '元数据 (描述、版本等)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  INDEX `idx_source_name` (`name`),
  INDEX `idx_source_type` (`source_type`),
  INDEX `idx_source_active` (`is_active`),
  INDEX `idx_source_priority` (`priority`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI数据源配置表';

-- AI数据源抓取任务表
-- 记录从外部数据源抓取话题的任务。
CREATE TABLE `ai_search_sources_tasks` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '话题抓取任务主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `user_id` INT NOT NULL COMMENT '发起任务的用户ID(外键)',
  `topic_source_id` INT NOT NULL COMMENT '话题来源配置ID(外键)',
  `keywords` TEXT DEFAULT NULL COMMENT '用于本次抓取的关键词快照(逗号分隔)',  
  `topic_id` INT DEFAULT NULL COMMENT '关联的话题ID(外键,可空)',
  `keyword_id` INT DEFAULT NULL COMMENT '关联的关键词ID(外键,可空)',
  `status` ENUM('pending','processing','completed','failed') DEFAULT 'pending' COMMENT '任务状态',
  `result_count` INT DEFAULT 0 COMMENT '抓取结果数量',
  `raw_response` JSON DEFAULT NULL COMMENT 'API 原始返回(JSON)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `completed_at` TIMESTAMP NULL DEFAULT NULL COMMENT '任务完成时间',
  PRIMARY KEY (`id`),
  KEY `idx_topic_fetch_company` (`company_id`),
  KEY `idx_topic_fetch_source` (`topic_source_id`),
  KEY `idx_topic_fetch_status` (`status`),
  CONSTRAINT `fk_search_task_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_search_task_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`),
  CONSTRAINT `fk_search_task_source` FOREIGN KEY (`topic_source_id`) REFERENCES `ai_search_sources_api` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI数据源抓取任务表';

-- ====================================================================================================
-- 10) 任务关联表 (连接生成任务与资源)
-- ====================================================================================================

-- 任务参考链接明细(可标注高度参考)
-- 存储文章生成任务中使用的参考链接。
CREATE TABLE `ai_task_references` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '任务参考链接主键ID',
  `task_id` INT NOT NULL COMMENT '对应任务ID(外键)',
  `url` VARCHAR(500) NOT NULL COMMENT '参考链接URL',
  `title` VARCHAR(255) DEFAULT NULL COMMENT '页面标题(可选)',
  `source_engine` VARCHAR(50) DEFAULT NULL COMMENT '来源引擎(google/baidu/zhihu等)',
  `position` INT DEFAULT NULL COMMENT '在搜索结果中的排名位置',
  `is_high_reference` TINYINT(1) DEFAULT 0 COMMENT '是否标记为高度参考(1是)',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_task_references_task` (`task_id`),
  CONSTRAINT `fk_task_reference_task` FOREIGN KEY (`task_id`) REFERENCES `ai_article_generation_tasks` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务参考链接明细(可标注高度参考)';

-- 生成任务与关键词映射(规划用)
-- 将生成任务与计划使用的关键词关联。
CREATE TABLE `ai_task_keywords` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '任务-关键词关联主键ID',
  `task_id` INT NOT NULL COMMENT '生成任务ID(外键)',
  `keyword_id` INT NOT NULL COMMENT '关键词ID(外键)',
  `is_primary` TINYINT(1) DEFAULT 0 COMMENT '是否主关键词',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_keyword` (`task_id`,`keyword_id`),
  KEY `idx_task_keywords_task` (`task_id`),
  KEY `idx_task_keywords_keyword` (`keyword_id`),
  CONSTRAINT `fk_task_keyword_task` FOREIGN KEY (`task_id`) REFERENCES `ai_article_generation_tasks` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_task_keyword_keyword` FOREIGN KEY (`keyword_id`) REFERENCES `ai_keywords` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='生成任务与关键词映射(规划用)';

-- 生成任务与话题映射
-- 将生成任务与相关话题关联。
CREATE TABLE `ai_task_topics` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '任务-话题关联主键ID',
  `task_id` INT NOT NULL COMMENT '生成任务ID(外键)',
  `topic_id` INT NOT NULL COMMENT '话题ID(外键)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_topic` (`task_id`,`topic_id`),
  KEY `idx_task_topics_task` (`task_id`),
  KEY `idx_task_topics_topic` (`topic_id`),
  CONSTRAINT `fk_task_topic_task` FOREIGN KEY (`task_id`) REFERENCES `ai_article_generation_tasks` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_task_topic_topic` FOREIGN KEY (`topic_id`) REFERENCES `ai_topics` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='生成任务与话题映射';

-- 任务知识库来源(公司库或上传的解析内容)
-- 指定生成任务使用的知识来源。
CREATE TABLE `ai_task_knowledge_sources` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '任务知识来源主键ID',
  `task_id` INT NOT NULL COMMENT '任务ID(外键)',
  `knowledge_type` ENUM('company','uploaded') NOT NULL COMMENT '知识来源类型(公司知识库/上传文件)',
  `knowledge_id` INT DEFAULT NULL COMMENT '当 knowledge_type=uploaded 时,关联 ai_uploaded_files.id',
  `content` LONGTEXT DEFAULT NULL COMMENT '若上传文件被解析,存解析后的文本内容',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_task_knowledge_task` (`task_id`),
  KEY `idx_task_knowledge_knowledge` (`knowledge_id`),
  CONSTRAINT `fk_task_knowledge_task` FOREIGN KEY (`task_id`) REFERENCES `ai_article_generation_tasks` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_task_knowledge_file` FOREIGN KEY (`knowledge_id`) REFERENCES `ai_uploaded_files` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务知识库来源(公司库或上传的解析内容)';

-- 文章与关键词关联(实际使用)
-- 将最终生成的文章与实际使用的关键词关联。
CREATE TABLE `ai_article_keywords` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章关键词关联主键ID',
  `article_id` INT NOT NULL COMMENT '文章ID(外键)',
  `keyword_id` INT NOT NULL COMMENT '关键词ID(外键)',
  `is_primary` TINYINT(1) DEFAULT 0 COMMENT '是否主关键词(1主/0辅)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_article_keyword` (`article_id`,`keyword_id`),
  KEY `idx_article_keywords_article` (`article_id`),
  KEY `idx_article_keywords_keyword` (`keyword_id`),
  CONSTRAINT `fk_article_keyword_article` FOREIGN KEY (`article_id`) REFERENCES `ai_generated_articles` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_article_keyword_keyword` FOREIGN KEY (`keyword_id`) REFERENCES `ai_keywords` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章与关键词关联(实际使用)';

-- 文章与话题关联
-- 将最终生成的文章与相关话题关联。
CREATE TABLE `ai_article_topics` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '文章话题关联主键ID',
  `article_id` INT NOT NULL COMMENT '文章ID(外键)',
  `topic_id` INT NOT NULL COMMENT '话题ID(外键)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_article_topic` (`article_id`,`topic_id`),
  KEY `idx_article_topics_article` (`article_id`),
  KEY `idx_article_topics_topic` (`topic_id`),
  CONSTRAINT `fk_article_topic_article` FOREIGN KEY (`article_id`) REFERENCES `ai_generated_articles` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_article_topic_topic` FOREIGN KEY (`topic_id`) REFERENCES `ai_topics` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章与话题关联';

-- ====================================================================================================
-- 11) 统计与活动日志
-- ====================================================================================================

-- 用户活动日志(审计/分析)
-- 记录用户的常规活动,用于行为分析。
CREATE TABLE `ai_user_activity_logs` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '用户活动日志主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `user_id` INT NOT NULL COMMENT '用户ID(外键)',
  `activity_type` VARCHAR(50) NOT NULL COMMENT '活动类型(如 login/create_article)',
  `activity_details` JSON DEFAULT NULL COMMENT '活动详情(JSON)',
  `ip_address` VARCHAR(45) DEFAULT NULL COMMENT '操作IP',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_activity_company_user` (`company_id`,`user_id`),
  KEY `idx_activity_type` (`activity_type`),
  CONSTRAINT `fk_activity_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`),
  CONSTRAINT `fk_activity_user` FOREIGN KEY (`user_id`) REFERENCES `ai_users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户活动日志(审计/分析)';

-- 公司使用统计
-- 统计公司的资源使用情况,用于计费和容量管理。
CREATE TABLE `ai_company_usage_stats` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '公司用量统计主键ID',
  `company_id` INT NOT NULL COMMENT '公司ID(外键)',
  `stat_date` DATE NOT NULL COMMENT '统计日期',
  `article_count` INT DEFAULT 0 COMMENT '当日生成文章数量',
  `ai_token_usage` BIGINT DEFAULT 0 COMMENT '当日 AI 令牌使用量',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_company_date` (`company_id`,`stat_date`),
  KEY `idx_usage_company` (`company_id`),
  CONSTRAINT `fk_usage_stats_company` FOREIGN KEY (`company_id`) REFERENCES `ai_companies` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='公司使用统计';

SET FOREIGN_KEY_CHECKS = 1;