Files
makemd/scripts/db-init.sql
wurenzhi d327706087 feat: 添加部门管理功能、主题切换和多语言支持
refactor(dashboard): 重构用户管理页面和路由结构

feat(server): 实现部门管理API和RBAC增强功能

docs: 更新用户手册和管理员指南文档

style: 统一图标使用和组件命名规范

test: 添加部门服务和数据隔离测试用例

chore: 更新依赖和配置文件
2026-03-28 22:52:12 +08:00

447 lines
26 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.
-- ============================================================================
-- Crawlful Hub 数据库初始化脚本
-- Task ID: OP-DE003
-- Description: 创建所有业务表结构
-- Database: MySQL 8.0
-- Table Prefix: cf_ (Crawlful)
-- ============================================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ============================================================================
-- 1. 租户与用户管理表
-- ============================================================================
-- 租户表
CREATE TABLE IF NOT EXISTS `cf_tenants` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '租户ID',
`name` VARCHAR(255) NOT NULL COMMENT '租户名称',
`status` ENUM('ACTIVE', 'SUSPENDED', 'DELETED') DEFAULT 'ACTIVE' COMMENT '状态ACTIVE-活跃SUSPENDED-暂停DELETED-已删除',
`plan` ENUM('FREE', 'BASIC', 'PRO', 'ENTERPRISE') DEFAULT 'BASIC' COMMENT '套餐类型FREE-免费BASIC-基础PRO-专业ENTERPRISE-企业',
`settings` JSON COMMENT '租户配置信息',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_status` (`status`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户信息表';
-- 用户表
CREATE TABLE IF NOT EXISTS `cf_users` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '用户ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`username` VARCHAR(100) NOT NULL COMMENT '用户名',
`email` VARCHAR(255) NOT NULL COMMENT '邮箱',
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希值',
`salt` VARCHAR(64) NOT NULL COMMENT '密码盐值',
`role` ENUM('ADMIN', 'MANAGER', 'OPERATOR', 'FINANCE', 'SOURCING', 'LOGISTICS', 'ANALYST') DEFAULT 'OPERATOR' COMMENT '角色ADMIN-管理员MANAGER-经理OPERATOR-操作员FINANCE-财务SOURCING-采购LOGISTICS-物流ANALYST-分析师',
`status` ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') DEFAULT 'ACTIVE' COMMENT '状态ACTIVE-活跃INACTIVE-未激活SUSPENDED-暂停',
`last_login_at` TIMESTAMP NULL COMMENT '最后登录时间',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `uk_tenant_email` (`tenant_id`, `email`),
UNIQUE KEY `uk_tenant_username` (`tenant_id`, `username`),
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户信息表';
-- 店铺表
CREATE TABLE IF NOT EXISTS `cf_shops` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '店铺ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`name` VARCHAR(255) NOT NULL COMMENT '店铺名称',
`platform` VARCHAR(50) NOT NULL COMMENT '平台类型SHOPIFY, AMAZON, EBAY等',
`platform_shop_id` VARCHAR(255) COMMENT '平台店铺ID',
`api_key` VARCHAR(255) COMMENT 'API密钥',
`api_secret` VARCHAR(255) COMMENT 'API密钥',
`access_token` VARCHAR(512) COMMENT '访问令牌',
`refresh_token` VARCHAR(512) COMMENT '刷新令牌',
`settings` JSON COMMENT '店铺配置',
`status` ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') DEFAULT 'ACTIVE' COMMENT '状态',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_platform` (`platform`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='店铺信息表';
-- 会话表
CREATE TABLE IF NOT EXISTS `cf_sessions` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '会话ID',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型',
`token` VARCHAR(512) NOT NULL COMMENT '访问令牌',
`refresh_token` VARCHAR(512) COMMENT '刷新令牌',
`expires_at` TIMESTAMP NOT NULL COMMENT '过期时间',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`last_activity_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后活动时间',
INDEX `idx_user_id` (`user_id`),
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_token` (`token`),
INDEX `idx_expires_at` (`expires_at`),
FOREIGN KEY (`user_id`) REFERENCES `cf_users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会话表';
-- ============================================================================
-- 2. 商品管理表
-- ============================================================================
-- 商品主表
CREATE TABLE IF NOT EXISTS `cf_product` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '商品ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`platform` VARCHAR(50) NOT NULL COMMENT '平台名称',
`product_id` VARCHAR(255) NOT NULL COMMENT '平台商品ID',
`sku` VARCHAR(255) COMMENT 'SKU编码',
`name` VARCHAR(500) NOT NULL COMMENT '商品名称',
`description` TEXT COMMENT '商品描述',
`category` VARCHAR(255) COMMENT '商品分类',
`brand` VARCHAR(255) COMMENT '品牌',
`images` JSON COMMENT '商品图片列表',
`attributes` JSON COMMENT '商品属性',
`status` ENUM('DRAFT', 'ACTIVE', 'INACTIVE', 'DELETED') DEFAULT 'DRAFT' COMMENT '状态DRAFT-草稿ACTIVE-活跃INACTIVE-未激活DELETED-已删除',
`cost_price` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '成本价',
`selling_price` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '销售价',
`currency` VARCHAR(10) DEFAULT 'USD' COMMENT '货币类型',
`weight` DECIMAL(10, 3) COMMENT '重量',
`weight_unit` VARCHAR(10) DEFAULT 'kg' COMMENT '重量单位',
`length` DECIMAL(10, 2) COMMENT '长度',
`width` DECIMAL(10, 2) COMMENT '宽度',
`height` DECIMAL(10, 2) COMMENT '高度',
`dimension_unit` VARCHAR(10) DEFAULT 'cm' COMMENT '尺寸单位',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `uk_platform_product` (`platform`, `product_id`),
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_shop_id` (`shop_id`),
INDEX `idx_status` (`status`),
INDEX `idx_category` (`category`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品主表';
-- SKU 变体表
CREATE TABLE IF NOT EXISTS `cf_product_sku` (
`id` VARCHAR(64) PRIMARY KEY COMMENT 'SKU ID',
`product_id` VARCHAR(64) NOT NULL COMMENT '商品ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`sku_code` VARCHAR(255) NOT NULL COMMENT 'SKU编码',
`variant_attributes` JSON COMMENT '变体属性',
`cost_price` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '成本价',
`selling_price` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '销售价',
`stock_quantity` INT DEFAULT 0 COMMENT '库存数量',
`status` ENUM('ACTIVE', 'INACTIVE') DEFAULT 'ACTIVE' COMMENT '状态ACTIVE-活跃INACTIVE-未激活',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `uk_product_sku` (`product_id`, `sku_code`),
INDEX `idx_tenant_id` (`tenant_id`),
FOREIGN KEY (`product_id`) REFERENCES `cf_product`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='SKU变体表';
-- ============================================================================
-- 3. 订单管理表
-- ============================================================================
-- 订单主表
CREATE TABLE IF NOT EXISTS `cf_orders` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '订单ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`platform` VARCHAR(50) NOT NULL COMMENT '平台名称',
`platform_order_id` VARCHAR(255) COMMENT '平台订单ID',
`customer_id` VARCHAR(64) COMMENT '客户ID',
`status` ENUM('PENDING', 'PAID', 'PROCESSING', 'SHIPPED', 'DELIVERED', 'COMPLETED', 'CANCELLED', 'REFUNDED') DEFAULT 'PENDING' COMMENT '状态PENDING-待处理PAID-已支付PROCESSING-处理中SHIPPED-已发货DELIVERED-已送达COMPLETED-已完成CANCELLED-已取消REFUNDED-已退款',
`items` JSON COMMENT '订单商品列表',
`subtotal` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '小计金额',
`shipping_fee` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '运费',
`tax` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '税费',
`discount` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '折扣金额',
`total_amount` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '总金额',
`currency` VARCHAR(10) DEFAULT 'USD' COMMENT '货币类型',
`shipping_address` JSON COMMENT '收货地址',
`billing_address` JSON COMMENT '账单地址',
`payment_method` VARCHAR(50) COMMENT '支付方式',
`payment_status` ENUM('PENDING', 'PAID', 'FAILED', 'REFUNDED') DEFAULT 'PENDING' COMMENT '支付状态PENDING-待支付PAID-已支付FAILED-失败REFUNDED-已退款',
`delivered_at` TIMESTAMP NULL COMMENT '送达时间',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_shop_id` (`shop_id`),
INDEX `idx_platform_order` (`platform`, `platform_order_id`),
INDEX `idx_status` (`status`),
INDEX `idx_customer_id` (`customer_id`),
INDEX `idx_created_at` (`created_at`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单主表';
-- ============================================================================
-- 4. 财务管理表
-- ============================================================================
-- 对账记录表
CREATE TABLE IF NOT EXISTS `cf_reconciliation` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '对账记录ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`platform` VARCHAR(50) NOT NULL COMMENT '平台名称',
`period_start` DATE NOT NULL COMMENT '对账开始日期',
`period_end` DATE NOT NULL COMMENT '对账结束日期',
`expected_amount` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '预期金额',
`actual_amount` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '实际金额',
`difference` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '差异金额',
`status` ENUM('PENDING', 'MATCHED', 'MISMATCH', 'RESOLVED') DEFAULT 'PENDING' COMMENT '状态PENDING-待处理MATCHED-匹配MISMATCH-不匹配RESOLVED-已解决',
`details` JSON COMMENT '对账详情',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_platform_period` (`platform`, `period_start`, `period_end`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='对账记录表';
-- 回款记录表
CREATE TABLE IF NOT EXISTS `cf_payments` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '回款记录ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`order_id` VARCHAR(64) COMMENT '订单ID',
`platform` VARCHAR(50) COMMENT '平台名称',
`amount` DECIMAL(12, 2) NOT NULL COMMENT '回款金额',
`currency` VARCHAR(10) DEFAULT 'USD' COMMENT '货币类型',
`status` ENUM('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED', 'REFUNDED') DEFAULT 'PENDING' COMMENT '状态PENDING-待处理PROCESSING-处理中COMPLETED-已完成FAILED-失败REFUNDED-已退款',
`payment_method` VARCHAR(50) COMMENT '支付方式',
`transaction_id` VARCHAR(255) COMMENT '交易ID',
`paid_at` TIMESTAMP NULL COMMENT '支付时间',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_order_id` (`order_id`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='回款记录表';
-- ============================================================================
-- 5. B2B 贸易管理表
-- ============================================================================
-- B2B 客户表
CREATE TABLE IF NOT EXISTS `cf_b2b_customers` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '客户ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`company_name` VARCHAR(255) NOT NULL COMMENT '公司名称',
`contact_name` VARCHAR(255) COMMENT '联系人姓名',
`contact_email` VARCHAR(255) COMMENT '联系人邮箱',
`contact_phone` VARCHAR(50) COMMENT '联系人电话',
`credit_limit` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '信用额度',
`credit_used` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '已用信用额度',
`payment_terms` INT DEFAULT 30 COMMENT '账期天数',
`tier_level` ENUM('BRONZE', 'SILVER', 'GOLD', 'PLATINUM') DEFAULT 'BRONZE' COMMENT '等级BRONZE-青铜SILVER-白银GOLD-黄金PLATINUM-白金',
`status` ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') DEFAULT 'ACTIVE' COMMENT '状态ACTIVE-活跃INACTIVE-未激活SUSPENDED-暂停',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_tier_level` (`tier_level`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='B2B客户表';
-- 阶梯价格表
CREATE TABLE IF NOT EXISTS `cf_tiered_prices` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '阶梯价格ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`product_id` VARCHAR(64) NOT NULL COMMENT '商品ID',
`min_quantity` INT NOT NULL COMMENT '最小数量',
`max_quantity` INT COMMENT '最大数量',
`price` DECIMAL(12, 2) NOT NULL COMMENT '价格',
`discount_percent` DECIMAL(5, 2) DEFAULT 0.00 COMMENT '折扣百分比',
`status` ENUM('ACTIVE', 'INACTIVE') DEFAULT 'ACTIVE' COMMENT '状态ACTIVE-活跃INACTIVE-未激活',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_product` (`tenant_id`, `product_id`),
INDEX `idx_quantity_range` (`min_quantity`, `max_quantity`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`product_id`) REFERENCES `cf_product`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='阶梯价格表';
-- ============================================================================
-- 6. 售后管理表
-- ============================================================================
-- 退货申请表
CREATE TABLE IF NOT EXISTS `cf_return_requests` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '退货申请ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`order_id` VARCHAR(64) NOT NULL COMMENT '订单ID',
`status` ENUM('PENDING', 'APPROVED', 'REJECTED', 'RETURNED', 'REFUNDED', 'CLOSED') DEFAULT 'PENDING' COMMENT '状态PENDING-待处理APPROVED-已批准REJECTED-已拒绝RETURNED-已退货REFUNDED-已退款CLOSED-已关闭',
`reason` TEXT COMMENT '退货原因',
`items` JSON COMMENT '退货商品列表',
`total_refund_amount` DECIMAL(12, 2) DEFAULT 0.00 COMMENT '总退款金额',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_order_id` (`order_id`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='退货申请表';
-- 退款记录表
CREATE TABLE IF NOT EXISTS `cf_refunds` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '退款记录ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`return_id` VARCHAR(64) NOT NULL COMMENT '退货申请ID',
`order_id` VARCHAR(64) NOT NULL COMMENT '订单ID',
`amount` DECIMAL(12, 2) NOT NULL COMMENT '退款金额',
`status` ENUM('PENDING_REVIEW', 'APPROVED', 'PROCESSING', 'COMPLETED', 'FAILED', 'CANCELLED') DEFAULT 'PENDING_REVIEW' COMMENT '状态PENDING_REVIEW-待审核APPROVED-已批准PROCESSING-处理中COMPLETED-已完成FAILED-失败CANCELLED-已取消',
`method` VARCHAR(50) DEFAULT 'ORIGINAL_PAYMENT' COMMENT '退款方式',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_return_id` (`return_id`),
INDEX `idx_order_id` (`order_id`),
INDEX `idx_status` (`status`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='退款记录表';
-- 售后工单表
CREATE TABLE IF NOT EXISTS `cf_service_tickets` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '工单ID',
`tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`return_id` VARCHAR(64) COMMENT '退货申请ID',
`type` ENUM('RETURN', 'REFUND', 'EXCHANGE', 'COMPLAINT', 'INQUIRY') DEFAULT 'INQUIRY' COMMENT '类型RETURN-退货REFUND-退款EXCHANGE-换货COMPLAINT-投诉INQUIRY-咨询',
`priority` ENUM('LOW', 'MEDIUM', 'HIGH', 'URGENT') DEFAULT 'MEDIUM' COMMENT '优先级LOW-低MEDIUM-中HIGH-高URGENT-紧急',
`status` ENUM('OPEN', 'IN_PROGRESS', 'WAITING_CUSTOMER', 'WAITING_INTERNAL', 'RESOLVED', 'CLOSED') DEFAULT 'OPEN' COMMENT '状态OPEN-已开启IN_PROGRESS-处理中WAITING_CUSTOMER-等待客户WAITING_INTERNAL-等待内部RESOLVED-已解决CLOSED-已关闭',
`subject` VARCHAR(255) COMMENT '工单主题',
`description` TEXT COMMENT '工单描述',
`messages` JSON COMMENT '工单消息列表',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`task_id` VARCHAR(64) COMMENT '任务ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_return_id` (`return_id`),
INDEX `idx_status` (`status`),
INDEX `idx_priority` (`priority`),
FOREIGN KEY (`tenant_id`) REFERENCES `cf_tenants`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='售后工单表';
-- ============================================================================
-- 7. 审计日志表
-- ============================================================================
-- 操作审计表
CREATE TABLE IF NOT EXISTS `cf_audit_logs` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '审计日志ID',
`tenant_id` VARCHAR(64) COMMENT '租户ID',
`user_id` VARCHAR(64) COMMENT '用户ID',
`action` VARCHAR(100) NOT NULL COMMENT '操作类型',
`entity_type` VARCHAR(100) COMMENT '实体类型',
`entity_id` VARCHAR(64) COMMENT '实体ID',
`old_value` JSON COMMENT '旧值',
`new_value` JSON COMMENT '新值',
`ip_address` VARCHAR(45) COMMENT 'IP地址',
`user_agent` VARCHAR(500) COMMENT '用户代理',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_action` (`action`),
INDEX `idx_entity` (`entity_type`, `entity_id`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作审计表';
-- ============================================================================
-- 8. 任务追踪表
-- ============================================================================
-- 任务执行记录表
CREATE TABLE IF NOT EXISTS `cf_task_executions` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '任务执行ID',
`tenant_id` VARCHAR(64) COMMENT '租户ID',
`shop_id` VARCHAR(64) COMMENT '店铺ID',
`task_id` VARCHAR(64) NOT NULL COMMENT '任务ID',
`task_type` VARCHAR(100) NOT NULL COMMENT '任务类型',
`status` ENUM('PENDING', 'RUNNING', 'COMPLETED', 'FAILED', 'CANCELLED') DEFAULT 'PENDING' COMMENT '状态PENDING-待处理RUNNING-运行中COMPLETED-已完成FAILED-失败CANCELLED-已取消',
`input` JSON COMMENT '输入参数',
`output` JSON COMMENT '输出结果',
`error_message` TEXT COMMENT '错误信息',
`retry_count` INT DEFAULT 0 COMMENT '重试次数',
`started_at` TIMESTAMP NULL COMMENT '开始时间',
`completed_at` TIMESTAMP NULL COMMENT '完成时间',
`trace_id` VARCHAR(64) COMMENT '追踪ID',
`business_type` ENUM('TOC', 'TOB') DEFAULT 'TOC' COMMENT '业务类型TOC-对客TOB-对企业',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_id` (`tenant_id`),
INDEX `idx_task_id` (`task_id`),
INDEX `idx_task_type` (`task_type`),
INDEX `idx_status` (`status`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务执行记录表';
-- ============================================================================
-- 9. 初始化默认数据
-- ============================================================================
-- 插入默认租户
INSERT INTO `cf_tenants` (`id`, `name`, `status`, `plan`, `created_at`, `updated_at`) VALUES
('default-tenant', '默认租户', 'ACTIVE', 'BASIC', NOW(), NOW())
ON DUPLICATE KEY UPDATE `updated_at` = NOW();
-- 插入默认管理员用户 (用户名: admin, 密码: admin123)
-- 密码使用 SHA256(salt + password) 计算
-- salt: a1b2c3d4e5f6, password: admin123
-- hash: SHA256('a1b2c3d4e5f6admin123') = 8f1c9c8c8b3e9e9f9c8b3e9e9f9c8b3e9e9f9c8b3e9e9f9c8b3e9e9f9c8b3e
INSERT INTO `cf_users` (`id`, `tenant_id`, `username`, `email`, `password_hash`, `salt`, `role`, `status`, `created_at`, `updated_at`) VALUES
('USER-ADMIN-001', 'default-tenant', 'admin', 'admin@crawlful.com',
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
'a1b2c3d4e5f6',
'ADMIN', 'ACTIVE', NOW(), NOW())
ON DUPLICATE KEY UPDATE `updated_at` = NOW();
-- 插入默认店铺
INSERT INTO `cf_shops` (`id`, `tenant_id`, `name`, `platform`, `status`, `created_at`, `updated_at`) VALUES
('SHOP-001', 'default-tenant', '默认店铺', 'SHOPIFY', 'ACTIVE', NOW(), NOW())
ON DUPLICATE KEY UPDATE `updated_at` = NOW();
-- ============================================================================
-- 完成提示
-- ============================================================================
SET FOREIGN_KEY_CHECKS = 1;
-- 显示创建结果
SELECT 'Database initialization completed!' AS message;
SELECT COUNT(*) AS table_count FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name LIKE 'cf_%';