UrsUserMappingService.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. <?php
  2. namespace App\Module\UrsPromotion\Services;
  3. use App\Module\UrsPromotion\Dtos\UrsUserMappingDto;
  4. use App\Module\UrsPromotion\Events\UrsUserEnteredFarmEvent;
  5. use App\Module\UrsPromotion\Models\UrsUserMapping;
  6. use App\Module\User\Services\UserService;
  7. use Illuminate\Support\Facades\DB;
  8. use Illuminate\Support\Facades\Log;
  9. use Illuminate\Support\Str;
  10. /**
  11. * URS用户映射服务
  12. *
  13. * 管理URS用户ID与农场用户ID的映射关系
  14. */
  15. class UrsUserMappingService
  16. {
  17. static $isFirst=[];
  18. /**
  19. * 创建用户映射关系(用户进入农场时调用)
  20. *
  21. * @param int $ursUserId URS用户ID
  22. * @param int $farmUserId 农场用户ID
  23. * @param string|null $userKey 用户凭证
  24. * @return UrsUserMappingDto
  25. * @throws \Exception
  26. */
  27. public static function createMapping(int $ursUserId, int $farmUserId, ?string $userKey = null): UrsUserMappingDto
  28. {
  29. try {
  30. DB::beginTransaction();
  31. // 检查是否已存在映射
  32. $existingMapping = UrsUserMapping::where('urs_user_id', $ursUserId)->first();
  33. if ($existingMapping) {
  34. if ($existingMapping->user_id === $farmUserId) {
  35. // 相同映射,直接返回
  36. DB::rollBack();
  37. return UrsUserMappingDto::fromModel($existingMapping);
  38. } else {
  39. // 不同映射,抛出异常
  40. throw new \Exception("URS用户ID {$ursUserId} 已映射到农场用户ID {$existingMapping->user_id}");
  41. }
  42. }
  43. // 检查农场用户ID是否已被映射
  44. $existingFarmMapping = UrsUserMapping::where('user_id', $farmUserId)->first();
  45. if ($existingFarmMapping) {
  46. throw new \Exception("农场用户ID {$farmUserId} 已映射到URS用户ID {$existingFarmMapping->urs_user_id}");
  47. }
  48. // 创建新映射
  49. $mapping = UrsUserMapping::create([
  50. 'urs_user_id' => $ursUserId,
  51. 'user_key' => $userKey,
  52. 'user_id' => $farmUserId,
  53. 'mapping_time' => now(),
  54. 'status' => UrsUserMapping::STATUS_VALID,
  55. ]);
  56. self::$isFirst[$farmUserId] = $ursUserId;
  57. DB::commit();
  58. Log::info('URS用户映射创建成功', [
  59. 'urs_user_id' => $ursUserId,
  60. 'farm_user_id' => $farmUserId,
  61. 'mapping_id' => $mapping->id
  62. ]);
  63. // 触发用户进入农场事件
  64. try {
  65. event(new UrsUserEnteredFarmEvent($ursUserId, $farmUserId, $userKey, true));
  66. Log::info('URS用户进入农场事件已触发', [
  67. 'urs_user_id' => $ursUserId,
  68. 'farm_user_id' => $farmUserId,
  69. 'user_key_length' => $userKey ? strlen($userKey) : 0
  70. ]);
  71. } catch (\Exception $e) {
  72. // 事件触发失败不影响映射创建,只记录日志
  73. Log::error('URS用户进入农场事件触发异常', [
  74. 'urs_user_id' => $ursUserId,
  75. 'farm_user_id' => $farmUserId,
  76. 'error' => $e->getMessage()
  77. ]);
  78. }
  79. return UrsUserMappingDto::fromModel($mapping);
  80. } catch (\Exception $e) {
  81. DB::rollBack();
  82. Log::error('URS用户映射创建失败', [
  83. 'urs_user_id' => $ursUserId,
  84. 'farm_user_id' => $farmUserId,
  85. 'error' => $e->getMessage()
  86. ]);
  87. throw $e;
  88. }
  89. }
  90. /**
  91. * 根据URS用户ID获取农场用户ID,不存在时自动创建新用户并绑定关系
  92. *
  93. * @param int $ursUserId URS用户ID
  94. * @param string|null $userKey 用户凭证(不存在则不创建新用户)
  95. * @return int|null 农场用户ID,创建失败时返回null
  96. */
  97. public static function getFarmUserId(int $ursUserId, ?string $userKey = null): ?int
  98. {
  99. // 首先尝试获取现有映射关系
  100. $existingFarmUserId = UrsUserMapping::getFarmUserIdByUrsUserId($ursUserId);
  101. if ($existingFarmUserId !== 0) {
  102. return $existingFarmUserId;
  103. }
  104. if ($userKey == null) {
  105. return 0 ;
  106. }
  107. // 不存在映射关系,自动创建新用户并建立映射
  108. try {
  109. DB::beginTransaction();
  110. // 生成用户名和随机密码
  111. $username = 'urs-' . $ursUserId;
  112. $password = Str::random(12);
  113. // 创建新用户
  114. $userDto = UserService::create($username, $password);
  115. if (is_string($userDto)) {
  116. // 创建失败
  117. DB::rollBack();
  118. Log::error('自动创建URS用户失败', [
  119. 'urs_user_id' => $ursUserId,
  120. 'username' => $username,
  121. 'error' => $userDto
  122. ]);
  123. return null;
  124. }
  125. // 创建用户映射关系
  126. $mapping = UrsUserMapping::create([
  127. 'urs_user_id' => $ursUserId,
  128. 'user_key' => $userKey,
  129. 'user_id' => $userDto->id,
  130. 'mapping_time' => now(),
  131. 'status' => UrsUserMapping::STATUS_VALID,
  132. ]);
  133. self::$isFirst[$userDto->id] = $ursUserId;
  134. DB::commit();
  135. Log::info('自动创建URS用户映射成功', [
  136. 'urs_user_id' => $ursUserId,
  137. 'farm_user_id' => $userDto->id,
  138. 'username' => $username,
  139. 'mapping_id' => $mapping->id
  140. ]);
  141. return $userDto->id;
  142. } catch (\Exception $e) {
  143. DB::rollBack();
  144. Log::error('自动创建URS用户映射失败', [
  145. 'urs_user_id' => $ursUserId,
  146. 'error' => $e->getMessage()
  147. ]);
  148. return null;
  149. }
  150. }
  151. /**
  152. * 根据农场用户ID获取URS用户ID
  153. *
  154. * @param int $farmUserId 农场用户ID
  155. * @return int|null URS用户ID,如果未找到返回null
  156. */
  157. public static function getUrsUserId(int $farmUserId): ?int
  158. {
  159. return self::getMappingUrsUserId($farmUserId);
  160. }
  161. /**
  162. * 批量获取URS用户ID对应的农场用户ID
  163. *
  164. * @param array $ursUserIds URS用户ID数组
  165. * @return array 映射关系数组 [urs_user_id => farm_user_id]
  166. */
  167. public static function batchGetFarmUserIds(array $ursUserIds): array
  168. {
  169. return UrsUserMapping::getFarmUserIdsByUrsUserIds($ursUserIds);
  170. }
  171. /**
  172. * 批量获取农场用户ID对应的URS用户ID
  173. *
  174. * @param array $farmUserIds 农场用户ID数组
  175. * @return array 映射关系数组 [farm_user_id => urs_user_id]
  176. */
  177. public static function batchGetUrsUserIds(array $farmUserIds): array
  178. {
  179. return UrsUserMapping::getUrsUserIdsByFarmUserIds($farmUserIds);
  180. }
  181. /**
  182. * 检查URS用户是否已进入农场
  183. *
  184. * @param int $ursUserId URS用户ID
  185. * @return bool
  186. */
  187. public static function hasEnteredFarm(int $ursUserId): bool
  188. {
  189. return UrsUserMapping::hasEnteredFarm($ursUserId);
  190. }
  191. /**
  192. * 获取已进入农场的URS用户ID列表
  193. *
  194. * @param array $ursUserIds URS用户ID数组
  195. * @return array 已进入农场的URS用户ID数组
  196. */
  197. public static function getEnteredFarmUsers(array $ursUserIds): array
  198. {
  199. return UrsUserMapping::getEnteredFarmUrsUserIds($ursUserIds);
  200. }
  201. /**
  202. * 禁用用户映射关系
  203. *
  204. * @param int $ursUserId URS用户ID
  205. * @return bool
  206. */
  207. public static function disableMapping(int $ursUserId): bool
  208. {
  209. try {
  210. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)->first();
  211. if (!$mapping) {
  212. return false;
  213. }
  214. $mapping->status = UrsUserMapping::STATUS_INVALID;
  215. $mapping->save();
  216. Log::info('URS用户映射已禁用', [
  217. 'urs_user_id' => $ursUserId,
  218. 'mapping_id' => $mapping->id
  219. ]);
  220. return true;
  221. } catch (\Exception $e) {
  222. Log::error('URS用户映射禁用失败', [
  223. 'urs_user_id' => $ursUserId,
  224. 'error' => $e->getMessage()
  225. ]);
  226. return false;
  227. }
  228. }
  229. /**
  230. * 启用用户映射关系
  231. *
  232. * @param int $ursUserId URS用户ID
  233. * @return bool
  234. */
  235. public static function enableMapping(int $ursUserId): bool
  236. {
  237. try {
  238. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)->first();
  239. if (!$mapping) {
  240. return false;
  241. }
  242. $mapping->status = UrsUserMapping::STATUS_VALID;
  243. $mapping->save();
  244. Log::info('URS用户映射已启用', [
  245. 'urs_user_id' => $ursUserId,
  246. 'mapping_id' => $mapping->id
  247. ]);
  248. return true;
  249. } catch (\Exception $e) {
  250. Log::error('URS用户映射启用失败', [
  251. 'urs_user_id' => $ursUserId,
  252. 'error' => $e->getMessage()
  253. ]);
  254. return false;
  255. }
  256. }
  257. /**
  258. * 获取映射统计信息
  259. *
  260. * @return array
  261. */
  262. public static function getMappingStats(): array
  263. {
  264. return [
  265. 'total_mappings' => UrsUserMapping::count(),
  266. 'valid_mappings' => UrsUserMapping::where('status', UrsUserMapping::STATUS_VALID)->count(),
  267. 'invalid_mappings' => UrsUserMapping::where('status', UrsUserMapping::STATUS_INVALID)->count(),
  268. 'today_mappings' => UrsUserMapping::whereDate('created_at', today())->count(),
  269. ];
  270. }
  271. /**
  272. * 获取用户映射详情
  273. *
  274. * @param int $ursUserId URS用户ID
  275. * @return UrsUserMappingDto|null
  276. */
  277. public static function getMappingDetail(int $ursUserId): ?UrsUserMappingDto
  278. {
  279. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)->first();
  280. if (!$mapping) {
  281. return null;
  282. }
  283. return UrsUserMappingDto::fromModel($mapping);
  284. }
  285. /**
  286. * 获取ursUserId
  287. * @param int $userId
  288. * @return int
  289. */
  290. public static function getMappingUrsUserId(int $userId): int
  291. {
  292. /**
  293. * @var UrsUserMapping $mapping
  294. */
  295. $mapping = UrsUserMapping::where('user_id', $userId)
  296. ->where('status', UrsUserMapping::STATUS_VALID)
  297. ->first();
  298. if (!$mapping) {
  299. return 0;
  300. }
  301. return $mapping->urs_user_id;
  302. }
  303. /**
  304. * 验证映射关系有效性
  305. *
  306. * @param UrsUserMapping $mapping 映射关系对象
  307. * @return array 验证结果 ['valid' => bool, 'updated' => bool, 'details' => array, 'reasons' => array]
  308. */
  309. public static function validateMapping(UrsUserMapping $mapping): array
  310. {
  311. $result = [
  312. 'valid' => false,
  313. 'updated' => false,
  314. 'details' => [],
  315. 'reasons' => []
  316. ];
  317. try {
  318. $isValid = true;
  319. $details = [];
  320. $reasons = [];
  321. // 检查URS用户ID是否有效
  322. if ($mapping->urs_user_id <= 0) {
  323. $isValid = false;
  324. $reasons[] = 'URS用户ID无效';
  325. } else {
  326. $details[] = "URS用户ID: {$mapping->urs_user_id}";
  327. }
  328. // 检查农场用户ID是否有效
  329. if ($mapping->user_id <= 0) {
  330. $isValid = false;
  331. $reasons[] = '农场用户ID无效';
  332. } else {
  333. // 检查农场用户是否存在
  334. $farmUser = \App\Module\User\Models\User::find($mapping->user_id);
  335. if (!$farmUser) {
  336. $isValid = false;
  337. $reasons[] = '农场用户不存在';
  338. } else {
  339. $details[] = "农场用户: {$farmUser->username} (ID: {$mapping->user_id})";
  340. }
  341. }
  342. // 检查是否存在重复映射
  343. $duplicateUrsMapping = UrsUserMapping::where('urs_user_id', $mapping->urs_user_id)
  344. ->where('id', '!=', $mapping->id)
  345. ->first();
  346. if ($duplicateUrsMapping) {
  347. $isValid = false;
  348. $reasons[] = "URS用户ID {$mapping->urs_user_id} 存在重复映射";
  349. }
  350. $duplicateFarmMapping = UrsUserMapping::where('user_id', $mapping->user_id)
  351. ->where('id', '!=', $mapping->id)
  352. ->first();
  353. if ($duplicateFarmMapping) {
  354. $isValid = false;
  355. $reasons[] = "农场用户ID {$mapping->user_id} 存在重复映射";
  356. }
  357. // 检查映射时间是否合理
  358. if ($mapping->mapping_time && $mapping->mapping_time->isFuture()) {
  359. $isValid = false;
  360. $reasons[] = '映射时间不能是未来时间';
  361. } else if ($mapping->mapping_time) {
  362. $details[] = "映射时间: {$mapping->mapping_time->format('Y-m-d H:i:s')}";
  363. }
  364. // 更新映射状态
  365. $originalStatus = $mapping->status;
  366. $newStatus = $isValid ? UrsUserMapping::STATUS_VALID : UrsUserMapping::STATUS_INVALID;
  367. if ($originalStatus !== $newStatus) {
  368. $mapping->status = $newStatus;
  369. $mapping->save();
  370. $result['updated'] = true;
  371. Log::info('映射关系状态已更新', [
  372. 'mapping_id' => $mapping->id,
  373. 'urs_user_id' => $mapping->urs_user_id,
  374. 'farm_user_id' => $mapping->user_id,
  375. 'old_status' => $originalStatus,
  376. 'new_status' => $newStatus
  377. ]);
  378. }
  379. $result['valid'] = $isValid;
  380. $result['details'] = $details;
  381. $result['reasons'] = $reasons;
  382. } catch (\Exception $e) {
  383. Log::error('验证映射关系失败', [
  384. 'mapping_id' => $mapping->id,
  385. 'error' => $e->getMessage()
  386. ]);
  387. $result['reasons'][] = '验证过程发生异常: ' . $e->getMessage();
  388. }
  389. return $result;
  390. }
  391. /**
  392. * 同步用户信息
  393. *
  394. * @param UrsUserMapping $mapping 映射关系对象
  395. * @return array 同步结果 ['success' => bool, 'updated_fields' => array, 'sync_time' => string, 'error' => string]
  396. */
  397. public static function syncUserInfo(UrsUserMapping $mapping): array
  398. {
  399. $result = [
  400. 'success' => false,
  401. 'updated_fields' => [],
  402. 'sync_time' => '',
  403. 'error' => ''
  404. ];
  405. try {
  406. // 检查映射状态
  407. if ($mapping->status !== UrsUserMapping::STATUS_VALID) {
  408. $result['error'] = '映射关系状态无效,无法同步';
  409. return $result;
  410. }
  411. // 获取农场用户信息
  412. $farmUser = \App\Module\User\Models\User::find($mapping->user_id);
  413. if (!$farmUser) {
  414. $result['error'] = '农场用户不存在';
  415. return $result;
  416. }
  417. $updatedFields = [];
  418. $syncTime = now()->format('Y-m-d H:i:s');
  419. // 这里可以根据实际需求添加从URS系统同步用户信息的逻辑
  420. // 目前只是模拟同步过程,更新最后同步时间
  421. // 模拟同步用户昵称(如果需要的话)
  422. $expectedUsername = 'urs-' . $mapping->urs_user_id;
  423. if ($farmUser->username !== $expectedUsername) {
  424. // 检查新用户名是否已存在
  425. $existingUser = \App\Module\User\Models\User::where('username', $expectedUsername)
  426. ->where('id', '!=', $farmUser->id)
  427. ->first();
  428. if (!$existingUser) {
  429. $oldUsername = $farmUser->username;
  430. $farmUser->username = $expectedUsername;
  431. $farmUser->save();
  432. $updatedFields[] = "用户名: {$oldUsername} -> {$expectedUsername}";
  433. }
  434. }
  435. // 更新映射记录的最后同步时间(如果表中有这个字段的话)
  436. // $mapping->last_sync_time = now();
  437. // $mapping->save();
  438. $result['success'] = true;
  439. $result['updated_fields'] = $updatedFields;
  440. $result['sync_time'] = $syncTime;
  441. Log::info('用户信息同步成功', [
  442. 'mapping_id' => $mapping->id,
  443. 'urs_user_id' => $mapping->urs_user_id,
  444. 'farm_user_id' => $mapping->user_id,
  445. 'updated_fields' => $updatedFields,
  446. 'sync_time' => $syncTime
  447. ]);
  448. } catch (\Exception $e) {
  449. Log::error('用户信息同步失败', [
  450. 'mapping_id' => $mapping->id,
  451. 'error' => $e->getMessage()
  452. ]);
  453. $result['error'] = '同步过程发生异常: ' . $e->getMessage();
  454. }
  455. return $result;
  456. }
  457. /**
  458. * 获取活跃用户统计信息
  459. *
  460. * @return array
  461. */
  462. public static function getActiveUserStats(): array
  463. {
  464. return UrsUserMapping::getActiveUserStats();
  465. }
  466. /**
  467. * 批量更新用户活跃状态
  468. *
  469. * @param array $activeData 活跃数据 [urs_user_id => ['is_active' => 1, 'active_days_count' => 5]]
  470. * @return int 更新的记录数
  471. */
  472. public static function batchUpdateActiveStatus(array $activeData): int
  473. {
  474. return UrsUserMapping::batchUpdateActiveStatus($activeData);
  475. }
  476. /**
  477. * 获取活跃的URS用户ID列表
  478. *
  479. * @param array $ursUserIds URS用户ID数组
  480. * @return array 活跃的URS用户ID数组
  481. */
  482. public static function getActiveUrsUserIds(array $ursUserIds): array
  483. {
  484. return UrsUserMapping::getActiveUrsUserIds($ursUserIds);
  485. }
  486. /**
  487. * 检查用户是否活跃
  488. *
  489. * @param int $ursUserId URS用户ID
  490. * @return bool
  491. */
  492. public static function isUserActive(int $ursUserId): bool
  493. {
  494. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)
  495. ->where('status', UrsUserMapping::STATUS_VALID)
  496. ->first();
  497. return $mapping ? $mapping->isActive() : false;
  498. }
  499. /**
  500. * 更新单个用户的活跃状态
  501. *
  502. * @param int $ursUserId URS用户ID
  503. * @return bool
  504. */
  505. public static function updateUserActiveStatus(int $ursUserId): bool
  506. {
  507. return UrsActiveUserService::updateUserActiveStatus($ursUserId);
  508. }
  509. // ==================== userKey相关方法 ====================
  510. /**
  511. * 根据userKey获取农场用户ID
  512. *
  513. * @param string $userKey 用户凭证
  514. * @return int|null 农场用户ID,如果未找到返回null
  515. */
  516. public static function getFarmUserIdByUserKey(string $userKey): ?int
  517. {
  518. return UrsUserMapping::getFarmUserIdByUserKey($userKey);
  519. }
  520. /**
  521. * 根据userKey获取URS用户ID
  522. *
  523. * @param string $userKey 用户凭证
  524. * @return int|null URS用户ID,如果未找到返回null
  525. */
  526. public static function getUrsUserIdByUserKey(string $userKey): ?int
  527. {
  528. return UrsUserMapping::getUrsUserIdByUserKey($userKey);
  529. }
  530. /**
  531. * 根据userKey获取用户映射详情
  532. *
  533. * @param string $userKey 用户凭证
  534. * @return UrsUserMappingDto|null
  535. */
  536. public static function getMappingByUserKey(string $userKey): ?UrsUserMappingDto
  537. {
  538. $mapping = UrsUserMapping::findByUserKey($userKey);
  539. if (!$mapping) {
  540. return null;
  541. }
  542. return UrsUserMappingDto::fromModel($mapping);
  543. }
  544. /**
  545. * 批量根据userKey获取映射关系
  546. *
  547. * @param array $userKeys 用户凭证数组
  548. * @return array 映射关系数组 [userKey => UrsUserMappingDto]
  549. */
  550. public static function batchGetMappingsByUserKeys(array $userKeys): array
  551. {
  552. $mappings = UrsUserMapping::getMappingsByUserKeys($userKeys);
  553. $result = [];
  554. foreach ($mappings as $userKey => $mappingData) {
  555. $mapping = new UrsUserMapping();
  556. $mapping->fill($mappingData);
  557. $result[$userKey] = UrsUserMappingDto::fromModel($mapping);
  558. }
  559. return $result;
  560. }
  561. /**
  562. * 更新用户映射的userKey
  563. *
  564. * @param int $ursUserId URS用户ID
  565. * @param string $userKey 新的用户凭证
  566. * @return bool
  567. */
  568. public static function updateUserKey(int $ursUserId, string $userKey): bool
  569. {
  570. try {
  571. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)
  572. ->where('status', UrsUserMapping::STATUS_VALID)
  573. ->first();
  574. if (!$mapping) {
  575. Log::error('更新userKey失败:映射关系不存在', [
  576. 'urs_user_id' => $ursUserId,
  577. 'user_key' => $userKey
  578. ]);
  579. return false;
  580. }
  581. // 检查新的userKey是否已被其他用户使用
  582. $existingMapping = UrsUserMapping::where('user_key', $userKey)
  583. ->where('id', '!=', $mapping->id)
  584. ->where('status', UrsUserMapping::STATUS_VALID)
  585. ->first();
  586. if ($existingMapping) {
  587. Log::error('更新userKey失败:userKey已被其他用户使用', [
  588. 'urs_user_id' => $ursUserId,
  589. 'user_key' => $userKey,
  590. 'existing_urs_user_id' => $existingMapping->urs_user_id
  591. ]);
  592. return false;
  593. }
  594. $oldUserKey = $mapping->user_key;
  595. $mapping->user_key = $userKey;
  596. $mapping->save();
  597. Log::info('userKey更新成功', [
  598. 'urs_user_id' => $ursUserId,
  599. 'old_user_key' => $oldUserKey,
  600. 'new_user_key' => $userKey,
  601. 'mapping_id' => $mapping->id
  602. ]);
  603. return true;
  604. } catch (\Exception $e) {
  605. Log::error('更新userKey失败', [
  606. 'urs_user_id' => $ursUserId,
  607. 'user_key' => $userKey,
  608. 'error' => $e->getMessage()
  609. ]);
  610. return false;
  611. }
  612. }
  613. /**
  614. * 检查userKey是否已存在
  615. *
  616. * @param string $userKey 用户凭证
  617. * @return bool
  618. */
  619. public static function userKeyExists(string $userKey): bool
  620. {
  621. return UrsUserMapping::where('user_key', $userKey)
  622. ->where('status', UrsUserMapping::STATUS_VALID)
  623. ->exists();
  624. }
  625. /**
  626. * 根据userKey创建或获取农场用户ID(支持自动创建)
  627. *
  628. * @param string $userKey 用户凭证
  629. * @param int $ursUserId URS用户ID
  630. * @return int|null 农场用户ID,创建失败时返回null
  631. */
  632. public static function getFarmUserIdByUserKeyWithAutoCreate(string $userKey, int $ursUserId): ?int
  633. {
  634. // 首先尝试根据userKey查找现有映射
  635. $farmUserId = self::getFarmUserIdByUserKey($userKey);
  636. if ($farmUserId !== null) {
  637. return $farmUserId;
  638. }
  639. // 如果没有找到,尝试根据ursUserId查找并更新userKey
  640. $existingMapping = UrsUserMapping::where('urs_user_id', $ursUserId)
  641. ->where('status', UrsUserMapping::STATUS_VALID)
  642. ->first();
  643. if ($existingMapping) {
  644. // 更新现有映射的userKey
  645. if (self::updateUserKey($ursUserId, $userKey)) {
  646. return $existingMapping->user_id;
  647. }
  648. return null;
  649. }
  650. // 如果都没有找到,自动创建新的映射关系
  651. return self::getFarmUserId($ursUserId, $userKey);
  652. }
  653. }