161 lines
4.3 KiB
PHP
161 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Schools;
|
|
|
|
use App\Models\Schools\School;
|
|
use App\Services\BaseService;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
|
|
/**
|
|
* 学校服务类
|
|
*/
|
|
class SchoolService extends BaseService
|
|
{
|
|
protected string $modelClass = School::class;
|
|
|
|
/**
|
|
* 获取学校列表
|
|
*/
|
|
public function getList(array $params): LengthAwarePaginator
|
|
{
|
|
$query = School::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 (isset($params['type'])) {
|
|
$query->where('type', $params['type']);
|
|
}
|
|
|
|
// 省市区筛选
|
|
if (!empty($params['province_id'])) {
|
|
$query->where('province_id', $params['province_id']);
|
|
}
|
|
if (!empty($params['city_id'])) {
|
|
$query->where('city_id', $params['city_id']);
|
|
}
|
|
if (!empty($params['district_id'])) {
|
|
$query->where('district_id', $params['district_id']);
|
|
}
|
|
|
|
// 学段筛选
|
|
if (!empty($params['grade_period'])) {
|
|
$query->where('grade_period', $params['grade_period']);
|
|
}
|
|
|
|
// 排序
|
|
$query->ordered();
|
|
|
|
return $query->paginate($params['page_size'] ?? 15);
|
|
}
|
|
|
|
/**
|
|
* 获取简单列表(用于下拉选择等)
|
|
*/
|
|
public function getSimpleList(): array
|
|
{
|
|
return School::select('id', 'name', 'alias', 'code')
|
|
->active()
|
|
->ordered()
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取指定用户管理的学校列表
|
|
*/
|
|
public function getUserSchools(int $userId): array
|
|
{
|
|
$schoolIds = \App\Models\User::find($userId)->getSchoolIds();
|
|
|
|
return School::whereIn('id', $schoolIds)
|
|
->active()
|
|
->ordered()
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取学校的校区列表
|
|
*/
|
|
public function getSchoolCampuses(int $schoolId): array
|
|
{
|
|
$school = School::findOrFail($schoolId);
|
|
|
|
return $school->campuses()
|
|
->active()
|
|
->select('id', 'name', 'alias', 'code')
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取学校的班级列表
|
|
*/
|
|
public function getSchoolClasses(int $schoolId, ?int $campusId = null): array
|
|
{
|
|
$school = School::findOrFail($schoolId);
|
|
|
|
$query = $school->classes()->active();
|
|
|
|
if ($campusId) {
|
|
$query->where('campus_id', $campusId);
|
|
}
|
|
|
|
return $query->select('id', 'name', 'code', 'campus_id', 'grade_id', 'number')
|
|
->orderBy('grade_id', 'asc')
|
|
->orderBy('number', 'asc')
|
|
->get()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 获取学校统计信息
|
|
*/
|
|
public function getSchoolStats(int $schoolId): array
|
|
{
|
|
$school = School::findOrFail($schoolId);
|
|
|
|
return [
|
|
'campus_count' => $school->campuses()->active()->count(),
|
|
'class_count' => $school->classes()->active()->count(),
|
|
'student_count' => \App\Models\Students\StudentClass::where('school_id', $schoolId)->count(),
|
|
'teacher_count' => \App\Models\Teachers\TeacherClass::where('school_id', $schoolId)->distinct('teacher_id')->count(),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 创建前的特殊处理
|
|
*/
|
|
protected function beforeCreate(array &$data): void
|
|
{
|
|
// 设置默认值
|
|
$data['status'] = $data['status'] ?? 1;
|
|
$data['show_order'] = $data['show_order'] ?? 999;
|
|
$data['sno_automatic'] = $data['sno_automatic'] ?? 0;
|
|
$data['max_sno'] = $data['max_sno'] ?? 2;
|
|
$data['is_open_user_login'] = $data['is_open_user_login'] ?? 0;
|
|
}
|
|
|
|
/**
|
|
* 更新前的特殊处理
|
|
*/
|
|
protected function beforeUpdate(array &$data): void
|
|
{
|
|
// 移除不允许更新的字段
|
|
unset($data['id']);
|
|
}
|
|
}
|