ExternalIdService.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Student;
  4. use App\Models\Teacher;
  5. use App\Models\User;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Hash;
  8. use Illuminate\Support\Facades\Log;
  9. class ExternalIdService
  10. {
  11. /**
  12. * 处理学生外部ID
  13. * 如果ID不存在,自动创建用户和学生记录
  14. */
  15. public function handleStudentExternalId(int|string $studentId, array $studentData = []): Student
  16. {
  17. // student_id是int类型,直接使用
  18. // 检查学生是否已存在
  19. $student = Student::where('student_id', $studentId)->first();
  20. if ($student) {
  21. Log::info('外部学生ID已存在', ['student_id' => $studentId]);
  22. return $student;
  23. }
  24. // 创建用户记录
  25. $userData = [
  26. 'user_id' => (string) $studentId, // user表是varchar类型
  27. 'username' => $studentData['name'],
  28. 'password_hash' => Hash::make(env('STUDENT_HASH', 'UqB6KHYx84')),
  29. 'role' => 'student',
  30. 'full_name' => $studentData['name'] ?? '未知学生',
  31. 'email' => $studentId . '@student.edu',
  32. 'is_active' => 1,
  33. ];
  34. $user = User::create($userData);
  35. // 创建学生记录
  36. $student = Student::create([
  37. 'student_id' => $studentId,
  38. 'name' => $studentData['name'] ?? '未知学生',
  39. 'grade' => $studentData['grade'] ?? '未知年级',
  40. 'class_name' => $studentData['class_name'] ?? '',
  41. 'teacher_id' => $studentData['teacher_id'] ?? null,
  42. 'remark' => $studentData['remark'] ?? '自动创建',
  43. ]);
  44. Log::info('外部学生ID自动创建成功', [
  45. 'student_id' => $studentId,
  46. 'user_id' => $user->user_id
  47. ]);
  48. return $student;
  49. }
  50. /**
  51. * 处理教师外部ID
  52. * 如果ID不存在,自动创建用户和教师记录
  53. */
  54. public function handleTeacherExternalId(int|string $teacherId, array $teacherData = []): Teacher
  55. {
  56. // teacher_id是int类型,直接使用
  57. // 检查教师是否已存在
  58. $teacher = Teacher::where('teacher_id', $teacherId)->first();
  59. if ($teacher) {
  60. Log::info('外部教师ID已存在', ['teacher_id' => $teacherId]);
  61. return $teacher;
  62. }
  63. // 创建用户记录
  64. $userData = [
  65. 'user_id' => (string) $teacherId,
  66. 'username' => $teacherData['phone'] ?? (string) $teacherId, // 如果有手机号就用手机号
  67. 'password_hash' => Hash::make(env('TEACHER_HASH', 'TeGiFkEim2')),
  68. 'role' => 'teacher',
  69. 'full_name' => $teacherData['name'] ?? '未知教师',
  70. 'email' => $teacherId . '@teacher.edu',
  71. 'is_active' => 1,
  72. ];
  73. $user = User::create($userData);
  74. // 创建教师记录
  75. $teacher = Teacher::create([
  76. 'teacher_id' => $teacherId,
  77. 'teacher_string_id' => $teacherData['teacher_string_id'] ?? null,
  78. 'user_id' => $user->user_id,
  79. 'name' => $teacherData['name'] ?? '未知教师',
  80. 'subject' => $teacherData['subject'] ?? '数学',
  81. ]);
  82. Log::info('外部教师ID自动创建成功', [
  83. 'teacher_id' => $teacherId,
  84. 'user_id' => $user->user_id
  85. ]);
  86. return $teacher;
  87. }
  88. /**
  89. * 批量处理学生外部ID
  90. */
  91. public function handleBatchStudentExternalIds(array $studentIds): array
  92. {
  93. $results = [];
  94. foreach ($studentIds as $studentId => $studentData) {
  95. try {
  96. $student = $this->handleStudentExternalId($studentId, $studentData);
  97. $results[$studentId] = ['success' => true, 'student' => $student];
  98. } catch (\Exception $e) {
  99. Log::error('批量处理学生ID失败', [
  100. 'student_id' => $studentId,
  101. 'error' => $e->getMessage()
  102. ]);
  103. $results[$studentId] = ['success' => false, 'error' => $e->getMessage()];
  104. }
  105. }
  106. return $results;
  107. }
  108. /**
  109. * 验证外部ID格式
  110. */
  111. public function validateExternalId(int|string $externalId, string $type = 'student'): bool
  112. {
  113. $externalId = (string) $externalId;
  114. // 基本格式验证
  115. if (empty($externalId)) {
  116. return false;
  117. }
  118. // 长度验证(1-64字符)
  119. if (strlen($externalId) > 64 || strlen($externalId) < 1) {
  120. return false;
  121. }
  122. // 字符验证(允许字母、数字、下划线、连字符)
  123. if (!preg_match('/^[a-zA-Z0-9_-]+$/', $externalId)) {
  124. return false;
  125. }
  126. return true;
  127. }
  128. /**
  129. * 通过外部ID获取学生信息(包含关联)
  130. */
  131. public function getStudentWithRelations(int|string $studentId): ?Student
  132. {
  133. return Student::with(['teacher.user', 'user'])
  134. ->where('student_id', $studentId)
  135. ->first();
  136. }
  137. /**
  138. * 通过外部ID获取教师信息(包含关联)
  139. */
  140. public function getTeacherWithRelations(int|string $teacherId): ?Teacher
  141. {
  142. return Teacher::with(['user', 'students'])
  143. ->where('teacher_id', $teacherId)
  144. ->first();
  145. }
  146. /**
  147. * 获取教师的学生列表
  148. */
  149. public function getTeacherStudents(int|string $teacherId): Collection
  150. {
  151. return Student::with(['user'])
  152. ->where('teacher_id', $teacherId)
  153. ->orderBy('name')
  154. ->get();
  155. }
  156. /**
  157. * 获取学生的试卷列表
  158. */
  159. public function getStudentPapers(int|string $studentId): Collection
  160. {
  161. return Student::find($studentId)
  162. ?->papers()
  163. ->with(['paperQuestions.question'])
  164. ->orderBy('created_at', 'desc')
  165. ->get() ?? collect();
  166. }
  167. /**
  168. * 检查外部ID是否存在
  169. */
  170. public function studentExists(int|string $studentId): bool
  171. {
  172. return Student::where('student_id', $studentId)->exists();
  173. }
  174. /**
  175. * 检查外部ID是否存在
  176. */
  177. public function teacherExists(int|string $teacherId): bool
  178. {
  179. return Teacher::where('teacher_id', $teacherId)->exists();
  180. }
  181. }