speech_recognition_menu.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. package speech_recognition
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/speech_recognition"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "sort"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. type SpeechRecognitionMenuController struct {
  15. controllers.BaseAuthController
  16. }
  17. // Add
  18. // @Title 新增分类
  19. // @Description 新增分类
  20. // @Param request body speech_recognition.SpeechRecognitionMenuAddReq true "type json string"
  21. // @Success 200 string "操作成功"
  22. // @router /menu/add [post]
  23. func (this *SpeechRecognitionMenuController) Add() {
  24. br := new(models.BaseResponse).Init()
  25. defer func() {
  26. if br.ErrMsg == "" {
  27. br.IsSendEmail = false
  28. }
  29. this.Data["json"] = br
  30. this.ServeJSON()
  31. }()
  32. sysUser := this.SysUser
  33. if sysUser == nil {
  34. br.Msg = "请登录"
  35. br.ErrMsg = "请登录,SysUser Is Empty"
  36. br.Ret = 408
  37. return
  38. }
  39. var req speech_recognition.SpeechRecognitionMenuAddReq
  40. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  41. br.Msg = "参数有误"
  42. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  43. return
  44. }
  45. req.MenuName = strings.TrimSpace(req.MenuName)
  46. if req.MenuName == "" {
  47. br.Msg = "请输入目录名称"
  48. return
  49. }
  50. // 校验同级目录是否有重名
  51. menuOb := new(speech_recognition.SpeechRecognitionMenu)
  52. {
  53. cond := fmt.Sprintf(` AND %s = ? AND %s = ?`, speech_recognition.SpeechRecognitionMenuCols.MenuName, speech_recognition.SpeechRecognitionMenuCols.ParentId)
  54. pars := make([]interface{}, 0)
  55. pars = append(pars, req.MenuName, req.ParentId)
  56. exists, e := menuOb.GetItemByCondition(cond, pars, "")
  57. if e != nil && e.Error() != utils.ErrNoRow() {
  58. br.Msg = "操作失败"
  59. br.ErrMsg = "获取同名目录失败, Err: " + e.Error()
  60. return
  61. }
  62. if exists != nil && exists.SpeechRecognitionMenuId > 0 {
  63. br.Msg = "分类名称已存在,请重新输入"
  64. return
  65. }
  66. }
  67. // 获取目录层级
  68. level := 1
  69. rootId := 0
  70. {
  71. if req.ParentId > 0 {
  72. parentMenu, e := menuOb.GetItemById(req.ParentId)
  73. if e != nil {
  74. br.Msg = "操作失败"
  75. br.ErrMsg = "获取父级目录失败, Err: " + e.Error()
  76. return
  77. }
  78. level += parentMenu.Level
  79. rootId = parentMenu.RootId
  80. }
  81. }
  82. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  83. menuOb.UniqueCode = utils.MD5(fmt.Sprintf("%s_%s", menuOb.TableName(), timestamp))
  84. menuOb.MenuName = req.MenuName
  85. menuOb.ParentId = req.ParentId
  86. menuOb.Level = level
  87. menuOb.RootId = rootId
  88. menuOb.CreateTime = time.Now().Local()
  89. menuOb.ModifyTime = time.Now().Local()
  90. e := menuOb.Create()
  91. if e != nil {
  92. br.Msg = "操作失败"
  93. br.ErrMsg = "新增目录失败, Err: " + e.Error()
  94. return
  95. }
  96. br.Ret = 200
  97. br.Success = true
  98. br.Msg = "操作成功"
  99. }
  100. // Edit
  101. // @Title 编辑分类
  102. // @Description 编辑分类
  103. // @Param request body speech_recognition.SpeechRecognitionMenuEditReq true "type json string"
  104. // @Success 200 string "操作成功"
  105. // @router /menu/edit [post]
  106. func (this *SpeechRecognitionMenuController) Edit() {
  107. br := new(models.BaseResponse).Init()
  108. defer func() {
  109. if br.ErrMsg == "" {
  110. br.IsSendEmail = false
  111. }
  112. this.Data["json"] = br
  113. this.ServeJSON()
  114. }()
  115. sysUser := this.SysUser
  116. if sysUser == nil {
  117. br.Msg = "请登录"
  118. br.ErrMsg = "请登录,SysUser Is Empty"
  119. br.Ret = 408
  120. return
  121. }
  122. var req speech_recognition.SpeechRecognitionMenuEditReq
  123. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  124. br.Msg = "参数有误"
  125. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  126. return
  127. }
  128. if req.MenuId <= 0 {
  129. br.Msg = "参数有误"
  130. br.ErrMsg = fmt.Sprintf("参数有误, MenuId: %d", req.MenuId)
  131. return
  132. }
  133. req.MenuName = strings.TrimSpace(req.MenuName)
  134. if req.MenuName == "" {
  135. br.Msg = "请输入目录名称"
  136. return
  137. }
  138. menuOb := new(speech_recognition.SpeechRecognitionMenu)
  139. menuItem, e := menuOb.GetItemById(req.MenuId)
  140. if e != nil {
  141. if e.Error() == utils.ErrNoRow() {
  142. br.Msg = "目录不存在,请刷新页面"
  143. return
  144. }
  145. br.Msg = "操作失败"
  146. br.ErrMsg = "获取目录失败, Err: " + e.Error()
  147. return
  148. }
  149. // 校验同级目录是否有重名
  150. {
  151. cond := fmt.Sprintf(` AND %s = ? AND %s = ? AND %s <> ?`, speech_recognition.SpeechRecognitionMenuCols.MenuName, speech_recognition.SpeechRecognitionMenuCols.ParentId, speech_recognition.SpeechRecognitionMenuCols.SpeechRecognitionMenuId)
  152. pars := make([]interface{}, 0)
  153. pars = append(pars, req.MenuName, menuItem.ParentId, req.MenuId)
  154. exists, e := menuOb.GetItemByCondition(cond, pars, "")
  155. if e != nil && e.Error() != utils.ErrNoRow() {
  156. br.Msg = "操作失败"
  157. br.ErrMsg = "获取同名目录失败, Err: " + e.Error()
  158. return
  159. }
  160. if exists != nil && exists.SpeechRecognitionMenuId > 0 {
  161. br.Msg = "分类名称已存在,请重新输入"
  162. return
  163. }
  164. }
  165. menuItem.MenuName = req.MenuName
  166. menuItem.ModifyTime = time.Now().Local()
  167. updateCols := []string{speech_recognition.SpeechRecognitionMenuCols.MenuName, speech_recognition.SpeechRecognitionMenuCols.ModifyTime}
  168. if e = menuItem.Update(updateCols); e != nil {
  169. br.Msg = "操作失败"
  170. br.ErrMsg = "更新目录失败, Err: " + e.Error()
  171. return
  172. }
  173. br.Ret = 200
  174. br.Success = true
  175. br.Msg = "操作成功"
  176. }
  177. // Remove
  178. // @Title 删除分类
  179. // @Description 删除分类
  180. // @Param request body speech_recognition.SpeechRecognitionMenuRemoveReq true "type json string"
  181. // @Success 200 string "操作成功"
  182. // @router /menu/remove [post]
  183. func (this *SpeechRecognitionMenuController) Remove() {
  184. br := new(models.BaseResponse).Init()
  185. defer func() {
  186. if br.ErrMsg == "" {
  187. br.IsSendEmail = false
  188. }
  189. this.Data["json"] = br
  190. this.ServeJSON()
  191. }()
  192. sysUser := this.SysUser
  193. if sysUser == nil {
  194. br.Msg = "请登录"
  195. br.ErrMsg = "请登录,SysUser Is Empty"
  196. br.Ret = 408
  197. return
  198. }
  199. var req speech_recognition.SpeechRecognitionMenuRemoveReq
  200. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  201. br.Msg = "参数有误"
  202. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  203. return
  204. }
  205. if req.MenuId <= 0 {
  206. br.Msg = "参数有误"
  207. br.ErrMsg = fmt.Sprintf("参数有误, MenuId: %d", req.MenuId)
  208. return
  209. }
  210. menuOb := new(speech_recognition.SpeechRecognitionMenu)
  211. menuItem, e := menuOb.GetItemById(req.MenuId)
  212. if e != nil {
  213. if e.Error() == utils.ErrNoRow() {
  214. br.Ret = 200
  215. br.Success = true
  216. br.Msg = "操作成功"
  217. return
  218. }
  219. br.Msg = "操作失败"
  220. br.ErrMsg = "获取目录失败, Err: " + e.Error()
  221. return
  222. }
  223. // 校验目录下是否有内容
  224. {
  225. speechOb := new(speech_recognition.SpeechRecognition)
  226. cond := fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionCols.MenuId)
  227. pars := make([]interface{}, 0)
  228. pars = append(pars, req.MenuId)
  229. count, e := speechOb.GetCountByCondition(cond, pars)
  230. if e != nil {
  231. br.Msg = "操作失败"
  232. br.ErrMsg = "获取目录下的语音识别数失败, Err: " + e.Error()
  233. return
  234. }
  235. if count > 0 {
  236. br.Msg = "该分类关联转写文件,删除失败!"
  237. return
  238. }
  239. cond = fmt.Sprintf(` AND %s = ?`, speech_recognition.SpeechRecognitionMenuCols.ParentId)
  240. pars = make([]interface{}, 0)
  241. pars = append(pars, req.MenuId)
  242. count, e = menuOb.GetCountByCondition(cond, pars)
  243. if e != nil {
  244. br.Msg = "操作失败"
  245. br.ErrMsg = "获取下级目录数失败, Err: " + e.Error()
  246. return
  247. }
  248. if count > 0 {
  249. br.Msg = "该分类含下级目录,删除失败!"
  250. return
  251. }
  252. }
  253. if e = menuItem.Del(); e != nil {
  254. br.Msg = "操作失败"
  255. br.ErrMsg = "删除目录失败, Err: " + e.Error()
  256. return
  257. }
  258. br.Ret = 200
  259. br.Success = true
  260. br.Msg = "操作成功"
  261. }
  262. // Tree
  263. // @Title 目录树
  264. // @Description 目录树
  265. // @Param ParentId query int false "父级ID"
  266. // @Success 200 {object} speech_recognition.SpeechRecognitionMenuNodeItem
  267. // @router /menu/tree [get]
  268. func (this *SpeechRecognitionMenuController) Tree() {
  269. br := new(models.BaseResponse).Init()
  270. defer func() {
  271. if br.ErrMsg == "" {
  272. br.IsSendEmail = false
  273. }
  274. this.Data["json"] = br
  275. this.ServeJSON()
  276. }()
  277. sysUser := this.SysUser
  278. if sysUser == nil {
  279. br.Msg = "请登录"
  280. br.ErrMsg = "请登录,SysUser Is Empty"
  281. br.Ret = 408
  282. return
  283. }
  284. // 前端采用懒加载, 所以只查询目录及当前目录下的语音识别
  285. parentId, _ := this.GetInt("ParentId")
  286. // 获取所有目录
  287. menus := make([]*speech_recognition.SpeechRecognitionMenu, 0)
  288. {
  289. menuOb := new(speech_recognition.SpeechRecognitionMenu)
  290. list, e := menuOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", speech_recognition.SpeechRecognitionMenuCols.Sort))
  291. if e != nil {
  292. br.Msg = "获取失败"
  293. br.ErrMsg = "获取目录列表失败, Err: " + e.Error()
  294. return
  295. }
  296. menus = list
  297. }
  298. topMenus := make([]*speech_recognition.SpeechRecognitionMenu, 0) // 顶部节点
  299. menuChildren := make(map[int][]*speech_recognition.SpeechRecognitionMenuNodeItem) // 子目录节点
  300. menuIdLevel := make(map[int]int) // 目录对应层级
  301. for _, v := range menus {
  302. menuIdLevel[v.SpeechRecognitionMenuId] = v.Level
  303. if v.ParentId == parentId {
  304. topMenus = append(topMenus, v)
  305. }
  306. if menuChildren[v.ParentId] == nil {
  307. menuChildren[v.ParentId] = make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
  308. }
  309. menuChildren[v.ParentId] = append(menuChildren[v.ParentId], &speech_recognition.SpeechRecognitionMenuNodeItem{
  310. UniqueCode: v.UniqueCode,
  311. NodeType: speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
  312. MenuId: v.SpeechRecognitionMenuId,
  313. MenuName: v.MenuName,
  314. ParentId: v.ParentId,
  315. Level: v.Level,
  316. Sort: v.Sort,
  317. CreateTime: utils.TimeTransferString(utils.FormatDateTime, v.CreateTime),
  318. })
  319. }
  320. resp := make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
  321. if len(topMenus) == 0 {
  322. br.Data = resp
  323. br.Ret = 200
  324. br.Success = true
  325. br.Msg = "获取成功"
  326. return
  327. }
  328. // 目录下的语音识别
  329. menuIds := make([]int, 0)
  330. for _, m := range topMenus {
  331. menuIds = append(menuIds, m.SpeechRecognitionMenuId)
  332. }
  333. speeches := make([]*speech_recognition.SpeechRecognition, 0)
  334. {
  335. speechOb := new(speech_recognition.SpeechRecognition)
  336. cond := fmt.Sprintf(` AND %s IN (%s)`, speech_recognition.SpeechRecognitionCols.MenuId, utils.GetOrmInReplace(len(menuIds)))
  337. pars := make([]interface{}, 0)
  338. pars = append(pars, menuIds)
  339. list, e := speechOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s DESC", speech_recognition.SpeechRecognitionCols.Sort, speech_recognition.SpeechRecognitionCols.CreateTime))
  340. if e != nil {
  341. br.Msg = "获取失败"
  342. br.ErrMsg = "获取语音识别列表失败, Err: " + e.Error()
  343. return
  344. }
  345. speeches = list
  346. }
  347. menuSpeeches := make(map[int][]*speech_recognition.SpeechRecognitionMenuNodeItem)
  348. for _, s := range speeches {
  349. if menuSpeeches[s.MenuId] == nil {
  350. menuSpeeches[s.MenuId] = make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
  351. }
  352. menuSpeeches[s.MenuId] = append(menuSpeeches[s.MenuId], &speech_recognition.SpeechRecognitionMenuNodeItem{
  353. UniqueCode: s.UniqueCode,
  354. NodeType: speech_recognition.SpeechRecognitionMenuNodeTypeSpeech,
  355. SpeechRecognitionId: s.SpeechRecognitionId,
  356. SpeechRecognitionName: s.FileName,
  357. ParentId: s.MenuId,
  358. Level: menuIdLevel[s.MenuId] + 1,
  359. Sort: s.Sort,
  360. CreateTime: utils.TimeTransferString(utils.FormatDateTime, s.CreateTime),
  361. })
  362. }
  363. for _, m := range topMenus {
  364. child := make([]*speech_recognition.SpeechRecognitionMenuNodeItem, 0)
  365. if menuSpeeches[m.SpeechRecognitionMenuId] != nil {
  366. child = append(child, menuSpeeches[m.SpeechRecognitionMenuId]...)
  367. }
  368. if menuChildren[m.SpeechRecognitionMenuId] != nil {
  369. child = append(child, menuChildren[m.SpeechRecognitionMenuId]...)
  370. }
  371. sort.Slice(child, func(i, j int) bool {
  372. return child[i].Sort < child[j].Sort
  373. })
  374. t := &speech_recognition.SpeechRecognitionMenuNodeItem{
  375. UniqueCode: m.UniqueCode,
  376. NodeType: speech_recognition.SpeechRecognitionMenuNodeTypeDefault,
  377. MenuId: m.SpeechRecognitionMenuId,
  378. MenuName: m.MenuName,
  379. ParentId: m.ParentId,
  380. Level: m.Level,
  381. Sort: m.Sort,
  382. CreateTime: utils.TimeTransferString(utils.FormatDateTime, m.CreateTime),
  383. Children: child,
  384. }
  385. resp = append(resp, t)
  386. }
  387. br.Data = resp
  388. br.Ret = 200
  389. br.Success = true
  390. br.Msg = "获取成功"
  391. }
  392. // Move
  393. // @Title 移动目录/语音识别
  394. // @Description 移动目录/语音识别
  395. // @Param request body speech_recognition.SpeechRecognitionMenuMoveReq true "type json string"
  396. // @Success 200 string "操作成功"
  397. // @router /move [post]
  398. func (this *SpeechRecognitionMenuController) Move() {
  399. br := new(models.BaseResponse).Init()
  400. defer func() {
  401. if br.ErrMsg == "" {
  402. br.IsSendEmail = false
  403. }
  404. this.Data["json"] = br
  405. this.ServeJSON()
  406. }()
  407. sysUser := this.SysUser
  408. if sysUser == nil {
  409. br.Msg = "请登录"
  410. br.ErrMsg = "请登录,SysUser Is Empty"
  411. br.Ret = 408
  412. return
  413. }
  414. var req speech_recognition.SpeechRecognitionMenuMoveReq
  415. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  416. br.Msg = "参数有误"
  417. br.ErrMsg = "参数解析失败, Err: " + e.Error()
  418. return
  419. }
  420. if req.MenuId <= 0 && req.SpeechId <= 0 {
  421. br.Msg = "请选择目录或语音识别"
  422. return
  423. }
  424. // TODO:移动
  425. br.Ret = 200
  426. br.Success = true
  427. br.Msg = "操作成功"
  428. }