<?php
namespace model\pro;
class photo extends \model
{
	public $fileroot = '';
	public $image = null;
	public $files = null;
	public function __construct()
    {
		parent::__construct();
		$this->fileroot = \mvc::$cfg['dir']['files'];
		$this->image = make(\lib\image::class,100);
		$this->files = make(\model\files::class);
	}

    /**删除单个图片或文件,虚拟删除
     * @param 
     * @return
     */
	public function toDelete($pid,$fileid)
	{
		$where = [
			'ppic_p_id'=>$pid,
			'ppic_fileid'=>$fileid
		];
        if($pid && $fileid && ($row = $this->db->get('pro_pic','*',$where)) ){
            $ppic_type = $row['ppic_type'];
            if($ppic_type=='init' || $ppic_type == 'beautify' || $ppic_type=='init_back' || $ppic_type == 'beautify_back'){
                $ppic_type = explode('_',$ppic_type)[0].'_del';
                $this->db->begin();
                $this->db->update('pro_pic',['ppic_type'=>$ppic_type,'ppic_state'=>0],$where);
                $this->db->update('files',['file_item'=>$ppic_type],['fileid'=>$fileid]);
                $this->db->end();
            }
        }
		return true;
	}

    /**
     * 通过原始文件名取图片
     * @param int $pid
     * @return array
     */
	function getPicsByFileBase($pid,$filebase){
		$table = 'pro_pic';
		$join['[>]files'] = ['ppic_fileid'=>'fileid'];
		$fields = '*';
		$where = ['ppic_p_id'=>$pid];
		$where['ppic_filebase'] = $filebase;
		$rows = $this->db->select($table,$join,$fields,$where);
		foreach($rows as &$row){
			$row['ismain'] = ($mainpic==$row['ppic_fileid']) ? true : false;
			$row['ischecked'] = ($row['ppic_state']==1) ? true : false;
			$row['filename'] = \mvc::$cfg['path']['files'].'/'. ltrim(str_replace('\\','/',$row['filename']),'/');
			if($row['filetype']=='image'){
				$row['smallfile'] = filenameSize($row['filename'],'small');
				$row['bigfile'] = filenameSize($row['filename'],'bigfile');
			}else{
				$row['smallfile'] = $row['filename'];
				$row['bigfile'] = $row['filename'];
			}
		}
		return $rows;
    }

    /**删除单个图片或文件
     * @param 
     * @return
     */
	public function deleteOne($pid,$fileid)
	{
		$result = '';
		$mainpic = $this->getProMainPhoto($pid);
		$this->db->begin();
		$this->db->delete('pro_pic',['ppic_fileid'=>$fileid]);
		$this->files->delete($fileid);
		$this->db->end();
		if($mainpic['fileid']==$fileid){
			$result = $this->setMainPic($pid,0);
		}
		return $result;
	}

    /**删除产品下所有图片和文件 (未测试)
     * @param 
     * @return
     */
	public function deleteAll($pid)
	{
		$mainpic = $this->getProMainPhoto($pid);
		$fileids = $this->db->select('pro_pic',['[>]files'=>['ppic_fileid'=>'fileid']],'ppic_fileid',['ppic_p_id[>]'=>$pid]);
		$this->files->delete($fileids);
		if($mainpic){
			foreach(['main','tecdoc','catalog_g','catalog_gsp','usa'] as $item){
				$cfg = \mvc::$cfg['upload']['category']['proimage']['items'][$item];
				$dir = $this->fileroot.'/pro/'. $item . '/' . ($pid % 100);
				foreach($cfg['size'] as $key=>$size){
					$dist = $dir.'/'.$pid.$key.'.jpg';
					if(file_exists($dist)){
						unlink($dist);
					}
				}
			}
		}
		$this->db->begin();
		$this->db->delete('pro_pic',['ppic_p_id'=>$pid]);
		$this->db->update('pro',['p_pic'=>0],['p_id'=>$pid]);
		$this->db->end();
	}

    /**审核图片
     * @param 
     * @return
     */
	public function checkPic($pid,$fileid)
	{
	    if($row = $this->db->get('pro_pic','*',['ppic_p_id'=>$pid,'ppic_fileid'=>$fileid]))
	    {
	        //没有审核过
	        if(empty($row['ppic_state'])){
	            //检查图片名称是不是主图
        		if(strpos($row['ppic_filebase'],'_')===false){
    	            $has = false;
    	            if($row['ppic_type']=='init'){
    	                //查精修图有没有主图
    	                $has = $this->db->has('pro_pic',['ppic_p_id'=>$pid,'ppic_type'=>'beautify','ppic_filebase'=>$row['ppic_filebase']]);
    	            }
    	            if(!$has){
            		    $pro = new \model\pro\pro();
                        $proRow = $pro->getRowByKey($pid);
                        //文件名等于GSP型号, 设置主图
                        if(strtolower($row['ppic_filebase']) == strtolower($proRow['p_outnum'])){
                            $this->setMainPic($pid,$fileid);
                        }
    	            }
        		}
        		$data = [
        		    'ppic_state'=>1,
        		    'check_user'=>getOpuser(),
        		    'check_time'=>getNowTime(),
        		    'update_time'=>getNowTime()
        		];
        		$this->db->begin();
        		$this->db->update('pro_pic',$data,['ppic_p_id'=>$pid,'ppic_fileid'=>$fileid]);
        		if($row['ppic_type']=='init'){
        		    $this->checkPicTask($pid);
        		}
        		//查询是否有同名退回
        		if( $backRow = $this->db->get('pro_pic','*',
        		    [
        		        'ppic_p_id'=>$pid,
        		        'ppic_type'=>$row['ppic_type'].'_back',
        		        'ppic_filebase'=>$row['ppic_filebase']
        		    ]
        		)){
        		    //删除同名退回
        		    $this->deleteOne($backRow['ppic_p_id'],$backRow['ppic_fileid']);
        		}
        		$this->db->end();
	        }
	    }
	}


    /**
     * 退回
     * @return
     */
    public function back($pid,$fileid)
    {
		$where = [
			'ppic_p_id'=>$pid,
			'ppic_fileid'=>$fileid
		];
        if($pid && $fileid && ($row = $this->db->get('pro_pic','*',$where)) ){
            $ppic_type = $row['ppic_type'];
            if($ppic_type=='init' || $ppic_type == 'beautify'){
                $this->db->begin();
                $ppic_type = $ppic_type.'_back';
                if($delRow = $this->db->get('pro_pic','*',
                    [
                        'ppic_p_id'=>$pid,
                        'ppic_type'=>$ppic_type,
                        'ppic_filebase'=>$row['ppic_filebase']
                    ]))
                {
                    //如果之前已经有一张退回图则删除之前的退回图
                    $this->deleteOne($delRow['ppic_p_id'],$delRow['ppic_fileid']);
                }
                $this->db->update('pro_pic',['ppic_type'=>$ppic_type,'ppic_state'=>0],$where);
                $this->db->update('files',['file_item'=>$ppic_type],['fileid'=>$fileid]);
                if($ppic_type=='init'){
                    $this->backPicTask($pid); //修改任务
                }
                $this->db->end();
            }
        }
    }

    /**清空图片记录
     * @param 
     * @return
     */
	public function clear()
	{
		$this->db->begin();
		$this->db->update('pro',['p_pic'=>''],['p_id[>]'=>0]);
		$this->db->delete('pro_pic',['ppic_p_id[>]'=>0]);
		$this->db->delete('files',['fileid[>]'=>0]);
		$this->db->end();
	}

    /**设置产品主图片
     * @param 
     * @return
     */
	public function setMainPic($pid,$fileid)
	{
		if($fileid==0){
			$where = [
				'ppic_p_id'=>$pid,
				'ppic_type'=>['init','beautify'],
				'ORDER'=>[
					'ppic_type'=> 'DESC',
					'ppic_sort'=> 'ASC'
				]
			];
			$fileid = $this->db->get('pro_pic','ppic_fileid',$where);
			if(empty($fileid)) $fileid = 0;
		}
		$this->db->update('pro',['p_pic'=>$fileid],['p_id'=>$pid]);
		if($fileid>0){
			$mainpic = $this->getProMainPhoto($pid);
			if($mainpic){
				$filename = $mainpic['absfilename'];
				foreach(['main','tecdoc','catalog_g','catalog_gsp','usa'] as $item){
					$cfg = \mvc::$cfg['upload']['category']['proimage']['items'][$item];
					$dir = $this->fileroot.'/pro/'. $item . '/' . ($pid % 100);
					mkdirs($dir);
					foreach($cfg['size'] as $key=>$size){
						$dist = $dir.'/'.$pid.$key.'.jpg';
						$watermark = \mvc::$cfg['dir']['static'].'/images/watermark/pro/'.$item.'.png';
						if(file_exists($watermark)){
							$this->image->ResizeWatermark($filename,$dist,$size[0],$size[1],$watermark);
						}else{
							$this->image->Resize($filename,$dist,$size[0],$size[1]);
						}
					}
				}
			}
		}
		return $fileid;
	}



    /**检测上传
     * @param 
     * @return
     */
	public function uploadCheck($filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params)
	{
		$pid = $params['pid'];
		if(empty($pid)) {
			throw new \Exception ( '上传产品图片时，产品ID丢失' );
		}
		$cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
		$count = $this->db->count('pro_pic',['ppic_p_id'=>$pid,'ppic_type'=>$item]);
		if( ($count+1) > $cfg['maxfile']){
			return lg('超出此项的最大允许的文件数量') .','. lg('最大允许').' '.$cfg['maxfile'].' '.lg('个文件');
		}else{
			return true;
		}
	}


    /**接收上传的图片处理
     * @param 
     * @return
     */
	public function uploadGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params)
	{
		$pid = $params['pid'];
		if(empty($pid)) {
			throw new \Exception ( '上传产品图片时，产品ID丢失' );
		}
		if($item=='beautify' || $item=='init'){
			$state = 0;
		}else{
			$state = 1;
		}
		$oldfilename = strtolower(basename($params['reqfilename']));
		$oldfilename = substr($oldfilename,0,strrpos($oldfilename,'.'));
		$data = [
			'ppic_p_id'=> $pid,
			'ppic_fileid'=> $fileid,
			'ppic_state'=> $state,
			'ppic_type'=> $item,
			'ppic_filebase'=> $oldfilename,
			'opuser'=> getOpuser(),
			'create_time'=> getNowTime(),
			'update_time'=> getNowTime()
		];
		$this->db->replace('pro_pic',$data,['ppic_p_id','ppic_fileid'],['create_time']);
        $this->submitPicTask($pid); //完成上传原始图任务
	}

    /**取产品主图片
     * @param 
     * @return
     */
	public function getProMainPhoto($pid)
	{
		$mainPicId = $this->db->get('pro','p_pic',['p_id'=>$pid]);
		if($mainPicId){
			$mainPicFilename = $this->files->getFilename($mainPicId);
			if($mainPicFilename && file_exists($this->fileroot.'/'.ltrim($mainPicFilename,'/')) ){
				return ['fileid'=>$mainPicId,'filename'=> ltrim($mainPicFilename,'/'),'absfilename'=> $this->fileroot.'/'.ltrim($mainPicFilename,'/')];
			}else{
				return false;
			}
		}else{
			return false;
		}
	}

    /**
     * 生成拍照清单
     * @param string $begin 开始日期
     * @param string $end 结束日期
     * @return mixed
     */
    public function createPicTask($begin,$end)
    {
        $where = [
            'OrderDate[<>]'=>[$begin,$end],
            'RAW1'=> raw(" not exists(select 1 from pro_pic_task where ppt_outnum = OrderGspNewNo limit 1)"),
            'RAW2'=> raw(" not exists(select 1 from pro_pic where ppic_type='init' and ppic_outnum = OrderGspNewNo limit 1)"),
            'ORDER'=>['OrderDate'=>'DESC'],
       ];
        $rows = $this->db->select('gsp_new_saledataall_bi','*',$where);
        $pro = new \model\pro\pro();
        $proPicTask = new \model\proPicTask();
        $date = getNowDate();
        $now = getNowTime();
        
        foreach ($rows as $row){
            if(empty($row['OrderGspNewNo']))
                continue;
            $remark = '';
            $proRow = $pro->getRowByFieldValue('p_outnum',$row['OrderGspNewNo'],'p_id');
            if($proRow){
               $proRow = $pro->formatRow($proRow);
            }else{
                continue;
            }
            $data = [
                'ppt_p_id'=>$proRow['p_id'],
                'ppt_outnum'=>$row['OrderGspNewNo'],
                'ppt_innum'=>$proRow['p_innum'],
                'ppt_catebig'=>$proRow['captions']['p_bigcate'],
                'ppt_catename'=>$proRow['captions']['p_cate'],
                'ppt_cate'=>$proRow['p_cate'],
                'ppt_orderno'=>$row['OrderNo'],
                'ppt_senddate'=>$row['DeliveryDateByItem'],
                //'ppt_orderid'=>$row['Id'],
                'ppt_remark'=>$remark,
                //'ppt_submit_user'=>getOpuser(),
                //'ppt_submit_time'=>$date,
                'create_time'=>$now,
                'update_time'=>$now,
            ];
            $proPicTask->replaceRow($data,'ppt_outnum');
        }
    }

    /**
     * 添加产品到拍照清单
     * @param string $begin 开始日期
     * @param string $end 结束日期
     * @return mixed
     */
    public function addPicTask($p_id)
    {
        $pro = new \model\pro\pro();
        $proRow = $pro->getRowByKey($p_id);
        $proPicTask = new \model\proPicTask();
        $date = getNowDate();
        $now = getNowTime();
        if($proRow){
           $proRow = $pro->formatRow($proRow);
        }else{
           $proRow = [
               'p_id' => 0,
               'p_cate' => 0,
               'captions' => ['p_bigcate'=>'','p_cate'=>''],
           ];
           return ['error'=>false, 'type'=> 'notfound', 'outnum'=>$proRow['p_outnum']];
        }
        $has = $this->db->has('pro_pic_task',['ppt_outnum'=>$proRow['p_outnum']]);
        if($has){
            return ['error'=>true, 'type'=> 'has', 'outnum'=>$proRow['p_outnum']];
        }else{
            $data = [
                'ppt_p_id'=>$proRow['p_id'],
                'ppt_outnum'=>$proRow['p_outnum'],
                'ppt_innum'=>$proRow['p_innum'],
                'ppt_catebig'=>$proRow['captions']['p_bigcate'],
                'ppt_catename'=>$proRow['captions']['p_cate'],
                'ppt_cate'=>$proRow['p_cate'],
                'ppt_orderno'=>'',
                'ppt_orderid'=>0,
                'ppt_remark'=>$remark,
                'ppt_submit_user'=>null,
                'ppt_submit_time'=>null,
                'create_time'=>$now,
                'update_time'=>$now,
            ];
            $result = $proPicTask->replaceRow($data,'ppt_outnum');
            return ['error'=>false,'type'=> $result, 'outnum'=>$proRow['p_outnum']];
        }
    }

    /**
     * 任务 - 完成上传原始图
     * @param string $p_id
     * @return mixed
     */
    public function submitPicTask($p_id)
    {
        $date = getNowDate();
        $now = getNowTime();
        $data = [
            'ppt_submit_user'=>getOpuser(),
            'ppt_submit_time'=>$date,
            'update_time'=>$now,
        ];
        $this->db->update('pro_pic_task',$data,['ppt_p_id'=>$p_id]);
    }

    /**
     * 任务 - 退回
     * @param string $p_id
     * @return mixed
     */
    public function backPicTask($p_id)
    {
        $date = getNowDate();
        $now = getNowTime();
        $data = [
            'ppt_back_user'=>getOpuser(),
            'ppt_back_time'=>$date,
            'update_time'=>$now,
        ];
        $this->db->update('pro_pic_task',$data,['ppt_p_id'=>$p_id]);
    }

    /**
     * 任务 - 审核
     * @param string $p_id
     * @return mixed
     */
    public function checkPicTask($p_id)
    {
        $date = getNowDate();
        $now = getNowTime();
        $data = [
            'ppt_check_user'=>getOpuser(),
            'ppt_check_time'=>$date,
            'update_time'=>$now,
        ];
        $this->db->update('pro_pic_task',$data,['ppt_p_id'=>$p_id]);
    }

    /**
     * 批量-操作
	 * @param string $cmd 命令 check,remove-back,remove-nocheck,remove-check,remove-all,delete,delete-nocheck
	 * @param string $pids ID集合
	 * @param string $propicType 图片类型, 'init','init_back','init_del','beautify','beautify_back','beautify_del'
	 * @param string $opcode 操作码
	 * @return string
     */
    public function lot($cmd, $pids, $propicType, $opcode)
    {
        if(empty($cmd) || empty($pids) || empty($propicType) || empty($opcode) ){
            return false;
        }
        if($cmd=='check'){
            $type = $propicType;
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids,'ppic_type'=>$type])){
                foreach ($rows as $row){
                    $this->checkPic($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }else if($cmd=='remove-back'){
            if($propicType=='init' || $propicType=='beautify'){
               $type = $propicType.'_back';
            } 
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids,'ppic_type'=>$type])){
                foreach ($rows as $row){
                    $this->toDelete($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }else if($cmd=='remove-nocheck'){
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids,'ppic_state'=>0])){
                foreach ($rows as $row){
                    $this->toDelete($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }else if($cmd=='remove-check'){
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids,'ppic_state'=>1])){
                foreach ($rows as $row){
                    $this->toDelete($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }else if($cmd=='remove-all'){
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids])){
                foreach ($rows as $row){
                    $this->toDelete($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }else if($cmd=='delete'){
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids,'ppic_type'=>['init_del','beautify_del']])){
                foreach ($rows as $row){
                    $this->deleteOne($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }else if($cmd=='delete-nocheck'){
            if($rows = $this->db->select('pro_pic','*',['ppic_p_id'=>$pids,'ppic_state'=>0,'ppic_type'=>['init_del','beautify_del']])){
                foreach ($rows as $row){
                    $this->deleteOne($row['ppic_p_id'],$row['ppic_fileid']);
                }
            }
        }
        //dd($rows,$cmd, $pids, $propicType, $opcode);
        return true;
    }
    
    
}