peng
2026-03-18 e59a0201057ba67cad425fed804c82ff4ba0c6f1
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
package com.tievd.cube.modules.system.service.impl;
 
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tievd.cube.commons.constant.CommonConst;
import com.tievd.cube.commons.exception.CubeAppException;
import com.tievd.cube.modules.system.entity.*;
import com.tievd.cube.modules.system.mapper.*;
import com.tievd.cube.modules.system.model.TreeModel;
import com.tievd.cube.modules.system.model.api.response.LoadDataRuleResponse;
import com.tievd.cube.modules.system.model.api.response.TreeListForDeptRoleResponse;
import com.tievd.cube.modules.system.service.ISysDepartPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.*;
import java.util.stream.Collectors;
 
@Service
public class SysDepartPermissionServiceImpl extends ServiceImpl<SysDepartPermissionMapper, SysDepartPermission> implements ISysDepartPermissionService {
 
    @Autowired
    private SysPermissionDataRuleMapper ruleMapper;
    @Autowired
    private SysDepartRoleMapper sysDepartRoleMapper;
    @Autowired
    private SysDepartRolePermissionMapper departRolePermissionMapper;
    @Autowired
    private SysPermissionDataRuleMapper sysPermissionDataRuleMapper;
    @Autowired
    private SysPermissionMapper sysPermissionMapper;
 
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveDepartPermission(String departId, String permissionIds, String lastPermissionIds) {
        List<String> add = getDiff(lastPermissionIds, permissionIds);
        if (add != null && add.size() > 0) {
            List<SysDepartPermission> list = new ArrayList<>();
            for (String p : add) {
                if (StrUtil.isNotEmpty(p)) {
                    SysDepartPermission rolepms = new SysDepartPermission(departId, p);
                    list.add(rolepms);
                }
            }
            this.saveBatch(list);
        }
        List<String> delete = getDiff(permissionIds, lastPermissionIds);
        if (delete != null && delete.size() > 0) {
            for (String permissionId : delete) {
                this.remove(new QueryWrapper<SysDepartPermission>().lambda().eq(SysDepartPermission::getDepartId, departId).eq(SysDepartPermission::getPermissionId, permissionId));
                //删除部门权限时,删除部门角色中已授权的权限
                List<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(new LambdaQueryWrapper<SysDepartRole>().eq(SysDepartRole::getDepartId, departId));
                List<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());
                if (roleIds.size() > 0) {
                    departRolePermissionMapper.delete(new LambdaQueryWrapper<SysDepartRolePermission>().eq(SysDepartRolePermission::getPermissionId, permissionId));
                }
            }
        }
    }
 
    @Override
    public List<SysPermissionDataRule> getPermRuleListByDeptIdAndPermId(String departId, String permissionId) {
        SysDepartPermission departPermission = this.getOne(new QueryWrapper<SysDepartPermission>().lambda().eq(SysDepartPermission::getDepartId, departId).eq(SysDepartPermission::getPermissionId, permissionId));
        if (departPermission != null) {
            LambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<>();
            query.in(SysPermissionDataRule::getId, Arrays.asList(departPermission.getDataRuleIds().split(",")));
            query.orderByDesc(SysPermissionDataRule::getCreateTime);
            return this.ruleMapper.selectList(query);
        } else {
            return null;
        }
    }
 
    @Override
    public LoadDataRuleResponse loadDataRule(String permissionId, String departId) {
        LambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<>();
        query.eq(SysPermissionDataRule::getPermissionId, permissionId);
        query.orderByDesc(SysPermissionDataRule::getCreateTime);
        List<SysPermissionDataRule> dataRules = sysPermissionDataRuleMapper.selectList(query);
        if (dataRules == null || dataRules.size() == 0) {
            throw new CubeAppException("未找到菜单数据权限信息!");
        }
        LoadDataRuleResponse response = new LoadDataRuleResponse();
        LambdaQueryWrapper<SysDepartPermission> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysDepartPermission::getPermissionId, permissionId);
        wrapper.eq(SysDepartPermission::getDepartId, departId);
        SysDepartPermission sysDepartPermission = baseMapper.selectOne(wrapper);
        if (sysDepartPermission == null) {
            throw new CubeAppException("未找到部门菜单信息!");
        } else {
            String drChecked = sysDepartPermission.getDataRuleIds();
            if (StrUtil.isNotEmpty(drChecked)) {
                response.setDrChecked(drChecked.endsWith(",") ? drChecked.substring(0, drChecked.length() - 1) : drChecked);
            }
        }
        response.setDatarule(dataRules);
        return response;
    }
 
    @Override
    @Transactional
    public void saveDataRule(String permissionId, String departId, String dataRuleIds) {
        LambdaQueryWrapper<SysDepartPermission> query = new LambdaQueryWrapper<>();
        query.eq(SysDepartPermission::getPermissionId, permissionId);
        query.eq(SysDepartPermission::getDepartId, departId);
        SysDepartPermission sysDepartPermission = baseMapper.selectOne(query);
        if (sysDepartPermission == null) {
            throw new CubeAppException("请先保存部门菜单权限!");
        }
        sysDepartPermission.setDataRuleIds(dataRuleIds);
        baseMapper.updateById(sysDepartPermission);
    }
 
    @Override
    public TreeListForDeptRoleResponse queryTreeListForDeptRole(String departId) {
        //全部权限ids
        LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<>();
        query.eq(SysPermission::getDelFlag, CommonConst.NOT_DELETED);
        query.orderByAsc(SysPermission::getSortNo);
        query.inSql(SysPermission::getId, "select permission_id from sys_depart_permission where depart_id = '" + departId + "'");
        List<SysPermission> list = sysPermissionMapper.selectList(query);
        List<String> ids = new ArrayList<>();
        for (SysPermission sysPer : list) {
            ids.add(sysPer.getId());
        }
        List<TreeModel> treeList = new ArrayList<>();
        getTreeModelList(treeList, list, null);
        TreeListForDeptRoleResponse response = new TreeListForDeptRoleResponse();
        response.setTreeList(treeList);
        response.setIds(ids);
        return response;
    }
 
    /**
     * 从diff中找出main中没有的元素
     */
    private List<String> getDiff(String main, String diff) {
        if (StrUtil.isEmpty(diff)) {
            return null;
        }
        if (StrUtil.isEmpty(main)) {
            return Arrays.asList(diff.split(","));
        }
        String[] mainArr = main.split(",");
        String[] diffArr = diff.split(",");
        Map<String, Integer> map = new HashMap<>();
        for (String string : mainArr) {
            map.put(string, 1);
        }
        List<String> res = new ArrayList<>();
        for (String key : diffArr) {
            if (StrUtil.isNotEmpty(key) && !map.containsKey(key)) {
                res.add(key);
            }
        }
        return res;
    }
 
    /**
     * 递归所有部门
     *
     * @param treeList 部门数
     * @param metaList 部门信息
     * @param temp     子部门
     */
    private void getTreeModelList(List<TreeModel> treeList, List<SysPermission> metaList, TreeModel temp) {
        for (SysPermission permission : metaList) {
            String tempPid = permission.getParentId();
            TreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(), permission.getRuleFlag(), permission.isLeaf());
            if (temp == null && StrUtil.isEmpty(tempPid)) {
                treeList.add(tree);
                if (!tree.isLeaf()) {
                    getTreeModelList(treeList, metaList, tree);
                }
            } else if (temp != null && tempPid != null && tempPid.equals(temp.getKey())) {
                temp.getChildren().add(tree);
                if (!tree.isLeaf()) {
                    getTreeModelList(treeList, metaList, tree);
                }
            }
        }
    }
}