Commit 1242a8be authored by 邓超's avatar 邓超

Merge branch 'master' of https://g.civnet.cn:8443/ReactWeb5/maintenance

# Conflicts: # src/pages/dataCenter/dictionary/index.js # src/pages/dataCenter/dictionary/index.less # src/routes/config.js
parents b9cdf6ca d0f77ef8
Pipeline #42522 skipped with stages
......@@ -21,11 +21,7 @@ import {
CM_XWBPlan_DataList,
} from '@/services/maintenance/api';
import { CM_Event_LoadDepartmentAndRoles } from '@/services/standingBook/api';
import {
PlusOutlined,
DownOutlined,
StepForwardFilled,
} from '@ant-design/icons';
import { PlusOutlined, DownOutlined, StepForwardFilled } from '@ant-design/icons';
import ChangeAdd from './ChangeAdd';
const { Option } = Select;
......@@ -45,9 +41,9 @@ const AddModal = props => {
const [filed, setFiled] = useState({}); // 传给子组件列表数据
const [filed1, setFiled1] = useState({}); // 传给子组件列表数据
const [types, setTypes] = useState(''); // 弹窗类型
const [pickItem, setPickItem] = useState(''); //复选框数据填入项
const [checkedList1, setCheckedList1] = useState([]); //最新选择数据
const [characterValue, setCharacterValue] = useState(''); //打开弹框之前数据
const [pickItem, setPickItem] = useState(''); // 复选框数据填入项
const [checkedList1, setCheckedList1] = useState([]); // 最新选择数据
const [characterValue, setCharacterValue] = useState(''); // 打开弹框之前数据
const [ff, setFf] = useState([]);
const [form] = Form.useForm();
......@@ -368,10 +364,7 @@ const AddModal = props => {
</Menu>
}
>
<div
className={styles.linkDrowp}
onClick={e => e.preventDefault()}
>
<div className={styles.linkDrowp} onClick={e => e.preventDefault()}>
<DownOutlined
style={{
fontSize: '12px',
......@@ -396,11 +389,7 @@ const AddModal = props => {
},
]}
>
<Select
placeholder="选择计划执行周期"
onChange={changTable}
value={selectValue}
>
<Select placeholder="选择计划执行周期" onChange={changTable} value={selectValue}>
<Option value="一周一次">一周一次</Option>
<Option value="半月一次">半月一次</Option>
<Option value="一月一次">一月一次</Option>
......@@ -468,10 +457,7 @@ const AddModal = props => {
</Menu>
}
>
<div
className={styles.linkDrowp}
onClick={e => e.preventDefault()}
>
<div className={styles.linkDrowp} onClick={e => e.preventDefault()}>
<DownOutlined
style={{
fontSize: '12px',
......@@ -613,22 +599,14 @@ const AddModal = props => {
},
]}
>
<Select
placeholder="是否送审"
onChange={changTable1}
value={selectValue1}
>
<Select placeholder="是否送审" onChange={changTable1} value={selectValue1}>
<Option value="否"></Option>
<Option value="是"></Option>
</Select>
</Item>
</Col>
<Col span={23}>
<Item
label="台账过滤条件"
name="filterCondition"
labelCol={{ span: 4 }}
>
<Item label="台账过滤条件" name="filterCondition" labelCol={{ span: 4 }}>
<TextArea placeholder="设备对应的Scada台账名称,可多选" />
</Item>
</Col>
......@@ -641,6 +619,7 @@ const AddModal = props => {
newCheckedList={checkedList1}
isType={types}
filed={filed}
type={type}
filed1={filed1}
ff={ff}
pickItem={pickItem}
......
/* eslint-disable no-lonely-if */
/* eslint-disable eqeqeq */
import React, { useState, useEffect, PureComponent } from 'react';
import { Modal, Divider, Checkbox, Space, Button } from 'antd';
import styles from './maintenance.less';
......@@ -14,6 +16,7 @@ const ChangeAdd = props => {
pickItem,
characterValue,
ff,
type,
} = props;
const [checkedList, setCheckedList] = useState([]); // 选中的复选框内容
const [indeterminate, setIndeterminate] = useState(true); // 全选样式控制
......@@ -47,9 +50,7 @@ const ChangeAdd = props => {
const onSubmit = () => {
isType === 'rule'
? callBackSubmit(
`${
value === '无' || value === '' ? '' : `${value},`
}${checkValue.join(',')}`,
`${value === '无' || value === '' ? '' : `${value},`}${checkValue.join(',')}`,
)
: callBackSubmit({
checkedList,
......@@ -85,6 +86,7 @@ const ChangeAdd = props => {
useEffect(() => {
console.log(indeterminate);
if (type == 'edit') {
if (isType != '' && isType === 'add') {
let checkArr = [];
console.log(newCheckedList);
......@@ -94,9 +96,7 @@ const ChangeAdd = props => {
}
});
setCheckedList(checkArr);
setIndeterminate(
!!newCheckedList.length && newCheckedList.length < filed.length,
);
setIndeterminate(!!newCheckedList.length && newCheckedList.length < filed.length);
setCheckAll(newCheckedList.length === filed.length);
let newArr = characterValue.length ? characterValue.split(',') : [];
setSelectData(newArr);
......@@ -109,13 +109,40 @@ const ChangeAdd = props => {
}
});
setCheckedList(checkArr);
setIndeterminate(
!!newCheckedList.length && newCheckedList.length < ff.length,
);
setIndeterminate(!!newCheckedList.length && newCheckedList.length < ff.length);
setCheckAll(newCheckedList.length === ff.length);
let newArr = characterValue.length ? characterValue.split(',') : [];
setSelectData(newArr);
}
} else {
if (isType != '' && isType === 'add') {
let checkArr = [];
console.log(newCheckedList);
newCheckedList.map(checkItem => {
if (filed.includes(checkItem)) {
checkArr.push(checkItem);
}
});
setCheckedList(checkArr);
setIndeterminate(false);
setCheckAll(false);
let newArr = characterValue.length ? characterValue.split(',') : [];
setSelectData(newArr);
} else if (isType === 'app') {
let checkArr = [];
console.log(newCheckedList);
newCheckedList.map(checkItem => {
if (ff.includes(checkItem)) {
checkArr.push(checkItem);
}
});
setCheckedList(checkArr);
setIndeterminate(false);
setCheckAll(false);
let newArr = characterValue.length ? characterValue.split(',') : [];
setSelectData(newArr);
}
}
}, [visible]);
if (isType != 'app') {
......
......@@ -2,10 +2,7 @@
/* eslint-disable camelcase */
import React, { useState, useEffect } from 'react';
import { Space, Table, Popconfirm, Tooltip, Button, notification } from 'antd';
import {
CM_XWBPlan_DataList,
CM_XWBPlan_RemovePlan,
} from '@/services/maintenance/api';
import { CM_XWBPlan_DataList, CM_XWBPlan_RemovePlan } from '@/services/maintenance/api';
import { EditTwoTone, DeleteOutlined, PlusOutlined } from '@ant-design/icons';
import styles from './maintenance.less';
import AddModal from './AddModal';
......@@ -24,82 +21,231 @@ const maintenance = () => {
dataIndex: 'businessName',
key: 'businessName',
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '业务类型',
dataIndex: 'businessType',
key: 'businessType',
width: 100,
ellipsis: true,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '执行周期',
dataIndex: 'docycle',
key: 'docycle',
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '台账名称',
dataIndex: 'accountName',
key: 'accountName',
width: 200,
ellipsis: true,
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '反馈名称',
dataIndex: 'feedbackName',
key: 'feedbackName',
width: 200,
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '台账过滤条件',
dataIndex: 'filterCondition',
key: 'filterCondition',
width: 200,
ellipsis: true,
onCell: () => ({
style: {
maxWidth: 200,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '是否送审',
dataIndex: 'isSubmit',
key: 'isSubmit',
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '执行角色',
dataIndex: 'doRole',
key: 'doRole',
width: 200,
ellipsis: true,
width: 300,
onCell: () => ({
style: {
maxWidth: 300,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '预生成天数',
dataIndex: 'produceDays',
key: 'produceDays',
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '在线任务量',
dataIndex: 'onLines',
key: 'onLines',
width: 100,
ellipsis: true,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '启停',
dataIndex: 'doNot',
key: 'doNot',
width: 100,
onCell: () => ({
style: {
maxWidth: 100,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
align: 'center',
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '操作',
......@@ -109,10 +255,7 @@ const maintenance = () => {
render: (text, record) => (
<Space>
<Tooltip title="修改">
<EditTwoTone
onClick={() => editEventType(record)}
style={{ fontSize: '16px' }}
/>
<EditTwoTone onClick={() => editEventType(record)} style={{ fontSize: '16px' }} />
</Tooltip>
<Tooltip title="删除">
<Popconfirm
......@@ -206,8 +349,7 @@ const maintenance = () => {
dataSource={tableData}
scroll={{ y: 'calc(100vh - 215px)', x: 'max-content' }}
pagination={{
showTotal: (total, range) =>
`第${range[0]}-${range[1]} 条/共 ${total} 条`,
showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条`,
pageSizeOptions: [10, 20, 50, 100],
defaultPageSize: 20,
showQuickJumper: true,
......
.maintenanceContainer{
.maintenanceContainer {
.ant-card-body {
padding: 12px 24px 24px 24px;
}
.pickItem{
background-color: #F5F6F9;
.pickItem {
background-color: #f5f6f9;
}
}
.formData{
.formData {
height: 38rem;
overflow-y: scroll;
.ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before{
.ant-form-item-label
> label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before {
display: none;
}
.formData_label{
.formData_label {
display: flex;
align-items: center;
}
.filed_listItem{
.filed_listItem {
display: flex;
height: 3.6rem;
.ant-btn-icon-only {
......@@ -33,7 +33,7 @@
}
}
}
.linkDrowp{
.linkDrowp {
position: absolute;
top: 0px;
left: 93.5%;
......@@ -42,36 +42,35 @@
display: flex;
align-items: center;
}
.listItem{
.listItem {
display: flex;
justify-content: space-between;
font-size: 14px;
font-weight: 400;
color: #414E65;
color: #414e65;
cursor: pointer;
line-height: 28px;
align-items: center;
padding: 8px 14px;
}
.ant-select-arrow .anticon {
vertical-align: middle;
}
.listCard{
.listCard {
display: flex;
.cardItem{
.cardItem {
padding: 0.5rem;
}
.cardContent{
.cardContent {
height: 30rem;
overflow-y: scroll;
width: 100%;
}
.cardItemData{
display:inline-block;
.cardItemData {
display: inline-block;
padding: 0.5rem;
border: 1px solid #b5b8c8;
width:100%;
width: 100%;
// height: 30rem;
overflow-y: scroll;
}
......
......@@ -231,15 +231,6 @@ const FlowNode = () => {
<span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>{text}</span>
),
},
{
title: '发送短信',
dataIndex: 'IsSendMessage',
align: 'center',
width: 80,
render: (text, record) => (
<span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>{text}</span>
),
},
{
title: '操作',
align: 'center',
......@@ -389,11 +380,6 @@ const FlowNode = () => {
align: 'center',
width: 80,
},
{
title: '发送短信',
align: 'center',
width: 80,
},
{
title: '操作',
align: 'center',
......
......@@ -948,34 +948,34 @@ const WebDic = () => {
fieldKey={[fieldKey, 'frist']}
rules={[
{ required: true, message: '不能为空' },
// {
// validator: (rule, value, callback) => {
// const nodeName = addForm.getFieldsValue().nodeName1; // 第一项的nodeName
// const nodeName1 = addForm.getFieldsValue();
// console.log(nodeName);
// let result = nodeName1.users;
// let arr = [];
// // eslint-disable-next-line array-callback-return
// result.map(item => {
// if (item) {
// let a = item.nodeName;
// if (a !== '') {
// arr.push(a);
// }
// }
// });
// if (nodeName !== undefined) {
// arr.unshift(nodeName);
// }
{
validator: (rule, value, callback) => {
const nodeName = addForm.getFieldsValue().nodeName1; // 第一项的nodeName
const nodeName1 = addForm.getFieldsValue();
console.log(nodeName);
let result = nodeName1.users;
let arr = [];
// eslint-disable-next-line array-callback-return
result.map(item => {
if (item) {
let a = item.nodeName;
if (a !== '') {
arr.push(a);
}
}
});
if (nodeName !== undefined) {
arr.unshift(nodeName);
}
// console.log(arr);
// if (new Set(arr).size !== arr.length) {
// arr = [...new Set(arr)];
// console.log(arr);
// callback('用户名重复');
// }
// },
// },
console.log(arr);
if (new Set(arr).size !== arr.length) {
arr = [...new Set(arr)];
console.log(arr);
callback('用户名重复');
}
},
},
]}
>
<Input placeholder="请输入名称" />
......
......@@ -2,7 +2,7 @@
* @Description:
* @Author: leizhe
* @Date: 2021-07-13 16:32:28
* @LastEditTime: 2021-10-26 16:38:27
* @LastEditTime: 2022-01-11 15:57:28
* @LastEditors: leizhe
*/
import React from 'react';
......@@ -13,10 +13,10 @@ import AppDic from './AppDic';
import styles from './index.less';
// import VersionPublish from './VersionPublish';
const dictionary1 = () => {
const dictionary = () => {
const { TabPane } = Tabs;
return (
<PageContainer className={styles.dictionary1Container}>
<PageContainer className={styles.dictionaryContainer}>
<Card>
<Tabs defaultActiveKey="1">
<TabPane tab="通用数据字典" key="1">
......@@ -31,4 +31,4 @@ const dictionary1 = () => {
);
};
export default dictionary1;
export default dictionary;
.dictionary1Container{
.dictionaryContainer {
.ant-card-body {
padding: 0px 24px 24px 17px;
}
......
/* eslint-disable indent */
import React, { useState, useEffect } from 'react';
import { Form, Modal, Input, Select, AutoComplete, Button, notification, message, Card } from 'antd';
import styles from '../dimensionsConfig.less'
import {
AddVectorData,
publisService, GetProjectNames
} from '@/services/webConfig/api';
Form,
Modal,
Input,
Select,
AutoComplete,
Button,
notification,
message,
Card,
Space,
} from 'antd';
import styles from '../dimensionsConfig.less';
import { AddVectorData, publisService, GetProjectNames } from '@/services/webConfig/api';
import {
PlusCircleOutlined, CloseCircleOutlined
PlusCircleOutlined,
CloseCircleOutlined,
PlusOutlined,
MinusCircleOutlined,
} from '@ant-design/icons';
const { Option } = Select;
const AddModal = props => {
const { callBackSubmit = () => { }, type, formObj, visible } = props;
const { callBackSubmit = () => {}, type, formObj, visible } = props;
const [loading, setLoading] = useState(false);
const [attributes, setAttributes] = useState([])
const [attributes, setAttributes] = useState([]);
const [workList, setWorkList] = useState([]);
const [allData, setAllData] = useState([]);
const [gsIp, setGsIp] = useState([]);
const [ports,setPorts]= useState('');
const [ports, setPorts] = useState('');
const [projectNmme, setProjectNmme] = useState([]);
const [loadingProject,setLoadingProject] =useState(false)
const [loadingProject, setLoadingProject] = useState(false);
const [form] = Form.useForm();
const { Item } = Form;
// 提交
......@@ -29,22 +41,26 @@ const AddModal = props => {
if (validate) {
setLoading(true);
let obj = form.getFieldsValue();
let attributesObj = {}
let attributesObj = {};
attributes.map((item, index) => {
let key = obj[`key${index}`]
attributesObj[`${key}`] = obj[`value${index}`]
})
let key = obj[`key${index}`];
attributesObj[`${key}`] = obj[`value${index}`];
});
if (type === 'add') {
let url =allData[obj.name].fileName?`http://${obj.ip}:${obj.port}/${obj.projectName}/${obj.name}/${allData[obj.name].fileName}`:`http://${obj.ip}:${obj.port}/${obj.projectName}/${obj.name}`
let url = allData[obj.name].fileName
? `http://${obj.ip}:${obj.port}/${obj.projectName}/${obj.name}/${
allData[obj.name].fileName
}`
: `http://${obj.ip}:${obj.port}/${obj.projectName}/${obj.name}`;
let query = {
type: obj.type,
projectName: obj.projectName,
name: obj.name,
url,
attributes: attributesObj ||{},
attributes: attributesObj || {},
ip: obj.ip,
port: obj.port
}
port: obj.port,
};
AddVectorData(query)
.then(res => {
setLoading(false);
......@@ -56,7 +72,7 @@ const AddModal = props => {
duration: 3,
description: '新增成功',
});
handlelocalStorage('add', obj.ip, obj.projectName)
handlelocalStorage('add', obj.ip, obj.projectName);
} else {
notification.error({
message: '提示',
......@@ -78,9 +94,7 @@ const AddModal = props => {
});
};
const onFinish = value => { };
const onFinish = value => {};
useEffect(() => {
switch (type) {
case 'add':
......@@ -89,16 +103,16 @@ const AddModal = props => {
if (localStorageData) {
gsIp = localStorageData.map(item => ({
value: item.gsIp,
item: item.gsIp
item: item.gsIp,
}));
}
setGsIp(gsIp)
setAttributes([])
setProjectNmme([])
setWorkList([])
setPorts('')
let localIps = ['192.168.12.97']
let port = localIps.includes(gsIp) ? '8083' : '8088'
setGsIp(gsIp);
setAttributes([]);
setProjectNmme([]);
setWorkList([]);
setPorts('');
let localIps = ['192.168.12.97'];
let port = localIps.includes(gsIp) ? '8083' : '8088';
form.resetFields();
break;
case 'edit':
......@@ -112,7 +126,7 @@ const AddModal = props => {
//存储到localstorage
const handlelocalStorage = (type, gsIp, gisAppName) => {
if (!localStorage) return null;
let result = JSON.parse(localStorage.getItem('metaData'))
let result = JSON.parse(localStorage.getItem('metaData'));
if (type == 'get') {
return result;
}
......@@ -120,22 +134,24 @@ const AddModal = props => {
if (!result) result = [];
result.push({
gsIp,
gisAppName: [{
gisAppName: [
{
value: gisAppName,
item: gisAppName
}]
})
localStorage.setItem('metaData', JSON.stringify(result))
return
item: gisAppName,
},
],
});
localStorage.setItem('metaData', JSON.stringify(result));
return;
}
let data = result.find(item => item.gsIp == gsIp)
let data = result.find(item => item.gsIp == gsIp);
let isHasGisAppName = data.gisAppName.find(item => item.value == gisAppName);
if (isHasGisAppName) return;
data.gisAppName.push({
value: gisAppName,
item: gisAppName
})
localStorage.setItem('metaData', JSON.stringify(result))
item: gisAppName,
});
localStorage.setItem('metaData', JSON.stringify(result));
};
const layout = {
......@@ -144,47 +160,44 @@ const AddModal = props => {
span: 4,
},
wrapperCol: {
span: 16,
span: 17,
},
};
const selectIp = (value) => {
let localIps = ['192.168.12.97']
let port = localIps.includes(value) ? '8083' : '8088'
const selectIp = value => {
let localIps = ['192.168.12.97'];
let port = localIps.includes(value) ? '8083' : '8088';
form.setFieldsValue({ port, serviceadress: value });
setPorts(port)
}
setPorts(port);
};
// 获取项目名
const getProject = () => {
const obj = form.getFieldsValue();
if (obj.ip && obj.port) {
setLoadingProject(true)
GetProjectNames({ ip: obj.ip, port: obj.port }).then(res => {
setLoadingProject(false)
setLoadingProject(true);
GetProjectNames({ ip: obj.ip, port: obj.port })
.then(res => {
setLoadingProject(false);
if (res.msg === 'Ok') {
if(res.data=='{}'){
if (res.data == '{}') {
notification.info({
message: '提示',
duration: 3,
description: '该地址下项目为空',
});
}
else{
} else {
notification.success({
message: '提示',
duration: 3,
description: '获取成功',
});
let data = Object.values(JSON.parse(res.data))
setProjectNmme(data)
let data = Object.values(JSON.parse(res.data));
setProjectNmme(data);
if (data.length) {
form.setFieldsValue({ projectName: data[0] });
selectProject(data[0])
selectProject(data[0]);
}
}
} else {
notification.error({
message: '提示',
......@@ -192,44 +205,44 @@ const AddModal = props => {
description: '获取失败',
});
}
}).catch(e => {
console.log('e', e);
})
.catch(e => {
console.log('e', e);
});
} else {
message.warning("未输入ip或port")
}
message.warning('未输入ip或port');
}
const selectProject = (value) => {
};
const selectProject = value => {
const obj = form.getFieldsValue();
GetProjectNames({ ip: obj.ip, port: obj.port, projectname: value }).then(response => {
let newArr = JSON.parse(response.data)
let workArr = Object.keys(newArr.data)
console.log('newArr',newArr);
console.log('workArr',workArr);
setAllData(newArr.data)
let newArr = JSON.parse(response.data);
let workArr = Object.keys(newArr.data);
console.log('newArr', newArr);
console.log('workArr', workArr);
setAllData(newArr.data);
if (workArr.length) {
setWorkList(workArr)
setWorkList(workArr);
form.setFieldsValue({ name: workArr[0], type: newArr.data[workArr[0]].type });
}
})
}
const selectName = (value) => {
});
};
const selectName = value => {
form.setFieldsValue({ type: allData[value].type });
}
};
const addExtra = () => {
let attributesArr = [...attributes]
attributesArr.push({})
setAttributes(attributesArr)
}
const deleteExtr = (index) => {
let attributesArr = [...attributes]
let attributesArr = [...attributes];
attributesArr.push({});
setAttributes(attributesArr);
};
const deleteExtr = index => {
let attributesArr = [...attributes];
attributesArr.splice(index, 1);
setAttributes(attributesArr)
}
const inputPort =(e)=>{
setPorts(e.target.value)
}
setAttributes(attributesArr);
};
const inputPort = e => {
setPorts(e.target.value);
};
return (
<Modal
title={`${type === 'add' ? '元数据发布' : '编辑'}`}
......@@ -247,27 +260,18 @@ const AddModal = props => {
getContainer={false}
>
{visible && (
<Form form={form} {...layout} onFinish={onFinish}>
<Item
label="IP"
name="ip"
rules={[{ required: true, message: '请选择ip地址' }]}
>
<AutoComplete
placeholder="请输入IP"
options={gsIp}
onSelect={selectIp}
/>
<Form form={form} {...layout} onFinish={onFinish} style={{ marginBottom: '20px' }}>
<Item label="IP" name="ip" rules={[{ required: true, message: '请选择ip地址' }]}>
<AutoComplete placeholder="请输入IP" options={gsIp} onSelect={selectIp} />
</Item>
<Item
label="端口"
name="port"
rules={[{ required: true, message: '请输入端口' }]}
>
<Item label="端口" name="port" rules={[{ required: true, message: '请输入端口' }]}>
<div className={styles.imgList}>
<Input placeholder="请输入GIS服务器端口" allowClear value={ports} onChange={inputPort} />
<Button style={{ marginLeft: '0.5rem' }} onClick={getProject} loading={loadingProject}>获取项目名</Button>
<Input
placeholder="请输入GIS服务器端口"
allowClear
value={ports}
onChange={inputPort}
/>
</div>
</Item>
<Item
......@@ -275,9 +279,20 @@ const AddModal = props => {
name="projectName"
rules={[{ required: true, message: '请选择项目名' }]}
>
<Select onChange={selectProject}>
{projectNmme.length ? projectNmme.map((item, index) => { return <Option key={index} value={item}>{item}</Option> }) : ''}
<Select onChange={selectProject} style={{ width: '351px' }}>
{projectNmme.length
? projectNmme.map((item, index) => {
return (
<Option key={index} value={item}>
{item}
</Option>
);
})
: ''}
</Select>
<Button style={{ marginLeft: '0.5rem' }} onClick={getProject} loading={loadingProject}>
获取项目名
</Button>
</Item>
<Item
label="数据源名"
......@@ -285,7 +300,15 @@ const AddModal = props => {
rules={[{ required: true, message: '请选择数据源名' }]}
>
<Select onChange={selectName}>
{workList.length ? workList.map((item, index) => { return <Option key={index} value={item}>{item}</Option> }) : ''}
{workList.length
? workList.map((item, index) => {
return (
<Option key={index} value={item}>
{item}
</Option>
);
})
: ''}
</Select>
</Item>
<Item
......@@ -295,34 +318,56 @@ const AddModal = props => {
>
<Input placeholder="请输入数据类型" allowClear disabled />
</Item>
<Button size="small" onClick={() => { addExtra() }}>
<Button
size="small"
style={{ width: '71%', marginLeft: '109px', lineHeight: '32px', height: '32px' }}
onClick={() => {
addExtra();
}}
>
新增额外属性
</Button>
<div style={{ maxHeight: '14rem', overflowY: 'scroll', marginTop: '0.2rem' }}>
{attributes.length ? attributes.map((item, index) => {
return <div key={index} className={styles.containerFileds}>
<div
style={{
maxHeight: '14rem',
overflowY: 'scroll',
marginTop: '0.2rem',
marginLeft: '66px',
width: '88%',
}}
>
{attributes.length
? attributes.map((item, index) => {
return (
<div key={index} className={styles.containerFileds}>
<Item
label="键"
name={`key${index}`}
style={{ width: '45%', marginTop: '24px' }}
style={{ width: '100%', marginTop: '24px' }}
>
<Input placeholder="" allowClear />
</Item>
<Item
label="值"
name={`value${index}`}
style={{ width: '45%', marginTop: '24px' }}
style={{ width: '100%', marginTop: '24px' }}
>
<Input placeholder="" allowClear />
</Item>
<CloseCircleOutlined
onClick={() => { deleteExtr(index) }}
onClick={() => {
deleteExtr(index);
}}
style={{
fontSize: '16px', color: 'red',
cursor: 'pointer'
}} />
fontSize: '16px',
color: 'red',
cursor: 'pointer',
}}
/>
</div>
}) : ''}
);
})
: ''}
</div>
</Form>
)}
......
import { Space, Table, Button, Popconfirm, notification, Spin } from 'antd';
import React, { useState, useEffect } from 'react';
import styles from '../dimensionsConfig.less'
import {
GetVectorDataList,DeleteVectorData,RefreshVectorData
} from '@/services/webConfig/api';
import AddModal from './AddModal'
import styles from '../dimensionsConfig.less';
import { GetVectorDataList, DeleteVectorData, RefreshVectorData } from '@/services/webConfig/api';
import AddModal from './AddModal';
// import PreviewModal from './VectorPreviewModal'
const VectorData = props => {
const [treeLoading, setTreeLoading] = useState(false);// 弹窗显示
const [treeLoading, setTreeLoading] = useState(false); // 弹窗显示
const [tileData, setTileData] = useState([]); // table表格数据
const [visible, setVisible] = useState(false); // 弹窗
const [flag, setFlag] = useState(0); // 更新list
......@@ -19,45 +17,49 @@ const VectorData = props => {
title: '项目名',
dataIndex: 'projectName',
key: 'projectName',
align: 'center'
align: 'center',
},
{
title: 'IP',
dataIndex: 'ip',
key: 'ip',
align: 'center'
align: 'center',
},
{
title: '端口',
dataIndex: 'port',
key: 'port',
align: 'center'
align: 'center',
},
{
title: '数据源名',
dataIndex: 'name',
key: 'name',
align: 'center'
align: 'center',
},
{
title: '类型',
dataIndex: 'type',
key: 'type',
align: 'center'
align: 'center',
},
{
title: '发布时间',
dataIndex: 'publishDatetime',
key: 'publishDatetime',
align: 'center'
align: 'center',
},
{
title: '编辑',
align: 'center',
render: (text, record, index) => (
<Space>
<Button type="primary" size="small" loading={loading[index]} onClick={() => enterLoading(record, index)}>
<Button
type="primary"
size="small"
loading={loading[index]}
onClick={() => enterLoading(record, index)}
>
更新
</Button>
<div onClick={e => e.stopPropagation()}>
......@@ -77,23 +79,23 @@ const VectorData = props => {
</Space>
),
},
];
//更新
// 更新
const enterLoading = (record, index) => {
const newLoadings = [...loading];
newLoadings[index] = true
setLoading(newLoadings)
newLoadings[index] = true;
setLoading(newLoadings);
let query = {
id: record.id,
}
};
RefreshVectorData(query).then(res => {
RefreshVectorData(query)
.then(res => {
const newLoadings = [...loading];
newLoadings[index] = false
setLoading(newLoadings)
if (res.msg==='') {
setFlag(flag + 1)
newLoadings[index] = false;
setLoading(newLoadings);
if (res.msg === '') {
setFlag(flag + 1);
notification.success({
message: '提示',
duration: 3,
......@@ -105,30 +107,28 @@ const VectorData = props => {
duration: 3,
description: res.msg,
});
};
}).catch(err => {
}
})
.catch(err => {
const newLoadings = [...loading];
newLoadings[index] = false
setLoading(newLoadings)
newLoadings[index] = false;
setLoading(newLoadings);
notification.error({
message: '提示',
duration: 3,
description: '服务无法访问',
});
})
}
});
};
const onSubmit = prop => {
setVisible(false);
setFlag(flag + 1)
setFlag(flag + 1);
};
const delConfirm = (record) => {
const delConfirm = record => {
DeleteVectorData(record.id).then(res => {
if (res.msg==='') {
setFlag(flag + 1)
if (res.msg === '') {
setFlag(flag + 1);
notification.success({
message: '提示',
duration: 3,
......@@ -140,27 +140,26 @@ const VectorData = props => {
duration: 3,
description: '删除元数据失败',
});
};
})
}
});
};
const handleAdd = () => {
setType('add');
setVisible(true);
}
};
useEffect(() => {
renderTile();
}, [flag]);
// 获取瓦片数据配置数据
const renderTile = () => {
setTreeLoading(true);
GetVectorDataList().then(
res => {
GetVectorDataList().then(res => {
if (res.msg === 'Ok') {
let arr = []
let arr = [];
res.data.map(item => {
arr.push(false)
})
setLoading(arr)
arr.push(false);
});
setLoading(arr);
setTreeLoading(false);
setTileData(res.data);
} else {
......@@ -170,19 +169,19 @@ const VectorData = props => {
description: res.message,
});
}
}
)
});
};
return (
<>
<Spin tip="loading..." spinning={treeLoading}>
<div className={styles.tileBtn}>
<Button type="primary" onClick={() => {
<Button
type="primary"
onClick={() => {
handleAdd();
}} >
}}
>
新增
</Button>
</div>
......@@ -190,15 +189,12 @@ const VectorData = props => {
columns={columns}
dataSource={tileData}
bordered
rowKey='id'
rowKey="id"
scroll={{ y: 400 }}
pagination={{
showTotal: (total, range) =>
`第${range[0]}-${range[1]} 条/共 ${total} 条`
showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条`,
}}
>
</Table>
/>
<AddModal
visible={visible}
onCancel={() => setVisible(false)}
......@@ -206,9 +202,8 @@ const VectorData = props => {
type={type}
formObj={formObj}
/>
</Spin>
</>
)
}
export default VectorData
\ No newline at end of file
);
};
export default VectorData;
import { Tabs, Button } from 'antd';
import React, { useState, useEffect } from 'react';
import PageContainer from '@/components/BasePageContainer';
import styles from './dimensionsConfig.less'
import styles from './dimensionsConfig.less';
import TileConfig from './TileConfig/TileConfig';
import VectorData from './VectorData/VectorData';
import ProjectMessage from './projectMessage/projectMessage';
......@@ -10,32 +10,30 @@ import SolutionConfig from './solutionConfig/solutionConfig';
const { TabPane } = Tabs;
const SchemeConfig = () => {
const [activekey,setActiveKey] =useState('1')
const callback = (index) => {
setActiveKey(index)
}
const [activekey, setActiveKey] = useState('1');
const callback = index => {
setActiveKey(index);
};
return (
<PageContainer>
<div className={styles.container3d} activekey={activekey}>
<Tabs onChange={callback} type="card">
<TabPane tab="瓦片数据配置" key="1">
{activekey==='1'?<TileConfig />:''}
{activekey === '1' ? <TileConfig /> : ''}
</TabPane>
<TabPane tab="数据源配置" key="2">
{activekey==='2'?<VectorData />:''}
{activekey === '2' ? <VectorData /> : ''}
</TabPane>
<TabPane tab="方案管理" key="3">
{activekey==='3'?<ProjectMessage />:''}
{activekey === '3' ? <ProjectMessage /> : ''}
</TabPane>
<TabPane tab="方案配置" key="4">
{activekey==='4'?<SolutionConfig />:''}
{activekey === '4' ? <SolutionConfig /> : ''}
</TabPane>
</Tabs>
</div>
</PageContainer>
)
}
);
};
export default SchemeConfig;
.container3d{
.container3d {
width: 100%;
background-color: #ffffff;
......@@ -12,7 +12,7 @@
color: rgba(0, 0, 0, 0.85);
}
overflow-y: scroll;
.ant-input-number-input{
.ant-input-number-input {
background-color: #ffffff;
color: #000000;
}
......@@ -20,37 +20,37 @@
padding: 12px 24px 24px 25px;
}
}
.imgList{
.imgList {
display: flex;
flex-wrap: wrap;
}
.imgItem{
.imgItem {
display: flex;
flex-direction: column;
align-items: center;
margin:0 1rem 1rem 0;
margin: 0 1rem 1rem 0;
}
.tileBtn{
.tileBtn {
display: flex;
justify-content: flex-end;
width: 100%;
padding: 0 0 2rem
padding: 0 0 2rem;
}
.schemeName{
.schemeName {
margin-right: 0.8rem;
font-weight: bold;
}
.schemeItem,.schemeBtn{
.schemeItem,
.schemeBtn {
display: flex;
align-items: center;
}
.schemeBtn{
.schemeBtn {
width: 12rem;
justify-content: center;
}
.mapItem{
.mapItem {
display: flex;
border: 1px solid #ccc;
border-radius: 4px;
......@@ -59,7 +59,7 @@
margin: 0.5rem 0;
width: 14.5rem;
}
.defaultTile{
.defaultTile {
background: #ccc;
color: white;
cursor: pointer;
......@@ -68,20 +68,19 @@
align-items: center;
width: 3rem;
justify-content: center;
}
.mapText{
.mapText {
width: 10rem;
text-align: center;
}
.mapIcon{
.mapIcon {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.activeTile{
background-color: #4699f4
.activeTile {
background-color: #4699f4;
}
.dropList {
position: absolute;
......@@ -90,31 +89,31 @@
color: rgba(0, 0, 0, 0.25);
z-index: 99;
}
.divider{
.divider {
display: flex;
align-items: center;
line-height: 100%;
padding: 0.5rem;
.dividerIcon{
.dividerIcon {
margin-left: 0.8rem;
color: #4699f4;
cursor: pointer;
}
}
.cardsList{
.cardsList {
display: flex;
flex-wrap: wrap;
}
.cardItem{
}
.cardItem {
width: 18rem;
height: 26rem;
margin: 0 2rem;
}
.containerFileds{
}
.containerFileds {
display: flex;
justify-content: space-between;
width: 98%;
border:1px solid #f0f0f0;
margin-top: 1rem;
border: 1px solid #f0f0f0;
margin-top: 0.5rem;
}
import { Tabs, Button } from 'antd';
import React from 'react';
import PageContainer from '@/components/BasePageContainer';
import styles from './SchemeConfig.less'
import styles from './SchemeConfig.less';
import TileConfig from './TileConfig/TileConfig';
import VectorData from './VectorData/VectorData';
import ProjectMessage from './projectMessage/projectMessage';
......@@ -10,10 +10,7 @@ import SolutionConfig from './solutionConfig/solutionConfig';
const { TabPane } = Tabs;
const SchemeConfig = () => {
const callback = () => {
}
const callback = () => {};
return (
<PageContainer>
......@@ -29,13 +26,11 @@ const SchemeConfig = () => {
<ProjectMessage />
</TabPane>
<TabPane tab="方案配置" key="4">
<SolutionConfig/>
<SolutionConfig />
</TabPane>
</Tabs>
</div>
</PageContainer>
)
}
);
};
export default SchemeConfig;
import React, { useState, useEffect } from 'react';
import { Form, Modal, Input, Select, AutoComplete, Button, notification } from 'antd';
import styles from '../SchemeConfig.less'
import {
GetGISServerMapList,
publisService
} from '@/services/webConfig/api';
import styles from '../SchemeConfig.less';
import { GetGISServerMapList, publisService } from '@/services/webConfig/api';
const { Option } = Select;
const AddModal = props => {
const { callBackSubmit = () => { }, type, formObj, visible,solutionNames } = props;
const { callBackSubmit = () => {}, type, formObj, visible, solutionNames } = props;
const [loading, setLoading] = useState(false);
const [workSpace, setWorkSpace] = useState('');
const [serviceName, setServicename] = useState([{
const [serviceName, setServicename] = useState([
{
value: 'geoserver',
item: 'geoserver'
}]);
item: 'geoserver',
},
]);
const [workList, setWorkList] = useState([]);
const [gsIp, setGsIp] = useState([]);
const [form] = Form.useForm();
......@@ -38,8 +36,8 @@ const AddModal = props => {
gsPwd: obj.password,
serviceName: obj.name,
solution: solutionNames,
}
publisService(query,{timeout:120000})
};
publisService(query, { timeout: 120000 })
.then(res => {
setLoading(false);
if (res.success) {
......@@ -50,8 +48,8 @@ const AddModal = props => {
duration: 3,
description: '新增成功',
});
setWorkList([])
handlelocalStorage('add',obj.serviceadress, obj.servicename)
setWorkList([]);
handlelocalStorage('add', obj.serviceadress, obj.servicename);
} else {
notification.error({
message: '提示',
......@@ -73,9 +71,7 @@ const AddModal = props => {
});
};
const onFinish = value => { };
const onFinish = value => {};
useEffect(() => {
switch (type) {
case 'add':
......@@ -84,12 +80,12 @@ const AddModal = props => {
if (localStorageData) {
gsIp = localStorageData.map(item => ({
value: item.gsIp,
item: item.gsIp
item: item.gsIp,
}));
}
setGsIp(gsIp)
let localIps = ['192.168.12.7', '192.168.19.100']
let port = localIps.includes(gsIp) ? 8080 : 8088
setGsIp(gsIp);
let localIps = ['192.168.12.7', '192.168.19.100'];
let port = localIps.includes(gsIp) ? 8080 : 8088;
form.setFieldsValue({ servicename: serviceName[0].value, port, ...formObj });
break;
case 'edit':
......@@ -103,7 +99,7 @@ const AddModal = props => {
//存储到localstorage
const handlelocalStorage = (type, gsIp, gisAppName) => {
if (!localStorage) return null;
let result = JSON.parse(localStorage.getItem('metaData'))
let result = JSON.parse(localStorage.getItem('metaData'));
if (type == 'get') {
return result;
}
......@@ -111,22 +107,24 @@ const AddModal = props => {
if (!result) result = [];
result.push({
gsIp,
gisAppName: [{
gisAppName: [
{
value: gisAppName,
item: gisAppName
}]
})
localStorage.setItem('metaData', JSON.stringify(result))
return
item: gisAppName,
},
],
});
localStorage.setItem('metaData', JSON.stringify(result));
return;
}
let data = result.find(item => item.gsIp == gsIp)
let data = result.find(item => item.gsIp == gsIp);
let isHasGisAppName = data.gisAppName.find(item => item.value == gisAppName);
if (isHasGisAppName) return;
data.gisAppName.push({
value: gisAppName,
item: gisAppName
})
localStorage.setItem('metaData', JSON.stringify(result))
item: gisAppName,
});
localStorage.setItem('metaData', JSON.stringify(result));
};
const layout = {
......@@ -139,11 +137,12 @@ const AddModal = props => {
},
};
//选择工作空间
const selectWorkspace = () => {
let obj = form.getFieldsValue();
form.validateFields(['serviceadress', 'port', 'servicename', 'user', 'password']).then(validate => {
form
.validateFields(['serviceadress', 'port', 'servicename', 'user', 'password'])
.then(validate => {
if (validate) {
let query = {
GISServerIP: obj.serviceadress,
......@@ -153,41 +152,37 @@ const AddModal = props => {
gsPwd: obj.password,
isGeoServer: true,
_version: 9999,
}
};
GetGISServerMapList(query).then(res => {
if (Array.isArray(res.data)) {
const defaultValue= res.data[0]||''
form.setFieldsValue({ name:defaultValue,workname:defaultValue});
setWorkList(res.data)
setWorkSpace(defaultValue)
}
else {
const defaultValue = res.data[0] || '';
form.setFieldsValue({ name: defaultValue, workname: defaultValue });
setWorkList(res.data);
setWorkSpace(defaultValue);
} else {
notification.error({
message: '提示',
duration: 3,
description: '获取工作空间失败',
});
}
})
});
}
})
});
};
//选择工作空间
const handleWorkspace = (value) => {
const handleWorkspace = value => {
form.setFieldsValue({
workname: value,
name:value
})
setWorkSpace(value)
}
const selectIp = (value)=>{
let localIps = ['192.168.12.7', '192.168.19.100']
let port = localIps.includes(value) ? 8080 : 8088
form.setFieldsValue({ port,serviceadress:value });
}
name: value,
});
setWorkSpace(value);
};
const selectIp = value => {
let localIps = ['192.168.12.7', '192.168.19.100'];
let port = localIps.includes(value) ? 8080 : 8088;
form.setFieldsValue({ port, serviceadress: value });
};
return (
<Modal
title={`${type === 'add' ? '元数据发布' : '编辑'}`}
......@@ -211,11 +206,7 @@ const AddModal = props => {
name="serviceadress"
rules={[{ required: true, message: '请选择服务名' }]}
>
<AutoComplete
placeholder="请输入GIS服务器地址"
options={gsIp}
onSelect={selectIp}
/>
<AutoComplete placeholder="请输入GIS服务器地址" options={gsIp} onSelect={selectIp} />
</Item>
<Item
label="GIS服务器端口"
......@@ -230,10 +221,7 @@ const AddModal = props => {
name="servicename"
rules={[{ required: true, message: '请输入GIS服务器名' }]}
>
<AutoComplete
placeholder="Email"
options={serviceName}
/>
<AutoComplete placeholder="Email" options={serviceName} />
</Item>
<Item
label="用户名称"
......@@ -255,10 +243,25 @@ const AddModal = props => {
rules={[{ required: true, message: '请选择工作空间名称' }]}
>
<div className={styles.imgList}>
<Select onChange={handleWorkspace} value ={workSpace}>
{workList.length ? workList.map((item, index) => { return <Option key={index} value={item}>{item}</Option> }) : ''}
<Select onChange={handleWorkspace} value={workSpace} style={{ width: '310px' }}>
{workList.length
? workList.map((item, index) => {
return (
<Option key={index} value={item}>
{item}
</Option>
);
})
: ''}
</Select>
<Button style={{ marginLeft: '0.5rem' }} onClick={() => { selectWorkspace() }}>选择工作空间</Button>
<Button
style={{ marginLeft: '0.5rem' }}
onClick={() => {
selectWorkspace();
}}
>
选择工作空间
</Button>
</div>
</Item>
<Item
......
import { Space, Table, Button, Popconfirm, notification, Spin } from 'antd';
import React, { useState, useEffect } from 'react';
import styles from '../SchemeConfig.less'
import styles from '../SchemeConfig.less';
import {
GetVectorService, deleteVectorService, getSolutionList, updatePublishedMetaData
GetVectorService,
deleteVectorService,
getSolutionList,
updatePublishedMetaData,
} from '@/services/webConfig/api';
import AddModal from './AddModal'
import PreviewModal from './VectorPreviewModal'
import AddModal from './AddModal';
import PreviewModal from './VectorPreviewModal';
const VectorData = props => {
const [treeLoading, setTreeLoading] = useState(false);// 弹窗显示
const [treeLoading, setTreeLoading] = useState(false); // 弹窗显示
const [tileData, setTileData] = useState([]); // table表格数据
const [visible, setVisible] = useState(false); // 弹窗
const [previewVisible, setPreviewVisible] = useState(false); // 预览弹窗
......@@ -16,37 +19,37 @@ const VectorData = props => {
const [type, setType] = useState(''); // 弹窗类型
const [solutionNames, setSolutionNames] = useState('');
const [formObj, setFormObj] = useState({ user: 'admin', password: 'geoserver' });
const [currentMetaData, setCurrentMetaData] = useState(null)
const [currentMetaData, setCurrentMetaData] = useState(null);
const columns = [
{
title: '服务名',
dataIndex: 'ServiceName',
key: 'ServiceName',
align: 'center'
align: 'center',
},
{
title: 'IP',
dataIndex: 'GISServerIP',
key: 'GISServerIP',
align: 'center'
align: 'center',
},
{
title: '端口',
dataIndex: 'GISServerPort',
key: 'GISServerPort',
align: 'center'
align: 'center',
},
{
title: '工程名',
dataIndex: 'GISServerProjectName',
key: 'GISServerProjectName',
align: 'center'
align: 'center',
},
{
title: '发布时间',
dataIndex: 'publishTime',
key: 'publishTime',
align: 'center'
align: 'center',
},
{
title: '编辑',
......@@ -56,7 +59,12 @@ const VectorData = props => {
<Button type="primary" size="small" onClick={() => previewMetaData(record, index)}>
预览
</Button>
<Button type="primary" size="small" loading={loading[index]} onClick={() => enterLoading(record, index)}>
<Button
type="primary"
size="small"
loading={loading[index]}
onClick={() => enterLoading(record, index)}
>
更新
</Button>
<div onClick={e => e.stopPropagation()}>
......@@ -76,25 +84,25 @@ const VectorData = props => {
</Space>
),
},
];
//更新
const enterLoading = (record, index) => {
const newLoadings = [...loading];
newLoadings[index] = true
setLoading(newLoadings)
newLoadings[index] = true;
setLoading(newLoadings);
let query = {
serviceName: record.ServiceName,
_version: 9999,
solution: solutionNames
}
solution: solutionNames,
};
updatePublishedMetaData(query).then(res => {
updatePublishedMetaData(query)
.then(res => {
const newLoadings = [...loading];
newLoadings[index] = false
setLoading(newLoadings)
newLoadings[index] = false;
setLoading(newLoadings);
if (res.success) {
setFlag(flag + 1)
setFlag(flag + 1);
notification.success({
message: '提示',
duration: 3,
......@@ -106,45 +114,45 @@ const VectorData = props => {
duration: 3,
description: '更新元数据失败',
});
};
}).catch(err => {
}
})
.catch(err => {
const newLoadings = [...loading];
newLoadings[index] = false
setLoading(newLoadings)
newLoadings[index] = false;
setLoading(newLoadings);
notification.error({
message: '提示',
duration: 3,
description: '服务无法访问',
});
})
}
const previewMetaData = (record) => {
setCurrentMetaData(record)
setPreviewVisible(true)
}
});
};
const previewMetaData = record => {
setCurrentMetaData(record);
setPreviewVisible(true);
};
const solutionName = () => {
getSolutionList({
_version: 9999
_version: 9999,
}).then(res => {
setSolutionNames(res.currentSolution)
})
}
setSolutionNames(res.currentSolution);
});
};
const onSubmit = prop => {
setVisible(false);
setFlag(flag + 1)
setFlag(flag + 1);
};
const delConfirm = (record) => {
console.log(' record.ServiceName', record.ServiceName.split("."));
const delConfirm = record => {
console.log(' record.ServiceName', record.ServiceName.split('.'));
let query = {
serviceName: record.ServiceName.split(".")[0],
serviceName: record.ServiceName.split('.')[0],
_version: 9999,
solution: solutionNames
}
solution: solutionNames,
};
deleteVectorService(query).then(res => {
if (res.success) {
setFlag(flag + 1)
setFlag(flag + 1);
notification.success({
message: '提示',
duration: 3,
......@@ -156,13 +164,13 @@ const VectorData = props => {
duration: 3,
description: '删除元数据失败',
});
};
})
}
});
};
const handleAdd = () => {
setType('add');
setVisible(true);
}
};
useEffect(() => {
renderTile();
}, [flag]);
......@@ -170,14 +178,13 @@ const VectorData = props => {
const renderTile = () => {
setTreeLoading(true);
solutionName();
GetVectorService().then(
res => {
if (res.msg==='Ok') {
let arr = []
GetVectorService().then(res => {
if (res.msg === 'Ok') {
let arr = [];
res.data.VectorList.map(item => {
arr.push(false)
})
setLoading(arr)
arr.push(false);
});
setLoading(arr);
setTreeLoading(false);
setTileData(res.data.VectorList);
} else {
......@@ -187,19 +194,19 @@ const VectorData = props => {
description: res.message,
});
}
}
)
});
};
return (
<>
<Spin tip="loading..." spinning={treeLoading}>
<div className={styles.tileBtn}>
<Button type="primary" onClick={() => {
<Button
type="primary"
onClick={() => {
handleAdd();
}} >
}}
>
新增
</Button>
</div>
......@@ -210,12 +217,9 @@ const VectorData = props => {
rowKey="CreateTime"
scroll={{ y: 400 }}
pagination={{
showTotal: (total, range) =>
`第${range[0]}-${range[1]} 条/共 ${total} 条`
showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条`,
}}
>
</Table>
/>
<AddModal
visible={visible}
onCancel={() => setVisible(false)}
......@@ -231,6 +235,6 @@ const VectorData = props => {
/>
</Spin>
</>
)
}
export default VectorData
\ No newline at end of file
);
};
export default VectorData;
......@@ -69,7 +69,6 @@ const BaseConfig = () => {
</div>
)}
<br />
<Button style={{ marginLeft: '116px', marginTop: '10px' }}>生成编号</Button>
<div style={{ marginTop: '50px', display: 'flex', alignItems: 'center' }}>
<img src={servie} style={{ height: '16px' }} alt="" />
<span style={{ marginLeft: '10px', fontWeight: 'bold' }}>服务器链接</span>
......
......@@ -17,11 +17,7 @@ import {
notification,
Spin,
} from 'antd';
import {
PlusCircleOutlined,
EditTwoTone,
DeleteOutlined,
} from '@ant-design/icons';
import { PlusCircleOutlined, EditTwoTone, DeleteOutlined } from '@ant-design/icons';
const { Search } = Input;
const { Option } = Select;
......@@ -148,6 +144,21 @@ const TemplateManage = () => {
dataIndex: 'third_id',
key: 'third_id',
align: 'center',
width: 150,
onCell: () => ({
style: {
maxWidth: 150,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '模板参数1.0',
......@@ -172,6 +183,21 @@ const TemplateManage = () => {
dataIndex: 'analysis_params',
key: 'analysis_params',
align: 'center',
width: 150,
onCell: () => ({
style: {
maxWidth: 150,
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
},
}),
render: record => (
<Tooltip placement="topLeft" title={record}>
{record}
</Tooltip>
),
},
{
title: '操作',
......@@ -203,9 +229,7 @@ const TemplateManage = () => {
delTemplate(record);
}}
>
<DeleteOutlined
style={{ fontSize: '16px', color: '#e86060' }}
/>
<DeleteOutlined style={{ fontSize: '16px', color: '#e86060' }} />
</Popconfirm>
</div>
</Tooltip>
......@@ -218,10 +242,7 @@ const TemplateManage = () => {
const searchStyle = val => {
let n;
if (showSearchStyle) {
n = val.replace(
new RegExp(value, 'g'),
`<span style='color:red'>${value}</span>`,
);
n = val.replace(new RegExp(value, 'g'), `<span style='color:red'>${value}</span>`);
} else {
n = val;
}
......
import React, { useState, useEffect } from 'react'
import React, { useState, useEffect } from 'react';
import SiteModal from '@/components/Modal/SiteModa';
import { Form, Input, notification, Select, Row, Col } from 'antd'
import { Form, Input, notification, Select, Row, Col } from 'antd';
const { Item } = Form;
const { TextArea } = Input;
const AddModal = props => {
const { option } = props;
......@@ -13,21 +12,21 @@ const AddModal = props => {
const [loading, setLoading] = useState(false);
const [templateName, setTemplateName] = useState([]);
const onSubmit = () => {
form.submit()
}
form.submit();
};
const onSubmitSuccess = () => {
const result = form.getFieldValue()
props.onSubmit & props.onSubmit({ Id: props.template.Id, ...result })
form.resetFields()
}
const result = form.getFieldValue();
props.onSubmit & props.onSubmit({ Id: props.template.Id, ...result });
form.resetFields();
};
useEffect(() => {
if (option) {
setTemplateName(option.filter(item => item.Type === '公众号'))
setTemplateName(option.filter(item => item.Type === '公众号'));
form.setFieldsValue({
type: '公众号'
})
type: '公众号',
});
}
}, [props])
}, [props]);
const layout = {
layout: 'horizontal',
labelCol: {
......@@ -42,21 +41,20 @@ const AddModal = props => {
// },[props.template])
const onChange = (value, option) => {
form.setFieldsValue({
third_id: option.code
})
third_id: option.code,
});
// setTemplateName(option.filter(item => item.Type === value))
};
const onChangeType = (value) => {
setTemplateName(option.filter(item => item.Type === value))
console.log(option.filter(item => item.Type === value))
}
const onChangeType = value => {
setTemplateName(option.filter(item => item.Type === value));
console.log(option.filter(item => item.Type === value));
};
const onChangeType1 = (value) => {
const onChangeType1 = value => {
form.setFieldsValue({
third_id: value
})
}
third_id: value,
});
};
return (
<SiteModal
......@@ -71,7 +69,7 @@ const AddModal = props => {
onOk={() => onSubmit()}
confirmLoading={loading}
>
<div style={{ width: "750px", height: "500px", overflowY: "scroll", overflowX: "hidden" }}>
<div style={{ width: '750px', height: '500px', overflowY: 'scroll', overflowX: 'hidden' }}>
<Form form={form} {...layout} onFinish={onSubmitSuccess}>
<Item
label="模板名称"
......@@ -102,7 +100,7 @@ const AddModal = props => {
},
]}
>
<Select style={{ width: '10rem' }} onChange={(value) => onChangeType(value)} >
<Select style={{ width: '10rem' }} onChange={value => onChangeType(value)}>
<Select.Option value="公众号">公众号</Select.Option>
<Select.Option value="短信">短信</Select.Option>
<Select.Option value="企业微信">企业微信</Select.Option>
......@@ -111,9 +109,7 @@ const AddModal = props => {
</div>
</Item>
{form.getFieldsValue().type !== '企业微信' ?
{form.getFieldsValue().type !== '企业微信' ? (
<>
<Item
label="请选择第三方模板名称"
......@@ -161,7 +157,8 @@ const AddModal = props => {
</Item>
</div>
</Item>
</> :
</>
) : (
<>
<Item
label="请选择第三方模板名称"
......@@ -180,7 +177,11 @@ const AddModal = props => {
},
]}
>
<Select style={{width:'12rem'}} onChange={(value) => onChangeType1(value)} placeholder="请选择模板名称" >
<Select
style={{ width: '12rem' }}
onChange={value => onChangeType1(value)}
placeholder="请选择模板名称"
>
<Select.Option value="普通文本">普通文本</Select.Option>
<Select.Option value="文字卡片">文字卡片</Select.Option>
<Select.Option value="图片消息">图片消息</Select.Option>
......@@ -203,43 +204,27 @@ const AddModal = props => {
</div>
</Item>
</>
}
)}
<Item
label="模板参数1.0"
labelCol={{ span: 6 }}
name="params"
>
<Item label="模板参数1.0" labelCol={{ span: 6 }} name="params">
<TextArea rows={2} style={{ width: '96%' }} placeholder="first|Second|Third|Four" />
</Item>
<Item
label="模板参数2.0"
labelCol={{ span: 6 }}
name="param1"
>
<Item label="模板参数2.0" labelCol={{ span: 6 }} name="param1">
<TextArea rows={2} style={{ width: '96%' }} placeholder="first|Second|Third|Four" />
</Item>
<Item
label="参数说明"
name="desc"
labelCol={{ span: 6 }}
>
<TextArea style={{ width: '96%' }} rows={4} placeholder="first: 标题信息|Second: 展示内容|Third: 时间|Four: 备注信息" />
<Item label="参数说明" name="desc" labelCol={{ span: 6 }}>
<TextArea
style={{ width: '96%' }}
rows={4}
placeholder="first: 标题信息|Second: 展示内容|Third: 时间|Four: 备注信息"
/>
</Item>
<Item
label="解析规则"
name="analysis_params"
labelCol={{ span: 6 }}
>
<Item label="解析规则" name="analysis_params" labelCol={{ span: 6 }}>
<TextArea rows={2} style={{ width: '96%' }} placeholder="param1|param2|param3|param4" />
</Item>
</Form>
</div>
</SiteModal>
)
}
);
};
export default AddModal;
......@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react';
import { Form, Modal, Row, Col, Input, Select, notification } from 'antd';
const VideoModal = props => {
const { callBackSubmit = () => { }, visible, onCancel, obj } = props;
const { callBackSubmit = () => {}, visible, onCancel, obj } = props;
return (
<Modal
......@@ -15,9 +15,17 @@ const VideoModal = props => {
footer={[]}
>
<div className="pp">
< iframe style={{ border: 0, width: "100%", height: 630, }} src={window.location.origin + `/web4/video/indexAll.html?ID=${obj.EquipmentCode}&skipCheck=true&name=${obj.Name}&disk=${obj.RecorderName}&site=null`} />
<iframe
style={{ border: 0, width: '100%', height: 630 }}
src={
window.location.origin +
`/web4/video/indexAll.html?ID=${obj.EquipmentCode}&skipCheck=true&name=${
obj.Name
}&disk=${obj.RecorderName}&site=null`
}
/>
</div>
</Modal>
)
}
export default VideoModal
\ No newline at end of file
);
};
export default VideoModal;
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