<?php
/**
  * @method 广告位
  * @author soul
  * @copyright 2016/3/31
  */
class AdsPlace extends AdsBase
{

    /**
    * @method 获取广告组的所有广告位的广告信息 - 默认不获取过期的广告位、无效的广告
    * @param  $id [arr]|int 需要获取的广告组ID,
    * @param  $all [boolean] 是否获取失效广告
    * @author xu
    * @copyright 2018.05.09
    * @return  ['status'=>true,'data'=>arr]|['status'=>false,'data'=>arr]
    */
     function getPlaces($id,$all=false)
     {
        // 参数
        $id = is_array($id) ? array_filter($id,'LibFc::Int') : array_filter([$id],'LibFc::Int');

        // 获取所有的广告组
        $where = empty($id) ? '' : sprintf("and pla_id in (%s)",implode(',', $id));
        $res = $this->get('ba_place',['*'],$where." order by pla_status desc,pla_seq asc");
        $pla_ids = array_column($res['data'], 'pla_id');
        $returnData = $res['data'];
       
        // 获取所有的广告位
        $where = sprintf("and pll_pla_id in (%s)",implode(',', $pla_ids));
        if(!$all) $where.=  sprintf(" and pll_status=1");
        $res  = $this->get('ba_place_link',['*'],$where." order by pll_status desc,pll_seq asc ");

        foreach ($res['data'] as $k => $v) {
        	$rez = $this->getAvaTime($v['pll_id']);
        	$res['data'][$k]['aviableTime'] = $rez['data'];
        }

        $placeIds = array_column($res['data'], 'pll_id');

        if(empty($placeIds))
            return LibFc::ReturnData(true, $returnData);

        $placeInfo = [];
        foreach ($res['data'] as $k => $v) {
            $placeInfo[$v['pll_pla_id']][] = $v;
        }
        foreach ($returnData as $k => $v) {
            $returnData[$k]['placeInfo'] = $placeInfo[$v['pla_id']];
        }

        // 获取所有广告
        $table="ba_place_ads_link left join ba_ads on ads_id=pal_ads_id left join ba_place_ads_time on pat_pal_id=pal_id";
        $where = sprintf(" and pal_pll_id in (%s)",implode(',', $placeIds));
        if(!$all) $where.=  sprintf(" and pal_status=1 and pat_status=1 and pat_etime>%s",time());
        $fileArr = ['pal_id','pat_keyword','pal_ads_id','ads_name','ads_id','pat_btime','pat_etime','pat_status','pal_pll_id'];
        $res = $this->get($table, $fileArr ,$where);
        // print_r($res);die();

        // 有些一个广告占据两个关键字-去除只留一个
        $res['data'] = array_column($res['data'], NULL ,'pal_id');

        $adsInfo = [];
        foreach ($res['data'] as $k => $v) {
            $adsInfo[$v['pal_pll_id']][] = $v;
        }
        foreach ($returnData as $k => $v) {
        	if(!empty($v['placeInfo']))
        	{
	            foreach ($v['placeInfo'] as $kk => $vv) {
	                $returnData[$k]['placeInfo'][$kk]['adsInfo'] = $adsInfo[$vv['pll_id']];
	            }
        	}
        }

        // 返回
        return LibFc::ReturnData(true, $returnData);
     }


	/**
	  * @method 获取广告类型
	  * @author soul
	  * @copyright 2017/11/11
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function getAdsStyle()
	{
		$arr = [];
		$res = $this->get('ba_ads_style', ['*'], 'order by ast_seq asc');
		foreach($res['data'] as $v)
		{
			$arr[$v['ast_id']] = $v;
		}
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 广告类型配置
	  * @author soul
	  * @copyright 2017/11/11
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function getAdsStyleConf()
	{
		$arr = [
			'img'=>'图片',
			'title'=>'标题',
			'des'=>'描叙',
			'price'=>'价格',
			'orgPrice'=>'原价',
			'proid'=>'配件ID',
			'word'=>'关键字'
		];
		return LibFc::ReturnData(true, $arr);
	}

	/**
	  * @method 编辑广告组的广告位信息
	  * @author soul
	  * @copyright 2017/11/11
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function setPlaceByPlaId($plaId, $dataArr)
	{

		if(!LibFc::Int($plaId) || !is_array($dataArr))
			return LibFc::ReturnData(false, 'setPlaceByPlaId 提供的参数不正确');

		$this->AdsDb->Begin();
		//查找已有的
		$res = $this->getFieldUniVal('ba_place_link', 'pll_id', sprintf(" and pll_pla_id = %d", $plaId));
		$oldIdArr = $res['data'];
		
		//删除
		$delIdArr = array_diff($oldIdArr, array_keys($dataArr));
		if(!empty($delIdArr))
		{
			$this->del('ba_place_link', sprintf(" and pll_id in (%s) and pll_pla_id=%d", implode(',', $delIdArr), $plaId));
		}
		
		// 编辑
		foreach($dataArr as $pllId=>$setArr)
		{
			unset($setArr['pll_id']);
			unset($setArr['pll_pla_id']);
			unset($setArr['pll_atime']);
			$setArr['pll_ads_id']=!empty($setArr['pll_ads_id'])?$setArr['pll_ads_id']:0;
			$setArr['pll_seq'] = (int) $setArr['pll_seq'];

			$setArr['pll_type'] = (int) $setArr['pll_type'];
			if ($setArr['pll_type'] == 1)
			{
				$setArr['pll_is_area'] = '1';
				$setArr['pll_is_keyword'] = '0';
			}
			else if ($setArr['pll_type'] == 2)
			{
				$setArr['pll_is_area'] = '0';
				$setArr['pll_is_keyword'] = '1';
			}

			unset($setArr['pll_type']);

			if(in_array($pllId, $oldIdArr))
			{
				$this->set('ba_place_link', $setArr, sprintf(" and pll_id=%d and pll_pla_id=%d", $pllId, $plaId));
			}
			else if($pllId < 1)
			{
				$setArr['pll_pla_id'] = $plaId;
				$setArr['pll_atime'] = time();
				$this->add('ba_place_link', $setArr);
			}
		}
		$this->AdsDb->End();
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 编辑广告的投放位置
	  * @author soul
	  * @copyright 2017/11/11
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function setAdsPlaceByadsId($adsId, $dataArr)
	{
		$adsId = (int) $adsId;
		if($adsId < 1 || !is_array($dataArr))
		{
			return LibFc::ReturnData(false, 'setAdsPlaceByadsId 提供的参数不正确');
		}
		$this->AdsDb->Begin();

		//查找已有的
		$res = $this->getFieldUniVal('ba_place_ads_link', 'pal_id', sprintf(" and pal_ads_id = %d", $adsId));
		$oldIdArr = $res['data'];
		
		//删除
		$delIdArr = array_diff($oldIdArr, array_keys($dataArr));
		if(!empty($delIdArr))
		{
			$this->del('ba_place_ads_link', sprintf(" and pal_id in (%s) and pal_ads_id=%d", implode(',', $delIdArr), $adsId));
		}
		
		foreach($dataArr as $palId=>$setArr)
		{
			unset($setArr['pal_id']);
			unset($setArr['pal_ads_id']);
			unset($setArr['pal_atime']);
			$setArr['pal_seq'] = (int) $setArr['pal_seq'];
			if(in_array($palId, $oldIdArr))
			{
				$this->set('ba_place_ads_link', $setArr, sprintf(" and pal_id=%d and pal_ads_id=%d", $palId, $adsId));
			}
			else if($palId < 1)
			{
				$setArr['pal_ads_id'] = $adsId;
				$setArr['pal_atime'] = time();
				$this->add('ba_place_ads_link', $setArr);
			}
		}
		$this->AdsDb->End();
		return LibFc::ReturnData(true);
	}
	public function getAvaTime($placeAdsId,$keyword='',$palId=0,$oriArr=[])
	{
		if(LibFc::Int($placeAdsId))
		{
			
			$tag=time();//标记点
			$limit=[];
			//类型判断
			$res=$this->get('ba_place_link left join ba_ads_style on pll_ast_id= ast_id',['ast_name','ast_config','pll_is_keyword','pll_id','pll_ast_id','pll_max'],sprintf(' and pll_id=%d',$placeAdsId),true);
			if(!empty($res['data']))
			{
				// print_r($res);
				if($res['data']['pll_is_keyword']>0)
				{
					//关键字类型
					$timeArr=[];
					$max=$tag;
					$where=empty($keyword)?sprintf(' and pal_pll_id=%d and pal_status>0 and pat_etime>%d',$placeAdsId,$tag):sprintf(" and pal_pll_id=%d and pal_status>0 and pat_etime>%d and pat_keyword='%s'",$placeAdsId,$tag,LibFc::Escape($keyword));
					$res=$this->get('ba_place_ads_link left join ba_place_ads_time on pat_pal_id=pal_id left join ba_place_link on pal_pll_id=pll_id',['*'],$where);
					// print_r($res);
					if(!empty($res['data']))
					{
						foreach ($res['data'] as $v) 
						{
							if($v['pal_id']!=$palId)
							{
								$timeArr[]=$v['pat_btime'];
								$timeArr[]=$v['pat_etime'];
							}
							// $timeArr[]=$v['pat_btime'];
							// $timeArr[]=$v['pat_etime'];
						}
					}
					if(!empty($oriArr))
					{
						foreach ($oriArr as $v)
						{
							$timeArr[]=$v[0];
							$timeArr[]=$v[1];
						}
					}
					// print_r($timeArr);die;
					if(!empty($timeArr))
					{
						sort($timeArr,SORT_NUMERIC);
						// print_r($timeArr);die;
						$count=[];
						foreach ($timeArr as $k => $v) 
						{
							if(!empty($timeArr[$k-1]))
							{
								$start=$timeArr[$k-1];
								$end=$v;
								if($end-$start>0)
								{
									$limit[]=[$start+1,$end];//时间段区间
								}
							}
						}
						// print_r($limit);
						$location=[];
						//判断区间数量
						foreach($res['data'] as $k=>$v)
						{
							foreach($limit as $g=> $i)
							{
								if(!($v['pat_btime']>=$i[1]&&$v['pat_etime']>$i[1])&&!($v['pat_btime']<$i[0]&&$v['pat_etime']<=$i[0]))
								{
									$count[$g]+=1;//当前区间数加1
									$location[$v['pal_ads_id']][]=$g;//当前广告区间落点
								}
							}
						}
						if(!empty($count))
						{
							//区间校验数量
							foreach ($res['data'] as $k => $v) 
							{
								foreach($location[$v['pal_ads_id']] as $i)
								{
									if($count[$i]>=$v['pll_max'])
									{
										unset($limit[$i]);
									}
								}
							}
							//获取最大的时间点
							foreach ($limit as $k => $v) 
							{
								if($max<max($v))
									$max=max($v);
							}
						}
					}
					array_push($limit, [$max,'*']);
					//区间合并
					if(!empty($limit))
					{
						foreach ($limit as $k => $v) 
						{
							if(!empty($limit[$k+1])&&$v[1]==$limit[$k+1][0])
							{
								unset($limit[$k][1]);
								unset($limit[$k+1][0]);
							}
						}
						$temp=[];
						if(!empty($limit))
						{
							foreach ($limit as $v) 
							{
								if(isset($v[0]))
									$temp[]=$v[0];
								if(isset($v[1]))
									$temp[]=$v[1];
							}
						}
						$limit=[];
						// print_r($temp);
						if(!empty($temp))
						{
							
							foreach ($temp as $k=> $v) 
							{
								if($k%2==1)
								{
									if(is_numeric($v))
									{
										if(($v-$temp[$k-1])>=24*60*60)
										{
											$limit[]=[$temp[$k-1],$v];
										}
									}
									else
									{
										$limit[]=[$temp[$k-1],$v];
									}
								}
							}
						}
						// print_r($limit);
					}
				}
				else
				{
					$data=[];
					//广告位当前广告
					$res=$this->get('ba_place_ads_link left join ba_place_ads_time on pat_pal_id=pal_id',['*'],sprintf(' and pal_pll_id=%d and pat_status>0 and pal_status>0 and pat_etime>=%d',$placeAdsId,$tag));
					$Sort=array_column($res['data'], 'pat_etime');
					if(!empty($oriArr))
					{
						foreach ($oriArr as $v) 
						{
							$Sort[]=$v[1];
							$res['data'][]=['pat_btime'=>$v[0],'pat_etime'=>$v[1],'pal_id'=>-1];
						}
					}
					array_multisort($Sort, SORT_ASC, $res['data']);
					// print_r($res['data']);
					// die;
					if(!empty($res['data']))
					{
						foreach($res['data'] as $v)
						{
							if($v['pal_id']!=$palId)
							{
								// echo $v['pat_btime'],'-----',date('Y-m-d H:i:s',$v['pat_btime']);
								// echo '</br>';
								// echo $v['pat_etime'],'-----',date('Y-m-d H:i:s',$v['pat_etime']);
								// echo '</br>';
								$data[]=$v['pat_btime'];
								$data[]=$v['pat_etime'];
							}
						}
					}					
					if(!empty($data))
					{
						// print_r($data);
						$minTime=min($data);//最小的时间
						$maxTime=max($data);//最大的时间
						foreach ($data as $k => $v) 
						{
							if($k%2==1)
							{
								$end=$v;//结束时间
								$start=$data[$k-1];//开始时间
								if($start>$tag)
								{
									$limit[]=[$tag+1,$start];
								}
								$tag=$end;
							}
						}
						// print_r($limit);
						if(!empty($limit))
						{
							foreach ($limit as $k => $v) 
							{
								//去除小于一小时的时间段
								if(is_numeric($v[1])&&(($v[1]-$v[0])<24*60*59))
									unset($limit[$k]);
							}
						}
						$limit=array_merge($limit);
						// print_r($limit);					
					}
					$maxTime=isset($maxTime)?$maxTime:time();
					$limit[]=[$maxTime,'*'];

				}
			}
			return LibFc::ReturnData(true,$limit);
		}
		return LibFc::ReturnData(false,'getAvaTime参数不正确');
	}

	function setAds($palArr,$timeArr,$dataArr,$keyword='',$is_area,$adsId = 0)
	{
		if(!empty($palArr['pal_pla_id'])&&!empty($palArr['pal_pll_id'])&&is_array($dataArr)&&!empty($timeArr))
		{
			//广告位类型
			if (in_array($is_area, ['0','1']))
			{
				$adsId = (int) $adsId;
				//检测该广告位是否正确 区域关键字现只选一个
				$res = $this->get('ba_place_link',['*'],sprintf(' and pll_id=%d and pll_is_area=1',$palArr['pal_pll_id']),true);
				if ($res['data']['pll_is_area'] != '1')
					return LibFc::ReturnData(false,'该广告位不是区域广告');

				$dataArr['ads_ast_id'] = $res['data']['pll_ast_id'];
				$dataArr['ads_atime'] = time();
				$dataArr['ads_etime'] = time();
				$dataArr['ads_seq'] = empty($dataArr['ads_seq'])?999:(int)$dataArr['ads_seq'];

				$this->AdsDb->Begin();
				if ($adsId > 0)
				{
					// 删除ba_place_ads_time 表
					$palId = $this->get('ba_place_ads_link',['pal_id'],'and pal_ads_id='.$adsId,true);
					$palId = $palId['data']['pal_id'];
					$this->del('ba_place_ads_time',sprintf('and pat_pal_id=%s',$palId));
				}
				
				//获取已有的时间区间
				if ($is_area == '0')
					$timeArr = ['0'=>$timeArr];

				$res = $this->getCitytimes($palArr['pal_pll_id'], array_keys($timeArr),true);
				$res = $res['data'];
				foreach ($timeArr as $key => $value) 
				{
					//该城市时间区域合集
					if (empty($res[$key]))
						$res[$key] = [];

					foreach ($value['start'] as $k => $v) 
					{
						$v = $is_area == '1' ? $v.':00' : $v;
						$value['end'][$k] = $is_area == '1' ? $value['end'][$k].':00' : $value['end'][$k];
						$start = (int) strtotime($v);
						$end = (int) strtotime($value['end'][$k]);

						if ($start > $end)
							return LibFc::ReturnData(false,'广告结束时间应大于开始时间');

						// 已有的广告区间长度
						$len = count($res[$key])/2;
						for ($i=1; $i <= $len; $i++) 
						{ 
							// // 区间被包含
							// if ($start <= $res[$key][$i*2-1] && $end <= $res[$key][$i*2])
							// 	return LibFc::ReturnData(false,'广告时间有重合');

							// 区间部分有交集
							if (($res[$key][$i*2-1] <= $start && $start < $res[$key][$i*2]) || ($res[$key][$i*2-1] < $end && $end <= $res[$key][$i*2]))
							{
								return LibFc::ReturnData(false,'广告时间有重合');
							}
						}
						//合法的时间区域加入检测列表
						$res[$key][] = $start;
						$res[$key][] = $end;
						sort($res[$key]);
					}
				}

				//入库准备
				// 根据店铺id获取用户id
				$B2cBase = new B2cBase();
				if (LibFc::Int($dataArr['ads_u_id']))
				{
					$dataArr['ads_shop_id'] = 0;
				}else if (LibFc::Int($dataArr['ads_shop_id']))
				{
					$uid = $B2cBase->get('sh_shop',['shop_uid'],'and shop_id='.$dataArr['ads_shop_id'],true);
					$dataArr['ads_u_id'] = $uid['data']['shop_uid'];
				}else
				{
					return LibFc::ReturnData(false,'用户或者店铺要选一个');
				}
				$palArr['pal_status'] = (int) $palArr['pal_status'] ? 1 : 0;
				$palArr['pal_atime'] = time();

				if ($adsId == 0)
				{
					$re = $this->add('ba_ads',$dataArr);
					$adsId = $re['data'];
					$palArr['pal_ads_id'] = $adsId;
					$res = $this->add('ba_place_ads_link',$palArr);
					$palId = $res['data'];
				}
				else
				{
					$palArr['pal_ads_id'] = $adsId;
					$this->set('ba_ads',$dataArr,'and ads_id='.$adsId);
					$this->set('ba_place_ads_link',$palArr,'and pal_id='.$palId);
				}
				
				foreach ($timeArr as $key => $value)
				{
					foreach ($value['start'] as $k => $v) 
					{
						$start = (int) strtotime($v);
						$end = (int) strtotime($value['end'][$k]);
						//添加 ba_place_ads_time
						$wordArr=[
							'pat_pal_id'=> $palId,
							'pat_status'=> $palArr['pal_status'],
							'pat_pc_id' => (int)$key,
							'pat_btime'=> $start,
							'pat_etime'=> $end,
							'pat_seq'=>(!empty($palArr['pal_seq'])?$palArr['pal_seq']:999)
						];
						$this->add('ba_place_ads_time',$wordArr);
					}
				}
				$this->AdsDb->End();
			}
			else
			{
				$res=$this->get('ba_place_link left join ba_ads_style on pll_ast_id=ast_id',['*'],sprintf(' and pll_id=%d',$palArr['pal_pll_id']),true);
				if(!empty($res['data']))
				{
					if($res['data']['pll_is_keyword']>0&&empty($keyword))
					{
						return LibFc::ReturnData(false,'关键字不能为空');
					}
					$isKeyWord=$res['data']['pll_is_keyword']>0?true:false;
					//ba_ads
					$B2cBase = new B2cBase();
					if (LibFc::Int($dataArr['ads_u_id']))
					{
						$dataArr['ads_shop_id'] = 0;
					}else if (LibFc::Int($dataArr['ads_shop_id']))
					{
						$uid = $B2cBase->get('sh_shop',['shop_uid'],'and shop_id='.$dataArr['ads_shop_id'],true);
						$dataArr['ads_u_id'] = $uid['data']['shop_uid'];
					}else
					{
						return LibFc::ReturnData(false,'用户或者店铺要选一个');
					}

					$dataArr['ads_ast_id']=$res['data']['ast_id'];
					$dataArr['ads_atime']=time();
					$dataArr['ads_etime']=time();
					$dataArr['ads_seq']=empty($dataArr['ads_seq'])?999:(int)$dataArr['ads_seq'];
					$this->AdsDb->Begin();
					$re=$this->add('ba_ads',$dataArr);
					//ba_place_ads_link,ba_place_ads_time
					$adsId=$re['data'];
					$palArr['pal_seq']=$dataArr['ads_seq'];
					$this->setAdsLink($adsId,$palArr,$timeArr,$keyword,$isKeyWord);
					$this->AdsDb->End();
				}
			}
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false,'setAds参数不正确');
	}
	function setAdsLink($adsId,$palArr,$timeArr,$keyword=[],$isKeyWord=false)
	{
		if(!empty($adsId)&&!empty($palArr)&&!empty($timeArr))
		{
			$linkArr=$palArr;
			$linkArr['pal_ads_id']=$adsId;
			$linkArr['pal_atime']=time();
			$this->AdsDb->Begin();
			$re=$this->add('ba_place_ads_link',$linkArr);
			$palId=$re['data'];
			if(!$isKeyWord)
			{
				foreach ($timeArr as $k=>$t) 
				{
					$aTime=explode(' - ',$t);
					if(empty($aTime[0])||empty($aTime[1]))
						return LibFc::ReturnData(false,'时间段不正确');
					$wordArr=[
							'pat_pal_id'=>$palId,
							'pat_status'=>1,
							'pat_btime'=>strtotime($aTime[0]),
							'pat_etime'=>strtotime($aTime[1]),
							'pat_seq'=>(!empty($palArr['pal_seq'])?$palArr['pal_seq']:999)
						];
					$this->add('ba_place_ads_time',$wordArr);
				}
			}
			else
			{
				foreach($keyword as $k=>$word)
				{
					if(!empty($timeArr[$k]))
					{
						foreach ($timeArr[$k] as $i => $t) 
						{
							$aTime=explode(' - ',$t);
							if(empty($aTime[0])||empty($aTime[1]))
								return LibFc::ReturnData(false,'时间段不正确');
							$wordArr=[
									'pat_pal_id'=>$palId,
									'pat_status'=>1,
									'pat_btime'=>strtotime($aTime[0]),
									'pat_etime'=>strtotime($aTime[1]),
									'pat_seq'=>$i,
									'pat_keyword'=>$word
								];
							$this->add('ba_place_ads_time',$wordArr);
								}
					}
				}
			}
			$this->AdsDb->End();
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false,'setAdsLink参数不正确');
	}
	function editAdsLink($adsArr,$palArr,$patArr)
	{
		if(!empty($palArr)&&!empty($patArr)&&!empty($adsArr))
		{
			//修改的pal_id
			$oriArr=array_keys($palArr);
			if(!empty($oriArr))
			{
				$B2cBase = new B2cBase();

				$uid = $B2cBase->get('sh_shop',['shop_uid'],'and shop_id='.$adsArr['ads_shop_id'],true);
				$adsArr['ads_u_id'] = $uid['data']['shop_uid'];
				
				$this->AdsDb->Begin();

				$this->set('ba_ads',$adsArr,sprintf(' and ads_id=%d',$adsArr['ads_id']));
				foreach ($palArr as $palId => $v) 
				{
					if($palId>0)
					{
						$this->set('ba_place_ads_link',$v,sprintf(' and pal_id=%d',$palId));
						// $this->set('ba_place_ads_time',['pat_status'=>0],sprintf(' and pat_pal_id=%d',$palId));
						if(!empty($patArr[$palId]))
						{
							foreach ($patArr[$palId] as $patValArr) 
							{
								// print_r($patValArr);
								// die;
								$patValArr['pat_pal_id']=$palId;
								$patValArr['pat_seq']=empty($patValArr['pat_seq'])?999:$patValArr['pat_seq'];
								//修改的,判断时间段是否已经存在，已经存在就修改
								if($patValArr['pat_id']>0)
								{
									$this->set('ba_place_ads_time',$patValArr,sprintf(' and pat_id=%d',$patValArr['pat_id']));
								}
								else
								{
									unset($patValArr['pat_id']);
									$this->add('ba_place_ads_time',$patValArr);
								}
								// unset($patValArr);
							}
						}
					}
					else
					{
						$link=$this->add('ba_place_ads_link',$v);
						if(!empty($patArr[$palId]))
						{
							foreach ($patArr[$palId] as $patValArr)
							{
								unset($patValArr['pat_id']);
								$patValArr['pat_pal_id']=$link['data'];
								$patValArr['pat_seq']=empty($patValArr['pat_seq'])?999:$patValArr['pat_seq'];
								$this->add('ba_place_ads_time',$patValArr);
							}
						}
					}
				}
				$this->AdsDb->End();
				return LibFc::ReturnData(true,true);
			}
		}
		return LibFc::ReturnData(false,'editAdsLink参数不正确');
	}


	/**
	  * @method 返回当前广告状态
	  * @param [int|arr]  $palIds
	  * @author xu
	  * @copyright 2018/06/23
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function getAdsStat($palIds,$needCheckStat = true)
	{
		if(!is_array($palIds)) $palIds = [$palIds];
		$palIds = array_filter($palIds,"LibFc::Int");

		if(empty($palIds))
			return LibFc::ReturnData(true, []);
		$table = 'ba_ads left join ba_ads_style on ast_id=ads_ast_id left join ba_place_ads_link on pal_ads_id=ads_id left join ba_place_link on pal_pll_id = pll_id left join ba_place_ads_time on pat_pal_id=pal_id';
		$res = $this->get($table,['*'],sprintf("and pal_id in (%s)",implode(',', $palIds)));

		$returnData = [];
		foreach ($res['data'] as $k => $v)
		{
			// pal_status // pat_status // ads_check
			$check = "";
			if($needCheckStat)
			{
				if($v['ads_check']=='0')
				{
					$check = ' | <span class="warn">客户编辑：待审</span>';
				}
				if($v['ads_check']=='-1')
				{
					$check = ' | <span class="red">客户编辑：审核不通过</span>';
				}
			}
			if(!$v['pal_status'])
			{
				$returnData[$v['pal_id']] = '<span class="red">停用</span>'.$check;
				continue;
			}
			if(!$v['pat_status'])
			{
				$returnData[$v['pal_id']] = '<span class="red">投放时间停用</span>'.$check;
				continue;
			}
			// 状态码全为正常
			if(time() > $v['pat_btime'] && time()<$v['pat_etime'])
			{
				$returnData[$v['pal_id']] = '<span class="green">运行中</span>'.$check;
				continue;
			}
			if(time() < $v['pat_btime'])
			{
				$returnData[$v['pal_id']] = '<span class="green">待上</span>'.$check;
				continue;
			}
			if(time() > $v['pat_etime'])
			{
				$returnData[$v['pal_id']] = '<span class="gray">已过期</span>'.$check;
				continue;
			}
		}
		return LibFc::ReturnData(true, $returnData);
	}



	/**
	  * @method 返回广告位点击数查看数和点击率
	  * @param [int|arr]  $pllIds
	  * @author xu
	  * @copyright 2018/06/23
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function getPllClickCount($pllIds)
	{
		if(!is_array($pllIds)) $pllIds = [$pllIds];
		$pllIds = array_filter($pllIds,"LibFc::Int");

		if(empty($pllIds))
			return LibFc::ReturnData(true, []);
		
		$res = $this->get('tj_ads_day left join ba_place_ads_link on pal_id=tad_pal_id ',['*'],sprintf("and pal_pll_id in (%s)",implode(',', $pllIds)));

		$returnData = [];
		foreach ($res['data'] as $k => $v) {
			if(!empty($returnData[$v['pal_pll_id']]['click']))
			{
				$returnData[$v['pal_pll_id']]['click']+=$v['tad_click'];
			}
			else{
				$returnData[$v['pal_pll_id']]['click'] = $v['tad_click'];
			}
			if(!empty($returnData[$v['pal_pll_id']]['show']))
			{
				$returnData[$v['pal_pll_id']]['show']+=$v['tad_show'];
			}
			else{
				$returnData[$v['pal_pll_id']]['show'] = $v['tad_show'];
			}
		}
		return LibFc::ReturnData(true, $returnData);
	}


	/**
	  * @method 获取广告组的点击数统计那些
	  * @param [int|arr]  $plaIds
	  * @author xu
	  * @copyright 2018/06/23
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> 一维数组["code"]=> int(0) } 
	  */
	public function getPlaClickCount($plaIds)
	{
		if(!is_array($plaIds)) $plaIds = [$plaIds];
		$plaIds = array_filter($plaIds,"LibFc::Int");

		if(empty($plaIds))
			return LibFc::ReturnData(true, []);
		
		$where = sprintf("and tad_pla_id in (%s) group by tad_pla_id",implode(',', $plaIds));
		$res = $this->get('tj_ads_day ',['sum(tad_click) as clicks','sum(tad_show) shows','tad_pla_id'],$where);

		$returnData = array_column($res['data'], NULL,'tad_pla_id');

		return LibFc::ReturnData(true, $returnData);
	}

	public function getCitytimes($pllId = 0,$cityIds = [],$isTime = false,$adsId = 0)
	{
		$pllId = (int) $pllId;
		$adsId = (int) $adsId;
		if ($pllId < 0 )
			return LibFc::ReturnData(false, '参数不正确');

		//0 为全球 其他为细分城市ID
		if (!is_array($cityIds))
		{
			$cityIds = [0];
		}
		else
		{
			$cityIds = array_filter(array_unique($cityIds),'LibFc::Int');
		}

		if (!empty($cityIds))
		{
			$limitArr = [];
			$minTime = [];
			$tag = time();
			//获取有效的时间区间
			$where = sprintf('and pal_pll_id = %d and (pat_pc_id in(%s) or pat_pc_id=0) and pat_etime>%s ', $pllId, implode(',', $cityIds),$tag);

			// if ($adsId > 0)
			// {
			// 	$where .= 'and pal_ads_id!='.$adsId;
			// }


			$res = $this->get('ba_place_ads_link LEFT JOIN ba_place_ads_time ON pal_id=pat_pal_id',['*'], $where);

			if ($adsId > 0)
			{
				foreach ($res['data'] as $key => $value) 
				{
					if ($value['pal_ads_id'] == $adsId )
					{
						$returnData['hasTime'][$value['pat_pc_id']][] = ['start'=>date('Y-m-d H:i:s',$value['pat_btime']),'end'=>date('Y-m-d H:i:s',$value['pat_etime'])];
					}
					else if ($value['pal_status'] != 1)
					{
						unset($res['data'][$key]);
					}
				}
				
			}else
			{
				foreach ($res['data'] as $key => $value) 
				{
					if ($value['pal_status'] != 1)
					{
						unset($res['data'][$key]);
					}
				}
			}

			if (empty($res['data']))
			{
				foreach ($cityIds as $key => $value) 
				{
					$limitArr[$value][] = ['start'=>date('Y-m-d H:i:s',$tag),'end'=>''];
				}
				$minTime[] = $tag;
			}else
			{
				$timeArr = [];
				//取出所有城市id下所有的有效区间
				foreach ($res['data'] as $key => $value) 
				{
					if ($value['pat_pc_id'] == 0)
					{
						foreach ($cityIds as $k => $v) 
						{
							$timeArr[$v][] = $value['pat_btime'];
							$timeArr[$v][] = $value['pat_etime'];
						}
					}else
					{
						$timeArr[$value['pat_pc_id']][] = $value['pat_btime'];
						$timeArr[$value['pat_pc_id']][] = $value['pat_etime'];
					}
				}
				
				foreach ($cityIds as $key => $value) 
				{
					if (empty($timeArr[$value]))
						$limitArr[$value][] = ['start'=>date('Y-m-d H:i:s',$tag),'end'=>''];
					else
					{
						//排序城市id内部区间必然是有顺序的
						sort($timeArr[$value]);
						if (!$isTime)
						{
							$len = count($timeArr[$value])/2;
							//开始区间
							if ($tag < $timeArr[$value][0])
							{
								$limitArr[$value][] = ['start'=>date('Y-m-d H:i:s',$tag),'end'=>date('Y-m-d H:i:s',$timeArr[$value][0])];
							}
							//遍历已有的区间 找出合适区间
							for ($i=1; $i < $len; $i++) 
							{ 
								//找出有效区间,区间位置为 相邻广告区间后前位置
								$min = $timeArr[$value][$i*2-1];
								$max = $timeArr[$value][$i*2];
								if ($max > $min)
								{
									$limitArr[$value][] = ['start'=>date('Y-m-d H:i:s',$timeArr[$value][$i*2-1]),'end'=>date('Y-m-d H:i:s',$timeArr[$value][$i*2])];
								}
							}
							//补齐最后一个区间时间
							$limitArr[$value][] = ['start'=>date('Y-m-d H:i:s',end($timeArr[$value])),'end'=>''];
						}
					}
					$minTime[] = strtotime($limitArr[$value][0]['start']);
				}
			}
			if (!$isTime)
			{
				sort($minTime);
				$returnData['list'] = $limitArr;
				$returnData['minTime'] = date('Y-m-d H:i:s',$minTime[0]);
				return LibFc::ReturnData(true, $returnData);
			}else
			{
				return LibFc::ReturnData(true, $timeArr);
			}
		}
		return LibFc::ReturnData(true, $returnData);
	}
}