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.

314 lines
13 KiB

6 months ago
<?php
namespace App\Http\Controllers\Admin;
4 months ago
use App\Exports\BaseExport;
1 month ago
use App\Exports\CommonExport;
4 months ago
use App\Helpers\ResponseCode;
4 months ago
use App\Models\CustomForm;
4 months ago
use App\Models\CustomFormField;
6 months ago
use App\Models\Teacher;
4 months ago
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
4 months ago
use Maatwebsite\Excel\Facades\Excel;
6 months ago
class TeacherController extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
parent::__construct(new Teacher());
}
/**
* @OA\Get(
* path="/api/admin/teachers/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="需要输出的关联关系数组包括teachercourseSettingscoursePeriods"),
* @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="排序类型"),
4 months ago
* @OA\Parameter(name="theme", in="query", @OA\Schema(type="string"), required=false, description="主题"),
* @OA\Parameter(name="direction", in="query", @OA\Schema(type="string"), required=false, description="方向"),
2 months ago
* @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=true, description="搜索关键词"),
6 months ago
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function index()
{
4 months ago
$all = request()->all();
$list = $this->model->with('courseContents.course', 'courseContents')->where(function ($query) use ($all) {
4 months ago
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');
1 month ago
// 应用与列表一致的筛选
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'] . '%');
});
}
4 months ago
if (isset($all['is_export']) && !empty($all['is_export'])) {
1 month ago
// 导出
// 取数并展开为“老师 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 ?? '',
];
4 months ago
}
1 month ago
} else {
// 无课程时也导出一行,课程相关列留空
$rows[] = [
'teacher_name' => $teacher->name ?? '',
'introduce' => $teacher->introduce ?? '',
'sex' => $teacher->sex ?? '',
'mobile' => $teacher->mobile ?? '',
'course_name' => '',
'theme' => '',
'direction' => '',
];
}
2 months ago
}
1 month ago
// 列映射与顺序
$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 {
4 months ago
// 输出
$list = $list->paginate($all['page_size'] ?? 20);
}
return $this->success($list);
6 months ago
}
/**
* @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()
{
4 months ago
$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 {
// 获取数据表的所有字段
// 分段导入
4 months ago
foreach ($records as $item) {
4 months ago
$where = ['name' => $item['name']];
4 months ago
$data = [
'name' => $item['name'],
4 months ago
'sex' => $item['sex'] ?? '',
'remark' => $item['remark'] ?? '',
'introduce' => $item['introduce'] ?? '',
'mobile' => $item['mobile'] ?? '',
4 months ago
];
4 months ago
$this->model->updateOrCreate($where, $data);
4 months ago
}
DB::commit();
4 months ago
return $this->success(['total' => count($records), 'filter_total' => count($records)]);
4 months ago
} catch (\Exception $exception) {
DB::rollBack();
return $this->fail([$exception->getCode(), $exception->getMessage()]);
}
6 months ago
}
}