-- 经销商管理系统数据库初始化脚本
-- 数据库版本：MySQL 8.0

CREATE DATABASE IF NOT EXISTS by_crm DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE by_crm;

-- 经销商表
CREATE TABLE IF NOT EXISTS crm_dealer (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '经销商ID',
    name VARCHAR(100) NOT NULL COMMENT '经销商名称',
    code VARCHAR(50) NOT NULL UNIQUE COMMENT '经销商编码',
    contact_person VARCHAR(50) NOT NULL COMMENT '联系人',
    contact_phone VARCHAR(20) NOT NULL COMMENT '联系电话',
    email VARCHAR(100) COMMENT '邮箱',
    status TINYINT NOT NULL DEFAULT 1 COMMENT '状态：0-禁用 1-启用',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_code (code),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='经销商表';

-- 客户表
CREATE TABLE IF NOT EXISTS crm_customer (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '客户ID',
    name VARCHAR(100) NOT NULL COMMENT '客户名称',
    phone VARCHAR(20) COMMENT '联系电话',
    address VARCHAR(255) COMMENT '地址',
    industry VARCHAR(100) COMMENT '所属行业',
    status TINYINT NOT NULL DEFAULT 0 COMMENT '状态：0-可报备 1-保护中 2-已失效',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_name (name),
    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 crm_report (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '报备ID',
    dealer_id BIGINT NOT NULL COMMENT '经销商ID',
    customer_id BIGINT NOT NULL COMMENT '客户ID',
    description VARCHAR(500) COMMENT '报备说明',
    status TINYINT NOT NULL DEFAULT 0 COMMENT '状态：0-待审核 1-已通过 2-已驳回 3-已失效',
    reject_reason VARCHAR(255) COMMENT '驳回原因',
    protect_start_date DATE DEFAULT NULL COMMENT '保护期开始日期',
    protect_end_date DATE DEFAULT NULL COMMENT '保护期结束日期',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_dealer_id (dealer_id),
    INDEX idx_customer_id (customer_id),
    INDEX idx_status (status),
    INDEX idx_protect_end_date (protect_end_date),
    UNIQUE KEY uk_customer_valid (customer_id, status) COMMENT '同一客户只能有一个有效报备'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='报备表';

-- 用户表（管理员和经销商用户）
CREATE TABLE IF NOT EXISTS crm_user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
    password VARCHAR(255) NOT NULL COMMENT '密码（BCrypt加密）',
    real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
    dealer_id BIGINT COMMENT '关联经销商ID（管理员为NULL）',
    role TINYINT NOT NULL COMMENT '角色：0-管理员 1-经销商用户',
    status TINYINT NOT NULL DEFAULT 1 COMMENT '状态：0-禁用 1-启用',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_username (username),
    INDEX idx_dealer_id (dealer_id),
    INDEX idx_role (role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';

-- 数据字典表
CREATE TABLE IF NOT EXISTS crm_dict (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '字典ID',
    dict_code VARCHAR(50) NOT NULL UNIQUE COMMENT '字典编码',
    dict_name VARCHAR(100) NOT NULL COMMENT '字典名称',
    description VARCHAR(255) COMMENT '描述',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典表';

-- 数据字典项表
CREATE TABLE IF NOT EXISTS crm_dict_item (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '字典项ID',
    dict_id BIGINT NOT NULL COMMENT '字典ID',
    item_label VARCHAR(100) NOT NULL COMMENT '字典项标签',
    item_value VARCHAR(50) NOT NULL COMMENT '字典项值',
    sort_order INT NOT NULL DEFAULT 0 COMMENT '排序',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_dict_id (dict_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典项表';

-- 操作日志表
CREATE TABLE IF NOT EXISTS crm_operation_log (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    module VARCHAR(50) NOT NULL COMMENT '模块名称',
    operation VARCHAR(50) NOT NULL COMMENT '操作类型',
    description VARCHAR(500) COMMENT '操作描述',
    ip VARCHAR(50) COMMENT 'IP地址',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_user_id (user_id),
    INDEX idx_module (module),
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';

-- 插入初始数据

-- 插入默认管理员（用户名：admin，密码：Bycrmadmin123，BCrypt加密后的值）
INSERT INTO crm_user (username, password, real_name, dealer_id, role, status) VALUES
('admin', '$10$kWExNPRis.HIzKDa112UZeq8jzGxI2tLFo0zTNRfxhyzk6MzMKPW6', '系统管理员', NULL, 0, 1);

-- 插入数据字典
INSERT INTO crm_dict (dict_code, dict_name, description) VALUES
('customer_status', '客户状态', '客户的状态信息'),
('report_status', '报备状态', '报备单的状态信息'),
('customer_industry', '客户行业', '客户所属行业分类');

-- 插入客户状态字典项
INSERT INTO crm_dict_item (dict_id, item_label, item_value, sort_order) VALUES
(1, '可报备', '0', 0),
(1, '保护中', '1', 1),
(1, '已失效', '2', 2);

-- 插入报备状态字典项
INSERT INTO crm_dict_item (dict_id, item_label, item_value, sort_order) VALUES
(2, '待审核', '0', 0),
(2, '已通过', '1', 1),
(2, '已驳回', '2', 2),
(2, '已失效', '3', 3);

-- 插入客户行业字典项
INSERT INTO crm_dict_item (dict_id, item_label, item_value, sort_order) VALUES
(3, '制造业', 'manufacturing', 0),
(3, '互联网', 'internet', 1),
(3, '金融', 'finance', 2),
(3, '零售', 'retail', 3),
(3, '教育', 'education', 4),
(3, '医疗', 'healthcare', 5),
(3, '其他', 'other', 6);

-- 系统配置表
CREATE TABLE IF NOT EXISTS crm_system_config (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID',
    config_key VARCHAR(50) NOT NULL UNIQUE COMMENT '配置键',
    config_value VARCHAR(255) NOT NULL COMMENT '配置值',
    config_label VARCHAR(100) NOT NULL COMMENT '配置名称',
    config_type VARCHAR(20) NOT NULL DEFAULT 'string' COMMENT '数据类型：string/integer/boolean',
    description VARCHAR(255) COMMENT '配置描述',
    is_editable TINYINT NOT NULL DEFAULT 1 COMMENT '是否可编辑：0-否 1-是',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_config_key (config_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';

-- 插入初始配置数据
INSERT INTO crm_system_config (config_key, config_value, config_label, config_type, description, is_editable) VALUES
('report.protect.days', '90', '报备保护期天数', 'integer', '报备审核通过后客户的保护天数', 1),
('report.allow.overlap', 'false', '允许重叠报备', 'boolean', '是否允许同一客户被多个经销商报备（测试用，生产环境必须为false）', 1);

-- 学校表
CREATE TABLE IF NOT EXISTS crm_school (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '学校ID',
    school_code VARCHAR(50) NOT NULL UNIQUE COMMENT '学校标识码',
    school_name VARCHAR(200) NOT NULL COMMENT '学校名称',
    location VARCHAR(255) COMMENT '所在地（由主管部门和所在地组合而成，如"北京市海淀区"）',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_school_code (school_code),
    INDEX idx_school_name (school_name),
    INDEX idx_location (location)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学校表';
