Alsmile 1 vuosi sitten
vanhempi
sitoutus
fefc89ee7b

BIN
public/data.xlsx


+ 17 - 1
src/views/components/Dataset.vue

@@ -64,9 +64,16 @@
       @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 v-model="addDataDialog.data.label" placeholder="简短描述" />
+        <t-input
+          v-model="addDataDialog.data.label"
+          placeholder="数据点简短描述"
+        />
       </div>
       <div class="form-item mt-16">
         <label>数据点ID</label>
@@ -126,6 +133,11 @@ const { modelValue } = defineProps<{
 const emit = defineEmits(['update:modelValue', 'change']);
 
 const datasetColumns = ref([
+  {
+    colKey: 'device',
+    title: '设备',
+    ellipsis: true,
+  },
   {
     colKey: 'label',
     title: '数据点名称',
@@ -176,6 +188,10 @@ const getDatas = async () => {
 
 const importDataset = async () => {
   let columns: any = [
+    {
+      header: '设备',
+      key: 'device',
+    },
     {
       header: '数据点名称',
       key: 'label',

+ 73 - 19
src/views/components/PenDatas.vue

@@ -156,7 +156,10 @@
     :visible="true"
     class="data-link-dialog"
     header="动态数据设置"
-    @close="dataBindDialog.show = false"
+    @close="
+      dataBindDialog.datasetList = undefined;
+      dataBindDialog.show = false;
+    "
     @confirm="dataBindonConfirm"
     :top="70"
     :width="700"
@@ -179,7 +182,30 @@
           </div>
           <div class="label gray" v-else>无</div>
         </div>
-        <div class="form-item mt-8">
+        <div class="form-item flex middle mt-8">
+          <t-input
+            v-if="dataBindDialog.url"
+            v-model="dataBindDialog.device"
+            placeholder="设备"
+            style="width: 200px"
+          />
+          <t-select
+            v-else
+            class="mr-16"
+            style="width: 200px"
+            v-model="dataBindDialog.device"
+            clearable
+            placeholder="设备"
+            @change="getDataset"
+          >
+            <t-option
+              v-for="(item, i) in dataBindDialog.devices"
+              :key="item"
+              :value="item"
+              :label="item"
+            />
+          </t-select>
+
           <t-input
             placeholder="搜索"
             v-model="dataBindDialog.input"
@@ -233,7 +259,7 @@
           </li>
           <li class="mt-4">
             <label class="inline" style="width: 80px">随机值:</label>
-            {值1,值2,...}。例如:{1,2,3,4,5}
+            值1,值2,...。例如:1,2,3,4,5
           </li>
           <li class="mt-4">
             <label class="inline" style="width: 80px">范围数字:</label>
@@ -551,6 +577,11 @@ const dataSetColumns = [
     type: 'single',
     width: 50,
   },
+  {
+    colKey: 'device',
+    title: '设备',
+    ellipsis: { theme: 'light', trigger: 'context-menu' },
+  },
   {
     colKey: 'label',
     title: '数据点名称',
@@ -727,31 +758,53 @@ const getDataset = async () => {
   if (data.dataset.url) {
     const ret: any = await axios.get(data.dataset.url, {
       params: {
+        device: dataBindDialog.device || '',
         q: dataBindDialog.input,
         current: query.current,
         pageSize: query.pageSize,
       },
     });
     dataBindDialog.dataset = ret;
+    dataBindDialog.url = true;
     query.total = ret.total;
   } else {
-    const ret = await axios.post(`/api/data/datasources/get`, {
-      id: data.dataset.id,
-    });
-    if (ret?.data) {
-      data.dataset.data = ret.data;
-    }
-    if (dataBindDialog.input) {
-      dataBindDialog.dataset = data.dataset.data.filter((item: any) => {
-        return (
-          searchPinyin(item.label, dataBindDialog.input) ||
-          item.id.indexOf(dataBindDialog.input) > -1
-        );
+    dataBindDialog.url = false;
+    if (!dataBindDialog.datasetList) {
+      const ret = await axios.post(`/api/data/datasources/get`, {
+        id: data.dataset.id,
       });
-      query.total = dataBindDialog.dataset.length;
+      if (ret?.data) {
+        data.dataset.data = ret.data;
+        dataBindDialog.datasetList = data.dataset.data;
+        const set = new Set<string>();
+        for (const item of dataBindDialog.datasetList) {
+          set.add(item.device);
+        }
+        dataBindDialog.devices = Array.from(set);
+      } else {
+        dataBindDialog.dataset = [];
+        dataBindDialog.devices = [];
+        return;
+      }
+    }
+
+    if (dataBindDialog.device || dataBindDialog.input) {
+      dataBindDialog.dataset = dataBindDialog.datasetList.filter(
+        (item: any) => {
+          if (dataBindDialog.device && item.device !== dataBindDialog.device) {
+            return;
+          }
+
+          return (
+            searchPinyin(item.label, dataBindDialog.input) ||
+            item.id.indexOf(dataBindDialog.input) > -1
+          );
+        }
+      );
+      query.total = dataBindDialog.datasetList.length;
     } else {
-      dataBindDialog.dataset = data.dataset.data;
-      query.total = dataBindDialog.dataset.length;
+      dataBindDialog.dataset = [...dataBindDialog.datasetList];
+      query.total = dataBindDialog.datasetList.length;
     }
   }
   dataBindDialog.loading = false;
@@ -800,6 +853,7 @@ const doBindInit = () => {
 
 const dataBindonConfirm = () => {
   dataBindDialog.show = false;
+  dataBindDialog.datasetList = undefined;
   meta2d.initBinds();
 };
 
@@ -991,7 +1045,7 @@ onUnmounted(() => {
     }
 
     & > div {
-      width: 110px;
+      width: 90px;
       &.t-switch {
         width: fit-content;
         margin-left: 4px;

+ 5 - 0
src/views/components/View.vue

@@ -1363,6 +1363,11 @@ const onOkNetwork = async () => {
 };
 
 const datasetColumns = ref([
+  {
+    colKey: 'device',
+    title: '设备',
+    ellipsis: true,
+  },
   {
     colKey: 'label',
     title: '数据点名称',