-- =====================================================
-- 系统字典管理表结构
-- 创建时间: 2026-03-18
-- 说明: 用于实现系统字典类型和字典项的管理
-- =====================================================

-- 1. 字典类型表
DROP TABLE IF EXISTS t_dict_type;
CREATE TABLE t_dict_type (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    dict_code VARCHAR(100) NOT NULL COMMENT '字典编码(唯一标识)',
    dict_name VARCHAR(100) NOT NULL COMMENT '字典名称',
    dict_desc VARCHAR(255) COMMENT '字典描述',
    is_system TINYINT DEFAULT 0 COMMENT '是否系统内置: 1-是, 0-否(系统内置不可删除)',
    status TINYINT DEFAULT 1 COMMENT '状态: 1-启用, 0-禁用',
    sort_order INT DEFAULT 0 COMMENT '排序',
    create_by VARCHAR(50) COMMENT '创建人',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_by VARCHAR(50) COMMENT '更新人',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    remark VARCHAR(255) COMMENT '备注',
    UNIQUE KEY uk_dict_code (dict_code),
    KEY idx_status (status),
    KEY idx_sort_order (sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';

-- 2. 字典数据项表
DROP TABLE IF EXISTS t_dict_data;
CREATE TABLE t_dict_data (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    dict_code VARCHAR(100) NOT NULL COMMENT '字典编码(关联t_dict_type)',
    item_value VARCHAR(100) NOT NULL COMMENT '字典项值(存储值)',
    item_label VARCHAR(100) NOT NULL COMMENT '字典项标签(显示值)',
    item_desc VARCHAR(255) COMMENT '字典项描述',
    parent_id BIGINT DEFAULT 0 COMMENT '父级ID(用于树形结构,0表示顶级)',
    css_class VARCHAR(100) COMMENT 'CSS样式类名',
    list_class VARCHAR(100) COMMENT '表格回显样式(default/primary/success/info/warning/danger)',
    is_default TINYINT DEFAULT 0 COMMENT '是否默认: 1-是, 0-否',
    status TINYINT DEFAULT 1 COMMENT '状态: 1-启用, 0-禁用',
    sort_order INT DEFAULT 0 COMMENT '排序',
    create_by VARCHAR(50) COMMENT '创建人',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_by VARCHAR(50) COMMENT '更新人',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    remark VARCHAR(255) COMMENT '备注',
    KEY idx_dict_code (dict_code),
    KEY idx_parent_id (parent_id),
    KEY idx_status (status),
    KEY idx_sort_order (sort_order),
    UNIQUE KEY uk_dict_value (dict_code, item_value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典数据项表';

-- 3. 字典操作日志表(记录字典变更审计信息)
DROP TABLE IF EXISTS t_dict_log;
CREATE TABLE t_dict_log (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    dict_code VARCHAR(100) COMMENT '字典编码',
    dict_name VARCHAR(100) COMMENT '字典名称',
    operation_type VARCHAR(20) NOT NULL COMMENT '操作类型: create/update/delete/import/export',
    operation_desc VARCHAR(500) COMMENT '操作描述',
    before_data TEXT COMMENT '变更前数据(JSON格式)',
    after_data TEXT COMMENT '变更后数据(JSON格式)',
    admin_id BIGINT COMMENT '操作人ID',
    admin_name VARCHAR(50) COMMENT '操作人用户名',
    ip VARCHAR(50) COMMENT '操作IP',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    KEY idx_dict_code (dict_code),
    KEY idx_operation_type (operation_type),
    KEY idx_admin_id (admin_id),
    KEY idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典操作日志表';

-- =====================================================
-- 初始化字典类型数据
-- =====================================================

INSERT INTO t_dict_type (dict_code, dict_name, dict_desc, is_system, status, sort_order, create_by) VALUES
('sys_status', '系统状态', '通用状态字典', 1, 1, 1, 'system'),
('sys_gender', '性别', '用户性别字典', 1, 1, 2, 'system'),
('sys_yes_no', '是否', '是否字典', 1, 1, 3, 'system'),
('device_status', '设备状态', '设备在线离线状态', 1, 1, 10, 'system'),
('device_door_status', '设备门状态', '设备门开关状态', 1, 1, 11, 'system'),
('order_status', '订单状态', '订单处理状态', 1, 1, 20, 'system'),
('pay_status', '支付状态', '支付处理状态', 1, 1, 21, 'system'),
('product_status', '商品状态', '商品上下架状态', 1, 1, 30, 'system'),
('shop_status', '门店状态', '门店营业状态', 1, 1, 40, 'system'),
('admin_status', '管理员状态', '管理员账号状态', 1, 1, 50, 'system'),
('notice_type', '公告类型', '公告通知类型', 1, 1, 60, 'system'),
('notice_status', '公告状态', '公告发布状态', 1, 1, 61, 'system');

-- =====================================================
-- 初始化字典数据项
-- =====================================================

-- 系统状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('sys_status', '0', '禁用', 'danger', 0, 1, 1, 'system'),
('sys_status', '1', '启用', 'success', 1, 1, 2, 'system');

-- 性别
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('sys_gender', '0', '未知', 'info', 1, 1, 1, 'system'),
('sys_gender', '1', '男', 'primary', 0, 1, 2, 'system'),
('sys_gender', '2', '女', 'danger', 0, 1, 3, 'system');

-- 是否
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('sys_yes_no', 'Y', '是', 'success', 0, 1, 1, 'system'),
('sys_yes_no', 'N', '否', 'danger', 1, 1, 2, 'system');

-- 设备状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('device_status', '0', '离线', 'danger', 0, 1, 1, 'system'),
('device_status', '1', '在线', 'success', 1, 1, 2, 'system');

-- 设备门状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('device_door_status', '0', '关闭', 'success', 1, 1, 1, 'system'),
('device_door_status', '1', '打开', 'warning', 0, 1, 2, 'system');

-- 订单状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('order_status', '0', '待支付', 'warning', 0, 1, 1, 'system'),
('order_status', '1', '已支付', 'success', 0, 1, 2, 'system'),
('order_status', '2', '已取消', 'info', 0, 1, 3, 'system'),
('order_status', '3', '已退款', 'danger', 0, 1, 4, 'system');

-- 支付状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('pay_status', '0', '未支付', 'warning', 1, 1, 1, 'system'),
('pay_status', '1', '已支付', 'success', 0, 1, 2, 'system'),
('pay_status', '2', '支付失败', 'danger', 0, 1, 3, 'system');

-- 商品状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('product_status', '0', '下架', 'danger', 0, 1, 1, 'system'),
('product_status', '1', '上架', 'success', 1, 1, 2, 'system');

-- 门店状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('shop_status', '0', '停业', 'danger', 0, 1, 1, 'system'),
('shop_status', '1', '营业中', 'success', 1, 1, 2, 'system');

-- 管理员状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('admin_status', '1', '正常', 'success', 1, 1, 1, 'system'),
('admin_status', '2', '禁用', 'danger', 0, 1, 2, 'system');

-- 公告类型
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('notice_type', '1', '通知', 'primary', 1, 1, 1, 'system'),
('notice_type', '2', '公告', 'success', 0, 1, 2, 'system');

-- 公告状态
INSERT INTO t_dict_data (dict_code, item_value, item_label, list_class, is_default, status, sort_order, create_by) VALUES
('notice_status', '0', '草稿', 'info', 1, 1, 1, 'system'),
('notice_status', '1', '已发布', 'success', 0, 1, 2, 'system'),
('notice_status', '2', '已下线', 'warning', 0, 1, 3, 'system');

-- =====================================================
-- 添加字典管理权限
-- =====================================================
INSERT INTO t_data_permission (permission_code, permission_name, module_code, module_name, operation_type, description, sort_order) VALUES
('dict:create', '创建字典', 'dict', '字典管理', 'create', '添加字典类型或字典项', 131),
('dict:read', '查询字典', 'dict', '字典管理', 'read', '查看字典列表和详情', 132),
('dict:update', '修改字典', 'dict', '字典管理', 'update', '编辑字典信息', 133),
('dict:delete', '删除字典', 'dict', '字典管理', 'delete', '删除字典类型或字典项', 134),
('dict:export', '导出字典', 'dict', '字典管理', 'export', '导出字典数据', 135),
('dict:import', '导入字典', 'dict', '字典管理', 'import', '导入字典数据', 136);

-- 为超级管理员角色分配字典管理权限
INSERT INTO t_role_permission (role_id, permission_id)
SELECT 1, id FROM t_data_permission WHERE module_code = 'dict';
