UrsUserMappingService.php 24 KB

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