Files
Pichome/core/class/table/table_organization.php
2022-05-02 22:31:35 +08:00

1148 lines
46 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
if (!defined('IN_OAOOA')) {
exit('Access Denied');
}
class table_organization extends dzz_table
{
private $_uids = array();
public function __construct()
{
$this->_table = 'organization';
$this->_pk = 'orgid';
$this->_pre_cache_key = 'organization_';
$this->_cache_ttl = 0;
parent::__construct();
}
/*获取所有下级部门
$count: >0 仅返回数量
$type: -1:全部部门或群组1仅群组0;仅机构或部门
$forgid: 上级orgid当$forgid=0时获取所有一级
*/
public function fetch_all_by_forgid($forgid, $count = 0, $type = 0)
{
if ($count) $sql = 'SELECT COUNT(*) FROM %t WHERE forgid= %d';
else $sql = 'SELECT * FROM %t WHERE forgid= %d';
$param = array($this->_table, $forgid);
if ($type > -1) {
$sql .= ' and `type`=%d';
$param[] = $type;
}
if ($count) return DB::result_first($sql, $param);
return DB::fetch_all($sql . ' ORDER BY disp', $param, 'orgid');
}
/*
获取用户参与的部门或群组信息
$uid: 参与人,为空时为当前用户
$type: -1:全部部门或群组1仅群组0;仅机构或部门
return array();
*/
public function fetch_all_by_uid($uid,$type=-1){
if(empty($uid)) $uid=getglobal('uid');
if(!$uid) return array();
if($orgids=C::t('organization_user')->fetch_orgids_by_uid($uid,$type)){
parent::fetch_all($orgids);
}
return array();
}
//插入数据
public function insert($arr){
if($orgid=parent::insert($arr,1)){
if(intval($arr['aid'])){//如果有头像图片增加copys
C::t('attachment')->add_by_aid(intval($arr['aid']));
}
}
return $orgid;
}
//查询机构群组信息
public function fetch_all_orggroup($uid,$getmember = true)
{
global $_G;
$groups = array();
if($_G['adminid'] == 1){
$orgids = DB::fetch_all("select orgid from %t where `type`=%d and forgid = %d",array($this->_table,0,0));
foreach($orgids as $v){
$groups['org'][]= parent::fetch($v['orgid']);
}
}else{
if ($uid) {
$orgids = C::t('organization_user')->fetch_org_by_uid($uid);
$orgids = array_unique($orgids);
$toporgids = array();
foreach (parent::fetch_all($orgids) as $v) {
if ($v['type'] == 0) {
$patharr = explode('-', $v['pathkey']);
$toporgid = intval(str_replace('_', '', $patharr[0]));
if (in_array($toporgid, $toporgids)) {
continue;
}
$orginfo=parent::fetch($toporgid);
if (C::t('organization_admin')->chk_memberperm($toporgid, $uid) > 0) {
if($orginfo['syatemon'] == 1){
if($getmember){
$orginfo['usernum'] = C::t('organization_user')->fetch_num_by_toporgid($toporgid);
$orginfo['adminer'] = C::t('organization_admin')->fetch_adminer_by_orgid($toporgid);
}
$groups['org'][] = $orginfo;
}
//$orginfo = DB::fetch_first("select * from %t where `orgid` = %d and syatemon = %d ORDER BY disp", array($this->_table, $toporgid, 1));
} else {
if ($orginfo['syatemon'] == 1 && $orginfo['manageon'] == 1 && $orginfo['diron'] == 1) {
if($getmember){
$orginfo['usernum'] = C::t('organization_user')->fetch_num_by_toporgid($toporgid);
$orginfo['adminer'] = C::t('organization_admin')->fetch_adminer_by_orgid($toporgid);
}
$groups['org'][] = $orginfo;
}
}
$toporgids[] = $toporgid;
}
}
}
}
return $groups;
}
public function fetch_group_by_uid($uid, $foreces = false,$type = 1)
{//查询自定义群组,$foreces=true为jstree加载内容进行群组开启判断
global $_G;
if (!$uid) return false;
$groups = array();
$orgids = C::t('organization_user')->fetch_orgids_by_uid($uid,1);
foreach (DB::fetch_all("select * from %t where `orgid` IN(%n) and forgid='0' and `type`=%d order by disp", array($this->_table, $orgids,$type)) as $orginfo) {
if ($foreces) {
if ($orginfo['syatemon'] == 0) {//系统管理员关闭群组
continue;
//如果是普通成员判断群组是否关闭暂时用diron来进行判断
} elseif ($orginfo['diron'] == 0 && C::t('organization_admin')->chk_memberperm($orginfo['orgid'], $uid) == 0) {//管理员关闭群组,当前用户不具备管理员权限
continue;
}
}
//jstree加载不需获取成员数和创建者
if(!$foreces){
$orginfo['usernum'] = C::t('organization_user')->fetch_usernums_by_orgid($orginfo['orgid']);
$orginfo['creater'] = C::t('organization_admin')->fetch_group_creater($orginfo['orgid']);
}
if ($orginfo['aid'] > 0) {
//群组图
$orginfo['imgs'] = 'index.php?mod=io&op=thumbnail&width=24&height=24&path=' . dzzencode('attach::' . $orginfo['aid']);
}
/* $contaions = C::t('resources')->get_contains_by_fid($orginfo['fid'],true);
$orginfo['ffsize'] = lang('property_info_size', array('fsize' => formatsize($contaions['size']), 'size' => $contaions['size']));
$orginfo['contain'] = lang('property_info_contain', array('filenum' => $contaions['contain'][0], 'foldernum' => $contaions['contain'][1]));*/
$groups[] = $orginfo;
}
return $groups;
}
public function delete_by_orgid($orgid,$force=false)
{
if (!$org = parent::fetch($orgid)) {
return array('error' => lang('remove_error_object_inexistence'));
}
if(!$force){
if (self::fetch_all_by_forgid($org['orgid'], true,-1) || ($org['fid'] && DB::result_first("select count(*) from %t where pfid = %d and isdelete < 1", array('resources', $org['fid'])))) {
return array('error' => lang('remove_error_check_the_content'));
}
}
if (parent::delete($orgid)) {
//删除对应事件
C::t('resources_event')->delete_by_gid($orgid);
//删除对应用户
C::t('organization_user')->delete_by_orgid($orgid);
//删除对应管理员
C::t('organization_admin')->delete_by_orgid($orgid);
//删除对应目录
/* if ($org['fid']) {
if($rid=C::t('resources')->fetch_rid_by_fid($org['fid'])){
C::t('resources')->delete_by_rid($rid,true);
}else{
C::t('folder')->delete_by_fid($org['fid'],true);
}
}*/
//清空对应的回收站
C::t('resources_recyle')->delete_by_gid($orgid);
if (intval($org['aid']) >0) {
C::t('attachment')->addcopy_by_aid($org['aid'], -1);
}
if( $org["type"]==0){//部门才同步
self::syn_organization($org['orgid'],'delete');
}
return $org;
} else {
return array('error' => lang('delete_error'));
}
}
//判断用户是否是该部门或机构下级成员
public function ismember($orgid,$uid=0,$onlychild = false)
{
if(!$org=parent::fetch($orgid)) return false;
//公共类群组判断是否有用户设置,无用户则视为成员,有则查询是否为成员
if($org['type']==2 && !DB::result_first("select count(*) from %t where orgid = %d",array('organization_user',$orgid))){
return true;
}
if(!$uid) $uid=getglobal('uid');
$pathkey = $org['pathkey'];
$orgids = array();
if($onlychild){
$pathkey = $pathkey . '-%';
}else{
$pathkey = $pathkey . '%';
}
foreach (DB::fetch_all("select orgid from %t where pathkey LIKE %s", array($this->_table, $pathkey)) as $v) {
$orgids[] = $v['orgid'];
}
if (DB::result_first("select count(*) from %t where orgid in (%n) and uid = %d ", array('organization_user', $orgids, $uid)) > 0) {
return true;
}
if($myorgids=C::t('organization_user')->fetch_orgids_by_uid($uid)){
if($gids=C::t('organization')->fetch_parent_by_orgid($myorgids)){
if(DB::result_first("select id from %t where orgid in (%n) and guid IN(%n)",array('organization_guser',$orgids,$gids)) > 0){
return true;
}
}
}else{//无机构人员
if(DB::result_first("select id from %t where orgid in (%n) and guid ='0'",array('organization_guser',$orgids)) > 0){
return true;
}
}
return false;
}
//获取机构部门下级
public function fetch_org_by_uidorgid($uid, $orgid,$orgtype='0')
{
$resultarr = array();
//如果该用户是当前部门普通成员则不获取下级机构信息,如果是下级机构成员或当前机构管理员则获取下级部门信息
if (C::t('organization_admin')->chk_memberperm($orgid, $uid)) {//如果是管理员
$resultarr = array();
foreach(self::fetch_all_by_forgid($orgid,0,$orgtype) as $value){
if(!$value['diron']) continue;
$resultarr[]=$value;
}
} elseif ($this->ismember($orgid,$uid,true)) {//如果是当前机构或部门下级的成员
$orgids = C::t('organization_user')->fetch_orgids_by_uid($uid,$orgtype);
$pathkeyarr = DB::fetch_all("select pathkey from %t where orgid in (%n) ", array($this->_table, $orgids));
$porgids = array();
foreach ($pathkeyarr as $v) {
$vs = str_replace('_', '', $v['pathkey']);
$varr = explode('-', $vs);
$porgids = array_merge($porgids,$varr);
}
$orgsarr = self::fetch_all_by_forgid($orgid,0,$orgtype);
$orgidarr = array();
foreach ($orgsarr as $v) {
if (!in_array($v['orgid'], $orgidarr) && in_array($v['orgid'], $porgids)) {
if (C::t('organization_admin')->chk_memberperm($v['orgid'], $uid) > 0 && $v['syatemon'] == 1 ) {
$resultarr[] = $v;
} elseif ($v['syatemon'] && $v['manageon'] && $v['diron']) {
$resultarr[] = $v;
}
$orgidarr[] = $v['orgid'];
}
}
}
//print_r($resultarr);
return $resultarr;
}
//获取包含当前机构或部门包含下级的orgid
public function get_all_contaionchild_orgid($orgid, $uid)
{
$orgids = array();
if (!$org = self::fetch($orgid)) {
return $orgids;
}
if ($org['type'] == 1) {
$orgids[] = $orgid;
return $orgids;
}
if (C::t('organization_admin')->chk_memberperm($orgid, $uid)) {//如果是管理员
$orgids = self::get_childorg_by_orgid($orgid);
} elseif ($this->ismember($uid, $orgid,true)) {//如果不是管理员,判断是否是下级成员
$orgidarrs = array();
//获取当前用户所在的所有群组id
foreach (DB::fetch_all("select o.orgid,o.pathkey,o.manageon,o.diron from %t u left join %t o on o.orgid = u.orgid where u.uid = %d and o.type = 0", array('organization_user', 'organization', $uid)) as $v) {
$pathkey = $v['pathkey'];
$orgidarr = explode('-', str_replace('_', '', $pathkey));
if (in_array($orgid, $orgidarr)) {
foreach ($orgidarr as $v) {
$orgidarrs[] = $v;
}
}
}
$orgids = array_unique($orgidarrs);
}
return $orgids;
}
//获取当前部门或机构的下级
public function get_childorg_by_orgid($orgid)
{
$orgidarr = array();
if (!$orgid) return $orgidarr;
$pathkey = DB::result_first("select pathkey from %t where orgid = %d", array($this->_table, $orgid));
$orgids = DB::fetch_all("select orgid from %t where pathkey LIKE %s ", array($this->_table, $pathkey . '%'));
foreach ($orgids as $v) {
$orgidarr[] = $v['orgid'];
}
return $orgidarr;
}
//获取机构群组的上级id
public function fetch_parent_by_orgid($orgids,$onlyid=true)
{
if(!is_array($orgids)) $orgids=array($orgids);
$ret=array();
foreach(DB::fetch_all("select pathkey from %t where orgid IN(%n)", array($this->_table, $orgids)) as $value){
$path = str_replace('_', '', $value['pathkey']);
$patharr = explode('-', $path);
if($patharr) $ret=array_merge($ret,$patharr);
}
if($onlyid){
return $ret;
}else{
return parent::fetch_all($ret);
}
}
//将available修改为diron,后期将调整
public function setFolderAvailableByOrgid($orgid, $available=0)
{
if (!$org = parent::fetch($orgid)) return false;
if ($available > 0 && $org['forgid'] > 0) {//上级没有开启目录共享,下级无法开启
$parent = parent::fetch($org['forgid']);
if ($parent['diron'] < 1) return false;
}
if (parent::update($orgid, array('diron' => $available))) {
//self::setFolderByOrgid($orgid);
//include_once libfile('function/cache');
//updatecache('organization');
return true;
}
return false;
}
//暂时将syatemon调整为manageon
public function setgroupByOrgid($orgid, $groupon=0)
{
if (!$org = parent::fetch($orgid)) return false;
/*if ($groupon > 0 && $org['forgid'] > 0) {
$toporgid = self::getTopOrgid($orgid);
$top = parent::fetch($toporgid);
if ($top['manageon'] < 1) return false;
}*/
if (parent::update($orgid, array('manageon' => $groupon))) {
return true;
}
return false;
}
public function setIndeskByOrgid($orgid, $indesk)
{
if (!$org = parent::fetch($orgid)) return false;
if ($indesk > 0) {
if ($org['available'] < 1) return false;
}
if (parent::update($orgid, array('indesk' => $indesk))) {
/*include_once libfile('function/cache');
updatecache('organization');*/
return true;
}
return false;
}
public function setFolderByOrgid($orgid,$flag='organization')
{
return true;
$flag=($flag) ? $flag:'organization';
if (!$org = parent::fetch($orgid)) return false;
if ($org['forgid'] == 0) {
$pfid = 0;
} else {
$pfid = DB::result_first("select fid from " . DB::table($this->_table) . " where orgid='{$org['forgid']}'");
}
if ($fid = DB::result_first("select fid from " . DB::table('folder') . " where gid='{$orgid}' and flag='{$flag}'")) {
if(C::t('folder')->rename_by_fid($fid,$org['orgname'])){
self::update($orgid, array('fid' => $fid));
}
} else {
$perm=0;
if($flag=='organization'){
$perm=perm_binPerm::getGroupPower('read');
}
$params=array(
'flag'=>$flag,
'innav' => $org['available'],
'display' => $org['disp'],
'gid' => $orgid,
);
$ret=IO::CreateFolder($pfid, $org['orgname'], $perm, $params,'newcopy',true);
$fid=$ret['folderarr']['fid'];
}
if ($fid) {
self::update($orgid, array('fid' => $fid));
return $fid;
}
return false;
}
public function setDispByOrgid($orgid, $disp, $forgid = 0)
{
if (!$org = parent::fetch($orgid)) return false;
if ($torg = DB::fetch_first("select disp,orgid from %t where forgid=%d and orgid!=%d order by disp limit %d,1", array($this->_table, $forgid, $orgid, $disp))) {
$disp = $torg['disp'];
foreach (DB::fetch_all("select orgid,disp from %t where disp>%d and forgid=%d", array($this->_table, $disp, $forgid)) as $value) {
parent::update($value['orgid'],array('disp'=>$value['disp']+1));
//self::wx_update($value['orgid']);
}
} else {
$disp = DB::result_first("select max(disp) from %t where forgid=%d", array($this->_table, $forgid)) + 1;
}
if ($return = parent::update($orgid, array('disp' => $disp, 'forgid' => $forgid))) {
if ($org['forgid'] != $forgid) {
//检查重名
$orgname = self::get_uniqueName_by_forgid($forgid, $org['orgname'], $org['orgid']);
if ($orgname != $org['orgname']) {//有重名
self::update_by_orgid($org['orgid'], array('orgname' => $orgname));
}
//重新设置所有下级机构的共享目录
/* if ($pathkey = self::setPathkeyByOrgid($orgid)) {
$like = $pathkey.'%';
foreach (DB::fetch_all("select orgid from %t where pathkey LIKE %s", array($this->_table, $like)) as $value) {
self::setFolderByOrgid($value['orgid']);
}
}*/
}
if ($disp > 10000) {
foreach (DB::fetch_all("select orgid ,disp from %t where forgid=%d", array($this->_table, $forgid)) as $value) {
parent::update($value['orgid'],array('disp'=>$value['disp']-9000));
}
}
return $return;
} else {
return false;
}
}
public function getDispByOrgid($borgid)
{
$data = parent::fetch($borgid);
$disp = $data['disp'] + 1;
// DB::query("update %t SET disp=disp+1 where disp>=%d and forgid=%d", array($this->_table, $disp, $data['forgid']));
return $disp;
}
public function chk_by_orgname($orgname,$type = 0,$forgid=0)
{
if (DB::result_first("select count(*) from %t where orgname = %s and `type` = %d and forgid = %d", array($this->_table, $orgname,$type,$forgid)) > 0) {
return false;
}
return true;
}
public function insert_by_orgid($setarr, $synwx = 1,$flag='')
{
$setarr['orgname'] = self::get_uniqueName_by_forgid($setarr['forgid'], $setarr['orgname']);
if ($setarr['orgid'] = parent::insert($setarr, true)) {
//self::setFolderByOrgid($org['orgid']);
//include_once libfile('function/cache');
//updatecache('organization');
$uid = getglobal('uid');
$username = getglobal('username');
//$fid = self::setFolderByOrgid($setarr['orgid'],$flag);//添加对应群组目录,默认未启用
//添加自定义群组时,添加对应创始人
if ($setarr['type'] == 1) {
C::t('organization_user')->insert_by_orgid($setarr['orgid'],$uid);
C::t('organization_admin')->insert($uid, $setarr['orgid'], 2);
}
//添加对应动态
//$eventdata = array('groupname' => $setarr['orgname'], 'uid' => getglobal('uid'), 'username' => getglobal('username'));
// C::t('resources_event')->addevent_by_pfid($fid, 'create_group', 'create', $eventdata, $setarr['orgid']);
self::setPathkeyByOrgid($setarr['orgid']);
return $setarr['orgid'];
}
return false;
}
public function insert_by_forgid($setarr, $borgid)
{
if ($borgid) {
$setarr['disp'] = self::getDispByOrgid($borgid);
}
$setarr['orgname'] = self::get_uniqueName_by_forgid($setarr['forgid'], $setarr['orgname']);
if ($setarr['orgid'] = parent::insert($setarr, true)) {
//self::setFolderByOrgid($setarr['orgid']);
//include_once libfile('function/cache');
//updatecache('organization');
if (isset($setarr['type']) && $setarr['type'] != 0) {
$uid = getglobal('uid');
C::t('organization_admin')->insert($uid, $setarr['orgid'], 1);
}
self::setPathkeyByOrgid($setarr['orgid']);
if(isset($setarr['type']) && $setarr['type'] == 0 ) self::syn_organization($setarr['orgid']);
return $setarr;
}
return false;
}
public function syn_organization( $data=array(),$type="update" ){
if( $type=="update"){
Hook::listen('syntoline_department',$data);//注册绑定到三方部门表
}else if( $type=="delete"){
Hook::listen('syntoline_department',$data,"del");//删除对应到三方部门表
}
}
public function update_by_orgid($orgid, $setarr, $synwx = 1)
{
if (!$org = self::fetch($orgid)) return false;
if (isset($setarr['orgname'])) {
$fid = $org['fid'];
$name = self::get_uniqueName_by_forgid($org['forgid'], getstr($setarr['orgname']), $orgid);
/*if (C::t('folder')->rename_by_fid($fid, $name)) {
if (parent::update($orgid, array('orgname' => $name))) {
$body_data = array('username' => getglobal('username'), 'oldname' => $org['orgname'], 'newname' => $name);
$event_body = 'update_group_name';
C::t('resources_event')->addevent_by_pfid($org['fid'], $event_body, 'update_groupname', $body_data, $orgid, '', $org['orgname']);//记录事件
if( $synwx && $org['type']==0) self::syn_organization($orgid);
}
unset($setarr['orgname']);
}*/
}
if (isset($setarr['perm']) && $setarr['perm']) {
$fid = $org['fid'];
C::t('folder')->update($fid, array('perm' => $setarr['perm']));
unset($setarr['perm']);
}
if (isset($setarr['desc'])) {
$setarr['desc'] = htmlspecialchars($setarr['desc']);
}
if (empty($setarr)) return true;
if (parent::update($orgid, $setarr)) {
//处理图标copys数
if(isset($setarr['aid'])){
$oaid=intval($org['aid']);
$aid=intval($setarr['aid']);
if($oaid){
C::t('attachment')->addcopy_by_aid($oaid,-1);
}
if($aid){
C::t('attachment')->addcopy_by_aid($aid);
}
}
$org = array_merge($org, $setarr);
if(empty($org['fid'])) self::setFolderByOrgid($org['orgid']);
$body_data = array('username' => getglobal('username'));
$event_body = 'update_group_setting';
C::t('resources_event')->addevent_by_pfid($org['fid'], $event_body, 'update_setting', $body_data, $orgid, '', $org['orgname']);//记录事件
self::setPathkeyByOrgid($orgid);
if( $synwx && $org['type']==0 ) self::syn_organization($orgid);
return true;
}
return true;
}
public function getTopOrgid($orgid)
{
include_once libfile('function/organization');
$ids = self::fetch_parent_by_orgid($orgid);
return $ids[0];
}
public function getUpOrgidTree($orgid,$pids=array()){
global $_G;
if($org=C::t('organization')->fetch($orgid)){
//$pids[]=$orgid;
array_unshift($pids,$orgid);
$pids=self::getUpOrgidTree($org['forgid'],$pids);
}
return ($pids);
}
public function setPathkeyByOrgid($orgid, $force = 0)
{ //设置此机构的pathkey的值$force>0 重设此部门的pathkey
@set_time_limit(0);
if (!$org = parent::fetch($orgid)) return false;
if ($force || empty($org['pathkey'])) {//没有pathkey,
// include_once libfile('function/organization');
if($ids=self::getUpOrgidTree($org['orgid'])){
$pathkey='_'.implode('_-_',$ids).'_';
if( parent::update($org['orgid'],array('pathkey'=>$pathkey))) return $pathkey;
}
return false;
}
//设置所有子部门的pathkey
if ($org['forgid'] && ($porg = parent::fetch($org['forgid']))) {
$npathkey = $porg['pathkey'] . '-' . '_' . $orgid . '_';
} else {
$npathkey = '_' . $orgid . '_';
}
if ($org['pathkey'] == $npathkey) return $npathkey; //没有改变;
$like = $org['pathkey'].'%';
foreach(DB::fetch_all("select orgid,pathkey from %t where pathkey LIKE %s", array($this->_table, $like)) as $value){
parent::update($value['orgid'],array('pathkey'=>str_replace($org['pathkey'],$npathkey,$value['pathkey'])));
}
/*if (DB::query("update %t set pathkey=REPLACE(pathkey,%s,%s) where pathkey REGEXP %s", array($this->_table, $org['pathkey'], $npathkey, $like))) {
return $npathkey;
}*/
}
public function wx_update($orgid)
{
global $_G;
if (!$this->_wxbind) return;
if (!$org = parent::fetch($orgid)) return false;
if ($org['type'] > 0) {//群主类型不同步至微信
return false;
}
$wx = new qyWechat(array('appid' => $_G['setting']['CorpID'], 'appsecret' => $_G['setting']['CorpSecret'], 'agentid' => 0));
$wd = array();
if ($wxdepart = $wx->getDepartment()) {
foreach ($wxdepart['department'] as $value) {
$wd[$value['id']] = $value;
}
} else {
return false;
}
if ($org['forgid']) {
if (($forg = parent::fetch($org['forgid'])) && !$forg['worgid']) {
if ($worgid = self::wx_update($forg['orgid'])) {
$forg['worgid'] = $worgid;
} else {
return;
}
}
}
$parentid = ($org['forgid'] == 0 ? 1 : $forg['worgid']);
if ($org['worgid'] && $wd[$org['worgid']] && $parentid == $wd[$org['worgid']]['parentid']) {//更新机构信息
$data = array("id" => $org['worgid']);
if ($wd[$org['worgid']]['name'] != $org['orgname']) $data['name'] = $org['orgname'];
if ($wd[$org['worgid']]['parentid'] != $parentid) $data['parentid'] = $parentid;
if ($wd[$org['worgid']]['order'] != $org['order']) $data['order'] = $org['order'];
if ($data) $data['id'] = $org['worgid'];
if ($data) {
if (!$wx->updateDepartment($data)) {
$message = 'updateDepartmenterrCode:' . $wx->errCode . ';errMsg:' . $wx->errMsg;
runlog('wxlog', $message);
return false;
}
}
return $org['worgid'];
} else {
$data = array(
"name" => $org['orgname'], //部门名称
"parentid" => $org['forgid'] == 0 ? 1 : $forg['worgid'], //父部门id
"order" => $org['disp'] + 1, //(非必须)在父部门中的次序。从1开始数字越大排序越靠后
);
if ($ret = $wx->createDepartment($data)) {
parent::update($orgid, array('worgid' => $ret['id']));
return $ret['id'];
} else {
if ($wx->errCode == '60008') {//部门的worgid不正确导致的问题
foreach ($wd as $value) {
if ($value['name'] == $data['name'] && $value['parentid'] = $data['parentid']) {
C::t('organization')->update($org['orgid'], array('worgid' => $value['id']));
return $value['id'];
}
}
}
$message = 'createDepartmenterrCode:' . $wx->errCode . ';errMsg:' . $wx->errMsg;
runlog('wxlog', $message);
return false;
}
}
return false;
}
public function getPathByOrgid($orgid,$space='-')
{
$ret = array();
if ($org = parent::fetch($orgid)) {
$ids = explode('-', str_replace('_', '', $org['pathkey']));
$arr = parent::fetch_all($ids);
foreach ($ids as $id) {
if ($arr[$id]) $ret[] = $arr[$id]['orgname'];
}
}
if($space) $ret=implode($space,$ret);
return $ret;
}
//获取用户有权限的orgids;
public function fetch_orgids_by_uid($uid=0){
if(!$uid) $uid=getglobal('uid');
$orgids=array();
foreach(DB::fetch_all("select orgid from %t where uid = %d", array('organization_user', $uid)) as $value){
$orgids[$value['orgid']]=$value['orgid'];
}
if($orgids){
if($gids=C::t('organization')->fetch_parent_by_orgid($orgids)){
foreach(DB::fetch_all("select orgid from %t where guid IN(%n)",array('organization_guser',$gids)) as $value){
$orgids[$value['orgid']]=$value['orgid'];
}
}
}else{//无机构用户
foreach(DB::fetch_all("select orgid from %t where guid ='0'",array('organization_guser')) as $value){
$orgids[$value['orgid']]=$value['orgid'];
}
}
return $orgids;
}
//获取用户有权限的机构orgid
public function fetch_all_orgid($type = 2)
{
global $_G;
$uid = $_G['uid'];
//获取当前用户参与的机构和群组
$orgids = array();
$orgids_admin = array();
$orgids_member = array();
$explorer_setting = get_resources_some_setting();
$types=array('0');
if ($explorer_setting['grouponperm']){
$types[]="(o.type='1' and o.forgid='0')";
}
if ($explorer_setting['orgonperm']){
$types[]="o.type='0'";
}
$typesql=implode(' OR ',$types);
if($_G['adminid'] == 1){
$orgdatas = DB::fetch_all("select o.orgid from %t o where 1 and ($typesql)", array('organization'));
}else{
$orgdatas = DB::fetch_all("select u.orgid from %t u left join %t o on u.orgid=o.orgid where u.uid = %d and (($typesql))", array('organization_user', 'organization', $uid));
}
foreach ($orgdatas as $v) {
$orgids[] = $v['orgid'];
}
//获取对应权限的机构orgid
foreach ($orgids as $val) {
//当前机构或部门管理员,查询所有下级和上级
if (C::t('organization_admin')->chk_memberperm($val, $uid)) {
$path = DB::result_first("select pathkey from %t where orgid = %d", array($this->_table, $val));
$patharr = DB::fetch_all("select pathkey from %t where pathkey LIKE %s and available = %d", array($this->_table, $path . '%', 1));
foreach ($patharr as $v) {
$pathstr = str_replace('_', '', $v['pathkey']);
if ($orgidarr = explode('-', $pathstr)) $orgids_admin = array_merge($orgids_admin, $orgidarr);
}
} else {//当前部门成员查询所有上级机构
$path = DB::result_first("select pathkey from %t where orgid = %d and available = %d and diron = %d", array($this->_table, $val, 1, 1));
$pathstr = str_replace('_', '', $path);
if ($orgidarr = explode('-', $pathstr)) $orgids_member = array_merge($orgids_member, $orgidarr);
}
}
$member_orgids = array();
//判断参与群组的群组开启和文件开启
foreach (DB::fetch_all('select manageon,diron,orgid from %t where orgid in(%n)', array($this->_table, $orgids_member)) as $v) {
if ($v['manageon'] && $v['diron']) {
$member_orgids[] = $v['orgid'];
}
}
return array('orgids' => array_unique(array_merge($orgids_admin, $member_orgids)), 'orgids_admin' => array_unique($orgids_admin), 'orgids_member' => array_unique(array_diff($member_orgids, $orgids_admin)));
}
//获取用户管理的所有群组orgid
public function fetch_all_manage_orgid($forgid=0)
{
$uid = getglobal('uid');
$explorer_setting = get_resources_some_setting();
$orgids = array();
$orgarr = array();
foreach (DB::fetch_all("select o.* from %t a LEFT JOIN %t o ON o.orgid=a.orgid where a.uid = %d", array('organization_admin','organization', $uid))as $v) {
if (!in_array($v['orgid'], $orgarr)) {
if($forgid){
if($v['forgid']!=$forgid) continue;
}else{
if($v['type']==1 && $v['forgid']<1) continue;
elseif($v['type']==2) continue;
}
if (!$explorer_setting['grouponperm'] && ($v['type'] == 1 && $v['forgid']==0)) {
continue;
}
if (!$explorer_setting['orgonperm'] && $v['type'] == 0) {
continue;
}
$pathkey = $v['pathkey'];
foreach (DB::fetch_all("select orgid,orgname from %t where pathkey LIKE %s ", array($this->_table, $pathkey . '%')) as $val) {
$orgids[$val['orgid']] = array('orgid' => $val['orgid'], 'orgname' => $val['orgname']);
$orgarr[]=$val['orgid'];
}
}
}
return $orgids;
}
//我参与的所有群组和机构
public function fetch_all_part_org($forgid=0)
{
$uid = getglobal('uid');
$explorer_setting = get_resources_some_setting();
$orgarr = array();
$orgids=array();
foreach(DB::fetch_all("select o.* from %t u LEFT JOIN %t o ON o.orgid=u.orgid where u.uid = %d",array('organization_user','organization', $uid)) as $v) {
if (!in_array($v['orgid'], $orgids)) {
if($forgid){
if($v['forgid']!=$forgid) continue;
}else{
if($v['type']==1 && $v['forgid']>0) continue;
elseif($v['type']==2) continue;
}
if (!$explorer_setting['grouponperm'] && ($v['type'] == 1 && $v['forgid']==0)) {
continue;
}
if (!$explorer_setting['orgonperm'] && $v['type'] == 0) {
continue;
}
}
$orgids[]=$v['orgid'];
$org = array('orgid' => $v['orgid'], 'orgname' => $v['orgname']);
$orgarr[] = $org;
}
return $orgarr;
}
//获取群组类型
public function get_grouptype_by_orgid($orgid)
{
if (!is_array($orgid)) {
return DB::result_first("select `type` from %t where orgid = %d", array($this->_table, $orgid));
} else {
$orgtypes = array();
foreach (DB::fetch_all("select orgid,`type` from %t where orgid in(%n)", array($this->_table, $orgid)) as $v) {
if ($v['type'] == 0) {
$orgtypes['org'][] = $v['orgid'];
} else {
$orgtypes['group'][] = $v['orgid'];
}
}
return $orgtypes;
}
}
public function get_uniqueName_by_forgid($forgid, $orgname = '', $orgid = 0)
{
static $i = 0;
if (empty($orgname)) $orgname = lang('new_department');
if (DB::result_first("select COUNT(*) from %t where orgname=%s and forgid=%d and orgid!=%d", array($this->_table, $orgname, $forgid, $orgid))) {
$orgname = preg_replace("/\(\d+\)/i", '', $orgname) . '(' . ($i + 1) . ')';
$i += 1;
return self::get_uniqueName_by_forgid($forgid, $orgname);
} else {
return $orgname;
}
}
/*空间相关*/
/* 获取当前部门机构空间含有的空间限制值(从上向下)
* 包含未分配空间的机构或部门已使用空间(单位为B)
* $owner参数默认为true即包含自身空间限制占用设为false,不包含自身空间限制占用
* */
public function get_orgallotspace_by_orgid($orgid, $allotspace = 0, $owner = true)
{
$org = self::fetch($orgid);
//如果当前部门有空间限制值,则返回该值
if ($org['maxspacesize'] > 0 && $owner) {
$allotspace += $org['maxspacesize'] * 1024 * 1024;
} else {//如果当前部门没有分配空间,寻找下级分配空间之和
//当前机构或部门已使用空间大小
$allotspace += intval($org['usesize']);
//下级部门分配空间大小
foreach (DB::fetch_all("select orgid from %t where forgid = %d", array($this->_table, $orgid)) as $val) {
$allotspace += self::get_orgallotspace_by_orgid($val['orgid']);
}
}
return $allotspace;
}
/* *
* 获取系统可分配空间大小
* 如果系统无空间限制返回0
* 如果系统空间设置为-1返回-1
* 如果系统空间有设置,且空间使用量超出或等于分配和,返回-2否则返回剩余可分配值(单位为B)
* */
public function get_system_allowallot_space()
{
global $_G;
//获取系统空间设置值
$systemspace = isset($_G['setting']['systemSpace']) ? intval($_G['setting']['systemSpace']) : 0;
//系统空间无限制时
if ($systemspace == 0) {
$allowallotspace = 0;
} elseif ($systemspace < 0) {//系统空间关闭时
$allowallotspace = -1;
} elseif ($systemspace > 0) {//设置系统空间限制时
//获取所有顶级机构和群组空间限制值
$fpathkey = DB::fetch_all("select maxspacesize,orgid from %t where forgid = 0", array($this->_table));
$allotspace = 0;
foreach ($fpathkey as $v) {
//如果顶级机构有限制值,计算入限制值当中
if ($v['maxspacesize'] > 0) {
$allotspace += intval($v['maxspacesize']) * 1024 * 1024;
} else {//如果当前顶级机构没有限制值,获取当前机构已使用空间值+下层机构限制值之和(包含下层机构无限制的已使用空间)
$allotspace += self::get_orgallotspace_by_orgid($v['orgid']);
}
}
//用户分配空间值
$allotspace += C::t('user')->get_allotspace();
$allowallotspace = $systemspace * 1024 * 1024 - $allotspace;
if ($allowallotspace <= 0) {
$allowallotspace = -2;
}
}
return $allowallotspace;
}
/*
* 获取当前部门空间限制值
*从下到上依次查找如果未找到空间限制则获取系统空间限制返回值单位为B
* */
public function get_parent_maxspacesize_by_pathkey($pathkey, $currentorgid)
{
$arr = array('orgid' => '', 'maxspacesize' => '');
$pathkeys = explode('-', $pathkey);
$pathkeys = array_reverse($pathkeys);
foreach ($pathkeys as $v) {
$orgid = intval(str_replace('_', '', $v));
//排除当前部门
if ($orgid == $currentorgid) {
continue;
} else {
/*//判断是否有该层的管理权限
if(!C::t('organization_admin')->chk_memberperm($orgid)){
exit(json_encode(array('error'=>'没有权限')));
}*/
//获取当前层分配空间大小
$result = DB::result_first("select maxspacesize from %t where orgid = %d", array($this->_table, $orgid));
if ($result > 0 || $result == -1) {
$arr['maxspacesize'] = $result * 1024 * 1024;
$arr['orgid'] = $orgid;
break;
}
}
}
//如果没有获取到上层限制,获取系统空间限制
if ($arr['maxspacesize'] == '') {
$arr['maxspacesize'] = self::get_system_allowallot_space();
}
return $arr;
}
/*
* 获取当前机构或部门已分配空间大小
* 包含已使用空间大小
* 单位为B
* */
/* public function get_current_occupysize_byorgid($orgid, $return = array())
{
$org = self::fetch($orgid);
if($org['maxspacesize'] > 0){
return
}
$return['usesize'] += $org['usesize'];
//获取当前机构子级空间信息
foreach (DB::fetch_all("select maxspacesize,usesize,orgid from %t where forgid = %d ", array('organization', $orgid)) as $v) {
if ($v['maxspacesize'] > 0) {
$return['maxsize'] += $v['maxspacesize'] * 1024 * 1024;
} elseif ($v['maxspacesize'] == 0) {
$return['maxsize'] += $v['usesize'];
$return = $this->get_current_occupysize_byorgid($v['orgid']);
}
}
return $return;
}*/
/* *
* 获取当前机构可分配空间大小
* 上级限制-上级已占用+当前原值
* */
public function get_allowallotspacesize_by_orgid($orgid)
{
$currentallowsetsize = 0;
$org = C::t('organization')->fetch($orgid);
if (!$org) return;
//获取父级可分配空间大小
$topmaxspacesizeinfo = $this->get_parent_maxspacesize_by_pathkey($org['pathkey'], $orgid);
//如果当前部门之前有分配空间设置
if ($org['maxspacesize'] > 0) {
$oldmaxspacesize = $org['maxspacesize'] * 1024 * 1024;
} else {//如果当前部门之前无分配空间设置,获取其下级部门分配空间设置与当前部门未分配已使用之和
$oldmaxspacesize = $this->get_orgallotspace_by_orgid($orgid);
}
if ($topmaxspacesizeinfo['maxspacesize'] > 0) {
if ($topmaxspacesizeinfo['orgid']) {//有上级限制
//含限制上级空间占用
$topallotapce = $this->get_orgallotspace_by_orgid($topmaxspacesizeinfo['orgid'], 0, false);
//计算当前部门可设置空间大小:有限制上级限制空间-有限制上级已占用空间+当前部门原空间
$currentallowsetsize = $topmaxspacesizeinfo['maxspacesize'] - $topallotapce + $oldmaxspacesize;
} else {//无上级限制(即使用系统空间限制)
$currentallowsetsize = $topmaxspacesizeinfo['maxspacesize'] + $oldmaxspacesize;
}
} else {//返回值为0-1-2的特殊情形
$currentallowsetsize = $topmaxspacesizeinfo['maxspacesize'];
}
return $currentallowsetsize;
}
//获取可使用空间大小
public function get_usespace_size_by_orgid($orgid)
{
$allowusespace = 0;
if (!$org = C::t('organization')->fetch($orgid)) {
return -1;
}
//如果当前机构或部门已设置分配空间
if ($org['maxspacesize'] > 0) {
//获取当前机构或部门已占用空间大小
$currentallotspace = $this->get_orgallotspace_by_orgid($orgid, 0, false);
//获取当前机构或部门可使用空间大小
$allowusespace = $org['maxspacesize'] * 1024 * 1024 - $currentallotspace;
//如果当前机构或部门可使用空间大小不足
if ($allowusespace <= 0) {
$allowusespace = -2;
}
} elseif ($org['maxspacesize'] < 0) {//如果当前机构或部门已分配空间为-1
$allowusespace = -1;
} elseif ($org['maxspacesize'] == 0) {//如果当前机构或部门未分配空间
//获取当前机构或部门可分配空间大小即其可用空间
$allowusespace = self::get_allowallotspacesize_by_orgid($orgid);
}
return $allowusespace;
}
//获取我有管理权限的机构和部门(包括下级部门orgids
public function fetch_all_manage_orgids_by_uid($uids,$sub=true){
if(!is_array($uids)) $uids=(array)$uids;
if(!$orgids=C::t('organization_admin')->fetch_orgids_by_uid($uids)) return array();
$sql="1";
$param=array($this->_table);
$sqlarr=array();
if($sub){
foreach(parent::fetch_all($orgids) as $value){
$sqlarr[]='pathkey LIKE %s';
$param[]=$value['pathkey'].'%';
}
if($sqlarr){
$sql.=' and (' . implode(' OR ',$sqlarr).')';
foreach(DB::fetch_all("select orgid from %t where $sql",$param) as $value){
$orgids[]=$value['orgid'];
}
}
}
return array_unique($orgids);
}
//删除文件夹时,更新群组信息;$force=true时删除群组
public function delete_by_fid($fid,$force=true){
if(empty($fid)) return false;
foreach(DB::fetch_all("select orgid from %t where fid=%d",array($this->_table,$fid)) as $value){
parent::update($value['orgid'],array('fid'=>0));
if($force){
self::delete_by_orgid($value['orgid'],true);
}
}
return true;
}
}