excel_classify.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. package excel
  2. import (
  3. "errors"
  4. "eta_gn/eta_api/models/data_manage/excel"
  5. "eta_gn/eta_api/models/data_manage/excel/request"
  6. "eta_gn/eta_api/utils"
  7. "time"
  8. )
  9. func GetExcelClassifyMaxSort(parentId int, source int) (maxSort int, err error) {
  10. //获取该层级下最大的排序数
  11. maxSort, err = excel.GetExcelClassifyMaxSort(parentId, source)
  12. if err != nil {
  13. return
  14. }
  15. edbMaxSort, err := excel.GetExcelMaxSortByClassifyId(parentId, source)
  16. if err != nil {
  17. return
  18. }
  19. if maxSort < edbMaxSort {
  20. maxSort = edbMaxSort
  21. }
  22. return
  23. }
  24. // MoveExcelClassify 移动指标分类
  25. func MoveExcelClassify(req request.MoveExcelClassifyReq) (err error, errMsg string) {
  26. classifyId := req.ClassifyId
  27. parentClassifyId := req.ParentClassifyId
  28. prevClassifyId := req.PrevClassifyId
  29. nextClassifyId := req.NextClassifyId
  30. excelInfoId := req.ExcelInfoId
  31. prevExcelInfoId := req.PrevExcelInfoId
  32. nextExcelInfoId := req.NextExcelInfoId
  33. source := req.Source
  34. //首先确定移动的对象是分类还是指标
  35. //判断上一个节点是分类还是指标
  36. //判断下一个节点是分类还是指标
  37. //同时更新分类目录下的分类sort和指标sort
  38. //更新当前移动的分类或者指标sort
  39. var parentExcelClassifyInfo *excel.ExcelClassify
  40. if parentClassifyId > 0 {
  41. parentExcelClassifyInfo, err = excel.GetExcelClassifyById(parentClassifyId)
  42. if err != nil {
  43. errMsg = "移动失败"
  44. err = errors.New("获取上级分类信息失败,Err:" + err.Error())
  45. return
  46. }
  47. }
  48. //如果有传入 上一个兄弟节点分类id
  49. var (
  50. excelClassifyInfo *excel.ExcelClassify
  51. prevClassify *excel.ExcelClassify
  52. nextClassify *excel.ExcelClassify
  53. excelInfo *excel.ExcelInfo
  54. prevExcelInfo *excel.ExcelInfo
  55. nextExcelInfo *excel.ExcelInfo
  56. prevSort int
  57. nextSort int
  58. )
  59. // 移动对象为分类, 判断权限
  60. if excelInfoId == 0 {
  61. excelClassifyInfo, err = excel.GetExcelClassifyById(classifyId)
  62. if err != nil {
  63. if utils.IsErrNoRow(err) {
  64. errMsg = "当前分类不存在"
  65. err = errors.New("获取分类信息失败,Err:" + err.Error())
  66. return
  67. }
  68. errMsg = "移动失败"
  69. err = errors.New("获取分类信息失败,Err:" + err.Error())
  70. return
  71. }
  72. } else {
  73. excelInfo, err = excel.GetExcelInfoById(excelInfoId)
  74. if err != nil {
  75. if utils.IsErrNoRow(err) {
  76. errMsg = "当前表格不存在"
  77. err = errors.New("获取分类信息失败,Err:" + err.Error())
  78. return
  79. }
  80. errMsg = "移动失败"
  81. err = errors.New("获取分类信息失败,Err:" + err.Error())
  82. return
  83. }
  84. if parentClassifyId == 0 {
  85. errMsg = "移动失败,表格必须挂在分类下"
  86. err = errors.New(errMsg)
  87. return
  88. }
  89. }
  90. if prevClassifyId > 0 {
  91. prevClassify, err = excel.GetExcelClassifyById(prevClassifyId)
  92. if err != nil {
  93. errMsg = "移动失败"
  94. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  95. return
  96. }
  97. prevSort = prevClassify.Sort
  98. } else if prevExcelInfoId > 0 {
  99. prevExcelInfo, err = excel.GetExcelInfoById(prevExcelInfoId)
  100. if err != nil {
  101. errMsg = "移动失败"
  102. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  103. return
  104. }
  105. prevSort = prevExcelInfo.Sort
  106. }
  107. if nextClassifyId > 0 {
  108. //下一个兄弟节点
  109. nextClassify, err = excel.GetExcelClassifyById(nextClassifyId)
  110. if err != nil {
  111. errMsg = "移动失败"
  112. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  113. return
  114. }
  115. nextSort = nextClassify.Sort
  116. } else if nextExcelInfoId > 0 {
  117. //下一个兄弟节点
  118. nextExcelInfo, err = excel.GetExcelInfoById(nextExcelInfoId)
  119. if err != nil {
  120. errMsg = "移动失败"
  121. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  122. return
  123. }
  124. nextSort = nextExcelInfo.Sort
  125. }
  126. err, errMsg = moveExcelClassify(parentExcelClassifyInfo, excelClassifyInfo, prevClassify, nextClassify, excelInfo, prevExcelInfo, nextExcelInfo, parentClassifyId, prevSort, nextSort, source)
  127. return
  128. }
  129. // moveExcelClassify 移动表格分类
  130. func moveExcelClassify(parentExcelClassifyInfo, excelClassifyInfo, prevClassify, nextClassify *excel.ExcelClassify, excelInfo, prevExcelInfo, nextExcelInfo *excel.ExcelInfo, parentClassifyId int, prevSort, nextSort int, source int) (err error, errMsg string) {
  131. updateCol := make([]string, 0)
  132. // 移动对象为分类, 判断分类是否存在
  133. if excelClassifyInfo != nil {
  134. oldParentId := excelClassifyInfo.ParentId
  135. if oldParentId != parentClassifyId {
  136. //todo 更新子分类对应的level
  137. }
  138. //判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
  139. if excelClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
  140. if excelClassifyInfo.Level != parentExcelClassifyInfo.Level+1 { //禁止层级调整
  141. errMsg = "移动失败"
  142. err = errors.New("不支持目录层级变更")
  143. return
  144. }
  145. excelClassifyInfo.ParentId = parentExcelClassifyInfo.ExcelClassifyId
  146. excelClassifyInfo.Level = parentExcelClassifyInfo.Level + 1
  147. excelClassifyInfo.ModifyTime = time.Now()
  148. updateCol = append(updateCol, "ParentId", "Level", "ModifyTime")
  149. } else if excelClassifyInfo.ParentId != parentClassifyId && parentClassifyId == 0 {
  150. errMsg = "移动失败"
  151. err = errors.New("不支持目录层级变更")
  152. return
  153. }
  154. if prevSort > 0 {
  155. //如果是移动在两个兄弟节点之间
  156. if nextSort > 0 {
  157. //下一个兄弟节点
  158. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  159. if prevSort == nextSort || prevSort == excelClassifyInfo.Sort {
  160. //变更兄弟节点的排序
  161. updateSortStr := `sort + 2`
  162. //变更分类
  163. if prevClassify != nil {
  164. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, prevClassify.ExcelClassifyId, prevClassify.Sort, updateSortStr, source)
  165. } else {
  166. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, source)
  167. }
  168. //变更表格
  169. if prevExcelInfo != nil {
  170. //变更兄弟节点的排序
  171. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, prevExcelInfo.ExcelInfoId, updateSortStr, source)
  172. } else {
  173. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr, source)
  174. }
  175. } else {
  176. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  177. if nextSort-prevSort == 1 {
  178. //变更兄弟节点的排序
  179. updateSortStr := `sort + 1`
  180. //变更分类
  181. if prevClassify != nil {
  182. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, prevClassify.ExcelClassifyId, prevSort, updateSortStr, source)
  183. } else {
  184. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, source)
  185. }
  186. //变更表格
  187. if prevExcelInfo != nil {
  188. //变更兄弟节点的排序
  189. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, prevExcelInfo.ExcelInfoId, updateSortStr, source)
  190. } else {
  191. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr, source)
  192. }
  193. }
  194. }
  195. }
  196. excelClassifyInfo.Sort = prevSort + 1
  197. excelClassifyInfo.ModifyTime = time.Now()
  198. updateCol = append(updateCol, "Sort", "ModifyTime")
  199. } else if prevClassify == nil && nextClassify == nil && prevExcelInfo == nil && nextExcelInfo == nil && parentClassifyId > 0 {
  200. //处理只拖动到目录里,默认放到目录底部的情况
  201. var maxSort int
  202. maxSort, err = GetExcelClassifyMaxSort(parentClassifyId, source)
  203. if err != nil {
  204. errMsg = "移动失败"
  205. err = errors.New("查询组内排序信息失败,Err:" + err.Error())
  206. return
  207. }
  208. excelClassifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  209. excelClassifyInfo.ModifyTime = time.Now()
  210. updateCol = append(updateCol, "Sort", "ModifyTime")
  211. } else {
  212. // 拖动到父级分类的第一位
  213. firstClassify, tmpErr := excel.GetFirstExcelClassifyByParentId(parentClassifyId)
  214. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  215. errMsg = "移动失败"
  216. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  217. return
  218. }
  219. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  220. if firstClassify != nil && firstClassify.ExcelClassifyId > 0 && firstClassify.Sort == 0 {
  221. updateSortStr := ` sort + 1 `
  222. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, firstClassify.ExcelClassifyId-1, 0, updateSortStr, source)
  223. //该分类下的所有表格也需要+1
  224. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr, source)
  225. } else {
  226. //如果该分类下存在表格,且第一个表格的排序等于0,那么需要调整排序
  227. firstExcel, tErr := excel.GetFirstExcelInfoByClassifyId(parentClassifyId)
  228. if tErr != nil && !utils.IsErrNoRow(tErr) {
  229. errMsg = "移动失败"
  230. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
  231. return
  232. }
  233. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  234. if firstExcel != nil && firstExcel.ExcelClassifyId > 0 && firstExcel.Sort == 0 {
  235. updateSortStr := ` sort + 1 `
  236. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, 0, firstExcel.ExcelInfoId-1, updateSortStr, source)
  237. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, source)
  238. }
  239. }
  240. excelClassifyInfo.Sort = 0 //那就是排在第一位
  241. excelClassifyInfo.ModifyTime = time.Now()
  242. updateCol = append(updateCol, "Sort", "ModifyTime")
  243. }
  244. //更新
  245. if len(updateCol) > 0 {
  246. err = excelClassifyInfo.Update(updateCol)
  247. if err != nil {
  248. errMsg = "移动失败"
  249. err = errors.New("修改失败,Err:" + err.Error())
  250. return
  251. }
  252. //更新对应分类的root_id和层级
  253. if oldParentId != parentClassifyId {
  254. /*if len(classifyIds) > 0 {
  255. levelStep := excelClassifyInfo.Level - oldLevel
  256. err = data_manage.UpdateEdbClassifyChildByParentClassifyId(classifyIds, excelClassifyInfo.RootId, levelStep)
  257. if err != nil {
  258. errMsg = "移动失败"
  259. err = errors.New("更新子分类失败,Err:" + err.Error())
  260. return
  261. }
  262. }*/
  263. }
  264. }
  265. } else {
  266. if excelInfo == nil {
  267. errMsg = "当前表格不存在"
  268. err = errors.New(errMsg)
  269. return
  270. }
  271. //如果改变了分类,那么移动该表格数据
  272. if excelInfo.ExcelClassifyId != parentClassifyId {
  273. excelInfo.ExcelClassifyId = parentClassifyId
  274. excelInfo.ModifyTime = time.Now()
  275. updateCol = append(updateCol, "ExcelClassifyId", "ModifyTime")
  276. }
  277. if prevSort > 0 {
  278. //如果是移动在两个兄弟节点之间
  279. if nextSort > 0 {
  280. //下一个兄弟节点
  281. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  282. if prevSort == nextSort || prevSort == excelInfo.Sort {
  283. //变更兄弟节点的排序
  284. updateSortStr := `sort + 2`
  285. //变更分类
  286. if prevClassify != nil {
  287. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, prevClassify.ExcelClassifyId, prevClassify.Sort, updateSortStr, source)
  288. } else {
  289. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, source)
  290. }
  291. //变更表格
  292. if prevExcelInfo != nil {
  293. //变更兄弟节点的排序
  294. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, prevExcelInfo.ExcelInfoId, updateSortStr, source)
  295. } else {
  296. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr, source)
  297. }
  298. } else {
  299. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  300. if nextSort-prevSort == 1 {
  301. //变更兄弟节点的排序
  302. updateSortStr := `sort + 1`
  303. //变更分类
  304. if prevClassify != nil {
  305. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, prevClassify.ExcelClassifyId, prevSort, updateSortStr, source)
  306. } else {
  307. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, source)
  308. }
  309. //变更表格
  310. if prevExcelInfo != nil {
  311. //变更兄弟节点的排序
  312. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, prevExcelInfo.ExcelInfoId, updateSortStr, source)
  313. } else {
  314. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr, source)
  315. }
  316. }
  317. }
  318. }
  319. excelInfo.Sort = prevSort + 1
  320. excelInfo.ModifyTime = time.Now()
  321. updateCol = append(updateCol, "Sort", "ModifyTime")
  322. } else if prevClassify == nil && nextClassify == nil && prevExcelInfo == nil && nextExcelInfo == nil && parentClassifyId > 0 {
  323. //处理只拖动到目录里,默认放到目录底部的情况
  324. var maxSort int
  325. maxSort, err = GetExcelClassifyMaxSort(parentClassifyId, source)
  326. if err != nil {
  327. errMsg = "移动失败"
  328. err = errors.New("查询组内排序信息失败,Err:" + err.Error())
  329. return
  330. }
  331. excelInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  332. excelInfo.ModifyTime = time.Now()
  333. updateCol = append(updateCol, "Sort", "ModifyTime")
  334. } else {
  335. // 拖动到父级分类的第一位
  336. firstClassify, tmpErr := excel.GetFirstExcelClassifyByParentId(parentClassifyId)
  337. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  338. errMsg = "移动失败"
  339. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  340. return
  341. }
  342. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  343. if firstClassify != nil && firstClassify.ExcelClassifyId > 0 && firstClassify.Sort == 0 {
  344. updateSortStr := ` sort + 1 `
  345. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, firstClassify.ExcelClassifyId-1, 0, updateSortStr, source)
  346. //该分类下的所有表格也需要+1
  347. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr, source)
  348. } else {
  349. //如果该分类下存在表格,且第一个表格的排序等于0,那么需要调整排序
  350. firstExcel, tErr := excel.GetFirstExcelInfoByClassifyId(parentClassifyId)
  351. if tErr != nil && !utils.IsErrNoRow(tErr) {
  352. errMsg = "移动失败"
  353. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
  354. return
  355. }
  356. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  357. if firstExcel != nil && firstExcel.ExcelClassifyId > 0 && firstExcel.Sort == 0 {
  358. updateSortStr := ` sort + 1 `
  359. _ = excel.UpdateExcelInfoSortByClassifyId(parentClassifyId, 0, firstExcel.ExcelInfoId-1, updateSortStr, source)
  360. _ = excel.UpdateExcelClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, source)
  361. }
  362. }
  363. excelInfo.Sort = 0 //那就是排在第一位
  364. excelInfo.ModifyTime = time.Now()
  365. updateCol = append(updateCol, "Sort", "ModifyTime")
  366. }
  367. //更新
  368. if len(updateCol) > 0 {
  369. err = excelInfo.Update(updateCol)
  370. if err != nil {
  371. errMsg = "移动失败"
  372. err = errors.New("修改失败,Err:" + err.Error())
  373. return
  374. }
  375. }
  376. }
  377. return
  378. }
  379. func GetChildClassifyByClassifyId(targetClassifyId int, source int) (targetList []*excel.ExcelClassifyItems, err error, errMsg string) {
  380. //判断是否是挂在顶级目录下
  381. targetClassify, err := excel.GetExcelClassifyById(targetClassifyId)
  382. if err != nil {
  383. if utils.IsErrNoRow(err) {
  384. errMsg = "当前分类不存在"
  385. err = errors.New(errMsg)
  386. return
  387. }
  388. errMsg = "获取失败"
  389. err = errors.New("获取分类信息失败,Err:" + err.Error())
  390. return
  391. }
  392. tmpList, err := excel.GetExcelClassifyBySourceOrderByLevel(source)
  393. if err != nil && !utils.IsErrNoRow(err) {
  394. errMsg = "获取失败"
  395. err = errors.New("获取数据失败,Err:" + err.Error())
  396. return
  397. }
  398. idMap := make(map[int]struct{})
  399. if len(tmpList) > 0 {
  400. for _, v := range tmpList {
  401. if v.ExcelClassifyId == targetClassify.ExcelClassifyId {
  402. idMap[v.ExcelClassifyId] = struct{}{}
  403. }
  404. }
  405. for _, v := range tmpList {
  406. if _, ok := idMap[v.ParentId]; ok {
  407. idMap[v.ExcelClassifyId] = struct{}{}
  408. }
  409. }
  410. for _, v := range tmpList {
  411. if _, ok := idMap[v.ExcelClassifyId]; ok {
  412. targetItem := new(excel.ExcelClassifyItems)
  413. targetItem.ExcelClassifyId = v.ExcelClassifyId
  414. targetItem.ParentId = v.ParentId
  415. targetItem.UniqueCode = v.UniqueCode
  416. targetItem.Level = v.Level
  417. targetList = append(targetList, targetItem)
  418. }
  419. }
  420. }
  421. return
  422. }