<?php
namespace model\import;
use \model;
/**
 * 导入样品图片处理类
 * @package model
 */
class uploadImportSamplePhotoDir 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'=>'',
                    'oddno'=>'',
                    'number'=>'',
                    'outnum'=>'',
                    'fileid'=>'',
                    'ismain'=>false,
                    'error'=>'',
                ];
				if(strpos($item['filename'],'/')==false){
					$hasError = true;
					zip_entry_close($res);
					zip_close($zip);
					$this->files->delete($fileid); //删除上传的压缩包
				}
                $info = explode('/',trim($item['filename']));
				$item['oddno'] = $info[0];
                if(empty($info[1])) continue;//当前为目录
				$path_parts = pathinfo($info[1]);
				$item['number'] = $path_parts['filename'];
				$item['extname'] = strtolower($path_parts['extension']);
                if( !in_array($item['extname'],['jpg','png','gif']) ){
                    $item['error'] .= '图片格式不正确; ';
                    $hasError = true;
                    continue;
                }
                if($item['filesize']>1024 * 1024 * 50){
                    $item['error'] .= '单张图片不允许超过50M; ';
                    $hasError = true;
                }
                $info = preg_split('/[_\^]/',$item['number']);
                $item['number'] = formatNum($info[0]);
                if($item['oddno']!='' && $item['number']!=''){
                    $unqkey = $item['oddno'].'.'.$item['number'];
                    if(isset($cacheIds[$unqkey])){
                        $item['error'] .= '重复的到样号码; ';
                        $hasError = true;
                    }else{
                        $where = [
                            's_oddno'=>$item['oddno'],
                            's_formatnum'=>$item['number'],
                        ];
                        if($item['s_id'] = $sample->getRowByWhere($where,'s_id')){
                            $cacheIds[$unqkey] = $row['s_id'];
                        }
                    }
                }
                if(empty($item['s_id'])){
                    $item['error'] .= '没有找到此对应记录; ';
                    $hasError = true;
                }else{
                   //解压单图
                   $savefilename =  $this->unzipPhotoFile($res, $item, $params);
                   $this->toDatabase($item['s_id'],$savefilename,true,false);

                }
                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']!=''){
                fputcsv($fp, [$item['filename'],$item['error']], ',','"');    	        
    	    }
        }
        
        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;
		
		$savefilename = $absdir.'/'.$filebase.".".$extname;
		
		mkdirs(dirname($savefilename));
		
		$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);
	    return $savefilename;
	}
	
	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 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 = 'importSamplephoto';
		$dir = 'sample/'.date('Ym').'/'.($id % 100);
	    $fileroot = \mvc::$cfg['dir']['files'];
		$absdir = $fileroot.'/'.$dir;
		mkdirs($absdir);
	    //$filebase = guid();
	    //$filebase = md5($filename);
        $extname = end(explode('.',strtolower($filename)));
	    //$savefilename = $absdir .'/'.$filebase.'.'.$extname;
	    
	    //$savefilename = $filename;
		//copy($filename,$savefilename);
		//if($isdel) unlink($filename);
		//$filename = $dir.'/'.$filebase.'.'.$extname;
		
		$tmpA = explode('sample/',$filename);
		$filename = 'sample/'.$tmpA[1];
	    $fileid = $this->files->add(
	            $reqfilename,
	            $savefilename,
	            $dir,
	            $filebase,
	            $extname,
	            'import',
	            'importSamplephoto',
	            null,
	            true
	    );
		$s_photos = $row['s_photos'];
		$photos[] = [
		    'fileid'=>$fileid,
		    'filename'=>$filename
		];
		if($s_photos!=''){
		    $photos = array_merge(json_decode($s_photos,true),$photos);
		}
		$fileids = [];
		foreach($photos as $k=>$photo){
		    $fileid = $photo['fileid'];
		    if(isset($fileids[$fileid])) unset($photos[$k]);
		    $fileids[$fileid] = 1;
		}
		$this->db->update('sample',['s_photos'=>json_encode($photos)],['s_id'=>$id]);
	}
	
}