lianbingjie 2 жил өмнө
parent
commit
a7add78f59

+ 4 - 0
.gitignore

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

+ 8 - 0
config/config.go

@@ -68,6 +68,14 @@ type pushConfig struct {
 	FullReduce  string `json:"fullReduce"`
 }
 
+type OrderMonitorConfig struct {
+	DateSpecial       string // 特别奖品活动日期
+	OpenCron          string // 每天开启订单查询的任务
+	SelectCron        string // 每5分钟查询一次
+	WinNumberDaily    int    // 每天第xx个付款获得奖品
+	WinNumbersSpecial int    // 第xxx个付款获得特殊奖品
+}
+
 //var Config *config
 
 func init() {

+ 16 - 4
etc/config.yaml

@@ -14,13 +14,13 @@ etcd:
 #消息队列
 nsq:
   topic: jy_event
-  address: 123.56.53.97:4161
+  address: 192.168.3.240:4161
   channel: event
 
 #数据库配置
 databases:
   # redis配置
-  redis: main=127.0.0.1:6379,session=192.168.3.206:1712,newother=192.168.3.206:1712
+  redis: main=192.168.3.206:1712,session=192.168.3.206:1712,newother=192.168.3.206:1712
   # nsq操作日志库
   mogLog:
     address: 192.168.3.206:27090
@@ -74,8 +74,8 @@ jyactivity: # 临时活动
   code: membershipDay
   dateRange: #活动时间
     t1: 2022-05-25 00:00:00 #预热活动
-    t2: 2022-06-25 00:00:00 #活动开始
-    ed: 2022-08-07 00:00:00 #活动结束
+    t2: 2022-10-19 00:00:00 #活动开始
+    ed: 2022-11-12 00:00:00 #活动结束
   missions: #任务列表
     buysubvip: #购买超级订阅
       points: 800
@@ -96,6 +96,10 @@ jyactivity: # 临时活动
     reward:
       svip: 7 #赠送超级订阅限制
       limit: 500 #每日数量限制
+  power: #预热活动参加资格
+    switch: true #开关
+    free: true #是否是免费用户
+    time: 1609430400 #注册时间限制 2021-01-01 00:00:00
 
 #优惠券Rpc查询接口
 lotteryUrl: http://192.168.3.206:8090
@@ -105,3 +109,11 @@ productCode:
   subscriptionMonth: 1012
   subscriptionQuarter: 1013
   subscriptionYear: 1014
+
+# 订单监控
+orderMonitor :
+  dateSpecial: 2022-10-19         # 特殊奖品活动日期 (第111名活动日期)
+  openCron: "0 0 6 * * *"         # 每天6点开启
+  selectCron: "0 */5 6-22 * * *"    # 查询订单的表达式  6点到22点 每五分钟查询一次
+  winNumberDaily: 11       # 每天第xx个付款获得奖品1
+  winNumbersSpecial: 111   # 第xxx个付款获得特殊奖品

+ 10 - 3
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"
 )
 
@@ -30,6 +31,7 @@ type JyActivity struct {
 		SubVip   int `json:"subvip"`
 		Schedule int `json:"schedule"`
 	}
+	DoubleEleven bool //22年双十一活动开关
 }
 
 const (
@@ -49,11 +51,15 @@ const (
 	BidderPlanDailyBoonKey         = "bidderPlanActivity_v1_DailyBoon_%s"       //领取每日限量福利
 	BidderPlanHasDailyBoonKey      = "bidderPlanActivity_v1_HasDailyBoon_%s"    //是否领取过每日限量福利
 
-	BidderPlanShare = "bidderPlanActivity_v1_ShareOk_%s" //是否分享
-
+	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{
@@ -71,6 +77,7 @@ func init() {
 	if loadScheduleErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.scheduleReward").Scan(&MembershipDay.ScheduleReward); loadScheduleErr != nil {
 		logger.Error(fmt.Sprintf("JyBidderPlan 加载进度异常 %v", loadScheduleErr))
 	}
+	MembershipDay.DoubleEleven = gcfg.Instance().MustGet(gctx.New(), "jyactivity.power.switch", false).Bool()
 }
 
 // InActivity 是否在活动时间内

+ 89 - 4
handler/activity/jyActivityOther.go

@@ -4,12 +4,64 @@ 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{} {
+	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 {
+		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 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 存储异常")
+	}
+	return nil
+}
+
 // ShareFinish 分享完成
 func (BP *JyActivity) ShareFinish(userId string) error {
 	if _, inActivity, _ := BP.InActivity(); !inActivity {
@@ -24,8 +76,9 @@ func (BP *JyActivity) ShareFinish(userId string) error {
 // GetDailyBoonDetail 查询领取情况及剩余
 // has 是否已经领取
 // todayBalance 今日余额
+// 允许参加预热活动 用户注册时间限制
 // err 异常
-func (BP *JyActivity) GetDailyBoonDetail(userId string) (has bool, todayBalance int, 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
@@ -33,12 +86,25 @@ 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
 	}
+	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()
+		//注册时间是否在允许范围内
+		userInfo := GetUserInfoRedisCache(userId)
+		registerBool = userInfo != nil && registerTime <= userInfo.Registedate
+	}
 	return
 }
 
@@ -58,8 +124,12 @@ func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
 		err = fmt.Errorf("活动没有开始")
 		return
 	}
-
-	has, todayBalance, err = BP.GetDailyBoonDetail(userId)
+	qs := redis.GetStr(BidderPlanRedis, fmt.Sprintf(QuestionnaireSubmit, userId))
+	if MembershipDay.DoubleEleven && qs == "" {
+		err = fmt.Errorf("未提交问卷")
+		return
+	}
+	has, todayBalance, _, err = BP.GetDailyBoonDetail(userId)
 	if err != nil {
 		return
 	}
@@ -74,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("稍后重试")
@@ -102,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)
+}

+ 82 - 0
handler/award/user.go

@@ -0,0 +1,82 @@
+package award
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/message/db"
+	"strings"
+	"time"
+)
+
+//用户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 &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(),
+		"s_userid":  userId,
+		"s_phone":   phone,
+		"s_answers": strings.Split(answers, ","),
+	})
+	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 {
+		data := (*todayData)[0]
+		phone := common.ObjToString(data["phone"])
+		if phone != "" && len([]rune(phone)) == 11 {
+			data["phone"] = string(phone[0:3]) + "****" + string(phone[(len(phone)-4):])
+		}
+		switch common.ObjToString(data["mold"]) {
+		case "1":
+			data["mold"] = "获得小米智能音箱"
+		case "2":
+			data["mold"] = "获得iPad1台"
+		}
+		return data
+	}
+	return nil
+}

+ 0 - 33
logs/message.log

@@ -1,33 +0,0 @@
-2021/10/19 13:53:14 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634622794 E_app:jyapp_node1 E_body:map[]}
-2021/10/19 15:47:02 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634629622 E_app:jyapp_node1 E_body:map[]}
-2021/10/19 15:49:31 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634629766 E_app:jyapp_node1 E_body:map[]}
-2021/10/19 15:54:46 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634630078 E_app:jyapp_node1 E_body:map[]}
-2021/10/19 16:11:02 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634631059 E_app:jywx_node E_body:map[]}
-2021/10/19 16:11:02 points.go:132: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634631059 E_app:jywx_node E_body:map[]} 已成功增加 5 积分
-2021/10/19 16:15:41 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634631341 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:18:14 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634631492 E_app:jywx_node E_body:map[]}
-2021/10/19 16:18:15 points.go:132: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634631492 E_app:jywx_node E_body:map[]} 已成功增加 5 积分
-2021/10/19 16:26:38 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634631995 E_app:jywx_node E_body:map[]}
-2021/10/19 16:26:38 points.go:132: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634631995 E_app:jywx_node E_body:map[]} 已成功增加 5 积分
-2021/10/19 16:34:22 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632460 E_app:jywx_node E_body:map[]}
-2021/10/19 16:34:22 points.go:111: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632460 E_app:jywx_node E_body:map[]} 超过一天最大次数 5 限制,不再增加积分
-2021/10/19 16:35:49 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632549 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:36:19 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632579 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:37:20 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632638 E_app:jywx_node E_body:map[]}
-2021/10/19 16:37:20 points.go:111: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632638 E_app:jywx_node E_body:map[]} 超过一天最大次数 5 限制,不再增加积分
-2021/10/19 16:38:39 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632716 E_app:jywx_node E_body:map[]}
-2021/10/19 16:38:39 points.go:111: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632716 E_app:jywx_node E_body:map[]} 超过一天最大次数 5 限制,不再增加积分
-2021/10/19 16:40:06 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632803 E_app:jywx_node E_body:map[]}
-2021/10/19 16:40:06 points.go:111: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634632803 E_app:jywx_node E_body:map[]} 超过一天最大次数 5 限制,不再增加积分
-2021/10/19 16:42:28 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632948 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:42:33 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632953 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:42:34 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632954 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:42:35 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632955 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:42:37 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632957 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:42:39 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634632959 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 16:53:32 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634633609 E_app:jywx_node E_body:map[]}
-2021/10/19 16:53:32 points.go:111: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634633609 E_app:jywx_node E_body:map[]} 超过一天最大次数 5 限制,不再增加积分
-2021/10/19 16:54:13 points.go:55: info  接收到消息 &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634633650 E_app:jywx_node E_body:map[]}
-2021/10/19 16:54:13 points.go:111: info  &{E_code:jyweb_article_open E_userId:5d6378301c298a5aac7b5402 E_time:1634633650 E_app:jywx_node E_body:map[]} 超过一天最大次数 5 限制,不再增加积分
-2021/10/19 17:02:05 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634634125 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}
-2021/10/19 17:02:05 points.go:55: info  接收到消息 &{E_code:jywx_activity_message E_userId:6103bb722abfa5f4d81bb1d1 E_time:1634634125 E_app:jyapp_node1 E_body:map[buy_time:2021-10-19 22:22:22 end_time:2021-11-19 23:59:59 order_code:1234567890 phone:18624906090 product_type:超级订阅一个月]}

+ 2 - 0
main.go

@@ -6,6 +6,7 @@ import (
 	_ "app.yhyue.com/moapp/message/config"
 	"app.yhyue.com/moapp/message/handler"
 	_ "app.yhyue.com/moapp/message/services"
+	"app.yhyue.com/moapp/message/task"
 	"github.com/gogf/gf/v2/os/gcfg"
 	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/nsqio/go-nsq"
@@ -43,6 +44,7 @@ func nsqWork() {
 //
 func main() {
 	go nsqWork()
+	go task.SelectOrderTask()
 	mux1 := http.NewServeMux()
 	xweb.RunBase(gcfg.Instance().MustGet(gctx.New(), "webport", "").String(), mux1)
 }

+ 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,

+ 65 - 6
services/activity/bidderPlan/services.go

@@ -25,6 +25,51 @@ type Activity struct {
 	//活动领券
 	lotteryList xweb.Mapper `xweb:"/membershipDay/lotteryList"` //活动券列表
 	getLottery  xweb.Mapper `xweb:"/membershipDay/getLottery"`  //领取优惠券
+	//22双十一活动
+	questionnaire xweb.Mapper `xweb:"/membershipDay/questionnaire"` //预热活动问卷
+	winnerInfo    xweb.Mapper `xweb:"/membershipDay/winnerInfo"`    //当日中奖人信息
+
+}
+
+// WinnerInfo 当日中奖信息
+func (act *Activity) WinnerInfo() {
+	userId := gconv.String(act.GetSession("userId"))
+	rData, errMsg := func() (map[string]interface{}, error) {
+		return activity.MembershipDay.WinnerInfo(), nil
+	}()
+	if errMsg != nil {
+		log.Printf("Activity WinnerInfo  %s error:%s\n", userId, errMsg.Error())
+	}
+	act.ServeJson(NewResult(rData, errMsg))
+}
+
+// 预热活动 问卷提交
+// url:/jyActivity/membershipDay/questionnaire
+func (act *Activity) Questionnaire() {
+	userId := gconv.String(act.GetSession("userId"))
+	phone := gconv.String(act.Session().Get("phone"))
+	rData, errMsg := func() (bool, error) {
+		//连点处理
+		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"])
+		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())
+	}
+	act.ServeJson(NewResult(rData, errMsg))
 }
 
 // Period 活动周期
@@ -32,11 +77,24 @@ type Activity struct {
 func (act *Activity) Period() {
 	userId := gconv.String(act.GetSession("userId"))
 	rData, errMsg := func() (map[string]interface{}, error) {
+
+		reqParam := map[string]interface{}{}
+		json.Unmarshal(act.Body(), &reqParam)
+		//先满足双十一活动
+		if from := gconv.String(reqParam["from"]); from == "doubleEleven" && activity.MembershipDay.DoubleEleven {
+			return map[string]interface{}{
+				"before": activity.MembershipDay.T1.Unix(),  //预热开始时间
+				"clock":  activity.MembershipDay.DailyClock, //预热活动每天开抢时间
+				"start":  activity.MembershipDay.T2.Unix(),  //活动开始
+				"end":    activity.MembershipDay.Ed.Unix(),  //活动结束
+				"now":    time.Now().Unix(),                 //服务器当前时间戳
+			}, nil
+		}
 		return map[string]interface{}{
-			"before": activity.MembershipDay.T1.Unix(),  //预热开始时间
+			"before": 1651420799,                        //预热开始时间
 			"clock":  activity.MembershipDay.DailyClock, //预热活动每天开抢时间
-			"start":  activity.MembershipDay.T2.Unix(),  //活动开始
-			"end":    activity.MembershipDay.Ed.Unix(),  //活动结束
+			"start":  1651420799,                        //活动开始
+			"end":    1651420799,                        //活动结束
 			"now":    time.Now().Unix(),                 //服务器当前时间戳
 		}, nil
 	}()
@@ -132,13 +190,14 @@ func (act *Activity) DoShare() {
 func (act *Activity) GetDailyBoonDetail() {
 	userId := gconv.String(act.GetSession("userId"))
 	rData, errMsg := func() (map[string]interface{}, error) {
-		has, todayBalance, err := activity.MembershipDay.GetDailyBoonDetail(userId)
+		has, todayBalance, registerBool, err := activity.MembershipDay.GetDailyBoonDetail(userId)
 		if err != nil {
 			return nil, err
 		}
 		return map[string]interface{}{
-			"got":   has,
-			"total": todayBalance,
+			"got":          has,
+			"total":        todayBalance,
+			"registerBool": registerBool, //是否是活动允许内的注册用户
 		}, nil
 	}()
 	if errMsg != nil {

+ 182 - 0
task/ordermonitor.go

@@ -0,0 +1,182 @@
+package task
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/go-logger/logger"
+	"app.yhyue.com/moapp/message/config"
+	"app.yhyue.com/moapp/message/db"
+	"app.yhyue.com/moapp/message/handler/activity"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/os/gcfg"
+	"github.com/gogf/gf/v2/os/gcron"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/gogf/gf/v2/os/gtime"
+	"time"
+)
+
+const (
+	TableWinnerInfo2210 = "winner_info_22_10"
+	Mold1               = "1" // 中奖类型 1:小米智能音响
+	Mold2               = "2" // 中奖类型 2:ipad
+
+)
+
+var (
+	flag          = false // 是否已经查询到
+	monitorConfig config.OrderMonitorConfig
+)
+
+func init() {
+	// 获取配置信息
+	monitorConfig = config.OrderMonitorConfig{
+		DateSpecial:       date.FormatDate(&gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "orderMonitor.dateSpecial").String(), "2006-01-02T15:04:05Z").Time, date.Date_Short_Layout),
+		OpenCron:          gcfg.Instance().MustGet(gctx.New(), "orderMonitor.openCron").String(),
+		SelectCron:        gcfg.Instance().MustGet(gctx.New(), "orderMonitor.selectCron").String(),
+		WinNumberDaily:    gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumberDaily").Int(),
+		WinNumbersSpecial: gcfg.Instance().MustGet(gctx.New(), "orderMonitor.winNumbersSpecial").Int(),
+	}
+}
+
+// SelectOrderTask 订单监控
+func SelectOrderTask() {
+	// 活动已结束 不再启动定时任务
+	if time.Now().After(activity.MembershipDay.Ed) {
+		return
+	}
+	var (
+		err error
+		ctx = gctx.New()
+	)
+	// 订单查询任务
+	_, err = gcron.Add(ctx, monitorConfig.SelectCron, monitor, "selectJob")
+	if err != nil {
+		logger.Error("定时任务selectJob添加失败", err)
+	}
+
+	if time.Now().Before(activity.MembershipDay.T2) { // 活动未开始
+		gcron.Stop("selectJob") // 停掉订单查询任务  等后边的定时任务开启
+		logger.Info("selectJob stop")
+	}
+	// 开启定时任务
+	_, err = gcron.Add(ctx, monitorConfig.OpenCron, func(ctx context.Context) {
+		now := time.Now()
+		if now.After(activity.MembershipDay.Ed) { // 活动已结束 移除掉任务
+			logger.Info("活动结束,移除任务")
+			gcron.Remove("openCronJob")
+			gcron.Remove("selectJob")
+		}
+		// 活动时间范围内 开启订单查询的定时任务
+		_, inTime, _ := activity.MembershipDay.InActivity()
+		if inTime {
+			flag = false // 重置
+			gcron.Start("selectJob")
+			logger.Info("开启 selectJob 任务")
+		}
+	}, "openCronJob")
+	if err != nil {
+		logger.Error("定时任务openCronJob失败", err)
+	}
+	logger.Info("openCronJob 启动成功")
+}
+
+//  订单监控
+func monitor(ctx context.Context) {
+	logger.Info("开始本轮订单查询")
+	_, inTime, _ := activity.MembershipDay.InActivity()
+	if inTime {
+		// 如果需要查第111个  日期范围内  特殊日期
+		if date.NowFormat(date.Date_Short_Layout) == monitorConfig.DateSpecial {
+			logger.Info(fmt.Sprintf("开始查询第%v个人员", monitorConfig.WinNumbersSpecial))
+			rs111 := selectOrder(monitorConfig.WinNumbersSpecial)
+			if rs111 != nil {
+				logger.Info(fmt.Sprintf("查询到第%v个人员", monitorConfig.WinNumbersSpecial))
+				saveData := map[string]interface{}{
+					"phone":      rs111["user_phone"],
+					"userid":     rs111["user_id"],
+					"winnerdate": rs111["pay_time"],
+					"mold":       Mold2,
+					"createdate": date.NowFormat(date.Date_Full_Layout),
+				}
+				if existWinnerInfo() {
+					logger.Info("当日已存在中奖信息")
+					flag = true
+				} else {
+					if saveWinnerInfo(saveData) {
+						flag = true
+						logger.Info("中奖信息保存成功:", saveData)
+					} else {
+						logger.Error("中奖信息保存失败:", saveData)
+					}
+				}
+			}
+		} else {
+			rs := selectOrder(monitorConfig.WinNumberDaily)
+			if rs != nil { // 查到了
+				logger.Info(fmt.Sprintf("查询到第%d个人员", monitorConfig.WinNumberDaily))
+				data := map[string]interface{}{
+					"phone":      rs["user_phone"],
+					"userid":     rs["user_id"],
+					"winnerdate": rs["pay_time"],
+					"mold":       Mold1,
+					"createdate": date.NowFormat(date.Date_Full_Layout),
+				}
+				if existWinnerInfo() {
+					logger.Info("当日已存在中奖信息")
+					flag = true
+				} else {
+					if saveWinnerInfo(data) {
+						flag = true
+						logger.Info("中奖信息保存成功:", data)
+					} else {
+						logger.Error("中奖信息保存失败:", data)
+					}
+				}
+			}
+		}
+		if flag {
+			logger.Info("今日已查询到 暂停任务")
+			gcron.Stop("selectJob")
+			logger.Info("selectJob stop")
+		}
+	}
+}
+
+// 查订单表
+func selectOrder(num int) map[string]interface{} {
+	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]
+	}
+	logger.Info("未查到", rs)
+	return nil
+}
+
+// 保存中奖人员信息
+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
+}