study-api-v2/app/Services/Schools/SchoolCampusService.php

151 lines
4.2 KiB
PHP

<?php
namespace App\Services\Schools;
use App\Models\Schools\SchoolCampus;
use App\Services\BaseService;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* 校区服务类
*/
class SchoolCampusService extends BaseService
{
protected string $modelClass = SchoolCampus::class;
/**
* 获取校区列表
*/
public function getList(array $params): LengthAwarePaginator
{
$query = SchoolCampus::query();
// 搜索条件
if (!empty($params['keyword'])) {
$query->where(function ($q) use ($params) {
$q->where('name', 'like', '%' . $params['keyword'] . '%')
->orWhere('alias', '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']);
}
// 包含学校信息
$query->with(['school:id,name,alias']);
// 排序
$query->orderBy('school_id', 'asc')->orderBy('id', 'desc');
return $query->paginate($params['page_size'] ?? 15);
}
/**
* 获取简单列表(用于下拉选择等)
*/
public function getSimpleList(?int $schoolId = null): array
{
$query = SchoolCampus::select('id', 'name', 'alias', 'code', 'school_id')
->active()
->with(['school:id,name']);
if ($schoolId) {
$query->where('school_id', $schoolId);
}
return $query->get()->toArray();
}
/**
* 获取指定用户管理的校区列表
*/
public function getUserCampuses(int $userId): array
{
$campusIds = \App\Models\User::find($userId)->getCampusIds();
return SchoolCampus::whereIn('id', $campusIds)
->active()
->with(['school:id,name'])
->get()
->toArray();
}
/**
* 获取校区的班级列表
*/
public function getCampusClasses(int $campusId): array
{
$campus = SchoolCampus::findOrFail($campusId);
return $campus->classes()
->active()
->select('id', 'name', 'code', 'grade_id', 'number')
->orderBy('grade_id', 'asc')
->orderBy('number', 'asc')
->get()
->toArray();
}
/**
* 获取校区统计信息
*/
public function getCampusStats(int $campusId): array
{
$campus = SchoolCampus::findOrFail($campusId);
return [
'class_count' => $campus->classes()->active()->count(),
'student_count' => \App\Models\Students\StudentClass::whereHas('schoolClass', function ($query) use ($campusId) {
$query->where('campus_id', $campusId);
})->count(),
'teacher_count' => \App\Models\Teachers\TeacherClass::whereHas('schoolClass', function ($query) use ($campusId) {
$query->where('campus_id', $campusId);
})->distinct('teacher_id')->count(),
];
}
/**
* 创建前的特殊处理
*/
protected function beforeCreate(array &$data): void
{
// 设置默认值
$data['status'] = $data['status'] ?? 1;
$data['self_support'] = $data['self_support'] ?? 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('指定的学校不存在');
}
}
}
/**
* 更新前的特殊处理
*/
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('指定的学校不存在');
}
}
}
}