package service import ( "encoding/json" "fmt" "math/rand" "strconv" "strings" "time" "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/date" "app.yhyue.com/moapp/jybase/mongodb" "app.yhyue.com/moapp/jybase/redis" "bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/entity" "github.com/zeromicro/go-zero/core/logx" ) // 权益 type PowerService struct { *entity.Conn } func NewPower(conn *entity.Conn) *PowerService { return &PowerService{ conn, } } var level_map = map[int64]string{ 1: "专家版", 2: "智慧版", 3: "商机版", 4: "试用版", 5: "自定义", 6: "商机版2.0", 7: "专家版2.0", } /* 权益相关 userid //mongodb用户id baseUserId //base_user用户id accountId //账户id entId =5; //企业id positionType //职位类型 0个人 1企业 positionId //职位id 切换到企业身份后,session中userId存的是企业雇员的职位id,个人身份,userId还是原来mgo库里的_id */ func (this *PowerService) Power(userid string, baseUserId, accountId, entId, positionType, positionId int64) *entity.Power { logx.Info("-----req------", userid, baseUserId, accountId, entId, positionType, positionId) ent := &entity.Ent{} entniche := &entity.Entniche{} vip := &entity.Vip{} member := &entity.Member{} free := &entity.Free{} userPower := entity.Power{} docs := &entity.Docs{} if positionId == 0 { free.IsFree = true return &entity.Power{ Vip: vip, Member: member, Free: free, Ent: ent, Entniche: entniche, Docs: docs, } } cacheBl := false if bytes, err := redis.GetBytes("newother", GetRedisName(positionId)); err == nil && bytes != nil { if err := json.Unmarshal(*bytes, &userPower); err == nil { cacheBl = true } } if !cacheBl { if userid == "" && positionId > 0 { logx.Info("检测到异常数据:", userid, baseUserId, accountId, entId, positionType, positionId) if baseUserId <= 0 { //获取mongodb的userid pd := this.Conn.BaseMysql.SelectBySql(`select user_id from base_service.base_position where id =? limit 1`, positionId) if pd != nil && len(*pd) > 0 { baseUserId = common.Int64All((*pd)[0]["user_id"]) } } if baseUserId > 0 { ud, ok := this.Conn.MgoJy.FindOneByField("user", map[string]interface{}{"base_user_id": baseUserId}, `{"_id:1"}`) if ud != nil && ok && len(*ud) > 0 { userid = mongodb.BsonIdToSId((*ud)["_id"]) } } entity.Alert(fmt.Sprintf("检测到异常数据已修复: userId:%s ,positionId:%v ,positionType:%v
", userid, positionId, positionType)) logx.Info("检测到异常数据修复后:", userid, baseUserId, accountId, entId, positionType, positionId) } //获取用户本身的注册时间和邮箱、这个与个人、企业无关 mgoUserFields := map[string]interface{}{ "s_myemail": 1, "l_registedate": 1, "s_phone": 1, "s_m_phone": 1, "base_user_id": 1, } //大会员权益表查询条件 bigmemberServiceUserQuery := map[string]interface{}{"s_userid": userid, "i_status": 0} //个人身份 取user表中权益 if positionType == 0 { mgoUserFields["i_vip_status"] = 1 mgoUserFields["l_vip_starttime"] = 1 mgoUserFields["l_vip_endtime"] = 1 mgoUserFields["o_vipjy"] = 1 mgoUserFields["i_member_status"] = 1 mgoUserFields["i_member_give"] = 1 mgoUserFields["s_member_mainid"] = 1 mgoUserFields["i_member_sub_status"] = 1 mgoUserFields["i_member_trial"] = 1 mgoUserFields["o_member_jy"] = 1 mgoUserFields["o_jy"] = 1 mgoUserFields["i_ts_guide"] = 1 mgoUserFields["i_member_apppushunread"] = 1 mgoUserFields["i_entniche_apppushunread"] = 1 mgoUserFields["i_apppushunread"] = 1 mgoUserFields["i_member_starttime"] = 1 mgoUserFields["i_member_endtime"] = 1 mgoUserFields["i_doc_status"] = 1 mgoUserFields["l_doc_starttime"] = 1 mgoUserFields["l_doc_endtime"] = 1 mgoUserFields["i_doc_free_download"] = 1 } else { bigmemberServiceUserQuery["s_userid"] = positionId } data, ok := this.Conn.MgoJy.FindById("user", userid, mgoUserFields) if ok && data != nil && len(*data) > 0 { //基本信息 registeDate := common.Int64All((*data)["l_registedate"]) //注册时间 phone, _ := common.If((*data)["s_phone"] != nil, (*data)["s_phone"], (*data)["s_m_phone"]).(string) // ent.PrivateGD = this.Conn.Mysql.CountBySql(`select count(1) from privatedata where phone = ?`, phone) > 0 //广东移动DICT 用户 mail := common.ObjToString((*data)["s_myemail"]) i_ts_guide := common.Int64All((*data)["i_ts_guide"]) i_member_apppushunread := common.Int64All((*data)["i_member_apppushunread"]) i_entniche_apppushunread := common.Int64All((*data)["i_entniche_apppushunread"]) i_apppushunread := common.Int64All((*data)["i_apppushunread"]) free.Mail = mail free.Registedate = registeDate free.Phone = phone free.TsGuide = i_ts_guide free.Apppushunread = i_apppushunread free.EntnicheApppushunread = i_entniche_apppushunread free.MemberApppushunread = i_member_apppushunread //个人权益 if positionType == 0 { o_jy, _ := (*data)["o_jy"].(map[string]interface{}) a_key, _ := o_jy["a_key"].([]interface{}) free.FreeHasKey = len(a_key) > 0 free.OjyLength = int64(len(o_jy)) if common.IntAll((o_jy)["i_newfree"]) > 0 || entity.IsNewFreeTimeCell < registeDate { //IsNewFreeTimeCell dev3.6.4版本之前发了个紧急版本处理老用户订阅问题,i_newfree字段必须用户选择地区才能生成,不能作为判断是否是新用户得唯一标识,在此版本添加了常量:IsNewFreeTimeCell作为判断标准;--ws free.IsUpgrade = true //新免费用户 } //省份订阅包 free.PpStatus = common.Int64All(o_jy["i_ppstatus"]) free.PpStartTime = common.Int64All(o_jy["l_areaStart_p"]) free.PpEndTime = common.Int64All(o_jy["l_areaEnd_p"]) //超级订阅 vipStatus := common.Int64All((*data)["i_vip_status"]) vipStartTime := common.Int64All((*data)["l_vip_starttime"]) vipEndTime := common.Int64All((*data)["l_vip_endtime"]) ovipjy := common.ObjToMap((*data)["o_vipjy"]) oBuyset := common.ObjToMap((*ovipjy)["o_buyset"]) upgrade := common.Int64All((*oBuyset)["upgrade"]) areacount := common.Int64All((*oBuyset)["areacount"]) buyerclasscount := common.Int64All((*oBuyset)["buyerclasscount"]) newcitys, _ := (*oBuyset)["newcitys"].([]interface{}) newcitysArr := ConfirmInt64Arr(newcitys) vip = &entity.Vip{ Status: vipStatus, StartTime: vipStartTime, EndTime: vipEndTime, Upgrade: upgrade, Areacount: areacount, Buyerclasscount: buyerclasscount, MaxKeyLength: 300, PowerType: common.Int64All(common.If(vipStatus > 0, 1, 0)), NewCitys: newcitysArr, } if (*ovipjy)["a_items"] != nil { a_items := common.ObjArrToMapArr((*ovipjy)["a_items"].([]interface{})) vip.HasKey = HasKey(a_items) } //个人member i_member_sub_status := common.IntAllDef((*data)["i_member_sub_status"], 0) memberStatus := common.Int64All((*data)["i_member_status"]) memberStarttime := common.Int64All((*data)["i_member_starttime"]) memberEndtime := common.Int64All((*data)["i_member_endtime"]) member = &entity.Member{ Status: memberStatus, StartTime: memberStarttime, EndTime: memberEndtime, MaxKeyLength: 300, //最大关键词数量限制 PowerType: common.Int64All(common.If(memberStatus > 0, 1, 0)), } omemberjy := common.ObjToMap((*data)["o_member_jy"]) if (*omemberjy)["a_items"] != nil { if arr, ok := (*omemberjy)["a_items"].([]interface{}); ok { a_items := common.ObjArrToMapArr(arr) member.HasKey = HasKey(a_items) } } if memberStatus > 0 { member.MemberPower = 1 //是否分配了大会员;0:否 1:是 } logx.Info("in--------------------->", (*data)["s_member_mainid"] != nil && common.ObjToString((*data)["s_member_mainid"]) != "" && i_member_sub_status > 0) if (*data)["s_member_mainid"] != nil && common.ObjToString((*data)["s_member_mainid"]) != "" && i_member_sub_status > 0 { member.Pid = common.ObjToString((*data)["s_member_mainid"]) bigmemberServiceUserQuery["s_userid"] = member.Pid member.IsSubCount = 1 } if (member.Pid != "" && common.IntAllDef((*data)["i_member_sub_status"], 0) == 1) || this.Conn.MgoJy.Count("member", map[string]interface{}{"userid": userid}) > 0 { member.Used = true } if (*data)["i_member_trial"] != nil { member.IsMemberTrial = 1 } //获取大会员版本名称 member.MemberName = level_map[memberStatus] //文库 docs = &entity.Docs{ DocStatus: common.IntAll((*data)["i_doc_status"]), StartDate: common.Int64All((*data)["l_doc_starttime"]), EndDate: common.Int64All((*data)["l_doc_endtime"]), FreeDownload: common.IntAll((*data)["i_doc_free_download"]), } } else if positionType == 1 { entnicheUserId := this.GetEntnicheUserId(entId, phone) //免费 fdata, _ := this.Conn.MgoJy.FindOne("entniche_rule", map[string]interface{}{ "i_entid": entId, "i_userid": entnicheUserId, "i_type": 2, //0:商机管理 1:超级订阅/大会员 2:免费 }) o_jy, _ := (*fdata)["o_entniche"].(map[string]interface{}) free.OjyLength = int64(len(o_jy)) a_key, _ := o_jy["a_key"].([]interface{}) free.FreeHasKey = len(a_key) > 0 if common.IntAll(o_jy["i_newfree"]) > 0 || entity.IsNewFreeTimeCell < registeDate { //IsNewFreeTimeCell dev3.6.4版本之前发了个紧急版本处理老用户订阅问题,i_newfree字段必须用户选择地区才能生成,不能作为判断是否是新用户得唯一标识,在此版本添加了常量:IsNewFreeTimeCell作为判断标准;--ws free.IsUpgrade = true //新免费用户 } //企业 edata, _ := this.Conn.MgoJy.FindOne("entniche_rule", map[string]interface{}{ "i_entid": entId, "i_userid": entnicheUserId, "i_type": 1, //0:商机管理 1:超级订阅/大会员 }) eudata, _ := this.Conn.MgoJy.FindOne("ent_user", map[string]interface{}{ "i_entid": entId, "i_userid": entnicheUserId, }) if eudata != nil && len(*eudata) > 0 { i_ts_guide := common.Int64All((*eudata)["i_ts_guide"]) free.TsGuide = i_ts_guide haskey := false o_entniche := &map[string]interface{}{} if edata != nil && len(*edata) > 0 { o_entniche = common.ObjToMap((*edata)["o_entniche"]) if (*o_entniche)["a_items"] != nil { if arr, ok := (*o_entniche)["a_items"].([]interface{}); ok { a_items := common.ObjArrToMapArr(arr) haskey = HasKey(a_items) } } } if common.Int64All((*eudata)["i_vip_status"]) > 0 { oBuyset := common.ObjToMap((*o_entniche)["o_buyset"]) areacount := common.Int64All((*oBuyset)["areacount"]) buyerclasscount := common.Int64All((*oBuyset)["buyerclasscount"]) newcitys, _ := (*oBuyset)["newcitys"].([]interface{}) newcitysArr := ConfirmInt64Arr(newcitys) status := common.Int64All((*eudata)["i_vip_status"]) starttime := common.Int64All((*eudata)["l_vip_starttime"]) endtime := common.Int64All((*eudata)["l_vip_endtime"]) vip = &entity.Vip{ Status: status, StartTime: starttime, EndTime: endtime, Upgrade: 1, //企业版默认是升级版 Areacount: areacount, Buyerclasscount: buyerclasscount, MaxKeyLength: 300, PowerType: 2, HasKey: haskey, NewCitys: newcitysArr, } } if common.Int64All((*eudata)["i_member_status"]) > 0 { member.PowerType = 2 status := common.Int64All((*eudata)["i_member_status"]) starttime := common.Int64All((*eudata)["i_member_starttime"]) endtime := common.Int64All((*eudata)["i_member_endtime"]) member = &entity.Member{ Status: status, StartTime: starttime, EndTime: endtime, MemberName: level_map[status], PowerType: 2, HasKey: haskey, } //是否使用 s_positionId := strconv.Itoa(int(positionId)) if this.Conn.MgoJy.Count("member", map[string]interface{}{"userid": s_positionId}) > 0 { member.Used = true } } //文库 if common.Int64All((*eudata)["i_doc_status"]) > 0 { docs = &entity.Docs{ DocStatus: common.IntAll((*data)["i_doc_status"]), StartDate: common.Int64All((*data)["l_doc_starttime"]), EndDate: common.Int64All((*data)["l_doc_endtime"]), FreeDownload: common.IntAll((*data)["i_doc_free_download"]), } } } } //大会员相关权益数量 memberServiceMap := map[int64]bool{} serviceList := this.Conn.Mysql.Find("bigmember_service_user", bigmemberServiceUserQuery, "DISTINCT(s_serviceid),i_frequency", "", -1, -1) logx.Info("-----bigmemberServiceUserQuery-------", bigmemberServiceUserQuery) if serviceList != nil && len(*serviceList) != 0 { pCount, eCount, dailyNum, customers := 0, 0, 0, 10 for _, item := range *serviceList { serviceid := common.Int64All(item["s_serviceid"]) memberServiceMap[serviceid] = true member.MemberPowerList = append(member.MemberPowerList, serviceid) if serviceid == 14 { //项目数量 pCount = common.IntAll(item["i_frequency"]) } else if serviceid == 4 || serviceid == 12 || serviceid == 13 { //企业情报监控 企业中标动态 tEcount := common.IntAll(item["i_frequency"]) if tEcount > eCount { eCount = tEcount } } else if serviceid == 17 || serviceid == 18 { //每日数据包 dailyNum = common.IntAll(item["i_frequency"]) } else if serviceid == 7 { //潜在客户 关注客户 customers = common.IntAll(item["i_frequency"]) } } member.EntNum = int64(eCount) member.ProNum = int64(pCount) member.DailyNum = int64(dailyNum) member.Customers = int64(customers) } // if phone != "" { //查询是否是商机管理付费用户 res := this.Conn.Mysql.SelectBySql(`SELECT i. STATUS AS status,i.model , i.isNew, i.power_source, r.role_id, u.power, i.name,i.id,i.startdate,i.enddate,i.auth_status,i.auth_reason,i.dept_subscribe 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 i.id = ? ORDER BY i. STATUS DESC, i.auth_status DESC`, phone, entId) if res != nil && len(*res) > 0 { for _, v := range *res { if common.IntAll(v["id"]) == 0 { continue } entnicheStatus := common.Int64All(v["status"]) entnichePower := common.Int64All(v["power"]) if entnicheStatus == 1 { entnicheStatus = entnichePower } entniche.IsNew = common.Int64All(v["isNew"]) entniche.Status = entnicheStatus //企业是否有商机管理权限 entniche.IsEntPower = entnichePower //个人是否有商机管理权限 entniche.PowerSource = common.Int64All(v["power_source"]) entniche.StartTime = common.Int64All(v["startdate"]) entniche.EndTime = common.Int64All(v["enddate"]) entniche.Model = common.Int64All(v["model"]) // ent.Name = common.ObjToString(v["name"]) ent.EntRoleId = common.Int64All(v["role_id"]) ent.EntAuthStatus = common.Int64All(v["auth_status"]) ent.EntAuthReason = common.ObjToString(v["auth_reason"]) ent.DeptSubscribe = common.Int64All(v["dept_subscribe"]) //判断企业是否购买企业版相关 eweData := this.Conn.Mysql.SelectBySql(`select * from entniche_wait_empower where ent_id=? and end_time>?`, entId, time.Now().Format(date.Date_Full_Layout)) if eweData != nil && len(*eweData) > 0 { ent.Services = true for _, v := range *eweData { product_type := common.ObjToString(v["product_type"]) if strings.Contains(product_type, entity.ProductType_member) { ent.BuyMember = 1 } else if strings.Contains(product_type, entity.ProductType_vip) { ent.BuyVip = 1 } } } //企业管理员 if ent.EntRoleId == 1 && ((ent.BuyMember == 1 || ent.BuyVip == 1) || (entniche.Status == 1 && entniche.PowerSource == 0)) { ent.EntSubscribeManager = 1 } //部门管理员 if ent.EntRoleId == 2 && entniche.Status == 1 && entniche.PowerSource == 0 && ent.DeptSubscribe == 1 { ent.EntSubscribeManager = 1 } // if ent.EntRoleId == 1 || ent.EntRoleId == 2 { if (ent.BuyMember == 1 || ent.BuyVip == 1) || (entniche.Status == 1 && entniche.PowerSource == 0) { ent.EntSubscribe = 1 } } } } } if vip.Status <= 0 && member.Status <= 0 && (entniche.Status <= 0 || (entniche.Status > 0 && entniche.PowerSource == 1)) { free.IsFree = true } else { free.IsFree = false } //查看原文 var ( originalData = this.Conn.BaseMysql.SelectBySql(`SELECT user_type,total FROM jianyu.original_power WHERE state = 0`) ) if originalData != nil && len(*originalData) > 0 { for _, ov := range *originalData { total := common.Int64All(ov["total"]) switch common.IntAll(ov["user_type"]) { case 1: vip.Original = total case 2: member.Original = total case 3: entniche.Original = total default: free.Original = total } } } //文库 非文库会员,确认免费下载机会状态 免费下载机会没有被消耗 //FreeDownload 0:未留资 有一次留资免费机会;2:已留资 下载机会未使用 if userPower.Docs.DocStatus <= 0 && userPower.Docs.FreeDownload == 0 { sc := this.MgoJy.Count("saleLeads", map[string]interface{}{"userid": userid, "source": map[string]interface{}{"$in": []string{"pc_library_details_free", "app_library_details_free", "wx_library_details_free", "h5_library_details_free"}}}) if sc > 0 { userPower.Docs.FreeDownload = 1 //已留资 未使用下载机会 } } } userPower = entity.Power{ Vip: vip, Member: member, Free: free, Ent: ent, Entniche: entniche, Docs: docs, } } //存储缓存 go func() { if bytes, err := json.Marshal(userPower); err == nil && bytes != nil { oneDayMore := 60*60*24 + rand.Intn(60*60) _ = redis.PutBytes("newother", GetRedisName(positionId), &bytes, oneDayMore) } }() //实时更新的数据 没法存缓存 //免费用户在企业画像/采购单位画像/附件下载留资 userPower.Free.FreeEntPort, userPower.Free.FreeBuyerPort, userPower.Free.FreeFile = FreeExperience(userid, positionId, positionType) // notBigFileBool := userPower.Member.Status <= 0 || !strings.Contains(intStringsJoin(userPower.Member.MemberPowerList), "3") uk := common.If(notBigFileBool && userPower.Vip.Status > 0 && userPower.Vip.Upgrade > 0, "v", "f").(string) userPower.Vip.FileNum = FileNum(uk, userid, positionId, positionType) return &userPower } // 免费用户体验会员功能权限 // 免费用户在企业画像/采购单位画像/附件下载留资 留资成功后用户才有功能使用次数 func FreeExperience(userId string, positionId, positionType int64) (int64, int64, int64) { if positionType == 1 { userId = strconv.Itoa(int(positionId)) } entPortKey := common.Int64All(redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheEntPortKey, userId))) buyerPortKey := common.Int64All(redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheBuyerPortKey, userId))) fileKey := common.Int64All(redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.PowerCacheFileKey, userId))) return entPortKey, buyerPortKey, fileKey } // 获取附件下载次数 func FileNum(uk, userid string, positionId, positionType int64) int64 { if positionType == 1 { userid = strconv.Itoa(int(positionId)) } fileUploadNum := map[string]int{ "f": 0, "v": 10, } //附件下载包的剩余次数 filePackKey := fmt.Sprintf(entity.FilePackNumKey, userid, fmt.Sprint(time.Now().Month())) filePackNum := redis.GetInt(entity.PowerCacheDb, filePackKey) num := fileUploadNum[uk] - redis.GetInt(entity.PowerCacheDb, fmt.Sprintf(entity.VipFileUploadNumKey, userid, fmt.Sprint(time.Now().Month()))) + filePackNum return int64(num) } /* 判断是企业或个人 1.企业 entniche_rule 查询 vip/member free ent entniche 2.个人 查询vip member free */ func (this *PowerService) GetEntnicheUserId(entId int64, phone string) int64 { data := this.Conn.Mysql.SelectBySql(`select id from entniche_user where phone =? and ent_id =?`, phone, entId) if data != nil && len(*data) > 0 { return common.Int64All((*data)[0]["id"]) } return -1 } // 是否有关键词 func HasKey(a_items []map[string]interface{}) bool { for _, v := range a_items { akey, _ := v["a_key"].([]interface{}) if len(akey) > 0 { return true } } return false } // 获取redis key func GetRedisName(positionId int64) string { if positionId == 0 { return "" } return fmt.Sprintf("user_power_info_%v", positionId) } // 清除redis缓存 func (this *PowerService) DelRedisPower(positionId int64) bool { if positionId == 0 { return false } return redis.Del("newother", GetRedisName(positionId)) } func intStringsJoin(is []int64) string { var str = []string{} for _, v := range is { str = append(str, strconv.Itoa(int(v))) } return strings.Join(str, ",") } func ConfirmInt64Arr(arr []interface{}) []int64 { tmp := make([]int64, 0) for _, v := range arr { tmp = append(tmp, common.Int64All(v)) } return tmp }