dataSource.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. import { routerRedux } from 'dva/router'
  2. import { message } from 'antd'
  3. import * as service from '../services/index'
  4. import URLS from '../constants/url'
  5. export default {
  6. namespace: 'dataSource',
  7. state: {
  8. newOne: {},
  9. list: [],
  10. },
  11. reducers: {
  12. testData(state, action) {
  13. let list = state.list;
  14. for(let i = 0; i < 4; i++) {
  15. let newOne = {
  16. name: 'aldjalsdal',
  17. type: i%2?'file':'database',
  18. dbType: {key: 'oracle', label: 'ORACLE'},
  19. address: '2',
  20. port: '3',
  21. target: 'select * from employee',
  22. creator: 'zhuth',
  23. createTime: new Date(),
  24. userName: '2222',
  25. password: 'aaaww',
  26. tags: ['tttt', 'accc'],
  27. description: ' dddddddddddddddddddddd'
  28. };
  29. newOne.key = new Date().getMilliseconds()+(Math.random()*100).toFixed(0)+i;
  30. newOne.code = new Date().getMilliseconds()+(Math.random()*100).toFixed(0)+i;
  31. list.push(newOne);
  32. }
  33. return Object.assign({}, state, {list});
  34. },
  35. list(state, action) {
  36. let data = action.data;
  37. return Object.assign({}, state, {list: data});
  38. },
  39. add(state, action) {
  40. let newOne = Object.assign({}, state.newOne);
  41. let list = state.list;
  42. newOne.key = new Date().getMilliseconds()+(Math.random()*100).toFixed(0);
  43. newOne.code = new Date().getMilliseconds()+(Math.random()*100).toFixed(0);
  44. newOne.creator = 'zhuth';
  45. newOne.createTime = new Date();
  46. list.push(newOne);
  47. return Object.assign({}, state, {list});
  48. },
  49. modify(state, action) {
  50. const { newOne } = state;
  51. let list = state.list;
  52. for(let i = 0; i < list.length; i++) {
  53. if(list[i].code == newOne.code) {
  54. list[i] = Object.assign({}, newOne);
  55. break;
  56. }
  57. }
  58. return Object.assign({}, state, {list});
  59. },
  60. delete(state, action) {
  61. const { model } = action;
  62. let { list } = state;
  63. for(let i = 0; i < list.length; i++) {
  64. if(list[i].code == model.code) {
  65. list.splice(i, 1);
  66. }
  67. }
  68. return Object.assign({}, state, {list});
  69. },
  70. setNewModelFields(state, action) {
  71. const { fields } = action;
  72. let newOne = state.newOne;
  73. for(let i = 0; i < fields.length; i++) {
  74. newOne[fields[i]['name']] = fields[i]['value'];
  75. }
  76. let obj = Object.assign({}, state, {newOne});
  77. console.log(obj);
  78. return obj;
  79. },
  80. setNewModelField(state, action) {
  81. const { name, value } = action;
  82. let newOne = state.newOne;
  83. newOne[name] = value;
  84. let obj = Object.assign({}, state, {newOne});
  85. console.log(obj);
  86. return obj;
  87. },
  88. setNewModel(state, action) {
  89. const { model } = action;
  90. let newOne = Object.assign({}, model);
  91. return Object.assign({}, state, {newOne});
  92. },
  93. resetNewModel(state, action) {
  94. return Object.assign({}, state, {newOne: {}});
  95. },
  96. printNewOne(state, action) {
  97. console.log(state.newOne);
  98. return state;
  99. }
  100. },
  101. effects: {
  102. *fetchList(action, { select, call, put, takeEvery, takeLatest }) {
  103. try {
  104. const res = yield call(service.fetch, {
  105. url: URLS.DATASOURCE_LIST,
  106. body: {}
  107. });
  108. if(!res.err && res.data.code > 0) {
  109. let data = res.data.data.map((r, i) => {
  110. let dbConfig = JSON.parse(r.dbConfig);
  111. let tags = JSON.parse(r.dataTag);
  112. return {
  113. key: r.dataId,
  114. code: r.dataId,
  115. name: r.dataName,
  116. type: r.type || 'database',
  117. dbType: dbConfig.databaseType,
  118. creator: r.createBy,
  119. createTime: new Date(r.createDate),
  120. tags: tags,
  121. description: r.note
  122. }
  123. });
  124. yield put({ type: 'list', data });
  125. }else {
  126. message.error('读取数据源列表错误');
  127. }
  128. }catch(e) {
  129. message.error('读取数据源列表错误');
  130. console.log(e);
  131. }
  132. },
  133. *remoteAdd(action, { select, call, put }) {
  134. const dataSource = yield select(state => state.present.dataSource);
  135. const model = dataSource.newOne;
  136. try {
  137. const data = {
  138. dataName: model.name,
  139. note: model.description,
  140. loadObject: model.target,
  141. dataTag: model.tags,
  142. type: model.type,
  143. createBy: 'admin',
  144. dbConfig: {
  145. addrass: model.address,
  146. port: model.port,
  147. databaseType: model.dbType,
  148. dataName: model.dbName,
  149. userName: model.userName,
  150. passWord: model.password
  151. },
  152. columnConfig: model.columns.map((c, i) => {
  153. return {
  154. columnName: c.name,
  155. columnLable: c.alias,
  156. dataType: c.dataType,
  157. columnType: c.columnType,
  158. isGroup: c.groupable?'1':'0',
  159. isSubsection: c.bucketizable?'1':'0',
  160. isOpen: c.using?'1':'0',
  161. remarks: c.description
  162. }
  163. })
  164. };
  165. console.log(data);
  166. const res = yield call(service.fetch, {
  167. url: URLS.DATASOURCE_ADD,
  168. body: data
  169. });
  170. if(!res.err && res.data.code > 0) {
  171. message.success('新增成功!');
  172. yield put({ type: 'fetchList' });
  173. }else {
  174. message.error('新增失败!');
  175. }
  176. }catch(e) {
  177. message.error('新增失败!');
  178. }
  179. },
  180. *remoteDetail(action, { select, call, put }) {
  181. const dataSource = yield select(state => state.present.dataSource);
  182. const model = dataSource.newOne;
  183. const code = action.code;
  184. if(model.code == code){
  185. return
  186. }
  187. try {
  188. const res = yield call(service.fetch, {
  189. url: URLS.DATASOURCE_DETAIL,
  190. body: code
  191. });
  192. let resData = res.data.data;
  193. let columnConfig = JSON.parse(resData.columnConfig);
  194. let dbConfig = JSON.parse(resData.dbConfig);
  195. let tags = JSON.parse(resData.dataTag);
  196. let data = {
  197. code: resData.dataId,
  198. name: resData.dataName,
  199. type: resData.type,
  200. dbType: dbConfig.databaseType,
  201. dbName: dbConfig.dataName,
  202. address: dbConfig.addrass,
  203. port: dbConfig.port,
  204. target: resData.loadObject,
  205. creator: resData.createBy,
  206. createTime: new Date(resData.createDate),
  207. userName: dbConfig.userName,
  208. password: dbConfig.passWord,
  209. tags: tags,
  210. description: resData.note,
  211. columns: columnConfig.map((c, i) => {
  212. return {
  213. key: i,
  214. using: c.isOpen=='1'?true:false,
  215. name: c.columnName,
  216. alias: c.columnLable,
  217. dataType: c.dataType,
  218. columnType: c.columnType,
  219. groupable: c.isGroup=='1'?true:false,
  220. bucketizable: c.isSubsection=='1'?true:false,
  221. description: c.remarks
  222. }
  223. })
  224. }
  225. console.log(data);
  226. yield put({ type: 'setNewModel', model: data });
  227. }catch(e) {
  228. message.error('失败');
  229. console.log(e);
  230. yield put({ type: 'list', data: [] });
  231. }
  232. },
  233. *importNewModelColumns(action, { select, call, put }) {
  234. const dataSource = yield select(state => state.present.dataSource);
  235. const sqlStr = dataSource.newOne.target;
  236. const res = yield call(service.fetch, {
  237. url: URLS.DATASOURCE_QUERY_COLUMNS,
  238. body: {
  239. "String": sqlStr
  240. }
  241. });
  242. console.log(res);
  243. const getColumnType = (dataType) => {
  244. let columnType = 'string';
  245. if(dataType == 'VARCHAR2') {
  246. columnType = 'categorical';
  247. }else if(dataType == 'NUMBER') {
  248. columnType = 'scale'
  249. }else if(dataType == 'DATE') {
  250. columnType = 'time'
  251. }else if(dataType == 'NUMBER') {
  252. columnType = 'scale'
  253. }
  254. return columnType;
  255. }
  256. if(!res.err && res.data.code > 0) {
  257. let columns = res.data.data.map((d, i) => {
  258. return {
  259. key: i,
  260. using: true,
  261. name: d.columnName,
  262. alias: d.remarks?d.remarks.substring(0, 10):'',
  263. dataType: d.columnType,
  264. columnType: getColumnType(d.columnType),
  265. groupable: d.columnType == 'VARCHAR2',
  266. bucketizable: d.columnType == 'NUMBER',
  267. description: d.remarks
  268. }
  269. });
  270. yield put({ type: 'setNewModelField', name: 'columns', value: columns });
  271. }else {
  272. yield put({ type: 'setNewModelField', name: 'columns', value: [] });
  273. message.error('请求数据错误');
  274. }
  275. },
  276. *remoteDelete(action, { select, call, put }) {
  277. const res = yield call(service.fetch, {
  278. url: URLS.DATASOURCE_DELETE,
  279. body: [action.code]
  280. });
  281. yield put({ type: 'fetchList' });
  282. },
  283. *remoteModify(action, { select, call, put }) {
  284. try{
  285. const dataSource = yield select(state => state.present.dataSource);
  286. let model = dataSource.newOne;
  287. const code = action.code;
  288. let list = dataSource.list;
  289. let data = {
  290. dataId: code,
  291. dataName: model.name,
  292. note: model.description,
  293. loadObject: model.target,
  294. dataTag: model.tags,
  295. type: model.type,
  296. createBy: 'admin',
  297. dbConfig: {
  298. addrass: model.address,
  299. port: model.port,
  300. databaseType: model.dbType,
  301. dataName: model.dbName,
  302. userName: model.userName,
  303. passWord: model.password
  304. },
  305. columnConfig: model.columns.map((c, i) => {
  306. return {
  307. columnName: c.name,
  308. columnLable: c.alias,
  309. dataType: c.dataType,
  310. columnType: c.columnType,
  311. isGroup: c.groupable?'1':'0',
  312. isSubsection: c.bucketizable?'1':'0',
  313. isOpen: c.using?'1':'0',
  314. remarks: c.description
  315. }
  316. })
  317. };
  318. console.log(data);
  319. const res = yield call(service.fetch, {
  320. url: URLS.DATASOURCE_UPDATE,
  321. body: data
  322. });
  323. if(!res.err && res.data.code > 0) {
  324. list = list.map(l => {
  325. if(l.code == action.code) {
  326. l = model;
  327. }
  328. return l;
  329. });
  330. yield put({ type: 'list', data: list });
  331. message.success('修改成功');
  332. }else {
  333. message.error('修改失败');
  334. }
  335. }catch(e) {
  336. message.error('修改失败');
  337. }
  338. }
  339. },
  340. subscriptions: {
  341. setup({ dispatch, history }) {
  342. dispatch({ type: 'fetchList' })
  343. return history.listen(({ pathname, query }) => {
  344. let detail = pathname.match(/datasource\/(\w+)\/(\w+)/);
  345. if(detail) {
  346. if(pathname.match(/datasource\/(\w+)\/(\w+)\/(\w+)/)) {
  347. detail = pathname.match(/datasource\/(\w+)\/(\w+)\/(\w+)/);
  348. let type = detail[1];
  349. let code = detail[2];
  350. let tab = detail[3];
  351. console.log(type, code, tab);
  352. if(code != 'create') {
  353. dispatch({ type: 'remoteDetail', code: code })
  354. }
  355. }else {
  356. // 缺省跳转到属性配置tab
  357. dispatch({ type: 'main/redirect', path: pathname + (pathname.endsWith('/') ? '' : '/') + 'base' })
  358. }
  359. }
  360. })
  361. }
  362. }
  363. };