workDesktop.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package entity
  2. import (
  3. MC "app.yhyue.com/moapp/jybase/common"
  4. "database/sql"
  5. "fmt"
  6. "github.com/zeromicro/go-zero/core/logx"
  7. "sort"
  8. "strings"
  9. "userCenter/rpc/pb"
  10. )
  11. // WorkDesktopMenu 工作桌面菜单信息
  12. type WorkDesktopMenu struct {
  13. MenuTree []*JYMenu
  14. UserId string
  15. TimeOut int
  16. BigMemberOff bool
  17. }
  18. // JYMenu 工作桌面菜单内容
  19. type JYMenu struct {
  20. Id int
  21. Name string
  22. OrderId int
  23. ParentId int
  24. PowerIds string
  25. CheckCode int
  26. Url string
  27. Icon string
  28. AdditionalInfo Additional
  29. AppType string
  30. OpenType string
  31. Children []*JYMenu
  32. }
  33. type Additional struct {
  34. Title string `json:"title"`
  35. Content string `json:"content"`
  36. ConfirmUrl string `json:"confirmUrl"`
  37. ConfirmText string `json:"confirmText"`
  38. IsShowCancel bool `json:"isShowCancel"`
  39. }
  40. // WorkMenuTree 菜单-格式化-tree
  41. func (m *WorkDesktopMenu) WorkMenuTree(parentId int) (jyMenu []*JYMenu) {
  42. jyMenu = make([]*JYMenu, 0)
  43. for _, mv := range m.MenuTree {
  44. if mv.ParentId == parentId {
  45. mv.Children = m.WorkMenuTree(mv.Id)
  46. sort.SliceStable(mv.Children, func(i, j int) bool {
  47. return mv.Children[i].OrderId < mv.Children[j].OrderId
  48. })
  49. jyMenu = append(jyMenu, mv)
  50. }
  51. }
  52. sort.SliceStable(jyMenu, func(i, j int) bool {
  53. return jyMenu[i].OrderId < jyMenu[j].OrderId
  54. })
  55. //bytes, _ := json.MarshalIndent(jyMenu, "", " ")
  56. //fmt.Printf("%s\n", bytes)
  57. //log.Println("-------")
  58. return
  59. }
  60. var verification = map[string]string{
  61. "商机管理": "100,101,102,110,111,112",
  62. "大会员": "1",
  63. "超级订阅": "200,201",
  64. }
  65. // WorkMenuFormat 菜单 格式化
  66. func (m *WorkDesktopMenu) WorkMenuFormat() ([]*pb.MenuList, error) {
  67. logx.Info("树的长度:", len(m.MenuTree))
  68. menuList := make([]*pb.MenuList, 0)
  69. for _, mv := range m.MenuTree {
  70. //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示)
  71. usable := m.VerifyPermissions(mv.PowerIds)
  72. //checkCode==1 验证权限结果 无权限不显示
  73. if !usable && mv.CheckCode == 1 {
  74. continue
  75. }
  76. oneLevel := &pb.MenuList{
  77. Name: mv.Name,
  78. Icon: mv.Icon,
  79. Url: mv.Url,
  80. Usable: MC.If(mv.PowerIds != "", usable && mv.CheckCode == 1, true).(bool),
  81. Child: []*pb.SecondLevelMenu{},
  82. }
  83. if len(mv.Children) > 0 {
  84. for _, sv := range mv.Children {
  85. //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示)
  86. usable := m.VerifyPermissions(mv.PowerIds)
  87. //checkCode==1 验证权限结果 无权限不显示
  88. if !usable && mv.CheckCode == 1 {
  89. continue
  90. }
  91. secondLevel := &pb.SecondLevelMenu{
  92. Name: sv.Name,
  93. Icon: sv.Icon,
  94. Url: sv.Url,
  95. Usable: MC.If(mv.PowerIds != "", usable && mv.CheckCode == 1, true).(bool),
  96. Child: []*pb.ThreeLevelMenu{},
  97. }
  98. if len(sv.Children) > 0 {
  99. for _, tv := range sv.Children {
  100. //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示)
  101. usable := m.VerifyPermissions(mv.PowerIds)
  102. //checkCode==1 验证权限结果 无权限不显示
  103. if !usable && mv.CheckCode == 1 {
  104. continue
  105. }
  106. threeLevel := &pb.ThreeLevelMenu{
  107. Name: tv.Name,
  108. Icon: tv.Icon,
  109. Url: tv.Url,
  110. Usable: MC.If(mv.PowerIds != "", usable && mv.CheckCode == 1, true).(bool),
  111. AppType: tv.AppType,
  112. OpenType: tv.OpenType,
  113. IsCheck: tv.CheckCode > 0, //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示)
  114. TipInfo: &pb.TipInfo{
  115. Title: tv.AdditionalInfo.Title,
  116. Content: tv.AdditionalInfo.Content,
  117. ConfirmUrl: tv.AdditionalInfo.ConfirmUrl,
  118. ConfirmText: tv.AdditionalInfo.ConfirmText,
  119. IsShowCancel: tv.AdditionalInfo.IsShowCancel,
  120. },
  121. }
  122. if len(tv.Children) > 0 {
  123. for _, fv := range tv.Children {
  124. if fv.Name == "" {
  125. continue
  126. }
  127. threeLevel.Url = MC.If(fv.Url != "", fv.Url, tv.Url).(string)
  128. threeLevel.Icon = MC.If(fv.Icon != "", fv.Icon, tv.Icon).(string)
  129. if fv.AdditionalInfo.Title != "" {
  130. threeLevel.TipInfo = &pb.TipInfo{
  131. Title: fv.AdditionalInfo.Title,
  132. Content: fv.AdditionalInfo.Content,
  133. ConfirmUrl: fv.AdditionalInfo.ConfirmUrl,
  134. ConfirmText: fv.AdditionalInfo.ConfirmText,
  135. IsShowCancel: fv.AdditionalInfo.IsShowCancel,
  136. }
  137. }
  138. //订阅是商机管理优先 其他功能是大会员优先(这样是有问题的 有些功能超级订阅用户可用 大会员用户权不可用)
  139. //解决上面的问题:菜单只保留三级菜单;四级菜单信息不入库;判断三级菜单权限
  140. switch {
  141. case strings.Contains(tv.Name, "订阅"):
  142. switch {
  143. case strings.HasPrefix(fv.Name, "商机管理") && m.VerifyPermissions(verification["商机管理"]):
  144. break
  145. case strings.HasPrefix(fv.Name, "大会员") && m.VerifyPermissions(verification["大会员"]):
  146. break
  147. case strings.HasPrefix(fv.Name, "超级订阅") && m.VerifyPermissions(verification["超级订阅"]):
  148. break
  149. }
  150. default:
  151. switch {
  152. case strings.HasPrefix(fv.Name, "大会员") && m.VerifyPermissions(verification["大会员"]):
  153. break
  154. case strings.HasPrefix(fv.Name, "商机管理") && m.VerifyPermissions(verification["商机管理"]):
  155. break
  156. case strings.HasPrefix(fv.Name, "超级订阅") && m.VerifyPermissions(verification["超级订阅"]):
  157. break
  158. }
  159. }
  160. }
  161. }
  162. if threeLevel != nil {
  163. secondLevel.Child = append(secondLevel.Child, threeLevel)
  164. }
  165. }
  166. }
  167. oneLevel.Child = append(oneLevel.Child, secondLevel)
  168. }
  169. }
  170. menuList = append(menuList, oneLevel)
  171. }
  172. //bytes, _ := json.MarshalIndent(menuList, "", " ")
  173. //fmt.Printf("%s\n", bytes)
  174. return menuList, nil
  175. }
  176. // VerifyPermissions 是否有权限可用此服务
  177. func (m *WorkDesktopMenu) VerifyPermissions(powerIds string) (b bool) {
  178. if powerIds == "" {
  179. return true
  180. }
  181. if len(strings.Split(powerIds, ",")) > 0 {
  182. PowerLock.Lock()
  183. userPower := UserPowerMapMap[m.UserId]
  184. PowerLock.Unlock()
  185. if userPower == nil {
  186. userPower = AutoUserPowerInfo(m.UserId, m.TimeOut, m.BigMemberOff)
  187. }
  188. func(powerIds string) {
  189. UserPowerLock[m.UserId].Lock()
  190. defer UserPowerLock[m.UserId].Unlock()
  191. for _, pv := range strings.Split(powerIds, ",") {
  192. if userPower[pv] > 0 {
  193. b = true
  194. break
  195. }
  196. }
  197. }(powerIds)
  198. }
  199. return
  200. }
  201. //常用功能
  202. const (
  203. WorkCommonly = "work_commonly"
  204. WorkMenu = "work_menu"
  205. )
  206. var (
  207. InsertCollKey = []string{"appid", "userid", "platform", "field", "value", "ischeck"}
  208. )
  209. //更新常用功能
  210. func CommonlyUpdate(in *pb.WorkDesktopComprehensiveReq) (B bool, M string) {
  211. //事务 1:查; 2: 存;3: 删;
  212. //此功能是否需要验证权限
  213. var parametersSelect []string
  214. var idsSelect []interface{}
  215. for _, mid := range strings.Split(in.MenuIds, ",") {
  216. parametersSelect = append(parametersSelect, "?")
  217. idsSelect = append(idsSelect, mid)
  218. }
  219. menuSelectData := BaseMysql.SelectBySql(fmt.Sprintf(`SELECT id,powerids from %s WHERE id IN (%s) AND status = 0`, WorkMenu, strings.Join(parametersSelect, ",")), idsSelect...)
  220. if menuSelectData != nil && len(*menuSelectData) > 0 {
  221. var powerIdsMap = map[int]int{} //2:需要权限;1:不需要权限
  222. for _, mv := range *menuSelectData {
  223. if MC.IntAll(mv["id"]) == 0 {
  224. continue
  225. }
  226. powerIdsMap[MC.IntAll(mv["id"])] = MC.If(MC.ObjToString(mv["powerids"]) != "", 2, 1).(int)
  227. }
  228. if powerIdsMap != nil {
  229. //此处需要事务
  230. if B = BaseMysql.ExecTx("常用功能批量更新", func(tx *sql.Tx) bool {
  231. //查
  232. var delId = 0
  233. existingData := BaseMysql.SelectBySql(`SELECT id,value FROM `+WorkCommonly+` WHERE userid = ? AND appid = ? AND field = ? AND platform = ? ORDER BY id DESC `, in.UserId, in.AppId, in.ActionMode, in.Platform)
  234. if existingData != nil && len(*existingData) > 0 {
  235. delId = MC.IntAll((*existingData)[0]["id"])
  236. }
  237. //先保存
  238. var insertValue []interface{}
  239. for id, checkCode := range powerIdsMap {
  240. insertValue = append(insertValue, in.AppId, in.UserId, in.Platform, in.ActionMode, fmt.Sprint(id), checkCode > 1)
  241. }
  242. if len(insertValue)/len(InsertCollKey) > 0 {
  243. x, _ := BaseMysql.InsertBatchByTx(tx, WorkCommonly, InsertCollKey, insertValue)
  244. if x < 0 {
  245. logx.Info("常用功能更新数据处理异常")
  246. return false
  247. }
  248. }
  249. //再删除
  250. if delId > 0 {
  251. if BaseMysql.UpdateOrDeleteBySqlByTx(tx, `DELETE FROM `+WorkCommonly+` WHERE userid = ? AND field = ? AND id <= ? AND platform = ? `, in.UserId, in.ActionMode, delId, in.Platform) < 0 {
  252. logx.Info("常用功能删除数据处理异常")
  253. return false
  254. }
  255. }
  256. return true
  257. }); !B {
  258. M = "常用功能批量更新数据失败"
  259. }
  260. } else {
  261. M = "暂无此常用功能"
  262. }
  263. } else {
  264. M = "常用功能查询异常"
  265. }
  266. return
  267. }