Browse Source

语音识别

hsun 11 months ago
parent
commit
9ef8d99345

+ 16 - 33
controllers/speech_recognition/speech_recognition.go

@@ -11,6 +11,7 @@ import (
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"os"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -190,7 +191,8 @@ func (this *SpeechRecognitionController) Convert() {
 		t.FileName = v.FileName
 		t.ResourceUrl = v.ResourceUrl
 		t.MenuId = req.MenuId
-		// TODO:所属目录位置
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		t.UniqueCode = utils.MD5(fmt.Sprintf("%s_%s", t.TableName(), timestamp))
 		t.SysUserId = sysUser.AdminId
 		t.SysUserName = sysUser.RealName
 		t.State = speech_recognition.SpeechRecognitionStateWait
@@ -521,8 +523,10 @@ func (this *SpeechRecognitionController) Remove() {
 		return
 	}
 
-	// 清除标签关联
+	// 清除关联
 	go func() {
+		contentOb := new(speech_recognition.SpeechRecognitionContent)
+		_ = contentOb.ClearContentBySpeechId(req.SpeechRecognitionId)
 		mappingOb := new(speech_recognition.SpeechRecognitionTagMapping)
 		_ = mappingOb.ClearMappingBySpeechId(req.SpeechRecognitionId)
 	}()
@@ -618,6 +622,7 @@ func (this *SpeechRecognitionController) SaveTag() {
 // @Param   EndTime  query  string  false  "结束时间"
 // @Param   CreateUserId  query  int  false  "创建人ID"
 // @Param   TagId  query  int  false  "标签ID"
+// @Param   MenuId  query  int  false  "目录ID"
 // @Success 200 {object} speech_recognition.SpeechRecognitionListResp
 // @router /list [get]
 func (this *SpeechRecognitionController) List() {
@@ -674,6 +679,10 @@ func (this *SpeechRecognitionController) List() {
 			cond += fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionCols.SysUserId)
 			pars = append(pars, params.CreateUserId)
 		}
+		if params.MenuId > 0 {
+			cond += fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionCols.MenuId)
+			pars = append(pars, params.MenuId)
+		}
 
 		// 标签筛选
 		if params.TagId > 0 {
@@ -833,36 +842,6 @@ func (this *SpeechRecognitionController) Detail() {
 	br.Msg = "获取成功"
 }
 
-// TODO:Move
-// @Title 移动语音识别/目录
-// @Description 移动标签/目录
-// @Param	request	body speech_recognition.SpeechRecognitionTagRemoveReq true "type json string"
-// @Success 200 string "操作成功"
-// @router /move [post]
-func (this *SpeechRecognitionController) Move() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		if br.ErrMsg == "" {
-			br.IsSendEmail = false
-		}
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-
-	// TODO:移动语音识别/目录
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "操作成功"
-}
-
 // Export
 // @Title 导出内容
 // @Description 导出内容
@@ -923,8 +902,12 @@ func (this *SpeechRecognitionController) Export() {
 		br.Msg = "无内容导出"
 		return
 	}
+	if req.ExportType != services.SpeechRecognitionExportTypeTxt && req.ExportType != services.SpeechRecognitionExportTypeDocx && req.ExportType != services.SpeechRecognitionExportTypePdf {
+		br.Msg = "导出类型有误"
+		return
+	}
 
-	suffixMap := map[int]string{1: ".txt", 2: ".docx", 3: ".pdf"}
+	suffixMap := map[int]string{services.SpeechRecognitionExportTypeTxt: ".txt", services.SpeechRecognitionExportTypeDocx: ".docx", services.SpeechRecognitionExportTypePdf: ".pdf"}
 	suffix := suffixMap[req.ExportType]
 	if suffix == "" {
 		suffix = ".txt"

+ 93 - 46
controllers/speech_recognition/speech_recognition_menu.go

@@ -7,6 +7,8 @@ import (
 	"eta/eta_api/models/speech_recognition"
 	"eta/eta_api/utils"
 	"fmt"
+	"sort"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -69,6 +71,7 @@ func (this *SpeechRecognitionMenuController) Add() {
 
 	// 获取目录层级
 	level := 1
+	rootId := 0
 	{
 		if req.ParentId > 0 {
 			parentMenu, e := menuOb.GetItemById(req.ParentId)
@@ -78,12 +81,16 @@ func (this *SpeechRecognitionMenuController) Add() {
 				return
 			}
 			level += parentMenu.Level
+			rootId = parentMenu.RootId
 		}
 	}
 
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	menuOb.UniqueCode = utils.MD5(fmt.Sprintf("%s_%s", menuOb.TableName(), timestamp))
 	menuOb.MenuName = req.MenuName
 	menuOb.ParentId = req.ParentId
 	menuOb.Level = level
+	menuOb.RootId = rootId
 	menuOb.CreateTime = time.Now().Local()
 	menuOb.ModifyTime = time.Now().Local()
 	e := menuOb.Create()
@@ -296,13 +303,11 @@ func (this *SpeechRecognitionMenuController) Tree() {
 	// 前端采用懒加载, 所以只查询目录及当前目录下的语音识别
 	parentId, _ := this.GetInt("ParentId")
 
+	// 获取所有目录
 	menus := make([]*speech_recognition.SpeechRecognitionMenu, 0)
 	{
 		menuOb := new(speech_recognition.SpeechRecognitionMenu)
-		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionMenuCols.ParentId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, parentId)
-		list, e := menuOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort))
+		list, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort))
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取目录列表失败, Err: " + e.Error()
@@ -311,50 +316,44 @@ func (this *SpeechRecognitionMenuController) Tree() {
 		menus = list
 	}
 
+	topMenus := make([]*speech_recognition.SpeechRecognitionMenu, 0)                  // 顶部节点
+	menuChildren := make(map[int][]*speech_recognition.SpeechRecognitionMenuNodeItem) // 子目录节点
+	menuIdLevel := make(map[int]int)                                                  // 目录对应层级
+	for _, v := range menus {
+		menuIdLevel[v.SpeechRecognitionMenuId] = v.Level
+		if v.ParentId == parentId {
+			topMenus = append(topMenus, v)
+		}
+
+		if menuChildren[v.ParentId] == nil {
+			menuChildren[v.ParentId] = make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
+		}
+		menuChildren[v.ParentId] = append(menuChildren[v.ParentId], &speech_recognition.SpeechRecognitionMenuNodeItem{
+			UniqueCode: v.UniqueCode,
+			NodeType:   speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
+			MenuId:     v.SpeechRecognitionMenuId,
+			MenuName:   v.MenuName,
+			ParentId:   v.ParentId,
+			Level:      v.Level,
+			Sort:       v.Sort,
+			CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+
 	resp := make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
-	if len(menus) == 0 {
+	if len(topMenus) == 0 {
 		br.Data = resp
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
 		return
 	}
+
+	// 目录下的语音识别
 	menuIds := make([]int, 0)
-	for _, m := range menus {
+	for _, m := range topMenus {
 		menuIds = append(menuIds, m.SpeechRecognitionMenuId)
 	}
-
-	// 子目录
-	childMenus := make([]*speech_recognition.SpeechRecognitionMenu, 0)
-	{
-		menuOb := new(speech_recognition.SpeechRecognitionMenu)
-		cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionMenuCols.ParentId, utils.GetOrmInReplace(len(menuIds)))
-		pars := make([]interface{}, 0)
-		pars = append(pars, menuIds)
-		list, e := menuOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort, speech_recognition.SpeechRecognitionMenuCols.ParentId))
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取子目录列表失败, Err: " + e.Error()
-			return
-		}
-		childMenus = list
-	}
-	menuChildren := make(map[int][]*speech_recognition.SpeechRecognitionMenuNodeItem)
-	for _, m := range childMenus {
-		if menuChildren[m.ParentId] == nil {
-			menuChildren[m.ParentId] = make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
-		}
-		menuChildren[m.ParentId] = append(menuChildren[m.ParentId], &speech_recognition.SpeechRecognitionMenuNodeItem{
-			NodeType:   speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
-			MenuId:     m.SpeechRecognitionMenuId,
-			MenuName:   m.MenuName,
-			ParentId:   m.ParentId,
-			Sort:       m.Sort,
-			CreateTime: utils.TimeTransferString(utils.FormatDateTime, m.CreateTime),
-		})
-	}
-
-	// 目录下的语音识别
 	speeches := make([]*speech_recognition.SpeechRecognition, 0)
 	{
 		speechOb := new(speech_recognition.SpeechRecognition)
@@ -375,30 +374,38 @@ func (this *SpeechRecognitionMenuController) Tree() {
 			menuSpeeches[s.MenuId] = make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
 		}
 		menuSpeeches[s.MenuId] = append(menuSpeeches[s.MenuId], &speech_recognition.SpeechRecognitionMenuNodeItem{
+			UniqueCode:            s.UniqueCode,
 			NodeType:              speech_recognition.SpeechRecognitionMenuNodeTypeSpeech,
 			SpeechRecognitionId:   s.SpeechRecognitionId,
 			SpeechRecognitionName: s.FileName,
 			ParentId:              s.MenuId,
+			Level:                 menuIdLevel[s.MenuId] + 1,
 			Sort:                  s.Sort,
 			CreateTime:            utils.TimeTransferString(utils.FormatDateTime, s.CreateTime),
 		})
 	}
 
-	for _, m := range menus {
+	for _, m := range topMenus {
+		child := make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
+		if menuSpeeches[m.SpeechRecognitionMenuId] != nil {
+			child = append(child, menuSpeeches[m.SpeechRecognitionMenuId]...)
+		}
+		if menuChildren[m.SpeechRecognitionMenuId] != nil {
+			child = append(child, menuChildren[m.SpeechRecognitionMenuId]...)
+		}
+		sort.Slice(child, func(i, j int) bool {
+			return child[i].Sort < child[j].Sort
+		})
 		t := &speech_recognition.SpeechRecognitionMenuNodeItem{
+			UniqueCode: m.UniqueCode,
 			NodeType:   speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
 			MenuId:     m.SpeechRecognitionMenuId,
 			MenuName:   m.MenuName,
 			ParentId:   m.ParentId,
+			Level:      m.Level,
 			Sort:       m.Sort,
 			CreateTime: utils.TimeTransferString(utils.FormatDateTime, m.CreateTime),
-			Children:   make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0),
-		}
-		if menuSpeeches[m.SpeechRecognitionMenuId] != nil {
-			t.Children = append(t.Children, menuSpeeches[m.SpeechRecognitionMenuId]...)
-		}
-		if menuChildren[m.SpeechRecognitionMenuId] != nil {
-			t.Children = append(t.Children, menuChildren[m.SpeechRecognitionMenuId]...)
+			Children:   child,
 		}
 		resp = append(resp, t)
 	}
@@ -408,3 +415,43 @@ func (this *SpeechRecognitionMenuController) Tree() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// Move
+// @Title 移动目录/语音识别
+// @Description 移动目录/语音识别
+// @Param	request	body speech_recognition.SpeechRecognitionMenuMoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /move [post]
+func (this *SpeechRecognitionMenuController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req speech_recognition.SpeechRecognitionMenuMoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.MenuId <= 0 && req.SpeechId <= 0 {
+		br.Msg = "请选择目录或语音识别"
+		return
+	}
+
+	// TODO:移动
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 3 - 31
controllers/speech_recognition/speech_recognition_tag.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/speech_recognition"
 	"eta/eta_api/utils"
 	"fmt"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -71,9 +72,10 @@ func (this *SpeechRecognitionTagController) Add() {
 		}
 	}
 
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	tagOb.UniqueCode = utils.MD5(fmt.Sprintf("%s_%s", tagOb.TableName(), timestamp))
 	tagOb.TagName = req.TagName
 	tagOb.MenuId = req.MenuId
-	// TODO:所属目录位置
 	tagOb.CreateTime = time.Now().Local()
 	tagOb.ModifyTime = time.Now().Local()
 	if e := tagOb.Create(); e != nil {
@@ -297,33 +299,3 @@ func (this *SpeechRecognitionTagController) List() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
-
-// Move
-// @Title 移动标签/目录
-// @Description 移动标签/目录
-// @Param	request	body speech_recognition.SpeechRecognitionTagRemoveReq true "type json string"
-// @Success 200 string "操作成功"
-// @router /tag/move [post]
-func (this *SpeechRecognitionTagController) Move() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		if br.ErrMsg == "" {
-			br.IsSendEmail = false
-		}
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-
-	// TODO:移动标签/目录
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "操作成功"
-}

+ 82 - 45
controllers/speech_recognition/speech_recognition_tag_menu.go

@@ -8,6 +8,8 @@ import (
 	"eta/eta_api/services"
 	"eta/eta_api/utils"
 	"fmt"
+	"sort"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -71,6 +73,7 @@ func (this *SpeechRecognitionTagMenuController) Add() {
 
 	// 获取目录层级
 	level := 1
+	rootId := 0
 	{
 		if req.ParentId > 0 {
 			parentMenu, e := menuOb.GetItemById(req.ParentId)
@@ -80,12 +83,16 @@ func (this *SpeechRecognitionTagMenuController) Add() {
 				return
 			}
 			level += parentMenu.Level
+			rootId = parentMenu.RootId
 		}
 	}
 
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	menuOb.UniqueCode = utils.MD5(fmt.Sprintf("%s_%s", menuOb.TableName(), timestamp))
 	menuOb.MenuName = req.MenuName
 	menuOb.ParentId = req.ParentId
 	menuOb.Level = level
+	menuOb.RootId = rootId
 	menuOb.CreateTime = time.Now().Local()
 	menuOb.ModifyTime = time.Now().Local()
 	e := menuOb.Create()
@@ -298,13 +305,11 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 	// 前端采用懒加载, 所以只查询目录及当前目录下的语音识别
 	parentId, _ := this.GetInt("ParentId")
 
+	// 获取所有目录
 	menus := make([]*speech_recognition.SpeechRecognitionTagMenu, 0)
 	{
 		menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
-		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagMenuCols.ParentId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, parentId)
-		list, e := menuOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionTagMenuCols.Sort))
+		list, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort))
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取目录列表失败, Err: " + e.Error()
@@ -313,50 +318,44 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 		menus = list
 	}
 
+	topMenus := make([]*speech_recognition.SpeechRecognitionTagMenu, 0)                  // 顶部节点
+	menuChildren := make(map[int][]*speech_recognition.SpeechRecognitionTagMenuNodeItem) // 子目录节点
+	menuIdLevel := make(map[int]int)                                                     // 目录对应层级
+	for _, v := range menus {
+		menuIdLevel[v.SpeechRecognitionTagMenuId] = v.Level
+		if v.ParentId == parentId {
+			topMenus = append(topMenus, v)
+		}
+
+		if menuChildren[v.ParentId] == nil {
+			menuChildren[v.ParentId] = make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0)
+		}
+		menuChildren[v.ParentId] = append(menuChildren[v.ParentId], &speech_recognition.SpeechRecognitionTagMenuNodeItem{
+			UniqueCode: v.UniqueCode,
+			NodeType:   speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
+			MenuId:     v.SpeechRecognitionTagMenuId,
+			MenuName:   v.MenuName,
+			ParentId:   v.ParentId,
+			Level:      v.Level,
+			Sort:       v.Sort,
+			CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+
 	resp := make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0)
-	if len(menus) == 0 {
+	if len(topMenus) == 0 {
 		br.Data = resp
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
 		return
 	}
+
+	// 目录下的标签
 	menuIds := make([]int, 0)
 	for _, m := range menus {
 		menuIds = append(menuIds, m.SpeechRecognitionTagMenuId)
 	}
-
-	// 子目录
-	childMenus := make([]*speech_recognition.SpeechRecognitionTagMenu, 0)
-	{
-		menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
-		cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionTagMenuCols.ParentId, utils.GetOrmInReplace(len(menuIds)))
-		pars := make([]interface{}, 0)
-		pars = append(pars, menuIds)
-		list, e := menuOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s ASC", speech_recognition.SpeechRecognitionTagMenuCols.Sort, speech_recognition.SpeechRecognitionTagMenuCols.ParentId))
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取子目录列表失败, Err: " + e.Error()
-			return
-		}
-		childMenus = list
-	}
-	menuChildren := make(map[int][]*speech_recognition.SpeechRecognitionTagMenuNodeItem)
-	for _, m := range childMenus {
-		if menuChildren[m.ParentId] == nil {
-			menuChildren[m.ParentId] = make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0)
-		}
-		menuChildren[m.ParentId] = append(menuChildren[m.ParentId], &speech_recognition.SpeechRecognitionTagMenuNodeItem{
-			NodeType:   speech_recognition.SpeechRecognitionTagMenuNodeTypeDefault,
-			MenuId:     m.SpeechRecognitionTagMenuId,
-			MenuName:   m.MenuName,
-			ParentId:   m.ParentId,
-			Sort:       m.Sort,
-			CreateTime: utils.TimeTransferString(utils.FormatDateTime, m.CreateTime),
-		})
-	}
-
-	// 目录下的标签
 	tags := make([]*speech_recognition.SpeechRecognitionTag, 0)
 	{
 		tagOb := new(speech_recognition.SpeechRecognitionTag)
@@ -377,30 +376,38 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 			menuTags[s.MenuId] = make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0)
 		}
 		menuTags[s.MenuId] = append(menuTags[s.MenuId], &speech_recognition.SpeechRecognitionTagMenuNodeItem{
+			UniqueCode: s.UniqueCode,
 			NodeType:   speech_recognition.SpeechRecognitionTagMenuNodeTypeTag,
 			TagId:      s.SpeechRecognitionTagId,
 			TagName:    s.TagName,
 			ParentId:   s.MenuId,
+			Level:      menuIdLevel[s.MenuId] + 1,
 			Sort:       s.Sort,
 			CreateTime: utils.TimeTransferString(utils.FormatDateTime, s.CreateTime),
 		})
 	}
 
-	for _, m := range menus {
+	for _, m := range topMenus {
+		child := make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0)
+		if menuTags[m.SpeechRecognitionTagMenuId] != nil {
+			child = append(child, menuTags[m.SpeechRecognitionTagMenuId]...)
+		}
+		if menuChildren[m.SpeechRecognitionTagMenuId] != nil {
+			child = append(child, menuChildren[m.SpeechRecognitionTagMenuId]...)
+		}
+		sort.Slice(child, func(i, j int) bool {
+			return child[i].Sort < child[j].Sort
+		})
 		t := &speech_recognition.SpeechRecognitionTagMenuNodeItem{
+			UniqueCode: m.UniqueCode,
 			NodeType:   speech_recognition.SpeechRecognitionTagMenuNodeTypeDefault,
 			MenuId:     m.SpeechRecognitionTagMenuId,
 			MenuName:   m.MenuName,
 			ParentId:   m.ParentId,
+			Level:      m.Level,
 			Sort:       m.Sort,
 			CreateTime: utils.TimeTransferString(utils.FormatDateTime, m.CreateTime),
-			Children:   make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0),
-		}
-		if menuTags[m.SpeechRecognitionTagMenuId] != nil {
-			t.Children = append(t.Children, menuTags[m.SpeechRecognitionTagMenuId]...)
-		}
-		if menuChildren[m.SpeechRecognitionTagMenuId] != nil {
-			t.Children = append(t.Children, menuChildren[m.SpeechRecognitionTagMenuId]...)
+			Children:   child,
 		}
 		resp = append(resp, t)
 	}
@@ -453,3 +460,33 @@ func (this *SpeechRecognitionTagMenuController) List() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// TODO:Move
+// @Title 移动标签/目录
+// @Description 移动标签/目录
+// @Param	request	body speech_recognition.SpeechRecognitionTagRemoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /tag/move [post]
+func (this *SpeechRecognitionTagMenuController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	// TODO:移动标签/目录
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 8 - 3
models/speech_recognition/speech_recognition.go

@@ -20,10 +20,10 @@ const (
 // SpeechRecognition 语音识别主表
 type SpeechRecognition struct {
 	SpeechRecognitionId int       `orm:"column(speech_recognition_id);pk"`
+	UniqueCode          string    `description:"唯一编码"`
 	FileName            string    `description:"文件名称"`
 	ResourceUrl         string    `description:"文件路径"`
 	MenuId              int       `description:"目录ID"`
-	MenuPath            string    `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
 	SysUserId           int       `description:"创建人ID"`
 	SysUserName         string    `description:"创建人姓名"`
 	State               int       `description:"状态:1-待转换;2-转换完成;3-转换失败"`
@@ -39,6 +39,7 @@ type SpeechRecognition struct {
 
 var SpeechRecognitionCols = struct {
 	SpeechRecognitionId string
+	UniqueCode          string
 	FileName            string
 	ResourceUrl         string
 	MenuId              string
@@ -56,6 +57,7 @@ var SpeechRecognitionCols = struct {
 	ModifyTime          string
 }{
 	SpeechRecognitionId: "speech_recognition_id",
+	UniqueCode:          "unique_code",
 	FileName:            "file_name",
 	ResourceUrl:         "resource_url",
 	MenuId:              "menu_id",
@@ -181,10 +183,10 @@ func (m *SpeechRecognition) GetPageItemsByCondition(condition string, pars []int
 // SpeechRecognitionItem 语音识别信息
 type SpeechRecognitionItem struct {
 	SpeechRecognitionId int
+	UniqueCode          string `description:"唯一编码"`
 	FileName            string `description:"文件名称"`
 	ResourceUrl         string `description:"文件路径"`
 	MenuId              int    `description:"目录ID"`
-	MenuPath            string `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
 	SysUserId           int    `description:"创建人ID"`
 	SysUserName         string `description:"创建人姓名"`
 	State               int    `description:"状态:1-待转换;2-转换完成;3-转换失败"`
@@ -201,13 +203,13 @@ func FormatSpeechRecognition2Item(origin *SpeechRecognition) (item *SpeechRecogn
 	}
 	item = new(SpeechRecognitionItem)
 	item.SpeechRecognitionId = origin.SpeechRecognitionId
+	item.UniqueCode = origin.UniqueCode
 	item.FileName = origin.FileName
 	item.ResourceUrl = origin.ResourceUrl
 	if origin.FileState == SpeechRecognitionFileRemoveFlag {
 		item.ResourceUrl = ""
 	}
 	item.MenuId = origin.MenuId
-	item.MenuPath = origin.MenuPath
 	item.SysUserId = origin.SysUserId
 	item.SysUserName = origin.SysUserName
 	item.State = origin.State
@@ -339,6 +341,7 @@ func CreateContentAndUpdateSpeechAndApiLog(contents []*SpeechRecognitionContent,
 // SpeechRecognitionDetailItem 语音识别详情信息
 type SpeechRecognitionDetailItem struct {
 	SpeechRecognitionId int
+	UniqueCode          string                          `description:"唯一编码"`
 	FileName            string                          `description:"文件名称"`
 	ResourceUrl         string                          `description:"文件路径"`
 	MenuId              int                             `description:"目录ID"`
@@ -360,6 +363,7 @@ func FormatSpeechRecognition2DetailItem(origin *SpeechRecognition, contents []*S
 	}
 	item = new(SpeechRecognitionDetailItem)
 	item.SpeechRecognitionId = origin.SpeechRecognitionId
+	item.UniqueCode = origin.UniqueCode
 	item.FileName = origin.FileName
 	item.ResourceUrl = origin.ResourceUrl
 	if origin.FileState == SpeechRecognitionFileRemoveFlag {
@@ -424,6 +428,7 @@ type SpeechRecognitionListReq struct {
 	EndTime      string `form:"EndTime" description:"结束时间"`
 	CreateUserId int    `form:"CreateUserId" description:"创建人ID"`
 	TagId        int    `form:"TagId" description:"标签ID"`
+	MenuId       int    `form:"FormId" description:"目录ID"`
 }
 
 // SpeechRecognitionListResp 语音识别列表响应体

+ 8 - 0
models/speech_recognition/speech_recognition_content.go

@@ -197,3 +197,11 @@ func (m *SpeechRecognitionContent) BatchUpdateContents(contents []SpeechRecognit
 	}
 	return
 }
+
+// ClearContentBySpeechId 清除转写文件内容
+func (m *SpeechRecognitionContent) ClearContentBySpeechId(speechId int) (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionContentCols.SpeechRecognitionId)
+	_, err = o.Raw(sql, speechId).Exec()
+	return
+}

+ 19 - 0
models/speech_recognition/speech_recognition_menu.go

@@ -16,28 +16,34 @@ const (
 // SpeechRecognitionMenu 语音识别-目录表
 type SpeechRecognitionMenu struct {
 	SpeechRecognitionMenuId int       `orm:"column(speech_recognition_menu_id);pk"`
+	UniqueCode              string    `description:"唯一编码"`
 	MenuName                string    `description:"目录名称"`
 	ParentId                int       `description:"父级ID"`
 	Level                   int       `description:"目录层级"`
 	Sort                    int       `description:"排序"`
+	RootId                  int       `description:"顶级ID"`
 	CreateTime              time.Time `description:"创建时间"`
 	ModifyTime              time.Time `description:"修改时间"`
 }
 
 var SpeechRecognitionMenuCols = struct {
 	SpeechRecognitionMenuId string
+	UniqueCode              string
 	MenuName                string
 	ParentId                string
 	Level                   string
 	Sort                    string
+	RootId                  string
 	CreateTime              string
 	ModifyTime              string
 }{
 	SpeechRecognitionMenuId: "speech_recognition_menu_id",
+	UniqueCode:              "unique_code",
 	MenuName:                "menu_name",
 	ParentId:                "parent_id",
 	Level:                   "level",
 	Sort:                    "sort",
+	RootId:                  "root_id",
 	CreateTime:              "create_time",
 	ModifyTime:              "modify_time",
 }
@@ -149,12 +155,14 @@ func (m *SpeechRecognitionMenu) GetPageItemsByCondition(condition string, pars [
 
 // SpeechRecognitionMenuNodeItem 语音识别目录节点
 type SpeechRecognitionMenuNodeItem struct {
+	UniqueCode            string                           `description:"唯一编码"`
 	NodeType              int                              `description:"节点类型:0-目录;1-语音识别"`
 	MenuId                int                              `description:"目录ID"`
 	MenuName              string                           `description:"目录名称"`
 	SpeechRecognitionId   int                              `description:"语音识别ID"`
 	SpeechRecognitionName string                           `description:"语音识别名称"`
 	ParentId              int                              `description:"父级ID"`
+	Level                 int                              `description:"目录层级"`
 	Sort                  int                              `description:"排序"`
 	CreateTime            string                           `description:"创建时间"`
 	Children              []*SpeechRecognitionMenuNodeItem `description:"子节点"`
@@ -176,3 +184,14 @@ type SpeechRecognitionMenuEditReq struct {
 type SpeechRecognitionMenuRemoveReq struct {
 	MenuId int `description:"目录ID"`
 }
+
+// SpeechRecognitionMenuMoveReq 移动目录请求体
+type SpeechRecognitionMenuMoveReq struct {
+	MenuId       int `description:"目录ID"`
+	ParentMenuId int `description:"父级目录ID"`
+	PrevMenuId   int `description:"上一个兄弟节点目录ID"`
+	NextMenuId   int `description:"下一个兄弟节点目录ID"`
+	SpeechId     int `description:"语音识别ID, 大于0则表示移动语音识别"`
+	PrevSpeechId int `description:"上一个语音识别ID"`
+	NextSpeechId int `description:"下一个语音识别ID"`
+}

+ 5 - 3
models/speech_recognition/speech_recognition_tag.go

@@ -11,9 +11,9 @@ import (
 // SpeechRecognitionTag 语音识别-标签表
 type SpeechRecognitionTag struct {
 	SpeechRecognitionTagId int       `orm:"column(speech_recognition_tag_id);pk"`
+	UniqueCode             string    `description:"唯一编码"`
 	TagName                string    `description:"标签名称"`
 	MenuId                 int       `description:"目录ID"`
-	MenuPath               string    `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
 	Sort                   int       `description:"排序"`
 	CreateTime             time.Time `description:"创建时间"`
 	ModifyTime             time.Time `description:"修改时间"`
@@ -21,6 +21,7 @@ type SpeechRecognitionTag struct {
 
 var SpeechRecognitionTagCols = struct {
 	SpeechRecognitionTagId string
+	UniqueCode             string
 	TagName                string
 	MenuId                 string
 	MenuPath               string
@@ -29,6 +30,7 @@ var SpeechRecognitionTagCols = struct {
 	ModifyTime             string
 }{
 	SpeechRecognitionTagId: "speech_recognition_tag_id",
+	UniqueCode:             "unique_code",
 	TagName:                "tag_name",
 	MenuId:                 "menu_id",
 	MenuPath:               "menu_path",
@@ -144,10 +146,10 @@ func (m *SpeechRecognitionTag) GetPageItemsByCondition(condition string, pars []
 
 // SpeechRecognitionTagItem 语音识别标签
 type SpeechRecognitionTagItem struct {
+	UniqueCode string `description:"唯一编码"`
 	TagId      int    `description:"标签ID"`
 	TagName    string `description:"标签名称"`
 	MenuId     int    `description:"目录ID"`
-	MenuPath   string `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
 	Sort       int    `description:"排序"`
 	CreateTime string `description:"创建时间"`
 }
@@ -157,10 +159,10 @@ func FormatSpeechRecognitionTag2Item(origin *SpeechRecognitionTag) (item *Speech
 		return
 	}
 	item = new(SpeechRecognitionTagItem)
+	item.UniqueCode = origin.UniqueCode
 	item.TagId = origin.SpeechRecognitionTagId
 	item.TagName = origin.TagName
 	item.MenuId = origin.MenuId
-	item.MenuPath = origin.MenuPath
 	item.Sort = origin.Sort
 	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
 	return

+ 19 - 0
models/speech_recognition/speech_recognition_tag_menu.go

@@ -16,28 +16,34 @@ const (
 // SpeechRecognitionTagMenu 标签目录表
 type SpeechRecognitionTagMenu struct {
 	SpeechRecognitionTagMenuId int       `orm:"column(speech_recognition_tag_menu_id);pk"`
+	UniqueCode                 string    `description:"唯一编码"`
 	MenuName                   string    `description:"目录名称"`
 	ParentId                   int       `description:"父级ID"`
 	Level                      int       `description:"目录层级"`
 	Sort                       int       `description:"排序"`
+	RootId                     int       `description:"顶级ID"`
 	CreateTime                 time.Time `description:"创建时间"`
 	ModifyTime                 time.Time `description:"修改时间"`
 }
 
 var SpeechRecognitionTagMenuCols = struct {
 	SpeechRecognitionTagMenuId string
+	UniqueCode                 string
 	MenuName                   string
 	ParentId                   string
 	Level                      string
 	Sort                       string
+	RootId                     string
 	CreateTime                 string
 	ModifyTime                 string
 }{
 	SpeechRecognitionTagMenuId: "speech_recognition_tag_menu_id",
+	UniqueCode:                 "unique_code",
 	MenuName:                   "menu_name",
 	ParentId:                   "parent_id",
 	Level:                      "level",
 	Sort:                       "sort",
+	RootId:                     "root_id",
 	CreateTime:                 "create_time",
 	ModifyTime:                 "modify_time",
 }
@@ -160,12 +166,14 @@ type SpeechRecognitionTagMenuItem struct {
 
 // SpeechRecognitionTagMenuNodeItem 标签目录树节点
 type SpeechRecognitionTagMenuNodeItem struct {
+	UniqueCode string                              `description:"唯一编码"`
 	NodeType   int                                 `description:"节点类型:0-目录;1-标签"`
 	MenuId     int                                 `description:"目录ID"`
 	MenuName   string                              `description:"目录名称"`
 	TagId      int                                 `description:"标签ID"`
 	TagName    string                              `description:"标签名称"`
 	ParentId   int                                 `description:"父级ID"`
+	Level      int                                 `description:"目录层级"`
 	Sort       int                                 `description:"排序"`
 	CreateTime string                              `description:"创建时间"`
 	Children   []*SpeechRecognitionTagMenuNodeItem `description:"子节点"`
@@ -187,3 +195,14 @@ type SpeechRecognitionTagMenuEditReq struct {
 type SpeechRecognitionTagMenuRemoveReq struct {
 	MenuId int `description:"目录ID"`
 }
+
+// SpeechRecognitionTagMenuMoveReq 移动目录请求体
+type SpeechRecognitionTagMenuMoveReq struct {
+	MenuId       int `description:"目录ID"`
+	ParentMenuId int `description:"父级目录ID"`
+	PrevMenuId   int `description:"上一个兄弟节点目录ID"`
+	NextMenuId   int `description:"下一个兄弟节点目录ID"`
+	TagId        int `description:"标签ID, 大于0则表示移动标签"`
+	PrevTagId    int `description:"上一个标签ID"`
+	NextTagId    int `description:"下一个标签ID"`
+}

+ 18 - 18
routers/commentsRouter.go

@@ -6082,15 +6082,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionController"],
-        beego.ControllerComments{
-            Method: "Move",
-            Router: `/move`,
-            AllowHTTPMethods: []string{"post"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionController"],
         beego.ControllerComments{
             Method: "Remove",
@@ -6172,6 +6163,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionMenuController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionMenuController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagController"],
         beego.ControllerComments{
             Method: "Add",
@@ -6199,15 +6199,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagController"],
-        beego.ControllerComments{
-            Method: "Move",
-            Router: `/tag/move`,
-            AllowHTTPMethods: []string{"post"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagController"],
         beego.ControllerComments{
             Method: "Remove",
@@ -6262,6 +6253,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagMenuController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagMenuController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/tag/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/trade_analysis:TradeAnalysisController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/trade_analysis:TradeAnalysisController"],
         beego.ControllerComments{
             Method: "GetClassifyName",

+ 35 - 4
services/speech_recognition.go

@@ -10,12 +10,19 @@ import (
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
 	"fmt"
+	"github.com/jung-kurt/gofpdf"
 	"os"
 	"strconv"
 	"sync"
 	"time"
 )
 
+const (
+	SpeechRecognitionExportTypeTxt  = 1
+	SpeechRecognitionExportTypeDocx = 2
+	SpeechRecognitionExportTypePdf  = 3
+)
+
 // GetSpeechRecognitionTagMenuTreeRecursive 递归获取标签目录树
 func GetSpeechRecognitionTagMenuTreeRecursive(list []*speech_recognition.SpeechRecognitionTagMenu, parentId int) []*speech_recognition.SpeechRecognitionTagMenuItem {
 	res := make([]*speech_recognition.SpeechRecognitionTagMenuItem, 0)
@@ -130,23 +137,28 @@ func SpeechRecognitionContentExport(exportType int, exportTimestamp bool, fileNa
 	// 整理内容
 	exportText := ""
 	exportArr := make([]string, 0)
+	exportPdfArr := make([]string, 0)
 	for _, v := range contents {
 		if v.Content == "" {
 			continue
 		}
 		sec := ""
+		secPdf := ""
 		if exportTimestamp {
 			// 毫秒转时间格式
 			sec = fmt.Sprintf("%s\n%s\n\n", utils.MillisecondsToHHMMSS(v.StartMs), v.Content)
+			secPdf = fmt.Sprintf("%s %s", utils.MillisecondsToHHMMSS(v.StartMs), v.Content)
 		} else {
 			sec = fmt.Sprintf("%s\n\n", v.Content)
+			secPdf = v.Content
 		}
 		exportText += sec
 		exportArr = append(exportArr, sec)
+		exportPdfArr = append(exportPdfArr, secPdf)
 	}
 
 	// 导出doc
-	if exportType == 2 {
+	if exportType == SpeechRecognitionExportTypeDocx {
 		doc := document.New()
 		for _, v := range exportArr {
 			p := doc.AddParagraph()
@@ -162,8 +174,7 @@ func SpeechRecognitionContentExport(exportType int, exportTimestamp bool, fileNa
 		}
 
 		filePath := fmt.Sprintf("%s.docx", fileName)
-		e := doc.SaveToFile(filePath)
-		if e != nil {
+		if e := doc.SaveToFile(filePath); e != nil {
 			err = fmt.Errorf("生成docx失败, Err: %s", e.Error())
 			return
 		}
@@ -172,7 +183,27 @@ func SpeechRecognitionContentExport(exportType int, exportTimestamp bool, fileNa
 	}
 
 	// 导出pdf
-	if exportType == 3 {
+	if exportType == SpeechRecognitionExportTypePdf {
+		pdf := gofpdf.New("P", "mm", "A4", "")
+		pdf.AddPage()
+		pdf.AddUTF8Font("SimHei", "", "static/SimHei.ttf") // 此处字体文件只能用本地的
+		pdf.SetFont("SimHei", "", 14)
+
+		// 计算可用内容区域宽度
+		w, _ := pdf.GetPageSize()
+		marginLeft := 10.0
+		marginRight := 10.0
+		availableWidth := w - marginLeft - marginRight
+		for _, v := range exportPdfArr {
+			pdf.MultiCell(availableWidth, 10, v, "", "L", false)
+			pdf.MultiCell(availableWidth, 5, "", "", "L", false) // 单纯的换行
+		}
+		filePath := fmt.Sprintf("%s.pdf", fileName)
+		if e := pdf.OutputFileAndClose(filePath); e != nil {
+			err = fmt.Errorf("生成pdf失败, Err: %s", e.Error())
+			return
+		}
+		result = filePath
 		return
 	}