Selaa lähdekoodia

[FE]联调视频回放接口,修改考勤管理、部门目录树显示逻辑

luoxu5 4 vuotta sitten
vanhempi
commit
9407505d9d

+ 44 - 30
security-protection-platform/src/api/common/index.js

@ -1,5 +1,8 @@
1 1
import http from '@/http'
2
2
import { keysMappingReverse } from '@/utils/keysMapping'
3
const mapping = {
4
  id: 'code'
5
}
3 6
const $default = http.$default
4 7
const api = {
5 8
  /**
@ -11,44 +14,55 @@ const api = {
11 14
        'name':'发电部'
12 15
      }]
13 16
   */
14
  getDepartments() {
15
    return $default.get('/sp/workEmployee/queryAllOrganize').then(resp => {
17
  getDepartments () {
18
    return $default.get('/sp/workEmployee/queryAllOrganize').then((resp) => {
16 19
      const data = resp.data.data
17 20
      if (!Array.isArray(data)) return resp
21
      console.log(data)
18 22
      // eslint-disable-next-line one-var
19
      const newData = [], map = {}, queue = []
20
      data.forEach(item => {
21
        if (item.parentCode === '-1') {
22
          const dep = { id: item.code, name: item.name, departments: [] }
23
          map[item.code] = newData.length
24
          newData.push(dep)
25
        } else {
26
          queue.push(item)
27
        }
28
      })
29
      queue.forEach(item => {
30
        if (!(item.parentCode in map)) return
31
        const dep = { id: item.code, name: item.name }
32
        newData[map[item.parentCode]].departments.push(dep)
33
      })
34
      resp.data = newData
35
      console.log('queryAllOrganize', resp)
23
      // const newData = [],
24
      //   map = {},
25
      //   queue = []
26
      // console.log(data)
27
      // data.forEach((item) => {
28
      //   if (item.parentCode === '-1') {
29
      //     const dep = { id: item.code, name: item.name, departments: [] }
30
      //     map[item.code] = newData.length
31
      //     newData.push(dep)
32
      //   } else {
33
      //     queue.push(item)
34
      //   }
35
      // })
36
      // queue.forEach((item) => {
37
      //   if (!(item.parentCode in map)) return
38
      //   const dep = { id: item.code, name: item.name }
39
      //   newData[map[item.parentCode]].departments.push(dep)
40
      // })
41
      // resp.data = newData
42
      // console.log(newData)
43
      // console.log('queryAllOrganize', resp)
44
      resp.data = keysMappingReverse(nest(data), mapping)
36 45
      return resp
37 46
    })
38 47
  },
39 48
40
  getEmployeeByOrgid(orgCode) {
41
    return $default.get(`/sp/workEmployee/queryEmployeeByOrg?orgCode=${orgCode}`).then(resp => {
42
      const data = resp.data.data || []
43
      resp.data = data.map(row => {
44
        return {
45
          name: row.name,
46
          userid: row.id
47
        }
49
  getEmployeeByOrgid (orgCode) {
50
    return $default
51
      .get(`/sp/workEmployee/queryEmployeeByOrg?orgCode=${orgCode}`)
52
      .then((resp) => {
53
        const data = resp.data.data || []
54
        resp.data = data.map((row) => {
55
          return {
56
            name: row.name,
57
            userid: row.id
58
          }
59
        })
60
        return resp
48 61
      })
49
      return resp
50
    })
51 62
  }
52 63
}
64
function nest (items, code = '-1', link = 'parentCode') {
65
  return items.filter(item => item[link] === code).map(item => ({ ...item, departments: nest(items, item.code) }))
66
}
53 67
54 68
export default api

+ 10 - 2
security-protection-platform/src/api/videoSurveillance/index.js

@ -1,5 +1,10 @@
1 1
import http from '@/http'
2 2
const { $http, $default } = http
3
import { keysMapping, keysMappingReverse } from '@/utils/keysMapping'
4
const videoMapping = {
5
  fileName: 'beginTime',
6
  fileId: 'videoUrl'
7
}
3 8
4 9
const api = {
5 10
  // 获取风场大门表格数据
@ -11,8 +16,11 @@ const api = {
11 16
    return $http.get('/videoSurveillance/getDistinguishData', params)
12 17
  },
13 18
  // 视频回放
14
  getVideoPlayBack (id) {
15
    return $default.get(`/sp/uploadFile/getFileUrl?fileName=${id}`).catch((err) => { return err })
19
  queryMonitorVideoLog (data) {
20
    return $default.get(`/sp/monitorVideoLog/queryMonitorVideoLog`, data).then(resp => {
21
      resp.data = keysMappingReverse(resp.data, videoMapping)
22
      return resp
23
    }).catch((err) => { return err })
16 24
  }
17 25
}
18 26
export default api

+ 75 - 48
security-protection-platform/src/modules/system/attendance/components/AttendancePanel/index.vue

@ -108,12 +108,7 @@
108 108
                <t-option :value="0">本月</t-option>
109 109
              </t-select>
110 110
              <t-select v-model="form.monthStart.day" style="margin-bottom:18px;width:84px">
111
                <t-option
112
                  v-for="item in dayOptions"
113
                  :key="item.value"
114
                  :value="item.value"
115
                  :disabled="item.value===1&&form.monthStart.type===-1"
116
                >
111
                <t-option v-for="item in dayOptions" :key="item.value" :value="item.value" :disabled="item.value===1&&form.monthStart.type===-1">
117 112
                  {{ item.label }}
118 113
                </t-option>
119 114
              </t-select>
@ -125,12 +120,7 @@
125 120
                <t-option :value="1" :disabled="form.monthEnd.day===31">下月</t-option>
126 121
              </t-select>
127 122
              <t-select v-model="form.monthEnd.day" style="margin-bottom:18px;width:84px">
128
                <t-option
129
                  v-for="item in dayOptions"
130
                  :key="item.value"
131
                  :value="item.value"
132
                  :disabled="item.value===31&&form.monthEnd.type===1"
133
                >
123
                <t-option v-for="item in dayOptions" :key="item.value" :value="item.value" :disabled="item.value===31&&form.monthEnd.type===1">
134 124
                  {{ item.label }}
135 125
                </t-option>
136 126
              </t-select>
@ -157,7 +147,7 @@ import commonapi from '@/api/common'
157 147
158 148
export default {
159 149
  components: { ShiftsItem, IntegerOnlyInput },
160
  data() {
150
  data () {
161 151
    return {
162 152
      filterValue: '',
163 153
      loadSubmit: false,
@ -176,10 +166,10 @@ export default {
176 166
  },
177 167
178 168
  computed: {
179
    currentSchedule() {
169
    currentSchedule () {
180 170
      return this.schedules.find(item => item.scheduleId === this.form.scheduleId) || {}
181 171
    },
182
    dayOptions() {
172
    dayOptions () {
183 173
      const options = []
184 174
      for (let i = 1; i <= 31; i++) {
185 175
        options.push({
@ -190,13 +180,13 @@ export default {
190 180
      return options
191 181
    },
192 182
    startDayValue: {
193
      get() {
183
      get () {
194 184
        const monthStart = this.form.monthStart || this.getDefaultForm().monthStart
195 185
        const type = parseInt(monthStart.type)
196 186
        const day = parseInt(monthStart.day)
197 187
        return type * 31 + day
198 188
      },
199
      set(val) {
189
      set (val) {
200 190
        if (this.form.monthStart == null) this.form.monthStart = {}
201 191
        const type = val < 1 ? -1 : 0
202 192
        this.form.monthStart.day = val - type * 31
@ -204,13 +194,13 @@ export default {
204 194
      }
205 195
    },
206 196
    endDayValue: {
207
      get() {
197
      get () {
208 198
        const monthEnd = this.form.monthEnd || this.getDefaultForm().monthEnd
209 199
        const type = parseInt(monthEnd.type)
210 200
        const day = parseInt(monthEnd.day)
211 201
        return type * 31 + day
212 202
      },
213
      set(val) {
203
      set (val) {
214 204
        if (this.form.monthEnd == null) this.form.monthEnd = {}
215 205
        const type = val > 31 ? 1 : 0
216 206
        this.form.monthEnd.day = val - type * 31
@ -220,54 +210,90 @@ export default {
220 210
  },
221 211
  watch: {
222 212
    // 处理开始日期和结束日期的联动
223
    startDayValue(val) {
213
    startDayValue (val) {
224 214
      this.endDayValue = val + 31 - 1
225 215
    },
226
    endDayValue(val) {
216
    endDayValue (val) {
227 217
      this.startDayValue = val - 31 + 1
228 218
    }
229 219
  },
230 220
231
  created() {
221
  created () {
232 222
    this.getDepartments()
233 223
    this.getSchedules()
234 224
  },
235 225
236 226
  methods: {
237
    getDepartments() {
227
    // 如果部门还有下级 递归
228
    nextDepartment (data, arr) {
229
      if (data.length > 0) {
230
        data.forEach(item => {
231
          arr.push({
232
            id: item.id + '',
233
            label: item.name,
234
            pid: item.parentCode
235
          })
236
          // 如果没有中值 默认选中一个值 这里是一般是公司的考勤
237
          if (this.treeValue.length === 0) this.handleDeptChange([item.id + ''])
238
          this.nextDepartment(item.departments, arr)
239
        })
240
      }
241
    },
242
    // 获取部门的考勤规则
243
    getDepartments () {
238 244
      this.loadDepts = true
239 245
      commonapi.getDepartments().then(resp => {
240 246
        const data = []
241
        console.log(resp)
242
        resp.data.forEach(item => {
243
          const orgId = item.id + ''
244
          data.push({
245
            id: orgId,
246
            label: item.name,
247
            disabled: true
248
          })
249
          item.departments.forEach(dept => {
250
            const deptId = dept.id + ''
251
            data.push({
252
              id: deptId,
253
              label: dept.name,
254
              pid: orgId
255
            })
256
            if (this.treeValue.length === 0) this.handleDeptChange([deptId])
257
          })
247
        // console.log(resp.data)
248
249
        // resp.data.forEach(item => {
250
        //   const orgId = item.id + ''
251
        //   data.push({
252
        //     id: orgId,
253
        //     label: item.name
254
        //     // disabled: true
255
        //   })
256
        //   item.departments.forEach(dept => {
257
        //     const deptId = dept.id + ''
258
        //     data.push({
259
        //       id: deptId,
260
        //       label: dept.name,
261
        //       pid: orgId
262
        //     })
263
        //     if (this.treeValue.length === 0) this.handleDeptChange([deptId])
264
        //     if (dept.departments.length > 0) {
265
        //       dept.departments.forEach(child => {
266
        //         const childId = child.id + ''
267
        //         data.push({
268
        //           id: childId,
269
        //           label: child.name,
270
        //           pid: deptId
271
        //         })
272
        //         this.handleDeptChange([childId])
273
        //       })
274
        //     }
275
        //   })
276
        // })
277
        // 递归
278
        this.nextDepartment(resp.data, data)
279
        // 删除pid为"-1"的的pid属性,否则tree渲染的时候没有根节点渲染不出来
280
        data.forEach(item => {
281
          if (item.pid === '-1') {
282
            delete item.pid
283
          }
258 284
        })
259 285
        this.treeData = data
260 286
      }).finally(() => {
261 287
        this.loadDepts = false
262 288
      })
263 289
    },
264
    getSchedules() {
290
    getSchedules () {
265 291
      sysapi.getSchedules().then(resp => {
266 292
        this.schedules = resp.data || []
267 293
        // this.scheduleId = this.schedules.length ? this.schedules[0].scheduleId : ''
268 294
      })
269 295
    },
270
    getDefaultForm() {
296
    getDefaultForm () {
271 297
      return {
272 298
        scheduleId: '',
273 299
        attendanceMonth: this.ENUM_NAT,
@ -281,7 +307,7 @@ export default {
281 307
        }
282 308
      }
283 309
    },
284
    getDepAttendanceRules(id) {
310
    getDepAttendanceRules (id) {
285 311
      this.loadForm = true
286 312
      sysapi.getDepAttendanceRules(id).then(resp => {
287 313
        this.form = resp.data.scheduleId === null ? this.getDefaultForm() : resp.data
@ -289,9 +315,9 @@ export default {
289 315
        this.loadForm = false
290 316
      })
291 317
    },
292
    submitAttendance() {
318
    submitAttendance () {
293 319
      this.loadSubmit = true
294
      sysapi.submitAttendanceRule({depId: this.treeValue[0], ...this.form }).then(resp => {
320
      sysapi.submitAttendanceRule({ depId: this.treeValue[0], ...this.form }).then(resp => {
295 321
        this.form = Object.assign(resp.data)
296 322
        this.$Message.success('修改成功')
297 323
      }, err => {
@ -301,15 +327,15 @@ export default {
301 327
        this.loadSubmit = false
302 328
      })
303 329
    },
304
    handleDeptChange(target) {
330
    handleDeptChange (target) {
305 331
      const deptId = target[0]
306 332
      this.treeValue[0] = deptId
307 333
      this.getDepAttendanceRules(deptId)
308 334
    },
309
    handleReset() {
335
    handleReset () {
310 336
      this.form = this.getDefaultForm()
311 337
    },
312
    handleSubmit() {
338
    handleSubmit () {
313 339
      this.$refs.form.validate(valid => {
314 340
        if (valid) {
315 341
          this.submitAttendance()
@ -318,6 +344,7 @@ export default {
318 344
    }
319 345
  }
320 346
}
347
321 348
</script>
322 349
323 350
<style lang="scss">

+ 95 - 29
security-protection-platform/src/modules/videoSurveillance/components/ReplayDialog/index.vue

@ -2,8 +2,20 @@
2 2
  <t-modal :visibled.sync="visible" :header-visibled="false" :footer-visibled="false" :no-padding="true" width="100%">
3 3
    <div class="replayer">
4 4
      <div class="replayer-list">
5
        <t-tabs v-model="currentTab" mode="scrollY" orientation="vertical" width="150px" @change="handleTabChange">
6
          <t-tab-panel v-for="item in list" :key="item.fileId" :label="item.fileName" :panel-id="item.fileId" />
5
        <div class="date-select-box row-12">
6
          <div class="col-12">
7
            <t-date-picker v-model="beginDay" type="dateTime" style="width:200px" placeholder="请选择开始时间"></t-date-picker>
8
          </div>
9
          <div class="col-12">
10
            <t-date-picker v-model="endDay" type="dateTime" style="width:200px" placeholder="请选择结束时间"></t-date-picker>
11
          </div>
12
          <div class="col-12 button-box" align="end">
13
            <t-button color="primary" @click="getData">查询</t-button>
14
            <t-button @click="resetData">重置</t-button>
15
          </div>
16
        </div>
17
        <t-tabs v-model="currentTab" mode="scrollY" orientation="vertical" width="100%" @change="handleTabChange">
18
          <t-tab-panel v-for="item in list" :key="item.monitorVideoLogId" :label="item.fileName|formatDateTime" :panel-id="item.fileId" />
7 19
        </t-tabs>
8 20
      </div>
9 21
@ -11,13 +23,7 @@
11 23
        <t-loading v-model="loadVideo">
12 24
          <span class="text-md text-info">获取视频资源...</span>
13 25
        </t-loading>
14
        <video-player
15
          :sources="videoList"
16
          :autoadvance="0"
17
          :style="{opacity: loadVideo ? 0: 1}"
18
          @player-inited="handlePlayerInited"
19
          @playlistitem="handlePlayerCurrentChange"
20
        />
26
        <video-player :sources="videoList" :autoadvance="0" :style="{opacity: loadVideo ? 0: 1}" @player-inited="handlePlayerInited" @playlistitem="handlePlayerCurrentChange" />
21 27
      </div>
22 28
    </div>
23 29
  </t-modal>
@ -25,39 +31,53 @@
25 31
26 32
<script>
27 33
import VideoPlayer from '@/components/VideoPlayer'
34
import formatDateTime from '@/utils/formatDateTime.js'
35
import sysapi from '@/api/videoSurveillance'
28 36
29 37
export default {
38
  filters: {
39
    formatDateTime
40
  },
30 41
  components: { VideoPlayer },
31 42
  props: {
32
    list: {
33
      type: Array,
34
      default: () => []
43
    replayId: {
44
      type: String
35 45
    },
36 46
    visibled: {
37 47
      type: Boolean,
38 48
      default: false
39 49
    }
40 50
  },
41
  data() {
51
  data () {
42 52
    return {
43 53
      currentTab: null,
44 54
      loadVideo: false,
55
      list: [],
45 56
      videoList: [],
46
      $player: null
57
      $player: null,
58
      // beginDay: formatDateTime(new Date(+new Date() - 10 * 60 * 1000), 'yyyy-MM-dd hh:mm:ss'),
59
      // endDay: formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss')
60
      beginDay: '2020-12-18 17:19:00',
61
      endDay: '2020-12-18 17:19:59'
47 62
    }
48 63
  },
49 64
  computed: {
50 65
    visible: {
51
      get() { return this.visibled },
52
      set(val) {
66
      get () { return this.visibled },
67
      set (val) {
53 68
        if (!val) this.$player.pause()
54 69
        this.$emit('update:visibled', val)
55 70
      }
56 71
    }
57 72
  },
58 73
  watch: {
74
    replayId (val) {
75
      this.replayId = val
76
      this.getData()
77
    },
59 78
    list: {
60
      handler(val) {
79
      handler (val) {
80
        this.list = val
61 81
        console.warn(`list Change`)
62 82
        this.resetVideoList()
63 83
        if (val.length > 0) {
@ -69,22 +89,49 @@ export default {
69 89
      immediate: true
70 90
    }
71 91
  },
92
  mounted () {
93
    // this.list = [{
94
    //   fileName: '12月14日 16:55',
95
    //   fileId: 'ai-video_5A02296PAKA885B-video20201214165526.mp4',
96
    //   fileType: 'video/mp4'
97
    // }, {
98
    //   fileName: '12月14日 16:56',
99
    //   fileId: 'ai-video_5A02296PAKA885B-video20201214165527.mp4',
100
    //   fileType: 'video/mp4'
101
    // }, {
102
    //   fileName: '12月14日 16:57',
103
    //   fileId: 'ai-video_5A02296PAKA885B-video20201214165528.mp4',
104
    //   fileType: 'video/mp4'
105
    // }, {
106
    //   fileName: '12月14日 16:58',
107
    //   fileId: 'ai-video_5A02296PAKA885B-video20201214165529.mp4',
108
    //   fileType: 'video/mp4'
109
    // }, {
110
    //   fileName: '12月14日 16:59',
111
    //   fileId: 'ai-video_5A02296PAKA885B-video20201214165530.mp4',
112
    //   fileType: 'video/mp4'
113
    // }, {
114
    //   fileName: '12月14日 17:00',
115
    //   fileId: 'ai-video_5A02296PAKA885B-video20201214165531.mp4',
116
    //   fileType: 'video/mp4'
117
    // }]
118
  },
72 119
  methods: {
73
    handlePlayerInited(player) {
120
    handlePlayerInited (player) {
74 121
      this.$player = player
75 122
      window.player = this
76 123
    },
77
    async handleTabChange(name, index) {
124
    async handleTabChange (name, index) {
78 125
      this.$player.pause()
79 126
      await this.preloadOriVideoUrl(index)
80 127
      this.play(index)
81 128
    },
82
    handlePlayerCurrentChange(e, item) {
129
    handlePlayerCurrentChange (e, item) {
83 130
      const { index, fileId } = item
84 131
      this.currentTab = fileId
85 132
      this.preloadOriVideoUrl(index)
86 133
    },
87
    resetVideoList() {
134
    resetVideoList () {
88 135
      const videoList = this.list.map((item, index) => {
89 136
        const { fileId, fileType } = item
90 137
        return {
@ -97,7 +144,7 @@ export default {
97 144
98 145
      this.videoList = videoList
99 146
    },
100
    play(index) {
147
    play (index) {
101 148
      console.log(`播放:index=${index}`)
102 149
      // 调用额外的currentItem方法以避免currentItem在首次不生效
103 150
      // https://github.com/brightcove/videojs-playlist/blob/master/docs/api.md
@ -106,10 +153,10 @@ export default {
106 153
      this.$player.play()
107 154
    },
108 155
    /**
109
     *  从index开始预载videoList的视频地址
110
     *  此方法将在获取index对应的地址后就立即返回
111
     */
112
    preloadOriVideoUrl(index = 0, maxLength = 5) {
156
   *  从index开始预载videoList的视频地址
157
   *  此方法将在获取index对应的地址后就立即返回
158
   */
159
    preloadOriVideoUrl (index = 0, maxLength = 5) {
113 160
      return new Promise((resolve, reject) => {
114 161
        for (let i = index; i in this.videoList && i - index < maxLength; i++) {
115 162
          console.log(`预载地址:index=${i}`)
@ -136,9 +183,9 @@ export default {
136 183
      })
137 184
    },
138 185
    /*
139
     * 获取真实视频地址
140
     */
141
    getOriVideoUrl(fileId) {
186
   * 获取真实视频地址
187
   */
188
    getOriVideoUrl (fileId) {
142 189
      console.log(`请求地址:${fileId}`)
143 190
      // fake
144 191
      return new Promise((resolve, reject) => {
@ -152,6 +199,18 @@ export default {
152 199
          })
153 200
        }, 1000)
154 201
      })
202
    },
203
    async getData () {
204
      const res = await sysapi.queryMonitorVideoLog({ params: { id: this.replayId, beginDay: this.beginDay, endDay: this.endDay } })
205
      if (res.status === 200) {
206
        this.list = res.data.data
207
      } else {
208
        this.$Message.danger('视频列表数据获取失败!')
209
      }
210
    },
211
    resetData () {
212
      this.beginDay = formatDateTime(new Date(+new Date() - 10 * 60 * 1000), 'yyyy-MM-dd hh:mm:ss')
213
      this.endDay = formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss')
155 214
    }
156 215
  }
157 216
}
@ -160,9 +219,16 @@ export default {
160 219
<style lang="scss">
161 220
.replayer {
162 221
  display: flex;
222
163 223
  &-list {
164 224
    margin-right: 20px;
165 225
    // width: 200px;
226
    .date-select-box {
227
      margin-top: 15px;
228
      > div {
229
        margin-bottom: 15px;
230
      }
231
    }
166 232
  }
167 233
168 234
  &-video {

+ 15 - 41
security-protection-platform/src/modules/videoSurveillance/index.vue

@ -32,7 +32,7 @@
32 32
      </div>
33 33
    </div>
34 34
    <t-pager :page-size="videoPageSize" :current="videoCurrent" :total="videoTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
35
    <replay-dialog :list="replayList" :visibled.sync="showReplayDialog" />
35
    <replay-dialog :replay-id="replayId" :visibled.sync="showReplayDialog" />
36 36
  </div>
37 37
</template>
38 38
<script>
@ -69,7 +69,7 @@ export default {
69 69
      roomList: [],
70 70
71 71
      showReplayDialog: false,
72
      replayList: []
72
      replayId: ''
73 73
    }
74 74
  },
75 75
  mounted () {
@ -77,45 +77,19 @@ export default {
77 77
    this.getVideoSurveillanceData() // 获取视频监控界面数据
78 78
  },
79 79
  methods: {
80
    async handleReview (id) {
81
      // const res = await sysapi.getVideoPlayBack(id)
82
      // console.log(res)
83
      this.replayList = [{
84
        fileName: '12月14 16:55',
85
        fileId: 'ai-video_5A02296PAKA885B-video20201214165526.mp4',
86
        fileType: 'video/mp4'
87
      }, {
88
        fileName: '12月14 16:56',
89
        fileId: 'ai-video_5A02296PAKA885B-video20201214165527.mp4',
90
        fileType: 'video/mp4'
91
      }, {
92
        fileName: '12月14 16:57',
93
        fileId: 'ai-video_5A02296PAKA885B-video20201214165528.mp4',
94
        fileType: 'video/mp4'
95
      }, {
96
        fileName: '12月14 16:58',
97
        fileId: 'ai-video_5A02296PAKA885B-video20201214165529.mp4',
98
        fileType: 'video/mp4'
99
      }, {
100
        fileName: '12月14 16:59',
101
        fileId: 'ai-video_5A02296PAKA885B-video20201214165530.mp4',
102
        fileType: 'video/mp4'
103
      }, {
104
        fileName: '12月14 17:00',
105
        fileId: 'ai-video_5A02296PAKA885B-video20201214165531.mp4',
106
        fileType: 'video/mp4'
107
      }]
108
      this.replayList = [{
109
        sources: [{
110
          src: 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4',
111
          type: 'video/mp4'
112
        }]
113
      }, {
114
        sources: [{
115
          src: 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4',
116
          type: 'video/mp4'
117
        }]
118
      }]
80
    handleReview (id) {
81
      this.replayId = '900'
82
      // this.replayList = [{
83
      //   sources: [{
84
      //     src: 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4',
85
      //     type: 'video/mp4'
86
      //   }]
87
      // }, {
88
      //   sources: [{
89
      //     src: 'http://10.19.90.34:19000/tool-image/tool-image_7fa1f7b30f0640f2a67ac8b4c2e0b574.mp4',
90
      //     type: 'video/mp4'
91
      //   }]
92
      // }]
119 93
      this.showReplayDialog = true
120 94
    },
121 95
    async tabClick (id) {