Spaces:
Paused
Paused
import { BaseState } from '@/interfaces/common'; | |
import { IKnowledgeFile } from '@/interfaces/database/knowledge'; | |
import i18n from '@/locales/config'; | |
import kbService, { getDocumentFile } from '@/services/knowledge-service'; | |
import { message } from 'antd'; | |
import omit from 'lodash/omit'; | |
import pick from 'lodash/pick'; | |
import { DvaModel } from 'umi'; | |
export interface KFModelState extends BaseState { | |
tenantIfo: any; | |
data: IKnowledgeFile[]; | |
total: number; | |
currentRecord: Nullable<IKnowledgeFile>; | |
fileThumbnails: Record<string, string>; | |
} | |
const model: DvaModel<KFModelState> = { | |
namespace: 'kFModel', | |
state: { | |
tenantIfo: {}, | |
data: [], | |
total: 0, | |
currentRecord: null, | |
searchString: '', | |
pagination: { | |
current: 1, | |
pageSize: 10, | |
}, | |
fileThumbnails: {} as Record<string, string>, | |
}, | |
reducers: { | |
updateState(state, { payload }) { | |
return { | |
...state, | |
...payload, | |
}; | |
}, | |
setCurrentRecord(state, { payload }) { | |
return { ...state, currentRecord: payload }; | |
}, | |
setSearchString(state, { payload }) { | |
return { ...state, searchString: payload }; | |
}, | |
setPagination(state, { payload }) { | |
return { ...state, pagination: { ...state.pagination, ...payload } }; | |
}, | |
setFileThumbnails(state, { payload }) { | |
return { ...state, fileThumbnails: payload }; | |
}, | |
}, | |
effects: { | |
*createKf({ payload = {} }, { call }) { | |
const { data } = yield call(kbService.createKb, payload); | |
const { retcode } = data; | |
if (retcode === 0) { | |
message.success(i18n.t('message.created')); | |
} | |
}, | |
*updateKf({ payload = {} }, { call }) { | |
const { data } = yield call(kbService.updateKb, payload); | |
const { retcode } = data; | |
if (retcode === 0) { | |
message.success(i18n.t('message.modified')); | |
} | |
}, | |
*getKfDetail({ payload = {} }, { call }) { | |
const { data } = yield call(kbService.get_kb_detail, payload); | |
}, | |
*getKfList({ payload = {} }, { call, put, select }) { | |
const state: KFModelState = yield select((state: any) => state.kFModel); | |
const requestBody = { | |
...payload, | |
page: state.pagination.current, | |
page_size: state.pagination.pageSize, | |
}; | |
if (state.searchString) { | |
requestBody['keywords'] = state.searchString; | |
} | |
const { data } = yield call(kbService.get_document_list, requestBody); | |
const { retcode, data: res } = data; | |
if (retcode === 0) { | |
yield put({ | |
type: 'updateState', | |
payload: { | |
data: res.docs, | |
total: res.total, | |
}, | |
}); | |
} | |
}, | |
throttledGetDocumentList: [ | |
function* ({ payload }, { call, put }) { | |
yield put({ type: 'getKfList', payload: { kb_id: payload } }); | |
}, | |
{ type: 'throttle', ms: 1000 }, // TODO: Provide type support for this effect | |
], | |
pollGetDocumentList: [ | |
function* ({ payload }, { call, put }) { | |
yield put({ type: 'getKfList', payload: { kb_id: payload } }); | |
}, | |
{ type: 'poll', delay: 15000 }, // TODO: Provide type support for this effect | |
], | |
*updateDocumentStatus({ payload = {} }, { call, put }) { | |
const { data } = yield call( | |
kbService.document_change_status, | |
pick(payload, ['doc_id', 'status']), | |
); | |
const { retcode } = data; | |
if (retcode === 0) { | |
message.success(i18n.t('message.modified')); | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
} | |
}, | |
*document_rm({ payload = {} }, { call, put }) { | |
const { data } = yield call(kbService.document_rm, { | |
doc_id: payload.doc_id, | |
}); | |
const { retcode } = data; | |
if (retcode === 0) { | |
message.success(i18n.t('message.deleted')); | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
} | |
return retcode; | |
}, | |
*document_rename({ payload = {} }, { call, put }) { | |
const { data } = yield call( | |
kbService.document_rename, | |
omit(payload, ['kb_id']), | |
); | |
const { retcode } = data; | |
if (retcode === 0) { | |
message.success(i18n.t('message.renamed')); | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
} | |
return retcode; | |
}, | |
*document_create({ payload = {} }, { call, put }) { | |
const { data } = yield call(kbService.document_create, payload); | |
const { retcode } = data; | |
if (retcode === 0) { | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
message.success(i18n.t('message.created')); | |
} | |
return retcode; | |
}, | |
*document_run({ payload = {} }, { call, put }) { | |
const { data } = yield call( | |
kbService.document_run, | |
omit(payload, ['knowledgeBaseId']), | |
); | |
const { retcode } = data; | |
if (retcode === 0) { | |
if (payload.knowledgeBaseId) { | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.knowledgeBaseId }, | |
}); | |
} | |
message.success(i18n.t('message.operated')); | |
} | |
return retcode; | |
}, | |
*document_change_parser({ payload = {} }, { call, put }) { | |
const { data } = yield call( | |
kbService.document_change_parser, | |
omit(payload, ['kb_id']), | |
); | |
const { retcode } = data; | |
if (retcode === 0) { | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
message.success(i18n.t('message.modified')); | |
} | |
return retcode; | |
}, | |
*fetch_document_thumbnails({ payload = {} }, { call, put }) { | |
const { data } = yield call(kbService.document_thumbnails, payload); | |
if (data.retcode === 0) { | |
yield put({ type: 'setFileThumbnails', payload: data.data }); | |
} | |
}, | |
*fetch_document_file({ payload = {} }, { call }) { | |
const documentId = payload; | |
try { | |
const ret = yield call(getDocumentFile, documentId); | |
return ret; | |
} catch (error) { | |
console.warn(error); | |
} | |
}, | |
*upload_document({ payload = {} }, { call, put }) { | |
const fileList = payload.fileList; | |
const formData = new FormData(); | |
formData.append('kb_id', payload.kb_id); | |
fileList.forEach((file: any) => { | |
formData.append('file', file); | |
}); | |
const { data } = yield call(kbService.document_upload, formData); | |
const succeed = data.retcode === 0; | |
if (succeed) { | |
message.success(i18n.t('message.uploaded')); | |
} | |
if (succeed || data.retcode === 500) { | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
} | |
return data; | |
}, | |
*web_crawl({ payload = {} }, { call, put }) { | |
const formData = new FormData(); | |
formData.append('name', payload.name); | |
formData.append('url', payload.url); | |
formData.append('kb_id', payload.kb_id); | |
const { data } = yield call(kbService.web_crawl, formData); | |
const succeed = data.retcode === 0; | |
if (succeed) { | |
message.success(i18n.t('message.uploaded')); | |
} | |
if (succeed || data.retcode === 500) { | |
yield put({ | |
type: 'getKfList', | |
payload: { kb_id: payload.kb_id }, | |
}); | |
} | |
return data.retcode; | |
}, | |
}, | |
subscriptions: { | |
setup({ dispatch, history }) { | |
history.listen(({ location }) => { | |
const state: { from: string } = (location.state ?? { | |
from: '', | |
}) as { from: string }; | |
if ( | |
state.from === '/knowledge' || // TODO: Just directly determine whether the current page is on the knowledge list page. | |
location.pathname === '/knowledge/dataset/upload' | |
) { | |
dispatch({ | |
type: 'setPagination', | |
payload: { current: 1, pageSize: 10 }, | |
}); | |
} | |
}); | |
}, | |
}, | |
}; | |
export default model; | |