package entity import ( "encoding/json" "fmt" "strconv" "strings" "sync" "time" MC "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/redis" ) const ( IsNewFreeTimeCell = 1637830020 BigMemberUserPowerTable = "bigmember_service_user" RedisCode = "newother" RedisMenuKey = "jy_workdesktopmenu_%s_%s_%s" UserPowerRedisKey = "jy_userpowerredis_%s_%d_%s" UserEntIdKey = "jy_userentid_%s_%d_%s" UserRegisterTime = "jy_userregistertime_%s" ) type UserInfo struct { Capitals map[string]int Permissions map[string]int Lock *sync.Mutex } var ( CapitalRetention = "capital_retention" //UserCapitals = map[string]map[string]int{} //UserPermissions = map[string]map[string]int{} //UserLock = map[string]*sync.Mutex{} OverallLock = &sync.Mutex{} UserInfoMap = map[string]*UserInfo{} UserRolePowers = map[string][]string{} ) /* *待调整 调整为存redis *测试用例放的地方不对 待调整 */ //用户权限 初始化 func (m *WorkDesktopMenu) AutoUserPowerInfo() map[string]int { /* * 商机管理--》新版商机管理vs老版商机管理 * 大会员--》bigmember_service * 超级订阅--》新版超级订阅vs老版超级订阅 * 免费用户--》新免费用户 */ var UserPowerMap = map[string]int{} //redis newother 查询是否存在用户功能信息 userPowerRedisKey := fmt.Sprintf(UserPowerRedisKey, m.AppId, time.Now().Day(), m.UserId) bytes, err := redis.GetBytes(RedisCode, userPowerRedisKey) if err == nil && len(*bytes) > 0 { if err = json.Unmarshal(*bytes, &UserPowerMap); err == nil { return UserPowerMap } } //查询用户信息 data, ok := Mgo.FindById("user", m.UserId, `{"s_phone":1,"s_m_phone":1,i_member_status":1,“i_member_endtime”:1,"s_member_mainid":1,"i_member_sub_status":1,"i_vip_status":1,"l_vip_endtime":1,"o_vipjy":1,"o_jy":1,"l_registedate":1}`) if ok && *data != nil && len(*data) > 0 { var ( isFree = true //第一版领域化权限判断 ;第二版:超级订阅||大会员 到期时间超过90天 //商机管理服务 前提是超级订阅、大会员、医械通 domainBool = false registerTime int64 = 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,u.ent_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,i.isNew DESC`, phone) //商机管理用户信息判断 if entNicheInfos != nil && len(*entNicheInfos) > 0 { isFree = false for _, entNicheInfo := range *entNicheInfos { //判断是否是当前企业 ent_id := MC.Int64All(entNicheInfo["ent_id"]) if m.EntId > 0 && ent_id != m.EntId { continue } //entNicheInfo := (*entNicheInfos)[0] switch MC.IntAll(entNicheInfo["isNew"]) { case 1: //新版商机管理 UserPowerMap["110"] = 1 switch MC.IntAll(entNicheInfo["role_id"]) { case 1: //部门管理员 UserPowerMap["111"] = 1 case 2: //企业管理员 UserPowerMap["112"] = 1 } case 0: //老版商机管理 UserPowerMap["100"] = 1 switch MC.IntAll(entNicheInfo["role_id"]) { case 1: //部门管理员 UserPowerMap["101"] = 1 case 2: //企业管理员 UserPowerMap["102"] = 1 } } } } //大会员 if memberStatus := MC.IntAll((*data)["i_member_status"]); memberStatus > 0 || ConfigJson.BigMemberOff { mainUserId := m.UserId if memberStatus > 0 { registerTime = MC.Int64All((*data)["i_member_endtime"]) domainBool = true isFree = false UserPowerMap["0"] = memberStatus //是否是子账号 而且 子账号被启用 if (*data)["s_member_mainid"] != nil && MC.ObjToString((*data)["s_member_mainid"]) != "" && MC.IntAllDef((*data)["i_member_sub_status"], 0) > 0 { mainUserId = MC.ObjToString((*data)["s_member_mainid"]) } } //大会员用户购买的服务 serviceList := Mysql.Find(BigMemberUserPowerTable, map[string]interface{}{"s_userid": mainUserId, "i_status": 0}, "DISTINCT(s_serviceid),i_frequency", "", -1, -1) if serviceList != nil && len(*serviceList) != 0 { for _, sv := range *serviceList { UserPowerMap[MC.ObjToString(sv["s_serviceid"])] = MC.If(MC.IntAll(sv["i_frequency"]) > 0, MC.IntAll(sv["i_frequency"]), memberStatus).(int) } } } //VIP用户 if vipStatus := MC.IntAll((*data)["i_vip_status"]); vipStatus > 0 { if registerTime < MC.Int64All((*data)["l_vip_endtime"]) { registerTime = MC.Int64All((*data)["l_vip_endtime"]) } domainBool = true isFree = false UserPowerMap["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 { UserPowerMap["201"] = vipStatus } } } } //免费用户 if isFree { UserPowerMap["300"] = 1 freeSet := MC.ObjToMap((*data)["o_jy"]) if MC.IntAll((*freeSet)["i_newfree"]) > 0 || IsNewFreeTimeCell < MC.IntAll((*data)["l_registedate"]) { //新免费用户 UserPowerMap["301"] = 1 } } //广东移动DICT if Mysql.CountBySql(`select count(*) from privatedata where phone = ?`, phone) > 0 { UserPowerMap["400"] = 1 } //资源中台获取权限 powerList := GetResources(m.AppId, m.NewUserId, m.EntId, m.EntUserId) if len(powerList) > 0 { for _, plv := range powerList { UserPowerMap[plv] = 1 } } //领域化产品权限 //第一版:必须是大会员或者超级订阅用户 且留资 留资表:capital_retention;source = 'medical_domain',未留资提示留资信息 //第二版:调资源中台rpc获取用户是否有使用领域化产品的权限 无权限则去购买 //需求调整: //1:是否是大会员或者超级订阅用户 否:提示购买到超级订阅购买页; 是>-2 //2:判断用户是否留资 否:提示用去留资;是:>-3 //3:资源中台获取用户权限码判断是否有权限 否:提示用户去联系客服 if domainBool { userRegisterTimeKey := fmt.Sprintf(UserRegisterTime, m.UserId) redis.Put(RedisCode, userRegisterTimeKey, strconv.Itoa(int(registerTime)), int(registerTime)) UserPowerMap["500"] = 1 } } if UserPowerMap != nil { bytes, err := json.Marshal(UserPowerMap) if err == nil && len(bytes) > 0 { redis.PutBytes(RedisCode, userPowerRedisKey, &bytes, ConfigJson.InternalTime) if m.EntId > 0 { //商机管理用户entId 缓存 userEntIdKey := fmt.Sprintf(UserEntIdKey, m.AppId, time.Now().Day(), m.UserId) redis.Put(RedisCode, userEntIdKey, m.EntId, ConfigJson.InternalTime) } } } } return UserPowerMap } //clear One func ClearUserPowerFunc(userId, appId string) { userPowerRedisKey := fmt.Sprintf(UserPowerRedisKey, appId, time.Now().Day(), userId) redis.Del(RedisCode, userPowerRedisKey) for _, v := range []string{"PC", "APP", "WX"} { RedisMenuKey := fmt.Sprintf(RedisMenuKey, appId, v, userId) redis.Del(RedisCode, RedisMenuKey) } } //用户角色权限初始化 func UserRolePowerInit(strs []string) { if len(strs) > 0 { jyUserRoleData := BaseMysql.SelectBySql(`SELECT id,name FROM jyfunction WHERE status = 1`) if jyUserRoleData != nil && len(*jyUserRoleData) > 0 { for _, jv := range *jyUserRoleData { for _, v := range strs { if strings.Contains(MC.ObjToString(jv["name"]), v) { UserRolePowers[v] = append(UserRolePowers[v], strconv.Itoa(MC.IntAll(jv["id"]))) } } } } } } /* 1、不符合可以留资申请开通权限的用户 1、免费用户 2、超级订阅用户、大会员用户到期时间是否超过3个月 (1、2:弹窗-医械通上线啦) 2、符合可以留资申请开通的用户 1、未留资 (1:弹窗-完善基本信息) 2、已留资未开通 3、已留资且开通 (2、3:弹窗-恭喜留资成功) */ /* 1、判断是否满足超级订阅用户或大会员用户 且到期时间超过90天(配置); 1.1、否:权限=0;提示上线啦 1.2、是:是否留资 1.2.1、否:权限=0;提示留资 1.2.2、是:是否开通权限 1.2.2.1、否:权限=0;提示恭喜留资成功,客服联系 1.2.2.2、是:权限=1 */ /*存在超级订阅 或 大会员到期 而医械通未到期的情况*/ // CheckCapitalResources 是否需要留资 且权限验证--弹窗处理 //b 一级权限(超级订阅、大会员等) //p 二级权限(请求资源中台:医械通等) func CheckCapitalResources(menu *JYMenu, wd *WorkDesktopMenu, b, p bool) (title, content, confirmUrl, confirmText, appType, openType string, isShowCancel, usable bool) { OverallLock.Lock() userInfo := UserInfoMap[wd.NewUserId] if userInfo == nil { userInfo = &UserInfo{} userInfo.Lock = &sync.Mutex{} userInfo.Capitals = map[string]int{} userInfo.Permissions = map[string]int{} UserInfoMap[wd.NewUserId] = userInfo } OverallLock.Unlock() userInfo.Lock.Lock() defer userInfo.Lock.Unlock() var ( capitalBool = true //是否留资 permissionBool = true //是否有功能权限 customPopup = true //自定义弹窗 defaultPopup = false //默认弹窗 ) //无权限(医械通-:1:免费用户;2:超级订阅、大会员到期时间不在规定范围内) if b { //大会员超级订阅用户 才有权限去验证是否有医疗权限 //用户是否需要留资 if menu.CapitalCode != "" { capitalBool = false for _, cv := range strings.Split(menu.CapitalCode, ",") { if userInfo.Capitals[cv] == 0 { if c := BaseMysql.CountBySql(`SELECT COUNT(id) FROM `+CapitalRetention+` WHERE source = ? AND user_id = ? AND appid = ?`, cv, wd.NewUserId, wd.AppId); c > 0 { userInfo.Capitals[cv] = 1 } else { userInfo.Capitals[cv] = -1 } } if userInfo.Capitals[cv] < 0 { customPopup = false //留资弹窗信息 title = menu.CapitalInfo.Title content = menu.CapitalInfo.Content confirmUrl = menu.CapitalInfo.ConfirmUrl confirmText = menu.CapitalInfo.ConfirmText isShowCancel = menu.CapitalInfo.IsShowCancel appType = menu.CapitalInfo.AppType openType = menu.CapitalInfo.OpenType } else { capitalBool = true break } } } //资源中台--- 无权限弹窗信息为默认信息(先留资) if menu.PermissionCode != "" { permissionBool = false if (menu.CapitalCode != "" && capitalBool) || menu.CapitalCode == "" { if p { title = "" permissionBool = true customPopup = false } //for _, pv := range strings.Split(menu.PermissionCode, ",") { // if userInfo.Permissions[pv] == 0 { // userInfo.Permissions[pv] = -1 // powerList := GetResources(wd.AppId, wd.NewUserId, wd.EntId, wd.EntUserId) // if len(powerList) > 0 { // for _, plv := range powerList { // userInfo.Permissions[plv] = 1 // } // } // } // if userInfo.Permissions[pv] >= 0 { // title = "" // permissionBool = true // customPopup = false // break // } //} } } //有用户权限 查看功能权限 //医械通---用户没有功能权限 也没有留资 查看 if !permissionBool { switch menu.PowerIds { case "500": userRegisterTime, _ := strconv.ParseInt(redis.GetStr(RedisCode, fmt.Sprintf(UserRegisterTime, wd.UserId)), 10, 64) //超级订阅 大会员到期时间 是否 大于 90天 if userRegisterTime-time.Now().Unix() < ConfigJson.MedicalFieldTimespan { //即使是超级订阅或大会员 也没有权限 defaultPopup = true } } } // usable = capitalBool && permissionBool } //无权限--免费用户||不符合条件的付费用户 if !b || defaultPopup { //配置弹窗信息 if ConfigJson.DefaultPopup[menu.PowerIds].Title != "" { customPopup = false title = ConfigJson.DefaultPopup[menu.PowerIds].Title content = ConfigJson.DefaultPopup[menu.PowerIds].Content confirmUrl = ConfigJson.DefaultPopup[menu.PowerIds].ConfirmUrl confirmText = ConfigJson.DefaultPopup[menu.PowerIds].ConfirmText isShowCancel = ConfigJson.DefaultPopup[menu.PowerIds].IsShowCancel appType = ConfigJson.DefaultPopup[menu.PowerIds].AppType openType = ConfigJson.DefaultPopup[menu.PowerIds].OpenType } } //无权限(有权限未留资|留资了未开通权限) --》 没有配置弹窗信息 --》自定义弹窗 if customPopup { title = menu.AdditionalInfo.Title content = menu.AdditionalInfo.Content confirmUrl = menu.AdditionalInfo.ConfirmUrl confirmText = menu.AdditionalInfo.ConfirmText isShowCancel = menu.AdditionalInfo.IsShowCancel appType = menu.AdditionalInfo.AppType openType = menu.AdditionalInfo.OpenType } return }