<?php
namespace model\import;
use \model;
use ZipArchive;

/**
 * 导入投诉报告处理类
 * @package model
 */
class uploadImportTousu extends model
{
    public $cacheIds;
	public function __construct()
	{
		ini_set('memory_limit', \mvc::$cfg['upload']['memory_limit']);
		set_time_limit(0);
		ignore_user_abort(true);
		parent::__construct();
	    $this->cacheIds = [];
	}


    /**检测上传
     * @param 
     * @return
     */
	public function uploadCheck($filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params)
	{
		return true;
	}


    /**接收上传的图片处理
     * @param 
     * @return
     */
	public function uploadGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params)
	{
		$res = $this->importZip($filename,true,$params['item']);
		if(!$res[0]){
		    dump($res[1]);
		}
	}

	
	public function filenameEncode($filename){
        $basename = substr(basename($filename),0,strrpos($filename,'.'));
        $extname = substr(basename($filename),strrpos($filename,'.')+1);
	    $result = base64_encode($basename);
	    $result = str_replace("/",'_',$result);
	    return $result.'.'.$extname;
	}
	public function filenameDecode($filename){
        $basename = substr(basename($filename),0,strrpos($filename,'.'));
        $extname = substr(basename($filename),strrpos($filename,'.')+1);
	    $result = str_replace("/",'_',$basename);
	    $result = base64_decode($result);
	    return $result.'.'.$extname;
	}
	
	public function unZip($zipfile,$base64=false,$dir=''){
	    if($zipfile=='' || !file_exists($zipfile)){
	        $this->error = '压缩文件未找到';
	        return false;
	    }
		if($dir==''){
    		$info = pathinfo($zipfile);
    		$dir = $info['dirname'].'/'.str_replace('.'.$info['extension'],'',$info['basename']);
		}
		mkdirs($dir);
		$zip = new ZipArchive;
		if($zip->open($zipfile) === true){
			$folderNum = 1;
			for ($i = 1; $i < $zip->numFiles; $i++) {
				$originfilename = $zip->getNameIndex($i);
                if (substr($originfilename, -1, 1) === '/') {
					$folderNum++;
                    continue;
                }
				
				$filename = basename($originfilename);
				if($base64){
					$savefilename = $dir.'/'.$this->filenameEncode($filename);
				}else{
					$savefilename = $dir.'/'.$filename;
				}
				copy("zip://{$zipfile}#{$originfilename}", $savefilename);
			}
			$zip->close();
			if($folderNum >2)
			{
				$this->error = '压缩目录层级太多了';
				return false;
			}
		}
		
		return $dir;
	}
	
	
	public function checkFile($filename,$base64=true,$type=''){
	    $src = $filename;
		$reqfilename = basename($filename);
	    if($base64){
	        $reqfilename = $this->filenameDecode($reqfilename);
	    }
		
        $info = explode('.',strtolower($reqfilename));
        $extname = end($info);
        $picname = substr(strtolower($reqfilename),0,strlen($extname)*-1-1);
        $item['extname'] = $extname;
        if( !in_array($extname,['doc','docx','pdf']) ){
            return [false, '文件格式不正确'];
        }
        if(filesize($src) > 1024 * 1024 * 50){
            return [false, '文件不允许超过50M'];
        }
		$xiangci = 1;
		$arr = preg_split('/[_]/',$picname);
		$number = $arr[0];
		if(count($arr)>=2)  $xiangci = $arr[1]?$arr[1]:1;
        $id='';
		$pt_p_id  = 0;
        if($number){
			$pt_p_id = $this->db->get('pro','p_id',['p_innum'=>$number]);
			if(empty($pt_p_id)) return [false, '没有找到此内部编码['.$number.']'];
			$where = ['pt_p_id'=>$pt_p_id,'pt_xiangci'=>$xiangci];
			$id = $this->db->get('pro_tousu','pt_id',$where);
        }
		$dir = 'tousu/'.($pt_p_id%100);
	    mkdirs(\mvc::$cfg['dir']['files'].'/'.$dir);
	    $newfilename = \mvc::$cfg['dir']['files'].'/'.$dir.'/'.$reqfilename;
		copy($filename,$newfilename);
		$savefilepath =  '/'.$dir.'/'.$reqfilename;
		//无投诉记录则创建
		if (empty($id)) {
			$curtime = getNowTime();
			$data = [
				'pt_p_id' => $pt_p_id,
				'pt_xiangci' => $xiangci,
				'create_time' => $curtime,
				'update_time' => $curtime,
				'opuser' => getOpuser(),
				'pt_files' => $savefilepath
			];
			$res = $this->db->insert('pro_tousu', $data);
		} else {
			$res = $this->db->update('pro_tousu', ['pt_files' => $savefilepath], ['pt_id' => $id]);
		}
		if(!$res){
	       	return [false,'导入失败,请检测是否是一个有效文件'];
	        @unlink($newfilename);
	    }
        return [true,''];
	}
	
	
	public function importZip($zipfile,$isdel=true,$type=''){
	    if(!file_exists($zipfile)){
	        return [false,'导入压缩包不存在'];
	    }
		$dir = $this->unZip($zipfile,false);

		if($dir){
		    $res = $this->importDir($dir,$isdel,false,$type);
		    rmdirs($dir);
		    if($isdel){
		        unlink($zipfile);
		    }
		    return $res;
		}else{
			unlink($zipfile);
			return [false,$this->error];
		}
	}
	
	public function importDir($dir,$isdel=true,$base64=false,$type=''){
	    if(!is_dir($dir)){
	        return [false,'导入目录不存在'];
	    }
	   
        $logpath = 'import/'.date('Ym');
        $logfilename = 'log'.getOpuser().'tousu'.time().'.csv';
        $logfile = \mvc::$cfg['dir']['files'].'/'.$logpath.'/'.$logfilename;
        mkdirs(\mvc::$cfg['dir']['files'].'/'.$logpath);
        $fp = fopen($logfile, 'w'); //记录日志
        
	    $this->cacheIds = [];
	    $this->scanUploadDir($dir,$type,$fp,$isdel,$base64,false);
        fclose($fp);
        //消息记录与在线提醒
        (new \model\user)->toLog('导入','导入投诉报告 '.$logfile);
        $url = \mvc::$cfg['path']['files'].'/'.$logpath.'/'.$logfilename;
        $msg = [
        	'amsg_title'=> '投诉报告导入完成',
        	'amsg_body'=> '投诉报告导入完成',
        	'amsg_url'=> $url,
        	'amsg_urltitle'=> basename($url),
        ];
        makeOne(\model\message::class)->send([getOpuser()],$msg);
        socketSendMsg([getOpuser()],$msg);
        return [true,''];
	}
	
	public function scanUploadDir($dir,$type,$fp,$isdel,$base64,$isSend){
        $files = scandir($dir);
	    foreach($files as $i=>$filename){
	        if($filename=='.' || $filename=='..'){
	            unset($files[$i]);
	        }else if(is_file($dir.'/'.$filename)){
	            $files[$i] = $dir.'/'.$filename;
	        }
	    }
        
        foreach($files as $i=>$filename){
            $res = $this->checkFile($filename,$base64,$type);
            if($res[0]){
                fputcsv($fp, [$filename,'']);
            }else{
                fputcsv($fp, [$filename,$res[1]]);
            }
        }
	}
}