Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

model.ts 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. import { BaseState } from '@/interfaces/common';
  2. import { IKnowledgeFile } from '@/interfaces/database/knowledge';
  3. import i18n from '@/locales/config';
  4. import kbService, { getDocumentFile } from '@/services/knowledge-service';
  5. import { message } from 'antd';
  6. import omit from 'lodash/omit';
  7. import pick from 'lodash/pick';
  8. import { DvaModel } from 'umi';
  9. export interface KFModelState extends BaseState {
  10. tenantIfo: any;
  11. data: IKnowledgeFile[];
  12. total: number;
  13. currentRecord: Nullable<IKnowledgeFile>;
  14. fileThumbnails: Record<string, string>;
  15. }
  16. const model: DvaModel<KFModelState> = {
  17. namespace: 'kFModel',
  18. state: {
  19. tenantIfo: {},
  20. data: [],
  21. total: 0,
  22. currentRecord: null,
  23. searchString: '',
  24. pagination: {
  25. current: 1,
  26. pageSize: 10,
  27. },
  28. fileThumbnails: {} as Record<string, string>,
  29. },
  30. reducers: {
  31. updateState(state, { payload }) {
  32. return {
  33. ...state,
  34. ...payload,
  35. };
  36. },
  37. setCurrentRecord(state, { payload }) {
  38. return { ...state, currentRecord: payload };
  39. },
  40. setSearchString(state, { payload }) {
  41. return { ...state, searchString: payload };
  42. },
  43. setPagination(state, { payload }) {
  44. return { ...state, pagination: { ...state.pagination, ...payload } };
  45. },
  46. setFileThumbnails(state, { payload }) {
  47. return { ...state, fileThumbnails: payload };
  48. },
  49. },
  50. effects: {
  51. *createKf({ payload = {} }, { call }) {
  52. const { data } = yield call(kbService.createKb, payload);
  53. const { retcode } = data;
  54. if (retcode === 0) {
  55. message.success(i18n.t('message.created'));
  56. }
  57. },
  58. *updateKf({ payload = {} }, { call }) {
  59. const { data } = yield call(kbService.updateKb, payload);
  60. const { retcode } = data;
  61. if (retcode === 0) {
  62. message.success(i18n.t('message.modified'));
  63. }
  64. },
  65. *getKfDetail({ payload = {} }, { call }) {
  66. const { data } = yield call(kbService.get_kb_detail, payload);
  67. },
  68. *getKfList({ payload = {} }, { call, put, select }) {
  69. const state: KFModelState = yield select((state: any) => state.kFModel);
  70. const requestBody = {
  71. ...payload,
  72. page: state.pagination.current,
  73. page_size: state.pagination.pageSize,
  74. };
  75. if (state.searchString) {
  76. requestBody['keywords'] = state.searchString;
  77. }
  78. const { data } = yield call(kbService.get_document_list, requestBody);
  79. const { retcode, data: res } = data;
  80. if (retcode === 0) {
  81. yield put({
  82. type: 'updateState',
  83. payload: {
  84. data: res.docs,
  85. total: res.total,
  86. },
  87. });
  88. }
  89. },
  90. throttledGetDocumentList: [
  91. function* ({ payload }, { call, put }) {
  92. yield put({ type: 'getKfList', payload: { kb_id: payload } });
  93. },
  94. { type: 'throttle', ms: 1000 }, // TODO: Provide type support for this effect
  95. ],
  96. pollGetDocumentList: [
  97. function* ({ payload }, { call, put }) {
  98. yield put({ type: 'getKfList', payload: { kb_id: payload } });
  99. },
  100. { type: 'poll', delay: 15000 }, // TODO: Provide type support for this effect
  101. ],
  102. *updateDocumentStatus({ payload = {} }, { call, put }) {
  103. const { data } = yield call(
  104. kbService.document_change_status,
  105. pick(payload, ['doc_id', 'status']),
  106. );
  107. const { retcode } = data;
  108. if (retcode === 0) {
  109. message.success(i18n.t('message.modified'));
  110. yield put({
  111. type: 'getKfList',
  112. payload: { kb_id: payload.kb_id },
  113. });
  114. }
  115. },
  116. *document_rm({ payload = {} }, { call, put }) {
  117. const { data } = yield call(kbService.document_rm, {
  118. doc_id: payload.doc_id,
  119. });
  120. const { retcode } = data;
  121. if (retcode === 0) {
  122. message.success(i18n.t('message.deleted'));
  123. yield put({
  124. type: 'getKfList',
  125. payload: { kb_id: payload.kb_id },
  126. });
  127. }
  128. return retcode;
  129. },
  130. *document_rename({ payload = {} }, { call, put }) {
  131. const { data } = yield call(
  132. kbService.document_rename,
  133. omit(payload, ['kb_id']),
  134. );
  135. const { retcode } = data;
  136. if (retcode === 0) {
  137. message.success(i18n.t('message.renamed'));
  138. yield put({
  139. type: 'getKfList',
  140. payload: { kb_id: payload.kb_id },
  141. });
  142. }
  143. return retcode;
  144. },
  145. *document_create({ payload = {} }, { call, put }) {
  146. const { data } = yield call(kbService.document_create, payload);
  147. const { retcode } = data;
  148. if (retcode === 0) {
  149. yield put({
  150. type: 'getKfList',
  151. payload: { kb_id: payload.kb_id },
  152. });
  153. message.success(i18n.t('message.created'));
  154. }
  155. return retcode;
  156. },
  157. *document_run({ payload = {} }, { call, put }) {
  158. const { data } = yield call(
  159. kbService.document_run,
  160. omit(payload, ['knowledgeBaseId']),
  161. );
  162. const { retcode } = data;
  163. if (retcode === 0) {
  164. if (payload.knowledgeBaseId) {
  165. yield put({
  166. type: 'getKfList',
  167. payload: { kb_id: payload.knowledgeBaseId },
  168. });
  169. }
  170. message.success(i18n.t('message.operated'));
  171. }
  172. return retcode;
  173. },
  174. *document_change_parser({ payload = {} }, { call, put }) {
  175. const { data } = yield call(
  176. kbService.document_change_parser,
  177. omit(payload, ['kb_id']),
  178. );
  179. const { retcode } = data;
  180. if (retcode === 0) {
  181. yield put({
  182. type: 'getKfList',
  183. payload: { kb_id: payload.kb_id },
  184. });
  185. message.success(i18n.t('message.modified'));
  186. }
  187. return retcode;
  188. },
  189. *fetch_document_thumbnails({ payload = {} }, { call, put }) {
  190. const { data } = yield call(kbService.document_thumbnails, payload);
  191. if (data.retcode === 0) {
  192. yield put({ type: 'setFileThumbnails', payload: data.data });
  193. }
  194. },
  195. *fetch_document_file({ payload = {} }, { call }) {
  196. const documentId = payload;
  197. try {
  198. const ret = yield call(getDocumentFile, documentId);
  199. return ret;
  200. } catch (error) {
  201. console.warn(error);
  202. }
  203. },
  204. *upload_document({ payload = {} }, { call, put }) {
  205. const fileList = payload.fileList;
  206. const formData = new FormData();
  207. formData.append('kb_id', payload.kb_id);
  208. fileList.forEach((file: any) => {
  209. formData.append('file', file);
  210. });
  211. const ret = yield call(kbService.document_upload, formData);
  212. const succeed = ret?.data?.retcode === 0;
  213. if (succeed) {
  214. message.success(i18n.t('message.uploaded'));
  215. }
  216. if (succeed || ret?.data?.retcode === 500) {
  217. yield put({
  218. type: 'getKfList',
  219. payload: { kb_id: payload.kb_id },
  220. });
  221. }
  222. return ret?.data;
  223. },
  224. *web_crawl({ payload = {} }, { call, put }) {
  225. const formData = new FormData();
  226. formData.append('name', payload.name);
  227. formData.append('url', payload.url);
  228. formData.append('kb_id', payload.kb_id);
  229. const { data } = yield call(kbService.web_crawl, formData);
  230. const succeed = data.retcode === 0;
  231. if (succeed) {
  232. message.success(i18n.t('message.uploaded'));
  233. }
  234. if (succeed || data.retcode === 500) {
  235. yield put({
  236. type: 'getKfList',
  237. payload: { kb_id: payload.kb_id },
  238. });
  239. }
  240. return data.retcode;
  241. },
  242. },
  243. subscriptions: {
  244. setup({ dispatch, history }) {
  245. history.listen(({ location }) => {
  246. const state: { from: string } = (location.state ?? {
  247. from: '',
  248. }) as { from: string };
  249. if (
  250. state.from === '/knowledge' || // TODO: Just directly determine whether the current page is on the knowledge list page.
  251. location.pathname === '/knowledge/dataset/upload'
  252. ) {
  253. dispatch({
  254. type: 'setPagination',
  255. payload: { current: 1, pageSize: 10 },
  256. });
  257. }
  258. });
  259. },
  260. },
  261. };
  262. export default model;