import { message } from 'antd' import * as service from '../services/index' import URLS from '../constants/url' export default { namespace: 'dashboard', state: { originData: { list: [], newOne: { defaultSelectedGroups: [], defaultSelectedUsers: [] }, filterLabel: '', groupList: [], currentGroup: [{ code: 'all', label: '全部分组' }], groupDirty: false, } }, reducers: { list(state, action) { let list = action.list; return Object.assign({}, state, {list}); }, setFilterLabel(state, action) { let { label } = action; return Object.assign({}, state, {filterLabel: label}); }, reset(state, action) { let newState = Object.assign({}, state, state.originData); return Object.assign({}, newState); }, }, effects: { *fetchList(action, {select, call, put}) { const { pageNum, pageSize } = action; const body = { pageNum: pageNum || 1, pageSize: pageSize || 999 } try { const dashboard = yield select(state => state.present.dashboard); if(!action.mandatory && dashboard.list.length > 0) { return; } 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) : []; return { code: d.id+'', name: d.bdName, items: items, description: d.bdNote || '', creatorCode: d.createId + '', creatorName: d.createBy, createTime: d.createDate, shareCode: d.bdCode, demo: d.demo } }) yield put({ type: 'list', list: list }); }else { message.error('请求看板列表失败: ' + (res.err || res.data.msg)); } }catch(e) { console.log(body, e); message.error('请求看板列表失败: ' + e) } }, *remoteDetail(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_DETAIL, 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; 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) { console.log(e); message.error('解析看板错误: ' + e); }finally { yield put({ type: 'dashboardDesigner/silentSetField', name: 'loading', value: false }); } }, *remoteAdd(action, { select, call, put }) { try { const dashboardDesigner = yield select(state => state.present.dashboardDesigner); const { name, items, relationColumns, filters, shareCode } = dashboardDesigner; let body = { bdName: name, bdNote: '', bdConfiguration: JSON.stringify(items), relationColumns: JSON.stringify(relationColumns), filters: JSON.stringify(filters) || '', bdCode: shareCode, chartCodes: [] } 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('保存成功'); }else { 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, description, relationColumns, filters, shareCode } = dashboardDesigner; let body = { bdName: name, bdNote: description, bdConfiguration: JSON.stringify(items), relationColumns: JSON.stringify(relationColumns), filters: JSON.stringify(filters) || "", bdCode: shareCode, chartCodes: [] } 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 }); }else { 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, description, relationColumns, filters, chartCodes, shareCode } = dashboardDesigner; let body = { id: code, bdName: name, bdNote: description, bdConfiguration: JSON.stringify(items.map(item => ({ ...item, chartOption: null }))), relationColumns: JSON.stringify(relationColumns), 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 }); message.success('保存成功'); }else { message.error('保存失败: ' + (res.err || res.data.msg)); } }catch(e) { console.error(e); message.error('保存失败: ' + e); } }, *remoteDelete(action, { select, call, put }) { const dashboard = yield select(state => state.present.dashboard); const code = action.code; let list = dashboard.list; try { const res = yield call(service.fetch, { url: URLS.DASHBOARD_DELETE, body: [code] }); console.log('删除看板', [code], res); if(!res.err && res.data.code > 0) { for(let i = 0; i < list.length; i++) { if(list[i].code === code) { list.splice(i, 1); break; } } yield put({ type: 'list', list: list }); message.success('删除成功'); }else { message.error('删除失败: ' + (res.err || res.data.msg)); } }catch(e) { console.log(e); message.error('删除失败: ' + e); } }, *share(action, { put, call, select }) { const { code, targets } = action; const body = { stId: code+'', type: 'dashboard', obj: targets.map(t => ({ obId: t.code, objectType: t.isGroup ? '0' : '1' })) }; try { const res = yield call(service.fetch, { url: URLS.DASHBOARD_SHARE, body }); console.log('看板分发', body, res); if(!res.err && res.data.code > 0) { message.success('设置分发对象成功'); }else { message.error('设置分发对象失败: ' + (res.err || res.data.msg)); } }catch(e) { console.log(body, e); message.error('分发失败: ' + e); } }, *shareList(action, { put, call, select }) { const { code } = action; const body = code; const res = yield call(service.fetch, { url: URLS.DASHBOARD_SHARE_LIST, body }); console.log('请求看板分发列表', body, res); return res; }, *transfer(action, { put, call, select }) { const { userCode, dashboardCode } = action; const body = { userId: userCode, id: dashboardCode }; try { const res = yield call(service.fetch, { url: URLS.DASHBOARD_TRANSFER, body }); console.log('看板移交', body, res); if(!res.err && res.data.code > 0) { const dashboard = yield select(state => state.present.dashboard); const list = dashboard.list; for(let i = 0; i < list.length; i++) { if(list[i].code === dashboardCode) { list.splice(i, 1); break; } } yield put({ type: 'list', list }); message.success('移交成功'); }else { console.log(body, (res.err || res.data.msg)); message.error('移交失败: ' + (res.err || res.data.msg)); } }catch(e) { console.log(body, e); 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.chartCodes ? resData.chartCodes.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.chartCodes ? resData.chartCodes.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 }); } }, }, subscriptions: { setup({ dispatch, history}) { dispatch({ type: 'reset' }); } } }