go_dreamfactory/modules/pay/modelActivity.go
2023-11-13 17:20:35 +08:00

217 lines
5.7 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) deliverybyid(session comm.IUserSession, id int32) (errdata *pb.ErrorData, items []*pb.UserAssets) {
var (
info *pb.DBActivityGiftbag
item *pb.ActivityGiftbagItem
conf *cfg.GamePayGiftpackData
ok bool
err error
)
if conf, err = this.module.configure.getPayGiftpackeData(id); 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
}
items = make([]*pb.UserAssets, len(conf.Item))
for i, v := range conf.Item {
items[i] = &pb.UserAssets{
A: v.A,
T: v.T,
N: v.N,
}
}
if errdata = this.module.DispenseRes(session, conf.Item, true); errdata != nil {
return
}
go this.module.AsynHandleSession(session.Clone(), func(session comm.IUserSession) {
this.module.WriteUserLog(session.GetUserId(), "deliverybyid", conf.Item)
})
return
}
// 每日礼包发货
func (this *modelActivityComp) delivery(session comm.IUserSession, pid string) (errdata *pb.ErrorData, items []*pb.UserAssets) {
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
}
items = make([]*pb.UserAssets, len(conf.Item))
for i, v := range conf.Item {
items[i] = &pb.UserAssets{
A: v.A,
T: v.T,
N: v.N,
}
}
if errdata = this.module.DispenseRes(session, conf.Item, true); errdata != nil {
return
}
go this.module.AsynHandleSession(session.Clone(), func(session comm.IUserSession) {
this.module.WriteUserLog(session.GetUserId(), "delivery", conf.Item)
})
return
}