<?php
/**
* @method 文章栏目的管理
* @author 廖
* @copyright 2017/6/13
*/
class PjlArticle extends PjlBase
{
    protected $sortArr = [];

    /**
    * @method    返回文章状态
    * @author     廖
    * @copyright 2017-07-29
    * @return  [array]  ['wait'=>xxx,...]
    */
    function getArticleStatus()
    {
        $status = [
        	'1' => '启用',
            '-1' => '停用'
        	];
        return $status;
    }

    /**
     * @method    保存新增 修改文章
     * @param     [array]     $dataArr ['title'=>xxx,'catId'=>xxx...]
     * @param     [int]         当前登陆用户的id
     * @author     廖
     * @copyright 2017-07-13
     * @return    LibFc::ReturnData(true, true);      
     */
    public function saveArticle($uid,$artid='',$dataArr,$art_sort)
    {
        if(LibFc::Int($uid) && is_array($dataArr) && !empty($dataArr) && !empty($art_sort))
        {
            $sortArr = array_filter(explode(',',rtrim($art_sort,',')));
            if (empty($sortArr))
                return LibFc::ReturnData(false,'分类不能为空');

            $dataArr['art_status'] = $dataArr['art_status'] == 1 ? 1 : 0;
            $dataArr['art_sys'] = $dataArr['art_sys'] == 1 ? 1 : 0;
            $dataArr['art_seq'] = isset($dataArr['art_seq']) && !empty($dataArr['art_seq']) ? $dataArr['art_seq'] : 99;

            $table = 'cm_article';
            $table2 = 'cm_article_category';
            // 更新数据
            $this->PjlDb->Begin();
            if(LibFc::Int($artid))
            {
                $this->set($table,$dataArr,' and art_id='.$artid,['art_txt']);
                $this->del($table2,' and arc_art_id='.$artid);
            }else
            {
                $dataArr['art_atime'] = time();
                $res = $this->add($table,$dataArr,['art_txt']);
                $artid = $res['data'];
            }
            //更新关联表
            if(!empty($sortArr))
            {
                foreach ($sortArr as $key => $value) 
                {
                    if(LibFc::Int($value))
                    {
                        $Arr = array(
                            'arc_art_id'=>$artid,
                            'arc_cat_id'=>$value,
                            // 'arc_seq' => $key,
                        );
                        $this->add($table2,$Arr);
                    }
                }
            }
            $this->PjlDb->End();
            return LibFc::ReturnData(true, true); 
        }
        return LibFc::ReturnData(false,'参数不正确');
    }

    /**
     * @method    删除文章
     * @param     [array]     $artIdArr 文章id
     * @author     廖
     * @copyright 2017-07-14
     * @return    删除成功的id$artIdArr('1'=>0909,...)
     */
    public function delArticle($artIdArr)
    {
        if(!empty($artIdArr))
        { 
            $artIdArr = is_array($artIdArr)? $artIdArr: [(int) $artIdArr];
            $artIdArr = array_filter($artIdArr,'LibFc::Int');
            if(!empty($artIdArr))
            {   
                $res = $this->get('cm_article',['count(*) count'],sprintf('and art_sys=1 and art_id in (%s)', implode(',', $artIdArr)), true);

                if ($res['data']['count'] > 0)
                    return LibFc::ReturnData(false,'系统文章不允许删除');
                
                $where = sprintf(' and art_id in (%s)',implode(',',$artIdArr));
                $where2 = sprintf(' and arc_art_id in (%s)',implode(',',$artIdArr));
                $this->PjlDb->Begin();
                $re = $this->del('cm_article',$where);
                $res = $this->del('cm_article_category',$where2);
                $this->PjlDb->End();
                return LibFc::ReturnData(true,$artIdArr);
            }
        }   
        return LibFc::ReturnData(false,'delArticle 参数不正确');
    }

    /**
     * @method    获取文章信息
     * @param     [int]     $nowPage  当前页
     * @param     [int]     $perPage  设置每页显示的条数
     * @param     [string]  $order    条件
     * @param     [string]  $order2   其他添加 如日期区间 状态
     * @author     廖
     * @copyright 2017-07-17
     * @return    array(1=>array('art_id'=>XXX,'art_title'=>XXX,...),...)
     */
    public function getPageArt($nowPage,$perPage,$where='')
    {
        if(LibFc::Int($nowPage) && LibFc::Int($perPage))
        {
            //先拿出文章
            $table = 'cm_article';
            $table2 = 'cm_article_category';

            $data = $this->get($table, ["*"] , sprintf("%s limit %d,%d", $where, ($nowPage-1)*$perPage, $perPage));

            if(!empty($data['data']))
            {
                $artIdArr = array_column($data['data'], 'art_id');
                // 获取文章分类的信息
                $link = $this->get($table2, ['arc_art_id','arc_cat_id'] , sprintf("and arc_art_id in (%s)", implode(',', $artIdArr)));
                $link = $link['data'];
                $linkArr = [];
                foreach ($link as $value) 
                {
                    $linkArr[$value['arc_art_id']][] = $value['arc_cat_id'];
                }
                // 获取所有 的 文章分类
                $res = $this->articleAllSort();
                $this->sortArr = array_column($res['data'], null,'id');
                foreach ($data['data'] as $key => $value) 
                {
                    if($linkArr[$value['art_id']])
                    {
                        foreach ($linkArr[$value['art_id']] as $lv) 
                        {
                            $data['data'][$key]['sortPath'][$lv] = $this->getSortPath($lv,true);
                        }
                        $data['data'][$key]['sortPathId'] = implode(',', $linkArr[$value['art_id']]);
                    }
                }
            }
            return LibFc::ReturnData(true,$data['data']);  
        }
        return LibFc::ReturnData(false,'参数不正确');
    }

    /**
     * @method    递归获取文章路径 名字 | id
     * @param     [int]      $id    [当前文章id]
     * @param     boolean    $name  [true 获取名称 | false 获取id]
     * @author    liao
     * @copyright 2018-08-24
     * @return   str name >> name >> xxx | id,id,xxx
     */
    protected function getSortPath($id,$name=false)
    {
        $namestr = $this->sortArr[$id]['name'];
        if ($this->sortArr[$id]['pId'] == 0)
            if ($name)
                return $namestr;
            else
                return $id;
        else
            if ($name)
                return $this->getSortPath($this->sortArr[$id]['pId'],true).' >> '.$namestr;
            else
                return $this->getSortPath($this->sortArr[$id]['pId']).','.$id;
    }

    /**
     * @method    获取文章分类的信息
     * @author     廖
     * @copyright 2017-07-17
     * @return   [json]  [{'id':1,'pId':2,'name':xxx},{...},...]
     */
    public function articleAllSort()
    {
        $artSortArr = $this->get('cm_category',['cat_id','cat_pcat_id','cat_name'],'');
        $arr = [];
        foreach ($artSortArr['data'] as $key => $value) 
        {
            $arr[$key]['id'] = $value['cat_id'];
            $arr[$key]['pId'] = $value['cat_pcat_id'];
            $arr[$key]['name'] = $value['cat_name'];
        }
        return LibFc::ReturnData(true,$arr);  
    }

    /**
     * @method    转移文章分类
     * @param     [array]       $artIdArr  文章id
     * @param     [array]       $sortIdArr 分类id
     * @param     [str]         ['add','del'] 增  或者删
     * @author    廖
     * @copyright 2017-07-21
     * @return    ['status'=>true,'data'=>true]
     */
    public function changeArticleSort($artIdArr,$sortIdArr,$order)
    {
        if(is_array($artIdArr) && !empty($artIdArr) && is_array($sortIdArr) && !empty($sortIdArr) &&in_array($order,['add','del','change']))
        {
            $artIdArr = array_filter($artIdArr,'LibFc::Int');
            $sortIdArr = array_filter($sortIdArr,'LibFc::Int');
            if(!empty($artIdArr) && !empty($sortIdArr))
            {
                $can = false;
                $where = '';
                switch ($order) 
                {
                    case 'del':
                        $where = sprintf(' and arc_art_id in (%s) and arc_cat_id in (%s)', implode(',',$artIdArr), implode(',',$sortIdArr));
                        break;
                    case 'add':
                        $can = true;
                        break;
                    case 'change':
                        $where = sprintf(' and arc_art_id in (%s)', implode(',',$artIdArr));
                        $can = true;
                        break;
                }
                    
                //入库
                $this->PjlDb->Begin();
                if (!empty($where))
                    $this->del('cm_article_category',$where);
                if ($can)
                {
                    foreach ($artIdArr as $av) 
                    {
                        foreach ($sortIdArr as $as) 
                        {
                            $this->add('cm_article_category',['arc_art_id'=> $av,'arc_cat_id'=>$as]);
                        }
                    }
                }
                $this->PjlDb->End();
                return LibFc::ReturnData(true,true);
            }
        }
        return LibFc::ReturnData(false,'changeArticleSort 参数不正确');
    }

    protected function cateTree($cat_id)
    {
        $newData = [];
        foreach ($this->sortArr as $key => $value) 
        {
            if ($value['cat_pcat_id'] == $cat_id)
            {
                $value['son'] = $this->cateTree($value['cat_id']);
                $newData[] = $value;
            }
        }
        return $newData;
    }

    /**
    * @method 获取所有栏目的信息
    * @param  $FieldArr         [array]  需取字段
    * @param  $where            [string] 条件
    * @author 廖
    * @copyright 2017/6/13
    * @return 
    *     成功：['status'=>true, 'data'=>['cat_id'=>xxx,....,'son'=>['cat_id'=>xxx,....]], 'code'=>'']
          失败：['status'=>false, 'data'=>失败信息, 'code'=>失败代码]
    */
    public function columnSelect($FieldArr=[],$where='') 
    {
        $res = $this->get('cm_category',['*'],$where.' order by cat_seq asc');
        $this->sortArr = array_column($res['data'], null, 'cat_id');
        $data = $this->cateTree(0);
        return LibFc::ReturnData(true, $data);
    }

    /**
     *@method 保存文章分类
     *@param  $data['cat_id'=>[['name']=>XXX,...],....] 二维数组
     *@return LibFc::ReturnData(true, true);
     *@author 廖 2017/6/22
    */
    public function saveArtSort($dataArr)
    {
        // print_r($dataArr);
        // die;
        //事务开启
        $siteArr = [0,1,2];
        $this->PjlDb->begin();
        $table = 'cm_category';
        foreach ($dataArr as $key => $value)
        {   
            //更新数据，就是仅仅保存具有ID的数据
            if($key>0)
            {
                $new_data = array(
                    'cat_name'=>$value['cat_name'],
                    'cat_seq'=>(int)$value['cat_seq']+1,
                    'cat_sys'=>$value['art_sys'] == 'on' ? 1 : 0,
                    'cat_site'=>in_array($value['cat_site'], $siteArr)?$value['cat_site']: 0,
                    );
                $Where =sprintf(' and cat_id =%d',$key);
                $this->set($table,$new_data,$Where);
            }
            //新增的数据进行入库
            if($key<0)
            {   
                if($value['cat_pcat_id'] == 0)
                {
                    //此时入库第一级的新子类
                    $new_data = array(
                        'cat_pcat_id'=>0,
                        'cat_name'=>$value['cat_name'],
                        'cat_sys'=>$value['art_sys'] == 'on' ? 1 : 0,
                        'cat_seq'=>(int)$value['cat_seq'],
                        'cat_site'=>in_array($value['cat_site'], $siteArr)?$value['cat_site']: 0,
                        ); 
                    $p1 = $this->add($table,$new_data);
                    //往下遍历
                    foreach ($dataArr as $kk=>$vv) 
                    {
                        if($kk<0 && $vv['cat_pcat_id'] == $key)
                        {
                            //此时入库第二级的新子类
                            $new_vv_data = array(
                                'cat_pcat_id'=> $p1['data'],
                                'cat_name'=>$vv['cat_name'],
                                'cat_sys'=>$vv['art_sys'] == 'on' ? 1 : 0,
                                'cat_seq'=>(int)$vv['cat_seq'],
                                'cat_site'=>in_array($vv['cat_site'], $siteArr)?$vv['cat_site']: 0,
                                );                   
                            $p2 = $this->add($table,$new_vv_data);
                            foreach ($dataArr as $kkk=>$vvv) 
                            {
                                if($kkk<0 && $vvv['cat_pcat_id'] == $kk)
                                {
                                    //此时入库第三级的新子类
                                    $new_vvv_data = array(
                                        'cat_pcat_id'=>$p2['data'],
                                        'cat_name'=>$vvv['cat_name'],
                                        'cat_sys'=>$vvv['art_sys'] == 'on' ? 1 : 0,
                                        'cat_seq'=>(int)$vvv['cat_seq'],
                                        'cat_site'=>in_array($vvv['cat_site'], $siteArr)?$vvv['cat_site']: 0,                                   
                                    );                  
                                    $this->add($table,$new_vvv_data);
                                }
                            }
                        }
                    }
                }else if($value['cat_pcat_id'] > 0)
                {
                    $new_data = array(
                        'cat_pcat_id'=>$value['cat_pcat_id'],
                        'cat_name'=>$value['cat_name'],
                        'cat_sys'=>$value['art_sys'] == 'on' ? 1 : 0,
                        'cat_seq'=>(int)$value['cat_seq'],
                        'cat_site'=>in_array($value['cat_site'], $siteArr)?$value['cat_site']: 0,
                        ); 
                    $p2 = $this->add($table,$new_data);
                    foreach ($dataArr as $k=>$v) 
                    {
                        if($k<0 && $v['cat_pcat_id'] == $key)
                        {
                          //此时入库第三级的新子类
                          $new_data = array(
                                'cat_pcat_id'=>$p2['data'],
                                'cat_name'=>$v['cat_name'],
                                'cat_sys'=>$v['art_sys'] == 'on' ? 1 : 0,
                                'cat_seq'=>(int)$v['cat_seq'],
                                'cat_site'=>in_array($v['cat_site'], $siteArr)?$v['cat_site']: 0,                                  
                              );                   
                          $this->add($table,$new_data);
                         }
                    }
                }
            }
        }
        //事务结束
        $this->PjlDb->End();
        return LibFc::ReturnData(true, true);
    }

    
    
    /**
     * @method    删除文章分类
     * @param     [int]          文章id
     * @author     廖
     * @copyright 2017-07-28
     * @return   array('status'=>true,'data'=>xxx) 
     */
    public function delArtCol($catId)
    {
        if(LibFc::Int($catId))
        {
            $res = $this->get('cm_category',['count(*) as count'],' and cat_pcat_id='.$catId,true);
            if ($res['data']['count'] > 0)
               return LibFc::ReturnData(false,'该分类下有子类 不能删除');//删除失败
           
            $res = $this->get('cm_article_category',['count(*) as count'],' and arc_cat_id='.$catId,true);
            if ($res['data']['count'] > 0)
               return LibFc::ReturnData(false,'该分类下有文章 不能删除');//删除失败

            $res = $this->get('cm_category',['count(*) as count'],'and cat_sys = 1 and cat_id='.$catId,true);
            if ($res['data']['count'] > 0)
               return LibFc::ReturnData(false,'该分类是系统分类 不能删除');//删除失败

            $this->PjlDb->Begin();

            $this->del('cm_category','and cat_id='.$catId);

            $this->PjlDb->End();
            return LibFc::ReturnData(true,true);
        }
        return LibFc::ReturnData(false,'delArtCol 参数不正确');
    }


	/*跑街令资讯 的阅读数3  art_read3 art_read3_w
		微信初始新闻 50-500随机阅读量
		3天时间随机刷1500-2000阅读量
		第1天最多，然后次之
		第一天 2/3, 第二天 1/6 第三天 1/6
	*/
	public function zxArtRead()
	{
		$now = time();
		$H = date('H');
		if($H <= 7 && $H >= 19)
			return LibFc::ReturnData(true);

		$this->set('zx_article_rp', ['zar_read_total'=>'#@ROUND(RAND() * 600 + 100)'], ' and zar_read_total = 0');
		
		//初始化变动的数据
		$res = $this->get('zx_article join zx_article_rp as b on zar_art_id=art_id', ['art_id', 'b.*'], ' and zar_read_total != zar_read_run and zar_read_total > 0 and art_status=1 order by zar_read_total desc');
		$artArr = $res['data'];
		$sfiled = [
			'10'=> 600,
			'60'=> 3600,
			'120'=> 7200,
			'1day'=> 3600*24,
			'2day'=> 3600*24*2,
			'3day'=> 3600*24*3
		];
		foreach($artArr as $art)
		{
			$artId = $art['art_id'];
			$runArr = json_decode($art['zar_read_json'], true);
			$newTag = true;
			if(!empty($runArr))
			{
				if($runArr['zar_read_etime'] == $art['zar_read_etime'] && $runArr['zar_read_total'] == $art['zar_read_total'])
				{
					$newTag = false;
				}
				else if($runArr['zar_read_total'] == $art['zar_read_total'])
				{
					//数量一样，比例是否重新调整
					$change = false;
					foreach($sfiled as $sk=>$sv)
					{
						if($runArr['zar_read_'.$sk] != $art['zar_read_'.$sk])
						{
							$change = true;
							break;
						}
					}
					$newTag = $change ? true : false;
				}
			}
			
			//任务发生变化重新开始
			if($newTag)
			{
				$art['zar_read_run'] = 0;
				$runArr = [
					'zar_read_etime'=>$art['zar_read_etime'],
					'zar_read_total'=>$art['zar_read_total'],
					'run_btime'=>time(),
				];
				foreach($sfiled as $sk=>$sv)
				{
					$runArr['zar_read_'.$sk] = $art['zar_read_'.$sk];
				}
			}

			$runArr['run_btime'] = empty($runArr['run_btime'])? time(): $runArr['run_btime'];
			//已执行时间
			$passTime = time()-$runArr['run_btime'];
			
			//需要执行第几步
			$step = null;
			$toRate = 0.00;
			foreach($sfiled as $sk=>$stime)
			{
				$toRate += $art['zar_read_'.$sk];
				if($passTime < $stime)
				{
					$step = $sk;
					break;
				}
			}
			
			//比例设置有问题
			if($toRate > 1) continue;

			$toCount = ceil($art['zar_read_total'] * $toRate);
			$oddCount = $toCount - $art['zar_read_run'];
			if($oddCount < 1) continue;
			
			$oddTime = ($sfiled[$step] + $runArr['run_btime']) - time();
		
			if($oddTime > $oddCount)
			{
				//N秒刷一个
				$addCount = 1;
				$perTime = round($oddTime / $oddCount);
				$perTime = $perTime < 1 ? 1: $perTime;
				$randTime = rand(ceil($perTime*0.8), ceil($perTime*1.5));
				$randTime = $randTime < 1? 2: $randTime;
			}
			else
			{
				//一秒钟刷N个
				$addCount = round($oddCount /$oddTime);
				$randTime = 1;
				$addCount = rand(ceil($addCount*0.8), ceil($addCount*1.5));
			}

			//第一次刷 或者已经到指定时间
			if(empty($runArr['run_last_time']) || (time() - $runArr['run_last_time']) > $randTime)
			{
				$this->PjlDb->Begin();
				//echo $artId, '=>步骤', $step, '=>余数', $oddCount, '=>间隔', $perTime, '=>随机', $randTime,'=>刷', $addCount, '<br>';
				$this->set('zx_article', ['art_read3'=>'#@art_read3+'.$addCount], ' and art_id = '.$artId);
				$runArr['run_last_time'] = time();
				$runArr['zar_read_run'] = $art['zar_read_run']+$addCount;
				$this->set('zx_article_rp', ['zar_read_run'=>$runArr['zar_read_run'], 'zar_read_json'=>json_encode($runArr)], ' and zar_art_id = '.$artId);
				$this->PjlDb->End();
			}
		}
		return LibFc::ReturnData(true);
	}
	

	//跑街令资讯 点赞数
	function zxArticlePraise()
	{
		$H = date('H');
		//阅读量的千分之1-2
		$where = ' and art_praise3 < round((art_read+art_read2+art_read3)*art_praise3_w/1000) and art_praise3_w > 0 and art_status=1';
		$res = $this->get('zx_article', ['art_id', 'art_praise3_w', 'art_praise3'], $where);
		$artArr = $res['data'];
		if(!empty($artArr))
		{
			$runFile = mvc::$cfg['AUTOLOAD']['Pjl']['path'].'cache/artPraise.php';
			$runArr = file_exists($runFile)? include($runFile): [];
			foreach($artArr as $k=>$v)
			{
				$randTime = $H >= 8 && $H < 22? rand(50, 100) : rand(600, 1200);
				if(empty($runArr[$v['art_id']]) || (time() - $runArr[$v['art_id']]) > $randTime)
				{
					$this->set('zx_article', ['art_praise3'=>'#@art_praise3+1'], ' and art_id = '.$v['art_id']);
					$runArr[$v['art_id']] = time();
				}
			}
			if(is_array($runArr))
				LibFc::ArraySave($runArr, $runFile);
		}
		return LibFc::ReturnData(true);
	}
}