|
@@ -1,12 +1,14 @@
|
|
|
-import { Button, Empty, Modal, Transfer, Tree } from 'antd';
|
|
|
|
|
|
|
+import { Button, Empty, Modal, Spin, Transfer, Tree } from 'antd';
|
|
|
import type { TransferDirection } from 'antd/es/transfer';
|
|
import type { TransferDirection } from 'antd/es/transfer';
|
|
|
import { useEffect, useState } from 'react';
|
|
import { useEffect, useState } from 'react';
|
|
|
import service from '@/pages/link/DataCollect/service';
|
|
import service from '@/pages/link/DataCollect/service';
|
|
|
import './scan.less';
|
|
import './scan.less';
|
|
|
import { CloseOutlined } from '@ant-design/icons';
|
|
import { CloseOutlined } from '@ant-design/icons';
|
|
|
|
|
+import { Ellipsis } from '@/components';
|
|
|
|
|
+import { onlyMessage } from '@/utils/util';
|
|
|
|
|
|
|
|
interface Props {
|
|
interface Props {
|
|
|
- channelId?: string;
|
|
|
|
|
|
|
+ collector?: any;
|
|
|
close: () => void;
|
|
close: () => void;
|
|
|
reload: () => void;
|
|
reload: () => void;
|
|
|
}
|
|
}
|
|
@@ -16,18 +18,29 @@ interface TreeTransferProps {
|
|
|
targetKeys: string[];
|
|
targetKeys: string[];
|
|
|
onChange: (targetKeys: string[], direction: TransferDirection, moveKeys: string[]) => void;
|
|
onChange: (targetKeys: string[], direction: TransferDirection, moveKeys: string[]) => void;
|
|
|
channelId?: string;
|
|
channelId?: string;
|
|
|
|
|
+ arrChange: (arr: any[]) => void;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeTransferProps) => {
|
|
|
|
|
|
|
+const TreeTransfer = ({
|
|
|
|
|
+ dataSource,
|
|
|
|
|
+ targetKeys,
|
|
|
|
|
+ channelId,
|
|
|
|
|
+ arrChange,
|
|
|
|
|
+ ...restProps
|
|
|
|
|
+}: TreeTransferProps) => {
|
|
|
const [transferDataSource, setTransferDataSource] = useState<any[]>(dataSource);
|
|
const [transferDataSource, setTransferDataSource] = useState<any[]>(dataSource);
|
|
|
|
|
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ setTransferDataSource([...dataSource]);
|
|
|
|
|
+ }, [dataSource]);
|
|
|
|
|
+
|
|
|
const isChecked = (selectedKeys: (string | number)[], eventKey: string | number) =>
|
|
const isChecked = (selectedKeys: (string | number)[], eventKey: string | number) =>
|
|
|
selectedKeys.includes(eventKey);
|
|
selectedKeys.includes(eventKey);
|
|
|
|
|
|
|
|
const generateTree = (treeNodes: any[] = [], checkedKeys: string[] = []): any[] =>
|
|
const generateTree = (treeNodes: any[] = [], checkedKeys: string[] = []): any[] =>
|
|
|
treeNodes.map(({ children, ...props }) => ({
|
|
treeNodes.map(({ children, ...props }) => ({
|
|
|
...props,
|
|
...props,
|
|
|
- disabled: checkedKeys.includes(props.key as string),
|
|
|
|
|
|
|
+ disabled: checkedKeys.includes(props.key as string) || props?.folder,
|
|
|
children: generateTree(children, checkedKeys),
|
|
children: generateTree(children, checkedKeys),
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
@@ -43,18 +56,19 @@ const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeT
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const generateTargetTree = (treeNodes: any[] = []): any[] => {
|
|
const generateTargetTree = (treeNodes: any[] = []): any[] => {
|
|
|
- return treeNodes.map((item) => queryDataByID(transferDataSource, item));
|
|
|
|
|
|
|
+ const arr = treeNodes.map((item) => queryDataByID(transferDataSource, item));
|
|
|
|
|
+ return arr;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- const updateTreeData = (list: any[], key: React.Key, children: any[]): any[] =>
|
|
|
|
|
- list.map((node) => {
|
|
|
|
|
|
|
+ const updateTreeData = (list: any[], key: string, children: any[]): any[] => {
|
|
|
|
|
+ const arr = list.map((node) => {
|
|
|
if (node.key === key) {
|
|
if (node.key === key) {
|
|
|
return {
|
|
return {
|
|
|
...node,
|
|
...node,
|
|
|
children,
|
|
children,
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
- if (node.children) {
|
|
|
|
|
|
|
+ if (node?.children && node.children.length) {
|
|
|
return {
|
|
return {
|
|
|
...node,
|
|
...node,
|
|
|
children: updateTreeData(node.children, key, children),
|
|
children: updateTreeData(node.children, key, children),
|
|
@@ -62,19 +76,35 @@ const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeT
|
|
|
}
|
|
}
|
|
|
return node;
|
|
return node;
|
|
|
});
|
|
});
|
|
|
|
|
+ return arr;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ arrChange(generateTargetTree(targetKeys));
|
|
|
|
|
+ }, [targetKeys]);
|
|
|
|
|
|
|
|
- const onLoadData = ({ key, children }: any) =>
|
|
|
|
|
|
|
+ const onLoadData = (node: any) =>
|
|
|
new Promise<void>(async (resolve) => {
|
|
new Promise<void>(async (resolve) => {
|
|
|
- if (children) {
|
|
|
|
|
|
|
+ if (node.children.length || !node?.folder) {
|
|
|
resolve();
|
|
resolve();
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
const resp = await service.scanOpcUAList({
|
|
const resp = await service.scanOpcUAList({
|
|
|
id: channelId,
|
|
id: channelId,
|
|
|
- nodeId: key,
|
|
|
|
|
|
|
+ nodeId: node.key,
|
|
|
});
|
|
});
|
|
|
if (resp.status === 200) {
|
|
if (resp.status === 200) {
|
|
|
- setTransferDataSource((origin) => updateTreeData(origin, key, resp.result));
|
|
|
|
|
|
|
+ const list = resp.result.map((item: any) => {
|
|
|
|
|
+ return {
|
|
|
|
|
+ ...item,
|
|
|
|
|
+ key: item.id,
|
|
|
|
|
+ title: item.name,
|
|
|
|
|
+ disabled: item?.folder,
|
|
|
|
|
+ isLeaf: !item?.folder,
|
|
|
|
|
+ };
|
|
|
|
|
+ });
|
|
|
|
|
+ const arr = updateTreeData(transferDataSource, node.key, [...list]);
|
|
|
|
|
+ setTransferDataSource([...arr]);
|
|
|
}
|
|
}
|
|
|
resolve();
|
|
resolve();
|
|
|
});
|
|
});
|
|
@@ -84,7 +114,7 @@ const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeT
|
|
|
{...restProps}
|
|
{...restProps}
|
|
|
targetKeys={targetKeys}
|
|
targetKeys={targetKeys}
|
|
|
dataSource={transferDataSource}
|
|
dataSource={transferDataSource}
|
|
|
- render={(item) => item.title!}
|
|
|
|
|
|
|
+ render={(item) => item?.title}
|
|
|
showSelectAll={false}
|
|
showSelectAll={false}
|
|
|
titles={['源数据', '目标数据']}
|
|
titles={['源数据', '目标数据']}
|
|
|
oneWay
|
|
oneWay
|
|
@@ -93,14 +123,14 @@ const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeT
|
|
|
if (direction === 'left') {
|
|
if (direction === 'left') {
|
|
|
const checkedKeys = [...selectedKeys, ...targetKeys];
|
|
const checkedKeys = [...selectedKeys, ...targetKeys];
|
|
|
return (
|
|
return (
|
|
|
- <div style={{ margin: '10px 0' }}>
|
|
|
|
|
|
|
+ <div style={{ margin: '10px' }}>
|
|
|
<Tree
|
|
<Tree
|
|
|
blockNode
|
|
blockNode
|
|
|
checkable
|
|
checkable
|
|
|
checkStrictly
|
|
checkStrictly
|
|
|
checkedKeys={checkedKeys}
|
|
checkedKeys={checkedKeys}
|
|
|
height={250}
|
|
height={250}
|
|
|
- treeData={generateTree(dataSource, targetKeys)}
|
|
|
|
|
|
|
+ treeData={generateTree(transferDataSource, targetKeys)}
|
|
|
onCheck={(_, { node: { key } }) => {
|
|
onCheck={(_, { node: { key } }) => {
|
|
|
onItemSelect(key as string, !isChecked(checkedKeys, key));
|
|
onItemSelect(key as string, !isChecked(checkedKeys, key));
|
|
|
}}
|
|
}}
|
|
@@ -118,8 +148,10 @@ const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeT
|
|
|
{generateTargetTree(targetKeys).map((item) => {
|
|
{generateTargetTree(targetKeys).map((item) => {
|
|
|
return (
|
|
return (
|
|
|
<div className={'right-item'} key={item.key}>
|
|
<div className={'right-item'} key={item.key}>
|
|
|
- <div>{item.title || item.key}</div>
|
|
|
|
|
- <div>
|
|
|
|
|
|
|
+ <div style={{ width: 'calc(100% - 30px)' }}>
|
|
|
|
|
+ <Ellipsis title={item?.title || item.key} />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div style={{ width: 20, marginLeft: 10 }}>
|
|
|
<CloseOutlined
|
|
<CloseOutlined
|
|
|
onClick={() => {
|
|
onClick={() => {
|
|
|
if (onItemRemove) {
|
|
if (onItemRemove) {
|
|
@@ -145,16 +177,18 @@ const TreeTransfer = ({ dataSource, targetKeys, channelId, ...restProps }: TreeT
|
|
|
export default (props: Props) => {
|
|
export default (props: Props) => {
|
|
|
const [targetKeys, setTargetKeys] = useState<string[]>([]);
|
|
const [targetKeys, setTargetKeys] = useState<string[]>([]);
|
|
|
const [treeData, setTreeData] = useState<any[]>([]);
|
|
const [treeData, setTreeData] = useState<any[]>([]);
|
|
|
- // const [treeData, setTreeData] = useState<any[]>([]);
|
|
|
|
|
- const onChange = (keys: string[]) => {
|
|
|
|
|
|
|
+ const [loading, setLoading] = useState<boolean>(false);
|
|
|
|
|
+ const [arr, setArr] = useState<any[]>([]);
|
|
|
|
|
+ const onChange = (keys: any[]) => {
|
|
|
setTargetKeys(keys);
|
|
setTargetKeys(keys);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
|
- if (props.channelId) {
|
|
|
|
|
|
|
+ if (props.collector?.channelId) {
|
|
|
|
|
+ setLoading(true);
|
|
|
service
|
|
service
|
|
|
.scanOpcUAList({
|
|
.scanOpcUAList({
|
|
|
- id: props.channelId,
|
|
|
|
|
|
|
+ id: props.collector?.channelId,
|
|
|
})
|
|
})
|
|
|
.then((resp) => {
|
|
.then((resp) => {
|
|
|
if (resp.status === 200) {
|
|
if (resp.status === 200) {
|
|
@@ -163,13 +197,15 @@ export default (props: Props) => {
|
|
|
...item,
|
|
...item,
|
|
|
key: item.id,
|
|
key: item.id,
|
|
|
title: item.name,
|
|
title: item.name,
|
|
|
|
|
+ disabled: item?.folder,
|
|
|
};
|
|
};
|
|
|
});
|
|
});
|
|
|
setTreeData(list);
|
|
setTreeData(list);
|
|
|
}
|
|
}
|
|
|
|
|
+ setLoading(false);
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
- }, [props.channelId]);
|
|
|
|
|
|
|
+ }, [props.collector?.channelId]);
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
<Modal
|
|
<Modal
|
|
@@ -185,20 +221,38 @@ export default (props: Props) => {
|
|
|
<Button
|
|
<Button
|
|
|
type="primary"
|
|
type="primary"
|
|
|
key={2}
|
|
key={2}
|
|
|
- onClick={() => {
|
|
|
|
|
- // save();
|
|
|
|
|
|
|
+ onClick={async () => {
|
|
|
|
|
+ const list = arr.map((item) => {
|
|
|
|
|
+ return {
|
|
|
|
|
+ id: item.key,
|
|
|
|
|
+ name: item.title,
|
|
|
|
|
+ type: item.type,
|
|
|
|
|
+ };
|
|
|
|
|
+ });
|
|
|
|
|
+ const resp = await service.savePointBatch(props.collector?.id, props.collector?.name, [
|
|
|
|
|
+ ...list,
|
|
|
|
|
+ ]);
|
|
|
|
|
+ if (resp.status === 200) {
|
|
|
|
|
+ onlyMessage('操作成功');
|
|
|
|
|
+ props.reload();
|
|
|
|
|
+ }
|
|
|
}}
|
|
}}
|
|
|
>
|
|
>
|
|
|
确定
|
|
确定
|
|
|
</Button>,
|
|
</Button>,
|
|
|
]}
|
|
]}
|
|
|
>
|
|
>
|
|
|
- <TreeTransfer
|
|
|
|
|
- channelId={props.channelId}
|
|
|
|
|
- dataSource={treeData}
|
|
|
|
|
- targetKeys={targetKeys}
|
|
|
|
|
- onChange={onChange}
|
|
|
|
|
- />
|
|
|
|
|
|
|
+ <Spin spinning={loading}>
|
|
|
|
|
+ <TreeTransfer
|
|
|
|
|
+ channelId={props.collector?.channelId}
|
|
|
|
|
+ dataSource={treeData}
|
|
|
|
|
+ targetKeys={targetKeys}
|
|
|
|
|
+ onChange={onChange}
|
|
|
|
|
+ arrChange={(li) => {
|
|
|
|
|
+ setArr(li);
|
|
|
|
|
+ }}
|
|
|
|
|
+ />
|
|
|
|
|
+ </Spin>
|
|
|
</Modal>
|
|
</Modal>
|
|
|
);
|
|
);
|
|
|
};
|
|
};
|