瀏覽代碼

Merge branch 'feature/v1.2.1' of https://app.yhyue.com/moapp/message into feature/v1.2.1

lianbingjie 2 年之前
父節點
當前提交
7bd27a2184

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+##
+.idea
+*.exe
+*.log

+ 1 - 1
etc/config.yaml

@@ -115,5 +115,5 @@ orderMonitor :
   dateSpecial: 2022-10-19         # 特殊奖品活动日期 (第111名活动日期)
   openCron: "0 0 6 * * *"         # 每天6点开启
   selectCron: "0 */5 6-22 * * *"    # 查询订单的表达式  6点到22点 每五分钟查询一次
-  winNumberDaily: 11       # 每天第xx个付款获得奖品
+  winNumberDaily: 11       # 每天第xx个付款获得奖品1
   winNumbersSpecial: 111   # 第xxx个付款获得特殊奖品

+ 6 - 2
handler/activity/jyActivity.go

@@ -11,6 +11,7 @@ import (
 	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/os/gtime"
 	"github.com/gogf/gf/v2/util/gconv"
+	"sync"
 	"time"
 )
 
@@ -52,10 +53,13 @@ const (
 
 	BidderPlanShare     = "bidderPlanActivity_v1_ShareOk_%s" //是否分享
 	QuestionnaireSubmit = "questionnaireSubmit_%s"           //是否已提交问卷
-
+	WinnerInfoKey       = "winnerinfokey_22_11_11"
 )
 
-var MembershipDay *JyActivity
+var (
+	MembershipDay *JyActivity
+	ActivityLock  = &sync.Mutex{}
+)
 
 func init() {
 	MembershipDay = &JyActivity{

+ 63 - 19
handler/activity/jyActivityOther.go

@@ -4,28 +4,58 @@ import (
 	dataUtil "app.yhyue.com/moapp/jybase/date"
 	"app.yhyue.com/moapp/jybase/redis"
 	"app.yhyue.com/moapp/message/handler/award"
+	"encoding/json"
 	"fmt"
 	"github.com/gogf/gf/v2/os/gcfg"
 	"github.com/gogf/gf/v2/os/gctx"
+	"log"
 	"time"
 )
 
 //当日中奖信息
 func (BP *JyActivity) WinnerInfo() map[string]interface{} {
-	return award.GetWinnerInfo()
+	var res map[string]interface{}
+	//加个redis缓存
+	redisCache, err := redis.GetBytes(BidderPlanRedis, WinnerInfoKey)
+	if err == nil {
+		if err = json.Unmarshal(*redisCache, &res); err == nil {
+			return res
+		}
+	}
+	res = award.GetWinnerInfo()
+	if res != nil {
+		b, err := json.Marshal(res)
+		if err == nil && len(b) > 0 {
+			if err = redis.PutBytes(BidderPlanRedis, WinnerInfoKey, &b, 24*60*60); err != nil {
+				log.Println("中将人信息 缓存信息有误")
+			}
+		}
+	}
+	return res
 }
 
 // 问卷提交
 func (BP *JyActivity) Questionnaire(userId, phone, answers string) error {
-	if _, inActivity, _ := BP.InActivity(); !inActivity {
+	if inActivity, _, _ := BP.InActivity(); !inActivity {
 		return fmt.Errorf("不在活动时间内")
 	}
+	//判断是否是符合条件的免费用户
+	user := GetUserInfoRedisCache(userId)
+	if user.VipStatus > 0 || user.Status > 0 || user.EntnicheStatus > 0 {
+		return fmt.Errorf("用户身份不符合活动要求")
+	}
+	if user.Registedate < gcfg.Instance().MustGet(gctx.New(), "jyactivity.power.time", 1609430400).Int64() {
+		return fmt.Errorf("用户注册时间不符合活动要求")
+	}
 	//保存问卷
-	if award.SaveQuestionnaire(userId, phone, answers) {
-		if redis.Put(BidderPlanRedis, fmt.Sprintf(QuestionnaireSubmit, userId), 1, BP.cacheLong()) != true {
+	if ok := award.SaveQuestionnaire(userId, phone, answers); ok {
+		if redis.Put(BidderPlanRedis, fmt.Sprintf(QuestionnaireSubmit, userId), "qs", BP.cacheLong()) != true {
 			return fmt.Errorf("redis de22q 存储异常")
 		}
 		//问卷保存后--赠送7天超级订阅
+		if err := BP.GetDailyBoonSVip(userId); err != nil {
+			return err
+		}
 	} else {
 		return fmt.Errorf("mongodb de22q 存储异常")
 	}
@@ -48,7 +78,7 @@ func (BP *JyActivity) ShareFinish(userId string) error {
 // todayBalance 今日余额
 // 允许参加预热活动 用户注册时间限制
 // err 异常
-func (BP *JyActivity) GetDailyBoonDetail(userId string) (has bool, todayBalance int, registerBool, questionsBool bool, err error) {
+func (BP *JyActivity) GetDailyBoonDetail(userId string) (has bool, todayBalance int, registerBool bool, err error) {
 	if preHeatTime, _, _ := BP.InActivity(); !preHeatTime {
 		err = fmt.Errorf("不在预热活动时间内")
 		return
@@ -56,31 +86,31 @@ func (BP *JyActivity) GetDailyBoonDetail(userId string) (has bool, todayBalance
 	//查询是否领取
 	hasKey := fmt.Sprintf(BidderPlanHasDailyBoonKey, userId)
 	has = redis.GetInt(BidderPlanRedis, hasKey) >= 1
+	ActivityLock.Lock()
 	//查询剩余
 	todaySumKey := fmt.Sprintf(BidderPlanDailyBoonKey, time.Now().Format(dataUtil.Date_yyyyMMdd))
 	todayBalance = gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.limit", 500).Int() - redis.GetInt(BidderPlanRedis, todaySumKey)
 	if todayBalance < 0 {
 		todayBalance = 0
 	}
-	//默认问卷已提交  注册时间也在活动允许范围内
-	questionsBool, registerBool = true, true
+	ActivityLock.Unlock()
+	// 注册时间也在活动允许范围内
+	registerBool = true
 	//是否有权限领取
 	powerSwitch := gcfg.Instance().MustGet(gctx.New(), "jyactivity.power.switch", false).Bool()
 	//权限判断及问卷调查开关
 	if powerSwitch {
 		registerTime := gcfg.Instance().MustGet(gctx.New(), "jyactivity.power.time", 1609430400).Int64()
 		//注册时间是否在允许范围内
-		registerBool = registerTime < award.GetUserRegisterTime(userId)
-		//问卷是否提交
-		rsKey := fmt.Sprintf(QuestionnaireSubmit, userId)
-		questionsBool = redis.GetInt(BidderPlanRedis, rsKey) > 0
+		userInfo := GetUserInfoRedisCache(userId)
+		registerBool = userInfo != nil && registerTime <= userInfo.Registedate
 	}
 	return
 }
 
 // GetDailyBoonSVip 每日限量超级订阅领取
 func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
-	var has, questionsBool bool = false, false
+	var has bool = false
 	var todayBalance int = -1
 
 	var startTime time.Time
@@ -94,14 +124,13 @@ func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
 		err = fmt.Errorf("活动没有开始")
 		return
 	}
-
-	has, todayBalance, _, questionsBool, err = BP.GetDailyBoonDetail(userId)
-	if err != nil {
+	qs := redis.GetStr(BidderPlanRedis, fmt.Sprintf(QuestionnaireSubmit, userId))
+	if MembershipDay.DoubleEleven && qs == "" {
+		err = fmt.Errorf("未提交问卷")
 		return
 	}
-	//问卷是否提交
-	if !questionsBool {
-		err = fmt.Errorf("问卷未提交")
+	has, todayBalance, _, err = BP.GetDailyBoonDetail(userId)
+	if err != nil {
 		return
 	}
 	if has {
@@ -115,16 +144,18 @@ func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
 	err = func() error {
 		hasKey := fmt.Sprintf(BidderPlanHasDailyBoonKey, userId)
 		if redis.Incr(BidderPlanRedis, hasKey) == 1 {
+			ActivityLock.Lock()
 			todaySumKey := fmt.Sprintf(BidderPlanDailyBoonKey, time.Now().Format(dataUtil.Date_yyyyMMdd))
 			balance := redis.Incr(BidderPlanRedis, todaySumKey)
 			if balance > gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.limit", 500).Int64() {
 				return fmt.Errorf("剩余为零")
 			}
+			ActivityLock.Unlock()
 			if err := award.GivenSubVip(userId, award.SubVip{
 				Num:          gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.svip", nil).Int64(),
 				ActivityCode: BP.ActivityCode,
 				Date:         time.Now().Unix(),
-				Desc:         "预热福利",
+				Desc:         "22年双十一预热福利",
 			}); err != nil {
 				redis.Del(BidderPlanRedis, hasKey)
 				return fmt.Errorf("稍后重试")
@@ -143,3 +174,16 @@ func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
 	}()
 	return err
 }
+
+// GetUserInfoRedisCache  获取用户信息
+func GetUserInfoRedisCache(userId string) *award.UserBaseMsg {
+	//先从缓存中获取
+	cacheKey := fmt.Sprintf(PowerCacheKey, userId)
+	if bytes, err := redis.GetBytes(PowerCacheDb, cacheKey); err == nil && bytes != nil {
+		userPower := award.UserBaseMsg{}
+		if err := json.Unmarshal(*bytes, &userPower); err == nil {
+			return &userPower
+		}
+	}
+	return award.GetUserInfo(userId)
+}

+ 44 - 9
handler/award/user.go

@@ -7,15 +7,50 @@ import (
 	"time"
 )
 
-func GetUserRegisterTime(userId string) (t int64) {
-	user, ok := db.Mgo.FindById("user", userId, `"l_registedate":1`)
-	if ok && user != nil {
-		t = common.Int64All((*user)["l_registedate"])
+//用户redis缓存
+type UserBaseMsg struct {
+	Status         int   `json:"status"`          //大会员状态
+	VipStatus      int   `json:"vip_status"`      //超级订阅状态
+	EntnicheStatus int   `json:"entniche_status"` //商机管理状态
+	Registedate    int64 `json:"registedate"`     //用户注册时间
+	EntIsNew       bool  `json:"entIsNew"`        //是否是新版商机管理用户
+}
+
+// GetUserInfo 查看 22年活动 用户是否满足条件
+func GetUserInfo(userId string) *UserBaseMsg {
+	userPower := UserBaseMsg{}
+	if userId == "" {
+		return &userPower
+	}
+	user, ok := db.Mgo.FindById("user", userId, `{"i_member_status":1,"l_registedate":1,"i_vip_status":1,"s_phone":1,"s_m_phone":1}`)
+	if ok && user != nil && len(*user) > 0 {
+		userPower.Status = common.IntAllDef((*user)["i_member_status"], 0)
+		userPower.VipStatus = common.IntAllDef((*user)["i_vip_status"], 0)
+		userPower.Registedate = common.Int64All((*user)["l_registedate"])
+		phone, _ := common.If((*user)["s_phone"] != nil, (*user)["s_phone"], (*user)["s_m_phone"]).(string)
+		if phone != "" {
+			res := db.Mysql.SelectBySql(`SELECT i.isNew,i.name,i.phone,i.status,i.auth_status,u.power FROM entniche_user u LEFT JOIN entniche_info i
+			ON u.ent_id=i.id
+			WHERE u.phone=?
+			ORDER BY  i.status DESC,i.auth_status DESC, CASE WHEN i.phone=? THEN 0  ELSE 1 END  ASC`, phone, phone)
+			if res != nil && len(*res) > 0 {
+				//已购买企业未过期-商机管理用户
+				for _, v := range *res {
+					if common.IntAll(v["status"]) == 1 && common.IntAll(v["power"]) == 1 {
+						userPower.EntnicheStatus = 1
+						if common.IntAll(v["isNew"]) == 1 {
+							userPower.EntIsNew = true
+							break
+						}
+					}
+				}
+			}
+		}
 	}
-	return
+	return &userPower
 }
 
-//
+// SaveQuestionnaire  保存问卷
 func SaveQuestionnaire(userId, phone, answers string) bool {
 	id := db.Mgo.Save("double_eleven_22_q", map[string]interface{}{
 		"l_create":  time.Now().Unix(),
@@ -26,7 +61,7 @@ func SaveQuestionnaire(userId, phone, answers string) bool {
 	return id != ""
 }
 
-//
+// GetWinnerInfo  获取中奖人信息
 func GetWinnerInfo() map[string]interface{} {
 	todayData := db.Mysql.SelectBySql(`SELECT phone,winnerdate,mold FROM winner_info_22_10 WHERE TO_DAYS(winnerdate) = TO_DAYS(NOW())`)
 	if todayData != nil && len(*todayData) > 0 {
@@ -37,9 +72,9 @@ func GetWinnerInfo() map[string]interface{} {
 		}
 		switch common.ObjToString(data["mold"]) {
 		case "1":
-			data["mold"] = "获得 小米智能音箱 1个"
+			data["mold"] = "获得小米智能音箱"
 		case "2":
-			data["mold"] = "获得 iPad 1台"
+			data["mold"] = "获得iPad1台"
 		}
 		return data
 	}

+ 1 - 1
rpc/subscriobePay.go

@@ -45,7 +45,7 @@ func SubVipHarvest(userId string, num int, remark string) (err error) {
 	var repl JYShareResp
 	req := JYShareUserIdsRes{
 		ShareUserInfo: []shareUserInfo{
-			shareUserInfo{
+			{
 				UserId:     userId,
 				TimeExpand: num,
 				Remark:     remark,

+ 12 - 7
services/activity/bidderPlan/services.go

@@ -47,19 +47,24 @@ func (act *Activity) WinnerInfo() {
 // url:/jyActivity/membershipDay/questionnaire
 func (act *Activity) Questionnaire() {
 	userId := gconv.String(act.GetSession("userId"))
-	phone := gconv.String(act.Session().Get("s_phone"))
+	phone := gconv.String(act.Session().Get("phone"))
 	rData, errMsg := func() (bool, error) {
-		reqParam := map[string]interface{}{}
-		if err := json.Unmarshal(act.Body(), &reqParam); err != nil || len(reqParam) == 0 {
-			return false, fmt.Errorf("请求参数异常")
-		}
 		//连点处理
 		if !activity.MembershipDay.FastClickCheck(userId) {
 			return false, fmt.Errorf("操作频繁")
 		}
+		reqParam := map[string]interface{}{}
+		err := json.Unmarshal(act.Body(), &reqParam)
+		if err != nil || len(reqParam) == 0 {
+			return false, fmt.Errorf("请求参数异常")
+		}
 		//提交答案
 		answers := gconv.String(reqParam["answers"])
-		return activity.MembershipDay.Questionnaire(userId, phone, answers) == nil, nil
+		err = activity.MembershipDay.Questionnaire(userId, phone, answers)
+		if err != nil {
+			return false, err
+		}
+		return true, nil
 	}()
 	if errMsg != nil {
 		log.Printf("Activity Questionnaire  %s error:%s\n", userId, errMsg.Error())
@@ -185,7 +190,7 @@ func (act *Activity) DoShare() {
 func (act *Activity) GetDailyBoonDetail() {
 	userId := gconv.String(act.GetSession("userId"))
 	rData, errMsg := func() (map[string]interface{}, error) {
-		has, todayBalance, registerBool, _, err := activity.MembershipDay.GetDailyBoonDetail(userId)
+		has, todayBalance, registerBool, err := activity.MembershipDay.GetDailyBoonDetail(userId)
 		if err != nil {
 			return nil, err
 		}

+ 39 - 7
task/ordermonitor.go

@@ -98,11 +98,16 @@ func monitor(ctx context.Context) {
 					"mold":       Mold2,
 					"createdate": date.NowFormat(date.Date_Full_Layout),
 				}
-				if saveWinnerInfo(saveData) {
+				if existWinnerInfo() {
+					logger.Info("当日已存在中奖信息")
 					flag = true
-					logger.Info("中奖信息保存成功:", saveData)
 				} else {
-					logger.Error("中奖信息保存失败:", saveData)
+					if saveWinnerInfo(saveData) {
+						flag = true
+						logger.Info("中奖信息保存成功:", saveData)
+					} else {
+						logger.Error("中奖信息保存失败:", saveData)
+					}
 				}
 			}
 		} else {
@@ -116,11 +121,16 @@ func monitor(ctx context.Context) {
 					"mold":       Mold1,
 					"createdate": date.NowFormat(date.Date_Full_Layout),
 				}
-				if saveWinnerInfo(data) {
+				if existWinnerInfo() {
+					logger.Info("当日已存在中奖信息")
 					flag = true
-					logger.Info("中奖信息保存成功:", data)
 				} else {
-					logger.Error("中奖信息保存失败:", data)
+					if saveWinnerInfo(data) {
+						flag = true
+						logger.Info("中奖信息保存成功:", data)
+					} else {
+						logger.Error("中奖信息保存失败:", data)
+					}
 				}
 			}
 		}
@@ -134,7 +144,25 @@ func monitor(ctx context.Context) {
 
 // 查订单表
 func selectOrder(num int) map[string]interface{} {
-	sql := "SELECT user_phone,user_id,pay_time FROM `dataexport_order` WHERE product_type in ('VIP订阅','大会员','数据流量包') and pay_time !=null and order_status = 1 and is_backstage_order=0 AND TO_DAYS(create_time) = to_days(now()) ORDER BY pay_time   limit ?,1;"
+	sql := `SELECT
+        order_code,
+        user_phone,
+        user_id,
+        pay_time
+FROM
+        dataexport_order
+WHERE order_status = 1 and 
+        product_type IN (
+                "VIP订阅",
+                "大会员",
+                "数据流量包"
+        )
+AND is_backstage_order = 0
+AND TO_DAYS(pay_time) = to_days(now())
+ORDER BY
+        pay_time 
+LIMIT ?,1
+`
 	rs := db.Mysql.SelectBySql(sql, num-1)
 	if rs != nil && len(*rs) == 1 {
 		return (*rs)[0]
@@ -148,3 +176,7 @@ func saveWinnerInfo(data map[string]interface{}) bool {
 	logger.Info("save winner info ")
 	return db.Mysql.Insert(TableWinnerInfo2210, data) > 0
 }
+func existWinnerInfo() bool {
+	logger.Info("save winner info ")
+	return db.Mysql.CountBySql("SELECT count(id) as count FROM jianyu.winner_info_22_10 where TO_DAYS(createdate) = TO_DAYS(NOW());") > 0
+}