209 lines
6.0 KiB
PHP
209 lines
6.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Schools;
|
|
|
|
use App\Models\Schools\SchoolClass;
|
|
use App\Services\BaseService;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
|
|
/**
|
|
* 班级服务类
|
|
*/
|
|
class SchoolClassService extends BaseService
|
|
{
|
|
protected string $modelClass = SchoolClass::class;
|
|
|
|
/**
|
|
* 获取班级列表
|
|
*/
|
|
public function getList(array $params): LengthAwarePaginator
|
|
{
|
|
$query = SchoolClass::query();
|
|
|
|
// 搜索条件
|
|
if (!empty($params['keyword'])) {
|
|
$query->where(function ($q) use ($params) {
|
|
$q->where('name', 'like', '%' . $params['keyword'] . '%')
|
|
->orWhere('code', 'like', '%' . $params['keyword'] . '%');
|
|
});
|
|
}
|
|
|
|
// 状态筛选
|
|
if (isset($params['status'])) {
|
|
$query->where('status', $params['status']);
|
|
}
|
|
|
|
// 学校筛选
|
|
if (!empty($params['school_id'])) {
|
|
$query->where('school_id', $params['school_id']);
|
|
}
|
|
|
|
// 校区筛选
|
|
if (!empty($params['campus_id'])) {
|
|
$query->where('campus_id', $params['campus_id']);
|
|
}
|
|
|
|
// 年级筛选
|
|
if (!empty($params['grade_id'])) {
|
|
$query->where('grade_id', $params['grade_id']);
|
|
}
|
|
|
|
// 班级类型筛选
|
|
if (isset($params['type'])) {
|
|
$query->where('type', $params['type']);
|
|
}
|
|
|
|
// 包含学校和校区信息
|
|
$query->with(['school:id,name,alias', 'campus:id,name,alias']);
|
|
|
|
// 排序
|
|
$query->orderBy('school_id', 'asc')
|
|
->orderBy('campus_id', 'asc')
|
|
->orderBy('grade_id', 'asc')
|
|
->orderBy('number', 'asc');
|
|
|
|
return $query->paginate($params['page_size'] ?? 15);
|
|
}
|
|
|
|
/**
|
|
* 获取简单列表(用于下拉选择等)
|
|
*/
|
|
public function getSimpleList(?int $schoolId = null, ?int $campusId = null): array
|
|
{
|
|
$query = SchoolClass::select('id', 'name', 'code', 'school_id', 'campus_id', 'grade_id', 'number')
|
|
->active()
|
|
->with(['school:id,name', 'campus:id,name']);
|
|
|
|
if ($schoolId) {
|
|
$query->where('school_id', $schoolId);
|
|
}
|
|
|
|
if ($campusId) {
|
|
$query->where('campus_id', $campusId);
|
|
}
|
|
|
|
return $query->orderBy('grade_id', 'asc')
|
|
->orderBy('number', 'asc')
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取指定用户管理的班级列表
|
|
*/
|
|
public function getUserClasses(int $userId): array
|
|
{
|
|
$classIds = \App\Models\User::find($userId)->getClassIds();
|
|
|
|
return SchoolClass::whereIn('id', $classIds)
|
|
->active()
|
|
->with(['school:id,name', 'campus:id,name'])
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取班级的学生列表
|
|
*/
|
|
public function getClassStudents(int $classId): array
|
|
{
|
|
$class = SchoolClass::findOrFail($classId);
|
|
|
|
return $class->studentClasses()
|
|
->with(['student:id,name,sno']) // 假设有学生模型
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取班级的老师列表
|
|
*/
|
|
public function getClassTeachers(int $classId): array
|
|
{
|
|
$class = SchoolClass::findOrFail($classId);
|
|
|
|
return $class->teacherClasses()
|
|
->with(['teacher:id,username,nickname'])
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取班级统计信息
|
|
*/
|
|
public function getClassStats(int $classId): array
|
|
{
|
|
$class = SchoolClass::findOrFail($classId);
|
|
|
|
return [
|
|
'student_count' => $class->studentClasses()->count(),
|
|
'teacher_count' => $class->teacherClasses()->count(),
|
|
'headman_count' => $class->teacherClasses()->headman()->count(),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 创建前的特殊处理
|
|
*/
|
|
protected function beforeCreate(array &$data): void
|
|
{
|
|
// 设置默认值
|
|
$data['status'] = $data['status'] ?? 1;
|
|
$data['type'] = $data['type'] ?? 0;
|
|
$data['level'] = $data['level'] ?? 0;
|
|
$data['number'] = $data['number'] ?? 0;
|
|
$data['is_open_user_login'] = $data['is_open_user_login'] ?? 0;
|
|
|
|
// 验证学校是否存在
|
|
if (!empty($data['school_id'])) {
|
|
$school = \App\Models\Schools\School::find($data['school_id']);
|
|
if (!$school) {
|
|
throw new \InvalidArgumentException('指定的学校不存在');
|
|
}
|
|
}
|
|
|
|
// 验证校区是否存在
|
|
if (!empty($data['campus_id'])) {
|
|
$campus = \App\Models\Schools\SchoolCampus::find($data['campus_id']);
|
|
if (!$campus) {
|
|
throw new \InvalidArgumentException('指定的校区不存在');
|
|
}
|
|
|
|
// 验证校区是否属于指定学校
|
|
if ($campus->school_id !== $data['school_id']) {
|
|
throw new \InvalidArgumentException('指定的校区不属于该学校');
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新前的特殊处理
|
|
*/
|
|
protected function beforeUpdate(array &$data): void
|
|
{
|
|
// 移除不允许更新的字段
|
|
unset($data['id']);
|
|
|
|
// 验证学校是否存在
|
|
if (!empty($data['school_id'])) {
|
|
$school = \App\Models\Schools\School::find($data['school_id']);
|
|
if (!$school) {
|
|
throw new \InvalidArgumentException('指定的学校不存在');
|
|
}
|
|
}
|
|
|
|
// 验证校区是否存在
|
|
if (!empty($data['campus_id'])) {
|
|
$campus = \App\Models\Schools\SchoolCampus::find($data['campus_id']);
|
|
if (!$campus) {
|
|
throw new \InvalidArgumentException('指定的校区不存在');
|
|
}
|
|
|
|
// 验证校区是否属于指定学校
|
|
if (isset($data['school_id']) && $campus->school_id !== $data['school_id']) {
|
|
throw new \InvalidArgumentException('指定的校区不属于该学校');
|
|
}
|
|
}
|
|
}
|
|
}
|