123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- 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
- }
|