dataSource.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  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: 'dataSource',
  7. state: {
  8. newOne: {},
  9. list: [],
  10. filterLabel: '',
  11. invalidSQL: false,
  12. groupList: [],
  13. currentGroup: [{
  14. code: 'all',
  15. label: '全部分组'
  16. }],
  17. groupDirty: false
  18. },
  19. reducers: {
  20. list(state, action) {
  21. const { list } = action;
  22. return { ...state, list };
  23. },
  24. modify(state, action) {
  25. const { newOne } = state;
  26. let list = state.list;
  27. for(let i = 0; i < list.length; i++) {
  28. if(list[i].code === newOne.code) {
  29. list[i] = Object.assign({}, newOne);
  30. break;
  31. }
  32. }
  33. return Object.assign({}, state, {list});
  34. },
  35. delete(state, action) {
  36. const { model } = action;
  37. let { list } = state;
  38. for(let i = 0; i < list.length; i++) {
  39. if(list[i].code === model.code) {
  40. list.splice(i, 1);
  41. }
  42. }
  43. return Object.assign({}, state, {list});
  44. },
  45. setNewModelFields(state, action) {
  46. const { fields } = action;
  47. let newOne = state.newOne;
  48. for(let i = 0; i < fields.length; i++) {
  49. newOne[fields[i]['name']] = fields[i]['value'];
  50. }
  51. let obj = Object.assign({}, state, {newOne});
  52. return obj;
  53. },
  54. setNewModelField(state, action) {
  55. const { name, value } = action;
  56. let newOne = state.newOne;
  57. newOne[name] = value;
  58. let obj = Object.assign({}, state, {newOne});
  59. return obj;
  60. },
  61. setNewModel(state, action) {
  62. const { model } = action;
  63. let newOne = Object.assign({}, model);
  64. return Object.assign({}, state, {newOne});
  65. },
  66. resetNewModel(state, action) {
  67. return Object.assign({}, state, {newOne: {}});
  68. },
  69. setFilterLabel(state, action) {
  70. const { label } = action;
  71. return Object.assign({}, state, {filterLabel: label});
  72. },
  73. setNewModelInvalidSQL(state, action) {
  74. const { value } = action;
  75. let newOne = state.newOne;
  76. newOne.invalidSQL = value;
  77. return Object.assign({}, state, {newOne});
  78. },
  79. groupList(state, action) {
  80. let data = action.data;
  81. return Object.assign({}, state, {groupList: data});
  82. },
  83. /**
  84. * 设置数据源过滤用分组
  85. */
  86. setCurrentGroup(state, action) {
  87. const { group1, group2 } = action;
  88. let g = [group1];
  89. group2 && g.push(group2);
  90. return Object.assign({}, state, {currentGroup: g});
  91. },
  92. addGroup(state, action) {
  93. const { group } = action;
  94. let list = state.groupList;
  95. list.push(group);
  96. return Object.assign({}, state, {groupList: list});
  97. },
  98. modifyGroup(state, action) {
  99. const { group } = action;
  100. let list = state.groupList;
  101. let dirty = false;
  102. for(let i = 0; i < list.length; i++) {
  103. let l = list[i];
  104. if(l.code === group.code) {
  105. for(let k in l) {
  106. if(group[k] !== undefined && l[k] !== group[k]) {
  107. l[k] = group[k];
  108. dirty = true;
  109. }
  110. }
  111. break;
  112. }
  113. }
  114. return Object.assign({}, state, {groupDirty: dirty, groupList: list});
  115. },
  116. modifyGroups(state, action) {
  117. const { groups } = action;
  118. let list = state.groupList;
  119. const modifyGroupCodes = groups.map(g => g.code);
  120. list = list.filter(l => modifyGroupCodes.indexOf(l.code) === -1);
  121. list = list.concat(groups);
  122. return Object.assign({}, state, {groupList: list});
  123. },
  124. deleteGroup(state, action) {
  125. const { group } = action;
  126. let list = state.groupList;
  127. for(let i = 0; i < list.length; i++) {
  128. let l = list[i];
  129. if(l.code === group.code) {
  130. list.splice(i, 1);
  131. break;
  132. }
  133. }
  134. return Object.assign({}, state, {groupList: list});
  135. },
  136. setGroupDirty(state, action) {
  137. let dirty = action.dirty;
  138. return Object.assign({}, state, {groupDirty: dirty});
  139. },
  140. setDataSourceGroup(state, action) {
  141. const { dataSourceCode, groupCode } = action;
  142. let list = state.list;
  143. for(let i = 0; i < list.length; i++) {
  144. let l = list[i];
  145. if(l.code === dataSourceCode) {
  146. l.groupCode = groupCode;
  147. break;
  148. }
  149. }
  150. return Object.assign({}, state, {list: list});
  151. }
  152. },
  153. effects: {
  154. *fetchList(action, { select, call, put, takeEvery, takeLatest }) {
  155. const { pageNum, pageSize } = action;
  156. const body = {
  157. pageNum: pageNum || 1,
  158. pageSize: pageSize || 999
  159. }
  160. try {
  161. const dataSource = yield select(state => state.present.dataSource);
  162. if(!action.mandatory && dataSource.list.length > 0) {
  163. return;
  164. }
  165. const res = yield call(service.fetch, {
  166. url: URLS.DATASOURCE_LIST,
  167. body
  168. });
  169. console.log('请求数据源列表', body, res);
  170. if(!res.err && res.data.code > 0) {
  171. let list = res.data.data.list.map((r, i) => {
  172. let dbConfig = JSON.parse(r.dbConfig);
  173. let tags = JSON.parse(r.dataTag);
  174. return {
  175. key: r.dataId + '',
  176. code: r.dataId + '',
  177. name: r.dataName,
  178. type: r.type || 'database',
  179. dbType: dbConfig.databaseType,
  180. creatorName: r.createBy,
  181. creatorCode: r.createId+'',
  182. createTime: new Date(r.createDate),
  183. tags: tags,
  184. description: r.note,
  185. groupCode: r.connectorGroup+''
  186. }
  187. });
  188. yield put({ type: 'list', list });
  189. }else {
  190. message.error('读取数据源列表错误: ' + (res.err || res.data.msg));
  191. }
  192. }catch(e) {
  193. console.error(body, e);
  194. message.error('读取数据源列表错误: ' + e);
  195. }
  196. },
  197. *remoteAdd(action, { select, call, put }) {
  198. const dataSource = yield select(state => state.present.dataSource);
  199. const model = dataSource.newOne;
  200. try {
  201. const data = {
  202. dataName: model.name,
  203. note: model.description,
  204. loadObject: model.target,
  205. dataTag: model.tags,
  206. type: model.type,
  207. createBy: 'admin',
  208. dbConfig: {
  209. id: model.connectCode,
  210. addrass: model.address,
  211. port: model.port,
  212. databaseType: model.dbType,
  213. dataName: model.dbName,
  214. userName: model.userName,
  215. passWord: model.password
  216. },
  217. columnConfig: model.columns.map((c, i) => {
  218. return {
  219. columnName: c.name,
  220. columnLable: c.alias || c.description || c.name,
  221. dataType: c.dataType,
  222. columnType: c.columnType,
  223. isGroup: c.groupable?'1':'0',
  224. isFilter: c.filterable?'1':'0',
  225. isSubsection: c.bucketizable?'1':'0',
  226. isOpen: c.using?'1':'0',
  227. remarks: c.description
  228. }
  229. }),
  230. connectorGroup: model.group ? model.group : '-1'
  231. };
  232. const res = yield call(service.fetch, {
  233. url: URLS.DATASOURCE_ADD,
  234. body: data
  235. });
  236. console.log('新增数据源', data, res);
  237. if(!res.err && res.data.code > 0) {
  238. yield put({ type: 'fetchList', mandatory: true });
  239. yield put({ type: 'main/redirect', path: { pathname: '/datasource' } });
  240. message.success('新增成功');
  241. }else {
  242. message.error('新增失败: ' + (res.err || res.data.msg));
  243. }
  244. }catch(e) {
  245. message.error('新增失败: ' + e);
  246. }
  247. },
  248. *remoteDetail(action, { select, call, put }) {
  249. try {
  250. const code = action.code;
  251. const dataSource = yield select(state => state.present.dataSource);
  252. const model = dataSource.newOne;
  253. if((code + '') === (model.code + '')) {
  254. return;
  255. }
  256. const res = yield call(service.fetch, {
  257. url: URLS.DATASOURCE_DETAIL,
  258. body: code
  259. });
  260. console.log('解析数据源', code, res);
  261. if(!res.err && res.data.code > 0) {
  262. let resData = res.data.data;
  263. let columnConfig = JSON.parse(resData.columnConfig);
  264. let dbConfig = JSON.parse(resData.dbConfig);
  265. let tags = JSON.parse(resData.dataTag);
  266. let data = {
  267. code: resData.dataId + '',
  268. name: resData.dataName,
  269. type: resData.type,
  270. connectCode: dbConfig.id + '',
  271. dbType: dbConfig.databaseType,
  272. dbName: dbConfig.dataName,
  273. address: dbConfig.addrass,
  274. port: dbConfig.port,
  275. target: resData.loadObject,
  276. creatorName: resData.createBy,
  277. creatorCode: resData.createId+'',
  278. createTime: new Date(resData.createDate),
  279. userName: dbConfig.userName,
  280. password: dbConfig.passWord,
  281. tags: tags,
  282. description: resData.note,
  283. group: resData.connectorGroup+'',
  284. columns: columnConfig.map((c, i) => {
  285. return {
  286. key: i,
  287. using: c.isOpen==='1'?true:false,
  288. name: c.columnName,
  289. alias: c.columnLable,
  290. dataType: c.dataType,
  291. columnType: c.columnType,
  292. groupable: c.isGroup==='1'?true:false,
  293. filterable: c.isFilter==='1'?true:false,
  294. bucketizable: c.isSubsection==='1'?true:false,
  295. description: c.remarks
  296. }
  297. })
  298. }
  299. yield put({ type: 'setNewModel', model: data });
  300. }else {
  301. message.error('数据源解析错误: ' + (res.err || res.data.msg));
  302. }
  303. }catch(e) {
  304. console.log(e);
  305. message.error('数据源解析错误: ' + e);
  306. yield put({ type: 'list', list: [] });
  307. }
  308. },
  309. *importNewModelColumns(action, { select, call, put }) {
  310. const dataSource = yield select(state => state.present.dataSource);
  311. const sqlStr = dataSource.newOne.target;
  312. const oldColumns = dataSource.newOne.columns;
  313. const { cover } = action;
  314. let body = {
  315. id: dataSource.newOne.connectCode,
  316. strSql: sqlStr
  317. };
  318. try{
  319. const res = yield call(service.fetch, {
  320. url: URLS.DATASOURCE_QUERY_SQLCOLUMNS,
  321. body: body,
  322. timeout: 120000
  323. });
  324. const getColumnType = (dataType) => {
  325. return DEFAULT_COLUMN_TYPE[dataType] || 'categorical';
  326. }
  327. console.log('请求列数据', body, res);
  328. if(!res.err && res.data.code > 0) {
  329. // let columns = res.data.data.map((d, i) => {
  330. // return {
  331. // key: i,
  332. // using: true,
  333. // name: d,
  334. // alias: d.remarks ? d.remarks.substring(0, 10) : (d),
  335. // dataType: d.columnType,
  336. // columnType: getColumnType(d.columnType),
  337. // // groupable: d.columnType === 'VARCHAR2',
  338. // groupable: true,
  339. // filterable: true,
  340. // bucketizable: d.columnType === 'NUMBER',
  341. // description: d.remarks
  342. // }
  343. // });
  344. let columns = res.data.data.map((d, i) => {
  345. return {
  346. key: i,
  347. using: true,
  348. name: d.columnName,
  349. alias: d.columnName,
  350. dataType: d.columnType,
  351. columnType: getColumnType(d.columnType),
  352. groupable: d.columnType === 'String',
  353. filterable: true,
  354. // bucketizable: d.columnType === 'BigDecimal',
  355. }
  356. });
  357. yield put({ type: 'setNewModelInvalidSQL', value: columns.length === 0 });
  358. // yield put({ type: 'setNewModelField', name: 'columns', value: columns });
  359. if(cover) {
  360. yield put({ type: 'setNewModelField', name: 'columns', value: columns });
  361. }else {
  362. let mergeColumns = [];
  363. columns.forEach(c => {
  364. let tc = oldColumns.find(o => o.name === c.name );
  365. if(tc) {
  366. mergeColumns.push(tc);
  367. }else {
  368. mergeColumns.push(c);
  369. }
  370. });
  371. yield put({ type: 'setNewModelField', name: 'columns', value: mergeColumns });
  372. }
  373. }else {
  374. yield put({ type: 'setNewModelInvalidSQL', value: true });
  375. yield put({ type: 'setNewModelField', name: 'columns', value: [] });
  376. }
  377. }catch(e) {
  378. console.log(body)
  379. yield put({ type: 'setNewModelInvalidSQL', value: true });
  380. yield put({ type: 'setNewModelField', name: 'columns', value: [] });
  381. message.error('请求列数据错误: ' + e);
  382. }
  383. },
  384. *remoteDelete(action, { select, call, put }) {
  385. const dataSource = yield select(state => state.present.dataSource);
  386. const code = action.code;
  387. let list = dataSource.list;
  388. try {
  389. const res = yield call(service.fetch, {
  390. url: URLS.DATASOURCE_DELETE,
  391. body: [code]
  392. });
  393. if(!res.err && res.data.code > 0) {
  394. for(let i = 0; i < list.length; i++) {
  395. if((list[i].code + '') === (code + '')) {
  396. list.splice(i, 1);
  397. break;
  398. }
  399. }
  400. yield put({ type: 'list', list });
  401. message.success('删除成功');
  402. }else {
  403. message.error('删除失败: ' + (res.err || res.data.msg));
  404. }
  405. }catch(e) {
  406. console.log(e);
  407. message.error('删除失败: ' + e);
  408. }
  409. },
  410. *remoteModify(action, { select, call, put }) {
  411. try{
  412. const dataSource = yield select(state => state.present.dataSource);
  413. let model = action.model || dataSource.newOne;
  414. const code = model.code;
  415. let data = {
  416. dataId: code,
  417. dataName: model.name,
  418. note: model.description,
  419. loadObject: model.target,
  420. dataTag: model.tags,
  421. type: model.type,
  422. createBy: 'admin',
  423. connectorGroup: model.group ? model.group : '-1',
  424. dbConfig: model.address ? {
  425. addrass: model.address,
  426. port: model.port,
  427. databaseType: model.dbType,
  428. dataName: model.dbName,
  429. userName: model.userName,
  430. passWord: model.password
  431. } : '',
  432. columnConfig: model.columns ? model.columns.map((c, i) => {
  433. return {
  434. columnName: c.name,
  435. columnLable: c.alias || c.description || c.name,
  436. dataType: c.dataType,
  437. columnType: c.columnType,
  438. isGroup: c.groupable?'1':'0',
  439. isFilter: c.filterable?'1':'0',
  440. isSubsection: c.bucketizable?'1':'0',
  441. isOpen: c.using?'1':'0',
  442. remarks: c.description
  443. }
  444. }) : '',
  445. };
  446. const res = yield call(service.fetch, {
  447. url: URLS.DATASOURCE_UPDATE,
  448. body: data
  449. });
  450. console.log('修改数据源', data, res);
  451. if(!res.err && res.data.code > 0) {
  452. yield put({ type: 'fetchList', mandatory: true });
  453. message.success('修改成功');
  454. }else {
  455. message.error('修改失败: ' + (res.err || res.data.msg));
  456. }
  457. }catch(e) {
  458. console.log(e);
  459. message.error('修改失败: ' + e);
  460. }
  461. },
  462. *remoteGroupList(action, { select, call, put }) {
  463. try {
  464. const dataSource = yield select(state => state.present.dataSource);
  465. if(!action.mandatory && dataSource.groupList.length > 0) {
  466. return;
  467. }
  468. const res = yield call(service.fetch, {
  469. url: URLS.GROUP_DATASOURCE_LIST,
  470. });
  471. console.log('请求数据源分组列表', res);
  472. if(!res.err && res.data.code > 0) {
  473. const resData = res.data.data;
  474. let data = resData.map(d => {
  475. return {
  476. code: d.id+'',
  477. pcode: d.fatherId+'',
  478. index: +d.groupIndex,
  479. label: d.groupName+'',
  480. }
  481. });
  482. yield put({ type: 'groupList', data });
  483. }else {
  484. message.error('请求数据源列表错误: ' + (res.err || res.data.msg));
  485. }
  486. }catch(e) {
  487. console.log(e);
  488. message.error('请求数据源列表错误: ' + e);
  489. }
  490. },
  491. /**
  492. * 新增分组/子分组,需要传入父节点code
  493. */
  494. *remoteAddGroup(action, { select, call, put }) {
  495. try {
  496. const dataSource = yield select((state) => state.present.dataSource);
  497. const group = dataSource.groupList;
  498. const pgroups = group.filter(g => g.pcode === '-1');
  499. const cgroups = group.filter(g => g.pcode !== '-1');
  500. const { pgroup } = action;
  501. let body = {};
  502. if(pgroup) {
  503. body = {
  504. fatherId: pgroup.code,
  505. groupName: '新子分组',
  506. groupIndex: cgroups.filter(c => c.pcode === pgroup.code).length,
  507. }
  508. }else {
  509. body = {
  510. fatherId: '-1',
  511. groupName: '新分组',
  512. groupIndex: pgroups.length,
  513. }
  514. }
  515. const res = yield call(service.fetch, {
  516. url: URLS.GROUP_DATASOURCE_ADD,
  517. body: body
  518. });
  519. console.log('新增数据源分组', body, res);
  520. if(!res.err && res.data.code > 0) {
  521. let group = {
  522. code: res.data.data + '',
  523. pcode: body.fatherId + '',
  524. index: body.groupIndex,
  525. label: body.groupName+'',
  526. }
  527. yield put({ type: 'addGroup', group });
  528. }else {
  529. message.error('新增分组失败: ' + (res.err || res.data.msg));
  530. }
  531. }catch(e) {
  532. console.log(e);
  533. message.error('新增分组失败: ' + e);
  534. }
  535. },
  536. /**
  537. * 修改单个分组信息(因为不涉及顺序号的修改,所以一般只用于label的修改)
  538. */
  539. *remoteModifyGroup(action, { select, call, put }) {
  540. try {
  541. const dataSource = yield select((state) => state.present.dataSource);
  542. const groupDirty = dataSource.groupDirty;
  543. const group = action.group;
  544. if(!groupDirty) { // 如果属性无改动则取消修改请求
  545. return;
  546. }
  547. let body = {
  548. id: group.code,
  549. fatherId: group.pcode,
  550. groupName: group.label,
  551. groupIndex: group.index,
  552. }
  553. console.log('修改数据源分组', body);
  554. const res = yield call(service.fetch, {
  555. url: URLS.GROUP_DATASOURCE_UPDATE,
  556. body: body
  557. });
  558. console.log('修改数据源分组', body, res);
  559. if(!res.err && res.data.code > 0) {
  560. yield put({ type: 'setGroupDirty', dirty: false });
  561. }else {
  562. message.error('修改分组失败: ' + (res.err || res.data.msg));
  563. }
  564. }catch(e) {
  565. console.log(e);
  566. message.error('修改分组失败: ' + e);
  567. }
  568. },
  569. /**
  570. * 批量修改多个分组信息(在移动位置时用)
  571. */
  572. *remoteModifyGroups(action, { select, call, put }) {
  573. try {
  574. const groups = action.groups;
  575. let body = groups.map(g => {
  576. return {
  577. id: g.code,
  578. groupName: g.label,
  579. groupIndex: g.index,
  580. fatherId: g.pcode,
  581. }
  582. });
  583. console.log('批量修改数据源分组', body);
  584. const res = yield call(service.fetch, {
  585. url: URLS.GROUP_DATASOURCE_LIST_UPDATE,
  586. body: body
  587. });
  588. console.log('批量修改数据源分组', body, res);
  589. if(!res.err && res.data.code > 0) {
  590. yield put({ type: 'modifyGroups', groups: groups });
  591. }else {
  592. message.error('修改分组失败: ' + (res.err || res.data.msg));
  593. }
  594. }catch(e) {
  595. console.log(e);
  596. message.error('修改分组失败: ' + e);
  597. }
  598. },
  599. *remoteDeleteGroup(action, { select, call, put }) {
  600. try {
  601. const dataSource = yield select((state) => state.present.dataSource);
  602. const groupList = dataSource.groupList;
  603. const { group } = action;
  604. let bgroups = groupList.filter(l => l.pcode === group.pcode);
  605. bgroups.splice(group.index, 1);
  606. bgroups = bgroups.map((b, i) => {
  607. return { ...b, index: i }
  608. });
  609. yield put({ type: 'remoteModifyGroups', groups: bgroups });
  610. const res = yield call(service.fetch, {
  611. url: URLS.GROUP_DATASOURCE_DELETE,
  612. body: [group.code]
  613. });
  614. console.log('删除分组', group.code, res);
  615. if(!res.err && res.data.code > 0) {
  616. yield put({ type: 'deleteGroup', group});
  617. }else {
  618. message.error('删除分组失败: ' + (res.err || res.data.msg));
  619. }
  620. }catch(e) {
  621. console.log(e);
  622. message.error('删除分组失败: ' + e);
  623. }
  624. },
  625. *remoteMoveGroup(action, { select, call, put }) {
  626. try {
  627. const { dragCode, dropCode, dropPosition } = action;
  628. const dataSource = yield select((state) => state.present.dataSource);
  629. let group = dataSource.groupList;
  630. const dragGroup = group.filter(g => g.code === dragCode)[0];
  631. const dropGroup = group.filter(g => g.code === dropCode)[0];
  632. let modifyGroups = [];
  633. if((dragGroup.pcode === '-1' || dropGroup.pcode === '-1') && (dragGroup.pcode !== dropGroup.pcode)) { // 跨级
  634. console.log('跨级');
  635. if(dropGroup.pcode !== '-1') { // 从父级到子级
  636. console.log('error');
  637. return; // 不允许
  638. }else { // 从子级到父级
  639. if(dragGroup.pcode === dropGroup.code) { // 不跨组
  640. if(dropPosition === -1) { // 目标前
  641. console.log('before');
  642. let dragGroups = group.filter(g => g.pcode === dragGroup.pcode).sort((a, b) => a.index - b.index);
  643. let dropGroups = group.filter(g => g.pcode === dropGroup.pcode).sort((a, b) => a.index - b.index);
  644. dragGroups.splice(dragGroup.index, 1);
  645. dragGroups = dragGroups.map((g, i) => {
  646. return { ...g, index: i }
  647. });
  648. dropGroups.splice(dropGroup.index, 0, dragGroup);
  649. dropGroups = dropGroups.map((g, i) => {
  650. return { ...g, index: i, pcode: dropGroup.pcode }
  651. });
  652. modifyGroups = modifyGroups.concat(dragGroups, dropGroups);
  653. }else if(dropPosition === 0) { // 目标内
  654. console.log('nothing');
  655. return; // 无变化
  656. }else if(dropPosition === 1) { // 目标后
  657. console.log('after');
  658. let dragGroups = group.filter(g => g.pcode === dragGroup.pcode).sort((a, b) => a.index - b.index);
  659. let dropGroups = group.filter(g => g.pcode === dropGroup.pcode).sort((a, b) => a.index - b.index);
  660. dragGroups.splice(dragGroup.index, 1);
  661. dragGroups = dragGroups.map((g, i) => {
  662. return { ...g, index: i }
  663. });
  664. dropGroups.splice(dropGroup.index + 1, 0, dragGroup);
  665. dropGroups = dropGroups.map((g, i) => {
  666. return { ...g, index: i, pcode: dropGroup.pcode }
  667. });
  668. modifyGroups = modifyGroups.concat(dragGroups, dropGroups);
  669. }
  670. }else { // 跨组
  671. let dragGroups = group.filter(g => g.pcode === dragGroup.pcode).sort((a, b) => a.index - b.index);
  672. let dropGroups = group.filter(g => g.pcode === dropGroup.pcode).sort((a, b) => a.index - b.index);
  673. let dropChildrenGroups = group.filter(g => g.pcode === dropGroup.code).sort((a, b) => a.index - b.index);
  674. dragGroups.splice(dragGroup.index, 1);
  675. dragGroups = dragGroups.map((g, i) => {
  676. return { ...g, index: i }
  677. });
  678. if(dropPosition === -1) { // 目标前
  679. console.log('before');
  680. dropGroups.splice(dropGroup.index, 0, dragGroup);
  681. dropGroups = dropGroups.map((g, i) => {
  682. return { ...g, index: i, pcode: dropGroup.pcode }
  683. });
  684. modifyGroups = modifyGroups.concat(dragGroups, dropGroups);
  685. }else if(dropPosition === 0) { // 目标内
  686. console.log('in');
  687. dropChildrenGroups.push({
  688. ...dragGroup,
  689. index: dropChildrenGroups.length,
  690. pcode: dropGroup.code
  691. });
  692. modifyGroups = modifyGroups.concat(dragGroups, dropChildrenGroups);
  693. }else if(dropPosition === 1) { // 目标后
  694. console.log('after');
  695. dropGroups.splice(dropGroup.index + 1, 0, dragGroup);
  696. dropGroups = dropGroups.map((g, i) => {
  697. return { ...g, index: i, pcode: dropGroup.pcode }
  698. });
  699. modifyGroups = modifyGroups.concat(dragGroups, dropGroups);
  700. }
  701. }
  702. }
  703. }else { // 不跨级
  704. console.log('不跨级');
  705. if(dragGroup.pcode === dropGroup.pcode) { // 不跨组
  706. console.log('不跨组');
  707. let dGroups = group.filter(g => g.pcode === dragGroup.pcode).sort((a, b) => a.index - b.index);
  708. dGroups.splice(dragGroup.index, 1, {code: 'temp', index: dragGroup.index});
  709. if(dropPosition === -1) { // 目标前
  710. console.log('before');
  711. dGroups.splice(dropGroup.index, 0, dragGroup);
  712. dGroups = dGroups.filter(g => g.code !== 'temp').map((g, i) => {
  713. return { ...g, index: i }
  714. });
  715. modifyGroups = modifyGroups.concat(dGroups);
  716. }else if(dropPosition === 0) { // 目标内
  717. console.log('in');
  718. return;
  719. }else if(dropPosition === 1) { // 目标后
  720. console.log('after');
  721. dGroups.splice(dropGroup.index + 1, 0, dragGroup);
  722. dGroups = dGroups.filter(g => g.code !== 'temp').map((g, i) => {
  723. return { ...g, index: i }
  724. });
  725. modifyGroups = modifyGroups.concat(dGroups);
  726. }
  727. }else { // 跨组
  728. console.log('跨组');
  729. let dragGroups = group.filter(g => g.pcode === dragGroup.pcode).sort((a, b) => a.index - b.index);
  730. let dropGroups = group.filter(g => g.pcode === dropGroup.pcode).sort((a, b) => a.index - b.index);
  731. dragGroups.splice(dragGroup.index, 1);
  732. dragGroups = dragGroups.map((g, i) => {
  733. return { ...g, index: i }
  734. });
  735. for(let i = 0; i < dropGroups.length; i++) {
  736. if(dropGroups[i].code === dropGroup.code) {
  737. if(dropPosition === -1) { // 目标前
  738. console.log('before');
  739. dropGroups.splice(i, 0, dragGroup);
  740. dropGroups = dropGroups.map((g, i) => {
  741. return { ...g, index: i, pcode: dropGroup.pcode }
  742. });
  743. modifyGroups = modifyGroups.concat(dragGroups, dropGroups);
  744. }else if(dropPosition === 0) { // 目标内
  745. console.log('in');
  746. return; // 不允许
  747. }else if(dropPosition === 1) { // 目标后
  748. console.log('after');
  749. dropGroups.splice(i + 1, 0, dragGroup);
  750. dropGroups = dropGroups.map((g, i) => {
  751. return { ...g, index: i, pcode: dropGroup.pcode }
  752. });
  753. modifyGroups = modifyGroups.concat(dragGroups, dropGroups);
  754. }
  755. break;
  756. }
  757. }
  758. }
  759. }
  760. console.log(dragGroup, dropGroup, modifyGroups);
  761. yield put({ type: 'remoteModifyGroups', groups: modifyGroups });
  762. }catch(e) {
  763. console.log(e);
  764. message.error('位置调整失败: ' + e);
  765. }
  766. },
  767. /**
  768. * 为数据源设置所属分组
  769. */
  770. *remoteSetDataSourceGroup(action, { select, call, put }) {
  771. const { dataSource, group } = action;
  772. const dataSourceCode = dataSource.code;
  773. const groupCode = group.code;
  774. try {
  775. let body = {
  776. id: dataSourceCode,
  777. groupId: groupCode
  778. }
  779. let res = yield call(service.fetch, {
  780. url: URLS.GROUP_DATASOURCE_SET_GROUP,
  781. body: body
  782. });
  783. console.log('设置数据源所属分组', body, res);
  784. if(!res.err && res.data.code > 0) {
  785. yield put({ type: 'setDataSourceGroup', dataSourceCode, groupCode });
  786. }else {
  787. message.error('设置分组失败: ' + (res.err || res.data.msg));
  788. }
  789. } catch(e) {
  790. console.log(e);
  791. message.error('设置分组失败: ' + e);
  792. }
  793. },
  794. *transfer(action, { put, call, select }) {
  795. const { userCode, dataSourceCode } = action;
  796. const body = {
  797. userId: userCode,
  798. id: dataSourceCode
  799. };
  800. try {
  801. const res = yield call(service.fetch, {
  802. url: URLS.DATASOURCE_TRANSFER,
  803. body
  804. });
  805. console.log('数据源移交', body, res);
  806. if(!res.err && res.data.code > 0) {
  807. const dataSource = yield select(state => state.present.dataSource);
  808. const list = dataSource.list;
  809. for(let i = 0; i < list.length; i++) {
  810. if(list[i].code === dataSourceCode) {
  811. list.splice(i, 1);
  812. break;
  813. }
  814. }
  815. yield put({ type: 'list', list });
  816. yield put({ type: 'chart/fetchList', mandatory: true });
  817. message.success('移交成功');
  818. }else {
  819. console.log(body, (res.err || res.data.msg));
  820. message.error('移交失败');
  821. }
  822. }catch(e) {
  823. console.log(body, e);
  824. message.error('移交失败: ' + e);
  825. }
  826. }
  827. },
  828. subscriptions: {
  829. setup({ dispatch, history }) {
  830. return history.listen(({ pathname, query }) => {
  831. })
  832. }
  833. }
  834. };