MenuBootstrapServiceImpl.java 8.38 KB
package com.diligrp.rider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.diligrp.rider.common.enums.AdminRoleScopeEnum;
import com.diligrp.rider.common.enums.MenuScopeEnum;
import com.diligrp.rider.entity.SysMenu;
import com.diligrp.rider.entity.SysRole;
import com.diligrp.rider.entity.SysRoleMenu;
import com.diligrp.rider.mapper.SysMenuMapper;
import com.diligrp.rider.mapper.SysRoleMapper;
import com.diligrp.rider.mapper.SysRoleMenuMapper;
import com.diligrp.rider.service.MenuBootstrapService;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class MenuBootstrapServiceImpl implements MenuBootstrapService {

    private final SysRoleMapper sysRoleMapper;
    private final SysMenuMapper sysMenuMapper;
    private final SysRoleMenuMapper sysRoleMenuMapper;

    @PostConstruct
    @Override
    public void initializeDefaults() {
        SysRole platformRole = ensureRole("platform_admin", "平台管理员", AdminRoleScopeEnum.PLATFORM.name());
        SysRole substationRole = ensureRole("substation_admin", "分站管理员", AdminRoleScopeEnum.SUBSTATION.name());

        List<SysMenu> seededMenus = seedMenus();
        bindMenus(platformRole, seededMenus, MenuScopeEnum.PLATFORM, MenuScopeEnum.BOTH);
        bindMenus(substationRole, seededMenus, MenuScopeEnum.SUBSTATION, MenuScopeEnum.BOTH);
    }

    private SysRole ensureRole(String code, String name, String scope) {
        SysRole role = sysRoleMapper.selectOne(new LambdaQueryWrapper<SysRole>()
                .eq(SysRole::getCode, code)
                .last("LIMIT 1"));
        if (role != null) {
            return role;
        }
        role = new SysRole();
        role.setCode(code);
        role.setName(name);
        role.setRoleScope(scope);
        role.setStatus(1);
        role.setCreateTime(System.currentTimeMillis() / 1000);
        sysRoleMapper.insert(role);
        return role;
    }

    private List<SysMenu> seedMenus() {
        List<SysMenu> defaults = new ArrayList<>();
        defaults.add(menu("dashboard", "工作台", "MENU", "/dashboard", "HomeOutlined", 0L, MenuScopeEnum.BOTH, 10));
        defaults.add(menu("city.manage", "租户管理", "MENU", "/city", "GlobalOutlined", 0L, MenuScopeEnum.PLATFORM, 20));
        defaults.add(menu("substation.manage", "分站管理", "MENU", "/substation", "ApartmentOutlined", 0L, MenuScopeEnum.PLATFORM, 30));
        defaults.add(menu("merchant.root", "商家管理", "DIR", "", "ShopOutlined", 0L, MenuScopeEnum.PLATFORM, 40));
        defaults.add(menu("merchant.enter", "入驻申请", "MENU", "/merchant/enter", "", 0L, MenuScopeEnum.PLATFORM, 41));
        defaults.add(menu("merchant.store", "店铺管理", "MENU", "/merchant/store", "", 0L, MenuScopeEnum.PLATFORM, 42));
        defaults.add(menu("rider.list", "骑手管理", "MENU", "/rider", "UserOutlined", 0L, MenuScopeEnum.BOTH, 50));
        defaults.add(menu("rider.evaluate", "骑手评价", "MENU", "/rider/evaluate", "StarOutlined", 0L, MenuScopeEnum.BOTH, 60));
        defaults.add(menu("order.root", "订单管理", "DIR", "", "UnorderedListOutlined", 0L, MenuScopeEnum.BOTH, 70));
        defaults.add(menu("order.list", "订单列表", "MENU", "/order", "", 0L, MenuScopeEnum.BOTH, 71));
        defaults.add(menu("order.refund", "退款管理", "MENU", "/refund", "", 0L, MenuScopeEnum.BOTH, 72));
        defaults.add(menu("order.delivery", "配送订单", "MENU", "/delivery/order", "", 0L, MenuScopeEnum.BOTH, 73));
        defaults.add(menu("config.root", "配置中心", "DIR", "", "ControlOutlined", 0L, MenuScopeEnum.BOTH, 80));
        defaults.add(menu("fee.plan", "配送费配置", "MENU", "/config/fee-plan", "", 0L, MenuScopeEnum.BOTH, 81));
        defaults.add(menu("dispatch.rule", "调度配置", "MENU", "/dispatch/rule", "", 0L, MenuScopeEnum.BOTH, 82));
        defaults.add(menu("open.root", "开放平台", "DIR", "", "ApiOutlined", 0L, MenuScopeEnum.PLATFORM, 90));
        defaults.add(menu("open.app", "应用管理", "MENU", "/open", "", 0L, MenuScopeEnum.PLATFORM, 91));
        defaults.add(menu("open.mock_delivery", "模拟推单", "MENU", "/open/mock-delivery", "", 0L, MenuScopeEnum.PLATFORM, 92));
        defaults.add(menu("system.root", "系统管理", "DIR", "", "ControlOutlined", 0L, MenuScopeEnum.PLATFORM, 100));
        defaults.add(menu("system.menu", "菜单管理", "MENU", "/system/menu", "", 0L, MenuScopeEnum.PLATFORM, 101));
        defaults.add(menu("system.role", "角色管理", "MENU", "/system/role", "", 0L, MenuScopeEnum.PLATFORM, 102));
        defaults.add(menu("system.role_menu", "角色菜单", "MENU", "/system/role-menu", "", 0L, MenuScopeEnum.PLATFORM, 103));
        defaults.add(menu("admin.user", "平台账号", "MENU", "/admin-user", "", 0L, MenuScopeEnum.PLATFORM, 104));

        Map<String, SysMenu> persisted = new LinkedHashMap<>();
        for (SysMenu menu : defaults) {
            SysMenu existing = sysMenuMapper.selectOne(new LambdaQueryWrapper<SysMenu>()
                    .eq(SysMenu::getCode, menu.getCode())
                    .last("LIMIT 1"));
            if (existing == null) {
                menu.setCreateTime(System.currentTimeMillis() / 1000);
                sysMenuMapper.insert(menu);
                existing = menu;
            }
            persisted.put(existing.getCode(), existing);
        }

        persisted.get("merchant.enter").setParentId(persisted.get("merchant.root").getId());
        persisted.get("merchant.store").setParentId(persisted.get("merchant.root").getId());
        persisted.get("order.list").setParentId(persisted.get("order.root").getId());
        persisted.get("order.refund").setParentId(persisted.get("order.root").getId());
        persisted.get("order.delivery").setParentId(persisted.get("order.root").getId());
        persisted.get("fee.plan").setParentId(persisted.get("config.root").getId());
        persisted.get("dispatch.rule").setParentId(persisted.get("config.root").getId());
        persisted.get("open.app").setParentId(persisted.get("open.root").getId());
        persisted.get("open.mock_delivery").setParentId(persisted.get("open.root").getId());
        persisted.get("system.menu").setParentId(persisted.get("system.root").getId());
        persisted.get("system.menu").setListOrder(101);
        persisted.get("system.role").setParentId(persisted.get("system.root").getId());
        persisted.get("system.role").setListOrder(102);
        persisted.get("system.role_menu").setParentId(persisted.get("system.root").getId());
        persisted.get("system.role_menu").setListOrder(103);
        persisted.get("admin.user").setParentId(persisted.get("system.root").getId());
        persisted.get("admin.user").setListOrder(104);

        for (SysMenu menu : persisted.values()) {
            sysMenuMapper.updateById(menu);
        }
        return new ArrayList<>(persisted.values());
    }

    private void bindMenus(SysRole role, List<SysMenu> menus, MenuScopeEnum primaryScope, MenuScopeEnum commonScope) {
        for (SysMenu menu : menus) {
            if (!primaryScope.name().equals(menu.getMenuScope()) && !commonScope.name().equals(menu.getMenuScope())) {
                continue;
            }
            Long exists = sysRoleMenuMapper.selectCount(new LambdaQueryWrapper<SysRoleMenu>()
                    .eq(SysRoleMenu::getRoleId, role.getId())
                    .eq(SysRoleMenu::getMenuId, menu.getId()));
            if (exists > 0) {
                continue;
            }
            SysRoleMenu roleMenu = new SysRoleMenu();
            roleMenu.setRoleId(role.getId());
            roleMenu.setMenuId(menu.getId());
            roleMenu.setCreateTime(System.currentTimeMillis() / 1000);
            sysRoleMenuMapper.insert(roleMenu);
        }
    }

    private SysMenu menu(String code, String name, String type, String path, String icon,
                         Long parentId, MenuScopeEnum scope, int sort) {
        SysMenu menu = new SysMenu();
        menu.setCode(code);
        menu.setName(name);
        menu.setType(type);
        menu.setPath(path);
        menu.setIcon(icon);
        menu.setParentId(parentId);
        menu.setMenuScope(scope.name());
        menu.setListOrder(sort);
        menu.setVisible(1);
        menu.setStatus(1);
        return menu;
    }
}