-- ============================================================= -- OA文档库相关表:分类表 / 文档表 / 关联表 / 共享表 -- yz_backend_oa_doc_category 文档分类(含共享/私密双空间) -- yz_backend_oa_doc 文档 -- yz_backend_oa_doc_link 文档关联(图谱) -- yz_backend_oa_doc_share 文档共享(用户/部门) -- 说明:建表可重复执行;末尾的历史库补列与数据修正在重复执行时 -- 报 "Duplicate column name" 属正常,跳过即可。 -- 运行:mysql -h -P -u -p < create_oa_document.sql -- ============================================================= CREATE TABLE IF NOT EXISTS `yz_backend_oa_doc_category` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` int NOT NULL DEFAULT 0 COMMENT '租户ID', `user_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '归属用户ID 0-租户级(共享分类) >0-该用户的个人分类', `parent_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '父级ID,0为一级分类', `name` varchar(128) NOT NULL DEFAULT '' COMMENT '分类名称', `sort` int NOT NULL DEFAULT 0 COMMENT '排序,越小越靠前', `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', `is_system` tinyint NOT NULL DEFAULT 0 COMMENT '是否系统内置分类 0-否(可删除) 1-是(不可删除)', `scope` varchar(16) NOT NULL DEFAULT 'shared' COMMENT '所属范围 personal-个人文档 shared-共享文档', `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除 0-否 1-是', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`), KEY `idx_tid_parent` (`tid`,`parent_id`), KEY `idx_tid_scope_user` (`tid`,`scope`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='OA文档分类表'; CREATE TABLE IF NOT EXISTS `yz_backend_oa_doc` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` int NOT NULL DEFAULT 0 COMMENT '租户ID', `category_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '所属分类ID,0为未分类', `title` varchar(255) NOT NULL DEFAULT '' COMMENT '文档标题', `file_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '关联附件ID(yz_system_files)', `file_url` varchar(512) NOT NULL DEFAULT '' COMMENT '附件访问地址', `file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '原始文件名', `ext` varchar(16) NOT NULL DEFAULT '' COMMENT '扩展名', `size` bigint unsigned NOT NULL DEFAULT 0 COMMENT '文件大小(字节)', `doc_type` tinyint NOT NULL DEFAULT 0 COMMENT '类型 0-其他 1-文档 2-表格 3-演示 4-PDF 5-图片 6-压缩包 7-视频 8-音频', `tags` varchar(255) NOT NULL DEFAULT '' COMMENT '标签,逗号分隔', `summary` varchar(1000) NOT NULL DEFAULT '' COMMENT '摘要/描述', `content` longtext NULL COMMENT '在线制作文档的编辑源(富文本HTML),仅用于再次编辑', `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态 0-草稿 1-已发布 2-已归档', `version` int NOT NULL DEFAULT 1 COMMENT '版本号', `is_star` tinyint NOT NULL DEFAULT 0 COMMENT '是否收藏 0-否 1-是', `owner_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '负责人ID', `owner_name` varchar(100) NOT NULL DEFAULT '' COMMENT '负责人姓名', `view_count` int NOT NULL DEFAULT 0 COMMENT '查看次数', `download_count` int NOT NULL DEFAULT 0 COMMENT '下载次数', `creator_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建人ID', `creator_name` varchar(100) NOT NULL DEFAULT '' COMMENT '创建人姓名', `visibility` tinyint NOT NULL DEFAULT 0 COMMENT '可见性 0-租户公开 1-私密(仅创建者与被共享者)', `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除 0-否 1-是', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`), KEY `idx_tid_cate` (`tid`,`category_id`,`is_deleted`), KEY `idx_tid_status` (`tid`,`status`,`is_deleted`), KEY `idx_tid_title` (`tid`,`title`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='OA文档表'; CREATE TABLE IF NOT EXISTS `yz_backend_oa_doc_link` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` int NOT NULL DEFAULT 0 COMMENT '租户ID', `source_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '源文档ID', `target_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '目标文档ID', `relation` varchar(32) NOT NULL DEFAULT 'related' COMMENT '关系 reference-引用 related-相关 version-版本 belong-从属', `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '关系说明', `creator_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建人ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_doc_pair` (`tid`,`source_id`,`target_id`,`relation`), KEY `idx_tid_source` (`tid`,`source_id`), KEY `idx_tid_target` (`tid`,`target_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='OA文档关联表'; CREATE TABLE IF NOT EXISTS `yz_backend_oa_doc_share` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` int NOT NULL DEFAULT 0 COMMENT '租户ID', `doc_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '文档ID', `share_type` tinyint NOT NULL DEFAULT 0 COMMENT '共享类型 0-用户(target_id=uid) 1-部门(target_id=org_id,含子部门)', `target_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '共享目标ID', `creator_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '授权人ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_doc_target` (`tid`,`doc_id`,`share_type`,`target_id`), KEY `idx_tid_doc` (`tid`,`doc_id`), KEY `idx_target` (`tid`,`share_type`,`target_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='OA文档共享表'; -- ------------------------------------------------------------- -- 历史库补齐列(表已存在且缺列时才执行 ALTER,可重复执行不报错) -- ------------------------------------------------------------- -- yz_backend_oa_doc.visibility SET @tbl := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc'); SET @col := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc' AND COLUMN_NAME = 'visibility'); SET @ddl := IF(@tbl > 0 AND @col = 0, 'ALTER TABLE `yz_backend_oa_doc` ADD COLUMN `visibility` tinyint NOT NULL DEFAULT 0 COMMENT ''可见性 0-租户公开 1-私密(仅创建者与被共享者)''', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- yz_backend_oa_doc.content SET @tbl := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc'); SET @col := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc' AND COLUMN_NAME = 'content'); SET @ddl := IF(@tbl > 0 AND @col = 0, 'ALTER TABLE `yz_backend_oa_doc` ADD COLUMN `content` longtext NULL COMMENT ''在线制作文档的编辑源(富文本HTML),仅用于再次编辑''', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- yz_backend_oa_doc_category.is_system SET @tbl := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc_category'); SET @col := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc_category' AND COLUMN_NAME = 'is_system'); SET @ddl := IF(@tbl > 0 AND @col = 0, 'ALTER TABLE `yz_backend_oa_doc_category` ADD COLUMN `is_system` tinyint NOT NULL DEFAULT 0 COMMENT ''是否系统内置分类 0-否(可删除) 1-是(不可删除)''', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- yz_backend_oa_doc_category.scope SET @tbl := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc_category'); SET @col := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc_category' AND COLUMN_NAME = 'scope'); SET @ddl := IF(@tbl > 0 AND @col = 0, 'ALTER TABLE `yz_backend_oa_doc_category` ADD COLUMN `scope` varchar(16) NOT NULL DEFAULT ''shared'' COMMENT ''所属范围 personal-个人文档 shared-共享文档''', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- yz_backend_oa_doc_category.user_id SET @tbl := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc_category'); SET @col := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_oa_doc_category' AND COLUMN_NAME = 'user_id'); SET @ddl := IF(@tbl > 0 AND @col = 0, 'ALTER TABLE `yz_backend_oa_doc_category` ADD COLUMN `user_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT ''归属用户ID 0-租户级(共享分类) >0-该用户的个人分类''', 'DO 0'); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 双空间模型:兼容存量数据,将不在 (shared, personal) 范围内的分类统一归为共享空间 -- (user_id 置 0、scope 置 shared),避免历史脏数据导致分类不可见。 -- 注意:不再把 personal 并入 shared,私密空间需保留各自的 user_id 隔离。 UPDATE `yz_backend_oa_doc_category` SET `user_id` = 0, `scope` = 'shared' WHERE `scope` NOT IN ('shared', 'personal') AND `is_deleted` = 0;