|
@@ -365,22 +365,16 @@
|
|
|
width="800px"
|
|
|
header="数据管理"
|
|
|
:visible="true"
|
|
|
- @close="dataDialog.show = false"
|
|
|
+ @close="closeDataDialog"
|
|
|
>
|
|
|
<t-tabs v-model="dataDialog.tab" class="body">
|
|
|
- <t-tab-panel :value="1" label="数据通信" :destroy-on-hide="false">
|
|
|
+ <t-tab-panel :value="1" label="数据获取" :destroy-on-hide="false">
|
|
|
<template #panel>
|
|
|
<div v-if="!dataDialog.editNetwork">
|
|
|
<div class="mt-16 flex between middle">
|
|
|
<div>
|
|
|
- <t-checkbox
|
|
|
- style="display: inline"
|
|
|
- v-model="dataDialog.enableMock"
|
|
|
- @change="onChangeMock"
|
|
|
- >
|
|
|
- 开启模拟数据
|
|
|
- </t-checkbox>
|
|
|
- <label class="ml-8"> 轮询间隔 </label>
|
|
|
+
|
|
|
+ <!-- <label class="ml-8"> 轮询间隔 </label>
|
|
|
<t-input-number
|
|
|
style="width: 100px"
|
|
|
v-model="dataDialog.networkInterval"
|
|
@@ -389,12 +383,12 @@
|
|
|
:min="30"
|
|
|
placeholder="毫秒"
|
|
|
suffix="ms"
|
|
|
- />
|
|
|
+ /> -->
|
|
|
</div>
|
|
|
<div>
|
|
|
<t-select-input
|
|
|
v-model:inputValue="dataDialog.input"
|
|
|
- placeholder="搜索我的数据通信"
|
|
|
+ placeholder="搜索我的数据获取"
|
|
|
allow-input
|
|
|
clearable
|
|
|
@focus="dataDialog.popupVisible = true"
|
|
@@ -451,7 +445,7 @@
|
|
|
style="height: 30px"
|
|
|
@click="addNetwork"
|
|
|
>
|
|
|
- 添加数据通信
|
|
|
+ 添加数据获取
|
|
|
</t-button>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -477,7 +471,7 @@
|
|
|
<div class="center">
|
|
|
<div>暂无数据</div>
|
|
|
<div class="mt-8">
|
|
|
- <a @click="addNetwork"> + 添加数据通信</a>
|
|
|
+ <a @click="addNetwork"> + 添加数据获取</a>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -505,55 +499,97 @@
|
|
|
</template>
|
|
|
</t-tab-panel>
|
|
|
<t-tab-panel :value="2" :destroy-on-hide="false">
|
|
|
- <template #label> 数据点列表 </template>
|
|
|
+ <template #label> 变量列表 </template>
|
|
|
<template #panel>
|
|
|
<template v-if="!dataDialog.editDataset">
|
|
|
- <div class="form-item mt-16">
|
|
|
- <label style="width: 100px"> 当前数据点列表 </label>
|
|
|
- <div class="flex w-full">
|
|
|
- <t-select
|
|
|
- class="flex-grow"
|
|
|
- v-model="dataDialog.datasetId"
|
|
|
- filterable
|
|
|
- placeholder="选择数据点列表"
|
|
|
- :on-search="onInputDatasets"
|
|
|
- :popup-props="{ overlayClassName: 'select-options' }"
|
|
|
- @change="onSelDataset()"
|
|
|
- >
|
|
|
- <t-option
|
|
|
- v-for="(item, i) in dataDialog.datasetList"
|
|
|
- :key="item.id"
|
|
|
- :value="item.id"
|
|
|
- :label="item.name"
|
|
|
+ <div class="form-item mt-16 flex between middle">
|
|
|
+ <div>
|
|
|
+ <a @click="showAddData()"> + 新建变量</a>
|
|
|
+ <a style="margin-left: 8px;" @click="clearData()"> × 清空列表</a>
|
|
|
+ </div>
|
|
|
+ <div class="form-item flex">
|
|
|
+ <!-- <div class="form-item flex"> -->
|
|
|
+ <label style="text-align: end;margin-left: 8px;font-size: 13px;">导入变量:</label>
|
|
|
+ <t-select
|
|
|
+ style="width: 120px"
|
|
|
+ v-model="dataDialog.datasetType"
|
|
|
+ placeholder="选择变量"
|
|
|
+ >
|
|
|
+ <t-option :key="1" :value="1" label="我的变量列表"/>
|
|
|
+ <t-option :key="2" :value="2" label="从Excel导入"/>
|
|
|
+ <t-option :key="3" :value="3" label="在线接口"/>
|
|
|
+ </t-select>
|
|
|
+ <!-- </div> -->
|
|
|
+ <!-- <label style="width: 100px"> 当前变量列表 </label> -->
|
|
|
+ <!-- <div class="flex"> -->
|
|
|
+ <div style="width: 240px;padding-left: 8px;">
|
|
|
+ <t-select
|
|
|
+ v-if="dataDialog.datasetType === 1"
|
|
|
+ v-model="dataDialog.datasetId"
|
|
|
+ filterable
|
|
|
+ placeholder="选择变量列表"
|
|
|
+ :on-search="onInputDatasets"
|
|
|
+ :popup-props="{ overlayClassName: 'select-options' }"
|
|
|
+ @change="onSelDataset()"
|
|
|
>
|
|
|
- <div class="hover-background item">
|
|
|
- <div style="font-size: 14px">{{ item.name }}</div>
|
|
|
- <div v-if="item.url" class="desc">
|
|
|
- {{ item.url }}
|
|
|
+ <t-option
|
|
|
+ v-for="(item, i) in dataDialog.datasetList"
|
|
|
+ :key="item.id"
|
|
|
+ :value="item.id"
|
|
|
+ :label="item.name"
|
|
|
+ >
|
|
|
+ <div class="hover-background item">
|
|
|
+ <div style="font-size: 14px">{{ item.name }}</div>
|
|
|
+ <div v-if="item.url" class="desc">
|
|
|
+ {{ item.url }}
|
|
|
+ </div>
|
|
|
+ <div v-else class="desc">自定义</div>
|
|
|
+ <span class="del" @click.stop="onDelDataset(item, i)">
|
|
|
+ <delete-icon />
|
|
|
+ <!-- <t-icon name="delete" /> -->
|
|
|
+ </span>
|
|
|
</div>
|
|
|
- <div v-else class="desc">自定义</div>
|
|
|
- <span class="del" @click.stop="onDelDataset(item, i)">
|
|
|
- <delete-icon />
|
|
|
- <!-- <t-icon name="delete" /> -->
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- </t-option>
|
|
|
- <t-option
|
|
|
- v-if="dataDialog.datasetList.length >= 10"
|
|
|
- :disabled="true"
|
|
|
- >
|
|
|
- <div class="ml-8 gray">...</div>
|
|
|
- </t-option>
|
|
|
- </t-select>
|
|
|
-
|
|
|
- <t-button
|
|
|
+ </t-option>
|
|
|
+ <t-option
|
|
|
+ v-if="dataDialog.datasetList.length >= 10"
|
|
|
+ :disabled="true"
|
|
|
+ >
|
|
|
+ <div class="ml-8 gray">...</div>
|
|
|
+ </t-option>
|
|
|
+ </t-select>
|
|
|
+ <div class="flex middle" v-if="dataDialog.datasetType === 2">
|
|
|
+ <t-button
|
|
|
+ class="shrink-0"
|
|
|
+ style="width: 90px; height: 30px"
|
|
|
+ @click="importDataset"
|
|
|
+ >
|
|
|
+ 导入Excel
|
|
|
+ </t-button>
|
|
|
+ <a
|
|
|
+ :href="cdn ? cdn + '/v/data.xlsx' : '/data.xlsx'"
|
|
|
+ download
|
|
|
+ class="ml-12 mt-4 nowrap"
|
|
|
+ >
|
|
|
+ 下载Excel示例
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ <div v-if="dataDialog.datasetType === 3" class="form-item">
|
|
|
+ <t-input label="地址:" placeholder="点击图标或回车获取数据" v-model="dataDialog.dataset.url" @blur="getDatas" @enter="getDatas" >
|
|
|
+ <template #suffixIcon>
|
|
|
+ <CloudDownloadIcon @click="getDatas" :style="{ cursor: 'pointer' }" />
|
|
|
+ </template>
|
|
|
+ </t-input>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- <t-button
|
|
|
class="ml-12 shrink-0"
|
|
|
style="height: 30px"
|
|
|
@click="addDataset"
|
|
|
>
|
|
|
- 添加数据点列表
|
|
|
- </t-button>
|
|
|
- </div>
|
|
|
+ 添加变量列表
|
|
|
+ </t-button> -->
|
|
|
+ <!-- </div> -->
|
|
|
</div>
|
|
|
|
|
|
<t-table
|
|
@@ -567,6 +603,11 @@
|
|
|
<template #type="{ row }">
|
|
|
{{ row.type || 'string' }}
|
|
|
</template>
|
|
|
+ <template #actions="{ row, rowIndex }">
|
|
|
+ <edit-icon class="hover" @click="showAddData(row, rowIndex)"/>
|
|
|
+ <delete-icon class="ml-12 hover"
|
|
|
+ @click="dataDialog.dataset.devices.splice(rowIndex, 1)"/>
|
|
|
+ </template>
|
|
|
</t-table>
|
|
|
</template>
|
|
|
<div v-else>
|
|
@@ -592,7 +633,7 @@
|
|
|
>
|
|
|
<div class="flex-grow"></div>
|
|
|
<t-checkbox v-model="dataDialog.save" class="mr-12">
|
|
|
- 同时保存到我的数据通信
|
|
|
+ 同时保存到我的数据获取
|
|
|
</t-checkbox>
|
|
|
<t-button @click="onOkNetwork">确定</t-button>
|
|
|
</div>
|
|
@@ -600,25 +641,40 @@
|
|
|
<template v-if="dataDialog.editDataset === 1">
|
|
|
<div class="flex-grow"></div>
|
|
|
<t-checkbox v-model="dataDialog.save" class="mr-12">
|
|
|
- 同时保存为我的数据点列表
|
|
|
+ 同时保存为我的变量列表
|
|
|
</t-checkbox>
|
|
|
<t-button @click="onOkDataset()">保存</t-button>
|
|
|
</template>
|
|
|
<template v-else-if="dataDialog.editDataset === 2">
|
|
|
<div class="flex-grow"></div>
|
|
|
- <t-button @click="onOkDataset(true)"> 另存为新数据点列表 </t-button>
|
|
|
+ <t-button @click="onOkDataset(true)"> 另存为新变量列表 </t-button>
|
|
|
<t-button @click="onOkDataset()">保存</t-button>
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
- <a
|
|
|
+ <!-- <a
|
|
|
v-if="dataDialog.dataset && dataDialog.dataset.id"
|
|
|
@click="editDataset"
|
|
|
>
|
|
|
- 编辑当前数据点列表
|
|
|
- </a>
|
|
|
+ 编辑当前变量列表
|
|
|
+ </a> -->
|
|
|
+ <t-checkbox
|
|
|
+ style="display: inline;"
|
|
|
+ v-model="dataDialog.enableMock"
|
|
|
+ @change="onChangeMock">
|
|
|
+ 开启模拟数据
|
|
|
+ </t-checkbox>
|
|
|
<div class="flex-grow"></div>
|
|
|
-
|
|
|
- <t-button @click="dataDialog.show = false"> 完成 </t-button>
|
|
|
+ <t-button @click="downloadAsJson" variant="outline" theme="primary">
|
|
|
+ <template #icon><FileIcon /></template>
|
|
|
+ 下载为JSON
|
|
|
+ </t-button>
|
|
|
+ <t-button @click="downloadAsExcel" variant="outline" theme="primary">
|
|
|
+ <template #icon><FileExcelIcon /></template>
|
|
|
+ 下载为Excel
|
|
|
+ </t-button>
|
|
|
+ <t-button @click="onOkDataset()"> 保存为我的变量列表 </t-button>
|
|
|
+
|
|
|
+ <!-- <t-button @click="dataDialog.show = false"> 完成 </t-button> -->
|
|
|
</template>
|
|
|
</div>
|
|
|
<div v-else class="flex middle">
|
|
@@ -789,6 +845,70 @@
|
|
|
|
|
|
<!-- 分享弹窗 -->
|
|
|
<ShareModal :shared="shared" v-model:visible="shareVisible" />
|
|
|
+ <t-dialog
|
|
|
+ v-if="addDataDialog.show"
|
|
|
+ :visible="true"
|
|
|
+ class="data-dialog"
|
|
|
+ :header="addDataDialog.header"
|
|
|
+ @close="addDataDialog.show = false"
|
|
|
+ @confirm="onOkAddData"
|
|
|
+ >
|
|
|
+ <!-- <div class="form-item mt-16">
|
|
|
+ <label>设备</label>
|
|
|
+ <t-input v-model="addDataDialog.data.device" placeholder="设备名称" />
|
|
|
+ </div> -->
|
|
|
+ <div class="form-item mt-16">
|
|
|
+ <label>显示名称</label>
|
|
|
+ <t-input
|
|
|
+ @change="changeDataLabel($event)"
|
|
|
+ :value="addDataDialog.data.label"
|
|
|
+ placeholder="变量简短描述"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="form-item mt-16">
|
|
|
+ <label>变量名</label>
|
|
|
+ <t-input
|
|
|
+ @change="changeDataID($event)"
|
|
|
+ :value="addDataDialog.data.id"
|
|
|
+ placeholder="变量名"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="form-item mt-16">
|
|
|
+ <label>类型</label>
|
|
|
+ <t-select
|
|
|
+ class="w-full"
|
|
|
+ :options="typeOptions"
|
|
|
+ v-model="addDataDialog.data.type"
|
|
|
+ placeholder="字符串"
|
|
|
+ @change="addDataDialog.data.value = null"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="form-item mt-16">
|
|
|
+ <label>值范围</label>
|
|
|
+ <div class="w-full">
|
|
|
+ <t-input v-model="addDataDialog.data.mock" placeholder="值范围" />
|
|
|
+ <h6 class="desc mt-8">值范围说明</h6>
|
|
|
+ <ul class="desc ml-16">
|
|
|
+ <li>
|
|
|
+ <label class="inline" style="width: 80px">固定值:</label>
|
|
|
+ 直接填写,例如:10
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label class="inline" style="width: 80px">随机值:</label>
|
|
|
+ {值1,值2,...}。例如:{1,2,3,4,5}
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label class="inline" style="width: 80px">范围数字:</label>
|
|
|
+ 最小值-最大值。例如:0-1.0 或 0-100
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label class="inline" style="width: 80px">随机字符串:</label>
|
|
|
+ [长度]。例如:[8]
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </t-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -839,8 +959,10 @@ import ContextMenu from './ContextMenu.vue';
|
|
|
import Network from './Network.vue';
|
|
|
import Dataset from './Dataset.vue';
|
|
|
import ChargeCloudPublish from './ChargeCloudPublish.vue';
|
|
|
-import { AddIcon,SaveIcon, RootListIcon,SlashIcon, RefreshIcon, ServerIcon, CaretRightIcon, ShareIcon, QrcodeIcon, CloudIcon, DeleteIcon, SearchIcon, RollbackIcon, LaptopIcon, StopCircleIcon , PlayCircleIcon, PlayCircleStrokeIcon, LayersIcon, FullscreenExitIcon } from 'tdesign-icons-vue-next';
|
|
|
+import { AddIcon, EditIcon, SaveIcon, RootListIcon,SlashIcon, RefreshIcon, ServerIcon, CaretRightIcon, ShareIcon, QrcodeIcon, CloudIcon, DeleteIcon, SearchIcon, RollbackIcon, LaptopIcon, StopCircleIcon , PlayCircleIcon, PlayCircleStrokeIcon, LayersIcon, FullscreenExitIcon, FileIcon, FileExcelIcon, CloudDownloadIcon } from 'tdesign-icons-vue-next';
|
|
|
import {transformData} from '@/services/utils';
|
|
|
+import { importExcel, saveAsExcel } from '@/services/excel';
|
|
|
+import { typeOptions } from '@/services/common';
|
|
|
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
@@ -1365,9 +1487,12 @@ const onShowDataDialog = async () => {
|
|
|
dataDialog.editNetwork = false;
|
|
|
dataDialog.save = true;
|
|
|
dataDialog.show = true;
|
|
|
- getNetworks();
|
|
|
+ if(!dataDialog.datasetType){
|
|
|
+ dataDialog.datasetType = 1;
|
|
|
+ }
|
|
|
+ await getNetworks();
|
|
|
await getDatasets();
|
|
|
- onSelDataset(true);
|
|
|
+ // onSelDataset(true);
|
|
|
};
|
|
|
|
|
|
const onFinishDataDialog = () => {
|
|
@@ -1561,19 +1686,19 @@ const onOkNetwork = async () => {
|
|
|
};
|
|
|
|
|
|
const datasetColumns = ref([
|
|
|
- {
|
|
|
- colKey: 'device',
|
|
|
- title: '设备',
|
|
|
- ellipsis: true,
|
|
|
- },
|
|
|
+ // {
|
|
|
+ // colKey: 'device',
|
|
|
+ // title: '设备',
|
|
|
+ // ellipsis: true,
|
|
|
+ // },
|
|
|
{
|
|
|
colKey: 'label',
|
|
|
- title: '数据点名称',
|
|
|
+ title: '显示名称',
|
|
|
ellipsis: true,
|
|
|
},
|
|
|
{
|
|
|
colKey: 'id',
|
|
|
- title: '数据点ID',
|
|
|
+ title: '变量名',
|
|
|
ellipsis: true,
|
|
|
},
|
|
|
{
|
|
@@ -1586,8 +1711,176 @@ const datasetColumns = ref([
|
|
|
title: '值范围',
|
|
|
ellipsis: true,
|
|
|
},
|
|
|
+ {
|
|
|
+ colKey: 'actions',
|
|
|
+ title: '操作',
|
|
|
+ width: 100,
|
|
|
+ },
|
|
|
]);
|
|
|
|
|
|
+const importDataset = async () => {
|
|
|
+ let columns: any = [
|
|
|
+ // {
|
|
|
+ // header: '设备',
|
|
|
+ // key: 'device',
|
|
|
+ // },
|
|
|
+ {
|
|
|
+ header: '显示名称',
|
|
|
+ key: 'label',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ header: '变量名',
|
|
|
+ key: 'id',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ header: '类型',
|
|
|
+ key: 'type',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ header: '值范围',
|
|
|
+ key: 'mock',
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ const data: any = await importExcel(columns);
|
|
|
+ // dataDialog.dataset.devices = data;
|
|
|
+ mergeDataset(dataDialog.dataset, data);
|
|
|
+ // modelValue.devices = data;
|
|
|
+ // emit('update:modelValue', modelValue);
|
|
|
+ // emit('change', modelValue);
|
|
|
+};
|
|
|
+
|
|
|
+const getDatas = async () => {
|
|
|
+ if (!dataDialog.dataset.url) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const ret = await axios.get(dataDialog.dataset.url);
|
|
|
+ let flattenRet = flattenTree(ret);
|
|
|
+ if (flattenRet) {
|
|
|
+ // dataDialog.dataset.devices = flattenRet;
|
|
|
+ mergeDataset(dataDialog.dataset,flattenRet);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+//展开树
|
|
|
+const flattenTree = (root) =>{
|
|
|
+ if (!root) return []; // 空树返回空数组
|
|
|
+
|
|
|
+ const result = []; // 存储展开后的数组
|
|
|
+
|
|
|
+ // 递归遍历树
|
|
|
+ function dfs(node) {
|
|
|
+ result.push({
|
|
|
+ id: node.id,
|
|
|
+ label: node.label||node.name,
|
|
|
+ device: node.device||node.id,
|
|
|
+ type: node.type,
|
|
|
+ mock: node.mock,
|
|
|
+ // children: node.children,
|
|
|
+ }); // 将当前节点值添加到结果数组
|
|
|
+ // 遍历当前节点的子节点
|
|
|
+ if(node.children){
|
|
|
+ for (let child of node.children) {
|
|
|
+ dfs(child); // 递归调用DFS
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ root.forEach((item) => {
|
|
|
+ dfs(item);
|
|
|
+ });
|
|
|
+ // dfs(root); // 从根节点开始遍历
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+const addDataDialog = reactive<any>({});
|
|
|
+
|
|
|
+const showAddData = (row?: any, index?: number) => {
|
|
|
+ if (row) {
|
|
|
+ addDataDialog.header = '编辑数据';
|
|
|
+ addDataDialog.data = JSON.parse(JSON.stringify(row));
|
|
|
+ addDataDialog.index = index;
|
|
|
+ } else {
|
|
|
+ addDataDialog.header = '添加数据';
|
|
|
+ addDataDialog.data = { type: 'string' };
|
|
|
+ }
|
|
|
+
|
|
|
+ addDataDialog.show = true;
|
|
|
+};
|
|
|
+
|
|
|
+const clearData = () => {
|
|
|
+ dataDialog.datasetId = undefined;
|
|
|
+ dataDialog.dataset.id = undefined;
|
|
|
+ dataDialog.dataset.name = undefined;
|
|
|
+ dataDialog.dataset.url = undefined;
|
|
|
+ dataDialog.dataset.devices = [];
|
|
|
+ setDot(true);
|
|
|
+}
|
|
|
+
|
|
|
+const closeDataDialog = () => {
|
|
|
+ (meta2d.store.data as any).dataset = dataDialog.dataset;
|
|
|
+ dataDialog.show = false;
|
|
|
+ meta2d.connectNetwork();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const onOkAddData = () => {
|
|
|
+ if (!addDataDialog.data.label) {
|
|
|
+ MessagePlugin.error('请填写名称');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!addDataDialog.data.id) {
|
|
|
+ MessagePlugin.error('请填写数据ID');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (addDataDialog.header === '添加数据') {
|
|
|
+ dataDialog.dataset.devices.push(addDataDialog.data);
|
|
|
+ } else {
|
|
|
+ dataDialog.dataset.devices[addDataDialog.index] = addDataDialog.data;
|
|
|
+
|
|
|
+ //更新所有绑定该id的pen label
|
|
|
+ let binds = meta2d.store.bind[addDataDialog.data.id];
|
|
|
+ if (binds) {
|
|
|
+ binds.forEach((item) => {
|
|
|
+ const pen: Pen = meta2d.findOne(item.id);
|
|
|
+ pen.realTimes &&
|
|
|
+ pen.realTimes.forEach((_realTime) => {
|
|
|
+ if (_realTime.key === item.key) {
|
|
|
+ _realTime.bind.label = addDataDialog.data.label;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ addDataDialog.show = false;
|
|
|
+};
|
|
|
+
|
|
|
+const changeDataID = (value) => {
|
|
|
+ if (!value) {
|
|
|
+ MessagePlugin.error('变量名不能为空!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let item = dataDialog.dataset.devices.filter((item) => item.id === value);
|
|
|
+ if (item && item.length) {
|
|
|
+ MessagePlugin.error('变量名重复!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ addDataDialog.data.id = value;
|
|
|
+};
|
|
|
+
|
|
|
+const changeDataLabel = (value) => {
|
|
|
+ if (!value) {
|
|
|
+ MessagePlugin.error('显示名称不能为空!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let item = dataDialog.dataset.devices.filter((item) => item.label === value);
|
|
|
+ if (item && item.length) {
|
|
|
+ MessagePlugin.error('显示名称重复!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ addDataDialog.data.label = value;
|
|
|
+};
|
|
|
+
|
|
|
const addDataset = () => {
|
|
|
dataDialog.dataset = {
|
|
|
name: '',
|
|
@@ -1615,17 +1908,23 @@ const backDataset = () => {
|
|
|
};
|
|
|
|
|
|
const onOkDataset = async (saveas = false) => {
|
|
|
- if (!dataDialog.dataset.name) {
|
|
|
- MessagePlugin.error('名称不能为空');
|
|
|
+ // if (!dataDialog.dataset.name) {
|
|
|
+ // MessagePlugin.error('名称不能为空');
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ if(!(dataDialog.dataset.devices&&dataDialog.dataset.devices.length)){
|
|
|
+ MessagePlugin.error('变量列表不能为空');
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
const dataset = JSON.parse(JSON.stringify(dataDialog.dataset));
|
|
|
let data = dataset;
|
|
|
data.type = 'dataset';
|
|
|
+ if(!data.name){
|
|
|
+ data.name = meta2d.store.data.name;
|
|
|
+ }
|
|
|
data = transformData(dataset,'toNetwork');
|
|
|
// 保存到我的数据源
|
|
|
- if (saveas || dataDialog.editDataset === 1) {
|
|
|
+ if (saveas || !dataset.id) {
|
|
|
delete dataset.id;
|
|
|
delete dataset._id;
|
|
|
dataset.type = 'dataset';
|
|
@@ -1651,14 +1950,58 @@ const onOkDataset = async (saveas = false) => {
|
|
|
}
|
|
|
delete dataset.devices;
|
|
|
// @ts-ignore
|
|
|
- meta2d.store.data.dataset = dataset;
|
|
|
+ // console.log("dataset",dataset);
|
|
|
+ // meta2d.store.data.dataset = dataset;
|
|
|
|
|
|
- setDot(true);
|
|
|
+ // setDot(true);
|
|
|
|
|
|
dataDialog.editDataset = false;
|
|
|
delete dataDialog.datesetBak;
|
|
|
};
|
|
|
|
|
|
+const downloadAsExcel = () => {
|
|
|
+ if(!(dataDialog.dataset.devices&&dataDialog.dataset.devices.length)){
|
|
|
+ MessagePlugin.error('变量列表不能为空!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const name = meta2d.store.data.name;
|
|
|
+ const columns:any[] = [{
|
|
|
+ key: 'label',
|
|
|
+ header: '显示名称',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'id',
|
|
|
+ header: '变量名',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'type',
|
|
|
+ header: '类型',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'mock',
|
|
|
+ header: '值范围',
|
|
|
+ }];
|
|
|
+ saveAsExcel(name,columns,dataDialog.dataset.devices);
|
|
|
+}
|
|
|
+
|
|
|
+const downloadAsJson = () => {
|
|
|
+ if(!(dataDialog.dataset.devices&&dataDialog.dataset.devices.length)){
|
|
|
+ MessagePlugin.error('变量列表不能为空!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ import('file-saver').then(({ saveAs }) => {
|
|
|
+ saveAs(
|
|
|
+ new Blob(
|
|
|
+ [JSON.stringify(dataDialog.dataset)],
|
|
|
+ {
|
|
|
+ type: 'text/plain;charset=utf-8',
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ `${dataDialog.dataset.name || '未命名'}.json`
|
|
|
+ );
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
const onDelDataset = async (item: any, i: number) => {
|
|
|
const ret: any = await axios.post(`/api/data/datasource/delete`, {
|
|
|
id: item.id,
|
|
@@ -1700,8 +2043,8 @@ const onSelDataset = async (init = false) => {
|
|
|
Object.assign(dataset,{...ret.data});
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- dataDialog.dataset = dataset;
|
|
|
+ mergeDataset(dataDialog.dataset,dataset.devices);
|
|
|
+ // dataDialog.dataset = dataset;
|
|
|
|
|
|
if (!init) {
|
|
|
const d = JSON.parse(JSON.stringify(dataset));
|
|
@@ -1714,6 +2057,23 @@ const onSelDataset = async (init = false) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+const mergeDataset = (arr1:any,arr2:any[]) => {
|
|
|
+ if(!(arr2&&arr2.length)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(!arr1.devices){
|
|
|
+ arr1.devices = [];
|
|
|
+ }
|
|
|
+ arr2.forEach((item)=>{
|
|
|
+ let index = arr1.devices.findIndex((elem)=>elem.id === item.id);
|
|
|
+ if(index>=0){
|
|
|
+ Object.assign(arr1.devices[index],item);
|
|
|
+ }else{
|
|
|
+ arr1.devices.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
const share = async () => {
|
|
|
if (!(user && user.id)) {
|
|
|
MessagePlugin.warning('请先登录!');
|
|
@@ -1950,4 +2310,10 @@ const theme = computed(() => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.select-options{
|
|
|
+ .t-popup__content{
|
|
|
+ /* width: 240px !important; */
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|