From 9af2c277033957c095d1090c8e6f77e54b86172f Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期四, 02 七月 2026 16:58:59 +0800
Subject: [PATCH] 新增企业用户充电分析功能页(包含充电明细);新增系统用户管理中的重置操作密码功能;在角色管理中增加独立合作商角色;角色管理中的添加角色操作新增数据驾驶舱和视频监控入口(需在角色管理员有按钮权限控制)。

---
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java |  124 +++++++++++++++++++++++++++++++++++++++--
 1 files changed, 118 insertions(+), 6 deletions(-)

diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
index a73f98b..c82449f 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
@@ -3,7 +3,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import javax.management.relation.Role;
@@ -61,6 +63,11 @@
 @RequestMapping("/role")
 @Api(tags = "角色模块")
 public class SysRoleController extends BaseController {
+	private static final String INDEPENDENT_PARTNER_ROLE_NAME = "独立合作商";
+	private static final String INDEPENDENT_PARTNER_ROLE_KEY = "independent_partner";
+	private static final String OWN_SITE_NAME = "自有电站";
+	private static final String SYSTEM_ROLE_REMARK = "系统内置角色";
+
 	@Resource
 	private ISysRoleService roleService;
 	
@@ -84,6 +91,88 @@
 	
 	@Resource
 	private SiteClient siteClient;
+	private void ensureIndependentPartnerRole() {
+		SysRole role = roleService.getOne(new LambdaQueryWrapper<SysRole>()
+				.eq(SysRole::getRoleKey, INDEPENDENT_PARTNER_ROLE_KEY)
+				.eq(SysRole::getDelFlag, 0)
+				.last("LIMIT 1"));
+		if (role == null) {
+			role = roleService.getOne(new LambdaQueryWrapper<SysRole>()
+					.eq(SysRole::getRoleName, INDEPENDENT_PARTNER_ROLE_NAME)
+					.eq(SysRole::getDelFlag, 0)
+					.last("LIMIT 1"));
+		}
+		if (role != null) {
+			return;
+		}
+
+		SysRole newRole = new SysRole();
+		newRole.setRoleName(INDEPENDENT_PARTNER_ROLE_NAME);
+		newRole.setRoleKey(INDEPENDENT_PARTNER_ROLE_KEY);
+		newRole.setDataScope("5");
+		newRole.setStatus("0");
+		newRole.setDelFlag("0");
+		newRole.setRemark(SYSTEM_ROLE_REMARK);
+		newRole.setCreateBy(SecurityUtils.getUsername());
+		newRole.setCreateTime(new Date());
+		Set<Long> menuIds = getIndependentPartnerMenuIds();
+		newRole.setMenuIds(menuIds.toArray(new Long[0]));
+		roleService.insertRole(newRole);
+	}
+
+	private Set<Long> getIndependentPartnerMenuIds() {
+		List<SysMenus> menus = menuMapper.getAll();
+		Set<Long> menuIds = new HashSet<>();
+		Set<Long> rootIds = new HashSet<>();
+		for (SysMenus menu : menus) {
+			String path = menu.getPath() == null ? "" : menu.getPath();
+			String menuName = menu.getMenuName() == null ? "" : menu.getMenuName();
+			if ("standingPile".equals(path) || "order".equals(path)
+					|| menuName.contains("站桩管理") || menuName.contains("订单管理")) {
+				rootIds.add(menu.getMenuId());
+			}
+		}
+		for (Long rootId : rootIds) {
+			collectMenuTreeIds(rootId, menus, menuIds);
+		}
+		return menuIds;
+	}
+
+	private void collectMenuTreeIds(Long menuId, List<SysMenus> menus, Set<Long> menuIds) {
+		if (menuId == null || menuIds.contains(menuId)) {
+			return;
+		}
+		menuIds.add(menuId);
+		for (SysMenus menu : menus) {
+			if (menuId.equals(menu.getParentId())) {
+				collectMenuTreeIds(menu.getMenuId(), menus, menuIds);
+			}
+		}
+	}
+
+	private boolean isIndependentPartnerRole(SysRole role) {
+		return role != null && (INDEPENDENT_PARTNER_ROLE_KEY.equals(role.getRoleKey())
+				|| INDEPENDENT_PARTNER_ROLE_NAME.equals(role.getRoleName()));
+	}
+
+	private boolean isSystemBuiltinRole(SysRole role) {
+		return role != null && (role.isAdmin() || isIndependentPartnerRole(role));
+	}
+
+	private void fillRoleV2Info(SysRole role) {
+		if (role == null) {
+			return;
+		}
+		boolean partnerRole = isIndependentPartnerRole(role);
+		role.setPartnerRole(partnerRole);
+		role.setSystemRole(isSystemBuiltinRole(role));
+		if (partnerRole) {
+			role.setSiteNames(Arrays.asList(OWN_SITE_NAME));
+			if (StringUtils.isEmpty(role.getRemark())) {
+				role.setRemark(SYSTEM_ROLE_REMARK);
+			}
+		}
+	}
 	
 	
 	
@@ -102,6 +191,7 @@
 	@GetMapping("/listPage")
 	@ApiOperation(value = "获取角色列表", tags = {"管理后台-角色管理"})
 	public AjaxResult listPage(String name, BasePage basePage) {
+		ensureIndependentPartnerRole();
 		PageInfo<SysRole> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
 		LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<SysRole>().eq(SysRole::getStatus, 0).eq(SysRole::getDelFlag, 0);
 		if (StringUtils.isNotEmpty(name)) {
@@ -118,6 +208,7 @@
 			}
 			long count = sysUserRoleService.count(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getRoleId, record.getRoleId()));
 			record.setNumber(count);
+			fillRoleV2Info(record);
 		}
 		return AjaxResult.success(page);
 	}
@@ -169,6 +260,9 @@
 		RoleInfoVo roleInfoVo = new RoleInfoVo();
 		roleInfoVo.setRoleId(role.getRoleId());
 		roleInfoVo.setRoleName(role.getRoleName());
+		roleInfoVo.setRoleKey(role.getRoleKey());
+		roleInfoVo.setPartnerRole(isIndependentPartnerRole(role));
+		roleInfoVo.setSystemRole(isSystemBuiltinRole(role));
 		// 获取当前角色的菜单id
 		List<Long> menusId = sysRoleMenuMapper.selectList(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, id)).stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
 		if (menusId.size() == 0) {
@@ -194,12 +288,20 @@
 		}
 		roleInfoVo.setMenus(menusId);
 		roleInfoVo.setRemark(role.getRemark());
-		List<Integer> siteIds = roleSiteClient.getSiteIds(role.getRoleId()).getData();
-		if (null != siteIds && siteIds.size() > 0) {
-			List<Site> sites = siteClient.getSiteByIds(siteIds).getData();
-			List<String> siteNames = sites.stream().map(Site::getName).collect(Collectors.toList());
-			roleInfoVo.setSiteNames(siteNames);
-			roleInfoVo.setSiteIds(siteIds);
+		if (isIndependentPartnerRole(role)) {
+			roleInfoVo.setSiteNames(Arrays.asList(OWN_SITE_NAME));
+			roleInfoVo.setSiteIds(new ArrayList<>());
+			if (StringUtils.isEmpty(roleInfoVo.getRemark())) {
+				roleInfoVo.setRemark(SYSTEM_ROLE_REMARK);
+			}
+		} else {
+			List<Integer> siteIds = roleSiteClient.getSiteIds(role.getRoleId()).getData();
+			if (null != siteIds && siteIds.size() > 0) {
+				List<Site> sites = siteClient.getSiteByIds(siteIds).getData();
+				List<String> siteNames = sites.stream().map(Site::getName).collect(Collectors.toList());
+				roleInfoVo.setSiteNames(siteNames);
+				roleInfoVo.setSiteIds(siteIds);
+			}
 		}
 		return AjaxResult.success(roleInfoVo);
 	}
@@ -209,6 +311,10 @@
 	@PostMapping("/roleUpdate")
 	@ApiOperation(value = "编辑角色", tags = {"管理后台-角色管理"})
 	public AjaxResult roleUpdate(@Validated @RequestBody RoleUpdateDto dto) {
+		SysRole oldRole = roleService.selectRoleById(dto.getRoleId());
+		if (isSystemBuiltinRole(oldRole)) {
+			return AjaxResult.error("系统内置角色不可编辑");
+		}
 		SysRole role = new SysRole();
 		role.setRoleName(dto.getRoleName());
 		SysRole one = roleService.getOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleName, dto.getRoleName()));
@@ -269,6 +375,12 @@
 	@DeleteMapping("/{roleIds}")
 	@ApiOperation(value = "删除角色", tags = {"管理后台-角色管理"})
 	public AjaxResult remove(@PathVariable Long[] roleIds) {
+		for (Long roleId : roleIds) {
+			SysRole role = roleService.selectRoleById(roleId);
+			if (isSystemBuiltinRole(role)) {
+				return AjaxResult.error("系统内置角色不可删除");
+			}
+		}
 		return toAjax(roleService.deleteRoleByIds(roleIds));
 	}
 	

--
Gitblit v1.7.1