package entity import ( MC "app.yhyue.com/moapp/jybase/common" "database/sql" "fmt" "github.com/zeromicro/go-zero/core/logx" "sort" "strings" "userCenter/rpc/pb" ) // WorkDesktopMenu 工作桌面菜单信息 type WorkDesktopMenu struct { MenuTree []*JYMenu UserId string TimeOut int BigMemberOff bool } // JYMenu 工作桌面菜单内容 type JYMenu struct { Id int Name string OrderId int ParentId int PowerIds string CheckCode int Url string Icon string AdditionalInfo Additional AppType string OpenType string Children []*JYMenu } type Additional struct { Title string `json:"title"` Content string `json:"content"` ConfirmUrl string `json:"confirmUrl"` ConfirmText string `json:"confirmText"` IsShowCancel bool `json:"isShowCancel"` } // WorkMenuTree 菜单-格式化-tree func (m *WorkDesktopMenu) WorkMenuTree(parentId int) (jyMenu []*JYMenu) { jyMenu = make([]*JYMenu, 0) for _, mv := range m.MenuTree { if mv.ParentId == parentId { mv.Children = m.WorkMenuTree(mv.Id) sort.SliceStable(mv.Children, func(i, j int) bool { return mv.Children[i].OrderId < mv.Children[j].OrderId }) jyMenu = append(jyMenu, mv) } } sort.SliceStable(jyMenu, func(i, j int) bool { return jyMenu[i].OrderId < jyMenu[j].OrderId }) //bytes, _ := json.MarshalIndent(jyMenu, "", " ") //fmt.Printf("%s\n", bytes) //log.Println("-------") return } var verification = map[string]string{ "商机管理": "100,101,102,110,111,112", "大会员": "1", "超级订阅": "200,201", } // WorkMenuFormat 菜单 格式化 func (m *WorkDesktopMenu) WorkMenuFormat() ([]*pb.MenuList, error) { logx.Info("树的长度:", len(m.MenuTree)) menuList := make([]*pb.MenuList, 0) for _, mv := range m.MenuTree { //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示) usable := m.VerifyPermissions(mv.PowerIds) //checkCode==1 验证权限结果 无权限不显示 if !usable && mv.CheckCode == 1 { continue } oneLevel := &pb.MenuList{ Name: mv.Name, Icon: mv.Icon, Url: mv.Url, Usable: MC.If(mv.PowerIds != "", usable && mv.CheckCode == 1, true).(bool), Child: []*pb.SecondLevelMenu{}, } if len(mv.Children) > 0 { for _, sv := range mv.Children { //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示) usable := m.VerifyPermissions(mv.PowerIds) //checkCode==1 验证权限结果 无权限不显示 if !usable && mv.CheckCode == 1 { continue } secondLevel := &pb.SecondLevelMenu{ Name: sv.Name, Icon: sv.Icon, Url: sv.Url, Usable: MC.If(mv.PowerIds != "", usable && mv.CheckCode == 1, true).(bool), Child: []*pb.ThreeLevelMenu{}, } if len(sv.Children) > 0 { for _, tv := range sv.Children { //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示) usable := m.VerifyPermissions(mv.PowerIds) //checkCode==1 验证权限结果 无权限不显示 if !usable && mv.CheckCode == 1 { continue } threeLevel := &pb.ThreeLevelMenu{ Name: tv.Name, Icon: tv.Icon, Url: tv.Url, Usable: MC.If(mv.PowerIds != "", usable && mv.CheckCode == 1, true).(bool), AppType: tv.AppType, OpenType: tv.OpenType, IsCheck: tv.CheckCode > 0, //0:默认展示;1:需验证权限,有权限展示;2:需验证权限,无权限也可展示(可用服务无权限不展示) TipInfo: &pb.TipInfo{ Title: tv.AdditionalInfo.Title, Content: tv.AdditionalInfo.Content, ConfirmUrl: tv.AdditionalInfo.ConfirmUrl, ConfirmText: tv.AdditionalInfo.ConfirmText, IsShowCancel: tv.AdditionalInfo.IsShowCancel, }, } if len(tv.Children) > 0 { for _, fv := range tv.Children { if fv.Name == "" { continue } threeLevel.Url = MC.If(fv.Url != "", fv.Url, tv.Url).(string) threeLevel.Icon = MC.If(fv.Icon != "", fv.Icon, tv.Icon).(string) if fv.AdditionalInfo.Title != "" { threeLevel.TipInfo = &pb.TipInfo{ Title: fv.AdditionalInfo.Title, Content: fv.AdditionalInfo.Content, ConfirmUrl: fv.AdditionalInfo.ConfirmUrl, ConfirmText: fv.AdditionalInfo.ConfirmText, IsShowCancel: fv.AdditionalInfo.IsShowCancel, } } //订阅是商机管理优先 其他功能是大会员优先(这样是有问题的 有些功能超级订阅用户可用 大会员用户权不可用) //解决上面的问题:菜单只保留三级菜单;四级菜单信息不入库;判断三级菜单权限 switch { case strings.Contains(tv.Name, "订阅"): switch { case strings.HasPrefix(fv.Name, "商机管理") && m.VerifyPermissions(verification["商机管理"]): break case strings.HasPrefix(fv.Name, "大会员") && m.VerifyPermissions(verification["大会员"]): break case strings.HasPrefix(fv.Name, "超级订阅") && m.VerifyPermissions(verification["超级订阅"]): break } default: switch { case strings.HasPrefix(fv.Name, "大会员") && m.VerifyPermissions(verification["大会员"]): break case strings.HasPrefix(fv.Name, "商机管理") && m.VerifyPermissions(verification["商机管理"]): break case strings.HasPrefix(fv.Name, "超级订阅") && m.VerifyPermissions(verification["超级订阅"]): break } } } } if threeLevel != nil { secondLevel.Child = append(secondLevel.Child, threeLevel) } } } oneLevel.Child = append(oneLevel.Child, secondLevel) } } menuList = append(menuList, oneLevel) } //bytes, _ := json.MarshalIndent(menuList, "", " ") //fmt.Printf("%s\n", bytes) return menuList, nil } // VerifyPermissions 是否有权限可用此服务 func (m *WorkDesktopMenu) VerifyPermissions(powerIds string) (b bool) { if powerIds == "" { return true } if len(strings.Split(powerIds, ",")) > 0 { PowerLock.Lock() userPower := UserPowerMapMap[m.UserId] PowerLock.Unlock() if userPower == nil { userPower = AutoUserPowerInfo(m.UserId, m.TimeOut, m.BigMemberOff) } func(powerIds string) { UserPowerLock[m.UserId].Lock() defer UserPowerLock[m.UserId].Unlock() for _, pv := range strings.Split(powerIds, ",") { if userPower[pv] > 0 { b = true break } } }(powerIds) } return } //常用功能 const ( WorkCommonly = "work_commonly" WorkMenu = "work_menu" ) var ( InsertCollKey = []string{"appid", "userid", "platform", "field", "value", "ischeck"} ) //更新常用功能 func CommonlyUpdate(in *pb.WorkDesktopComprehensiveReq) (B bool, M string) { //事务 1:查; 2: 存;3: 删; //此功能是否需要验证权限 var parametersSelect []string var idsSelect []interface{} for _, mid := range strings.Split(in.MenuIds, ",") { parametersSelect = append(parametersSelect, "?") idsSelect = append(idsSelect, mid) } menuSelectData := BaseMysql.SelectBySql(fmt.Sprintf(`SELECT id,powerids from %s WHERE id IN (%s) AND status = 0`, WorkMenu, strings.Join(parametersSelect, ",")), idsSelect...) if menuSelectData != nil && len(*menuSelectData) > 0 { var powerIdsMap = map[int]int{} //2:需要权限;1:不需要权限 for _, mv := range *menuSelectData { if MC.IntAll(mv["id"]) == 0 { continue } powerIdsMap[MC.IntAll(mv["id"])] = MC.If(MC.ObjToString(mv["powerids"]) != "", 2, 1).(int) } if powerIdsMap != nil { //此处需要事务 if B = BaseMysql.ExecTx("常用功能批量更新", func(tx *sql.Tx) bool { //查 var delId = 0 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) if existingData != nil && len(*existingData) > 0 { delId = MC.IntAll((*existingData)[0]["id"]) } //先保存 var insertValue []interface{} for id, checkCode := range powerIdsMap { insertValue = append(insertValue, in.AppId, in.UserId, in.Platform, in.ActionMode, fmt.Sprint(id), checkCode > 1) } if len(insertValue)/len(InsertCollKey) > 0 { x, _ := BaseMysql.InsertBatchByTx(tx, WorkCommonly, InsertCollKey, insertValue) if x < 0 { logx.Info("常用功能更新数据处理异常") return false } } //再删除 if delId > 0 { if BaseMysql.UpdateOrDeleteBySqlByTx(tx, `DELETE FROM `+WorkCommonly+` WHERE userid = ? AND field = ? AND id <= ? AND platform = ? `, in.UserId, in.ActionMode, delId, in.Platform) < 0 { logx.Info("常用功能删除数据处理异常") return false } } return true }); !B { M = "常用功能批量更新数据失败" } } else { M = "暂无此常用功能" } } else { M = "常用功能查询异常" } return }