| | |
| | | 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; |
| | | |
| | |
| | | }) |
| | | .onErrorResume(e -> { |
| | | System.out.println("获取任务结果失败"); |
| | | if (e.getMessage().contains("登陆失败")){ |
| | | |
| | | } |
| | | TaskResultResponse result = new TaskResultResponse(); |
| | | result.setDetail("获取任务结果失败: " + e.getMessage()); |
| | | return Mono.just(result); |
| | |
| | | // } |
| | | // }); |
| | | // } |
| | | /** |
| | | * 获取或创建平台(确保同一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 { |
| | |
| | | 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(); |
| | | // 设置基本字段 |
| | |
| | | reference.setKeyword_id(keyword.getKeyword_id()); |
| | | reference.setCreate_time(LocalDateTime.now()); |
| | | |
| | | // 处理平台和类型关联 |
| | | /* // 处理平台和类型关联 |
| | | Platform platform = platformService.getPlatformByDomain(reference.getDomain()); |
| | | if (platform == null) { |
| | | // 平台不存在,创建新平台(类型默认为“默认”) |
| | |
| | | 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); |
| | | } |
| | |
| | | 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. 批量更新问题 |