Sfoglia il codice sorgente

feat(ai): camera capture black screen detection

Casper Dai 2 anni fa
parent
commit
f1b16aeb14

+ 1 - 2
src/components/service/DraggableItem/index.vue

@@ -21,11 +21,10 @@
         class="l-flex__none c-sibling-item near o-draggable-item__seconds"
         size="small"
         title="上播时长(s)"
+        :disabled="item.disabled"
         controls-position="right"
         :min="1"
         :max="86400"
-        :step="1"
-        :disabled="item.disabled"
         step-strictly
       />
     </template>

+ 5 - 0
src/router/index.js

@@ -345,6 +345,11 @@ export const asyncRoutes = [
         path: 'ai/timing',
         component: () => import('@/views/realm/ai/ai-timing/index'),
         meta: { title: 'AI抽帧检测' }
+      },
+      {
+        path: 'ai/camera',
+        component: () => import('@/views/external/camera/snap/index'),
+        meta: { title: '摄像头黑屏检测' }
       }
     ]
   },

+ 2 - 0
src/views/ad/automation/contract/index.vue

@@ -83,6 +83,7 @@
                 v-model="contract.duration"
                 class="has-info"
                 data-info="范围:1~86400"
+                controls-position="right"
                 :min="1"
                 :max="86400"
                 step-strictly
@@ -90,6 +91,7 @@
               <div class="c-grid-form__label">上播次数</div>
               <el-input-number
                 v-model="contract.count"
+                controls-position="right"
                 :min="1"
                 step-strictly
               />

+ 2 - 0
src/views/ad/automation/task/components/AssetTaskDialog.vue

@@ -50,6 +50,7 @@
             <div class="c-grid-form__label">上播时长(s)</div>
             <el-input-number
               v-model="taskDuration"
+              controls-position="right"
               :min="1"
               :max="86400"
               :disabled="disableTaskDuration"
@@ -58,6 +59,7 @@
             <div class="c-grid-form__label">上播次数</div>
             <el-input-number
               v-model="taskCount"
+              controls-position="right"
               :min="1"
               step-strictly
             />

+ 2 - 0
src/views/external/box/components/Product.vue

@@ -29,6 +29,7 @@
           <el-input-number
             v-model="currObj.wide"
             class="l-flex__auto c-sibling-item"
+            controls-position="right"
             :min="1"
             :max="999999"
             step-strictly
@@ -37,6 +38,7 @@
           <el-input-number
             v-model="currObj.high"
             class="l-flex__auto c-sibling-item"
+            controls-position="right"
             :min="1"
             :max="999999"
             step-strictly

+ 3 - 0
src/views/external/box/settings/components/AdConfigDialog.vue

@@ -18,6 +18,7 @@
         v-model="attributes.minDuration"
         class="has-info"
         data-info="范围:5~600"
+        controls-position="right"
         :min="5"
         :max="600"
         :step="5"
@@ -26,6 +27,7 @@
       <span class="c-grid-form__label">起投次数</span>
       <el-input-number
         v-model="attributes.minCount"
+        controls-position="right"
         :min="1"
         :max="1000"
         step-strictly
@@ -35,6 +37,7 @@
         v-model="attributes.price"
         class="has-info"
         :data-info="price"
+        controls-position="right"
         :min="1"
         :max="1000000000"
         step-strictly

+ 4 - 0
src/views/external/box/settings/components/AttributeConfigDialog.vue

@@ -28,6 +28,7 @@
         v-model="attributes.orderQrSize"
         class="has-info"
         :data-info="maxSizeDesc"
+        controls-position="right"
         :min="64"
         :max="maxSize"
         step-strictly
@@ -56,6 +57,7 @@
         v-model="paddingH"
         class="has-info"
         :data-info="maxPaddingHDesc"
+        controls-position="right"
         :min="0"
         :max="maxPaddingH"
         step-strictly
@@ -65,6 +67,7 @@
         v-model="paddingV"
         class="has-info"
         :data-info="maxPaddingVDesc"
+        controls-position="right"
         :min="0"
         :max="maxPaddingV"
         step-strictly
@@ -79,6 +82,7 @@
         v-model="attributes.orderQrTipFontSize"
         class="has-info"
         :data-info="maxFontSizeDesc"
+        controls-position="right"
         :min="12"
         :max="maxFontSize"
         step-strictly

+ 2 - 0
src/views/external/box/settings/components/ContentProtectionConfigDialog.vue

@@ -42,6 +42,7 @@
           <el-input-number
             v-model="item.cardId"
             class="l-flex__auto c-sibling-item"
+            controls-position="right"
             :min="0"
             :max="255"
             step-strictly
@@ -50,6 +51,7 @@
           <el-input-number
             v-model="item.srcId"
             class="l-flex__auto c-sibling-item"
+            controls-position="right"
             :min="0"
             :max="255"
             step-strictly

+ 12 - 3
src/views/external/box/settings/components/RecordConfigDialog.vue

@@ -8,23 +8,29 @@
       <span class="c-grid-form__label">宽度</span>
       <el-input-number
         v-model="recordConfig.videoWidth"
+        class="has-info"
+        data-info="范围:240~7680"
+        controls-position="right"
         :min="240"
-        :max="999999"
+        :max="7680"
         step-strictly
       />
       <span class="c-grid-form__label">高度</span>
       <el-input-number
         v-model="recordConfig.videoHeight"
+        class="has-info"
+        data-info="范围:240~7680"
+        controls-position="right"
         :min="240"
-        :max="999999"
+        :max="7680"
         step-strictly
       />
       <span class="c-grid-form__label">码率</span>
       <div class="l-flex--row c-grid-form__option">
         <el-input-number
           v-model="recordConfig.videoBitRate"
+          controls-position="right"
           :min="36"
-          :max="999999"
           step-strictly
         />
         &nbsp;Kbps(最低36Kbps)
@@ -33,6 +39,9 @@
       <div class="l-flex--row c-grid-form__option">
         <el-input-number
           v-model="recordConfig.frameRate"
+          class="has-info"
+          data-info="范围:1~24"
+          controls-position="right"
           :min="1"
           :max="24"
           step-strictly

+ 53 - 0
src/views/external/camera/snap/api.js

@@ -0,0 +1,53 @@
+import { AssetType } from '@/constant'
+import request from '@/utils/request'
+import {
+  send,
+  update,
+  addTenant
+} from '@/api/base'
+
+// 查询抓图黑屏检测配置
+export function getSnapPicConfig (identifier) {
+  return send({
+    url: `/camera/${identifier}/snapPicConfig`,
+    method: 'GET'
+  })
+}
+
+// 增改抓图黑屏检测配置
+export function updateSnapPicConfig (identifier, data) {
+  return update({
+    url: `/camera/${identifier}/snapPicConfig`,
+    method: 'POST',
+    data
+  })
+}
+
+// 查询抓图黑屏检测检测结果
+export function getSnapPicResults (query) {
+  const { pageNum: pageIndex, pageSize, ...params } = query
+  return request({
+    url: '/camera/snapPic/page',
+    method: 'GET',
+    params: addTenant({
+      pageIndex, pageSize,
+      ...params
+    })
+  }).then(({ data, totalCount }) => {
+    return {
+      data: data.map(({ snapPicUrl, ...params }) => {
+        return {
+          file: snapPicUrl
+            ? {
+              type: AssetType.IMAGE,
+              url: snapPicUrl,
+              thumb: snapPicUrl
+            }
+            : null,
+          ...params
+        }
+      }),
+      totalCount
+    }
+  })
+}

+ 183 - 0
src/views/external/camera/snap/index.vue

@@ -0,0 +1,183 @@
+<template>
+  <wrapper
+    fill
+    margin
+    padding
+    background
+  >
+    <schema-table
+      ref="table"
+      :schema="schema"
+    />
+    <confirm-dialog
+      ref="editDialog"
+      title="抓图参数配置"
+      @confirm="onConfirm"
+    >
+      <div class="c-grid-form auto u-align-self--center">
+        <span class="c-grid-form__label">启用</span>
+        <div class="l-flex--row c-grid-form__option">
+          <el-switch
+            v-model="config.enabled"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+          />
+        </div>
+        <span class="c-grid-form__label">抓图时间范围</span>
+        <el-time-picker
+          v-model="range"
+          class="u-width"
+          is-range
+          format="HH:mm:ss"
+          value-format="HH:mm:ss"
+          :clearable="false"
+        />
+        <span class="c-grid-form__label">抓图间隔(s)</span>
+        <el-input-number
+          v-model="config.offset"
+          controls-position="right"
+          :min="1"
+          step-strictly
+        />
+        <span class="c-grid-form__label">开机保护时间(s)</span>
+        <el-input-number
+          v-model="config.preserveSecond"
+          controls-position="right"
+          :min="0"
+          step-strictly
+        />
+        <span class="c-grid-form__label">确认黑屏持续时间(s)</span>
+        <el-input-number
+          v-model="config.confirmDuration"
+          class="has-info"
+          data-info="范围:1~60"
+          controls-position="right"
+          :min="1"
+          :max="60"
+          step-strictly
+        />
+      </div>
+    </confirm-dialog>
+    <table-dialog
+      ref="resultDialog"
+      title="检测结果"
+      size="lg"
+      :schema="snapSchema"
+    />
+    <preview-dialog ref="previewDialog" />
+  </wrapper>
+</template>
+
+<script>
+import {
+  Camera,
+  CameraToThirdPartyMap
+} from '@/constant'
+import { getThirdPartyDevices } from '@/api/external'
+import {
+  getSnapPicConfig,
+  updateSnapPicConfig,
+  getSnapPicResults
+} from './api'
+
+const statusMap = ['-', '未审核', '队列中', '审核中', '审核后正常', '审核后黑屏', '审核失败']
+
+export default {
+  name: 'CameraSnapPic',
+  data () {
+    return {
+      schema: {
+        list: getThirdPartyDevices,
+        condition: { cameraType: Camera.LED, deviceType: CameraToThirdPartyMap[Camera.LED] },
+        filters: [
+          { key: 'name', type: 'search', placeholder: '名称' }
+        ],
+        cols: [
+          { type: 'refresh' },
+          { prop: 'name', label: '名称' },
+          { prop: 'identifier', label: '唯一标识' },
+          { type: 'tag', render: ({ onlineStatus }) => onlineStatus === 1
+            ? { type: 'success', label: '在线' }
+            : { type: 'danger', label: '离线' } },
+          { label: '使用情况', type: 'tag', render: ({ bound }) => bound
+            ? { type: 'success', label: '已使用' }
+            : { type: 'primary', label: '未使用' } },
+          { type: 'invoke', render: [
+            { label: '配置', on: this.onConfig },
+            { label: '检测结果', on: this.onResult }
+          ] }
+        ]
+      },
+      curIdentifier: '',
+      config: {}
+    }
+  },
+  computed: {
+    range: {
+      get () {
+        return [this.config.startTime || '', this.config.endTime || '']
+      },
+      set (val) {
+        this.$set(this.config, 'startTime', val[0])
+        this.$set(this.config, 'endTime', val[1])
+      }
+    },
+    snapSchema () {
+      return {
+        list: getSnapPicResults,
+        condition: { identifier: this.curIdentifier },
+        cols: [
+          { type: 'refresh' },
+          { prop: 'file', label: '截图', type: 'asset', on: this.onViewAsset },
+          { prop: 'snapTime', label: '抓图时间' },
+          { prop: 'auditState', label: '审核状态', render: ({ auditState }) => statusMap[auditState] || '-' },
+          { prop: 'auditMsg', label: '审核信息' },
+          { prop: 'auditTime', label: '审核时间' }
+        ]
+      }
+    }
+  },
+  methods: {
+    onConfig (camera) {
+      getSnapPicConfig(camera.identifier).then(({ data }) => {
+        const { startTime, endTime, offset, preserveSecond, confirmDuration, enabled } = {
+          startTime: '07:00:00',
+          endTime: '22:00:00',
+          offset: 10,
+          preserveSecond: 10,
+          confirmDuration: 10,
+          enabled: false,
+          ...data
+        }
+        this.config = {
+          startTime,
+          endTime,
+          offset,
+          preserveSecond,
+          confirmDuration,
+          enabled
+        }
+        this.$identifier = camera.identifier
+        this.$refs.editDialog.show()
+      })
+    },
+    onConfirm (done) {
+      if (!this.config.startTime || !this.config.endTime) {
+        this.$message({
+          type: 'warning',
+          message: '请选择抓图时间范围'
+        })
+        return
+      }
+      updateSnapPicConfig(this.$identifier, this.config).then(done)
+    },
+    onResult (camera) {
+      this.curIdentifier = camera.identifier
+      this.$refs.resultDialog.show()
+    },
+    onViewAsset ({ file }) {
+      this.$refs.previewDialog.show(file)
+    }
+  }
+}
+</script>

+ 2 - 0
src/views/external/mesh/index.vue

@@ -71,6 +71,7 @@
                   <span class="c-grid-form__label u-required">端口</span>
                   <el-input-number
                     v-model="item.port"
+                    controls-position="right"
                     :min="0"
                     step-strictly
                   />
@@ -103,6 +104,7 @@
                 <span class="c-grid-form__label u-required">端口</span>
                 <el-input-number
                   v-model="item.port"
+                  controls-position="right"
                   :min="0"
                   step-strictly
                 />

+ 2 - 2
src/views/external/multifunction-card/index.vue

@@ -33,15 +33,15 @@
         <span class="c-grid-form__label">端口数</span>
         <el-input-number
           v-model="item.portCount"
+          controls-position="right"
           :min="0"
-          :max="86400"
           step-strictly
         />
         <span class="c-grid-form__label">485接口数</span>
         <el-input-number
           v-model="item.rs485Count"
+          controls-position="right"
           :min="0"
-          :max="86400"
           step-strictly
         />
         <span class="c-grid-form__label u-required">唯一标识</span>

+ 1 - 1
src/views/external/plc/index.vue

@@ -34,8 +34,8 @@
         <span class="c-grid-form__label">端口数</span>
         <el-input-number
           v-model="item.portCount"
+          controls-position="right"
           :min="0"
-          :max="86400"
           step-strictly
         />
         <span class="c-grid-form__label u-required">唯一标识</span>

+ 1 - 0
src/views/platform/ai-stock/Assign.vue

@@ -30,6 +30,7 @@
             <el-input-number
               v-model="credit.initialAmount"
               class="c-sibling-item"
+              controls-position="right"
               :min="1"
               :max="remaining"
               step-strictly

+ 1 - 0
src/views/platform/ai-stock/Stock.vue

@@ -18,6 +18,7 @@
         <span class="c-grid-form__label">次数</span>
         <el-input-number
           v-model="credit.initialAmount"
+          controls-position="right"
           :min="1"
           :max="999999"
           step-strictly

+ 1 - 0
src/views/platform/remote-log/index.vue

@@ -33,6 +33,7 @@
         <div class="l-flex--row">
           <el-input-number
             v-model="logSetting.duration"
+            controls-position="right"
             :min="60"
             :max="86400"
             step-strictly

+ 1 - 0
src/views/platform/upgrade/index.vue

@@ -64,6 +64,7 @@
           <el-input-number
             v-model="apk.versionCode"
             :disabled="!manual"
+            controls-position="right"
             :min="1"
             :max="99999999999999"
             step-strictly

+ 1 - 0
src/views/realm/ai/ai-timing/components/DeviceServiceConfigDialog.vue

@@ -18,6 +18,7 @@
         v-model="deviceServiceConfig.offset"
         class="has-info"
         data-info="范围:10~3600"
+        controls-position="right"
         :min="10"
         :max="3600"
         step-strictly

+ 1 - 0
src/views/realm/ai/ai-timing/components/StratConfigDialog.vue

@@ -29,6 +29,7 @@
         v-model="tenantStratConfig.creditThreshold"
         class="has-info"
         data-info="库存低于阈值后将关闭抽帧检测"
+        controls-position="right"
         :min="0"
         :max="999999"
         step-strictly

+ 1 - 1
src/views/screen/material/program/ast/components/WidgetShortcut.vue

@@ -58,7 +58,7 @@
               class="l-flex__auto"
               size="mini"
               :min="1"
-              :max="9999999"
+              :max="86400"
               step-strictly
             />
             <div class="l-flex__none o-widget-shortcut__unit">秒</div>