Эх сурвалжийг харах

feat: batch operation

subtag, dataset and contract
Casper Dai 2 жил өмнө
parent
commit
b2e13ac124

+ 8 - 0
src/api/asset.js

@@ -197,3 +197,11 @@ export function deleteAssetSubTag ({ id, name }) {
     data: [id]
   }, name)
 }
+
+export function deleteAssetSubTags (ids) {
+  return del({
+    url: '/minio-data/subtag/delBatchByIds',
+    method: 'POST',
+    data: ids
+  }, '所选标签')
+}

+ 1 - 1
src/components/dialog/TableDialog/index.vue

@@ -7,7 +7,7 @@
     <schema-table
       ref="table"
       :schema="schema"
-      v-on="schema.listeners"
+      v-on="$listeners"
     >
       <template
         v-if="hasHeader"

+ 1 - 0
src/components/form/EditInput/index.vue

@@ -25,6 +25,7 @@
       @blur="onBlur"
       @input="onInput"
       @keydown.enter="$event.target.blur()"
+      @click.stop
     >
   </el-tooltip>
 </template>

+ 8 - 2
src/components/table/Table/index.vue

@@ -88,7 +88,7 @@
       :class="{ 'with-content': tableData.length }"
       :data="tableData"
       v-bind="tableProps"
-      v-on="$listeners"
+      v-on="tableListeners"
     >
       <schema-table-column
         v-for="(col, index) in cols"
@@ -136,11 +136,17 @@ export default {
         ...this.schema.props
       }
     },
+    tableListeners () {
+      return {
+        ...this.$listeners,
+        ...this.schema.listeners
+      }
+    },
     pageSize () {
       return this.schema.pageSize || 10
     },
     preventCopy () {
-      return !!this.$listeners['row-dblclick']
+      return !!this.tableListeners['row-dblclick']
     },
     cols () {
       return this.schema.cols.filter(Boolean)

+ 3 - 1
src/components/table/mixins/table.js

@@ -15,9 +15,11 @@ const ButtonConfig = {
 //   nonPagination?: false,
 //   singlePage?: false,
 //   pagination?: Object,
-//   condition?: Object,
+//   props?: Object,
+//   listeners?: Object,
 //   list: Function,
 //   transform?: Function
+//   condition?: Object,
 //   buttons?: [
 //     { type: String, icon: String, label: String, on: Function }
 //   ],

+ 2 - 2
src/views/ad/applet/history/index.vue

@@ -8,6 +8,7 @@
     <schema-table
       ref="table"
       :schema="schema"
+      @row-click="onToggle"
     />
     <table-dialog
       ref="adDialog"
@@ -34,7 +35,6 @@ export default {
       schema: {
         list: getOrders,
         transform: this.transform,
-        listeners: { 'row-click': this.onToggle },
         filters: [
           { key: 'status', type: 'select', placeholder: '订单状态', options: [
             { value: 1, label: '待审核' },
@@ -125,7 +125,7 @@ export default {
       }
     },
     onToggle (row) {
-      this.$refs.orderDialog.getTable().getInst().toggleRowExpansion(row)
+      this.$refs.table.getInst().toggleRowExpansion(row)
     },
     onView (order) {
       this.$order = order

+ 1 - 1
src/views/ad/applet/user/index.vue

@@ -20,6 +20,7 @@
       title="个人订单"
       size="lg"
       :schema="orderSchema"
+      @row-click="onToggle"
     />
     <table-dialog
       ref="adDialog"
@@ -92,7 +93,6 @@ export default {
       orderSchema: {
         list: this.getOrders,
         transform: this.transformOrder,
-        listeners: { 'row-click': this.onToggle },
         filters: [
           { key: 'status', type: 'select', placeholder: '订单状态', options: [
             { value: 1, label: '待审核' },

+ 8 - 0
src/views/ad/automation/contract/api.js

@@ -49,6 +49,14 @@ export function deleteContract ({ id, name }) {
   }, name)
 }
 
+export function deleteContracts (ids) {
+  return del({
+    url: '/contract/delete',
+    method: 'POST',
+    data: ids
+  }, '所选合同')
+}
+
 export function bindFileToContract (id, file) {
   const formData = new FormData()
   formData.append('id', id)

+ 27 - 3
src/views/ad/automation/contract/index.vue

@@ -8,6 +8,8 @@
     <schema-table
       ref="table"
       :schema="schema"
+      @row-click="onToggleSelection"
+      @selection-change="onSelectionChange"
     />
     <confirm-dialog
       ref="addDialog"
@@ -190,6 +192,7 @@ import {
   updateContractName,
   updateContract,
   deleteContract,
+  deleteContracts,
   bindFileToContract,
   deleteFileFromContract
 } from './api'
@@ -205,12 +208,14 @@ export default {
   data () {
     return {
       schema: {
-        buttons: [
-          { type: 'add', on: this.onAdd }
-        ],
         list: getContracts,
         transform: this.transform,
+        buttons: [
+          { type: 'add', on: this.onAdd },
+          { type: 'del', on: this.onBatchDel }
+        ],
         cols: [
+          { type: 'selection' },
           { label: '名称', render: (data, h) => h('edit-input', {
             props: {
               value: `${data.name}`
@@ -459,6 +464,25 @@ export default {
       deleteContract(contract).then(() => {
         this.$refs.table.decrease(1)
       })
+    },
+    onBatchDel () {
+      if (this.$selectionItems?.length) {
+        deleteContracts(this.$selectionItems.map(({ id }) => id)).then(() => {
+          this.$refs.table.decrease(this.$selectionItems.length)
+          this.$selectionItems = null
+        })
+      } else {
+        this.$message({
+          type: 'warning',
+          message: '请先选择需要删除的合同'
+        })
+      }
+    },
+    onToggleSelection (row) {
+      this.$refs.table.getInst().toggleRowSelection(row)
+    },
+    onSelectionChange (val) {
+      this.$selectionItems = val
     }
   }
 }

+ 8 - 0
src/views/ad/automation/dataset/api.js

@@ -104,6 +104,14 @@ export function unbindDatasetByDevice ({ id, name }) {
   })
 }
 
+export function unbindDatasetByDevices (ids) {
+  return confirmAndSend('解绑', '所选设备', {
+    url: '/media/dataset/batchUnbindDevice',
+    method: 'POST',
+    data: ids
+  })
+}
+
 export function unbindAssetsFromDataset (datasetId, keyNames) {
   return send({
     url: `/media/dataset/batchUnbindAsset/${datasetId}`,

+ 96 - 36
src/views/ad/automation/dataset/index.vue

@@ -8,42 +8,51 @@
     <schema-table
       ref="table"
       :schema="schema"
+    />
+    <confirm-dialog
+      ref="editDialog"
+      title="新增素材包"
+      @confirm="onSave"
     >
-      <confirm-dialog
-        ref="editDialog"
-        title="新增素材包"
-        @confirm="onSave"
-      >
-        <div class="c-grid-form u-align-self--center">
-          <span class="c-grid-form__label u-required">名称</span>
-          <el-input
-            v-model.trim="dataset.name"
-            placeholder="最多30个字符"
-            maxlength="30"
-            clearable
-          />
-        </div>
-      </confirm-dialog>
-      <table-dialog
-        ref="assetDialog"
-        size="lg"
-        :title="assetDialogName"
-        :schema="assetSchema"
-      />
-      <selection-table-dialog
-        ref="assetTableDialog"
-        title="上播内容选择"
-        message="请选择上播内容"
-        :schema="assetTableSchema"
-        @confirm="onChoosenAsset"
-      />
-      <table-dialog
-        ref="deviceDialog"
-        :title="deviceDialog"
-        :schema="deviceSchema"
-      />
-      <preview-dialog ref="previewDialog" />
-    </schema-table>
+      <div class="c-grid-form u-align-self--center">
+        <span class="c-grid-form__label u-required">名称</span>
+        <el-input
+          v-model.trim="dataset.name"
+          placeholder="最多30个字符"
+          maxlength="30"
+          clearable
+        />
+      </div>
+    </confirm-dialog>
+    <table-dialog
+      ref="assetDialog"
+      size="lg"
+      :title="assetDialogName"
+      :schema="assetSchema"
+    />
+    <selection-table-dialog
+      ref="assetTableDialog"
+      title="上播内容选择"
+      message="请选择上播内容"
+      :schema="assetTableSchema"
+      @confirm="onChoosenAsset"
+    />
+    <table-dialog
+      ref="deviceDialog"
+      :title="deviceDialog"
+      :schema="deviceSchema"
+      @row-click="onToggleSelection"
+      @selection-change="onSelectionChange"
+    />
+    <radio-table-dialog
+      ref="devicesDialog"
+      title="绑定设备"
+      message="请选择设备"
+      :schema="devicesSchema"
+      append-to-body
+      @confirm="onChoosenDevice"
+    />
+    <preview-dialog ref="previewDialog" />
   </wrapper>
 </template>
 
@@ -58,6 +67,7 @@ import {
   getAssetThumb,
   getAssetDuration
 } from '@/utils'
+import { getDevices } from '@/api/device'
 import {
   getDatasets,
   addDataset,
@@ -68,6 +78,8 @@ import {
   unbindAssetsFromDataset,
   updateDatasetAssetDuration,
   getDevicesByDataset,
+  bindDatasetToDevice,
+  unbindDatasetByDevices,
   unbindDatasetByDevice
 } from './api'
 import { assetPublicTableMixin } from '@/mixins/asset-table'
@@ -97,7 +109,7 @@ export default {
           // }, align: 'center' },
           { type: 'invoke', render: [
             { label: '上播内容', on: this.onEdit },
-            { label: '查看关联设备', on: this.onViewDevices },
+            { label: '关联设备', on: this.onViewDevices },
             { label: '删除', on: this.onDel }
           ], width: 240 }
         ]
@@ -134,7 +146,12 @@ export default {
       },
       deviceSchema: {
         list: getDevicesByDataset,
+        buttons: [
+          { type: 'add', label: '绑定设备', on: this.onBindDevice },
+          { icon: 'el-icon-scissors', label: '解绑', on: this.onUnbindDevices }
+        ],
         cols: [
+          { type: 'selection' },
           { prop: 'name', label: '名称' },
           { prop: 'address', label: '地址', 'min-width': 120 },
           { type: 'invoke', render: [
@@ -142,6 +159,16 @@ export default {
           ] }
         ]
       },
+      devicesSchema: {
+        list: getDevices,
+        filters: [
+          { key: 'name', type: 'search', placeholder: '设备名称' }
+        ],
+        cols: [
+          { prop: 'name', label: '设备名称' },
+          { prop: 'address', label: '地址' }
+        ]
+      },
       datasetName: '',
       dataset: {}
     }
@@ -250,6 +277,8 @@ export default {
     },
     onViewDevices ({ id, name }) {
       this.datasetName = name
+      this.$datasetId = id
+      this.$selectionItems = null
       this.$refs.deviceDialog.show({ datasetId: id })
     },
     onDel (dataset) {
@@ -261,6 +290,37 @@ export default {
       unbindDatasetByDevice(device).then(() => {
         this.$refs.deviceDialog.getTable().decrease(1)
       })
+    },
+    onUnbindDevices () {
+      if (this.$selectionItems?.length) {
+        unbindDatasetByDevices(this.$selectionItems.map(({ id }) => id)).then(() => {
+          this.$refs.deviceDialog.getTable().decrease(this.$selectionItems.length)
+          this.$selectionItems = null
+        })
+      } else {
+        this.$message({
+          type: 'warning',
+          message: '请先选择需要解绑的设备'
+        })
+      }
+    },
+    onToggleSelection (row) {
+      this.$refs.table.getInst().toggleRowSelection(row)
+    },
+    onSelectionChange (val) {
+      this.$selectionItems = val
+    },
+    onBindDevice () {
+      this.$refs.devicesDialog.show()
+    },
+    onChoosenDevice ({ value, done }) {
+      bindDatasetToDevice({
+        deviceId: value.id,
+        datasetId: this.$datasetId
+      }).then(() => {
+        done()
+        this.$refs.deviceDialog.getTable().pageTo(1)
+      })
     }
   }
 }

+ 2 - 2
src/views/realm/assign/Device.vue

@@ -8,6 +8,7 @@
       size="lg"
       title="分配设备"
       :schema="deviceSchema"
+      @row-dblclick="onChoosen"
     />
   </schema-table>
 </template>
@@ -55,9 +56,8 @@ export default {
     ...mapGetters(['tenant']),
     deviceSchema () {
       return {
-        listeners: { 'row-dblclick': this.onChoosen },
-        condition: { name: '', tenant: this.tenant },
         list: getDevicesByAdmin,
+        condition: { name: '', tenant: this.tenant },
         filters: [
           { key: 'name', type: 'search', placeholder: '设备名称' }
         ],

+ 22 - 2
src/views/screen/material/tag/index.vue

@@ -8,6 +8,7 @@
     <schema-table
       ref="table"
       :schema="schema"
+      @selection-change="onSelectionChange"
     />
     <confirm-dialog
       ref="editDialog"
@@ -32,7 +33,8 @@ import {
   getAssetSubTagsByTenant,
   addAssetSubTag,
   updateAssetSubTag,
-  deleteAssetSubTag
+  deleteAssetSubTag,
+  deleteAssetSubTags
 } from '@/api/asset'
 
 export default {
@@ -43,9 +45,11 @@ export default {
       schema: {
         list: getAssetSubTagsByTenant,
         buttons: [
-          { type: 'add', on: this.onAdd }
+          { type: 'add', on: this.onAdd },
+          { type: 'del', on: this.onBatchDel }
         ],
         cols: [
+          { type: 'selection' },
           { label: '名称', render: (data, h) => h('edit-input', {
             props: {
               value: `${data.name}`
@@ -104,6 +108,22 @@ export default {
       deleteAssetSubTag(tag).then(() => {
         this.$refs.table.decrease(1)
       })
+    },
+    onBatchDel () {
+      if (this.$selectionItems?.length) {
+        deleteAssetSubTags(this.$selectionItems.map(({ id }) => id)).then(() => {
+          this.$refs.table.decrease(this.$selectionItems.length)
+          this.$selectionItems = null
+        })
+      } else {
+        this.$message({
+          type: 'warning',
+          message: '请先选择需要删除的标签'
+        })
+      }
+    },
+    onSelectionChange (val) {
+      this.$selectionItems = val
     }
   }
 }

+ 2 - 2
src/views/screen/review/workflow/mine/index.vue

@@ -34,6 +34,7 @@
       ref="tableDialog"
       title="流程历史"
       :schema="historySchema"
+      @row-click="onToggleHistory"
     />
   </wrapper>
 </template>
@@ -105,9 +106,8 @@ export default {
     historySchema () {
       return {
         props: { rowClassName: this.isShowExpend },
-        listeners: { 'row-click': this.onToggleHistory },
-        condition: { workflowId: this.workflowId },
         list: viewHistory,
+        condition: { workflowId: this.workflowId },
         transform: this.transformHistory,
         cols: [
           { type: 'expand', render: this.renderReason },