system.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package services
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_api/models/system"
  5. "eta_gn/eta_api/services/third"
  6. "eta_gn/eta_api/utils"
  7. "fmt"
  8. "strconv"
  9. "time"
  10. )
  11. func GetRoleTypeCode(roleType string) string {
  12. var roleTypeCode string
  13. switch roleType {
  14. case utils.ROLE_TYPE_ADMIN:
  15. roleTypeCode = utils.ROLE_TYPE_CODE_ADMIN
  16. case utils.ROLE_TYPE_FICC_ADMIN:
  17. roleTypeCode = utils.ROLE_TYPE_CODE_FICC_ADMIN
  18. case utils.ROLE_TYPE_FICC_SELLER:
  19. roleTypeCode = utils.ROLE_TYPE_CODE_FICC_SELLER
  20. case utils.ROLE_TYPE_RAI_ADMIN:
  21. roleTypeCode = utils.ROLE_TYPE_CODE_RAI_ADMIN
  22. case utils.ROLE_TYPE_FICC_GROUP, utils.ROLE_TYPE_FICC_MANAGER:
  23. roleTypeCode = utils.ROLE_TYPE_CODE_FICC_GROUP
  24. case utils.ROLE_TYPE_RAI_GROUP:
  25. roleTypeCode = utils.ROLE_TYPE_CODE_RAI_GROUP
  26. case utils.ROLE_TYPE_FICC_DEPARTMENT:
  27. roleTypeCode = utils.ROLE_TYPE_CODE_FICC_DEPARTMENT
  28. case utils.ROLE_TYPE_RAI_DEPARTMENT:
  29. roleTypeCode = utils.ROLE_TYPE_CODE_RAI_DEPARTMENT
  30. case utils.ROLE_TYPE_FICC_RESEARCHR:
  31. roleTypeCode = utils.ROLE_TYPE_CODE_FICC_RESEARCHR
  32. case utils.ROLE_TYPE_RAI_RESEARCHR:
  33. roleTypeCode = utils.ROLE_TYPE_CODE_RAI_RESEARCHR
  34. default:
  35. roleTypeCode = utils.ROLE_TYPE_ADMIN
  36. }
  37. return roleTypeCode
  38. }
  39. // GetMenuTreeRecursive 递归菜单树
  40. func GetMenuTreeRecursive(list []*system.SysMenuItem, parentId int) []*system.SysMenuItem {
  41. res := make([]*system.SysMenuItem, 0)
  42. for _, v := range list {
  43. if v.ParentId == parentId {
  44. v.Children = GetMenuTreeRecursive(list, v.MenuId)
  45. res = append(res, v)
  46. }
  47. }
  48. return res
  49. }
  50. // BuildGroupTreeV2 构建分组树
  51. func BuildGroupTreeV2(groups []*system.SysFullGroup, groupAdmins map[int][]*system.DepartmentUserTree) map[int][]*system.DepartmentUserTree {
  52. // 创建分组ID到节点的映射
  53. groupMap := make(map[int]*system.DepartmentUserTree)
  54. idList := make([]int, 0, len(groups))
  55. // 初始化所有节点,不管父子顺序
  56. for _, g := range groups {
  57. idList = append(idList, g.GroupId)
  58. node := &system.DepartmentUserTree{
  59. NodeId: g.GroupId,
  60. NodeType: 2,
  61. NodeName: g.GroupName,
  62. Children: make([]*system.DepartmentUserTree, 0),
  63. }
  64. // 添加该分组的管理员
  65. if admins, ok := groupAdmins[g.GroupId]; ok {
  66. node.Children = append(node.Children, admins...)
  67. }
  68. groupMap[g.GroupId] = node
  69. }
  70. // 构建父子关系
  71. //rootNodes := make([]*system.DepartmentUserTree, 0)
  72. // 部门与分组的关系
  73. groupTree := make(map[int][]*system.DepartmentUserTree)
  74. for _, g := range groups {
  75. node := groupMap[g.GroupId]
  76. if g.ParentId == 0 || g.ParentId == -1 {
  77. // 如果是根节点
  78. //rootNodes = append(rootNodes, node)
  79. nodeList, ok := groupTree[g.DepartmentId]
  80. if !ok {
  81. nodeList = make([]*system.DepartmentUserTree, 0)
  82. }
  83. groupTree[g.DepartmentId] = append(nodeList, node)
  84. } else {
  85. // 如果是非根节点,找到父节点并添加到父节点的Children中
  86. parentNode, ok := groupMap[g.ParentId]
  87. if !ok {
  88. // 父节点不存在,继续处理下一个
  89. continue
  90. }
  91. parentNode.Children = append(parentNode.Children, node)
  92. }
  93. }
  94. return groupTree
  95. }
  96. // GetMenuList
  97. // @Description: 获取菜单列表
  98. // @author: Roc
  99. // @datetime 2025-06-10 11:16:34
  100. // @param token string
  101. // @param roleId int
  102. // @return items []*system.SysMenu
  103. // @return err error
  104. func GetMenuList(token string, roleId int) (items []*system.SysMenu, err error) {
  105. items = make([]*system.SysMenu, 0)
  106. if token == `` || utils.GnSciUserApiUrl == `` {
  107. // 没有token,那么就直接通过角色吧
  108. items, err = system.GetMenuButtonApisByRoleId(roleId)
  109. if err != nil {
  110. return
  111. }
  112. return
  113. }
  114. // 先从缓存里面获取,如果取不到,那么再去调用接口
  115. key := fmt.Sprintf("%s%s", utils.CACHE_USER_MENU, utils.MD5(token))
  116. menuJsonStr, tmpErr := utils.Rc.RedisString(key)
  117. if tmpErr == nil && menuJsonStr != `` {
  118. err = json.Unmarshal([]byte(menuJsonStr), &items)
  119. if err == nil {
  120. return
  121. }
  122. }
  123. resp, err := third.GetUserInfo(token)
  124. if err != nil {
  125. fmt.Println(err)
  126. return
  127. }
  128. if resp.Info.Resource != nil && len(resp.Info.Resource) > 0 {
  129. for _, v := range resp.Info.Resource {
  130. var nameEn, path, iconPath, component, levelPath, buttonCode, api string
  131. if v.NameEn != nil {
  132. nameEn = *v.NameEn
  133. }
  134. if v.PATH != nil {
  135. path = *v.PATH
  136. }
  137. if v.Icon != nil {
  138. iconPath = *v.Icon
  139. }
  140. if v.Component != nil {
  141. component = *v.Component
  142. }
  143. if v.LevelPath != nil {
  144. levelPath = *v.LevelPath
  145. }
  146. if v.ButtonCode != nil {
  147. buttonCode = *v.ButtonCode
  148. }
  149. if v.Api != nil {
  150. api = *v.Api
  151. }
  152. var menuType int
  153. if v.MenuType != `` {
  154. menuType, _ = strconv.Atoi(v.MenuType)
  155. }
  156. items = append(items, &system.SysMenu{
  157. MenuId: v.MenuId,
  158. ParentId: v.ParentId,
  159. Name: v.MenuName,
  160. Sort: fmt.Sprint(v.OrderNum),
  161. Path: path,
  162. IconPath: iconPath,
  163. Component: component,
  164. //Hidden: v.Hi,
  165. IsLevel: v.IsLevel,
  166. LevelPath: levelPath,
  167. MenuType: menuType,
  168. ButtonCode: buttonCode,
  169. //CreateTime: time.Time{},
  170. //ModifyTime: time.Time{},
  171. Api: api,
  172. NameEn: nameEn,
  173. })
  174. }
  175. }
  176. // 30分钟缓存,避免多次调用接口获取数据
  177. menuJsonByte, tmpErr := json.Marshal(items)
  178. if tmpErr == nil {
  179. _ = utils.Rc.Put(key, menuJsonByte, 30*time.Minute)
  180. }
  181. return
  182. }
  183. type TopMenuItemResp struct {
  184. OrderNum int
  185. MenuId int
  186. MenuName string
  187. IsFrame int ` description:"1左边,0右边"`
  188. Path string `description:"跳转地址"`
  189. }
  190. // GetTopMenuList
  191. // @Description: 获取顶部的菜单
  192. // @author: Roc
  193. // @datetime 2025-06-19 17:11:31
  194. // @param userId int
  195. // @return items []TopMenuItemResp
  196. // @return err error
  197. func GetTopMenuList(token string) (items []TopMenuItemResp, err error) {
  198. items = make([]TopMenuItemResp, 0)
  199. if utils.GnSciUserApiUrl == `` || token == `` {
  200. return
  201. }
  202. // 先从缓存里面获取,如果取不到,那么再去调用接口
  203. key := fmt.Sprintf("%s%d", utils.CACHE_SCI_TOP_MENU, utils.MD5(token))
  204. menuJsonStr, tmpErr := utils.Rc.RedisString(key)
  205. if tmpErr == nil && menuJsonStr != `` {
  206. err = json.Unmarshal([]byte(menuJsonStr), &items)
  207. if err == nil {
  208. return
  209. }
  210. }
  211. resp, err := third.GetTopMenuInfo(token)
  212. if err != nil {
  213. fmt.Println(err)
  214. return
  215. }
  216. if resp.Info != nil && len(resp.Info) > 0 {
  217. for _, v := range resp.Info {
  218. items = append(items, TopMenuItemResp{
  219. MenuId: v.MenuId,
  220. MenuName: v.MenuName,
  221. IsFrame: v.IsFrame,
  222. Path: v.Path,
  223. OrderNum: v.OrderNum,
  224. })
  225. }
  226. }
  227. // 30分钟缓存,避免多次调用接口获取数据
  228. menuJsonByte, tmpErr := json.Marshal(items)
  229. if tmpErr == nil {
  230. _ = utils.Rc.Put(key, menuJsonByte, 30*time.Minute)
  231. }
  232. return
  233. }