知识库文档数量同步
This commit is contained in:
@@ -278,6 +278,8 @@ 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);
|
||||||
@@ -286,6 +288,9 @@ public class AiUploadFileServiceImpl implements AiUploadFileService {
|
|||||||
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("文件删除失败");
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user