UrsUserMappingService.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757
  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)
  300. ->where('status', UrsUserMapping::STATUS_VALID)
  301. ->first();
  302. if (!$mapping) {
  303. return 0;
  304. }
  305. return $mapping->urs_user_id;
  306. }
  307. /**
  308. * 验证映射关系有效性
  309. *
  310. * @param UrsUserMapping $mapping 映射关系对象
  311. * @return array 验证结果 ['valid' => bool, 'updated' => bool, 'details' => array, 'reasons' => array]
  312. */
  313. public static function validateMapping(UrsUserMapping $mapping): array
  314. {
  315. $result = [
  316. 'valid' => false,
  317. 'updated' => false,
  318. 'details' => [],
  319. 'reasons' => []
  320. ];
  321. try {
  322. $isValid = true;
  323. $details = [];
  324. $reasons = [];
  325. // 检查URS用户ID是否有效
  326. if ($mapping->urs_user_id <= 0) {
  327. $isValid = false;
  328. $reasons[] = 'URS用户ID无效';
  329. } else {
  330. $details[] = "URS用户ID: {$mapping->urs_user_id}";
  331. }
  332. // 检查农场用户ID是否有效
  333. if ($mapping->user_id <= 0) {
  334. $isValid = false;
  335. $reasons[] = '农场用户ID无效';
  336. } else {
  337. // 检查农场用户是否存在
  338. $farmUser = \App\Module\User\Models\User::find($mapping->user_id);
  339. if (!$farmUser) {
  340. $isValid = false;
  341. $reasons[] = '农场用户不存在';
  342. } else {
  343. $details[] = "农场用户: {$farmUser->username} (ID: {$mapping->user_id})";
  344. }
  345. }
  346. // 检查是否存在重复映射
  347. $duplicateUrsMapping = UrsUserMapping::where('urs_user_id', $mapping->urs_user_id)
  348. ->where('id', '!=', $mapping->id)
  349. ->first();
  350. if ($duplicateUrsMapping) {
  351. $isValid = false;
  352. $reasons[] = "URS用户ID {$mapping->urs_user_id} 存在重复映射";
  353. }
  354. $duplicateFarmMapping = UrsUserMapping::where('user_id', $mapping->user_id)
  355. ->where('id', '!=', $mapping->id)
  356. ->first();
  357. if ($duplicateFarmMapping) {
  358. $isValid = false;
  359. $reasons[] = "农场用户ID {$mapping->user_id} 存在重复映射";
  360. }
  361. // 检查映射时间是否合理
  362. if ($mapping->mapping_time && $mapping->mapping_time->isFuture()) {
  363. $isValid = false;
  364. $reasons[] = '映射时间不能是未来时间';
  365. } else if ($mapping->mapping_time) {
  366. $details[] = "映射时间: {$mapping->mapping_time->format('Y-m-d H:i:s')}";
  367. }
  368. // 更新映射状态
  369. $originalStatus = $mapping->status;
  370. $newStatus = $isValid ? UrsUserMapping::STATUS_VALID : UrsUserMapping::STATUS_INVALID;
  371. if ($originalStatus !== $newStatus) {
  372. $mapping->status = $newStatus;
  373. $mapping->save();
  374. $result['updated'] = true;
  375. Log::info('映射关系状态已更新', [
  376. 'mapping_id' => $mapping->id,
  377. 'urs_user_id' => $mapping->urs_user_id,
  378. 'farm_user_id' => $mapping->user_id,
  379. 'old_status' => $originalStatus,
  380. 'new_status' => $newStatus
  381. ]);
  382. }
  383. $result['valid'] = $isValid;
  384. $result['details'] = $details;
  385. $result['reasons'] = $reasons;
  386. } catch (\Exception $e) {
  387. Log::error('验证映射关系失败', [
  388. 'mapping_id' => $mapping->id,
  389. 'error' => $e->getMessage()
  390. ]);
  391. $result['reasons'][] = '验证过程发生异常: ' . $e->getMessage();
  392. }
  393. return $result;
  394. }
  395. /**
  396. * 同步用户信息
  397. *
  398. * @param UrsUserMapping $mapping 映射关系对象
  399. * @return array 同步结果 ['success' => bool, 'updated_fields' => array, 'sync_time' => string, 'error' => string]
  400. */
  401. public static function syncUserInfo(UrsUserMapping $mapping): array
  402. {
  403. $result = [
  404. 'success' => false,
  405. 'updated_fields' => [],
  406. 'sync_time' => '',
  407. 'error' => ''
  408. ];
  409. try {
  410. // 检查映射状态
  411. if ($mapping->status !== UrsUserMapping::STATUS_VALID) {
  412. $result['error'] = '映射关系状态无效,无法同步';
  413. return $result;
  414. }
  415. // 获取农场用户信息
  416. $farmUser = \App\Module\User\Models\User::find($mapping->user_id);
  417. if (!$farmUser) {
  418. $result['error'] = '农场用户不存在';
  419. return $result;
  420. }
  421. $updatedFields = [];
  422. $syncTime = now()->format('Y-m-d H:i:s');
  423. // 这里可以根据实际需求添加从URS系统同步用户信息的逻辑
  424. // 目前只是模拟同步过程,更新最后同步时间
  425. // 模拟同步用户昵称(如果需要的话)
  426. $expectedUsername = 'urs-' . $mapping->urs_user_id;
  427. if ($farmUser->username !== $expectedUsername) {
  428. // 检查新用户名是否已存在
  429. $existingUser = \App\Module\User\Models\User::where('username', $expectedUsername)
  430. ->where('id', '!=', $farmUser->id)
  431. ->first();
  432. if (!$existingUser) {
  433. $oldUsername = $farmUser->username;
  434. $farmUser->username = $expectedUsername;
  435. $farmUser->save();
  436. $updatedFields[] = "用户名: {$oldUsername} -> {$expectedUsername}";
  437. }
  438. }
  439. // 更新映射记录的最后同步时间(如果表中有这个字段的话)
  440. // $mapping->last_sync_time = now();
  441. // $mapping->save();
  442. $result['success'] = true;
  443. $result['updated_fields'] = $updatedFields;
  444. $result['sync_time'] = $syncTime;
  445. Log::info('用户信息同步成功', [
  446. 'mapping_id' => $mapping->id,
  447. 'urs_user_id' => $mapping->urs_user_id,
  448. 'farm_user_id' => $mapping->user_id,
  449. 'updated_fields' => $updatedFields,
  450. 'sync_time' => $syncTime
  451. ]);
  452. } catch (\Exception $e) {
  453. Log::error('用户信息同步失败', [
  454. 'mapping_id' => $mapping->id,
  455. 'error' => $e->getMessage()
  456. ]);
  457. $result['error'] = '同步过程发生异常: ' . $e->getMessage();
  458. }
  459. return $result;
  460. }
  461. /**
  462. * 获取活跃用户统计信息
  463. *
  464. * @return array
  465. */
  466. public static function getActiveUserStats(): array
  467. {
  468. return UrsUserMapping::getActiveUserStats();
  469. }
  470. /**
  471. * 批量更新用户活跃状态
  472. *
  473. * @param array $activeData 活跃数据 [urs_user_id => ['is_active' => 1, 'active_days_count' => 5]]
  474. * @return int 更新的记录数
  475. */
  476. public static function batchUpdateActiveStatus(array $activeData): int
  477. {
  478. return UrsUserMapping::batchUpdateActiveStatus($activeData);
  479. }
  480. /**
  481. * 获取活跃的URS用户ID列表
  482. *
  483. * @param array $ursUserIds URS用户ID数组
  484. * @return array 活跃的URS用户ID数组
  485. */
  486. public static function getActiveUrsUserIds(array $ursUserIds): array
  487. {
  488. return UrsUserMapping::getActiveUrsUserIds($ursUserIds);
  489. }
  490. /**
  491. * 检查用户是否活跃
  492. *
  493. * @param int $ursUserId URS用户ID
  494. * @return bool
  495. */
  496. public static function isUserActive(int $ursUserId): bool
  497. {
  498. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)
  499. ->where('status', UrsUserMapping::STATUS_VALID)
  500. ->first();
  501. return $mapping ? $mapping->isActive() : false;
  502. }
  503. /**
  504. * 更新单个用户的活跃状态
  505. *
  506. * @param int $ursUserId URS用户ID
  507. * @return bool
  508. */
  509. public static function updateUserActiveStatus(int $ursUserId): bool
  510. {
  511. return UrsActiveUserService::updateUserActiveStatus($ursUserId);
  512. }
  513. // ==================== userKey相关方法 ====================
  514. /**
  515. * 根据userKey获取农场用户ID
  516. *
  517. * @param string $userKey 用户凭证
  518. * @return int|null 农场用户ID,如果未找到返回null
  519. */
  520. public static function getFarmUserIdByUserKey(string $userKey): ?int
  521. {
  522. return UrsUserMapping::getFarmUserIdByUserKey($userKey);
  523. }
  524. /**
  525. * 根据userKey获取URS用户ID
  526. *
  527. * @param string $userKey 用户凭证
  528. * @return int|null URS用户ID,如果未找到返回null
  529. */
  530. public static function getUrsUserIdByUserKey(string $userKey): ?int
  531. {
  532. return UrsUserMapping::getUrsUserIdByUserKey($userKey);
  533. }
  534. /**
  535. * 根据userKey获取用户映射详情
  536. *
  537. * @param string $userKey 用户凭证
  538. * @return UrsUserMappingDto|null
  539. */
  540. public static function getMappingByUserKey(string $userKey): ?UrsUserMappingDto
  541. {
  542. $mapping = UrsUserMapping::findByUserKey($userKey);
  543. if (!$mapping) {
  544. return null;
  545. }
  546. return UrsUserMappingDto::fromModel($mapping);
  547. }
  548. /**
  549. * 批量根据userKey获取映射关系
  550. *
  551. * @param array $userKeys 用户凭证数组
  552. * @return array 映射关系数组 [userKey => UrsUserMappingDto]
  553. */
  554. public static function batchGetMappingsByUserKeys(array $userKeys): array
  555. {
  556. $mappings = UrsUserMapping::getMappingsByUserKeys($userKeys);
  557. $result = [];
  558. foreach ($mappings as $userKey => $mappingData) {
  559. $mapping = new UrsUserMapping();
  560. $mapping->fill($mappingData);
  561. $result[$userKey] = UrsUserMappingDto::fromModel($mapping);
  562. }
  563. return $result;
  564. }
  565. /**
  566. * 更新用户映射的userKey
  567. *
  568. * @param int $ursUserId URS用户ID
  569. * @param string $userKey 新的用户凭证
  570. * @return bool
  571. */
  572. public static function updateUserKey(int $ursUserId, string $userKey): bool
  573. {
  574. try {
  575. $mapping = UrsUserMapping::where('urs_user_id', $ursUserId)
  576. ->where('status', UrsUserMapping::STATUS_VALID)
  577. ->first();
  578. if (!$mapping) {
  579. Log::error('更新userKey失败:映射关系不存在', [
  580. 'urs_user_id' => $ursUserId,
  581. 'user_key' => $userKey
  582. ]);
  583. return false;
  584. }
  585. // 检查新的userKey是否已被其他用户使用
  586. $existingMapping = UrsUserMapping::where('user_key', $userKey)
  587. ->where('id', '!=', $mapping->id)
  588. ->where('status', UrsUserMapping::STATUS_VALID)
  589. ->first();
  590. if ($existingMapping) {
  591. Log::error('更新userKey失败:userKey已被其他用户使用', [
  592. 'urs_user_id' => $ursUserId,
  593. 'user_key' => $userKey,
  594. 'existing_urs_user_id' => $existingMapping->urs_user_id
  595. ]);
  596. return false;
  597. }
  598. $oldUserKey = $mapping->user_key;
  599. $mapping->user_key = $userKey;
  600. $mapping->save();
  601. Log::info('userKey更新成功', [
  602. 'urs_user_id' => $ursUserId,
  603. 'old_user_key' => $oldUserKey,
  604. 'new_user_key' => $userKey,
  605. 'mapping_id' => $mapping->id
  606. ]);
  607. return true;
  608. } catch (\Exception $e) {
  609. Log::error('更新userKey失败', [
  610. 'urs_user_id' => $ursUserId,
  611. 'user_key' => $userKey,
  612. 'error' => $e->getMessage()
  613. ]);
  614. return false;
  615. }
  616. }
  617. /**
  618. * 检查userKey是否已存在
  619. *
  620. * @param string $userKey 用户凭证
  621. * @return bool
  622. */
  623. public static function userKeyExists(string $userKey): bool
  624. {
  625. return UrsUserMapping::where('user_key', $userKey)
  626. ->where('status', UrsUserMapping::STATUS_VALID)
  627. ->exists();
  628. }
  629. /**
  630. * 根据userKey创建或获取农场用户ID(支持自动创建)
  631. *
  632. * @param string $userKey 用户凭证
  633. * @param int $ursUserId URS用户ID
  634. * @return int|null 农场用户ID,创建失败时返回null
  635. */
  636. public static function getFarmUserIdByUserKeyWithAutoCreate(string $userKey, int $ursUserId): ?int
  637. {
  638. // 首先尝试根据userKey查找现有映射
  639. $farmUserId = self::getFarmUserIdByUserKey($userKey);
  640. if ($farmUserId !== null) {
  641. return $farmUserId;
  642. }
  643. // 如果没有找到,尝试根据ursUserId查找并更新userKey
  644. $existingMapping = UrsUserMapping::where('urs_user_id', $ursUserId)
  645. ->where('status', UrsUserMapping::STATUS_VALID)
  646. ->first();
  647. if ($existingMapping) {
  648. // 更新现有映射的userKey
  649. if (self::updateUserKey($ursUserId, $userKey)) {
  650. return $existingMapping->user_id;
  651. }
  652. return null;
  653. }
  654. // 如果都没有找到,自动创建新的映射关系
  655. return self::getFarmUserId($ursUserId, $userKey);
  656. }
  657. }