Commit 047ba395 by zhaochengxiang

smartbi

parent 20762b73
...@@ -77,6 +77,6 @@ ...@@ -77,6 +77,6 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"proxy": "http://139.198.127.28:18189", "proxy": "http://139.198.127.28:17277",
"homepage": "http://myhost/data-govern" "homepage": "http://myhost/data-govern"
} }
...@@ -219,4 +219,20 @@ export function* getResourceRelations(payload) { ...@@ -219,4 +219,20 @@ export function* getResourceRelations(payload) {
export function* updateResourceState(payload) { export function* updateResourceState(payload) {
return yield call(service.updateResourceState, payload); return yield call(service.updateResourceState, payload);
}
export function* saveSmartBIWorkbook(payload) {
return yield call(service.saveSmartBIWorkbook, payload);
}
export function* getSmartBIWorkbookUrl(payload) {
return yield call(service.getSmartBIWorkbookUrl, payload);
}
export function* listSmartBIWorkbooks(payload) {
return yield call(service.listSmartBIWorkbooks, payload);
}
export function* deleteSmartBIWorkbooks(payload) {
return yield call(service.deleteSmartBIWorkbooks, payload);
} }
\ No newline at end of file
import { PostJSON, GetJSON, PostFile, Post } from "../util/axios" import { PostJSON, GetJSON, PostFile, Post, Get } from "../util/axios"
export function importElement(payload) { export function importElement(payload) {
return PostFile("/dataassetmanager/elementApi/import", payload); return PostFile("/dataassetmanager/elementApi/import", payload);
...@@ -226,4 +226,20 @@ export function getResourceRelations(payload) { ...@@ -226,4 +226,20 @@ export function getResourceRelations(payload) {
export function updateResourceState(payload) { export function updateResourceState(payload) {
return PostJSON("/dataassetmanager/resourceApi/updateResourceState", payload); return PostJSON("/dataassetmanager/resourceApi/updateResourceState", payload);
}
export function saveSmartBIWorkbook(payload) {
return Post("/dataassetmanager/smartBIApi/saveWorkbook", payload);
}
export function getSmartBIWorkbookUrl(payload) {
return Get("/dataassetmanager/smartBIApi/getWorkbookUrl", payload);
}
export function listSmartBIWorkbooks(payload) {
return GetJSON("/dataassetmanager/smartBIApi/listWorkbooks", payload);
}
export function deleteSmartBIWorkbooks(payload) {
return Post("/dataassetmanager/smartBIApi/deleteWorkbooks", payload);
} }
\ No newline at end of file
import axios from 'axios'; import axios from 'axios';
import LocalStorage from 'local-storage';
import { IsArr, showMessage, isSzseEnv } from './index'; import { IsArr, showMessage, isSzseEnv } from './index';
const CancelToken = axios.CancelToken; const CancelToken = axios.CancelToken;
const baseURL = '/api/'; const baseURL = '/api/';
const debugEnv = 475629450;
const instance = axios.create({ const instance = axios.create({
baseURL, baseURL,
...@@ -101,8 +103,10 @@ const callback = resp => { ...@@ -101,8 +103,10 @@ const callback = resp => {
export function Get(url, params) { export function Get(url, params) {
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv')??debugEnv;
return textplain.get(url, { return textplain.get(url, {
params, cancelToken params: {...params, env}, cancelToken
}).then( }).then(
callback callback
) )
...@@ -110,8 +114,10 @@ export function Get(url, params) { ...@@ -110,8 +114,10 @@ export function Get(url, params) {
export function GetJSON(url, params) { export function GetJSON(url, params) {
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv')??debugEnv;
return instance.get(url, { return instance.get(url, {
params, cancelToken, params: {...params, env}, cancelToken,
validateStatus: false validateStatus: false
}).then( }).then(
callback callback
...@@ -120,8 +126,10 @@ export function GetJSON(url, params) { ...@@ -120,8 +126,10 @@ export function GetJSON(url, params) {
export function Delete(url, params) { export function Delete(url, params) {
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv')??debugEnv;
return instance.delete(url, { return instance.delete(url, {
params, cancelToken, params: {...params, env}, cancelToken,
}).then( }).then(
callback callback
) )
...@@ -130,13 +138,14 @@ export function Delete(url, params) { ...@@ -130,13 +138,14 @@ export function Delete(url, params) {
export function PostJSON(url, payload) { export function PostJSON(url, payload) {
const { params = null, data = null } = payload||{}; const { params = null, data = null } = payload||{};
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv')??debugEnv;
return IsArr(data) ? instance.post(url, data, { return IsArr(data) ? instance.post(url, data, {
params, cancelToken params: {...params, env}, cancelToken
}).then( }).then(
callback callback
) : instance.post(url, null, { ) : instance.post(url, null, {
params, data, cancelToken params: {...params, env}, data, cancelToken
}).then( }).then(
callback callback
) )
...@@ -145,21 +154,25 @@ export function PostJSON(url, payload) { ...@@ -145,21 +154,25 @@ export function PostJSON(url, payload) {
export function Post(url, payload) { export function Post(url, payload) {
const { params = null, data = null } = payload||{}; const { params = null, data = null } = payload||{};
const cancelToken = __source ? __source.token : null; const cancelToken = __source ? __source.token : null;
const env = LocalStorage.get('assetsEnv')??debugEnv;
return textplain.post(url, null, { return textplain.post(url, null, {
params, data, cancelToken params: {...params, env}, data, cancelToken
}).then( }).then(
callback callback
) )
} }
export function PostFile(url, payload) { export function PostFile(url, payload, fileName='file') {
const { fileList = null, params = null } = payload||{}; const { fileList = null, params = null } = payload||{};
const env = LocalStorage.get('assetsEnv')??debugEnv;
let formData = new FormData(); let formData = new FormData();
(fileList||[]).forEach(file=> { (fileList||[]).forEach(file=> {
formData.append('file', file); formData.append(fileName, file);
}); });
return fileplain.post(url, formData, { params } ).then( return fileplain.post(url, formData, { params: {...params, env} } ).then(
callback callback
) )
} }
\ No newline at end of file
...@@ -16,6 +16,8 @@ import { showMessage, showNotifaction, getQueryParam, inputWidth, isSzseEnv } fr ...@@ -16,6 +16,8 @@ import { showMessage, showNotifaction, getQueryParam, inputWidth, isSzseEnv } fr
import { AnchorId, AnchorDirId, AnchorTimestamp, AssetBrowseReference, AssetManageReference, AssetRecycleReference, ResourceBrowseReference } from '../../../../util/constant'; import { AnchorId, AnchorDirId, AnchorTimestamp, AssetBrowseReference, AssetManageReference, AssetRecycleReference, ResourceBrowseReference } from '../../../../util/constant';
import { FullScreenSvg, CancelFullScreenSvg } from './AssetSvg'; import { FullScreenSvg, CancelFullScreenSvg } from './AssetSvg';
import AssetDeleteModal from './AssetDeleteModal'; import AssetDeleteModal from './AssetDeleteModal';
import WorksheetModal from "./WorksheetModal";
import WorkbookDrawer from "./WorkbookDrawer";
import "./AssetTable.less"; import "./AssetTable.less";
import 'react-contexify/dist/ReactContexify.css'; import 'react-contexify/dist/ReactContexify.css';
...@@ -132,6 +134,7 @@ const AssetTable = (props) => { ...@@ -132,6 +134,7 @@ const AssetTable = (props) => {
const [ contextMenuItem, setContextMenuItem ] = useState({}); const [ contextMenuItem, setContextMenuItem ] = useState({});
const [ checkedKeys, setCheckedKeys ] = useState([]); const [ checkedKeys, setCheckedKeys ] = useState([]);
const [ checkedItems, setCheckedItems ] = useState([]);
const [ importAssetVisible, setImportAssetVisible ] = useState(false); const [ importAssetVisible, setImportAssetVisible ] = useState(false);
const [ filterElementVisible, setFilterElementVisible ] = useState(false); const [ filterElementVisible, setFilterElementVisible ] = useState(false);
const [ assetEditVisible, setAssetEditVisible ] = useState(false); const [ assetEditVisible, setAssetEditVisible ] = useState(false);
...@@ -148,6 +151,8 @@ const AssetTable = (props) => { ...@@ -148,6 +151,8 @@ const AssetTable = (props) => {
const [ TableWidth, setTableWidth ] = useState(0); const [ TableWidth, setTableWidth ] = useState(0);
const [ compact, setCompact ] = useState(false); const [ compact, setCompact ] = useState(false);
const [ assetDeleteModalVisible, setAssetDeleteModalVisible ] = useState(false); const [ assetDeleteModalVisible, setAssetDeleteModalVisible ] = useState(false);
const [ worksheetModalVisible, setWorksheetModalVisible ] = useState(false);
const [ workbookDrawerVisible, setWorkbookDrawerVisible ] = useState(false);
const [ modal, contextHolder ] = Modal.useModal(); const [ modal, contextHolder ] = Modal.useModal();
const anchorId = getQueryParam(AnchorId, props?.location?.search); const anchorId = getQueryParam(AnchorId, props?.location?.search);
...@@ -691,6 +696,8 @@ const AssetTable = (props) => { ...@@ -691,6 +696,8 @@ const AssetTable = (props) => {
const onSelectChange = keys => { const onSelectChange = keys => {
setCheckedKeys(keys); setCheckedKeys(keys);
const newCheckedItems = assets?.filter(item => keys.indexOf(item.id)!==-1);
setCheckedItems(newCheckedItems);
}; };
const onFullScreenClick = () => { const onFullScreenClick = () => {
...@@ -698,6 +705,28 @@ const AssetTable = (props) => { ...@@ -698,6 +705,28 @@ const AssetTable = (props) => {
onFullScreenChange && onFullScreenChange(!fullScreen); onFullScreenChange && onFullScreenChange(!fullScreen);
} }
const onSmartBIAnalyseClick = () => {
if ((checkedKeys||[]).length === 0) {
showMessage('warn', '请先选择一个资产');
} else if ((checkedKeys||[]).length > 1) {
showMessage('warn', '只能选择一个资产');
} else {
setWorksheetModalVisible(true);
}
}
const onSmartBIWorkbookClick = () => {
setWorkbookDrawerVisible(true);
}
const onWorksheetModalCancel = () => {
setWorksheetModalVisible(false);
}
const onWorkbookDrawerCancel = () => {
setWorkbookDrawerVisible(false);
}
const handleResize = index => (e, { size }) => { const handleResize = index => (e, { size }) => {
const nextColumns = [...realColumns]; const nextColumns = [...realColumns];
nextColumns[index] = { nextColumns[index] = {
...@@ -804,6 +833,22 @@ const AssetTable = (props) => { ...@@ -804,6 +833,22 @@ const AssetTable = (props) => {
可见列设置 可见列设置
</div> </div>
</Menu.Item> </Menu.Item>
{
(reference===AssetManageReference) && <Menu.Item disabled={(checkedKeys||[]).length===0}>
<div className='text-center' onClick={onSmartBIAnalyseClick}>
smartBI自助分析
</div>
</Menu.Item>
}
{
(reference===AssetManageReference) && <Menu.Item>
<div className='text-center' onClick={onSmartBIWorkbookClick}>
smartBI工作簿
</div>
</Menu.Item>
}
</Menu> </Menu>
); );
...@@ -872,6 +917,16 @@ const AssetTable = (props) => { ...@@ -872,6 +917,16 @@ const AssetTable = (props) => {
</React.Fragment> </React.Fragment>
} }
<Button onClick={onFilterElementClick}>可见列设置</Button> <Button onClick={onFilterElementClick}>可见列设置</Button>
{
(reference===AssetManageReference) && <React.Fragment>
<Tooltip title={(checkedKeys||[]).length===0?'请先选择资产':''}>
<Button onClick={onSmartBIAnalyseClick} disabled={(checkedKeys||[]).length===0} >smartBI自助分析</Button>
</Tooltip>
<Tooltip title={(checkedKeys||[]).length===0?'请先选择资产':''}>
<Button onClick={onSmartBIWorkbookClick} disabled={(checkedKeys||[]).length===0} >smartBI工作簿</Button>
</Tooltip>
</React.Fragment>
}
</React.Fragment> </React.Fragment>
} }
{ {
...@@ -1012,6 +1067,16 @@ const AssetTable = (props) => { ...@@ -1012,6 +1067,16 @@ const AssetTable = (props) => {
onDelete={onAssetDeleteModalDelete} onDelete={onAssetDeleteModalDelete}
onDeleteAll={onAssetDeleteModalDeleteAll} onDeleteAll={onAssetDeleteModalDeleteAll}
/> />
<WorksheetModal
visible={ worksheetModalVisible }
id={ (checkedKeys||[]).length>0?checkedKeys[0]:'' }
metadata={ (checkedItems||[]).length>0?checkedItems[0].metadata:{} }
onCancel={onWorksheetModalCancel}
/>
<WorkbookDrawer
visible={workbookDrawerVisible}
onCancel={onWorkbookDrawerCancel}
/>
<RcMenu id={MENU_ID}> <RcMenu id={MENU_ID}>
{ {
(contextMenuItem.resourceState==='notRelatedAsset') && <RcItem id="uncombed" onClick={handleItemClick}> (contextMenuItem.resourceState==='notRelatedAsset') && <RcItem id="uncombed" onClick={handleItemClick}>
......
import React, { useState, useEffect } from 'react';
import { Drawer, Pagination, List } from 'antd';
import { dispatch } from '../../../../model';
const WorkbookDrawer = (props) => {
const { onCancel, visible } = props;
const [ loading, setLoading ] = useState(false);
const [ workbooks, setWorkbooks ] = useState([]);
const [ pagination, setPagination ] = useState( { pageNum: 1, pageSize: 20 } );
const { pageNum, pageSize } = pagination;
const [ total, setTotal ] = useState(0);
useEffect(() => {
if (visible) {
setPagination({ pageNum: 1, pageSize: 20 });
getWorkbooks();
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const getWorkbooks = (p = 1, s = 20) => {
setLoading(true);
dispatch({
type: 'assetmanage.listSmartBIWorkbooks',
payload: {
pageNum: p,
pageSize: s
},
callback: data => {
setLoading(false);
setTotal(data.total);
setWorkbooks(data.data||[]);
},
error: () => {
setLoading(false);
}
})
}
const onDeleteClick = (id) => {
dispatch({
type: 'assetmanage.deleteSmartBIWorkbooks',
payload: {
data: [id]
},
callback: () => {
getWorkbooks();
}
})
}
const onDevelopClick = (id) => {
dispatch({
type: 'assetmanage.getSmartBIWorkbookUrl',
payload: {
workbookId: id,
},
callback: data => {
window.open(data||'');
}
})
}
return (
<Drawer
forceRender
visible={ visible }
title='smartBI工作簿'
width={900}
placement="right"
closable={ true }
onClose={() => {
onCancel && onCancel();
}}
>
<List
itemLayout="horizontal"
size="small"
loading={loading}
dataSource={workbooks}
renderItem={item => (
<List.Item
key={item.id}
actions={[
<a key="develop" onClick={() => { onDevelopClick(item.id); }}>报表开发</a>,
// <a key="delete" onClick={() => { onDeleteClick(item.id); }}>删除</a>,
]}
>
<List.Item.Meta
title={item.name}
/>
</List.Item>
)}
/>
<Pagination
className="text-center mt-3"
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
setPagination({ pageNum: _pageNum||1, pageSize: _pageSize || 20 });
getWorkbooks(_pageNum||1, _pageSize||20);
}}
onShowSizeChange={(_pageNum, _pageSize) => {
setPagination({ pageNum: _pageNum || 1, pageSize: _pageSize || 20 });
getWorkbooks(_pageNum||1, _pageSize||20);
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={total}
pageSizeOptions={[10,20]}
showTotal={total => `共 ${total} 条`}
/>
</Drawer>
)
}
export default WorkbookDrawer;
\ No newline at end of file
import React, { useEffect, useState } from 'react';
import { Modal, Form, Button, Space, Input, Checkbox, Row, Col, Typography } from 'antd';
import { dispatch } from '../../../../model';
import { showMessage } from '../../../../util';
const WorksheetModal = (props) => {
const { onCancel, visible, id, metadata = {} } = props;
const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ form ] = Form.useForm();
useEffect(() => {
if (visible) {
form?.setFieldsValue({ tableName: metadata?.tableName, columnNames: metadata?.columnItems?.map(item => item.metadataColumnName) });
}
}, [visible])
const onOk = async() => {
try {
const row = await form?.validateFields();
let metadataTableId = '';
metadata?.columnItems?.forEach(item => {
if (!metadataTableId) {
metadataTableId = item.metadataTableId;
}
})
setConfirmLoading(true);
dispatch({
type: 'assetmanage.saveSmartBIWorkbook',
payload: {
data: {
dataAssetId:id,
metadataTableId,
...row,
}
},
callback: data => {
window.open(data);
reset();
setConfirmLoading(false);
showMessage("success","新增成功");
onCancel && onCancel(true);
},
error: () => {
setConfirmLoading(false);
}
})
} catch (errInfo) {
console.log('Validate Failed:', errInfo);
setConfirmLoading(false);
}
}
const reset = () => {
setConfirmLoading(false);
form?.resetFields();
}
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 3 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 21 },
},
};
return (
<Modal
forceRender
title='工作簿信息'
visible={ visible }
width={ 600 }
onCancel={() => {
reset();
onCancel && onCancel();
}}
footer={
<Space>
<Button onClick={() => {
reset();
onCancel && onCancel();
}}>取消</Button>
<Button type="primary" onClick={ onOk } loading={ confirmLoading }>确定</Button>
</Space>
}
>
<Form form={form} style={{ maxHeight: 600, overflow: 'auto' }} {...formItemLayout}>
<Form.Item
label="名称"
name="name"
rules={[{ required: true, message: '请填写工作簿名称!' }]}
>
<Input />
</Form.Item>
<Form.Item
label="字段"
name="columnNames"
>
<Checkbox.Group>
<Row>
{
metadata?.columnItems?.map((item, index) => <Col key={index} span={8}>
<Checkbox
value={item.metadataColumnName}
style={{
lineHeight: '32px',
}}
>
<Typography.Text style={{ width: 120 }} ellipsis>{item.metadataColumnName}</Typography.Text>
</Checkbox>
</Col>)
}
</Row>
</Checkbox.Group>
</Form.Item>
<Form.Item
label="元数据"
name="tableName"
hidden={true}
>
<Input />
</Form.Item>
</Form>
</Modal>
);
}
export default WorksheetModal;
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment