all(); $list = $this->model->with('courseContents.course', 'courseContents')->where(function ($query) use ($all) { if (isset($all['filter']) && !empty($all['filter'])) { foreach ($all['filter'] as $condition) { $key = $condition['key'] ?? null; $op = $condition['op'] ?? null; $value = $condition['value'] ?? null; if (!isset($key) || !isset($op) || !isset($value)) { continue; } // 等于 if ($op == 'eq') { $query->where($key, $value); } // 不等于 if ($op == 'neq') { $query->where($key, '!=', $value); } // 大于 if ($op == 'gt') { $query->where($key, '>', $value); } // 大于等于 if ($op == 'egt') { $query->where($key, '>=', $value); } // 小于 if ($op == 'lt') { $query->where($key, '<', $value); } // 小于等于 if ($op == 'elt') { $query->where($key, '<=', $value); } // 模糊搜索 if ($op == 'like') { $query->where($key, 'like', '%' . $value . '%'); } // 否定模糊搜索 if ($op == 'notlike') { $query->where($key, 'not like', '%' . $value . '%'); } // null搜索 if ($op == 'null') { $query->whereNull($key); } // notnull搜索 if ($op == 'notnull') { $query->whereNotNull($key); } // 范围搜索 if ($op == 'range') { list($from, $to) = explode(',', $value); if (empty($from) || empty($to)) { continue; } $query->whereBetween($key, [$from, $to]); } } } })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc'); // 应用与列表一致的筛选 if (isset($all['theme']) || isset($all['direction'])) { $list = $list->whereHas('courseContents', function ($query) use ($all) { if (isset($all['theme'])) { $query->where('theme', $all['theme']); } if (isset($all['direction'])) { $query->where('direction', $all['direction']); } }); } if (isset($all['keyword'])) { $list = $list->where(function ($query) use ($all) { $query->whereHas('courseContents', function ($query) use ($all) { $query->where('direction', 'like', '%' . $all['keyword'] . '%'); })->orWhere('name', 'like', '%' . $all['keyword'] . '%'); }); } if (isset($all['is_export']) && !empty($all['is_export'])) { // 导出 // 取数并展开为“老师 x 课程”的多行 $teachers = $list->limit(5000)->get(); $rows = []; foreach ($teachers as $teacher) { $hasCourses = $teacher->courseContents && $teacher->courseContents->count() > 0; if ($hasCourses) { foreach ($teacher->courseContents as $content) { $rows[] = [ 'teacher_name' => $teacher->name ?? '', 'introduce' => $teacher->introduce ?? '', 'sex' => $teacher->sex ?? '', 'mobile' => $teacher->mobile ?? '', 'course_name' => optional($content->course)->name ?? '', 'theme' => $content->theme ?? '', 'direction' => $content->direction ?? '', ]; } } else { // 无课程时也导出一行,课程相关列留空 $rows[] = [ 'teacher_name' => $teacher->name ?? '', 'introduce' => $teacher->introduce ?? '', 'sex' => $teacher->sex ?? '', 'mobile' => $teacher->mobile ?? '', 'course_name' => '', 'theme' => '', 'direction' => '', ]; } } // 列映射与顺序 $exportFields = [ 'teacher_name' => '授课老师', 'introduce' => '老师简介', 'sex' => '性别', 'mobile' => '联系方式', 'course_name' => '课程名称', 'theme' => '课程主题', 'direction' => '课程方向', ]; $fileName = ($all['file_name'] ?? '老师课程_') . date('YmdHis') . '.xlsx'; return Excel::download(new CommonExport($rows, $exportFields), $fileName); } else { // 输出 $list = $list->paginate($all['page_size'] ?? 20); } return $this->success($list); } /** * @OA\Get( * path="/api/admin/teachers/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() { return parent::show(); } /** * @OA\Post( * path="/api/admin/teachers/save", * tags={"时间段设置"}, * summary="更新或新增", * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer"), required=true, description="课程ID(存在则更新,不存在则新增)"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="访问令牌"), * @OA\Parameter(name="name", in="query", @OA\Schema(type="integer"), description="名字"), * @OA\Parameter(name="sex", in="query", @OA\Schema(type="string"), description="性别"), * @OA\Parameter(name="remark", in="query", @OA\Schema(type="string"), description="备注"), * @OA\Parameter(name="introduce", in="query", @OA\Schema(type="string"), description="介绍"), * @OA\Response( * response=200, * description="操作成功" * ) * ) */ public function save() { return parent::save(); } /** * @OA\Get( * path="/api/admin/teachers/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() { return parent::destroy(); } /** * @OA\Post( * path="/api/admin/teachers/excel-show", * tags={"老师管理"}, * summary="导入预览", * description="", * @OA\Parameter(name="file", in="query", @OA\Schema(type="string"), required=true, description="文件"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function excelShow() { return parent::excelShow(); } /** * @OA\Post( * path="/api/admin/teachers/import", * tags={"老师管理"}, * summary="导入", * description="", * @OA\Parameter(name="data", in="query", @OA\Schema(type="string"), required=true, description="导入分析获取到的二维数组"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function import() { $all = \request()->all(); $messages = [ 'data.required' => '数据必填', ]; $validator = Validator::make($all, [ 'data' => 'required', ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $records = $all['data']; DB::beginTransaction(); try { // 获取数据表的所有字段 // 分段导入 foreach ($records as $item) { $where = ['name' => $item['name']]; $data = [ 'name' => $item['name'], 'sex' => $item['sex'] ?? '', 'remark' => $item['remark'] ?? '', 'introduce' => $item['introduce'] ?? '', 'mobile' => $item['mobile'] ?? '', ]; $this->model->updateOrCreate($where, $data); } DB::commit(); return $this->success(['total' => count($records), 'filter_total' => count($records)]); } catch (\Exception $exception) { DB::rollBack(); return $this->fail([$exception->getCode(), $exception->getMessage()]); } } }