dataSource.js 15 KB

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