Commit bcdaeaac by zhaochengxiang

资产申请

parent 92529971
...@@ -48,3 +48,7 @@ export function* subscribeTableModel(payload) { ...@@ -48,3 +48,7 @@ export function* subscribeTableModel(payload) {
export function* setTableModelScore(payload) { export function* setTableModelScore(payload) {
return yield call(service.setTableModelScore, payload); return yield call(service.setTableModelScore, payload);
} }
export function* apply(payload) {
return yield call(service.apply, payload);
}
\ No newline at end of file
...@@ -44,3 +44,7 @@ export async function subscribeTableModel(payload) { ...@@ -44,3 +44,7 @@ export async function subscribeTableModel(payload) {
export async function setTableModelScore(payload) { export async function setTableModelScore(payload) {
return Post("/datacatalog/front/setTableModelScore",payload); return Post("/datacatalog/front/setTableModelScore",payload);
} }
export async function apply(payload){
return Post('/datacatalog/front/apply', payload);
}
\ No newline at end of file
import axios from 'axios'; import axios from 'axios';
import { message } from 'antd'; import { message } from 'antd';
import { Open, ContextPath } from './index'; import { Open, ContextPath, IsArr } from './index';
const CancelToken = axios.CancelToken; const CancelToken = axios.CancelToken;
const baseURL = '/api/'; const baseURL = '/api/';
...@@ -26,9 +26,43 @@ const textplain = axios.create({ ...@@ -26,9 +26,43 @@ const textplain = axios.create({
//'X-Custom-Header': 'rest', //'X-Custom-Header': 'rest',
'Cache-Control': 'no-cache,no-store,must-revalidate,max-age=-1,private' 'Cache-Control': 'no-cache,no-store,must-revalidate,max-age=-1,private'
}, },
transformResponse: [(data) => { return data; }], transformResponse: [(data) => {
return data;
}],
}); });
textplain.interceptors.request.use(
(config) => {
let parmas = config.params
if (config.method === 'post' && parmas) {
let url_params = ''
for (const key in parmas) {
const val = parmas[key];
let url_params_temp = url_params;
if (IsArr(val)){
val.map((_val)=> {
url_params_temp += url_params_temp ? '&' : '?';
url_params_temp += encodeURIComponent(key+'[]') + '=' + encodeURIComponent(_val);
return _val;
});
} else {
url_params_temp += url_params_temp ? '&' : '?';
url_params_temp += encodeURIComponent(key) + '=' + encodeURIComponent(parmas[key]);
}
url_params = url_params_temp;
}
config.url = config.url+url_params;
config.params = {};
}
return config;
}
);
let __source = null; let __source = null;
export const Cancel = function (msg) { export const Cancel = function (msg) {
return new Promise(res => __source && __source.cancel(msg)); return new Promise(res => __source && __source.cancel(msg));
......
...@@ -77,3 +77,12 @@ export const Assert = function (arg, msg) { ...@@ -77,3 +77,12 @@ export const Assert = function (arg, msg) {
throw msg throw msg
} }
} }
export const paginate = function (items, pageNum = 1, pageSize = 10) {
const offset = (pageNum - 1) * pageSize;
return items.filter((item, i) => i >= offset && i < offset + pageSize);
}
export const IsArr = function (data) {
return data && Object.prototype.toString.call(data) === '[object Array]';
}
...@@ -13,7 +13,7 @@ import { ...@@ -13,7 +13,7 @@ import {
message message
} from 'antd'; } from 'antd';
import { DataDesc, DataPreview, DataDetail } from './AssetListHelper'; import { DataDesc, DataPreview, DataDetail, ApplyDesc } from './AssetListHelper';
import styles from '../style.less'; import styles from '../style.less';
import { dispatch } from '../../../../model'; import { dispatch } from '../../../../model';
...@@ -36,6 +36,7 @@ class AssetListCOM extends Component { ...@@ -36,6 +36,7 @@ class AssetListCOM extends Component {
download: false, download: false,
dataDesc: null, dataDesc: null,
dataPreview: null, dataPreview: null,
activeBtn: 0,
}; };
} }
...@@ -43,6 +44,8 @@ class AssetListCOM extends Component { ...@@ -43,6 +44,8 @@ class AssetListCOM extends Component {
const { tableModel, tabKey } = this.state; const { tableModel, tabKey } = this.state;
if (preState.tableModel !== tableModel && tableModel !== null) { if (preState.tableModel !== tableModel && tableModel !== null) {
this.setState({ activeBtn: 0 });
dispatch({ dispatch({
type: 'assets.getMetadata', type: 'assets.getMetadata',
payload: tableModel.tableIdInSource, payload: tableModel.tableIdInSource,
...@@ -101,16 +104,29 @@ class AssetListCOM extends Component { ...@@ -101,16 +104,29 @@ class AssetListCOM extends Component {
} }
downloadFile = (payload) => { apply= (columnPositions, reason, expireDate) => {
window.open( const { tableModel, activeBtn } = this.state;
`/api/metadataharvester/rest/fileExcelPdf/getExcelFileContent?namePath=${payload}`,
'_blank', if (tableModel) {
); dispatch({
}; type: 'assets.apply',
payload: { params :{
tableModelId: tableModel.tableModelId,
columnPositions: columnPositions,
reason,
expireDate,
} },
callback: () => {
this.setState({ activeBtn: (activeBtn ^ 1) & 1 });
message.success('申请成功');
}
});
}
}
render() { render() {
const { tableModels, loading, subscribeTableModel, updateItems } = this.props; const { tableModels, loading, subscribeTableModel, updateItems } = this.props;
const { tableModel, showModal, tabKey, metedata, download, dataDesc, dataPreview } = this.state; const { tableModel, showModal, tabKey, metedata, dataDesc, dataPreview, activeBtn } = this.state;
const IconText = ({ type, text }) => ( const IconText = ({ type, text }) => (
<span> <span>
...@@ -208,6 +224,12 @@ class AssetListCOM extends Component { ...@@ -208,6 +224,12 @@ class AssetListCOM extends Component {
return null; return null;
}; };
const getTableModelColumns = function (privileged) {
return (dataDesc&&dataDesc.columns) ? dataDesc.columns.filter((o, i) => {
return o.privileged === privileged;
}) : [];
};
return ( return (
<React.Fragment> <React.Fragment>
<List <List
...@@ -260,10 +282,14 @@ class AssetListCOM extends Component { ...@@ -260,10 +282,14 @@ class AssetListCOM extends Component {
<DataDetail <DataDetail
tableModel={tableModel} tableModel={tableModel}
metaData={metedata || {}} metaData={metedata || {}}
isHaveFile={download} showApplyButton={getTableModelColumns(false).length > 0}
download={this.downloadFile} isAppling={activeBtn===1?true:false}
onApply={ () => {
this.setState({ activeBtn: (activeBtn ^ 1) & 1 });
}}
/> />
<Tabs {
activeBtn===0&&<Tabs
defaultActiveKey="description" defaultActiveKey="description"
activeKey={tabKey} activeKey={tabKey}
onChange={key => { onChange={key => {
...@@ -278,6 +304,10 @@ class AssetListCOM extends Component { ...@@ -278,6 +304,10 @@ class AssetListCOM extends Component {
<DataPreview dataPreview={dataPreview} /> <DataPreview dataPreview={dataPreview} />
</TabPane> </TabPane>
</Tabs> </Tabs>
}
{
activeBtn===1&&<ApplyDesc dataDesc={dataDesc} apply={this.apply} />
}
</Modal> </Modal>
)} )}
</React.Fragment> </React.Fragment>
......
import React, { Component } from 'react'; import React, { Component, Fragment, useState } from 'react';
import { Table, Descriptions, Icon } from 'antd'; import { Table, Descriptions, Icon, Row, Col, Input, Checkbox, Divider, Pagination, Form, DatePicker, Button, message } from 'antd';
import classnames from 'classnames';
import styles from '../style.less'; import { paginate } from '../../../../util';
const CheckboxGroup = Checkbox.Group;
const { Search } = Input;
const despColumns = [ const despColumns = [
{ {
...@@ -20,20 +24,44 @@ const despColumns = [ ...@@ -20,20 +24,44 @@ const despColumns = [
{ key: 'filterMatchStandard', dataIndex: 'filterMatchStandard', title: '匹配标准' }, { key: 'filterMatchStandard', dataIndex: 'filterMatchStandard', title: '匹配标准' },
]; ];
export class DataDesc extends Component { export const DataDesc = ({ dataDesc }) => {
render() { const [{ pageNum, pageSize }, set_pagenation] = useState({ pageNum: 1, pageSize: 10 });
const { dataDesc } = this.props; const showPage = dataDesc && dataDesc.columns && dataDesc.columns.length > 10;
let dataSource = dataDesc ? dataDesc.columns : [];
if (showPage) {
dataSource = paginate(dataDesc.columns, pageNum, pageSize);
}
return ( return (
<Fragment>
<Table <Table
size="small" size="small"
rowKey="ordinalPosition" rowKey="ordinalPosition"
pagination={false} pagination={false}
columns={despColumns} columns={despColumns}
loading={dataDesc === undefined} loading={dataDesc === undefined}
dataSource={dataDesc ? dataDesc.columns : []} dataSource={dataSource}
/>
{showPage && (
<Pagination
size="small"
className="text-center"
style={{ marginTop: 16 }}
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
set_pagenation({ pageNum: _pageNum, pageSize: _pageSize || 10 });
}}
onShowSizeChange={(_pageNum, _pageSize) => {
set_pagenation({ pageNum: _pageNum || 1, pageSize: _pageSize });
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={dataDesc.columns.length}
/> />
)}
</Fragment>
); );
}
} }
export class DataPreview extends Component { export class DataPreview extends Component {
...@@ -70,9 +98,10 @@ export class DataPreview extends Component { ...@@ -70,9 +98,10 @@ export class DataPreview extends Component {
export class DataDetail extends Component { export class DataDetail extends Component {
render() { render() {
const { tableModel, metaData, isHaveFile, download } = this.props; const { tableModel, metaData, showApplyButton, isAppling, onApply } = this.props;
return ( return (
<Descriptions className={styles.headerList} size="small" column={3}> <Descriptions size="small" column={3}>
<Descriptions.Item label="资产名称"> <Descriptions.Item label="资产名称">
<span dangerouslySetInnerHTML={{ __html: `资产名称:${tableModel.name}` }} /> <span dangerouslySetInnerHTML={{ __html: `资产名称:${tableModel.name}` }} />
</Descriptions.Item> </Descriptions.Item>
...@@ -85,6 +114,9 @@ export class DataDetail extends Component { ...@@ -85,6 +114,9 @@ export class DataDetail extends Component {
<Descriptions.Item label="源系统">{metaData.sourceSystem}</Descriptions.Item> <Descriptions.Item label="源系统">{metaData.sourceSystem}</Descriptions.Item>
<Descriptions.Item label="数据更新特点">{metaData.updateFeature}</Descriptions.Item> <Descriptions.Item label="数据更新特点">{metaData.updateFeature}</Descriptions.Item>
<Descriptions.Item label="主题域">{metaData.domain}</Descriptions.Item> <Descriptions.Item label="主题域">{metaData.domain}</Descriptions.Item>
{metaData.hasOwnProperty('leaderInfo') && (
<Descriptions.Item label="负责人">{metaData.leaderInfo}</Descriptions.Item>
)}
<Descriptions.Item label="描述"> <Descriptions.Item label="描述">
<span <span
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
...@@ -92,20 +124,164 @@ export class DataDetail extends Component { ...@@ -92,20 +124,164 @@ export class DataDetail extends Component {
}} }}
/> />
</Descriptions.Item> </Descriptions.Item>
{isHaveFile && ( {
<Descriptions.Item label="文档下载"> showApplyButton&&<Descriptions.Item>
<span <span
className={styles.download} className={ classnames('pointer', isAppling?'text-warning':'text-primary') }
onClick={(e) => { onClick={e => {
e.preventDefault(); e.preventDefault();
if (download) download(metaData.namePath); if (onApply) {
onApply();
}
}} }}
> >
详细设计文档 申请
</span> </span>
</Descriptions.Item> </Descriptions.Item>
)} }
</Descriptions> </Descriptions>
); );
} }
} }
const ApplyDescFunc = ({ dataDesc, form, apply }) => {
const { getFieldDecorator, validateFields, resetFields } = form;
const [{ pageNum, pageSize }, set_pagenation] = useState({ pageNum: 1, pageSize: 500 });
const [{ checkedPositions }, set_checkedPostions] = useState({ checkedPositions: [] });
const [{ keyword }, set_keyword] = useState({ keyword: '' });
const [{ checkAll }, set_checkAll] = useState({ checkAll: false });
const _columns = (dataDesc&&dataDesc.columns)? dataDesc.columns.filter((o,i) => {
if (o.privileged === true) return false;
if (keyword.length>0) {
if (o.displayName.toLowerCase().indexOf(keyword.toLowerCase()) >= 0)
return true;
if (o.name.toLowerCase().indexOf(keyword.toLowerCase()) >= 0)
return true;
if (o.nameInSource.toLowerCase().indexOf(keyword.toLowerCase()) >= 0)
return true;
return false;
}
return true;
}):[];
const showPage = _columns && _columns.length > pageSize;
let dataSource = _columns;
if (showPage) {
dataSource = paginate(_columns, pageNum, pageSize);
}
let options = [];
options = dataSource.map((o,i) => {
return {
label: o.name,
value: o.ordinalPosition,
};
});
return (
<Fragment>
<Row>
<Col md={4}><h3>字段概览</h3></Col>
<Col md={20} className='text-right pt-4'>
<Search
placeholder="请输入字段过滤"
style={{ width: 200 }}
onChange={(e) => {
set_keyword({ keyword: e.target.value});
set_checkedPostions({ checkedPositions: [] });
set_checkAll({ checkAll: false});
}}
/>
&nbsp;
<Checkbox
indeterminate={false}
onChange={(e)=>{
set_checkedPostions({ checkedPositions: e.target.checked ? _columns.map((o,i) => {
return o.ordinalPosition;
}) : [] });
set_checkAll({ checkAll: e.target.checked});
}}
checked={checkAll}
>
全选
</Checkbox>
</Col>
</Row>
<Divider />
<CheckboxGroup
options={options}
value={checkedPositions}
onChange={(values) => {
set_checkedPostions({ checkedPositions: values });
set_checkAll({ checkAll: values.length === _columns.length});
}}
/>
{showPage && (
<Pagination
size="small"
className="text-center"
style={{ marginTop: 16 }}
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
set_pagenation({ pageNum: _pageNum, pageSize: _pageSize || 10 });
}}
onShowSizeChange={(_pageNum, _pageSize) => {
set_pagenation({ pageNum: _pageNum || 1, pageSize: _pageSize });
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={dataDesc.columns.length}
/>
)}
<Divider />
<Row>
<Col md={18} offset={3}>
<Form>
<Form.Item label="申请说明">
{getFieldDecorator('apply', {
rules: [{ required: true, message: '请填写申请说明' }],
})(<Input.TextArea placeholder="申请说明" />)}
</Form.Item>
<Form.Item label="结束时间">
{getFieldDecorator('expire', {
rules: [{ required: true, message: '请选择结束时间' }],
})(<DatePicker />)}
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" onClick={()=>{
validateFields((err, values) =>{
if (checkedPositions.length === 0) {
message.error('请选择下列字段');
return;
}
if (!err) {
if (apply) {
set_keyword({ keyword: ''});
set_checkedPostions({ checkedPositions: [] });
set_checkAll({ checkAll: false});
resetFields();
apply(checkedPositions, values.apply, values.expire.format('YYYY-MM-DD'));
}
}
});
}}>
申请
</Button>
</Form.Item>
</Form>
</Col>
</Row>
</Fragment>
);
};
export const ApplyDesc = Form.create({ name: "apply" })(ApplyDescFunc);
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