You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.0 KiB
106 lines
3.0 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"time" |
|
|
|
"go-common/app/interface/main/activity/model/like" |
|
"go-common/app/job/main/activity/model/match" |
|
"go-common/app/service/main/coin/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_upMatchUserLimit = 100 |
|
_reason = "竞猜奖励" |
|
) |
|
|
|
func (s *Service) upMatchUser(c context.Context, newMsg, oldMsg json.RawMessage) { |
|
var ( |
|
err error |
|
newMatchObj = new(match.ActMatchObj) |
|
oldMatchObj = new(match.ActMatchObj) |
|
) |
|
if err = json.Unmarshal(newMsg, newMatchObj); err != nil { |
|
log.Error("upMatchUser json.Unmarshal(%s) error(%+v)", newMsg, err) |
|
return |
|
} |
|
if err = json.Unmarshal(oldMsg, oldMatchObj); err != nil { |
|
log.Error("upMatchUser json.Unmarshal(%s) error(%+v)", oldMsg, err) |
|
return |
|
} |
|
if oldMatchObj.Result == match.ResultNo { |
|
if newMatchObj.Result == match.ResultNo { |
|
return |
|
} |
|
s.upUsers(c, newMatchObj) |
|
} |
|
} |
|
|
|
// FinishMatch finish match. |
|
func (s *Service) FinishMatch(c context.Context, moID int64) (err error) { |
|
var matchObj *match.ActMatchObj |
|
if matchObj, err = s.dao.MatchObjInfo(c, moID); err != nil || matchObj == nil { |
|
return |
|
} |
|
if matchObj.Result == match.ResultNo { |
|
log.Error("FinishMatch moID(%d) result error", moID) |
|
err = ecode.RequestErr |
|
return |
|
} |
|
go s.upUsers(context.Background(), matchObj) |
|
return |
|
} |
|
|
|
func (s *Service) upUsers(c context.Context, matchObj *match.ActMatchObj) { |
|
var ( |
|
matchs []*like.Match |
|
list []*match.ActMatchUser |
|
stake int64 |
|
err error |
|
) |
|
if matchs, err = s.actRPC.Matchs(c, &like.ArgMatch{Sid: matchObj.SID}); err != nil { |
|
log.Error("upMatchUser s.actRPC.Matchs(%d) error(%v)", matchObj.SID, err) |
|
return |
|
} |
|
for _, v := range matchs { |
|
if v.ID == matchObj.MatchID { |
|
stake = v.Stake |
|
} |
|
} |
|
if stake == 0 { |
|
log.Error("upMatchUser match_id(%d) not found", matchObj.MatchID) |
|
return |
|
} |
|
for { |
|
if list, err = s.dao.UnDoMatchUsers(context.Background(), matchObj.ID, _upMatchUserLimit); err != nil { |
|
time.Sleep(time.Duration(s.c.Interval.QueryInterval)) |
|
continue |
|
} else if len(list) == 0 { |
|
log.Info("upMatchUser finish m_o_id(%d)", matchObj.ID) |
|
return |
|
} |
|
var resultMids []int64 |
|
for _, v := range list { |
|
if v.Result == matchObj.Result { |
|
count := float64(v.Stake * stake) |
|
if _, err = s.coinRPC.ModifyCoin(context.Background(), &model.ArgModifyCoin{Mid: v.Mid, Count: count, Reason: _reason}); err != nil { |
|
log.Error("upMatchUser coin error s.coinRPC.ModifyCoin mid(%d) coin(%v) error(%v)", v.Mid, count, err) |
|
continue |
|
} |
|
log.Info("upMatchUser s.coinRPC.ModifyCoin mid(%d) coin(%v)", v.Mid, count) |
|
resultMids = append(resultMids, v.Mid) |
|
time.Sleep(time.Duration(s.c.Interval.CoinInterval)) |
|
} else { |
|
resultMids = append(resultMids, v.Mid) |
|
} |
|
} |
|
if err = s.dao.UpMatchUserResult(context.Background(), matchObj.ID, resultMids); err != nil { |
|
continue |
|
} |
|
log.Info("upMatchUser s.dao.UpMatchUserResult matchID(%d) mids(%+v)", matchObj.ID, resultMids) |
|
time.Sleep(time.Duration(s.c.Interval.QueryInterval)) |
|
} |
|
}
|
|
|