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(); SurveySchema::validateConditions($survey->courseContentEvaluationAsks()->orderBy('sort')->orderBy('id')->get()->toArray()); $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(); SurveySchema::validateConditions($survey->courseContentEvaluationAsks()->orderBy('sort')->orderBy('id')->get()->toArray()); $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]); } SurveySchema::validateConditions($survey->courseContentEvaluationAsks()->orderBy('sort')->orderBy('id')->get()->toArray()); return $this->success('排序已保存'); }); } catch (\InvalidArgumentException $e) { return $this->fail([ResponseCode::ERROR_BUSINESS, $e->getMessage()]); } } }