1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405 |
- package services
- import (
- "bufio"
- "errors"
- "eta_gn/eta_api/models"
- "eta_gn/eta_api/models/speech_recognition"
- "eta_gn/eta_api/services/alarm_msg"
- "eta_gn/eta_api/utils"
- "fmt"
- "os"
- "strconv"
- "sync"
- "time"
- "baliance.com/gooxml/document"
- "baliance.com/gooxml/measurement"
- "baliance.com/gooxml/schema/soo/wml"
- "github.com/jung-kurt/gofpdf"
- )
- 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.UniqueCode = v.UniqueCode
- 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)
- for _, v := range list {
- if v.ParentId == parentId {
- t := new(speech_recognition.SpeechRecognitionTagMenuItem)
- t.UniqueCode = v.UniqueCode
- t.MenuId = v.SpeechRecognitionTagMenuId
- 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 = GetSpeechRecognitionTagMenuTreeRecursive(list, v.SpeechRecognitionTagMenuId)
- res = append(res, t)
- }
- }
- return res
- }
- // BatchConvertSpeech 批量转写语音
- func BatchConvertSpeech(speeches []*speech_recognition.SpeechRecognition) {
- var err error
- defer func() {
- if err != nil {
- tips := fmt.Sprintf("批量转写语音失败, ErrMsg: %s", err.Error())
- utils.FileLog.Info(tips)
- go alarm_msg.SendAlarmMsg(tips, 1)
- }
- }()
- conf, e := models.GetBusinessConf()
- if e != nil {
- err = fmt.Errorf("获取配置失败, Err: %s", e.Error())
- return
- }
- if conf[models.BusinessConfTencentApiSecretId] == "" || conf[models.BusinessConfTencentApiSecretKey] == "" || conf[models.BusinessConfTencentApiRecTaskCallbackUrl] == "" {
- err = fmt.Errorf("API配置有误, SecretId: %s, SecretKey: %s, Callback: %s", conf[models.BusinessConfTencentApiSecretId], conf[models.BusinessConfTencentApiSecretKey], conf[models.BusinessConfTencentApiRecTaskCallbackUrl])
- return
- }
- // 限制接口请求频率
- apiLimit := make(chan struct{}, 20)
- var wg sync.WaitGroup
- for _, v := range speeches {
- wg.Add(1)
- go func(speech *speech_recognition.SpeechRecognition) {
- defer func() {
- wg.Done()
- <-apiLimit
- }()
- apiLimit <- struct{}{}
- // 发起请求
- var errMsg string
- var r TencentRecTaskReq
- r.FileUrl = speech.ResourceUrl
- r.SecretId = conf[models.BusinessConfTencentApiSecretId]
- r.SecretKey = conf[models.BusinessConfTencentApiSecretKey]
- r.CallbackUrl = conf[models.BusinessConfTencentApiRecTaskCallbackUrl]
- taskId, e := TencentCreateRecTask(r)
- if e != nil {
- errMsg = "创建语音识别任务失败"
- utils.FileLog.Info("TencentCreateRecTask创建语音识别任务失败, ErrMsg: %s", e.Error())
- }
- if errMsg == "" {
- apiLog := new(speech_recognition.SpeechRecognitionApiLog)
- apiLog.SpeechRecognitionId = speech.SpeechRecognitionId
- apiLog.RequestId = strconv.Itoa(taskId)
- apiLog.RequestCode = -1
- apiLog.CreateTime = time.Now().Local()
- apiLog.ModifyTime = time.Now().Local()
- if e = apiLog.Create(); e != nil {
- errMsg = "生成API请求失败"
- utils.FileLog.Info("CreateApiLog生成API请求记录失败, ErrMsg: %s", e.Error())
- return
- }
- }
- // 有报错则更新对应语音识别状态
- if errMsg == "" {
- return
- }
- speech.State = speech_recognition.SpeechRecognitionStateFail
- speech.ConvertRemark = errMsg
- speech.ModifyTime = time.Now().Local()
- updateCols := []string{speech_recognition.SpeechRecognitionCols.State, speech_recognition.SpeechRecognitionCols.ConvertRemark, speech_recognition.SpeechRecognitionCols.ModifyTime}
- if e = speech.Update(updateCols); e != nil {
- utils.FileLog.Info("UpdateSpeech更新语音识别状态失败, ErrMsg: %s", e.Error())
- return
- }
- }(v)
- }
- wg.Wait()
- return
- }
- // SpeechRecognitionContentExport 导出语音识别内容
- func SpeechRecognitionContentExport(exportType int, exportTimestamp bool, fileName string, contents []*speech_recognition.SpeechRecognitionContent) (result string, err error) {
- defer func() {
- if err != nil {
- fmt.Println(err)
- }
- }()
- if len(contents) == 0 {
- return
- }
- // 整理内容
- 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 == SpeechRecognitionExportTypeDocx {
- doc := document.New()
- for _, v := range exportArr {
- p := doc.AddParagraph()
- prop := p.Properties()
- prop.Spacing().SetLineSpacing(measurement.Distance(1.5*15*measurement.Point), wml.ST_LineSpacingRuleAuto)
- prop.SetAlignment(wml.ST_JcLeft)
- run := p.AddRun()
- runProp := run.Properties()
- runProp.SetSize(measurement.Distance(15 * measurement.Point))
- runProp.SetFontFamily("宋体")
- run.AddText(v)
- run.AddBreak()
- }
- filePath := fmt.Sprintf("%s.docx", fileName)
- if e := doc.SaveToFile(filePath); e != nil {
- err = fmt.Errorf("生成docx失败, Err: %s", e.Error())
- return
- }
- result = filePath
- return
- }
- // 导出pdf
- 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
- }
- // 默认导出txt
- filePath := fmt.Sprintf("%s.txt", fileName)
- file, e := os.Create(filePath)
- if e != nil {
- err = fmt.Errorf("生成txt文件失败, err: %s", e.Error())
- return
- }
- defer file.Close()
- // 写入txt
- writer := bufio.NewWriter(file)
- _, e = writer.WriteString(exportText)
- if e != nil {
- err = fmt.Errorf("写入txt文件失败, err: %s", e.Error())
- return
- }
- if e = writer.Flush(); e != nil {
- err = fmt.Errorf("刷新txt缓存失败, err: %s", e.Error())
- return
- }
- result = filePath
- return
- }
- // ------------------ 移动目录/语音识别(有空的话后面可以优化一下,以后这种菜单混合移动的情况不会少,CV起来怪麻烦的) ------------------ //
- // MoveSpeechMenu 移动语音识别目录/识别文件
- func MoveSpeechMenu(req speech_recognition.SpeechRecognitionMenuMoveReq) (err error, errMsg string) {
- menuId := req.MenuId
- parentMenuId := req.ParentMenuId
- prevMenuId := req.PrevMenuId
- nextMenuId := req.NextMenuId
- speechId := req.SpeechId
- prevSpeechId := req.PrevSpeechId
- nextSpeechId := req.NextSpeechId
- //首先确定移动的对象是目录还是语音识别
- //判断上一个节点是目录还是语音识别
- //判断下一个节点是目录还是语音识别
- //同时更新目录目录下的目录sort和语音识别sort
- //更新当前移动的目录或者语音识别sort
- menuOb := new(speech_recognition.SpeechRecognitionMenu)
- speechOb := new(speech_recognition.SpeechRecognition)
- var parentSpeechMenu *speech_recognition.SpeechRecognitionMenu
- if parentMenuId > 0 {
- t, e := menuOb.GetItemById(parentMenuId)
- if e != nil {
- errMsg = "移动失败"
- err = errors.New("获取上级目录信息失败,Err:" + err.Error())
- return
- }
- parentSpeechMenu = t
- }
- //如果有传入 上一个兄弟节点目录id
- var (
- speechMenu *speech_recognition.SpeechRecognitionMenu
- prevMenu *speech_recognition.SpeechRecognitionMenu
- nextMenu *speech_recognition.SpeechRecognitionMenu
- speechItem *speech_recognition.SpeechRecognition
- prevSpeech *speech_recognition.SpeechRecognition
- nextSpeech *speech_recognition.SpeechRecognition
- prevSort int
- nextSort int
- )
- // 移动对象为目录
- if speechId == 0 {
- speechMenu, err = menuOb.GetItemById(menuId)
- if err != nil {
- if utils.IsErrNoRow(err) {
- errMsg = "当前目录不存在"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- errMsg = "移动失败"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- if parentMenuId > 0 && parentSpeechMenu.Level == 3 {
- errMsg = "最高只支持添加3级目录"
- err = errors.New(errMsg)
- return
- }
- // 如果是移动目录, 那么校验一下父级目录下是否有重名目录
- {
- cond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionMenuCols.MenuName, speech_recognition.SpeechRecognitionMenuCols.ParentId, speech_recognition.SpeechRecognitionMenuCols.SpeechRecognitionMenuId)
- pars := make([]interface{}, 0)
- pars = append(pars, speechMenu.MenuName, parentMenuId, menuId)
- exists, e := menuOb.GetItemByCondition(cond, pars, "")
- if e != nil && !utils.IsErrNoRow(e) {
- errMsg = "移动失败"
- err = fmt.Errorf("获取父级目录下的同名目录失败, Err: %s", e.Error())
- return
- }
- if exists != nil && exists.SpeechRecognitionMenuId > 0 {
- errMsg = "移动失败,目录名称已存在"
- return
- }
- }
- } else {
- speechItem, err = speechOb.GetItemById(speechId)
- if err != nil {
- if utils.IsErrNoRow(err) {
- errMsg = "当前语音识别不存在"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- errMsg = "移动失败"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- if parentMenuId == 0 {
- errMsg = "移动失败,语音识别必须挂在目录下"
- err = errors.New(errMsg)
- return
- }
- }
- if prevMenuId > 0 {
- prevMenu, err = menuOb.GetItemById(prevMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取上一个兄弟节点目录信息失败,Err:" + err.Error())
- return
- }
- prevSort = prevMenu.Sort
- } else if prevSpeechId > 0 {
- prevSpeech, err = speechOb.GetItemById(prevSpeechId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取上一个兄弟节点信息失败,Err:" + err.Error())
- return
- }
- prevSort = prevSpeech.Sort
- }
- // 下一个兄弟节点
- if nextMenuId > 0 {
- nextMenu, err = menuOb.GetItemById(nextMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取下一个兄弟节点目录信息失败,Err:" + err.Error())
- return
- }
- nextSort = nextMenu.Sort
- } else if nextSpeechId > 0 {
- nextSpeech, err = speechOb.GetItemById(nextSpeechId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取下一个兄弟节点目录信息失败,Err:" + err.Error())
- return
- }
- nextSort = nextSpeech.Sort
- }
- err, errMsg = moveSpeechMenu(parentSpeechMenu, speechMenu, prevMenu, nextMenu, speechItem, prevSpeech, nextSpeech, parentMenuId, prevSort, nextSort)
- return
- }
- func moveSpeechMenu(parentSpeechMenu, speechMenu, prevMenu, nextMenu *speech_recognition.SpeechRecognitionMenu, speechItem, prevSpeech, nextSpeech *speech_recognition.SpeechRecognition, parentMenuId int, prevSort, nextSort int) (err error, errMsg string) {
- updateCol := make([]string, 0)
- menuOb := new(speech_recognition.SpeechRecognitionMenu)
- speechOb := new(speech_recognition.SpeechRecognition)
- // 移动对象为目录, 判断目录是否存在
- if speechMenu != nil {
- oldParentId := speechMenu.ParentId
- oldLevel := speechMenu.Level
- var menuIds []int
- if oldParentId != parentMenuId {
- //更新子目录对应的level
- childList, e, m := GetChildSpeechMenuByMenuId(speechMenu.SpeechRecognitionMenuId)
- if e != nil {
- errMsg = "移动失败"
- err = errors.New("查询子目录失败,Err:" + e.Error() + m)
- return
- }
- if len(childList) > 0 {
- for _, v := range childList {
- if v.SpeechRecognitionMenuId == speechMenu.SpeechRecognitionMenuId {
- continue
- }
- menuIds = append(menuIds, v.SpeechRecognitionMenuId)
- }
- }
- }
- //判断上级id是否一致,如果不一致的话,那么需要移动该目录层级
- if speechMenu.ParentId != parentMenuId && parentMenuId != 0 {
- if speechMenu.Level != parentSpeechMenu.Level+1 { //禁止层级调整
- errMsg = "移动失败"
- err = errors.New("不支持目录层级变更")
- return
- }
- speechMenu.ParentId = parentSpeechMenu.SpeechRecognitionMenuId
- speechMenu.RootId = parentSpeechMenu.RootId
- speechMenu.Level = parentSpeechMenu.Level + 1
- speechMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
- } else if speechMenu.ParentId != parentMenuId && parentMenuId == 0 {
- errMsg = "移动失败"
- err = errors.New("不支持目录层级变更")
- return
- }
- if prevSort > 0 {
- //如果是移动在两个兄弟节点之间
- if nextSort > 0 {
- //下一个兄弟节点
- //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
- if prevSort == nextSort || prevSort == speechMenu.Sort {
- //变更兄弟节点的排序
- updateSortStr := `sort + 2`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionMenuId, prevMenu.Sort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更语音识别
- if prevSpeech != nil {
- //变更兄弟节点的排序
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, prevSpeech.SpeechRecognitionId, updateSortStr)
- } else {
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- } else {
- //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
- if nextSort-prevSort == 1 {
- //变更兄弟节点的排序
- updateSortStr := `sort + 1`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionMenuId, prevSort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更语音识别
- if prevSpeech != nil {
- //变更兄弟节点的排序
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, prevSpeech.SpeechRecognitionId, updateSortStr)
- } else {
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- }
- }
- }
- speechMenu.Sort = prevSort + 1
- speechMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else if prevMenu == nil && nextMenu == nil && prevSpeech == nil && nextSpeech == nil && parentMenuId > 0 {
- //处理只拖动到目录里,默认放到目录底部的情况
- var maxSort int
- maxSort, err = GetSpeechMenuMaxSort(parentMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("查询组内排序信息失败,Err:" + err.Error())
- return
- }
- speechMenu.Sort = maxSort + 1 //那就是排在组内最后一位
- speechMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else {
- // 拖动到父级目录的第一位
- firstMenu, tmpErr := menuOb.GetFirstByParentId(parentMenuId)
- if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tmpErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstMenu != nil && firstMenu.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = menuOb.UpdateSortByParentId(parentMenuId, firstMenu.SpeechRecognitionMenuId-1, 0, updateSortStr)
- //该目录下的所有语音识别也需要+1
- _ = speechOb.UpdateSortByMenuId(parentMenuId, 0, 0, updateSortStr)
- } else {
- //如果该目录下存在语音识别,且第一个语音识别的排序等于0,那么需要调整排序
- firstSpeech, tErr := speechOb.GetFirstByMenuId(parentMenuId)
- if tErr != nil && !utils.IsErrNoRow(tErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstSpeech != nil && firstSpeech.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = speechOb.UpdateSortByMenuId(parentMenuId, 0, firstSpeech.SpeechRecognitionId-1, updateSortStr)
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, 0, updateSortStr)
- }
- }
- speechMenu.Sort = 0 //那就是排在第一位
- speechMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- }
- //更新
- if len(updateCol) > 0 {
- err = speechMenu.Update(updateCol)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("修改失败,Err:" + err.Error())
- return
- }
- //更新对应目录的root_id和层级
- if oldParentId != parentMenuId {
- if len(menuIds) > 0 {
- levelStep := speechMenu.Level - oldLevel
- err = menuOb.UpdateChildByParentMenuId(menuIds, speechMenu.RootId, levelStep)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("更新子目录失败,Err:" + err.Error())
- return
- }
- }
- }
- }
- } else {
- if speechItem == nil {
- errMsg = "当前语音识别不存在"
- err = errors.New(errMsg)
- return
- }
- //如果改变了目录,那么移动该语音识别数据
- if speechItem.MenuId != parentMenuId {
- speechItem.MenuId = parentMenuId
- speechItem.ModifyTime = time.Now()
- updateCol = append(updateCol, speech_recognition.SpeechRecognitionCols.MenuId, speech_recognition.SpeechRecognitionCols.ModifyTime)
- }
- if prevSort > 0 {
- //如果是移动在两个兄弟节点之间
- if nextSort > 0 {
- //下一个兄弟节点
- //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
- if prevSort == nextSort || prevSort == speechItem.Sort {
- //变更兄弟节点的排序
- updateSortStr := `sort + 2`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionMenuId, prevMenu.Sort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更语音识别
- if prevSpeech != nil {
- //变更兄弟节点的排序
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, prevSpeech.SpeechRecognitionId, updateSortStr)
- } else {
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- } else {
- //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
- if nextSort-prevSort == 1 {
- //变更兄弟节点的排序
- updateSortStr := `sort + 1`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionMenuId, prevSort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更语音识别
- if prevSpeech != nil {
- //变更兄弟节点的排序
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, prevSpeech.SpeechRecognitionId, updateSortStr)
- } else {
- _ = speechOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- }
- }
- }
- speechItem.Sort = prevSort + 1
- speechItem.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else if prevMenu == nil && nextMenu == nil && prevSpeech == nil && nextSpeech == nil && parentMenuId > 0 {
- //处理只拖动到目录里,默认放到目录底部的情况
- var maxSort int
- maxSort, err = GetSpeechMenuMaxSort(parentMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("查询组内排序信息失败,Err:" + err.Error())
- return
- }
- speechItem.Sort = maxSort + 1 //那就是排在组内最后一位
- speechItem.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else {
- // 拖动到父级目录的第一位
- firstMenu, tmpErr := menuOb.GetFirstByParentId(parentMenuId)
- if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tmpErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstMenu != nil && firstMenu.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = menuOb.UpdateSortByParentId(parentMenuId, firstMenu.SpeechRecognitionMenuId-1, 0, updateSortStr)
- //该目录下的所有语音识别也需要+1
- _ = speechOb.UpdateSortByMenuId(parentMenuId, 0, 0, updateSortStr)
- } else {
- //如果该目录下存在语音识别,且第一个语音识别的排序等于0,那么需要调整排序
- firstSpeech, tErr := speechOb.GetFirstByMenuId(parentMenuId)
- if tErr != nil && !utils.IsErrNoRow(tErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstSpeech != nil && firstSpeech.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = speechOb.UpdateSortByMenuId(parentMenuId, 0, firstSpeech.SpeechRecognitionId-1, updateSortStr)
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, 0, updateSortStr)
- }
- }
- speechItem.Sort = 0 //那就是排在第一位
- speechItem.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- }
- //更新
- if len(updateCol) > 0 {
- err = speechItem.Update(updateCol)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("修改失败,Err:" + err.Error())
- return
- }
- }
- }
- return
- }
- func GetChildSpeechMenuByMenuId(menuId int) (targetList []*speech_recognition.SpeechRecognitionMenu, err error, errMsg string) {
- menuOb := new(speech_recognition.SpeechRecognitionMenu)
- //判断是否是挂在顶级目录下
- speechMenu, err := menuOb.GetItemById(menuId)
- if err != nil {
- if utils.IsErrNoRow(err) {
- errMsg = "当前目录不存在"
- err = errors.New(errMsg)
- return
- }
- errMsg = "获取失败"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- cond := fmt.Sprintf(" AND %s = ?", speech_recognition.SpeechRecognitionMenuCols.RootId)
- pars := make([]interface{}, 0)
- pars = append(pars, speechMenu.RootId)
- order := fmt.Sprintf("%s ASC, %s ASC, %s ASC", speech_recognition.SpeechRecognitionMenuCols.Level, speech_recognition.SpeechRecognitionMenuCols.Sort, speech_recognition.SpeechRecognitionMenuCols.SpeechRecognitionMenuId)
- tmpList, err := speechMenu.GetItemsByCondition(cond, pars, []string{}, order)
- if err != nil && !utils.IsErrNoRow(err) {
- errMsg = "获取失败"
- err = errors.New("获取数据失败,Err:" + err.Error())
- return
- }
- idMap := make(map[int]struct{})
- if len(tmpList) > 0 {
- for _, v := range tmpList {
- if v.SpeechRecognitionMenuId == speechMenu.SpeechRecognitionMenuId {
- idMap[v.SpeechRecognitionMenuId] = struct{}{}
- }
- }
- for _, v := range tmpList {
- if _, ok := idMap[v.ParentId]; ok {
- idMap[v.SpeechRecognitionMenuId] = struct{}{}
- }
- }
- for _, v := range tmpList {
- if _, ok := idMap[v.SpeechRecognitionMenuId]; ok {
- targetList = append(targetList, v)
- }
- }
- }
- return
- }
- // GetSpeechMenuMaxSort 获取同级下最大的排序
- func GetSpeechMenuMaxSort(parentId int) (maxSort int, err error) {
- menuOb := new(speech_recognition.SpeechRecognitionMenu)
- speechOb := new(speech_recognition.SpeechRecognition)
- //获取该层级下最大的排序数
- menuMax, err := menuOb.GetMaxSortByParentId(parentId)
- if err != nil {
- return
- }
- maxSort = menuMax
- speechMax, err := speechOb.GetMaxSortByMenuId(parentId)
- if err != nil {
- return
- }
- if maxSort < speechMax {
- maxSort = speechMax
- }
- return
- }
- // ------------------ 移动目录/语音识别 ------------------ //
- // ------------------ 移动标签目录/标签 ------------------ //
- // MoveSpeechTagMenu 移动标签目录/标签
- func MoveSpeechTagMenu(req speech_recognition.SpeechRecognitionTagMenuMoveReq) (err error, errMsg string) {
- menuId := req.MenuId
- parentMenuId := req.ParentMenuId
- prevMenuId := req.PrevMenuId
- nextMenuId := req.NextMenuId
- tagId := req.TagId
- prevTagId := req.PrevTagId
- nextTagId := req.NextTagId
- //首先确定移动的对象是目录还是标签
- //判断上一个节点是目录还是标签
- //判断下一个节点是目录还是标签
- //同时更新目录目录下的目录sort和标签sort
- //更新当前移动的目录或者标签sort
- menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
- tagOb := new(speech_recognition.SpeechRecognitionTag)
- var parentTagMenu *speech_recognition.SpeechRecognitionTagMenu
- if parentMenuId > 0 {
- t, e := menuOb.GetItemById(parentMenuId)
- if e != nil {
- errMsg = "移动失败"
- err = errors.New("获取上级目录信息失败,Err:" + err.Error())
- return
- }
- parentTagMenu = t
- }
- //如果有传入 上一个兄弟节点目录id
- var (
- tagMenu *speech_recognition.SpeechRecognitionTagMenu
- prevMenu *speech_recognition.SpeechRecognitionTagMenu
- nextMenu *speech_recognition.SpeechRecognitionTagMenu
- tagItem *speech_recognition.SpeechRecognitionTag
- prevTag *speech_recognition.SpeechRecognitionTag
- nextTag *speech_recognition.SpeechRecognitionTag
- prevSort int
- nextSort int
- )
- // 移动对象为目录
- if tagId == 0 {
- tagMenu, err = menuOb.GetItemById(menuId)
- if err != nil {
- if utils.IsErrNoRow(err) {
- errMsg = "当前目录不存在"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- errMsg = "移动失败"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- if parentMenuId > 0 && parentTagMenu.Level == 3 {
- errMsg = "最高只支持添加3级目录"
- err = errors.New(errMsg)
- return
- }
- // 如果是移动目录, 那么校验一下父级目录下是否有重名目录
- {
- cond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionTagMenuCols.MenuName, speech_recognition.SpeechRecognitionTagMenuCols.ParentId, speech_recognition.SpeechRecognitionTagMenuCols.SpeechRecognitionTagMenuId)
- pars := make([]interface{}, 0)
- pars = append(pars, tagMenu.MenuName, parentMenuId, menuId)
- exists, e := menuOb.GetItemByCondition(cond, pars, "")
- if e != nil && !utils.IsErrNoRow(e) {
- errMsg = "移动失败"
- err = fmt.Errorf("获取父级目录下的同名目录失败, Err: %s", e.Error())
- return
- }
- if exists != nil && exists.SpeechRecognitionTagMenuId > 0 {
- errMsg = "移动失败,目录名称已存在"
- return
- }
- }
- } else {
- tagItem, err = tagOb.GetItemById(tagId)
- if err != nil {
- if utils.IsErrNoRow(err) {
- errMsg = "当前标签不存在"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- errMsg = "移动失败"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- if parentMenuId == 0 {
- errMsg = "移动失败,标签必须挂在目录下"
- err = errors.New(errMsg)
- return
- }
- }
- if prevMenuId > 0 {
- prevMenu, err = menuOb.GetItemById(prevMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取上一个兄弟节点目录信息失败,Err:" + err.Error())
- return
- }
- prevSort = prevMenu.Sort
- } else if prevTagId > 0 {
- prevTag, err = tagOb.GetItemById(prevTagId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取上一个兄弟节点信息失败,Err:" + err.Error())
- return
- }
- prevSort = prevTag.Sort
- }
- // 下一个兄弟节点
- if nextMenuId > 0 {
- nextMenu, err = menuOb.GetItemById(nextMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取下一个兄弟节点目录信息失败,Err:" + err.Error())
- return
- }
- nextSort = nextMenu.Sort
- } else if nextTagId > 0 {
- nextTag, err = tagOb.GetItemById(nextTagId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("获取下一个兄弟节点目录信息失败,Err:" + err.Error())
- return
- }
- nextSort = nextTag.Sort
- }
- err, errMsg = moveSpeechTagMenu(parentTagMenu, tagMenu, prevMenu, nextMenu, tagItem, prevTag, nextTag, parentMenuId, prevSort, nextSort)
- return
- }
- func moveSpeechTagMenu(parentTagMenu, tagMenu, prevMenu, nextMenu *speech_recognition.SpeechRecognitionTagMenu, tagItem, prevTag, nextTag *speech_recognition.SpeechRecognitionTag, parentMenuId int, prevSort, nextSort int) (err error, errMsg string) {
- updateCol := make([]string, 0)
- menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
- tagOb := new(speech_recognition.SpeechRecognitionTag)
- // 移动对象为目录, 判断目录是否存在
- if tagMenu != nil {
- oldParentId := tagMenu.ParentId
- oldLevel := tagMenu.Level
- var menuIds []int
- if oldParentId != parentMenuId {
- //更新子目录对应的level
- childList, e, m := GetChildSpeechTagMenuByMenuId(tagMenu.SpeechRecognitionTagMenuId)
- if e != nil {
- errMsg = "移动失败"
- err = errors.New("查询子目录失败,Err:" + e.Error() + m)
- return
- }
- if len(childList) > 0 {
- for _, v := range childList {
- if v.SpeechRecognitionTagMenuId == tagMenu.SpeechRecognitionTagMenuId {
- continue
- }
- menuIds = append(menuIds, v.SpeechRecognitionTagMenuId)
- }
- }
- }
- //判断上级id是否一致,如果不一致的话,那么需要移动该目录层级
- if tagMenu.ParentId != parentMenuId && parentMenuId != 0 {
- if tagMenu.Level != parentTagMenu.Level+1 { //禁止层级调整
- errMsg = "移动失败"
- err = errors.New("不支持目录层级变更")
- return
- }
- tagMenu.ParentId = parentTagMenu.SpeechRecognitionTagMenuId
- tagMenu.RootId = parentTagMenu.RootId
- tagMenu.Level = parentTagMenu.Level + 1
- tagMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
- } else if tagMenu.ParentId != parentMenuId && parentMenuId == 0 {
- errMsg = "移动失败"
- err = errors.New("不支持目录层级变更")
- return
- }
- if prevSort > 0 {
- //如果是移动在两个兄弟节点之间
- if nextSort > 0 {
- //下一个兄弟节点
- //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
- if prevSort == nextSort || prevSort == tagMenu.Sort {
- //变更兄弟节点的排序
- updateSortStr := `sort + 2`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionTagMenuId, prevMenu.Sort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更标签
- if prevTag != nil {
- //变更兄弟节点的排序
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, prevTag.SpeechRecognitionTagId, updateSortStr)
- } else {
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- } else {
- //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
- if nextSort-prevSort == 1 {
- //变更兄弟节点的排序
- updateSortStr := `sort + 1`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionTagMenuId, prevSort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更标签
- if prevTag != nil {
- //变更兄弟节点的排序
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, prevTag.SpeechRecognitionTagId, updateSortStr)
- } else {
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- }
- }
- }
- tagMenu.Sort = prevSort + 1
- tagMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else if prevMenu == nil && nextMenu == nil && prevTag == nil && nextTag == nil && parentMenuId > 0 {
- //处理只拖动到目录里,默认放到目录底部的情况
- var maxSort int
- maxSort, err = GetSpeechTagMenuMaxSort(parentMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("查询组内排序信息失败,Err:" + err.Error())
- return
- }
- tagMenu.Sort = maxSort + 1 //那就是排在组内最后一位
- tagMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else {
- // 拖动到父级目录的第一位
- firstTagMenu, tmpErr := menuOb.GetFirstByParentId(parentMenuId)
- if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tmpErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstTagMenu != nil && firstTagMenu.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = menuOb.UpdateSortByParentId(parentMenuId, firstTagMenu.SpeechRecognitionTagMenuId-1, 0, updateSortStr)
- //该目录下的所有标签也需要+1
- _ = tagOb.UpdateSortByMenuId(parentMenuId, 0, 0, updateSortStr)
- } else {
- //如果该目录下存在标签,且第一个标签的排序等于0,那么需要调整排序
- firstTag, tErr := tagOb.GetFirstByMenuId(parentMenuId)
- if tErr != nil && !utils.IsErrNoRow(tErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstTag != nil && firstTag.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = tagOb.UpdateSortByMenuId(parentMenuId, 0, firstTag.SpeechRecognitionTagId-1, updateSortStr)
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, 0, updateSortStr)
- }
- }
- tagMenu.Sort = 0 //那就是排在第一位
- tagMenu.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- }
- //更新
- if len(updateCol) > 0 {
- err = tagMenu.Update(updateCol)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("修改失败,Err:" + err.Error())
- return
- }
- //更新对应目录的root_id和层级
- if oldParentId != parentMenuId {
- if len(menuIds) > 0 {
- levelStep := tagMenu.Level - oldLevel
- err = menuOb.UpdateChildByParentMenuId(menuIds, tagMenu.RootId, levelStep)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("更新子目录失败,Err:" + err.Error())
- return
- }
- }
- }
- }
- } else {
- if tagItem == nil {
- errMsg = "当前标签不存在"
- err = errors.New(errMsg)
- return
- }
- //如果改变了目录,那么移动该标签数据
- if tagItem.MenuId != parentMenuId {
- tagItem.MenuId = parentMenuId
- tagItem.ModifyTime = time.Now()
- updateCol = append(updateCol, speech_recognition.SpeechRecognitionTagCols.MenuId, speech_recognition.SpeechRecognitionTagCols.ModifyTime)
- }
- if prevSort > 0 {
- //如果是移动在两个兄弟节点之间
- if nextSort > 0 {
- //下一个兄弟节点
- //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
- if prevSort == nextSort || prevSort == tagItem.Sort {
- //变更兄弟节点的排序
- updateSortStr := `sort + 2`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionTagMenuId, prevMenu.Sort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更标签
- if prevTag != nil {
- //变更兄弟节点的排序
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, prevTag.SpeechRecognitionTagId, updateSortStr)
- } else {
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- } else {
- //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
- if nextSort-prevSort == 1 {
- //变更兄弟节点的排序
- updateSortStr := `sort + 1`
- //变更目录
- if prevMenu != nil {
- _ = menuOb.UpdateSortByParentId(parentMenuId, prevMenu.SpeechRecognitionTagMenuId, prevSort, updateSortStr)
- } else {
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, prevSort, updateSortStr)
- }
- //变更标签
- if prevTag != nil {
- //变更兄弟节点的排序
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, prevTag.SpeechRecognitionTagId, updateSortStr)
- } else {
- _ = tagOb.UpdateSortByMenuId(parentMenuId, prevSort, 0, updateSortStr)
- }
- }
- }
- }
- tagItem.Sort = prevSort + 1
- tagItem.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else if prevMenu == nil && nextMenu == nil && prevTag == nil && nextTag == nil && parentMenuId > 0 {
- //处理只拖动到目录里,默认放到目录底部的情况
- var maxSort int
- maxSort, err = GetSpeechTagMenuMaxSort(parentMenuId)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("查询组内排序信息失败,Err:" + err.Error())
- return
- }
- tagItem.Sort = maxSort + 1 //那就是排在组内最后一位
- tagItem.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- } else {
- // 拖动到父级目录的第一位
- firstTagMenu, tmpErr := menuOb.GetFirstByParentId(parentMenuId)
- if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tmpErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstTagMenu != nil && firstTagMenu.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = menuOb.UpdateSortByParentId(parentMenuId, firstTagMenu.SpeechRecognitionTagMenuId-1, 0, updateSortStr)
- //该目录下的所有标签也需要+1
- _ = tagOb.UpdateSortByMenuId(parentMenuId, 0, 0, updateSortStr)
- } else {
- //如果该目录下存在标签,且第一个标签的排序等于0,那么需要调整排序
- firstTag, tErr := tagOb.GetFirstByMenuId(parentMenuId)
- if tErr != nil && !utils.IsErrNoRow(tErr) {
- errMsg = "移动失败"
- err = errors.New("获取获取当前父级目录下的排序第一条的目录信息失败,Err:" + tErr.Error())
- return
- }
- //如果该目录下存在其他目录,且第一个其他目录的排序等于0,那么需要调整排序
- if firstTag != nil && firstTag.Sort == 0 {
- updateSortStr := ` sort + 1 `
- _ = tagOb.UpdateSortByMenuId(parentMenuId, 0, firstTag.SpeechRecognitionTagId-1, updateSortStr)
- _ = menuOb.UpdateSortByParentId(parentMenuId, 0, 0, updateSortStr)
- }
- }
- tagItem.Sort = 0 //那就是排在第一位
- tagItem.ModifyTime = time.Now()
- updateCol = append(updateCol, "Sort", "ModifyTime")
- }
- //更新
- if len(updateCol) > 0 {
- err = tagItem.Update(updateCol)
- if err != nil {
- errMsg = "移动失败"
- err = errors.New("修改失败,Err:" + err.Error())
- return
- }
- }
- }
- return
- }
- func GetChildSpeechTagMenuByMenuId(menuId int) (targetList []*speech_recognition.SpeechRecognitionTagMenu, err error, errMsg string) {
- menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
- //判断是否是挂在顶级目录下
- tagMenu, err := menuOb.GetItemById(menuId)
- if err != nil {
- if utils.IsErrNoRow(err) {
- errMsg = "当前目录不存在"
- err = errors.New(errMsg)
- return
- }
- errMsg = "获取失败"
- err = errors.New("获取目录信息失败,Err:" + err.Error())
- return
- }
- cond := fmt.Sprintf(" AND %s = ?", speech_recognition.SpeechRecognitionTagMenuCols.RootId)
- pars := make([]interface{}, 0)
- pars = append(pars, tagMenu.RootId)
- order := fmt.Sprintf("%s ASC, %s ASC, %s ASC", speech_recognition.SpeechRecognitionTagMenuCols.Level, speech_recognition.SpeechRecognitionTagMenuCols.Sort, speech_recognition.SpeechRecognitionTagMenuCols.SpeechRecognitionTagMenuId)
- tmpList, err := tagMenu.GetItemsByCondition(cond, pars, []string{}, order)
- if err != nil && !utils.IsErrNoRow(err) {
- errMsg = "获取失败"
- err = errors.New("获取数据失败,Err:" + err.Error())
- return
- }
- idMap := make(map[int]struct{})
- if len(tmpList) > 0 {
- for _, v := range tmpList {
- if v.SpeechRecognitionTagMenuId == tagMenu.SpeechRecognitionTagMenuId {
- idMap[v.SpeechRecognitionTagMenuId] = struct{}{}
- }
- }
- for _, v := range tmpList {
- if _, ok := idMap[v.ParentId]; ok {
- idMap[v.SpeechRecognitionTagMenuId] = struct{}{}
- }
- }
- for _, v := range tmpList {
- if _, ok := idMap[v.SpeechRecognitionTagMenuId]; ok {
- targetList = append(targetList, v)
- }
- }
- }
- return
- }
- // GetSpeechTagMenuMaxSort 获取同级下最大的排序
- func GetSpeechTagMenuMaxSort(parentId int) (maxSort int, err error) {
- menuOb := new(speech_recognition.SpeechRecognitionTagMenu)
- tagOb := new(speech_recognition.SpeechRecognitionTag)
- //获取该层级下最大的排序数
- menuMax, err := menuOb.GetMaxSortByParentId(parentId)
- if err != nil {
- return
- }
- maxSort = menuMax
- speechMax, err := tagOb.GetMaxSortByMenuId(parentId)
- if err != nil {
- return
- }
- if maxSort < speechMax {
- maxSort = speechMax
- }
- return
- }
- // ------------------ 移动标签目录/标签 ------------------ //
- // 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
- }
- // GetSpeechRecognitionMenuPathRecursive 根据子目录递归获取目录树
- func GetSpeechRecognitionMenuPathRecursive(list []*speech_recognition.SpeechRecognitionMenu, menuId int) []*speech_recognition.SpeechRecognitionMenuItem {
- res := make([]*speech_recognition.SpeechRecognitionMenuItem, 0)
- for _, v := range list {
- if v.SpeechRecognitionMenuId == menuId {
- t := new(speech_recognition.SpeechRecognitionMenuItem)
- t.UniqueCode = v.UniqueCode
- 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)
- if v.ParentId > 0 {
- res = GetSpeechRecognitionMenuPathRecursive(list, v.ParentId)
- }
- res = append(res, t)
- }
- }
- return res
- }
|