2025-03-07 23:59:53 +08:00
|
|
|
|
import { createSlice } from '@reduxjs/toolkit';
|
|
|
|
|
import {
|
|
|
|
|
fetchKnowledgeBases,
|
|
|
|
|
createKnowledgeBase,
|
|
|
|
|
updateKnowledgeBase,
|
|
|
|
|
deleteKnowledgeBase,
|
2025-03-22 10:13:42 +08:00
|
|
|
|
changeKnowledgeBaseType,
|
|
|
|
|
searchKnowledgeBases,
|
|
|
|
|
requestKnowledgeBaseAccess,
|
2025-03-25 08:04:35 +08:00
|
|
|
|
getKnowledgeBaseById,
|
2025-03-07 23:59:53 +08:00
|
|
|
|
} from './knowledgeBase.thunks';
|
|
|
|
|
|
|
|
|
|
const initialState = {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
knowledgeBases: [],
|
|
|
|
|
currentKnowledgeBase: null,
|
|
|
|
|
searchResults: [],
|
|
|
|
|
searchLoading: false,
|
|
|
|
|
loading: false,
|
|
|
|
|
error: null,
|
|
|
|
|
pagination: {
|
|
|
|
|
total: 0,
|
|
|
|
|
page: 1,
|
|
|
|
|
page_size: 10,
|
|
|
|
|
total_pages: 1,
|
2025-03-07 23:59:53 +08:00
|
|
|
|
},
|
2025-03-22 10:13:42 +08:00
|
|
|
|
batchPermissions: {},
|
|
|
|
|
batchLoading: false,
|
|
|
|
|
editStatus: 'idle',
|
|
|
|
|
requestAccessStatus: 'idle',
|
2025-03-07 23:59:53 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const knowledgeBaseSlice = createSlice({
|
|
|
|
|
name: 'knowledgeBase',
|
|
|
|
|
initialState,
|
|
|
|
|
reducers: {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
clearCurrentKnowledgeBase: (state) => {
|
|
|
|
|
state.currentKnowledgeBase = null;
|
2025-03-07 23:59:53 +08:00
|
|
|
|
},
|
2025-03-22 10:13:42 +08:00
|
|
|
|
clearSearchResults: (state) => {
|
|
|
|
|
state.searchResults = [];
|
2025-03-07 23:59:53 +08:00
|
|
|
|
},
|
2025-03-22 10:13:42 +08:00
|
|
|
|
clearEditStatus: (state) => {
|
|
|
|
|
state.editStatus = 'idle';
|
2025-03-07 23:59:53 +08:00
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
extraReducers: (builder) => {
|
|
|
|
|
builder
|
2025-03-22 10:13:42 +08:00
|
|
|
|
// 获取知识库列表
|
2025-03-07 23:59:53 +08:00
|
|
|
|
.addCase(fetchKnowledgeBases.pending, (state) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = true;
|
|
|
|
|
state.error = null;
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(fetchKnowledgeBases.fulfilled, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.knowledgeBases = action.payload.items || [];
|
|
|
|
|
state.pagination = {
|
|
|
|
|
total: action.payload.total || 0,
|
|
|
|
|
page: action.payload.page || 1,
|
|
|
|
|
page_size: action.payload.page_size || 10,
|
|
|
|
|
total_pages: action.payload.total_pages || 1,
|
|
|
|
|
};
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(fetchKnowledgeBases.rejected, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to fetch knowledge bases';
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
|
2025-03-22 10:13:42 +08:00
|
|
|
|
// 创建知识库
|
2025-03-07 23:59:53 +08:00
|
|
|
|
.addCase(createKnowledgeBase.pending, (state) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = true;
|
|
|
|
|
state.error = null;
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(createKnowledgeBase.fulfilled, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.editStatus = 'successful';
|
|
|
|
|
// 不需要更新 knowledgeBases,因为创建后会跳转到详情页
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(createKnowledgeBase.rejected, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to create knowledge base';
|
|
|
|
|
state.editStatus = 'failed';
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
|
2025-03-22 10:13:42 +08:00
|
|
|
|
// 更新知识库
|
2025-03-07 23:59:53 +08:00
|
|
|
|
.addCase(updateKnowledgeBase.pending, (state) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = true;
|
|
|
|
|
state.error = null;
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(updateKnowledgeBase.fulfilled, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.currentKnowledgeBase = action.payload;
|
|
|
|
|
state.editStatus = 'successful';
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(updateKnowledgeBase.rejected, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to update knowledge base';
|
|
|
|
|
state.editStatus = 'failed';
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
|
2025-03-22 10:13:42 +08:00
|
|
|
|
// 删除知识库
|
2025-03-07 23:59:53 +08:00
|
|
|
|
.addCase(deleteKnowledgeBase.pending, (state) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = true;
|
|
|
|
|
state.error = null;
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(deleteKnowledgeBase.fulfilled, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.knowledgeBases = state.knowledgeBases.filter((kb) => kb.id !== action.meta.arg.knowledgeBaseId);
|
2025-03-07 23:59:53 +08:00
|
|
|
|
})
|
|
|
|
|
.addCase(deleteKnowledgeBase.rejected, (state, action) => {
|
2025-03-22 10:13:42 +08:00
|
|
|
|
state.loading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to delete knowledge base';
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 修改知识库类型
|
|
|
|
|
.addCase(changeKnowledgeBaseType.pending, (state) => {
|
|
|
|
|
state.loading = true;
|
|
|
|
|
state.error = null;
|
|
|
|
|
})
|
|
|
|
|
.addCase(changeKnowledgeBaseType.fulfilled, (state, action) => {
|
|
|
|
|
state.loading = false;
|
|
|
|
|
if (state.currentKnowledgeBase) {
|
|
|
|
|
state.currentKnowledgeBase = {
|
|
|
|
|
...state.currentKnowledgeBase,
|
|
|
|
|
type: action.payload.type,
|
|
|
|
|
department: action.payload.department,
|
|
|
|
|
group: action.payload.group,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
state.editStatus = 'successful';
|
|
|
|
|
})
|
|
|
|
|
.addCase(changeKnowledgeBaseType.rejected, (state, action) => {
|
|
|
|
|
state.loading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to change knowledge base type';
|
|
|
|
|
state.editStatus = 'failed';
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 搜索知识库
|
|
|
|
|
.addCase(searchKnowledgeBases.pending, (state) => {
|
|
|
|
|
state.searchLoading = true;
|
|
|
|
|
state.error = null;
|
|
|
|
|
})
|
|
|
|
|
.addCase(searchKnowledgeBases.fulfilled, (state, action) => {
|
|
|
|
|
state.searchLoading = false;
|
|
|
|
|
if (action.payload && action.payload.code === 200) {
|
|
|
|
|
state.searchResults = action.payload.data.items || [];
|
|
|
|
|
} else {
|
|
|
|
|
state.searchResults = action.payload.items || [];
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.addCase(searchKnowledgeBases.rejected, (state, action) => {
|
|
|
|
|
state.searchLoading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to search knowledge bases';
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 申请知识库访问权限
|
|
|
|
|
.addCase(requestKnowledgeBaseAccess.pending, (state) => {
|
|
|
|
|
state.requestAccessStatus = 'loading';
|
|
|
|
|
})
|
|
|
|
|
.addCase(requestKnowledgeBaseAccess.fulfilled, (state) => {
|
|
|
|
|
state.requestAccessStatus = 'successful';
|
|
|
|
|
})
|
|
|
|
|
.addCase(requestKnowledgeBaseAccess.rejected, (state) => {
|
|
|
|
|
state.requestAccessStatus = 'failed';
|
2025-03-25 08:04:35 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取知识库详情
|
|
|
|
|
.addCase(getKnowledgeBaseById.pending, (state) => {
|
|
|
|
|
state.loading = true;
|
|
|
|
|
state.error = null;
|
|
|
|
|
})
|
|
|
|
|
.addCase(getKnowledgeBaseById.fulfilled, (state, action) => {
|
|
|
|
|
state.loading = false;
|
|
|
|
|
state.currentKnowledgeBase = action.payload.knowledge_base || action.payload;
|
|
|
|
|
})
|
|
|
|
|
.addCase(getKnowledgeBaseById.rejected, (state, action) => {
|
|
|
|
|
state.loading = false;
|
|
|
|
|
state.error = action.payload || 'Failed to get knowledge base details';
|
2025-03-07 23:59:53 +08:00
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
2025-03-22 10:13:42 +08:00
|
|
|
|
export const { clearCurrentKnowledgeBase, clearSearchResults, clearEditStatus } = knowledgeBaseSlice.actions;
|
|
|
|
|
|
|
|
|
|
export default knowledgeBaseSlice.reducer;
|