Helius
2021-06-16 5728be2af515b2200e782aa201ca5d4d67d9ea47
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
package com.ibeetl.admin.console.service;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import com.ibeetl.admin.console.model.MoneyModel;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import com.ibeetl.admin.console.dao.FunctionConsoleDao;
import com.ibeetl.admin.console.dao.RoleFunctionConsoleDao;
import com.ibeetl.admin.console.web.dto.RoleDataAccessFunction;
import com.ibeetl.admin.core.dao.CoreMenuDao;
import com.ibeetl.admin.core.dao.CoreRoleMenuDao;
import com.ibeetl.admin.core.entity.CoreFunction;
import com.ibeetl.admin.core.entity.CoreMenu;
import com.ibeetl.admin.core.entity.CoreRoleFunction;
import com.ibeetl.admin.core.entity.CoreRoleMenu;
import com.ibeetl.admin.core.rbac.tree.FunctionItem;
import com.ibeetl.admin.core.service.CoreBaseService;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.util.PlatformException;
/**
 * @author lijiazhi
 *
 */
@Service
@Transactional
public class FunctionConsoleService  extends CoreBaseService<CoreFunction> {
    
    @Autowired
    FunctionConsoleDao functionDao;
    @Autowired
    CoreMenuDao menuDao;    
    @Autowired
    RoleFunctionConsoleDao roleFunctionConsoleDao;    
    @Autowired
    CoreRoleMenuDao sysRoleMenuDao;    
    @Autowired
    CorePlatformService platformService;
 
 
    
    public void queryByCondtion(PageQuery<CoreFunction> query) {
        functionDao.queryByCondtion(query);
        List<CoreFunction> list = query.getList();
        this.queryListAfter(list);
        //处理父功能名称显示
        FunctionItem root = platformService.buildFunction();
        for(CoreFunction function:list) {
            Long parentId = function.getParentId();
            String name = "";
            if(parentId != 0) {
                FunctionItem item = root.findChild(parentId);
                name = item!=null?item.getName():"";
            }
            function.set("parentFunctionText", name);
        }
        
    }
    
    
    public Long saveFunction(CoreFunction function){
        
        functionDao.insert(function,true);
        platformService.clearFunctionCache();
        return  function.getId();
    }
    
    
    
    /** 删除功能点,跟菜单有关联的无法删除,删除功能点导致所有缓存都需要更新
     * @param functionId
     * @return
     */
    public void deleteFunction(Long functionId){
        deleteFunctionId(functionId);
        platformService.clearFunctionCache();
        
    }
    
    
    public void batchDeleteFunction(List<Long> functionIds){
        for(Long id:functionIds){
            deleteFunctionId(id);
        }
        platformService.clearFunctionCache();
    }
    
    
    
    public void updateFunction(CoreFunction function){
        functionDao.updateById(function);
        platformService.clearFunctionCache();
    }
    
    public CoreFunction getFunction(Long functionId){
        return functionDao.unique(functionId);
    }
    
    public CoreFunction getFunction(String code){
        CoreFunction query = new CoreFunction();
        query.setCode(code);
        CoreFunction db = functionDao.templateOne(query);
        return db;
    }
    
    /**
     * 得到角色对应的所有功能点
     * @param roleId
     * @return
     */
    public List<Long> getFunctionByRole(Long roleId){
        return this.roleFunctionConsoleDao.getFunctionIdByRole(roleId);
    }
    
    /**
     * 得到角色对应的所有数据权限功能点
     * @param roleId
     * @return
     */
    public List<RoleDataAccessFunction> getQueryFunctionByRole(Long roleId){
        return this.roleFunctionConsoleDao.getQueryFunctionAndRoleData(roleId);
    }
    /**
     * 更新角色对应的功能点所有,
     * @param roleId
     * @param data,必须包含id,和 dataAcerssType,采用模板更新
     */
    public void updateFunctionAccessByRole(List<RoleDataAccessFunction> data ){
        for(RoleDataAccessFunction fun:data){
            Long roleId = fun.getRoleId();
            Long functionId = fun.getId();
            int accessType= fun.getDataAccessType();
            
            CoreRoleFunction template = new CoreRoleFunction();
            template.setRoleId(roleId);
            template.setFunctionId(functionId);
            CoreRoleFunction ret = roleFunctionConsoleDao.templateOne(template);
            if(ret!=null) {
                ret.setDataAccessType(accessType);
                roleFunctionConsoleDao.updateById(ret);
            }else {
                template.setDataAccessType(accessType);
                template.setCreateTime(new Date());
                roleFunctionConsoleDao.insert(template);
            }
            
        }
    }
    
    
    /** 给角色赋予功能同时,根据赋予的功能权限,更新能访问的菜单
     * @param adds
     * @param updates
     * @param dels
     * @return  返回增加的项的id,用于前端
     */
    public void updateSysRoleFunction(Long roleId,List<Long> adds,List<Long> dels){
        for(Long del:dels){
            //获得功能关联的菜单
            /*CoreRoleFunction temp = new CoreRoleFunction();
            temp.setRoleId(roleId);
            temp.setFunctionId(del);
            CoreRoleFunction roleFunction = roleFunctionConsoleDao.templateOne(temp);
            if(roleFunction==null){
                throw new PlatformException("已经被删除了RoleId="+roleId+" functionId="+del);
            }
            CoreMenu menu = queryFunctionMenu(roleFunction.getFunctionId());
            roleFunctionConsoleDao.deleteById(roleFunction.getId());*/
                //同时,需要删除与此功能关联的菜单
                CoreRoleMenu sysRoleMenu = querySysRoleMenu(roleId,del);
                if(sysRoleMenu!=null){
                    sysRoleMenuDao.deleteById(sysRoleMenu.getId());
                }
                
 
        }
 
 
        List<CoreRoleMenu> sysRoleMenuList = querySysRoleMenuList(roleId);
        for (CoreRoleMenu menu:sysRoleMenuList) {
            sysRoleMenuDao.deleteById(menu.getId());
        }
        for(Long add:adds){
            /*CoreRoleFunction function = new CoreRoleFunction();
            function.setCreateTime(new Date());
            function.setRoleId(roleId);
            function.setFunctionId(add);
            this.sqlManager.insert(function);*/
            /*CoreMenu menu = queryFunctionMenu(add);*/
            /*if(menu!=null){*/
                //同时,需要增加菜单
                CoreRoleMenu roleMenu = new CoreRoleMenu();
                roleMenu.setMenuId(add);
                roleMenu.setRoleId(roleId);
                sysRoleMenuDao.insert(roleMenu);
            }
        //}
        
        //清楚缓存
        platformService.clearFunctionCache();
            
    }
    
    
    private CoreMenu queryFunctionMenu(Long functionId){
        CoreMenu query = new CoreMenu();
        query.setFunctionId(functionId);
        List<CoreMenu> menus = menuDao.template(query);
        return menus.isEmpty()?null:menus.get(0);
    }
 
    
    private CoreRoleMenu querySysRoleMenu(Long roleId,Long menuId){
        CoreRoleMenu query= new CoreRoleMenu();
        query.setMenuId(menuId);
        query.setRoleId(roleId);        
        List<CoreRoleMenu> menus = sysRoleMenuDao.template(query);
        return menus.isEmpty()?null:menus.get(0);
    }
 
    private List<CoreRoleMenu> querySysRoleMenuList(Long roleId){
        CoreRoleMenu query= new CoreRoleMenu();
        query.setRoleId(roleId);
        List<CoreRoleMenu> menus = sysRoleMenuDao.template(query);
        return menus;
    }
    
    
    /**
     * 删除某一个功能点及其子功能,对应的role-function 需要删除,菜单对应的function需要设置成空
     * @param functionId
     */
    private void deleteFunctionId(Long functionId){
        FunctionItem root = platformService.buildFunction();
        FunctionItem fun = root.findChild(functionId);
        List<FunctionItem> all = fun.findAllItem();
        //也删除自身
        all.add(fun);
        realDeleteFunction(all);
    }
    
    private void realDeleteFunction(List<FunctionItem> all){
        List<Long> ids = new ArrayList<>(all.size());
        for(FunctionItem item:all){
            ids.add(item.getId());
            this.functionDao.deleteById(item.getId());
        }
        //删除角色和功能的关系
        this.roleFunctionConsoleDao.deleteRoleFunction(ids);
        //设置菜单对应的功能项为空
        menuDao.clearMenuFunction(ids);
            
    }
 
    public List<Long> getFunctionByRoleMenu(Long roleId){
        return roleFunctionConsoleDao.getFunctionByRoleMenu(roleId);
    }
 
    public int updateMoney(MoneyModel moneyModel){
        return functionDao.updateMoney(moneyModel);
    }
    
    
}