소스 검색

测试上传

hbchen 1 년 전
부모
커밋
c30bb4989f

+ 231 - 1
src/api/modules/semanticsApi.js

@@ -277,6 +277,236 @@ const semanticInterface = {
   }
 }
 
+//语音识别
+const asrInterface = {
+  /**
+   * 获取目录的列表
+   * @param {} 
+   * ParentId
+   */
+  getCatalogueList:params=>{
+    return http.get('/speech_recognition/menu/list',params)
+  },
+  /** 
+   * 获取目录的目录树
+   * @param {} 
+   * ParentId
+  */
+  getCatalogueTree:params=>{
+    return http.get('/speech_recognition/menu/tree',params)
+  },
+  /**
+   * 新增目录
+   * @param {} 
+   * ParentId MenuName
+  */ 
+  addCatalogue:params=>{
+    return http.post('/speech_recognition/menu/add',params)
+  }, 
+  /**
+   * 编辑目录
+   * @param {} 
+   * MenuId MenuName
+  */ 
+  editCatalogue:params=>{
+    return http.post('/speech_recognition/menu/edit',params)
+  },
+  /**
+   * 删除目录-检查
+   * @param {} 
+   * MenuId
+  */ 
+  removeCatalogueCheck:params=>{
+    return http.post('/speech_recognition/menu/remove_check',params)
+  },
+  /**
+   * 删除目录
+   * @param {} 
+   * MenuId
+  */ 
+  removeCatalogue:params=>{
+    return http.post('/speech_recognition/menu/remove',params)
+  },
+  /**
+   * 移动目录/文件
+   * @param {} 
+   * MenuId ParentMenuId PrevMenuId NextMenuId SpeechId PrevSpeechId NextSpeechId
+  */ 
+  moveCatalogueEle:params=>{
+    return http.post('/speech_recognition/menu/move',params)
+  },
+  /**
+   * 获取标签的目录列表
+   * @param {} ParentId
+  */
+  getTagCatalogueList:params=>{
+    return http.get('/speech_recognition/tag/menu/list',params)
+  },
+  /**
+   * 新增标签目录
+   * @param {} 
+   * ParentId MenuName
+  */ 
+  addTagCatalogue:params=>{
+    return http.post('/speech_recognition/tag/menu/add',params)
+  }, 
+  /**
+   * 编辑标签目录
+   * @param {} 
+   * MenuId MenuName
+  */ 
+  editTagCatalogue:params=>{
+    return http.post('/speech_recognition/tag/menu/edit',params)
+  },
+  /**
+   * 删除标签目录-检查
+   * @param {} 
+   * MenuId
+  */ 
+  removeTagCatalogueCheck:params=>{
+    return http.post('/speech_recognition/tag/menu/remove_check',params)
+  },
+  /**
+   * 删除标签目录
+   * @param {} 
+   * MenuId
+  */ 
+  removeTagCatalogue:params=>{
+    return http.post('/speech_recognition/tag/menu/remove',params)
+  },
+  /**
+   * 移动标签目录/标签
+   * @param {} 
+   * MenuId ParentMenuId PrevMenuId NextMenuId TagId PrevTagId NextTagId
+  */ 
+  moveTagCatalogueEle:params=>{
+    return http.post('/speech_recognition/tag/menu/move',params)
+  },
+  /**
+   * 获取标签的目录列表
+  */
+  getTagTree:params=>{
+    return http.get('/speech_recognition/tag/menu/tree',params)
+  },
+  /**
+   * 获取标签列表
+   * Keywords
+  */
+  getTagsList:params=>{
+    return http.get('/speech_recognition/tag/list',params)
+  },
+  /**
+   * 新增标签
+   * @param {} 
+   * MenuId TagName
+  */ 
+  addTag:params=>{
+    return http.post('/speech_recognition/tag/add',params)
+  }, 
+  /**
+   * 编辑标签
+   * @param {} 
+   * TagId TagName
+  */ 
+  editTag:params=>{
+    return http.post('/speech_recognition/tag/edit',params)
+  },
+  /**
+   * 删除标签-检查
+   * @param {} 
+   * TagId
+  */ 
+  removeTagCheck:params=>{
+    return http.post('/speech_recognition/tag/remove_check',params)
+  },
+  /**
+   * 删除标签
+   * @param {} 
+   * TagId
+  */ 
+  removeTag:params=>{
+    return http.post('/speech_recognition/tag/remove',params)
+  },
+  /**
+   * 语音识别列表
+   * @param {} 
+   * 
+  */
+  getSpeechList:params=>{
+    return http.get('/speech_recognition/list',params)
+  },
+  /**
+   * 语音识别-待转换列表
+  */
+  getConvertList:params=>{
+    return http.get('/speech_recognition/convert_list',params)
+  },
+  /**
+   * 新建 - 批量转写
+   * @param {} 
+   * MenuId Files:[{FileName,ResourceUrl}] 
+  */ 
+  speechTransfer:params=>{
+    return http.post('/speech_recognition/convert',params)
+  },
+  /**
+   * 获取详情
+   * @param {} 
+   * SpeechRecognitionId
+  */ 
+  getSpeechDetail:params=>{
+    return http.get('/speech_recognition/detail',params)
+  },
+  /**
+   * 重命名
+   * @param {} 
+   * SpeechRecognitionId FileName
+  */ 
+  speechRename:params=>{
+    return http.post('/speech_recognition/rename',params)
+  },
+  /**
+   * 导出 
+   * /speech_recognition/export
+   * SpeechRecognitionId
+   * ExportType 导出类型:1-txt;2-doc;3-pdf 
+   * Timestamp:boolean
+  */ 
+  /**
+   * 删除
+   * @param {} 
+   * SpeechRecognitionId
+  */ 
+  speechRemove:params=>{
+    return http.post('/speech_recognition/remove',params)
+  },
+  /**
+   * 保存标签
+   * @param {} 
+   * SpeechRecognitionId
+   * TagIds:Array
+  */ 
+  speechSaveTag:params=>{
+    return http.post('/speech_recognition/save_tag',params)
+  },
+  /**
+   * 删除音视频
+   * @param {} 
+   * SpeechRecognitionId
+  */ 
+  speechMediaRemove:params=>{
+    return http.post('/speech_recognition/remove_file',params)
+  },
+  /**
+   * 保存
+   * @param {} 
+   * SpeechRecognitionId FileName TagIds:[number] Contents:[{SpeechRecognitionContentId,Content}] 
+  */ 
+  speechSave:params=>{
+    return http.post('/speech_recognition/save',params)
+  },
+}
+
 
 
-export {tagInterface,documentInterface,semanticInterface}
+export {tagInterface,documentInterface,semanticInterface,asrInterface}

+ 10 - 13
src/directives/tooltip-hidable.js

@@ -7,19 +7,16 @@ import { Message } from "element-ui"
 export default {
   bind(el,binding,vnode) {
     try {
-      const resizeObserver = new ResizeObserver(entries => {
-        // console.log('监听到了尺寸变化了...',entries)
-        // console.log(el.scrollWidth,el.clientWidth);
-          if(el.scrollWidth > el.clientWidth){
-            // 超出
-            vnode.componentInstance.disabled=false
-          }else{
-            vnode.componentInstance.disabled=true
-          }
-      })
-      setTimeout(()=>{
-        resizeObserver.observe(el)
-      },0)
+      // console.log(vnode,'vnode');
+      el.onmouseenter=(e)=>{
+        // console.log(e);
+        if(el.scrollWidth > el.clientWidth){
+          // 超出
+          vnode.componentInstance.disabled=false
+        }else{
+          vnode.componentInstance.disabled=true
+        }
+      }
     } catch (error) {
       console.error(error);
       Message.error(error.message)

+ 24 - 0
src/utils/buttonConfig.js

@@ -465,6 +465,30 @@ export const semanticPermission = {
     /*-----------标签管理--------- */
     tagPage_del:'tagPage:del',
     tagPage_save:'tagPage:save',//添加编辑标签
+    /*-----------语音识别--------- */
+    ASR_view:'ASR:view',//查看
+    ASR_classify_catalogue_add:'ASR:classify:catalogue:add',//目录树添加
+    ASR_classify_catalogue_edit:'ASR:classify:catalogue:edit',//目录树编辑
+    ASR_classify_catalogue_del:'ASR:classify:catalogue:del',//目录树删除
+    ASR_classify_catalogue_move:'ASR:classify:catalogue:move',//目录树拖动 
+    ASR_classify_tag_add:'ASR:classify:tag:add',//标签目录树添加
+    ASR_classify_tag_edit:'ASR:classify:tag:edit',//标签目录树编辑
+    ASR_classify_tag_del:'ASR:classify:tag:del',//标签目录树删除
+    ASR_classify_tag_move:'ASR:classify:tag:move',//标签目录树拖动 
+    ASR_tagOperation_addTag:'ASR:tagOperation:addTag',//标签添加
+    ASR_tagOperation_editTag:'ASR:tagOperation:editTag',//标签编辑
+    ASR_tagOperation_deleteTag:'ASR:tagOperation:deleteTag',//标签删除
+    ASR_addArticles:'ASR:addArticles',//新建
+    ASR_renameArticles:'ASR:renameArticles',//重命名
+    ASR_exportArticles:'ASR:exportArticles',//导出
+    ASR_deleteArticles:'ASR:deleteArticles',//删除
+    ASR_tagMark_view:'ASR:tagMark:view',//打标签-查看标签
+    ASR_tagMark_add:'ASR:tagMark:add',//打标签-添加标签    
+    ASR_saveArticles:'ASR:saveArticles',//保存
+    ASR_deleteVideo:'ASR:deleteVideo',//删除视频
+    ASR_deleteVoice:'ASR:deleteVoice',//删除音频
+    ASR_copyText:'ASR:copyText',//复制
+    ASR_toggleTimestampShow:'ASR:toggleTimestampShow',//隐藏/显示时间戳
 }
 /*
  * --------------------------------------------------------------------------统计分析------------------------------------------------

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 247 - 500
src/views/semantics_manage/asr/ASR.vue


+ 49 - 9
src/views/semantics_manage/asr/components/catalogueDia.vue

@@ -16,9 +16,9 @@
           <el-form-item :label="(index+1)==formData.level?'目录名称':getFormLabel(index,formData.level)" 
           :rules="{required:true,message:'目录名称必填',trigger:'blur'}" :prop="formProps[index]" 
           v-for="(item,index) in new Array(formData.level)" :key="index">
-            <el-input v-model="formData.one" style="width: 100%" placeholder="必填项" v-if="index==0" :disabled="formData.level!=1"></el-input>
-            <el-input v-model="formData.two" style="width: 100%" placeholder="必填项" v-else-if="index==1" :disabled="formData.level!=2"></el-input>
-            <el-input v-model="formData.three" style="width: 100%" placeholder="必填项" v-else></el-input>
+            <el-input v-model="formData.first" style="width: 100%" placeholder="必填项" v-if="index==0" :disabled="formData.level!=1"></el-input>
+            <el-input v-model="formData.second" style="width: 100%" placeholder="必填项" v-else-if="index==1" :disabled="formData.level!=2"></el-input>
+            <el-input v-model="formData.third" style="width: 100%" placeholder="必填项" v-else></el-input>
           </el-form-item>
 				</el-form>
         <div class="dia-bot">
@@ -30,6 +30,9 @@
 </template>
 
 <script>
+
+import {asrInterface} from '@/api/modules/semanticsApi.js';
+
   export default {
     name:"catalogueDia",
     props:{
@@ -48,7 +51,7 @@
       diaShow(value){
         if(value){
           console.log(this.formData,'formData');
-          this.diaTitle = this.formData.id?"编辑":"添加"
+          this.diaTitle = this.formData.code?"编辑":"添加"
           this.$refs.diaForm && this.$nextTick(()=>{
             this.$refs.diaForm.clearValidate()
           })
@@ -58,7 +61,7 @@
     data() {
       return {
         diaTitle:'',
-        formProps:['one','two','three']
+        formProps:['first','second','third']
       }
     },
     methods: {
@@ -68,10 +71,47 @@
       saveHandle(){
         this.$refs.diaForm.validate(valid=>{
           if(valid){
-            //TODO: 保存目录接口
-            this.$message.success(this.diaTitle+"成功")
-            this.$emit("catalogueSuccess")
-            this.$emit("update:diaShow",false)
+            console.log(this.formData,'formData');
+            let apiName = ""
+            if(this.formData.mId){
+              if(this.formData.type == "目录"){
+                apiName="editCatalogue"
+              }else if(this.formData.type == "标签"){
+                apiName="editTagCatalogue"
+              }
+              // 编辑
+              let keyI = this.formProps[this.formData.level-1]
+
+              asrInterface[apiName]({
+                MenuId:this.formData.mId,
+                MenuName:this.formData[keyI]
+              }).then(res=>{
+                if(res.Ret == 200){
+                  this.$message.success(this.diaTitle+"成功")
+                  this.$emit("catalogueSuccess",{type:'edit',code:''})
+                  this.$emit("update:diaShow",false)
+                }
+              })
+            }else{
+
+              if(this.formData.type == "目录"){
+                apiName="addCatalogue"
+              }else if(this.formData.type == "标签"){
+                apiName="addTagCatalogue"
+              }
+              let keyI = this.formProps[this.formData.level-1]
+
+              asrInterface[apiName]({
+                ParentId:this.formData.pId,
+                MenuName:this.formData[keyI]
+              }).then(res=>{
+                if(res.Ret == 200){
+                  this.$message.success(this.diaTitle+"成功")
+                  this.$emit("catalogueSuccess",{type:'add',code:this.formData.code})
+                  this.$emit("update:diaShow",false)
+                }
+              })
+            }
           }
         })
       },

+ 35 - 13
src/views/semantics_manage/asr/components/editTag.vue

@@ -13,14 +13,14 @@
 				label-position="top"
 				hide-required-asterisk
 				:model="formData">
-          <el-form-item label="标签名称" :rules="{required:true,message:'标签名称必填',trigger:'blur'}" prop="name">
-            <el-input v-model="formData.name" style="width: 100%" placeholder="请输入标签名称"></el-input>
+          <el-form-item label="标签名称" :rules="{required:true,message:'标签名称必填',trigger:'blur'}" prop="tName">
+            <el-input v-model="formData.tName" style="width: 100%" placeholder="请输入标签名称"></el-input>
           </el-form-item>
-          <el-form-item label="所属目录" :rules="{required:true,message:'所属目录必填',trigger:'change'}" prop="catalogue"
-          v-if="!formData.id">
-            <el-cascader v-model="formData.catalogue" placeholder="请选择标签目录" clearable id="edit-tag-cascader"
-              :options="tagCatalogue" :props="{value:'fsdfsfssdefffe',label:'ChartClassifyName',children:'Children',checkStrictly:true}"
-              style="width: 100%;"></el-cascader>
+          <el-form-item label="所属目录" :rules="{required:true,message:'所属目录必填',trigger:'change'}" prop="mId"
+          v-if="!formData.tId">
+            <el-cascader v-model="formData.mId" ref="editTagCascader" placeholder="请选择标签目录" clearable id="edit-tag-cascader"
+              :options="tagCatalogue" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"
+              style="width: 100%;" :clearable="false" ></el-cascader>
           </el-form-item>
 				</el-form>
         <div class="dia-bot">
@@ -32,6 +32,8 @@
 </template>
 
 <script>
+import {asrInterface} from '@/api/modules/semanticsApi.js';
+
   export default {
     name:"editTag",
     props:{
@@ -53,8 +55,7 @@
     watch:{
       diaShow(value){
         if(value){
-          console.log(this.formData,'formData');
-          this.diaTitle = this.formData.id?"编辑标签":"添加标签"
+          this.diaTitle = this.formData.tId?"编辑标签":"添加标签"
           this.$refs.diaForm && this.$nextTick(()=>{
             this.$refs.diaForm.clearValidate()
           })
@@ -73,10 +74,31 @@
       saveHandle(){
         this.$refs.diaForm.validate(valid=>{
           if(valid){
-            //TODO: 保存目录接口
-            this.$message.success(this.diaTitle+"成功")
-            this.$emit("tagSuccess")
-            this.$emit("update:diaShow",false)
+            if(this.formData.tId){
+              // 编辑
+              asrInterface.editTag({
+                TagId:this.formData.tId,
+                TagName:this.formData.tName
+              }).then(res=>{
+                if(res.Ret == 200){
+                  this.$message.success(this.diaTitle+"成功")
+                  this.$emit("tagSuccess",{type:"edit"})
+                  this.$emit("update:diaShow",false)
+                }
+              })
+            }else{
+              asrInterface.addTag({
+                MenuId:this.formData.mId,
+                TagName:this.formData.tName
+              }).then(res=>{
+                if(res.Ret == 200){
+                  this.$message.success(this.diaTitle+"成功")
+                  let menuIds = this.$refs.editTagCascader.getCheckedNodes()[0] && this.$refs.editTagCascader.getCheckedNodes()[0].pathNodes.map(node=> node.data.UniqueCode)
+                  this.$emit("tagSuccess",{type:"add",menuIds})
+                  this.$emit("update:diaShow",false)
+                }
+              })
+            }
           }
         })
       },

+ 34 - 12
src/views/semantics_manage/asr/components/exportDia.vue

@@ -19,20 +19,21 @@
             </el-select>
           </el-form-item>
           <el-form-item label="显示信息" prop="shows">
-            <el-select v-model="formData.shows" placeholder="请选择显示信息" style="width: 100%">
+            <el-select v-model="formData.shows" placeholder="请选择显示信息" style="width: 100%" clearable >
               <el-option :label="item.label" :value="item.value" v-for="item in showsList" :key="item.value"></el-option>
             </el-select>
           </el-form-item>
 				</el-form>
         <div class="dia-bot">
-          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">取消</el-button>
-          <el-button type="primary" @click="saveHandle" style="min-width:120px;">保存</el-button>
+          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle" >取消</el-button>
+          <el-button type="primary" @click="saveHandle" style="min-width:120px;" >保存</el-button>
         </div>
 			</div>
 		</el-dialog>
 </template>
 
 <script>
+
   export default {
     name:"exportDia",
     props:{
@@ -47,6 +48,14 @@
         default:false
       }
     },
+    data() {
+      return {
+        diaTitle:'导出内容',
+        exportType:[{value:1,label:".txt"},{value:2,label:".doc"},{value:3,label:".pdf"}],
+        showsList:[{value:"timestamp",label:"时间戳"}],
+        exportBase: process.env.VUE_APP_API_ROOT + "/speech_recognition/export", //数据导出接口
+      }
+    },
     watch:{
       diaShow(value){
         if(value){
@@ -56,12 +65,20 @@
         }
       }
     },
-    data() {
-      return {
-        diaTitle:'导出内容',
-        exportType:[{value:"doc",label:".doc"},{value:"pdf",label:".pdf"},{value:"txt",label:".txt"}],
-        showsList:[{value:"timestamp",label:"时间戳"}]
-      }
+    computed: {
+      exportApi() {
+        // 数据导出接口
+        let urlStr = this.exportBase;
+        // token
+        urlStr += `?${localStorage.getItem("auth") || ""}`;
+        // 语音识别Id
+        urlStr += `&SpeechRecognitionId=${this.formData.id}`;
+        // 导出类型
+        urlStr += `&ExportType=${this.formData.type}`;
+        // 显示信息
+        urlStr += `&Timestamp=${!!this.formData.shows}`;
+        return this.escapeStr(urlStr);
+      },
     },
     methods: {
       cancelHandle(){
@@ -70,13 +87,18 @@
       saveHandle(){
         this.$refs.diaForm.validate(valid=>{
           if(valid){
-            //TODO: 导出接口
-            this.$message.success("导出成功")
-            // this.$emit("exportSuccess")
+            const link = document.createElement("a");
+            link.href = this.exportApi;
+            link.download = "";
+            link.click();
             this.$emit("update:diaShow",false)
           }
         })
       },
+      // 对[#,;]转义
+      escapeStr(str) {
+        return str.replace(/#/g, escape("#")).replace(/;/g, escape(";"));
+      },
       closeHandle(){
         this.$emit("update:diaShow",false)
       }

+ 9 - 4
src/views/semantics_manage/asr/components/fileRename.vue

@@ -26,6 +26,8 @@
 </template>
 
 <script>
+import { asrInterface } from '../../../../api/modules/semanticsApi'
+
   export default {
     name:"fileRename",
     props:{
@@ -61,10 +63,13 @@
       saveHandle(){
         this.$refs.diaForm.validate(valid=>{
           if(valid){
-            //TODO: 重命名保存接口
-            this.$message.success(this.diaTitle+"成功")
-            this.$emit("renameSuccess")
-            this.$emit("update:diaShow",false)
+            asrInterface.speechRename({SpeechRecognitionId:this.formData.id,FileName:this.formData.name}).then(res=>{
+              if(res.Ret == 200){
+                this.$message.success(this.diaTitle+"成功")
+                this.$emit("renameSuccess")
+                this.$emit("update:diaShow",false)
+              }
+            })
           }
         })
       },

+ 55 - 52
src/views/semantics_manage/asr/components/makeTags.vue

@@ -17,23 +17,23 @@
         <div class="make-tags-list">
           <el-checkbox-group v-model="formData.tagsArr" class="make-tags-group" ref="tagsGroupRef" 
           v-if="tagsListAfterFilter && tagsListAfterFilter.length>0" @change="tagsCheckedChange">
-            <el-checkbox :label="item.tagId" v-for="item in tagsListAfterFilter" :key="item.tagId" style="margin-right: 0;"> {{ item.tagName }}</el-checkbox>
+            <el-checkbox :label="item.TagId" v-for="item in tagsListAfterFilter" :key="item.TagId" style="margin-right: 0;"> {{ item.TagName }}</el-checkbox>
           </el-checkbox-group>
           <tableNoData text="暂无数据" v-else />
         </div>
-        <div class="make-tags-add">
+        <div class="make-tags-add" v-permission="permissionBtn.semanticPermission.ASR_tagMark_add">
           <div class="make-tags-add-title">添加标签</div>
           <el-form
           ref="tagsForm" class="tags-form"
           label-position="top" inline
           hide-required-asterisk
           :model="addTagsForm">
-            <el-form-item :rules="{required:true,message:'标签名称必填',trigger:'blur'}" prop="tagName">
-              <el-input v-model="addTagsForm.tagName" placeholder="请输入标签名称" style="width: 260px"></el-input>
+            <el-form-item :rules="{required:true,message:'标签名称必填',trigger:'blur'}" prop="TagName">
+              <el-input v-model="addTagsForm.TagName" placeholder="请输入标签名称" style="width: 260px"></el-input>
             </el-form-item>
-            <el-form-item prop="tagCatalogue"  :rules="{required:true,message:'标签目录必填',trigger:'change'}">
-              <el-cascader v-model="addTagsForm.tagCatalogue" placeholder="请选择标签目录" id="make-tags-cascader" style="width: 260px"
-              :options="tagCatalogueList" :props="{value:'UniqueCode',label:'ChartClassifyName',children:'Children',checkStrictly:true}"></el-cascader>
+            <el-form-item prop="MenuId"  :rules="{required:true,message:'标签目录必填',trigger:'change'}">
+              <el-cascader v-model="addTagsForm.MenuId" placeholder="请选择标签目录" ref="makeTagsCascader" id="make-tags-cascader" style="width: 260px"
+              :options="tagCatalogueList" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"></el-cascader>
             </el-form-item>
             <el-button type="primary" style="width: 100px;" @click="addTag">添加</el-button>
           </el-form>
@@ -47,6 +47,7 @@
 </template>
 
 <script>
+import {asrInterface} from '@/api/modules/semanticsApi.js';
   export default {
     name:"makeTags",
     props:{
@@ -69,14 +70,6 @@
         required:true
       }
     },
-    watch:{
-      diaShow(value){
-        if(value){
-          this.updateTagsList()
-          this.tagsCheckedChange()
-        }
-      },
-    },
     data() {
       return {
         diaTitle:'打标签',
@@ -85,9 +78,10 @@
         isCheckAll:false,
         tagsListAfterFilter:[],
         addTagsForm:{
-          tagName:'',
-          tagCatalogue:''
+          TagName:'',
+          MenuId:''
         },
+        shouldExpandCode:new Set(),
         hasAddTag:false
       }
     },
@@ -95,7 +89,7 @@
       checkAllTags(){
         this.isIndeterminate=false
         if(this.isCheckAll){
-          this.formData.tagsArr=this.tagsList.map(item => item.tagId)
+          this.formData.tagsArr=this.tagsList.map(item => item.TagId)
         }else{
           this.formData.tagsArr=[]
         }
@@ -105,11 +99,11 @@
       },
       closeHandle(){
         if(this.hasAddTag){
-          this.$emit("updateTagsTree")
+          this.$emit("updateTagsTree",this.shouldExpandCode)
         }
         this.addTagsForm={
-          tagName:'',
-          tagCatalogue:''
+          TagName:'',
+          MenuId:''
         }
         this.hasAddTag=false
         this.tagSeachWord=""
@@ -119,11 +113,9 @@
         this.$emit("update:diaShow",false)
       },
       searchTags(){
-        console.log(this.tagSeachWord);
-        this.updateTagsList('top')
+        this.updateTagsList()
       },
       tagsCheckedChange(value){
-        console.log(value,this.formData.tagsArr,'this.formData.tagsArr');
         if(!( (this.formData.tagsArr && this.formData.tagsArr.length>0) && (this.tagsList && this.tagsList.length>0) )){
           this.isIndeterminate=false
           this.isCheckAll=false
@@ -136,44 +128,55 @@
         }
       },
       updateTagsList(scrollType){
-        this.tagsListAfterFilter=this.tagsList.filter(tag => tag.tagName.indexOf(this.tagSeachWord)!=-1)
-        switch (scrollType) {
-          case "top":
+        this.tagsListAfterFilter=this.tagsList.filter(tag => tag.TagName.indexOf(this.tagSeachWord)!=-1)
+        // switch (scrollType) {
+        //   case "top":
             this.$nextTick(()=>{
               this.$refs.tagsGroupRef && this.$refs.tagsGroupRef.$el.scrollTo(0,0)
             })
-            break;
-          case "bottom":
-            this.$nextTick(()=>{
-              this.$refs.tagsGroupRef && this.$refs.tagsGroupRef.$el.scrollTo(0,this.$refs.tagsGroupRef.$el.scrollHeight)
-            })
-            break;
-        }
+            // break;
+          // case "bottom":
+          //   this.$nextTick(()=>{
+          //     this.$refs.tagsGroupRef && this.$refs.tagsGroupRef.$el.scrollTo(0,this.$refs.tagsGroupRef.$el.scrollHeight)
+          //   })
+          //   break;
+        // }
       },
       addTag(){
-        console.log(this.addTagsForm);
         this.$refs.tagsForm.validate(valid=>{
           if(valid){
-            //TODO: 新增标签接口
-            this.$message.success("新增标签成功")
-            this.addTagsForm={
-              tagName:'',
-              tagCatalogue:''
-            }
-            this.formData.tagsArr.push('16')
-            this.tagsCheckedChange()
-            this.hasAddTag=true
-            this.$emit("addTagSuccess")
+            asrInterface.addTag(this.addTagsForm).then(res=>{
+              if(res.Ret == 200){
+                res.Data && this.formData.tagsArr.push(res.Data)
+                // 设置展开
+                this.$refs.makeTagsCascader.getCheckedNodes()[0] && 
+                this.$refs.makeTagsCascader.getCheckedNodes()[0].pathNodes.map(pNode=>{
+                  this.shouldExpandCode.add(pNode.data.UniqueCode)
+                })
+                this.hasAddTag=true
+                this.addTagsForm={
+                  TagName:'',
+                  MenuId:''
+                }
+                this.$message.success("新增标签成功")
+                this.$emit("addTagSuccess")
+              }
+            })
           }
         })
       },
       saveHandle(){
-        //TODO: 打标签接口
-        this.$message.success("打标签成功")
-        this.$emit("update:diaShow",false)
-        // console.log(this);
-        let tagsData=this.tagsList.filter(tag => this.formData.tagsArr.includes(tag.tagId))
-        this.$emit("makeTagsSuccess",tagsData)
+        asrInterface.speechSaveTag({
+          SpeechRecognitionId:this.formData.id,
+          TagIds:this.formData.tagsArr
+        }).then(res=>{
+          if(res.Ret == 200){
+            this.$message.success("打标签成功")
+            let tagsData=this.tagsList.filter(tag => this.formData.tagsArr.includes(tag.TagId))
+            this.$emit("makeTagsSuccess",tagsData)
+            this.$emit("update:diaShow",false)
+          }
+        })
       },
     },
   }
@@ -236,7 +239,7 @@
 .make-tags-group{
   .el-checkbox{
     margin-right: 0;
-    display: flex;
+    // display: flex;
     .el-checkbox__label{
       word-break: break-all;
       white-space: normal;

+ 36 - 37
src/views/semantics_manage/asr/components/mediaUpload.vue

@@ -17,7 +17,7 @@
           <el-form-item label="所属目录" :rules="{required:true,message:'所属目录必填',trigger:'change'}" 
           prop="catalogue" label-width="76px">
             <el-cascader v-model="formData.catalogue" placeholder="请选择所属目录" clearable id="media-upload-cascader"
-              :options="articleCatalogue" :props="{value:'UniqueCode',label:'ChartClassifyName',children:'Children',checkStrictly:true}"
+              :options="articleCatalogue" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"
               style="width: 604px;"></el-cascader>
           </el-form-item>
 				</el-form>
@@ -82,6 +82,8 @@
 
 <script>
 import {uploadFileDirect} from "@/utils/common.js"
+import {asrInterface} from '@/api/modules/semanticsApi.js';
+
   export default {
     name:"editTag",
     props:{
@@ -113,7 +115,6 @@ import {uploadFileDirect} from "@/utils/common.js"
     },
     data() {
       return {
-        last:0,
         current:0,
         diaTitle:'上传本地音视频文件',
         formData:{
@@ -121,26 +122,8 @@ import {uploadFileDirect} from "@/utils/common.js"
         },
         fileLimit:50,
         fileExp:new RegExp(/\.(mp3|wav|m4a|amr|wma|aac|opus|ogg|flac|mp4|flv|3gp)$/,'i'),
-        fileList:[
-        {name:"fdsfsa.mp4",size:"1021.26M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        ],
-        // {name:"fdsfsa.mp4",size:"1021.26M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.26M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.26M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},
-        // {name:"fdsfsa.mp4",size:"1021.2M",type:"音频"},{name:"fdsfsa.mp4",size:"1021.2M",type:"音频"}
+        videoExp:new RegExp(/\.(mp4|flv|3gp)$/,'i'),
+        fileList:[],
         uploadingFileNames:[],
         uploadHint:null,
         closeDia:false
@@ -227,16 +210,20 @@ import {uploadFileDirect} from "@/utils/common.js"
             }
           }
         }
-        // uploadFileDirect(clientType,file.raw,temName,options).then(res=>{
-          setTimeout(()=>{
-            console.log(this.current,this.last,'current','last');
-            if(!this.diaShow || (this.current!=this.last)) return 
-            this.fileList.push({name:fileFront,fileUrl:'res',size:this.sizeFormat(file.size),type:"音频"})
-            this.deleteUploadItem(fileFront)
-          },10000)
-          // }).finally(()=>{
-
-          // })
+        let windowNum=this.current
+        uploadFileDirect(clientType,file.raw,temName,options).then(res=>{
+          console.log(windowNum,this.current,'this.current');
+          if(!this.diaShow || (this.current!=windowNum)) return 
+          let item = {
+            name:fileFront,
+            fileUrl:res,
+            size:this.sizeFormat(file.size),
+            type:this.videoExp.test(res)?"视频":"音频"
+          }
+          this.fileList.push(item)
+        }).finally(()=>{
+          this.deleteUploadItem(fileFront)
+        })
       },
       sizeFormat(s){
         let size = Number(s)
@@ -287,12 +274,25 @@ import {uploadFileDirect} from "@/utils/common.js"
         if(this.uploadingFileNames && this.uploadingFileNames.length>0){
           return this.$message.error("还有音/视频未上传完成,请等待上传成功后再转写!") 
         } 
+        let params={
+          MenuId:this.formData.catalogue,
+          Files:this.fileList.map(f =>{
+            return {
+              FileName:f.name,
+              ResourceUrl:f.fileUrl
+            }
+          })
+        }
         this.$refs.diaForm.validate(valid=>{
           if(valid){
-            //TODO: 转写接口调用
-            this.$message.success("提交转写成功")
-            this.$emit("uploadSuccess")
-            this.$emit("update:diaShow",false)
+            asrInterface.speechTransfer(params).then(res=>{
+              if(res.Ret == 200){
+                this.$message.success("提交转写成功")
+                this.$emit("uploadSuccess")
+                this.$emit("update:diaShow",false)
+              }
+            })
+
           }
         })
       },
@@ -301,7 +301,6 @@ import {uploadFileDirect} from "@/utils/common.js"
         this.closeDia=true
         this.uploadingFileNames=[]
         this.fileList=[]
-        this.last++
         this.$emit("update:diaShow",false)
         this.$nextTick(()=>{
           this.$refs.diaForm.clearValidate()

+ 17 - 9
src/views/semantics_manage/asr/components/transferStatus.vue

@@ -13,15 +13,15 @@
       </div>
     </div>
     <div class="transfer-status-body" >
-      <div class="transfer-status-row" v-for="(item,index) in transferStatus.list" :key="item.name">
+      <div class="transfer-status-row" v-for="(item,index) in transferStatus.list" :key="item.SpeechRecognitionId">
         <div class="status-body-name">
-          <span>{{ item.name }}</span>
-          <span v-if="item.status==2" style="color: #AD352F;">({{ item.statusText }}:{{ item.failReason }})</span>
+          <span>{{ item.FileName }}</span>
+          <span v-if="item.State==3" style="color: #AD352F;">({{ stateTextArr[item.State] }}:{{ item.ConvertRemark }})</span>
         </div>
         <div class="status-body-right">
-          <img v-if="item.status==2" src="~@/assets/img/icons/delete-red.png" style="cursor: pointer;" 
-          @click="deleteRow(item,index)" :draggable="false"/>
-          <span v-else :style="{'color':item.status==0?'#999999':'#333333'}">{{ item.statusText }}</span>
+          <img v-if="item.State==3" src="~@/assets/img/icons/delete-red.png" style="cursor: pointer;" 
+          @click="deleteRow(item,index)" :draggable="false" v-permission="permissionBtn.semanticPermission.ASR_deleteArticles"/>
+          <span v-else :style="{'color':item.State==0?'#999999':'#333333'}">{{ stateTextArr[item.State] }}</span>
         </div>
       </div>
     </div>
@@ -30,6 +30,8 @@
 </template>
 
 <script>
+import { asrInterface } from '../../../../api/modules/semanticsApi'
+
   export default {
     name:"transferStatus",
     props:{
@@ -50,7 +52,8 @@
         y: 20,
         dragOffsetX: null,
         dragOffsetY: null,
-        dragDocument:null
+        dragDocument:null,
+        stateTextArr:['','转写中','转写完成','转写失败']
       }
     },
     mounted(){
@@ -60,10 +63,15 @@
     },
     methods: {
       deleteRow(item,index){
-        this.$emit("deleteRow",{item,index})
+        asrInterface.speechRemove({SpeechRecognitionId:item.SpeechRecognitionId}).then(res=>{
+          if(res.Ret == 200){
+            this.$message.success("删除成功")
+            this.$emit("deleteRow",{item,index})
+          }
+        })
       },
       closeWindow(){
-        // localStorage.removeItem("transferStatusShow")
+        localStorage.removeItem("transferStatusShow")
         this.$emit("update:windowShow",false)
       },
       dragStart(event) {

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.