2024-08-31 01:03:37 +08:00

312 lines
12 KiB
PHP
Executable File

<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
按组织架构对与我协助内容进行归类
1. 子部门: 该部门子部门,下级部门有分享或下级成员有分享时显示
2. 部门成员的个人空间分享; 包含个人空间文件,其他物理路径,外部部门空间分享;
3. 该部门空间协作分享: 该部门空间内容;
----
4. 外部协作分享: 不在自己组织架构下的外部用户的协作分享;
*/
class explorerUserShareGroup extends Controller{
private $model;
private $userGroupRootShow;
private $shareListData;
function __construct(){
parent::__construct();
$this->model = Model('Share');
}
public function get($id){
$this->userGroupRootShow = Action('filter.userGroup')->userGroupRootShow();
$this->shareListData = $this->shareListDataMake();
if(!$id || $id == 'group'){
return $this->listRoot();
}
$userPre = 'group-u';//group-u101-23; userID-parentGroup
$groupPre = 'group-g';//group-g101;
if(substr($id,0,strlen($groupPre)) == $groupPre){
$groupID = substr($id,strlen($groupPre));
return $this->listByGroup($groupID);
}
if(substr($id,0,strlen($userPre)) == $userPre){
$userGroup = explode('-',substr($id,strlen($userPre)));
return $this->listByUser($userGroup[0],$userGroup[1]);
}
}
private function listRoot(){
$rootCount = count($this->userGroupRootShow);
if($rootCount == 0) return false;
$outUserList = $this->listUserOuter();
if($rootCount == 1){
return $this->listRootSingle($this->userGroupRootShow[0],$outUserList);
}
$childrenGroup = Model("Group")->listByID($this->userGroupRootShow);
$childrenGroup = array_sort_by($childrenGroup,'sort',false);
$groupList = array();
foreach($childrenGroup as $groupInfo){
$childList = $this->listByGroup($groupInfo['groupID']);
if(!$childList || (!$childList['groupList'] && !$childList['folderList'])){continue;}
$groupList[] = $this->makeItemGroup($groupInfo);
}
if(!$groupList) return false;
if(count($groupList) == 1){
return $this->listRootSingle($groupList[0]['groupID'],$outUserList);
}
$result = $this->listByGroupType(array('groupList'=>$groupList));
$result['groupList'] = array_merge($result['groupList'],$outUserList);
return $result;
}
private function listRootSingle($groupID,$outUserList){
$result = $this->listByGroup($groupID);
$desc = '['.LNG('admin.setting.shareToMeGroup').'],'.LNG('explorer.pathDesc.shareToMeGroup');
if($result){$result['currentFieldAdd'] = array("pathDesc"=>$desc);}
// 合并外部分享信息数据;
if(!$result['groupList']){$result['groupList'] = array();}
$result['groupList'] = array_merge($result['groupList'],$outUserList);
return $result;
}
// 当前部门有分享内容的子部门, 当前部门分享内容, 当前部门有分享内容的用户;
private function listByGroup($groupID){
$groupID = intval($groupID);
if(!$groupID) return false;
$groupInfoCurrent = Model("Group")->getInfo($groupID);
if(!$groupInfoCurrent) return false;
$listData = $this->shareListData;
$groupArray = array_keys($listData['group']);
$userArray = array_keys($listData['user']);
$goupList = Model("Group")->listByID($groupArray);
$userList = Model("User")->listByID($userArray);
$childrenUser = array();
$childrenGroup = array();
foreach($goupList as $groupInfo){
$groupLevel = $groupInfo['parentLevel'].$groupInfo['groupID'].',';//层级
$childrenID = $this->groupChildrenMake($groupID,$groupLevel);
if($childrenID){$childrenGroup[] = $childrenID;}
}
foreach ($userList as $userInfo){
foreach ($userInfo['groupInfo'] as $groupInfo){
$groupLevel = $groupInfo['parentLevel'].$groupInfo['groupID'].',';//层级
$childrenID = $this->groupChildrenMake($groupID,$groupLevel);
if($childrenID){$childrenGroup[] = $childrenID;}
if($groupInfo['groupID'] == $groupID){$childrenUser[] = $userInfo;}
}
}
$childrenGroup = Model("Group")->listByID(array_unique($childrenGroup));
$childrenGroup = array_sort_by($childrenGroup,'sort',false);
$groupList = array();
foreach($childrenGroup as $groupInfo){$groupList[] = $this->makeItemGroup($groupInfo);}
foreach($childrenUser as $userInfo){$groupList[] = $this->makeItemUser($userInfo,$groupInfoCurrent);}
$result = array('groupList'=>$groupList,'folderList'=>$listData['group'][$groupID]);
$result['currentFieldAdd'] = $this->makeItemGroup($groupInfoCurrent);
$result = $this->listByGroupType($result);
return $result;
}
private function listByGroupType($result){
if(!$result['folderList']){$result['folderList'] = array();}
if(!$result['fileList']){$result['fileList'] = array();}
$result['groupShow'] = array(
array(
'type' => 'childGroup',
'title' => LNG("explorer.pathGroup.shareGroup"),
'desc' => LNG("explorer.pathGroup.shareGroupDesc"),
"filter"=> array('groupID'=>'')
),
array(
'type' => 'childUser',
'title' => LNG("explorer.pathGroup.shareUser"),
'desc' => LNG("explorer.pathGroup.shareUserDesc"),
"filter"=> array('userID'=>'','shareFrom'=>'!=outer')
),
array(
'type' => 'childUserOuter',
'title' => LNG('explorer.pathGroup.shareUserOuter'),
"desc" => LNG("explorer.pathGroup.shareUserOuterDesc"),
"filter"=> array('shareFrom'=>'outer')
),
array(
'type' => 'childContent',
'title' => LNG("explorer.pathGroup.shareContent"),
"filter"=> array('shareID'=>'')
),
);
if(count($result['groupList']) == 0){unset($result['groupShow']);}
// filter 支持多个key-value; 全匹配才算匹配;
// value为*则检测是否有该key; 为字符串则检测相等; value为数组则代表可选值集合
// show_json([$groupID,$groupList,$result]);exit;
return $result;
}
// $groupID是否为$parentLevel的上层部门; 如果是则返回$groupID下一层部门id;
private function groupChildrenMake($groupID,$checkLevel){
$level = explode(',',trim($checkLevel,','));
$level = array_remove_value($level,'0');
$index = array_search($groupID,$level);
if($index === false || $index == count($level) - 1) return false;
return $level[$index + 1];
}
public function groupAllowShow($groupID,$parentLevel=false){
$allow = false;
if(in_array($groupID,$this->userGroupRootShow)) return true;
if(!$parentLevel){
$groupInfo = Model('Group')->getInfo($groupID);
$parentLevel = $groupInfo['parentLevel'].$groupInfo['groupID'].',';
}
foreach($this->userGroupRootShow as $group){
if($this->groupChildrenMake($group,$parentLevel)){$allow = true;break;}
}
return $allow;
}
private function makeItemGroup($groupInfo){
$result = array(
"groupID" => $groupInfo['groupID'],
"name" => $groupInfo["name"],
"type" => "folder",
"path" => "{shareToMe:group-g".$groupInfo['groupID']."}/",
"icon" => "root-groupPath",
"pathDesc" => LNG('explorer.pathDesc.shareToMeGroupGroup'),
);
$parentGroup = Model("Group")->getInfo($groupInfo['parentID']);
return $this->makeAddress($result,$parentGroup);
}
private function makeItemUser($userInfo,$parentGroup=false){
$defaultThumb = STATIC_PATH.'images/common/default-avata.png';
$defaultThumb = 'root-user-avatar';// $userInfo["avatar"] = false;
$parentGroup = $parentGroup ? $parentGroup:array('groupID'=>'0','parentLevel'=>'');
$result = array(
"userID" => $userInfo['userID'],
"name" => $userInfo['nickName'] ? $userInfo['nickName']:$userInfo['name'],
"type" => "folder",
"path" => "{shareToMe:group-u".$userInfo['userID']."-".$parentGroup['groupID']."}/",
"icon" => $userInfo["avatar"] ? $userInfo["avatar"]:$defaultThumb,//fileThumb,icon
"iconClassName" => 'user-avatar',
);
$result['pathDescAdd'][] = array(
"title" => LNG("common.desc"),
"content" => LNG('explorer.pathGroup.shareUserDesc')
);
$userInfo = Model('User')->getInfo($userInfo['userID']);
$groupArr = array_to_keyvalue($userInfo['groupInfo'],'','groupName');
if($groupArr){
$result['pathDescAdd'][] = array("title"=>LNG("admin.member.group"),"content"=>implode(',',$groupArr));
}
return $this->makeAddress($result,$parentGroup);
}
private function makeAddress($itemInfo,$parentGroup){
$address = array(array("name"=> LNG('explorer.toolbar.shareToMe'),"path"=>'{shareToMe}'));
// 从$this->uuserGroupRootShow的某一个,开始到$groupInfo所在部门
$level = $parentGroup ? $parentGroup['parentLevel'].$parentGroup['groupID'].',':'';
$level = explode(',',trim($level,','));
$level = array_remove_value($level,'0');
$fromAdd = count($this->userGroupRootShow) == 1 ? 1: 0;//只有一个根部门,则忽略根部门;
$index = false;
if($level){
foreach($this->userGroupRootShow as $groupID){
$index = array_search($groupID,$level);
if($index !== false){break;}
}
}
if($index !== false){
$nameArray = explode('/',trim($parentGroup['groupPath']));
for ($i=$index+$fromAdd; $i < count($level); $i++) {
$address[] = array("name"=> $nameArray[$i],"path"=>"{shareToMe:group-g".$level[$i]."}/");
}
}
$address[] = array("name"=> $itemInfo["name"],"path"=>$itemInfo['path']);
$itemInfo['pathAddress'] = $address;
return $itemInfo;
}
private function listByUser($userID,$parentGroup){
$userShareList = $this->shareListData['user'][$userID];
if(!$userShareList) return false;
$userInfo = Model('User')->getInfoSimpleOuter($userID);
$result = Action('explorer.userShare')->shareToMeListMake($userShareList);
$groupInfo = Model('Group')->getInfo($parentGroup);
$result['currentFieldAdd'] = $this->makeItemUser($userInfo,$groupInfo);
// unset($result['currentFieldAdd']['icon']);
return $result;
}
// 对内容归类整理: 所属用户,所属部门,
private function shareListDataMake(){
$shareList = $this->model->listToMe(5000);
$sourceArray = array_to_keyvalue($shareList['list'],'','sourceID');
$sourceArray = array_unique($sourceArray);
if($sourceArray){
$where = array('sourceID' => array('in',$sourceArray),'isDelete' => 0,);
$sourceList = Model('Source')->listSource($where);
$sourceArray = array_merge($sourceList['folderList'],$sourceList['fileList']);
$sourceArray = array_to_keyvalue($sourceArray,'sourceID');
}
$userList = array();$groupList = array();
foreach ($shareList['list'] as $shareItem){
$timeout = intval(_get($shareItem,'options.shareToTimeout',0));
if($timeout > 0 && $timeout < time()) continue;// 过期内容;
if($shareItem['sourceID'] == '0'){// 物理路径,io路径;
// $info = IO::info($shareItem['sourcePath']);
$info = $shareItem;//性能优化, 拉取用户内容时才考虑;
}else{
$info = $sourceArray[$shareItem['sourceID']];
}
if(!$info) continue;
$groupNotAllowShare = false;// 部门内容分享,该部门对自己不可见则归类到该用户的分享;
if($info['targetType'] == 'group' && !$this->groupAllowShow($info['targetID'])){
$groupNotAllowShare = true;
}
if($groupNotAllowShare || $shareItem['sourceID'] == '0' || $info['targetType'] == 'user'){// 物理路径,io路径;
$userID = $shareItem['userID'];
if(!isset($userList[$userID])){$userList[$userID] = array();}
$userList[$userID][] = $shareItem;//性能优化;
}else{
$info = Action('explorer.userShare')->_shareItemeParse($info,$shareItem);
if(!$info) continue;
$groupID = $info['targetID'];
if(!isset($groupList[$groupID])){$groupList[$groupID] = array();}
$groupList[$groupID][] = $info;
}
}
return array('user'=>$userList,'group'=>$groupList);
}
// 筛选出外部分享内容; 部门空间内容-部门不在该自己所在组织架构内; 个人空间分享--个人不在自己所在组织架构内;
// 按人进行归类;
private function listUserOuter(){
$userList = array();
foreach($this->shareListData['user'] as $userID=>$userShare){
$userInfo = Model('User')->getInfo($userID);
$userAllow = false;
foreach ($userInfo['groupInfo'] as $groupInfo){
$groupLevel = $groupInfo['parentLevel'].$groupInfo['groupID'].',';//层级
if($this->groupAllowShow($groupInfo['groupID'],$groupLevel)){$userAllow = true;break;}
}
if($userAllow) continue;
$userItem = $this->makeItemUser($userInfo);
$userItem['shareFrom'] = 'outer';
$userList[] = $userItem;
}
return $userList;
}
}