|
|
@@ -2,6 +2,10 @@ import { message } from 'antd'
|
|
|
import * as service from '../services/index'
|
|
|
import URLS from '../constants/url'
|
|
|
|
|
|
+const generateShareCode = () => {
|
|
|
+ return Math.random().toString(36).substr(2).toUpperCase();
|
|
|
+}
|
|
|
+
|
|
|
export default {
|
|
|
namespace: 'dashboard',
|
|
|
state: {
|
|
|
@@ -48,22 +52,47 @@ export default {
|
|
|
}
|
|
|
const res = yield call(service.fetch, {
|
|
|
url: URLS.DASHBOARD_LIST,
|
|
|
+ method: 'GET',
|
|
|
body
|
|
|
});
|
|
|
- console.log('请求看板列表', body, res);
|
|
|
if(!res.err && res.data.code > 0) {
|
|
|
const resData = res.data.data.list;
|
|
|
let list = resData.map(d => {
|
|
|
let items = d.bdConfiguration ? JSON.parse(d.bdConfiguration) : [];
|
|
|
+
|
|
|
+ const dataSources = [];
|
|
|
+ const dataConnects = [];
|
|
|
+ items.forEach(item => {
|
|
|
+ if(item.viewType === 'chart') {
|
|
|
+ if(!dataSources.find(ad => ad.code === item.dataSourceCode)) {
|
|
|
+ dataSources.push({
|
|
|
+ code: item.dataSourceCode,
|
|
|
+ name: item.dataSourceName
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if(!dataConnects.find(ad => ad.code === item.dataSourceCode)) {
|
|
|
+ dataConnects.push({
|
|
|
+ code: item.dataConnectCode,
|
|
|
+ name: item.dataConnectName
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
return {
|
|
|
+ key: d.id + '',
|
|
|
code: d.id+'',
|
|
|
name: d.bdName,
|
|
|
items: items,
|
|
|
description: d.bdNote || '',
|
|
|
- thumbnail: d.thumbnail,
|
|
|
creatorCode: d.createId + '',
|
|
|
creatorName: d.createBy,
|
|
|
createTime: d.createDate,
|
|
|
+ shareCode: d.bdCode,
|
|
|
+ dataSources: dataSources,
|
|
|
+ dataConnects: dataConnects,
|
|
|
+ chartCodes: d.chartIds ? d.chartIds.split(',') : [],
|
|
|
+ demo: d.demo
|
|
|
}
|
|
|
})
|
|
|
yield put({ type: 'list', list: list });
|
|
|
@@ -84,13 +113,16 @@ export default {
|
|
|
yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
|
|
|
const res = yield call(service.fetch, {
|
|
|
url: URLS.DASHBOARD_DETAIL,
|
|
|
- body: code
|
|
|
+ method: 'GET',
|
|
|
+ body: {
|
|
|
+ id: code
|
|
|
+ }
|
|
|
});
|
|
|
- console.log('解析看板数据', code, res);
|
|
|
if(!res.err && res.data.code > 0) {
|
|
|
const resData = res.data.data;
|
|
|
let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
|
|
|
let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
|
|
|
+ let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
|
|
|
const main = yield select(state => state.present.main);
|
|
|
const { currentUser } = main;
|
|
|
|
|
|
@@ -117,14 +149,16 @@ export default {
|
|
|
name: resData.bdName,
|
|
|
items: items,
|
|
|
description: resData.bdNote || '',
|
|
|
- thumbnail: resData.thumbnail,
|
|
|
creatorCode: resData.createId + '',
|
|
|
creatorName: resData.createBy,
|
|
|
createTime: resData.createDate,
|
|
|
dataSources: dataSources,
|
|
|
relationColumns: relationColumns,
|
|
|
editMode: currentUser.code === resData.createId + '',
|
|
|
- filters: JSON.parse((resData.filters|| "[]"))
|
|
|
+ filters: JSON.parse((resData.filters|| "[]")),
|
|
|
+ shareCode: resData.bdCode,
|
|
|
+ chartCodes: chartCodes,
|
|
|
+ demo: resData.demo
|
|
|
}
|
|
|
|
|
|
let fields = [];
|
|
|
@@ -139,7 +173,6 @@ export default {
|
|
|
message.error('解析看板错误: ' + (res.err || res.data.msg));
|
|
|
}
|
|
|
}catch(e) {
|
|
|
- console.log(e);
|
|
|
message.error('解析看板错误: ' + e);
|
|
|
}finally {
|
|
|
yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
|
|
|
@@ -148,21 +181,21 @@ export default {
|
|
|
*remoteAdd(action, { select, call, put }) {
|
|
|
try {
|
|
|
const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
|
|
|
- const { name, items, thumbnail, relationColumns, filters } = dashboardDesigner;
|
|
|
+ const { name, items, description, relationColumns, filters, shareCode, chartCodes } = dashboardDesigner;
|
|
|
let body = {
|
|
|
bdName: name,
|
|
|
- bdNote: '',
|
|
|
+ bdNote: description,
|
|
|
bdConfiguration: JSON.stringify(items),
|
|
|
- thumbnail: thumbnail,
|
|
|
relationColumns: JSON.stringify(relationColumns),
|
|
|
- filters: JSON.stringify(filters) || ''
|
|
|
+ filters: JSON.stringify(filters) || '',
|
|
|
+ bdCode: shareCode || generateShareCode(),
|
|
|
+ thumbnail: '',
|
|
|
+ chartIds: chartCodes.join(',')
|
|
|
}
|
|
|
- console.log('新增看板', body);
|
|
|
const res = yield call(service.fetch, {
|
|
|
url: URLS.DASHBOARD_ADD,
|
|
|
body: body
|
|
|
});
|
|
|
- console.log('新增看板', body, res);
|
|
|
if(!res.err && res.data.code > 0) {
|
|
|
yield put({ type: 'fetchList', mandatory: true });
|
|
|
message.success('保存成功');
|
|
|
@@ -170,28 +203,27 @@ export default {
|
|
|
message.error('保存失败: ' + (res.err || res.data.msg));
|
|
|
}
|
|
|
}catch(e) {
|
|
|
- console.log(e);
|
|
|
message.error('保存失败: ' + e);
|
|
|
}
|
|
|
},
|
|
|
*remoteQucikAdd(action, { select, call, put }) {
|
|
|
try {
|
|
|
const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
|
|
|
- const { name, items, thumbnail, description, relationColumns, filters } = dashboardDesigner;
|
|
|
+ const { name, items, description, relationColumns, filters } = dashboardDesigner;
|
|
|
let body = {
|
|
|
bdName: name,
|
|
|
bdNote: description,
|
|
|
bdConfiguration: JSON.stringify(items),
|
|
|
- thumbnail: thumbnail,
|
|
|
relationColumns: JSON.stringify(relationColumns),
|
|
|
- filters: JSON.stringify(filters) || ""
|
|
|
+ filters: JSON.stringify(filters) || "",
|
|
|
+ bdCode: generateShareCode(),
|
|
|
+ thumbnail: '',
|
|
|
+ chartIds: ''
|
|
|
}
|
|
|
- console.log('快速新增看板', body);
|
|
|
const res = yield call(service.fetch, {
|
|
|
url: URLS.DASHBOARD_ADD,
|
|
|
body: body
|
|
|
});
|
|
|
- console.log('快速新增看板', body, res);
|
|
|
if(!res.err && res.data.code > 0) {
|
|
|
yield put({ type: 'fetchList', mandatory: true });
|
|
|
yield put({ type: 'main/redirect', path: '/dashboard/' + res.data.data });
|
|
|
@@ -199,28 +231,27 @@ export default {
|
|
|
message.error('保存失败: ' + (res.err || res.data.msg));
|
|
|
}
|
|
|
}catch(e) {
|
|
|
- console.log(e);
|
|
|
message.error('保存失败: ' + e);
|
|
|
}
|
|
|
},
|
|
|
*remoteModify(action, { select, call, put }) {
|
|
|
try {
|
|
|
const dashboardDesigner = yield select(state => state.present.dashboardDesigner);
|
|
|
- const { code, name, items, thumbnail, description, relationColumns, filters } = dashboardDesigner;
|
|
|
+ const { code, name, items, description, relationColumns, filters, chartCodes, shareCode } = dashboardDesigner;
|
|
|
let body = {
|
|
|
id: code,
|
|
|
bdName: name,
|
|
|
bdNote: description,
|
|
|
bdConfiguration: JSON.stringify(items.map(item => ({ ...item, chartOption: null }))),
|
|
|
- thumbnail: thumbnail,
|
|
|
relationColumns: JSON.stringify(relationColumns),
|
|
|
- filters: JSON.stringify(filters) || ""
|
|
|
+ filters: JSON.stringify(filters) || "",
|
|
|
+ chartIds: chartCodes.join(','),
|
|
|
+ bdCode: shareCode
|
|
|
}
|
|
|
const res = yield call(service.fetch, {
|
|
|
url: URLS.DASHBOARD_UPDATE,
|
|
|
body: body
|
|
|
});
|
|
|
- console.log('修改看板', body, res);
|
|
|
if(!res.err && res.data.code > 0) {
|
|
|
yield put({ type: 'fetchList', mandatory: true });
|
|
|
yield put({ type: 'dashboardDesigner/silentSetField', name: 'dirty', value: false });
|
|
|
@@ -229,7 +260,6 @@ export default {
|
|
|
message.error('保存失败: ' + (res.err || res.data.msg));
|
|
|
}
|
|
|
}catch(e) {
|
|
|
- console.error(e);
|
|
|
message.error('保存失败: ' + e);
|
|
|
}
|
|
|
},
|
|
|
@@ -328,6 +358,200 @@ export default {
|
|
|
message.error('移交失败: ' + e);
|
|
|
}
|
|
|
},
|
|
|
+ *remoteShareDetail(action, { select, call, put }) {
|
|
|
+ const code = action.code;
|
|
|
+ if(!code){
|
|
|
+ return
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
|
|
|
+ const res = yield call(service.fetch, {
|
|
|
+ url: URLS.DASHBOARD_SHARE_DETAIL_BY_CODE,
|
|
|
+ method: 'GET',
|
|
|
+ allow: true,
|
|
|
+ body: {
|
|
|
+ code: code
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if(!res.err && res.data.code > 0) {
|
|
|
+ const resData = res.data.data;
|
|
|
+ let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
|
|
|
+ let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
|
|
|
+ let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
|
|
|
+ const main = yield select(state => state.present.main);
|
|
|
+ const { currentUser } = main;
|
|
|
+
|
|
|
+ const allDataSources = items.map(item => {
|
|
|
+ if(item.viewType === 'chart') {
|
|
|
+ return {
|
|
|
+ code: item.dataSourceCode,
|
|
|
+ name: item.dataSourceName
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return null
|
|
|
+ }
|
|
|
+ }).filter(item => !!item);
|
|
|
+
|
|
|
+ const dataSources = [];
|
|
|
+ allDataSources.forEach(ad => {
|
|
|
+ if(!dataSources.find(d => d.code === ad.code)) {
|
|
|
+ dataSources.push(ad);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ let data = {
|
|
|
+ code: resData.id+'',
|
|
|
+ name: resData.bdName,
|
|
|
+ items: items,
|
|
|
+ description: resData.bdNote || '',
|
|
|
+ creatorCode: resData.createId + '',
|
|
|
+ creatorName: resData.createBy,
|
|
|
+ createTime: resData.createDate,
|
|
|
+ dataSources: dataSources,
|
|
|
+ relationColumns: relationColumns,
|
|
|
+ editMode: currentUser.code === resData.createId + '',
|
|
|
+ filters: JSON.parse((resData.filters|| "[]")),
|
|
|
+ shareCode: resData.bdCode,
|
|
|
+ chartCodes: chartCodes,
|
|
|
+ demo: resData.demo
|
|
|
+ }
|
|
|
+
|
|
|
+ let fields = [];
|
|
|
+ for(let key in data) {
|
|
|
+ fields.push({
|
|
|
+ name: key,
|
|
|
+ value: data[key]
|
|
|
+ })
|
|
|
+ }
|
|
|
+ yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
|
|
|
+ }else {
|
|
|
+ message.error('解析看板错误: ' + (res.err || res.data.msg));
|
|
|
+ }
|
|
|
+ }catch(e) {
|
|
|
+ message.error('解析看板错误: ' + e);
|
|
|
+ }finally {
|
|
|
+ yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ *getShareKey (action, { select, call, put }) {
|
|
|
+ const record = action.record;
|
|
|
+ const delay = action.delay;
|
|
|
+ if(!record){
|
|
|
+ return
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const res = yield call(service.fetch, {
|
|
|
+ url: URLS.DASHBOARD_GET_SHAREKEY,
|
|
|
+ method: 'POST',
|
|
|
+ body: {
|
|
|
+ id: record.code,
|
|
|
+ delay: delay
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if(!res.err && res.data.code > 0) {
|
|
|
+ const resData = res.data.data;
|
|
|
+ return resData;
|
|
|
+ }else {
|
|
|
+ message.error('生成分享链接失败: ' + (res.err || res.data.msg));
|
|
|
+ }
|
|
|
+ }catch(e) {
|
|
|
+ message.error('生成分享链接失败: ' + e);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ *remoteShareKeyDetail(action, { select, call, put }) {
|
|
|
+ const code = action.code;
|
|
|
+ if(!code){
|
|
|
+ return
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: true });
|
|
|
+ const res = yield call(service.fetch, {
|
|
|
+ url: URLS.DASHBOARD_SHARE_DETAIL_BY_KEY,
|
|
|
+ method: 'GET',
|
|
|
+ allow: true,
|
|
|
+ body: {
|
|
|
+ data: code
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if(!res.err && res.data.code > 0) {
|
|
|
+ const resData = res.data.data;
|
|
|
+ let items = resData.bdConfiguration ? JSON.parse(resData.bdConfiguration) : [];
|
|
|
+ let relationColumns = resData.relationColumns ? JSON.parse(resData.relationColumns) : [];
|
|
|
+ let chartCodes = resData.chartIds ? resData.chartIds.split(',') : [];
|
|
|
+ const main = yield select(state => state.present.main);
|
|
|
+ const { currentUser } = main;
|
|
|
+
|
|
|
+ const allDataSources = items.map(item => {
|
|
|
+ if(item.viewType === 'chart') {
|
|
|
+ return {
|
|
|
+ code: item.dataSourceCode,
|
|
|
+ name: item.dataSourceName
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return null
|
|
|
+ }
|
|
|
+ }).filter(item => !!item);
|
|
|
+
|
|
|
+ const dataSources = [];
|
|
|
+ allDataSources.forEach(ad => {
|
|
|
+ if(!dataSources.find(d => d.code === ad.code)) {
|
|
|
+ dataSources.push(ad);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ let data = {
|
|
|
+ code: resData.id+'',
|
|
|
+ name: resData.bdName,
|
|
|
+ items: items,
|
|
|
+ description: resData.bdNote || '',
|
|
|
+ creatorCode: resData.createId + '',
|
|
|
+ creatorName: resData.createBy,
|
|
|
+ createTime: resData.createDate,
|
|
|
+ dataSources: dataSources,
|
|
|
+ relationColumns: relationColumns,
|
|
|
+ editMode: currentUser.code === resData.createId + '',
|
|
|
+ filters: JSON.parse((resData.filters|| "[]")),
|
|
|
+ shareCode: resData.bdCode,
|
|
|
+ chartCodes: chartCodes,
|
|
|
+ demo: resData.demo
|
|
|
+ }
|
|
|
+
|
|
|
+ let fields = [];
|
|
|
+ for(let key in data) {
|
|
|
+ fields.push({
|
|
|
+ name: key,
|
|
|
+ value: data[key]
|
|
|
+ })
|
|
|
+ }
|
|
|
+ yield put({ type: 'dashboardDesigner/silentSetFields', fields: fields });
|
|
|
+ }else {
|
|
|
+ message.error('解析看板错误: ' + (res.err || res.data.msg));
|
|
|
+ }
|
|
|
+ }catch(e) {
|
|
|
+ message.error('解析看板错误: ' + e);
|
|
|
+ }finally {
|
|
|
+ yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ *copy(action, { select, call, put }) {
|
|
|
+ const { dashboardCode, dataConnectCode } = action;
|
|
|
+
|
|
|
+ const res = yield call(service.fetch, {
|
|
|
+ url: URLS.DASHBOARD_COPY,
|
|
|
+ body: {
|
|
|
+ dashboardId: dashboardCode,
|
|
|
+ dataSourceId: dataConnectCode
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if(!res.err && res.data.code > 0) {
|
|
|
+ message.success('复制成功');
|
|
|
+ yield put({ type: 'fetchList', mandatory: true });
|
|
|
+ return true;
|
|
|
+ }else {
|
|
|
+ message.error('复制失败: ' + (res.err || res.data.msg));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
subscriptions: {
|
|
|
setup({ dispatch, history}) {
|