dashboard.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. import { message } from 'antd'
  2. import * as service from '../services/index'
  3. import URLS from '../constants/url'
  4. const generateShareCode = () => {
  5. return Math.random().toString(36).substr(2).toUpperCase();
  6. }
  7. export default {
  8. namespace: 'dashboard',
  9. state: {
  10. originData: {
  11. list: [],
  12. newOne: {
  13. defaultSelectedGroups: [],
  14. defaultSelectedUsers: []
  15. },
  16. menuList: [],
  17. menuTree: [],
  18. menuExpandedKeys: ['-1'],
  19. menuSelectedKeys: [],
  20. menuFilterLabel: '',
  21. menuAutoExpandParent: true,
  22. filterLabel: '',
  23. filterItems: [ // 可选过滤字段
  24. { name: 'name', label: '报表名称', type: 'string' },
  25. { name: 'description', label: '说明', type: 'string' },
  26. { name: 'creatorName', label: '创建人', type: 'string' },
  27. { name: 'createTime', label: '创建时间', type: 'date' },
  28. ],
  29. filterItem: { name: 'name', label: '报表名称', type: 'string' }, // 已选过滤字段
  30. }
  31. },
  32. reducers: {
  33. list(state, action) {
  34. let list = action.list;
  35. return Object.assign({}, state, {list});
  36. },
  37. setFilterItem(state, action) {
  38. const { item } = action;
  39. return Object.assign({}, state, {filterItem: item, filterLabel: ''});
  40. },
  41. setFilterLabel(state, action) {
  42. let { label } = action;
  43. return Object.assign({}, state, {filterLabel: label});
  44. },
  45. setField(state, action) {
  46. const { name, value } = action;
  47. let obj = {};
  48. obj[name] = value;
  49. return Object.assign({}, state, obj);
  50. },
  51. setFields(state, action) {
  52. const { fields } = action;
  53. let obj = {};
  54. fields.map(f => (obj[f.name] = f.value));
  55. return Object.assign({}, state, obj);
  56. },
  57. reset(state, action) {
  58. let newState = Object.assign({}, state, state.originData);
  59. return Object.assign({}, newState);
  60. },
  61. },
  62. effects: {
  63. *fetchList(action, {select, call, put}) {
  64. const { pageNum, pageSize } = action;
  65. const body = {
  66. pageNum: pageNum || 1,
  67. pageSize: pageSize || 999
  68. }
  69. try {
  70. const dashboard = yield select(state => state.present.dashboard);
  71. if(!action.mandatory && dashboard.list.length > 0) {
  72. return;
  73. }
  74. const res = yield call(service.fetch, {
  75. url: URLS.DASHBOARD_LIST,
  76. method: 'GET',
  77. body
  78. });
  79. if(!res.err && res.data.code > 0) {
  80. const resData = res.data.data.list;
  81. let list = resData.map(d => {
  82. let items = d.bdConfiguration ? JSON.parse(d.bdConfiguration) : [];
  83. const dataSources = [];
  84. const dataConnects = [];
  85. items.forEach(item => {
  86. if(item.viewType === 'chart') {
  87. if(!dataSources.find(ad => ad.code === item.dataSourceCode)) {
  88. dataSources.push({
  89. code: item.dataSourceCode,
  90. name: item.dataSourceName
  91. })
  92. }
  93. if(!dataConnects.find(ad => ad.code === item.dataSourceCode)) {
  94. dataConnects.push({
  95. code: item.dataConnectCode,
  96. name: item.dataConnectName
  97. })
  98. }
  99. }
  100. })
  101. return {
  102. key: d.id + '',
  103. code: d.id+'',
  104. menuCode: d.menuId + '',
  105. name: d.bdName,
  106. items: items,
  107. description: d.bdNote || '',
  108. creatorCode: d.createId + '',
  109. creatorName: d.createBy,
  110. createTime: d.createDate,
  111. shareCode: d.bdCode,
  112. dataSources: dataSources,
  113. dataConnects: dataConnects,
  114. chartCodes: d.chartIds ? d.chartIds.split(',') : [],
  115. demo: d.demo
  116. }
  117. })
  118. yield put({ type: 'list', list: list });
  119. }else {
  120. message.error('请求报表列表失败: ' + (res.err || res.data.msg));
  121. }
  122. }catch(e) {
  123. message.error('请求报表列表失败: ' + e.message)
  124. }
  125. },
  126. *remoteDetail(action, { select, call, put }) {
  127. const code = action.code;
  128. if(!code){
  129. return
  130. }
  131. try {
  132. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
  133. const res = yield call(service.fetch, {
  134. url: URLS.DASHBOARD_DETAIL,
  135. method: 'GET',
  136. body: {
  137. id: code
  138. }
  139. });
  140. if(!res.err && res.data.code > 0) {
  141. const resData = res.data.data;
  142. let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
  143. let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
  144. let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
  145. const main = yield select(state => state.present.main);
  146. const { currentUser } = main;
  147. const allDataSources = items.map(item => {
  148. if(item.viewType === 'chart') {
  149. return {
  150. code: item.dataSourceCode,
  151. name: item.dataSourceName
  152. }
  153. }else {
  154. return null
  155. }
  156. }).filter(item => !!item);
  157. const dataSources = [];
  158. allDataSources.forEach(ad => {
  159. if(!dataSources.find(d => d.code === ad.code)) {
  160. dataSources.push(ad);
  161. }
  162. });
  163. let data = {
  164. code: resData.id+'',
  165. name: resData.bdName,
  166. menuCode: resData.menuId + '',
  167. items: items,
  168. description: resData.bdNote || '',
  169. creatorCode: resData.createId + '',
  170. creatorName: resData.createBy,
  171. createTime: resData.createDate,
  172. dataSources: dataSources,
  173. relationColumns: relationColumns,
  174. editMode: currentUser.code === resData.createId + '',
  175. filters: JSON.parse((resData.filters|| "[]")),
  176. shareCode: resData.bdCode,
  177. chartCodes: chartCodes,
  178. demo: resData.demo
  179. }
  180. let fields = [];
  181. for(let key in data) {
  182. fields.push({
  183. name: key,
  184. value: data[key]
  185. })
  186. }
  187. yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
  188. return data;
  189. }else {
  190. message.error('解析报表错误: ' + (res.err || res.data.msg));
  191. return false;
  192. }
  193. }catch(e) {
  194. message.error('解析报表错误: ' + e.message);
  195. return false;
  196. }finally {
  197. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
  198. }
  199. },
  200. *remoteAdd(action, { select, call, put }) {
  201. yield message.error('未指定目录');
  202. },
  203. *remoteQucikAdd(action, { select, call, put }) {
  204. const { menuCode } = action;
  205. try {
  206. const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
  207. const { name, items, description, relationColumns, filters } = dashboardDesigner;
  208. let body = {
  209. bdName: name,
  210. bdNote: description,
  211. bdConfiguration: JSON.stringify(items),
  212. relationColumns: JSON.stringify(relationColumns),
  213. filters: JSON.stringify(filters) || "",
  214. bdCode: generateShareCode(),
  215. thumbnail: '',
  216. chartIds: '',
  217. menuId: menuCode,
  218. }
  219. const res = yield call(service.fetch, {
  220. url: URLS.DASHBOARD_ADD,
  221. body: body
  222. });
  223. if(!res.err && res.data.code > 0) {
  224. yield put({ type: 'remoteMenuDashboardList', menuCode });
  225. yield put({ type: 'main/redirect', path: '/dashboard/' + res.data.data });
  226. }else {
  227. message.error('保存失败: ' + (res.err || res.data.msg));
  228. }
  229. }catch(e) {
  230. message.error('保存失败: ' + e.message);
  231. }
  232. },
  233. *remoteModify(action, { select, call, put }) {
  234. try {
  235. const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
  236. const { code, name, items, description, relationColumns, filters, chartCodes, shareCode } = dashboardDesigner;
  237. let body = {
  238. id: code,
  239. bdName: name,
  240. bdNote: description,
  241. bdConfiguration: JSON.stringify(items.map(item => ({ ...item, chartOption: null }))),
  242. relationColumns: JSON.stringify(relationColumns),
  243. filters: JSON.stringify(filters) || "",
  244. chartIds: chartCodes.join(','),
  245. bdCode: shareCode
  246. }
  247. const res = yield call(service.fetch, {
  248. url: URLS.DASHBOARD_UPDATE,
  249. body: body
  250. });
  251. if(!res.err && res.data.code > 0) {
  252. yield put({ type: 'fetchList', mandatory: true });
  253. yield put({ type: 'dashboardDesigner/silentSetField', name: 'dirty', value: false });
  254. message.success('保存成功');
  255. }else {
  256. message.error('保存失败: ' + (res.err || res.data.msg));
  257. }
  258. }catch(e) {
  259. message.error('保存失败: ' + e.message);
  260. }
  261. },
  262. *remoteDelete(action, { select, call, put }) {
  263. const dashboard = yield select(state => state.present.dashboard);
  264. const code = action.code;
  265. let list = dashboard.list;
  266. try {
  267. const res = yield call(service.fetch, {
  268. url: URLS.DASHBOARD_DELETE,
  269. body: code
  270. });
  271. if(!res.err && res.data.code > 0) {
  272. for(let i = 0; i < list.length; i++) {
  273. if(list[i].code === code) {
  274. list.splice(i, 1);
  275. break;
  276. }
  277. }
  278. yield put({ type: 'list', list: list });
  279. message.success('删除成功');
  280. }else {
  281. message.error('删除失败: ' + (res.err || res.data.msg));
  282. }
  283. }catch(e) {
  284. message.error('删除失败: ' + e.message);
  285. }
  286. },
  287. *remoteMenuTree(action, { put, call, select }) {
  288. const dashboard = yield select(state => state.present.dashboard);
  289. if(!action.mandatory && dashboard.menuTree.length > 0) {
  290. return;
  291. }
  292. try{
  293. const res = yield call(service.fetch, {
  294. url: URLS.DASHBOARD_MENU_TREE,
  295. method: 'GET'
  296. })
  297. if(!res.err && res.data.code > 0) {
  298. const resTree = res.data.data;
  299. const list = [];
  300. let fun = (tree, pcode) => {
  301. let newTree = tree.map((t, i) => {
  302. let ch = [];
  303. if(t.children && t.children.length > 0) {
  304. ch = fun(t.children, t.id);
  305. }
  306. let obj = {
  307. code: t.id + '',
  308. pcode: pcode + '',
  309. name: t.name,
  310. type: t.type,
  311. index: i,
  312. children: ch,
  313. childrenCount: ch.length
  314. }
  315. list.push(obj);
  316. return obj
  317. });
  318. return newTree;
  319. }
  320. let menuList = list;
  321. let menuTree = fun(resTree, '-1');
  322. yield put({ type: 'setFields', fields: [
  323. { name: 'menuList', value: menuList },
  324. { name: 'menuTree', value: menuTree },
  325. ] });
  326. }else {
  327. message.error('获取报表目录失败: ' + (res.err || res.data.msg));
  328. }
  329. }catch(e) {
  330. message.error('获取报表目录失败: ' + e.message);
  331. }
  332. },
  333. *remoteAddMenu(action, { put, call, select }) {
  334. const { menu } = action;
  335. try {
  336. const res = yield call(service.fetch, {
  337. url: URLS.DASHBOARD_MENU_ADD,
  338. method: 'POST',
  339. body: {
  340. id: menu.code,
  341. index: menu.index,
  342. name: menu.name,
  343. parentId: menu.pcode === '-1' ? 0 : menu.pcode
  344. }
  345. })
  346. if(!res.err && res.data.code > 0) {
  347. yield put({ type: 'remoteMenuTree', mandatory: true });
  348. yield put({ type: 'setFields', fields: [
  349. { name: 'menuSelectedKeys', value: [] },
  350. ] });
  351. return true;
  352. }else {
  353. message.error('添加报表目录失败: ' + (res.err || res.data.msg));
  354. return false;
  355. }
  356. }catch(e) {
  357. message.error('添加报表目录失败: ' + e.message);
  358. }
  359. },
  360. *remoteModifyMenu(action, { put, call, select }) {
  361. const { menu } = action;
  362. const res = yield call(service.fetch, {
  363. url: URLS.DASHBOARD_MENU_UPDATE,
  364. body: {
  365. id: menu.code,
  366. index: menu.index,
  367. name: menu.name,
  368. parentId: menu.pcode === '-1' ? '0' : menu.pcode
  369. }
  370. });
  371. if(!res.err && res.data.code > 0) {
  372. yield put({ type: 'remoteMenuTree', mandatory: true });
  373. return true;
  374. }else {
  375. message.error('修改报表目录失败: ' + (res.err || res.data.msg));
  376. return false;
  377. }
  378. },
  379. *remoteDeleteMenu(action, { put, call, select }) {
  380. const { menu } = action;
  381. const res = yield call(service.fetch, {
  382. url: URLS.DASHBOARD_MENU_DELETE + '/' + menu.code,
  383. });
  384. if(!res.err && res.data.code > 0) {
  385. yield put({ type: 'remoteMenuTree', mandatory: true });
  386. return true;
  387. }else {
  388. message.error('添加报表目录失败: ' + (res.err || res.data.msg));
  389. return false;
  390. }
  391. },
  392. *remoteSetMenu(action, { put, call, select }) {
  393. const { dashboard, menu } = action;
  394. try {
  395. const res = yield call(service.fetch, {
  396. url: URLS.DASHBOARD_SET_MENU,
  397. body: {
  398. dashBoardId: dashboard.code,
  399. menuId: menu.code
  400. },
  401. })
  402. if(!res.err && res.data.code > 0) {
  403. yield put({ type: 'remoteMenuDashboardList', menuCode: menu.code });
  404. yield put({ type: 'setFields', fields: [
  405. { name: 'menuSelectedKeys', value: [menu.code] },
  406. { name: 'menuExpandedKeys', value: [menu.code] },
  407. ] })
  408. }else {
  409. message.error('移动到目录失败: ' + (res.err || res.data.msg));
  410. }
  411. }catch(e) {
  412. message.error('移动到目录失败: ' + e.message);
  413. }
  414. },
  415. *remoteMenuDashboardList(action, { put, call, select }) {
  416. const { menuCode } = action;
  417. try {
  418. const res = yield call(service.fetch, {
  419. url: URLS.DASHBOARD_MENU_DASHBOARD_LIST + '/' + menuCode,
  420. method: 'GET',
  421. })
  422. if(!res.err && res.data.code > 0) {
  423. const resData = res.data.data;
  424. let list = resData.map(d => {
  425. let items = d.bdConfiguration ? JSON.parse(d.bdConfiguration) : [];
  426. const dataSources = [];
  427. const dataConnects = [];
  428. items.forEach(item => {
  429. if(item.viewType === 'chart') {
  430. if(!dataSources.find(ad => ad.code === item.dataSourceCode)) {
  431. dataSources.push({
  432. code: item.dataSourceCode,
  433. name: item.dataSourceName
  434. })
  435. }
  436. if(!dataConnects.find(ad => ad.code === item.dataSourceCode)) {
  437. dataConnects.push({
  438. code: item.dataConnectCode,
  439. name: item.dataConnectName
  440. })
  441. }
  442. }
  443. })
  444. return {
  445. key: d.id + '',
  446. code: d.id+'',
  447. name: d.bdName,
  448. menuCode: d.menuId + '',
  449. items: items,
  450. description: d.bdNote || '',
  451. creatorCode: d.createId + '',
  452. creatorName: d.createBy,
  453. createTime: d.createDate,
  454. shareCode: d.bdCode,
  455. dataSources: dataSources,
  456. dataConnects: dataConnects,
  457. chartCodes: d.chartIds ? d.chartIds.split(',') : [],
  458. demo: d.demo
  459. }
  460. })
  461. yield put({ type: 'list', list: list });
  462. }else {
  463. message.error('获取看板列表失败: ' + (res.err || res.data.msg));
  464. }
  465. }catch(e) {
  466. message.error('获取看板列表失败: ' + e.message);
  467. }
  468. },
  469. *share(action, { put, call, select }) {
  470. const { code, targets } = action;
  471. const body = {
  472. stId: code+'',
  473. type: 'dashboard',
  474. obj: targets.map(t => ({
  475. obId: t.code,
  476. objectType: t.isGroup ? '0' : '1'
  477. }))
  478. };
  479. try {
  480. const res = yield call(service.fetch, {
  481. url: URLS.DASHBOARD_SHARE,
  482. body
  483. });
  484. if(!res.err && res.data.code > 0) {
  485. message.success('设置分发对象成功');
  486. }else {
  487. message.error('设置分发对象失败: ' + (res.err || res.data.msg));
  488. }
  489. }catch(e) {
  490. message.error('分发失败: ' + e.message);
  491. }
  492. },
  493. *shareList(action, { put, call, select }) {
  494. const { code } = action;
  495. const body = code;
  496. const res = yield call(service.fetch, {
  497. url: URLS.DASHBOARD_SHARE_LIST,
  498. body
  499. });
  500. return res;
  501. },
  502. *transfer(action, { put, call, select }) {
  503. const { userCode, dashboardCode } = action;
  504. const body = {
  505. userId: userCode,
  506. id: dashboardCode
  507. };
  508. try {
  509. const res = yield call(service.fetch, {
  510. url: URLS.DASHBOARD_TRANSFER,
  511. body
  512. });
  513. if(!res.err && res.data.code > 0) {
  514. const dashboard = yield select(state => state.present.dashboard);
  515. const list = dashboard.list;
  516. for(let i = 0; i < list.length; i++) {
  517. if(list[i].code === dashboardCode) {
  518. list.splice(i, 1);
  519. break;
  520. }
  521. }
  522. yield put({ type: 'list', list });
  523. message.success('移交成功');
  524. }else {
  525. message.error('移交失败: ' + (res.err || res.data.msg));
  526. }
  527. }catch(e) {
  528. message.error('移交失败: ' + e.message);
  529. }
  530. },
  531. *remoteShareDetail(action, { select, call, put }) {
  532. const code = action.code;
  533. if(!code){
  534. return
  535. }
  536. try {
  537. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
  538. const res = yield call(service.fetch, {
  539. url: URLS.DASHBOARD_SHARE_DETAIL_BY_CODE,
  540. method: 'GET',
  541. allow: true,
  542. body: {
  543. code: code
  544. }
  545. });
  546. if(!res.err && res.data.code > 0) {
  547. const resData = res.data.data;
  548. let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
  549. let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
  550. let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
  551. const main = yield select(state => state.present.main);
  552. const { currentUser } = main;
  553. const allDataSources = items.map(item => {
  554. if(item.viewType === 'chart') {
  555. return {
  556. code: item.dataSourceCode,
  557. name: item.dataSourceName
  558. }
  559. }else {
  560. return null
  561. }
  562. }).filter(item => !!item);
  563. const dataSources = [];
  564. allDataSources.forEach(ad => {
  565. if(!dataSources.find(d => d.code === ad.code)) {
  566. dataSources.push(ad);
  567. }
  568. });
  569. let data = {
  570. code: resData.id+'',
  571. name: resData.bdName,
  572. items: items,
  573. description: resData.bdNote || '',
  574. creatorCode: resData.createId + '',
  575. creatorName: resData.createBy,
  576. createTime: resData.createDate,
  577. dataSources: dataSources,
  578. relationColumns: relationColumns,
  579. editMode: currentUser.code === resData.createId + '',
  580. filters: JSON.parse((resData.filters|| "[]")),
  581. shareCode: resData.bdCode,
  582. chartCodes: chartCodes,
  583. demo: resData.demo
  584. }
  585. let fields = [];
  586. for(let key in data) {
  587. fields.push({
  588. name: key,
  589. value: data[key]
  590. })
  591. }
  592. yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
  593. }else {
  594. message.error('解析报表错误: ' + (res.err || res.data.msg));
  595. }
  596. }catch(e) {
  597. message.error('解析报表错误: ' + e.message);
  598. }finally {
  599. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
  600. }
  601. },
  602. *getShareKey (action, { select, call, put }) {
  603. const record = action.record;
  604. const delay = action.delay;
  605. if(!record){
  606. return
  607. }
  608. try {
  609. const res = yield call(service.fetch, {
  610. url: URLS.DASHBOARD_GET_SHAREKEY,
  611. method: 'POST',
  612. body: {
  613. id: record.code,
  614. delay: delay
  615. }
  616. });
  617. if(!res.err && res.data.code > 0) {
  618. const resData = res.data.data;
  619. return resData;
  620. }else {
  621. message.error('生成分享链接失败: ' + (res.err || res.data.msg));
  622. }
  623. }catch(e) {
  624. message.error('生成分享链接失败: ' + e.message);
  625. }
  626. },
  627. *remoteShareKeyDetail(action, { select, call, put }) {
  628. const code = action.code;
  629. if(!code){
  630. return
  631. }
  632. try {
  633. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
  634. const res = yield call(service.fetch, {
  635. url: URLS.DASHBOARD_SHARE_DETAIL_BY_KEY,
  636. method: 'GET',
  637. allow: true,
  638. body: {
  639. data: code
  640. }
  641. });
  642. if(!res.err && res.data.code > 0) {
  643. const resData = res.data.data;
  644. let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
  645. let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
  646. let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
  647. const main = yield select(state => state.present.main);
  648. const { currentUser } = main;
  649. const allDataSources = items.map(item => {
  650. if(item.viewType === 'chart') {
  651. return {
  652. code: item.dataSourceCode,
  653. name: item.dataSourceName
  654. }
  655. }else {
  656. return null
  657. }
  658. }).filter(item => !!item);
  659. const dataSources = [];
  660. allDataSources.forEach(ad => {
  661. if(!dataSources.find(d => d.code === ad.code)) {
  662. dataSources.push(ad);
  663. }
  664. });
  665. let data = {
  666. code: resData.id+'',
  667. name: resData.bdName,
  668. items: items,
  669. description: resData.bdNote || '',
  670. creatorCode: resData.createId + '',
  671. creatorName: resData.createBy,
  672. createTime: resData.createDate,
  673. dataSources: dataSources,
  674. relationColumns: relationColumns,
  675. editMode: currentUser.code === resData.createId + '',
  676. filters: JSON.parse((resData.filters|| "[]")),
  677. shareCode: resData.bdCode,
  678. chartCodes: chartCodes,
  679. demo: resData.demo
  680. }
  681. let fields = [];
  682. for(let key in data) {
  683. fields.push({
  684. name: key,
  685. value: data[key]
  686. })
  687. }
  688. yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
  689. }else {
  690. message.error('解析报表错误: ' + (res.err || res.data.msg));
  691. }
  692. }catch(e) {
  693. message.error('解析报表错误: ' + e.message);
  694. }finally {
  695. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
  696. }
  697. },
  698. *copy(action, { select, call, put }) {
  699. const { dashboardCode, dataConnectCode } = action;
  700. const res = yield call(service.fetch, {
  701. url: URLS.DASHBOARD_COPY,
  702. body: {
  703. dashboardId: dashboardCode,
  704. dataSourceId: dataConnectCode
  705. }
  706. });
  707. if(!res.err && res.data.code > 0) {
  708. message.success('复制成功');
  709. yield put({ type: 'fetchList', mandatory: true });
  710. return true;
  711. }else {
  712. message.error('复制失败: ' + (res.err || res.data.msg));
  713. return false;
  714. }
  715. }
  716. },
  717. subscriptions: {
  718. setup({ dispatch, history}) {
  719. dispatch({ type: 'reset' });
  720. }
  721. }
  722. }