郑永安
2023-06-19 7a6abd05683528032687c75e80e0bd2030a3e46c
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
package com.gkhy.safePlatform.account.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gkhy.safePlatform.account.entity.user.*;
import com.gkhy.safePlatform.account.model.dto.req.RoleAddReqDTO;
import com.gkhy.safePlatform.account.model.dto.req.RoleModReqDTO;
import com.gkhy.safePlatform.account.model.dto.resp.RoleRespDTO;
import com.gkhy.safePlatform.account.enums.ProjectStatusEnum;
import com.gkhy.safePlatform.account.enums.RoleStatusEnum;
import com.gkhy.safePlatform.account.service.RoleService;
import com.gkhy.safePlatform.account.service.baseService.*;
import com.gkhy.safePlatform.commons.co.ContextCacheUser;
import com.gkhy.safePlatform.commons.enums.E;
import com.gkhy.safePlatform.commons.enums.ResultCodes;
import com.gkhy.safePlatform.commons.exception.AusinessException;
import com.gkhy.safePlatform.commons.exception.BusinessException;
import com.gkhy.safePlatform.commons.utils.BeanCopyUtils;
import com.gkhy.safePlatform.commons.utils.StringUtils;
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.Date;
import java.util.List;
 
@Service("roleService")
public class RoleServiceImpl implements RoleService {
 
    @Autowired
    private RoleInfoService roleInfoService;
    @Autowired
    private ProjectInfoService projectInfoService;
    @Autowired
    private RoleProjectInfoService roleProjectInfoService;
    @Autowired
    private UserInfoService userInfoService;
    @Autowired
    private RoleMenuInfoService roleMenuInfoService;
 
    @Override
    @Transactional
    public void addRole(RoleAddReqDTO roleAddDto, ContextCacheUser currentUser) {
        ;
        if (StringUtils.isBlank(roleAddDto.getRoleCode())) {
            throw new AusinessException(E.DATA_PARAM_NULL, "角色编码不能为空");
        }
        if (StringUtils.isBlank(roleAddDto.getRoleName())) {
            throw new AusinessException(E.DATA_PARAM_NULL, "角色名称不能为空");
        }
        String code = roleAddDto.getRoleCode().trim();
        String name = roleAddDto.getRoleName().trim();
        RoleInfo role;
        // 编码判重
        role = roleInfoService.getRoleInfoByCode(code);
        if (role != null) {
            throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色编码已经存在");
        }
        // 名称判重
        role = roleInfoService.getRoleInfoByName(name);
        if (role != null) {
            throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色名称已经存在");
        }
 
        // 1.新增角色
        RoleInfo roleInfo = new RoleInfo();
        roleInfo.setCode(code);
        roleInfo.setName(name);
        roleInfo.setGmtCreate(new Date());
        roleInfo.setInfo(roleAddDto.getRoleInfo());
        roleInfo.setStatus(RoleStatusEnum.ENABLED.getCode());
        roleInfoService.saveRoleInfo(roleInfo);
 
        // 2.角色和所有项目绑定(以后可能是手动分配项目)
        List<ProjectInfo> projects =  projectInfoService.getAllProject(ProjectStatusEnum.ENABLED);
        if (projects.size() > 0) {
            List<RoleProjectInfo> roleProjectInfos = new ArrayList<>();
            RoleProjectInfo roleProjectInfo;
            for (ProjectInfo projectInfo : projects) {
                roleProjectInfo = new RoleProjectInfo();
                roleProjectInfo.setRoleId(roleInfo.getId());
                roleProjectInfo.setProjectId(projectInfo.getId());
                roleProjectInfos.add(roleProjectInfo);
            }
            roleProjectInfoService.saveRoleProjectInfos(roleProjectInfos);
        }
    }
 
    @Override
    @Transactional
    public void modRole(RoleModReqDTO roleModDto,ContextCacheUser currentUser) {
 
        if (roleModDto.getRoleId() == null) {
            throw new BusinessException(ResultCodes.CLIENT_PARAM_NULL);
        }
        if (StringUtils.isBlank(roleModDto.getRoleCode())) {
            throw new AusinessException(E.DATA_PARAM_NULL, "角色编码不能为空");
        }
        if (StringUtils.isBlank(roleModDto.getRoleName())) {
            throw new AusinessException(E.DATA_PARAM_NULL, "角色名称不能为空");
        }
        String code = roleModDto.getRoleCode().trim();
        String name = roleModDto.getRoleName().trim();
        // 1.获取数据库角色
        RoleInfo roleInfo = roleInfoService.getRoleInfoById(roleModDto.getRoleId());
        if (roleInfo == null) {
            // 角色不存在
            throw new BusinessException(ResultCodes.CLIENT_ROLE_NOT_EXIST);
        }
        if (StringUtils.isNotBlank(roleModDto.getRoleInfo())) {
            roleInfo.setInfo(roleModDto.getRoleInfo());
        }
 
 
        // 2.检查字段重复
        RoleInfo role;
        // 编码判重
        role = roleInfoService.getRoleInfoByCode(code);
        if (role != null && !role.getId().equals(roleInfo.getId())) {
            throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色编码已经存在");
        }
        // 名称判重
        role = roleInfoService.getRoleInfoByName(name);
        if (role != null && !role.getId().equals(roleInfo.getId())) {
            throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色名称已经存在");
        }
        roleInfo.setGmtModified(new Date());
        roleInfo.setCode(code);
        roleInfo.setName(name);
        roleInfoService.updateRoleInfo(roleInfo);
        // 3.角色与项目 不做操作
 
    }
 
 
    /**
    * @Description: 获取所有启用的角色
    */
    @Override
    public List<RoleRespDTO> getEnableRoleInfos() {
        List<RoleInfoDO> roleInfos = roleInfoService.getRoleInfoByStatus(RoleStatusEnum.ENABLED);
        RoleRespDTO roleRespDTO;
        List<RoleRespDTO> result = new ArrayList<>(roleInfos.size());
        RoleStatusEnum status;
        for (RoleInfoDO roleInfoDo : roleInfos) {
            roleRespDTO = new RoleRespDTO();
            roleRespDTO.setRoleId(roleInfoDo.getId());
            roleRespDTO.setRoleCode(roleInfoDo.getCode());
            roleRespDTO.setRoleInfo(roleInfoDo.getInfo());
            roleRespDTO.setRoleName(roleInfoDo.getName());
            roleRespDTO.setStatus(roleInfoDo.getStatus());
            status = RoleStatusEnum.parse(roleInfoDo.getStatus());
            assert status != null;
            roleRespDTO.setStatusDesc(status.getValue());
            result.add(roleRespDTO);
        }
        return result;
    }
 
    @Override
    @Transactional
    public void delRole(Long roleId, ContextCacheUser currentUser) {
        ;
        RoleInfo roleInfo = roleInfoService.getRoleInfoById(roleId);
        if (roleInfo == null) {
            throw new BusinessException(ResultCodes.CLIENT_ROLE_NOT_EXIST);
        }
        assert roleInfo.getStatus() != null;
        RoleStatusEnum status = RoleStatusEnum.parse(roleInfo.getStatus());
        if (status != RoleStatusEnum.ENABLED) {
            throw new BusinessException(ResultCodes.CLIENT_ROLE_NOT_EXIST);
        }
        if (roleId.equals(currentUser.getRoleId())) {
            throw new AusinessException(E.DATA_PARAM_CHECK_INVALID, "当前删除角色与所处角色相同");
        }
 
        // 用户占用判断
        long count = userInfoService.countByRoleId(roleId);
        if (count > 0) {
            throw new AusinessException(E.DATA_BING_RELATION, "请解除用户该角色");
        }
 
        RoleInfo role = new RoleInfo();
        role.setId(roleInfo.getId());
        role.setStatus(RoleStatusEnum.ABANDONED.getCode());
        role.setGmtModified(new Date());
        // 1.角色删除
        roleInfoService.updateRoleInfo(role);
 
        // 2.用户解绑角色
        userInfoService.resetRoleToNullByRoleId(roleId);
 
        // 3.角色项目解绑
        roleProjectInfoService.unbindProjectByRoleId(roleId);
 
        // 4.角色菜单解绑
        roleMenuInfoService.unbindMenuByRoleId(roleId);
 
 
    }
 
 
}