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.

210 lines
11 KiB

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 App\Http\Controllers\Admin;
use App\Exports\BaseExport;
use App\Helpers\ResponseCode;
use App\Models\AppointmentType;
use App\Models\Book;
use App\Models\CourseContentEvaluationAsk;
use App\Models\CourseContentEvaluation;
use App\Services\Survey\SurveySchema;
use App\Models\CustomForm;
use App\Models\CustomFormField;
use App\Models\SupplyDemand;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Rap2hpoutre\FastExcel\FastExcel;
class CourseContentEvaluationAskController extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
parent::__construct(new CourseContentEvaluationAsk());
}
/**
* @OA\Get(
* path="/api/admin/course-content-evaluation-ask/index",
* tags={"评价问题管理"},
* summary="列表",
* description="",
* @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"),
* @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"),
* @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"),
* @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"),
* @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=true, description="关键词"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function index()
{
return parent::index();
}
/**
* @OA\Get(
* path="/api/admin/course-content-evaluation-ask/show",
* tags={"评价问题管理"},
* summary="详情",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,填写输出指定数据"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function show()
{
$all = \request()->all();
$messages = [
'id.required' => 'Id必填',
];
$validator = Validator::make($all, [
'id' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$detail = $this->model->find($all['id']);
return $this->success($detail);
}
/**
* @OA\Post(
* path="/api/admin/course-content-evaluation-ask/save",
* tags={"评价问题管理"},
* summary="保存",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="integer", format="int64"), required=true, description="课程内容评价字段ID(存在则更新,不存在则新增)"),
* @OA\Parameter(name="course_id", in="query", @OA\Schema(type="integer"), required=false, description="课程ID"),
* @OA\Parameter(name="course_content_id", in="query", @OA\Schema(type="integer"), required=false, description="课程排课ID"),
* @OA\Parameter(name="course_content_evaluation_id", in="query", @OA\Schema(type="integer"), required=false, description="评价问卷ID"),
* @OA\Parameter(name="name", in="query", @OA\Schema(type="string"), required=false, description="字段名字"),
* @OA\Parameter(name="field", in="query", @OA\Schema(type="string"), required=false, description="字段英文标识"),
* @OA\Parameter(name="edit_input", in="query", @OA\Schema(type="string", maxLength=50), required=false, description="编辑框类型"),
* @OA\Parameter(name="rule", in="query", @OA\Schema(type="string"), required=false, description="检测规则"),
* @OA\Parameter(name="sort", in="query", @OA\Schema(type="integer", default=1), required=false, description="排序"),
* @OA\Parameter(name="help", in="query", @OA\Schema(type="string"), required=false, description="帮助文字"),
* @OA\Parameter(name="select_item", in="query", @OA\Schema(type="object", format="json"), required=false, description="下拉框选项(JSON格式)"),
* @OA\Parameter(name="need_fill", in="query", @OA\Schema(type="boolean", default=0), required=false, description="是否需要填写(0: 否, 1: 是)"),
* @OA\Parameter(name="belong_user", in="query", @OA\Schema(type="boolean", default=0), required=false, description="是否属于用户信息(0: 否, 1: 是)"),
* @OA\Parameter(name="allow_input", in="query", @OA\Schema(type="boolean", default=0), required=false, description="是否支持自行录入(0: 否, 1: 是)"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"),
* @OA\Response(
* response="200",
* description="操作成功"
* )
* )
*/
public function save()
{
try {
$model = DB::transaction(function () {
$all = request()->all();
$model = !empty($all['id']) ? $this->model->findOrFail($all['id']) : new CourseContentEvaluationAsk();
$surveyId = $model->exists ? $model->course_content_evaluation_id : ($all['course_content_evaluation_id'] ?? null);
$survey = CourseContentEvaluation::whereKey($surveyId)->lockForUpdate()->firstOrFail();
if ($survey->courseContentEvaluationForms()->exists()) {
throw new \InvalidArgumentException('已有答卷,不能修改题目结构;请新建问卷');
}
$input = array_replace($model->exists ? $model->toArray() : [], $all);
$input['field'] = ($input['field'] ?? '') ?: ('q_' . bin2hex(random_bytes(8)));
$input['course_content_evaluation_id'] = $survey->id;
$input['course_id'] = $survey->course_id;
$input['course_content_id'] = ($input['course_content_id'] ?? null) ?: null;
$input = SurveySchema::question($input);
$duplicate = $survey->courseContentEvaluationAsks()->where('field', $input['field']);
if ($model->exists) $duplicate->where('id', '!=', $model->id);
if ($duplicate->exists()) throw new \InvalidArgumentException('题目字段标识不能重复');
$fields = ['course_id', 'course_content_id', 'course_content_evaluation_id', 'name', 'field', 'edit_input', 'rule', 'sort', 'help', 'select_item', 'need_fill', 'allow_input', 'dimensions', 'config'];
$original = $model->getOriginal();
$model->fill(array_intersect_key($input, array_flip($fields)));
if (!$model->exists) {
$model->admin_id = $this->getUserId();
$model->department_id = $this->getUser()->department_id;
}
$model->save();
$this->saveLogs($original, $model);
return $model;
});
return $this->success($model);
} catch (\InvalidArgumentException $e) {
return $this->fail([ResponseCode::ERROR_PARAMETER, $e->getMessage()]);
}
}
/**
* @OA\Get(
* path="/api/admin/course-content-evaluation-ask/destroy",
* tags={"评价问题管理"},
* summary="删除",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function destroy()
{
try {
return DB::transaction(function () {
$model = $this->model->findOrFail(request('id'));
$survey = CourseContentEvaluation::whereKey($model->course_content_evaluation_id)->lockForUpdate()->firstOrFail();
if ($survey->courseContentEvaluationForms()->exists()) {
throw new \InvalidArgumentException('已有答卷,不能删除题目');
}
$model->delete();
$this->saveLogs('delete', $model);
return $this->success('删除成功');
});
} catch (\InvalidArgumentException $e) {
return $this->fail([ResponseCode::ERROR_BUSINESS, $e->getMessage()]);
}
}
public function reorder()
{
try {
return DB::transaction(function () {
$survey = CourseContentEvaluation::whereKey(request('course_content_evaluation_id'))->lockForUpdate()->firstOrFail();
if ($survey->courseContentEvaluationForms()->exists()) throw new \InvalidArgumentException('已有答卷,不能调整题目顺序');
$ids = array_map('intval', (array) request('ids', []));
$existing = $survey->courseContentEvaluationAsks()->pluck('id')->map(fn ($id) => (int) $id)->all();
$sorted = $ids;
sort($sorted);
sort($existing);
if ($sorted !== $existing) throw new \InvalidArgumentException('题目列表已变更,请刷新');
foreach ($ids as $sort => $id) {
$survey->courseContentEvaluationAsks()->whereKey($id)->update(['sort' => $sort + 1]);
}
return $this->success('排序已保存');
});
} catch (\InvalidArgumentException $e) {
return $this->fail([ResponseCode::ERROR_BUSINESS, $e->getMessage()]);
}
}
}