package s2s import ( "context" "joybuywork/internal/plugins/jsonm" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/repository/withdefault" "fmt" "time" "joybuywork/proto/go_proto/workerr" ) const ( PointsChangeSuccess = "success" // 处理成功 PointsChangeLack = "lack" // 余额不足扣除失败 ) type PointsChangeResp struct { Code int32 `json:"code"` Msg string `json:"msg"` Data *PointsChangeRespData `json:"data"` } type PointsChangeRespData struct { State string `json:"state"` // 状态(success - 成功,lack - 缺乏) RelateId string `json:"relate_id"` // 成功关联的唯一信息 } type PointsChange struct { S2S user *model.FissionUser cpn *model.FissionCampaign log *model.FissionPointsLog } func NewPointsChange(ctx context.Context, cpn *model.FissionCampaign, user *model.FissionUser, urlId int64, opts ...Option) (*PointsChange, error) { c := &PointsChange{ user: user, cpn: cpn, } err := c.init(ctx, cpn.ProjectID, urlId, opts...) if err != nil { return nil, err } return c, nil } func (s *PointsChange) Deduct(num int32, source string, other mtype.PointsLogOther) (res *PointsChangeRespData, err error) { return s.Change(num, mtype.FissionPointsLogStateDeduct, source, other) } func (s *PointsChange) CoinGain(player *model.FissionCoin, num int32) (res *PointsChangeRespData, err error) { return s.Change(num, mtype.FissionPointsLogStateGain, mtype.FissionPointsLogSourceCoin, mtype.PointsLogOther{ PlayerId: player.ID, SceneId: player.SceneID, }) } func (s *PointsChange) CoinDeduct(player *model.FissionCoin, num int32, deductId int64) (res *PointsChangeRespData, err error) { return s.Change(num, mtype.FissionPointsLogStateDeduct, mtype.FissionPointsLogSourceCoin, mtype.PointsLogOther{ PlayerId: player.ID, SceneId: player.SceneID, DeductId: deductId, }) } // Change 积分变更 func (s *PointsChange) Change(num int32, state, source string, other mtype.PointsLogOther) (res *PointsChangeRespData, err error) { var resp, errMsg string var code int32 defer func() { s.after(code, resp, errMsg) }() req := mtype.PointsLogReq{ State: state, Num: num, UserId: s.user.SubUserID, Source: source, CampaignId: s.cpn.HashID, Title: s.cpn.Title, } switch state { case mtype.FissionPointsLogStateGain: req.GainId = fmt.Sprint(other.PlayerId) case mtype.FissionPointsLogStateDeduct: req.DeductId = fmt.Sprint(other.DeductId) } s.before(source, req, other) body, _ := jsonm.Marshal(req) resp, code, err = s.request(s.log.ID, body, s.user.LangMark, prefixToken, NewCertToken) if err != nil { errMsg = fmt.Sprintf("请求处理失败: %v", err) err = workerr.S2SNotSuccessError return } var data = &PointsChangeResp{} err = jsonm.StrUnmarshal(resp, data) if err != nil || data.Data == nil { errMsg = fmt.Sprintf("无法解析的返回数据: %v", err) err = workerr.S2SUnableToParseError return } if data.Code != successCode { errMsg = "code返回的非200,请确认业务是否正确对接" if data.Msg != "" { errMsg = fmt.Sprintf("code返回的非200, 提供的信息为: %s", data.Msg) } err = workerr.S2SNotSuccessError return } res = data.Data return } func (s *PointsChange) before(source string, req mtype.PointsLogReq, other mtype.PointsLogOther) { s.log = withdefault.FissionPointsLog(&model.FissionPointsLog{ CampaignID: s.user.CampaignID, UserID: s.user.ID, State: req.State, Num: req.Num, Source: source, ReqURL: s.GetUrl(), }) s.log.SetReq(req) s.log.SetOtherData(other) _ = s.GetDao().FissionPointsLog.WithContext(s.Ctx).Create(s.log) s.start = time.Now() } func (s *PointsChange) after(code int32, resp, errMsg string) { s.log.RespCode = code s.log.Resp = resp s.log.ErrMsg = errMsg s.log.Token = s.GetToken() s.log.ReqHeader = s.GetHeader() s.log.ReqTime = time.Since(s.start).Milliseconds() _ = s.GetDao().FissionPointsLog.WithContext(s.Ctx).Save(s.log) }