study-api-v2/app/Services/System/SystemUserSchoolCampusService.php

272 lines
7.6 KiB
PHP

<?php
namespace App\Services\System;
use App\Models\System\SystemUserSchoolCampus;
use App\Services\BaseService;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* 系统用户校区关联服务类
*/
class SystemUserSchoolCampusService extends BaseService
{
protected string $modelClass = SystemUserSchoolCampus::class;
/**
* 获取用户校区关联列表
*/
public function getList(array $params): LengthAwarePaginator
{
$query = SystemUserSchoolCampus::query();
// 用户ID筛选
if (!empty($params['userid'])) {
$query->where('userid', $params['userid']);
}
// 学校筛选
if (!empty($params['schoolid'])) {
$query->where('schoolid', $params['schoolid']);
}
// 校区筛选
if (!empty($params['campusid'])) {
$query->where('campusid', $params['campusid']);
}
// 包含关联信息
$query->with([
'user:id,username,nickname',
'school:id,name,alias',
'campus:id,name,alias'
]);
// 排序
$query->orderBy('schoolid', 'asc')
->orderBy('campusid', 'asc')
->orderBy('userid', 'asc');
return $query->paginate($params['page_size'] ?? 15);
}
/**
* 获取用户的学校校区列表
*/
public function getUserSchoolCampuses(int $userId): array
{
return SystemUserSchoolCampus::where('userid', $userId)
->with([
'school:id,name,alias',
'campus:id,name,alias'
])
->get()
->toArray();
}
/**
* 获取学校的用户列表
*/
public function getSchoolUsers(int $schoolId): array
{
return SystemUserSchoolCampus::where('schoolid', $schoolId)
->with([
'user:id,username,nickname',
'campus:id,name,alias'
])
->get()
->toArray();
}
/**
* 获取校区的用户列表
*/
public function getCampusUsers(int $campusId): array
{
return SystemUserSchoolCampus::where('campusid', $campusId)
->with([
'user:id,username,nickname',
'school:id,name,alias'
])
->get()
->toArray();
}
/**
* 批量分配用户到学校校区
*/
public function batchAssignUsersToSchoolCampus(array $userIds, int $schoolId, ?int $campusId = null): array
{
$results = [];
foreach ($userIds as $userId) {
// 检查是否已经存在关联
$exists = SystemUserSchoolCampus::where('userid', $userId)
->where('schoolid', $schoolId)
->where('campusid', $campusId ?? 0)
->exists();
if (!$exists) {
$data = [
'userid' => $userId,
'schoolid' => $schoolId,
'campusid' => $campusId ?? 0,
];
$result = $this->create($data);
$results[] = $result;
}
}
return $results;
}
/**
* 批量移除用户学校校区关联
*/
public function batchRemoveUsersFromSchoolCampus(array $userIds, int $schoolId, ?int $campusId = null): int
{
$query = SystemUserSchoolCampus::whereIn('userid', $userIds)
->where('schoolid', $schoolId);
if ($campusId !== null) {
$query->where('campusid', $campusId);
}
return $query->delete();
}
/**
* 转移用户到新的学校校区
*/
public function transferUserToSchoolCampus(int $userId, int $oldSchoolId, int $newSchoolId, ?int $oldCampusId = null, ?int $newCampusId = null): bool
{
// 删除旧的关联
$deleteQuery = SystemUserSchoolCampus::where('userid', $userId)
->where('schoolid', $oldSchoolId);
if ($oldCampusId !== null) {
$deleteQuery->where('campusid', $oldCampusId);
}
$deleteQuery->delete();
// 创建新的关联
$data = [
'userid' => $userId,
'schoolid' => $newSchoolId,
'campusid' => $newCampusId ?? 0,
];
$this->create($data);
return true;
}
/**
* 获取用户管理的学校ID列表
*/
public function getUserSchoolIds(int $userId): array
{
return SystemUserSchoolCampus::where('userid', $userId)
->pluck('schoolid')
->unique()
->toArray();
}
/**
* 获取用户管理的校区ID列表
*/
public function getUserCampusIds(int $userId): array
{
return SystemUserSchoolCampus::where('userid', $userId)
->pluck('campusid')
->toArray();
}
/**
* 检查用户是否管理指定学校
*/
public function checkUserManagesSchool(int $userId, int $schoolId): bool
{
return SystemUserSchoolCampus::where('userid', $userId)
->where('schoolid', $schoolId)
->exists();
}
/**
* 检查用户是否管理指定校区
*/
public function checkUserManagesCampus(int $userId, int $campusId): bool
{
return SystemUserSchoolCampus::where('userid', $userId)
->where('campusid', $campusId)
->exists();
}
/**
* 获取用户校区统计信息
*/
public function getUserSchoolCampusStats(int $userId): array
{
$relations = SystemUserSchoolCampus::where('userid', $userId)
->with(['school:id,name', 'campus:id,name'])
->get();
return [
'total_schools' => $relations->pluck('school')->unique('id')->count(),
'total_campuses' => $relations->where('campusid', '>', 0)->count(),
'schools' => $relations->pluck('school')->unique('id')->values()->toArray(),
'campuses' => $relations->where('campusid', '>', 0)->pluck('campus')->toArray(),
];
}
/**
* 创建前的特殊处理
*/
protected function beforeCreate(array &$data): void
{
// 设置默认值
$data['campusid'] = $data['campusid'] ?? 0;
// 验证用户是否存在
if (!empty($data['userid'])) {
$user = \App\Models\User::find($data['userid']);
if (!$user) {
throw new \InvalidArgumentException('指定的用户不存在');
}
}
// 验证学校是否存在
if (!empty($data['schoolid'])) {
$school = \App\Models\Schools\School::find($data['schoolid']);
if (!$school) {
throw new \InvalidArgumentException('指定的学校不存在');
}
}
// 验证校区是否存在
if (!empty($data['campusid']) && $data['campusid'] > 0) {
$campus = \App\Models\Schools\SchoolCampus::find($data['campusid']);
if (!$campus) {
throw new \InvalidArgumentException('指定的校区不存在');
}
// 验证校区是否属于指定学校
if ($campus->school_id !== $data['schoolid']) {
throw new \InvalidArgumentException('指定的校区不属于该学校');
}
}
// 检查是否已经存在关联
$exists = SystemUserSchoolCampus::where('userid', $data['userid'])
->where('schoolid', $data['schoolid'])
->where('campusid', $data['campusid'])
->exists();
if ($exists) {
throw new \InvalidArgumentException('该用户已经关联了此学校和校区');
}
}
}