Browse Source

语音识别列表、详情等接口

hsun 1 year ago
parent
commit
4ee71a7ad2

+ 212 - 66
controllers/speech_recognition/speech_recognition.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
 )
@@ -101,6 +102,8 @@ func (this *SpeechRecognitionCommonController) RecTaskCallback() {
 	}
 	contents := make([]*speech_recognition.SpeechRecognitionContent, 0)
 	sorts := 0 // API返回的结果本身是已排过序的
+	var abstract string
+	var abstractLimit int
 	for _, v := range sentences {
 		sorts += 1
 		t := new(speech_recognition.SpeechRecognitionContent)
@@ -112,11 +115,17 @@ func (this *SpeechRecognitionCommonController) RecTaskCallback() {
 		t.CreateTime = nowTime
 		t.ModifyTime = nowTime
 		contents = append(contents, t)
+		// 取前几段作为摘要保存
+		if abstractLimit < 5 {
+			abstractLimit += 1
+			abstract += v.FinalSentence
+		}
 	}
 
+	speechItem.Abstract = abstract
 	speechItem.State = speech_recognition.SpeechRecognitionStateSuccess
 	speechItem.ModifyTime = nowTime
-	speechCols := []string{speech_recognition.SpeechRecognitionCols.State, speech_recognition.SpeechRecognitionCols.ModifyTime}
+	speechCols := []string{speech_recognition.SpeechRecognitionCols.Abstract, speech_recognition.SpeechRecognitionCols.State, speech_recognition.SpeechRecognitionCols.ModifyTime}
 
 	apiLog.RequestCode = code
 	apiLog.RequestResult = detail
@@ -230,7 +239,7 @@ func (this *SpeechRecognitionController) ConvertList() {
 	// 仅取待转换和转换失败的
 	states := []int{speech_recognition.SpeechRecognitionStateWait, speech_recognition.SpeechRecognitionStateFail}
 	speechOb := new(speech_recognition.SpeechRecognition)
-	cond := fmt.Sprintf(` %s = ? AND %s IN (%s)`, speech_recognition.SpeechRecognitionCols.SysUserId, speech_recognition.SpeechRecognitionCols.State, utils.GetOrmInReplace(len(states)))
+	cond := fmt.Sprintf(` AND %s = ? AND %s IN (%s)`, speech_recognition.SpeechRecognitionCols.SysUserId, speech_recognition.SpeechRecognitionCols.State, utils.GetOrmInReplace(len(states)))
 	pars := make([]interface{}, 0)
 	pars = append(pars, sysUser.AdminId, states)
 	list, e := speechOb.GetItemsByCondition(cond, pars, []string{}, "")
@@ -250,7 +259,7 @@ func (this *SpeechRecognitionController) ConvertList() {
 	br.Msg = "获取成功"
 }
 
-// TODO:Save
+// Save
 // @Title 保存内容
 // @Description 保存内容
 // @Param	request	body speech_recognition.SpeechRecognitionSaveReq true "type json string"
@@ -278,6 +287,37 @@ func (this *SpeechRecognitionController) Save() {
 		br.ErrMsg = "参数解析失败, Err: " + e.Error()
 		return
 	}
+	if req.SpeechRecognitionId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, SpeechRecognitionId: %d", req.SpeechRecognitionId)
+		return
+	}
+	if len(req.Contents) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	speechOb := new(speech_recognition.SpeechRecognition)
+	_, e := speechOb.GetItemById(req.SpeechRecognitionId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "转写文件不存在,请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取转写文件失败, Err: " + e.Error()
+		return
+	}
+
+	// 批量修改内容
+	contentOb := new(speech_recognition.SpeechRecognitionContent)
+	if e = contentOb.BatchUpdateContents(req.Contents); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "批量修改内容失败, Err: " + e.Error()
+		return
+	}
 
 	br.Ret = 200
 	br.Success = true
@@ -397,7 +437,7 @@ func (this *SpeechRecognitionController) Rename() {
 
 	// 重名校验
 	{
-		cond := fmt.Sprintf(` %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionCols.FileName, speech_recognition.SpeechRecognitionCols.SpeechRecognitionId)
+		cond := fmt.Sprintf(` AND %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionCols.FileName, speech_recognition.SpeechRecognitionCols.SpeechRecognitionId)
 		pars := make([]interface{}, 0)
 		pars = append(pars, req.FileName, req.SpeechRecognitionId)
 		exists, e := speechOb.GetItemByCondition(cond, pars, "")
@@ -407,7 +447,7 @@ func (this *SpeechRecognitionController) Rename() {
 			return
 		}
 		if exists != nil && exists.SpeechRecognitionId > 0 {
-			br.Msg = "分类名称已存在,请重新输入"
+			br.Msg = "文件名称已存在,请重新输入"
 			return
 		}
 	}
@@ -569,11 +609,15 @@ func (this *SpeechRecognitionController) SaveTag() {
 	br.Msg = "操作成功"
 }
 
-// TODO:List
+// List
 // @Title 语音识别列表
 // @Description 语音识别列表
-// @Param   ParentId  query  int  false  "父级ID"
-// @Success 200 {object} speech_recognition.SpeechRecognitionMenuNodeItem
+// @Param   FileName  query  string  false  "文件名称"
+// @Param   StartTime  query  string  false  "开始时间"
+// @Param   EndTime  query  string  false  "结束时间"
+// @Param   CreateUserId  query  int  false  "创建人ID"
+// @Param   TagId  query  int  false  "标签ID"
+// @Success 200 {object} speech_recognition.SpeechRecognitionListResp
 // @router /list [get]
 func (this *SpeechRecognitionController) List() {
 	br := new(models.BaseResponse).Init()
@@ -591,19 +635,131 @@ func (this *SpeechRecognitionController) List() {
 		br.Ret = 408
 		return
 	}
+	params := new(speech_recognition.SpeechRecognitionListReq)
+	if e := this.ParseForm(params); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	params.FileName = strings.TrimSpace(params.FileName)
 
-	// TODO:标签列表
+	dataResp := new(speech_recognition.SpeechRecognitionListResp)
+	cond := ``
+	pars := make([]interface{}, 0)
 
+	// 筛选项
+	{
+		if params.FileName != "" {
+			cond += fmt.Sprintf(` AND %s LIKE ?`, speech_recognition.SpeechRecognitionCols.FileName)
+			pars = append(pars, fmt.Sprint("%", params.FileName, "%"))
+		}
+		if params.StartTime != "" && params.EndTime != "" {
+			_, e := time.Parse(utils.FormatDate, params.StartTime)
+			if e != nil {
+				br.Msg = "开始时间格式有误"
+				return
+			}
+			_, e = time.Parse(utils.FormatDate, params.EndTime)
+			if e != nil {
+				br.Msg = "结束时间格式有误"
+				return
+			}
+			st := fmt.Sprintf("%s 00:00:00", params.StartTime)
+			ed := fmt.Sprintf("%s 23:59:59", params.EndTime)
+			cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, speech_recognition.SpeechRecognitionCols.CreateTime)
+			pars = append(pars, st, ed)
+		}
+		if params.CreateUserId > 0 {
+			cond += fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionCols.SysUserId)
+			pars = append(pars, params.CreateUserId)
+		}
+
+		// 标签筛选
+		if params.TagId > 0 {
+			mappingOb := new(speech_recognition.SpeechRecognitionTagMapping)
+			tagSpeechIds, e := mappingOb.GetSpeechIdsByTagId(params.TagId)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取标签关联语音识别失败, Err: " + e.Error()
+				return
+			}
+			if len(tagSpeechIds) == 0 {
+				br.Data = dataResp
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				return
+			}
+			cond += fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionCols.SpeechRecognitionId, utils.GetOrmInReplace(len(tagSpeechIds)))
+			pars = append(pars, tagSpeechIds)
+		}
+	}
+
+	// 分页列表
+	speechOb := new(speech_recognition.SpeechRecognition)
+	total, e := speechOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取语音识别列表总数失败, Err: " + e.Error()
+		return
+	}
+	var startSize int
+	if params.PageSize <= 0 {
+		params.PageSize = utils.PageSize20
+	}
+	if params.CurrentIndex <= 0 {
+		params.CurrentIndex = 1
+	}
+	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
+	list, e := speechOb.GetPageItemsByCondition(cond, pars, []string{}, "", startSize, params.PageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取语音识别列表失败, Err: " + e.Error()
+		return
+	}
+
+	// 获取标签
+	speechIds := make([]int, 0)
+	for _, v := range list {
+		speechIds = append(speechIds, v.SpeechRecognitionId)
+	}
+	mappingTags, e := speech_recognition.GetSpeechRecognitionTagsBySpeechIds(speechIds)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取语音识别列表标签失败, Err: " + e.Error()
+		return
+	}
+	speechDetailTags := make(map[int][]*speech_recognition.SpeechRecognitionDetailTag)
+	for _, v := range mappingTags {
+		if speechDetailTags[v.SpeechRecognitionId] == nil {
+			speechDetailTags[v.SpeechRecognitionId] = make([]*speech_recognition.SpeechRecognitionDetailTag, 0)
+		}
+		speechDetailTags[v.SpeechRecognitionId] = append(speechDetailTags[v.SpeechRecognitionId], &speech_recognition.SpeechRecognitionDetailTag{
+			TagId:   v.TagId,
+			TagName: v.TagName,
+		})
+	}
+
+	respList := make([]*speech_recognition.SpeechRecognitionDetailItem, 0)
+	for _, v := range list {
+		t := speech_recognition.FormatSpeechRecognition2DetailItem(v, make([]*speech_recognition.SpeechRecognitionContentItem, 0), speechDetailTags[v.SpeechRecognitionId])
+		respList = append(respList, t)
+	}
+
+	page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
+	dataResp.Paging = page
+	dataResp.List = respList
+	br.Data = dataResp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
 }
 
-// TODO:Detail
+// Detail
 // @Title 语音识别详情
 // @Description 语音识别详情
 // @Param   SpeechRecognitionId  query  int  true  "语音识别ID"
-// @Success 200 {object} speech_recognition.SpeechRecognitionMenuNodeItem
+// @Success 200 {object} speech_recognition.SpeechRecognitionDetailItem
 // @router /detail [get]
 func (this *SpeechRecognitionController) Detail() {
 	br := new(models.BaseResponse).Init()
@@ -621,9 +777,53 @@ func (this *SpeechRecognitionController) Detail() {
 		br.Ret = 408
 		return
 	}
+	speechId, _ := this.GetInt("SpeechRecognitionId")
+	if speechId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, SpeechRecognitionId: %d", speechId)
+		return
+	}
 
-	// TODO:标签详情
+	speechOb := new(speech_recognition.SpeechRecognition)
+	speechItem, e := speechOb.GetItemById(speechId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "转写文件不存在,请刷新页面"
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取转写文件失败, Err: " + e.Error()
+		return
+	}
+
+	// 获取内容
+	contents := make([]*speech_recognition.SpeechRecognitionContentItem, 0)
+	{
+		contentOb := new(speech_recognition.SpeechRecognitionContent)
+		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionContentCols.SpeechRecognitionId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, speechId)
+		list, e := contentOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionContentCols.Sort))
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取语音识别内容失败, Err: " + e.Error()
+			return
+		}
+		for _, v := range list {
+			contents = append(contents, speech_recognition.FormatSpeechRecognitionContent2Item(v))
+		}
+	}
 
+	// 获取标签
+	tags, e := speech_recognition.GetSpeechRecognitionTagBySpeechId(speechId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取语音识别标签失败, Err: " + e.Error()
+		return
+	}
+	detail := speech_recognition.FormatSpeechRecognition2DetailItem(speechItem, contents, tags)
+
+	br.Data = detail
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -658,57 +858,3 @@ func (this *SpeechRecognitionController) Move() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
-
-//// TestConvert
-//// @Title 转写测试
-//// @Description 转写测试
-//// @Param	request	body speech_recognition.SpeechRecognitionSaveReq true "type json string"
-//// @Success 200 string "操作成功"
-//// @router /test_convert [post]
-//func (this *SpeechRecognitionCommonController) TestConvert() {
-//	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.SpeechRecognitionSaveReq
-//	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
-//		br.Msg = "参数有误"
-//		br.ErrMsg = "参数解析失败, Err: " + e.Error()
-//		return
-//	}
-//
-//	conf, e := models.GetBusinessConf()
-//	if e != nil {
-//		br.Msg = "操作失败"
-//		br.ErrMsg = "获取配置失败, Err: " + e.Error()
-//		return
-//	}
-//
-//	var taskReq services.TencentRecTaskReq
-//	taskReq.FileUrl = req.FileName
-//	taskReq.SecretId = conf[models.BusinessConfTencentApiSecretId]
-//	taskReq.SecretKey = conf[models.BusinessConfTencentApiSecretKey]
-//	taskReq.CallbackUrl = conf[models.BusinessConfTencentApiRecTaskCallbackUrl]
-//	taskId, e := services.TencentCreateRecTask(taskReq)
-//	if e != nil {
-//		br.Msg = "操作失败"
-//		br.ErrMsg = fmt.Sprintf("TencentCreateRecTask err: %s", e.Error())
-//		return
-//	}
-//
-//	br.Data = taskId
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "操作成功"
-//}

+ 9 - 9
controllers/speech_recognition/speech_recognition_tag.go

@@ -56,7 +56,7 @@ func (this *SpeechRecognitionTagController) Add() {
 	// 校验标签是否有重名
 	tagOb := new(speech_recognition.SpeechRecognitionTag)
 	{
-		cond := fmt.Sprintf(` %s = ?`, speech_recognition.SpeechRecognitionTagCols.TagName)
+		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagCols.TagName)
 		pars := make([]interface{}, 0)
 		pars = append(pars, req.TagName)
 		exists, e := tagOb.GetItemByCondition(cond, pars, "")
@@ -127,7 +127,7 @@ func (this *SpeechRecognitionTagController) Edit() {
 	}
 
 	tagOb := new(speech_recognition.SpeechRecognitionTag)
-	_, e := tagOb.GetItemById(req.TagId)
+	tagItem, e := tagOb.GetItemById(req.TagId)
 	if e != nil {
 		if e.Error() == utils.ErrNoRow() {
 			br.Msg = "标签不存在,请刷新页面"
@@ -140,7 +140,7 @@ func (this *SpeechRecognitionTagController) Edit() {
 
 	// 校验标签是否有重名
 	{
-		cond := fmt.Sprintf(` %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionTagCols.TagName, speech_recognition.SpeechRecognitionTagCols.SpeechRecognitionTagId)
+		cond := fmt.Sprintf(` AND %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionTagCols.TagName, speech_recognition.SpeechRecognitionTagCols.SpeechRecognitionTagId)
 		pars := make([]interface{}, 0)
 		pars = append(pars, req.TagName, req.TagId)
 		exists, e := tagOb.GetItemByCondition(cond, pars, "")
@@ -155,10 +155,10 @@ func (this *SpeechRecognitionTagController) Edit() {
 		}
 	}
 
-	tagOb.TagName = req.TagName
-	tagOb.ModifyTime = time.Now().Local()
+	tagItem.TagName = req.TagName
+	tagItem.ModifyTime = time.Now().Local()
 	updateCols := []string{speech_recognition.SpeechRecognitionTagCols.TagName, speech_recognition.SpeechRecognitionTagCols.ModifyTime}
-	if e = tagOb.Update(updateCols); e != nil {
+	if e = tagItem.Update(updateCols); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "更新标签失败, Err: " + e.Error()
 		return
@@ -220,7 +220,7 @@ func (this *SpeechRecognitionTagController) Remove() {
 	// 校验标签是否关联转写文件
 	{
 		mappingOb := new(speech_recognition.SpeechRecognitionTagMapping)
-		cond := fmt.Sprintf(` %s = ?`, speech_recognition.SpeechRecognitionTagMappingCols.TagId)
+		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagMappingCols.TagId)
 		pars := make([]interface{}, 0)
 		pars = append(pars, req.TagId)
 		count, e := mappingOb.GetCountByCondition(cond, pars)
@@ -276,8 +276,8 @@ func (this *SpeechRecognitionTagController) List() {
 	cond := ``
 	pars := make([]interface{}, 0)
 	if keywords != "" {
-		kw := fmt.Sprint("%", keywords, "%s")
-		cond = fmt.Sprintf(` %s LIKE ?`, speech_recognition.SpeechRecognitionTagCols.TagName)
+		kw := fmt.Sprint("%", keywords, "%")
+		cond = fmt.Sprintf(` AND %s LIKE ?`, speech_recognition.SpeechRecognitionTagCols.TagName)
 		pars = append(pars, kw)
 	}
 	list, e := tagOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s DESC", speech_recognition.SpeechRecognitionTagCols.CreateTime))

+ 1 - 1
controllers/speech_recognition/speech_recognition_tag_menu.go

@@ -415,7 +415,7 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 // @Title 目录列表
 // @Description 目录列表
 // @Success 200 {object} speech_recognition.SpeechRecognitionTagMenuItem
-// @router /tag/menu/tree [get]
+// @router /tag/menu/list [get]
 func (this *SpeechRecognitionTagMenuController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {

+ 111 - 1
models/speech_recognition/speech_recognition.go

@@ -4,6 +4,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
 )
@@ -29,6 +30,8 @@ type SpeechRecognition struct {
 	Abstract            string    `description:"摘要,取前几段内容"`
 	Sort                int       `description:"目录下的排序"`
 	FileState           int       `description:"文件(非语音识别)删除状态:0-正常;1-删除(该字段作为软删标识)"`
+	FileSecond          int       `description:"文件时长(秒)"`
+	FileSize            int       `description:"文件大小(byte)"`
 	ConvertRemark       string    `description:"转写备注-失败原因"`
 	CreateTime          time.Time `description:"创建时间"`
 	ModifyTime          time.Time `description:"修改时间"`
@@ -46,6 +49,8 @@ var SpeechRecognitionCols = struct {
 	Abstract            string
 	Sort                string
 	FileState           string
+	FileSecond          string
+	FileSize            string
 	ConvertRemark       string
 	CreateTime          string
 	ModifyTime          string
@@ -61,6 +66,8 @@ var SpeechRecognitionCols = struct {
 	Abstract:            "abstract",
 	Sort:                "sort",
 	FileState:           "file_state",
+	FileSecond:          "file_second",
+	FileSize:            "file_size",
 	ConvertRemark:       "convert_remark",
 	CreateTime:          "create_time",
 	ModifyTime:          "modify_time",
@@ -214,7 +221,14 @@ func FormatSpeechRecognition2Item(origin *SpeechRecognition) (item *SpeechRecogn
 
 // SpeechRecognitionSaveReq 保存请求体
 type SpeechRecognitionSaveReq struct {
-	FileName string
+	SpeechRecognitionId int                               `description:"语音识别ID"`
+	Contents            []SpeechRecognitionSaveContentReq `description:"保存内容"`
+}
+
+// SpeechRecognitionSaveContentReq 保存内容
+type SpeechRecognitionSaveContentReq struct {
+	SpeechRecognitionContentId int    `description:"语音识别内容ID"`
+	Content                    string `description:"段落内容"`
 }
 
 // SpeechRecognitionRenameReq 重命名
@@ -321,3 +335,99 @@ func CreateContentAndUpdateSpeechAndApiLog(contents []*SpeechRecognitionContent,
 	}
 	return
 }
+
+// SpeechRecognitionDetailItem 语音识别详情信息
+type SpeechRecognitionDetailItem struct {
+	SpeechRecognitionId int
+	FileName            string                          `description:"文件名称"`
+	ResourceUrl         string                          `description:"文件路径"`
+	MenuId              int                             `description:"目录ID"`
+	SysUserId           int                             `description:"创建人ID"`
+	SysUserName         string                          `description:"创建人姓名"`
+	Abstract            string                          `description:"摘要,取前几段内容"`
+	Sort                int                             `description:"目录下的排序"`
+	FileSecond          int                             `description:"文件时长(秒)"`
+	FileSize            int                             `description:"文件大小(byte)"`
+	CreateTime          string                          `description:"创建时间"`
+	ModifyTime          string                          `description:"修改时间"`
+	Contents            []*SpeechRecognitionContentItem `description:"语音识别内容"`
+	Tags                []*SpeechRecognitionDetailTag   `description:"标签"`
+}
+
+func FormatSpeechRecognition2DetailItem(origin *SpeechRecognition, contents []*SpeechRecognitionContentItem, tags []*SpeechRecognitionDetailTag) (item *SpeechRecognitionDetailItem) {
+	if origin == nil {
+		return
+	}
+	item = new(SpeechRecognitionDetailItem)
+	item.SpeechRecognitionId = origin.SpeechRecognitionId
+	item.FileName = origin.FileName
+	item.ResourceUrl = origin.ResourceUrl
+	if origin.FileState == SpeechRecognitionFileRemoveFlag {
+		item.ResourceUrl = ""
+	}
+	item.MenuId = origin.MenuId
+	item.SysUserId = origin.SysUserId
+	item.SysUserName = origin.SysUserName
+	item.Abstract = origin.Abstract
+	item.Sort = origin.Sort
+	item.FileSecond = origin.FileSecond
+	item.FileSize = origin.FileSize
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	item.Contents = contents
+	item.Tags = tags
+	return
+}
+
+// SpeechRecognitionDetailTag 语音识别详情标签
+type SpeechRecognitionDetailTag struct {
+	TagId   int    `description:"标签ID"`
+	TagName string `description:"标签名称"`
+}
+
+// GetSpeechRecognitionTagBySpeechId 获取语音识别标签
+func GetSpeechRecognitionTagBySpeechId(speechId int) (items []*SpeechRecognitionDetailTag, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.speech_recognition_tag_id AS tag_id, a.tag_name FROM speech_recognition_tag AS a
+		JOIN speech_recognition_tag_mapping AS b ON a.speech_recognition_tag_id = b.tag_id
+		WHERE b.speech_recognition_id = ?`
+	_, err = o.Raw(sql, speechId).QueryRows(&items)
+	return
+}
+
+// SpeechRecognitionMappingTags 语音识别标签
+type SpeechRecognitionMappingTags struct {
+	SpeechRecognitionId int    `description:"语音识别ID"`
+	TagId               int    `description:"标签ID"`
+	TagName             string `description:"标签名称"`
+}
+
+// GetSpeechRecognitionTagsBySpeechIds 根据语音识别IDs获取标签
+func GetSpeechRecognitionTagsBySpeechIds(speechIds []int) (items []*SpeechRecognitionMappingTags, err error) {
+	if len(speechIds) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT a.speech_recognition_id, a.tag_id, b.tag_name FROM speech_recognition_tag_mapping AS a
+		JOIN speech_recognition_tag AS b ON a.tag_id = b.speech_recognition_tag_id
+		WHERE a.speech_recognition_id IN (%s)`, utils.GetOrmInReplace(len(speechIds)))
+	_, err = o.Raw(sql, speechIds).QueryRows(&items)
+	return
+}
+
+// SpeechRecognitionListReq 语音识别列表请求体
+type SpeechRecognitionListReq struct {
+	PageSize     int    `form:"PageSize"`
+	CurrentIndex int    `form:"CurrentIndex"`
+	FileName     string `form:"FileName" description:"文件名称"`
+	StartTime    string `form:"StartTime" description:"开始时间"`
+	EndTime      string `form:"EndTime" description:"结束时间"`
+	CreateUserId int    `form:"CreateUserId" description:"创建人ID"`
+	TagId        int    `form:"TagId" description:"标签ID"`
+}
+
+// SpeechRecognitionListResp 语音识别列表响应体
+type SpeechRecognitionListResp struct {
+	List   []*SpeechRecognitionDetailItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}

+ 50 - 0
models/speech_recognition/speech_recognition_content.go

@@ -147,3 +147,53 @@ func (m *SpeechRecognitionContent) GetPageItemsByCondition(condition string, par
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
+
+type SpeechRecognitionContentItem struct {
+	SpeechRecognitionContentId int
+	SpeechRecognitionId        int    `description:"语音识别ID"`
+	Sort                       int    `description:"段落排序"`
+	Content                    string `description:"段落内容"`
+	StartMs                    int    `description:"单句开始时间(毫秒)"`
+	EndMs                      int    `description:"单句结束时间(毫秒)"`
+	CreateTime                 string `description:"创建时间"`
+	ModifyTime                 string `description:"修改时间"`
+}
+
+func FormatSpeechRecognitionContent2Item(origin *SpeechRecognitionContent) (item *SpeechRecognitionContentItem) {
+	if origin == nil {
+		return
+	}
+	item = new(SpeechRecognitionContentItem)
+	item.SpeechRecognitionContentId = origin.SpeechRecognitionContentId
+	item.SpeechRecognitionId = origin.SpeechRecognitionId
+	item.Sort = origin.Sort
+	item.Content = origin.Content
+	item.StartMs = origin.StartMs
+	item.EndMs = origin.EndMs
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+// BatchUpdateContents 批量更新语音识别内容
+func (m *SpeechRecognitionContent) BatchUpdateContents(contents []SpeechRecognitionSaveContentReq) (err error) {
+	if len(contents) == 0 {
+		return
+	}
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ?, %s = 1, %s = NOW() WHERE %s = ?`, m.TableName(), SpeechRecognitionContentCols.Content, SpeechRecognitionContentCols.IsUpdate, SpeechRecognitionContentCols.ModifyTime, SpeechRecognitionContentCols.SpeechRecognitionContentId)
+	p, err := o.Raw(sql).Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close()
+	}()
+	for _, v := range contents {
+		_, err = p.Exec(v.Content, v.SpeechRecognitionContentId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 2 - 2
models/speech_recognition/speech_recognition_tag.go

@@ -13,7 +13,7 @@ type SpeechRecognitionTag struct {
 	SpeechRecognitionTagId int       `orm:"column(speech_recognition_tag_id);pk"`
 	TagName                string    `description:"标签名称"`
 	MenuId                 int       `description:"目录ID"`
-	MenuPath               int       `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
+	MenuPath               string    `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
 	Sort                   int       `description:"排序"`
 	CreateTime             time.Time `description:"创建时间"`
 	ModifyTime             time.Time `description:"修改时间"`
@@ -147,7 +147,7 @@ type SpeechRecognitionTagItem struct {
 	TagId      int    `description:"标签ID"`
 	TagName    string `description:"标签名称"`
 	MenuId     int    `description:"目录ID"`
-	MenuPath   int    `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
+	MenuPath   string `description:"所属目录位置,例:/一级目录ID/二级目录ID"`
 	Sort       int    `description:"排序"`
 	CreateTime string `description:"创建时间"`
 }

+ 7 - 0
models/speech_recognition/speech_recognition_tag_mapping.go

@@ -136,3 +136,10 @@ func (m *SpeechRecognitionTagMapping) ClearMappingBySpeechId(speechId int) (err
 	_, err = o.Raw(sql, speechId).Exec()
 	return
 }
+
+func (m *SpeechRecognitionTagMapping) GetSpeechIdsByTagId(tagId int) (speechIds []int, err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE %s = ? GROUP BY %s`, SpeechRecognitionTagMappingCols.SpeechRecognitionId, m.TableName(), SpeechRecognitionTagMappingCols.TagId, SpeechRecognitionTagMappingCols.SpeechRecognitionId)
+	_, err = o.Raw(sql, tagId).QueryRows(&speechIds)
+	return
+}

+ 7 - 7
routers/commentsRouter.go

@@ -6228,25 +6228,25 @@ func init() {
 
     beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagMenuController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/speech_recognition:SpeechRecognitionTagMenuController"],
         beego.ControllerComments{
-            Method: "Remove",
-            Router: `/tag/menu/remove`,
-            AllowHTTPMethods: []string{"post"},
+            Method: "List",
+            Router: `/tag/menu/list`,
+            AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),
             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: "Tree",
-            Router: `/tag/menu/tree`,
-            AllowHTTPMethods: []string{"get"},
+            Method: "Remove",
+            Router: `/tag/menu/remove`,
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             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: "List",
+            Method: "Tree",
             Router: `/tag/menu/tree`,
             AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),