142 lines
3.9 KiB
Go
142 lines
3.9 KiB
Go
package pay
|
|
|
|
import (
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/lego/sys/mgo"
|
|
"go_dreamfactory/modules"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/sys/configure"
|
|
cfg "go_dreamfactory/sys/configure/structs"
|
|
"sync"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/x/bsonx"
|
|
)
|
|
|
|
// 活动礼包
|
|
type modelActivityComp struct {
|
|
modules.MCompModel
|
|
module *Pay
|
|
lock sync.RWMutex
|
|
opentime map[int32]*pb.DBHuodong
|
|
}
|
|
|
|
// 组件初始化接口
|
|
func (this *modelActivityComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) {
|
|
this.MCompModel.Init(service, module, comp, opt)
|
|
this.module = module.(*Pay)
|
|
this.TableName = comm.TableActivityGiftbag
|
|
//创建uid索引
|
|
this.lock.Lock()
|
|
this.opentime = make(map[int32]*pb.DBHuodong)
|
|
this.lock.Unlock()
|
|
this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{
|
|
Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}},
|
|
})
|
|
return
|
|
}
|
|
func (this *modelActivityComp) getopentime(wtype int32) (activity *pb.DBHuodong, open bool) {
|
|
this.lock.RLock()
|
|
activity, open = this.opentime[wtype]
|
|
this.lock.RUnlock()
|
|
return
|
|
}
|
|
|
|
func (this *modelActivityComp) setopentime(wtype int32, activity *pb.DBHuodong) {
|
|
this.lock.RLock()
|
|
this.opentime[wtype] = activity
|
|
this.lock.RUnlock()
|
|
return
|
|
}
|
|
|
|
// 获取用户全部的埋点数据
|
|
func (this *modelActivityComp) getUserActivitys(uid string) (results *pb.DBActivityGiftbag, err error) {
|
|
results = &pb.DBActivityGiftbag{}
|
|
if err = this.Get(uid, results); err != nil && err != mgo.MongodbNil {
|
|
this.module.Errorln(err)
|
|
return
|
|
}
|
|
if err == mgo.MongodbNil {
|
|
err = nil
|
|
results = &pb.DBActivityGiftbag{
|
|
Id: primitive.NewObjectID().Hex(),
|
|
Uid: uid,
|
|
Activitys: make(map[int32]*pb.ActivityGiftbagItem),
|
|
}
|
|
err = this.Add(uid, results)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *modelActivityComp) updateActivitys(uid string, data *pb.DBActivityGiftbag) (err error) {
|
|
if err = this.Change(uid, map[string]interface{}{
|
|
"activitys": data.Activitys,
|
|
}); err != nil {
|
|
this.module.Error("更新用户活动礼包数据 错误!", log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 每日礼包发货
|
|
func (this *modelActivityComp) delivery(session comm.IUserSession, pid int32) (errdata *pb.ErrorData, items []*pb.UserAtno) {
|
|
var (
|
|
info *pb.DBActivityGiftbag
|
|
item *pb.ActivityGiftbagItem
|
|
conf *cfg.GamePayGiftpackData
|
|
ok bool
|
|
err error
|
|
)
|
|
if conf, err = this.module.configure.getPayGiftpackDataByPid(pid); err != nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_ConfigNoFound,
|
|
Title: pb.ErrorCode_ConfigNoFound.ToString(),
|
|
Message: err.Error(),
|
|
}
|
|
return
|
|
}
|
|
if info, err = this.getUserActivitys(session.GetUserId()); err != nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_DBError,
|
|
Title: pb.ErrorCode_DBError.ToString(),
|
|
Message: err.Error(),
|
|
}
|
|
return
|
|
}
|
|
if item, ok = info.Activitys[conf.Type]; !ok {
|
|
item = &pb.ActivityGiftbagItem{
|
|
Opentime: 0,
|
|
Items: make(map[int32]*pb.PayActivityGiftbagItem),
|
|
}
|
|
info.Activitys[conf.Type] = item
|
|
}
|
|
|
|
if _, ok = item.Items[conf.Id]; !ok {
|
|
item.Items[conf.Id] = &pb.PayActivityGiftbagItem{
|
|
Id: conf.Id,
|
|
Lastrefresh: configure.Now().Unix(),
|
|
}
|
|
}
|
|
item.Items[conf.Id].Buyunm++
|
|
item.Items[conf.Id].Totalbuynum++
|
|
if err = this.updateActivitys(session.GetUserId(), info); err != nil {
|
|
errdata = &pb.ErrorData{
|
|
Code: pb.ErrorCode_DBError,
|
|
Title: pb.ErrorCode_DBError.ToString(),
|
|
Message: err.Error(),
|
|
}
|
|
return
|
|
}
|
|
|
|
if errdata, items = this.module.DispenseAtno(session, conf.Item, true); errdata != nil {
|
|
return
|
|
}
|
|
go this.module.AsynHandleSession(session.Clone(), func(session comm.IUserSession) {
|
|
this.module.WriteUserLog(session.GetUserId(), pid, comm.GMResAddType, "delivery", conf.Item)
|
|
})
|
|
return
|
|
}
|