edb_public_classify.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. package data
  2. import (
  3. "errors"
  4. "eta_gn/eta_api/models/data_manage"
  5. "eta_gn/eta_api/models/system"
  6. "eta_gn/eta_api/services/data/data_manage_permission"
  7. "eta_gn/eta_api/utils"
  8. "fmt"
  9. "strconv"
  10. "time"
  11. )
  12. // AddEdbPublicClassify
  13. // @Description: 添加公共指标分类
  14. // @author: Roc
  15. // @datetime 2024-12-04 18:00:22
  16. // @param classifyName string
  17. // @param parentId int
  18. // @param level int
  19. // @param classifyType uint8
  20. // @param sysUserId int
  21. // @param sysUserName string
  22. // @return classifyInfo *data_manage.EdbPublicClassify
  23. // @return err error
  24. // @return errMsg string
  25. func AddEdbPublicClassify(classifyName string, parentId, level int, classifyType uint8, sysUserId int, sysUserName string) (classifyInfo *data_manage.EdbPublicClassify, err error, errMsg string) {
  26. edbPublicClassifyObj := data_manage.EdbPublicClassify{}
  27. // 校验分类名称相同的数量
  28. {
  29. var count int
  30. count, err = edbPublicClassifyObj.GetEdbClassifyCount(classifyName, parentId, classifyType)
  31. if err != nil {
  32. errMsg = `判断名称是否已存在失败`
  33. return
  34. }
  35. if count > 0 {
  36. errMsg = `分类名称已存在,请重新输入`
  37. err = errors.New(errMsg)
  38. return
  39. }
  40. }
  41. // 层级校验
  42. if level > utils.EdbClassifyMaxLevel {
  43. errMsg = fmt.Sprintf("最高只支持添加%d级分类", level)
  44. return
  45. }
  46. //获取该层级下最大的排序数
  47. maxSort, err := GetEdbPublicClassifyMaxSort(parentId, classifyType)
  48. if err != nil {
  49. errMsg = "获取失败"
  50. err = errors.New("查询排序信息失败,Err:" + err.Error())
  51. return
  52. }
  53. //查询顶级rootId
  54. rootId := 0
  55. var classifyNamePath, classifyIdPath string
  56. if parentId > 0 {
  57. parentClassify, tErr := edbPublicClassifyObj.GetEdbClassifyById(parentId)
  58. if tErr != nil {
  59. if utils.IsErrNoRow(tErr) {
  60. errMsg = "父级分类不存在"
  61. err = errors.New(errMsg)
  62. return
  63. }
  64. errMsg = "获取失败"
  65. err = errors.New("获取分类信息失败,Err:" + tErr.Error())
  66. return
  67. }
  68. rootId = parentClassify.RootId
  69. classifyNamePath = fmt.Sprint(parentClassify.EdbPublicClassifyNamePath, "|", classifyName)
  70. classifyIdPath = fmt.Sprint(parentClassify.EdbPublicClassifyIdPath, ",")
  71. } else {
  72. classifyNamePath = classifyName
  73. }
  74. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  75. classifyInfo = &data_manage.EdbPublicClassify{
  76. //EdbPublicClassifyId: 0,
  77. ClassifyType: classifyType,
  78. EdbPublicClassifyName: classifyName,
  79. ParentId: parentId,
  80. HasData: 0,
  81. RootId: rootId,
  82. CreateTime: time.Now(),
  83. ModifyTime: time.Now(),
  84. SysUserId: sysUserId,
  85. SysUserRealName: sysUserName,
  86. Level: level + 1,
  87. UniqueCode: utils.MD5(utils.PUBLIC_CLASSIFY_PREFIX + "_" + timestamp),
  88. Sort: maxSort + 1,
  89. LastModifyUserId: sysUserId,
  90. LastModifyUserRealName: sysUserName,
  91. EdbPublicClassifyNamePath: classifyNamePath,
  92. EdbPublicClassifyIdPath: "",
  93. }
  94. err = classifyInfo.Add()
  95. if err != nil {
  96. errMsg = "保存分类失败"
  97. return
  98. }
  99. // 更改分类id完整路径path
  100. updateCols := []string{"EdbPublicClassifyIdPath"}
  101. classifyInfo.EdbPublicClassifyIdPath = fmt.Sprint(classifyIdPath, classifyInfo.EdbPublicClassifyId)
  102. if parentId == 0 { //一级目录的rootId等于自己本身
  103. classifyInfo.RootId = classifyInfo.EdbPublicClassifyId
  104. updateCols = append(updateCols, "RootId")
  105. }
  106. err = classifyInfo.Update(updateCols)
  107. if err != nil {
  108. errMsg = "更新分类失败"
  109. return
  110. }
  111. return
  112. }
  113. // EditEdbPublicClassify
  114. // @Description: 编辑指标分类
  115. // @author: Roc
  116. // @datetime 2024-12-05 09:29:38
  117. // @param classifyId int
  118. // @param classifyName string
  119. // @param sysUser *system.Admin
  120. // @return err error
  121. // @return errMsg string
  122. func EditEdbPublicClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
  123. edbPublicClassifyObj := data_manage.EdbPublicClassify{}
  124. item, err := edbPublicClassifyObj.GetEdbClassifyById(classifyId)
  125. if err != nil {
  126. errMsg = `修改失败`
  127. return
  128. }
  129. // TODO 操作权限校验
  130. {
  131. }
  132. // 需要变更的字段
  133. updateCols := make([]string, 0)
  134. // 旧完整路径 , 新的完整路径
  135. var oldClassifyNamePath, newClassifyNamePath string
  136. // 名字相同,那么就直接返回
  137. if item.EdbPublicClassifyName == classifyName {
  138. return
  139. }
  140. // 判断名称是否已存在
  141. count, tmpErr := edbPublicClassifyObj.GetEdbClassifyCount(classifyName, item.ParentId, item.ClassifyType)
  142. if tmpErr != nil {
  143. err = tmpErr
  144. errMsg = "判断名称是否已存在失败"
  145. return
  146. }
  147. if count > 0 {
  148. errMsg = "分类名称已存在,请重新输入"
  149. err = errors.New(errMsg)
  150. return
  151. }
  152. // 旧完整路径
  153. oldClassifyNamePath = item.EdbPublicClassifyNamePath
  154. if item.ParentId > 0 {
  155. parentItem, tmpErr := edbPublicClassifyObj.GetEdbClassifyById(item.ParentId)
  156. if tmpErr != nil {
  157. err = tmpErr
  158. return
  159. }
  160. newClassifyNamePath = fmt.Sprint(parentItem.EdbPublicClassifyNamePath, "|", classifyName)
  161. } else {
  162. newClassifyNamePath = classifyName
  163. }
  164. // 更新自己的信息
  165. item.EdbPublicClassifyName = classifyName
  166. item.EdbPublicClassifyNamePath = newClassifyNamePath
  167. item.LastModifyUserId = sysUser.AdminId
  168. item.LastModifyUserRealName = sysUser.RealName
  169. updateCols = append(updateCols, "EdbPublicClassifyName", "EdbPublicClassifyNamePath", "LastModifyUserId", "LastModifyUserRealName")
  170. // 修改数据
  171. if len(updateCols) > 0 {
  172. err = item.UpdateEdbClassifyNameAndNamePath(updateCols, oldClassifyNamePath, newClassifyNamePath)
  173. if err != nil {
  174. errMsg = "保存失败"
  175. }
  176. }
  177. return
  178. }
  179. // GetEdbPublicClassifyMaxSort
  180. // @Description: 获取最大排序值
  181. // @author: Roc
  182. // @datetime 2024-12-04 16:54:57
  183. // @param parentId int
  184. // @param classifyType uint8
  185. // @return maxSort int
  186. // @return err error
  187. func GetEdbPublicClassifyMaxSort(parentId int, classifyType uint8) (maxSort int, err error) {
  188. edbPublicClassifyObj := data_manage.EdbPublicClassify{}
  189. //获取该层级下最大的排序数
  190. classifyMaxSort, err := edbPublicClassifyObj.GetEdbClassifyMaxSort(parentId, classifyType)
  191. if err != nil {
  192. return
  193. }
  194. maxSort = classifyMaxSort
  195. edbMaxSort, err := data_manage.GetEdbInfoMaxSortByClassifyId(parentId)
  196. if err != nil {
  197. return
  198. }
  199. if maxSort < edbMaxSort {
  200. maxSort = edbMaxSort
  201. }
  202. return
  203. }
  204. // DeleteEdbPublicClassifyCheck 删除检测
  205. func DeleteEdbPublicClassifyCheck(classifyId int, sysUser *system.Admin) (deleteStatus int, tipsMsg string, allClassifyIdList []int, tableList []*data_manage.ExcelBaseInfo, err error, errMsg string) {
  206. // TODO 操作权限校验
  207. {
  208. }
  209. edbPublicClassifyObj := data_manage.EdbPublicClassify{}
  210. // 查找当前分类
  211. item, tmpErr := edbPublicClassifyObj.GetEdbClassifyById(classifyId)
  212. if tmpErr != nil {
  213. errMsg = `查找分类失败`
  214. err = tmpErr
  215. return
  216. }
  217. // 查找分类下所有子分类
  218. childClassifyIdList, tmpErr := item.GetAllChildClassifyIdList()
  219. if tmpErr != nil {
  220. errMsg = `查找下级分类失败`
  221. err = tmpErr
  222. return
  223. }
  224. allClassifyIdList = childClassifyIdList
  225. allClassifyIdList = append(allClassifyIdList, item.EdbPublicClassifyId)
  226. // 判断分类下,是否含有指标
  227. {
  228. //判断分类下,是否含有指标
  229. count, tmpErr := edbPublicClassifyObj.GetEdbInfoCountByClassifyIdList(allClassifyIdList)
  230. if tmpErr != nil {
  231. errMsg = "删除失败"
  232. err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
  233. return
  234. }
  235. if count > 0 {
  236. deleteStatus = 1
  237. tipsMsg = "目录关联指标不可删除"
  238. return
  239. }
  240. }
  241. // 子目录数量校验
  242. if len(childClassifyIdList) > 0 {
  243. deleteStatus = 2
  244. tipsMsg = "确认删除当前目录及包含的子目录吗"
  245. return
  246. }
  247. return
  248. }
  249. // DeleteEdbPublicClassify 删除分类/指标
  250. func DeleteEdbPublicClassify(classifyId int, sysUser *system.Admin, requestBody, requestUrl string) (nextItem *data_manage.EdbInfo, tableList []*data_manage.ExcelBaseInfo, err error, errMsg string) {
  251. //删除分类校验
  252. deleteStatus, tipsMsg, allClassifyIdList, _, err, errMsg := DeleteEdbPublicClassifyCheck(classifyId, sysUser)
  253. // 0:可以;2:删除子目录;1:不可删除(有关联指标)
  254. if deleteStatus == 1 {
  255. if tipsMsg != `` {
  256. errMsg = tipsMsg
  257. }
  258. if err == nil {
  259. err = errors.New(errMsg)
  260. }
  261. return
  262. }
  263. edbPublicClassifyObj := data_manage.EdbPublicClassify{}
  264. err = edbPublicClassifyObj.BatchesDel(allClassifyIdList)
  265. if err != nil {
  266. errMsg = "删除失败"
  267. return
  268. }
  269. return
  270. }
  271. // MoveEdbClassify 移动指标分类
  272. func MoveEdbPublicClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin, classifyType uint8) (err error, errMsg string) {
  273. // req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId
  274. classifyId := req.ClassifyId
  275. parentClassifyId := req.ParentClassifyId
  276. prevClassifyId := req.PrevClassifyId
  277. nextClassifyId := req.NextClassifyId
  278. edbInfoId := req.EdbInfoId
  279. prevEdbInfoId := req.PrevEdbInfoId
  280. nextEdbInfoId := req.NextEdbInfoId
  281. //首先确定移动的对象是分类还是指标
  282. //判断上一个节点是分类还是指标
  283. //判断下一个节点是分类还是指标
  284. //同时更新分类目录下的分类sort和指标sort
  285. //更新当前移动的分类或者指标sort
  286. var parentEdbClassifyInfo *data_manage.EdbClassify
  287. if parentClassifyId > 0 {
  288. parentEdbClassifyInfo, err = data_manage.GetEdbClassifyById(parentClassifyId)
  289. if err != nil {
  290. errMsg = "移动失败"
  291. err = errors.New("获取上级分类信息失败,Err:" + err.Error())
  292. return
  293. }
  294. }
  295. //如果有传入 上一个兄弟节点分类id
  296. var (
  297. edbClassifyInfo *data_manage.EdbClassify
  298. prevClassify *data_manage.EdbClassify
  299. nextClassify *data_manage.EdbClassify
  300. edbInfo *data_manage.EdbInfo
  301. prevEdbInfo *data_manage.EdbInfo
  302. nextEdbInfo *data_manage.EdbInfo
  303. prevSort int
  304. nextSort int
  305. )
  306. // 移动对象为分类, 判断权限
  307. if edbInfoId == 0 {
  308. edbClassifyInfo, err = data_manage.GetEdbClassifyById(classifyId)
  309. if err != nil {
  310. if utils.IsErrNoRow(err) {
  311. errMsg = "当前分类不存在"
  312. err = errors.New("获取分类信息失败,Err:" + err.Error())
  313. return
  314. }
  315. errMsg = "移动失败"
  316. err = errors.New("获取分类信息失败,Err:" + err.Error())
  317. return
  318. }
  319. if edbClassifyInfo.SysUserId != sysUser.AdminId {
  320. errMsg = "不是本人目录,您没有操作权限"
  321. err = errors.New(errMsg)
  322. return
  323. }
  324. if parentClassifyId > 0 && parentEdbClassifyInfo.Level == 6 {
  325. errMsg = "最高只支持添加6级分类"
  326. err = errors.New(errMsg)
  327. return
  328. }
  329. // 如果是移动目录, 那么校验一下父级目录下是否有重名目录
  330. exists, e := data_manage.GetEdbClassifyByParentIdAndName(parentClassifyId, edbClassifyInfo.ClassifyName, classifyId, classifyType)
  331. if e != nil && !utils.IsErrNoRow(e) {
  332. errMsg = "移动失败"
  333. err = fmt.Errorf("获取父级分类下的同名分类失败, Err: %s", e.Error())
  334. return
  335. }
  336. if exists != nil && exists.ClassifyId > 0 {
  337. errMsg = "移动失败,分类名称已存在"
  338. return
  339. }
  340. // 权限校验
  341. {
  342. // 已授权分类id
  343. permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbClassifyPermissionList(sysUser.AdminId, classifyId)
  344. if tmpErr != nil {
  345. errMsg = "移动失败"
  346. err = errors.New("获取已授权分类id数据失败,Err:" + tmpErr.Error())
  347. return
  348. }
  349. // 数据权限
  350. haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(edbClassifyInfo.IsJoinPermission, edbClassifyInfo.ClassifyId, permissionClassifyIdList)
  351. if edbClassifyInfo.ClassifyType == 0 { // 普通指标
  352. button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId, haveOperaAuth)
  353. if !button.MoveButton {
  354. errMsg = "无操作权限"
  355. err = errors.New(errMsg)
  356. return
  357. }
  358. } else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
  359. button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId, haveOperaAuth)
  360. if !button.MoveButton {
  361. errMsg = "无操作权限"
  362. err = errors.New(errMsg)
  363. return
  364. }
  365. }
  366. }
  367. } else {
  368. edbInfo, err = data_manage.GetEdbInfoById(req.EdbInfoId)
  369. if err != nil {
  370. if utils.IsErrNoRow(err) {
  371. errMsg = "当前指标不存在"
  372. err = errors.New("获取分类信息失败,Err:" + err.Error())
  373. return
  374. }
  375. errMsg = "移动失败"
  376. err = errors.New("获取分类信息失败,Err:" + err.Error())
  377. return
  378. }
  379. if edbInfo.SysUserId != sysUser.AdminId {
  380. errMsg = "不是本人指标,您没有操作权限"
  381. err = errors.New(errMsg)
  382. return
  383. }
  384. if parentClassifyId == 0 {
  385. errMsg = "移动失败,指标必须挂在分类下"
  386. err = errors.New(errMsg)
  387. return
  388. }
  389. var haveOperaAuth bool
  390. // 权限校验
  391. {
  392. haveOperaAuth, err = data_manage_permission.CheckEdbPermissionByEdbInfoId(edbInfo.EdbInfoId, edbInfo.ClassifyId, edbInfo.IsJoinPermission, sysUser.AdminId)
  393. if err != nil {
  394. errMsg = "移动失败"
  395. err = errors.New("获取指标权限信息失败,Err:" + err.Error())
  396. return
  397. }
  398. }
  399. // 移动权限校验
  400. button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType, haveOperaAuth)
  401. if !button.MoveButton {
  402. errMsg = "无操作权限"
  403. err = errors.New(errMsg)
  404. return
  405. }
  406. }
  407. if prevClassifyId > 0 {
  408. prevClassify, err = data_manage.GetEdbClassifyById(prevClassifyId)
  409. if err != nil {
  410. errMsg = "移动失败"
  411. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  412. return
  413. }
  414. prevSort = prevClassify.Sort
  415. } else if prevEdbInfoId > 0 {
  416. prevEdbInfo, err = data_manage.GetEdbInfoById(prevEdbInfoId)
  417. if err != nil {
  418. errMsg = "移动失败"
  419. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  420. return
  421. }
  422. prevSort = prevEdbInfo.Sort
  423. }
  424. if nextClassifyId > 0 {
  425. //下一个兄弟节点
  426. nextClassify, err = data_manage.GetEdbClassifyById(nextClassifyId)
  427. if err != nil {
  428. errMsg = "移动失败"
  429. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  430. return
  431. }
  432. nextSort = nextClassify.Sort
  433. } else if nextEdbInfoId > 0 {
  434. //下一个兄弟节点
  435. nextEdbInfo, err = data_manage.GetEdbInfoById(nextEdbInfoId)
  436. if err != nil {
  437. errMsg = "移动失败"
  438. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  439. return
  440. }
  441. nextSort = nextEdbInfo.Sort
  442. }
  443. err, errMsg = moveEdbOrClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify, edbInfo, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
  444. return
  445. }
  446. // moveEdbOrClassify 移动指标分类
  447. func moveEdbOrPublicClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify *data_manage.EdbClassify, edbInfo, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
  448. if edbClassifyInfo != nil {
  449. // 移动分类
  450. return moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
  451. } else {
  452. // 移动指标
  453. return moveEdb(prevClassify, nextClassify, edbInfo, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
  454. }
  455. return
  456. }
  457. // moveEdb
  458. // @Description: 移动指标
  459. // @author: Roc
  460. // @datetime 2024-11-26 16:07:37
  461. // @param prevClassify *data_manage.EdbClassify
  462. // @param nextClassify *data_manage.EdbClassify
  463. // @param edbInfo *data_manage.EdbInfo
  464. // @param prevEdbInfo *data_manage.EdbInfo
  465. // @param nextEdbInfo *data_manage.EdbInfo
  466. // @param parentClassifyId int
  467. // @param prevSort int
  468. // @param nextSort int
  469. // @param classifyType uint8
  470. // @return err error
  471. // @return errMsg string
  472. func movePublicEdb(prevClassify, nextClassify *data_manage.EdbClassify, edbInfo, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
  473. updateCol := make([]string, 0)
  474. if edbInfo == nil {
  475. errMsg = "当前指标不存在"
  476. err = errors.New(errMsg)
  477. return
  478. }
  479. //如果改变了分类,那么移动该指标数据
  480. if edbInfo.ClassifyId != parentClassifyId {
  481. edbInfo.ClassifyId = parentClassifyId
  482. edbInfo.ModifyTime = time.Now()
  483. updateCol = append(updateCol, "ClassifyId", "ModifyTime")
  484. }
  485. if prevSort > 0 {
  486. //如果是移动在两个兄弟节点之间
  487. if nextSort > 0 {
  488. //下一个兄弟节点
  489. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  490. if prevSort == nextSort || prevSort == edbInfo.Sort {
  491. //变更兄弟节点的排序
  492. updateSortStr := `sort + 2`
  493. //变更分类
  494. if prevClassify != nil {
  495. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
  496. } else {
  497. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  498. }
  499. //变更指标
  500. if prevEdbInfo != nil {
  501. //变更兄弟节点的排序
  502. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  503. } else {
  504. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  505. }
  506. } else {
  507. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  508. if nextSort-prevSort == 1 {
  509. //变更兄弟节点的排序
  510. updateSortStr := `sort + 1`
  511. //变更分类
  512. if prevClassify != nil {
  513. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
  514. } else {
  515. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  516. }
  517. //变更指标
  518. if prevEdbInfo != nil {
  519. //变更兄弟节点的排序
  520. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  521. } else {
  522. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  523. }
  524. }
  525. }
  526. }
  527. edbInfo.Sort = prevSort + 1
  528. edbInfo.ModifyTime = time.Now()
  529. updateCol = append(updateCol, "Sort", "ModifyTime")
  530. } else if prevClassify == nil && nextClassify == nil && prevEdbInfo == nil && nextEdbInfo == nil && parentClassifyId > 0 {
  531. //处理只拖动到目录里,默认放到目录底部的情况
  532. var maxSort int
  533. maxSort, err = GetEdbClassifyMaxSort(parentClassifyId, classifyType)
  534. if err != nil {
  535. errMsg = "移动失败"
  536. err = errors.New("查询组内排序信息失败,Err:" + err.Error())
  537. return
  538. }
  539. edbInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  540. edbInfo.ModifyTime = time.Now()
  541. updateCol = append(updateCol, "Sort", "ModifyTime")
  542. } else {
  543. // 拖动到父级分类的第一位
  544. firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
  545. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  546. errMsg = "移动失败"
  547. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  548. return
  549. }
  550. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  551. if firstClassify != nil && firstClassify.ClassifyId > 0 && firstClassify.Sort == 0 {
  552. updateSortStr := ` sort + 1 `
  553. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
  554. //该分类下的所有指标也需要+1
  555. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
  556. } else {
  557. //如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
  558. firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
  559. if tErr != nil && !utils.IsErrNoRow(tErr) {
  560. errMsg = "移动失败"
  561. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
  562. return
  563. }
  564. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  565. if firstEdb != nil && firstEdb.ClassifyId > 0 && firstEdb.Sort == 0 {
  566. updateSortStr := ` sort + 1 `
  567. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
  568. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
  569. }
  570. }
  571. edbInfo.Sort = 0 //那就是排在第一位
  572. edbInfo.ModifyTime = time.Now()
  573. updateCol = append(updateCol, "Sort", "ModifyTime")
  574. }
  575. //更新
  576. if len(updateCol) > 0 {
  577. err = edbInfo.Update(updateCol)
  578. if err != nil {
  579. errMsg = "移动失败"
  580. err = errors.New("修改失败,Err:" + err.Error())
  581. return
  582. }
  583. }
  584. return
  585. }
  586. // moveEdbClassify
  587. // @Description: 移动指标分类
  588. // @author: Roc
  589. // @datetime 2024-11-26 16:07:44
  590. // @param parentEdbClassifyInfo *data_manage.EdbClassify
  591. // @param edbClassifyInfo *data_manage.EdbClassify
  592. // @param prevClassify *data_manage.EdbClassify
  593. // @param nextClassify *data_manage.EdbClassify
  594. // @param edbInfo *data_manage.EdbInfo
  595. // @param prevEdbInfo *data_manage.EdbInfo
  596. // @param nextEdbInfo *data_manage.EdbInfo
  597. // @param parentClassifyId int
  598. // @param prevSort int
  599. // @param nextSort int
  600. // @param classifyType uint8
  601. // @return err error
  602. // @return errMsg string
  603. func moveEdbPublicClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify *data_manage.EdbClassify, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
  604. updateCol := make([]string, 0)
  605. // 移动对象为分类, 判断分类是否存在
  606. oldParentId := edbClassifyInfo.ParentId
  607. oldLevel := edbClassifyInfo.Level
  608. var classifyIds []int
  609. if oldParentId != parentClassifyId {
  610. //更新子分类对应的level
  611. childList, e, m := GetChildClassifyByClassifyId(edbClassifyInfo.ClassifyId)
  612. if e != nil {
  613. errMsg = "移动失败"
  614. err = errors.New("查询子分类失败,Err:" + e.Error() + m)
  615. return
  616. }
  617. if len(childList) > 0 {
  618. for _, v := range childList {
  619. if v.ClassifyId == edbClassifyInfo.ClassifyId {
  620. continue
  621. }
  622. classifyIds = append(classifyIds, v.ClassifyId)
  623. }
  624. }
  625. }
  626. //判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
  627. if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
  628. if edbClassifyInfo.Level != parentEdbClassifyInfo.Level+1 { //禁止层级调整
  629. errMsg = "移动失败"
  630. err = errors.New("不支持目录层级变更")
  631. return
  632. }
  633. edbClassifyInfo.ParentId = parentEdbClassifyInfo.ClassifyId
  634. edbClassifyInfo.RootId = parentEdbClassifyInfo.RootId
  635. edbClassifyInfo.Level = parentEdbClassifyInfo.Level + 1
  636. edbClassifyInfo.ModifyTime = time.Now()
  637. updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
  638. } else if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId == 0 {
  639. errMsg = "移动失败"
  640. err = errors.New("不支持目录层级变更")
  641. return
  642. }
  643. if prevSort > 0 {
  644. //如果是移动在两个兄弟节点之间
  645. if nextSort > 0 {
  646. //下一个兄弟节点
  647. //如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
  648. if prevSort == nextSort || prevSort == edbClassifyInfo.Sort {
  649. //变更兄弟节点的排序
  650. updateSortStr := `sort + 2`
  651. //变更分类
  652. if prevClassify != nil {
  653. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
  654. } else {
  655. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  656. }
  657. //变更指标
  658. if prevEdbInfo != nil {
  659. //变更兄弟节点的排序
  660. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  661. } else {
  662. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  663. }
  664. } else {
  665. //如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
  666. if nextSort-prevSort == 1 {
  667. //变更兄弟节点的排序
  668. updateSortStr := `sort + 1`
  669. //变更分类
  670. if prevClassify != nil {
  671. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
  672. } else {
  673. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
  674. }
  675. //变更指标
  676. if prevEdbInfo != nil {
  677. //变更兄弟节点的排序
  678. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
  679. } else {
  680. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
  681. }
  682. }
  683. }
  684. }
  685. edbClassifyInfo.Sort = prevSort + 1
  686. edbClassifyInfo.ModifyTime = time.Now()
  687. updateCol = append(updateCol, "Sort", "ModifyTime")
  688. } else if prevClassify == nil && nextClassify == nil && prevEdbInfo == nil && nextEdbInfo == nil && parentClassifyId > 0 {
  689. //处理只拖动到目录里,默认放到目录底部的情况
  690. var maxSort int
  691. maxSort, err = GetEdbClassifyMaxSort(parentClassifyId, classifyType)
  692. if err != nil {
  693. errMsg = "移动失败"
  694. err = errors.New("查询组内排序信息失败,Err:" + err.Error())
  695. return
  696. }
  697. edbClassifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
  698. edbClassifyInfo.ModifyTime = time.Now()
  699. updateCol = append(updateCol, "Sort", "ModifyTime")
  700. } else {
  701. // 拖动到父级分类的第一位
  702. firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
  703. if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
  704. errMsg = "移动失败"
  705. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
  706. return
  707. }
  708. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  709. if firstClassify != nil && firstClassify.ClassifyId > 0 && firstClassify.Sort == 0 {
  710. updateSortStr := ` sort + 1 `
  711. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
  712. //该分类下的所有指标也需要+1
  713. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
  714. } else {
  715. //如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
  716. firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
  717. if tErr != nil && !utils.IsErrNoRow(tErr) {
  718. errMsg = "移动失败"
  719. err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
  720. return
  721. }
  722. //如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
  723. if firstEdb != nil && firstEdb.ClassifyId > 0 && firstEdb.Sort == 0 {
  724. updateSortStr := ` sort + 1 `
  725. _ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
  726. _ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
  727. }
  728. }
  729. edbClassifyInfo.Sort = 0 //那就是排在第一位
  730. edbClassifyInfo.ModifyTime = time.Now()
  731. updateCol = append(updateCol, "Sort", "ModifyTime")
  732. }
  733. oldClassifyIdPath := edbClassifyInfo.ClassifyIdPath
  734. oldClassifyNamePath := edbClassifyInfo.ClassifyNamePath
  735. newClassifyNamePath := fmt.Sprint(parentEdbClassifyInfo.ClassifyNamePath, `|`, edbClassifyInfo.ClassifyName)
  736. newClassifyIdPath := fmt.Sprint(parentEdbClassifyInfo.ClassifyIdPath, `,`, edbClassifyInfo.ClassifyId)
  737. //更新
  738. if len(updateCol) > 0 {
  739. edbClassifyInfo.ClassifyNamePath = newClassifyNamePath
  740. edbClassifyInfo.ClassifyIdPath = newClassifyIdPath
  741. updateCol = append(updateCol, "ClassifyNamePath", "ClassifyIdPath")
  742. err = edbClassifyInfo.Update(updateCol)
  743. if err != nil {
  744. errMsg = "移动失败"
  745. err = errors.New("修改失败,Err:" + err.Error())
  746. return
  747. }
  748. //更新对应分类的root_id和层级
  749. if oldParentId != parentClassifyId {
  750. if len(classifyIds) > 0 {
  751. levelStep := edbClassifyInfo.Level - oldLevel
  752. err = data_manage.UpdateEdbClassifyChildByParentClassifyId(classifyIds, edbClassifyInfo.RootId, levelStep)
  753. if err != nil {
  754. errMsg = "移动失败"
  755. err = errors.New("更新子分类失败,Err:" + err.Error())
  756. return
  757. }
  758. }
  759. }
  760. }
  761. return
  762. }