<?php
namespace model\import;
use \model;
/**
 * 导入样品图片处理类
 * @package model
 */
class uploadImportSamplePhoto extends model
{

    public $sample;
    public $files;
    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->files = makeOne(model\files::class);
		$this->sample = makeOne(model\sample\sample::class);
	    $this->cacheIds = [];
	}

	 /**检测上传
     * @param 
     * @return
     */
	public function uploadCheck($filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params)
	{
		$cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
		if(!in_array($extname,$cfg['type'])){
		    return lg('仅支持'). implode(',',$cfg['type']);
		}
		return true;
	}


    /**接收上传的图片处理
     * @param 
     * @return  $params ['save'=>0表示不变更数据]
     */
	public function uploadGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params)
	{
		ini_set('memory_limit', \mvc::$cfg['upload']['memory_limit']);
		set_time_limit(0);
		ignore_user_abort(true);
		
		$sample = makeOne(model\sample\sample::class);
		$hasError = false;
		$files = [];
		$zip = zip_open($filename);
		$i=-1;
		$cacheIds = [];
        while ($res = zip_read($zip)){
            if (zip_entry_open($zip,$res)) {
                $i++;
                $item = [
                    'index'=> $i,
                    'filename'=> trim(zip_entry_name($res)),
                    'filesize'=>zip_entry_filesize($res),
                    'extname'=>'',
                    'p_id'=>'',
                    'outnum'=>'',
                    'fileid'=>'',
                    'ismain'=>false,
                    'error'=>'',
                ];
                $info = explode('.',strtolower($item['filename']));
                $extname = end($info);
                $item['extname'] = $extname;
                if( !in_array(end($info),['jpg','png','gif']) ){
                    $item['error'] .= '图片格式不正确; ';
                    $hasError = true;
                    continue;
                }
                if($item['filesize']>1024 * 1024 * 50){
                    $item['error'] .= '单张图片不允许超过50M; ';
                    $hasError = true;
                }
                $info = preg_split('/[_\^]/',$info[0]);
                //$info = explode('_',$info[0]);
                $item['number'] = formatNum($info[0]);
                if($item['number']!=''){
                    if(isset($cacheIds[$item['number']])){
                        $item['error'] .= '重复的到样号码; ';
                        $hasError = true;
                    }else{
                        if($row = $sample->getRowByFieldValue('s_formatnum',$item['number'],['s_id'])){
                            $item['s_id'] = $row['s_id'];
                            $cacheIds[$item['number']] = $row['s_id'];
                        }
                    }
                }
                if(empty($item['s_id'])){
                    $item['error'] .= '没有找到此GSP型号; ';
                    $hasError = true;
                }else{
                   //解压单图
                   $errToDatabase =  $this->unzipPhotoFile($res, $item, $params);
                   if($errToDatabase != ''){
                        $item['error'] .= $errToDatabase;
                        $hasError = true;
                   }
                }
                zip_entry_close($res);
                array_push($files,$item);
            }
        }
        zip_close($zip);
        $this->files->delete($fileid); //删除上传的压缩包
        usort($files,function($a, $b){
            return strcmp($a['filename'], $b['filename']);
        });
        
        $logpath = 'import/'.date('Ym');
        $logfilename = 'log'.guid().'.csv';
        $logfile = \mvc::$cfg['dir']['files'].'/'.$logpath.'/'.$logfilename;
        mkdirs(\mvc::$cfg['dir']['files'].'/'.$logpath);
        
        $fp = fopen($logfile, 'w'); //记录日志
	    $options = \mvc::$cfg['upload'];
		$optionItems = $options['category'][$category]['items'];
        foreach($files as &$item){
    	    //入文件库
    	    if($item['error']==''){
        	    $item['fileid'] = $this->files->add(
        	            $item['filename'],
        	            $item['file']['savefilename'],
        	            $item['file']['dir'],
        	            $item['file']['filebase'],
        	            $item['file']['extname'],
        	            $item['file']['category'],
        	            $item['file']['item'],
        	            null,
        	            true
        	    );
    	    }else{
                fputcsv($fp, [$item['filename'],$item['error']], ',','"');    	        
    	    }
    	    
            if(!empty($item['fileid'])){
        		//如果配置要转jpg,则扩展名为jpg
        		$extname = $item['file']['extname'];
        	    if(isset($optionItems[$params['item']]['tojpeg']) &&  $optionItems[$params['item']]['tojpeg']) 
        	        $extname = 'jpg';
                //入产品图片库
                $params['pid'] = $item['p_id'];
                $params['reqfilename'] = $item['file']['savefilename'];
                /*
    	        $this->photo->uploadGet(
    	            $item['fileid'],
    	            $item['file']['savefilename'],
    	            $item['file']['dir'],
    	            $item['file']['filebase'],
    	            $extname,
    	            $item['file']['category'],
    	            $item['file']['item'],
    	            $params
    	        );*/
            }
        }
        
        if($hasError==false){
            fputcsv($fp, ['样品图片均已导入'], ',','"');    
        }
        fclose($fp);
        
        //消息记录与在线提醒
        $t = explode('/import/',$obj->import->outfilename);
        $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 $files;
	}
	


    /**
     * 图片解压
     * @return string //如果有错误，则返回错误文本
     */
	public function unzipPhotoFile($res, &$item, $params)
	{
	    $fileroot = \mvc::$cfg['dir']['files'];
	    $filebase = substr($item['filename'],0,strrpos($item['filename'],'.'));
	    $extname = $item['extname'];
	    $category = 'sample';
		$dir = 'sample/'.date('Ym');
		$absdir = $fileroot.'/'.$dir;
		mkdirs($absdir);
		
		$savefilename = $absdir.'/'.$filebase.".".$extname;
		$item['file']['category'] = $category;
		$item['file']['item'] = $params['item'];
		$item['file']['dir'] = $dir;
		$item['file']['filebase'] = $filebase;
		$item['file']['extname'] = $extname;
		$item['file']['savefilename'] = $savefilename;
	    
	    //存放图片
	    $contents = zip_entry_read($res,$item['filesize']);
	    file_put_contents($savefilename,$contents);
	}
	
	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,$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 = zip_open($zipfile);
        while ($res = zip_read($zip)){
            if (zip_entry_open($zip,$res)) {
                $filename = trim(zip_entry_name($res));
                $filesize = zip_entry_filesize($res);
                $savefilename = $dir.'/'.$this->filenameEncode($filename);
                $contents = zip_entry_read($res,$filesize);
                file_put_contents($savefilename,$contents);
                zip_entry_close($res);
            }
        }
		zip_close($zip);
		return $dir;
	}
	
	
	public function checkFile($filename,$base64=false){
	    if($base64){
            $info = explode('.',strtolower($this->filenameDecode(basename($filename))));
	    }else{
            $info = explode('.',strtolower(basename($filename)));
	    }
        $extname = end($info);
        $item['extname'] = $extname;
        if( !in_array(end($info),['jpg','jpeg','png','gif']) ){
            return [false, '图片格式不正确'];
        }
        if(filesize($filename) > 1024 * 1024 * 50){
            return [false, '单张图片不允许超过50M'];
        }
        $number = preg_split('/[_]/',$info[0])[0];
        $numberFormat = formatNum($number);
        if($numberFormat!=''){
            if(strlen($numberFormat)==12 && is_numeric($numberFormat) && substr($numberFormat,0,2)=='20'){
                //流水号
                if(isset($this->cacheIds[$numberFormat])){
                    return [true,$this->cacheIds[$numberFormat]];
                }else{
                    if($row = $this->sample->getRowByFieldValue('s_plmseq',$numberFormat,['s_id'])){
                        if($row['s_photos']!=''){
                            return [false, '样品存在图片'];
                        }
                        $id = $row['s_id'];
                        $this->cacheIds[$numberFormat] = $id;
                    }
                }
            }else{
                //到样号码
                $count = $this->db->count('sample',['s_formatnum'=>$numberFormat]);
                if($count>1){
                    return [false, '到样号码存在多条记录'];
                }
                if(isset($this->cacheIds[$numberFormat])){
                    return [true,$this->cacheIds[$numberFormat]];
                }else{
                    if($row = $this->sample->getRowByFieldValue('s_formatnum',$numberFormat,['s_id'])){
                        if($row['s_photos']!=''){
                            return [false, '样品存在图片'];
                        }
                        $id = $row['s_id'];
                        $this->cacheIds[$numberFormat] = $id;
                    }
                }
            }
        }
        if(empty($id)){
            return [false, '没有找到此到样号码['.$number.']'];
        }
        return [true,$id];
	}
	
	
	public function importZip($zipfile,$isdel=true){
	    if(!file_exists($zipfile)){
	        return [false,'导入压缩包不存在'];
	    }
		$dir = $this->unZip($zipfile);
		if($dir){
		    $res = $this->importDir($dir,$isdel,true);
		    unlink($dir);
		    if($isdel){
		        unlink($zipfile);
		    }
		    return $res;
		}
	}
	
	public function importDir($dir,$isdel=false,$base64=false){
	    if(!is_dir($dir)){
	        return [false,'导入目录不存在'];
	    }
	    $files = scandir($dir);
	    foreach($files as $i=>$filename){
	        if($filename=='.' || $filename=='..')
	            unset($files[$i]);
	    }
        usort($files,function($a, $b){
            return strcmp($a, $b);
        });
        
        $logpath = 'import/'.date('Ym');
        $logfilename = 'log'.getOpuser().'SamplePhoto.csv';
        $logfile = \mvc::$cfg['dir']['files'].'/'.$logpath.'/'.$logfilename;
        mkdirs(\mvc::$cfg['dir']['files'].'/'.$logpath);
        
        $this->cacheIds = [];
        $fp = fopen($logfile, 'w'); //记录日志
        foreach($files as $i=>$filename){
            $filename = $dir.'/'.$filename;
            $res = $this->checkFile($filename,$base64);
            if($res[0]){
                $id = $res[1];
                $this->toDatabase($id,$filename,$isdel,$base64);
                fputcsv($fp, [$filename,'']);
            }else{
                fputcsv($fp, [$filename,$res[1]]);
            }
        }
        fclose($fp);
        if($isdel) @rmdir($dir);
        
        //消息记录与在线提醒
        (new \model\user)->toLog('导入','导入样品图片 '.$logfile);
        $t = explode('/import/',$obj->import->outfilename);
        $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 toDatabase($id,$filename,$isdel=true,$base64=true){
	    $reqfilename = basename($filename);
	    if($base64){
	        $reqfilename = $this->filenameDecode($reqfilename,$base64);
	    }
	    if(empty($id) || $filename=='') 
	        return [false,''];
	    $row = $this->sample->getRowByKey($id);
	    if(empty($row)){
	        return [false,''];
	    }
	    $category = 'sample';
		$dir = 'sample/'.date('Ym').'/'.($id % 100);
	    $fileroot = \mvc::$cfg['dir']['files'];
		$absdir = $fileroot.'/'.$dir;
		mkdirs($absdir);
	    $filebase = guid();
        $extname = end(explode('.',strtolower($filename)));
	    $savefilename = $absdir .'/'.$filebase.'.'.$extname;
		copy($filename,$savefilename);
		if($isdel) unlink($filename);
	    $fileid = $this->files->add(
	            $reqfilename,
	            $savefilename,
	            $dir,
	            $filebase,
	            $extname,
	            'sample',
	            'photo',
	            null,
	            true
	    );
		$filename = $dir.'/'.$filebase.'.'.$extname;
		$s_photos = $row['s_photos'];
		$photos = [];
		if($s_photos!='') $photos = json_decode($s_photos);
		$photos[] = [
		    'fileid'=>$fileid,
		    'filename'=>$filename
		];
		$this->db->update('sample',['s_photos'=>json_encode($photos)],['s_id'=>$id]);
	}
	
}