From e6758ef29bd686e894b4679edf1bd88436b84148 Mon Sep 17 00:00:00 2001
From: hanbaoshan <hanbaoshan@aiotlink.com>
Date: 星期三, 13 一月 2021 19:07:03 +0800
Subject: [PATCH] 分析检索/人员管理接口联调

---
 src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue |  405 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 325 insertions(+), 80 deletions(-)

diff --git a/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue b/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
index f1478cb..e18d1f2 100644
--- a/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
+++ b/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
@@ -18,7 +18,7 @@
           end-placeholder="缁撴潫鏃ユ湡"
           align="right"
         ></el-date-picker>
-        <el-button size="small" type="primary" @click="dataSearch">鎼滅储</el-button>
+        <el-button size="small" type="primary" @click="init">鎼滅储</el-button>
       </div>
       <div class="checked-config">
         <span style="margin-top:3px;">宸查�夋潯浠�:</span>
@@ -51,7 +51,7 @@
       </div>
       <div class="optional-config">
         <div class="config" v-for="(config,index) in optionalConfigs" :key="index">
-          <template v-show="config.isShow">
+          <template v-if="config.isShow">
             <div class="title">{{config.title}}</div>
             <div class="options-wrap">
               <div
@@ -89,7 +89,7 @@
             </div>
           </template>
         </div>
-        <div class="config">
+        <div class="config" v-if="showAdvance">
           <div class="title">楂樼骇閫夐」</div>
           <div>
             <el-menu class="el-menu-demo" mode="horizontal" @select="handleSelect">
@@ -144,32 +144,32 @@
       </div>
       <div class="content" v-show="showType=='menu'">
         <el-row :gutter="20">
-          <el-col :xs="8" :sm="6" :md="6" :lg="6" v-for="data in menuList" :key="data.id">
+          <el-col :xs="8" :sm="6" :md="6" :lg="6" v-for="data in tabData" :key="data.id">
             <div class="card">
-              <div class="video-wrap" @click="checkVideo(data)">
-                <video src></video>
+              <div class="video-wrap" @click="checkVideoDetail(data)">
+                <img :src="CLIP+data.VideoCover" alt />
               </div>
               <div class="video-info">
                 <div class="base-info">
                   <div>
                     <label>杞﹀彿:</label>
-                    <span>{{data.no}}</span>
+                    <span>{{data.CarNumber}}</span>
                   </div>
                   <div>
                     <label>杞︽:</label>
-                    <span>{{data.frequency}}</span>
+                    <span>{{data.TrainNumber}}</span>
                   </div>
                   <div>
                     <label>鏃堕棿:</label>
-                    <span>{{data.time}}</span>
+                    <span>{{data.VideoDate}}</span>
                   </div>
                   <div>
                     <label>鍙告満|鍓徃鏈�:</label>
-                    <span>{{data.driver}}</span>
+                    <span>{{data.Driver1}}|{{data.Driver2}}</span>
                   </div>
                 </div>
                 <div class="mark-info">
-                  <div class="abnormal" v-if="data.markType==1">
+                  <div class="abnormal" v-if="data.IsUnusual==='1'">
                     <span v-for="(mark,index) in data.marks" :key="index">{{mark}}</span>
                   </div>
                   <div v-else>
@@ -180,32 +180,33 @@
                   <div class="tag" v-for="(tag,index) in data.tags" :key="index">{{tag}}</div>
                 </div>
               </div>
-              <div class="star">
-                <i :class="[data.follow?'follow':'','el-icon-star-off']"></i>
+              <div class="star" @click="toggleFollow(data)">
+                <i :class="[data.IsFollow?'follow':'','el-icon-star-off']"></i>
               </div>
             </div>
           </el-col>
         </el-row>
         <el-pagination
           background
-          @size-change="handleSizeChange"
+          @size-change="handleTabSizeChange"
           @current-change="handleCurrentChange"
           :current-page.sync="curTabPage"
+          :page-sizes="pageSizes"
           :page-size="tabPageSize"
-          layout="total, prev, pager, next"
-          :total="tabTotal">
-        </el-pagination>
+          layout="total,sizes, prev, pager, next"
+          :total="tabTotal"
+        ></el-pagination>
       </div>
       <div class="content" v-show="showType=='list'">
         <el-table :data="tableData" fit ref="elTable">
-          <el-table-column label="鍚嶇О" prop="name" sortable width="500">
+          <el-table-column label="鍚嶇О" prop="VideoName" sortable width="500">
             <template slot-scope="scope">
-              <div style="cursor:pointer;">{{scope.row.name}}</div>
+              <div style="cursor:pointer;">{{scope.row.VideoName}}</div>
             </template>
           </el-table-column>
-          <el-table-column label="澶у皬" prop="size" sortable></el-table-column>
-          <el-table-column label="淇敼鏃ユ湡" prop="updateTime" sortable></el-table-column>
-          <el-table-column label="鍒涘缓鏃ユ湡" prop="createTime" sortable></el-table-column>
+          <el-table-column label="澶у皬" prop="VideoSize" sortable></el-table-column>
+          <el-table-column label="淇敼鏃ユ湡" prop="UpdatedAt" sortable></el-table-column>
+          <el-table-column label="鍒涘缓鏃ユ湡" prop="CreatedAt" sortable></el-table-column>
           <el-table-column label="鎿嶄綔">
             <template>
               <div class="operation">
@@ -214,15 +215,15 @@
             </template>
           </el-table-column>
         </el-table>
-        <!-- <el-pagination background layout="prev, pager, next" :page-size="pageSize" :total="tableListTotal"></el-pagination> -->
         <el-pagination
-          @size-change="handleSizeChange"
+          @size-change="handleTableSizeChange"
           @current-change="handleCurrentChange"
           :current-page.sync="curTablePage"
           :page-size="tablePageSize"
-          layout="total, prev, pager, next"
-          :total="tableTotal">
-        </el-pagination>
+          :page-sizes="pageSizes"
+          layout="total,sizes, prev, pager, next"
+          :total="tableTotal"
+        ></el-pagination>
       </div>
       <el-dialog
         class="dialog-video"
@@ -259,34 +260,82 @@
                   <i class="el-icon-film"></i>
                   <span>{{video.name}}</span>
                 </div>-->
-                <div class="video-name">
+                <div
+                  class="video-name"
+                  :class="{'current':curVideo.ID==video.ID}"
+                  @click="checkVideo(video,index)"
+                  v-for="(video,index) in videoDetails.relativeVideos"
+                  :key="video.ID"
+                >
                   <i class="el-icon-film"></i>
-                  <span>椹鹃┒瀹�</span>
-                </div>
-                <div class="video-name">
-                  <i class="el-icon-film"></i>
-                  <span>鏈烘埧</span>
+                  <span>{{video.Event}}</span>
                 </div>
               </div>
-              <div class="players">
-                <div class="video-item" v-for="(item,index) in videoWrapArr" :key="index"></div>
+              <div class="players" ref="playerWrap">
+                <div
+                  class="video-item"
+                  :ref="`gridVideoItem_${index}`"
+                  v-for="(item,index) in videoWrapArr"
+                  :key="index"
+                  
+                >
+                  <template v-if="index<=videoArrs.length-1">
+                    <div :class="{'currentPlayer':curVideo.ID==videoArrs[index].ID}">
+                      {{videoArrs[index].ID}}
+                      <img
+                        :src="CLIP+videoArrs[index].VideoCover"
+                        style="width:100px"
+                      />
+                    </div>
+                  </template>
+                </div>
+                <!-- <div
+                  class="video-item"
+                  :class="{'active':item.ID==curVideo.ID}"
+                  :ref="`gridVideoItem_${index}`"
+                  v-for="(item,index) in videoWrapArr"
+                  :key="index"
+                >
+                  
+                </div>-->
               </div>
             </div>
           </div>
           <div class="content-bottom">
             <div class="bot-left block">
               <p class="title-partment">蹇�熸爣娉�</p>
-              <div style="height:28px;">
+              <div class="flex-box" style="height:28px;">
                 <label style="padding-right:10px;">闅愭偅闂:</label>
-                <el-radio v-model="hiddenDanger" :label="1">鏃犲紓甯�</el-radio>
-                <el-radio v-model="hiddenDanger" :label="2">鏈夊紓甯�</el-radio>
+                <el-radio v-model="curVideo.IsUnusual" label="0">鏃犲紓甯�</el-radio>
+                <el-radio v-model="curVideo.IsUnusual" label="1">鏈夊紓甯�</el-radio>
                 <el-button
                   icon="el-icon-plus"
                   size="mini"
-                  v-show="hiddenDanger==2"
+                  v-show="curVideo.IsUnusual==1"
                   type="primary"
-                  @click="addLabel(videoDetails)"
+                  @click="addLabel(curVideo)"
                 >娣诲姞鏍囨敞</el-button>
+              </div>
+              <div class="flex-box">
+                <label>鏍囨敞淇℃伅:</label>
+                <div class="mark-list">
+                  <div class="mark" v-for="mark in curVideo.LableLst" :key="mark.ID">
+                    <div class="time" v-if="mark.length">
+                      <span>{{mark[0].Time}}</span>
+                      <i class="el-icon-edit" @click="editCurLabel(mark)"></i>
+                      <i
+                        class="el-icon-delete"
+                        @click="removeCurLabel(mark[0].ParentID,mark[0].Time)"
+                      ></i>
+                    </div>
+                    <div class="label-content">
+                      <span
+                        v-for="content in mark"
+                        :key="content.ID"
+                      >{{findLabelNameById(content.CodeID)}}</span>
+                    </div>
+                  </div>
+                </div>
               </div>
             </div>
             <div class="bot-right block">
@@ -294,19 +343,19 @@
               <div class="base-info">
                 <div>
                   <label>杞﹀彿:</label>
-                  <span>{{videoDetails.no}}</span>
+                  <span>{{videoDetails.CarNumber}}</span>
                 </div>
                 <div>
                   <label>杞︽:</label>
-                  <span>{{videoDetails.frequency}}</span>
+                  <span>{{videoDetails.TrainNumber}}</span>
                 </div>
                 <div>
                   <label>鏃堕棿:</label>
-                  <span>{{videoDetails.time}}</span>
+                  <span>{{videoDetails.VideoDate}}</span>
                 </div>
                 <div>
                   <label>鍙告満|鍓徃鏈�:</label>
-                  <span>{{videoDetails.driver}}</span>
+                  <span>{{videoDetails.Driver1}}|{{videoDetails.Driver2}}</span>
                 </div>
               </div>
             </div>
@@ -321,13 +370,12 @@
       >
         <div class="label-check">
           <el-checkbox-group v-model="labelCheckedList">
-            <el-checkbox v-for="item in labelOptions" :key="item.id" :label="item.id">{{item.name}}</el-checkbox>
+            <el-checkbox v-for="item in labelOptions" :key="item.ID" :label="item.ID">{{item.Name}}</el-checkbox>
           </el-checkbox-group>
         </div>
         <div class="btns">
-          <el-button @click="delLabelChecked" size="small">鍒犻櫎</el-button>
           <el-button @click="cancelLabelChecked" size="small">鍙栨秷</el-button>
-          <el-button @click="submitLabelChecked(videoDetails)" size="small" type="primary">纭畾</el-button>
+          <el-button @click="submitLabelChecked()" size="small" type="primary">纭畾</el-button>
         </div>
       </el-dialog>
     </div>
@@ -335,16 +383,18 @@
 </template>
 
 <script>
-import { getlstInit } from '@/api/shuohuang';
+import { getlstInit, updateVideoAnalyze, getlst, getRelatedVideoInfo, getLabelMap, delLabel, editLabel } from '@/api/shuohuang';
 
 export default {
   data () {
     return {
+      CLIP: 'http://192.168.20.113/',
       keyword: '',
       searchTime: [this.$moment(new Date().getTime() - 3600 * 1000 * 24 * 3).format("YYYY-MM-DD HH:mm:ss"), this.$moment(new Date()).format("YYYY-MM-DD HH:mm:ss")],
       curTabPage: 1,
       curTablePage: 1,
       tabPageSize: 8,
+      pageSizes: [2, 8, 12, 24],
       tabTotal: 0,
       tablePageSize: 8,
       tableTotal: 0,
@@ -391,6 +441,7 @@
       checkedConfigs: [],
       optionalConfigs: [],
       highLevelConfigs: [],
+      showAdvance: true,
       fixedOneLineHeight: 40,
       watch: '',
       settle: '',
@@ -399,7 +450,7 @@
         { name: 'SS4B115_06_B鑺備簩绔徃鏈哄_20201115_091500.mp4', size: '17.66M', updateTime: '2020-11-04 15:41', createTime: '2020-11-04 15:41' },
         { name: 'SS4B115_06_B鑺備簩绔徃鏈哄_20201115_091700.mp4', size: '17.76M', updateTime: '2020-11-04 15:41', createTime: '2020-11-07 17:41' }
       ],
-      menuList: [
+      tabData: [
         { id: 'ss1', no: 'SS4B115', frequency: '8084', time: '2020-09-21 20:45:08', driver: '寮犱笁', marks: ['鏈懠鍞ゃ�佸懠鍞や笉鏍囧噯', '瀛︿範鍙告満鏈簲绛�'], markType: 1, tags: ['杩涘嚭绔�', '鍙告満绂诲矖'], follow: true },
         { id: 'ss2', no: 'SS4B115', frequency: '8084', time: '2020-09-21 20:45:08', driver: '寮犱笁', marks: [], markType: 0, tags: ['杩涘嚭绔�', '鍙告満绂诲矖'], follow: false }
       ],
@@ -407,11 +458,34 @@
       videoDialogVisible: false,
       videoDetails: {},
       guid: 1,
+      curVideo: {},
+      videoArrs: [],
       videoWrapArr: [],
       hiddenDanger: 1,
       labelDialogVisible: false,
       labelOptions: [{ id: 'whh', name: '鏈懠鍞ゃ�佸懠鍞や笉鏍囧噯' }, { id: 'jsbz', name: '绮剧涓嶆尟銆佽繍琛屼腑鐫¤' }, { id: 'xxsj', name: '瀛︿範鍙告満鏈簲绛�' }, { id: 'myhb', name: '娌℃湁鍚庨儴鐬湜銆佷笉鎸夎瀹氬仛闃叉簻鎺柦' }],
       labelCheckedList: [],
+    }
+  },
+  watch: {
+    checkedConfigs: {
+      handler (n, o) {
+        // let filterQuerys = [];
+        // n.forEach(config => {
+        //   let checkedOpts = config.data.filter(option => option.isChecked);
+        //   if (checkedOpts.length) {
+        //     var linkOpts = checkedOpts.map(opt => opt.name);
+        //     linkOpts = linkOpts.join(',');
+        //     let obj = {};
+        //     obj[config.NameEn] = linkOpts;
+        //     filterQuerys.push(obj);
+        //   }
+        // })
+        // console.log(filterQuerys)
+
+        this.filterSearchData()
+      },
+      deep: true
     }
   },
   mounted () {
@@ -447,32 +521,106 @@
     //   console.log(this.optionalConfigs);
     // });
     this.init();
+    this.renderLabelOpts();
   },
   methods: {
-    handleSizeChange(){
-
+    editCurLabel (mark) {
+      let arr = [];
+      mark.forEach(label => {
+        arr.push(label.CodeID)
+      });
+      this.labelCheckedList = arr;
+      this.labelDialogVisible = true;
     },
-    handleCurrentChange(){
-
+    removeCurLabel (ParentID, Time) {
+      delLabel({ ParentID, Time }).then(res => {
+        
+      })
     },
+    renderLabelOpts () {
+      let _this = this;
+      getLabelMap().then(res => {
+        _this.labelOptions = res.data
+      })
+    },
+    findLabelNameById (id) {
+      debugger
+      let label = this.labelOptions.find(label => label.ID == id);
+      return label.Name;
+    },
+    checkVideo (video,index) {
+      this.curVideo = video;
+      debugger
+      if(index>0&&this.guid==1){
+        this.videoWrapArr
+      }
+    },
+    handleTabSizeChange (size) {
+      debugger
+      this.tabPageSize = size;
+      this.filterSearchData()
+    },
+    handleTableSizeChange (size) {
+      this.tablePageSize = size;
+      this.filterSearchData()
+    },
+    handleCurrentChange () {
+      this.filterSearchData()
+    },
+    //浜岀骇鏌ヨ
+    filterSearchData () {
+      let _this = this;
+      let query = {
+        KeyWord: this.keyword,
+        StartDate: this.searchTime[0],
+        EndDate: this.searchTime[1],
+        PageIndex: this.showType == 'list' ? this.curTablePage : this.showType == 'list',
+        PageSize: this.showType == 'list' ? this.tablePageSize : this.tabPageSize,
+        IsDetail: this.showType == 'list'
+      };
+      let filterQuerys = [];
+      this.checkedConfigs.forEach(config => {
+        let checkedOpts = config.data.filter(option => option.isChecked);
+        if (checkedOpts.length) {
+          var linkOpts = checkedOpts.map(opt => opt.name);
+          linkOpts = linkOpts.join(',');
+          let obj = {};
+          obj[config.NameEn] = linkOpts;
+          filterQuerys.push(obj);
+        }
+      })
+      Object.assign(query, ...filterQuerys);
+
+      getlst(query).then(res => {
+        if (_this.showType == 'list') {
+          _this.tableTotal = res.total;
+          _this.tableData = res.data;
+        } else {
+          _this.tabTotal = res.total;
+          _this.tabData = res.data;
+        }
+      })
+    },
+    //涓�绾ф煡璇�
     init () {
       let _this = this;
       let query = {
         KeyWord: this.keyword,
         StartDate: this.searchTime[0],
         EndDate: this.searchTime[1],
-        PageIndex: this.showType=='list'?this.curTablePage:this.showType=='list',
-        PageSize: this.showType=='list'?this.tablePageSize:this.tabPageSize,
-        IsDetail: this.showType=='list'
+        PageIndex: this.showType == 'list' ? this.curTablePage : this.showType == 'list',
+        PageSize: this.showType == 'list' ? this.tablePageSize : this.tabPageSize,
+        IsDetail: this.showType == 'list'
       };
       this.optionalConfigs = [];
       this.highLevelConfigs = [];
       getlstInit(query).then(res => {
-        debugger
-        if(_this.showType=='list'){
+        if (_this.showType == 'list') {
           _this.tableTotal = res.total;
-        }else{
+          _this.tableData = res.data;
+        } else {
           _this.tabTotal = res.total;
+          _this.tabData = res.data;
         }
 
         res.filterlst.forEach(config => {
@@ -481,8 +629,6 @@
             let obj = {};
             obj.name = key;
             obj.id = config.Node[key]
-            // item.id = item;
-            // item.name = k;
             return obj
           });
           config.id = config.ID;
@@ -509,42 +655,111 @@
           });
           console.log(this.optionalConfigs);
         });
+
       })
     },
-    delLabelChecked () {
-
+    toggleFollow (data) {
+      data.IsFollow = !data.IsFollow;
+      this.updataVideo(data);
+      if (data.IsFollow) {
+        this.$notify({
+          type: 'success',
+          message: '宸叉坊鍔犲叧娉�!'
+        });
+      }
     },
-    cancelLabelChecked () {
+    updataVideo (data) {
+      let _this = this;
+      updateVideoAnalyze(data).then(res => {
+        //浜岀骇鏌ヨ
+      });
+    },
 
+    cancelLabelChecked () {
+      this.labelDialogVisible = false;
     },
     submitLabelChecked () {
+      console.log(this.labelCheckedList)
+      debugger
+      //this.curVideo
+      //this.curVideo.HotPoint[0].Time
+      editLabel({ ParentID: this.curVideo.ID + '', Time: this.curVideo.HotPoint[0].Time, CodeID: this.labelCheckedList.join(',') }).then(res => {
+        debugger
+
+      })
 
     },
-    addLabel (videoDetails) {
-      debugger
+    addLabel (video) {
       this.labelDialogVisible = true;
-
     },
     setGuid (guid) {
+      let _this = this;
+      // for(var i = 0; i < Math.pow(guid,2); i++){
+      //   if(i>this.videoArrs.length-1){
+      //       this.videoWrapArr[i] = this.videoArrs[i]
+      //     }else{
+      //       this.videoWrapArr[i] = {}
+      //     }
+      // }
       this.videoWrapArr = Math.pow(guid, 2);
 
-    },
-    checkVideo (data) {
-      this.videoDialogVisible = true;
-      this.videoDetails = data;
+      this.$nextTick(() => {
+        for (var i = 0; i < Math.pow(guid, 2); i++) {
+          this.$refs[`gridVideoItem_${i}`][0].style.width = this.$refs['playerWrap'].offsetWidth / guid + 'px';
+          this.$refs[`gridVideoItem_${i}`][0].style.height = this.$refs['playerWrap'].offsetHeight / guid + 'px';
 
+        }
+      })
+
+    },
+    checkVideoDetail (data) {
+      this.videoDetails = data;
+      let _this = this;
+      getRelatedVideoInfo({ UniqeID: data.UniqeID }).then(res => {
+        _this.videoDetails.relativeVideos = res.data;
+        _this.curVideo = res.data[0];
+        _this.videoArrs = res.data;
+        // _this.videoWrapArr.push(res.data[0]);
+        _this.setGuid(1)
+        _this.videoDialogVisible = true;
+      })
     },
     checkFollow () {
 
     },
     checkType (type) {
       this.showType = type;
-      this.init();
+      // let filterQuerys = [];
+      // this.checkedConfigs.forEach(config => {
+      //   let checkedOpts = config.data.filter(option => option.isChecked);
+      //   if (checkedOpts.length) {
+      //     var linkOpts = checkedOpts.map(opt => opt.name);
+      //     linkOpts = linkOpts.join(',');
+      //     let obj = {};
+      //     obj[config.NameEn] = linkOpts;
+      //     filterQuerys.push(obj);
+      //   }
+      // })
+      this.filterSearchData()
     },
     clearCheckedConfigs () {
+      this.checkedConfigs.forEach(config => {
+        config.isShow = true;
+        config.data.forEach(d => {
+          d.isChecked = false
+        });
+      });
       this.checkedConfigs = [];
+      this.showAdvance = true;
     },
     removeCheckedConfig (config) {
+      config.isShow = true;
+      if (config.IsAdvanced) {
+        this.showAdvance = true;
+      }
+      config.data.forEach(d => {
+        d.isChecked = false;
+      });
       let index = this.checkedConfigs.findIndex(one => one.id == config.id);
       this.checkedConfigs.splice(index, 1);
     },
@@ -554,12 +769,14 @@
       }
       this.checkedConfigs.push(config);
 
-      //config.isShow = false;
-
-      // this.dataSearch();
-      this.$nextTick(() => {
-        config.isShow = false;
-      })
+      config.isShow = false;
+      config.isMultCheck = false;
+      if (config.IsAdvanced) {
+        this.showAdvance = false;
+      }
+      // this.$nextTick(() => {
+      //   this.$set(config, 'isShow', false)
+      // })
 
     },
 
@@ -785,7 +1002,8 @@
         .video-wrap {
           background: aliceblue;
           border-radius: 3px;
-          video {
+          img {
+            width: 100%;
             border-radius: 3px;
           }
         }
@@ -882,6 +1100,7 @@
               width: 160px;
               margin-right: 10px;
               .video-name {
+                cursor: pointer;
                 color: #666;
                 margin-bottom: 10px;
                 &.current {
@@ -896,10 +1115,14 @@
               width: 960px;
               height: 540px;
               display: flex;
+              flex-wrap: wrap;
               .video-item {
-                flex: 1;
                 background: black;
                 border: 1px solid #fff;
+                box-sizing: border-box;
+                .currentPlayer {
+                  border: 2px solid aqua;
+                }
               }
             }
           }
@@ -908,6 +1131,28 @@
           display: flex;
           .bot-left {
             flex: 1;
+            .flex-box {
+              align-items: baseline;
+              label {
+                padding-right: 10px;
+              }
+              .mark-list {
+                .time {
+                  cursor: pointer;
+                  font-size: 15px;
+                  font-weight: bold;
+                  color: #409eff;
+                  i[class^='el-icon'] {
+                    padding: 3px;
+                  }
+                }
+                .label-content {
+                  font-size: 13px;
+                  padding: 4px 0;
+                  color: #888;
+                }
+              }
+            }
           }
           .bot-right {
             width: 210px;

--
Gitblit v1.8.0