<?php
/**
  * @class 基类
  * @author soul
  */
class baseAction
{
	public $allStyle = null;
	//只能调用/static/目录下的 js | css | 控件[webuploader、datetimepicker、ueditor、zTree]
    private $HEAD_CSSJS = ['css'=>[], 'js'=>[], 'plugin'=>[]];

	public function __construct()
	{
		$this->allStyle = [
			'shop'=>'商家入驻',
			'pcyear'=>'pc年卡',
			'pchyear'=>'pc半年卡',
			'pcmonth'=>'pc月卡'
		];
		LibTpl::Set('allStyle', $this->allStyle);
		LibTpl::Set('HEAD_CSSJS', $this->HEAD_CSSJS);
		//登录校验
		$nowFun = mvc::$URL_CLASS.'/'.mvc::$URL_METHOD;
		//忽略登录的接口
		$ignoreLoginFunArr = ['user/login', 'user/logout', 'user/ajaxLogin', 'user/loginByQQ', 'user/loginByWx', 'base/crmApi'];
		
		if(empty($_SESSION['_userid']))
		{
			//自动登录
			if(!empty($_COOKIE['_unitag']))
			{
				$LibYpApi = new LibYpApi();
				$PostData = [
					'type'=>'unitag',
					'data'=>['unitag'=>$_COOKIE['_unitag']],
					'ip'=>LibFc::GetClientIp(),
					'from'=>mvc::$cfg['FROM'],
					'lang'=>'cn'
				];
				$res = $LibYpApi->Get('user/login', [], $PostData, true);
				if($res['status'] && !empty($res['data']['u_id']) && $this->initLogin($res['data'], 0)){
					$this->initLogin($res['data'], 1);
				}else{
					$this->clearLogin();
				}
			}
		}
		if(empty($_SESSION['_userid']) && !in_array($nowFun, $ignoreLoginFunArr))
			Header("Location: ".mvc::$cfg['SELF_URI'].'user/login?goto='.LibFc::nowUrl());

		if(!empty($_SESSION['_userid']))
		{
			if($nowFun == 'user/login') Header("Location: ".mvc::$cfg['SELF_URI']);
			//token自动续期
			if(($_SESSION['_crmtoken']['etime'] - time()) < 60)
			{
				$LibCrmApi = new LibCrmApi();
				$res = $LibCrmApi->Get('base/buildToken', [], ['unitag'=>$_SESSION['_unitag']]);
				$_SESSION['_crmtoken'] = $res['data'];
			}
			mvc::$cfg['CRMAPI']['ip'] = LibFc::GetClientIp();
			mvc::$cfg['CRMAPI']['from'] = $_SESSION['_crmtoken']['from'];
			mvc::$cfg['CRMAPI']['devcode'] = $_SESSION['_crmtoken']['devcode'];
			mvc::$cfg['CRMAPI']['token'] = $_SESSION['_crmtoken']['token'];
		}
		$this->releaseGuard();
	}


	/**
	 * @method    PHP调取跑CRMAPI
	 * @param fun       string [必填]  方法
	 * @author    soul
	 * @copyright 2018-08-31
	 * @return
			{status:true,data:true}
			{status:false,data:错误信息}
	 */
	public function crmApi()
	{
		$getArr = $_GET;
		unset($getArr['fun']);
		if(isset($getArr['limit'])){
		    $getArr['per'] = $getArr['limit'];
		    unset($getArr['limit']);
        }
		$LibCrmApi = new LibCrmApi();
		$res = $LibCrmApi->Get($_GET['fun'], $getArr, $_POST);
		ob_clean();
		if(isset($res['data']['total'])){
		    if($res['status'] == false){
		        $res['data']['code'] = 1;
		        $res['data']['msg'] = $res['data'];
                echo json_encode($res['data']);exit();
            }else{
                $res['data']['code'] = 0;
                $res['data']['count'] = $res['data']['total'];
                unset($res['data']['total']);
                $res['data']['msg'] = '';
                $res['data']['status'] = $res['status'];
                echo json_encode($res['data']);exit();
            }
        }
		echo json_encode($res);
	}


	//初始化用户登录数据
	protected function initLogin($userData, $remember)
	{
		$B2cBase = 	new B2cBase();
		$res = $B2cBase->get('an_user',['*'],sprintf(" and au_status=1 and au_uid=%d",$userData['u_id']),true);
		if(!empty($res['data']))
		{
			$_SESSION['_unitag'] = $userData['unitag'];
			$_SESSION['_userid'] = $userData['u_id'];
			$_SESSION['_username'] = $res['data']['au_name']?:$userData['u_name'];
			$time = !empty($remember)? time()+86400*30: null;
			setcookie('_unitag', $_SESSION['_unitag'], $time, '/');
			$_SESSION['_crmtoken'] = $userData['token'];

			if ($res['data']['au_crmadmin'] == 1) {
				$_SESSION['_usergroup'] = 'all';
			}else{
				$this->checkZwRule($userData['u_id']);
			}

			$_SESSION['_dlrules']  = [];
			$PjlBase = new PjlBase();
			$table = 'dl_worker join dl_company on dwo_dco_id=dco_id and dco_status = 1';
			$res = $PjlBase->get($table, ['dwo_uid, dco_id, dco_short_name, dco_uid, dwo_name, dwo_rule_ids'], sprintf(" and dwo_uid=%d and dwo_status=1", $userData['u_id']), true);
			if(!empty($res['data']))
			{
				$_SESSION['_realname'] = $res['data']['dwo_name'];
				$_SESSION['_dcoid'] = $res['data']['dco_id'];
				$_SESSION['_comname'] = $res['data']['dco_short_name'];
				$_SESSION['_dlrules'] = $userData['u_id'] == $res['data']['dco_uid']? 'all' : explode(',', $res['data']['dwo_rule_ids']);
			}
			return true;
		}
		else
		{
			return false;
		}
	}

	protected function clearLogin()
	{
		unset($_SESSION['_unitag']);
		unset($_SESSION['_userid']);
		unset($_SESSION['_username']);
		unset($_SESSION['_crmtoken']);
		unset($_SESSION['_dlrules']);
		unset($_SESSION['_usergroup']);
		unset($_SESSION['_minUgpId']);
		unset($_SESSION['_xiajiUid']);
		setcookie('_unitag', '', time()-3600, '/');
		return true;
	}

	/**
	 * @param  [type] $uid
	 * @method 检查当前用户职位身份
	 * @author zhengweihua 
	 * @copyright 2024-02-01
	 */
	public function checkZwRule($uid)
	{	
		$B2cBase = new B2cBase();
		$res1 = $B2cBase->get('an_user_group',['*']);
		$arr['hasNext'] =[];
		if ($res1['data']) {
			$arr['hasNext'] = array_unique(array_column($res1['data'],'ugp_pid'));
		}
		
		
		$table = 'an_user_group_link 
			join an_user_group on ugl_ugid = ugp_id';
		$res = $B2cBase->get($table, ['ugp_id', 'ugp_name', 'ugp_path'], sprintf(" and ugl_uid=%d", $uid));
		$userposs = array_column($res['data'],'ugp_id');
		$res['data'] =	$this->findTopUserJobs($res1['data'],$userposs);
		if($res['data']){
			$arr1 = [];
			//获取当前用户的所有职位
			
			foreach ($res['data'] as $val) {
				if($val['ugp_id']==1){
					$arr1['admin'][] = $val['ugp_id'];
				}elseif(in_array($val['ugp_id'],$arr['hasNext'])){
					$arr1['xiaji'][] = $val['ugp_id'];
				}else{
					//客服
					if (in_array($val['ugp_id'], [33])) {
						$arr1['kefu'][] = $val['ugp_id'];
					} else{
						//业务员
						$arr1['yewuyuan'] = $val['ugp_id'];
					}
				}
			}
			$_SESSION['_xiajiUid'] = []; 
			if($arr1['admin']){
				$_SESSION['_usergroup'] = 'all';
			}elseif ($arr1['xiaji']) {
				$_SESSION['_usergroup'] = 'shangji';
				$_SESSION['_maxUgpId'] = $arr1['xiaji']; 
				$res = $this->getNextUId();
				$_SESSION['_xiajiUid'] = $res['data'];
			} elseif ($arr1['kefu']) {
				$_SESSION['_usergroup'] = 'kefu';
			} else {
				$_SESSION['_usergroup'] = 'yewu';
			}
		}
		
	}

	/**
	 * @param  [type] $jobTree 全部职位
	 * @param  [type] $userJobs 用户的所有职位
	 * @method
	 * @author zhengweihua 
	 * @copyright 2024-05-10
	 */
	protected function findTopUserJobs($jobTree, $userJobs) {  
		$topJobs = [];  
		  
		// 创建一个映射，方便从ID查找职位  
		$jobMap = [];  
		foreach ($jobTree as $job) {  
			$jobMap[$job['ugp_id']] = $job;  
		}  
		  
		// 遍历用户所拥有的职位  
		foreach ($userJobs as $jobId) {  
			// 如果用户拥有的职位在职位树中  
			if (isset($jobMap[$jobId])) {  
				$currentJob = $jobMap[$jobId];  
				// 向上遍历找到所有上级职位  
				$parentIds = [];  
				while ($currentJob['ugp_pid'] !== 0 && isset($jobMap[$currentJob['ugp_pid']])) {  
					$parentIds[] = $currentJob['ugp_pid'];  
					$currentJob = $jobMap[$currentJob['ugp_pid']];  
				}  
				// 如果用户拥有的职位的上级ID不在用户拥有的职位列表中，那么它是一个最高级别职位  
				if (!array_intersect($parentIds, $userJobs)) {  
					$topJobs[] = $jobMap[$jobId];  
				}  
			}  
		}  
		  
		return $topJobs;  
	}  

	public function	getNextUId()
	{
		$CrmBase = new CrmBase();
		$res= $CrmBase->getNextUId();
		return LibFc::ReturnData(true,$res['data']);
	}

	/**
	 * @param  string $oWhere 补充条件
	 * @method 获取业务员
	 * @author zhengweihua 
	 * @copyright 2024-02-01
	 */
	public function getSalesUser($oWhere ='',$isGroup = true,$excludePj = false)
	{	
		$where = sprintf(" %s and au_status=1 group by au_uid",$oWhere);
		$table = 'an_user_group_link  
			join an_user on au_uid = ugl_uid
			join an_user_group on ugl_ugid= ugp_id';
		$B2cBase = new B2cBase();
		$aures =  $B2cBase->get($table,['au_uid,au_name,ugp_name,ugp_path,ugl_ugid'],$where);
		if(!$excludePj){
			$aures['data'][] = ['au_name'=>'跑街令','au_uid'=>172999,'ugl_ugid'=>28];
		}
		
		$salesArr =[];
		if($isGroup){
			foreach ($aures['data'] as $key => $val) {
				$ugp_path  = explode(',',$val['ugp_path']);
				if(in_array(33,$ugp_path)||$val['ugl_ugid']==33){
					$val['ugp_name'] = '跑街客服部';
					$salesArr[$val['ugp_name']][$val['au_uid']] = $val['au_name'];
				}
				if(in_array(28,$ugp_path)||$val['ugl_ugid']==28){
					$val['ugp_name'] = '跑街业务员';
					$salesArr[$val['ugp_name']][$val['au_uid']] = $val['au_name'];
				}
				if(in_array(19,$ugp_path)||$val['ugl_ugid']==19){
					$val['ugp_name'] = '宜配业务员';
					$salesArr[$val['ugp_name']][$val['au_uid']] = $val['au_name'];
				}
				if(in_array(39,$ugp_path)||$val['ugl_ugid']==39){
					$val['ugp_name'] = '营销部';
					$salesArr[$val['ugp_name']][$val['au_uid']] = $val['au_name'];
				}
			}
			foreach ($salesArr as $skey => $sval) {
				$allKeys =array_keys($sval);
				$salesArr[$skey][implode(',',$allKeys)] = sprintf('选择 [%s] 所有人', $skey);
			}
		}else{
			foreach ($aures['data'] as $key => $val) {
				$ugp_path  = explode(',',$val['ugp_path']);
				if(in_array(33,$ugp_path)||in_array(28,$ugp_path)||in_array(19,$ugp_path)||in_array(39,$ugp_path)||in_array($val['ugl_ugid'],[19,28,32,33,39])){
					$salesArr[$val['au_uid']]= $val;
				}
			}
		}	
		
		return LibFc::ReturnData(true,$salesArr);
	}

	public function getKefu()
	{
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('`an_user_group_link` JOIN `an_user` ON ugl_uid = au_uid', ['au_uid,au_name'], " and ugl_ugid = 33 AND au_status = 1");
		return LibFc::ReturnData(true,$res['data']);
	}

	/**
	 * @method 释放已过期的保护客户
	 * @author zhengweihua 
	 * @copyright 2024-11-12
	 */
	public function releaseGuard()
	{
		$CrmBase = new CrmBase();
		//已超过保护有效期的客户
		$res = $CrmBase->get('crm_customer left join crm_customer_admin on cca_ctr_id = ctr_id',['distinct ctr_id'],sprintf(" AND ctr_level_id=1 AND (cca_ctr_id IS NULL OR  (cca_level_id=1 AND cca_end_time<%d))",time()));
		if($res['data'])
		{
			$ctrIds = array_column($res['data'],'ctr_id');
			//是否有成交合同
			$table = 'fad_contract 
			join fad_link_fct_sve on fsl_fct_id =fct_id';
			$res = $CrmBase->get($table,['DISTINCT fct_ctr_id'],sprintf(" AND fct_status=2 AND fct_ctr_id IN (%s)",implode(',',$ctrIds)));
			if($res['data'])
			{
				$hasCon = array_column($res['data'],'fct_ctr_id');
				//排除有合同的
				$ctrIds = array_diff($ctrIds,$hasCon);
			}
			if($ctrIds){
				$CrmBase->set('crm_customer',['ctr_level_id'=>0],sprintf(" AND ctr_level_id=1 AND ctr_id IN (%s)",implode(',',$ctrIds)));
			}
		}
		//找正在保护期但是crm_customer却不是保护期的数据
		$sql = sprintf("UPDATE crm_customer 
		JOIN crm_customer_admin ON cca_ctr_id = ctr_id 
		SET ctr_level_id = 1 
		WHERE ctr_level_id != cca_level_id 
		  AND cca_level_id = 1 
		  AND cca_end_time > %d",time());
		$CrmBase->CRMDb->Query($sql);
		
	}
}
