boss 2 周之前
父節點
當前提交
81f22da7af
共有 4 個文件被更改,包括 576 次插入0 次删除
  1. 122 0
      sql/admin_menu_init.sql
  2. 20 0
      sql/admin_role_menu_init.sql
  3. 400 0
      sql/cleanup_orphaned_tables.sql
  4. 34 0
      sql/cleanup_partition_tables.sql

+ 122 - 0
sql/admin_menu_init.sql

@@ -0,0 +1,122 @@
+-- =====================================================
+-- adminUI 总后台菜单初始化 SQL (fs_menu)
+-- 将前端硬编码菜单迁移到数据库,支持角色-菜单权限分配
+-- =====================================================
+
+-- 1. 清理旧数据(谨慎执行,确保备份)
+DELETE FROM fs_role_menu WHERE menu_id IN (
+    SELECT menu_id FROM (SELECT menu_id FROM fs_menu WHERE menu_id >= 2000) t
+);
+DELETE FROM fs_menu WHERE menu_id >= 2000;
+
+-- 2. 根节点:/admin
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2000, '总后台', 0, 1, 'admin', 'AdminLayout', 'M', 'el-icon-s-platform', '0', '0', 0, 0, 'admin', NOW(), 'adminUI根路由');
+
+-- 3. 数据看板(作为 /admin 的默认重定向页面)
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2001, '数据看板', 2000, 0, 'dashboard', 'admin/dashboard/index', 'C', 'el-icon-s-data', '0', '0', 0, 0, 'admin', NOW(), '默认首页');
+
+-- ============================================================================
+-- 4. 分组 1:租户代理
+-- ============================================================================
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2100, '租户代理', 2000, 1, '', '', 'M', 'el-icon-office-building', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
+
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES
+(2101, '代理管理', 2100, 1, 'proxy', 'admin/proxy/index', 'C', 'el-icon-user', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2102, '收费配置', 2100, 2, 'serviceCost', 'admin/serviceCost/index', 'C', 'el-icon-price-tag', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2103, '收益报表', 2100, 3, 'agentReport', 'admin/agentReport/index', 'C', 'el-icon-data-analysis', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2104, '租户列表', 2100, 4, 'company', 'admin/sysCompany/index', 'C', 'el-icon-notebook-2', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2105, '租户模块使用统计', 2100, 5, 'moduleUsage', 'admin/moduleUsage/index', 'C', 'el-icon-pie-chart', '0', '0', 0, 0, 'admin', NOW(), NULL);
+
+-- ============================================================================
+-- 5. 分组 2:内容审计
+-- ============================================================================
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2200, '内容审计', 2000, 2, '', '', 'M', 'el-icon-view', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
+
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES
+(2201, '视频资源', 2200, 1, 'videoResource', 'admin/videoResource/index', 'C', 'el-icon-video-camera', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2202, '公域课程管理', 2200, 2, 'course', 'admin/course/index', 'C', 'el-icon-reading', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2203, '直播间', 2200, 3, 'live', 'admin/live/index', 'C', 'el-icon-video-camera-solid', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2204, '直播视频', 2200, 4, 'liveVideo', 'admin/liveVideo/index', 'C', 'el-icon-film', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2205, '商品管理', 2200, 5, 'product', 'admin/product/index', 'C', 'el-icon-goods', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2206, '销售订单', 2200, 6, 'storeOrder', 'admin/storeOrder/index', 'C', 'el-icon-shopping-bag-1', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2207, 'AI生成工作流', 2200, 7, 'workflowGenerate', 'lobster/workflow-generate/index', 'C', 'el-icon-cpu', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2208, '销冠语料学习', 2200, 8, 'salesCorpus', 'lobster/sales-corpus/index', 'C', 'el-icon-trophy', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2209, '文章管理', 2200, 9, 'article', 'admin/article/index', 'C', 'el-icon-document', '0', '0', 0, 0, 'admin', NOW(), NULL);
+
+-- ============================================================================
+-- 6. 分组 3:财务管理
+-- ============================================================================
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2300, '财务管理', 2000, 3, '', '', 'M', 'el-icon-money', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
+
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES
+(2301, '消费扣款记录', 2300, 1, 'consumeRecord', 'admin/consumeRecord/index', 'C', 'el-icon-wallet', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2302, '模块消费统计', 2300, 2, 'consumeReport', 'admin/consumeReport/index', 'C', 'el-icon-pie-chart', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2303, '充值扣款记录', 2300, 3, 'rechargeRecord', 'admin/rechargeRecord/index', 'C', 'el-icon-bank-card', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2304, '返佣记录', 2300, 4, 'commissionRecord', 'admin/commissionRecord/index', 'C', 'el-icon-coin', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2305, '代理提现管理', 2300, 5, 'withdrawal', 'admin/withdrawalManage/index', 'C', 'el-icon-money', '0', '0', 0, 0, 'admin', NOW(), NULL);
+
+-- ============================================================================
+-- 7. 分组 4:通信管理
+-- ============================================================================
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2400, '通信管理', 2000, 4, '', '', 'M', 'el-icon-phone-outline', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
+
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES
+(2401, '外呼管理', 2400, 1, 'voice', 'admin/voice/index', 'C', 'el-icon-phone', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2402, '通话接口管理', 2400, 2, 'voiceApi', 'admin/voiceApi/index', 'C', 'el-icon-connection', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2403, '通话套餐管理', 2400, 3, 'voicePackage', 'admin/voicePackage/index', 'C', 'el-icon-box', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2404, '坐席管理', 2400, 4, 'voiceSeat', 'admin/voiceSeat/index', 'C', 'el-icon-service', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2405, '黑名单管理', 2400, 5, 'voiceBlacklist', 'admin/voiceBlacklist/index', 'C', 'el-icon-warning', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2406, '呼叫频率配置', 2400, 6, 'voiceFrequency', 'admin/voiceFrequency/index', 'C', 'el-icon-timer', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2407, '通话套餐订单', 2400, 7, 'voiceOrder', 'admin/voiceOrder/index', 'C', 'el-icon-tickets', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2408, '短信管理', 2400, 8, 'sms', 'admin/sms/index', 'C', 'el-icon-chat-dot-round', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2409, '短信套餐', 2400, 9, 'smsPackage', 'admin/smsPackage/index', 'C', 'el-icon-box', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2410, '短信订单', 2400, 10, 'smsOrder', 'admin/smsOrder/index', 'C', 'el-icon-tickets', '0', '0', 0, 0, 'admin', NOW(), NULL);
+
+-- ============================================================================
+-- 8. 分组 5:系统管理
+-- ============================================================================
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2500, '系统管理', 2000, 5, '', '', 'M', 'el-icon-setting', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
+
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES
+(2501, '员工管理', 2500, 1, 'sysUser', 'admin/sysUser/index', 'C', 'el-icon-user', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2502, '角色管理', 2500, 2, 'role', 'system/role/index', 'C', 'el-icon-s-check', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2503, '菜单管理', 2500, 3, 'menu', 'system/menu/index', 'C', 'el-icon-menu', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2504, '部门管理', 2500, 4, 'dept', 'system/dept/index', 'C', 'el-icon-s-cooperation', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2505, '岗位管理', 2500, 5, 'post', 'system/post/index', 'C', 'el-icon-s-custom', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2506, '操作日志', 2500, 6, 'operLog', 'monitor/operlog/index', 'C', 'el-icon-document', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2507, '登录日志', 2500, 7, 'loginLog', 'monitor/logininfor/index', 'C', 'el-icon-key', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2508, '租户操作日志', 2500, 8, 'companyOperLog', 'monitor/componentsOperLog/index', 'C', 'el-icon-notebook-2', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2509, '代理操作日志', 2500, 9, 'proxyOperLog', 'admin/proxyOperLog/index', 'C', 'el-icon-document-copy', '0', '0', 0, 0, 'admin', NOW(), NULL);
+
+-- ============================================================================
+-- 9. 分组 6:系统配置
+-- ============================================================================
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES (2600, '系统配置', 2000, 6, '', '', 'M', 'el-icon-s-tools', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
+
+INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+VALUES
+(2601, '字典管理', 2600, 1, 'dict', 'system/dict/index', 'C', 'el-icon-collection', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2602, '参数管理', 2600, 2, 'config', 'system/config/index', 'C', 'el-icon-edit-outline', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2603, '通知公告', 2600, 3, 'notice', 'system/notice/index', 'C', 'el-icon-bell', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2604, '违规词语', 2600, 4, 'keyword', 'system/keyword/index', 'C', 'el-icon-warning-outline', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2605, 'CID配置', 2600, 5, 'cidConfig', 'admin/cidConfig/index', 'C', 'el-icon-phone', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2606, '个微配置', 2600, 6, 'wxConfig', 'admin/wxConfig/index', 'C', 'el-icon-chat-line-round', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2607, 'OSS配置', 2600, 7, 'ossConfig', 'admin/ossConfig/index', 'C', 'el-icon-upload', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2608, '前端配置', 2600, 8, 'frontConfig', 'admin/frontConfig/index', 'C', 'el-icon-monitor', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2609, 'Ipad服务器', 2600, 9, 'ipadServer', 'admin/ipadServer/index', 'C', 'el-icon-mobile-phone', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2610, '关键词管理', 2600, 10, 'keywordManage', 'admin/keywordManage/index', 'C', 'el-icon-search', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2611, '文本模型配置', 2600, 11, 'textModel', 'admin/textModel/index', 'C', 'el-icon-cpu', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2612, 'DB配置', 2600, 12, 'dbConfig', 'admin/dbConfig/index', 'C', 'el-icon-s-data', '0', '0', 0, 0, 'admin', NOW(), NULL);

+ 20 - 0
sql/admin_role_menu_init.sql

@@ -0,0 +1,20 @@
+-- =====================================================
+-- adminUI 总后台 - admin角色关联所有菜单
+-- 将fs_menu中的所有菜单项关联到admin角色
+-- =====================================================
+
+-- 假设admin角色role_id=1(请根据实际sys_role表中的admin角色ID调整)
+-- 如果role_id不同,请先查询:SELECT role_id FROM sys_role WHERE role_key IN ('admin', 'superadmin');
+
+-- 先清除已有的这些菜单的角色关联(避免重复)
+DELETE FROM fs_role_menu WHERE menu_id IN (
+    SELECT menu_id FROM (SELECT menu_id FROM fs_menu WHERE menu_id >= 2000) t
+);
+
+-- 为admin角色(role_id=1)关联所有新菜单
+INSERT INTO fs_role_menu (role_id, menu_id)
+SELECT 1, menu_id FROM fs_menu WHERE menu_id >= 2000;
+
+-- 如果有superadmin角色(role_id=2),也关联所有菜单
+-- INSERT INTO fs_role_menu (role_id, menu_id)
+-- SELECT 2, menu_id FROM fs_menu WHERE menu_id >= 2000;

+ 400 - 0
sql/cleanup_orphaned_tables.sql

@@ -0,0 +1,400 @@
+-- ============================================================================
+-- ylrz_saas 数据库清理 SQL
+-- 生成时间: 2026-05-21
+-- 分析依据: 交叉比对 mapper XML 引用表(713张) vs 数据库实际表(865张)
+-- 孤儿表数: 288张 (在数据库中但无任何代码引用)
+-- 
+-- 分类说明:
+--   类别A: 明显垃圾表 (copy/bak/test后缀) - 13张
+--   类别B: 系统框架表 (Quartz/Liquibase/CodeGen) - 17张 [KEEP - 不删]
+--   类别C: 分表/分区表 (fs_user_operation_log_*, qw_msg_*) - 20张 [需DBA确认]
+--   类别D: 孤儿业务表 (无Mapper引用) - 238张
+-- 
+-- 当前文件包含: 类别A (13张) + 类别D (238张) = 251张
+-- 安全删除,这些表在代码中无任何引用
+-- ============================================================================
+
+-- ==============================
+-- 批次1: 类别A - 明显垃圾表 (13张)
+-- 这些是明显的 copy/bak/test 临时表
+-- ==============================
+
+DROP TABLE IF EXISTS `ab_test`;
+DROP TABLE IF EXISTS `company_menu_copy8.28`;
+DROP TABLE IF EXISTS `company_tag_copy1`;
+DROP TABLE IF EXISTS `fs_course_watch_log_bak`;
+DROP TABLE IF EXISTS `fs_user_course_period_copy1`;
+DROP TABLE IF EXISTS `fs_user_course_period_days_copy1`;
+DROP TABLE IF EXISTS `fs_user_information_collection_copy1`;
+DROP TABLE IF EXISTS `qw_company_copy1`;
+DROP TABLE IF EXISTS `qw_push_count_copy1`;
+DROP TABLE IF EXISTS `qw_restriction_push_record_copy1`;
+DROP TABLE IF EXISTS `qw_session_copy1`;
+DROP TABLE IF EXISTS `sys_dict_type_copy1`;
+DROP TABLE IF EXISTS `temp_danmu`;
+
+-- ==============================
+-- 批次2: 类别D - 孤儿业务表 (238张)
+-- 按前缀分组,这些表在代码中无任何 MyBatis Mapper 引用
+-- ==============================
+
+-- account_* (1)
+DROP TABLE IF EXISTS `account_balance_log`;
+
+-- ad_* (1)
+DROP TABLE IF EXISTS `ad_html_url`;
+
+-- adv_* (17) - 旧广告投放系统
+DROP TABLE IF EXISTS `adv_advertiser`;
+DROP TABLE IF EXISTS `adv_api_call_log`;
+DROP TABLE IF EXISTS `adv_callback_account`;
+DROP TABLE IF EXISTS `adv_callback_log`;
+DROP TABLE IF EXISTS `adv_channel`;
+DROP TABLE IF EXISTS `adv_conversion_log`;
+DROP TABLE IF EXISTS `adv_conversion_target`;
+DROP TABLE IF EXISTS `adv_domain_url`;
+DROP TABLE IF EXISTS `adv_event_type`;
+DROP TABLE IF EXISTS `adv_landing_page_template`;
+DROP TABLE IF EXISTS `adv_lead`;
+DROP TABLE IF EXISTS `adv_mini_config`;
+DROP TABLE IF EXISTS `adv_project`;
+DROP TABLE IF EXISTS `adv_promotion_account`;
+DROP TABLE IF EXISTS `adv_site`;
+DROP TABLE IF EXISTS `adv_site_statistics`;
+DROP TABLE IF EXISTS `adv_tracking_link`;
+
+-- agent_* (14) - 旧代理系统
+DROP TABLE IF EXISTS `agent`;
+DROP TABLE IF EXISTS `agent_commission_ratio`;
+DROP TABLE IF EXISTS `agent_commission_record`;
+DROP TABLE IF EXISTS `agent_income_summary`;
+DROP TABLE IF EXISTS `agent_level_config`;
+DROP TABLE IF EXISTS `agent_level_log`;
+DROP TABLE IF EXISTS `agent_prepaid_balance`;
+DROP TABLE IF EXISTS `agent_prepaid_recharge`;
+DROP TABLE IF EXISTS `agent_promote_record`;
+DROP TABLE IF EXISTS `agent_quota_log`;
+DROP TABLE IF EXISTS `agent_resource_auth`;
+DROP TABLE IF EXISTS `agent_settlement`;
+DROP TABLE IF EXISTS `agent_subsidy_record`;
+DROP TABLE IF EXISTS `agent_user`;
+
+-- ai_* (5) - 旧AI系统
+DROP TABLE IF EXISTS `ai_chat_log`;
+DROP TABLE IF EXISTS `ai_chat_tag_extract_log`;
+DROP TABLE IF EXISTS `ai_prompt`;
+DROP TABLE IF EXISTS `ai_sensitive_word`;
+DROP TABLE IF EXISTS `ai_transfer_rule`;
+
+-- aiob_* (3) - 百度AI外呼
+DROP TABLE IF EXISTS `aiob_baidu_call_api`;
+DROP TABLE IF EXISTS `aiob_baidu_encryption`;
+DROP TABLE IF EXISTS `aiob_baidu_task`;
+
+-- balance_* (1)
+DROP TABLE IF EXISTS `balance_rollback_error`;
+
+-- billing_* (1)
+DROP TABLE IF EXISTS `billing_statement_item`;
+
+-- chronic_* (1)
+DROP TABLE IF EXISTS `chronic_follow_plan`;
+
+-- cid_* (2)
+DROP TABLE IF EXISTS `cid_ipad_return_address`;
+DROP TABLE IF EXISTS `cid_ipad_return_message`;
+
+-- commission_* (2)
+DROP TABLE IF EXISTS `commission_config`;
+DROP TABLE IF EXISTS `commission_settle_rule`;
+
+-- company_* (16) - 旧公司模块表
+DROP TABLE IF EXISTS `company_bill`;
+DROP TABLE IF EXISTS `company_course_redpacket`;
+DROP TABLE IF EXISTS `company_external_api_call_log`;
+DROP TABLE IF EXISTS `company_external_api_config`;
+DROP TABLE IF EXISTS `company_extract`;
+DROP TABLE IF EXISTS `company_fs_user`;
+DROP TABLE IF EXISTS `company_link`;
+DROP TABLE IF EXISTS `company_lobster_tag_user_rel`;
+DROP TABLE IF EXISTS `company_recharge_order`;
+DROP TABLE IF EXISTS `company_red_package_logs`;
+DROP TABLE IF EXISTS `company_red_packet_balance_deduction_record`;
+DROP TABLE IF EXISTS `company_tag_group`;
+DROP TABLE IF EXISTS `company_traffic_record`;
+DROP TABLE IF EXISTS `company_traffic_record_log`;
+DROP TABLE IF EXISTS `company_voice_api_tiantian`;
+DROP TABLE IF EXISTS `company_voice_robotic_call_log`;
+
+-- crm_* (1)
+DROP TABLE IF EXISTS `crm_customer_call_log`;
+
+-- customer_* (5) - 旧客户管理
+DROP TABLE IF EXISTS `customer_auto_tag`;
+DROP TABLE IF EXISTS `customer_deposit`;
+DROP TABLE IF EXISTS `customer_lifecycle`;
+DROP TABLE IF EXISTS `customer_portrait`;
+DROP TABLE IF EXISTS `customer_tier`;
+
+-- dashboard_* (1)
+DROP TABLE IF EXISTS `dashboard_snapshot`;
+
+-- date_* (1)
+DROP TABLE IF EXISTS `date_comparison_config`;
+
+-- device_* (2)
+DROP TABLE IF EXISTS `device`;
+DROP TABLE IF EXISTS `device_type`;
+
+-- distribution_* (1)
+DROP TABLE IF EXISTS `distribution_order_split`;
+
+-- fastgpt_* (4)
+DROP TABLE IF EXISTS `fastgpt_chat_msg_log`;
+DROP TABLE IF EXISTS `fastgpt_countent`;
+DROP TABLE IF EXISTS `fastgpt_role_type`;
+DROP TABLE IF EXISTS `fastgpt_tag_content`;
+
+-- financial_* (1)
+DROP TABLE IF EXISTS `financial_ledger`;
+
+-- fs_* (52) - 旧FS平台业务表
+DROP TABLE IF EXISTS `fs_course_answer_logs_1`;
+DROP TABLE IF EXISTS `fs_course_order`;
+DROP TABLE IF EXISTS `fs_course_red_packet_log_1`;
+DROP TABLE IF EXISTS `fs_course_red_packet_retry`;
+DROP TABLE IF EXISTS `fs_course_watch_log_1`;
+DROP TABLE IF EXISTS `fs_delivery_notice`;
+DROP TABLE IF EXISTS `fs_delivery_notice_logs`;
+DROP TABLE IF EXISTS `fs_jst_aftersale_push`;
+DROP TABLE IF EXISTS `fs_jst_cod_push`;
+DROP TABLE IF EXISTS `fs_knowledge`;
+DROP TABLE IF EXISTS `fs_knowledge_cate`;
+DROP TABLE IF EXISTS `fs_mini_program_agreement`;
+DROP TABLE IF EXISTS `fs_miniprogram_sub_notify_task`;
+DROP TABLE IF EXISTS `fs_project_address_config`;
+DROP TABLE IF EXISTS `fs_promotional_active_resource`;
+DROP TABLE IF EXISTS `fs_sales_user_period_relation`;
+DROP TABLE IF EXISTS `fs_statistics_index_overview`;
+DROP TABLE IF EXISTS `fs_store_canvas`;
+DROP TABLE IF EXISTS `fs_store_cart`;
+DROP TABLE IF EXISTS `fs_store_coupon`;
+DROP TABLE IF EXISTS `fs_store_coupon_issue`;
+DROP TABLE IF EXISTS `fs_store_coupon_issue_user`;
+DROP TABLE IF EXISTS `fs_store_express`;
+DROP TABLE IF EXISTS `fs_store_hospital580_prescription_answer_scrm`;
+DROP TABLE IF EXISTS `fs_store_hospital580_prescription_chat_scrm`;
+DROP TABLE IF EXISTS `fs_store_hospital580_prescription_medicine_scrm`;
+DROP TABLE IF EXISTS `fs_store_hospital580_prescription_scrm`;
+DROP TABLE IF EXISTS `fs_store_hospital580_product_push_scrm`;
+DROP TABLE IF EXISTS `fs_store_hospital580_scrm`;
+DROP TABLE IF EXISTS `fs_store_level_scrm`;
+DROP TABLE IF EXISTS `fs_store_menu`;
+DROP TABLE IF EXISTS `fs_store_order_audit_log_scrm`;
+DROP TABLE IF EXISTS `fs_store_order_bill_log_scrm`;
+DROP TABLE IF EXISTS `fs_store_order_status`;
+DROP TABLE IF EXISTS `fs_store_product_attr_item_scrm`;
+DROP TABLE IF EXISTS `fs_store_product_details`;
+DROP TABLE IF EXISTS `fs_store_product_relation`;
+DROP TABLE IF EXISTS `fs_store_product_rule`;
+DROP TABLE IF EXISTS `fs_tag_update_queue`;
+DROP TABLE IF EXISTS `fs_user_app_version`;
+DROP TABLE IF EXISTS `fs_user_black`;
+DROP TABLE IF EXISTS `fs_user_company_user_transfer_task`;
+DROP TABLE IF EXISTS `fs_user_company_user_transfer_task_detail`;
+DROP TABLE IF EXISTS `fs_user_course_live`;
+DROP TABLE IF EXISTS `fs_user_course_period_company`;
+DROP TABLE IF EXISTS `fs_user_course_video_task`;
+DROP TABLE IF EXISTS `fs_user_pop`;
+DROP TABLE IF EXISTS `fs_user_talent_wallet`;
+DROP TABLE IF EXISTS `fs_user_tui_money_rank`;
+DROP TABLE IF EXISTS `fs_watch_device_info`;
+DROP TABLE IF EXISTS `fs_watch_user`;
+DROP TABLE IF EXISTS `fs_wx_express_task`;
+
+-- health_* (1)
+DROP TABLE IF EXISTS `health_check_record`;
+
+-- inventory_* (1)
+DROP TABLE IF EXISTS `inventory_check`;
+
+-- invoice_* (1)
+DROP TABLE IF EXISTS `invoice`;
+
+-- kb_* (2)
+DROP TABLE IF EXISTS `kb_document`;
+DROP TABLE IF EXISTS `kb_knowledge_base`;
+
+-- live_* (26) - 旧直播系统
+DROP TABLE IF EXISTS `live_answer_red_packet`;
+DROP TABLE IF EXISTS `live_answer_red_packet_live`;
+DROP TABLE IF EXISTS `live_config`;
+DROP TABLE IF EXISTS `live_goods_order`;
+DROP TABLE IF EXISTS `live_goods_order_items`;
+DROP TABLE IF EXISTS `live_order_status`;
+DROP TABLE IF EXISTS `live_question`;
+DROP TABLE IF EXISTS `live_question_answer_red_packet`;
+DROP TABLE IF EXISTS `live_question_bank`;
+DROP TABLE IF EXISTS `live_question_live`;
+DROP TABLE IF EXISTS `live_question_user_log`;
+DROP TABLE IF EXISTS `live_reward_compensation`;
+DROP TABLE IF EXISTS `live_reward_record_wx`;
+DROP TABLE IF EXISTS `live_room_online_trend`;
+DROP TABLE IF EXISTS `live_student_data`;
+DROP TABLE IF EXISTS `live_user`;
+DROP TABLE IF EXISTS `live_user_gift`;
+DROP TABLE IF EXISTS `live_user_video_duration`;
+DROP TABLE IF EXISTS `live_user_watch_duration`;
+DROP TABLE IF EXISTS `live_watch_score_rule`;
+DROP TABLE IF EXISTS `live_watch_config`;
+
+-- lobster_* (13) - 旧Lobster AI工作流
+DROP TABLE IF EXISTS `lobster_api_registry`;
+DROP TABLE IF EXISTS `lobster_channel_type_registry`;
+DROP TABLE IF EXISTS `lobster_dialogue_state`;
+DROP TABLE IF EXISTS `lobster_event_node_audit`;
+DROP TABLE IF EXISTS `lobster_evolution_log`;
+DROP TABLE IF EXISTS `lobster_evolution_suggestion`;
+DROP TABLE IF EXISTS `lobster_heartbeat_registry`;
+DROP TABLE IF EXISTS `lobster_learning_corpus`;
+DROP TABLE IF EXISTS `lobster_message_delivery_log`;
+DROP TABLE IF EXISTS `lobster_system_prompt`;
+DROP TABLE IF EXISTS `lobster_unified_contact`;
+DROP TABLE IF EXISTS `lobster_user_node_optimization`;
+DROP TABLE IF EXISTS `lobster_workflow_node`;
+
+-- market_* (1)
+DROP TABLE IF EXISTS `market_push`;
+
+-- marketing_* (1)
+DROP TABLE IF EXISTS `marketing_trigger`;
+
+-- medical_* (2)
+DROP TABLE IF EXISTS `medical_insurance_config`;
+DROP TABLE IF EXISTS `medical_insurance_settlement`;
+
+-- medicine_* (1)
+DROP TABLE IF EXISTS `medicine_remind`;
+
+-- notify_* (2)
+DROP TABLE IF EXISTS `notify_record`;
+DROP TABLE IF EXISTS `notify_template`;
+
+-- pharmacist_* (1)
+DROP TABLE IF EXISTS `pharmacist`;
+
+-- platform_* (3)
+DROP TABLE IF EXISTS `platform_course`;
+DROP TABLE IF EXISTS `platform_live`;
+DROP TABLE IF EXISTS `platform_product`;
+
+-- prescription_* (1)
+DROP TABLE IF EXISTS `prescription`;
+
+-- procurement_* (1)
+DROP TABLE IF EXISTS `procurement_order_settle`;
+
+-- promotion_* (1)
+DROP TABLE IF EXISTS `promotion`;
+
+-- proxy_* (3) - 注意: proxy/proxy_oper_log/proxy_withdraw等在用,勿删!
+-- 只删除无mapper引用的:
+DROP TABLE IF EXISTS `proxy_balance_log`;
+DROP TABLE IF EXISTS `proxy_menu`;
+DROP TABLE IF EXISTS `proxy_role_menu`;
+
+-- purchase_* (2)
+DROP TABLE IF EXISTS `purchase_order`;
+DROP TABLE IF EXISTS `purchase_order_item`;
+
+-- qw_* (17) - 旧企微功能表
+DROP TABLE IF EXISTS `qw_assign_rule`;
+DROP TABLE IF EXISTS `qw_assign_rule_user`;
+DROP TABLE IF EXISTS `qw_config`;
+DROP TABLE IF EXISTS `qw_contact_way_welcome`;
+DROP TABLE IF EXISTS `qw_customer_link`;
+DROP TABLE IF EXISTS `qw_customer_link_channel`;
+DROP TABLE IF EXISTS `qw_customer_link_user`;
+DROP TABLE IF EXISTS `qw_external_ai_analyze_session`;
+DROP TABLE IF EXISTS `qw_group_actual`;
+DROP TABLE IF EXISTS `qw_group_live_code`;
+DROP TABLE IF EXISTS `qw_schedule`;
+DROP TABLE IF EXISTS `qw_sop_clickhouse`;
+DROP TABLE IF EXISTS `qw_sop_logs_clickhouse`;
+DROP TABLE IF EXISTS `qw_sop_service_provider`;
+DROP TABLE IF EXISTS `qw_sop_temp_qw_sop_temp`;
+DROP TABLE IF EXISTS `qw_user_del_loss_log`;
+DROP TABLE IF EXISTS `qw_work_short_link`;
+
+-- reconciliation_* (1)
+DROP TABLE IF EXISTS `reconciliation_report`;
+
+-- red_* (1)
+DROP TABLE IF EXISTS `red_packet_log`;
+
+-- resource_* (2)
+DROP TABLE IF EXISTS `resource_auth`;
+DROP TABLE IF EXISTS `resource_management`;
+
+-- saas_* (2)
+DROP TABLE IF EXISTS `saas_tenant`;
+DROP TABLE IF EXISTS `saas_tenant_config`;
+
+-- sales_* (3)
+DROP TABLE IF EXISTS `sales_performance_detail`;
+DROP TABLE IF EXISTS `sales_performance_pharmacist`;
+DROP TABLE IF EXISTS `sales_performance_store`;
+
+-- settlement_* (2)
+DROP TABLE IF EXISTS `settlement_batch`;
+DROP TABLE IF EXISTS `settlement_ratio`;
+
+-- shipment_* (1)
+DROP TABLE IF EXISTS `shipment`;
+
+-- stock_* (1)
+DROP TABLE IF EXISTS `stock_transfer`;
+
+-- store_* (1)
+DROP TABLE IF EXISTS `store_company_code`;
+
+-- supplier_* (1)
+DROP TABLE IF EXISTS `supplier`;
+
+-- sys_* (2) - 自定义系统配置(非若依框架)
+DROP TABLE IF EXISTS `sys_dept_config`;
+DROP TABLE IF EXISTS `sys_dept_config_log`;
+
+-- tenant_* (12) - 旧租户配置
+DROP TABLE IF EXISTS `tenant_custom_field`;
+DROP TABLE IF EXISTS `tenant_custom_field_index`;
+DROP TABLE IF EXISTS `tenant_fee_config`;
+DROP TABLE IF EXISTS `tenant_fee_consumption`;
+DROP TABLE IF EXISTS `tenant_package`;
+DROP TABLE IF EXISTS `tenant_package_order`;
+DROP TABLE IF EXISTS `tenant_prepaid_balance`;
+DROP TABLE IF EXISTS `tenant_product_import`;
+DROP TABLE IF EXISTS `tenant_recharge_order`;
+DROP TABLE IF EXISTS `tenant_resource`;
+DROP TABLE IF EXISTS `tenant_service_config`;
+DROP TABLE IF EXISTS `tenant_wallet_txn`;
+
+-- wechat_* (1)
+DROP TABLE IF EXISTS `wechat_customer_inherit_rule`;
+
+-- withdraw_* (1)
+DROP TABLE IF EXISTS `withdraw_apply`;
+
+-- wx_* (1)
+DROP TABLE IF EXISTS `wx_msg_log`;
+
+-- ============================================================================
+-- 总计: 251 张表 
+-- ============================================================================
+-- 
+-- 未包含在本文中的需要保留的表:
+-- 1. 类别B (17张): qrtz_*(Quartz), databasechangelog*(Liquibase), gen_table*(生成器), sys_job/sys_job_log
+-- 2. 类别C (20张): fs_user_operation_log_0~9, qw_msg_0~9 - 可能为MySQL分区表,需DBA另行确认
+-- 3. Mapper引用表 (713张): 所有在 MyBatis Mapper XML 中有 SQL 引用的表
+-- 4. 动态SQL引用表: qw_sop, qw_sop_temp, crm_customer, ad_account, fs_store_product, live_video 等
+-- ============================================================================

+ 34 - 0
sql/cleanup_partition_tables.sql

@@ -0,0 +1,34 @@
+-- ============================================================================
+-- ylrz_saas 数据库清理 SQL - 需要DBA确认的分区表
+-- 生成时间: 2026-05-21
+-- 
+-- 以下20张表可能是MySQL分区表,需要DBA先确认分区设置再操作
+-- 如果确认是非分区普通表,且有分表引用(mapper中有 fs_user_operation_log/qw_msg),
+--   则这些可能是历史分表数据,需要评估是否还需要
+-- ============================================================================
+
+-- fs_user_operation_log_0~9: mapper中引用的是 fs_user_operation_log
+-- 如果 fs_user_operation_log_0~9 是独立分表(非分区),且无代码直接引用,可考虑删除
+DROP TABLE IF EXISTS `fs_user_operation_log_0`;
+DROP TABLE IF EXISTS `fs_user_operation_log_1`;
+DROP TABLE IF EXISTS `fs_user_operation_log_2`;
+DROP TABLE IF EXISTS `fs_user_operation_log_3`;
+DROP TABLE IF EXISTS `fs_user_operation_log_4`;
+DROP TABLE IF EXISTS `fs_user_operation_log_5`;
+DROP TABLE IF EXISTS `fs_user_operation_log_6`;
+DROP TABLE IF EXISTS `fs_user_operation_log_7`;
+DROP TABLE IF EXISTS `fs_user_operation_log_8`;
+DROP TABLE IF EXISTS `fs_user_operation_log_9`;
+
+-- qw_msg_0~9: mapper中引用的是 qw_msg
+-- 如果 qw_msg_0~9 是独立分表(非分区),且无代码直接引用,可考虑删除
+DROP TABLE IF EXISTS `qw_msg_0`;
+DROP TABLE IF EXISTS `qw_msg_1`;
+DROP TABLE IF EXISTS `qw_msg_2`;
+DROP TABLE IF EXISTS `qw_msg_3`;
+DROP TABLE IF EXISTS `qw_msg_4`;
+DROP TABLE IF EXISTS `qw_msg_5`;
+DROP TABLE IF EXISTS `qw_msg_6`;
+DROP TABLE IF EXISTS `qw_msg_7`;
+DROP TABLE IF EXISTS `qw_msg_8`;
+DROP TABLE IF EXISTS `qw_msg_9`;