huliguo
18 小时以前 c4abb3711bcee356935339f7c9fd9e2b58dee2bf
修改bug
7个文件已修改
150 ■■■■ 已修改文件
src/main/java/com/linghu/controller/CollectController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/KeywordController.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/QuestionController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/UserController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/model/excel/FeedExportExcel.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/model/excel/ReferenceExcel.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/keywordMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | 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