classify.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. package services
  2. import (
  3. "errors"
  4. "eta/eta_api/models"
  5. "eta/eta_api/utils"
  6. "fmt"
  7. "sort"
  8. "time"
  9. )
  10. // MoveReportClassify 移动分类
  11. func MoveReportClassify(req models.ClassifyMoveReq) (err error, errMsg string) {
  12. classifyId := req.ClassifyId
  13. prevClassifyId := req.PrevClassifyId
  14. nextClassifyId := req.NextClassifyId
  15. //如果有传入 上一个兄弟节点分类id
  16. var (
  17. classifyInfo *models.Classify
  18. prevClassify *models.Classify
  19. nextClassify *models.Classify
  20. prevSort int
  21. nextSort int
  22. )
  23. // 移动对象为分类, 判断权限
  24. classifyInfo, err = models.GetClassifyById(classifyId)
  25. if err != nil {
  26. if err.Error() == utils.ErrNoRow() {
  27. errMsg = "分类不存在, 请刷新页面"
  28. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  29. return
  30. }
  31. errMsg = "移动失败"
  32. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  33. return
  34. } else if classifyInfo.Id == 0 {
  35. errMsg = "分类不存在, 请刷新页面"
  36. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  37. return
  38. }
  39. parentClassifyId := classifyInfo.ParentId
  40. if prevClassifyId > 0 {
  41. prevClassify, err = models.GetClassifyById(prevClassifyId)
  42. if err != nil {
  43. if err.Error() == utils.ErrNoRow() {
  44. errMsg = "上一个分类不存在, 请刷新页面"
  45. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  46. return
  47. }
  48. errMsg = "移动失败"
  49. err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  50. return
  51. }
  52. if prevClassify.ParentId != parentClassifyId {
  53. errMsg = "禁止拖动到其他节点"
  54. err = fmt.Errorf(errMsg)
  55. return
  56. }
  57. prevSort = prevClassify.Sort
  58. }
  59. if nextClassifyId > 0 {
  60. //下一个兄弟节点
  61. nextClassify, err = models.GetClassifyById(nextClassifyId)
  62. if err != nil {
  63. if err.Error() == utils.ErrNoRow() {
  64. errMsg = "下一个分类不存在, 请刷新页面"
  65. err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
  66. return
  67. }
  68. errMsg = "移动失败"
  69. err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  70. return
  71. }
  72. if nextClassify.ParentId != parentClassifyId {
  73. errMsg = "禁止拖动到其他节点"
  74. err = fmt.Errorf(errMsg)
  75. return
  76. }
  77. nextSort = nextClassify.Sort
  78. }
  79. err, errMsg = moveReportClassify(classifyInfo, prevClassify, nextClassify, parentClassifyId, prevSort, nextSort)
  80. return
  81. }
  82. // moveReportClassify 移动分类
  83. func moveReportClassify(classifyInfo, prevClassify, nextClassify *models.Classify, parentId, prevSort, nextSort int) (err error, errMsg string) {
  84. ob := new(models.Classify)
  85. updateCol := make([]string, 0)
  86. //判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
  87. if classifyInfo.ParentId != parentId {
  88. errMsg = "移动失败"
  89. err = fmt.Errorf("不支持目录层级变更")
  90. return
  91. }
  92. if prevSort > 0 {
  93. //如果是移动在两个兄弟节点之间
  94. if nextSort > 0 {
  95. //下一个兄弟节点
  96. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  97. if prevSort == nextSort || prevSort == classifyInfo.Sort {
  98. //变更兄弟节点的排序
  99. updateSortStr := `sort + 2`
  100. //变更分类
  101. if prevClassify != nil {
  102. _ = models.UpdateClassifySortByParentId(parentId, prevClassify.Id, prevClassify.Sort, updateSortStr)
  103. } else {
  104. _ = models.UpdateClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
  105. }
  106. } else {
  107. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  108. if nextSort-prevSort == 1 {
  109. //变更兄弟节点的排序
  110. updateSortStr := `sort + 1`
  111. //变更分类
  112. if prevClassify != nil {
  113. _ = models.UpdateClassifySortByParentId(parentId, prevClassify.Id, prevSort, updateSortStr)
  114. } else {
  115. _ = models.UpdateClassifySortByParentId(parentId, 0, prevSort, updateSortStr)
  116. }
  117. }
  118. }
  119. }
  120. classifyInfo.Sort = prevSort + 1
  121. classifyInfo.ModifyTime = time.Now()
  122. updateCol = append(updateCol, "Sort", "ModifyTime")
  123. } else if prevClassify == nil && nextClassify == nil && parentId > 0 {
  124. //处理只拖动到目录里,默认放到目录底部的情况
  125. var maxSort int
  126. maxSort, err = ob.GetMaxSortByParentId(parentId)
  127. if err != nil {
  128. errMsg = "移动失败"
  129. err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
  130. return
  131. }
  132. classifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  133. classifyInfo.ModifyTime = time.Now()
  134. updateCol = append(updateCol, "Sort", "ModifyTime")
  135. } else {
  136. // 拖动到父级分类的第一位
  137. firstPermission, tmpErr := ob.GetFirstClassifyByParentId(parentId)
  138. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  139. errMsg = "移动失败"
  140. err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  141. return
  142. }
  143. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  144. if firstPermission != nil && firstPermission.Id != 0 && firstPermission.Sort == 0 {
  145. updateSortStr := ` sort + 1 `
  146. _ = models.UpdateClassifySortByParentId(parentId, firstPermission.Id-1, 0, updateSortStr)
  147. }
  148. classifyInfo.Sort = 0 //那就是排在第一位
  149. classifyInfo.ModifyTime = time.Now()
  150. updateCol = append(updateCol, "Sort", "ModifyTime")
  151. }
  152. //更新
  153. if len(updateCol) > 0 {
  154. err = classifyInfo.UpdateClassify(updateCol)
  155. if err != nil {
  156. errMsg = "移动失败"
  157. err = fmt.Errorf("修改失败,Err:" + err.Error())
  158. return
  159. }
  160. }
  161. return
  162. }
  163. // AddReportClassify
  164. // @Description: 添加报告分类
  165. // @author: Roc
  166. // @datetime 2024-06-17 11:01:21
  167. // @param classifyName string
  168. // @param parentId int
  169. // @param chartPermissionIdList []int
  170. // @return err error
  171. // @return errMsg string
  172. // @return isSendEmail bool
  173. func AddReportClassify(classifyName string, parentId int, chartPermissionIdList []int) (err error, errMsg string, isSendEmail bool) {
  174. isSendEmail = true
  175. errMsg = `添加失败`
  176. item, err := models.GetClassifyByName(classifyName, parentId)
  177. if err != nil && err.Error() != utils.ErrNoRow() {
  178. errMsg = "获取分类信息失败"
  179. if err.Error() == utils.ErrNoRow() {
  180. errMsg = "分类名称:" + classifyName + "已存在"
  181. isSendEmail = false
  182. }
  183. return
  184. }
  185. if item != nil {
  186. errMsg = "分类名称:" + classifyName + "已存在"
  187. isSendEmail = false
  188. err = errors.New(errMsg)
  189. return
  190. }
  191. level := 1
  192. // 父级分类
  193. var parentClassifyItem *models.Classify
  194. // 父级分类下的子分类数量
  195. var childClassifyCount int
  196. if parentId > 0 {
  197. // 获取父级分类信息
  198. parentClassifyItem, err = models.GetClassifyById(parentId)
  199. if err != nil {
  200. errMsg = "获取父级分类信息失败"
  201. if err.Error() == utils.ErrNoRow() {
  202. errMsg = "父级分类不存在"
  203. }
  204. return
  205. }
  206. level = parentClassifyItem.Level + 1
  207. if level > 3 {
  208. errMsg = "分类层级不可超过三级"
  209. isSendEmail = false
  210. return
  211. }
  212. // 获取父级分类下的子分类数量
  213. childClassifyCount, err = models.GetCountClassifyChildByParentId(parentId)
  214. if err != nil {
  215. errMsg = "获取父级分类的子分类信息失败"
  216. return
  217. }
  218. }
  219. nowTime := time.Now().Local()
  220. classify := new(models.Classify)
  221. maxSort, err := classify.GetMaxSort()
  222. if err != nil {
  223. errMsg = "操作失败"
  224. err = errors.New("查询品种排序失败, Err: " + err.Error())
  225. return
  226. }
  227. classify.ClassifyName = classifyName
  228. classify.ParentId = parentId
  229. classify.CreateTime = nowTime
  230. classify.ModifyTime = nowTime
  231. classify.Sort = maxSort + 1
  232. classify.Enabled = 1
  233. classify.ShowType = 1 //默认列表格式
  234. classify.IsShow = 1
  235. classify.Level = level
  236. /*classify.Abstract = req.Abstract
  237. classify.Descript = req.Descript
  238. classify.Abstract = req.Abstract
  239. classify.Descript = req.Descript
  240. classify.ReportAuthor = req.ReportAuthor
  241. classify.AuthorDescript = req.AuthorDescript
  242. classify.ColumnImgUrl = req.ColumnImgUrl
  243. classify.ReportImgUrl = req.ReportImgUrl
  244. classify.HeadImgUrl = req.HeadImgUrl
  245. classify.AvatarImgUrl = req.AvatarImgUrl
  246. classify.HomeImgUrl = req.HomeImgUrl
  247. classify.ClassifyLabel = req.ClassifyLabel
  248. classify.ShowType = req.ShowType
  249. classify.HasTeleconference = req.HasTeleconference
  250. classify.VipTitle = req.VipTitle
  251. classify.IsShow = req.IsShow
  252. classify.YbFiccSort = req.YbFiccSort
  253. classify.YbFiccIcon = req.YbFiccIcon
  254. classify.YbFiccPcIcon = req.YbFiccPcIcon
  255. classify.YbIconUrl = req.YbIconUrl
  256. classify.YbBgUrl = req.YbBgUrl
  257. classify.YbListImg = req.YbListImg
  258. classify.YbShareBgImg = req.YbShareBgImg
  259. classify.YbRightBanner = req.YbRightBanner
  260. classify.RelateTel = req.RelateTel
  261. classify.RelateVideo = req.RelateVideo
  262. if req.ParentId > 0 {
  263. parentClassify := new(models.Classify)
  264. if parentClassify, err = models.GetClassifyById(req.ParentId); err != nil {
  265. br.Msg = "获取父级分类信息失败"
  266. br.ErrMsg = "获取父级分类信息失败, Err:" + err.Error()
  267. return
  268. }
  269. updateParent := false
  270. updateCols := make([]string, 0)
  271. updateCols = append(updateCols, "HasTeleconference")
  272. if req.HasTeleconference == 1 {
  273. // 二级分类包含电话会,则一级分类也默认包含电话会
  274. if parentClassify.HasTeleconference == 0 {
  275. parentClassify.HasTeleconference = 1
  276. updateParent = true
  277. }
  278. } else {
  279. // 二级分类均无电话会,则一级分类也无电话会
  280. if parentClassify.HasTeleconference == 1 {
  281. child, err := models.GetClassifyChild(parentClassify.Id, "")
  282. if err != nil {
  283. br.Msg = "获取子分类失败"
  284. br.ErrMsg = "获取子分类失败,Err:" + err.Error()
  285. return
  286. }
  287. // 存在同一级分类下的二级分类有电话会则不变动
  288. hasTel := false
  289. for i := 0; i < len(child); i++ {
  290. if child[i].HasTeleconference == 1 {
  291. hasTel = true
  292. break
  293. }
  294. }
  295. if !hasTel {
  296. parentClassify.HasTeleconference = 0
  297. updateParent = true
  298. }
  299. }
  300. }
  301. if updateParent {
  302. if err = parentClassify.UpdateClassify(updateCols); err != nil {
  303. br.Msg = "更新父级分类失败"
  304. br.ErrMsg = "更新父级分类失败, Err:" + err.Error()
  305. return
  306. }
  307. }
  308. }*/
  309. err = models.AddClassify(classify)
  310. if err != nil {
  311. return
  312. }
  313. //获取报告分类权限列表
  314. err = models.EditChartPermissionSearchKeyWordMappingMulti(classifyName, chartPermissionIdList, classify.Id)
  315. if err != nil {
  316. errMsg = "修改分类权限失败"
  317. return
  318. }
  319. // 修改CRM权限
  320. go func() {
  321. _ = EditClassifyChartPermissionSync(classifyName, classify.Id)
  322. }()
  323. // 如果父级分类不为空的话,那么就标记有子级分类,同时
  324. if parentClassifyItem != nil {
  325. parentClassifyItem.HasChild = 1
  326. parentClassifyItem.UpdateClassify([]string{"HasChild"})
  327. // 如果以前没有子级分类,那么就继承父级分类下的章节类型(创建新的章节与分类的关系)
  328. if childClassifyCount <= 0 {
  329. // 继承父级分类下的章节类型(创建新的章节与分类的关系)
  330. tmpErr := inheritReportChapterType(parentId, classify.Id)
  331. if tmpErr != nil {
  332. return
  333. }
  334. moveReportByAddClassify(parentClassifyItem, classify)
  335. }
  336. }
  337. return
  338. }
  339. // 关于研报分类,因只允许报告或品种关联在最小分类下,所以当某个父分类(非三级分类)已关联报告或品种,需要在该父分类下增加子分类,则第一个子分类添加成功时,默认把该父分类关联的品种和报告转移至新创建的子分类(第一个子分类)下
  340. // moveReportByAddClassify
  341. // @Description: 报告和章节的转移
  342. // @author: Roc
  343. // @datetime 2024-06-17 16:29:56
  344. // @param parentClassifyInfo *models.Classify
  345. // @param currClassifyInfo *models.Classify
  346. // @return err error
  347. func moveReportByAddClassify(parentClassifyInfo, currClassifyInfo *models.Classify) (err error) {
  348. defer func() {
  349. if err != nil {
  350. utils.FileLog.Error(fmt.Sprint("历史报告更改分类失败,父级分类ID:", parentClassifyInfo.Id, ";当前分类ID:", currClassifyInfo.Id, ";错误信息:", err.Error()))
  351. }
  352. }()
  353. if currClassifyInfo.Level > 3 {
  354. err = errors.New("父级分类不支持三级分类以上")
  355. return
  356. }
  357. // 报告的分类归属调整,转为下一级的分类
  358. var condition, updateStr string
  359. pars := make([]interface{}, 0)
  360. switch currClassifyInfo.Level {
  361. case 3: // 当前分类是3级分类
  362. updateStr += ` classify_id_third = ?,classify_name_third = ?`
  363. condition += ` AND classify_id_second = ? `
  364. case 2: // 当前分类是2级分类
  365. updateStr += ` classify_id_second = ?,classify_name_second = ?`
  366. condition += ` AND classify_id_first = ? `
  367. default:
  368. err = errors.New("错误的分类层级")
  369. return
  370. }
  371. pars = append(pars, currClassifyInfo.Id, currClassifyInfo.ClassifyName, parentClassifyInfo.Id)
  372. // 获取当前分类下的所有章节类型
  373. currReportChapterTypeList, err := models.GetAllReportChapterTypeListByClassifyId(currClassifyInfo.Id)
  374. if err != nil {
  375. return
  376. }
  377. // 当前的章节类型ID ---> 继承的章节类型ID
  378. chapterTypeIdMap := make(map[int]int)
  379. for _, v := range currReportChapterTypeList {
  380. chapterTypeIdMap[v.ReportChapterTypeId] = v.InheritReportChapterTypeId
  381. }
  382. // 报告转移后,历史章节报告中的type_id也要修复成最新的type_id
  383. err = models.ModifyReportClassifyAndReportChapterTypeByCondition(condition, pars, updateStr, chapterTypeIdMap, parentClassifyInfo.Id, currClassifyInfo.Id, currClassifyInfo.ClassifyName)
  384. if err != nil {
  385. return
  386. }
  387. return
  388. }
  389. // inheritReportChapterType
  390. // @Description: 继承父级分类下的章节类型
  391. // @author: Roc
  392. // @datetime 2024-06-17 14:41:04
  393. // @param parentClassifyId int
  394. // @param currClassifyId int
  395. // @return err error
  396. func inheritReportChapterType(parentClassifyId, currClassifyId int) (err error) {
  397. defer func() {
  398. if err != nil {
  399. utils.FileLog.Error(fmt.Sprint("继承父级分类下的章节类型失败,父级分类ID:", parentClassifyId, ";当前分类ID:", currClassifyId, ";错误信息:", err.Error()))
  400. }
  401. }()
  402. parentReportChapterTypeList, err := models.GetAllReportChapterTypeListByClassifyId(parentClassifyId)
  403. if err != nil {
  404. return
  405. }
  406. // 如果没有章节类型,那么就直接返回
  407. if len(parentReportChapterTypeList) <= 0 {
  408. return
  409. }
  410. addList := make([]*models.ReportChapterType, 0)
  411. for _, v := range parentReportChapterTypeList {
  412. addList = append(addList, &models.ReportChapterType{
  413. //ReportChapterTypeId: 0,
  414. ReportChapterTypeKey: v.ReportChapterTypeKey,
  415. ReportChapterTypeThumb: v.ReportChapterTypeThumb,
  416. BannerUrl: v.BannerUrl,
  417. ReportChapterTypeName: v.ReportChapterTypeName,
  418. Sort: v.Sort,
  419. Enabled: v.Enabled,
  420. CreatedTime: time.Now(),
  421. LastUpdatedTime: time.Now(),
  422. ResearchType: v.ResearchType,
  423. SelectedImage: v.SelectedImage,
  424. UnselectedImage: v.UnselectedImage,
  425. PcSelectedImage: v.PcSelectedImage,
  426. PcUnselectedImage: v.PcUnselectedImage,
  427. EditImgUrl: v.EditImgUrl,
  428. TickerTitle: v.TickerTitle,
  429. IsShow: v.IsShow,
  430. PauseStartTime: v.PauseStartTime,
  431. PauseEndTime: v.PauseEndTime,
  432. IsSet: v.IsSet,
  433. YbIconUrl: v.YbIconUrl,
  434. YbBottomIcon: v.YbBottomIcon,
  435. ReportClassifyId: currClassifyId,
  436. InheritReportChapterTypeId: v.ReportChapterTypeId,
  437. })
  438. }
  439. obj := models.ReportChapterType{}
  440. err = obj.MultiCreate(addList)
  441. return
  442. }
  443. // EditReportClassify
  444. // @Description: 编辑报告分类
  445. // @author: Roc
  446. // @datetime 2024-06-17 13:31:33
  447. // @param classifyId int
  448. // @param classifyName string
  449. // @param chartPermissionIdList []int
  450. // @return err error
  451. // @return errMsg string
  452. // @return isSendEmail bool
  453. func EditReportClassify(classifyId int, classifyName string, chartPermissionIdList []int) (err error, errMsg string, isSendEmail bool) {
  454. isSendEmail = true
  455. errMsg = `修改失败`
  456. item, err := models.GetClassifyById(classifyId)
  457. if err != nil {
  458. errMsg = "获取分类信息失败"
  459. if err.Error() == utils.ErrNoRow() {
  460. errMsg = "分类不存在, 或已被删除"
  461. isSendEmail = false
  462. }
  463. return
  464. }
  465. originName := item.ClassifyName
  466. // 重名校验
  467. existName, e := models.GetClassifyByName(classifyName, item.ParentId)
  468. if e != nil && e.Error() != utils.ErrNoRow() {
  469. errMsg = "获取信息失败"
  470. err = errors.New("获取重名分类失败, Err: " + err.Error())
  471. return
  472. }
  473. if existName != nil && existName.Id != item.Id {
  474. errMsg = "分类名称:" + classifyName + "已存在"
  475. err = errors.New(errMsg)
  476. isSendEmail = false
  477. return
  478. }
  479. item.ClassifyName = classifyName
  480. // ETA1.8.3:不允许修改上级分类 2024-6-17 13:21:01
  481. //item.ParentId = req.ParentId
  482. item.ModifyTime = time.Now().Local()
  483. cols := make([]string, 0)
  484. cols = append(cols, "ClassifyName", "ModifyTime")
  485. err = item.UpdateClassify(cols)
  486. if err != nil {
  487. return
  488. }
  489. err = models.EditChartPermissionSearchKeyWordMappingMulti(item.ClassifyName, chartPermissionIdList, item.Id)
  490. if err != nil {
  491. errMsg = "修改分类权限失败"
  492. return
  493. }
  494. // 修改CRM权限
  495. go func() {
  496. _ = EditClassifyChartPermissionSync(item.ClassifyName, item.Id)
  497. }()
  498. // TODO 修改分类的关联品种时,历史报告中关联的品种怎么处理?
  499. // 更新报告分类名称/父级分类后
  500. go func() {
  501. _ = AfterUpdateClassifyNameOrParent(item.Id, item.ParentId, item.ParentId, originName, item.ClassifyName, item.Level)
  502. }()
  503. return
  504. }
  505. // GetClassifyTreeRecursive 递归获取分类树形结构
  506. func GetClassifyTreeRecursive(list []*models.ClassifyItem, parentId int) []*models.ClassifyItem {
  507. res := make([]*models.ClassifyItem, 0)
  508. for _, v := range list {
  509. if v.ParentId == parentId {
  510. v.Child = GetClassifyTreeRecursive(list, v.Id)
  511. res = append(res, v)
  512. }
  513. }
  514. return res
  515. }
  516. // GetParentClassifyListByParentIdList
  517. // @Description: 递归获取父级分类信息,正常来讲只有三次
  518. // @author: Roc
  519. // @datetime 2024-06-19 13:23:33
  520. // @param parentClassifyIdList []int
  521. // @return list []*models.ClassifyList
  522. // @return err error
  523. func GetParentClassifyListByParentIdList(parentClassifyIdList []int) (list []*models.ClassifyList, err error) {
  524. num := len(parentClassifyIdList)
  525. if num <= 0 {
  526. return
  527. }
  528. list, err = models.GetClassifyListByParentIdList(parentClassifyIdList)
  529. if err != nil {
  530. return
  531. }
  532. // 是否还有上级
  533. {
  534. currParentClassifyIdList := make([]int, 0)
  535. for _, v := range list {
  536. if v.ParentId > 0 {
  537. currParentClassifyIdList = append(currParentClassifyIdList, v.ParentId)
  538. }
  539. }
  540. if len(currParentClassifyIdList) > 0 {
  541. tmpList, tmpErr := GetParentClassifyListByParentIdList(currParentClassifyIdList)
  542. if tmpErr != nil {
  543. err = tmpErr
  544. return
  545. }
  546. list = append(tmpList, list...)
  547. }
  548. }
  549. return
  550. }
  551. // GetClassifyListTreeRecursive
  552. // @Description: 递归获取分类树形结构
  553. // @author: Roc
  554. // @datetime 2024-06-19 13:23:28
  555. // @param list []*models.ClassifyList
  556. // @param parentId int
  557. // @return []*models.ClassifyList
  558. func GetClassifyListTreeRecursive(list []*models.ClassifyList, parentId int) []*models.ClassifyList {
  559. res := make([]*models.ClassifyList, 0)
  560. for _, v := range list {
  561. if v.ParentId == parentId {
  562. v.Child = GetClassifyListTreeRecursive(list, v.Id)
  563. res = append(res, v)
  564. }
  565. }
  566. // 前端的JP需要我这么返回
  567. if len(res) <= 0 {
  568. res = nil
  569. }
  570. return res
  571. }
  572. // BySortAndCreateTime 用来排序,先按Sort字段升序排序,若Sort相同,则按照CreateTime字段升序排序。
  573. type BySortAndCreateTime []*models.ClassifyList
  574. func (a BySortAndCreateTime) Len() int {
  575. return len(a)
  576. }
  577. func (a BySortAndCreateTime) Swap(i, j int) {
  578. a[i], a[j] = a[j], a[i]
  579. }
  580. func (a BySortAndCreateTime) Less(i, j int) bool {
  581. if a[i].Sort == a[j].Sort {
  582. return a[i].CreateTime.Before(a[j].CreateTime)
  583. }
  584. return a[i].Sort < a[j].Sort
  585. }
  586. // SortClassifyListBySortAndCreateTime sorts the ClassifyList slice by Sort and then CreateTime in ascending order.
  587. func SortClassifyListBySortAndCreateTime(classifyList []*models.ClassifyList) {
  588. sort.Sort(BySortAndCreateTime(classifyList))
  589. }