272 lines
7.6 KiB
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('该用户已经关联了此学校和校区');
|
|
}
|
|
}
|
|
}
|