From dbaf767b4aabc354e6a2495e92d4dc8926dfa815 Mon Sep 17 00:00:00 2001 From: chenweijian <820961417@qq.com> Date: Fri, 25 Aug 2023 10:43:29 +0800 Subject: [PATCH] group support --- domain/model/group_m/support.go | 28 +-- domain/service/group_s/group_support.go | 247 ++++++++++++++++-------- route/group_r/group_support.go | 20 +- 3 files changed, 199 insertions(+), 96 deletions(-) diff --git a/domain/model/group_m/support.go b/domain/model/group_m/support.go index 089c972..3bfe45a 100644 --- a/domain/model/group_m/support.go +++ b/domain/model/group_m/support.go @@ -102,14 +102,14 @@ func (gsa *GroupSupportAwardMgr) Get(db *gorm.DB) ([]GroupSupportAwardMgr, error } //添加记录 -func AddGroupSupportAward(model *domain.Model, groupUid string, issuerUserId mysql.ID, resGroupSupportId mysql.ID, userIds []mysql.ID, period string) (*GroupSupportAwardAdmin, []GroupSupportAwardMgr, error) { - //资源获取 - resGroupSupport, err := res_m.GetResGroupSupportById(model, resGroupSupportId) - if err != nil { - return nil, nil, err - } - if int(resGroupSupport.MgrNum) < len(userIds) { - return nil, nil, myerr.NewSysErrorF("AddGroupSupportAward mgrNum:%v 同 len(userIds)=%v 不一致", resGroupSupport.MgrNum, len(userIds)) +func AddGroupSupportAward(model *domain.Model, groupUid string, issuerUserId mysql.ID, resSupport *res_m.ResGroupSupport, userIds []mysql.ID, period string) (*GroupSupportAwardAdmin, []GroupSupportAwardMgr, error) { + ////资源获取 + //resGroupSupport, err := res_m.GetResGroupSupportById(model, resGroupSupportId) + //if err != nil { + // return nil, nil, err + //} + if int(resSupport.MgrNum) < len(userIds) { + return nil, nil, myerr.NewSysErrorF("AddGroupSupportAward mgrNum:%v 同 len(userIds)=%v 不一致", resSupport.MgrNum, len(userIds)) } //增加群主奖励 @@ -118,9 +118,9 @@ func AddGroupSupportAward(model *domain.Model, groupUid string, issuerUserId mys GroupUid: groupUid, IssuerUserId: issuerUserId, UserId: issuerUserId, - DiamondNum: resGroupSupport.AdminAward, - Grade: resGroupSupport.Grade, - ResGroupSupportId: resGroupSupport.ID, + DiamondNum: resSupport.AdminAward, + Grade: resSupport.Grade, + ResGroupSupportId: resSupport.ID, Period: period, } @@ -133,9 +133,9 @@ func AddGroupSupportAward(model *domain.Model, groupUid string, issuerUserId mys GroupUid: groupUid, IssuerUserId: issuerUserId, UserId: userIds[i], - DiamondNum: resGroupSupport.MgrAward, - Grade: resGroupSupport.Grade, - ResGroupSupportId: resGroupSupport.ID, + DiamondNum: resSupport.MgrAward, + Grade: resSupport.Grade, + ResGroupSupportId: resSupport.ID, Period: period, }) } diff --git a/domain/service/group_s/group_support.go b/domain/service/group_s/group_support.go index c3202c7..650b4fb 100644 --- a/domain/service/group_s/group_support.go +++ b/domain/service/group_s/group_support.go @@ -15,13 +15,12 @@ import ( "hilo-group/domain/model/msg_m" "hilo-group/domain/model/res_m" "hilo-group/domain/model/user_m" - "hilo-group/myerr/bizerr" "strconv" "time" ) // 群组支持名单过滤 -func (s *GroupService) GroupSupportList(groupId string, uids []uint64) ([]uint64, []uint64, error) { +func (s *GroupService) GroupSupportList(groupId string, uids []uint64, supportLevel uint32) ([]uint64, []uint64, error) { if len(uids) <= 0 { return uids, nil, nil } @@ -29,86 +28,157 @@ func (s *GroupService) GroupSupportList(groupId string, uids []uint64) ([]uint64 result := make([]uint64, 0) out := make([]uint64, 0) - err := s.svc.Transactional(func() error { - model := domain.CreateModel(s.svc.CtxAndDb) + model := domain.CreateModel(s.svc.CtxAndDb) - // 1. 去掉非群管理者 - roles, _, err := group_m.GetRolesInGroup(model, groupId) - if err != nil { - return err - } - userIds := make([]uint64, 0) - for _, i := range uids { - if _, ok := roles[i]; ok { - userIds = append(userIds, i) - } else { - out = append(out, i) - model.Log.Infof("GroupSupportList: rule out %d, no role", i) - } + // 1. 去掉非群管理者 + roles, _, err := group_m.GetRolesInGroup(model, groupId) + if err != nil { + model.Log.Errorf("GroupSupportList groupId:%v, uids:%v, err:%v", groupId, uids, err) + return nil, nil, err + } + userIds := make([]uint64, 0) + for _, i := range uids { + if _, ok := roles[i]; ok { + userIds = append(userIds, i) + } else { + out = append(out, i) + model.Log.Infof("GroupSupportList: rule out %d, no role", i) } + } - // TODO: 去掉非群成员 + // TODO: 去掉非群成员 + //(4)1个账户只能做1个群组的管理员(5)1个设备下只允许领取1个管理奖励 + _, _, period := group_m.GetLastSupportPeriod(time.Now()) + gsa := group_m.GroupSupportAwardMgr{Period: period} + rows, err := gsa.Get(model.Db) + if err != nil { + model.Log.Errorf("GroupSupportList groupId:%v, uids:%v, err:%v", groupId, uids, err) + return nil, nil, err + } + awards := make(map[uint64]struct{}, 0) + for _, i := range rows { + awards[i.UserId] = struct{}{} + } - //(4)1个账户只能做1个群组的管理员(5)1个设备下只允许领取1个管理奖励 - _, _, period := group_m.GetLastSupportPeriod(time.Now()) - gsa := group_m.GroupSupportAwardMgr{Period: period} - rows, err := gsa.Get(model.Db) + uids = userIds + userIds = make([]uint64, 0) + m := make(map[uint64]uint64) + for _, u := range uids { + m, err := user_m.GetSameImeiMap(model, u) if err != nil { - return err + model.Log.Errorf("GroupSupportList groupId:%v, uids:%v, err:%v", groupId, uids, err) + return nil, nil, err } - awards := make(map[uint64]struct{}, 0) - for _, i := range rows { - awards[i.UserId] = struct{}{} - } - - uids = userIds - userIds = make([]uint64, 0) - m := make(map[uint64]uint64) - for _, u := range uids { - m, err := user_m.GetSameImeiMap(model, u) - if err != nil { - return err - } - passed := true - for _, i := range m { - if _, ok := awards[i]; ok { - if i == u { - passed = false - model.Log.Infof("GroupSupportList: rule out %d, already awarded", i) - } else { - passed = false - model.Log.Infof("GroupSupportList: rule out %d, imei awarded", i) - } + passed := true + for _, i := range m { + if _, ok := awards[i]; ok { + if i == u { + passed = false + model.Log.Infof("GroupSupportList: rule out %d, already awarded", i) + } else { + passed = false + model.Log.Infof("GroupSupportList: rule out %d, imei awarded", i) } } - if passed == true { - userIds = append(userIds, u) - } else { - out = append(out, u) - } - } - model.Log.Infof("GroupSupportList: uids %v, map %v", uids, m) - - _, supportLevel, err := s.GetSupportLevel(groupId) - if err != nil { - return err } - - if uint32(len(userIds)) > supportLevel { - model.Log.Infof("GroupSupportList: rule out %v, limit exeeded", userIds[supportLevel:]) - out = append(out, userIds[supportLevel:]...) - userIds = userIds[0:supportLevel] + if passed == true { + userIds = append(userIds, u) + } else { + out = append(out, u) } - result = userIds - return nil - }) + } + model.Log.Infof("GroupSupportList: uids %v, map %v", uids, m) - if err == nil { - return result, out, nil - } else { - return nil, nil, err + if uint32(len(userIds)) > supportLevel { + model.Log.Infof("GroupSupportList: rule out %v, limit exeeded", userIds[supportLevel:]) + out = append(out, userIds[supportLevel:]...) + userIds = userIds[0:supportLevel] } + result = userIds + + return result, out, nil + + //err := s.svc.Transactional(func() error { + // model := domain.CreateModel(s.svc.CtxAndDb) + // + // // 1. 去掉非群管理者 + // roles, _, err := group_m.GetRolesInGroup(model, groupId) + // if err != nil { + // return err + // } + // userIds := make([]uint64, 0) + // for _, i := range uids { + // if _, ok := roles[i]; ok { + // userIds = append(userIds, i) + // } else { + // out = append(out, i) + // model.Log.Infof("GroupSupportList: rule out %d, no role", i) + // } + // } + // + // // TODO: 去掉非群成员 + // + // //(4)1个账户只能做1个群组的管理员(5)1个设备下只允许领取1个管理奖励 + // _, _, period := group_m.GetLastSupportPeriod(time.Now()) + // gsa := group_m.GroupSupportAwardMgr{Period: period} + // rows, err := gsa.Get(model.Db) + // if err != nil { + // return err + // } + // awards := make(map[uint64]struct{}, 0) + // for _, i := range rows { + // awards[i.UserId] = struct{}{} + // } + // + // uids = userIds + // userIds = make([]uint64, 0) + // m := make(map[uint64]uint64) + // for _, u := range uids { + // m, err := user_m.GetSameImeiMap(model, u) + // if err != nil { + // return err + // } + // + // passed := true + // for _, i := range m { + // if _, ok := awards[i]; ok { + // if i == u { + // passed = false + // model.Log.Infof("GroupSupportList: rule out %d, already awarded", i) + // } else { + // passed = false + // model.Log.Infof("GroupSupportList: rule out %d, imei awarded", i) + // } + // } + // } + // if passed == true { + // userIds = append(userIds, u) + // } else { + // out = append(out, u) + // } + // } + // model.Log.Infof("GroupSupportList: uids %v, map %v", uids, m) + // + // _, supportLevel, err := s.GetSupportLevel(groupId) + // if err != nil { + // return err + // } + // + // if uint32(len(userIds)) > supportLevel { + // model.Log.Infof("GroupSupportList: rule out %v, limit exeeded", userIds[supportLevel:]) + // out = append(out, userIds[supportLevel:]...) + // userIds = userIds[0:supportLevel] + // } + // result = userIds + // return nil + //}) + // + //if err == nil { + // return result, out, nil + //} else { + // return nil, nil, err + //} } func (s *GroupService) GetSupportLevel(groupId string) (uint64, uint32, error) { @@ -132,17 +202,42 @@ func (s *GroupService) GetSupportLevel(groupId string) (uint64, uint32, error) { return 0, 0, nil } +func (s *GroupService) GetSupportLevelByRedis(groupId string) (*res_m.ResGroupSupport, uint32, error) { + model := domain.CreateModel(s.svc.CtxAndDb) + + _, _, period := group_m.GetLastSupportPeriod(time.Now()) + // 流水 + keyDiamond := rediskey.GetGroupSupportConsumeSummary(period) + consume, err := model.RedisCluster.ZScore(context.Background(), keyDiamond, groupId).Result() + if err != nil { + model.Log.Errorf("GetSupportLevelByRedis key:%v, groupId:%v, err:%v", keyDiamond, groupId, err) + return nil, 0, err + } + // 支持者数量 + keySupportNum := rediskey.GetGroupSupportCountSupporter(period, groupId) + count, err := model.RedisCluster.SCard(context.Background(), keySupportNum).Result() + if err != nil { + model.Log.Errorf("GetSupportLevelByRedis key:%v, groupId:%v, err:%v", keySupportNum, groupId, err) + return nil, 0, err + } + + rec, err := res_m.GetResGroupSupportBy(model, uint32(count), uint64(consume)) + if err != nil { + return nil, 0, err + } + if rec != nil { + return rec, rec.MgrNum, nil + } + return rec, 0, nil +} + //群组支持奖励 -func (s *GroupService) GroupSupportAward(groupId string, profitAllocator uint64, userIds []uint64, resId uint64, period string) error { +func (s *GroupService) GroupSupportAward(groupId string, profitAllocator uint64, userIds []uint64, resSupport *res_m.ResGroupSupport, + period string, groupInfo *group_m.GroupInfo) error { return s.svc.Transactional(func() error { model := domain.CreateModel(s.svc.CtxAndDb) - // - groupInfo, err := group_m.GetGroupInfo(model, groupId) - if groupInfo == nil { - return bizerr.GroupNotFound - } //发放奖励 - groupSupportAwardAdmin, groupSupportAwardMgrs, err := group_m.AddGroupSupportAward(model, groupId, profitAllocator, resId, userIds, period) + groupSupportAwardAdmin, groupSupportAwardMgrs, err := group_m.AddGroupSupportAward(model, groupId, profitAllocator, resSupport, userIds, period) if err != nil { return err } diff --git a/route/group_r/group_support.go b/route/group_r/group_support.go index fbdc263..97c98bf 100644 --- a/route/group_r/group_support.go +++ b/route/group_r/group_support.go @@ -335,20 +335,24 @@ func TakeSupportAward(c *gin.Context) (*mycontext.MyContext, error) { return myContext, bizerr.GroupAlreadyAwarded } - userIds, outUserIds, err := group_s.NewGroupService(myContext).GroupSupportList(groupId, userIds) - model.Log.Infof("TakeSupportAward: %v, %v", userIds, outUserIds) - model = domain.CreateModelContext(myContext) - resSupportId, _, err := group_s.NewGroupService(myContext).GetSupportLevel(groupId) + resSupport, supportLevel, err := group_s.NewGroupService(myContext).GetSupportLevelByRedis(groupId) if err != nil { return myContext, err } - if resSupportId <= 0 { + if resSupport.ID <= 0 { return myContext, bizerr.NotQualified } + userIds, outUserIds, err := group_s.NewGroupService(myContext).GroupSupportList(groupId, userIds, supportLevel) + model.Log.Infof("TakeSupportAward: %v, %v", userIds, outUserIds) + if err != nil { + model.Log.Errorf("TakeSupportAward groupId:%v, userId:%v err:%v", groupId, userId, err) + return myContext, err + } + // 检查userIds的ip限制 userIp, err := user_m.GetUserIpMap(model.Db, userIds) if err != nil { @@ -382,8 +386,12 @@ func TakeSupportAward(c *gin.Context) (*mycontext.MyContext, error) { } } + groupInfo, err := group_m.GetGroupInfo(model, groupId) + if groupInfo == nil || groupInfo.Id <= 0 { + return myContext, bizerr.GroupNotFound + } // 真正地放奖励 - err = group_s.NewGroupService(myContext).GroupSupportAward(groupId, pa, userIds, resSupportId, period) + err = group_s.NewGroupService(myContext).GroupSupportAward(groupId, pa, userIds, resSupport, period, groupInfo) if err != nil { return myContext, err } -- 2.22.0