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; fileThumbnails: Record; } const model: DvaModel = { namespace: 'kFModel', state: { tenantIfo: {}, data: [], total: 0, currentRecord: null, searchString: '', pagination: { current: 1, pageSize: 10, }, fileThumbnails: {} as Record, }, 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;