Sfoglia il codice sorgente

wip:任务信息存储

wangshan 3 mesi fa
parent
commit
27149fb554
7 ha cambiato i file con 748 aggiunte e 18 eliminazioni
  1. 14 6
      db/db.go
  2. 2 1
      etc/config.yaml
  3. 4 10
      go.mod
  4. 502 1
      go.sum
  5. 163 0
      handler/activity/lotteryDrawTask.go
  6. 2 0
      handler/handler.go
  7. 61 0
      util/timeRange.go

+ 14 - 6
db/db.go

@@ -1,6 +1,9 @@
 package db
 
+import "C"
 import (
+	"app.yhyue.com/moapp/jypkg/middleground"
+	"github.com/gogf/gf/v2/frame/g"
 	"log"
 
 	"app.yhyue.com/moapp/jybase/mysql"
@@ -9,14 +12,17 @@ import (
 
 	"app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/compatible"
 )
 
 var (
-	Mgo_Log   *mongodb.MongodbSim
-	Mgo       *mongodb.MongodbSim
-	Mysql     *mysql.Mysql
-	Tidb      *mysql.Mysql
-	TidbPoint *mysql.Mysql
+	Mgo_Log      *mongodb.MongodbSim
+	Mgo          *mongodb.MongodbSim
+	Mysql        *mysql.Mysql
+	Tidb         *mysql.Mysql
+	TidbPoint    *mysql.Mysql
+	Compatible   *compatible.Compatible
+	MiddleGround *middleground.Middleground
 )
 
 type MgoConf struct {
@@ -116,5 +122,7 @@ func init() {
 			TidbPoint.Init()
 		}
 	}
-
+	MiddleGround = middleground.NewMiddleground(g.Cfg().MustGet(gctx.New(), "etcd.address").Strings()).
+		RegUserCenter(g.Cfg().MustGet(gctx.New(), "etcd.userCenterKey").String())
+	Compatible = compatible.NewCompatible(Mgo, Tidb, Mysql, MiddleGround)
 }

+ 2 - 1
etc/config.yaml

@@ -17,6 +17,7 @@ etcd:
         key: jydocs.userlib.rpc
     stdlib:
       key: jydocs.stdlib.rpc
+  userCenterKey: "usercenter.rpc" #用户中台rpc
 #消息队列
 nsq:
   topic: jy_event
@@ -171,4 +172,4 @@ NsqLog:
   SPSize: 3            # 数据库并发数据
   BulkSize: 500        # 每批的数量
   TimeAfter: 5000      # 定时保存 毫秒
-  Timeout: 2000       # 缓存通道满时,超时丢弃 毫秒
+  Timeout: 2000       # 缓存通道满时,超时丢弃 毫秒

+ 4 - 10
go.mod

@@ -6,16 +6,10 @@ require (
 	app.yhyue.com/moapp/MessageCenter v0.0.0-20230918064638-5cd2498053ae
 	app.yhyue.com/moapp/jyPoints v1.1.2-0.20231020023521-1a4b1bbf9736
 	app.yhyue.com/moapp/jy_docs v1.1.1
-	app.yhyue.com/moapp/jybase v0.0.0-20231025021840-2f91c944ecdd
+	app.yhyue.com/moapp/jybase v0.0.0-20250219114929-2abd3672b53b
+	app.yhyue.com/moapp/jypkg v1.33.6
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230911091604-2faa31032743
-	github.com/fsnotify/fsnotify v1.6.0 // indirect
-	github.com/gogf/gf/v2 v2.0.6
-	github.com/gomodule/redigo v2.0.0+incompatible // indirect
+	github.com/gogf/gf/v2 v2.7.0
 	github.com/nsqio/go-nsq v1.1.0
-	github.com/zeromicro/go-zero v1.5.6
-	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
-	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
-	golang.org/x/net v0.17.0 // indirect
+	github.com/zeromicro/go-zero v1.6.4
 )

File diff suppressed because it is too large
+ 502 - 1
go.sum


+ 163 - 0
handler/activity/lotteryDrawTask.go

@@ -0,0 +1,163 @@
+package activity
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/go-logger/logger"
+	"app.yhyue.com/moapp/message/db"
+	"app.yhyue.com/moapp/message/model"
+	"app.yhyue.com/moapp/message/util"
+	"encoding/json"
+	"fmt"
+	"time"
+)
+
+const (
+	//表
+	tableTaskInfo     = "jyactivities.lottery_task_info"
+	tableTaskUser     = "jyactivities.lottery_task_user"
+	tableActivityInfo = "jyactivities.activity_info"
+)
+
+// 任务信息
+type TaskInfo struct {
+	Id                int64  `json:"id"`
+	Name              string `json:"name"`
+	ActiveId          int64  `json:"active_id"`     //活动id
+	Qualification     string `json:"qualification"` //获取抽奖资格次数;
+	CycleNum          int    `json:"cycle_num"`     //任务周期(每天/每周/每月/活动周期) 可执行任务次数:n次;-1:不限制
+	CycleUnit         int    `json:"cycle_unit"`    //默认0:当天;;1:当周;2:当月;3:活动周期
+	ActivityStartTime string `json:"start_time"`    //活动开始时间
+	ActivityEndTime   string `json:"end_time"`      //活动结束时间
+}
+
+// 信息主题
+type MsgBody struct {
+	Phone      string
+	UserId     string
+	MgoUserId  string
+	PositionId int64
+	ActiveId   int64
+	TaskInfoId int64
+	OrderCode  string
+}
+
+// LotteryDrawTask 抽奖任务
+func LotteryDrawTask(msg *model.Message) {
+	var msgBody MsgBody
+	if msg.E_body != nil {
+		b, err := json.Marshal(msg.E_body)
+		if err == nil {
+			err = json.Unmarshal(b, &msgBody)
+		}
+		if err != nil {
+			logger.Info(fmt.Sprintf("任务完成参数信息有误:%s", msg.E_userId))
+			return
+		}
+	}
+	//判断用户是否存在
+	data, ok := db.Mgo.FindById("user", msg.E_userId, `{"l_registedate":1,"s_phone":1,"s_m_phone":1}`)
+	if data == nil || len(*data) == 0 || !ok {
+		logger.Info(fmt.Sprintf("未找到用户%s, %v。", msg.E_userId, msgBody.TaskInfoId))
+		return
+	}
+	//任务信息
+	taskInfos := db.Mysql.SelectBySql(fmt.Sprintf("SELECT lti.*,ai.start_time,ai.end_time FROM %s lti LEFT JOIN %s ai ON lti.active_id = ai.id  WHERE lti.active_id  = ? AND  lti.id = ? AND ai.end_time >= NOW() ORDER BY lti.create_date ORDER BY lti.create_date  DESC", tableTaskInfo, tableActivityInfo), msgBody.ActiveId, msgBody.TaskInfoId)
+	if taskInfos == nil || len(*taskInfos) == 0 {
+		logger.Info(fmt.Sprintf("没有当前需要完成的任务信息:%v", msgBody))
+		return
+	}
+	//任务信息
+	var taskInfo TaskInfo
+	b, err := json.Marshal((*taskInfos)[0])
+	if err == nil {
+		err = json.Unmarshal(b, &taskInfo)
+	}
+	if err != nil {
+		logger.Info(fmt.Sprintf("任务信息异常:%v,err:%s", msgBody, err.Error()))
+		return
+	}
+	var (
+		now       = time.Now()
+		timeRange = util.TimeRange{}
+	)
+	//判断任务有效期内,此次任务是否已完成
+	switch taskInfo.CycleUnit {
+	case 1: //当周
+		timeRange = util.GetWeekRange(now)
+	case 2: //当月
+		timeRange = util.GetMonthRange(now)
+	case 3: //活动周期
+		startTime, _ := time.ParseInLocation(date.Date_Full_Layout, taskInfo.ActivityStartTime, time.Local)
+		emdTime, _ := time.ParseInLocation(date.Date_Full_Layout, taskInfo.ActivityEndTime, time.Local)
+		timeRange = util.TimeRange{
+			StartTime: startTime,
+			EndTime:   emdTime,
+			StartUnix: startTime.Unix(),
+			EndUnix:   emdTime.Unix(),
+		}
+	default: //当天
+		timeRange = util.GetDayRange(now)
+	}
+	//当前周期内 是否已完成任务
+	if taskInfo.CycleNum > 0 {
+		if count := db.Mysql.CountBySql(fmt.Sprintf(`SELECT COUNT(ltu.id) FROM  %s ltu  WHERE  ltu.active_id  = ? AND  ltu.task_id = ? AND  ltu.state  = 0 AND  ltu.create_date < ? AND ltu.create_date  > ? `, tableTaskUser), taskInfo.ActiveId, taskInfo.Id, timeRange.EndTime.Format(date.Date_Full_Layout), timeRange.StartTime.Format(date.Date_Full_Layout)); taskInfo.CycleNum <= int(count) {
+			logger.Info(fmt.Sprintf("用户:%s ,此任务:%s ,在 %s 已完成", msgBody.Phone, taskInfo.Name, timeRange.StartTime.Format(date.Date_Short_Layout)))
+			return
+		}
+	}
+	//二次验证
+	switch taskInfo.Id {
+	case 1: //签到赠送剑鱼币任务
+	case 2: //设置关键词任务
+		var hasKeys bool
+		//查看当前用户是否有订阅词
+		res := db.Compatible.Select(msgBody.UserId, `{"o_vipjy":1,"o_member_jy":1,"o_jy":"1"}`)
+		if res != nil && len(*res) > 0 {
+			obj, _ := (*res)["o_jy"].(map[string]interface{})
+			aKey, _ := obj["a_key"].([]interface{})
+			if len(aKey) > 0 {
+				hasKeys = true
+			}
+			if !hasKeys {
+				obj, _ = (*res)["o_vipjy"].(map[string]interface{})
+				if obj == nil {
+					obj, _ = (*res)["o_member_jy"].(map[string]interface{})
+				}
+				if obj != nil {
+					itmes, _ := obj["a_items"].([]interface{})
+					for _, v := range itmes {
+						item, _ := v.(map[string]interface{})
+						keys, _ := item["a_key"].([]interface{})
+						if len(keys) > 0 {
+							hasKeys = true
+							break
+						}
+					}
+				}
+			}
+		}
+		//没有设置关键词
+		if !hasKeys {
+			logger.Info(fmt.Sprintf("当前用户:%s,手机号: %s 没有设置订阅词", msgBody.UserId, msgBody.Phone))
+			return
+		}
+	case 3: //招标采购搜索任务
+	case 4: //购买/续费/升级超级订阅会员
+	case 5: //购买/续费/升级大会员
+	case 6: //给朋友分享活动
+	}
+	if id := db.Mysql.Insert(tableTaskUser, map[string]interface{}{
+		"active_id":   msgBody.ActiveId,
+		"task_id":     msgBody.TaskInfoId,
+		"phone":       msgBody.Phone,
+		"position_id": msgBody.PositionId,
+		"mgo_user_id": msgBody.MgoUserId,
+		"order_code":  msgBody.OrderCode,
+		"state":       0,
+		"end_date":    timeRange.EndTime.Format(date.Date_Full_Layout),
+		"update_date": time.Now().Format(date.Date_Full_Layout),
+		"create_date": time.Now().Format(date.Date_Full_Layout),
+	}); id < 0 {
+		logger.Info(fmt.Sprintf("保存任务记录异常:%v", msgBody))
+	}
+}

+ 2 - 0
handler/handler.go

@@ -33,6 +33,8 @@ var (
 		"jywx_exhibition_active": activity.ExhibitionActive,
 		//任务
 		"task": activity.Task,
+		//抽奖 任务
+		"lottery_draw_task": activity.LotteryDrawTask,
 	}
 )
 

+ 61 - 0
util/timeRange.go

@@ -0,0 +1,61 @@
+package util
+
+import "time"
+
+// TimeRange 定义时间范围结构体
+type TimeRange struct {
+	StartTime time.Time
+	EndTime   time.Time
+	StartUnix int64
+	EndUnix   int64
+}
+
+// GetDayRange 计算当天的时间范围
+func GetDayRange(t time.Time) TimeRange {
+	// 当天开始时间:00:00:00
+	start := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
+	// 当天结束时间:23:59:59
+	end := start.Add(24*time.Hour - time.Second)
+
+	return TimeRange{
+		StartTime: start,
+		EndTime:   end,
+		StartUnix: start.Unix(),
+		EndUnix:   end.Unix(),
+	}
+}
+
+// GetWeekRange 计算当周的时间范围(周一到周日)
+func GetWeekRange(t time.Time) TimeRange {
+	// 计算距离周一的天数
+	weekday := int(t.Weekday())
+	if weekday == 0 {
+		weekday = 7 // 将周日(0)视为一周的最后一天
+	}
+	// 周一的开始时间:周一 00:00:00
+	start := time.Date(t.Year(), t.Month(), t.Day()-weekday+1, 0, 0, 0, 0, t.Location())
+	// 周日的结束时间:周日 23:59:59
+	end := start.Add(7*24*time.Hour - time.Second)
+
+	return TimeRange{
+		StartTime: start,
+		EndTime:   end,
+		StartUnix: start.Unix(),
+		EndUnix:   end.Unix(),
+	}
+}
+
+// GetMonthRange 计算当月的时间范围
+func GetMonthRange(t time.Time) TimeRange {
+	// 当月第一天的开始时间:第一天 00:00:00
+	start := time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location())
+	// 下月第一天减一秒:当月最后一天 23:59:59
+	end := start.AddDate(0, 1, 0).Add(-time.Second)
+
+	return TimeRange{
+		StartTime: start,
+		EndTime:   end,
+		StartUnix: start.Unix(),
+		EndUnix:   end.Unix(),
+	}
+}

Some files were not shown because too many files changed in this diff