260 lines
6.2 KiB
PHP
260 lines
6.2 KiB
PHP
<?php
|
|
|
|
namespace app\admin\model\app\exam;
|
|
|
|
use think\Model;
|
|
|
|
|
|
class WarehouseImport extends Model
|
|
{
|
|
|
|
protected $excelSheetNoTypes = ['single','multiple','judge','indefinite','fillblank','essay'];
|
|
|
|
|
|
/**
|
|
* 获取每一行的数据
|
|
* @param $data 题目数据
|
|
* @param $type 题目类型下标
|
|
* @param $groupId 分组ID
|
|
* @return false|mixed|null
|
|
*/
|
|
public function getRowData($data,$typeIndex,$groupId=0){
|
|
$rowData = false;
|
|
|
|
|
|
$type = $this->excelSheetNoTypes[$typeIndex];
|
|
|
|
|
|
if(empty($data[0])){
|
|
return $rowData;
|
|
}
|
|
|
|
switch ($type){
|
|
case 'judge':
|
|
if(count($data) != 3){
|
|
return false;
|
|
}
|
|
if(!in_array($data[1],["错误","正确","错","对"])){
|
|
return false;
|
|
}
|
|
|
|
$rowData = $this->parseJudge($data);
|
|
break;
|
|
case 'single':
|
|
if(count($data) < 13){
|
|
return false;
|
|
}
|
|
//判断是不是字母
|
|
if(!$data[11] || strlen($data[11]) != 1 || !ctype_alpha($data[11])){
|
|
return false;
|
|
}
|
|
$rowData = $this->parseSingle($data);
|
|
break;
|
|
case 'multiple':
|
|
if(count($data) < 13){
|
|
return false;
|
|
}
|
|
|
|
if(!$data[11] || strlen($data[11]) > 10 || !ctype_alpha($data[11])){
|
|
return false;
|
|
}
|
|
$rowData = $this->parseMultiple($data);
|
|
|
|
break;
|
|
case 'indefinite':
|
|
if(count($data) < 13){
|
|
return false;
|
|
}
|
|
|
|
if(!$data[11] || strlen($data[11]) > 10 || !ctype_alpha($data[11])){
|
|
return false;
|
|
}
|
|
$rowData = $this->parseMultiple($data, 'indefinite');
|
|
|
|
break;
|
|
case 'fillblank':
|
|
if(count($data) != 3){
|
|
return false;
|
|
}
|
|
$rowData = $this->parseFillblank($data);
|
|
|
|
break;
|
|
case 'essay':
|
|
if(count($data) != 3){
|
|
return false;
|
|
}
|
|
$rowData = $this->parseEssay($data);
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
return $rowData;
|
|
}
|
|
|
|
|
|
/**
|
|
* 格式化单选题
|
|
* @param $data
|
|
* @return array|false
|
|
*/
|
|
public function parseSingle($data){
|
|
|
|
|
|
$rowData = [
|
|
'type'=>'single',
|
|
'question'=>$data[0],
|
|
'option'=>[],
|
|
'answer'=>0,
|
|
'analysis'=>$data[12]
|
|
];
|
|
|
|
foreach($data as $index => $option){
|
|
if($index > 0 && $index < 11){
|
|
if(!$option){
|
|
break;
|
|
}
|
|
|
|
if($option instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText){
|
|
$option = $option->getPlainText();
|
|
}
|
|
|
|
$rowData['option'][] = $option;
|
|
}
|
|
}
|
|
|
|
|
|
$answer = ord($data[11]) - 65;
|
|
|
|
if($answer < 0 || ($answer > count($rowData['option']) - 1)){
|
|
return false;
|
|
}
|
|
|
|
$rowData['option'] = json_encode($rowData['option'],true);
|
|
$rowData['answer'] = $answer;
|
|
|
|
return $rowData;
|
|
}
|
|
|
|
|
|
/**
|
|
* 解析判断题
|
|
* @param $data
|
|
* @return array
|
|
*/
|
|
public function parseJudge($data){
|
|
$rowData = [
|
|
'type'=>'judge',
|
|
'question'=>$data[0],
|
|
'option'=>json_encode([]),
|
|
'answer'=>'',
|
|
'analysis'=>$data[2]
|
|
];
|
|
|
|
$rowData['answer'] = 1;
|
|
|
|
if(in_array($data[1],["对","正确"])){
|
|
$rowData['answer'] = 0;
|
|
}
|
|
|
|
return $rowData;
|
|
}
|
|
|
|
|
|
/**
|
|
* 解析多选题
|
|
* @param $data
|
|
* @return array|false
|
|
*/
|
|
public function parseMultiple($data, $type = 'multiple'){
|
|
$rowData = [
|
|
'type'=>$type,
|
|
'question'=>$data[0],
|
|
'option'=>[],
|
|
'answer'=>'',
|
|
'analysis'=>$data[12]
|
|
];
|
|
|
|
foreach($data as $index => $option){
|
|
if($index > 0 && $index < 11){
|
|
if(!$option){
|
|
break;
|
|
}
|
|
if($option instanceof \PhpOffice\PhpSpreadsheet\RichText\RichText){
|
|
$option = $option->getPlainText();
|
|
}
|
|
$rowData['option'][] = $option;
|
|
}
|
|
}
|
|
|
|
$answer = [];
|
|
|
|
foreach (str_split($data[11]) as $item){
|
|
$item = ord($item) - 65;
|
|
if($item < 0 || $item > (count($rowData['option']) -1 )){
|
|
return false;
|
|
}
|
|
$answer[] = $item;
|
|
}
|
|
|
|
$rowData['option'] = json_encode($rowData['option'],true);
|
|
|
|
if(count($answer) < 2 || count($answer) > 10){
|
|
return false;
|
|
}
|
|
|
|
$rowData['answer'] = implode(",",$answer);
|
|
|
|
return $rowData;
|
|
}
|
|
|
|
|
|
/**
|
|
* 解析不定项选择题
|
|
* @param $data
|
|
* @return array|false
|
|
*/
|
|
public function parseIndefinite($data){
|
|
return $this->parseMultiple($data, 'indefinite');
|
|
}
|
|
|
|
|
|
/**
|
|
* 解析填空题
|
|
* 格式:题目、各空格答案(空格用"|"分隔,备选答案用","分隔)、解析
|
|
* @param $data
|
|
* @return array
|
|
*/
|
|
public function parseFillblank($data){
|
|
$answers = [];
|
|
$blanks = explode('|', $data[1]);
|
|
foreach($blanks as $blank){
|
|
$answers[] = explode(',', $blank);
|
|
}
|
|
|
|
return [
|
|
'type'=>'fillblank',
|
|
'question'=>$data[0],
|
|
'option'=>json_encode([]),
|
|
'answer'=>json_encode($answers),
|
|
'analysis'=>$data[2]
|
|
];
|
|
}
|
|
|
|
|
|
/**
|
|
* 解析问答题
|
|
* 格式:题目、参考答案、解析
|
|
* @param $data
|
|
* @return array
|
|
*/
|
|
public function parseEssay($data){
|
|
return [
|
|
'type'=>'essay',
|
|
'question'=>$data[0],
|
|
'option'=>json_encode([]),
|
|
'answer'=>$data[1],
|
|
'analysis'=>$data[2]
|
|
];
|
|
}
|
|
} |