dataSourceDetail.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { message } from 'antd'
  2. import * as service from '../services/index'
  3. import URLS from '../constants/url'
  4. import DEFAULT_COLUMN_TYPE from './defaultColumnType.json'
  5. export default {
  6. namespace: 'dataSourceDetail',
  7. state: {
  8. originData: {
  9. dirty: false,
  10. code: null,
  11. name: '未命名',
  12. type: null,
  13. connectCode: null,
  14. connectName: null,
  15. dbType: null,
  16. dbName: null,
  17. address: null,
  18. port: null,
  19. target: null,
  20. targetDirty: false,
  21. fetched: false,
  22. creatorCode: null,
  23. creatorName: null,
  24. createTime: null,
  25. userName: null,
  26. password: null,
  27. description: '',
  28. group: '-1',
  29. notice: '',
  30. columns: [],
  31. demo: false
  32. },
  33. },
  34. reducers: {
  35. setField(state, action) {
  36. const { name, value } = action;
  37. let obj = {};
  38. obj[name] = value;
  39. let newState = Object.assign({}, state, obj);
  40. return Object.assign({}, newState, {dirty: true});
  41. },
  42. setFields(state, action) {
  43. const { fields } = action;
  44. let obj = {};
  45. fields.map(f => (obj[f.name] = f.value));
  46. let newState = Object.assign({}, state, obj);
  47. return Object.assign({}, newState, {dirty: true});
  48. },
  49. silentSetField(state, action) {
  50. const { name, value } = action;
  51. let obj = {};
  52. obj[name] = value;
  53. let newState = Object.assign({}, state, obj);
  54. return newState;
  55. },
  56. silentSetFields(state, action) {
  57. const { fields } = action;
  58. let obj = {};
  59. fields.map(f => (obj[f.name] = f.value));
  60. let newState = Object.assign({}, state, obj);
  61. return newState;
  62. },
  63. reset(state, action) {
  64. let newState = Object.assign({}, state, state.originData);
  65. return Object.assign({}, newState);
  66. },
  67. setDirty(state, action) {
  68. const { dirty } = action;
  69. let newState = Object.assign({}, state, { dirty });
  70. return newState;
  71. },
  72. },
  73. effects: {
  74. *importColumns(action, { select, call, put }) {
  75. const dataSourceDetail = yield select(state => state.dataSourceDetail);
  76. const sqlStr = dataSourceDetail.target;
  77. const oldColumns = JSON.parse(JSON.stringify(dataSourceDetail.columns));
  78. const { cover } = action;
  79. let body = {
  80. id: dataSourceDetail.connectCode,
  81. strSql: sqlStr
  82. };
  83. try{
  84. const res = yield call(service.fetch, {
  85. url: URLS.DATASOURCE_QUERY_SQLCOLUMNS,
  86. body: body,
  87. timeout: 30000
  88. });
  89. const getColumnType = (dataType) => {
  90. return DEFAULT_COLUMN_TYPE[dataType] || 'string';
  91. }
  92. // 点击查询后清除数据对象dirty状态
  93. yield put({ type: 'setField', name: 'targetDirty', value: false });
  94. if(res.code > 0) {
  95. let colNames = [];
  96. let repeatColumnName = false;
  97. let columns = res.data.map((d, i) => {
  98. if(colNames.findIndex(cn => cn === d.columnName) > -1) {
  99. repeatColumnName = d.columnName;
  100. }
  101. colNames.push(d.columnName);
  102. return {
  103. key: d.columnName,
  104. using: true,
  105. name: d.columnName,
  106. alias: d.columnName,
  107. dataType: d.columnType,
  108. columnType: getColumnType(d.columnType),
  109. groupable: d.columnType === 'String',
  110. filterable: true,
  111. }
  112. });
  113. if(repeatColumnName) {
  114. message.error('加载列数据失败: 存在重复列[ ' + repeatColumnName + ' ]');
  115. return false;
  116. }
  117. if(cover) {
  118. // 覆盖
  119. yield put({ type: 'setField', name: 'columns', value: columns });
  120. }else {
  121. // 保留重复列
  122. let mergeColumns = [];
  123. columns.forEach(c => {
  124. let tc = oldColumns.find(o => o.name === c.name );
  125. if(tc) {
  126. let o = {};
  127. o.columnType = tc.dataType === c.dataType ? tc.columnType : getColumnType(c.dataType);
  128. mergeColumns.push({ ...c, ...o, alias: tc.alias, using: tc.using, groupable: tc.groupable, filterable: tc.filterable });
  129. }else {
  130. mergeColumns.push(c);
  131. }
  132. });
  133. yield put({ type: 'setFields', fields: [
  134. { name: 'columns', value: mergeColumns },
  135. { name: 'notice', value: '' }
  136. ] });
  137. }
  138. }else {
  139. yield put({ type: 'setFields', fields: [
  140. { name: 'columns', value: [] },
  141. { name: 'notice', value: res.msg }
  142. ] });
  143. }
  144. }catch(e) {
  145. console.error(body, e)
  146. yield put({ type: 'setFields', fields: [
  147. { name: 'columns', value: [] },
  148. { name: 'notice', value: e.message + '' || e + '' }
  149. ] });
  150. message.error('加载列数据失败: ' + e.message);
  151. }finally {
  152. yield put({ type: 'setFields', fields: [
  153. { name: 'fetched', value: true }
  154. ] });
  155. }
  156. },
  157. },
  158. subscriptions: {
  159. setup({ dispatch, history }) {
  160. dispatch({ type: 'reset' });
  161. }
  162. }
  163. };