“djh”
2024-12-04 d1549b8445c65a6775cf1ba093f5040ace0f87e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.gkhy.huataiFourierSpecialGasMonitor.domain.account.service.impl;
 
import cn.hutool.core.util.ObjectUtil;
import com.gkhy.huataiFourierSpecialGasMonitor.commons.enums.ResultCode;
import com.gkhy.huataiFourierSpecialGasMonitor.commons.exception.BusinessException;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.entity.Role;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.entity.RoleMenuBind;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.model.bo.MenuItemBindRoleBO;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.model.bo.RoleBindMenuItemBO;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.repository.jpa.RoleMenuBindRepository;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.repository.jpa.RoleRepository;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.account.service.RoleMenuDomainService;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.sysAdmin.model.dto.MenuItemDomainDTO;
import com.gkhy.huataiFourierSpecialGasMonitor.domain.sysAdmin.service.MenuDomainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
 
@Service
public class RoleMenuDomainServiceImpl implements RoleMenuDomainService {
 
    @Autowired
    private RoleMenuBindRepository roleMenuBindRepository;
 
    @Autowired
    private RoleRepository roleRepository;
    @Autowired
    private MenuDomainService menuDomainService;
    @Override
    @Transactional
    public boolean roleBindMenu(RoleBindMenuItemBO bindBO) {
        if(bindBO == null || bindBO.getRoleId() == null)
            throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空");
        //校验角色
        Optional<Role> roleOptional = roleRepository.findById(bindBO.getRoleId());
        if(!roleOptional.isPresent())
            throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(),"角色不存在");
        if(bindBO.getUnbindMenuItemIdList() != null && bindBO.getUnbindMenuItemIdList().size() > 0){
            //解绑菜单关联
            //1、检查绑定状态
            List<RoleMenuBind> unbindCheckList =
                    roleMenuBindRepository.findAllByRoleIdAndMenuItemIdIn(bindBO.getRoleId(),
                            bindBO.getUnbindMenuItemIdList());
            if(unbindCheckList == null || unbindCheckList.size() != bindBO.getUnbindMenuItemIdList().size())
                throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色未拥有该菜单项访问权限");
            try {
                roleMenuBindRepository.deleteAllByIdInBatch(bindBO.getUnbindMenuItemIdList());
            } catch (Exception e) {
                throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(), "解除角色菜单项出错");
            }
        }
        if(bindBO.getBindMenuItemIdList() != null && bindBO.getBindMenuItemIdList().size() > 0){
            //增加菜单关联
            //1、检查绑定状态
            List<RoleMenuBind> bindCheckList =
                    roleMenuBindRepository.findAllByRoleIdAndMenuItemIdIn(bindBO.getRoleId(),
                            bindBO.getBindMenuItemIdList());
            if(bindCheckList != null && bindCheckList.size() > 0)
                throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_NOT_ALLOWED.getCode(), "角色已拥有菜单权限");
            //2、校验菜单
            List<MenuItemDomainDTO> checkBindMenuItems = menuDomainService.getActiveMenuItemListByIds(bindBO.getBindMenuItemIdList());
            if(checkBindMenuItems == null || checkBindMenuItems.size() != bindBO.getBindMenuItemIdList().size()){
                throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "菜单项不存在");
            }
            //3、添加角色菜单项绑定
            List<RoleMenuBind> bindList = new ArrayList<>();
            checkBindMenuItems.forEach(item -> {
                RoleMenuBind b = new RoleMenuBind();
                b.setRoleId(bindBO.getRoleId());
                b.setMenuItemId(item.getId());
                b.setGmtCreate(LocalDateTime.now());
                b.setGmtModified(b.getGmtCreate());
                bindList.add(b);
            });
            List<RoleMenuBind> saveRs = roleMenuBindRepository.saveAll(bindList);
            if(saveRs.size() != bindList.size())
                throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"保存出错");
        }
        return true;
    }
 
    @Override
    @Transactional
    public boolean menuBindRole(MenuItemBindRoleBO bindBO) {
        if(bindBO == null || bindBO.getMenuItemId() == null)
            throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空");
        //1、校验菜单
        MenuItemDomainDTO menuItemDomainDTO = menuDomainService.getMenuItemById(bindBO.getMenuItemId());
        if(menuItemDomainDTO == null)
            throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(),"菜单项不存在");
        //2、校验绑定角色
        if(bindBO.getBindRoleIdList() != null && !bindBO.getBindRoleIdList().isEmpty()){
            List<Role> roleList = roleRepository.findAllByIdIn(bindBO.getBindRoleIdList());
            if(roleList == null || roleList.isEmpty() || roleList.size() != bindBO.getBindRoleIdList().size()){
                throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色不存在");
            }
            //绑定角色菜单
            List<RoleMenuBind> bindList = new ArrayList<>();
            roleList.forEach(r -> {
                RoleMenuBind bind = new RoleMenuBind();
                bind.setRoleId(r.getId());
                bind.setMenuItemId(bindBO.getMenuItemId());
                bind.setGmtCreate(LocalDateTime.now());
                bind.setGmtModified(bind.getGmtCreate());
                bindList.add(bind);
            });
            List<RoleMenuBind> saveRs = roleMenuBindRepository.saveAll(bindList);
            if(saveRs == null || saveRs.isEmpty() || saveRs.size() != bindList.size()){
                throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"数据库错误");
            }
        }
        //3、校验解绑角色
        if(bindBO.getUnbindRoleIdList() != null && !bindBO.getUnbindRoleIdList().isEmpty()){
            //解绑角色菜单
            List<RoleMenuBind> bindList = roleMenuBindRepository.findAllByMenuItemIdAndRoleIdIn(bindBO.getMenuItemId(), bindBO.getUnbindRoleIdList());
            if(bindList != null && !bindList.isEmpty()){
                roleMenuBindRepository.deleteAll(bindList);
            }
        }
        return true;
    }
 
    @Override
    public List<MenuItemDomainDTO> getMenuInfoByRole(List<Long> roleIds) {
        if(ObjectUtil.isEmpty(roleIds))
            return null;
        List<RoleMenuBind> bindList = roleMenuBindRepository.findAllByRoleIdIn(roleIds);
        if(bindList == null || bindList.isEmpty())
            return null;
        List<Long> menuItemIdList = new ArrayList<>();
        bindList.forEach(b -> {
            menuItemIdList.add(b.getMenuItemId());
        });
//        List<MenuItemDTO> menuItemList = menuDomainService.getActiveMenuItemListByIds(menuItemIdList);
        List<MenuItemDomainDTO> menuItemList = menuDomainService.getActiveMenuItemListTreeByIds(menuItemIdList);
        return menuItemList;
    }
 
    @Override
    public List<Long> getBindRolesByMenuItemId(Long menuItemId) {
        if(menuItemId == null || menuItemId < 1)
            return null;
        List<Long> bindRoles = roleMenuBindRepository.findBindRoleListByMenuItemId(menuItemId);
        return bindRoles;
    }
}