From c4abb3711bcee356935339f7c9fd9e2b58dee2bf Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期日, 13 七月 2025 00:05:02 +0800
Subject: [PATCH] 修改bug

---
 src/main/java/com/linghu/controller/CollectController.java |   75 ++++++++++++++++++++++++++++++++++---
 1 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/linghu/controller/CollectController.java b/src/main/java/com/linghu/controller/CollectController.java
index 6bc388f..4f1f7bd 100644
--- a/src/main/java/com/linghu/controller/CollectController.java
+++ b/src/main/java/com/linghu/controller/CollectController.java
@@ -16,6 +16,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.http.*;
 import org.springframework.web.reactive.function.client.WebClient;
 
@@ -496,9 +497,6 @@
                 })
                 .onErrorResume(e -> {
                     System.out.println("获取任务结果失败");
-                    if (e.getMessage().contains("登陆失败")){
-
-                    }
                         TaskResultResponse result = new TaskResultResponse();
                     result.setDetail("获取任务结果失败: " + e.getMessage());
                     return Mono.just(result);
@@ -570,7 +568,50 @@
 //            }
 //        });
 //    }
+    /**
+     * 获取或创建平台(确保同一domain只创建一次)
+     * @param domain 平台域名
+     * @return 已存在或新创建的Platform
+     */
+    private Platform getOrCreatePlatform(String domain) {
+        // 1. 先尝试查询已存在的平台
+        Platform platform = platformService.getPlatformByDomain(domain);
+        if (platform != null) {
+            return platform;
+        }
 
+        // 2. 若不存在,尝试创建(处理并发场景)
+        try {
+            // 2.1 获取或创建“默认”类型(Type也需避免重复,建议Type表的type_name也加唯一约束)
+            Type defaultType = typeService.getOne(new LambdaQueryWrapper<Type>()
+                    .eq(Type::getType_name, "默认"));
+            if (defaultType == null) {
+                defaultType = new Type();
+                defaultType.setType_name("默认");
+                typeService.save(defaultType); // 若Type可能重复,此处也需处理DuplicateKeyException
+            }
+
+            // 2.2 构建新平台对象
+            Platform newPlatform = new Platform();
+            newPlatform.setDomain(domain);
+            newPlatform.setPlatform_name(domain); // 平台名称默认使用域名,可根据实际需求调整
+            newPlatform.setType_id(defaultType.getType_id());
+            newPlatform.setCreate_time(LocalDateTime.now()); // 补充创建时间
+
+            // 2.3 尝试保存,若因唯一约束冲突失败,则捕获异常
+            platformService.save(newPlatform);
+            return newPlatform; // 保存成功,返回新创建的平台
+
+        } catch (DuplicateKeyException e) {
+            // 3. 若捕获到重复键异常,说明并发创建了,重新查询即可(此时数据库中已存在该平台)
+            log.warn("平台domain={}已存在,无需重复创建", domain, e);
+            return platformService.getPlatformByDomain(domain); // 重新查询,一定能获取到
+        } catch (Exception e) {
+            // 处理其他异常(如数据库连接失败等)
+            log.error("创建平台失败,domain={}", domain, e);
+            throw new RuntimeException("创建平台失败", e);
+        }
+    }
     private Mono<Void> updateQuestionAndReference(TaskResultResponse result) {
         return Mono.fromRunnable(() -> {
             try {
@@ -728,14 +769,14 @@
                                                     return reference;
                                                 })
                                                 .collect(Collectors.toList());*/
-// 初始化引用列表(避免null)
+                                // 初始化引用列表(避免null)
                                 List<Reference> references = new ArrayList<>();
                                 List<TaskResultResponse.Reference> originalReferences = questionResult.getReferences();
                                 if (originalReferences == null) {
                                     originalReferences = Collections.emptyList();
                                 }
 
-// 遍历原始引用列表,转换为Reference对象
+                                // 遍历原始引用列表,转换为Reference对象
                                 for (TaskResultResponse.Reference ref : originalReferences) { // 注意:需将“原引用类型”替换为实际类型(如QuestionResult中的引用类型)
                                     Reference reference = new Reference();
                                     // 设置基本字段
@@ -748,7 +789,7 @@
                                     reference.setKeyword_id(keyword.getKeyword_id());
                                     reference.setCreate_time(LocalDateTime.now());
 
-                                    // 处理平台和类型关联
+                                   /* // 处理平台和类型关联
                                     Platform platform = platformService.getPlatformByDomain(reference.getDomain());
                                     if (platform == null) {
                                         // 平台不存在,创建新平台(类型默认为“默认”)
@@ -777,7 +818,11 @@
                                             reference.setType_id(type.getType_id());
                                         }
                                     }
-
+*/
+                                    // 关键:使用优化后的方法获取平台,避免重复创建
+                                    Platform platform = getOrCreatePlatform(ref.getDomain());
+                                    reference.setPlatform_id(platform.getPlatform_id());
+                                    reference.setType_id(platform.getType_id()); // 直接从平台获取类型ID,更可靠
                                     // 添加到结果列表
                                     references.add(reference);
                                 }
@@ -838,6 +883,22 @@
                             System.out.println("处理问题结果失败: " + e.getMessage());
                         }
                     }
+                    //更新账号状态
+                    if ( "failed".equals(userResult.getStatus())){
+                        if (userResult.getError().contains("登录失败")){
+                            LambdaUpdateWrapper<User> userWrapper =  new LambdaUpdateWrapper<>();
+                            userWrapper.eq(User::getUser_email, userResult.getUser_email());
+                            userWrapper.set(User::getStatus, "无法登录");
+                            userService.update(userWrapper);
+
+                        }else if (userResult.getError().contains("信息错误")){
+                            LambdaUpdateWrapper<User> userWrapper =  new LambdaUpdateWrapper<>();
+                            userWrapper.eq(User::getUser_email, userResult.getUser_email());
+                            userWrapper.set(User::getStatus, "信息错误");
+                            userService.update(userWrapper);
+                        }
+                    }
+
                 }
 
                 // 4. 批量更新问题

--
Gitblit v1.7.1