MrShi
2024-11-01 deb4575b72443cf906946a9fb28a557c16556fb9
server/service/src/main/java/com/doumee/service/system/impl/SystemDataPermissionServiceImpl.java
@@ -5,21 +5,29 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.CompanyDepartmentMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyDepartment;
import com.doumee.dao.system.SystemDataPermissionMapper;
import com.doumee.dao.system.SystemRoleMapper;
import com.doumee.dao.system.model.SystemDataPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.vo.SystemDataPermissionListVO;
import com.doumee.service.system.SystemDataPermissionService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 数据权限配置Service实现
@@ -31,6 +39,8 @@
    @Autowired
    private SystemDataPermissionMapper systemDataPermissionMapper;
    @Autowired
    private CompanyDepartmentMapper companyDepartmentMapper;
    @Autowired
    private SystemRoleMapper systemRoleMapper;
@@ -132,4 +142,139 @@
        Wrapper<SystemDataPermission> wrapper = new QueryWrapper<>(systemDataPermission);
        return systemDataPermissionMapper.selectCount(wrapper);
    }
    @Override
    public List<Integer> selectHighRole(SystemDataPermission model, SystemRole role, SystemUser user) {
        List<SystemDataPermissionListVO>list =   systemDataPermissionMapper.selectUserList(model,role,user.getId()) ;
        if(list !=null){
            boolean all = false;
            boolean departAndChild=false;
            boolean depart=false;
            boolean departAndLeaf=false;
            boolean custom=false;
            String c = "";
            for(SystemDataPermissionListVO d : list){
                if(!all && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.all)){
                    all =true;
                }
                if(!depart && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.depart)){
                    depart =true;
                }
                if(!departAndChild && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.departAndChild)){
                    departAndChild =true;
                }
                if(!departAndLeaf && Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.departAndLeaf)){
                    departAndLeaf =true;
                }
                if(  Constants.equalsInteger(d.getType(),Constants.DATAPERMISSION_TYPE.custom)){
                    custom =true;
                    c += StringUtils.defaultString(d.getCustomData(),"");
                }
            }
            CompanyDepartment department = new CompanyDepartment();
            department.setId(user.getDepartmentId());
            department.setType(Constants.THREE);
            if(Constants.equalsInteger(user.getType(),Constants.UserType.COMPANY.getKey())){
                department.setType(Constants.ONE);
            }else if(Constants.equalsInteger(user.getType(),Constants.UserType.ZHUBO.getKey())){
                department.setType(Constants.TWO);
            }else if(Constants.equalsInteger(user.getType(),Constants.UserType.SYSTEM.getKey())){
                department.setType(Constants.THREE);
            }
            if(all){
                return  null;
            }else{
                List<Integer> dList = new ArrayList<>();
                dList.add(-1);//虚拟部门,排查空集合
                if(custom) {
                    //如果有自定义部门
                    String[] idStrs = c.split(",");
                    for(String s :idStrs){
                        try {
                            Integer si = Integer.parseInt(s);
                            if(!isExists(si,dList)){
                                dList.add(si);
                            }
                        }catch (Exception e){
                        }
                    }
                }
                if(departAndLeaf){
                    if(department!= null){
                        dList.addAll(userDataPermissonList(department,true));
                    }
                }else if(departAndChild){
                    if(department!= null) {
                        dList.addAll(userDataPermissonList(department, false));
                    }
                }else if(depart){
                    if(department!= null && !isExists(department.getId(), dList)){
                        dList.add(department.getId());
                    }
                }
                return  dList;
            }
        }
        return new ArrayList<>();
    }
    public List<Integer> userDataPermissonList(CompanyDepartment depart ,boolean isleaf) {
        List<Integer> pool = new ArrayList<>();
        List<CompanyDepartment> departList = companyDepartmentMapper.selectList(new QueryWrapper<CompanyDepartment>().lambda()
                .eq(CompanyDepartment::getIsdeleted,Constants.ZERO )
                .eq(CompanyDepartment::getType,depart.getType())
        );
        pool.add(depart.getId());
        this.fillDepartChildren(pool, Arrays.asList(depart.getId()),isleaf,departList);
        return pool;
    }
    private void fillDepartChildren(List<Integer> pool, List<Integer> asList, boolean isleaf, List<CompanyDepartment> departList) {
        List<CompanyDepartment> departments = getDepartListByParentIds(asList,departList);
        List<Integer> ids = departments.stream().map(CompanyDepartment::getId).collect(Collectors.toList());
        if(isleaf){
            if (ids.size() > 0) {
                pool.addAll(ids);
                this.fillDepartChildren(pool, ids,isleaf,departList);
            }
        }else{
            pool.addAll(ids);
        }
    }
    private List<CompanyDepartment> getDepartListByParentIds(List<Integer> asList, List<CompanyDepartment> departList) {
        List<CompanyDepartment> list = new ArrayList<>();
        if(asList.size()>0){
            for(Integer id : asList){
                list.addAll(getDepartListByParentId(id,departList));
            }
        }
        return list;
    }
    private List<CompanyDepartment> getDepartListByParentId(Integer pId, List<CompanyDepartment> departList) {
        List<CompanyDepartment> list = new ArrayList<>();
        if(departList!= null){
            for(CompanyDepartment d :departList){
                if(Constants.equalsInteger(d.getParentId(),pId)){
                    list.add(d);
                }
            }
        }
        return  list;
    }
    private boolean isExists(Integer s, List<Integer> dList) {
        if(dList!=null){
            for(Integer t : dList){
                if(Constants.equalsInteger(s,t)){
                    return true;
                }
            }
        }
        return false;
    }
}