|
@@ -0,0 +1,203 @@
|
|
|
+package logic
|
|
|
+
|
|
|
+import (
|
|
|
+ "app.yhyue.com/moapp/jybase/common"
|
|
|
+ "app.yhyue.com/moapp/jybase/date"
|
|
|
+ "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
|
|
|
+ IC "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXSubscribe/rpc/init"
|
|
|
+ "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXSubscribe/rpc/internal/svc"
|
|
|
+ "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXSubscribe/rpc/type/bxsubscribe"
|
|
|
+ "context"
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "regexp"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/zeromicro/go-zero/core/logx"
|
|
|
+)
|
|
|
+
|
|
|
+type SaveTSGuideLogic struct {
|
|
|
+ ctx context.Context
|
|
|
+ svcCtx *svc.ServiceContext
|
|
|
+ logx.Logger
|
|
|
+}
|
|
|
+
|
|
|
+func NewSaveTSGuideLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveTSGuideLogic {
|
|
|
+ return &SaveTSGuideLogic{
|
|
|
+ ctx: ctx,
|
|
|
+ svcCtx: svcCtx,
|
|
|
+ Logger: logx.WithContext(ctx),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 保存订阅向导设置
|
|
|
+func (l *SaveTSGuideLogic) SaveTSGuide(in *bxsubscribe.SaveTSGuideReq) (*bxsubscribe.StatusResp, error) {
|
|
|
+
|
|
|
+ // 校验用户身份
|
|
|
+ baseUserId, _ := strconv.ParseInt(in.NewUserId, 10, 64)
|
|
|
+ accountId, _ := strconv.ParseInt(in.AccountId, 10, 64)
|
|
|
+ positionType, _ := strconv.ParseInt(in.PositionType, 10, 64)
|
|
|
+ positionId, _ := strconv.ParseInt(in.PositionId, 10, 64)
|
|
|
+ entId, _ := strconv.ParseInt(in.EntId, 10, 64)
|
|
|
+ // 校验是否已经完成过订阅向导
|
|
|
+ // 查询订阅信息中的关键词和向导查询
|
|
|
+ data := IC.Compatible.Select(in.UserId, `{"i_ts_guide":1,"l_registedate":1,"o_member_jy":1}`)
|
|
|
+ if data != nil && len(*data) > 0 {
|
|
|
+ registedate := common.Int64All((*data)["l_registedate"])
|
|
|
+ if (in.UserType != SubFreeFlag && registedate < IC.C.GuideRegistedate) || common.Int64All((*data)["i_ts_guide"]) == tsGuideFinished {
|
|
|
+ // 已经设置过
|
|
|
+ return nil, errors.New("重复设置向导")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ user := IC.Compatible.Middleground.PowerCheckCenter.Check(in.AppId, in.UserId, baseUserId, accountId, entId, positionType, positionId)
|
|
|
+ if user == nil {
|
|
|
+ return nil, errors.New("身份异常")
|
|
|
+ }
|
|
|
+ var field string
|
|
|
+ countLimit := 0
|
|
|
+ areaCountLimit := 0
|
|
|
+ switch in.UserType {
|
|
|
+ case SubFreeFlag:
|
|
|
+ if !user.Free.IsFree {
|
|
|
+ return nil, errors.New("身份异常")
|
|
|
+ }
|
|
|
+ countLimit = 10
|
|
|
+ field = "o_jy.%s"
|
|
|
+ areaCountLimit = 1 // 免费用户
|
|
|
+ case SubVipFlag:
|
|
|
+ if user.Vip.Status <= 0 {
|
|
|
+ return nil, errors.New("身份异常")
|
|
|
+ }
|
|
|
+ field = "o_vipjy.%s"
|
|
|
+ areaCountLimit = int(user.Vip.Areacount)
|
|
|
+ countLimit = 300
|
|
|
+ case MemberFlag:
|
|
|
+ if user.Member.Status <= 0 {
|
|
|
+ return nil, errors.New("身份异常")
|
|
|
+ }
|
|
|
+ field = "o_member_jy.%s"
|
|
|
+ countLimit = 300
|
|
|
+ areaCountLimit = -1
|
|
|
+ // 判断单省版
|
|
|
+ o_member_jy, o_member_jyb := (*data)["o_member_jy"].(map[string]interface{})
|
|
|
+ if o_member_jy != nil && o_member_jyb {
|
|
|
+ if common.IntAll(o_member_jy["i_areacount"]) > 0 {
|
|
|
+ areaCountLimit = common.IntAll(o_member_jy["i_areacount"])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case EntnicheFlag:
|
|
|
+ if user.Entniche.Status <= 0 {
|
|
|
+ return nil, errors.New("身份异常")
|
|
|
+ }
|
|
|
+ field = "o_entniche.%s"
|
|
|
+ countLimit = 300
|
|
|
+ areaCountLimit = -1
|
|
|
+
|
|
|
+ }
|
|
|
+ updateMap := map[string]interface{}{}
|
|
|
+ area := map[string]interface{}{}
|
|
|
+ err := json.Unmarshal([]byte(in.Area), &area)
|
|
|
+ // 验证地区数量 //会有没有走过订阅向导买过省份订阅包的情况吗? 暂时不考虑
|
|
|
+ if err != nil {
|
|
|
+ logx.Error("反序列化失败", in.Area, err)
|
|
|
+ return nil, errors.New("地区有误")
|
|
|
+ } else {
|
|
|
+ updateMap[fmt.Sprintf(field, "o_area")] = area
|
|
|
+ }
|
|
|
+ if areaCountLimit > 0 && len(area) > areaCountLimit {
|
|
|
+ return nil, errors.New("地区数量有误")
|
|
|
+ }
|
|
|
+ // 处理地区
|
|
|
+ if in.District != "" {
|
|
|
+ district := map[string]interface{}{}
|
|
|
+ err = json.Unmarshal([]byte(in.District), &district)
|
|
|
+ if err != nil {
|
|
|
+ logx.Error("反序列化失败", in.District, err)
|
|
|
+ return nil, errors.New("地区有误")
|
|
|
+ } else {
|
|
|
+ updateMap[fmt.Sprintf(field, "o_district")] = district
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理关键词
|
|
|
+ // 免费 处理掉空格
|
|
|
+ arryMap := []interface{}{}
|
|
|
+ key := []string{}
|
|
|
+ if in.UserType == SubFreeFlag {
|
|
|
+ for i := 0; i < len(in.Keywords); i++ {
|
|
|
+ tmp := processKeyword(in.Keywords[i])
|
|
|
+ if len(tmp) > 0 {
|
|
|
+ arryMap = append(arryMap, map[string]interface{}{"matchway": 1, "key": tmp[0:1], "notkey": nil, "updatetime": time.Now().Unix()})
|
|
|
+ }
|
|
|
+ if len(key) >= countLimit {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ updateMap[fmt.Sprintf(field, "a_key")] = arryMap
|
|
|
+ } else {
|
|
|
+ // 付费 按一组词
|
|
|
+ for i := 0; i < len(in.Keywords); i++ {
|
|
|
+ tmp := processKeyword(in.Keywords[i])
|
|
|
+ if len(tmp) > 0 {
|
|
|
+ arryMap = append(arryMap, map[string]interface{}{"matchway": 0, "key": tmp, "notkey": nil, "updatetime": time.Now().Unix()})
|
|
|
+ }
|
|
|
+ if len(key) >= countLimit {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item := map[string]interface{}{
|
|
|
+ "a_key": arryMap,
|
|
|
+ "s_item": "未分类",
|
|
|
+ "updatetime": date.NowFormat(date.Date_Full_Layout),
|
|
|
+ }
|
|
|
+ updateMap[fmt.Sprintf(field, "a_items")] = []map[string]interface{}{item}
|
|
|
+ }
|
|
|
+
|
|
|
+ updateMap[fmt.Sprintf(field, "l_modifydate")] = time.Now().Unix()
|
|
|
+ updateMap["i_ts_guide"] = tsGuideFinished
|
|
|
+ // 判断app提醒总开关是否打开 如果打开 我的订阅APP提醒初始值为“开启”状态。
|
|
|
+ if in.AppSwitch {
|
|
|
+ updateMap["o_pushset.o_subset.i_apppush"] = 1
|
|
|
+ }
|
|
|
+ go SetLog(in.UserId, strings.ReplaceAll(field, ".%s", ""))
|
|
|
+ if !IC.Compatible.Update(in.UserId, map[string]interface{}{
|
|
|
+ "$set": updateMap,
|
|
|
+ }) {
|
|
|
+ logx.Error("设置订阅向导更新失败", in.UserId, updateMap)
|
|
|
+ return nil, errors.New("设置订阅向导更新失败")
|
|
|
+ }
|
|
|
+ go jy.Publish(IC.MgoLog, IC.C.Nsq, IC.C.NsqTopic, "task", in.UserId, jy.Jyweb_node2, map[string]interface{}{
|
|
|
+ "code": 1015, //首次订阅
|
|
|
+ "types": "subscribeKeyWords",
|
|
|
+ "num": 50,
|
|
|
+ "baseUserId": baseUserId,
|
|
|
+ "positionId": positionId,
|
|
|
+ })
|
|
|
+ return &bxsubscribe.StatusResp{}, nil
|
|
|
+}
|
|
|
+
|
|
|
+// SetLog 订阅设置记录
|
|
|
+func SetLog(userid, types string) {
|
|
|
+ if data := IC.Compatible.Select(userid, `{"o_vipjy":1,"o_member_jy":1,"o_jy":1}`); len(*data) > 0 && data != nil {
|
|
|
+ (*data)["userid"] = userid
|
|
|
+ (*data)["type"] = types
|
|
|
+ (*data)["createtime"] = time.Now().Unix()
|
|
|
+ IC.MgoLog.Save("ovipjy_log", data)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 保存入库之前,处理订阅的关键词
|
|
|
+func processKeyword(keyword string) []string {
|
|
|
+ keywordReg := regexp.MustCompile("([\\s\u3000\u2003\u00a0+,,])+")
|
|
|
+ spaceReg := regexp.MustCompile("\\s+")
|
|
|
+ keyword = keywordReg.ReplaceAllString(keyword, " ")
|
|
|
+ keyword = spaceReg.ReplaceAllString(keyword, " ")
|
|
|
+ keyword = strings.Trim(keyword, " ")
|
|
|
+ if keyword == "" {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return strings.Split(keyword, " ")
|
|
|
+}
|