common_classify.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. package data
  2. import (
  3. "eta/eta_api/models"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. // CommonClassifyMoveReq 移动分类
  11. type CommonClassifyMoveReq struct {
  12. ClassifyId int `description:"分类ID"`
  13. ParentClassifyId int `description:"父级分类ID"`
  14. PrevClassifyId int `description:"上一个兄弟节点分类ID"`
  15. NextClassifyId int `description:"下一个兄弟节点分类ID"`
  16. ObjectId int `description:"对象ID(指标/图表..), 如果对象ID>0则移动对象, 否则认为移动分类"`
  17. PrevObjectId int `description:"上一个对象ID"`
  18. NextObjectId int `description:"下一个对象ID"`
  19. }
  20. func CommonClassifyMove(req CommonClassifyMoveReq, strategy CommonClassifyStrategy) (tips string, err error) {
  21. ctx := NewCommonClassifyCtx(strategy)
  22. var (
  23. classify *models.CommonClassify
  24. parentClassify *models.CommonClassify
  25. prevClassify *models.CommonClassify
  26. nextClassify *models.CommonClassify
  27. object *models.CommonClassifyObj
  28. prevObject *models.CommonClassifyObj
  29. nextObject *models.CommonClassifyObj
  30. sortPrev int
  31. sortNext int
  32. )
  33. // 获取父级分类
  34. if req.ParentClassifyId > 0 {
  35. c, e := ctx.GetCommonClassifyById(req.ParentClassifyId)
  36. if e != nil {
  37. err = fmt.Errorf("获取上级分类失败, %v", e)
  38. return
  39. }
  40. parentClassify = c
  41. }
  42. // 兄弟节点
  43. if req.PrevClassifyId > 0 {
  44. c, e := ctx.GetCommonClassifyById(req.PrevClassifyId)
  45. if e != nil {
  46. if e.Error() == utils.ErrNoRow() {
  47. tips = "上一个分类不存在, 请刷新页面"
  48. return
  49. }
  50. err = fmt.Errorf("获取上一个分类失败, %v", e)
  51. return
  52. }
  53. prevClassify = c
  54. sortPrev = prevClassify.Sort
  55. } else if req.PrevObjectId > 0 {
  56. obj, e := ctx.GetObjectById(req.PrevObjectId)
  57. if e != nil {
  58. if e.Error() == utils.ErrNoRow() {
  59. tips = "上一个移动对象不存在, 请刷新页面"
  60. return
  61. }
  62. err = fmt.Errorf("获取上一个移动对象失败, %v", e)
  63. return
  64. }
  65. prevObject = obj
  66. sortPrev = prevObject.Sort
  67. }
  68. if req.NextClassifyId > 0 {
  69. c, e := ctx.GetCommonClassifyById(req.NextClassifyId)
  70. if e != nil {
  71. if e.Error() == utils.ErrNoRow() {
  72. tips = "下一个分类不存在, 请刷新页面"
  73. return
  74. }
  75. err = fmt.Errorf("获取下一个分类失败, %v", e)
  76. return
  77. }
  78. nextClassify = c
  79. sortNext = nextClassify.Sort
  80. } else if req.NextObjectId > 0 {
  81. obj, e := ctx.GetObjectById(req.NextObjectId)
  82. if e != nil {
  83. if e.Error() == utils.ErrNoRow() {
  84. tips = "下一个移动对象不存在, 请刷新页面"
  85. return
  86. }
  87. err = fmt.Errorf("获取下一个移动对象失败, %v", e)
  88. return
  89. }
  90. nextObject = obj
  91. sortNext = nextObject.Sort
  92. }
  93. // 移动分类
  94. if req.ObjectId == 0 {
  95. c, e := ctx.GetCommonClassifyById(req.ClassifyId)
  96. if e != nil {
  97. if e.Error() == utils.ErrNoRow() {
  98. tips = "当前分类不存在, 请刷新页面"
  99. return
  100. }
  101. err = fmt.Errorf("获取当前分类失败, %v", e)
  102. return
  103. }
  104. classify = c
  105. return moveCommonClassify(ctx, req, classify, parentClassify, prevClassify, nextClassify, prevObject, nextObject, sortPrev, sortNext)
  106. }
  107. // 移动对象
  108. if req.ObjectId > 0 {
  109. obj, e := ctx.GetObjectById(req.ObjectId)
  110. if e != nil {
  111. if e.Error() == utils.ErrNoRow() {
  112. tips = "移动对象不存在, 请刷新页面"
  113. return
  114. }
  115. err = fmt.Errorf("获取移动对象失败, %v", e)
  116. return
  117. }
  118. if req.ParentClassifyId <= 0 {
  119. tips = "移动对象必须挂在分类下"
  120. return
  121. }
  122. object = obj
  123. // TODO:对象的不同实现, 如指标校验权限
  124. return moveCommonClassifyObj(ctx, req, prevClassify, nextClassify, object, prevObject, nextObject, sortPrev, sortNext)
  125. }
  126. return
  127. }
  128. func moveCommonClassify(ctx *CommonClassifyCtx, req CommonClassifyMoveReq, classify, parentClassify, prevClassify, nextClassify *models.CommonClassify, prevObject, nextObject *models.CommonClassifyObj, sortPrev, sortNext int) (tips string, err error) {
  129. // 校验层级以及父级分类下同名分类
  130. if req.ParentClassifyId > 0 && parentClassify.Level == 6 {
  131. tips = "最高只支持添加6级分类"
  132. return
  133. }
  134. exists, e := ctx.GetClassifyByParentIdAndName(req.ParentClassifyId, classify.ClassifyName, classify.ClassifyId)
  135. if e != nil && e.Error() != utils.ErrNoRow() {
  136. err = fmt.Errorf("获取父级分类下的同名分类失败, %v", e)
  137. return
  138. }
  139. if exists != nil {
  140. tips = "当前父级分类下存在相同名称"
  141. return
  142. }
  143. // TODO:分类的非通用实现, 如指标分类需校验权限, 可以采用适配器模式兼容进来
  144. var classifyChildIds []int
  145. var classifyUpdateCols []string
  146. originParentId := classify.ParentId
  147. originLevel := classify.Level
  148. // 需更新子层级分类ID
  149. if originParentId != req.ParentClassifyId {
  150. // TODO:此处如果要兼容以前的分类表, 那么要提出来处理
  151. levelPathArr := strings.Split(classify.LevelPath, ",")
  152. for _, p := range levelPathArr {
  153. d, _ := strconv.Atoi(p)
  154. if d > 0 {
  155. classifyChildIds = append(classifyChildIds, d)
  156. }
  157. }
  158. }
  159. colsMapping := ctx.GetCommonClassifyCols() // 分类表实际的字段映射
  160. // 判断上级ID是否一致, 不一致的话需要移动该分类层级
  161. if classify.ParentId != req.ParentClassifyId && req.ParentClassifyId != 0 {
  162. if classify.Level != parentClassify.Level+1 { //禁止层级调整
  163. tips = "不支持目录层级变更"
  164. return
  165. }
  166. classify.ParentId = parentClassify.ClassifyId
  167. classify.RootId = parentClassify.RootId
  168. classify.Level = parentClassify.Level + 1
  169. classify.ModifyTime = time.Now()
  170. classifyUpdateCols = append(classifyUpdateCols, colsMapping.ParentId, colsMapping.RootId, colsMapping.Level, colsMapping.ModifyTime)
  171. }
  172. if classify.ParentId != req.ParentClassifyId && req.ParentClassifyId == 0 {
  173. tips = "不支持目录层级变更"
  174. return
  175. }
  176. if sortPrev > 0 {
  177. // 移动至两个兄弟之间
  178. if sortNext > 0 {
  179. // 如果上一个兄弟与下一个兄弟的排序权重是一致的, 那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2, 自己变成上一个兄弟的排序权重+1
  180. if sortPrev == sortNext || sortPrev == classify.Sort {
  181. sortUpdate := `sort + 2`
  182. if prevClassify != nil {
  183. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, sortUpdate); e != nil {
  184. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, sortUpdate, e)
  185. return
  186. }
  187. } else {
  188. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, 0, sortPrev, sortUpdate); e != nil {
  189. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, sortPrev, sortUpdate, e)
  190. return
  191. }
  192. }
  193. if prevObject != nil {
  194. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate); e != nil {
  195. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate, e)
  196. return
  197. }
  198. } else {
  199. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, 0, sortUpdate); e != nil {
  200. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, 0, sortUpdate, e)
  201. return
  202. }
  203. }
  204. } else {
  205. // 如果下一个兄弟的排序权重正好是上个兄弟节点的下一层, 那么需要再加一层
  206. if sortNext-sortPrev == 1 {
  207. sortUpdate := `sort + 1`
  208. if prevClassify != nil {
  209. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, prevClassify.ClassifyId, sortPrev, sortUpdate); e != nil {
  210. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, prevClassify.ClassifyId, sortPrev, sortUpdate, e)
  211. return
  212. }
  213. } else {
  214. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, 0, sortPrev, sortUpdate); e != nil {
  215. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, sortPrev, sortUpdate, e)
  216. return
  217. }
  218. }
  219. if prevObject != nil {
  220. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate); e != nil {
  221. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate, e)
  222. return
  223. }
  224. } else {
  225. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, 0, sortUpdate); e != nil {
  226. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, 0, sortUpdate, e)
  227. return
  228. }
  229. }
  230. }
  231. }
  232. }
  233. classify.Sort = sortPrev + 1
  234. classify.ModifyTime = time.Now()
  235. classifyUpdateCols = append(classifyUpdateCols, colsMapping.Sort, colsMapping.ModifyTime)
  236. } else if prevClassify == nil && nextClassify == nil && prevObject == nil && nextObject == nil && req.ParentClassifyId > 0 {
  237. // 处理只拖动到目录里, 默认放到目录底部的情况
  238. m, e := GetCommonClassifySortMaxByParentId(req.ParentClassifyId, ctx)
  239. if e != nil {
  240. err = fmt.Errorf("GetCommonClassifySortMaxByParentId, %v", e)
  241. return
  242. }
  243. classify.Sort = m + 1
  244. classify.ModifyTime = time.Now()
  245. classifyUpdateCols = append(classifyUpdateCols, colsMapping.Sort, colsMapping.ModifyTime)
  246. } else {
  247. // 拖动到父级分类的第一位
  248. firstClassify, e := ctx.GetFirstClassifyByParentId(req.ParentClassifyId)
  249. if e != nil && e.Error() != utils.ErrNoRow() {
  250. //tips = "移动失败"
  251. err = fmt.Errorf("GetFirstClassifyByParentId, %v", e)
  252. return
  253. }
  254. // 如果该分类下存在其他分类, 且第一个其他分类的排序等于0, 那么需要调整排序
  255. if firstClassify != nil && firstClassify.Sort == 0 {
  256. sortUpdate := ` sort + 1 `
  257. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, firstClassify.ClassifyId-1, 0, sortUpdate); e != nil {
  258. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, firstClassify.ClassifyId-1, 0, sortUpdate, e)
  259. return
  260. }
  261. // 该分类下的所有指标也需要+1
  262. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, 0, 0, sortUpdate); e != nil {
  263. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, 0, sortUpdate, e)
  264. return
  265. }
  266. } else {
  267. // 如果该分类下存在指标, 且第一个指标的排序等于0, 那么需要调整排序
  268. firstObject, e := ctx.GetFirstObjectByClassifyId(req.ParentClassifyId)
  269. if e != nil && e.Error() != utils.ErrNoRow() {
  270. err = fmt.Errorf("GetFirstObjectByClassifyId, %v", e)
  271. return
  272. }
  273. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  274. if firstObject != nil && firstObject.Sort == 0 {
  275. sortUpdate := ` sort + 1 `
  276. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, 0, firstObject.ObjectId-1, sortUpdate); e != nil {
  277. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, firstObject.ObjectId-1, sortUpdate, e)
  278. return
  279. }
  280. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, 0, 0, sortUpdate); e != nil {
  281. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, 0, sortUpdate, e)
  282. return
  283. }
  284. }
  285. }
  286. classify.Sort = 0 // 那就是排在第一位
  287. classify.ModifyTime = time.Now()
  288. classifyUpdateCols = append(classifyUpdateCols, colsMapping.Sort, colsMapping.ModifyTime)
  289. }
  290. // 更新分类
  291. if len(classifyUpdateCols) > 0 {
  292. if e = ctx.UpdateCommonClassify(classify, classifyUpdateCols); e != nil {
  293. err = fmt.Errorf("UpdateCommonClassify, %v", e)
  294. return
  295. }
  296. // 更新对应分类的root_id和层级
  297. if originParentId != req.ParentClassifyId {
  298. if len(classifyChildIds) > 0 {
  299. stepLevel := classify.Level - originLevel
  300. if e = ctx.UpdateClassifyChildByParentId(classifyChildIds, classify.RootId, stepLevel); e != nil {
  301. err = fmt.Errorf("UpdateClassifyChildByParentId, parentId: %d, classifyId: %d, stepLevel: %d, err: %v", req.ParentClassifyId, classify.ClassifyId, stepLevel, e)
  302. return
  303. }
  304. }
  305. }
  306. }
  307. return
  308. }
  309. func moveCommonClassifyObj(ctx *CommonClassifyCtx, req CommonClassifyMoveReq, prevClassify, nextClassify *models.CommonClassify, object, prevObject, nextObject *models.CommonClassifyObj, sortPrev, sortNext int) (tips string, err error) {
  310. var objUpdateCols []string
  311. colsMapping := ctx.GetCommonClassifyObjCols() // 分类对象表实际的字段映射
  312. // 分类变更的情况
  313. if object.ClassifyId != req.ParentClassifyId {
  314. object.ClassifyId = req.ParentClassifyId
  315. object.ModifyTime = time.Now()
  316. objUpdateCols = append(objUpdateCols, colsMapping.ClassifyId, colsMapping.ModifyTime)
  317. }
  318. if sortPrev > 0 {
  319. // 移动至两个兄弟之间
  320. if sortNext > 0 {
  321. // 如果上一个兄弟与下一个兄弟的排序权重是一致的, 那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2, 自己变成上一个兄弟的排序权重+1
  322. if sortPrev == sortNext || sortPrev == object.Sort {
  323. sortUpdate := `sort + 2`
  324. if prevClassify != nil {
  325. if e := ctx.SetClassifySortByParentId(req.ParentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, sortUpdate); e != nil {
  326. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, sortUpdate, e)
  327. return
  328. }
  329. } else {
  330. if e := ctx.SetClassifySortByParentId(req.ParentClassifyId, 0, sortPrev, sortUpdate); e != nil {
  331. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, sortPrev, sortUpdate, e)
  332. return
  333. }
  334. }
  335. if prevObject != nil {
  336. if e := ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate); e != nil {
  337. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate, e)
  338. return
  339. }
  340. } else {
  341. if e := ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, 0, sortUpdate); e != nil {
  342. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, 0, sortUpdate, e)
  343. return
  344. }
  345. }
  346. } else {
  347. // 如果下一个兄弟的排序权重正好是上个兄弟节点的下一层, 那么需要再加一层
  348. if sortNext-sortPrev == 1 {
  349. sortUpdate := `sort + 1`
  350. if prevClassify != nil {
  351. if e := ctx.SetClassifySortByParentId(req.ParentClassifyId, prevClassify.ClassifyId, sortPrev, sortUpdate); e != nil {
  352. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, prevClassify.ClassifyId, sortPrev, sortUpdate, e)
  353. return
  354. }
  355. } else {
  356. if e := ctx.SetClassifySortByParentId(req.ParentClassifyId, 0, sortPrev, sortUpdate); e != nil {
  357. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, sortPrev, sortUpdate, e)
  358. return
  359. }
  360. }
  361. if prevObject != nil {
  362. if e := ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate); e != nil {
  363. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, prevObject.ObjectId, sortUpdate, e)
  364. return
  365. }
  366. } else {
  367. if e := ctx.SetObjectSortByClassifyId(req.ParentClassifyId, sortPrev, 0, sortUpdate); e != nil {
  368. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, sortPrev, 0, sortUpdate, e)
  369. return
  370. }
  371. }
  372. }
  373. }
  374. }
  375. object.Sort = sortPrev + 1
  376. object.ModifyTime = time.Now()
  377. objUpdateCols = append(objUpdateCols, colsMapping.Sort, colsMapping.ModifyTime)
  378. } else if prevClassify == nil && nextClassify == nil && prevObject == nil && nextObject == nil && req.ParentClassifyId > 0 {
  379. // 处理只拖动到目录里, 默认放到目录底部的情况
  380. m, e := GetCommonClassifySortMaxByParentId(req.ParentClassifyId, ctx)
  381. if e != nil {
  382. err = fmt.Errorf("GetCommonClassifySortMaxByParentId, %v", e)
  383. return
  384. }
  385. object.Sort = m + 1 //那就是排在组内最后一位
  386. object.ModifyTime = time.Now()
  387. objUpdateCols = append(objUpdateCols, colsMapping.Sort, colsMapping.ModifyTime)
  388. } else {
  389. // 拖动到父级分类的第一位
  390. firstClassify, e := ctx.GetFirstClassifyByParentId(req.ParentClassifyId)
  391. if e != nil && e.Error() != utils.ErrNoRow() {
  392. err = fmt.Errorf("GetFirstClassifyByParentId, %v", e)
  393. return
  394. }
  395. // 如果该分类下存在其他分类, 且第一个其他分类的排序等于0, 那么需要调整排序
  396. if firstClassify != nil && firstClassify.Sort == 0 {
  397. sortUpdate := ` sort + 1 `
  398. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, firstClassify.ClassifyId-1, 0, sortUpdate); e != nil {
  399. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, firstClassify.ClassifyId-1, 0, sortUpdate, e)
  400. return
  401. }
  402. // 该分类下的所有指标也需要+1
  403. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, 0, 0, sortUpdate); e != nil {
  404. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, 0, sortUpdate, e)
  405. return
  406. }
  407. } else {
  408. // 如果该分类下存在对象, 且第一个对象的排序等于0, 那么需要调整排序
  409. firstObject, e := ctx.GetFirstObjectByClassifyId(req.ParentClassifyId)
  410. if e != nil && e.Error() != utils.ErrNoRow() {
  411. err = fmt.Errorf("GetFirstObjectByClassifyId, %v", e)
  412. return
  413. }
  414. // 如果该分类下存在其他分类, 且第一个其他分类的排序等于0, 那么需要调整排序
  415. if firstObject != nil && firstObject.Sort == 0 {
  416. sortUpdate := ` sort + 1 `
  417. if e = ctx.SetObjectSortByClassifyId(req.ParentClassifyId, 0, firstObject.ObjectId-1, sortUpdate); e != nil {
  418. err = fmt.Errorf("SetObjectSortByClassifyId, classifyId: %d, sort: %d, objectId: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, firstObject.ObjectId-1, sortUpdate, e)
  419. return
  420. }
  421. if e = ctx.SetClassifySortByParentId(req.ParentClassifyId, 0, 0, sortUpdate); e != nil {
  422. err = fmt.Errorf("SetClassifySortByParentId, parentId: %d, classifyId: %d, sort: %d, sortUpdate: %s, err: %v", req.ParentClassifyId, 0, 0, sortUpdate, e)
  423. return
  424. }
  425. }
  426. }
  427. object.Sort = 0 // 那就是排在第一位
  428. object.ModifyTime = time.Now()
  429. objUpdateCols = append(objUpdateCols, colsMapping.Sort, colsMapping.ModifyTime)
  430. }
  431. // 更新分类对象
  432. if len(objUpdateCols) > 0 {
  433. if e := ctx.UpdateCommonClassifyObj(object, objUpdateCols); e != nil {
  434. err = fmt.Errorf("UpdateCommonClassifyObj, %v", e)
  435. return
  436. }
  437. }
  438. return
  439. }
  440. // GetCommonClassifySortMaxByParentId 获取分类下最大排序
  441. func GetCommonClassifySortMaxByParentId(parentId int, ctx *CommonClassifyCtx) (sortMax int, err error) {
  442. // 比对分类和对象的最大排序
  443. classifyMax, e := ctx.GetClassifySortMaxByParentId(parentId)
  444. if e != nil {
  445. err = fmt.Errorf("GetClassifySortMaxByParentId, %v", e)
  446. return
  447. }
  448. sortMax = classifyMax
  449. objectMax, e := ctx.GetObjectSortMaxByClassifyId(parentId)
  450. if e != nil {
  451. err = fmt.Errorf("GetObjectSortMaxByClassifyId, %v", e)
  452. return
  453. }
  454. if sortMax < objectMax {
  455. sortMax = objectMax
  456. }
  457. return
  458. }