From b82f44543e9b9ade3ba8920e94b0e9de35222053 Mon Sep 17 00:00:00 2001 From: luke Date: Sat, 21 Jun 2025 22:02:55 +0800 Subject: [PATCH] fix --- .../application/service/DocAppService.java | 7 ++++ .../service/DocAppServiceImpl.java | 7 ++++ .../common/enums/SearchableStatusEnum.java | 1 + .../repository/iface/OSRecordRepository.java | 15 ++++++- .../doc/service/iface/FileDomainService.java | 15 ++++++- .../impl/AbstractBaseFileImporter.java | 2 +- .../service/impl/FileDomainServiceImpl.java | 14 ++++--- .../north/controller/FileWriteController.java | 3 ++ .../doc/OSRecordRepositoryImpl.java | 41 ++++++++++++++++--- .../base/infrastructure/util/DateUtil.java | 5 +++ 10 files changed, 93 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/knowledge/base/application/service/DocAppService.java b/src/main/java/com/knowledge/base/application/service/DocAppService.java index fed3096..8a7e0f7 100644 --- a/src/main/java/com/knowledge/base/application/service/DocAppService.java +++ b/src/main/java/com/knowledge/base/application/service/DocAppService.java @@ -41,4 +41,11 @@ public interface DocAppService { * 保存上传记录 */ void saveOSUplodRecord(OSRecordDTO dto); + + /** + * 将同路径下上传的历史同名文件,全部抛弃 + * @param localRelaFilePath + * @param latestMillis --- 最新版本文件的上传时间(毫秒) + */ + int markOldSearchableRecordsAsDiscarded(String localRelaFilePath, long latestMillis); } diff --git a/src/main/java/com/knowledge/base/application/service/DocAppServiceImpl.java b/src/main/java/com/knowledge/base/application/service/DocAppServiceImpl.java index 4c4af29..0e2d338 100644 --- a/src/main/java/com/knowledge/base/application/service/DocAppServiceImpl.java +++ b/src/main/java/com/knowledge/base/application/service/DocAppServiceImpl.java @@ -3,6 +3,7 @@ package com.knowledge.base.application.service; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import com.knowledge.base.application.exceptions.AppException; +import com.knowledge.base.domain.common.enums.SearchableStatusEnum; import com.knowledge.base.domain.common.model.PageResult; import com.knowledge.base.domain.doc.model.OSRecordDO; import com.knowledge.base.domain.doc.service.iface.FileDomainService; @@ -119,4 +120,10 @@ public class DocAppServiceImpl implements DocAppService{ throw new AppException("保存对象存储记录失败!", e); } } + + @Override + public int markOldSearchableRecordsAsDiscarded(String localRelaFilePath, long latestMillis) { + return fileDomainService.updateOldSearchableRecordsByRelaPathAndTime(localRelaFilePath, latestMillis, + SearchableStatusEnum.SUCCESS.code, SearchableStatusEnum.DISCARDED.code); + } } diff --git a/src/main/java/com/knowledge/base/domain/common/enums/SearchableStatusEnum.java b/src/main/java/com/knowledge/base/domain/common/enums/SearchableStatusEnum.java index 278e8ae..73ba0d1 100644 --- a/src/main/java/com/knowledge/base/domain/common/enums/SearchableStatusEnum.java +++ b/src/main/java/com/knowledge/base/domain/common/enums/SearchableStatusEnum.java @@ -8,6 +8,7 @@ public enum SearchableStatusEnum { INIT(0, "未开始进行导入"), SUCCESS(1, "成功"), FAILED(2, "导入失败"), + DISCARDED(3, "已过期,改文件不允许被检索;同人当天多次上次同名文件会进入该状态"), PROHIBITED(99, "用户禁止文件被检索"), ; diff --git a/src/main/java/com/knowledge/base/domain/doc/repository/iface/OSRecordRepository.java b/src/main/java/com/knowledge/base/domain/doc/repository/iface/OSRecordRepository.java index f916ac7..6264dc2 100644 --- a/src/main/java/com/knowledge/base/domain/doc/repository/iface/OSRecordRepository.java +++ b/src/main/java/com/knowledge/base/domain/doc/repository/iface/OSRecordRepository.java @@ -28,10 +28,21 @@ public interface OSRecordRepository { /** * 更新上传记录中文档的可搜索状态 * @param localRelaFilePath - * @param searchableStatus + * @param oldSearchableStatus --- 为空时,表示所有数据都需要更新 + * @param newSearchableStatus * @return */ - boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus); + boolean updateSearchableStatusByRelaPath(String localRelaFilePath, Integer oldSearchableStatus, int newSearchableStatus); + + /** + * 跟新latestMills时间戳之前的记录可搜索状态为searchableStatus + * @param localRelaFilePath + * @param oldSearchableStatus --- 为空时,表示所有数据都需要更新 + * @param newSearchableStatus + * @param latestMills + * @return + */ + int updateOldSearchableRecordsByRelaPathAndTime(String localRelaFilePath, long latestMills, Integer oldSearchableStatus, int newSearchableStatus); /** * 批量获取 diff --git a/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java b/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java index 9a8f104..16c639a 100644 --- a/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/iface/FileDomainService.java @@ -35,10 +35,21 @@ public interface FileDomainService { /** * 更新上传记录中文档的可搜索状态 * @param localRelaFilePath - * @param searchableStatus + * @param oldSearchableStatus + * @param newSearchableStatus * @return */ - boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus); + boolean updateSearchableStatusByRelaPath(String localRelaFilePath, Integer oldSearchableStatus, int newSearchableStatus); + + /** + * 跟新latestMills时间戳之前的记录可搜索状态为searchableStatus + * @param localRelaFilePath + * @param oldSearchableStatus --- 为空时,表示所有数据都需要更新 + * @param newSearchableStatus + * @param latestMills + * @return + */ + int updateOldSearchableRecordsByRelaPathAndTime(String localRelaFilePath, long latestMills, Integer oldSearchableStatus, int newSearchableStatus); /** * 批量获取上传记录 diff --git a/src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java index f901bff..01d9fd2 100644 --- a/src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/AbstractBaseFileImporter.java @@ -147,7 +147,7 @@ public abstract class AbstractBaseFileImporter implements DocumentImporter { // === Step 6: 写入 Elasticsearch 并更新 导入状态&缓存 === boolean saved = esGateway.saveDoc(fileEsModel); logger.info("导入结束: relativePah: {}, status: {}", localRelaFilePath, saved); - fileDomainService.updateSearchableStatusByRelaPath(localRelaFilePath, saved ? SearchableStatusEnum.SUCCESS.code : SearchableStatusEnum.FAILED.code); + fileDomainService.updateSearchableStatusByRelaPath(localRelaFilePath, SearchableStatusEnum.INIT.code, saved ? SearchableStatusEnum.SUCCESS.code : SearchableStatusEnum.FAILED.code); String metaJson = transToMetaJson(BeanUtil.beanToMap(fileEsModel, false, true)); fileCacheService.cacheMeta(localRelaFilePath, metaJson, ConstantConfig.FILE_META_CACHE_EXPIRED_MINUTES); diff --git a/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java b/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java index 350b647..23f140c 100644 --- a/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java +++ b/src/main/java/com/knowledge/base/domain/doc/service/impl/FileDomainServiceImpl.java @@ -72,15 +72,17 @@ public class FileDomainServiceImpl implements FileDomainService { return Optional.empty(); } Optional osRecordOpt = osRecordRepository.getLatestRecordByRelaPath(localRelaFilePath); - if(osRecordOpt.isEmpty()) { - return Optional.empty(); - } - return Optional.of(BeanConvertUtil.convert(osRecordOpt.get(), OSRecordDO.class)); + return osRecordOpt.map(osRecord -> BeanConvertUtil.convert(osRecord, OSRecordDO.class)); } @Override - public boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus) { - return osRecordRepository.updateSearchableStatusByRelaPath(localRelaFilePath, searchableStatus); + public boolean updateSearchableStatusByRelaPath(String localRelaFilePath, Integer oldSearchableStatus, int newSearchableStatus) { + return osRecordRepository.updateSearchableStatusByRelaPath(localRelaFilePath, oldSearchableStatus, newSearchableStatus); + } + + @Override + public int updateOldSearchableRecordsByRelaPathAndTime(String localRelaFilePath, long latestMills, Integer oldSearchableStatus, int newSearchableStatus) { + return osRecordRepository.updateOldSearchableRecordsByRelaPathAndTime(localRelaFilePath, latestMills, oldSearchableStatus, newSearchableStatus); } @Override diff --git a/src/main/java/com/knowledge/base/infrastructure/north/controller/FileWriteController.java b/src/main/java/com/knowledge/base/infrastructure/north/controller/FileWriteController.java index bd4f00c..bc23990 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/controller/FileWriteController.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/controller/FileWriteController.java @@ -229,6 +229,9 @@ public class FileWriteController { Path targetPath = Paths.get(localDir, originFileNameWithSuffix); Files.write(targetPath, fileBytes); + // 根据localRelaFilePath删除可搜索的文件历史记录(仅保存最近的一条初始状态的数据) + docAppService.markOldSearchableRecordsAsDiscarded(localRelaFilePath, DateUtil.toMillis(now)); + // 直接导入ES Map extInfo = Map.of( DocMetaPropEnum.UPLOADER.code, uploader, diff --git a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/OSRecordRepositoryImpl.java b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/OSRecordRepositoryImpl.java index 537dbc5..f96212a 100644 --- a/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/OSRecordRepositoryImpl.java +++ b/src/main/java/com/knowledge/base/infrastructure/repository/persistence/doc/OSRecordRepositoryImpl.java @@ -14,7 +14,9 @@ import com.knowledge.base.infrastructure.repository.mapper.doc.OSRecordMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.Optional; @Repository @@ -44,22 +46,49 @@ public class OSRecordRepositoryImpl implements OSRecordRepository { @Override public Optional getLatestRecordByRelaPath(String localRelaFilePath) { - OSRecord fileLatestRecord = osRecordMapper.selectOne( + List records = osRecordMapper.selectList( new QueryWrapper() .eq("local_rela_file_path", localRelaFilePath) - .orderByDesc("upload_time")); - return Optional.ofNullable(fileLatestRecord); + .orderByDesc("upload_time") + .last("LIMIT 1") + ); + return records.stream().findFirst(); } @Override - public boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus) { + public boolean updateSearchableStatusByRelaPath(String localRelaFilePath, Integer oldSearchableStatus, int newSearchableStatus) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("local_rela_file_path", localRelaFilePath) - .set("searchable_status", searchableStatus); + if(Objects.nonNull(oldSearchableStatus)) { + updateWrapper.eq("local_rela_file_path", localRelaFilePath) + .eq("searchable_status", oldSearchableStatus) + .set("searchable_status", newSearchableStatus); + } else { + updateWrapper.eq("local_rela_file_path", localRelaFilePath) + .set("searchable_status", newSearchableStatus); + } + int rows = osRecordMapper.update(null, updateWrapper); return rows > 0; } + @Override + public int updateOldSearchableRecordsByRelaPathAndTime(String localRelaFilePath, long latestMills, Integer oldSearchableStatus, int newSearchableStatus) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if(oldSearchableStatus != null) { + updateWrapper.eq("local_rela_file_path", localRelaFilePath) + .eq("searchable_status", oldSearchableStatus) // 筛选旧状态 + .lt("upload_time", new Date(latestMills)) // upload_time 要小于当前 millis + .set("searchable_status", newSearchableStatus); // 设置为新状态 + } else { + updateWrapper.eq("local_rela_file_path", localRelaFilePath) + .lt("upload_time", new Date(latestMills)) // upload_time 要小于当前 millis + .set("searchable_status", newSearchableStatus); // 设置为新状态 + } + + return osRecordMapper.update(null, updateWrapper); + } + + @Override public List batchQueryOSRecord(List recordIds) { diff --git a/src/main/java/com/knowledge/base/infrastructure/util/DateUtil.java b/src/main/java/com/knowledge/base/infrastructure/util/DateUtil.java index 3f6c134..60819cd 100644 --- a/src/main/java/com/knowledge/base/infrastructure/util/DateUtil.java +++ b/src/main/java/com/knowledge/base/infrastructure/util/DateUtil.java @@ -9,6 +9,11 @@ import java.time.ZoneId; */ public class DateUtil { + /** + * 转毫秒 + * @param time + * @return + */ public static long toMillis(LocalDateTime time) { return time.atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli(); }