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.
288 lines
8.9 KiB
288 lines
8.9 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | Niucloud-admin 企业快速开发的多应用管理平台
|
|
// +----------------------------------------------------------------------
|
|
// | 官方网址:https://www.niucloud.com
|
|
// +----------------------------------------------------------------------
|
|
// | niucloud团队 版权所有 开源版本可自由商用
|
|
// +----------------------------------------------------------------------
|
|
// | Author: Niucloud Team
|
|
// +----------------------------------------------------------------------
|
|
|
|
namespace app\service\api\apiService;
|
|
|
|
use app\model\course\Course;
|
|
use app\model\school\SchoolClass;
|
|
use app\model\school\SchoolPersonnel;
|
|
use app\model\school\SchoolVenue;
|
|
use core\base\BaseApiService;
|
|
|
|
/**
|
|
* 课程安排选项服务
|
|
* Class ScheduleOptionsService
|
|
* @package app\service\api\apiService
|
|
*/
|
|
class ScheduleOptionsService extends BaseApiService
|
|
{
|
|
/**
|
|
* 获取所有排课相关的选项列表(统一接口)
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getAllOptions(array $data)
|
|
{
|
|
try {
|
|
$campus_id = $data['campus_id'] ?? 0;
|
|
$include_all = $data['include_all'] ?? false;
|
|
|
|
// 并行获取所有选项
|
|
$courses = $this->getCourseListData($campus_id, $include_all);
|
|
$classes = $this->getClassListData($campus_id, $include_all);
|
|
$coaches = $this->getCoachListData($campus_id, $include_all);
|
|
$venues = $this->getVenueListData($campus_id, $include_all);
|
|
|
|
return [
|
|
'code' => 1,
|
|
'data' => [
|
|
'courses' => $courses,
|
|
'classes' => $classes,
|
|
'coaches' => $coaches,
|
|
'venues' => $venues,
|
|
'campus_info' => [
|
|
'campus_id' => $campus_id,
|
|
'include_all' => $include_all
|
|
]
|
|
]
|
|
];
|
|
} catch (\Exception $e) {
|
|
return [
|
|
'code' => 0,
|
|
'msg' => '获取选项列表失败:' . $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取课程列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getCourseList(array $data)
|
|
{
|
|
try {
|
|
$campus_id = $data['campus_id'] ?? 0;
|
|
$include_all = $data['include_all'] ?? false;
|
|
|
|
$courses = $this->getCourseListData($campus_id, $include_all, $data);
|
|
|
|
return [
|
|
'code' => 1,
|
|
'data' => $courses
|
|
];
|
|
} catch (\Exception $e) {
|
|
return [
|
|
'code' => 0,
|
|
'msg' => '获取课程列表失败:' . $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取班级列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getClassList(array $data)
|
|
{
|
|
try {
|
|
$campus_id = $data['campus_id'] ?? 0;
|
|
$include_all = $data['include_all'] ?? false;
|
|
|
|
$classes = $this->getClassListData($campus_id, $include_all, $data);
|
|
|
|
return [
|
|
'code' => 1,
|
|
'data' => $classes
|
|
];
|
|
} catch (\Exception $e) {
|
|
return [
|
|
'code' => 0,
|
|
'msg' => '获取班级列表失败:' . $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取教练列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getCoachList(array $data)
|
|
{
|
|
try {
|
|
$campus_id = $data['campus_id'] ?? 0;
|
|
$include_all = $data['include_all'] ?? false;
|
|
|
|
$coaches = $this->getCoachListData($campus_id, $include_all, $data);
|
|
|
|
return [
|
|
'code' => 1,
|
|
'data' => $coaches
|
|
];
|
|
} catch (\Exception $e) {
|
|
return [
|
|
'code' => 0,
|
|
'msg' => '获取教练列表失败:' . $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取场地列表
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function getVenueList(array $data)
|
|
{
|
|
try {
|
|
$campus_id = $data['campus_id'] ?? 0;
|
|
$include_all = $data['include_all'] ?? false;
|
|
|
|
$venues = $this->getVenueListData($campus_id, $include_all, $data);
|
|
|
|
return [
|
|
'code' => 1,
|
|
'data' => $venues
|
|
];
|
|
} catch (\Exception $e) {
|
|
return [
|
|
'code' => 0,
|
|
'msg' => '获取场地列表失败:' . $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取课程数据
|
|
* @param int $campus_id
|
|
* @param bool $include_all
|
|
* @param array $filters
|
|
* @return array
|
|
*/
|
|
private function getCourseListData(int $campus_id, bool $include_all, array $filters = [])
|
|
{
|
|
$query = Course::where('deleted_at', 0)
|
|
->where('status', $filters['status'] ?? 1)
|
|
->field('id,course_name,course_type,duration,session_count,price,status');
|
|
|
|
// 如果有关键词搜索
|
|
if (!empty($filters['keyword'])) {
|
|
$query->where('course_name', 'like', '%' . $filters['keyword'] . '%');
|
|
}
|
|
|
|
// 如果有课程类型筛选
|
|
if (!empty($filters['course_type'])) {
|
|
$query->where('course_type', $filters['course_type']);
|
|
}
|
|
|
|
$courses = $query->order('id desc')->select()->toArray();
|
|
|
|
return $courses;
|
|
}
|
|
|
|
/**
|
|
* 获取班级数据
|
|
* @param int $campus_id
|
|
* @param bool $include_all
|
|
* @param array $filters
|
|
* @return array
|
|
*/
|
|
private function getClassListData(int $campus_id, bool $include_all, array $filters = [])
|
|
{
|
|
$query = SchoolClass::where('deleted_at', 0)
|
|
->where('status', $filters['status'] ?? 1)
|
|
->field('id,campus_id,campus_name,class_name,head_coach,age_group,class_type,assistant_coach,status,sort_order');
|
|
|
|
// 校区过滤:如果当前登录人有校区且不是获取全部数据,则只获取该校区的数据
|
|
if (!$include_all && $campus_id > 0) {
|
|
$query->where('campus_id', $campus_id);
|
|
}
|
|
|
|
// 如果有关键词搜索
|
|
if (!empty($filters['keyword'])) {
|
|
$query->where('class_name', 'like', '%' . $filters['keyword'] . '%');
|
|
}
|
|
|
|
// 如果有班级类型筛选
|
|
if (!empty($filters['class_type'])) {
|
|
$query->where('class_type', $filters['class_type']);
|
|
}
|
|
|
|
$classes = $query->order('sort_order asc, id desc')->select()->toArray();
|
|
|
|
return $classes;
|
|
}
|
|
|
|
/**
|
|
* 获取教练数据
|
|
* @param int $campus_id
|
|
* @param bool $include_all
|
|
* @param array $filters
|
|
* @return array
|
|
*/
|
|
private function getCoachListData(int $campus_id, bool $include_all, array $filters = [])
|
|
{
|
|
// 通过角色关联表获取教练
|
|
$query = SchoolPersonnel::alias('p')
|
|
->where('p.deleted_at', 0)
|
|
->where('p.status', $filters['status'] ?? 1)
|
|
->field('p.id,p.name,p.head_img,p.gender,p.phone,p.email,p.account_type,p.status');
|
|
|
|
// 校区过滤:通过角色关联表过滤
|
|
if (!$include_all && $campus_id > 0) {
|
|
$query->join('school_campus_person_role r', 'p.id = r.person_id')
|
|
->where('r.campus_id', $campus_id)
|
|
->where('r.deleted_at', 0);
|
|
}
|
|
|
|
// 获取教练类型的人员(teacher类型的人员可以作为教练)
|
|
$query->where('p.account_type', 'like', '%teacher%');
|
|
|
|
// 如果有关键词搜索
|
|
if (!empty($filters['keyword'])) {
|
|
$query->where('p.name', 'like', '%' . $filters['keyword'] . '%');
|
|
}
|
|
|
|
$coaches = $query->order('p.id desc')->select()->toArray();
|
|
|
|
return $coaches;
|
|
}
|
|
|
|
/**
|
|
* 获取场地数据
|
|
* @param int $campus_id
|
|
* @param bool $include_all
|
|
* @param array $filters
|
|
* @return array
|
|
*/
|
|
private function getVenueListData(int $campus_id, bool $include_all, array $filters = [])
|
|
{
|
|
$query = SchoolVenue::where('deleted_at', 0)
|
|
->where('availability_status', $filters['availability_status'] ?? 1)
|
|
->field('id,campus_id,venue_name,capacity,availability_status,time_range_type,time_range_start,time_range_end');
|
|
|
|
// 校区过滤:如果当前登录人有校区且不是获取全部数据,则只获取该校区的数据
|
|
if (!$include_all && $campus_id > 0) {
|
|
$query->where('campus_id', $campus_id);
|
|
}
|
|
|
|
// 如果有关键词搜索
|
|
if (!empty($filters['keyword'])) {
|
|
$query->where('venue_name', 'like', '%' . $filters['keyword'] . '%');
|
|
}
|
|
|
|
$venues = $query->order('id desc')->select()->toArray();
|
|
|
|
return $venues;
|
|
}
|
|
}
|