You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
10 KiB
270 lines
10 KiB
10 months ago
|
<?php
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | 天诚科技 [ 刘海东 17600099397赋能开发者,助力企业发展 ]
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Copyright (c) 2016~2020 https://www.tczxkj.com All rights reserved.
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Licensed 该系统并不是自由软件,未经许可不能去掉相关版权
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Author:甘肃天诚志信电子商务有限公司 刘海东 联系电话维系17600099397
|
||
|
// +----------------------------------------------------------------------
|
||
|
|
||
|
namespace app\admin\model\questions;
|
||
|
|
||
|
use traits\ModelTrait;
|
||
|
use basic\ModelBasic;
|
||
|
use app\admin\model\questions\QuestionsCategpry as QuestionsCategpryModel;
|
||
|
use service\PhpSpreadsheetService;
|
||
|
use service\SystemConfigService;
|
||
|
use \PhpOffice\PhpSpreadsheet\IOFactory;
|
||
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||
|
|
||
|
/**
|
||
|
* 试题 Model
|
||
|
* Class Questions
|
||
|
* @package app\admin\model\questions
|
||
|
*/
|
||
|
class Questions extends ModelBasic
|
||
|
{
|
||
|
use ModelTrait;
|
||
|
|
||
|
/**条件处理
|
||
|
* @param $where
|
||
|
* @param array $arrays
|
||
|
* @return Questions
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
* @throws \think\exception\DbException
|
||
|
*/
|
||
|
public static function setWhere($where, $arrays = [])
|
||
|
{
|
||
|
$model = self::order('sort desc,add_time desc')->where(['is_del' => 0, 'mer_id' => 0]);
|
||
|
if ($where['type']) $model = $model->where('question_type', $where['type']);
|
||
|
if ($where['pid'] > 0) {
|
||
|
$cate = QuestionsCategpryModel::where('id', $where['pid'])->where(['is_del' => 0, 'mer_id' => 0])->find();
|
||
|
if ($cate['pid'] > 0) {
|
||
|
$model = $model->where('pid', $where['pid']);
|
||
|
} else {
|
||
|
$pids = QuestionsCategpryModel::categoryId($where['pid']);
|
||
|
$model = $model->where('pid', 'in', $pids);
|
||
|
}
|
||
|
}
|
||
|
if ($arrays) $model = $model->where('id', 'not in', $arrays);
|
||
|
if ($where['title'] != '') $model = $model->where('stem', 'like', "%$where[title]%");
|
||
|
return $model;
|
||
|
}
|
||
|
|
||
|
/**试题列表
|
||
|
* @param $where
|
||
|
* @param array $arrays
|
||
|
*/
|
||
|
public static function questionsList($where, $arrays = [])
|
||
|
{
|
||
|
$model = self::setWhere($where, $arrays);
|
||
|
if (isset($where['excel']) && $where['excel'] == 1) {
|
||
|
$data = ($data = $model->field('id,sort,image,option,answer,analysis,number,add_time,is_del,mer_id,question_type,stem,pid,difficulty,is_img')->select()) && count($data) ? $data->toArray() : [];
|
||
|
} else {
|
||
|
$data = ($data = $model->field('id,sort,add_time,is_del,mer_id,question_type,stem,pid,difficulty,is_img')->page((int)$where['page'], (int)$where['limit'])->select()) && count($data) ? $data->toArray() : [];
|
||
|
}
|
||
|
foreach ($data as $key => &$value) {
|
||
|
switch ($value['question_type']) {
|
||
|
case 1:
|
||
|
$value['types'] = '单选题';
|
||
|
break;
|
||
|
case 2:
|
||
|
$value['types'] = '多选题';
|
||
|
break;
|
||
|
case 3:
|
||
|
$value['types'] = '判断题';
|
||
|
break;
|
||
|
}
|
||
|
$value['cate'] = QuestionsCategpryModel::where(['id' => $value['pid'], 'is_del' => 0, 'mer_id' => 0])->value('title');
|
||
|
}
|
||
|
if (isset($where['excel']) && $where['excel'] == 1) {
|
||
|
self::SaveExcel($data);
|
||
|
}
|
||
|
$count = self::setWhere($where, $arrays)->count();
|
||
|
return compact('data', 'count');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 保存并下载excel
|
||
|
* $list array
|
||
|
* return
|
||
|
*/
|
||
|
public static function SaveExcel($list)
|
||
|
{
|
||
|
$export = [];
|
||
|
foreach ($list as $index => $item) {
|
||
|
$export[] = [
|
||
|
$item['id'],
|
||
|
$item['cate'],
|
||
|
$item['stem'],
|
||
|
$item['image'],
|
||
|
$item['types'],
|
||
|
$item['option'],
|
||
|
$item['answer'],
|
||
|
$item['difficulty'],
|
||
|
$item['analysis'],
|
||
|
$item['number'],
|
||
|
$item['add_time'] > 0 ? date('Y/m/d H:i', $item['add_time']) : '无'
|
||
|
];
|
||
|
}
|
||
|
$filename = '试题列表' . time() . '.xlsx';
|
||
|
$head = ['编号', '分类', '题干', '配图', '提型', '选项', '答案', '难度', '答案解析', '答题人数', '添加时间'];
|
||
|
PhpSpreadsheetService::outdata($filename, $export, $head);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 下载试题导入文件
|
||
|
*/
|
||
|
public static function getExcel()
|
||
|
{
|
||
|
$filename = 'template.xlsx'; //获取文件名称
|
||
|
$site_url = SystemConfigService::get('site_url');//网站地址
|
||
|
if (!$site_url) {
|
||
|
$site_url = 'http';
|
||
|
if ($_SERVER["HTTPS"] == "on") {
|
||
|
$site_url .= 's';
|
||
|
}
|
||
|
$site_url = $site_url . '://' . $_SERVER['HTTP_HOST'] . '/'; //当前域名
|
||
|
} else {
|
||
|
$site_url .= '/';
|
||
|
}
|
||
|
//判断如果文件存在,则跳转到下载路径
|
||
|
if (file_exists(ROOT_PATH . 'public' . DS . $filename)) {
|
||
|
header('location:' . $site_url . $filename);
|
||
|
exit;
|
||
|
} else {
|
||
|
header('HTTP/1.1 404 Not Found');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**文件导入
|
||
|
* @param string $filename
|
||
|
* @param int $startLine
|
||
|
* @param array $width
|
||
|
* @return array
|
||
|
* @throws \PHPExcel_Exception
|
||
|
* @throws \PHPExcel_Reader_Exception
|
||
|
*/
|
||
|
public static function GetExcelData($filename = '1.xlsx', $startLine = 4)
|
||
|
{
|
||
|
$width = [
|
||
|
'question_type' => 'A',
|
||
|
'pid' => 'B',
|
||
|
'stem' => 'C',
|
||
|
'image' => 'D',
|
||
|
'is_img' => 'E',
|
||
|
'a' => 'F',
|
||
|
'b' => 'G',
|
||
|
'c' => 'H',
|
||
|
'd' => 'I',
|
||
|
'e' => 'J',
|
||
|
'f' => 'K',
|
||
|
'answer' => 'L',
|
||
|
'difficulty' => 'M',
|
||
|
'analysis' => 'N',
|
||
|
'sort' => 'O'
|
||
|
];
|
||
|
$filename = ROOT_PATH . 'public' . $filename;
|
||
|
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
||
|
switch ($extension) {
|
||
|
case 'xlsx':
|
||
|
$reader = IOFactory::createReader('Xlsx');
|
||
|
$spreadsheet = $reader->load($filename);
|
||
|
break;
|
||
|
case 'xls':
|
||
|
$reader = IOFactory::createReader('Xls');
|
||
|
$spreadsheet = $reader->load($filename);
|
||
|
break;
|
||
|
case 'csv':
|
||
|
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
|
||
|
$reader->setInputEncoding('GBK');
|
||
|
$reader->setDelimiter(',');
|
||
|
$reader->setEnclosure('');
|
||
|
$reader->setSheetIndex(0);
|
||
|
$spreadsheet = $reader->load($filename);
|
||
|
break;
|
||
|
}
|
||
|
$highestRow = $spreadsheet->getSheet(0)->getHighestRow(); // 取得总行数
|
||
|
$getvalue =
|
||
|
$spreadsheet->getActiveSheet();
|
||
|
$data = [];
|
||
|
for ($j = $startLine; $j <= (int)$highestRow; $j++) {
|
||
|
$value = [];
|
||
|
foreach ($width as $key => $val) {
|
||
|
$v = $getvalue->getCell($val . $j)->getValue();
|
||
|
if ($v) {
|
||
|
if (!is_string($v) && !is_numeric($v) && method_exists($v, "__toString") ) {
|
||
|
$v = $v->__toString();
|
||
|
}
|
||
|
$value[$key] = $v;
|
||
|
} else $value[$key] = '';
|
||
|
}
|
||
|
if (!$value['question_type']) {
|
||
|
break;
|
||
|
}
|
||
|
if ($value) $data[] = $value;
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
/**返回分类下试题的ID
|
||
|
* @param $question_type
|
||
|
* @param array $cateIds
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function getCateIds($question_type, $cateIds = [])
|
||
|
{
|
||
|
$question = self::where(['question_type' => $question_type, 'is_del' => 0, 'mer_id' => 0])->where('pid', 'in', $cateIds)->field('id,question_type')->select();
|
||
|
if ($question) return $question->toArray();
|
||
|
else return $question;
|
||
|
}
|
||
|
|
||
|
/**批量导入试题
|
||
|
* @param array $data
|
||
|
*/
|
||
|
public static function importQuestions($data = [])
|
||
|
{
|
||
|
foreach ($data as $key => $value) {
|
||
|
$dat = [];
|
||
|
switch ($value['question_type']) {
|
||
|
case 1:
|
||
|
if ($value['a']) $dat['A'] = $value['a'];
|
||
|
if ($value['b']) $dat['B'] = $value['b'];
|
||
|
if ($value['c']) $dat['C'] = $value['c'];
|
||
|
if ($value['d']) $dat['D'] = $value['d'];
|
||
|
case 2:
|
||
|
if ($value['a']) $dat['A'] = $value['a'];
|
||
|
if ($value['b']) $dat['B'] = $value['b'];
|
||
|
if ($value['c']) $dat['C'] = $value['c'];
|
||
|
if ($value['d']) $dat['D'] = $value['d'];
|
||
|
if ($value['e']) $dat['E'] = $value['e'];
|
||
|
if ($value['f']) $dat['F'] = $value['f'];
|
||
|
break;
|
||
|
case 3:
|
||
|
if ($value['a']) $dat['A'] = $value['a'];
|
||
|
if ($value['b']) $dat['B'] = $value['b'];
|
||
|
break;
|
||
|
}
|
||
|
$array['question_type'] = $value['question_type'];
|
||
|
$array['pid'] = $value['pid'];
|
||
|
$array['stem'] = $value['stem'];
|
||
|
$array['image'] = $value['image'];
|
||
|
$array['is_img'] = $value['is_img'];
|
||
|
$array['answer'] = trim($value['answer'], " ");
|
||
|
$array['difficulty'] = $value['difficulty'];
|
||
|
$array['analysis'] = $value['analysis'];
|
||
|
$array['sort'] = (int)$value['sort'];
|
||
|
$array['option'] = json_encode($dat);
|
||
|
$array['add_time'] = time();
|
||
|
if (self::be(['stem' => $value['stem'], 'is_del' => 0, 'mer_id' => 0])) continue;
|
||
|
self::set($array);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|