You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
8.3 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace Admin\Event;
use Think\Controller;
class BatchImportExcelEvent extends Controller{
public function uploadExcel($fileData){
header("Content-Type:text/html;charset=utf-8");
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728;// 设置附件上传大小
$upload->exts = array('xls', 'xlsx');// 设置附件上传类
$upload->rootPath = './Uploads/'; // 设置附件上传目录
$upload->savePath = 'excel/'; // 设置附件上传目录
// 上传文件
$info = $upload->uploadOne($fileData);
$filename = './Uploads/' . $info['savepath'] . $info['savename'];
$exts = $info['ext'];
if (!$info) {// 上传错误提示错误信息
if ($upload->getError() != "非法上传文件!"){
return $upload->getError();
}
} else {// 上传成功
return $info;
}
}
/**
* 导入excel
*/
public function importExcel($file=''){
try{
// 判断文件是什么格式
$type = pathinfo($file);
$type = strtolower($type["extension"]);
ini_set('max_execution_time', '0');
Vendor('PHPExcel.PHPExcel');
// 判断使用哪种格式
switch($type){
case 'xlsx':
$objReader = new \PHPExcel_Reader_Excel2007();
break;
case 'xls':
$objReader = new \PHPExcel_Reader_Excel5();
//$objReader = \PHPExcel_IOFactory::createReader($type);
break;
}
$objPHPExcel = $objReader->load($file);
$sheet = $objPHPExcel->getSheet(0);
// 取得总行数
$highestRow = $sheet->getHighestRow();
// 取得总列数
$highestColumn = $sheet->getHighestColumn();
//循环读取excel文件,读取一条,插入一条
$data=array();
//从第一行开始读取数据
//循环获取表中的数据,$currentRow表示当前行从哪行开始读取数据索引值从0开始
for ($currentRow = 2; $currentRow <= $highestRow; $currentRow++) {
//从哪列开始A表示第一列
for ($currentColumn = 'A'; $currentColumn <= $highestColumn; $currentColumn++) {
//数据坐标
$address = $currentColumn . $currentRow;
$cell = $objPHPExcel->getActiveSheet()->getCell($address);
//读取到的数据,保存到数组$arr中
if($currentColumn == "C"){
$currentvalue = $sheet->getCell($address)->getValue();
if (empty($currentvalue)) {
continue;
unlink($file);
throw new \Exception($address.' 数据为空');
}
if($cell->getDataType() == \PHPExcel_Cell_DataType::TYPE_NUMERIC){
$cellstyleformat=$cell->getStyle($address)->getNumberFormat();
$formatcode=$cellstyleformat->getFormatCode();
if (preg_match('/^([$[A-Z]*-[0-9A-F]*])*[hmsdy]/i', $formatcode)) {
$date = \PHPExcel_Shared_Date::ExcelToPHP($objPHPExcel->getActiveSheet()->getCell($address)->getValue());
$datetime = new \DateTime("@$date"); //DateTime类的bug加入@可以将Unix时间戳作为参数传入
$datetime->setTimezone(new \DateTimeZone('GMT'));
$data[$currentRow][$currentColumn] = $datetime->format("Y-m-d H:i:s");
}else{
unlink($file);
throw new \Exception($address."列 时间格式输入错误");
}
}else{
unlink($file);
throw new \Exception($address."列 时间格式输入错误");
}
}else{
$currentvalue = $sheet->getCell($address)->getValue();
if (empty($currentvalue)) {
continue;
unlink($file);
throw new \Exception($address.' 数据为空');
}
$data[$currentRow][$currentColumn] = $sheet->getCell($address)->getValue();
}
}
}
return $data;
}catch(\Exception $e){
return $e->getMessage();
}
}
/**
* 插入区服数据到数据库
* isnotice 是否是区服预告
*/
public function serverDataInsert($serverData,$url='',$isnotice=false){
if($isnotice){
$serverModel = new \Admin\Model\ServerNoticeModel();
}else{
$serverModel = new \Admin\Model\ServerModel();
}
$sData = [];
$key = 0;
foreach($serverData as $server){
if(!empty($server['A'])){
$gameID[] = $server['A'];
}else{
$this->error("游戏ID不能为空");
}
$key_out = $server['A']."-".$server['B']; //提取内部一维数组的key(name age)作为外部数组的键
if(array_key_exists($key_out,$arr_out)){
$this->error("游戏ID{$server['A']} <{$server['B']}> 游戏区服名称重复");
}
else{
$arr_out[$key_out] = $arr[$k]; //以key_out作为外部数组的键
}
$sData[$key]['game_id'] = $server['A'];
$sData[$key]['game_name'] = get_game_name($server['A']);
$sData[$key]['server_name'] = $server['B'];
$sData[$key]['server_num'] = 0;
$sData[$key]['recommend_status'] = 1;
$sData[$key]['show_status'] = 1;
$sData[$key]['stop_status'] = 0;
$sData[$key]['server_status'] =0;
$sData[$key]['icon'] = 0;
$sData[$key]['start_time'] = strtotime($server['C']);
$sData[$key]['desride'] = '';
$sData[$key]['prompt'] = '';
$sData[$key]['parent_id'] = 0;
$sData[$key]['create_time'] = time();
$sData[$key]['server_version'] = get_sdk_version($server['A']);
$sData[$key]['developers'] = 0;
if(!$serverModel->create($sData[$key])){
switch ($serverModel->getError()) {
case '区服名称不能为空':
$msg = "游戏ID{$server['A']} <{$server['B']}> 区服名称不能为空";
break;
case '区服名称不能超过30个字符':
$msg = "游戏ID{$server['A']} <{$server['B']}> 区服名称不能超过30个字符";
break;
case '同游戏下区服名称已存在':
$msg = "游戏ID{$server['A']} <{$server['B']}> 区服名称重复";
break;
case '开始时间不能为空':
$msg = "游戏ID{$server['A']} <{$server['B']}> 开始时间不能为空";
break;
default:$msg = $serverModel->getError();
}
$this->error($msg);
}
$key++;
}
$gameModel = new \Admin\Model\GameModel();
$gameID = array_unique($gameID);
$map[id] = array('in',$gameID);
$game_id = $gameModel->where($map)->getField('id',true);
if(empty($game_id)){
//$this->error("游戏ID:".implode(',',$gameID).'不存在');
$this->error($this->game_server_error_array($gameID));
}
if(count($gameID) != count($game_id)){
$gameID = array_diff($gameID,$game_id);
///$this->error("游戏ID:".implode(',',$gameID).'不存在');
$this->error($this->game_server_error_array($gameID));
}
$result = $serverModel->addAll($sData);
if($result){
$this->success('导入成功',$url);
}else{
$this->error("导入失败");
}
}
private function game_server_error_array($arr) {
$str = '';
foreach ($arr as $v) {
$str .= 'game_id='.$v.' 数据错误,请重新上传<br/>';
}
return $str;
}
}