| | |
| | | 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 { |
| | |
| | | |
| | | questionsToUpdate.add(question); |
| | | |
| | | List<Reference> references = |
| | | /* List<Reference> references = |
| | | Optional.ofNullable(questionResult.getReferences()) |
| | | .orElse(Collections.emptyList()) |
| | | .stream() |
| | |
| | | } |
| | | return reference; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | .collect(Collectors.toList());*/ |
| | | // 初始化引用列表(避免null) |
| | | List<Reference> references = new ArrayList<>(); |
| | | List<TaskResultResponse.Reference> originalReferences = questionResult.getReferences(); |
| | | if (originalReferences == null) { |
| | | originalReferences = Collections.emptyList(); |
| | | } |
| | | |
| | | // 遍历原始引用列表,转换为Reference对象 |
| | | for (TaskResultResponse.Reference ref : originalReferences) { // 注意:需将“原引用类型”替换为实际类型(如QuestionResult中的引用类型) |
| | | Reference reference = new Reference(); |
| | | // 设置基本字段 |
| | | reference.setQuestion_id(question.getQuestion_id()); |
| | | reference.setTitle(ref.getTitle()); |
| | | reference.setUrl(ref.getUrl()); |
| | | reference.setDomain(ref.getDomain()); |
| | | reference.setNum(keyword.getNum()); |
| | | reference.setTask_id(result.getTask_id()); |
| | | reference.setKeyword_id(keyword.getKeyword_id()); |
| | | reference.setCreate_time(LocalDateTime.now()); |
| | | |
| | | /* // 处理平台和类型关联 |
| | | Platform platform = platformService.getPlatformByDomain(reference.getDomain()); |
| | | if (platform == null) { |
| | | // 平台不存在,创建新平台(类型默认为“默认”) |
| | | Type type = typeService.getOne(new LambdaQueryWrapper<Type>().eq(Type::getType_name, "默认")); |
| | | if (type == null) { |
| | | Type newType = new Type(); |
| | | newType.setType_name("默认"); |
| | | typeService.save(newType); |
| | | type = newType; |
| | | } |
| | | Platform platform1 = new Platform(); |
| | | platform1.setDomain(reference.getDomain()); |
| | | platform1.setPlatform_name(reference.getDomain()); |
| | | platform1.setType_id(type.getType_id()); |
| | | platform1.setCreate_time(LocalDateTime.now()); |
| | | platformService.save(platform1); |
| | | |
| | | // 关联新平台和类型 |
| | | reference.setType_id(type.getType_id()); |
| | | reference.setPlatform_id(platform1.getPlatform_id()); |
| | | } else { |
| | | // 平台已存在,直接关联 |
| | | reference.setPlatform_id(platform.getPlatform_id()); |
| | | Type type = typeService.getById(platform.getType_id()); |
| | | if (type != 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); |
| | | } |
| | | // 添加到总引用列表 |
| | | if (!references.isEmpty()) { |
| | | allReferences.addAll(references); |
| | |
| | | int repetitionCount = refGroup.size() - 1; |
| | | |
| | | // 3.3 决定最终保留的记录 |
| | | Reference recordToSave; |
| | | Reference recordToSave = new Reference(); |
| | | if (existingRecord.isPresent()) { |
| | | // 使用已有ID的记录并更新重复次数 |
| | | recordToSave = existingRecord.get(); |
| | | recordToSave.setRepetition_num( |
| | | (recordToSave.getRepetition_num() == null ? 0 : recordToSave.getRepetition_num()) |
| | | (recordToSave.getRepetition_num() == null ? 1 : recordToSave.getRepetition_num()) |
| | | + repetitionCount |
| | | ); |
| | | } else { |
| | | // 没有ID记录则取第一条并设置重复次数 |
| | | recordToSave = refGroup.get(0); |
| | | recordToSave.setRepetition_num(repetitionCount); |
| | | recordToSave.setRepetition_num(1+repetitionCount); |
| | | } |
| | | |
| | | resultList.add(recordToSave); |
| | |
| | | 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. 批量更新问题 |