english_classify.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package services
  2. import (
  3. "eta/eta_api/models"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "time"
  7. )
  8. // MoveEnglishReportClassify 移动分类
  9. func MoveEnglishReportClassify(req models.EnglishClassifyMoveReq) (err error, errMsg string) {
  10. classifyId := req.ClassifyId
  11. prevClassifyId := req.PrevClassifyId
  12. nextClassifyId := req.NextClassifyId
  13. //如果有传入 上一个兄弟节点分类id
  14. var (
  15. classifyInfo *models.EnglishClassify
  16. prevClassify *models.EnglishClassify
  17. nextClassify *models.EnglishClassify
  18. prevSort int
  19. nextSort int
  20. )
  21. // 移动对象为分类, 判断权限
  22. classifyInfo, err = models.GetEnglishReportClassifyById(classifyId)
  23. if err != nil {
  24. if err.Error() == utils.ErrNoRow() {
  25. errMsg = "分类不存在, 请刷新页面"
  26. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  27. return
  28. }
  29. errMsg = "移动失败"
  30. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  31. return
  32. } else if classifyInfo.Id == 0 {
  33. errMsg = "分类不存在, 请刷新页面"
  34. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  35. return
  36. }
  37. parentClassifyId := classifyInfo.ParentId
  38. if prevClassifyId > 0 {
  39. prevClassify, err = models.GetEnglishReportClassifyById(prevClassifyId)
  40. if err != nil {
  41. if err.Error() == utils.ErrNoRow() {
  42. errMsg = "上一个分类不存在, 请刷新页面"
  43. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  44. return
  45. }
  46. errMsg = "移动失败"
  47. err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  48. return
  49. }
  50. prevSort = prevClassify.Sort
  51. }
  52. if nextClassifyId > 0 {
  53. //下一个兄弟节点
  54. nextClassify, err = models.GetEnglishReportClassifyById(nextClassifyId)
  55. if err != nil {
  56. if err.Error() == utils.ErrNoRow() {
  57. errMsg = "下一个分类不存在, 请刷新页面"
  58. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  59. return
  60. }
  61. errMsg = "移动失败"
  62. err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  63. return
  64. }
  65. nextSort = nextClassify.Sort
  66. }
  67. err, errMsg = moveEnglishReportClassify(classifyInfo, prevClassify, nextClassify, parentClassifyId, prevSort, nextSort)
  68. return
  69. }
  70. // moveEnglishReportClassify 移动分类
  71. func moveEnglishReportClassify(classifyInfo, prevClassify, nextClassify *models.EnglishClassify, parentId, prevSort, nextSort int) (err error, errMsg string) {
  72. ob := new(models.EnglishClassify)
  73. updateCol := make([]string, 0)
  74. //判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
  75. if classifyInfo.ParentId != parentId {
  76. errMsg = "移动失败"
  77. err = fmt.Errorf("不支持目录层级变更")
  78. return
  79. }
  80. if prevSort > 0 {
  81. //如果是移动在两个兄弟节点之间
  82. if nextSort > 0 {
  83. //下一个兄弟节点
  84. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  85. if prevSort == nextSort || prevSort == classifyInfo.Sort {
  86. //变更兄弟节点的排序
  87. updateSortStr := `sort + 2`
  88. //变更分类
  89. if prevClassify != nil {
  90. _ = models.UpdateEnglishClassifySortByParentId(parentId, prevClassify.Id, prevClassify.Sort, updateSortStr)
  91. } else {
  92. _ = models.UpdateEnglishClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
  93. }
  94. } else {
  95. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  96. if nextSort-prevSort == 1 {
  97. //变更兄弟节点的排序
  98. updateSortStr := `sort + 1`
  99. //变更分类
  100. if prevClassify != nil {
  101. _ = models.UpdateEnglishClassifySortByParentId(parentId, prevClassify.Id, prevSort, updateSortStr)
  102. } else {
  103. _ = models.UpdateEnglishClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
  104. }
  105. }
  106. }
  107. }
  108. classifyInfo.Sort = prevSort + 1
  109. classifyInfo.ModifyTime = time.Now()
  110. updateCol = append(updateCol, "Sort", "ModifyTime")
  111. } else if prevClassify == nil && nextClassify == nil && parentId > 0 {
  112. //处理只拖动到目录里,默认放到目录底部的情况
  113. var maxSort int
  114. maxSort, err = ob.GetMaxSortByParentId(parentId)
  115. if err != nil {
  116. errMsg = "移动失败"
  117. err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
  118. return
  119. }
  120. classifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  121. classifyInfo.ModifyTime = time.Now()
  122. updateCol = append(updateCol, "Sort", "ModifyTime")
  123. } else {
  124. // 拖动到父级分类的第一位
  125. firstPermission, tmpErr := ob.GetFirstClassifyByParentId(parentId)
  126. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  127. errMsg = "移动失败"
  128. err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  129. return
  130. }
  131. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  132. if firstPermission != nil && firstPermission.Id != 0 && firstPermission.Sort == 0 {
  133. updateSortStr := ` sort + 1 `
  134. _ = models.UpdateEnglishClassifySortByParentId(parentId, firstPermission.Id-1, 0, updateSortStr)
  135. }
  136. classifyInfo.Sort = 0 //那就是排在第一位
  137. classifyInfo.ModifyTime = time.Now()
  138. updateCol = append(updateCol, "Sort", "ModifyTime")
  139. }
  140. //更新
  141. if len(updateCol) > 0 {
  142. err = classifyInfo.UpdateEnglishClassify(updateCol)
  143. if err != nil {
  144. errMsg = "移动失败"
  145. err = fmt.Errorf("修改失败,Err:" + err.Error())
  146. return
  147. }
  148. }
  149. return
  150. }