chart_classify.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. package data
  2. import (
  3. "errors"
  4. "eta/eta_mobile/models/data_manage"
  5. "eta/eta_mobile/models/system"
  6. "eta/eta_mobile/services/data/data_manage_permission"
  7. "eta/eta_mobile/services/eta_forum"
  8. "eta/eta_mobile/utils"
  9. "fmt"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. func chartClassifyHaveChild(allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems) (childs []*data_manage.ChartClassifyItems, yes bool) {
  15. for _, v := range allNode {
  16. if v.ParentId == node.ChartClassifyId {
  17. childs = append(childs, v)
  18. }
  19. }
  20. if len(childs) > 0 {
  21. yes = true
  22. }
  23. return
  24. }
  25. func ChartClassifyItemsMakeTree(sysUser *system.Admin, allNode []*data_manage.ChartClassifyItems, node *data_manage.ChartClassifyItems, permissionClassifyIdList []int) {
  26. node.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(node.IsJoinPermission, node.ChartClassifyId, permissionClassifyIdList)
  27. button := GetChartClassifyOpButton(sysUser, node.SysUserId, node.HaveOperaAuth)
  28. node.Button = button
  29. childs, _ := chartClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
  30. if len(childs) > 0 {
  31. for _, child := range childs {
  32. child.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(child.IsJoinPermission, child.ChartClassifyId, permissionClassifyIdList)
  33. childButton := GetChartClassifyOpButton(sysUser, child.SysUserId, child.HaveOperaAuth)
  34. if child.Level == 3 {
  35. childButton.AddButton = false //第三级的话,默认图表都是没有添加按钮的
  36. }
  37. child.Button = childButton
  38. //node.Children = append(node.Children, child)
  39. }
  40. node.Children = append(node.Children, childs[0:]...) //添加子节点
  41. for _, v := range childs {
  42. v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ChartClassifyId, permissionClassifyIdList)
  43. //查询子节点的子节点,并添加到子节点
  44. _, has := chartClassifyHaveChild(allNode, v)
  45. if has {
  46. ChartClassifyItemsMakeTree(sysUser, allNode, v, permissionClassifyIdList) //递归添加节点
  47. } else {
  48. childrenArr := make([]*data_manage.ChartClassifyItems, 0)
  49. v.Children = childrenArr
  50. }
  51. }
  52. } else {
  53. childrenArr := make([]*data_manage.ChartClassifyItems, 0)
  54. node.Children = childrenArr
  55. }
  56. }
  57. func FixChartClassify() {
  58. //新增三级分类
  59. list, err := data_manage.GetChartClassifyByLevel(2, 1)
  60. if err != nil {
  61. return
  62. }
  63. for _, v := range list {
  64. classify := new(data_manage.ChartClassify)
  65. classify.ParentId = v.ChartClassifyId
  66. classify.ChartClassifyName = v.ChartClassifyName
  67. classify.HasData = 0
  68. classify.CreateTime = time.Now()
  69. classify.ModifyTime = time.Now()
  70. if utils.RunMode == "debug" {
  71. classify.SysUserId = 11
  72. } else {
  73. classify.SysUserId = 163
  74. }
  75. classify.SysUserRealName = "admin"
  76. classify.Level = 3
  77. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  78. classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  79. classify.Sort = v.Sort
  80. classify.Source = utils.CHART_SOURCE_DEFAULT
  81. id, err := data_manage.AddChartClassify(classify)
  82. if err != nil {
  83. return
  84. }
  85. err = data_manage.FIXChartClassifyId(int(id), v.ChartClassifyId)
  86. if err != nil {
  87. return
  88. }
  89. }
  90. }
  91. func FixChartClassifySysUserId() {
  92. //获取所有父级分类信息
  93. list, err := data_manage.GetChartClassifyByLevel(2, 1)
  94. if err != nil {
  95. return
  96. }
  97. for _, v := range list {
  98. err := data_manage.EditChartClassifySysUser(v.ChartClassifyId, v.SysUserId, v.SysUserRealName)
  99. if err != nil {
  100. return
  101. }
  102. fmt.Println("ChartClassifyId:", v.ChartClassifyId)
  103. }
  104. fmt.Println("FixChartClassifySysUserId end")
  105. }
  106. // GetChartClassifyOpButton 获取ETA图库分类的操作权限
  107. func GetChartClassifyOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.ChartClassifyItemsButton) {
  108. // 没有数据权限就直接返回
  109. if !haveOperaAuth {
  110. return
  111. }
  112. //ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
  113. //if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
  114. button.AddButton = true
  115. button.OpButton = true
  116. button.DeleteButton = true
  117. button.MoveButton = true
  118. //}
  119. return
  120. }
  121. // GetCanOpChartClassify 获取是否允许添加图表分类
  122. func GetCanOpChartClassify(roleTypeCode string) (canOpClassify bool) {
  123. // 如果不是 超管 或者 ficc管理员 或者 ficc研究员,那么就没有权限
  124. if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, roleTypeCode) {
  125. canOpClassify = true
  126. }
  127. return
  128. }
  129. // GetChartOpButton 获取ETA图库的操作权限
  130. func GetChartOpButton(sysUser *system.Admin, belongUserId int, haveOperaAuth bool) (button data_manage.ChartClassifyItemsButton) {
  131. // 数据权限判断
  132. if !haveOperaAuth {
  133. return
  134. }
  135. //预测指标的添加人对该预测指标有全部操作权限,ficc管理员、超管对所有预测指标有全部操作权限;
  136. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.PredictEdbPermission == 1 {
  137. button.AddButton = true
  138. button.OpButton = true
  139. button.DeleteButton = true
  140. button.MoveButton = true
  141. }
  142. return
  143. }
  144. // HandleNoPermissionChart 图表列表返回,将没有权限的图表移除
  145. func HandleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermissionChartIdMap map[int]bool, sysUserId int) (newAllNodes []*data_manage.ChartClassifyItems) {
  146. // 涉及分类id
  147. classifyIdList := make([]int, 0)
  148. // 移除没有权限的图表
  149. newAllNodes = make([]*data_manage.ChartClassifyItems, 0)
  150. for _, node := range allNodes {
  151. // 二级分类
  152. tmpNodeInfo := *node
  153. tmpNodeList := make([]*data_manage.ChartClassifyItems, 0)
  154. if node.Children != nil {
  155. for _, chartInfo := range node.Children {
  156. // 如果指标不可见,那么就不返回该指标
  157. if _, ok := noPermissionChartIdMap[chartInfo.ChartInfoId]; ok {
  158. continue
  159. }
  160. tmpNodeList = append(tmpNodeList, chartInfo)
  161. classifyIdList = append(classifyIdList, chartInfo.ChartClassifyId)
  162. }
  163. }
  164. tmpNodeInfo.Children = tmpNodeList
  165. newAllNodes = append(newAllNodes, &tmpNodeInfo)
  166. classifyIdList = append(classifyIdList, node.ChartClassifyId)
  167. }
  168. // 数据权限
  169. if len(classifyIdList) > 0 {
  170. // 图表分类
  171. chartClassifyList, err := data_manage.GetChartClassifyByIdList(classifyIdList)
  172. if err != nil {
  173. return
  174. }
  175. chartClassifyMap := make(map[int]*data_manage.ChartClassify)
  176. for _, v := range chartClassifyList {
  177. chartClassifyMap[v.ChartClassifyId] = v
  178. }
  179. // 已授权分类id
  180. permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(sysUserId, 0, 0)
  181. if err != nil {
  182. return
  183. }
  184. for _, node := range newAllNodes {
  185. if node.Children != nil {
  186. for _, chartInfo := range node.Children {
  187. if currClassify, ok := chartClassifyMap[chartInfo.ChartClassifyId]; ok {
  188. chartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, currClassify.IsJoinPermission, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
  189. }
  190. }
  191. }
  192. if currClassify, ok := chartClassifyMap[node.ChartClassifyId]; ok {
  193. node.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(node.IsJoinPermission, currClassify.IsJoinPermission, node.ChartInfoId, node.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
  194. }
  195. }
  196. }
  197. return
  198. }
  199. // AddChartClassify
  200. // @Description: 添加图表分类
  201. // @author: Roc
  202. // @datetime 2024-04-17 14:48:23
  203. // @param chartClassifyName string
  204. // @param parentId int
  205. // @param level int
  206. // @param source int
  207. // @param lang string
  208. // @param sysUser *system.Admin
  209. // @return classifyInfo *data_manage.ChartClassify
  210. // @return err error
  211. // @return errMsg string
  212. // @return isSendEmail bool
  213. func AddChartClassify(chartClassifyName string, parentId, level, source int, lang string, sysUser *system.Admin) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
  214. isSendEmail = true
  215. errMsg = "保存分类失败"
  216. isSelected := 0
  217. // 校验分类名称相同的数量
  218. {
  219. var count int
  220. switch lang {
  221. case utils.EnLangVersion:
  222. count, err = data_manage.GetChartClassifyEnCount(chartClassifyName, parentId, source)
  223. default:
  224. count, err = data_manage.GetChartClassifyCount(chartClassifyName, parentId, source)
  225. }
  226. if err != nil {
  227. errMsg = "判断名称是否已存在失败"
  228. return
  229. }
  230. if count > 0 {
  231. errMsg = "分类名称已存在,请重新输入"
  232. err = errors.New(errMsg)
  233. isSendEmail = false
  234. return
  235. }
  236. }
  237. //获取该层级下最大的排序数
  238. maxSort, err := data_manage.GetChartClassifyMaxSort(parentId, source)
  239. //查询顶级rootId
  240. rootId := 0
  241. levelPath := ""
  242. if parentId > 0 {
  243. parentClassify, tErr := data_manage.GetChartClassifyById(parentId)
  244. if tErr != nil {
  245. if tErr.Error() == utils.ErrNoRow() {
  246. errMsg = "父级分类不存在"
  247. err = errors.New(errMsg)
  248. return
  249. }
  250. errMsg = "获取失败"
  251. err = errors.New("获取分类信息失败,Err:" + tErr.Error())
  252. return
  253. }
  254. rootId = parentClassify.RootId
  255. levelPath = parentClassify.LevelPath
  256. isSelected = parentClassify.IsSelected
  257. }
  258. classifyInfo = new(data_manage.ChartClassify)
  259. classifyInfo.ParentId = parentId
  260. classifyInfo.ChartClassifyName = chartClassifyName
  261. classifyInfo.ChartClassifyNameEn = chartClassifyName
  262. classifyInfo.HasData = 0
  263. classifyInfo.CreateTime = time.Now()
  264. classifyInfo.ModifyTime = time.Now()
  265. classifyInfo.SysUserId = sysUser.AdminId
  266. classifyInfo.SysUserRealName = sysUser.RealName
  267. classifyInfo.Level = level + 1
  268. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  269. classifyInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  270. classifyInfo.Sort = maxSort + 1
  271. classifyInfo.Source = source
  272. classifyInfo.RootId = rootId
  273. classifyInfo.IsSelected = isSelected
  274. newId, err := data_manage.AddChartClassify(classifyInfo)
  275. if err != nil {
  276. return
  277. }
  278. updateCols := make([]string, 0)
  279. if parentId == 0 { //一级目录的rootId等于自己本身
  280. classifyInfo.RootId = int(newId)
  281. updateCols = append(updateCols, "RootId")
  282. }
  283. if parentId > 0 {
  284. levelPath = fmt.Sprintf("%s%d,", levelPath, newId)
  285. } else {
  286. levelPath = fmt.Sprintf("%d,", newId)
  287. }
  288. updateCols = append(updateCols, "LevelPath")
  289. classifyInfo.LevelPath = levelPath
  290. classifyInfo.ChartClassifyId = int(newId)
  291. err = classifyInfo.Update(updateCols)
  292. if err != nil {
  293. errMsg = "更新分类失败"
  294. return
  295. }
  296. // 目前只有ETA图库需要继承分类权限
  297. if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
  298. go data_manage_permission.InheritParentClassify(5, classifyInfo.Source, classifyInfo.ChartClassifyId, classifyInfo.ParentId, classifyInfo.ChartClassifyName)
  299. if isSelected == utils.ChartClassifyIsSelected { // 如果分类设置为精选资源,则需要同步到ETA资源库
  300. go eta_forum.ChartClassifySave(classifyInfo.ChartClassifyId)
  301. }
  302. }
  303. return
  304. }
  305. // EditChartClassify
  306. // @Description: 修改图表分类
  307. // @author: Roc
  308. // @datetime 2024-04-17 14:59:37
  309. // @param chartClassifyId int
  310. // @param source int
  311. // @param chartClassifyName string
  312. // @param lang string
  313. // @param sysUser *system.Admin
  314. // @return classifyInfo *data_manage.ChartClassify
  315. // @return err error
  316. // @return errMsg string
  317. // @return isSendEmail bool
  318. func EditChartClassify(chartClassifyId, source int, chartClassifyName, lang string, sysUser *system.Admin) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
  319. isSendEmail = true
  320. errMsg = "保存失败"
  321. // 获取分类信息
  322. classifyInfo, err = data_manage.GetChartClassifyById(chartClassifyId)
  323. if err != nil {
  324. return
  325. }
  326. // 分类来源校验
  327. if classifyInfo.Source != source {
  328. errMsg = "图表分类异常"
  329. err = errors.New(fmt.Sprintf("图表分类来源异常,修改来源:%d,分类来源:%d", source, classifyInfo.Source))
  330. isSendEmail = false
  331. return
  332. }
  333. // 权限校验
  334. if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
  335. // 已授权分类id
  336. permissionClassifyIdList, tmpErr := data_manage_permission.GetUserChartClassifyPermissionList(sysUser.AdminId, classifyInfo.ChartClassifyId)
  337. if tmpErr != nil {
  338. err = errors.New("获取已授权分类id数据失败,Err:" + err.Error())
  339. return
  340. }
  341. haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(classifyInfo.IsJoinPermission, classifyInfo.ChartClassifyId, permissionClassifyIdList)
  342. // 权限校验
  343. {
  344. button := GetChartClassifyOpButton(sysUser, classifyInfo.SysUserId, haveOperaAuth)
  345. if !button.OpButton {
  346. errMsg = "无操作权限"
  347. err = errors.New(errMsg)
  348. isSendEmail = false
  349. return
  350. }
  351. }
  352. }
  353. // 需要变更的字段
  354. updateCols := make([]string, 0)
  355. // 语言版本校验
  356. switch lang {
  357. case utils.EnLangVersion:
  358. if classifyInfo.ChartClassifyNameEn != chartClassifyName {
  359. count, tmpErr := data_manage.GetChartClassifyEnCount(chartClassifyName, classifyInfo.ParentId, source)
  360. if tmpErr != nil {
  361. errMsg = "判断名称是否已存在失败"
  362. err = errors.New("判断名称是否已存在失败,Err:" + tmpErr.Error())
  363. return
  364. }
  365. if count > 0 {
  366. errMsg = "分类名称已存在,请重新输入"
  367. err = errors.New(errMsg)
  368. isSendEmail = false
  369. return
  370. }
  371. classifyInfo.ChartClassifyNameEn = chartClassifyName
  372. classifyInfo.ModifyTime = time.Now()
  373. updateCols = append(updateCols, "ChartClassifyNameEn", "ModifyTime")
  374. }
  375. default:
  376. if classifyInfo.ChartClassifyName != chartClassifyName {
  377. count, tmpErr := data_manage.GetChartClassifyCount(chartClassifyName, classifyInfo.ParentId, source)
  378. if tmpErr != nil {
  379. errMsg = "判断名称是否已存在失败"
  380. err = errors.New("判断名称是否已存在失败,Err:" + tmpErr.Error())
  381. return
  382. }
  383. if count > 0 {
  384. errMsg = "分类名称已存在,请重新输入"
  385. err = errors.New(errMsg)
  386. isSendEmail = false
  387. return
  388. }
  389. classifyInfo.ChartClassifyName = chartClassifyName
  390. classifyInfo.ModifyTime = time.Now()
  391. updateCols = append(updateCols, "ChartClassifyName", "ModifyTime")
  392. }
  393. }
  394. if len(updateCols) > 0 {
  395. err = classifyInfo.Update(updateCols)
  396. }
  397. return
  398. }
  399. // GetChartClassifyTreeRecursive 递归获取分类树形结构
  400. func GetChartClassifyTreeRecursive(list []*data_manage.ChartClassifyItems, parentId int) []*data_manage.ChartClassifyItems {
  401. res := make([]*data_manage.ChartClassifyItems, 0)
  402. for _, v := range list {
  403. if v.ParentId == parentId {
  404. v.Children = GetChartClassifyTreeRecursive(list, v.ChartClassifyId)
  405. res = append(res, v)
  406. }
  407. }
  408. return res
  409. }
  410. // GetChartClassifyParentRecursive 根据子目录递归父级目录
  411. func GetChartClassifyParentRecursive(list []*data_manage.ChartClassifyItems, classifyId int) []*data_manage.ChartClassifyItems {
  412. res := make([]*data_manage.ChartClassifyItems, 0)
  413. for _, v := range list {
  414. if v.ChartClassifyId == classifyId {
  415. if v.ParentId > 0 {
  416. res = GetChartClassifyParentRecursive(list, v.ParentId)
  417. }
  418. res = append(res, v)
  419. }
  420. }
  421. return res
  422. }
  423. // 新增处理子分类精选状态的函数
  424. func UpdateChildClassifySelection(classifyInfo *data_manage.ChartClassify, parentClassifyInfo *data_manage.ChartClassify, oldSelected int) error {
  425. // 处理一级目录
  426. if classifyInfo.ParentId == 0 {
  427. if oldSelected != classifyInfo.IsSelected {
  428. return data_manage.UpdateChartClassifyIsSelected(
  429. classifyInfo.Source,
  430. classifyInfo.IsSelected,
  431. classifyInfo.LevelPath,
  432. )
  433. }
  434. return nil
  435. }else {
  436. // 处理二级及以上目录
  437. if classifyInfo.IsSelected != parentClassifyInfo.IsSelected {
  438. return data_manage.UpdateChartClassifyIsSelected(
  439. classifyInfo.Source,
  440. parentClassifyInfo.IsSelected,
  441. classifyInfo.LevelPath,
  442. )
  443. }
  444. }
  445. return nil
  446. }
  447. // 新增内部函数
  448. func UpdateChartClassifyLevelPathWithChildren(chartClassifyInfo *data_manage.ChartClassify, parentChartClassifyInfo *data_manage.ChartClassify, oldParentId int, oldLevelPath string) error {
  449. levelPath := fmt.Sprintf("%s%d,", parentChartClassifyInfo.LevelPath, chartClassifyInfo.ChartClassifyId)
  450. chartClassifyInfo.LevelPath = levelPath
  451. if err := chartClassifyInfo.Update([]string{"LevelPath"}); err != nil {
  452. return fmt.Errorf("修改失败,Err:" + err.Error())
  453. }
  454. // 更新子分类的levelpath
  455. tmpList, err := data_manage.GetChartClassifyByLevelPath(oldLevelPath, chartClassifyInfo.Source)
  456. if err != nil {
  457. return fmt.Errorf("保存分类失败,Err:" + err.Error())
  458. }
  459. // 把原先的父级levePath,替换成最新的父级序列
  460. for _, tmp := range tmpList {
  461. after, _ := strings.CutPrefix(tmp.LevelPath, oldLevelPath)
  462. if after != "" {
  463. tmp.LevelPath = levelPath + after
  464. tmp.ModifyTime = time.Now()
  465. if e := tmp.Update([]string{"LevelPath", "ModifyTime"}); e != nil {
  466. return fmt.Errorf("修改子分类,Err:" + e.Error())
  467. }
  468. }
  469. }
  470. return nil
  471. }
  472. // GetChartClassifyChildrenRecursive 根据父目录递归子级目录
  473. func GetChartClassifyChildrenRecursive(list []*data_manage.ChartClassifyItems, parentId int) []*data_manage.ChartClassifyItems {
  474. var res []*data_manage.ChartClassifyItems
  475. for _, v := range list {
  476. if v.ParentId == parentId {
  477. // 递归调用以获取更深层次的子级
  478. children := GetChartClassifyChildrenRecursive(list, v.ChartClassifyId)
  479. // 将当前节点和所有子节点添加到结果中
  480. res = append(res, v)
  481. res = append(res, children...)
  482. } else if v.ChartClassifyId == parentId {
  483. // 将当前节点添加到结果中
  484. res = append(res, v)
  485. }
  486. }
  487. return res
  488. }