feat: 新增多模块功能与服务实现
新增广告计划、用户资产、B2B交易、合规规则等核心模型 实现爬虫工作器、贸易服务、现金流预测等业务服务 添加RBAC权限测试、压力测试等测试用例 完善扩展程序的消息处理与内容脚本功能 重构应用入口与文档生成器 更新项目规则与业务闭环分析文档
This commit is contained in:
377
scripts/db-init.sql
Normal file
377
scripts/db-init.sql
Normal file
@@ -0,0 +1,377 @@
|
||||
-- ============================================================================
|
||||
-- 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 '密码哈希值',
|
||||
`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='用户信息表';
|
||||
|
||||
-- ============================================================================
|
||||
-- 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='任务执行记录表';
|
||||
|
||||
-- ============================================================================
|
||||
-- 完成提示
|
||||
-- ============================================================================
|
||||
|
||||
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_%';
|
||||
324
scripts/env-config.sh
Normal file
324
scripts/env-config.sh
Normal file
@@ -0,0 +1,324 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ============================================================================
|
||||
# Crawlful Hub 环境配置脚本
|
||||
# Task ID: OP-DE001
|
||||
# Description: 环境变量配置与验证脚本
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 日志函数
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# 环境变量配置模板
|
||||
ENV_TEMPLATE="# ============================================================================
|
||||
# Crawlful Hub 环境变量配置
|
||||
# ============================================================================
|
||||
|
||||
# 应用配置
|
||||
NODE_ENV=development
|
||||
APP_PORT=3000
|
||||
APP_NAME=crawlful-hub
|
||||
|
||||
# 数据库配置 (阿里云 RDS MySQL 8.0)
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_NAME=crawlful_hub
|
||||
DB_USER=root
|
||||
DB_PASSWORD=your_password_here
|
||||
DB_POOL_MIN=5
|
||||
DB_POOL_MAX=20
|
||||
|
||||
# Redis 配置 (本地 Redis 6379)
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=
|
||||
REDIS_DB=0
|
||||
|
||||
# JWT 配置
|
||||
JWT_SECRET=your_jwt_secret_here
|
||||
JWT_EXPIRES_IN=7d
|
||||
|
||||
# 租户配置
|
||||
DEFAULT_TENANT_ID=tenant_001
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=info
|
||||
LOG_FORMAT=json
|
||||
|
||||
# 五元组追踪
|
||||
TRACE_ENABLED=true
|
||||
TRACE_SAMPLE_RATE=1.0
|
||||
|
||||
# 利润红线配置
|
||||
PROFIT_MARGIN_B2B_THRESHOLD=0.15
|
||||
PROFIT_MARGIN_B2C_THRESHOLD=0.20
|
||||
|
||||
# 并发控制
|
||||
WORKER_CONCURRENCY=10
|
||||
API_RATE_LIMIT=100
|
||||
|
||||
# 内存限制 (MB)
|
||||
NODE_MAX_OLD_SPACE_SIZE=4096
|
||||
|
||||
# 插件配置
|
||||
PLUGIN_DATA_DIR=./data/plugins
|
||||
PLUGIN_PROFILE_DIR=./data/profiles
|
||||
|
||||
# 安全配置
|
||||
CORS_ORIGIN=http://localhost:8000
|
||||
HELMET_ENABLED=true
|
||||
"
|
||||
|
||||
# 创建 .env 文件
|
||||
create_env_file() {
|
||||
local env_file=".env"
|
||||
|
||||
if [ -f "$env_file" ]; then
|
||||
log_warn ".env 文件已存在,跳过创建"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "创建 .env 文件..."
|
||||
echo "$ENV_TEMPLATE" > "$env_file"
|
||||
log_success ".env 文件创建成功"
|
||||
}
|
||||
|
||||
# 创建 .env.example 文件
|
||||
create_env_example() {
|
||||
local env_example=".env.example"
|
||||
|
||||
log_info "创建 .env.example 文件..."
|
||||
echo "$ENV_TEMPLATE" > "$env_example"
|
||||
log_success ".env.example 文件创建成功"
|
||||
}
|
||||
|
||||
# 验证环境变量
|
||||
validate_env() {
|
||||
log_info "验证环境变量..."
|
||||
|
||||
local missing_vars=()
|
||||
local required_vars=(
|
||||
"NODE_ENV"
|
||||
"DB_HOST"
|
||||
"DB_PORT"
|
||||
"DB_NAME"
|
||||
"DB_USER"
|
||||
"REDIS_HOST"
|
||||
"REDIS_PORT"
|
||||
"JWT_SECRET"
|
||||
)
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [ -z "${!var}" ]; then
|
||||
missing_vars+=("$var")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#missing_vars[@]} -gt 0 ]; then
|
||||
log_error "缺少必要的环境变量: ${missing_vars[*]}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_success "所有必要的环境变量已配置"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 验证数据库连接
|
||||
validate_db_connection() {
|
||||
log_info "验证数据库连接..."
|
||||
|
||||
if command -v mysql &> /dev/null; then
|
||||
if mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASSWORD}" -e "SELECT 1" &> /dev/null; then
|
||||
log_success "数据库连接成功"
|
||||
return 0
|
||||
else
|
||||
log_warn "数据库连接失败,请检查配置"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log_warn "mysql 客户端未安装,跳过数据库连接验证"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# 验证 Redis 连接
|
||||
validate_redis_connection() {
|
||||
log_info "验证 Redis 连接..."
|
||||
|
||||
if command -v redis-cli &> /dev/null; then
|
||||
if redis-cli -h"${REDIS_HOST}" -p"${REDIS_PORT}" ping &> /dev/null; then
|
||||
log_success "Redis 连接成功"
|
||||
return 0
|
||||
else
|
||||
log_warn "Redis 连接失败,请检查配置"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log_warn "redis-cli 未安装,跳过 Redis 连接验证"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# 创建必要的目录
|
||||
create_directories() {
|
||||
log_info "创建必要的目录..."
|
||||
|
||||
local directories=(
|
||||
"./logs"
|
||||
"./data"
|
||||
"./data/plugins"
|
||||
"./data/profiles"
|
||||
"./data/uploads"
|
||||
"./data/backups"
|
||||
"./tmp"
|
||||
)
|
||||
|
||||
for dir in "${directories[@]}"; do
|
||||
if [ ! -d "$dir" ]; then
|
||||
mkdir -p "$dir"
|
||||
log_success "创建目录: $dir"
|
||||
else
|
||||
log_info "目录已存在: $dir"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# 设置文件权限
|
||||
set_permissions() {
|
||||
log_info "设置文件权限..."
|
||||
|
||||
chmod 700 ./data
|
||||
chmod 700 ./data/plugins
|
||||
chmod 700 ./data/profiles
|
||||
chmod 600 .env 2>/dev/null || true
|
||||
|
||||
log_success "文件权限设置完成"
|
||||
}
|
||||
|
||||
# 检查 Node.js 版本
|
||||
check_node_version() {
|
||||
log_info "检查 Node.js 版本..."
|
||||
|
||||
if command -v node &> /dev/null; then
|
||||
local node_version=$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)
|
||||
if [ "$node_version" -ge 18 ]; then
|
||||
log_success "Node.js 版本: $(node -v)"
|
||||
else
|
||||
log_error "Node.js 版本过低,需要 >= 18.x"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
log_error "Node.js 未安装"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查依赖
|
||||
check_dependencies() {
|
||||
log_info "检查依赖..."
|
||||
|
||||
local missing_deps=()
|
||||
local deps=("node" "npm")
|
||||
|
||||
for dep in "${deps[@]}"; do
|
||||
if ! command -v "$dep" &> /dev/null; then
|
||||
missing_deps+=("$dep")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#missing_deps[@]} -gt 0 ]; then
|
||||
log_error "缺少依赖: ${missing_deps[*]}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_success "所有依赖已安装"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 显示配置摘要
|
||||
show_summary() {
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " Crawlful Hub 环境配置摘要"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "应用配置:"
|
||||
echo " - NODE_ENV: ${NODE_ENV:-未设置}"
|
||||
echo " - APP_PORT: ${APP_PORT:-未设置}"
|
||||
echo ""
|
||||
echo "数据库配置:"
|
||||
echo " - DB_HOST: ${DB_HOST:-未设置}"
|
||||
echo " - DB_PORT: ${DB_PORT:-未设置}"
|
||||
echo " - DB_NAME: ${DB_NAME:-未设置}"
|
||||
echo ""
|
||||
echo "Redis 配置:"
|
||||
echo " - REDIS_HOST: ${REDIS_HOST:-未设置}"
|
||||
echo " - REDIS_PORT: ${REDIS_PORT:-未设置}"
|
||||
echo ""
|
||||
echo "业务约束:"
|
||||
echo " - B2B 利润红线: ${PROFIT_MARGIN_B2B_THRESHOLD:-15%}"
|
||||
echo " - B2C 利润红线: ${PROFIT_MARGIN_B2C_THRESHOLD:-20%}"
|
||||
echo " - Worker 并发数: ${WORKER_CONCURRENCY:-10}"
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " Crawlful Hub 环境配置脚本 v1.0"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 加载环境变量
|
||||
if [ -f ".env" ]; then
|
||||
log_info "加载 .env 文件..."
|
||||
export $(cat .env | grep -v '^#' | xargs)
|
||||
fi
|
||||
|
||||
# 执行配置步骤
|
||||
create_env_file
|
||||
create_env_example
|
||||
create_directories
|
||||
set_permissions
|
||||
check_node_version
|
||||
check_dependencies
|
||||
|
||||
# 验证连接
|
||||
if [ -f ".env" ]; then
|
||||
validate_db_connection || true
|
||||
validate_redis_connection || true
|
||||
fi
|
||||
|
||||
# 显示摘要
|
||||
show_summary
|
||||
|
||||
log_success "环境配置完成!"
|
||||
}
|
||||
|
||||
# 运行主函数
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user