dashboard.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. import { message } from 'antd'
  2. import * as service from '../services/index'
  3. import URLS from '../constants/url'
  4. export default {
  5. namespace: 'dashboard',
  6. state: {
  7. originData: {
  8. list: [],
  9. newOne: {
  10. defaultSelectedGroups: [],
  11. defaultSelectedUsers: []
  12. },
  13. filterLabel: '',
  14. groupList: [],
  15. currentGroup: [{
  16. code: 'all',
  17. label: '全部分组'
  18. }],
  19. groupDirty: false,
  20. }
  21. },
  22. reducers: {
  23. list(state, action) {
  24. let list = action.list;
  25. return Object.assign({}, state, {list});
  26. },
  27. setFilterLabel(state, action) {
  28. let { label } = action;
  29. return Object.assign({}, state, {filterLabel: label});
  30. },
  31. reset(state, action) {
  32. let newState = Object.assign({}, state, state.originData);
  33. return Object.assign({}, newState);
  34. },
  35. },
  36. effects: {
  37. *fetchList(action, {select, call, put}) {
  38. const { pageNum, pageSize } = action;
  39. const body = {
  40. pageNum: pageNum || 1,
  41. pageSize: pageSize || 999
  42. }
  43. try {
  44. const dashboard = yield select(state => state.present.dashboard);
  45. if(!action.mandatory && dashboard.list.length > 0) {
  46. return;
  47. }
  48. const res = yield call(service.fetch, {
  49. url: URLS.DASHBOARD_LIST,
  50. method: 'GET',
  51. body
  52. });
  53. console.log('请求看板列表', body, res);
  54. if(!res.err && res.data.code > 0) {
  55. const resData = res.data.data.list;
  56. let list = resData.map(d => {
  57. let items = d.bdConfiguration ? JSON.parse(d.bdConfiguration) : [];
  58. return {
  59. code: d.id+'',
  60. name: d.bdName,
  61. items: items,
  62. description: d.bdNote || '',
  63. creatorCode: d.createId + '',
  64. creatorName: d.createBy,
  65. createTime: d.createDate,
  66. shareCode: d.bdCode,
  67. demo: d.demo
  68. }
  69. })
  70. yield put({ type: 'list', list: list });
  71. }else {
  72. message.error('请求看板列表失败: ' + (res.err || res.data.msg));
  73. }
  74. }catch(e) {
  75. console.log(body, e);
  76. message.error('请求看板列表失败: ' + e)
  77. }
  78. },
  79. *remoteDetail(action, { select, call, put }) {
  80. const code = action.code;
  81. if(!code){
  82. return
  83. }
  84. try {
  85. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
  86. const res = yield call(service.fetch, {
  87. url: URLS.DASHBOARD_DETAIL,
  88. method: 'GET',
  89. body: {
  90. id: code
  91. }
  92. });
  93. console.log('解析看板数据', code, res);
  94. if(!res.err && res.data.code > 0) {
  95. const resData = res.data.data;
  96. let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
  97. let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
  98. let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
  99. const main = yield select(state => state.present.main);
  100. const { currentUser } = main;
  101. const allDataSources = items.map(item => {
  102. if(item.viewType === 'chart') {
  103. return {
  104. code: item.dataSourceCode,
  105. name: item.dataSourceName
  106. }
  107. }else {
  108. return null
  109. }
  110. }).filter(item => !!item);
  111. const dataSources = [];
  112. allDataSources.forEach(ad => {
  113. if(!dataSources.find(d => d.code === ad.code)) {
  114. dataSources.push(ad);
  115. }
  116. });
  117. let data = {
  118. code: resData.id+'',
  119. name: resData.bdName,
  120. items: items,
  121. description: resData.bdNote || '',
  122. creatorCode: resData.createId + '',
  123. creatorName: resData.createBy,
  124. createTime: resData.createDate,
  125. dataSources: dataSources,
  126. relationColumns: relationColumns,
  127. editMode: currentUser.code === resData.createId + '',
  128. filters: JSON.parse((resData.filters|| "[]")),
  129. shareCode: resData.bdCode,
  130. chartCodes: chartCodes,
  131. demo: resData.demo
  132. }
  133. let fields = [];
  134. for(let key in data) {
  135. fields.push({
  136. name: key,
  137. value: data[key]
  138. })
  139. }
  140. yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
  141. }else {
  142. message.error('解析看板错误: ' + (res.err || res.data.msg));
  143. }
  144. }catch(e) {
  145. console.log(e);
  146. message.error('解析看板错误: ' + e);
  147. }finally {
  148. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
  149. }
  150. },
  151. *remoteAdd(action, { select, call, put }) {
  152. try {
  153. const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
  154. const { name, items, relationColumns, filters, shareCode } = dashboardDesigner;
  155. let body = {
  156. bdName: name,
  157. bdNote: '',
  158. bdConfiguration: JSON.stringify(items),
  159. relationColumns: JSON.stringify(relationColumns),
  160. filters: JSON.stringify(filters) || '',
  161. bdCode: shareCode,
  162. chartCodes: []
  163. }
  164. console.log('新增看板', body);
  165. const res = yield call(service.fetch, {
  166. url: URLS.DASHBOARD_ADD,
  167. body: body
  168. });
  169. console.log('新增看板', body, res);
  170. if(!res.err && res.data.code > 0) {
  171. yield put({ type: 'fetchList', mandatory: true });
  172. message.success('保存成功');
  173. }else {
  174. message.error('保存失败: ' + (res.err || res.data.msg));
  175. }
  176. }catch(e) {
  177. console.log(e);
  178. message.error('保存失败: ' + e);
  179. }
  180. },
  181. *remoteQucikAdd(action, { select, call, put }) {
  182. try {
  183. const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
  184. const { name, items, description, relationColumns, filters, shareCode } = dashboardDesigner;
  185. let body = {
  186. bdName: name,
  187. bdNote: description,
  188. bdConfiguration: JSON.stringify(items),
  189. relationColumns: JSON.stringify(relationColumns),
  190. filters: JSON.stringify(filters) || "",
  191. bdCode: shareCode,
  192. chartCodes: []
  193. }
  194. console.log('快速新增看板', body);
  195. const res = yield call(service.fetch, {
  196. url: URLS.DASHBOARD_ADD,
  197. body: body
  198. });
  199. console.log('快速新增看板', body, res);
  200. if(!res.err && res.data.code > 0) {
  201. yield put({ type: 'fetchList', mandatory: true });
  202. yield put({ type: 'main/redirect', path: '/dashboard/' + res.data.data });
  203. }else {
  204. message.error('保存失败: ' + (res.err || res.data.msg));
  205. }
  206. }catch(e) {
  207. console.log(e);
  208. message.error('保存失败: ' + e);
  209. }
  210. },
  211. *remoteModify(action, { select, call, put }) {
  212. try {
  213. const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
  214. const { code, name, items, description, relationColumns, filters, chartCodes, shareCode } = dashboardDesigner;
  215. let body = {
  216. id: code,
  217. bdName: name,
  218. bdNote: description,
  219. bdConfiguration: JSON.stringify(items.map(item => ({ ...item, chartOption: null }))),
  220. relationColumns: JSON.stringify(relationColumns),
  221. filters: JSON.stringify(filters) || "",
  222. chartIds: chartCodes.join(','),
  223. bdCode: shareCode
  224. }
  225. const res = yield call(service.fetch, {
  226. url: URLS.DASHBOARD_UPDATE,
  227. body: body
  228. });
  229. console.log('修改看板', body, res);
  230. if(!res.err && res.data.code > 0) {
  231. yield put({ type: 'fetchList', mandatory: true });
  232. yield put({ type: 'dashboardDesigner/silentSetField', name: 'dirty', value: false });
  233. message.success('保存成功');
  234. }else {
  235. message.error('保存失败: ' + (res.err || res.data.msg));
  236. }
  237. }catch(e) {
  238. console.error(e);
  239. message.error('保存失败: ' + e);
  240. }
  241. },
  242. *remoteDelete(action, { select, call, put }) {
  243. const dashboard = yield select(state => state.present.dashboard);
  244. const code = action.code;
  245. let list = dashboard.list;
  246. try {
  247. const res = yield call(service.fetch, {
  248. url: URLS.DASHBOARD_DELETE,
  249. body: [code]
  250. });
  251. console.log('删除看板', [code], res);
  252. if(!res.err && res.data.code > 0) {
  253. for(let i = 0; i < list.length; i++) {
  254. if(list[i].code === code) {
  255. list.splice(i, 1);
  256. break;
  257. }
  258. }
  259. yield put({ type: 'list', list: list });
  260. message.success('删除成功');
  261. }else {
  262. message.error('删除失败: ' + (res.err || res.data.msg));
  263. }
  264. }catch(e) {
  265. console.log(e);
  266. message.error('删除失败: ' + e);
  267. }
  268. },
  269. *share(action, { put, call, select }) {
  270. const { code, targets } = action;
  271. const body = {
  272. stId: code+'',
  273. type: 'dashboard',
  274. obj: targets.map(t => ({
  275. obId: t.code,
  276. objectType: t.isGroup ? '0' : '1'
  277. }))
  278. };
  279. try {
  280. const res = yield call(service.fetch, {
  281. url: URLS.DASHBOARD_SHARE,
  282. body
  283. });
  284. console.log('看板分发', body, res);
  285. if(!res.err && res.data.code > 0) {
  286. message.success('设置分发对象成功');
  287. }else {
  288. message.error('设置分发对象失败: ' + (res.err || res.data.msg));
  289. }
  290. }catch(e) {
  291. console.log(body, e);
  292. message.error('分发失败: ' + e);
  293. }
  294. },
  295. *shareList(action, { put, call, select }) {
  296. const { code } = action;
  297. const body = code;
  298. const res = yield call(service.fetch, {
  299. url: URLS.DASHBOARD_SHARE_LIST,
  300. body
  301. });
  302. console.log('请求看板分发列表', body, res);
  303. return res;
  304. },
  305. *transfer(action, { put, call, select }) {
  306. const { userCode, dashboardCode } = action;
  307. const body = {
  308. userId: userCode,
  309. id: dashboardCode
  310. };
  311. try {
  312. const res = yield call(service.fetch, {
  313. url: URLS.DASHBOARD_TRANSFER,
  314. body
  315. });
  316. console.log('看板移交', body, res);
  317. if(!res.err && res.data.code > 0) {
  318. const dashboard = yield select(state => state.present.dashboard);
  319. const list = dashboard.list;
  320. for(let i = 0; i < list.length; i++) {
  321. if(list[i].code === dashboardCode) {
  322. list.splice(i, 1);
  323. break;
  324. }
  325. }
  326. yield put({ type: 'list', list });
  327. message.success('移交成功');
  328. }else {
  329. console.log(body, (res.err || res.data.msg));
  330. message.error('移交失败: ' + (res.err || res.data.msg));
  331. }
  332. }catch(e) {
  333. console.log(body, e);
  334. message.error('移交失败: ' + e);
  335. }
  336. },
  337. *remoteShareDetail(action, { select, call, put }) {
  338. const code = action.code;
  339. if(!code){
  340. return
  341. }
  342. try {
  343. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
  344. const res = yield call(service.fetch, {
  345. url: URLS.DASHBOARD_SHARE_DETAIL_BY_CODE,
  346. method: 'GET',
  347. allow: true,
  348. body: {
  349. code: code
  350. }
  351. });
  352. if(!res.err && res.data.code > 0) {
  353. const resData = res.data.data;
  354. let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
  355. let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
  356. let chartCodes = resData.chartCodes ? resData.chartCodes.split(',') : [];
  357. const main = yield select(state => state.present.main);
  358. const { currentUser } = main;
  359. const allDataSources = items.map(item => {
  360. if(item.viewType === 'chart') {
  361. return {
  362. code: item.dataSourceCode,
  363. name: item.dataSourceName
  364. }
  365. }else {
  366. return null
  367. }
  368. }).filter(item => !!item);
  369. const dataSources = [];
  370. allDataSources.forEach(ad => {
  371. if(!dataSources.find(d => d.code === ad.code)) {
  372. dataSources.push(ad);
  373. }
  374. });
  375. let data = {
  376. code: resData.id+'',
  377. name: resData.bdName,
  378. items: items,
  379. description: resData.bdNote || '',
  380. creatorCode: resData.createId + '',
  381. creatorName: resData.createBy,
  382. createTime: resData.createDate,
  383. dataSources: dataSources,
  384. relationColumns: relationColumns,
  385. editMode: currentUser.code === resData.createId + '',
  386. filters: JSON.parse((resData.filters|| "[]")),
  387. shareCode: resData.bdCode,
  388. chartCodes: chartCodes,
  389. demo: resData.demo
  390. }
  391. let fields = [];
  392. for(let key in data) {
  393. fields.push({
  394. name: key,
  395. value: data[key]
  396. })
  397. }
  398. yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
  399. }else {
  400. message.error('解析看板错误: ' + (res.err || res.data.msg));
  401. }
  402. }catch(e) {
  403. message.error('解析看板错误: ' + e);
  404. }finally {
  405. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
  406. }
  407. },
  408. *getShareKey (action, { select, call, put }) {
  409. const record = action.record;
  410. const delay = action.delay;
  411. if(!record){
  412. return
  413. }
  414. try {
  415. const res = yield call(service.fetch, {
  416. url: URLS.DASHBOARD_GET_SHAREKEY,
  417. method: 'POST',
  418. body: {
  419. id: record.code,
  420. delay: delay
  421. }
  422. });
  423. if(!res.err && res.data.code > 0) {
  424. const resData = res.data.data;
  425. return resData;
  426. }else {
  427. message.error('生成分享链接失败: ' + (res.err || res.data.msg));
  428. }
  429. }catch(e) {
  430. message.error('生成分享链接失败: ' + e);
  431. }
  432. },
  433. *remoteShareKeyDetail(action, { select, call, put }) {
  434. const code = action.code;
  435. if(!code){
  436. return
  437. }
  438. try {
  439. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
  440. const res = yield call(service.fetch, {
  441. url: URLS.DASHBOARD_SHARE_DETAIL_BY_KEY,
  442. method: 'GET',
  443. allow: true,
  444. body: {
  445. data: code
  446. }
  447. });
  448. if(!res.err && res.data.code > 0) {
  449. const resData = res.data.data;
  450. let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
  451. let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
  452. let chartCodes = resData.chartCodes ? resData.chartCodes.split(',') : [];
  453. const main = yield select(state => state.present.main);
  454. const { currentUser } = main;
  455. const allDataSources = items.map(item => {
  456. if(item.viewType === 'chart') {
  457. return {
  458. code: item.dataSourceCode,
  459. name: item.dataSourceName
  460. }
  461. }else {
  462. return null
  463. }
  464. }).filter(item => !!item);
  465. const dataSources = [];
  466. allDataSources.forEach(ad => {
  467. if(!dataSources.find(d => d.code === ad.code)) {
  468. dataSources.push(ad);
  469. }
  470. });
  471. let data = {
  472. code: resData.id+'',
  473. name: resData.bdName,
  474. items: items,
  475. description: resData.bdNote || '',
  476. creatorCode: resData.createId + '',
  477. creatorName: resData.createBy,
  478. createTime: resData.createDate,
  479. dataSources: dataSources,
  480. relationColumns: relationColumns,
  481. editMode: currentUser.code === resData.createId + '',
  482. filters: JSON.parse((resData.filters|| "[]")),
  483. shareCode: resData.bdCode,
  484. chartCodes: chartCodes,
  485. demo: resData.demo
  486. }
  487. let fields = [];
  488. for(let key in data) {
  489. fields.push({
  490. name: key,
  491. value: data[key]
  492. })
  493. }
  494. yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
  495. }else {
  496. message.error('解析看板错误: ' + (res.err || res.data.msg));
  497. }
  498. }catch(e) {
  499. message.error('解析看板错误: ' + e);
  500. }finally {
  501. yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
  502. }
  503. },
  504. },
  505. subscriptions: {
  506. setup({ dispatch, history}) {
  507. dispatch({ type: 'reset' });
  508. }
  509. }
  510. }