Quellcode durchsuchen

feat(merchant): 添加商户管理功能并完善权限控制

- 添加商户管理相关实体类 MerchantAddEntity 和 MerchantTable
- 实现商户添加功能,包括 addMerchant 接口和相关业务逻辑
- 修改权限控制逻辑,支持商户级别权限验证
- 更新 SysNodeMapper 查询接口,增加商户ID和操作者角色ID参数
- 在 UserRoleService 中修改 getUserNodeDisplay 方法,支持商户环境下的权限获取
- 完善商户角色权限分配功能,包括节点和操作权限的批量处理
- 添加 MerchantRolePermissionCheckTable 用于商户角色权限检查
- 重构部分 AOP 逻辑,增加空值检查以避免潜在异常
- 修改拦截器和控制器中的权限验证逻辑,适配商户管理模式
- 更新配置文件,添加商户管理相关路径的权限豁免
kongxiangyang vor 5 Monaten
Ursprung
Commit
4c0738903e
26 geänderte Dateien mit 405 neuen und 75 gelöschten Zeilen
  1. 3 2
      uacrd-manager-server/src/main/java/com/crm/manager/controller/AuthorityController.java
  2. 14 1
      uacrd-manager-server/src/main/java/com/crm/manager/controller/MerchantController.java
  3. 3 3
      uacrd-manager-server/src/main/java/com/crm/manager/controller/UserController.java
  4. 14 10
      uacrd-manager-server/src/main/java/com/crm/manager/controller/UserRoleController.java
  5. 8 0
      uacrd-manager-server/src/main/java/com/crm/manager/dao/mapper/MerchantRoleMapper.java
  6. 1 1
      uacrd-manager-server/src/main/java/com/crm/manager/dao/mapper/SysNodeMapper.java
  7. 1 0
      uacrd-manager-server/src/main/java/com/crm/manager/dao/repository/UserRoleRepository.java
  8. 1 1
      uacrd-manager-server/src/main/java/com/crm/manager/interceptor/RoleInterceptor.java
  9. 2 0
      uacrd-manager-server/src/main/java/com/crm/manager/service/MerchantRoleService.java
  10. 1 1
      uacrd-manager-server/src/main/java/com/crm/manager/service/UserRoleDetailService.java
  11. 2 2
      uacrd-manager-server/src/main/java/com/crm/manager/service/UserRoleNodeService.java
  12. 1 1
      uacrd-manager-server/src/main/java/com/crm/manager/service/UserRoleService.java
  13. 10 0
      uacrd-manager-server/src/main/java/com/crm/manager/service/impl/MerchantRoleServiceImpl.java
  14. 22 1
      uacrd-manager-server/src/main/java/com/crm/manager/service/impl/UserRoleDetailServiceImpl.java
  15. 24 3
      uacrd-manager-server/src/main/java/com/crm/manager/service/impl/UserRoleNodeServiceImpl.java
  16. 59 40
      uacrd-manager-server/src/main/java/com/crm/manager/service/impl/UserRoleServiceImpl.java
  17. 1 0
      uacrd-manager-server/src/main/resources/application.yml
  18. 21 0
      uacrd-manager-server/src/main/resources/mapper/MerchantRoleMapper.xml
  19. 8 0
      uacrd-manager-server/src/main/resources/mapper/SysNodeMapper.xml
  20. 36 9
      ucard-backend/src/main/java/com/crm/rely/backend/aspect/DaoMapperAop.java
  21. 44 0
      ucard-core/src/main/java/com/crm/rely/backend/core/entity/user/role/MerchantAddEntity.java
  22. 4 0
      ucard-core/src/main/java/com/crm/rely/backend/core/entity/user/role/UserRoleOperateListEntity.java
  23. 4 0
      ucard-core/src/main/java/com/crm/rely/backend/core/entity/user/role/UserRoleUpdateEntity.java
  24. 6 0
      ucard-core/src/main/java/com/crm/rely/backend/core/pojo/table/UserRoleTable.java
  25. 17 0
      ucard-core/src/main/java/com/crm/rely/backend/core/pojo/table/ucard/MerchantRolePermissionCheckTable.java
  26. 98 0
      ucard-core/src/main/java/com/crm/rely/backend/core/pojo/table/ucard/MerchantTable.java

+ 3 - 2
uacrd-manager-server/src/main/java/com/crm/manager/controller/AuthorityController.java

@@ -4,6 +4,7 @@ import com.crm.manager.service.AuthorityService;
 import com.crm.manager.service.UserRoleService;
 import com.crm.rely.backend.core.dto.base.BaseResultDto;
 import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.entity.custom.info.InfoEntity;
 import com.crm.rely.backend.core.entity.system.action.SysActionAddEntity;
 import com.crm.rely.backend.core.entity.system.action.SysActionDeleteEntity;
 import com.crm.rely.backend.core.entity.system.action.SysActionUpdateEntity;
@@ -113,8 +114,8 @@ public class AuthorityController {
     }
 
     @PostMapping("/info")
-    public BaseResultDto info() throws Exception {
-        List<UserNodeDisplayDto> userNodeDisplayDtos = roleInfoService.getUserNodeDisplay(0L);
+    public BaseResultDto info(InfoEntity infoEntity) throws Exception {
+        List<UserNodeDisplayDto> userNodeDisplayDtos = roleInfoService.getUserNodeDisplay(0L,infoEntity.getIbInfo().getMerchantId(),infoEntity.getIbInfo().getRoleId());
         return BaseResultDto.success(userNodeDisplayDtos);
     }
 }

+ 14 - 1
uacrd-manager-server/src/main/java/com/crm/manager/controller/MerchantController.java

@@ -3,6 +3,7 @@ package com.crm.manager.controller;
 import com.crm.manager.service.MerchantRoleService;
 import com.crm.rely.backend.core.dto.base.BaseResultDto;
 import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.entity.user.role.MerchantAddEntity;
 import com.crm.rely.backend.core.entity.user.role.UserRoleAddEntity;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -13,7 +14,7 @@ import javax.validation.Valid;
 import java.util.List;
 
 @RestController
-@RequestMapping("/role/merchant")
+@RequestMapping("/web/merchant")
 public class MerchantController {
     @Autowired
     private MerchantRoleService merchantRoleService;
@@ -41,4 +42,16 @@ public class MerchantController {
         merchantRoleService.add(userRoleAddEntity);
         return BaseResultDto.success("添加成功");
     }
+
+    /**
+     * 添加商户
+     *
+     * @param merchantAddEntity
+     * @return
+     */
+    @RequestMapping("/addMerchant")
+    public BaseResultDto<String> addMerchant(@RequestBody @Valid MerchantAddEntity merchantAddEntity) {
+    	merchantRoleService.addMerchant(merchantAddEntity);
+    	return BaseResultDto.success("添加成功");
+    }
 }

+ 3 - 3
uacrd-manager-server/src/main/java/com/crm/manager/controller/UserController.java

@@ -260,15 +260,15 @@ public class UserController extends BaseLoginController {
         } else {
             roleId = entity.getIbInfo().getRoleId();
         }
-        List<UserNodeDisplayDto> userNodeDisplayDtos = userRoleService.getUserNodeDisplay(roleId);
+        List<UserNodeDisplayDto> userNodeDisplayDtos = userRoleService.getUserNodeDisplay(roleId,entity.getIbInfo().getMerchantId(),entity.getIbInfo().getRoleId());
         userInfoDto.setDisplay(userNodeDisplayDtos);
 
         return BaseResultDto.success(userInfoDto);
     }
 
     @PostMapping("/display/{roleId}")
-    public String getUserNodeDisplay(@PathVariable("roleId") Long roleId) throws Exception {
-        userRoleService.getUserNodeDisplay(roleId);
+    public String getUserNodeDisplay(@PathVariable("roleId") Long roleId,InfoEntity infoEntity) throws Exception {
+        userRoleService.getUserNodeDisplay(roleId,infoEntity.getIbInfo().getMerchantId(),infoEntity.getIbInfo().getRoleId());
         return "success";
     }
 

+ 14 - 10
uacrd-manager-server/src/main/java/com/crm/manager/controller/UserRoleController.java

@@ -67,10 +67,11 @@ public class UserRoleController extends BaseLoginController {
     public BaseResultDto<List<UserNodeDisplayDto>> getDetailList() throws Exception {
         InfoEntity infoEntity = HttpServletRequestUtil.getLoginInfo(InfoEntity.class, httpServletRequest, redisService
                 , true);
-        if(infoEntity.getIbInfo().getMerchantId() != null && infoEntity.getIbInfo().getIsMerchantAdmin().equals(1)){
-            return BaseResultDto.success(merchantRoleService.merchantDetailList(infoEntity.getIbInfo().getMerchantId()));
-        }
-        List<UserNodeDisplayDto> userNodeDisplayEntities = roleInfoService.getUserNodeDisplay(-1L);
+//        if(infoEntity.getIbInfo().getMerchantId() != null && infoEntity.getIbInfo().getIsMerchantAdmin().equals(1)){
+//            return BaseResultDto.success(merchantRoleService.merchantDetailList(infoEntity.getIbInfo().getMerchantId()));
+//        }
+        Long merchantId = infoEntity.getIbInfo().getMerchantId();
+        List<UserNodeDisplayDto> userNodeDisplayEntities = roleInfoService.getUserNodeDisplay(-1L,merchantId,infoEntity.getIbInfo().getRoleId());
 
         return BaseResultDto.success(userNodeDisplayEntities);
     }
@@ -81,12 +82,13 @@ public class UserRoleController extends BaseLoginController {
      * @return
      */
     @PostMapping("/update")
-    public BaseResultDto updateRoleInfoBase(@RequestBody @Valid UserRoleUpdateEntity userRoleUpdateEntity) throws Exception {
+    public BaseResultDto updateRoleInfoBase(@RequestBody @Valid UserRoleUpdateEntity userRoleUpdateEntity,InfoEntity infoEntity) throws Exception {
         if (ManagerConstant.ROLE_CODE_SYSTEM.equals(userRoleUpdateEntity.getCode())) {
             return BaseResultDto.error(Constants.NOT_PERMIT);
         }
 
-
+        userRoleUpdateEntity.setMerchantId(infoEntity.getIbInfo().getMerchantId());
+        userRoleUpdateEntity.setIsMerchantAdmin(infoEntity.getIbInfo().getIsMerchantAdmin());
         String roleCode = getRoleCode(userRoleUpdateEntity.getDepartmentId());
         userRoleUpdateEntity.setCode(roleCode);
         roleInfoService.updateRoleInfo(userRoleUpdateEntity);
@@ -100,8 +102,8 @@ public class UserRoleController extends BaseLoginController {
      * @return
      */
     @PostMapping("/update/detail")
-    public BaseResultDto updateRoleInfoDetail(@RequestBody @Valid UserRoleOperateListEntity userRoleOperateListEntity) throws Exception {
-
+    public BaseResultDto updateRoleInfoDetail(@RequestBody @Valid UserRoleOperateListEntity userRoleOperateListEntity,InfoEntity infoEntity) throws Exception {
+        userRoleOperateListEntity.setMerchantId(infoEntity.getIbInfo().getMerchantId());
         roleInfoService.updateRoleInfo(userRoleOperateListEntity);
 
         return BaseResultDto.success();
@@ -120,8 +122,10 @@ public class UserRoleController extends BaseLoginController {
                 throw new ControllerException("管理员权限无法修改");
             }
         }
-
-        List<UserNodeDisplayDto> userNodeDisplayEntities = roleInfoService.getUserNodeDisplay(singleLongEntity.getId());
+        Long roleId = singleLongEntity.getId();
+        Long merchantId = userInfoEntity.getIbInfo().getMerchantId();
+        Long operatorRoleId = userInfoEntity.getIbInfo().getRoleId();
+        List<UserNodeDisplayDto> userNodeDisplayEntities = roleInfoService.getUserNodeDisplay(roleId,merchantId,operatorRoleId);
 
         return BaseResultDto.success(userNodeDisplayEntities);
     }

+ 8 - 0
uacrd-manager-server/src/main/java/com/crm/manager/dao/mapper/MerchantRoleMapper.java

@@ -3,7 +3,9 @@ package com.crm.manager.dao.mapper;
 import com.crm.rely.backend.core.pojo.table.SysActionTable;
 import com.crm.rely.backend.core.pojo.table.ucard.MerchantActionTable;
 import com.crm.rely.backend.core.pojo.table.ucard.MerchantNodeTable;
+import com.crm.rely.backend.core.pojo.table.ucard.MerchantTable;
 import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import com.fasterxml.jackson.databind.annotation.JsonAppend;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -18,4 +20,10 @@ public interface MerchantRoleMapper {
     void bantchInsertNode(@Param("list") List<MerchantNodeTable> merchantNodeTables, @Param("merchantId") Long merchantId);
 
     void bantchInsertAction(@Param("list") List<MerchantActionTable> merchantActionTables, @Param("merchantId") Long merchantId);
+
+    void addMerchant(MerchantTable merchantTable);
+
+    void deleteMerchantNode(@Param("list") List<Long> nodeIds,@Param("merchantId") Long merchantId);
+
+    void deleteMerchantAction(@Param("list") List<Long> actions,@Param("merchantId") Long merchantId);
 }

+ 1 - 1
uacrd-manager-server/src/main/java/com/crm/manager/dao/mapper/SysNodeMapper.java

@@ -9,7 +9,7 @@ import java.util.List;
 
 @Repository
 public interface SysNodeMapper {
-    List<SysNodeView> getSysNodesByRoleId(@Param("roleId") Long roleId);
+    List<SysNodeView> getSysNodesByRoleId(@Param("roleId") Long roleId,@Param("merchantId") Long merchantId,@Param("operatorRoleId") Long operatorRoleId);
 
     List<SysNodeTable> findAllByRoleId(@Param("roleId") Long roleId);
 

+ 1 - 0
uacrd-manager-server/src/main/java/com/crm/manager/dao/repository/UserRoleRepository.java

@@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository;
 
 import javax.persistence.LockModeType;
 import java.util.List;
+import java.util.Optional;
 
 @Repository
 public interface UserRoleRepository extends BaseRepository<UserRoleTable> {

+ 1 - 1
uacrd-manager-server/src/main/java/com/crm/manager/interceptor/RoleInterceptor.java

@@ -81,7 +81,7 @@ public class RoleInterceptor implements HandlerInterceptor {
          * 验证权限
          */
         if (!redisService.hasKey(key)) {
-            roleInfoService.getUserNodeDisplay(infoEntity.getIbInfo().getRoleId());
+            roleInfoService.getUserNodeDisplay(infoEntity.getIbInfo().getRoleId(),infoEntity.getIbInfo().getMerchantId(),infoEntity.getIbInfo().getRoleId());
         }
         List<String> actionList = redisService.getObject(key);
         if (actionList == null || actionList.size() == 0) {

+ 2 - 0
uacrd-manager-server/src/main/java/com/crm/manager/service/MerchantRoleService.java

@@ -1,6 +1,7 @@
 package com.crm.manager.service;
 
 import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.entity.user.role.MerchantAddEntity;
 import com.crm.rely.backend.core.entity.user.role.UserRoleAddEntity;
 
 import java.util.List;
@@ -11,4 +12,5 @@ public interface MerchantRoleService {
 
     List<UserNodeDisplayDto> merchantDetailList(Long merchantId);
 
+    void addMerchant(MerchantAddEntity merchantAddEntity);
 }

+ 1 - 1
uacrd-manager-server/src/main/java/com/crm/manager/service/UserRoleDetailService.java

@@ -7,7 +7,7 @@ import java.util.List;
 
 public interface UserRoleDetailService {
 
-    void update(List<UserRoleDetailTable> sellerRoleDetailTables, Long roleId) throws ServiceException;
+    void update(List<UserRoleDetailTable> sellerRoleDetailTables, Long roleId,Integer isMerchantAdmin,Long merchantId) throws ServiceException;
 
     List<UserRoleDetailTable> getUserRoleDetailsByRoleId(Long roleId) throws ServiceException;
 

+ 2 - 2
uacrd-manager-server/src/main/java/com/crm/manager/service/UserRoleNodeService.java

@@ -9,9 +9,9 @@ import java.util.List;
 
 public interface UserRoleNodeService {
 
-    void update(List<UserRoleNodeTable> sellerRoleNodeTables, Long roleId) throws ServiceException;
+    void update(List<UserRoleNodeTable> sellerRoleNodeTables, Long roleId,Integer isMerchantAdmin,Long merchantId) throws ServiceException;
 
-    List<SysNodeView> getSysNodesByRoleId(Long roleId) throws ServiceException;
+    List<SysNodeView> getSysNodesByRoleId(Long roleId,Long merchantId,Long operatorRoleId) throws ServiceException;
 
     void deleteRoleNodeByRoleId(Long roleId) throws ServiceException;
 }

+ 1 - 1
uacrd-manager-server/src/main/java/com/crm/manager/service/UserRoleService.java

@@ -21,7 +21,7 @@ public interface UserRoleService {
      * @return
      * @throws ServiceException
      */
-    List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId) throws ServiceException;
+    List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId,Long merchantId,Long operatorRoleId) throws ServiceException;
 
     /**
      * 判断角色是否存在

+ 10 - 0
uacrd-manager-server/src/main/java/com/crm/manager/service/impl/MerchantRoleServiceImpl.java

@@ -5,6 +5,7 @@ import com.crm.manager.service.MerchantRoleService;
 import com.crm.rely.backend.core.constant.Constants;
 import com.crm.rely.backend.core.dto.user.role.UserActionDisplayDto;
 import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.entity.user.role.MerchantAddEntity;
 import com.crm.rely.backend.core.entity.user.role.UserRoleAddEntity;
 import com.crm.rely.backend.core.entity.user.role.UserRoleOperateEntity;
 import com.crm.rely.backend.core.pojo.table.SysActionTable;
@@ -12,7 +13,9 @@ import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
 import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
 import com.crm.rely.backend.core.pojo.table.ucard.MerchantActionTable;
 import com.crm.rely.backend.core.pojo.table.ucard.MerchantNodeTable;
+import com.crm.rely.backend.core.pojo.table.ucard.MerchantTable;
 import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -90,6 +93,13 @@ public class MerchantRoleServiceImpl implements MerchantRoleService {
         return userNodeDisplayEntities;
     }
 
+    @Override
+    public void addMerchant(MerchantAddEntity merchantAddEntity) {
+        MerchantTable merchantTable = new MerchantTable();
+        BeanUtils.copyProperties(merchantAddEntity, merchantTable);
+        merchantRoleMapper.addMerchant(merchantTable);
+    }
+
     private UserNodeDisplayDto getUserNodeDisplayDto(SysNodeView sysNodeTable) {
         UserNodeDisplayDto userNodeDisplayEntity = new UserNodeDisplayDto();
         userNodeDisplayEntity.setName(sysNodeTable.getName());

+ 22 - 1
uacrd-manager-server/src/main/java/com/crm/manager/service/impl/UserRoleDetailServiceImpl.java

@@ -1,15 +1,19 @@
 package com.crm.manager.service.impl;
 
+import com.crm.manager.dao.mapper.MerchantRoleMapper;
 import com.crm.manager.dao.mapper.UserRoleDetailMapper;
 import com.crm.manager.dao.repository.UserRoleDetailRepository;
 import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
 import com.crm.manager.service.UserRoleDetailService;
+import com.crm.rely.backend.core.pojo.table.ucard.MerchantActionTable;
 import com.crm.rely.backend.exception.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author houn
@@ -24,9 +28,12 @@ public class UserRoleDetailServiceImpl implements UserRoleDetailService {
     @Autowired
     private UserRoleDetailMapper userRoleDetailMapper;
 
+    @Autowired
+    private MerchantRoleMapper merchantRoleMapper;
+
     @Override
     @Transactional(rollbackFor = {Exception.class})
-    public void update(List<UserRoleDetailTable> sellerRoleDetailTables, Long roleId) throws ServiceException {
+    public void update(List<UserRoleDetailTable> sellerRoleDetailTables, Long roleId,Integer isMerchantAdmin,Long merchantId) throws ServiceException {
 
         List<UserRoleDetailTable> deleteSellerRoleDetailTables = userRoleDetailMapper.findAllByRoleId(roleId);
 
@@ -37,6 +44,20 @@ public class UserRoleDetailServiceImpl implements UserRoleDetailService {
         if (sellerRoleDetailTables != null && sellerRoleDetailTables.size() > 0) {
             userRoleDetailRepository.save(sellerRoleDetailTables);
         }
+
+        // 修改商户action
+        if(merchantId == 1L){
+            List<Long> actions = deleteSellerRoleDetailTables.stream().map(UserRoleDetailTable::getActionId).collect(Collectors.toList());
+            merchantRoleMapper.deleteMerchantAction(actions,merchantId);
+            List<MerchantActionTable> merchantActionTables = new ArrayList<>();
+            for (UserRoleDetailTable sellerRoleDetailTable : deleteSellerRoleDetailTables) {
+                MerchantActionTable merchantActionTable = new MerchantActionTable();
+                merchantActionTable.setMerchantId(merchantId);
+                merchantActionTable.setActionId(sellerRoleDetailTable.getActionId());
+                merchantActionTables.add(merchantActionTable);
+            }
+            merchantRoleMapper.bantchInsertAction(merchantActionTables,merchantId);
+        }
     }
 
     @Override

+ 24 - 3
uacrd-manager-server/src/main/java/com/crm/manager/service/impl/UserRoleNodeServiceImpl.java

@@ -1,6 +1,9 @@
 package com.crm.manager.service.impl;
 
+import com.crm.manager.dao.mapper.MerchantRoleMapper;
 import com.crm.manager.dao.mapper.UserRoleNodeMapper;
+import com.crm.rely.backend.core.pojo.table.ucard.MerchantNodeTable;
+import com.crm.rely.backend.core.pojo.table.ucard.MerchantTable;
 import com.crm.rely.backend.exception.ServiceException;
 import com.crm.manager.dao.repository.UserRoleNodeRepository;
 import com.crm.manager.dao.mapper.SysNodeMapper;
@@ -12,7 +15,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author houn
@@ -29,9 +34,12 @@ public class UserRoleNodeServiceImpl implements UserRoleNodeService {
     @Autowired
     private SysNodeMapper shopNodeMapper;
 
+    @Autowired
+    private MerchantRoleMapper merchantRoleMapper;
+
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
-    public void update(List<UserRoleNodeTable> sellerRoleNodeTables, Long roleId) throws ServiceException {
+    public void update(List<UserRoleNodeTable> sellerRoleNodeTables, Long roleId,Integer isMerchantAdmin,Long merchantId) throws ServiceException {
 
         List<UserRoleNodeTable> deleteSellerRoleDetailTables = userRoleNodeMapper.findAllByRoleId(roleId);
 
@@ -41,13 +49,26 @@ public class UserRoleNodeServiceImpl implements UserRoleNodeService {
         if (sellerRoleNodeTables != null && sellerRoleNodeTables.size() > 0) {
             userRoleNodeRepository.save(sellerRoleNodeTables);
         }
+        List<Long> nodeIds = deleteSellerRoleDetailTables.stream().map(UserRoleNodeTable::getNodeId).collect(Collectors.toList());
+        // 修改商户权限
+        if(merchantId == 1L){
+            merchantRoleMapper.deleteMerchantNode(nodeIds,merchantId);
+            List<MerchantNodeTable> merchantNodeTables = new ArrayList<>();
+            for (UserRoleNodeTable sellerRoleNodeTable : sellerRoleNodeTables) {
+                MerchantNodeTable merchantNodeTable = new MerchantNodeTable();
+                merchantNodeTable.setMerchantId(merchantId);
+                merchantNodeTable.setNodeId(sellerRoleNodeTable.getNodeId());
+                merchantNodeTables.add(merchantNodeTable);
+            }
+            merchantRoleMapper.bantchInsertNode(merchantNodeTables,merchantId);
+        }
 
     }
 
     @Override
-    public List<SysNodeView> getSysNodesByRoleId(Long roleId) throws ServiceException {
+    public List<SysNodeView> getSysNodesByRoleId(Long roleId,Long merchantId,Long operatorRoleId) throws ServiceException {
 
-        List<SysNodeView> sysNodeViews = shopNodeMapper.getSysNodesByRoleId(roleId);
+        List<SysNodeView> sysNodeViews = shopNodeMapper.getSysNodesByRoleId(roleId,merchantId,operatorRoleId);
 
         return sysNodeViews;
     }

+ 59 - 40
uacrd-manager-server/src/main/java/com/crm/manager/service/impl/UserRoleServiceImpl.java

@@ -1,5 +1,6 @@
 package com.crm.manager.service.impl;
 
+import com.crm.manager.dao.mapper.MerchantRoleMapper;
 import com.crm.manager.service.AuthorityService;
 import com.crm.rely.backend.core.constant.ManagerConstant;
 import com.crm.manager.dao.repository.SysActionRepository;
@@ -25,8 +26,10 @@ import com.crm.rely.backend.exception.ServiceException;
 import com.crm.rely.backend.service.RedisService;
 import com.crm.rely.backend.util.FormatPage;
 import com.crm.rely.backend.util.GetRandom;
+import com.crm.rely.backend.util.StringUtil;
 import com.crm.rely.backend.util.ValidateUtil;
 import com.google.common.base.Strings;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -74,38 +77,42 @@ public class UserRoleServiceImpl implements UserRoleService {
      * @throws ServiceException
      */
     @Override
-    public List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId) throws ServiceException {
+    public List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId,Long merchantId,Long operatorRoleId) throws ServiceException {
         /*
          *  查询服务器中是否已存在角色信息
          */
-        String key = null;
-        String roleUpdateRedisAuthorityIdentificationKey;
-        if (roleId == null || roleId == 0) {
-            key = RoleConstants.ROLE_USER_NODE + RoleConstants.ROLE_ADMIN;
-            roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + RoleConstants.ROLE_ADMIN;
-        } else {
-            key = RoleConstants.ROLE_USER_NODE + roleId;
-            roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + roleId;
-        }
-        //获取更新标识
-        String updateRedisAuthorityIdentification = redisService.getObject(Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION);
-        if (Strings.isNullOrEmpty(updateRedisAuthorityIdentification)) {
-            updateRedisAuthorityIdentification = authorityService.updateRedisAuthorityIdentification();
-        }
-        //获取角色更新标识
-        String roleUpdateRedisAuthorityIdentification = redisService.getObject(roleUpdateRedisAuthorityIdentificationKey);
-        //判断更新标识是否存在 如果不存在或者存在且和角色更新标识相同的话 直接从redis中获取权限
-        if (!Strings.isNullOrEmpty(roleUpdateRedisAuthorityIdentification) && updateRedisAuthorityIdentification.equals(roleUpdateRedisAuthorityIdentification)) {
-            if (redisService.hasKey(key)) {
-                List<UserNodeDisplayDto> userNodeDisplayDtos = redisService.getObject(key);
-                if (userNodeDisplayDtos.size() != 0) {
-                    return userNodeDisplayDtos;
-                }
-            }
+//        String key = null;
+//        String roleUpdateRedisAuthorityIdentificationKey;
+//        if (roleId == null || roleId == 0) {
+//            key = RoleConstants.ROLE_USER_NODE + RoleConstants.ROLE_ADMIN;
+//            roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + RoleConstants.ROLE_ADMIN;
+//        } else {
+//            key = RoleConstants.ROLE_USER_NODE + roleId;
+//            roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + roleId;
+//        }
+//        //获取更新标识
+//        String updateRedisAuthorityIdentification = redisService.getObject(Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION);
+//        if (Strings.isNullOrEmpty(updateRedisAuthorityIdentification)) {
+//            updateRedisAuthorityIdentification = authorityService.updateRedisAuthorityIdentification();
+//        }
+//        //获取角色更新标识
+//        String roleUpdateRedisAuthorityIdentification = redisService.getObject(roleUpdateRedisAuthorityIdentificationKey);
+//        //判断更新标识是否存在 如果不存在或者存在且和角色更新标识相同的话 直接从redis中获取权限
+//        if (!Strings.isNullOrEmpty(roleUpdateRedisAuthorityIdentification) && updateRedisAuthorityIdentification.equals(roleUpdateRedisAuthorityIdentification)) {
+//            if (redisService.hasKey(key)) {
+//                List<UserNodeDisplayDto> userNodeDisplayDtos = redisService.getObject(key);
+//                if (userNodeDisplayDtos.size() != 0) {
+//                    return userNodeDisplayDtos;
+//                }
+//            }
+//        }
+        UserRoleTable userRoleTable = userRoleRepository.getFirstById(roleId);
+        if(userRoleTable != null && userRoleTable.getMerchantId() != null){
+            merchantId = userRoleTable.getMerchantId();
         }
-        List<UserNodeDisplayDto> result = updateUserNode(roleId);
+        List<UserNodeDisplayDto> result = updateUserNode(roleId,merchantId,operatorRoleId);
         //更新角色更新标识
-        redisService.saveObject(roleUpdateRedisAuthorityIdentificationKey, updateRedisAuthorityIdentification);
+//        redisService.saveObject(roleUpdateRedisAuthorityIdentificationKey, updateRedisAuthorityIdentification);
         return result;
     }
 
@@ -162,8 +169,9 @@ public class UserRoleServiceImpl implements UserRoleService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateRoleInfo(UserRoleUpdateEntity userRoleUpdateEntity) throws ServiceException {
+        Long roleId = userRoleUpdateEntity.getId();
         // 角色id 查角色信息
-        UserRoleTable userRoleTable = userRoleRepository.findOne(userRoleUpdateEntity.getId());
+        UserRoleTable userRoleTable = userRoleRepository.findOne(roleId);
         if (userRoleTable == null) {
             throw new ServiceException(Constants.INFO_NOT_FOUND);
         }
@@ -172,17 +180,19 @@ public class UserRoleServiceImpl implements UserRoleService {
                 throw new ServiceException("该角色名已存在");
             }
         }
-
+        Long merchantId = userRoleTable.getMerchantId();
         BeanUtils.copyProperties(userRoleUpdateEntity, userRoleTable);
-
+        userRoleTable.setMerchantId(merchantId);
         userRoleRepository.save(userRoleTable);
 
         UserRoleOperateListEntity userRoleOperateListEntity = new UserRoleOperateListEntity();
         userRoleOperateListEntity.setModifyUser(userRoleUpdateEntity.getModifyUser());
         userRoleOperateListEntity.setModifyTime(userRoleUpdateEntity.getModifyTime());
         userRoleOperateListEntity.setModifyIp(userRoleUpdateEntity.getModifyIp());
-        userRoleOperateListEntity.setRoleId(userRoleTable.getId());
+        userRoleOperateListEntity.setRoleId(roleId);
+        userRoleOperateListEntity.setMerchantId(userRoleTable.getMerchantId());
         userRoleOperateListEntity.setData(userRoleUpdateEntity.getData());
+        userRoleOperateListEntity.setIsMerchantAdmin(userRoleUpdateEntity.getIsMerchantAdmin());
         updateRoleInfo(userRoleOperateListEntity);
     }
 
@@ -195,7 +205,6 @@ public class UserRoleServiceImpl implements UserRoleService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateRoleInfo(UserRoleOperateListEntity userRoleOperateListEntity) throws ServiceException {
-
         if (userRoleOperateListEntity == null) {
             return;
         }
@@ -203,6 +212,8 @@ public class UserRoleServiceImpl implements UserRoleService {
             throw new ServiceException("当前角色不可修改!!!");
         }
         Long roleId = userRoleOperateListEntity.getRoleId();
+        Long merchantId = userRoleOperateListEntity.getMerchantId();
+        Integer isMerchantAdmin = userRoleOperateListEntity.getIsMerchantAdmin();
 
         List<UserRoleNodeTable> roleNodeTables = null;
         List<UserRoleDetailTable> roleDetailTables = null;
@@ -253,14 +264,14 @@ public class UserRoleServiceImpl implements UserRoleService {
         /*
          * 修改原有的角色信息
          */
-        userRoleNodeService.update(roleNodeTables, roleId);
+        userRoleNodeService.update(roleNodeTables, roleId, isMerchantAdmin, merchantId);
 
-        userRoleDetailService.update(roleDetailTables, roleId);
+        userRoleDetailService.update(roleDetailTables, roleId,isMerchantAdmin,merchantId);
 
         /*
          * 更新内存中的角色信息
          */
-        updateUserNode(roleId);
+        updateUserNode(roleId,merchantId,null);
     }
 
     /**
@@ -467,6 +478,9 @@ public class UserRoleServiceImpl implements UserRoleService {
         return shellerRoleDto;
     }
 
+    @Autowired
+    private MerchantRoleMapper merchantRoleMapper;
+
     /**
      * 修改权限
      *
@@ -474,17 +488,22 @@ public class UserRoleServiceImpl implements UserRoleService {
      * @return
      * @throws ServiceException
      */
-    private List<UserNodeDisplayDto> updateUserNode(Long roleId) throws ServiceException {
+    private List<UserNodeDisplayDto> updateUserNode(Long roleId,Long merchantId,Long operatorRoleId) throws ServiceException {
 
         /*
-         * 该角色拥有的所有菜单
+         * 返回全量节点信息并标记该角色是否拥有该菜单权限
          */
-        List<SysNodeView> sysNodeViews = userRoleNodeService.getSysNodesByRoleId(roleId);
-
+        List<SysNodeView> sysNodeViews = userRoleNodeService.getSysNodesByRoleId(roleId,merchantId,operatorRoleId);
+        List<SysActionTable> sysActionTables;
         /*
          * 获取按钮信息
          */
-        List<SysActionTable> sysActionTables = userActionRepository.getAllByOrderByCode();
+        if(merchantId != null && operatorRoleId != null){
+            // 获取该商户所有节点权限信息
+            sysActionTables = merchantRoleMapper.getAllByMerchantId(merchantId);
+        }else {
+            sysActionTables = userActionRepository.getAllByOrderByCode();
+        }
 
 //        if (sysActionTables == null || sysActionTables.size() == 0) {
 //            throw new RuntimeException("权限信息有误,请联系管理员");

+ 1 - 0
uacrd-manager-server/src/main/resources/application.yml

@@ -12,6 +12,7 @@ ribbon:
   ConnectTimeout: 60000
 login:
   excludePathPatterns:
+    /web/merchant/addMerchantNode,
     /role/merchant/addMerchantNode,
     /role/merchant/list,
     /user/login,

+ 21 - 0
uacrd-manager-server/src/main/resources/mapper/MerchantRoleMapper.xml

@@ -29,4 +29,25 @@
                              JOIN sys_action sa ON ma.action_id = sa.id
         WHERE ma.merchant_id = #{merchantId};
     </select>
+
+    <insert id="addMerchant">
+        insert into merchant (merchant_code, merchant_name, admin_user_id, status, expire_time, max_users, add_time,
+                              add_user, add_ip, modify_time, modify_user, modify_ip, note)
+        VALUES (#{merchantCode}, #{merchantName}, #{adminUserId}, #{status}, #{expireTime}, #{maxUsers}, #{addTime},
+                #{addUser}, #{addIp}, #{modifyTime}, #{modifyUser},#{modifyIp},#{note})
+    </insert>
+
+    <delete id="deleteMerchantNode">
+        delete from merchant_node where merchant_id = #{merchantId} and node_id in
+        <foreach item="item" index="index" collection="list" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </delete>
+
+    <delete id="deleteMerchantAction">
+        delete from merchant_action where merchant_id = #{merchantId} and action_id not in
+        <foreach item="item" index="index" collection="list" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </delete>
 </mapper>

+ 8 - 0
uacrd-manager-server/src/main/resources/mapper/SysNodeMapper.xml

@@ -23,6 +23,14 @@
             TRUE as `show`
         </if>
         FROM sys_node
+
+        <if test="merchantId != null and operatorRoleId != null">
+            join merchant_node on sys_node.id = merchant_node.node_id
+        </if>
+<!--        join merchant_node on sys_node.id = merchant_node.node_id-->
+
+
+
         <if test="roleId!=null and roleId!=0 and roleId!=-1">
             LEFT JOIN user_role_node on sys_node.id = user_role_node.node_id and user_role_node.role_id =
             #{roleId}

+ 36 - 9
ucard-backend/src/main/java/com/crm/rely/backend/aspect/DaoMapperAop.java

@@ -91,31 +91,37 @@ public class DaoMapperAop {
     @After(value = "deleteLog()")
     public void afterDelete(JoinPoint joinPoint) {
         LogType logType = LogType.DELETE;
+        if(joinPoint.getArgs() == null){
+            return;
+        }
         Object[] args = joinPoint.getArgs();
         for (int i = args.length - 1; i >= 0; i--) {
             if (args[i] instanceof Long) {
                 Long id = (Long) args[i];
-                String className = getT(joinPoint);
-                controllerAop.addThreadLocal(className, null, logType, id);
+                String className = getT(joinPoint); // 这里可能返回null
+                if (className != null) { // 添加空值检查
+                    controllerAop.addThreadLocal(className, null, logType, id);
+                }
                 break;
             } else if (args[i] instanceof Iterable) {
                 Iterable iterable = (Iterable) args[i];
                 iterable.forEach(value -> {
                     if (value instanceof Long) {
                         Long id = (Long) value;
-                        String className = getT(joinPoint);
-                        controllerAop.addThreadLocal(className, null, logType, id);
+                        String className = getT(joinPoint); // 这里可能返回null
+                        if (className != null) { // 添加空值检查
+                            controllerAop.addThreadLocal(className, null, logType, id);
+                        }
                     } else {
                         BaseTable table = getBaseTable(value);
                         addControllerAopThreadLocal(table, logType);
                     }
                 });
                 break;
-            }else if (args[i] instanceof BaseTable) {
+            } else if (args[i] instanceof BaseTable) {
                 BaseTable iterable = (BaseTable) args[i];
                 BaseTable table = getBaseTable(iterable);
                 addControllerAopThreadLocal(table, logType);
-
             }
         }
     }
@@ -192,10 +198,31 @@ public class DaoMapperAop {
     }
 
     private String getT(JoinPoint joinPoint) {
+        if (joinPoint == null || joinPoint.getTarget() == null) {
+            return null;
+        }
+
         Type[] types = joinPoint.getTarget().getClass().getGenericInterfaces();
-        Class controllerClass = (Class) types[0];
-        String className = ((ParameterizedType) controllerClass.getGenericInterfaces()[0]).getActualTypeArguments()[0].toString();
-        return className;
+        if (types == null || types.length == 0) {
+            logger.warn("目标类没有泛型接口: {}", joinPoint.getTarget().getClass().getName());
+            return null;
+        }
+
+        Class<?> controllerClass = (Class<?>) types[0];
+        if (controllerClass.getGenericInterfaces() == null ||
+                controllerClass.getGenericInterfaces().length == 0) {
+            logger.warn("类没有通用接口: {}", controllerClass.getName());
+            return null;
+        }
+
+        Type[] actualTypeArguments = ((ParameterizedType) controllerClass.getGenericInterfaces()[0])
+                .getActualTypeArguments();
+        if (actualTypeArguments == null || actualTypeArguments.length == 0) {
+            logger.warn("泛型接口没有实际类型参数: {}", controllerClass.getName());
+            return null;
+        }
+
+        return actualTypeArguments[0].toString();
     }
 
     /**

+ 44 - 0
ucard-core/src/main/java/com/crm/rely/backend/core/entity/user/role/MerchantAddEntity.java

@@ -0,0 +1,44 @@
+package com.crm.rely.backend.core.entity.user.role;
+
+import com.crm.rely.backend.core.entity.base.BaseAddEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class MerchantAddEntity extends BaseAddEntity {
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 商户编码
+     */
+    private String merchantCode;
+
+    /**
+     * 商户名称
+     */
+    private String merchantName;
+
+    /**
+     * 商户管理员用户ID
+     */
+    private Long adminUserId;
+
+    /**
+     * 状态 0:禁用 1:启用
+     */
+    private Integer status = 1;
+
+    /**
+     * 服务到期时间
+     */
+    private Date expireTime;
+
+    /**
+     * 最大用户数
+     */
+    private Integer maxUsers = 0;
+}

+ 4 - 0
ucard-core/src/main/java/com/crm/rely/backend/core/entity/user/role/UserRoleOperateListEntity.java

@@ -15,4 +15,8 @@ public class UserRoleOperateListEntity extends BaseUpdateEntity {
     private Long departmentId;
 
     private List<UserRoleOperateEntity> data;
+
+    private Long merchantId;
+
+    private Integer isMerchantAdmin;
 }

+ 4 - 0
ucard-core/src/main/java/com/crm/rely/backend/core/entity/user/role/UserRoleUpdateEntity.java

@@ -21,6 +21,10 @@ public class UserRoleUpdateEntity extends BaseUpdateEntity {
 
     private Long departmentId;
 
+    private Long merchantId;
+
+    private Integer isMerchantAdmin;
+
     private  String content;
 
     private List<UserRoleOperateEntity> data;

+ 6 - 0
ucard-core/src/main/java/com/crm/rely/backend/core/pojo/table/UserRoleTable.java

@@ -2,10 +2,13 @@ package com.crm.rely.backend.core.pojo.table;
 
 import com.crm.rely.backend.core.pojo.BaseTable;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Entity
 @Table(name = "user_role")
@@ -29,4 +32,7 @@ public class UserRoleTable extends BaseTable {
      * 员工数量
      */
     private Integer number;
+
+    @Column(name = "merchant_id")
+    private Long merchantId;
 }

+ 17 - 0
ucard-core/src/main/java/com/crm/rely/backend/core/pojo/table/ucard/MerchantRolePermissionCheckTable.java

@@ -0,0 +1,17 @@
+package com.crm.rely.backend.core.pojo.table.ucard;
+
+import lombok.Data;
+
+import javax.persistence.Table;
+
+@Data
+@Table(name = "merchant_role_permission_check")
+public class MerchantRolePermissionCheckTable {
+    private Long roleId;
+    private String roleName;
+    private Long merchantId;
+    private Long nodeId;
+    private Long actionId;
+    private Long nodePermitted;
+    private Long actionPermitted;
+}

+ 98 - 0
ucard-core/src/main/java/com/crm/rely/backend/core/pojo/table/ucard/MerchantTable.java

@@ -0,0 +1,98 @@
+package com.crm.rely.backend.core.pojo.table.ucard;
+
+import com.crm.rely.backend.core.pojo.BaseTable;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Data
+@Entity
+@Table(name = "merchant")
+public class MerchantTable extends BaseTable {
+    /**
+     * 主键ID
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    /**
+     * 商户编码
+     */
+    @Column(name = "merchant_code", nullable = false, length = 100)
+    private String merchantCode;
+
+    /**
+     * 商户名称
+     */
+    @Column(name = "merchant_name", nullable = false, length = 200)
+    private String merchantName;
+
+    /**
+     * 商户管理员用户ID
+     */
+    @Column(name = "admin_user_id")
+    private Long adminUserId;
+
+    /**
+     * 状态 0:禁用 1:启用
+     */
+    @Column(name = "status")
+    private Integer status = 1;
+
+    /**
+     * 服务到期时间
+     */
+    @Column(name = "expire_time")
+    private Date expireTime;
+
+    /**
+     * 最大用户数
+     */
+    @Column(name = "max_users")
+    private Integer maxUsers = 0;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "add_time")
+    private Date addTime;
+
+    /**
+     * 创建人
+     */
+    @Column(name = "add_user")
+    private Long addUser;
+
+    /**
+     * 创建IP
+     */
+    @Column(name = "add_ip", length = 150)
+    private String addIp;
+
+    /**
+     * 修改时间
+     */
+    @Column(name = "modify_time")
+    private Date modifyTime;
+
+    /**
+     * 修改人
+     */
+    @Column(name = "modify_user")
+    private Long modifyUser;
+
+    /**
+     * 修改IP
+     */
+    @Column(name = "modify_ip", length = 150)
+    private String modifyIp;
+
+    /**
+     * 备注
+     */
+    @Column(name = "note", length = 500)
+    private String note;
+}