src/main/java/com/linghu/controller/CollectController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/KeywordController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/QuestionController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/UserController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/model/excel/FeedExportExcel.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/model/excel/ReferenceExcel.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/keywordMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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; @@ -567,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 { @@ -745,7 +789,7 @@ reference.setKeyword_id(keyword.getKeyword_id()); reference.setCreate_time(LocalDateTime.now()); // 处理平台和类型关联 /* // 处理平台和类型关联 Platform platform = platformService.getPlatformByDomain(reference.getDomain()); if (platform == null) { // 平台不存在,创建新平台(类型默认为“默认”) @@ -774,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); } src/main/java/com/linghu/controller/KeywordController.java
@@ -382,9 +382,12 @@ )); //time Map<LocalDateTime, FeedExportExcel> timeMap = references.stream() // 定义日期格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); Map<String, FeedExportExcel> timeMap = references.stream() .collect(Collectors.toMap( FeedExportExcel::getCreate_time, // Key映射 excel -> excel.getCreate_time().format(formatter), excel -> excel, // Value映射 (oldValue, newValue) -> oldValue // 键冲突处理(保留旧值) )); @@ -423,9 +426,6 @@ errorMessages.add("发布网址不能为空"); continue; } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime = LocalDateTime.parse(excel.getCreate_time(), formatter); excel.setCreateTimeAsDateTime(dateTime); FeedExportExcel feedExportExcel = getFeedExportExcel(excel, nameMap, urlMap, titleMap, timeMap); result.add(feedExportExcel); @@ -448,13 +448,15 @@ } } private FeedExportExcel getFeedExportExcel(ReferenceExcel excel, Map<String, FeedExportExcel> nameMap, Map<String, FeedExportExcel> urlMap, Map<String, FeedExportExcel> titleMap, Map<LocalDateTime, FeedExportExcel> timeMap) { private FeedExportExcel getFeedExportExcel(ReferenceExcel excel, Map<String, FeedExportExcel> nameMap, Map<String, FeedExportExcel> urlMap, Map<String, FeedExportExcel> titleMap, Map<String, FeedExportExcel> timeMap) { FeedExportExcel vo=new FeedExportExcel(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); excel.setTimeString(excel.getCreate_time().format(formatter)); vo.setPlatform_name(excel.getPlatform_name()); vo.setTitle(excel.getTitle()); vo.setCreate_time(excel.getCreateTimeAsDateTime()); vo.setCreate_time(excel.getCreate_time()); vo.setUrl(excel.getUrl()); vo.setInclusionStatus("未收录"); vo.setInclusionStatus("未选择"); vo.setPlatformIs(0); vo.setTitleIs(0); vo.setUrlIs(0); @@ -468,7 +470,7 @@ if (titleMap.containsKey(excel.getTitle())) { vo.setTitleIs(1); } if (timeMap.containsKey(excel.getCreateTimeAsDateTime())) { if (timeMap.containsKey(excel.getTimeString())) { vo.setCreateIs(1); } return vo; @@ -479,7 +481,7 @@ if (titleMap.containsKey(excel.getTitle())) { vo.setTitleIs(1); } if (timeMap.containsKey(excel.getCreateTimeAsDateTime())) { if (timeMap.containsKey(excel.getTimeString())) { vo.setCreateIs(1); } return vo; @@ -487,12 +489,12 @@ //标题 if (titleMap.containsKey(excel.getTitle())) { vo.setTitleIs(1); if (timeMap.containsKey(excel.getCreateTimeAsDateTime())) { if (timeMap.containsKey(excel.getTimeString())) { vo.setCreateIs(1); } } //时间 if (timeMap.containsKey(excel.getCreateTimeAsDateTime())) { if (timeMap.containsKey(excel.getTimeString())) { vo.setCreateIs(1); return vo; } @@ -508,9 +510,35 @@ public ResponseEntity<byte[]> exportGetResultByPlatformId(@RequestBody ExportFeedDTO dto) { // 3. 导出Excel ByteArrayOutputStream out = new ByteArrayOutputStream(); EasyExcel.write(out, FeedExportExcel.class) .sheet("导出投喂结果") .doWrite(dto.getExcels()); List<String> statusList = new ArrayList<>(); statusList.add("未收录"); statusList.add("已收录"); statusList.add("未选择"); // 3. 使用自定义的SheetWriteHandler来添加数据验证 ExcelWriter excelWriter = EasyExcel.write(out, FeedExportExcel.class) .registerWriteHandler(new SheetWriteHandler() { @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { Sheet sheet = writeSheetHolder.getSheet(); // 添加数据验证(下拉框) DataValidationHelper helper = sheet.getDataValidationHelper(); CellRangeAddressList rangeList = new CellRangeAddressList( 1, 65535, 2, 2); // D列(第4列) DataValidationConstraint constraint = helper.createExplicitListConstraint( statusList.toArray(new String[0])); DataValidation validation = helper.createValidation(constraint, rangeList); sheet.addValidationData(validation); } }) .build(); // 4. 写入空数据 WriteSheet writeSheet = EasyExcel.writerSheet("账号模板").build(); excelWriter.write(dto.getExcels(), writeSheet); excelWriter.finish(); // 4. 构建响应 return ResponseEntity.ok() src/main/java/com/linghu/controller/QuestionController.java
@@ -148,7 +148,7 @@ EasyExcel.write(out, QuestionExcel.class).sheet("提问词模板").doWrite(new ArrayList<>()); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=question_template.xlsx") .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=提问词条导入模板.xlsx") .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(out.toByteArray()); } src/main/java/com/linghu/controller/UserController.java
@@ -82,6 +82,10 @@ if (list != null && list.size() > 0) { return ResponseResult.success("该邮箱已存在"); } if (!user1.getUser_email().equals(user.getUser_email())||!user1.getPassword().equals(user.getPassword())) { user1.setStatus("正常"); } userService.updateById(user); return ResponseResult.success(); @@ -212,7 +216,9 @@ List<User> insertUserList = new ArrayList<>(); List<String> errorMessages = new ArrayList<>(); Set<String> emailSet = new HashSet<>(); // 用于校验导入数据中的邮箱重复 if (excelDataList.isEmpty()) { return ResponseResult.error("导入失败,数据不能为空"); } for (ExcelDataWithRow<UserExcel> excelData : excelDataList) { int rowNum = excelData.getRowNumber(); UserExcel excelRowData = excelData.getData(); src/main/java/com/linghu/model/excel/FeedExportExcel.java
@@ -1,10 +1,13 @@ package com.linghu.model.excel; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.time.LocalDateTime; @Data @@ -13,27 +16,32 @@ @ApiModelProperty("平台名称") private String platform_name; @ApiModelProperty("平台是否匹配 0-否 1-是") @ExcelIgnore private Integer platformIs; @ExcelProperty("标题") @ApiModelProperty("标题") private String title; @ApiModelProperty("标题是否匹配 0-否 1-是") @ExcelIgnore private Integer titleIs; @ExcelProperty("发布时间") @ApiModelProperty("发布时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime create_time; @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate create_time; @ApiModelProperty("发布时间是否匹配 0-否 1-是") @ExcelIgnore private Integer createIs; @ExcelProperty("发布网址") @ApiModelProperty("发布网址") private String url; @ApiModelProperty("发布网址是否匹配 0-否 1-是") @ExcelIgnore private Integer urlIs; @ExcelProperty("收录情况") src/main/java/com/linghu/model/excel/ReferenceExcel.java
@@ -3,25 +3,32 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.time.LocalDateTime; @Data public class ReferenceExcel { @ExcelProperty("平台名称") @ExcelProperty("发布平台") private String platform_name; @ExcelProperty("标题") private String title; @ExcelProperty("发布时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String create_time; // 关键:指定日期格式为 yyyy-MM-dd HH:mm:ss @DateTimeFormat(pattern = "yyyy/MM/dd") @JsonFormat(pattern = "yyyy/MM/dd") private LocalDate create_time; @ExcelProperty("发布网址") private String url; @ExcelIgnore private LocalDateTime createTimeAsDateTime; @ExcelIgnore @ApiModelProperty(hidden = true) private String timeString; } src/main/resources/mapper/keywordMapper.xml
@@ -50,6 +50,7 @@ p.platform_name ORDER BY total_repetitions DESC LIMIT 30 </select> <select id="getResultByTypeId" resultType="com.linghu.model.vo.PlatformProportionVO"> SELECT @@ -95,7 +96,7 @@ </if> GROUP BY t.type_name,p.platform_name ORDER BY r.repetition_num DESC total_repetitions DESC </select> <select id="getResultByPlatformId" resultType="com.linghu.model.vo.ResultListVO"> SELECT