知识库文档数量同步

This commit is contained in:
2025-11-07 16:09:00 +08:00
parent 7edc4f3a35
commit 495e3569e2
3 changed files with 74 additions and 20 deletions

View File

@@ -278,14 +278,19 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
uploadFile.setDeleted(false); uploadFile.setDeleted(false);
int rows = uploadFileMapper.insertUploadFile(uploadFile); int rows = uploadFileMapper.insertUploadFile(uploadFile);
knowledge.setDocumentCount(knowledge.getDocumentCount() + 1);
int knowledgeRows = knowledgeMapper.updateKnowledge(knowledge);
if (rows > 0) { if (rows > 0) {
log.info("知识库文件上传成功: uploadFileId={}, sysFileId={}, fileName={}", log.info("知识库文件上传成功: uploadFileId={}, sysFileId={}, fileName={}",
uploadFile.getID(), sysFile.getID(), originalFilename); uploadFile.getID(), sysFile.getID(), originalFilename);
// 9. 异步更新向量化状态 // 9. 异步更新向量化状态
asyncUpdateVectorStatus(uploadFile.getID()); asyncUpdateVectorStatus(uploadFile.getID());
resultDomain.success("文件上传成功", uploadFile); resultDomain.success("文件上传成功", uploadFile);
if (knowledgeRows <=0) {
resultDomain.setMessage("知识库文件数量更新失败");
}
return resultDomain; return resultDomain;
} else { } else {
resultDomain.fail("保存文件记录失败"); resultDomain.fail("保存文件记录失败");
@@ -330,7 +335,9 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
failedFiles.add(file.getOriginalFilename() + ": " + uploadResult.getMessage()); failedFiles.add(file.getOriginalFilename() + ": " + uploadResult.getMessage());
} }
} }
TbAiKnowledge knowledge = knowledgeMapper.selectKnowledgeById(knowledgeId);
knowledge.setDocumentCount(knowledge.getDocumentCount() + uploadedFiles.size());
int knowledgeRows = knowledgeMapper.updateKnowledge(knowledge);
if (!failedFiles.isEmpty()) { if (!failedFiles.isEmpty()) {
String message = "部分文件上传失败: " + String.join(", ", failedFiles); String message = "部分文件上传失败: " + String.join(", ", failedFiles);
log.warn(message); log.warn(message);
@@ -338,7 +345,9 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
} else { } else {
resultDomain.success("批量上传成功", uploadedFiles); resultDomain.success("批量上传成功", uploadedFiles);
} }
if (knowledgeRows <=0) {
resultDomain.setMessage("知识库文件数量更新失败");
}
return resultDomain; return resultDomain;
} catch (Exception e) { } catch (Exception e) {
@@ -386,9 +395,14 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
deleteEntity.setID(fileId); deleteEntity.setID(fileId);
int rows = uploadFileMapper.deleteUploadFile(deleteEntity); int rows = uploadFileMapper.deleteUploadFile(deleteEntity);
knowledge.setDocumentCount(knowledge.getDocumentCount() - 1);
int knowledgeRows = knowledgeMapper.updateKnowledge(knowledge);
if (rows > 0) { if (rows > 0) {
log.info("文件删除成功: {} - {}", fileId, file.getFileName()); log.info("文件删除成功: {} - {}", fileId, file.getFileName());
resultDomain.success("文件删除成功", true); resultDomain.success("文件删除成功", true);
if (knowledgeRows <=0) {
resultDomain.setMessage("知识库文件数量更新失败");
}
return resultDomain; return resultDomain;
} else { } else {
resultDomain.fail("文件删除失败"); resultDomain.fail("文件删除失败");

View File

@@ -12,8 +12,9 @@
</el-button> </el-button>
</div> </div>
<div class="knowledge-grid"> <div class="knowledge-list-content">
<KnowledgeCard <div class="knowledge-grid">
<KnowledgeCard class="knowledge-card"
v-for="knowledge in knowledgeCards" v-for="knowledge in knowledgeCards"
:key="knowledge.id" :key="knowledge.id"
:knowledge="knowledge" :knowledge="knowledge"
@@ -22,15 +23,17 @@
@delete="handleDelete" @delete="handleDelete"
/> />
</div> </div>
</div>
<el-empty v-if="!loading && knowledgeCards.length === 0" description="暂无知识库" /> <el-empty v-if="!loading && knowledgeCards.length === 0" description="暂无知识库" />
<el-pagination <el-pagination
v-if="total > 0" v-if="total >= 0"
:current-page="pageParam.pageNumber" :current-page="pageParam.pageNumber"
:page-size="pageParam.pageSize" :page-size="pageParam.pageSize"
:total="total" :total="total"
:page-sizes="[12, 24, 48]" :page-sizes="[9, 18, 36]"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
@current-change="handlePageChange" @current-change="handlePageChange"
@size-change="handleSizeChange" @size-change="handleSizeChange"
@@ -209,18 +212,21 @@ function handleSizeChange(size: number) {
<style scoped lang="scss"> <style scoped lang="scss">
.knowledge-management-container { .knowledge-management-container {
position: relative; position: relative;
padding: 24px; // padding: 24px;
background: #F5F5F7; background: #F5F5F7;
min-height: calc(100vh - 60px); height: calc(100vh - 40px - 44px - 24px - 110px);
} }
.knowledge-list-container { .knowledge-list-container {
background: #FFFFFF; background: #FFFFFF;
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 14px; border-radius: 14px;
padding: 24px; padding: 24px;
max-width: 1600px; height: 100%;
margin: 0 auto; margin: 0 auto;
display: flex;
flex-direction: column;
align-items: flex-end;
} }
.list-header { .list-header {
@@ -228,6 +234,7 @@ function handleSizeChange(size: number) {
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 24px; margin-bottom: 24px;
width: 100%;
.list-title { .list-title {
font-size: 18px; font-size: 18px;
@@ -253,18 +260,49 @@ function handleSizeChange(size: number) {
} }
} }
.knowledge-list-content{
width: 100%;
overflow-y: auto;
height: 100%;
// 自定义滚动条样式
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-track {
background: transparent;
border-radius: 3px;
}
&::-webkit-scrollbar-thumb {
background: #D1D5DB;
border-radius: 3px;
&:hover {
background: #9CA3AF;
}
}
}
.knowledge-grid { .knowledge-grid {
display: grid; display: flex;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); width: 100%;
gap: 20px; gap: 20px;
margin-bottom: 24px; margin-top: 12px;
.knowledge-card {
width: 33%;
}
} }
:deep(.el-pagination) { :deep(.el-pagination) {
display: flex; display: flex;
justify-content: center; justify-content: flex-end;
padding-top: 24px; padding-top: 24px;
border-top: 1px solid #F3F3F5; border-top: 1px solid #F3F3F5;
margin-top: auto; // 推到容器底部
width: 100%;
.el-pager li { .el-pager li {
&.is-active { &.is-active {

View File

@@ -23,10 +23,10 @@
<div class="knowledge-avatar"> <div class="knowledge-avatar">
<el-image <el-image
v-if="knowledge.avatar" v-if="knowledge.avatar"
:src="knowledge.avatar" :src="FILE_DOWNLOAD_URL + knowledge.avatar"
fit="cover" fit="cover"
/> />
<el-icon v-else :size="48"><Document /></el-icon> <el-icon v-else :size="48">📚</el-icon>
</div> </div>
<div class="knowledge-details"> <div class="knowledge-details">
<h2 class="knowledge-name">{{ knowledge.title }}</h2> <h2 class="knowledge-name">{{ knowledge.title }}</h2>
@@ -230,6 +230,7 @@ import {
import type { AiKnowledge, AiUploadFile } from '@/types/ai'; import type { AiKnowledge, AiUploadFile } from '@/types/ai';
import { fileUploadApi } from '@/apis/ai'; import { fileUploadApi } from '@/apis/ai';
import { DocumentSegmentDialog } from './'; import { DocumentSegmentDialog } from './';
import { FILE_DOWNLOAD_URL } from '@/config';
defineOptions({ defineOptions({
name: 'KnowledgeInfo' name: 'KnowledgeInfo'
@@ -476,6 +477,7 @@ function formatFileSize(bytes: number | undefined): string {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
z-index: 10; z-index: 10;
box-sizing: border-box;
} }
.panel-header { .panel-header {