Commit 1ed9691b authored by 陈祥烨's avatar 陈祥烨

数据库导出

parent bd54ad82
......@@ -20,13 +20,28 @@ const {
export const UrlConsts = {
deleteAgency: (url) => completePrefix(baseURI, 'jcs/Agency/relation/{agencyCodeId}/{sequenceNbrs}'),
deleteAgency: (url) => completePrefix(baseURI, 'atl/agency/relation/{agencyCode}/{sequenceNbrs}'),
exportAgency: (url) => completePrefix(baseURI, 'atl/agency/export/{agencyCode}/{sequenceNbrs}'),
generateSqlUrl: url => completePrefix(baseURI, 'atl/v1/dataApi/generateSQL') // 通用导出SQL脚本 get
};
/**
* 删除机构
*/
export const deleteByAgencyCode = ( agencyCodeId, sequenceNbrs) => {
return commonDelete(formatUrl(UrlConsts.deleteAgency(), { agencyCodeId, sequenceNbrs }));
export const deleteByAgencyCode = (agencyCode, sequenceNbrs) => {
return commonDelete(formatUrl(UrlConsts.deleteAgency(), { agencyCode, sequenceNbrs }));
};
/**
* 通用应用、数据SQL脚本
*/
export const templateDownload = (params) => {
return fileDownload({ url: formatObjUrl({ url: UrlConsts.generateSqlUrl(), filter: params }) });
};
/**
* 导出机构
*/
export const exportByAgencyCode = (agencyCode, sequenceNbrs) => {
return fileDownload({ url: formatUrl(UrlConsts.exportAgency(), { agencyCode, sequenceNbrs }) });
};
import React from 'react';
import PropTypes from 'prop-types';
import { Form, Input } from 'amos-framework';
import { withModalForm, BaseForm } from 'amos-designer';
import { tools } from '@gm/graphmod-utils';
import * as api from '../api'
const { deleteByAgencyCode } = api;
const FormItem = Form.Item;
/**
* 导入数据
* @class ImportData
* @extends {Component}
*/
@withModalForm({
width: 400,
title: '导出SQL脚本'
})
// class DeleteModel extends BaseForm {
// constructor(props) {
// super(props);
// const user = {};
// this.state = {
// form: {
// agencyCode: user.agencyCode ?? ''
// }
// };
// }
class DeleteModel extends BaseForm {
constructor(props) {
super(props);
const user = {};
this.state = {
form: {
agencyCode: user.agencyCode ?? ''
}
};
}
onCancel = () => {
this.setState({ form: {} }, () => {
this.props.onClose && this.props.onClose();
});
};
onSubmit = () => {
const { selectedRowKeys = [], dataConfig = {} } = this.props;
this.props.onClose();
this.props.handleOpen('logsVisible');
if (dataConfig.dimension && selectedRowKeys.length > 0) {
dataConfig[dataConfig.dimension] = selectedRowKeys.join(',');
}
deleteByAgencyCode(dataConfig);
};
render() {
const { form } = this.state;
return (
<Form
style={{ paddingRight: 20 }}
ref={this.props.saveFormRef}
model={form}
labelWidth="8em"
filled
>
<FormItem label="所属机构" field="agencyCode">
<Input placeholder="请输入" value={form.agencyCode} onChange={this.genHandle('agencyCode')} />
</FormItem>
</Form>
);
}
}
DeleteModel.propTypes = {
saveFormRef: PropTypes.func,
visible: PropTypes.bool,
onClose: PropTypes.func
};
export default DeleteModel;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { BarGroup, IconButton, briskWarningTip } from 'amos-designer';
import * as api from '../api';
import { connectGlobalPage } from '@gm/graphmod-common';
import ExecuteProgress from './ExecuteProgress';
import DeleteModel from './DeleteModel';
import { tempDownload } from '@gm/graphmod-utils/src/api';
import { LocationParam } from 'amos-tool';
/**
* 导出sql脚本模块
* @class DeleteView
* @extends {Component}
*/
// @connectGlobalPage({
// testDataConfig: {
// resourceCode: 'StudioApplication', // 标识
// dimension: 'appSeq', // 字段
// appSeq: '1620614032232841218',
// mqttUrl: 'ws://172.16.3.18:8088/mqtt',
// position:'header'
// }
// })
@connectGlobalPage({
testDataConfig: {
agencyCodeId: '1397143491787747330',//机构ID
sequenceNbrs: '1676795341917782033,1676795341917782024',//数据库连接sequenceNbrs
mqttUrl: 'ws://172.16.3.18:8088/mqtt'
}
})
class DeleteView extends Component {
constructor(props) {
super(props);
this.state = {
downloadVisible: false,
logsVisible: false,
selectId: ''
};
}
handleClose = (key) => {
this.setState({
[key]: false
});
};
handleOpen = (key) => {
this.setState({
[key]: true
});
};
handleItemClick = () => {
const { selectedRowKeys = [], dataConfig, record } = this.props;
const ipSeq = LocationParam.getLocationParamByName('ipSeq');
this.setState({ selectId: selectedRowKeys.length === 0 ? record.id ?? record.sequenceNbr : '', logsVisible: true }, () => {
dataConfig[dataConfig.sequenceNbrs] = (record ? record.id ?? record.sequenceNbr : null) || selectedRowKeys.join(',');
tempDownload({ agencyCodeId: dataConfig.agencyCodeId, sequenceNbrs: dataConfig.sequenceNbrs,ipSeq});
});
// const { selectedRowKeys = [], dataConfig, record } = this.props;
// if (selectedRowKeys.length === 0 ) {
// this.setState({ selectId: dataConfig.sequenceNbrs, logsVisible: true }, () => {
// deleteByAgencyCode( dataConfig.agencyCodeId, dataConfig.sequenceNbrs );
// });
// } else {
// briskWarningTip('至少选择一个数据库');
// }
// debugger
// const { selectedRowKeys = [], dataConfig, record } = this.props;
// if (selectedRowKeys.length > 0 || record) {
// this.setState({ selectId: selectedRowKeys.length === 0 ? record.id ?? record.sequenceNbr : selectedRowKeys[0], logsVisible: true }, () => {
// if (dataConfig.dimension && (selectedRowKeys.length > 0 || record)) {
// dataConfig[dataConfig.dimension] = (record ? record.id ?? record.sequenceNbr : null) || selectedRowKeys.join(',');
// templateDownload({ resourceCode: dataConfig.resourceCode, dimension: dataConfig.dimension, [dataConfig.dimension]: dataConfig[dataConfig.dimension] });
// }
// });
// } else {
// briskWarningTip('至少选择一行数据');
// }
};
render() {
const { dataConfig = {} } = this.props;
const { logsVisible, selectId, downloadVisible } = this.state;
return (
<div>
{dataConfig.position === 'header' ?
<div className="ig-stage-toolbar-right">
<BarGroup label="导出脚本" mode="none" position="right">
<IconButton colorful icon="export" title="导出SQL脚本" style={{ borderRadius: 4 }} onClick={() => this.handleItemClick()} />
</BarGroup>
</div>
:
<p onClick={this.handleItemClick}>删除</p>
}
<DeleteModel
visible={this.downloadVisible}
onClose={() => this.handleClose('downloadVisible')}
handleOpen={() => this.handleOpen()}
dataConfig={dataConfig}
/>
<ExecuteProgress visible={logsVisible} mqttUrl={dataConfig.mqttUrl} exeId={selectId} onClose={() => this.handleClose('logsVisible')} />
</div>
);
}
}
DeleteView.propTypes = {
selectedRowKeys: PropTypes.array,
dataConfig: PropTypes.object,
record: PropTypes.object
};
export default DeleteView;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withSubscribeMQTT, parseMessage, MQTTProvider } from 'amos-mqtt';
import { Modal, briskWarningTip } from 'amos-designer';
import ExecuteProgressContent from './ExecuteProgressContent';
/**
* 执行进度
* @class ExecuteProgress
* @extends {ExecuteProgress}
*/
class ExecuteProgress extends Component {
constructor(props) {
super(props);
this.state = {
content: null,
data: {}
};
}
componentDidMount() {
this.initMqttTopic();
}
componentDidUpdate(prevProps, prevState) {
if (this.props.exeId !== prevProps.exeId) {
this.initMqttTopic();
}
}
initMqttTopic = () => {
const { exeId } = this.props;
if (exeId) {
const content = withSubscribeMQTT({
topic: `/topicTable/solidify/${exeId.indexOf(',') !== -1 ? exeId.split(',')[0] : exeId}`,
dispatch: (_topic, message, packet) => {
const newMsg = parseMessage(message);
this.setState({ data: { message: newMsg, messageFlag: Date.now() } });
}
})(ExecuteProgressContent);
this.setState({ content });
}
}
cancel = () => {
const { data } = this.state;
if (!data.message || data.message.status === 'running') {
}
this.props.onClose && this.props.onClose();
}
render() {
const { visible, mqttUrl } = this.props;
const { data, content: Content } = this.state;
if (!Content) {
return null;
}
return (
<MQTTProvider url={mqttUrl || '/mqtt'}>
<Modal
header="立即执行进度"
visible={visible}
width={474}
noDefaultFooter
showMax
onCancel={this.cancel}
outterClosable={false}
content={
<Content message={data.message} messageFlag={data.messageFlag} />
}
/>
</MQTTProvider>
);
}
}
ExecuteProgress.propTypes = {
visible: PropTypes.bool,
onClose: PropTypes.func,
exeId: PropTypes.string,
mqttUrl: PropTypes.string
};
export default ExecuteProgress;
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Progress } from 'amos-framework';
/**
* 立即执行进度
* @class ExecuteProgressContent
* @extends {ExecuteProgress}
*/
class ExecuteProgressContent extends Component {
constructor(props) {
super(props);
this.state = {
percent: 0,
status: 'running',
flag: false,
logs: []
};
}
componentDidMount() {
this.onMessage();
}
componentDidUpdate(prevProps, prevState) {
if (prevProps.messageFlag !== this.props.messageFlag) {
this.onMessage();
}
}
onMessage = () => {
const { message } = this.props;
const { status, percent } = message || {};
if (status) {
const { logs } = this.state;
logs.push(message);
this.setState({ logs, percent, status }, () => {
this.scrollToBottom();
});
}
}
scrollToBottom = () => {
if (this.content && this.content.scrollHeight > this.content.clientHeight) {
const state = 10;
if (this.content.scrollHeight - this.content.clientHeight > state) {
this.content.scrollTop = this.content.scrollHeight - this.content.clientHeight;
}
}
}
render() {
const { logs, status, percent } = this.state;
return (
<div className="ig-execute-progress">
<Progress percent={percent} strokeWidth={16} status={status === 'error' ? 'exception' : status === 'finished' ? undefined : 'active'} />
<div className="ig-execute-progress-switch">进度详情</div>
<div className="ig-execute-progress-content" ref={node => this.content = node}>
<ul>
{
logs.map((e, index) => (
<li key={index} style={{ color: e.status === 'error' ? 'red' : '' }}>[{e.time}] {e.logInfo}{e.detail}</li>
))
}
</ul>
</div>
</div>
);
}
}
ExecuteProgressContent.propTypes = {
messageFlag: PropTypes.number,
message: PropTypes.object
};
export default ExecuteProgressContent;
import mods1 from '@gm/graphmod-ccs';
import mods2 from '@gm/graphmod-command';
import { configs, initConfig } from './config';
initConfig(configs);
const graghmod = {
...mods1,
...mods2
};
export default graghmod;
// 根据不同项目引用不同子项目的config.json配置
const configs = [
// { name: 'team', source: 'packages/graphmod-team/config.json' }
];
// 加载配置
function initConfig() {
window.gmconfig = {};
configs.forEach(e => {
const version = window.hybridModular.version || '';
const prefix = version.includes('/') ? version : `/external/graphmod/${version}`;
fetch(`${prefix}/${e.name}.config.json`)
.then(respone => respone.json())
.then(d => {
window.gmconfig = { ...window.gmconfig, ...d || {} };
});
});
}
module.exports = {
configs,
initConfig
};
import DeleteView from './DeleteView';
import './index.scss';
export default [
{
key: 'dataBase-delete',
component: DeleteView
}
];
.ig-execute-progress {
.amos-progress {
margin-bottom: 12px;
&.amos-progress-status-exception {
.amos-progress-bg {
background-color: red;
border-radius: 0;
}
}
.amos-progress-inner {
background-image: linear-gradient(180deg, #eaeaea 0%, white 100%);
border: 1px solid #e6e6e6;
border-radius: 0;
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16);
}
.amos-progress-bg {
background-color: #25ae16;
border-radius: 0;
}
}
&-switch {
margin-bottom: 18px;
}
&-content {
height: 300px;
padding: 15px 18px;
overflow-y: auto;
font-size: 13px;
line-height: 20px;
color: #0060ff;
border: 1px solid #e2e2e2;
}
}
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { BarGroup, IconButton, briskWarningTip } from 'amos-designer';
import { Icon } from 'amos-framework';
import { api } from '@gm/graphmod-utils';
import { Icon, Switch } from 'amos-framework';
import { templateDownload, deleteByAgencyCode, exportByAgencyCode } from '../api';
import { connectGlobalPage } from '@gm/graphmod-common';
import ExecuteProgress from './ExecuteProgress';
import { LocationParam } from 'amos-tool';
const { tempDownload } = api;
/**
* 导出sql脚本模块
* @class DownloadView
......@@ -17,8 +16,10 @@ const { tempDownload } = api;
testDataConfig: {
// resourceCode: 'StudioApplication', // 标识
// dimension: 'appSeq', // 字段
// appSeq: '1620614032232841218',
// mqttUrl: 'ws://172.16.3.18:8088/mqtt'
// appSeq: '1688479372626911235',
// mqttUrl: 'ws://172.16.3.18:8088/mqtt',
// type: 'exportAgency',
// position: 'header'
}
})
class DownloadView extends Component {
......@@ -45,42 +46,119 @@ class DownloadView extends Component {
handleItemClick = () => {
const { selectedRowKeys = [], dataConfig, record } = this.props;
const ipSeq = LocationParam.getLocationParamByName('ipSeq')
let ipSeq = null;
let agencyCode = null;
let sequenceNbrs = null;
switch (dataConfig.type) {
case 'deleteAgency':
agencyCode = LocationParam.getLocationParamByName('agencyCode');
break;
case 'exportAgency':
agencyCode = LocationParam.getLocationParamByName('agencyCode');
break;
case 'export':
ipSeq = LocationParam.getLocationParamByName('ipSeq');
break;
}
if (selectedRowKeys.length > 0 || record) {
this.setState({ selectId: selectedRowKeys.length === 0 ? record.id ?? record.sequenceNbr : selectedRowKeys[0], logsVisible: true }, () => {
this.setState({ selectId: selectedRowKeys.length === 0 ? record.id ?? record.sequenceNbr : selectedRowKeys[0], logsVisible: true }, () => {
if (dataConfig.dimension && (selectedRowKeys.length > 0 || record)) {
dataConfig[dataConfig.dimension] = (record ? record.id ?? record.sequenceNbr : null) || selectedRowKeys.join(',');
tempDownload({ resourceCode: dataConfig.resourceCode, dimension: dataConfig.dimension, [dataConfig.dimension]: dataConfig[dataConfig.dimension],ipSeq});
switch (dataConfig.type) {
case 'deleteAgency': {
sequenceNbrs = dataConfig[dataConfig.dimension];
deleteByAgencyCode(agencyCode, sequenceNbrs);
}
break;
case 'exportAgency': {
sequenceNbrs = dataConfig[dataConfig.dimension];
exportByAgencyCode(agencyCode,sequenceNbrs);
}
break;
case 'export':
templateDownload({ resourceCode: dataConfig.resourceCode, dimension: dataConfig.dimension, [dataConfig.dimension]: dataConfig[dataConfig.dimension], ipSeq });
break;
}
}
});
} else {
briskWarningTip('至少选择一行数据');
}
// this.setState({ selectId: dataConfig[dataConfig.dimension], logsVisible: true }, () => {
// switch (dataConfig.type) {
// case 'deleteAgency':
// {
// sequenceNbrs = dataConfig[dataConfig.dimension];
// deleteByAgencyCode(agencyCode, sequenceNbrs);
// }
// break;
// case 'exportAgency':
// {
// sequenceNbrs = dataConfig[dataConfig.dimension];
// exportByAgencyCode(agencyCode,sequenceNbrs);
// }
// break;
// case 'export':
// templateDownload({ resourceCode: dataConfig.resourceCode, dimension: dataConfig.dimension, [dataConfig.dimension]: dataConfig[dataConfig.dimension], ipSeq });
// break;
// }
// });
};
render() {
const { dataConfig = {} } = this.props;
const { logsVisible, selectId } = this.state;
return (
<div>
{dataConfig.position === 'header' ?
<div className="ig-stage-toolbar-right">
<BarGroup label="导出脚本" mode="none" position="right">
<IconButton colorful icon="export" title="导出SQL脚本" style={{ borderRadius: 4 }} onClick={() => this.handleItemClick()} />
</BarGroup>
switch (dataConfig.type) {
case 'deleteAgency':
return (
<div>
{dataConfig.position === 'header' ?
<div className="ig-stage-toolbar-right">
<BarGroup label="删除" mode="none" position="right">
<IconButton colorful icon="delete" title="删除" style={{ borderRadius: 4 }} onClick={() => this.handleItemClick()} />
</BarGroup>
</div>
:
<p onClick={this.handleItemClick}><Icon icon="download" />删除</p>}
<ExecuteProgress visible={logsVisible} mqttUrl={dataConfig.mqttUrl} exeId={selectId} onClose={() => this.handleClose('logsVisible')} />
</div>
:
<p onClick={this.handleItemClick}><Icon icon="download" />下载</p>
}
{/* <DownloadModel
visible={downloadVisible}
onClose={() => this.handleClose('downloadVisible')}
handleOpen={() => this.handleOpen()}
dataConfig={dataConfig}
/> */}
<ExecuteProgress visible={logsVisible} mqttUrl={dataConfig.mqttUrl} exeId={selectId} onClose={() => this.handleClose('logsVisible')} />
</div>
);
);
case 'exportAgency':
return (
<div>
{dataConfig.position === 'header' ?
<div className="ig-stage-toolbar-right">
<BarGroup label="导出脚本" mode="none" position="right">
<IconButton colorful icon="export" title="导出SQL脚本" style={{ borderRadius: 4 }} onClick={() => this.handleItemClick()} />
</BarGroup>
</div>
:
<p onClick={this.handleItemClick}><Icon icon="download" />下载</p>}
<ExecuteProgress visible={logsVisible} mqttUrl={dataConfig.mqttUrl} exeId={selectId} onClose={() => this.handleClose('logsVisible')} />
</div>
);
case 'export':
return (
<div>
{dataConfig.position === 'header' ?
<div className="ig-stage-toolbar-right">
<BarGroup label="导出脚本" mode="none" position="right">
<IconButton colorful icon="export" title="导出SQL脚本" style={{ borderRadius: 4 }} onClick={() => this.handleItemClick()} />
</BarGroup>
</div>
:
<p onClick={this.handleItemClick}><Icon icon="download" />下载</p>}
<ExecuteProgress visible={logsVisible} mqttUrl={dataConfig.mqttUrl} exeId={selectId} onClose={() => this.handleClose('logsVisible')} />
</div>
);
}
}
}
......
......@@ -4,11 +4,9 @@ import './index.scss';
import './cssvar.scss';
import Download from './download';
import Shifting from './siftingSort';
import demo1 from './demo1';
const IMods = [
...Download,
...demo1,
...Shifting
];
......
const proxy = {
'/baseURI': {
target: 'http://172.16.3.18:10005/',
// '/baseURI': {
// target: 'http://172.16.3.18:10005/',
// pathRewrite: { '^/baseURI': '' }
// },
'/baseURI/atl': {
target: 'http://39.98.45.134:50090/',
pathRewrite: { '^/baseURI': '' }
},
'/bizURI/atl': {
......
......@@ -37,7 +37,7 @@ export const UrlConsts = {
processListUrl: () => completePrefix(baseURI, 'workflow/processDefinition/list/all'), // 获取所有的的流程
getFlowUrl: () => completePrefix(baseURI, 'workflow/processDefinition/image?processDefinitionId={processDefinitionId}'), // 根据流程实例id获取流程图 get
remoteUrl: completePrefix(baseURI, 'morphic/biz/url'), // 请求第三方系统 api, post,需要传入第三方api 地址
generateSqlUrl: url => completePrefix(baseURI, 'atl/v1/dataApi/generateSQL') // 通用导出SQL脚本 get
generateSqlUrl: url => completePrefix(baseURI, 'studio/v1/dataApi/generateSQL') // 通用导出SQL脚本 get
};
/**
* 根据字典标识获取字典列表
......@@ -232,9 +232,3 @@ export const templateDownload = (params) => {
return fileDownload({ url: formatObjUrl({ url: UrlConsts.generateSqlUrl(), filter: params }) });
};
/**
* 通用应用、数据SQL脚本
*/
export const tempDownload = (params) => {
return fileDownload({ url: formatObjUrl({ url: UrlConsts.generateSqlUrl(), filter: params }) });
};
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