import { message } from 'antd' import * as service from '../services/index' import URLS from '../constants/url' import DEFAULT_COLUMN_TYPE from './defaultColumnType.json' export default { namespace: 'dataSourceDetail', state: { originData: { code: null, name: '未命名', type: null, connectCode: null, dbType: null, dbName: null, address: null, port: null, target: null, creatorCode: null, creatorName: null, createTime: null, userName: null, password: null, description: '', group: '-1', notice: '', columns: [], }, code: null, name: '未命名', type: null, connectCode: null, dbType: null, dbName: null, address: null, port: null, target: null, creatorCode: null, creatorName: null, createTime: null, userName: null, password: null, description: '', group: '-1', notice: '', columns: [], }, reducers: { setField(state, action) { const { name, value } = action; let obj = {}; obj[name] = value; let newState = Object.assign({}, state, obj); return Object.assign({}, newState, {dirty: true}); }, setFields(state, action) { const { fields } = action; let obj = {}; fields.map(f => (obj[f.name] = f.value)); let newState = Object.assign({}, state, obj); return Object.assign({}, newState, {dirty: true}); }, silentSetField(state, action) { const { name, value } = action; let obj = {}; obj[name] = value; let newState = Object.assign({}, state, obj); return newState; }, silentSetFields(state, action) { const { fields } = action; let obj = {}; fields.map(f => (obj[f.name] = f.value)); let newState = Object.assign({}, state, obj); return newState; }, reset(state, action) { let newState = Object.assign({}, state, state.originData); return Object.assign({}, newState); }, setDirty(state, action) { const { dirty } = action; let newState = Object.assign({}, state, { dirty }); return newState; }, }, effects: { *importColumns(action, { select, call, put }) { const dataSourceDetail = yield select(state => state.present.dataSourceDetail); const sqlStr = dataSourceDetail.target; const oldColumns = dataSourceDetail.columns; const { cover } = action; let body = { id: dataSourceDetail.connectCode, strSql: sqlStr }; try{ const res = yield call(service.fetch, { url: URLS.DATASOURCE_QUERY_SQLCOLUMNS, body: body, timeout: 120000 }); const getColumnType = (dataType) => { return DEFAULT_COLUMN_TYPE[dataType] || 'categorical'; } console.log('请求列数据', body, res); if(!res.err && res.data.code > 0) { let columns = res.data.data.map((d, i) => { return { key: i, using: true, name: d.columnName, alias: d.columnName, dataType: d.columnType, columnType: getColumnType(d.columnType), groupable: d.columnType === 'String', filterable: true, } }); // yield put({ type: 'setField', name: 'columns', value: columns }); if(cover) { yield put({ type: 'setField', name: 'columns', value: columns }); }else { let mergeColumns = []; columns.forEach(c => { let tc = oldColumns.find(o => o.name === c.name ); if(tc) { mergeColumns.push(tc); }else { mergeColumns.push(c); } }); yield put({ type: 'setFields', fields: [ { name: 'columns', value: mergeColumns }, { name: 'notice', value: '' } ] }); } }else { yield put({ type: 'setFields', fields: [ { name: 'columns', value: [] }, { name: 'notice', value: res.err || res.data.msg } ] }); } }catch(e) { console.error(body, e) yield put({ type: 'setFields', fields: [ { name: 'columns', value: [] }, { name: 'notice', value: e.message + '' || e + '' } ] }); message.error('请求列数据错误: ' + e); } }, }, subscriptions: { setup({ dispatch, history }) { return history.listen(({ pathname }) => { if(pathname.startsWith('/datasource')) { const temp = pathname.split('/'); if(temp.length === 5) { const type = temp[2]; const code = temp[3]; const tab = temp[4]; dispatch({ type: 'setFields', fields: [ { name: 'type', value: type }, { name: 'code', value: code }, { name: 'tab', value: tab }, ] }); } } }) } } };