From b32ac6e85599ee2122d161fd1b5ceaba14d325e5 Mon Sep 17 00:00:00 2001 From: lmr <350416710@qq.com> Date: Wed, 17 Sep 2025 16:19:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/KnowledgePage/AdjustFilesUpload.tsx | 12 +- .../src/pages/KnowledgePage/KnowledgeFile.tsx | 4 +- .../src/pages/KnowledgePage/KnowledgeQa.tsx | 84 +++++++------- .../components/FileUploadStep2.tsx | 104 ++++++++++++++---- .../KnowledgePage/components/PreviewFile.tsx | 4 +- .../components/PreviewResult.tsx | 10 +- .../KnowledgePage/components/RuleFile.tsx | 13 ++- .../KnowledgePage/components/RuleTable.tsx | 12 +- .../src/pages/KnowledgePage/filesUpload.tsx | 10 +- 9 files changed, 183 insertions(+), 70 deletions(-) diff --git a/src/frontend/platform/src/pages/KnowledgePage/AdjustFilesUpload.tsx b/src/frontend/platform/src/pages/KnowledgePage/AdjustFilesUpload.tsx index 7cb2acd55..3cb73f981 100644 --- a/src/frontend/platform/src/pages/KnowledgePage/AdjustFilesUpload.tsx +++ b/src/frontend/platform/src/pages/KnowledgePage/AdjustFilesUpload.tsx @@ -199,9 +199,17 @@ export default function AdjustFilesUpload() { submittingRef.current = true; setIsSubmitting(true); + /** + * 将 UI 可见的换行转义("\\n")还原为真实换行("\n") + */ + const normalizeSeparators = (arr) => + (arr || []).map((s) => + typeof s === 'string' ? s.replace(/\\n/g, '\n') : s + ); + const apiConfig = { knowledge_id: Number(_config.rules.knowledgeId || initFileData.knowledgeId || knowledgeId), - separator: _config.rules.separator, + separator: normalizeSeparators(_config.rules.separator), separator_rule: _config.rules.separatorRule, chunk_size: _config.rules.chunkSize, chunk_overlap: _config.rules.chunkOverlap, @@ -216,6 +224,8 @@ export default function AdjustFilesUpload() { captureAndAlertRequestErrorHoc( rebUploadFile(apiConfig) .then(res => { + console.log(apiConfig,2323); + // 1. 修复重复文件判断(单个对象处理) const _repeatFiles = res.status === 3 ? [res] : []; if (_repeatFiles.length) { diff --git a/src/frontend/platform/src/pages/KnowledgePage/KnowledgeFile.tsx b/src/frontend/platform/src/pages/KnowledgePage/KnowledgeFile.tsx index 71dc90dfc..43780f0df 100644 --- a/src/frontend/platform/src/pages/KnowledgePage/KnowledgeFile.tsx +++ b/src/frontend/platform/src/pages/KnowledgePage/KnowledgeFile.tsx @@ -539,8 +539,8 @@ export default function KnowledgeFile() { }} >
-
- +
+
diff --git a/src/frontend/platform/src/pages/KnowledgePage/KnowledgeQa.tsx b/src/frontend/platform/src/pages/KnowledgePage/KnowledgeQa.tsx index 72638cdee..b27df0637 100644 --- a/src/frontend/platform/src/pages/KnowledgePage/KnowledgeQa.tsx +++ b/src/frontend/platform/src/pages/KnowledgePage/KnowledgeQa.tsx @@ -13,12 +13,12 @@ import { getKnowledgeModelConfig, getModelListApi } from "@/controllers/API/fine import { captureAndAlertRequestErrorHoc } from "@/controllers/request"; import { useTable } from "@/util/hook"; import { t } from "i18next"; -import { Ellipsis, Trash2 } from "lucide-react"; +import { Ellipsis, MessageSquare, MessageSquareIcon, MessagesSquare, Trash2 } from "lucide-react"; import { useContext, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import index from "../BuildPage/bench/LingSiWork"; -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"; +import { Select, SelectContent, SelectItem, SelectTrigger } from "@/components/bs-ui/select"; import { QuestionTooltip, TooltipContent, TooltipTrigger } from "@/components/bs-ui/tooltip"; function CreateModal({ datalist, open, setOpen, onLoadEnd }) { @@ -167,6 +167,8 @@ export default function KnowledgeQa(params) { const navigate = useNavigate() const [copyLoadingId, setCopyLoadingId] = useState(null); const [openMenus, setOpenMenus] = useState>({}); + const [selectOpenId, setSelectOpenId] = useState(null); + const [modalKey, setModalKey] = useState(0); const { page, pageSize, data: datalist, total, loading, setPage, search, reload } = useTable({}, (param) => { return readFileLibDatabase({ ...param, name: param.keyword, type: 1 }) @@ -257,11 +259,9 @@ export default function KnowledgeQa(params) { {/* 名称+描述单元格:恢复原有气泡结构,确保蓝色生效 */}
- 知识库图标 +
+ +
{/* 知识库名称(不变) */} @@ -298,42 +298,52 @@ export default function KnowledgeQa(params) { {/* 操作列:修复「按钮移入行不高亮」 */} - {/* 关键:hover:bg-transparent覆盖行的hover:bg-gray-50 */} -
- - - - +
+
diff --git a/src/frontend/platform/src/pages/KnowledgePage/components/FileUploadStep2.tsx b/src/frontend/platform/src/pages/KnowledgePage/components/FileUploadStep2.tsx index 558ae90fe..e00522cae 100644 --- a/src/frontend/platform/src/pages/KnowledgePage/components/FileUploadStep2.tsx +++ b/src/frontend/platform/src/pages/KnowledgePage/components/FileUploadStep2.tsx @@ -28,6 +28,7 @@ interface IProps { onNext: (step: number, config?: any) => void onPrev: () => void isAdjustMode?: boolean + kId?: string | number } const enum DisplayModeType { OnlyTables = 'table', @@ -86,26 +87,50 @@ const FileUploadStep2 = forwardRef(({ step, resultFiles, isSubmitting, onNext, o useEffect(() => { applyRuleRef.current = applyRule; }, [applyRule]); - // 起始行不能大于结束行校验 + // 起始行与切分参数校验 const vildateCell = () => { + // 表头行区间校验 if (applyEachCell ? rules.fileList.some(file => file.excelRule.append_header && Number(file.excelRule.header_start_row) > Number(file.excelRule.header_end_row)) : cellGeneralConfig.append_header && Number(cellGeneralConfig.header_start_row) > Number(cellGeneralConfig.header_end_row)) { - return toast({ + toast({ variant: 'warning', description: '最小行不能大于最大行' }) + return true } + + // 切分长度与重叠长度校验 + const chunkSizeNum = Number((rules as any)?.chunkSize ?? (rules as any)?.chunk_size ?? 0) + const chunkOverlapNum = Number((rules as any)?.chunkOverlap ?? (rules as any)?.chunk_overlap ?? 0) + if (!Number.isNaN(chunkSizeNum) && !Number.isNaN(chunkOverlapNum) && chunkOverlapNum > chunkSizeNum) { + toast({ + variant: 'warning', + description: '重叠区长度不能大于预期切分长度' + }) + return true + } + return false } const { toast } = useToast() const internalHandleNext = () => { console.log(step, displayStep,'previewCount11'); + // 全局校验:无论在哪个分支,都先校验参数 + if (vildateCell()) return; + // 规则校验:过滤后若为空或存在空regex,阻止继续 + const hasEmptyCustomRule = (strategies || []).some(s => String(s?.regex ?? '') === ''); + if (hasEmptyCustomRule) { + toast({ variant: 'warning', description: '自定义规则不能为空' }); + return; + } + if (!rules.separator || rules.separator.length === 0) { + toast({ variant: 'warning', description: '请至少添加一个分割规则' }); + return; + } const nextStep = step + 1; if (step === 2 || displayStep === 2) { - if (vildateCell()) return; - const config = { applyEachCell, cellGeneralConfig, @@ -153,6 +178,15 @@ useEffect(() => { }, [applyEachCell, cellGeneralConfig, rules]); const handlePreview = () => { if (vildateCell()) return + const hasEmptyCustomRule = (strategies || []).some(s => String(s?.regex ?? '') === ''); + if (hasEmptyCustomRule) { + toast({ variant: 'warning', description: '自定义规则不能为空' }); + return; + } + if (!rules.separator || rules.separator.length === 0) { + toast({ variant: 'warning', description: '请至少添加一个分割规则' }); + return; + } setShowPreview(true) setPreviewLoading(true); setPreviewCount(c => c + 1) // 刷新分段 @@ -197,7 +231,7 @@ useEffect(() => { rules={rules} setRules={setRules} strategies={strategies} - setStrategies={setStrategies} + setStrategies={(next) => setStrategies(next)} showPreview={showPreview} /> @@ -231,7 +265,7 @@ useEffect(() => { {/* 原文预览 & 分段预览:预览时占50% */} { - (showPreview || step === 3) ? ( + (showPreview || (step === 3&&!isAdjustMode)) ? (
{