diff --git a/config/mysql/init.txt b/config/mysql/init.txt index 5627fda..f79beb6 100644 --- a/config/mysql/init.txt +++ b/config/mysql/init.txt @@ -88,6 +88,7 @@ CREATE TABLE IF NOT EXISTS oss_upload_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键', file_name VARCHAR(255) NOT NULL COMMENT '文件名', local_rela_file_path VARCHAR(512) NOT NULL DEFAULT 'UNKNOWN' COMMENT '本地文件相对路径', + searchable_status INT NOT NULL DEFAULT 0 COMMENT '可搜索状态:0-初始状态,1-可搜索, 2-导入失败, 99-禁止搜索' bucket_name VARCHAR(128) NOT NULL COMMENT '目标 bucket 名', uploader VARCHAR(128) NOT NULL COMMENT '上传人用户名', upload_time DATETIME NOT NULL COMMENT '上传时间', 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 new file mode 100644 index 0000000..278e8ae --- /dev/null +++ b/src/main/java/com/knowledge/base/domain/common/enums/SearchableStatusEnum.java @@ -0,0 +1,22 @@ +package com.knowledge.base.domain.common.enums; + +/** + * @author Luke.ye + * @date 2025/6/20 16:41 + */ +public enum SearchableStatusEnum { + INIT(0, "未开始进行导入"), + SUCCESS(1, "成功"), + FAILED(2, "导入失败"), + PROHIBITED(99, "用户禁止文件被检索"), + ; + + public int code; + + private String desc; + + SearchableStatusEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/src/main/java/com/knowledge/base/domain/doc/model/OSRecordDO.java b/src/main/java/com/knowledge/base/domain/doc/model/OSRecordDO.java index 805cf28..6ac52d9 100644 --- a/src/main/java/com/knowledge/base/domain/doc/model/OSRecordDO.java +++ b/src/main/java/com/knowledge/base/domain/doc/model/OSRecordDO.java @@ -9,6 +9,7 @@ public class OSRecordDO { private Long id; private String fileName; private String localRelaFilePath; + private int searchableStatus; private String bucketName; private String uploader; private String objectPath; 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 449785a..f916ac7 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 @@ -25,6 +25,14 @@ public interface OSRecordRepository { */ Optional getLatestRecordByRelaPath(String localRelaFilePath); + /** + * 更新上传记录中文档的可搜索状态 + * @param localRelaFilePath + * @param searchableStatus + * @return + */ + boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus); + /** * 批量获取 * @param recordIds diff --git a/src/main/java/com/knowledge/base/domain/doc/repository/po/OSRecord.java b/src/main/java/com/knowledge/base/domain/doc/repository/po/OSRecord.java index c50bcf1..5b0ffea 100644 --- a/src/main/java/com/knowledge/base/domain/doc/repository/po/OSRecord.java +++ b/src/main/java/com/knowledge/base/domain/doc/repository/po/OSRecord.java @@ -14,6 +14,7 @@ public class OSRecord { private String fileName; private String localRelaFilePath; + private int searchableStatus; private String bucketName; private String uploader; private String objectPath; 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 8f93e34..9a8f104 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 @@ -32,6 +32,14 @@ public interface FileDomainService { */ Optional getLatestRecordByRelaPath(String localRelaFilePath); + /** + * 更新上传记录中文档的可搜索状态 + * @param localRelaFilePath + * @param searchableStatus + * @return + */ + boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus); + /** * 批量获取上传记录 * @param recordIds @@ -45,4 +53,6 @@ public interface FileDomainService { * @return */ boolean batchRemoveOSFiles(List recordIds); + + } 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 804470a..f901bff 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 @@ -8,6 +8,7 @@ import cn.hutool.json.JSONUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.knowledge.base.domain.common.enums.DocMetaPropEnum; +import com.knowledge.base.domain.common.enums.SearchableStatusEnum; import com.knowledge.base.domain.doc.model.FileEsField; import com.knowledge.base.domain.doc.model.FileEsModel; import com.knowledge.base.domain.doc.model.OSRecordDO; @@ -143,9 +144,10 @@ public abstract class AbstractBaseFileImporter implements DocumentImporter { // === Step 5: 构建待写入文档 === FileEsModel fileEsModel = buildDocument(fileNameWithSuffix, localRelaFilePath, content, localMTime, extInfo); - // === Step 6: 写入 Elasticsearch 并更新缓存 === - esGateway.saveDoc(fileEsModel); - logger.info("导入成功: {}", localRelaFilePath); + // === Step 6: 写入 Elasticsearch 并更新 导入状态&缓存 === + boolean saved = esGateway.saveDoc(fileEsModel); + logger.info("导入结束: relativePah: {}, status: {}", localRelaFilePath, saved); + fileDomainService.updateSearchableStatusByRelaPath(localRelaFilePath, 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 061d248..350b647 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 @@ -78,6 +78,11 @@ public class FileDomainServiceImpl implements FileDomainService { return Optional.of(BeanConvertUtil.convert(osRecordOpt.get(), OSRecordDO.class)); } + @Override + public boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus) { + return osRecordRepository.updateSearchableStatusByRelaPath(localRelaFilePath, searchableStatus); + } + @Override public List batchQueryOSRecord(List recordIds) { return BeanConvertUtil.convertList(osRecordRepository.batchQueryOSRecord(recordIds), OSRecordDO.class); diff --git a/src/main/java/com/knowledge/base/infrastructure/north/controller/FileQueryController.java b/src/main/java/com/knowledge/base/infrastructure/north/controller/FileQueryController.java index 4ef17ad..f1d1020 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/controller/FileQueryController.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/controller/FileQueryController.java @@ -116,6 +116,7 @@ public class FileQueryController { item.put("fileName", dto.getFileName()); item.put("url", dto.getUrl()); item.put("recordId", dto.getId()); + item.put("searchableStatus", dto.getSearchableStatus()); // 格式化上传时间 if (StrUtil.isNotBlank(dto.getUploadTime())) { 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 9f268c2..bd4f00c 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 @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.knowledge.base.application.service.DocAppService; import com.knowledge.base.application.service.UserAppService; import com.knowledge.base.domain.common.enums.DocMetaPropEnum; +import com.knowledge.base.domain.common.enums.SearchableStatusEnum; import com.knowledge.base.domain.doc.service.FileImporterDispatcher; import com.knowledge.base.domain.doc.service.iface.DocumentImporter; import com.knowledge.base.infrastructure.cache.iface.FileCacheService; @@ -206,6 +207,7 @@ public class FileWriteController { OSRecordDTO dto = new OSRecordDTO(); dto.setFileName(originFileNameWithSuffix); dto.setLocalRelaFilePath(allowSaveToLocal ? localRelaFilePath : ConstantConfig.UNKNOWN_LOCAL_RELA_PATH); + dto.setSearchableStatus(allowSaveToLocal ? SearchableStatusEnum.INIT.code : SearchableStatusEnum.PROHIBITED.code); dto.setUrl(url); dto.setUploader(uploader); dto.setBucketName(bucket); diff --git a/src/main/java/com/knowledge/base/infrastructure/north/dto/doc/OSRecordDTO.java b/src/main/java/com/knowledge/base/infrastructure/north/dto/doc/OSRecordDTO.java index 9fee96a..023dd20 100644 --- a/src/main/java/com/knowledge/base/infrastructure/north/dto/doc/OSRecordDTO.java +++ b/src/main/java/com/knowledge/base/infrastructure/north/dto/doc/OSRecordDTO.java @@ -8,10 +8,12 @@ public class OSRecordDTO { private String fileName; /** - * 本地相对路径文件名(不为空,则文件可搜索) + * 本地相对路径文件名 */ private String localRelaFilePath; + private int searchableStatus; + private String bucketName; private String uploader; private String objectPath; 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 10d4046..537dbc5 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 @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.knowledge.base.domain.common.model.PageResult; @@ -50,6 +51,16 @@ public class OSRecordRepositoryImpl implements OSRecordRepository { return Optional.ofNullable(fileLatestRecord); } + @Override + public boolean updateSearchableStatusByRelaPath(String localRelaFilePath, int searchableStatus) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("local_rela_file_path", localRelaFilePath) + .set("searchable_status", searchableStatus); + int rows = osRecordMapper.update(null, updateWrapper); + return rows > 0; + } + + @Override public List batchQueryOSRecord(List recordIds) { if(CollectionUtil.isEmpty(recordIds)) { diff --git a/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java b/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java index 887beed..4a34502 100644 --- a/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java +++ b/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java @@ -11,6 +11,7 @@ import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.BoolQueryBuilder; @@ -19,6 +20,7 @@ import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.index.reindex.BulkByScrollResponse; import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.elasticsearch.rest.RestStatus; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.action.search.SearchRequest; @@ -180,14 +182,16 @@ public class FileElasticsearchGateway { /** * 写入/更新文档 */ - public void saveDoc(FileEsModel docModel) { + public boolean saveDoc(FileEsModel docModel) { try { String docId = docModel.buildDocId(); Map source = BeanUtil.beanToMap(docModel, false, true); IndexRequest request = new IndexRequest(INDEX_NAME).id(docId).source(source); - esClient.index(request, RequestOptions.DEFAULT); + IndexResponse response = esClient.index(request, RequestOptions.DEFAULT); + return response.status().getStatus() == RestStatus.OK.getStatus(); } catch (Exception e) { log.error("ES 写入文档失败: doc={}", docModel, e); + return false; } }