package entity import ( MC "app.yhyue.com/moapp/jybase/common" "github.com/zeromicro/go-zero/core/logx" "sync" "time" ) const ( IsNewFreeTimeCell = 1637830020 BigMemberUserPowerTable = "bigmember_service_user" RedisCode = "newother" RedisMenuKey = "jy_workdesktopmenu_%s_%s" ) var ( PowerLock = sync.Mutex{} UserPowerLock = map[string]*sync.Mutex{} UserPowerMapMap = map[string]map[string]int{} UserPowerPools = make(chan string, 5000) UserPowerOutTime = 3 * time.Minute ) //用户权限 初始化 func AutoUserPowerInfo(userId string, internalTime int, bigMemberOff bool) map[string]int { /* * 商机管理--》新版商机管理vs老版商机管理 * 大会员--》bigmember_service * 超级订阅--》新版超级订阅vs老版超级订阅 * 免费用户--》新免费用户 */ if UserPowerMapMap[userId] == nil { PowerLock.Lock() UserPowerLock[userId] = &sync.Mutex{} UserPowerMapMap[userId] = map[string]int{} PowerLock.Unlock() UserPowerLock[userId].Lock() defer UserPowerLock[userId].Unlock() //查询用户信息 data, ok := Mgo.FindById("user", userId, `{"s_phone":1,"s_m_phone":1,i_member_status":1,"s_member_mainid":1,"i_member_sub_status":1,"i_vip_status":1,"o_vipjy":1,"o_jy":1,"l_registedate":1}`) if ok && *data != nil && len(*data) > 0 { phone, _ := MC.If((*data)["s_phone"] != nil, (*data)["s_phone"], (*data)["s_m_phone"]).(string) if phone != "" { //商机管理用户 //同一个手机号 多个商机管理角色 其中一个是企业管理员或者部门管理员 查的时候按角色权重排序 entNicheInfos := Mysql.SelectBySql(`SELECT i.isNew,r.role_id FROM (entniche_user u LEFT JOIN entniche_user_role r ON r.user_id = u.id) LEFT JOIN entniche_info i ON u.ent_id=i.id WHERE u.phone = ? and u.power=1 and i.status=1 ORDER BY r.role_id DESC`, phone) //商机管理用户信息判断 if entNicheInfos != nil && len(*entNicheInfos) > 0 { entNicheInfo := (*entNicheInfos)[0] if MC.ObjToString(entNicheInfo["isNew"]) != "" { switch MC.ObjToString(entNicheInfo["isNew"]) { case "1": //新版商机管理 UserPowerMapMap[userId]["110"] = 1 switch MC.ObjToString(entNicheInfo["role_id"]) { case "1": //部门管理员 UserPowerMapMap[userId]["111"] = 1 case "2": //企业管理员 UserPowerMapMap[userId]["112"] = 1 } case "0": //老版商机管理 UserPowerMapMap[userId]["100"] = 1 switch MC.ObjToString(entNicheInfo["role_id"]) { case "1": //部门管理员 UserPowerMapMap[userId]["101"] = 1 case "2": //企业管理员 UserPowerMapMap[userId]["102"] = 1 } } } } //大会员 if memberStatus := MC.IntAll((*data)["i_member_status"]); memberStatus > 0 || bigMemberOff { userId := userId if memberStatus > 0 { UserPowerMapMap[userId]["1"] = memberStatus //是否是子账号 而且 子账号被启用 if (*data)["s_member_mainid"] != nil && MC.ObjToString((*data)["s_member_mainid"]) != "" && MC.IntAllDef((*data)["i_member_sub_status"], 0) > 0 { userId = MC.ObjToString((*data)["s_member_mainid"]) } } //大会员用户购买的服务 serviceList := Mysql.Find(BigMemberUserPowerTable, map[string]interface{}{"s_userid": userId, "i_status": 0}, "DISTINCT(s_serviceid),i_frequency", "", -1, -1) if serviceList != nil && len(*serviceList) != 0 { for _, sv := range *serviceList { UserPowerMapMap[userId][MC.ObjToString(sv["s_serviceid"])] = MC.IntAll(sv["i_frequency"]) } } } //VIP用户 if vipStatus := MC.IntAll((*data)["i_vip_status"]); vipStatus > 0 { UserPowerMapMap[userId]["200"] = vipStatus if vipSet := MC.ObjToMap((*data)["o_vipjy"]); vipSet != nil { if buySet := MC.ObjToMap((*vipSet)["o_buyset"]); buySet != nil { //vip 升级用户 if MC.IntAll((*buySet)["upgrade"]) > 0 { UserPowerMapMap[userId]["201"] = vipStatus } } } } //免费用户 freeSet := MC.ObjToMap((*data)["o_jy"]) if MC.IntAll((*freeSet)["i_newfree"]) > 0 || IsNewFreeTimeCell < MC.IntAll((*data)["l_registedate"]) { //新免费用户 UserPowerMapMap[userId]["300"] = 1 } //广东移动DICT if Mysql.CountBySql(`select count(*) from privatedata where phone = ?`, phone) > 0 { UserPowerMapMap[userId]["400"] = 1 } } } go func(userId string) { //默认存2分钟 time.Sleep(time.Duration(internalTime)) UserPowerPools <- userId }(userId) } return UserPowerMapMap[userId] } //定时清用户权限缓存 func ClearUserPower() { for { select { case userId := <-UserPowerPools: if userId != "" { PowerLock.Lock() userPower := UserPowerMapMap[userId] PowerLock.Unlock() if userPower != nil { func() { UserPowerLock[userId].Lock() defer UserPowerLock[userId].Lock() PowerLock.Lock() delete(UserPowerMapMap, userId) PowerLock.Unlock() }() } } case <-time.After(UserPowerOutTime): logx.Info("-超时-", UserPowerOutTime) //超时时间累加 UserPowerOutTime += UserPowerOutTime } } }