Browse Source

语音识别-删除校验、目录树

hsun 11 months ago
parent
commit
92028bbcfc

+ 167 - 102
controllers/speech_recognition/speech_recognition_menu.go

@@ -242,56 +242,108 @@ func (this *SpeechRecognitionMenuController) Remove() {
 		return
 	}
 
-	// 校验目录下是否有内容
-	{
-		speechOb := new(speech_recognition.SpeechRecognition)
-		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionCols.MenuId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, req.MenuId)
-		count, e := speechOb.GetCountByCondition(cond, pars)
-		if e != nil {
+	// 删除校验
+	checkResult, menuIds, e := services.CheckSpeechRecognitionMenuRemove(menuItem.SpeechRecognitionMenuId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "目录删除校验失败, Err: " + e.Error()
+		return
+	}
+
+	switch checkResult.CheckResult {
+	case services.SpeechMenuCheckRemoveTypePass:
+		// 可删除
+		if e = menuItem.Del(); e != nil {
 			br.Msg = "操作失败"
-			br.ErrMsg = "获取目录下的语音识别数失败, Err: " + e.Error()
+			br.ErrMsg = "删除目录失败, Err: " + e.Error()
 			return
 		}
-		if count > 0 {
-			br.Msg = "该分类关联转写文件,删除失败!"
+	case services.SpeechMenuCheckRemoveTypeRefused:
+		// 不可删除
+		br.Msg = checkResult.Tips
+		return
+	case services.SpeechMenuCheckRemoveTypeWarning:
+		// 删除目录及子目录
+		if e = menuOb.MultiDel(menuIds); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "批量删除目录失败, Err: " + e.Error()
 			return
 		}
+	}
 
-		cond = fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionMenuCols.ParentId)
-		pars = make([]interface{}, 0)
-		pars = append(pars, req.MenuId)
-		count, e = menuOb.GetCountByCondition(cond, pars)
-		if e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = "获取下级目录数失败, Err: " + e.Error()
-			return
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// RemoveCheck
+// @Title 删除校验
+// @Description 删除校验
+// @Param	request	body speech_recognition.SpeechRecognitionMenuRemoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /menu/remove_check [post]
+func (this *SpeechRecognitionMenuController) RemoveCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
 		}
-		if count > 0 {
-			br.Msg = "该分类含下级目录,删除失败!"
+		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.SpeechRecognitionMenuRemoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.MenuId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, MenuId: %d", req.MenuId)
+		return
+	}
+
+	menuOb := new(speech_recognition.SpeechRecognitionMenu)
+	menuItem, e := menuOb.GetItemById(req.MenuId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "操作成功"
 			return
 		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取目录失败, Err: " + e.Error()
+		return
 	}
 
-	if e = menuItem.Del(); e != nil {
+	resp, _, e := services.CheckSpeechRecognitionMenuRemove(menuItem.SpeechRecognitionMenuId)
+	if e != nil {
 		br.Msg = "操作失败"
-		br.ErrMsg = "删除目录失败, Err: " + e.Error()
+		br.ErrMsg = "目录删除校验失败, Err: " + e.Error()
 		return
 	}
 
+	br.Data = resp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
 }
 
-// Tree
-// @Title 目录树
-// @Description 目录树
+// List
+// @Title 目录列表
+// @Description 目录列表
 // @Param   ParentId  query  int  false  "父级ID"
 // @Success 200 {object} speech_recognition.SpeechRecognitionMenuNodeItem
-// @router /menu/tree [get]
-func (this *SpeechRecognitionMenuController) Tree() {
+// @router /menu/list [get]
+func (this *SpeechRecognitionMenuController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -307,14 +359,26 @@ func (this *SpeechRecognitionMenuController) Tree() {
 		br.Ret = 408
 		return
 	}
-	// 前端采用懒加载, 所以只查询目录及当前目录下的语音识别
+	// 前端采用懒加载, 所以只查询子目录和内容
 	parentId, _ := this.GetInt("ParentId")
 
-	// 获取所有目录
+	level := 0
+	menuOb := new(speech_recognition.SpeechRecognitionMenu)
+	if parentId > 0 {
+		parentMenu, e := menuOb.GetItemById(parentId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取父级目录失败, Err: " + e.Error()
+			return
+		}
+		level = parentMenu.Level + 1
+	}
 	menus := make([]*speech_recognition.SpeechRecognitionMenu, 0)
 	{
-		menuOb := new(speech_recognition.SpeechRecognitionMenu)
-		list, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort))
+		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))
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取目录列表失败, Err: " + e.Error()
@@ -323,19 +387,32 @@ 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)
+	speeches := make([]*speech_recognition.SpeechRecognition, 0)
+	{
+		speechOb := new(speech_recognition.SpeechRecognition)
+		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionCols.MenuId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, parentId)
+		list, e := speechOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s DESC", speech_recognition.SpeechRecognitionCols.Sort, speech_recognition.SpeechRecognitionCols.CreateTime))
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取语音识别列表失败, Err: " + e.Error()
+			return
 		}
+		speeches = list
+	}
 
-		if menuChildren[v.ParentId] == nil {
-			menuChildren[v.ParentId] = make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
-		}
-		menuChildren[v.ParentId] = append(menuChildren[v.ParentId], &speech_recognition.SpeechRecognitionMenuNodeItem{
+	resp := make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
+	if len(menus) == 0 && len(speeches) == 0 {
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	for _, v := range menus {
+		resp = append(resp, &speech_recognition.SpeechRecognitionMenuNodeItem{
 			UniqueCode: v.UniqueCode,
 			NodeType:   speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
 			MenuId:     v.SpeechRecognitionMenuId,
@@ -346,76 +423,64 @@ func (this *SpeechRecognitionMenuController) Tree() {
 			CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
 		})
 	}
+	for _, v := range speeches {
+		resp = append(resp, &speech_recognition.SpeechRecognitionMenuNodeItem{
+			UniqueCode:            v.UniqueCode,
+			NodeType:              speech_recognition.SpeechRecognitionMenuNodeTypeSpeech,
+			SpeechRecognitionId:   v.SpeechRecognitionId,
+			SpeechRecognitionName: v.FileName,
+			ParentId:              v.MenuId,
+			Level:                 level,
+			Sort:                  v.Sort,
+			CreateTime:            utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+	sort.Slice(resp, func(i, j int) bool {
+		return resp[i].Sort < resp[j].Sort
+	})
 
-	resp := make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
-	if len(topMenus) == 0 {
-		br.Data = resp
-		br.Ret = 200
-		br.Success = true
-		br.Msg = "获取成功"
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Tree
+// @Title 目录树
+// @Description 目录树
+// @Success 200 {object} speech_recognition.SpeechRecognitionMenuItem
+// @router /menu/tree [get]
+func (this *SpeechRecognitionMenuController) Tree() {
+	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
 	}
 
-	// 目录下的语音识别
-	menuIds := make([]int, 0)
-	for _, m := range topMenus {
-		menuIds = append(menuIds, m.SpeechRecognitionMenuId)
-	}
-	speeches := make([]*speech_recognition.SpeechRecognition, 0)
+	menus := make([]*speech_recognition.SpeechRecognitionMenu, 0)
 	{
-		speechOb := new(speech_recognition.SpeechRecognition)
-		cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionCols.MenuId, utils.GetOrmInReplace(len(menuIds)))
-		pars := make([]interface{}, 0)
-		pars = append(pars, menuIds)
-		list, e := speechOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s DESC", speech_recognition.SpeechRecognitionCols.Sort, speech_recognition.SpeechRecognitionCols.CreateTime))
+		menuOb := new(speech_recognition.SpeechRecognitionMenu)
+		list, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC, %s ASC", speech_recognition.SpeechRecognitionMenuCols.ParentId, speech_recognition.SpeechRecognitionMenuCols.Sort))
 		if e != nil {
 			br.Msg = "获取失败"
-			br.ErrMsg = "获取语音识别列表失败, Err: " + e.Error()
+			br.ErrMsg = "获取目录列表失败, Err: " + e.Error()
 			return
 		}
-		speeches = list
-	}
-	menuSpeeches := make(map[int][]*speech_recognition.SpeechRecognitionMenuNodeItem)
-	for _, s := range speeches {
-		if menuSpeeches[s.MenuId] == nil {
-			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),
-		})
+		menus = list
 	}
 
-	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:   child,
-		}
-		resp = append(resp, t)
-	}
+	// 递归处理成目录树
+	resp := services.GetSpeechRecognitionMenuTreeRecursive(menus, 0)
 
 	br.Data = resp
 	br.Ret = 200

+ 75 - 2
controllers/speech_recognition/speech_recognition_tag.go

@@ -180,8 +180,8 @@ func (this *SpeechRecognitionTagController) Edit() {
 }
 
 // Remove
-// @Title 删除分类
-// @Description 删除分类
+// @Title 删除标签
+// @Description 删除标签
 // @Param	request	body speech_recognition.SpeechRecognitionTagRemoveReq true "type json string"
 // @Success 200 string "操作成功"
 // @router /tag/remove [post]
@@ -256,6 +256,79 @@ func (this *SpeechRecognitionTagController) Remove() {
 	br.Msg = "操作成功"
 }
 
+// RemoveCheck
+// @Title 删除标签校验
+// @Description 删除标签校验
+// @Param	request	body speech_recognition.SpeechRecognitionTagRemoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /tag/remove_check [post]
+func (this *SpeechRecognitionTagController) RemoveCheck() {
+	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.SpeechRecognitionTagRemoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.TagId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, TagId: %d", req.TagId)
+		return
+	}
+
+	tagOb := new(speech_recognition.SpeechRecognitionTag)
+	_, e := tagOb.GetItemById(req.TagId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "操作成功"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取标签失败, Err: " + e.Error()
+		return
+	}
+
+	resp := new(speech_recognition.SpeechRecognitionMenuRemoveCheckResp)
+	// 校验标签是否关联转写文件
+	mappingOb := new(speech_recognition.SpeechRecognitionTagMapping)
+	cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagMappingCols.TagId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, req.TagId)
+	count, e := mappingOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取标签关联转写文件数失败, Err: " + e.Error()
+		return
+	}
+	if count > 0 {
+		resp.CheckResult = 1
+		resp.Tips = "标签关联转写文件,删除失败!"
+	} else {
+		resp.Tips = "校验通过,可以删除"
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
 // List
 // @Title 标签列表
 // @Description 标签列表

+ 136 - 114
controllers/speech_recognition/speech_recognition_tag_menu.go

@@ -243,56 +243,108 @@ func (this *SpeechRecognitionTagMenuController) Remove() {
 		return
 	}
 
-	// 校验目录下是否有内容
-	{
-		tagOb := new(speech_recognition.SpeechRecognitionTag)
-		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagCols.MenuId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, req.MenuId)
-		count, e := tagOb.GetCountByCondition(cond, pars)
-		if e != nil {
+	// 删除校验
+	checkResult, menuIds, e := services.CheckSpeechRecognitionTagMenuRemove(menuItem.SpeechRecognitionTagMenuId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "目录删除校验失败, Err: " + e.Error()
+		return
+	}
+
+	switch checkResult.CheckResult {
+	case services.SpeechMenuCheckRemoveTypePass:
+		// 可删除
+		if e = menuItem.Del(); e != nil {
 			br.Msg = "操作失败"
-			br.ErrMsg = "获取目录下的标签数失败, Err: " + e.Error()
+			br.ErrMsg = "删除目录失败, Err: " + e.Error()
 			return
 		}
-		if count > 0 {
-			br.Msg = "该分类关联标签,删除失败!"
+	case services.SpeechMenuCheckRemoveTypeRefused:
+		// 不可删除
+		br.Msg = checkResult.Tips
+		return
+	case services.SpeechMenuCheckRemoveTypeWarning:
+		// 删除目录及子目录
+		if e = menuOb.MultiDel(menuIds); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "批量删除目录失败, Err: " + e.Error()
 			return
 		}
+	}
 
-		cond = fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagMenuCols.ParentId)
-		pars = make([]interface{}, 0)
-		pars = append(pars, req.MenuId)
-		count, e = menuOb.GetCountByCondition(cond, pars)
-		if e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = "获取下级目录数失败, Err: " + e.Error()
-			return
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// RemoveCheck
+// @Title 删除校验
+// @Description 删除校验
+// @Param	request	body speech_recognition.SpeechRecognitionMenuRemoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /tag/menu/remove_check [post]
+func (this *SpeechRecognitionTagMenuController) RemoveCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
 		}
-		if count > 0 {
-			br.Msg = "该分类含下级目录,删除失败!"
+		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.SpeechRecognitionMenuRemoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数有误"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+	if req.MenuId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, MenuId: %d", req.MenuId)
+		return
+	}
+
+	menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
+	menuItem, e := menuOb.GetItemById(req.MenuId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "操作成功"
 			return
 		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取目录失败, Err: " + e.Error()
+		return
 	}
 
-	if e = menuItem.Del(); e != nil {
+	resp, _, e := services.CheckSpeechRecognitionTagMenuRemove(menuItem.SpeechRecognitionTagMenuId)
+	if e != nil {
 		br.Msg = "操作失败"
-		br.ErrMsg = "删除目录失败, Err: " + e.Error()
+		br.ErrMsg = "目录删除校验失败, Err: " + e.Error()
 		return
 	}
 
+	br.Data = resp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
 }
 
-// Tree
-// @Title 目录树
-// @Description 目录树
+// List
+// @Title 目录列表
+// @Description 目录列表
 // @Param   ParentId  query  int  false  "父级ID"
 // @Success 200 {object} speech_recognition.SpeechRecognitionTagMenuNodeItem
-// @router /tag/menu/tree [get]
-func (this *SpeechRecognitionTagMenuController) Tree() {
+// @router /tag/menu/list [get]
+func (this *SpeechRecognitionTagMenuController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {
@@ -308,14 +360,26 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 		br.Ret = 408
 		return
 	}
-	// 前端采用懒加载, 所以只查询目录及当前目录下的标签
+	// 前端采用懒加载, 所以只查询子目录和内容
 	parentId, _ := this.GetInt("ParentId")
 
-	// 获取所有目录
+	level := 0
+	menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
+	if parentId > 0 {
+		parentMenu, e := menuOb.GetItemById(parentId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取父级目录失败, Err: " + e.Error()
+			return
+		}
+		level = parentMenu.Level + 1
+	}
 	menus := make([]*speech_recognition.SpeechRecognitionTagMenu, 0)
 	{
-		menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
-		list, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort))
+		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))
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取目录列表失败, Err: " + e.Error()
@@ -324,50 +388,12 @@ 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(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)
-	}
 	tags := make([]*speech_recognition.SpeechRecognitionTag, 0)
 	{
 		tagOb := new(speech_recognition.SpeechRecognitionTag)
-		cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionTagCols.MenuId, utils.GetOrmInReplace(len(menuIds)))
+		cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionTagCols.MenuId)
 		pars := make([]interface{}, 0)
-		pars = append(pars, menuIds)
+		pars = append(pars, parentId)
 		list, e := tagOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s DESC", speech_recognition.SpeechRecognitionTagMenuCols.Sort, speech_recognition.SpeechRecognitionTagMenuCols.CreateTime))
 		if e != nil {
 			br.Msg = "获取失败"
@@ -376,47 +402,43 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 		}
 		tags = list
 	}
-	menuTags := make(map[int][]*speech_recognition.SpeechRecognitionTagMenuNodeItem)
-	for _, s := range tags {
-		if menuTags[s.MenuId] == nil {
-			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),
-		})
+
+	resp := make([]*speech_recognition.SpeechRecognitionTagMenuNodeItem, 0)
+	if len(menus) == 0 && len(tags) == 0 {
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
 	}
 
-	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
+	for _, v := range menus {
+		resp = append(resp, &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),
 		})
-		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:   child,
-		}
-		resp = append(resp, t)
 	}
+	for _, v := range tags {
+		resp = append(resp, &speech_recognition.SpeechRecognitionTagMenuNodeItem{
+			UniqueCode: v.UniqueCode,
+			NodeType:   speech_recognition.SpeechRecognitionTagMenuNodeTypeTag,
+			TagId:      v.SpeechRecognitionTagId,
+			TagName:    v.TagName,
+			ParentId:   v.MenuId,
+			Level:      level,
+			Sort:       v.Sort,
+			CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
+		})
+	}
+	sort.Slice(resp, func(i, j int) bool {
+		return resp[i].Sort < resp[j].Sort
+	})
 
 	br.Data = resp
 	br.Ret = 200
@@ -424,12 +446,12 @@ func (this *SpeechRecognitionTagMenuController) Tree() {
 	br.Msg = "获取成功"
 }
 
-// List
-// @Title 目录列表
-// @Description 目录列表
+// Tree
+// @Title 目录
+// @Description 目录
 // @Success 200 {object} speech_recognition.SpeechRecognitionTagMenuItem
-// @router /tag/menu/list [get]
-func (this *SpeechRecognitionTagMenuController) List() {
+// @router /tag/menu/tree [get]
+func (this *SpeechRecognitionTagMenuController) Tree() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		if br.ErrMsg == "" {

+ 17 - 0
models/speech_recognition/speech_recognition_menu.go

@@ -153,6 +153,17 @@ func (m *SpeechRecognitionMenu) GetPageItemsByCondition(condition string, pars [
 	return
 }
 
+// SpeechRecognitionMenuItem 目录
+type SpeechRecognitionMenuItem struct {
+	MenuId     int                          `description:"目录ID"`
+	MenuName   string                       `description:"目录名称"`
+	ParentId   int                          `description:"父级ID"`
+	Level      int                          `description:"目录层级"`
+	Sort       int                          `description:"排序"`
+	CreateTime string                       `description:"创建时间"`
+	Children   []*SpeechRecognitionMenuItem `description:"子目录"`
+}
+
 // SpeechRecognitionMenuNodeItem 语音识别目录节点
 type SpeechRecognitionMenuNodeItem struct {
 	UniqueCode            string                           `description:"唯一编码"`
@@ -185,6 +196,12 @@ type SpeechRecognitionMenuRemoveReq struct {
 	MenuId int `description:"目录ID"`
 }
 
+// SpeechRecognitionMenuRemoveCheckResp 删除语音识别目录-响应体
+type SpeechRecognitionMenuRemoveCheckResp struct {
+	CheckResult int    `description:"校验结果:0-可删除;1-关联内容;2-关联空目录"`
+	Tips        string `description:"提示信息"`
+}
+
 // SpeechRecognitionMenuMoveReq 移动目录请求体
 type SpeechRecognitionMenuMoveReq struct {
 	MenuId       int `description:"目录ID"`

+ 36 - 0
routers/commentsRouter.go

@@ -6145,6 +6145,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: "List",
+            Router: `/menu/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            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",
@@ -6163,6 +6172,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: "RemoveCheck",
+            Router: `/menu/remove_check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            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: "Tree",
@@ -6208,6 +6226,15 @@ 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: "RemoveCheck",
+            Router: `/tag/remove_check`,
+            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: "Add",
@@ -6253,6 +6280,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: "RemoveCheck",
+            Router: `/tag/menu/remove_check`,
+            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: "Tree",

+ 145 - 0
services/speech_recognition.go

@@ -22,8 +22,31 @@ const (
 	SpeechRecognitionExportTypeTxt  = 1
 	SpeechRecognitionExportTypeDocx = 2
 	SpeechRecognitionExportTypePdf  = 3
+
+	SpeechMenuCheckRemoveTypePass    = 0 // 目录删除校验-可删除
+	SpeechMenuCheckRemoveTypeRefused = 1 // 目录删除校验-不可删除
+	SpeechMenuCheckRemoveTypeWarning = 2 // 目录删除校验-警告
 )
 
+// GetSpeechRecognitionMenuTreeRecursive 递归获取标签目录树
+func GetSpeechRecognitionMenuTreeRecursive(list []*speech_recognition.SpeechRecognitionMenu, parentId int) []*speech_recognition.SpeechRecognitionMenuItem {
+	res := make([]*speech_recognition.SpeechRecognitionMenuItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			t := new(speech_recognition.SpeechRecognitionMenuItem)
+			t.MenuId = v.SpeechRecognitionMenuId
+			t.MenuName = v.MenuName
+			t.ParentId = v.ParentId
+			t.Level = v.Level
+			t.Sort = v.Sort
+			t.CreateTime = utils.TimeTransferString(utils.FormatDateTime, v.CreateTime)
+			t.Children = GetSpeechRecognitionMenuTreeRecursive(list, v.SpeechRecognitionMenuId)
+			res = append(res, t)
+		}
+	}
+	return res
+}
+
 // GetSpeechRecognitionTagMenuTreeRecursive 递归获取标签目录树
 func GetSpeechRecognitionTagMenuTreeRecursive(list []*speech_recognition.SpeechRecognitionTagMenu, parentId int) []*speech_recognition.SpeechRecognitionTagMenuItem {
 	res := make([]*speech_recognition.SpeechRecognitionTagMenuItem, 0)
@@ -1233,3 +1256,125 @@ func GetSpeechTagMenuMaxSort(parentId int) (maxSort int, err error) {
 }
 
 // ------------------ 移动标签目录/标签 ------------------ //
+
+// GetSpeechRecognitionMenuChildrenRecursive 递归获取目录的子目录集
+func GetSpeechRecognitionMenuChildrenRecursive(list []*speech_recognition.SpeechRecognitionMenu, parentId int) []int {
+	childIds := make([]int, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			childIds = append(childIds, v.SpeechRecognitionMenuId)
+			ids := GetSpeechRecognitionMenuChildrenRecursive(list, v.SpeechRecognitionMenuId)
+			if len(ids) > 0 {
+				childIds = append(childIds, ids...)
+			}
+		}
+	}
+	return childIds
+}
+
+// GetSpeechRecognitionTagMenuChildrenRecursive 递归获取标签目录的子目录集
+func GetSpeechRecognitionTagMenuChildrenRecursive(list []*speech_recognition.SpeechRecognitionTagMenu, parentId int) []int {
+	childIds := make([]int, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			childIds = append(childIds, v.SpeechRecognitionTagMenuId)
+			ids := GetSpeechRecognitionTagMenuChildrenRecursive(list, v.SpeechRecognitionTagMenuId)
+			if len(ids) > 0 {
+				childIds = append(childIds, ids...)
+			}
+		}
+	}
+	return childIds
+}
+
+// CheckSpeechRecognitionMenuRemove 校验是否可删除目录
+func CheckSpeechRecognitionMenuRemove(menuId int) (result *speech_recognition.SpeechRecognitionMenuRemoveCheckResp, menuIds []int, err error) {
+	menuOb := new(speech_recognition.SpeechRecognitionMenu)
+	result = new(speech_recognition.SpeechRecognitionMenuRemoveCheckResp)
+
+	// 递归获取目录的子目录集合
+	menus, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
+	if e != nil {
+		err = fmt.Errorf("获取语音识别目录列表失败, err: %s", e.Error())
+		return
+	}
+	childIds := GetSpeechRecognitionMenuChildrenRecursive(menus, menuId)
+	menuIds = make([]int, 0)
+	menuIds = append(menuIds, menuId)
+	if len(childIds) > 0 {
+		menuIds = append(menuIds, childIds...)
+	}
+
+	// 校验目录下(包含子目录)是否有内容
+	speechOb := new(speech_recognition.SpeechRecognition)
+	cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionCols.MenuId, utils.GetOrmInReplace(len(menuIds)))
+	pars := make([]interface{}, 0)
+	pars = append(pars, menuIds)
+	count, e := speechOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		err = fmt.Errorf("获取目录下的语音识别数失败, err: %s", e.Error())
+		return
+	}
+	if count > 0 {
+		result.CheckResult = SpeechMenuCheckRemoveTypeRefused
+		result.Tips = "该分类关联转写文件,删除失败!"
+		return
+	}
+
+	// 如果无语音识别, 但存在子目录, 则返回第二种提示
+	if len(childIds) > 0 {
+		result.CheckResult = SpeechMenuCheckRemoveTypeWarning
+		result.Tips = "该分类包含内容为空的子分类"
+		return
+	}
+
+	// 通过校验
+	result.Tips = "校验通过,可以删除"
+	return
+}
+
+// CheckSpeechRecognitionTagMenuRemove 校验是否可删除标签目录
+func CheckSpeechRecognitionTagMenuRemove(menuId int) (result *speech_recognition.SpeechRecognitionMenuRemoveCheckResp, menuIds []int, err error) {
+	menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
+	result = new(speech_recognition.SpeechRecognitionMenuRemoveCheckResp)
+
+	// 递归获取目录的子目录集合
+	menus, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
+	if e != nil {
+		err = fmt.Errorf("获取标签目录列表失败, err: %s", e.Error())
+		return
+	}
+	childIds := GetSpeechRecognitionTagMenuChildrenRecursive(menus, menuId)
+	menuIds = make([]int, 0)
+	menuIds = append(menuIds, menuId)
+	if len(childIds) > 0 {
+		menuIds = append(menuIds, childIds...)
+	}
+
+	// 校验目录下(包含子目录)是否有内容
+	tagOb := new(speech_recognition.SpeechRecognitionTag)
+	cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionTagCols.MenuId, utils.GetOrmInReplace(len(menuIds)))
+	pars := make([]interface{}, 0)
+	pars = append(pars, menuIds)
+	count, e := tagOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		err = fmt.Errorf("获取目录下的标签数失败, err: %s", e.Error())
+		return
+	}
+	if count > 0 {
+		result.CheckResult = SpeechMenuCheckRemoveTypeRefused
+		result.Tips = "该分类关联标签,删除失败!"
+		return
+	}
+
+	// 如果无内容, 但存在子目录, 则返回第二种提示
+	if len(childIds) > 0 {
+		result.CheckResult = SpeechMenuCheckRemoveTypeWarning
+		result.Tips = "该分类包含内容为空的子分类"
+		return
+	}
+
+	// 通过校验
+	result.Tips = "校验通过,可以删除"
+	return
+}