Commit 87d08137 by zhaochengxiang

报表

parent 7453443d
......@@ -452,4 +452,20 @@ export function* getBusinessColumns(payload) {
export function* saveBusinessColumns(payload) {
return yield call(service.saveBusinessColumns, payload);
}
export function* listSupportReportTypes() {
return yield call(service.listSupportReportTypes)
}
export function* listWorkbooksByType(payload) {
return yield call(service.listWorkbooksByType, payload)
}
export function* getViewUrlByWorkbookId(payload) {
return yield call(service.getViewUrlByWorkbookId, payload)
}
export function* saveWorkbookByType(payload) {
return yield call(service.saveWorkbookByType, payload)
}
\ No newline at end of file
......@@ -459,4 +459,20 @@ export function getBusinessColumns(payload) {
export function saveBusinessColumns(payload) {
return PostJSON("/dataassetmanagertest/dataAssetColumnApi/saveBusinessColumnsByDataAssetId", payload)
}
export function listSupportReportTypes() {
return GetJSON("/dataassetmanagertest/reportApi/listSupportReportTypes")
}
export function listWorkbooksByType(payload) {
return GetJSON("/dataassetmanagertest/reportApi/listWorkbooks", payload)
}
export function getViewUrlByWorkbookId(payload) {
return Get("/dataassetmanagertest/reportApi/getViewUrlByWorkbookId", payload)
}
export function saveWorkbookByType(payload) {
return Post("/dataassetmanagertest/reportApi/saveWorkbook", payload)
}
\ No newline at end of file
......@@ -21,6 +21,8 @@ import AssetDeleteModal from './AssetDeleteModal';
import { AppContext, appId } from "../../../../App";
import StartFlowModal from "./StartFlow";
import Table from '../../ResizeableTable';
import WorksheetModal from "./WorksheetModal";
import WorkbookDrawer from "./WorkbookDrawer";
import "./AssetTable.less";
import 'react-contexify/dist/ReactContexify.css';
......@@ -138,8 +140,12 @@ const AssetTable = (props) => {
const [loadingElements, setLoadingElements] = useState(false)
const [elements, setElements] = useState()
const [currentElementId, setCurrentElementId] = useState()
const [isAdmin, setAdmin] = React.useState()
const [isDataKeyUser, setDataKeyUser] = React.useState()
const [isAdmin, setAdmin] = useState()
const [isDataKeyUser, setDataKeyUser] = useState()
const [reportTypes, setReportTypes] = useState()
const [currentReport, setReport] = useState()
const [worksheetModalVisible, setWorksheetModalVisible] = useState(false)
const [workbookDrawerVisible, setWorkbookDrawerVisible] = useState(false)
const [ modal, contextHolder ] = Modal.useModal();
const anchorId = getQueryParam(AnchorId, props?.location?.search);
......@@ -197,6 +203,7 @@ const AssetTable = (props) => {
getAdmin();
judgeDataKeyUser();
getUsers();
getReportTypes();
const $list = listSubject.subscribe((val) => {
if (val.msg === 'templateChange') {
......@@ -327,6 +334,15 @@ const AssetTable = (props) => {
})
}
const getReportTypes = () => {
dispatch({
type: 'assetmanage.listSupportReportTypes',
callback: data => {
setReportTypes(data)
}
});
}
const getElements = () => {
setLoadingElements(true);
dispatch({
......@@ -930,48 +946,42 @@ const AssetTable = (props) => {
}
}
const onReportAnalyseClick = (val) => {
if ((checkedKeys||[]).length === 0) {
showMessage('warn', '请先选择一个资产');
} else if ((checkedKeys||[]).length > 1) {
showMessage('warn', '只能选择一个资产');
} else {
setReport(val);
setWorksheetModalVisible(true);
}
}
const onReportWorkbookClick = (val) => {
setReport(val);
setWorkbookDrawerVisible(true);
}
const moreMenu = (
<Menu>
{
// (reference===AssetManageReference) &&
// <Menu.Item disabled={(checkedKeys||[]).length===0}>
// <div className='text-center' onClick={onStartFlowClick}>
// 申请
// </div>
// </Menu.Item>
}
{
(reference===AssetManageReference || reference===AssetRecycleReference) && <React.Fragment>
{
reportTypes?.map(item =>
<React.Fragment key={item.code}>
<Menu.Item disabled={(checkedKeys||[]).length===0}>
<div className='text-center' onClick={onBatchCatalogChangeBtnClick}>
{(reference===AssetRecycleReference)?'挂载':'变更目录'}
<div className='text-center' onClick={() => { onReportAnalyseClick(item) }}>
{`${item.name}自助分析`}
</div>
</Menu.Item>
<Menu.Item>
<div className='text-center' onClick={() => { onReportWorkbookClick(item)}}>
{`${item.name}工作簿`}
</div>
</Menu.Item>
{
isAdmin && <Menu.Item disabled={(checkedKeys||[]).length===0}>
<div className='text-center' onClick={deleteAssets}>
删除
</div>
</Menu.Item>
}
{
isAdmin && <Menu.Item disabled={(checkedKeys||[]).length===0}>
<div className='text-center' onClick={offlineAssets}>
停用
</div>
</Menu.Item>
}
</React.Fragment>
}
<Menu.Item>
<div className='text-center' onClick={onFilterElementClick}>
可见列设置
</div>
</Menu.Item>
)
}
</Menu>
);
)
const rowSelection = {
selectedRowKeys: checkedKeys,
......@@ -1005,7 +1015,7 @@ const AssetTable = (props) => {
borderBottom: '1px solid rgb(239, 239, 239)',
}}
>
<Space size={15}>
<Space>
{
((reference===AssetManageReference||isDataKeyUser) && template && !template?.structured) && nodeId && <Button onClick={addAsset}>新增</Button>
}
......@@ -1016,58 +1026,31 @@ const AssetTable = (props) => {
(reference===AssetManageReference && nodeType!=='custom' && template && !template?.structured) && <Button onClick={importBusinessColumn}>导入字段</Button>
}
{
(reference===AssetManageReference || reference===AssetRecycleReference) &&
<Tooltip>
<Button onClick={exportAsset} >导出</Button>
</Tooltip>
(reference===AssetManageReference) && <Tooltip>
<Button onClick={exportAsset} >导出</Button>
</Tooltip>
}
{
// (reference===AssetBrowseReference||reference===ResourceBrowseReference) &&
// <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
// <Button onClick={onStartFlowClick} disabled={(checkedKeys||[]).length===0} >申请</Button>
// </Tooltip>
reference===AssetManageReference && <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={onBatchCatalogChangeBtnClick} disabled={(checkedKeys||[]).length===0} >变更目录</Button>
</Tooltip>
}
{
(compact && reference!==AssetRecycleReference) ? <Dropdown overlay={moreMenu} placement="bottomCenter">
reference===AssetManageReference && isAdmin && <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={deleteAssets} disabled={(checkedKeys||[]).length===0} >删除</Button>
</Tooltip>
}
{
reference===AssetManageReference && isAdmin && <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={offlineAssets} disabled={(checkedKeys||[]).length===0} >停用</Button>
</Tooltip>
}
<Button onClick={onFilterElementClick}>可见列设置</Button>
{
reference===AssetManageReference && (reportTypes??[]).length > 0 && <Dropdown overlay={moreMenu} placement="bottomCenter">
<Button>其他操作</Button>
</Dropdown> : <React.Fragment>
{
// (reference===AssetManageReference) &&
// <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
// <Button onClick={onStartFlowClick} disabled={(checkedKeys||[]).length===0} >申请</Button>
// </Tooltip>
}
{
(reference===AssetManageReference || reference===AssetRecycleReference) && <React.Fragment>
<Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={onBatchCatalogChangeBtnClick} disabled={(checkedKeys||[]).length===0} >{(reference===AssetRecycleReference)?'挂载':'变更目录'}</Button>
</Tooltip>
{
(reference===AssetRecycleReference) && <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={recoveryAssets} disabled={(checkedKeys||[]).length===0} >恢复</Button>
</Tooltip>
}
{
isAdmin && <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={deleteAssets} disabled={(checkedKeys||[]).length===0} >删除</Button>
</Tooltip>
}
{
isAdmin && <Tooltip title={(checkedKeys||[]).length===0?'请先选择资产目录':''}>
<Button onClick={offlineAssets} disabled={(checkedKeys||[]).length===0} >停用</Button>
</Tooltip>
}
</React.Fragment>
}
<Button onClick={onFilterElementClick}>可见列设置</Button>
</React.Fragment>
</Dropdown>
}
{/* {
(reference!==AssetRecycleReference && isSzseEnv) && <Checkbox onChange={onRecursiveChange} checked={!recursive}>仅显示当前目录</Checkbox>
} */}
</Space>
<Space>
{/* {
......@@ -1239,6 +1222,23 @@ const AssetTable = (props) => {
ids={checkedKeys||[]}
onCancel={onStartFlowModalCancel}
/>
<WorksheetModal
report={currentReport}
visible={worksheetModalVisible}
id={(checkedKeys||[]).length>0?checkedKeys[0]:''}
onCancel={() => {
setWorksheetModalVisible(false);
}}
/>
<WorkbookDrawer
report={currentReport}
visible={workbookDrawerVisible}
onCancel={() => {
setWorkbookDrawerVisible(false);
}}
/>
<RcMenu id={MENU_ID}>
{/* {
(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, report } = 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.listWorkbooksByType' ,
payload: {
pageNum: p,
pageSize: s,
type: report?.code,
},
callback: data => {
setLoading(false);
setTotal(data.total);
setWorkbooks(data.data||[]);
},
error: () => {
setLoading(false);
}
})
}
// const onDeleteClick = (id) => {
// dispatch({
// type: 'assetmanage.deleteWorkbooks',
// payload: {
// data: [id]
// },
// callback: () => {
// getWorkbooks();
// }
// })
// }
const onDevelopClick = (id) => {
dispatch({
type: 'assetmanage.getViewUrlByWorkbookId',
payload: {
workbookId: id,
},
callback: data => {
window.open(data||'');
}
})
}
return (
<Drawer
forceRender
visible={ visible }
title={`${report?.name}工作簿`}
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>]}
>
<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, report } = props;
const [loading, setLoading] = useState(false);
const [asset, setAsset] = useState();
const [ form ] = Form.useForm();
useEffect(() => {
if (visible && id) {
getAsset()
}
}, [visible, id])
const getAsset = () => {
setLoading(true)
dispatch({
type: 'assetmanage.getDataAssetDetail',
payload: {
dataAssetId: id,
},
callback: data => {
setLoading(false)
setAsset(data)
form?.setFieldsValue(data)
},
error: () => {
setLoading(false)
}
})
}
const onOk = async() => {
try {
const row = await form?.validateFields();
setLoading(true);
dispatch({
type: 'assetmanage.saveWorkbookByType',
payload: {
data: {
dataAssetId:id,
metadataTableId: asset?.metadataId,
type: report?.code,
...row,
}
},
callback: data => {
setLoading(false);
window.open(data);
reset();
showMessage("success","新增成功");
onCancel && onCancel(true);
},
error: () => {
setLoading(false);
}
})
} catch (errInfo) {
console.log('Validate Failed:', errInfo);
}
}
const reset = () => {
setLoading(false);
form?.resetFields();
}
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 3 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 21 },
},
};
return (
<Modal
forceRender
title={`${report?.name}工作簿信息`}
visible={ visible }
width={ 600 }
onCancel={() => {
reset();
onCancel && onCancel();
}}
footer={
<Space>
<Button onClick={() => {
reset();
onCancel && onCancel();
}}>取消</Button>
<Button type="primary" onClick={onOk}>确定</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="columns"
>
<ColumnsItem data={asset?.columns} />
</Form.Item>
<Form.Item
label="元数据"
name="tableName"
hidden={true}
>
<Input />
</Form.Item>
</Form>
</Modal>
);
}
export default WorksheetModal;
const ColumnsItem = ({ value, onChange, data }) => {
return (
<Checkbox.Group
onChange={(checkedValue) => {
if ((checkedValue??[]).length === 0) {
onChange([])
} else {
onChange((data??[]).filter(item => checkedValue.includes(item.metadataColumnId)))
}
}}
value={(value??[]).map(item => item.metadataColumnId)}
>
<Row>
{
data?.map((item, index) => <Col key={index} span={8}>
<Checkbox
value={item.metadataColumnId}
style={{
lineHeight: '32px',
}}
>
<Typography.Text style={{ width: 120 }} ellipsis>{item.name}</Typography.Text>
</Checkbox>
</Col>)
}
</Row>
</Checkbox.Group>
)
}
\ 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