上传代码
This commit is contained in:
parent
8ca83cb6ab
commit
cdf146f287
@ -11,6 +11,9 @@ type (
|
||||
}
|
||||
//背包模块对外接口定义 提供给其他模块使用的
|
||||
IPack interface {
|
||||
//查询用户背包物品数量
|
||||
QueryUserPackItemAmount(uId string, itemid int32) (amount uint32)
|
||||
///添加单个物品到背包 (可以加物品和减物品)
|
||||
AddItemToUserPack(uId string, itemid, addnum int32) (err error)
|
||||
///添加多个物品到背包 (可以加物品和减物品)
|
||||
AddItemsToUserPack(uId string, items map[int32]int32) (err error)
|
||||
|
288
modules/pack/cache_comp.go
Normal file
288
modules/pack/cache_comp.go
Normal file
@ -0,0 +1,288 @@
|
||||
package pack
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go_dreamfactory/lego/core/cbase"
|
||||
"go_dreamfactory/lego/sys/mgo"
|
||||
"go_dreamfactory/lego/sys/redis"
|
||||
"go_dreamfactory/pb"
|
||||
"go_dreamfactory/sys/db"
|
||||
)
|
||||
|
||||
///背包缓存数据管理组件
|
||||
type Cache_Comp struct {
|
||||
cbase.ModuleCompBase
|
||||
redis redis.ISys
|
||||
}
|
||||
|
||||
///查询用户背包数据
|
||||
func (this *Cache_Comp) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error) {
|
||||
pack = &pb.DB_UserPackData{
|
||||
UserId: uId,
|
||||
}
|
||||
if err = this.redis.Get(fmt.Sprintf(Redis_PackCache, uId), pack); err == nil {
|
||||
return
|
||||
} else if err == redis.RedisNil {
|
||||
if pack, err = db.Defsys.Pack_QueryUserPack(uId); err == nil {
|
||||
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
||||
} else if err == mgo.MongodbNil {
|
||||
err = nil
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//查询用户背包物品数量
|
||||
func (this *Cache_Comp) Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
err error
|
||||
)
|
||||
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range pack.Pack {
|
||||
if !v.IsEmpty && v.ItemId == itemid {
|
||||
amount += v.Amount
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///添加或则减少物品到用户背包
|
||||
func (this *Cache_Comp) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
modifys []*pb.DB_GridData
|
||||
leftnum int64
|
||||
)
|
||||
if addnum == 0 {
|
||||
return
|
||||
}
|
||||
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
||||
return
|
||||
}
|
||||
modifys, leftnum = this.pack_addItemToUserPack(pack, itemId, addnum)
|
||||
if leftnum < 0 {
|
||||
err = ItemNotEnoughError
|
||||
return
|
||||
} else if leftnum > 0 {
|
||||
err = PackGridNumUpper
|
||||
return
|
||||
}
|
||||
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil {
|
||||
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///添加或则减少多个物品到用户背包
|
||||
func (this *Cache_Comp) Pack_AddItemsToUserPack(uId string, items map[int32]int32) (err error) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
modifys []*pb.DB_GridData
|
||||
tempmodifys []*pb.DB_GridData
|
||||
leftnum int64
|
||||
iskeep bool
|
||||
)
|
||||
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
||||
return
|
||||
}
|
||||
for k, v := range items {
|
||||
tempmodifys, leftnum = this.pack_addItemToUserPack(pack, k, v)
|
||||
if leftnum < 0 {
|
||||
err = ItemNotEnoughError
|
||||
return
|
||||
} else if leftnum > 0 {
|
||||
err = PackGridNumUpper
|
||||
return
|
||||
}
|
||||
for _, v1 := range tempmodifys {
|
||||
iskeep = false
|
||||
for _, v2 := range modifys {
|
||||
if v1.GridId == v2.GridId {
|
||||
iskeep = true
|
||||
}
|
||||
}
|
||||
if !iskeep {
|
||||
modifys = append(modifys, v1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, modifys...); err == nil {
|
||||
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///修改指定格子的物品数量
|
||||
func (this *Cache_Comp) Pack_AddItemToUserPackByGrid(uId string, gridid int32, itemId int32, addnum int32) (err error) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
grid *pb.DB_GridData
|
||||
num int64
|
||||
amount int64
|
||||
)
|
||||
if addnum == 0 {
|
||||
return
|
||||
}
|
||||
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
||||
return
|
||||
}
|
||||
if int32(len(pack.Pack)) <= gridid {
|
||||
err = NoFoundGirdError
|
||||
return
|
||||
}
|
||||
grid = pack.Pack[gridid]
|
||||
if grid == nil {
|
||||
err = NoFoundGirdError
|
||||
return
|
||||
}
|
||||
amount = int64(grid.Amount)
|
||||
if grid.IsEmpty {
|
||||
amount = 0
|
||||
} else if grid.ItemId != itemId {
|
||||
err = fmt.Errorf("target grid itemid:%d no is %d ", grid.ItemId, itemId)
|
||||
}
|
||||
num = amount + int64(addnum)
|
||||
if num < 0 {
|
||||
err = ItemNotEnoughError
|
||||
} else {
|
||||
if num > GridCapMaxNum {
|
||||
err = GirdAmountUpper
|
||||
return
|
||||
} else {
|
||||
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grid); err == nil {
|
||||
this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///修改目标格子的新获取标识
|
||||
func (this *Cache_Comp) Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (err error) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
)
|
||||
if pack, err = db.Defsys.Pack_ModifyPackGridIsNewItem(uId, grids); err == nil {
|
||||
err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///修改目标格子的新获取标识
|
||||
func (this *Cache_Comp) Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (err error) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
)
|
||||
if pack, err = db.Defsys.Pack_UpdateGridToUserPack(uId, grids...); err == nil {
|
||||
err = this.redis.Set(fmt.Sprintf(Redis_PackCache, uId), pack, Pack_Expiration)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///添加移除物品到用户背包
|
||||
func (this *Cache_Comp) pack_addItemToUserPack(pack *pb.DB_UserPackData, itemId int32, addnum int32) (modifys []*pb.DB_GridData, leftnum int64) {
|
||||
var (
|
||||
num int64
|
||||
isNew bool
|
||||
)
|
||||
if addnum == 0 {
|
||||
return
|
||||
}
|
||||
isNew = true
|
||||
leftnum = int64(addnum)
|
||||
modifys = make([]*pb.DB_GridData, 0)
|
||||
for _, v := range pack.Pack {
|
||||
if !v.IsEmpty && v.ItemId == itemId {
|
||||
isNew = false
|
||||
num = int64(v.Amount) + int64(leftnum)
|
||||
if num < 0 {
|
||||
leftnum += int64(v.Amount)
|
||||
v.Amount = 0
|
||||
v.IsEmpty = true
|
||||
modifys = append(modifys, v)
|
||||
} else if num > 0 && num < int64(v.Amount) {
|
||||
leftnum = 0
|
||||
v.Amount = uint32(num)
|
||||
modifys = append(modifys, v)
|
||||
break
|
||||
} else if num > 0 && num > int64(v.Amount) {
|
||||
if num <= GridCapMaxNum {
|
||||
leftnum = 0
|
||||
v.Amount = uint32(num)
|
||||
modifys = append(modifys, v)
|
||||
break
|
||||
} else {
|
||||
if v.Amount < GridCapMaxNum {
|
||||
leftnum = int64(num - GridCapMaxNum)
|
||||
v.Amount = uint32(GridCapMaxNum)
|
||||
modifys = append(modifys, v)
|
||||
}
|
||||
}
|
||||
} else if num == 0 {
|
||||
leftnum = 0
|
||||
v.Amount = 0
|
||||
v.IsEmpty = true
|
||||
modifys = append(modifys, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
if leftnum < 0 { //背包物品不够
|
||||
return
|
||||
}
|
||||
if leftnum > 0 { //还没有放完 寻找空的格子填充
|
||||
for _, v := range pack.Pack {
|
||||
if v.IsEmpty {
|
||||
if leftnum <= GridCapMaxNum {
|
||||
v.IsEmpty = false
|
||||
v.ItemId = itemId
|
||||
v.Amount = uint32(leftnum)
|
||||
leftnum = 0
|
||||
modifys = append(modifys, v)
|
||||
break
|
||||
} else {
|
||||
leftnum -= GridCapMaxNum
|
||||
v.IsEmpty = false
|
||||
v.ItemId = itemId
|
||||
v.Amount = uint32(GridCapMaxNum)
|
||||
modifys = append(modifys, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
index := int32(len(pack.Pack))
|
||||
for leftnum > 0 { //需要补充格子
|
||||
if leftnum <= GridCapMaxNum {
|
||||
grid := &pb.DB_GridData{
|
||||
GridId: index,
|
||||
IsEmpty: false,
|
||||
ItemId: itemId,
|
||||
Amount: uint32(leftnum),
|
||||
IsNewItem: isNew,
|
||||
}
|
||||
pack.Pack = append(pack.Pack, grid)
|
||||
modifys = append(modifys, grid)
|
||||
leftnum = 0
|
||||
break
|
||||
} else {
|
||||
leftnum -= GridCapMaxNum
|
||||
grid := &pb.DB_GridData{
|
||||
GridId: index,
|
||||
IsEmpty: false,
|
||||
ItemId: itemId,
|
||||
Amount: uint32(GridCapMaxNum),
|
||||
IsNewItem: isNew,
|
||||
}
|
||||
pack.Pack = append(pack.Pack, grid)
|
||||
modifys = append(modifys, grid)
|
||||
index++
|
||||
}
|
||||
if index > GridMaxNUm { //格子已达上限
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
@ -1,11 +1,24 @@
|
||||
package pack
|
||||
|
||||
import "go_dreamfactory/modules"
|
||||
|
||||
type (
|
||||
IPack interface {
|
||||
modules.IModule
|
||||
}
|
||||
IConfigure_Comp interface {
|
||||
}
|
||||
import (
|
||||
"errors"
|
||||
"go_dreamfactory/lego/core"
|
||||
)
|
||||
|
||||
const ( //Redis
|
||||
Redis_PackCache string = "pack:%s" //背包缓存数据存放key
|
||||
DB_PackTable core.SqlTable = "pack" //背包数据库定义表
|
||||
)
|
||||
|
||||
const (
|
||||
GridCapMaxNum = 99 //单个格子的最大容量
|
||||
GridMaxNUm = 200 //背包格子数量上限
|
||||
Pack_Expiration = -1 //背包缓存数据过期时间
|
||||
)
|
||||
|
||||
var (
|
||||
ItemNotEnoughError = errors.New("item not enough!") //物品不足
|
||||
NoFoundGirdError = errors.New("no found gvrid!") //未找到格子
|
||||
PackGridNumUpper = errors.New("grid amount upper!") //背包格子达到上限
|
||||
GirdAmountUpper = errors.New("grid amount upper!") //格子容量达到上限
|
||||
)
|
||||
|
73
modules/pack/db_comp.go
Normal file
73
modules/pack/db_comp.go
Normal file
@ -0,0 +1,73 @@
|
||||
package pack
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go_dreamfactory/lego/core/cbase"
|
||||
"go_dreamfactory/lego/sys/mgo"
|
||||
"go_dreamfactory/pb"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
///背包数据库数据管理组件
|
||||
type DB_Comp struct {
|
||||
cbase.ModuleCompBase
|
||||
mgo mgo.ISys
|
||||
}
|
||||
|
||||
func (this *DB_Comp) Pack_InitUserPack(uId string) (pack *pb.DB_UserPackData, err error) {
|
||||
pack = &pb.DB_UserPackData{UserId: uId, Pack: make([]*pb.DB_GridData, 0)}
|
||||
_, err = this.mgo.InsertOne(DB_PackTable, pack)
|
||||
return
|
||||
}
|
||||
|
||||
///查询用户背包数据
|
||||
func (this *DB_Comp) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error) {
|
||||
pack = &pb.DB_UserPackData{}
|
||||
err = this.mgo.FindOne(DB_PackTable, bson.M{"_id": uId}).Decode(pack)
|
||||
return
|
||||
}
|
||||
|
||||
//更新背包格子数据
|
||||
func (this *DB_Comp) Pack_UpdateGridToUserPack(uId string, grids ...*pb.DB_GridData) (pack *pb.DB_UserPackData, err error) {
|
||||
pack = &pb.DB_UserPackData{}
|
||||
update := bson.M{}
|
||||
for _, v := range grids {
|
||||
update[fmt.Sprintf("pack.%d.gridid", v.GridId)] = v.GridId
|
||||
update[fmt.Sprintf("pack.%d.isempty", v.GridId)] = v.IsEmpty
|
||||
update[fmt.Sprintf("pack.%d.itemid", v.GridId)] = v.ItemId
|
||||
update[fmt.Sprintf("pack.%d.amount", v.GridId)] = v.Amount
|
||||
update[fmt.Sprintf("pack.%d.isnewitem", v.GridId)] = v.IsNewItem
|
||||
}
|
||||
|
||||
err = this.mgo.FindOneAndUpdate(DB_PackTable,
|
||||
bson.M{"_id": uId},
|
||||
bson.M{"$set": update},
|
||||
options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After)).Decode(pack)
|
||||
return
|
||||
}
|
||||
|
||||
//更新背包格子物品的数据
|
||||
func (this *DB_Comp) Pack_AddGridAmountToUserPack(uId string, grid int32, amount int32) (pack *pb.DB_UserPackData, err error) {
|
||||
pack = &pb.DB_UserPackData{}
|
||||
err = this.mgo.FindOneAndUpdate(DB_PackTable,
|
||||
bson.M{"_id": uId},
|
||||
bson.M{"$inc": bson.M{
|
||||
fmt.Sprintf("pack.%d.amount", grid): amount,
|
||||
}},
|
||||
options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After)).Decode(pack)
|
||||
return
|
||||
}
|
||||
|
||||
//修改背包格子IsNew标识
|
||||
func (this *DB_Comp) Pack_ModifyPackGridIsNewItem(uId string, grids []int32) (pack *pb.DB_UserPackData, err error) {
|
||||
pack = &pb.DB_UserPackData{}
|
||||
identifier := []interface{}{bson.M{"item.gridid": bson.M{"$in": grids}}}
|
||||
err = this.mgo.FindOneAndUpdate(DB_PackTable,
|
||||
bson.M{"_id": uId},
|
||||
bson.M{"$set": bson.M{
|
||||
"pack.$[item].isNewitem": false,
|
||||
}}, options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{Filters: identifier}).SetReturnDocument(options.After)).Decode(pack)
|
||||
return
|
||||
}
|
@ -47,6 +47,13 @@ func (this *Pack) OnInstallComp() {
|
||||
}
|
||||
|
||||
//IPack-------------------------------------------------------------------------------------------------------------------------------
|
||||
///查询用户背包物品数量
|
||||
func (this *Pack) QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) {
|
||||
defer log.Debugf("获取物品 uId:%s itemid:%d addnum:%d ", uId, itemid, amount)
|
||||
amount = cache.Defsys.Pack_QueryUserPackItemAmount(uId, itemid)
|
||||
return
|
||||
}
|
||||
|
||||
///添加单个物品到背包 (可以加物品和减物品)
|
||||
func (this *Pack) AddItemToUserPack(uId string, itemid, addnum int32) (err error) {
|
||||
defer log.Debugf("给用户添加物品 uId:%s itemid:%d addnum:%d issucc:%v", uId, itemid, addnum, err == nil)
|
||||
|
19
sys/cache/pack.go
vendored
19
sys/cache/pack.go
vendored
@ -30,6 +30,8 @@ var (
|
||||
type IPack interface {
|
||||
///查询用户背包
|
||||
Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err error)
|
||||
//查询用户背包物品数量
|
||||
Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32)
|
||||
///添加物品到背包 (可以加物品和减物品)
|
||||
Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error)
|
||||
///添加多个物品到背包 (可以加物品和减物品)
|
||||
@ -57,6 +59,23 @@ func (this *Cache) Pack_QueryUserPack(uId string) (pack *pb.DB_UserPackData, err
|
||||
return
|
||||
}
|
||||
|
||||
//查询用户背包物品数量
|
||||
func (this *Cache) Pack_QueryUserPackItemAmount(uId string, itemid int32) (amount uint32) {
|
||||
var (
|
||||
pack *pb.DB_UserPackData
|
||||
err error
|
||||
)
|
||||
if pack, err = this.Pack_QueryUserPack(uId); err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range pack.Pack {
|
||||
if !v.IsEmpty && v.ItemId == itemid {
|
||||
amount += v.Amount
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
///添加或则减少物品到用户背包
|
||||
func (this *Cache) Pack_AddItemToUserPack(uId string, itemId int32, addnum int32) (err error) {
|
||||
var (
|
||||
|
Loading…
Reference in New Issue
Block a user