|  | @@ -3,9 +3,15 @@
 | 
	
		
			
				|  |  |  namespace app\admin\controller\egg;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  use app\common\controller\Backend;
 | 
	
		
			
				|  |  | +use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
 | 
	
		
			
				|  |  | +use PhpOffice\PhpSpreadsheet\Reader\Csv;
 | 
	
		
			
				|  |  | +use PhpOffice\PhpSpreadsheet\Reader\Xls;
 | 
	
		
			
				|  |  | +use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
 | 
	
		
			
				|  |  | +use think\Exception;
 | 
	
		
			
				|  |  | +use think\exception\PDOException;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  | - * 
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * @icon fa fa-circle-o
 | 
	
		
			
				|  |  |   */
 | 
	
	
		
			
				|  | @@ -27,7 +33,100 @@ class Gift extends Backend
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public function import()
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        parent::import();
 | 
	
		
			
				|  |  | +        $file = $this->request->request('file');
 | 
	
		
			
				|  |  | +        if (!$file) {
 | 
	
		
			
				|  |  | +            $this->error(__('Parameter %s can not be empty', 'file'));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
 | 
	
		
			
				|  |  | +        if (!is_file($filePath)) {
 | 
	
		
			
				|  |  | +            $this->error(__('No results were found'));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //实例化reader
 | 
	
		
			
				|  |  | +        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
 | 
	
		
			
				|  |  | +        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
 | 
	
		
			
				|  |  | +            $this->error(__('Unknown data format'));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if ($ext === 'csv') {
 | 
	
		
			
				|  |  | +            $file = fopen($filePath, 'r');
 | 
	
		
			
				|  |  | +            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
 | 
	
		
			
				|  |  | +            $fp = fopen($filePath, "w");
 | 
	
		
			
				|  |  | +            $n = 0;
 | 
	
		
			
				|  |  | +            while ($line = fgets($file)) {
 | 
	
		
			
				|  |  | +                $line = rtrim($line, "\n\r\0");
 | 
	
		
			
				|  |  | +                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
 | 
	
		
			
				|  |  | +                if ($encoding != 'utf-8') {
 | 
	
		
			
				|  |  | +                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if ($n == 0 || preg_match('/^".*"$/', $line)) {
 | 
	
		
			
				|  |  | +                    fwrite($fp, $line . "\n");
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                $n++;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            fclose($file) || fclose($fp);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            $reader = new Csv();
 | 
	
		
			
				|  |  | +        } elseif ($ext === 'xls') {
 | 
	
		
			
				|  |  | +            $reader = new Xls();
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            $reader = new Xlsx();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //加载文件
 | 
	
		
			
				|  |  | +        $insert = [];
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            if (!$PHPExcel = $reader->load($filePath)) {
 | 
	
		
			
				|  |  | +                $this->error(__('Unknown data format'));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
 | 
	
		
			
				|  |  | +            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
 | 
	
		
			
				|  |  | +            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
 | 
	
		
			
				|  |  | +            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 获取奖池礼物表最后一条记录的ID
 | 
	
		
			
				|  |  | +            $lastId = $this->model->order('id','desc')->value('id');
 | 
	
		
			
				|  |  | +            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
 | 
	
		
			
				|  |  | +                $values = [];
 | 
	
		
			
				|  |  | +                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
 | 
	
		
			
				|  |  | +                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
 | 
	
		
			
				|  |  | +                    $values[] = is_null($val) ? '' : $val;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                $giftInfo = \app\admin\model\gift\Gift::get($values[1]);
 | 
	
		
			
				|  |  | +                if(!$giftInfo) $this->error('礼物ID:'.$values[1].'未找到对应礼物');
 | 
	
		
			
				|  |  | +                for ($i = 0;$i<$values[2];$i++){
 | 
	
		
			
				|  |  | +                    $insert[] = [
 | 
	
		
			
				|  |  | +                        'Jackpot_id' => $values[0],
 | 
	
		
			
				|  |  | +                        'gift_id' => $values[1],
 | 
	
		
			
				|  |  | +                        'image' => $giftInfo['image'],
 | 
	
		
			
				|  |  | +                        'special' => $giftInfo['special'],
 | 
	
		
			
				|  |  | +                        'gift_name' => $giftInfo['name'],
 | 
	
		
			
				|  |  | +                        'price' => $giftInfo['price'],
 | 
	
		
			
				|  |  | +                        'prize_no' => ++$lastId
 | 
	
		
			
				|  |  | +                    ];
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } catch (Exception $exception) {
 | 
	
		
			
				|  |  | +            $this->error($exception->getMessage());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!$insert) {
 | 
	
		
			
				|  |  | +            $this->error(__('No rows were updated'));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            $this->model->saveAll($insert);
 | 
	
		
			
				|  |  | +        } catch (PDOException $exception) {
 | 
	
		
			
				|  |  | +            $msg = $exception->getMessage();
 | 
	
		
			
				|  |  | +            if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) {
 | 
	
		
			
				|  |  | +                $msg = "导入失败,包含【{$matches[1]}】的记录已存在";
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            $this->error($msg);
 | 
	
		
			
				|  |  | +        } catch (Exception $e) {
 | 
	
		
			
				|  |  | +            $this->error($e->getMessage());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        $this->success();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 |