|
|
@@ -295,4 +295,185 @@ class UrsUserMappingService
|
|
|
|
|
|
return UrsUserMappingDto::fromModel($mapping);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证映射关系有效性
|
|
|
+ *
|
|
|
+ * @param UrsUserMapping $mapping 映射关系对象
|
|
|
+ * @return array 验证结果 ['valid' => bool, 'updated' => bool, 'details' => array, 'reasons' => array]
|
|
|
+ */
|
|
|
+ public static function validateMapping(UrsUserMapping $mapping): array
|
|
|
+ {
|
|
|
+ $result = [
|
|
|
+ 'valid' => false,
|
|
|
+ 'updated' => false,
|
|
|
+ 'details' => [],
|
|
|
+ 'reasons' => []
|
|
|
+ ];
|
|
|
+
|
|
|
+ try {
|
|
|
+ $isValid = true;
|
|
|
+ $details = [];
|
|
|
+ $reasons = [];
|
|
|
+
|
|
|
+ // 检查URS用户ID是否有效
|
|
|
+ if ($mapping->urs_user_id <= 0) {
|
|
|
+ $isValid = false;
|
|
|
+ $reasons[] = 'URS用户ID无效';
|
|
|
+ } else {
|
|
|
+ $details[] = "URS用户ID: {$mapping->urs_user_id}";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查农场用户ID是否有效
|
|
|
+ if ($mapping->user_id <= 0) {
|
|
|
+ $isValid = false;
|
|
|
+ $reasons[] = '农场用户ID无效';
|
|
|
+ } else {
|
|
|
+ // 检查农场用户是否存在
|
|
|
+ $farmUser = \App\Module\User\Models\User::find($mapping->user_id);
|
|
|
+ if (!$farmUser) {
|
|
|
+ $isValid = false;
|
|
|
+ $reasons[] = '农场用户不存在';
|
|
|
+ } else {
|
|
|
+ $details[] = "农场用户: {$farmUser->username} (ID: {$mapping->user_id})";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否存在重复映射
|
|
|
+ $duplicateUrsMapping = UrsUserMapping::where('urs_user_id', $mapping->urs_user_id)
|
|
|
+ ->where('id', '!=', $mapping->id)
|
|
|
+ ->first();
|
|
|
+ if ($duplicateUrsMapping) {
|
|
|
+ $isValid = false;
|
|
|
+ $reasons[] = "URS用户ID {$mapping->urs_user_id} 存在重复映射";
|
|
|
+ }
|
|
|
+
|
|
|
+ $duplicateFarmMapping = UrsUserMapping::where('user_id', $mapping->user_id)
|
|
|
+ ->where('id', '!=', $mapping->id)
|
|
|
+ ->first();
|
|
|
+ if ($duplicateFarmMapping) {
|
|
|
+ $isValid = false;
|
|
|
+ $reasons[] = "农场用户ID {$mapping->user_id} 存在重复映射";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查映射时间是否合理
|
|
|
+ if ($mapping->mapping_time && $mapping->mapping_time->isFuture()) {
|
|
|
+ $isValid = false;
|
|
|
+ $reasons[] = '映射时间不能是未来时间';
|
|
|
+ } else if ($mapping->mapping_time) {
|
|
|
+ $details[] = "映射时间: {$mapping->mapping_time->format('Y-m-d H:i:s')}";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新映射状态
|
|
|
+ $originalStatus = $mapping->status;
|
|
|
+ $newStatus = $isValid ? UrsUserMapping::STATUS_VALID : UrsUserMapping::STATUS_INVALID;
|
|
|
+
|
|
|
+ if ($originalStatus !== $newStatus) {
|
|
|
+ $mapping->status = $newStatus;
|
|
|
+ $mapping->save();
|
|
|
+ $result['updated'] = true;
|
|
|
+
|
|
|
+ Log::info('映射关系状态已更新', [
|
|
|
+ 'mapping_id' => $mapping->id,
|
|
|
+ 'urs_user_id' => $mapping->urs_user_id,
|
|
|
+ 'farm_user_id' => $mapping->user_id,
|
|
|
+ 'old_status' => $originalStatus,
|
|
|
+ 'new_status' => $newStatus
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $result['valid'] = $isValid;
|
|
|
+ $result['details'] = $details;
|
|
|
+ $result['reasons'] = $reasons;
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('验证映射关系失败', [
|
|
|
+ 'mapping_id' => $mapping->id,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result['reasons'][] = '验证过程发生异常: ' . $e->getMessage();
|
|
|
+ }
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步用户信息
|
|
|
+ *
|
|
|
+ * @param UrsUserMapping $mapping 映射关系对象
|
|
|
+ * @return array 同步结果 ['success' => bool, 'updated_fields' => array, 'sync_time' => string, 'error' => string]
|
|
|
+ */
|
|
|
+ public static function syncUserInfo(UrsUserMapping $mapping): array
|
|
|
+ {
|
|
|
+ $result = [
|
|
|
+ 'success' => false,
|
|
|
+ 'updated_fields' => [],
|
|
|
+ 'sync_time' => '',
|
|
|
+ 'error' => ''
|
|
|
+ ];
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 检查映射状态
|
|
|
+ if ($mapping->status !== UrsUserMapping::STATUS_VALID) {
|
|
|
+ $result['error'] = '映射关系状态无效,无法同步';
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取农场用户信息
|
|
|
+ $farmUser = \App\Module\User\Models\User::find($mapping->user_id);
|
|
|
+ if (!$farmUser) {
|
|
|
+ $result['error'] = '农场用户不存在';
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ $updatedFields = [];
|
|
|
+ $syncTime = now()->format('Y-m-d H:i:s');
|
|
|
+
|
|
|
+ // 这里可以根据实际需求添加从URS系统同步用户信息的逻辑
|
|
|
+ // 目前只是模拟同步过程,更新最后同步时间
|
|
|
+
|
|
|
+ // 模拟同步用户昵称(如果需要的话)
|
|
|
+ $expectedUsername = 'urs-' . $mapping->urs_user_id;
|
|
|
+ if ($farmUser->username !== $expectedUsername) {
|
|
|
+ // 检查新用户名是否已存在
|
|
|
+ $existingUser = \App\Module\User\Models\User::where('username', $expectedUsername)
|
|
|
+ ->where('id', '!=', $farmUser->id)
|
|
|
+ ->first();
|
|
|
+
|
|
|
+ if (!$existingUser) {
|
|
|
+ $oldUsername = $farmUser->username;
|
|
|
+ $farmUser->username = $expectedUsername;
|
|
|
+ $farmUser->save();
|
|
|
+ $updatedFields[] = "用户名: {$oldUsername} -> {$expectedUsername}";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新映射记录的最后同步时间(如果表中有这个字段的话)
|
|
|
+ // $mapping->last_sync_time = now();
|
|
|
+ // $mapping->save();
|
|
|
+
|
|
|
+ $result['success'] = true;
|
|
|
+ $result['updated_fields'] = $updatedFields;
|
|
|
+ $result['sync_time'] = $syncTime;
|
|
|
+
|
|
|
+ Log::info('用户信息同步成功', [
|
|
|
+ 'mapping_id' => $mapping->id,
|
|
|
+ 'urs_user_id' => $mapping->urs_user_id,
|
|
|
+ 'farm_user_id' => $mapping->user_id,
|
|
|
+ 'updated_fields' => $updatedFields,
|
|
|
+ 'sync_time' => $syncTime
|
|
|
+ ]);
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('用户信息同步失败', [
|
|
|
+ 'mapping_id' => $mapping->id,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $result['error'] = '同步过程发生异常: ' . $e->getMessage();
|
|
|
+ }
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
}
|