feat: add preprocess icon

This commit is contained in:
eeee0717
2025-06-05 20:32:47 +08:00
parent 4570e21965
commit a351fba483
6 changed files with 79 additions and 15 deletions
+5
View File
@@ -565,6 +565,11 @@ class KnowledgeService {
Logger.info(`Starting preprocess processing for scanned PDF: ${file.path}`)
const { processedFile } = await provider.parseFile(item.id, file)
fileToProcess = processedFile
console.warn('base', base, 'item', item, 'file', file)
const mainWindow = windowService.getMainWindow()
mainWindow?.webContents.send('file-preprocess-finished', {
itemId: item.id
})
} catch (err) {
Logger.error(`Preprocess processing failed: ${err}`)
// 如果预处理失败,使用原始文件
@@ -39,9 +39,13 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
const { t } = useTranslation()
const [expandAll, setExpandAll] = useState(false)
const [progressMap, setProgressMap] = useState<Map<string, number>>(new Map())
const [preprocessMap, setPreprocessMap] = useState<Map<string, boolean>>(new Map())
useEffect(() => {
const handlers = [
window.electron.ipcRenderer.on('file-preprocess-finished', (_, { itemId }) => {
setPreprocessMap((prev) => new Map(prev).set(itemId, true))
}),
window.electron.ipcRenderer.on('file-preprocess-progress', (_, { itemId, progress }) => {
setProgressMap((prev) => new Map(prev).set(itemId, progress))
}),
@@ -78,6 +82,7 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
const providerName = getProviderName(base?.model.provider || '')
const disabled = !base?.version || !providerName
console.log(fileItems)
if (!base) {
return null
@@ -252,6 +257,16 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
}
}
const showPreprocessIcon = (item: KnowledgeItem) => {
if (base.preprocessOrOcrProvider && item.isPreprocessed !== false) {
return true
}
if (!base.preprocessOrOcrProvider && item.isPreprocessed === true) {
return true
}
return false
}
return (
<MainContainer>
<HeaderContainer>
@@ -369,13 +384,24 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ selectedBase }) => {
{item.uniqueId && (
<Button type="text" icon={<RefreshIcon />} onClick={() => refreshItem(item)} />
)}
{showPreprocessIcon(item) && (
<StatusIconWrapper>
<StatusIcon
sourceId={item.id}
base={base}
getProcessingStatus={getProcessingStatus}
type="file"
isPreprocessed={preprocessMap.get(item.id) || item.isPreprocessed || false}
progress={progressMap.get(item.id)}
/>
</StatusIconWrapper>
)}
<StatusIconWrapper>
<StatusIcon
sourceId={item.id}
base={base}
getProcessingStatus={getProcessingStatus}
type="file"
progress={progressMap.get(item.id)}
/>
</StatusIconWrapper>
<Button type="text" danger onClick={() => removeItem(item)} icon={<DeleteOutlined />} />
@@ -718,7 +744,7 @@ const ClickableSpan = styled.span`
`
const StatusIconWrapper = styled.div`
width: auto;
width: 32px;
height: 44px;
display: flex;
align-items: center;
@@ -12,9 +12,17 @@ interface StatusIconProps {
getProcessingStatus: (sourceId: string) => ProcessingStatus | undefined
type: string
progress?: number
isPreprocessed?: boolean
}
const StatusIcon: FC<StatusIconProps> = ({ sourceId, base, getProcessingStatus, type, progress = 0 }) => {
const StatusIcon: FC<StatusIconProps> = ({
sourceId,
base,
getProcessingStatus,
type,
progress = 0,
isPreprocessed
}) => {
const { t } = useTranslation()
const status = getProcessingStatus(sourceId)
const item = base.items.find((item) => item.id === sourceId)
@@ -23,16 +31,11 @@ const StatusIcon: FC<StatusIconProps> = ({ sourceId, base, getProcessingStatus,
const statusDisplay = useMemo(() => {
if (!status) {
if (item?.uniqueId) {
if (base.preprocessOrOcrProvider && item.type === 'file') {
if (isPreprocessed && item.type === 'file') {
return (
<div style={{ gap: '8px', width: 'fit-content', height: '32px', display: 'flex' }}>
<Tooltip title={t('knowledge.status_preprocess_completed')} placement="left">
<CheckCircleOutlined style={{ color: '#52c41a' }} />
</Tooltip>
<Tooltip title={t('knowledge.status_embedding_completed')} placement="left">
<CheckCircleOutlined style={{ color: '#52c41a' }} />
</Tooltip>
</div>
<Tooltip title={t('knowledge.status_preprocess_completed')} placement="left">
<CheckCircleOutlined style={{ color: '#52c41a' }} />
</Tooltip>
)
}
return (
+13 -1
View File
@@ -3,7 +3,12 @@ import db from '@renderer/databases'
import { getKnowledgeBaseParams } from '@renderer/services/KnowledgeService'
import { NotificationService } from '@renderer/services/NotificationService'
import store from '@renderer/store'
import { clearCompletedProcessing, updateBaseItemUniqueId, updateItemProcessingStatus } from '@renderer/store/knowledge'
import {
clearCompletedProcessing,
updateBaseItemIsPreprocessed,
updateBaseItemUniqueId,
updateItemProcessingStatus
} from '@renderer/store/knowledge'
import { KnowledgeItem } from '@renderer/types'
import { uuid } from '@renderer/utils'
import type { LoaderReturn } from '@shared/config/types'
@@ -182,6 +187,13 @@ class KnowledgeQueue {
uniqueIds: result.uniqueIds
})
)
store.dispatch(
updateBaseItemIsPreprocessed({
baseId,
itemId: item.id,
isPreprocessed: base.preprocessOrOcrProvider ? true : false
})
)
}
Logger.log(`[KnowledgeQueue] Updated uniqueId for item ${item.id} in base ${baseId} `)
+18 -1
View File
@@ -176,6 +176,7 @@ const knowledgeSlice = createSlice({
action: PayloadAction<{ baseId: string; itemId: string; uniqueId: string; uniqueIds: string[] }>
) {
const base = state.bases.find((b) => b.id === action.payload.baseId)
console.log('base2', base)
if (base) {
const item = base.items.find((item) => item.id === action.payload.itemId)
if (item) {
@@ -183,6 +184,21 @@ const knowledgeSlice = createSlice({
item.uniqueIds = action.payload.uniqueIds
}
}
},
updateBaseItemIsPreprocessed(
state,
action: PayloadAction<{ baseId: string; itemId: string; isPreprocessed: boolean }>
) {
const base = state.bases.find((b) => b.id === action.payload.baseId)
console.log('base', base)
if (base) {
const item = base.items.find((item) => item.id === action.payload.itemId)
console.log('item', item)
if (item) {
item.isPreprocessed = action.payload.isPreprocessed
}
}
}
}
})
@@ -201,7 +217,8 @@ export const {
updateItemProcessingStatus,
clearCompletedProcessing,
clearAllProcessing,
updateBaseItemUniqueId
updateBaseItemUniqueId,
updateBaseItemIsPreprocessed
} = knowledgeSlice.actions
export default knowledgeSlice.reducer
+1
View File
@@ -363,6 +363,7 @@ export type KnowledgeItem = {
processingProgress?: number
processingError?: string
retryCount?: number
isPreprocessed?: boolean
}
export interface KnowledgeBase {