dataSource.js 15 KB

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