Bläddra i källkod

Merge remote-tracking branch 'origin/saas-api' into saas-api

xgb 1 vecka sedan
förälder
incheckning
9aa2d07551

+ 2 - 2
fs-admin-saas/src/main/java/com/fs/tenant/TenantInfoController.java

@@ -234,7 +234,7 @@ public class TenantInfoController extends BaseController
         // 切换到租户库
         tenantDataSourceManager.switchTenant(tenantInfo);
         // 查询租户库里已经存在的menuId
-        List<Long> existIds = tenantInfoMapper.selectExistMenuIds();
+        List<Long> existIds = tenantInfoMapper.selectTenantDbSysMenuIds();
         // 不存在的menuId(就是要新增的)
         List<Long> needAddIds = selected.stream()
                 .filter(id -> !existIds.contains(id))
@@ -256,7 +256,7 @@ public class TenantInfoController extends BaseController
         // 切换到租户库
         tenantDataSourceManager.switchTenant(tenantInfo);
         // 查询租户库里已经存在的menuId
-        List<Long> existIds = tenantInfoMapper.selectExistComMenuIds();
+        List<Long> existIds = tenantInfoMapper.selectTenantDbComMenuIds();
         // 不存在的menuId(就是要新增的)
         List<Long> needAddIds = selected.stream()
                 .filter(id -> !existIds.contains(id))

+ 58 - 39
fs-admin/src/main/java/com/fs/admin/controller/CompanyAdminController.java

@@ -10,6 +10,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
+import com.fs.framework.datasource.TenantDataSourceContextHelper;
 import com.fs.framework.datasource.TenantDataSourceManager;
 import com.fs.proxy.domain.ProxyTenantRel;
 import com.fs.proxy.service.ProxyTenantRelService;
@@ -42,6 +43,9 @@ public class CompanyAdminController extends BaseController {
     @Autowired
     private TenantDataSourceManager tenantDataSourceManager;
 
+    @Autowired
+    private TenantDataSourceContextHelper tenantContextHelper;
+
     @Autowired(required = false)
     private ProxyTenantRelService proxyTenantRelService;
 
@@ -263,68 +267,83 @@ public class CompanyAdminController extends BaseController {
     }
 
     /**
-     * 编辑租户菜单(勾选/取消勾选/新增)
+     * 编辑租户菜单(全量替换:主库取模板 → 租户库删旧插新)。
+     * params.selected 须为当前勾选的完整菜单 ID 列表。
      */
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @Log(title = "编辑租户菜单", businessType = BusinessType.UPDATE)
     @PostMapping("/{id}/menu/edit")
     public R tenantMenuEdit(@PathVariable String id, @RequestBody Map<String, Object> params) {
-        tenantDataSourceManager.clear();
         String flag = (String) params.getOrDefault("flag", "sys");
         List<Long> selected = toLongList(params.get("selected"));
-        List<Long> unSelected = toLongList(params.get("unSelected"));
-        try {
-            TenantInfo tenantInfo = tenantInfoMapper.selectTenantInfoById(id);
-            if (tenantInfo == null) return R.error("租户不存在");
-            if (tenantInfo.getStatus() != null && tenantInfo.getStatus() == 2) return R.error("租户初始化中");
 
-            if ("sys".equals(flag)) {
-                List<SysMenu> addSysMenu = getAddSysMenu(tenantInfo, selected);
-                tenantDataSourceManager.switchTenant(tenantInfo);
-                return tenantInfoService.menuEdit(selected, unSelected, flag, addSysMenu, null);
-            }
-            List<TenantCompanyMenu> addCompanyMenu = getAddCompanyMenu(tenantInfo, selected);
-            tenantDataSourceManager.switchTenant(tenantInfo);
-            return tenantInfoService.menuEdit(selected, unSelected, flag, null, addCompanyMenu);
-        } finally {
-            tenantDataSourceManager.clear();
+        TenantInfo tenantInfo = tenantContextHelper.executeInMaster(() -> tenantInfoMapper.selectTenantInfoById(id));
+        if (tenantInfo == null) {
+            return R.error("租户不存在");
+        }
+        if (tenantInfo.getStatus() != null && tenantInfo.getStatus() == 2) {
+            return R.error("租户初始化中");
         }
+
+        if ("sys".equals(flag)) {
+            List<SysMenu> assignSysMenu = tenantContextHelper.executeInMaster(() -> loadMasterSysMenus(selected));
+            return tenantContextHelper.executeInTenant(tenantInfo,
+                    () -> tenantInfoService.menuAssignReplace(selected, flag, assignSysMenu, null));
+        }
+        List<TenantCompanyMenu> assignCompanyMenu = tenantContextHelper.executeInMaster(() -> loadMasterCompanyMenus(selected));
+        return tenantContextHelper.executeInTenant(tenantInfo,
+                () -> tenantInfoService.menuAssignReplace(selected, flag, null, assignCompanyMenu));
     }
 
-    private List<SysMenu> getAddSysMenu(TenantInfo tenantInfo, List<Long> selected) {
+    /** 主库 tenant_sys_menu 模板 */
+    private List<SysMenu> loadMasterSysMenus(List<Long> selected) {
         if (selected == null || selected.isEmpty()) {
             return new ArrayList<>();
         }
-        tenantDataSourceManager.switchTenant(tenantInfo);
-        List<Long> existIds = tenantInfoMapper.selectExistMenuIds();
-        DynamicDataSourceContextHolder.setDataSourceType(com.fs.common.enums.DataSourceType.MASTER.name());
-        List<Long> needAddIds = selected.stream().filter(mid -> !existIds.contains(mid)).collect(Collectors.toList());
-        if (!needAddIds.isEmpty()) {
-            return tenantInfoMapper.getTenSysMenuByIds(needAddIds);
-        }
-        return new ArrayList<>();
+        return tenantInfoMapper.getTenSysMenuByIds(selected);
     }
 
-    private List<TenantCompanyMenu> getAddCompanyMenu(TenantInfo tenantInfo, List<Long> selected) {
+    /** 主库 tenant_company_menu 模板 */
+    private List<TenantCompanyMenu> loadMasterCompanyMenus(List<Long> selected) {
         if (selected == null || selected.isEmpty()) {
             return new ArrayList<>();
         }
-        tenantDataSourceManager.switchTenant(tenantInfo);
-        List<Long> existIds = tenantInfoMapper.selectExistComMenuIds();
-        DynamicDataSourceContextHolder.setDataSourceType(com.fs.common.enums.DataSourceType.MASTER.name());
-        List<Long> needAddIds = selected.stream().filter(mid -> !existIds.contains(mid)).collect(Collectors.toList());
-        if (!needAddIds.isEmpty()) {
-            return tenantInfoMapper.getTenComMenuByIds(needAddIds);
+        return tenantInfoMapper.getTenComMenuByIds(selected);
+    }
+
+    private List<Long> toLongList(Object raw) {
+        if (raw == null || !(raw instanceof List)) {
+            return new ArrayList<>();
+        }
+        List<?> list = (List<?>) raw;
+        List<Long> result = new ArrayList<>(list.size());
+        for (Object item : list) {
+            Long id = toLongId(item);
+            if (id != null) {
+                result.add(id);
+            }
         }
-        return new ArrayList<>();
+        return result;
     }
 
-    @SuppressWarnings("unchecked")
-    private List<Long> toLongList(Object obj) {
-        if (obj instanceof List) {
-            return ((List<Number>) obj).stream().map(Number::longValue).collect(Collectors.toList());
+    private static Long toLongId(Object value) {
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof Long) {
+            return (Long) value;
+        }
+        if (value instanceof Number) {
+            return ((Number) value).longValue();
+        }
+        if (value instanceof String) {
+            String s = ((String) value).trim();
+            if (s.isEmpty()) {
+                return null;
+            }
+            return Long.parseLong(s);
         }
-        return new ArrayList<>();
+        return null;
     }
 
     /**

+ 2 - 2
fs-admin/src/main/java/com/fs/admin/controller/tenant/TenantInfoController.java

@@ -235,7 +235,7 @@ public class TenantInfoController extends BaseController
         // 切换到租户库
         tenantDataSourceManager.switchTenant(tenantInfo);
         // 查询租户库里已经存在的menuId
-        List<Long> existIds = tenantInfoMapper.selectExistMenuIds();
+        List<Long> existIds = tenantInfoMapper.selectTenantDbSysMenuIds();
         // 不存在的menuId(就是要新增的)
         List<Long> needAddIds = selected.stream()
                 .filter(id -> !existIds.contains(id))
@@ -257,7 +257,7 @@ public class TenantInfoController extends BaseController
         // 切换到租户库
         tenantDataSourceManager.switchTenant(tenantInfo);
         // 查询租户库里已经存在的menuId
-        List<Long> existIds = tenantInfoMapper.selectExistComMenuIds();
+        List<Long> existIds = tenantInfoMapper.selectTenantDbComMenuIds();
         // 不存在的menuId(就是要新增的)
         List<Long> needAddIds = selected.stream()
                 .filter(id -> !existIds.contains(id))

+ 29 - 35
fs-agent/src/main/java/com/fs/admin/controller/CompanyAdminController.java

@@ -9,7 +9,7 @@ import com.fs.common.core.domain.entity.TenantCompanyMenu;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.framework.datasource.DynamicDataSourceContextHolder;
+import com.fs.framework.datasource.TenantDataSourceContextHelper;
 import com.fs.framework.datasource.TenantDataSourceManager;
 import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.mapper.TenantInfoMapper;
@@ -42,6 +42,9 @@ public class CompanyAdminController extends BaseController {
     @Autowired
     private TenantDataSourceManager tenantDataSourceManager;
 
+    @Autowired
+    private TenantDataSourceContextHelper tenantContextHelper;
+
     /**
      * 查询所有租户列表
      */
@@ -205,7 +208,8 @@ public class CompanyAdminController extends BaseController {
     }
 
     /**
-     * 编辑租户菜单(勾选/取消勾选/新增)
+     * 编辑租户菜单(全量替换:主库取模板 → 租户库删旧插新)。
+     * params.selected 须为当前勾选的完整菜单 ID 列表。
      */
     @PreAuthorize("@ss.hasPermi('admin:company:edit')")
     @Log(title = "编辑租户菜单", businessType = BusinessType.UPDATE)
@@ -213,49 +217,39 @@ public class CompanyAdminController extends BaseController {
     public R tenantMenuEdit(@PathVariable String id, @RequestBody Map<String, Object> params) {
         String flag = (String) params.getOrDefault("flag", "sys");
         List<Long> selected = toLongIdList(params.get("selected"));
-        List<Long> unSelected = toLongIdList(params.get("unSelected"));
 
-        TenantInfo tenantInfo = tenantInfoMapper.selectTenantInfoById(id);
-        if (tenantInfo == null) return R.error("租户不存在");
-        if (tenantInfo.getStatus() != null && tenantInfo.getStatus() == 2) return R.error("租户初始化中");
+        TenantInfo tenantInfo = tenantContextHelper.executeInMaster(() -> tenantInfoMapper.selectTenantInfoById(id));
+        if (tenantInfo == null) {
+            return R.error("租户不存在");
+        }
+        if (tenantInfo.getStatus() != null && tenantInfo.getStatus() == 2) {
+            return R.error("租户初始化中");
+        }
 
         if ("sys".equals(flag)) {
-            List<SysMenu> addSysMenu = getAddSysMenu(tenantInfo, selected);
-            tenantDataSourceManager.switchTenant(tenantInfo);
-            return tenantInfoService.menuEdit(selected, unSelected, flag, addSysMenu, null);
+            List<SysMenu> assignSysMenu = tenantContextHelper.executeInMaster(() -> loadMasterSysMenus(selected));
+            return tenantContextHelper.executeInTenant(tenantInfo,
+                    () -> tenantInfoService.menuAssignReplace(selected, flag, assignSysMenu, null));
         }
-
-        List<TenantCompanyMenu> addCompanyMenu = getAddCompanyMenu(tenantInfo, selected);
-        tenantDataSourceManager.switchTenant(tenantInfo);
-        return tenantInfoService.menuEdit(selected, unSelected, flag, null, addCompanyMenu);
+        List<TenantCompanyMenu> assignCompanyMenu = tenantContextHelper.executeInMaster(() -> loadMasterCompanyMenus(selected));
+        return tenantContextHelper.executeInTenant(tenantInfo,
+                () -> tenantInfoService.menuAssignReplace(selected, flag, null, assignCompanyMenu));
     }
 
-    /**
-     * 获取租户库中需要新增的后台菜单
-     */
-    private List<SysMenu> getAddSysMenu(TenantInfo tenantInfo, List<Long> selected) {
-        tenantDataSourceManager.switchTenant(tenantInfo);
-        List<Long> existIds = tenantInfoMapper.selectExistMenuIds();
-        List<Long> needAddIds = selected.stream().filter(mid -> !existIds.contains(mid)).collect(Collectors.toList());
-        DynamicDataSourceContextHolder.setDataSourceType(com.fs.common.enums.DataSourceType.MASTER.name());
-        if (!needAddIds.isEmpty()) {
-            return tenantInfoMapper.getTenSysMenuByIds(needAddIds);
+    /** 主库 tenant_sys_menu 模板 */
+    private List<SysMenu> loadMasterSysMenus(List<Long> selected) {
+        if (selected == null || selected.isEmpty()) {
+            return new ArrayList<>();
         }
-        return new ArrayList<>();
+        return tenantInfoMapper.getTenSysMenuByIds(selected);
     }
 
-    /**
-     * 获取租户库中需要新增的销售菜单
-     */
-    private List<TenantCompanyMenu> getAddCompanyMenu(TenantInfo tenantInfo, List<Long> selected) {
-        tenantDataSourceManager.switchTenant(tenantInfo);
-        List<Long> existIds = tenantInfoMapper.selectExistComMenuIds();
-        List<Long> needAddIds = selected.stream().filter(mid -> !existIds.contains(mid)).collect(Collectors.toList());
-        DynamicDataSourceContextHolder.setDataSourceType(com.fs.common.enums.DataSourceType.MASTER.name());
-        if (!needAddIds.isEmpty()) {
-            return tenantInfoMapper.getTenComMenuByIds(needAddIds);
+    /** 主库 tenant_company_menu 模板 */
+    private List<TenantCompanyMenu> loadMasterCompanyMenus(List<Long> selected) {
+        if (selected == null || selected.isEmpty()) {
+            return new ArrayList<>();
         }
-        return new ArrayList<>();
+        return tenantInfoMapper.getTenComMenuByIds(selected);
     }
 
     private static List<Long> toLongIdList(Object raw) {

+ 2 - 2
fs-agent/src/main/java/com/fs/tenant/TenantInfoController.java

@@ -236,7 +236,7 @@ public class TenantInfoController extends BaseController
         // 切换到租户库
         tenantDataSourceManager.switchTenant(tenantInfo);
         // 查询租户库里已经存在的menuId
-        List<Long> existIds = tenantInfoMapper.selectExistMenuIds();
+        List<Long> existIds = tenantInfoMapper.selectTenantDbSysMenuIds();
         // 不存在的menuId(就是要新增的)
         List<Long> needAddIds = selected.stream()
                 .filter(id -> !existIds.contains(id))
@@ -258,7 +258,7 @@ public class TenantInfoController extends BaseController
         // 切换到租户库
         tenantDataSourceManager.switchTenant(tenantInfo);
         // 查询租户库里已经存在的menuId
-        List<Long> existIds = tenantInfoMapper.selectExistComMenuIds();
+        List<Long> existIds = tenantInfoMapper.selectTenantDbComMenuIds();
         // 不存在的menuId(就是要新增的)
         List<Long> needAddIds = selected.stream()
                 .filter(id -> !existIds.contains(id))

+ 12 - 2
fs-service/src/main/java/com/fs/tenant/mapper/TenantInfoMapper.java

@@ -126,18 +126,28 @@ public interface TenantInfoMapper extends BaseMapper<TenantInfo> {
 
     int updateUnPitchComMenu(@Param("unSelected")List<Long> unSelected);
 
-    List<Long> selectExistMenuIds();
+    /** 租户库 sys_menu 已有 menu_id(须在租户数据源下调用,非主库 tenant_sys_menu) */
+    List<Long> selectTenantDbSysMenuIds();
 
     List<SysMenu> getTenSysMenuByIds(@Param("list") List<Long> needAddIds);
 
     int addSysMenu(@Param("list") List<SysMenu> addSysMenu);
 
-    List<Long> selectExistComMenuIds();
+    /** 租户库 company_menu 已有 menu_id(须在租户数据源下调用,非主库 tenant_company_menu) */
+    List<Long> selectTenantDbComMenuIds();
 
     List<TenantCompanyMenu> getTenComMenuByIds(List<Long> needAddIds);
 
     int addComMenu(List<TenantCompanyMenu> addCompanyMenu);
 
+    int deleteTenantSysMenuByIds(@Param("menuIds") List<Long> menuIds);
+
+    int deleteTenantComMenuByIds(@Param("menuIds") List<Long> menuIds);
+
+    int deleteSysRoleMenuByMenuIds(@Param("menuIds") List<Long> menuIds);
+
+    int deleteComRoleMenuByMenuIds(@Param("menuIds") List<Long> menuIds);
+
     TenantInfo getTenByCode(String code);
 
     List<FeePlanItem> selectFeeItem(String feePlanCode);

+ 7 - 0
fs-service/src/main/java/com/fs/tenant/service/TenantInfoService.java

@@ -74,6 +74,13 @@ public interface TenantInfoService extends IService<TenantInfo> {
 
     R menuEdit(List<Long> selected, List<Long> unSelected, String flag,List<SysMenu> addSysMenu,List<TenantCompanyMenu> addCompanyMenu);
 
+    /**
+     * 在租户数据源下全量替换菜单分配(仅操作租户库 sys_menu/company_menu)。
+     * 模板菜单由调用方从主库 tenant_sys_menu/tenant_company_menu 加载后传入。
+     * 调用前须已通过 TenantDataSourceContextHelper.executeInTenant 切到目标租户库。
+     */
+    R menuAssignReplace(List<Long> selected, String flag, List<SysMenu> assignSysMenu, List<TenantCompanyMenu> assignCompanyMenu);
+
     TenantInfo getTenByCorpId(String corpId);
 
     List<SysMenu> selectMenuList(SysMenu menu, Long userId);

+ 87 - 8
fs-service/src/main/java/com/fs/tenant/service/impl/TenantInfoServiceImpl.java

@@ -37,6 +37,7 @@ import com.fs.utils.TenantUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
@@ -334,31 +335,109 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
     }
 
     @Override
-    public R menuEdit(List<Long> selected, List<Long> unSelected,String flag,List<SysMenu> addSysMenu,List<TenantCompanyMenu> addCompanyMenu) {
-        if ("sys".equals(flag)){
-            if (!CollectionUtils.isEmpty(selected)){
+    public R menuEdit(List<Long> selected, List<Long> unSelected, String flag, List<SysMenu> addSysMenu, List<TenantCompanyMenu> addCompanyMenu) {
+        if ("sys".equals(flag)) {
+            if (!CollectionUtils.isEmpty(selected)) {
                 baseMapper.updatePitchMenu(selected);
             }
-            if (!CollectionUtils.isEmpty(unSelected)){
+            if (!CollectionUtils.isEmpty(unSelected)) {
                 baseMapper.updateUnPitchMenu(unSelected);
             }
-            if (!CollectionUtils.isEmpty(addSysMenu)){
+            if (!CollectionUtils.isEmpty(addSysMenu)) {
                 baseMapper.addSysMenu(addSysMenu);
             }
             return R.ok();
         }
 
-        if (!CollectionUtils.isEmpty(selected)){
+        if (!CollectionUtils.isEmpty(selected)) {
             baseMapper.updatePitchComMenu(selected);
         }
-        if (!CollectionUtils.isEmpty(unSelected)){
+        if (!CollectionUtils.isEmpty(unSelected)) {
             baseMapper.updateUnPitchComMenu(unSelected);
         }
-        if (!CollectionUtils.isEmpty(addCompanyMenu)){
+        if (!CollectionUtils.isEmpty(addCompanyMenu)) {
             baseMapper.addComMenu(addCompanyMenu);
         }
         return R.ok();
+    }
+
+    /**
+     * 租户库菜单全量替换:existIds 查租户库 sys_menu,删/插均在租户库执行。
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R menuAssignReplace(List<Long> selected, String flag, List<SysMenu> assignSysMenu, List<TenantCompanyMenu> assignCompanyMenu) {
+        List<Long> allSelected = emptyIfNull(selected);
+        Set<Long> selectedSet = new HashSet<>(allSelected);
+
+        if ("sys".equals(flag)) {
+            replaceSysMenu(allSelected, selectedSet, assignSysMenu);
+            return R.ok();
+        }
+        replaceComMenu(allSelected, selectedSet, assignCompanyMenu);
+        return R.ok();
+    }
+
+    private void replaceSysMenu(List<Long> allSelected, Set<Long> selectedSet, List<SysMenu> assignSysMenu) {
+        List<Long> existIds = emptyIfNull(baseMapper.selectTenantDbSysMenuIds());
+
+        List<Long> toRemove = existIds.stream()
+                .filter(id -> !selectedSet.contains(id))
+                .collect(Collectors.toList());
+        removeTenantSysMenus(toRemove);
+
+        List<Long> toRefresh = existIds.stream()
+                .filter(selectedSet::contains)
+                .collect(Collectors.toList());
+        removeTenantSysMenus(toRefresh);
+
+        if (!CollectionUtils.isEmpty(assignSysMenu)) {
+            baseMapper.addSysMenu(assignSysMenu);
+        }
+        if (!CollectionUtils.isEmpty(allSelected)) {
+            baseMapper.updatePitchMenu(allSelected);
+        }
+    }
+
+    private void replaceComMenu(List<Long> allSelected, Set<Long> selectedSet, List<TenantCompanyMenu> assignCompanyMenu) {
+        List<Long> existIds = emptyIfNull(baseMapper.selectTenantDbComMenuIds());
+
+        List<Long> toRemove = existIds.stream()
+                .filter(id -> !selectedSet.contains(id))
+                .collect(Collectors.toList());
+        removeTenantComMenus(toRemove);
+
+        List<Long> toRefresh = existIds.stream()
+                .filter(selectedSet::contains)
+                .collect(Collectors.toList());
+        removeTenantComMenus(toRefresh);
+
+        if (!CollectionUtils.isEmpty(assignCompanyMenu)) {
+            baseMapper.addComMenu(assignCompanyMenu);
+        }
+        if (!CollectionUtils.isEmpty(allSelected)) {
+            baseMapper.updatePitchComMenu(allSelected);
+        }
+    }
+
+    private void removeTenantSysMenus(List<Long> menuIds) {
+        if (CollectionUtils.isEmpty(menuIds)) {
+            return;
+        }
+        baseMapper.deleteSysRoleMenuByMenuIds(menuIds);
+        baseMapper.deleteTenantSysMenuByIds(menuIds);
+    }
+
+    private void removeTenantComMenus(List<Long> menuIds) {
+        if (CollectionUtils.isEmpty(menuIds)) {
+            return;
+        }
+        baseMapper.deleteComRoleMenuByMenuIds(menuIds);
+        baseMapper.deleteTenantComMenuByIds(menuIds);
+    }
 
+    private static List<Long> emptyIfNull(List<Long> list) {
+        return list == null ? Collections.emptyList() : list;
     }
 
     @Override

+ 32 - 2
fs-service/src/main/resources/mapper/tenant/TenantInfoMapper.xml

@@ -240,7 +240,8 @@
         from company_menu
     </select>
 
-    <select id="selectExistMenuIds" resultType="java.lang.Long">
+    <!-- 租户库 sys_menu(须在租户数据源下调用) -->
+    <select id="selectTenantDbSysMenuIds" resultType="java.lang.Long">
         SELECT menu_id FROM `sys_menu`
     </select>
 
@@ -252,7 +253,8 @@
         </foreach>
     </select>
 
-    <select id="selectExistComMenuIds" resultType="java.lang.Long">
+    <!-- 租户库 company_menu(须在租户数据源下调用) -->
+    <select id="selectTenantDbComMenuIds" resultType="java.lang.Long">
         SELECT menu_id FROM `company_menu`
     </select>
 
@@ -507,6 +509,34 @@
 
     </insert>
 
+    <delete id="deleteTenantSysMenuByIds">
+        delete from sys_menu where menu_id in
+        <foreach collection="menuIds" item="menuId" open="(" separator="," close=")">
+            #{menuId}
+        </foreach>
+    </delete>
+
+    <delete id="deleteTenantComMenuByIds">
+        delete from company_menu where menu_id in
+        <foreach collection="menuIds" item="menuId" open="(" separator="," close=")">
+            #{menuId}
+        </foreach>
+    </delete>
+
+    <delete id="deleteSysRoleMenuByMenuIds">
+        delete from sys_role_menu where menu_id in
+        <foreach collection="menuIds" item="menuId" open="(" separator="," close=")">
+            #{menuId}
+        </foreach>
+    </delete>
+
+    <delete id="deleteComRoleMenuByMenuIds">
+        delete from company_role_menu where menu_id in
+        <foreach collection="menuIds" item="menuId" open="(" separator="," close=")">
+            #{menuId}
+        </foreach>
+    </delete>
+
     <update id="updateTenantInfo">
         update tenant_info
         <trim prefix="SET" suffixOverrides=",">