Commit 13e8ef9b by fanyongjun

4.8.2

parent 5851a49f
...@@ -38,3 +38,7 @@ export function* queryAllDirectoryAsTree(payload) { ...@@ -38,3 +38,7 @@ export function* queryAllDirectoryAsTree(payload) {
export function* listAllTopics(payload) { export function* listAllTopics(payload) {
return yield call(service.listAllTopics, payload); return yield call(service.listAllTopics, payload);
} }
export function* directoryImport(payload) {
return yield call(service.directoryImport, payload);
}
...@@ -8,15 +8,12 @@ import { reducers } from './reducer'; ...@@ -8,15 +8,12 @@ import { reducers } from './reducer';
import * as user from './user'; import * as user from './user';
import * as map from './map'; import * as map from './map';
import * as datamodel from './datamodel'; import * as datamodel from './datamodel';
<<<<<<< HEAD
import * as assetmanage from './assetmanage'; import * as assetmanage from './assetmanage';
const funcs = Connect({ user, datamodel, map,assetmanage })
=======
import * as dataassetelement from './dataassetelement'; import * as dataassetelement from './dataassetelement';
const funcs = Connect({ user, datamodel, map, dataassetelement }) const funcs = Connect({ user, datamodel, map, dataassetelement,assetmanage })
>>>>>>> 38340f8dec7bab08e4d6f7a73db93a2d59a4c42c
function* request(args) { function* request(args) {
const { type, payload, callback, error } = args.args; const { type, payload, callback, error } = args.args;
......
import { PostJSON, Post, GetJSON } from "../util/axios" import { PostJSON, GetJSON, filePost2} from "../util/axios"
export function addOrUpdateDataAsset(payload) { export function addOrUpdateDataAsset(payload) {
return PostJSON("/dataassetmanager/dataAssetApi/addOrUpdateDataAsset", payload) return PostJSON("/dataassetmanager/dataAssetApi/addOrUpdateDataAsset", payload)
...@@ -45,4 +45,9 @@ export function queryAllDirectoryAsTree(payload) { ...@@ -45,4 +45,9 @@ export function queryAllDirectoryAsTree(payload) {
export function listAllTopics(payload) { export function listAllTopics(payload) {
return GetJSON("/dataassetmanager/directoryApi/listAllTopics", payload) return GetJSON("/dataassetmanager/directoryApi/listAllTopics", payload)
} }
\ No newline at end of file
export function directoryImport(payload) {
return filePost2("/dataassetmanager/directoryApi/import", payload)
}
...@@ -141,4 +141,23 @@ export function filePost(url, payload) { ...@@ -141,4 +141,23 @@ export function filePost(url, payload) {
return fileplain.post(url, formData, ).then( return fileplain.post(url, formData, ).then(
callback callback
) )
}
export function filePost2(url, payload) {
const { fileList = null,params=null} = payload||{};
// let formData = new FormData();
// (fileList||[]).forEach(file=> {
// formData.append('file', file);
// });
let formData=new FormData();// 创建form对象
formData.append('file',fileList);
if(params){
for(let key in params){
url = url+ '?' + key + '=' + params[key]
}
}
return fileplain.post(url,formData, ).then(
callback
)
} }
\ No newline at end of file
import React,{useState, useEffect,} from "react"
import {Modal,Descriptions} from "antd"
export default (props)=>{
const {handleCancle,visible,boxDetail} = props
return(
<Modal
title={`资产Id:${boxDetail.id}`}
visible={visible}
width={800}
onCancel={()=>{handleCancle()}}
// style={{ top: 30}}
footer={null}
>
<Descriptions size="small" column={2} bordered>
{boxDetail.basicAttrs&&boxDetail.basicAttrs[0]&&boxDetail.basicAttrs.map(data=>{
return(
<Descriptions.Item label={data.key}>{data.value}</Descriptions.Item>
)
})
}
</Descriptions>
</Modal>
)
}
\ No newline at end of file
import React,{useState, useEffect} from "react" import React,{useState, useEffect} from "react"
import {Card,Checkbox,Pagination,Button,List,Skeleton,Row,Col,Typography,Input,Space,Modal} from "antd" import {Card,Checkbox,Button,List,Skeleton,Row,Col,Typography,Input,Space,Modal} from "antd"
import { EyeOutlined, TableOutlined, AreaChartOutlined } from '@ant-design/icons';
import "./AssetTable.less" import "./AssetTable.less"
import { dispatchLatest,dispatch } from '../../../../model'; import {dispatch } from '../../../../model';
import AssetModal from "./AssetModal" import AssetModal from "./AssetModal"
import AssetDetail from "./AssetDetail"
const { Text } = Typography; const { Text } = Typography;
...@@ -17,6 +18,7 @@ export default (props) =>{ ...@@ -17,6 +18,7 @@ export default (props) =>{
const [editBox,setEditBox] = useState({}) const [editBox,setEditBox] = useState({})
const [keyWord,setKeyWord] = useState('') const [keyWord,setKeyWord] = useState('')
const [keyMessage,setKeyMessage] = useState('')
const [tableBox,setTableBox] = useState({dataList:[],total:0,}) const [tableBox,setTableBox] = useState({dataList:[],total:0,})
const [pageNumber,setPageNumber] = useState({page:1,size:20,rebuild:0}) const [pageNumber,setPageNumber] = useState({page:1,size:20,rebuild:0})
...@@ -24,6 +26,7 @@ export default (props) =>{ ...@@ -24,6 +26,7 @@ export default (props) =>{
const {page,size,rebuild} = pageNumber const {page,size,rebuild} = pageNumber
const [modal, contextHolder] = Modal.useModal(); const [modal, contextHolder] = Modal.useModal();
const [visible,setVisible] = useState({visible:false,addtype:true}) const [visible,setVisible] = useState({visible:false,addtype:true})
const [visible2,setVisible2] = useState({visible:false,box:{}})
useEffect(()=>{ useEffect(()=>{
getListBasicAttrs() getListBasicAttrs()
...@@ -32,7 +35,7 @@ export default (props) =>{ ...@@ -32,7 +35,7 @@ export default (props) =>{
useEffect(()=>{ useEffect(()=>{
if(nodeId) if(nodeId)
getTable() getTable()
},[nodeId,rebuild]) },[nodeId,rebuild,keyMessage])
const changeCurrent=(page,size)=>{ const changeCurrent=(page,size)=>{
...@@ -61,7 +64,7 @@ export default (props) =>{ ...@@ -61,7 +64,7 @@ export default (props) =>{
setTableLoad(true) setTableLoad(true)
dispatch({ dispatch({
type: 'assetmanage.listDataAssetsByPage', type: 'assetmanage.listDataAssetsByPage',
payload: {dirId:nodeId,pageNum:page,pageSize:size}, payload: {dirId:nodeId,pageNum:page,pageSize:size,keyword:keyMessage},
callback: dataBox => { callback: dataBox => {
setTableBox({dataList:dataBox.data,total:dataBox.total}) setTableBox({dataList:dataBox.data,total:dataBox.total})
setTableLoad(false) setTableLoad(false)
...@@ -107,7 +110,18 @@ export default (props) =>{ ...@@ -107,7 +110,18 @@ export default (props) =>{
setVisible({addtype:false,visible:true}) setVisible({addtype:false,visible:true})
} }
const more=(data)=>{
setVisible2({box:data,visible:true})
}
const handleCancle2=()=>{
setVisible2({...visible2,visible:false})
}
const fetchTableList=()=>{
setKeyMessage(keyWord)
}
return( return(
<Card <Card
...@@ -119,14 +133,14 @@ export default (props) =>{ ...@@ -119,14 +133,14 @@ export default (props) =>{
<div style={{display:'flex',justifyContent:'space-between',height:32}}> <div style={{display:'flex',justifyContent:'space-between',height:32}}>
<div style={{fontSize:18,fontWeight:800,color:'#767676',lineHeight:'32px'}}>资产管理</div> <div style={{fontSize:18,fontWeight:800,color:'#767676',lineHeight:'32px'}}>资产管理</div>
<Space> <Space>
<Input.Search style={{width:180,float:'right'}} {/* <Input.Search style={{width:180,float:'right'}}
onChange={e=>{ setKeyWord(e.target.value)}} onChange={e=>{ setKeyWord(e.target.value)}}
value={keyWord} value={keyWord}
placeholder={"请输入关键字"} placeholder={"请输入关键字"}
enterButton enterButton
// onSearch={()=>{fetchTableList()}} onSearch={()=>{fetchTableList()}}
/> /> */}
<Button type="primary" >回收站</Button> {/* <Button type="primary" >回收站</Button> */}
</Space> </Space>
...@@ -140,8 +154,8 @@ export default (props) =>{ ...@@ -140,8 +154,8 @@ export default (props) =>{
<Button type="primary" onClick={add}>新增</Button> <Button type="primary" onClick={add}>新增</Button>
{/* <Button type="primary" danger>删除</Button> */} {/* <Button type="primary" danger>删除</Button> */}
<Button type="primary" >导入</Button> {/* <Button type="primary" >导入</Button>
<Button type="primary" >导出</Button> <Button type="primary" >导出</Button> */}
</Space> </Space>
</div> </div>
...@@ -165,7 +179,7 @@ export default (props) =>{ ...@@ -165,7 +179,7 @@ export default (props) =>{
actions={[ actions={[
<Button type="link" key="edit" onClick={()=>edit(item)}>修改</Button>, <Button type="link" key="edit" onClick={()=>edit(item)}>修改</Button>,
<Button type="link"key="delete" >删除</Button>, <Button type="link"key="delete" >删除</Button>,
<Button type="link"key="detail" onClick={()=>del(item)}>详情</Button>, <Button type="link"key="detail" onClick={()=>more(item)}>详情</Button>,
]} ]}
> >
<Skeleton title={false} loading={tableLoad} active> <Skeleton title={false} loading={tableLoad} active>
...@@ -195,6 +209,7 @@ export default (props) =>{ ...@@ -195,6 +209,7 @@ export default (props) =>{
/> />
</Checkbox.Group> </Checkbox.Group>
<AssetModal visible={visible.visible} attrBox2={attrBox2} editBox={editBox} addType={visible.addtype} handleCancle={handleCancle} attrBox={attrBox} nodeId={nodeId} setPageNumber={setPageNumber} pageNumber={pageNumber}/> <AssetModal visible={visible.visible} attrBox2={attrBox2} editBox={editBox} addType={visible.addtype} handleCancle={handleCancle} attrBox={attrBox} nodeId={nodeId} setPageNumber={setPageNumber} pageNumber={pageNumber}/>
<AssetDetail visible={visible2.visible} boxDetail={visible2.box} handleCancle={handleCancle2}/>
{contextHolder} {contextHolder}
</Card> </Card>
) )
......
import React,{useState, useEffect} from "react" import React,{useState, useEffect} from "react"
import {Card,Spin,Button,Tooltip,Modal,Tree,Input} from "antd" import {Card,Spin,Button,Tooltip,Modal,Tree,Input,Dropdown,Menu} from "antd"
import { PlusOutlined, ImportOutlined,EditOutlined,DeleteOutlined,ExportOutlined } from '@ant-design/icons'; import { PlusOutlined, ImportOutlined,EditOutlined,DeleteOutlined,ExportOutlined } from '@ant-design/icons';
import { showMessage, generateList } from '../../../../util'; import { showMessage, generateList } from '../../../../util';
import { dispatchLatest,dispatch } from '../../../../model'; import { dispatch } from '../../../../model';
import TreeModal from "./TreeModal" import TreeModal from "./TreeModal"
import ThemeFile from "./ThemeFile"
import './LeftTree.less'; import './LeftTree.less';
const {TreeNode} = Tree const {TreeNode} = Tree
export default (props)=>{ export default (props)=>{
...@@ -13,8 +14,7 @@ export default (props)=>{ ...@@ -13,8 +14,7 @@ export default (props)=>{
const [treeLoad,setTreeLoad] = useState(false) const [treeLoad,setTreeLoad] = useState(false)
const [nodeBox,setNodeBox] = useState({openNode:[],selectKey:[],dataBox:{}}) const [nodeBox,setNodeBox] = useState({openNode:[],selectKey:[],dataBox:{}})
const [treeRebuild,setTreeRebuild] = useState({build:false,type:'build'}) const [treeRebuild,setTreeRebuild] = useState({build:0,type:'build'})
const [dataCache,setDataCache] = useState({})
const [visible,setVisible] = useState(false) const [visible,setVisible] = useState(false)
const [searchValue,setSearchValue] = useState('') const [searchValue,setSearchValue] = useState('')
const [autoExpandParent,setAutoExpandParent] = useState(false) const [autoExpandParent,setAutoExpandParent] = useState(false)
...@@ -22,6 +22,7 @@ export default (props)=>{ ...@@ -22,6 +22,7 @@ export default (props)=>{
const [searchMessage,setSearchMessage] = useState('') const [searchMessage,setSearchMessage] = useState('')
const [allTpoic,setAllTopic] = useState([]) const [allTpoic,setAllTopic] = useState([])
const [detailBox,setDetailBox] = useState({}) const [detailBox,setDetailBox] = useState({})
const [visible2,setVisible2] = useState(false)
useEffect(()=>{ useEffect(()=>{
getAllTpoic() getAllTpoic()
...@@ -137,7 +138,6 @@ export default (props)=>{ ...@@ -137,7 +138,6 @@ export default (props)=>{
const update = ()=>{ const update = ()=>{
if(nodeBox.dataBox.nodeId!=undefined){ if(nodeBox.dataBox.nodeId!=undefined){
console.log(allTpoic)
for (let topic of allTpoic){ for (let topic of allTpoic){
if(topic.id===nodeBox.dataBox.nodeId){ if(topic.id===nodeBox.dataBox.nodeId){
setDetailBox(topic) setDetailBox(topic)
...@@ -148,6 +148,36 @@ export default (props)=>{ ...@@ -148,6 +148,36 @@ export default (props)=>{
setTreeRebuild({...treeRebuild,type:'edit'}) setTreeRebuild({...treeRebuild,type:'edit'})
} }
const importFunction =()=>{
if(nodeBox.dataBox.nodeId!=undefined){
for (let topic of allTpoic){
if(topic.id===nodeBox.dataBox.nodeId){
setDetailBox(topic)
}
}
}
setVisible2(true)
}
const exportFunction=(type)=>{
if(!type){
window.open(`/api/dataassetmanager/directoryApi/export`);
}else{
if(nodeBox.dataBox.nodeId!=undefined){
for (let topic of allTpoic){
if(topic.id===nodeBox.dataBox.nodeId){
window.open(`/api/dataassetmanager/directoryApi/export?parentPath=${topic.path}`);
return
}
}
}else{
showMessage("warn","请选择目录")
}
}
}
const deleteNode = () => { const deleteNode = () => {
if (nodeBox.selectKey&&nodeBox.selectKey[0]!==undefined) { if (nodeBox.selectKey&&nodeBox.selectKey[0]!==undefined) {
...@@ -160,6 +190,7 @@ export default (props)=>{ ...@@ -160,6 +190,7 @@ export default (props)=>{
title: '提示', title: '提示',
content: '节点下包含资产信息,删除后将把资产从该目录上移除,确定继续吗?', content: '节点下包含资产信息,删除后将把资产从该目录上移除,确定继续吗?',
onOk: () => { onOk: () => {
console.log({data:[`${nodeBox.dataBox.nodeId}`]})
dispatch({ dispatch({
type: 'assetmanage.deleteDirectory', type: 'assetmanage.deleteDirectory',
payload:{data:[`${nodeBox.dataBox.nodeId}`]}, payload:{data:[`${nodeBox.dataBox.nodeId}`]},
...@@ -194,6 +225,10 @@ export default (props)=>{ ...@@ -194,6 +225,10 @@ export default (props)=>{
setVisible(false) setVisible(false)
} }
const handleCancle2 = () =>{
setVisible2(false)
}
const onSearch = () => { const onSearch = () => {
if(searchMessage!=''){ if(searchMessage!=''){
const expandedKeys = dataList const expandedKeys = dataList
...@@ -261,6 +296,20 @@ export default (props)=>{ ...@@ -261,6 +296,20 @@ export default (props)=>{
} }
}); });
const menu = (
<Menu>
<Menu.Item>
<div onClick={()=>exportFunction(false)}>
导出所有
</div>
</Menu.Item>
<Menu.Item>
<div onClick={()=>exportFunction(true)}>
导出选中目录
</div>
</Menu.Item>
</Menu>
);
return( return(
...@@ -282,12 +331,13 @@ export default (props)=>{ ...@@ -282,12 +331,13 @@ export default (props)=>{
/> />
</Tooltip> </Tooltip>
<Tooltip title="导入" className='ml-3'> <Tooltip title="导入" className='ml-3'>
<Button <Button
shape="circle" shape="circle"
icon={<ImportOutlined />} icon={<ImportOutlined />}
// onClick={importFunction} onClick={importFunction}
/> />
</Tooltip> </Tooltip>
<Dropdown overlay={menu} placement="bottomLeft">
<Tooltip title="导出" className='ml-3'> <Tooltip title="导出" className='ml-3'>
<Button <Button
shape="circle" shape="circle"
...@@ -295,6 +345,9 @@ export default (props)=>{ ...@@ -295,6 +345,9 @@ export default (props)=>{
// onClick={exportFunction} // onClick={exportFunction}
/> />
</Tooltip> </Tooltip>
</Dropdown>
<Tooltip title="删除" className='ml-3'> <Tooltip title="删除" className='ml-3'>
<Button <Button
shape="circle" shape="circle"
...@@ -329,7 +382,8 @@ export default (props)=>{ ...@@ -329,7 +382,8 @@ export default (props)=>{
{loop(treeBox)} {loop(treeBox)}
</Tree> </Tree>
</Spin> </Spin>
<TreeModal visible={visible} handleCancle={handleCancle} addType={treeRebuild.type==='add'?true:false} editBox={detailBox} selectKey={nodeBox.selectKey[0]} setTreeRebuild={setTreeRebuild} treeRebuild={treeRebuild} /> <TreeModal visible={visible} handleCancle={handleCancle} addType={treeRebuild.type==='add'?true:false} editBox={detailBox} selectKey={nodeBox.selectKey[0]} setTreeRebuild={setTreeRebuild} treeRebuild={treeRebuild} />
<ThemeFile fileVisible={visible2} handleCancle={handleCancle2} editBox={detailBox} selectKey={nodeBox.selectKey[0]} setTreeRebuild={setTreeRebuild} />
{contextHolder} {contextHolder}
</Card> </Card>
......
import React,{useState, useEffect} from "react"
import {Modal,Form,Upload,Button,message,Radio} from "antd"
import { PlusOutlined } from '@ant-design/icons';
import { dispatch } from '../../../../model';
import { showMessage} from '../../../../util';
export default (props)=>{
const {fileVisible,handleCancle,editBox,selectKey,setTreeRebuild} = props
const [upLoad,setUpLoad] = useState(false)
const [form] = Form.useForm()
useEffect(()=>{
if(fileVisible){
form.resetFields()
}
},[fileVisible])
const normFile = (e) => {
let data = []
if(e.fileList[0]){
data = e.fileList.slice(-1)
}
return data;
};
const prop = {
beforeUpload: (file) => {
const isLt20M = file.size / 1024 / 1024 < 2000;
if (!isLt20M) {
return message.error('上传文件不能超过 20MB!')
}
return false;
},
};
const upload = ()=>{
form.validateFields().then((value)=>{
setUpLoad(true)
if(selectKey){
if(value.type===1){
dispatch({
type: 'assetmanage.directoryImport',
payload: { fileList: value.file[0].originFileObj },
callback: data => {
setTreeRebuild({build:new Date().getTime(),type:'build'})
showMessage("success","导入成功")
setUpLoad(false)
handleCancle()
},
error: () => {
}
})
}else{
dispatch({
type: 'assetmanage.directoryImport',
payload: { params:{parentPath: editBox.path},fileList: value.file[0].originFileObj },
callback: data => {
setUpLoad(false)
handleCancle()
showMessage("success","导入成功")
setTreeRebuild({build:new Date().getTime(),type:'build'})
},
error: () => {
}
})
}
}else{
dispatch({
type: 'assetmanage.directoryImport',
payload: {fileList: value.file[0].originFileObj },
callback: data => {
setUpLoad(false)
handleCancle()
showMessage("success","导入成功")
setTreeRebuild({build:new Date().getTime(),type:'build'})
},
error: () => {
}
})
}
}).catch(()=>{
setUpLoad(false)
})
}
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 5 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 17 },
},
};
const download=()=>{
window.open("/data-govern/docs/AssetThemeModel.xlsx");
}
return(
<Modal
title={`目录导入`}
visible={fileVisible}
// width={800}
onCancel={()=>{handleCancle()}}
maskClosable={false}
footer={[
<div key="btn1" >
<Button type="primary" onClick={()=>download()} >模版下载</Button>
<Button type="primary" onClick={upload} loading={upLoad}>上传</Button>
<Button onClick={handleCancle}>返回</Button>
</div>
]}
>
<Form {...formItemLayout} form={form}>
<Form.Item
label="文件"
name="type"
rules={[{ required: true, message: '必填项'}]}
>
<Radio.Group >
<Radio value={1} >父节点导入</Radio>
<Radio value={2} disabled={selectKey!=undefined?false:true}>选中节点导入</Radio>
</Radio.Group>
</Form.Item>
<Form.Item
label="文件"
name="file"
rules={[{ required: true, message: '请上传附件'}]}
valuePropName='fileList'
getValueFromEvent= {normFile}
>
<Upload {...prop}>
<Button type='link' icon={<PlusOutlined/>} style={{padding:5}} > 上传</Button>
</Upload>
</Form.Item>
</Form>
</Modal>
)
}
\ 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