20261010_tenant_ai_point.sql 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. -- 租户共享 AI 积分:MySQL 8.0+
  2. -- 执行前请备份数据库;默认给所有现有租户创建 0 积分账户。
  3. CREATE TABLE IF NOT EXISTS `system_tenant_ai_point` (
  4. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  5. `tenant_id` bigint NOT NULL COMMENT '租户编号',
  6. `balance` int NOT NULL DEFAULT 0 COMMENT '当前可用积分',
  7. `total_recharge` int NOT NULL DEFAULT 0 COMMENT '累计充值积分',
  8. `total_consume` int NOT NULL DEFAULT 0 COMMENT '累计成功消耗积分',
  9. `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
  10. `version` int NOT NULL DEFAULT 0 COMMENT '并发版本号',
  11. `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
  12. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  13. `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
  14. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  15. `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  16. PRIMARY KEY (`id`),
  17. UNIQUE KEY `uk_tenant_id` (`tenant_id`),
  18. KEY `idx_status` (`status`)
  19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户 AI 积分账户';
  20. CREATE TABLE IF NOT EXISTS `ai_point_consume_record` (
  21. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  22. `request_no` varchar(64) NOT NULL COMMENT '唯一请求号',
  23. `tenant_id` bigint NOT NULL COMMENT '租户编号',
  24. `user_id` bigint DEFAULT NULL COMMENT '消耗用户编号',
  25. `user_nickname` varchar(64) DEFAULT NULL COMMENT '用户昵称快照',
  26. `biz_type` varchar(32) NOT NULL COMMENT 'IMAGE/VIDEO/MANUAL_RECHARGE',
  27. `biz_id` bigint DEFAULT NULL COMMENT '图片或视频任务编号',
  28. `consume_point` int NOT NULL COMMENT '消耗积分;人工充值记录为负数',
  29. `balance_before` int NOT NULL COMMENT '变动前余额',
  30. `balance_after` int NOT NULL COMMENT '变动后余额',
  31. `status` tinyint NOT NULL COMMENT '0生成中 1成功 2失败已退款 3人工调整',
  32. `result_url` varchar(2048) DEFAULT NULL COMMENT '生成结果路径',
  33. `failure_reason` varchar(500) DEFAULT NULL COMMENT '失败或调整说明',
  34. `refund_point` int NOT NULL DEFAULT 0 COMMENT '退款积分',
  35. `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
  36. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  37. `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
  38. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  39. `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  40. PRIMARY KEY (`id`),
  41. UNIQUE KEY `uk_request_no` (`request_no`),
  42. KEY `idx_tenant_create_time` (`tenant_id`,`create_time`),
  43. KEY `idx_user_create_time` (`user_id`,`create_time`),
  44. KEY `idx_biz` (`biz_type`,`biz_id`)
  45. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 积分消耗流水';
  46. -- 为已有租户初始化积分账户:默认 0 分。将 0 改为目标初始积分再执行即可批量发放。
  47. INSERT INTO `system_tenant_ai_point`
  48. (`tenant_id`,`balance`,`total_recharge`,`total_consume`,`status`,`version`,`creator`,`updater`)
  49. SELECT t.`id`, 0, 0, 0, 1, 0, 'system', 'system'
  50. FROM `system_tenant` t
  51. WHERE t.`deleted` = b'0'
  52. ON DUPLICATE KEY UPDATE `tenant_id` = VALUES(`tenant_id`);
  53. -- 历史人工充值流水在旧版本中未保存昵称时,补充为通用标识。
  54. -- 无法从积分表可靠还原实际操作人,因此不虚构 user_id;新产生的人工充值会记录实际管理员 ID 与昵称。
  55. UPDATE `ai_point_consume_record`
  56. SET `user_nickname` = '管理员'
  57. WHERE `biz_type` = 'MANUAL_RECHARGE'
  58. AND (`user_nickname` IS NULL OR `user_nickname` = '')
  59. AND `deleted` = b'0';
  60. -- 管理端菜单(父菜单为“系统管理” id=1;如你的库中 id 不同,请替换 parent_id)。
  61. -- 该段可重复执行:已执行过旧版 SQL 时,会把原来的两个一级菜单移动到 AI积分管理目录下。
  62. INSERT INTO `system_menu`
  63. (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`updater`,`deleted`)
  64. SELECT 9000,'AI积分管理','',1,9,1,'ai-point-management','ep:coin',NULL,NULL,0,b'1',b'1',b'1','admin','admin',b'0'
  65. WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id`=9000);
  66. UPDATE `system_menu`
  67. SET `name` = 'AI积分管理', `permission` = '', `type` = 1, `sort` = 9, `parent_id` = 1,
  68. `path` = 'ai-point-management', `icon` = 'ep:coin', `component` = NULL, `component_name` = NULL,
  69. `status` = 0, `visible` = b'1', `keep_alive` = b'1', `always_show` = b'1', `deleted` = b'0'
  70. WHERE `id` = 9000;
  71. INSERT INTO `system_menu`
  72. (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`updater`,`deleted`)
  73. SELECT 9001,'租户AI积分','system:tenant-ai-point:query',2,1,9000,'tenant-point','ep:coin','system/aiPoint/index','SystemAiPoint',0,b'1',b'1',b'1','admin','admin',b'0'
  74. WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id`=9001);
  75. UPDATE `system_menu`
  76. SET `name` = '租户AI积分', `permission` = 'system:tenant-ai-point:query', `type` = 2, `sort` = 1, `parent_id` = 9000,
  77. `path` = 'tenant-point', `icon` = 'ep:coin', `component` = 'system/aiPoint/index', `component_name` = 'SystemAiPoint',
  78. `status` = 0, `visible` = b'1', `keep_alive` = b'1', `always_show` = b'1', `deleted` = b'0'
  79. WHERE `id` = 9001;
  80. INSERT INTO `system_menu`
  81. (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`updater`,`deleted`)
  82. SELECT 9002,'AI积分消耗历史','system:ai-point-record:query',2,2,9000,'consume-history','ep:document','system/aiPointRecord/index','SystemAiPointRecord',0,b'1',b'1',b'1','admin','admin',b'0'
  83. WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id`=9002);
  84. UPDATE `system_menu`
  85. SET `name` = 'AI积分消耗历史', `permission` = 'system:ai-point-record:query', `type` = 2, `sort` = 2, `parent_id` = 9000,
  86. `path` = 'consume-history', `icon` = 'ep:document', `component` = 'system/aiPointRecord/index', `component_name` = 'SystemAiPointRecord',
  87. `status` = 0, `visible` = b'1', `keep_alive` = b'1', `always_show` = b'1', `deleted` = b'0'
  88. WHERE `id` = 9002;
  89. INSERT INTO `system_menu`
  90. (`id`,`name`,`permission`,`type`,`sort`,`parent_id`,`path`,`icon`,`component`,`component_name`,`status`,`visible`,`keep_alive`,`always_show`,`creator`,`updater`,`deleted`)
  91. SELECT 9003,'AI积分充值','system:tenant-ai-point:update',3,1,9001,'','','',NULL,0,b'1',b'1',b'1','admin','admin',b'0'
  92. WHERE NOT EXISTS (SELECT 1 FROM `system_menu` WHERE `id`=9003);
  93. -- 给超级管理员角色授权。若管理员角色不是 id=1,请替换为实际 role_id。
  94. INSERT INTO `system_role_menu` (`role_id`,`menu_id`) SELECT 1,9001 WHERE NOT EXISTS (SELECT 1 FROM `system_role_menu` WHERE `role_id`=1 AND `menu_id`=9001);
  95. INSERT INTO `system_role_menu` (`role_id`,`menu_id`) SELECT 1,9002 WHERE NOT EXISTS (SELECT 1 FROM `system_role_menu` WHERE `role_id`=1 AND `menu_id`=9002);
  96. INSERT INTO `system_role_menu` (`role_id`,`menu_id`) SELECT 1,9003 WHERE NOT EXISTS (SELECT 1 FROM `system_role_menu` WHERE `role_id`=1 AND `menu_id`=9003);
  97. INSERT INTO `system_role_menu` (`role_id`,`menu_id`) SELECT 1,9000 WHERE NOT EXISTS (SELECT 1 FROM `system_role_menu` WHERE `role_id`=1 AND `menu_id`=9000);