前言
在企微对接开发中,再做企业组织架构管理的时候,需要根据某个成员 id 查询他所负责的所有部门、子部门以及相对应的成员信息。
一、使用场景
根据成员权限,给于对应的部门、成员。
二、获取步骤
1.查询所有部门
值得注意的是:员工负责的部门可能是多个
// 查找该用户在企微中,设置为部门负责人的部门
$dept = Department::where($where)->select();
// 这里注意员工负责的部门可能是多个
if(count($dept) === 1){
// 只负责一个部门
// 本部门
$dept1 = collection($dept)->toarray(); // 对象转数组
// 子部门
$dept2 = []; // 递归查询子部门
$departments = Department::select();
$deptid = $dept1[0]['id'];
$dept2 = self::getSubdepartments($deptid,$departments);
$alldeptlist = array_merge($dept1,$dept2);
}else{
// 负责多个部门
// 本部门
$dept1 = collection($dept)->toarray(); // 对象转数组
// 子部门
$dept2 = []; // 递归查询子部门
$departments = Department::select(); // 所有部门信息,传参用
foreach ($dept as $val){
// 遍历每个负责部门的id
$deptid = $val->id;
// 递归查询子部门
$getSubdepartments = self::getSubdepartments($deptid,$departments);
if($getSubdepartments){
// 如果找到了子部门,加进去子部门的数组里面去
$dept2[] = $getSubdepartments;
}
}
// 本部门、子部门合并
$alldeptlist = array_merge($dept1,$dept2);
2.查询成员
代码如下(示例):
//划个重点//
// 根据所有部门信息查询成员(如果上面所有部门查不准,所有员工信息自然也不全了)
$allstafflist = [];
foreach ($alldeptlist as $val){
$depts = array_map(function($item){
return $item['id'];
},$alldeptlist);
foreach ($depts as $deptid){
$ygarr = Staff::field('id,name,department,userid as staffid')
->where("FIND_IN_SET({$deptid},department)")
->select();
if($ygarr){
// 这个部门是有员工的
$allstafflist[$deptid] = $ygarr;
}else{
// 这个部门也可能是没有员工的
$allstafflist[$deptid] = [];
}
}
}
返回的数据格式:
3.递归查询
代码如下(示例):
public static function getSubdepartments($departmentId, $departments) {
$output = array();
foreach ($departments as $department) {
if ($department['parent_id'] == $departmentId) {
$output[] = $department;
$subdepartments = self::getSubdepartments($department['id'], $departments);
if (!empty($subdepartments)) {
$output = array_merge($output, $subdepartments);
}
}
}
return $output;
}
参数:1、部门 id;2、所有部门信息;
总结
整体思路还是部门层级关系的数据获取,说简单也不简单,涉及一定逻辑在里面。记录一下。