group_power.go 11.2 KB
Newer Older
hujiebin's avatar
hujiebin committed
1 2 3
package group_power_s

import (
4 5
	"encoding/json"
	"git.hilo.cn/hilo-common/_const/enum/diamond_e"
hujiebin's avatar
hujiebin committed
6 7 8
	"git.hilo.cn/hilo-common/domain"
	"git.hilo.cn/hilo-common/mycontext"
	"git.hilo.cn/hilo-common/resource/mysql"
9 10 11
	"git.hilo.cn/hilo-common/txop/award_tx"
	"git.hilo.cn/hilo-common/utils"
	"github.com/jinzhu/now"
chenweijian's avatar
chenweijian committed
12
	"hilo-group/_const/enum/groupPower_e"
13
	"hilo-group/_const/enum/msg_e"
chenweijian's avatar
chenweijian committed
14 15
	"hilo-group/cv/group_power_cv"
	"hilo-group/cv/user_cv"
chenweijian's avatar
chenweijian committed
16
	"hilo-group/domain/cache/user_c"
hujiebin's avatar
hujiebin committed
17 18
	"hilo-group/domain/event/group_power_ev"
	"hilo-group/domain/model/groupPower_m"
19 20
	"hilo-group/myerr/bizerr"
	"time"
hujiebin's avatar
hujiebin committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34
)

type GroupPowerService struct {
	svc *domain.Service
}

func NewGroupPowerService(myContext *mycontext.MyContext) *GroupPowerService {
	svc := domain.CreateService(myContext)
	return &GroupPowerService{svc}
}

//用户加入国家势力
func (s *GroupPowerService) GroupPowerUserJoin(groupPowerId mysql.ID, userId mysql.ID) error {
	return s.svc.Transactional(func() error {
35
		model := domain.CreateModel(s.svc.CtxAndDb)
hujiebin's avatar
hujiebin committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
		groupPower, err := groupPower_m.GetGroupPower(model, groupPowerId)
		if err != nil {
			return err
		}
		groupPowerUser, err := groupPower.UserJoin(userId)
		if err != nil {
			return err
		}
		if err := groupPowerUser.Persistent(); err != nil {
			return err
		}
		return group_power_ev.PublishGroupPowerJoin(model, &group_power_ev.GroupPowerJoinEvent{
			UserId:       userId,
			GroupPowerId: groupPowerId,
		})
	})
}

//用户退出国家势力
func (s *GroupPowerService) GroupPowerUserLeave(groupPowerId mysql.ID, userId mysql.ID) (int, error) {
	remainSeconds := 0
	err := s.svc.Transactional(func() error {
58
		model := domain.CreateModel(s.svc.CtxAndDb)
hujiebin's avatar
hujiebin committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
		groupPower, err := groupPower_m.GetGroupPower(model, groupPowerId)
		if err != nil {
			return err
		}
		groupPowerUser, timeDiff, err := groupPower.UserLeave(userId)
		if err != nil {
			if timeDiff > 0 {
				remainSeconds = int(timeDiff.Seconds())
				return err
			}
			return err
		}
		if err := groupPowerUser.Persistent(); err != nil {
			return err
		}
		return group_power_ev.PublishGroupPowerLeave(model, &group_power_ev.GroupPowerLeaveEvent{
			UserId:       userId,
			GroupPowerId: groupPowerId,
		})
	})
	return remainSeconds, err
}
chenweijian's avatar
chenweijian committed
81

chenweijian's avatar
chenweijian committed
82 83 84
func GetGroupPowerRankResp(model *domain.Model, beginDate, endDate string, userId uint64, gpStatus groupPower_e.GroupPowerStatus,
	area int) (response group_power_cv.CvGroupPowerRank, err error) {
	rank, err := groupPower_m.GetGroupPowerExpRank(model, beginDate, endDate, 30, gpStatus, area)
chenweijian's avatar
chenweijian committed
85 86 87 88 89 90 91
	if err != nil {
		return
	}
	var ids []mysql.ID
	for _, g := range rank {
		ids = append(ids, g.GroupPowerId)
	}
92 93 94 95 96 97
	var myGroupPower *groupPower_m.GroupPowerUser
	if userId > 0 {
		myGroupPower, err = groupPower_m.GetGroupPowerUserOrNil(model, userId)
		if err != nil {
			return
		}
chenweijian's avatar
chenweijian committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
	}
	if myGroupPower != nil {
		ids = append(ids, myGroupPower.GroupPowerId)
	}
	grades, err := groupPower_m.MGetGroupPowerGrade(model, ids)
	if err != nil {
		return
	}
	groupPowers, err := groupPower_m.MGetGroupPowerInfoMap(model, ids)
	if err != nil {
		return
	}
	if myGroupPower != nil {
		myGroupPowerRank, err := groupPower_m.GetMyGroupPowerExpRank(model, beginDate, endDate, myGroupPower.GroupPowerId)
		if err != nil {
			return response, err
		}
		response.MyGroupPower = &group_power_cv.CvGroupPowerRankData{
			CvGroupPowerBase: group_power_cv.CvGroupPowerBase{
				Id:        myGroupPower.GroupPowerId,
				Icon:      groupPowers[myGroupPower.GroupPowerId].Icon,
				Name:      groupPowers[myGroupPower.GroupPowerId].Name,
				Nameplate: groupPowers[myGroupPower.GroupPowerId].Nameplate,
			},
			CvGroupPowerGrade: group_power_cv.CvGroupPowerGrade{
				Grade: grades[myGroupPower.GroupPowerId].Grade,
				Exp:   myGroupPowerRank.Exp,
			},
			Rank: 0,
		}
	}
	for _, v := range rank {
		if response.MyGroupPower != nil && v.GroupPowerId == response.MyGroupPower.Id {
			response.MyGroupPower.Rank = v.Rank
		}
		response.Items = append(response.Items, group_power_cv.CvGroupPowerRankData{
			CvGroupPowerBase: group_power_cv.CvGroupPowerBase{
				Id:        v.GroupPowerId,
				Icon:      groupPowers[v.GroupPowerId].Icon,
				Name:      groupPowers[v.GroupPowerId].Name,
				Nameplate: groupPowers[v.GroupPowerId].Nameplate,
			},
			CvGroupPowerGrade: group_power_cv.CvGroupPowerGrade{
				Grade: grades[v.GroupPowerId].Grade,
				Exp:   v.Exp,
			},
			Rank: v.Rank,
		})
	}
	if response.MyGroupPower != nil && response.MyGroupPower.Rank == 0 {
		response.MyGroupPower.Rank = 31 // 客户端统一显示30+
	}
	return response, nil
}

153 154
func GetGroupPowerStar(model *domain.Model, groupPowerId mysql.ID, _type groupPower_e.GroupPowerStarType, offset, limit int, month string) ([]*group_power_cv.CvGroupPowerStarData, error) {
	rank, err := groupPower_m.GetGroupPowerMonthStarRank(model, groupPowerId, _type, offset, limit, month)
chenweijian's avatar
chenweijian committed
155 156 157 158 159 160 161 162 163
	if err != nil {
		return nil, err
	}
	//var response []group_power_cv.CvGroupPowerStarData
	response := make([]*group_power_cv.CvGroupPowerStarData, 0)
	var userIds []mysql.ID
	for _, row := range rank {
		userIds = append(userIds, row.UserId)
	}
chenweijian's avatar
chenweijian committed
164 165
	users, err := user_c.GetUserTinyMap(model, userIds, true)
	//users, err := user_m.GetUserMapByIds(model, userIds)
chenweijian's avatar
chenweijian committed
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
	for _, row := range rank {
		user := users[row.UserId]
		score := row.Score
		if _type == groupPower_e.GroupPowerStarTypeActive {
			score = score / 60
		}
		if score <= 0 {
			continue
		}
		response = append(response, &group_power_cv.CvGroupPowerStarData{
			User: user_cv.CvUserTiny{
				Id:         user.ID,
				ExternalId: user.ExternalId,
				Code:       user.Code,
				Nick:       user.Nick,
				Avatar:     user.Avatar,
			},
			Score: score,
		})
	}
	return response, nil
}
188 189 190 191 192 193

func CalcGroupPowerMonthRankAct(model *domain.Model) error {
	lastDayTime := time.Now().AddDate(0, 0, -1)
	_now := now.New(lastDayTime)
	calcMonth := _now.BeginningOfMonth().Format(utils.MONTH_FORMAT)
	beginDate, endDate := _now.BeginningOfMonth().Format("2006-01-02"), _now.EndOfMonth().Format("2006-01-02")
194 195 196 197
	return DoCalcGroupPowerMonthRankAct(model, calcMonth, beginDate, endDate)
}

func DoCalcGroupPowerMonthRankAct(model *domain.Model, calcMonth, beginDate, endDate string) error {
chenweijian's avatar
chenweijian committed
198 199
	areaList := []int{1, 2}
	for _, area := range areaList { // 计算获奖
chenweijian's avatar
chenweijian committed
200
		model := domain.CreateModelContext(model.MyContext)
chenweijian's avatar
chenweijian committed
201
		response, err := GetGroupPowerRankResp(model, beginDate, endDate, 0, groupPower_e.GroupPowerUserHas, area)
202 203 204
		if err != nil {
			return err
		}
chenweijian's avatar
chenweijian committed
205 206 207 208 209 210 211 212 213 214
		powerIds := make([]uint64, 0, len(response.Items))
		for i, v := range response.Items {
			powerIds = append(powerIds, v.Id)
			response.Items[i].StarList, err = GetGroupPowerStar(model, v.Id, groupPower_e.GroupPowerStarTypeFamous, 0, 10, time.Now().Format(utils.COMPACT_MONTH_FORMAT))
			if err != nil {
				return err
			}
		}
		// 奖励、日志
		awardList, logList, err := getAwardAndLogList(model, powerIds, response.Items, calcMonth, area)
215 216 217
		if err != nil {
			return err
		}
chenweijian's avatar
chenweijian committed
218

chenweijian's avatar
chenweijian committed
219
		err = model.Transaction(func(model *domain.Model) error {
chenweijian's avatar
chenweijian committed
220 221
			// log
			err = groupPower_m.CreateActFamilyMonthRankLog(model, logList)
222
			if err != nil {
chenweijian's avatar
chenweijian committed
223
				model.Log.Errorf("CalcGroupPowerMonthRankAct area:%d, err:%+v", area, err)
224 225
				return err
			}
chenweijian's avatar
chenweijian committed
226 227 228 229 230 231 232 233 234 235
			// award
			for _, v := range awardList {
				err = award_tx.SendUserAward(model, v, diamond_e.GeneralActivity, msg_e.MgrSendDiamondProperty)
				if err != nil {
					model.Log.Errorf("CalcGroupPowerMonthRankAct award:%+v, err:%+v", v, err)
					return err
				}
			}
			return nil
		})
chenweijian's avatar
chenweijian committed
236 237 238 239
		if err != nil {
			model.Log.Errorf("CalcGroupPowerMonthRankAct area:%d, err:%+v", area, err)
			return err
		}
chenweijian's avatar
chenweijian committed
240 241
	}
	return nil
242 243
}

chenweijian's avatar
chenweijian committed
244
func getAwardAndLogList(model *domain.Model, powerIds []uint64, items []group_power_cv.CvGroupPowerRankData, calcMonth string, area int) ([]*award_tx.UserAward, []*groupPower_m.ActFamilyMonthRankLog, error) {
245 246
	// 读奖励配置
	confMap := CalcGroupPowerMonthRankActConf()
247 248 249
	awardList := make([]*award_tx.UserAward, 0, 50) // 奖励
	ownerMap, err := groupPower_m.GetPowerOwnerMap(model, powerIds)
	if err != nil {
250
		return nil, nil, err
251 252 253
	}
	// log list
	logList := make([]*groupPower_m.ActFamilyMonthRankLog, 0, 50)
254
	for _, v := range items {
255 256 257 258 259 260 261 262 263 264 265
		teamRank := 0
		if v.Rank >= 1 && v.Rank <= 3 {
			teamRank = v.Rank
		} else if v.Rank >= 4 && v.Rank <= 10 {
			teamRank = 4
		} else {
			break
		}
		ownerId, ok := ownerMap[v.Id]
		if !ok || ownerId <= 0 {
			model.Log.Errorf("CalcGroupPowerMonthRankAct 获取势力主错误 familyId:%d", v.Id)
266
			return nil, nil, bizerr.InvalidParameter
267 268 269 270 271
		}
		uRankConfMap, tCOk := confMap[teamRank]
		if !tCOk {
			break
		}
272
		// 家族长奖励
273 274 275
		oAward, aOk := uRankConfMap[0]
		if !aOk {
			model.Log.Errorf("CalcGroupPowerMonthRankAct 配置错误:%v", confMap)
276
			return nil, nil, bizerr.InvalidParameter
277 278 279 280 281 282 283 284 285
		}
		oAwardJ, _ := json.Marshal(oAward)
		logList = append(logList, &groupPower_m.ActFamilyMonthRankLog{
			Period:     calcMonth,
			FamilyId:   v.Id,
			RankFamily: v.Rank,
			RankUser:   0,
			UserId:     ownerId,
			Award:      string(oAwardJ),
chenweijian's avatar
chenweijian committed
286
			Area:       area,
287
		})
288
		awardList = append(awardList, &award_tx.UserAward{
chenweijian's avatar
chenweijian committed
289
			UserId:            ownerId,
290 291 292 293 294 295 296
			MedalId:           oAward.MedalId,
			MedalDuration:     oAward.MedalDay,
			Diamond:           oAward.Diamond,
			NobleLevel:        oAward.Noble,
			NobleDuration:     oAward.NobleDay,
			HeaddressId:       oAward.HeaddressId,
			HeaddressDuration: oAward.HeaddressDay})
297 298
		// 家族成员奖励
		for i, m := range v.StarList {
299 300 301 302 303 304 305
			uRank := i + 1
			confIdx := 9
			if uRank >= 1 && uRank <= 3 {
				confIdx = 1
			} else if uRank >= 4 && uRank <= 10 {
				confIdx = 4
			}
306
			mAward, aOk := uRankConfMap[confIdx]
307 308 309
			if !aOk {
				break
			}
310
			mAwardJ, _ := json.Marshal(mAward)
311 312 313 314 315
			logList = append(logList, &groupPower_m.ActFamilyMonthRankLog{
				Period:     calcMonth,
				FamilyId:   v.Id,
				RankFamily: v.Rank,
				RankUser:   uRank,
316 317
				UserId:     m.User.Id,
				Award:      string(mAwardJ),
chenweijian's avatar
chenweijian committed
318
				Area:       area,
319
			})
320
			awardList = append(awardList, &award_tx.UserAward{
chenweijian's avatar
chenweijian committed
321
				UserId:            m.User.Id,
322 323 324 325 326 327 328
				MedalId:           mAward.MedalId,
				MedalDuration:     mAward.MedalDay,
				Diamond:           mAward.Diamond,
				NobleLevel:        mAward.Noble,
				NobleDuration:     mAward.NobleDay,
				HeaddressId:       mAward.HeaddressId,
				HeaddressDuration: mAward.HeaddressDay})
329 330
		}
	}
331 332
	return awardList, logList, nil
}
333

334 335 336 337 338 339 340 341 342 343 344 345 346 347
// 奖励配置
type awardConf struct {
	MedalId      uint64
	MedalDay     uint32
	Diamond      uint32
	Noble        uint32
	NobleDay     uint32
	HeaddressId  uint64
	HeaddressDay int
}

func CalcGroupPowerMonthRankActConf() map[int]map[int]*awardConf {
	return map[int]map[int]*awardConf{
		1: {
chenweijian's avatar
chenweijian committed
348 349
			0: {MedalId: 5211, MedalDay: 30, Diamond: 320000, Noble: 5, NobleDay: 15},
			1: {MedalId: 5251, MedalDay: 30, Diamond: 120000, Noble: 5, NobleDay: 7, HeaddressId: 2121, HeaddressDay: 30},
350
			4: {HeaddressId: 2121, HeaddressDay: 30},
351 352
		},
		2: {
chenweijian's avatar
chenweijian committed
353 354
			0: {MedalId: 5221, MedalDay: 30, Diamond: 220000, Noble: 4, NobleDay: 15},
			1: {MedalId: 5261, MedalDay: 30, Diamond: 100000, Noble: 4, NobleDay: 7, HeaddressId: 2131, HeaddressDay: 30},
355
			4: {HeaddressId: 2131, HeaddressDay: 30},
356 357
		},
		3: {
chenweijian's avatar
chenweijian committed
358 359
			0: {MedalId: 5231, MedalDay: 30, Diamond: 120000, Noble: 5, NobleDay: 5},
			1: {MedalId: 5271, MedalDay: 30, Diamond: 70000, HeaddressId: 2141, HeaddressDay: 30},
360
			4: {HeaddressId: 2141, HeaddressDay: 30},
361 362
		},
		4: {
363 364
			0: {MedalId: 5241, MedalDay: 30},
			1: {MedalId: 5281, MedalDay: 30, HeaddressId: 2151, HeaddressDay: 30},
365 366
		},
	}
367
}