feat: add preprocess icon
This commit is contained in:
@@ -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 (
|
||||
|
||||
@@ -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} `)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -363,6 +363,7 @@ export type KnowledgeItem = {
|
||||
processingProgress?: number
|
||||
processingError?: string
|
||||
retryCount?: number
|
||||
isPreprocessed?: boolean
|
||||
}
|
||||
|
||||
export interface KnowledgeBase {
|
||||
|
||||
Reference in New Issue
Block a user