Przeglądaj źródła

Merge branch 'release/v4.10.5_wh' of qmx/jy into release/v4.10.5

王浩 4 miesięcy temu
rodzic
commit
d79ee78c41

+ 6 - 901
src/jfw/modules/subscribepay/src/service/userAccountInfo.go

@@ -1,11 +1,7 @@
 package service
 
 import (
-	jycaptcha "app.yhyue.com/moapp/jybase/captcha"
-	"bytes"
 	"context"
-	"database/sql"
-	"encoding/base64"
 	"fmt"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/entity"
@@ -22,19 +18,12 @@ import (
 
 	. "app.yhyue.com/moapp/jybase/api"
 	qutil "app.yhyue.com/moapp/jybase/common"
-	. "app.yhyue.com/moapp/jybase/date"
-	"app.yhyue.com/moapp/jybase/dchest/captcha"
 	"app.yhyue.com/moapp/jybase/encrypt"
-	elastic "app.yhyue.com/moapp/jybase/es"
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
-	"app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/redis"
-	"app.yhyue.com/moapp/jybase/usercenter"
-	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/dataexport"
 	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	pcc "bp.jydev.jianyu360.cn/BaseService/powerCheckCenter/rpc/pb"
-	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
 )
 
 type UserAccount struct {
@@ -259,8 +248,9 @@ func getAccountVipAttr(session *httpsession.Session, powerRes *pcc.CheckResp) (r
 				}
 			}
 		}
+
 		if gconv.Int64(session.Get("positionType")) == 0 {
-		rData = append(rData, &VipDetail{Name: "超级订阅", EndTime: powerRes.Vip.GetEndTime(), Attr: g.Map{
+			rData = append(rData, &VipDetail{Name: "超级订阅", EndTime: powerRes.Vip.GetEndTime(), Attr: g.Map{
 				"renew":   powerRes.Vip.Upgrade == 1,
 				"upgrade": powerRes.Vip.Upgrade == 0 || powerRes.Vip.Areacount != -1,
 				"buyMsg":  buyMsg,
@@ -269,8 +259,10 @@ func getAccountVipAttr(session *httpsession.Session, powerRes *pcc.CheckResp) (r
 			rData = append(rData, &VipDetail{Name: "超级订阅", EndTime: powerRes.Vip.GetEndTime(), Attr: g.Map{
 				"renew":   qutil.If(gconv.Int64(session.Get("positionType")) == 0, true, powerRes.Vip.Upgrade == 1 && buyed),
 				"upgrade": (powerRes.Vip.Upgrade == 0 || powerRes.Vip.Areacount != -1) && buyed,
-			"buyMsg":  buyMsg,
-		}})
+				"buyMsg":  buyMsg,
+			}})
+		}
+
 	}
 	if powerRes.Free.PpStatus > 0 && len(rData) == 0 {
 		rData = append(rData, &VipDetail{Name: "省份订阅包", EndTime: powerRes.Free.GetPpEndTime(), Attr: g.Map{
@@ -288,893 +280,6 @@ func getAccountVipAttr(session *httpsession.Session, powerRes *pcc.CheckResp) (r
 	return rData
 }
 
-// 我的页面 获取基本信息
-// 手机号 邮箱 头像 昵称 超级订阅 大会员 用户加密id
-func (this *UserAccount) GetAccountInfo() {
-	rData, errMsg := func() (interface{}, error) {
-		sessVal := this.Session().GetMultiple()
-		userId, _ := sessVal["mgoUserId"].(string)
-		//由于超级订阅vip状态需要查库,无法从session中获取,所以直接所有字段从数据库中获取
-		userMsg := util.Compatible.Select(userId, `{"s_m_phone":1,"s_phone":1,"s_myemail":1,"s_nickname":1,"s_headimageurl":1,"s_password":1,"s_company":1,"s_unionid":1}`)
-		if userMsg == nil || len(*userMsg) == 0 {
-			return nil, DBQUERY_ERROR
-		}
-		//微信昵称>手机号>剑鱼昵称
-		nickname := qutil.ObjToString((*userMsg)["s_nickname"])
-		phone := qutil.ObjToString(qutil.If((*userMsg)["s_phone"] != nil, (*userMsg)["s_phone"], (*userMsg)["s_m_phone"]))
-		jyname := qutil.ObjToString((*userMsg)["s_jyname"])
-		isWx := false
-		if unionid, ok := (*userMsg)["s_unionid"]; ok {
-			if len(qutil.ObjToString(unionid)) > 11 { //手机号用户s_unionid为手机号
-				isWx = true
-			}
-		}
-		breakRenewTip := 0
-		orders := util.Mysql.SelectBySql(`SELECT pay_time from dataexport_order where user_id=? and order_status=1 and product_type='VIP订阅' and vip_type is null order by pay_time desc limit 1`, userId)
-		if orders != nil && len(*orders) == 1 {
-			timeA, errorA := time.ParseInLocation(Date_Full_Layout, config.Config.BreakRenewTipTime, time.Local)
-			timeB, errorB := time.ParseInLocation(Date_Full_Layout, qutil.ObjToString((*orders)[0]["pay_time"]), time.Local)
-			if errorA == nil && errorB == nil && timeB.Before(timeA) {
-				breakRenewTip = 1
-			}
-		}
-		b := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
-		//s从数据导出填写的邮箱或者从数据定制服务这里获取的邮箱
-		_, otherMail := dataexport.GetLastExportPhoneAndMail(util.Mysql, qutil.ObjToString(sessVal["userId"]))
-		if otherMail == "" {
-			saleData, _ := util.MQFW.FindOne("saleLeads", map[string]interface{}{
-				"userid": sessVal["userId"],
-				"mail": map[string]interface{}{
-					"$exists": true,
-				},
-			})
-			if saleData != nil && len(*saleData) > 0 {
-				otherMail = qutil.ObjToString((*saleData)["mail"])
-			}
-			if qutil.ObjToString((*userMsg)["s_myemail"]) != "" {
-				otherMail = qutil.ObjToString((*userMsg)["s_myemail"])
-			}
-		}
-		return map[string]interface{}{
-			"userId":        encrypt.EncodeArticleId(userId),
-			"email":         qutil.ObjToString((*userMsg)["s_myemail"]),
-			"phone":         phone,
-			"nickname":      nickname,
-			"jyname":        jyname,
-			"headimageurl":  strings.Replace(qutil.ObjToString((*userMsg)["s_headimageurl"]), "http://", "https://", 1),
-			"bigmemberVip":  b.Status,
-			"subscribeVip":  b.VipStatus,
-			"hasPwd":        qutil.ObjToString((*userMsg)["s_password"]) != "",
-			"company":       qutil.ObjToString((*userMsg)["s_company"]),
-			"isWx":          isWx, //是否是微信账号
-			"breakRenewTip": breakRenewTip,
-			"otherMail":     otherMail, //从数据导出填写的邮箱或者从数据定制服务这里获取的邮箱
-		}, nil
-	}()
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 推送我感兴趣开关
-func (this *UserAccount) Interested(doType string) {
-	sessVal := this.Session().GetMultiple()
-	userId, _ := sessVal["userId"].(string)
-	rData, errMsg := func() (interface{}, error) {
-		var defValue int = 1 //默认设置为开 1开 -1关
-		if doType == "switch" {
-			setValue, _ := this.GetInteger("value")
-			if !(setValue == -1 || setValue == 1) {
-				return nil, PARAM_ERROR
-			}
-			updateOk := util.Compatible.Update(userId, map[string]interface{}{
-				"$set": map[string]interface{}{
-					"i_interested": setValue,
-				},
-			})
-			if !updateOk {
-				return nil, DBUPDATE_ERROR
-			}
-			defValue = setValue
-		} else if doType == "query" {
-			var uData *map[string]interface{}
-			util.Compatible.Select(userId, `{"i_interested":1}`)
-			if uData == nil || len(*uData) == 0 {
-				return nil, DBQUERY_ERROR
-			}
-			if qutil.IntAll((*uData)["i_interested"]) == -1 {
-				defValue = -1
-			}
-		} else {
-			return nil, OPERATION_ERROR
-		}
-		return map[string]interface{}{
-			"valueSet": defValue,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount Interested %s异常:%s\n", userId, doType, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 绑定邮箱&更改邮箱【绑定邮箱和更改邮箱流程一样】
-func (this *UserAccount) MailSet(doType string) {
-	sessVal := this.Session().GetMultiple()
-	userId, _ := sessVal["mgoUserId"].(string)
-	rData, errMsg := func() (interface{}, error) {
-		step, _ := this.GetInteger("step")
-		mail := this.GetString("mail")
-		code := this.GetString("code")
-		if doType == "change" && step == 1 { //仅发送验证码 校验是否通过身份验证
-			if pass, data := authenticationCheck(this.GetSession(mailAuthPassSessionKey)); !pass {
-				return data, nil
-			}
-		}
-		mailVerify, err := mailStep(this.Session(), step, mail, code, "bind")
-		if err != nil {
-			return nil, err
-		}
-		//校验验证码成功【校验是否需要合并】
-		if step == 2 {
-			if !util.Compatible.Update(userId, map[string]interface{}{
-				"$set": map[string]interface{}{
-					"s_myemail": mailVerify,
-				},
-			}) {
-				return nil, DBUPDATE_ERROR
-			}
-			userMsg, _ := util.MQFW.FindById("user", userId, `{"l_registedate":1}`)
-			isNew := false
-			if userMsg != nil && len(*userMsg) > 0 {
-				l_registedate := qutil.Int64All((*userMsg)["l_registedate"])
-				isNew = l_registedate > config.Config.TaskStartTime //是否注册时间处于新手任务开始时间
-			}
-			jy.Publish(util.Mgo_log, config.Config.Nsq, config.Config.Nsq_Topic, "task", userId, jy.Jyweb_node2, map[string]interface{}{
-				"code":       qutil.If(isNew, 1009, 1016),
-				"types":      "bindMail",
-				"num":        50,
-				"baseUserId": sessVal["base_user_id"],
-				"positionId": sessVal["positionId"],
-			})
-			this.Session().Del(mailAuthPassSessionKey)
-		}
-		return map[string]interface{}{
-			"state": 1,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount MailSet %s 邮箱异常:%s\n", userId, doType, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 公司名称联想
-func (this *UserAccount) CompanyAssociation() {
-	rData, errMsg := func() (interface{}, error) {
-		name := this.GetString("name")
-		count := config.Config.CompanySize
-		companyCount, _ := this.GetInt("companyCount")
-		if companyCount <= count*2 && companyCount > 0 {
-			count = companyCount
-		}
-		length, _ := this.GetInteger("len") //P416 电销要求公司名称可以两字联想,剑鱼业务还是三字
-		if length < 2 {
-			length = 3
-		}
-		list := []string{}
-		if len([]rune(name)) >= length {
-			query := fmt.Sprintf(`{"query": {"match_phrase": {"name": "%s"}},"_source": ["name"],"size": %d}`, name, count)
-			r := elastic.Get("qyxy", "qyxy", query)
-			if r != nil {
-				for _, v := range *r {
-					list = append(list, qutil.ObjToString(v["name"]))
-				}
-			}
-		}
-		return list, nil
-	}()
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 设置公司名称
-func (this *UserAccount) SetCompany() {
-	userId, _ := this.GetSession("mgoUserId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		companyName := strings.TrimSpace(this.GetString("name"))
-		if companyName == "" {
-			return nil, fmt.Errorf("公司名称不能为空")
-		}
-		if !util.Compatible.Update(userId, map[string]interface{}{
-			"$set": map[string]interface{}{
-				"s_company": companyName,
-			},
-		}) {
-			return nil, DBUPDATE_ERROR
-		}
-		return map[string]interface{}{
-			"state": 1,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount ChangeCompany 设置公司名称:%s\n", userId, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 获取图形验证码
-func (this *UserAccount) PhoneCaptcha() {
-	userId, _ := this.GetSession("mgoUserId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		rData := map[string]interface{}{}
-		if redis.GetInt("other", fmt.Sprintf(redisPhoneCaptchaFilter, userId, time.Now().Day())) < phoneSendNoImgFreeTime {
-			rData["needVerify"] = false
-		} else {
-			id := captcha.NewLen(4)
-			buf := bytes.NewBuffer(nil)
-			if err := captcha.WriteImage(buf, id, 90, 30); err != nil {
-				return nil, fmt.Errorf("生成图形验证码出错")
-			}
-			base64Img := base64.StdEncoding.EncodeToString(buf.Bytes())
-			this.SetSession("UserAccountPhoneCaptcha", id)
-			rData["imageData"] = base64Img
-			rData["needVerify"] = true
-		}
-		return rData, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount PhoneCaptcha 手机短信图形验证码获取异常:%s\n", userId, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 我的页面身份验证【绑定、更改手机号之前需要先进行身份验证 15分钟内无须重复验证】
-func (this *UserAccount) Authentication(doType string) {
-	sessVal := this.Session().GetMultiple()
-	userId, _ := sessVal["mgoUserId"].(string)
-	rData, errMsg := func() (interface{}, error) {
-		step, _ := this.GetInteger("step")
-		code := this.GetString("code")
-		if doType == "mail" { //邮箱安全校验
-			var uMail string
-			if step == 1 {
-				uMail = getUserMail(userId)
-				if uMail == "" {
-					return nil, fmt.Errorf("未查询到绑定邮箱")
-				}
-			}
-			if _, err := mailStep(this.Session(), step, uMail, code, "check"); err != nil {
-				return nil, err
-			}
-			if step == 2 {
-				this.SetSession(mailAuthPassSessionKey, time.Now().Unix())
-			}
-			return map[string]interface{}{
-				"state": 1,
-			}, nil
-		} else if doType == "phone" { //手机号安全校验
-			if step == 1 {
-				//校验图形验证码
-				if pass, err := imgCaptchaCheck(this.Session(), userId, code); !pass || err != nil {
-					return nil, err
-				}
-			}
-			phone, _ := sessVal["s_phone"].(string)
-			if phone == "" {
-				phone = getPhoneByUserId(userId)
-			}
-			if phone == "" {
-				return nil, fmt.Errorf("未绑定手机号")
-			}
-			if _, err := phoneStep(this.Request, this.Session(), step, phone, code, "auth"); err != nil {
-				return nil, err
-			}
-			//存入session 15分钟不用重复验证
-			if step == 2 {
-				this.SetSession(phoneAuthPassSessionKey, time.Now().Unix())
-			}
-			return map[string]interface{}{
-				"state": 1,
-			}, nil
-		}
-		return nil, OPERATION_ERROR
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount Authentication %s 身份验证异常:%s\n", userId, doType, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-//绑定手机号
-//微信用户
-//规则 1.绑定的手机号为全新手机号
-//    2.绑定的手机号非全新手机账号。对应已存在手机账户A。(完成后建立关联关系)
-//       A未绑定微信
-//       A账户已绑定微信,此微信必须与当前账户绑定的微信一致
-
-func (this *UserAccount) PhoneBind() {
-
-	sessVal := this.Session().GetMultiple()
-	userId, _ := sessVal["mgoUserId"].(string)
-	step, _ := this.GetInteger("step")
-	rData, errMsg := func() (interface{}, error) {
-		phone := this.GetString("phone")
-		code := this.GetString("code")
-		mode := this.GetString("mode")
-		email := this.GetString("email")
-        log.Println("绑定手机号开始1","phone:" ,phone,"code:" , code, "mode:" ,mode,"email:" , email)
-        if step == 1 {
-			//校验图形验证码
-			if pass, err := imgCaptchaCheck(this.Session(), userId, code); !pass || err != nil {
-				return nil, err
-			}
-			if getPhoneByUserId(userId) != "" {
-				return nil, fmt.Errorf("已绑定手机号,请勿重复绑定")
-			}
-		}
-		var (
-			phoneVerify string
-			err         error
-		)
-		captchaKey := this.GetString("captchaKey") //图形验证码key
-		if captchaKey != "" {
-			if strings.TrimSpace(phone) == "" {
-				return nil, fmt.Errorf("手机号异常")
-			}
-			if getPhoneByUserId(userId) != "" {
-				return nil, fmt.Errorf("已绑定手机号,请勿重复绑定")
-			}
-			identCode := this.GetString("identCode") //短信验证码
-			phoneVerify = jy.CheckPhoneIdent(this.Session(), identCode, fmt.Sprintf(jycaptcha.SendCodeKey, captchaKey, phone))
-			if phone != phoneVerify { //验证码不正确
-				return nil, fmt.Errorf("验证码错误")
-			}
-		} else {
-			//发送验证码&校验验证码逻辑
-			phoneVerify, err = phoneStep(this.Request, this.Session(), step, phone, code, "bind")
-			if err != nil {
-				return nil, err
-			}
-		}
-		rData := map[string]interface{}{
-			"state": 1,
-		}
-		//校验验证码成功【校验是否需要合并】
-		if step == 2 {
-			uData := util.Compatible.Select(userId, `{"s_unionid":1,"s_name":1,"s_nickname":1,"s_headimageurl":1,"l_registedate":1,"i_ispush":1,"i_applystatus":1,"i_sex":1,"s_country":1,"s_province":1,"s_city":1,"s_m_openid":1,"a_m_openid":1,"base_user_id":1,"s_newsource":1}`)
-			if uData == nil && len(*uData) == 0 {
-				return nil, DBQUERY_ERROR
-			}
-			unionid := qutil.ObjToString((*uData)["s_unionid"])
-			if unionid == "" {
-				return "", fmt.Errorf("获取账户信息异常")
-			}
-			exists, relationPhoneId, _ := jy.NewPhoneUtil(util.MQFW).BindPhoneIsOccupy(userId, unionid, phoneVerify)
-			log.Println("绑定手机号开始2", exists, relationPhoneId)
-			if exists { //再次校验是否使用
-				return nil, fmt.Errorf("手机号已被绑定")
-			}
-			if mode == "" || relationPhoneId == "" { //主动绑定-建立双向绑定关系||跳转绑定新手机号
-				if relationPhoneId == "" {
-					//船新用户 查看是否有邀请关系 shareRedisName
-					go func(openId string) {
-						newSource := qutil.ObjToString((*uData)["s_newsource"])
-						var shareUid string
-						shareKey := fmt.Sprintf("rec_%s", openId)
-						if openId != "" {
-							shareUid = redis.GetStr(config.Config.ShareRedisName, shareKey)
-						}
-						entity.NewShareFission(userId, shareUid, newSource).AddPower(this.Request)
-						if shareUid != "" {
-							redis.Del(config.Config.ShareRedisName, shareKey)
-						}
-					}(qutil.ObjToString((*uData)["s_m_openid"]))
-					//绑定手机号和关注公众号
-					jy.Publish(util.Mgo_log, config.Config.Nsq, config.Config.Nsq_Topic, "task", userId, jy.Jyweb_node2, map[string]interface{}{
-						"code":       1008,
-						"types":      "followWx",
-						"num":        50,
-						"baseUserId": sessVal["base_user_id"],
-						"positionId": sessVal["positionId"],
-					})
-				}
-				data := map[string]interface{}{
-					"s_unionid":      (*uData)["s_unionid"],
-					"s_name":         (*uData)["s_name"],
-					"s_nickname":     (*uData)["s_nickname"],
-					"s_headimageurl": (*uData)["s_headimageurl"],
-				}
-				// 新用户注册 记录来源
-				sourceLabel := redis.GetStr("limitation", fmt.Sprintf("firstVisitTagByWX_%s", this.Session().Id()))
-				if sourceLabel != "" {
-					data["s_rsource"] = sourceLabel
-				} else {
-					activity := this.GetString("activity")
-					if activity != "" {
-						data["s_rsource"] = activity
-					}
-				}
-				if jy.IsEmail(email) {
-					data["s_email"] = email
-				}
-				//建立关联关系
-				if bindErr := jy.NewPhoneUtil(util.MQFW).BindPhone(userId, relationPhoneId, phoneVerify, email, &data); bindErr != nil {
-					return nil, bindErr
-				}
-				//用户中台存储  开始
-				if uinfo := jy.GetInfoForBaseUser(util.MQFW, userId); uinfo != nil {
-					jy.UpdateUser(util.MQFW, userId, *uinfo, *config.Middleground)
-				}
-				//用户中台存储  结束
-				jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).FlushSession(userId) //刷新session
-
-			} else if mode == "mergeBind" { //跳转绑定-不合并绑定无效
-				log.Println("绑定手机号开始5", qutil.Int64All((*uData)["l_registedate"]), config.AutoMergeTimeStamp)
-				if qutil.Int64All((*uData)["l_registedate"]) > config.AutoMergeTimeStamp { //新微信直接绑定
-					data := map[string]interface{}{
-						"s_unionid":      (*uData)["s_unionid"],
-						"s_name":         (*uData)["s_name"],
-						"s_nickname":     (*uData)["s_nickname"],
-						"s_headimageurl": (*uData)["s_headimageurl"],
-						"i_ispush":       (*uData)["i_ispush"],
-						"i_applystatus":  (*uData)["i_applystatus"],
-						"i_sex":          (*uData)["i_sex"],
-						"s_country":      (*uData)["s_country"],
-						"s_province":     (*uData)["s_province"],
-						"s_city":         (*uData)["s_country"],
-						"s_m_openid":     (*uData)["s_m_openid"],
-						"a_m_openid":     (*uData)["a_m_openid"],
-						"o_jy.i_wxpush":  1,
-					}
-					if jy.IsEmail(email) {
-						data["s_email"] = email
-					}
-					log.Println("绑定手机号开始3", relationPhoneId, data)
-					if util.Compatible.Update(relationPhoneId, map[string]interface{}{
-						"$set": data,
-					}) {
-						//用户中台存储  开始
-						if uinfo := jy.GetInfoForBaseUser(util.MQFW, mongodb.BsonIdToSId(relationPhoneId)); uinfo != nil {
-							jy.UpdateUser(util.MQFW, mongodb.BsonIdToSId(relationPhoneId), *uinfo, *config.Middleground)
-						}
-						//删除user
-						base_userid_del := usercenter.GetBaseUserId(util.MQFW, userId)
-						jy.DelUser(util.MQFW, userId, pb.UserIdReq{
-							Appid: "10000",
-							Id:    base_userid_del,
-						}, *config.Middleground)
-						//备份用户
-						if backUser, _ := util.MQFW.FindById("user", userId, nil); backUser != nil && len(*backUser) > 0 {
-							backData := map[string]interface{}{
-								"l_mergeData":   time.Now().Unix(),
-								"s_userId":      userId,
-								"s_save_userId": relationPhoneId,
-								"mergeType":     "autoMerge",
-							}
-
-							for k, v := range *backUser {
-								if k == "_id" {
-									continue
-								}
-								backData[k] = v
-							}
-							log.Println("绑定手机号开始4", backData)
-
-							if util.MQFW.Save("user_merge", backData) != "" {
-								util.MQFW.Del("user", map[string]interface{}{"_id": mongodb.StringTOBsonId(userId)})
-								jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).FlushSession(relationPhoneId)
-								redis.Put("session", fmt.Sprintf("usermerge_delete_%s", userId), relationPhoneId, 7*24*60*60)
-							}
-						}
-						//用户中台存储  结束
-						return rData, nil
-					}
-					return nil, fmt.Errorf("账号自动合并异常")
-				} else { //老微信用户选择合并
-					go util.CollectPhone(userId, phoneVerify) //增加user表验证手机号
-					rData["state"] = 2                        //跳转合并页面
-					rData["token"] = jy.MergeEncrypt.Encode2Hex(userId + "&&" + relationPhoneId)
-				}
-			}
-		}
-		return rData, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount PhoneBind 绑定手机号异常:%s\n", userId, errMsg.Error())
-	} else if step == 2 {
-		newSessVal := this.Session().GetMultiple()
-		newUserId, _ := newSessVal["mgoUserId"].(string)
-		jy.Publish(util.Mgo_log, config.Config.Nsq, config.Config.Nsq_Topic, "task", newUserId, jy.Jyweb_node2, map[string]interface{}{
-			"code":       1007,
-			"types":      "bindPhone",
-			"num":        50,
-			"baseUserId": newSessVal["base_user_id"],
-			"positionId": newSessVal["positionId"],
-			"isOnlyBind": true,
-		})
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 手机号绑定流程
-// 绑定=bind 更改=change
-// 更改手机号
-//
-//	当需要合并时 可以绑定存在的手机号账户
-//	当不需要合并时 只能更改新手机号
-//
-// 解绑完成后 需要解除关联关系
-func (this *UserAccount) PhoneChange() {
-	userId, _ := this.GetSession("mgoUserId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		step, _ := this.GetInteger("step")
-		phone := this.GetString("phone")
-		code := this.GetString("code")
-		if step == 1 { //仅发送验证码 校验是否通过身份验证
-			if pass, data := authenticationCheck(this.GetSession(phoneAuthPassSessionKey)); !pass {
-				return data, nil
-			}
-			//校验图形验证码
-			if pass, err := imgCaptchaCheck(this.Session(), userId, code); !pass || err != nil {
-				return nil, err
-			}
-			//发送短信验证码前,校验手机号是否存在
-			wId, _, _, err := jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).MergeQuery()
-			if err != nil {
-				return nil, err
-			}
-			if exists, _ := jy.NewPhoneUtil(util.MQFW).ChangePhoneIsOccupy(phone, wId != "" && userId == wId); exists {
-				return nil, fmt.Errorf("手机号已被使用")
-			}
-		}
-		//发送验证码&校验验证码逻辑
-		phoneVerify, err := phoneStep(this.Request, this.Session(), step, phone, code, "change")
-		if err != nil {
-			return nil, err
-		}
-		//校验验证码成功绑定手机号
-		if step == 2 {
-			//更换手机号前,再次校验是否存在手机号
-			wId, _, _, err := jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).MergeQuery()
-			if err != nil {
-				return nil, err
-			}
-			exists, relationPhoneId := jy.NewPhoneUtil(util.MQFW).ChangePhoneIsOccupy(phoneVerify, wId != "" && userId == wId)
-			if exists {
-				return nil, fmt.Errorf("手机号已被使用")
-			}
-			uData := util.Compatible.Select(userId, `{"s_phone":1,"s_m_phone":1,"s_unionid":1,"s_name":1,"s_nickname":1,"s_headimageurl":1}`)
-			if uData == nil || len(*uData) == 0 {
-				return nil, DBQUERY_ERROR
-			}
-			beforePhone, _ := qutil.If((*uData)["s_phone"] != nil, (*uData)["s_phone"], (*uData)["s_m_phone"]).(string)
-			if beforePhone == "" {
-				return nil, fmt.Errorf("获取手机号异常")
-			}
-			updateMap := map[string]interface{}{}
-			//商机管理更改手机号逻辑entniche
-			if !util.Mysql.ExecTx("更换管理员老手机号", func(tx *sql.Tx) bool {
-				update_1, update_2 := true, true
-				if util.Mysql.CountBySql("select id from entniche_user where phone=? ", beforePhone) > 0 {
-					update_1 = util.Mysql.UpdateOrDeleteBySqlByTx(tx, `update entniche_user set phone=? where phone=? `, phoneVerify, beforePhone) > -1
-				}
-				if util.Mysql.CountBySql("select id from entniche_info where phone=? ", beforePhone) > 0 {
-					update_2 = util.Mysql.UpdateOrDeleteBySqlByTx(tx, `update entniche_info set phone=? where phone=?`, phoneVerify, beforePhone) > -1
-				}
-				changePhone := map[string]interface{}{}
-				if (*uData)["s_phone"] != nil {
-					changePhone["s_phone"] = phoneVerify
-				}
-				if (*uData)["s_m_phone"] != nil {
-					changePhone["s_m_phone"] = phoneVerify
-				}
-				updateMap["$set"] = changePhone //更改手机号字段
-
-				//解除关联关系
-				//手机号端
-				//   删除微信相关字段
-				//微信端(不查询)
-				//   不做更改
-				phoneUnset := map[string]interface{}{
-					"s_unionid": 1, "s_name": 1, "s_nickname": 1, "s_headimageurl": 1,
-				}
-				wId, pId, err := jy.NewPhoneUtil(util.MQFW).QueryRelation(beforePhone)
-				if err != nil {
-					log.Printf("%s UserAccount ChangePhone 更改手机号异常 %v \n", userId, err)
-					return false
-				}
-				if wId != "" && pId != "" {
-					if userId == wId { //当前为微信账户
-						if err := jy.NewPhoneUtil(util.MQFW).UnBindWeixin(pId, "", "PhoneChange"); err != nil {
-							log.Printf("%s UserAccount ChangePhone 更改手机号异常 %v \n", userId, err)
-							return false
-						}
-					} else {
-						updateMap["$unset"] = phoneUnset
-					}
-				}
-				//记录日志
-				jy.NewPhoneUtil(util.MQFW).Log(userId, "PhoneChange", phoneVerify)
-				return update_1 && update_2
-			}) {
-				return nil, fmt.Errorf("商机管理手机号更改出错")
-			}
-			//设置新号关联关系
-			if relationPhoneId != "" {
-				upsetMap := map[string]interface{}{
-					"s_unionid":      (*uData)["s_unionid"],
-					"s_name":         (*uData)["s_name"],
-					"s_nickname":     (*uData)["s_nickname"],
-					"s_headimageurl": (*uData)["s_headimageurl"],
-				}
-				if err := jy.NewPhoneUtil(util.MQFW).BindWeixin(relationPhoneId, "", "", &upsetMap, "PhoneChange"); err != nil {
-					log.Printf("%s UserAccount ChangePhone 更改手机号异常 %v \n", userId, err)
-				}
-			}
-			if !util.Compatible.Update(userId, updateMap) {
-				log.Printf("%s UserAccount ChangePhone 数据更改手机号异常 \n", userId)
-				return nil, fmt.Errorf("数据更新异常")
-			}
-			//用户中台存储  开始
-			func(phone, userId string) {
-				if uinfo := jy.GetInfoForBaseUser(util.MQFW, userId); uinfo != nil {
-					jy.UpdateUser(util.MQFW, userId, *uinfo, *config.Middleground)
-				}
-			}(phoneVerify, userId)
-			//用户中台存储  结束
-			this.Session().Del(phoneAuthPassSessionKey)
-			jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).FlushSession(userId) //刷新session
-		}
-		return map[string]interface{}{
-			"state": 1,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount ChangePhone 更改手机号异常:%s\n", userId, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 查询是否绑定微信
-// 仅手机号存在才能(绑定|解绑)微信
-func (this *UserAccount) WxBindCheck() {
-	userId, _ := this.GetSession("mgoUserId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		thisUser := util.Compatible.Select(userId, `{"s_unionid":1,"s_phone":1}`)
-		if thisUser == nil || len(*thisUser) == 0 {
-			return nil, DBQUERY_ERROR
-		}
-		binded, showWxBind := false, false
-		if unionid, ok := (*thisUser)["s_unionid"]; ok {
-			if len(qutil.ObjToString(unionid)) > 11 { //手机号用户s_unionid为手机号
-				binded = true
-			}
-		}
-		if phone, ok := (*thisUser)["s_phone"].(string); ok && phone != "" {
-			showWxBind = true
-		}
-		return map[string]interface{}{
-			"binded":     binded,
-			"showWxBind": showWxBind,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount WxBindCheck 微信绑定查询出错:%s\n", userId, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 绑定微信
-// app手机号用户
-// 规则 1.绑定的微信为全新微信
-//
-//	2.绑定的微信非全新微信账号。对应已存在账户A.(完成后建立关联关系)
-//	   A未绑定手机号(绑定后,此账户需要添加关联关系,即设置s_m_phone)
-//	   A账户已绑定手机号,此手机号必须与当前账户手机号一致
-func (this *UserAccount) WxBind() {
-	userId, _ := this.GetSession("mgoUserId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		//认证校验
-		//if pass, data := authenticationCheck(this.GetSession(phoneAuthPassSessionKey)); !pass {
-		//	return data, nil
-		//}
-		uBind, err := jy.GetMsgFromWxSign(this.GetString("param"))
-		if err != nil {
-			return nil, PARAM_ERROR
-		}
-		thisUser := util.Compatible.Select(userId, `{"s_unionid":1,"s_phone":1}`)
-		if thisUser == nil || len(*thisUser) == 0 {
-			return false, DBQUERY_ERROR
-		}
-		//是否绑定
-		if unionid, ok := (*thisUser)["s_unionid"]; ok {
-			if len(qutil.ObjToString(unionid)) > 11 { //手机号用户s_unionid为手机号
-				return nil, fmt.Errorf("请勿重复绑定")
-			}
-		}
-		//仅手机号登录s_phone能绑定&解绑
-		thisPhone, _ := (*thisUser)["s_phone"].(string)
-		if thisPhone == "" {
-			return nil, fmt.Errorf("非法操作")
-		}
-		//绑定微信条件
-		//1.全新微信
-		//2.非全新微信。此号无绑定手机号,或者绑定手机号和当前手机号一致(绑定后此非全新微信,也需要添加手机号字段;建立双向关联关系)
-		exists, relationWeixinId := jy.NewPhoneUtil(util.MQFW).BindWeixinIsOccupy(thisPhone, uBind.UnionId)
-		if exists {
-			return nil, fmt.Errorf("微信被已绑定")
-		}
-		upDateMap := &map[string]interface{}{
-			"s_name":         uBind.Nickname,
-			"s_nickname":     uBind.Nickname,
-			"s_headimageurl": uBind.HeadImageUrl,
-			"s_unionid":      uBind.UnionId,
-		}
-		//建立绑定关系
-		if bindErr := jy.NewPhoneUtil(util.MQFW).BindWeixin(userId, relationWeixinId, thisPhone, upDateMap); bindErr != nil {
-			return nil, bindErr
-		}
-
-		//关联用户中台base_user_id  双向关系
-
-		if uinfo := jy.GetInfoForBaseUser(util.MQFW, userId); uinfo != nil {
-			jy.UpdateUser(util.MQFW, userId, *uinfo, *config.Middleground)
-		}
-		if uinfo := jy.GetInfoForBaseUser(util.MQFW, relationWeixinId); uinfo != nil {
-			jy.UpdateUser(util.MQFW, relationWeixinId, *uinfo, *config.Middleground)
-		}
-		//刷新session
-		jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).FlushSession(userId)
-		return map[string]interface{}{
-			"state": 1,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount WxBind 微信绑定出错:%s\n", userId, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-// 解绑微信
-// app手机号用户
-// 规则 1.当前账户解绑的微信存在公众号关注用户,则去关后会产生新的公众号用户;否则(已取关,或不存在公众号用户),则直接删除此微信相关字段
-//
-//	2.解绑的微信存在已绑定的手机号(存在关联关系),解绑后解除关联关系
-func (this *UserAccount) WxUnBind() {
-	userId, _ := this.GetSession("mgoUserId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		//认证校验
-		//if pass, data := authenticationCheck(this.GetSession(phoneAuthPassSessionKey)); !pass {
-		//	return data, nil
-		//}
-		unsetMap := util.Compatible.Select(userId, `{"s_m_phone":1,"s_phone":1,"s_unionid":1,"s_name":1,"s_nickname":1,"i_sex":1,"s_country":1,"s_province":1,"s_city":1,"s_headimageurl":1,"s_m_openid":1,"a_m_openid":1,"i_ispush":1,"i_applystatus":1,"s_rsource":1}`)
-		if unsetMap == nil || len(*unsetMap) == 0 {
-			return nil, DBQUERY_ERROR
-		}
-		unionid := qutil.ObjToString((*unsetMap)["s_unionid"])
-		if unionid == "" {
-			return nil, fmt.Errorf("未查询到绑定信息")
-		}
-		//解绑微信必须 仅手机号登录
-		phone, _ := (*unsetMap)["s_phone"].(string)
-		if phone == "" {
-			return nil, fmt.Errorf("非法操作")
-		}
-		s_m_openid, flushWxsession := qutil.ObjToString((*unsetMap)["s_m_openid"]), false
-		if s_m_openid != "" && qutil.IntAll((*unsetMap)["i_ispush"]) == 1 {
-			delete(*unsetMap, "s_m_phone")
-			delete(*unsetMap, "s_phone")
-			(*unsetMap)["l_registedate"] = time.Now().Unix()
-			(*unsetMap)["i_appid"] = 2
-			(*unsetMap)["i_ts_guide"] = 2
-			(*unsetMap)["o_jy"] = map[string]interface{}{
-				"i_wxpush":   1,
-				"i_ratemode": 2,
-				// "i_newfree":  1, //新免费用户=>新订阅设置页面 20211122
-			}
-			userAddReq := &pb.UserAddReq{
-				Appid:   "10000",
-				Unionid: qutil.ObjToString((*unsetMap)["s_unionid"]),
-				SOpenid: s_m_openid,
-			}
-			if qutil.ObjToString((*unsetMap)["s_nickname"]) != "" {
-				userAddReq.Nickname = qutil.ObjToString((*unsetMap)["s_nickname"])
-			}
-			if qutil.ObjToString((*unsetMap)["s_headimageurl"]) != "" {
-				userAddReq.Headimg = qutil.ObjToString((*unsetMap)["s_headimageurl"])
-			}
-			if qutil.ObjToString((*unsetMap)["a_m_openid"]) != "" {
-				userAddReq.AOpenid = qutil.ObjToString((*unsetMap)["a_m_openid"])
-			}
-			if resp := config.Middleground.UserCenter.UserAdd(*userAddReq); resp != nil && resp.Data.Id > 0 {
-				(*unsetMap)["base_user_id"] = resp.Data.Id
-			} else {
-				log.Println(qutil.ObjToString((*unsetMap)["s_unionid"]), "调用usercenter失败")
-				return nil, DBUPDATE_ERROR
-			}
-			//公众号微信关注移至另一用户中  此时微信公众号用户session问题错乱
-			saveId := util.MQFW.Save("user", unsetMap)
-			if saveId == "" {
-				return nil, DBUPDATE_ERROR
-			}
-			go jy.SaveUserLog(util.Mgo_log, saveId, phone, "phone", "wx", "wx", "", "", gconv.String(this.GetSession("RSource")), this.Request.Proto, this.UserAgent(), gconv.String(qutil.If(gconv.String((*unsetMap)["s_rsource"]) == "jyzbw", "jyzbw", "jybx")), "")
-
-			flushWxsession = true
-		}
-
-		//查询是否存在关联账户
-		wId, _, err := jy.NewPhoneUtil(util.MQFW).QueryRelation(phone)
-		if err != nil {
-			return nil, err
-		}
-		//解除绑定
-		if err := jy.NewPhoneUtil(util.MQFW).UnBindWeixin(userId, wId); err != nil {
-			return nil, err
-		}
-		//解除baseuser绑定
-		if uinfo := jy.GetInfoForBaseUser(util.MQFW, userId); uinfo != nil {
-			jy.UpdateUser(util.MQFW, userId, *uinfo, *config.Middleground)
-		}
-
-		//微信解绑成功
-		//1.微信账户刷新session
-		if flushWxsession {
-			redis.Put("session", fmt.Sprintf("accountInfo_unbindWx_%s_%s", userId, s_m_openid), fmt.Sprintf("%d", time.Now().Unix()), 7*24*60*60)
-		}
-		//清除session中企业账户信息
-		for _, entSessionKey := range []string{"entId", "entName", "entUserId", "frameworkEntId", "frameworkEntName"} {
-			this.DelSession(entSessionKey)
-		}
-
-		//2.刷新当前账户session
-		jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).FlushSession(userId)
-		return map[string]interface{}{
-			"state": 1,
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s UserAccount WxBind 微信解绑出错:%s\n", userId, errMsg.Error())
-	}
-	this.ServeJson(NewResult(rData, errMsg))
-}
-
-func (u *UserAccount) ShareUserId() {
-	userId, _ := u.GetSession("userId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		if userId == "" {
-			return nil, DBQUERY_ERROR
-		}
-		return map[string]interface{}{
-			"shareUserId": encrypt.SE.Encode2Hex(userId),
-			"webdomain":   config.Config.WebDomain,
-		}, nil
-	}()
-	u.ServeJson(NewResult(rData, errMsg))
-}
-
-//util---------------------------------
-
-// 图形验证码校验
-func imgCaptchaCheck(sess *httpsession.Session, userId, code string) (bool, error) {
-	if redis.GetInt("other", fmt.Sprintf(redisPhoneCaptchaFilter, userId, time.Now().Day())) >= phoneSendNoImgFreeTime { //需要验证图形验证码
-		sessValue, _ := sess.Get("UserAccountPhoneCaptcha").(string)
-		sess.Del("UserAccountPhoneCaptcha") //验证一次即清除
-		if !captcha.VerifyString(sessValue, code) {
-			return false, fmt.Errorf("图形验证码错误")
-		}
-	}
-	return true, nil
-}
-
-// 身份验证
-func authenticationCheck(authStampInf interface{}) (bool, map[string]interface{}) {
-	authStamp := qutil.Int64All(authStampInf)
-	if authStamp != 0 && time.Now().Before(time.Unix(authStamp, 0).Add(time.Minute*15)) {
-		return true, nil
-	}
-	return false, map[string]interface{}{
-		"state": -1,
-	}
-}
-
 // 手机号绑定流程
 // 绑定=bind 更改=change
 func phoneStep(r *http.Request, sess *httpsession.Session, step int, phone, code, sign string) (string, error) {