diff --git a/backend/database/migrations/008_complete_init.sql b/backend/database/migrations/008_complete_init.sql new file mode 100644 index 0000000..f249021 --- /dev/null +++ b/backend/database/migrations/008_complete_init.sql @@ -0,0 +1,252 @@ +-- XServer 数据库完整初始化脚本 +-- 使用 UTF-8 编码保存此文件 +-- 执行方式:docker exec 1Panel-mysql-409s mysql -uroot -p'mysql_xEsdPa' --default-character-set=utf8mb4 xserver < 008_complete_init.sql + +SET NAMES utf8mb4; +SET CHARACTER SET utf8mb4; + +USE xserver; + +-- ===================================== +-- 1. 公司表 +-- ===================================== +DROP TABLE IF EXISTS companies; +CREATE TABLE `companies` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "公司ID", + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "公司名称", + `abbr` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "" COMMENT "公司缩写", + `tenant_key` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "" COMMENT "飞书企业标识", + `sort` int(11) NOT NULL DEFAULT 0 COMMENT "排序", + `status` tinyint NOT NULL DEFAULT 1 COMMENT "状态:1=启用,0=禁用", + `feishu_enabled` tinyint(1) NOT NULL DEFAULT 0 COMMENT "是否启用飞书", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="公司表"; + +INSERT INTO companies (name, abbr, tenant_key, status, sort, feishu_enabled) VALUES +("合塑", "hesu", "10edab4d5d85175f", 1, 1, 1), +("新友合", "xinyouhe", "14e7bc0fe5985740", 1, 2, 1), +("派卡", "paika", "14e5377859d71740", 1, 3, 1), +("斯玛特", "simate", "", 0, 4, 0), +("magic bridge Auto", "mbaf", "", 1, 5, 0); + +-- ===================================== +-- 2. 用户表 +-- ===================================== +DROP TABLE IF EXISTS users; +CREATE TABLE `users` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "用户ID", + `sn` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "" COMMENT "用户编号", + `company_id` bigint unsigned NOT NULL COMMENT "所属公司ID", + `report_to` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT "上级用户ID", + `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "用户名", + `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "头像URL", + `sex` tinyint(2) NULL DEFAULT NULL COMMENT "性别:1=男,2=女", + `email` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "邮箱", + `phone` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "手机号", + `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "密码", + `status` tinyint NOT NULL DEFAULT 1 COMMENT "状态:1=正常,0=禁用", + `user_type` tinyint(2) NOT NULL DEFAULT 1 COMMENT "用户类型:1=内部,2=外部", + `union_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "飞书UnionID", + `feishu_user_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "飞书用户ID", + `feishu_open_id` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "飞书OpenID", + `tenant_key` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "当前企业标识", + `position` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "职位", + `sign_img` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "签名图片", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_company_id` (`company_id`), + KEY `idx_feishu_user_id` (`feishu_user_id`), + KEY `idx_feishu_union_id` (`union_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="用户表"; + +-- ===================================== +-- 3. 飞书应用配置表 +-- ===================================== +DROP TABLE IF EXISTS company_feishu_apps; +CREATE TABLE `company_feishu_apps` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "ID", + `company_id` int(11) NOT NULL COMMENT "公司ID", + `system_id` int(11) NOT NULL DEFAULT 1 COMMENT "系统ID:1=X-Server", + `name` varchar(90) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "" COMMENT "应用名称", + `app_id` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "" COMMENT "飞书应用ID", + `app_secret` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "" COMMENT "飞书应用密钥", + `encrypt_key` varchar(60) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT "事件加密密钥", + `verification_token` varchar(60) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT "事件验证令牌", + `callback_url` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT "PC端回调地址", + `mobile_callback_url` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT "移动端回调地址", + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT "状态:1=启用,0=禁用", + `created_at` int(11) NOT NULL DEFAULT 0 COMMENT "创建时间", + `updated_at` int(11) NOT NULL DEFAULT 0 COMMENT "更新时间", + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_company_id` (`company_id`) USING BTREE, + KEY `idx_system_id` (`system_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="公司飞书应用配置表"; + +INSERT INTO company_feishu_apps (company_id, system_id, name, app_id, app_secret, callback_url, mobile_callback_url, status, created_at, updated_at) VALUES +(2, 1, "X-Server", "cli_a73e1e6406fa501c", "9cMfxujjGG9JPmNfNcOwUdCoIXqaM1wY", "https://x.hnxinyouhe.com/auth/feishu-callback", "https://mweb-fdesk.hnxinyouhe.com/login/feishu-callback", 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(3, 1, "X-Server", "cli_a73e8253144f500b", "MpLqRmfWx8iA8vwWj5IO6elvIKAHU8E6", "https://x.hnxinyouhe.com/auth/feishu-callback", "https://mweb-fdesk.hnxinyouhe.com/login/feishu-callback", 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(1, 1, "X-Server", "cli_a6183b882cb8500d", "VqYib48u4EtDIa6nG9qH3f0fYCA1bCvs", "https://x.hnxinyouhe.com/auth/feishu-callback", "https://mweb-fdesk.hnxinyouhe.com/login/feishu-callback", 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); + +-- ===================================== +-- 4. 审批流程配置表 +-- ===================================== +DROP TABLE IF EXISTS approval_flow; +CREATE TABLE `approval_flow` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "流程ID", + `business_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "业务类型标识(如:business-trip, purchase)", + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "流程名称", + `description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "流程描述", + `status` tinyint NOT NULL DEFAULT 1 COMMENT "状态:1=启用,0=禁用", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_business_type` (`business_type`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="审批流程配置表"; + +INSERT INTO approval_flow (id, business_type, name, status) VALUES +(1, "business-trip", "默认出差审批流程", 1); + +-- ===================================== +-- 5. 审批流程节点表 +-- ===================================== +DROP TABLE IF EXISTS approval_node; +CREATE TABLE `approval_node` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "节点ID", + `flow_id` bigint unsigned NOT NULL COMMENT "流程ID", + `type` ENUM("approver", "and_approve", "or_approve", "notify") NOT NULL COMMENT "节点类型", + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "节点名称", + `order` int NOT NULL DEFAULT 0 COMMENT "节点顺序", + `approvers` json DEFAULT NULL COMMENT "审批人列表(JSON数组)", + `conditions` json DEFAULT NULL COMMENT "条件判断(JSON)", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_flow_id` (`flow_id`), + KEY `idx_order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="审批流程节点表"; + +INSERT INTO approval_node (flow_id, type, name, `order`, approvers) VALUES +(1, "approver", "部门主管审批", 1, "[]"), +(1, "approver", "人事审批", 2, "[]"); + +-- ===================================== +-- 6. 审批单表 +-- ===================================== +DROP TABLE IF EXISTS approval_order; +CREATE TABLE `approval_order` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "审批单ID", + `business_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "业务类型", + `business_id` bigint unsigned NOT NULL COMMENT "业务单据ID", + `title` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "审批标题", + `applicant_id` bigint unsigned NOT NULL COMMENT "申请人ID", + `status` ENUM("draft", "pending", "approved", "rejected", "cancelled") NOT NULL DEFAULT "draft" COMMENT "审批状态", + `current_nodes` json DEFAULT NULL COMMENT "当前待审批节点ID列表", + `flow_id` bigint unsigned NOT NULL COMMENT "使用的流程ID", + `form_data` json DEFAULT NULL COMMENT "业务表单数据(JSON)", + `attachments` json DEFAULT NULL COMMENT "附件列表(JSON)", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_business` (`business_type`, `business_id`), + KEY `idx_applicant` (`applicant_id`), + KEY `idx_status` (`status`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="审批单表"; + +-- ===================================== +-- 7. 审批记录表(审批轨迹) +-- ===================================== +DROP TABLE IF EXISTS approval_record; +CREATE TABLE `approval_record` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "记录ID", + `order_id` bigint unsigned NOT NULL COMMENT "审批单ID", + `node_id` bigint unsigned NOT NULL COMMENT "节点ID", + `node_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "节点类型", + `approver_id` bigint unsigned NOT NULL COMMENT "审批人ID", + `action` ENUM("submit", "approve", "reject", "cancel") NOT NULL COMMENT "操作类型", + `comment` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "审批意见", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "操作时间", + PRIMARY KEY (`id`), + KEY `idx_order_id` (`order_id`), + KEY `idx_approver_id` (`approver_id`), + KEY `idx_created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="审批记录表"; + +-- ===================================== +-- 8. 出差申请表 +-- ===================================== +DROP TABLE IF EXISTS business_trip; +CREATE TABLE `business_trip` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "出差ID", + `user_id` bigint unsigned NOT NULL COMMENT "申请人ID", + `reason` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "出差事由", + `start_date` date NOT NULL COMMENT "开始日期", + `end_date` date NOT NULL COMMENT "结束日期", + `destination` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "目的地", + `estimated_cost` decimal(10,2) DEFAULT 0.00 COMMENT "预计费用", + `status` ENUM("draft", "pending", "approved", "rejected", "cancelled") NOT NULL DEFAULT "draft" COMMENT "状态", + `approval_order_id` bigint unsigned DEFAULT NULL COMMENT "关联审批单ID", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_status` (`status`), + KEY `idx_dates` (`start_date`, `end_date`), + KEY `idx_approval_order_id` (`approval_order_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="出差申请表"; + +-- ===================================== +-- 9. 出差行程明细表 +-- ===================================== +DROP TABLE IF EXISTS business_trip_itinerary; +CREATE TABLE `business_trip_itinerary` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "行程ID", + `business_trip_id` bigint unsigned NOT NULL COMMENT "出差申请ID", + `date` date NOT NULL COMMENT "行程日期", + `departure` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "出发地", + `destination` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "目的地", + `transport` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "交通方式", + `accommodation` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "住宿安排", + `remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "备注", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", + PRIMARY KEY (`id`), + KEY `idx_business_trip_id` (`business_trip_id`), + KEY `idx_date` (`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="出差行程明细表"; + +-- ===================================== +-- 10. 用户与飞书应用关联表 +-- ===================================== +DROP TABLE IF EXISTS user_feishu_binding; +CREATE TABLE `user_feishu_binding` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT "ID", + `user_id` bigint unsigned NOT NULL COMMENT "用户ID", + `company_id` bigint unsigned NOT NULL COMMENT "公司ID", + `feishu_open_id` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "飞书OpenID", + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_company` (`user_id`, `company_id`), + KEY `idx_feishu_open_id` (`feishu_open_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="用户飞书应用绑定表"; + +-- ===================================== +-- 验证结果 +-- ===================================== +SELECT "=== 所有表 ===" as ""; +SHOW TABLES; + +SELECT "=== companies 数据 ===" as ""; +SELECT id, name, abbr, tenant_key FROM companies ORDER BY id; + +SELECT "=== company_feishu_apps 数据 ===" as ""; +SELECT id, company_id, name, app_id FROM company_feishu_apps ORDER BY id; + +SELECT "=== 统计 ===" as ""; +SELECT "Total tables:" as "", COUNT(*) as count FROM information_schema.tables WHERE table_schema = "xserver";