system.go 7.4 KB

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