UrsUserMappingService.php 24 KB

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