Browse Source

feat(external): screen

Casper Dai 3 years ago
parent
commit
9658dadb02

+ 0 - 2
.env

@@ -8,8 +8,6 @@ LOGGER = 'disabled'
 __PLACEHOLDER__ = 'disabled'
 # 设备仪表盘
 __DEVICE_DASHBARD__ = 'disabled'
-# 物联网关
-__GATEWAY__ = 'disabled'
 # 备份设备
 __SUB_DEVICE__ = 'disabled'
 # 设备接管

+ 0 - 1
feature.js

@@ -24,7 +24,6 @@ module.exports = {
     __STAGING__: isStaging,
     ...createFeature('__PLACEHOLDER__'),
     ...createFeature('__DEVICE_DASHBARD__'),
-    ...createFeature('__GATEWAY__'),
     ...createFeature('__SUB_DEVICE__'),
     ...createFeature('__TAKEOVER__'),
     ...createFeature('__WECHAT__')

+ 49 - 0
src/api/external.js

@@ -338,3 +338,52 @@ export function getSensorRecords (params, options) {
     ...options
   })
 }
+
+export function getScreenManufacturers () {
+  return request({
+    url: '/device/thirdPartyScreen/manufacturer',
+    method: 'GET'
+  })
+}
+
+export function getScreens (query) {
+  const { pageNum: pageIndex, pageSize, ...params } = query
+  return request({
+    url: '/device/thirdPartyScreen/list',
+    method: 'GET',
+    params: {
+      pageIndex, pageSize,
+      ...params
+    }
+  })
+}
+
+export function addScreen (data) {
+  return add({
+    url: '/device/thirdPartyScreen',
+    method: 'POST',
+    data
+  })
+}
+
+export function updateScreen (data) {
+  return update({
+    url: '/device/thirdPartyScreen',
+    method: 'PUT',
+    data
+  })
+}
+
+export function deleteScreen ({ id }) {
+  return del({
+    url: `/device/thirdPartyScreen/${id}`,
+    method: 'DELETE'
+  }, '该屏幕')
+}
+
+export function getScreen (deviceId) {
+  return request({
+    url: `/device/bind/thirdPartyScreen/${deviceId}`,
+    method: 'GET'
+  }).then(({ data }) => data?.[0])
+}

+ 5 - 1
src/router/index.js

@@ -430,13 +430,17 @@ export const asyncRoutes = [
     access: Access.MANAGE_TENANTS,
     meta: { title: '设备录入', icon: 'em' },
     children: [
+      {
+        path: 'screen',
+        component: () => import('@/views/external/screen/index'),
+        meta: { title: '屏幕' }
+      },
       {
         path: 'transmitter',
         component: () => import('@/views/external/transmitter/index'),
         meta: { title: '发送控制设备' }
       },
       {
-        dev: !__GATEWAY__,
         path: 'gateway',
         component: () => import('@/views/external/gateway/index'),
         meta: { title: '网关' }

+ 215 - 0
src/views/external/screen/index.vue

@@ -0,0 +1,215 @@
+<template>
+  <wrapper
+    fill
+    margin
+    padding
+    background
+  >
+    <schema-table
+      ref="table"
+      :schema="schema"
+    />
+    <confirm-dialog
+      ref="editDialog"
+      :title="dialogTitle"
+      @confirm="onConfirm"
+    >
+      <div class="c-grid-form u-align-self--center">
+        <span class="c-grid-form__label u-required">厂商</span>
+        <schema-select
+          v-model="screen.manufacturerKey"
+          class="u-width"
+          placeholder="请选择厂商"
+          :schema="manufacturerSelectSchema"
+        />
+        <span class="c-grid-form__label u-required">型号</span>
+        <el-input
+          v-model.trim="screen.type"
+          placeholder="最多50个字符"
+          maxlength="50"
+          clearable
+        />
+        <span class="c-grid-form__label u-required">间距</span>
+        <div class="l-flex--row c-grid-form__option">
+          <el-input
+            v-model.trim="screen.pitch"
+            class="c-sibling-item u-width--xs"
+            placeholder="例:3.6"
+            maxlength="10"
+            clearable
+          />
+          <span class="c-sibling-item u-font-size--sm">mm</span>
+        </div>
+        <span class="c-grid-form__label">点对点</span>
+        <div class="l-flex--row c-grid-form__option">
+          <el-switch
+            v-model="screen.dot"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+          />
+        </div>
+        <span class="c-grid-form__label u-required">质保到期时间</span>
+        <el-date-picker
+          v-model="screen.qualificationDate"
+          class="u-width--sm"
+          type="date"
+          placeholder="请选择质保到期时间"
+          value-format="yyyy-MM-dd"
+          :clearable="false"
+        />
+        <span class="c-grid-form__label u-required">位置</span>
+        <el-input
+          v-model.trim="screen.remark"
+          type="textarea"
+          placeholder="最多100个字符"
+          maxlength="100"
+          :rows="4"
+          resize="none"
+          show-word-limit
+        />
+      </div>
+    </confirm-dialog>
+  </wrapper>
+</template>
+
+<script>
+import {
+  getScreenManufacturers,
+  getScreens,
+  addScreen,
+  updateScreen,
+  deleteScreen
+} from '@/api/external'
+
+export default {
+  name: 'ScreenList',
+  data () {
+    const manufacturerSelectSchema = {
+      remote: getScreenManufacturers,
+      value: 'manufacturerKey',
+      label: 'manufacturerName'
+    }
+
+    return {
+      screen: {},
+      manufacturerSelectSchema,
+      schema: {
+        condition: { manufacturerKey: void 0 },
+        list: getScreens,
+        buttons: [
+          { type: 'add', on: this.onAdd }
+        ],
+        filters: [
+          { key: 'manufacturerKey', type: 'select', placeholder: '厂商', ...manufacturerSelectSchema }
+        ],
+        cols: [
+          { prop: 'manufacturerName', label: '厂商', 'min-width': 60 },
+          { prop: 'type', label: '型号' },
+          { prop: 'pitch', label: '间距(mm)' },
+          { label: '点对点', type: 'tag', render: ({ dot }) => {
+            return {
+              type: dot ? 'success' : 'danger',
+              label: dot ? '是' : '否'
+            }
+          } },
+          { prop: 'qualificationDate', label: '质保到期时间', 'align': 'center' },
+          { prop: 'remark', label: '位置', 'min-width': 160, 'align': 'right' },
+          { type: 'invoke', render: [
+            { label: '删除', on: this.onDel }
+          ] }
+        ]
+      }
+    }
+  },
+  computed: {
+    dialogTitle () {
+      return this.screen.id ? '编辑屏幕' : '新增屏幕'
+    }
+  },
+  methods: {
+    onAdd () {
+      this.screen = {
+        manufacturerKey: '',
+        type: '',
+        pitch: '',
+        dot: false,
+        qualificationDate: '',
+        remark: ''
+      }
+      this.$refs.editDialog.show()
+    },
+    onEdit ({ id, manufacturerKey, manufacturerName, name, type }) {
+      this.manufacturerSelectSchema.option = { value: manufacturerKey, label: manufacturerName }
+      this.screen = { id, manufacturerKey, name, type }
+      this.$refs.editDialog.show()
+    },
+    onConfirm (done) {
+      const screen = this.screen
+      if (!screen.manufacturerKey) {
+        this.$message({
+          type: 'warning',
+          message: '请选择厂商'
+        })
+        return
+      }
+      if (!screen.type) {
+        this.$message({
+          type: 'warning',
+          message: '请填写屏幕型号'
+        })
+        return
+      }
+      if (!screen.pitch) {
+        this.$message({
+          type: 'warning',
+          message: '请填写屏幕间距'
+        })
+        return
+      }
+      if (!/^\d+(\.\d+)?$/.test(screen.pitch)) {
+        this.$message({
+          type: 'warning',
+          message: '屏幕间距格式错误'
+        })
+        return
+      }
+      if (!screen.qualificationDate) {
+        this.$message({
+          type: 'warning',
+          message: '请填写屏幕质保到期时间'
+        })
+        return
+      }
+      if (!screen.remark) {
+        this.$message({
+          type: 'warning',
+          message: '请填写屏幕位置'
+        })
+        return
+      }
+      if (screen.id) {
+        this.onConfirmEdit(screen, done)
+      } else {
+        this.onConfirmAdd(screen, done)
+      }
+    },
+    onConfirmAdd (screen, done) {
+      addScreen(screen).then(() => {
+        done()
+        this.$refs.table.resetCondition({ manufacturerKey: this.screen.manufacturerKey })
+      })
+    },
+    onConfirmEdit (screen, done) {
+      updateScreen(screen).then(() => {
+        done()
+        this.$refs.table.pageTo()
+      })
+    },
+    onDel (item) {
+      deleteScreen(item).then(() => {
+        this.$refs.table.decrease(1)
+      })
+    }
+  }
+}
+</script>

+ 2 - 2
src/views/platform/tenant/device/settings/index.vue

@@ -90,9 +90,9 @@ export default {
           { key: 'SendingCard', label: '发送控制设备' },
           { key: 'ReceivingCard', label: '接收卡' },
           { key: 'Camera', label: '摄像头' },
-          __GATEWAY__ ? { key: 'Gateway', label: '网关' } : null,
+          { key: 'Gateway', label: '网关' },
           { key: 'DeviceShadow', label: '影子配置' }
-        ].filter(Boolean)
+        ]
         : [
           { key: 'DeviceNormalConfig', label: '基础配置' }
         ]