From 89632228cc596b882deaacedb29ae5c1c7567513 Mon Sep 17 00:00:00 2001 From: XingQue Date: Sat, 20 Jun 2026 02:34:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E8=A1=A8=E8=BF=81=E7=A7=BB=E5=A4=87?= =?UTF-8?q?=E9=80=89=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- merchant_ops/sql/install_tables.sql | 229 ++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 merchant_ops/sql/install_tables.sql diff --git a/merchant_ops/sql/install_tables.sql b/merchant_ops/sql/install_tables.sql new file mode 100644 index 0000000..aaa080f --- /dev/null +++ b/merchant_ops/sql/install_tables.sql @@ -0,0 +1,229 @@ +-- 商家子客服 merchant_ops:直接建表(绕过 python manage.py migrate) +-- 适用:migrate 因 users 旧 migration 文件报错、无法执行时 +-- 执行前:mysql -u用户 -p 数据库名 < install_tables.sql +-- 或 1Panel/phpMyAdmin 粘贴执行 +-- 可重复执行:表用 IF NOT EXISTS,迁移记录用 NOT EXISTS 判断 + +SET NAMES utf8mb4; + +-- 1. 权限字典 +CREATE TABLE IF NOT EXISTS `merchant_staff_permission` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `perm_code` varchar(64) NOT NULL, + `perm_name` varchar(64) NOT NULL, + `sort_order` int NOT NULL DEFAULT 0, + `status` int NOT NULL DEFAULT 1, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + PRIMARY KEY (`id`), + UNIQUE KEY `perm_code` (`perm_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 2. 角色 +CREATE TABLE IF NOT EXISTS `merchant_staff_role` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `club_id` varchar(16) NOT NULL DEFAULT 'xq', + `merchant_id` varchar(7) DEFAULT NULL, + `role_code` varchar(32) NOT NULL, + `role_name` varchar(64) NOT NULL, + `is_system` tinyint(1) NOT NULL DEFAULT 0, + `sort_order` int NOT NULL DEFAULT 0, + `status` int NOT NULL DEFAULT 1, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + PRIMARY KEY (`id`), + UNIQUE KEY `merchant_staff_role_merchant_id_role_code_uniq` (`merchant_id`,`role_code`), + KEY `merchant_staff_role_merchant_id_idx` (`merchant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 3. 邀请码 +CREATE TABLE IF NOT EXISTS `merchant_staff_invite` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `club_id` varchar(16) NOT NULL DEFAULT 'xq', + `merchant_id` varchar(7) NOT NULL, + `invite_code` varchar(32) NOT NULL, + `status` int NOT NULL DEFAULT 0, + `created_by` varchar(7) NOT NULL, + `used_by` varchar(7) DEFAULT NULL, + `used_at` datetime(6) DEFAULT NULL, + `expire_at` datetime(6) DEFAULT NULL, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `role_id` bigint DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `invite_code` (`invite_code`), + KEY `merchant_staff_invite_merchant_id_idx` (`merchant_id`), + KEY `merchant_staff_invite_role_id_fk` (`role_id`), + CONSTRAINT `merchant_staff_invite_role_id_fk` FOREIGN KEY (`role_id`) REFERENCES `merchant_staff_role` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 4. 成员 +CREATE TABLE IF NOT EXISTS `merchant_staff_member` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `club_id` varchar(16) NOT NULL DEFAULT 'xq', + `merchant_id` varchar(7) NOT NULL, + `staff_user_id` varchar(7) NOT NULL, + `status` int NOT NULL DEFAULT 1, + `display_name` varchar(64) NOT NULL DEFAULT '', + `joined_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `revoked_at` datetime(6) DEFAULT NULL, + `today_dispatch_count` int NOT NULL DEFAULT 0, + `today_dispatch_amount` decimal(12,2) NOT NULL DEFAULT 0.00, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `invited_by_code_id` bigint DEFAULT NULL, + `role_id` bigint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `merchant_staff_member_merchant_staff_uniq` (`merchant_id`,`staff_user_id`), + KEY `merchant_staff_member_staff_user_id_idx` (`staff_user_id`), + KEY `merchant_staff_member_role_id_fk` (`role_id`), + KEY `merchant_staff_member_invited_by_code_id_fk` (`invited_by_code_id`), + CONSTRAINT `merchant_staff_member_role_id_fk` FOREIGN KEY (`role_id`) REFERENCES `merchant_staff_role` (`id`), + CONSTRAINT `merchant_staff_member_invited_by_code_id_fk` FOREIGN KEY (`invited_by_code_id`) REFERENCES `merchant_staff_invite` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 5. 角色-权限 +CREATE TABLE IF NOT EXISTS `merchant_staff_role_permission` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `perm_code` varchar(64) NOT NULL, + `role_id` bigint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `merchant_staff_role_permission_role_perm_uniq` (`role_id`,`perm_code`), + KEY `merchant_staff_role_permission_perm_code_idx` (`perm_code`), + CONSTRAINT `merchant_staff_role_permission_role_id_fk` FOREIGN KEY (`role_id`) REFERENCES `merchant_staff_role` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 6. 成员-权限覆盖 +CREATE TABLE IF NOT EXISTS `merchant_staff_member_permission` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `perm_code` varchar(64) NOT NULL, + `granted` tinyint(1) NOT NULL DEFAULT 1, + `member_id` bigint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `merchant_staff_member_permission_member_perm_uniq` (`member_id`,`perm_code`), + CONSTRAINT `merchant_staff_member_permission_member_id_fk` FOREIGN KEY (`member_id`) REFERENCES `merchant_staff_member` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 7. 钱包 +CREATE TABLE IF NOT EXISTS `merchant_staff_wallet` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `merchant_id` varchar(7) NOT NULL, + `staff_user_id` varchar(7) NOT NULL, + `quota_total` decimal(12,2) NOT NULL DEFAULT 0.00, + `quota_used` decimal(12,2) NOT NULL DEFAULT 0.00, + `quota_frozen` decimal(12,2) NOT NULL DEFAULT 0.00, + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `member_id` bigint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `merchant_staff_wallet_merchant_staff_uniq` (`merchant_id`,`staff_user_id`), + KEY `merchant_staff_wallet_member_id_fk` (`member_id`), + CONSTRAINT `merchant_staff_wallet_member_id_fk` FOREIGN KEY (`member_id`) REFERENCES `merchant_staff_member` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 8. 钱包流水 +CREATE TABLE IF NOT EXISTS `merchant_staff_wallet_ledger` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `merchant_id` varchar(7) NOT NULL, + `staff_user_id` varchar(7) NOT NULL, + `change_type` varchar(32) NOT NULL, + `amount` decimal(12,2) NOT NULL, + `balance_after` decimal(12,2) NOT NULL, + `related_order_id` varchar(32) DEFAULT NULL, + `operator_id` varchar(7) NOT NULL, + `remark` varchar(255) NOT NULL DEFAULT '', + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `wallet_id` bigint NOT NULL, + PRIMARY KEY (`id`), + KEY `merchant_staff_wallet_ledger_merchant_id_idx` (`merchant_id`), + KEY `merchant_staff_wallet_ledger_wallet_id_fk` (`wallet_id`), + CONSTRAINT `merchant_staff_wallet_ledger_wallet_id_fk` FOREIGN KEY (`wallet_id`) REFERENCES `merchant_staff_wallet` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 9. 客服日统计 +CREATE TABLE IF NOT EXISTS `merchant_staff_ri_tongji` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `club_id` varchar(16) NOT NULL DEFAULT 'xq', + `merchant_id` varchar(7) NOT NULL, + `staff_user_id` varchar(7) NOT NULL, + `member_id` bigint NOT NULL, + `stat_date` date NOT NULL, + `year` smallint unsigned NOT NULL, + `month` smallint unsigned NOT NULL, + `day` smallint unsigned NOT NULL, + `dispatch_count` int NOT NULL DEFAULT 0, + `dispatch_amount` decimal(12,2) NOT NULL DEFAULT 0.00, + `settle_count` int NOT NULL DEFAULT 0, + `settle_amount` decimal(12,2) NOT NULL DEFAULT 0.00, + `refund_count` int NOT NULL DEFAULT 0, + `refund_amount` decimal(12,2) NOT NULL DEFAULT 0.00, + `cancel_count` int NOT NULL DEFAULT 0, + `penalty_count` int NOT NULL DEFAULT 0, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + PRIMARY KEY (`id`), + UNIQUE KEY `merchant_staff_ri_tongji_uniq` (`merchant_id`,`staff_user_id`,`stat_date`), + KEY `merchant_staff_ri_tongji_merchant_date_idx` (`merchant_id`,`stat_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 10. 订单派单归属 +CREATE TABLE IF NOT EXISTS `merchant_order_dispatch` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `order_id` varchar(32) NOT NULL, + `merchant_id` varchar(7) NOT NULL, + `dispatch_actor_type` varchar(16) NOT NULL, + `dispatch_actor_id` varchar(7) NOT NULL, + `staff_member_id` bigint DEFAULT NULL, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + PRIMARY KEY (`id`), + UNIQUE KEY `order_id` (`order_id`), + KEY `merchant_order_dispatch_merchant_id_idx` (`merchant_id`), + KEY `merchant_order_dispatch_staff_member_id_idx` (`staff_member_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 11. 审计日志 +CREATE TABLE IF NOT EXISTS `merchant_staff_audit_log` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `merchant_id` varchar(7) NOT NULL, + `operator_user_id` varchar(7) NOT NULL, + `operator_type` varchar(16) NOT NULL, + `staff_member_id` bigint DEFAULT NULL, + `action` varchar(64) NOT NULL, + `resource_type` varchar(32) NOT NULL DEFAULT '', + `resource_id` varchar(64) NOT NULL DEFAULT '', + `value_before` json DEFAULT NULL, + `value_after` json DEFAULT NULL, + `amount` decimal(12,2) DEFAULT NULL, + `request_ip` varchar(64) NOT NULL DEFAULT '', + `remark` varchar(500) NOT NULL DEFAULT '', + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + PRIMARY KEY (`id`), + KEY `merchant_staff_audit_log_merchant_id_idx` (`merchant_id`), + KEY `merchant_staff_audit_log_action_idx` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 12. 派单模板 +CREATE TABLE IF NOT EXISTS `merchant_dispatch_template` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `merchant_id` varchar(7) NOT NULL, + `template_name` varchar(128) NOT NULL, + `template_type` varchar(16) NOT NULL DEFAULT 'EXPRESS', + `payload_json` json NOT NULL, + `created_by` varchar(7) NOT NULL, + `created_by_type` varchar(16) NOT NULL DEFAULT 'MERCHANT', + `status` int NOT NULL DEFAULT 1, + `use_count` int NOT NULL DEFAULT 0, + `CreateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `UpdateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + PRIMARY KEY (`id`), + KEY `merchant_dispatch_template_merchant_id_idx` (`merchant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 13. 告诉 Django:merchant_ops 迁移已执行(避免以后 migrate 重复建表) +INSERT INTO `django_migrations` (`app`, `name`, `applied`) +SELECT 'merchant_ops', '0001_initial', NOW(6) +FROM DUAL +WHERE NOT EXISTS ( + SELECT 1 FROM `django_migrations` + WHERE `app` = 'merchant_ops' AND `name` = '0001_initial' +);