feat-20231230-001-Robin #25
|
@ -47,10 +47,11 @@ type GetUnlockWechatListReq struct {
|
|||
}
|
||||
|
||||
type UnlockWechatSt struct {
|
||||
Streamer *dbstruct.Streamer `json:"streamer"`
|
||||
Account *dbstruct.Account `json:"account"`
|
||||
LockType int32 `json:"lock_type"`
|
||||
OrderId string `json:"order_id"`
|
||||
Streamer *dbstruct.Streamer `json:"streamer"`
|
||||
Account *dbstruct.Account `json:"account"`
|
||||
LockType int32 `json:"lock_type"`
|
||||
OrderId string `json:"order_id"`
|
||||
OrderStatus int32 `json:"order_status"`
|
||||
}
|
||||
|
||||
type GetUnlockWechatListData struct {
|
||||
|
|
|
@ -137,7 +137,7 @@ func ConfirmAddWechat(ctx *gin.Context) {
|
|||
func GetUnlockWechatList(ctx *gin.Context) {
|
||||
defer logger.Recover()
|
||||
req := ctx.MustGet("client_req").(*vasproto.GetUnlockWechatListReq)
|
||||
if !req.IsValid() {
|
||||
if req.Mid <= 0 {
|
||||
logger.Error("GetUnlockWechatList, invalid param, req: %v", util.ToJson(req))
|
||||
ReplyErrCodeMsg(ctx, errcode.ErrCodeBadParam)
|
||||
return
|
||||
|
|
|
@ -22,12 +22,14 @@ import (
|
|||
)
|
||||
|
||||
type Vas struct {
|
||||
store *dao.Store
|
||||
store *dao.Store
|
||||
streamer *Streamer
|
||||
}
|
||||
|
||||
func NewVas(store *dao.Store) (v *Vas) {
|
||||
func NewVas(store *dao.Store, streamer *Streamer) (v *Vas) {
|
||||
return &Vas{
|
||||
store: store,
|
||||
store: store,
|
||||
streamer: streamer,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -653,7 +655,10 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
)
|
||||
|
||||
// 获取uid的邀请人mid
|
||||
req.InviterMid = 0
|
||||
mp, _ := v.streamer.GetStreamerMapByMids(ctx, []int64{uid})
|
||||
if mp[uid] != nil && mp[uid].Inviters != nil && len(*mp[uid].Inviters) > 0 {
|
||||
req.InviterMid = (*mp[uid].Inviters)[0]
|
||||
}
|
||||
|
||||
// 检查钱包
|
||||
_, has := v.CheckWalletExist(ctx, mid)
|
||||
|
@ -661,6 +666,12 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
err = errs.ErrVasWalletNotExist
|
||||
return
|
||||
}
|
||||
// uid(网红)钱包
|
||||
streamerWallet, _ := v.CheckWalletExist(ctx, uid)
|
||||
// 官网钱包
|
||||
officialWallet, _ := v.CheckWalletExist(ctx, common.OfficialMid)
|
||||
// 邀请人钱包
|
||||
inviterWallet, _ := v.CheckWalletExist(ctx, req.InviterMid)
|
||||
|
||||
v.CheckWalletExist(ctx, common.OfficialMid)
|
||||
if req.InviterMid > 0 {
|
||||
|
@ -739,7 +750,7 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
}
|
||||
|
||||
orderId = coinOrderId
|
||||
switch req.ContactProductId {
|
||||
switch contactProductId {
|
||||
case dbstruct.ProductIdContactWechat:
|
||||
if uVasInfo.WechatLockType == dbstruct.UserVasLockTypeOpen {
|
||||
retContact = uVasInfo.WechatContact
|
||||
|
@ -769,7 +780,7 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
ID: goproto.String(coinOrderId),
|
||||
Mid: goproto.Int64(req.Mid),
|
||||
Uid: goproto.Int64(req.Uid),
|
||||
ProductId: goproto.String(req.ContactProductId),
|
||||
ProductId: goproto.String(contactProductId),
|
||||
Coins: goproto.Int64(coinPrice),
|
||||
Ct: goproto.Int64(timeNow),
|
||||
Ut: goproto.Int64(timeNow),
|
||||
|
@ -801,7 +812,7 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
Did: goproto.String(req.Did),
|
||||
Type: goproto.Int32(dbstruct.CHTypeCost),
|
||||
SType: goproto.Int32(dbstruct.CHSTypeCostContact),
|
||||
TypeId: goproto.String(req.ContactProductId),
|
||||
TypeId: goproto.String(contactProductId),
|
||||
OrderId: goproto.String(coinOrderId),
|
||||
Change: goproto.Int64(-coinPrice),
|
||||
Before: goproto.Int64(util.DerefInt64(wallet.Coins)),
|
||||
|
@ -818,7 +829,7 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
userVasUnlock := &dbstruct.UserVasUnlock{
|
||||
Mid: goproto.Int64(req.Mid),
|
||||
Uid: goproto.Int64(req.Uid),
|
||||
ProductId: goproto.String(req.ContactProductId),
|
||||
ProductId: goproto.String(contactProductId),
|
||||
Ct: goproto.Int64(timeNow),
|
||||
LockType: goproto.Int32(uVasInfo.WechatLockType),
|
||||
Means: goproto.String(dbstruct.UserVasUnlockMeansCoins),
|
||||
|
@ -843,7 +854,7 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
return
|
||||
}
|
||||
|
||||
// 给主播加钻石
|
||||
// 加钻石
|
||||
var (
|
||||
TotalDias = coinPrice
|
||||
StreamerDias = int64(float64(TotalDias) * 0.8)
|
||||
|
@ -855,17 +866,75 @@ func (v *Vas) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlock
|
|||
}
|
||||
OfficialDias = TotalDias - StreamerDias - InviterDias
|
||||
|
||||
// 主播钻石收益明细
|
||||
chStreamer := &dbstruct.ConsumeHistory{
|
||||
Mid: goproto.Int64(req.Uid),
|
||||
Uid: goproto.Int64(req.Mid),
|
||||
Did: goproto.String(req.Did),
|
||||
Type: goproto.Int32(dbstruct.CHTypeIncome),
|
||||
SType: goproto.Int32(dbstruct.CHSTypeIncomeContact),
|
||||
TypeId: goproto.String(contactProductId),
|
||||
OrderId: goproto.String(coinOrderId),
|
||||
Change: goproto.Int64(StreamerDias),
|
||||
Before: goproto.Int64(streamerWallet.GetDiamonds()),
|
||||
After: goproto.Int64(streamerWallet.GetDiamonds() + StreamerDias),
|
||||
Ct: goproto.Int64(timeNow),
|
||||
}
|
||||
err = v.store.CreateConsumeHistory(ctx, tx, chStreamer)
|
||||
if err != nil {
|
||||
logger.Error("CreateConsumeHistory fail, ch: %v, err: %v", util.ToJson(chStreamer), err)
|
||||
return
|
||||
}
|
||||
err = v.store.IncDiamonds(ctx, tx, req.Uid, StreamerDias)
|
||||
if err != nil {
|
||||
logger.Error("IncDiamonds fail, streamer, mid: %v, dias: %v, err: %v", req.Uid, StreamerDias, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 官方
|
||||
chOfficial := &dbstruct.ConsumeHistory{
|
||||
Mid: goproto.Int64(common.OfficialMid),
|
||||
Uid: goproto.Int64(req.Mid),
|
||||
Did: goproto.String(req.Did),
|
||||
Type: goproto.Int32(dbstruct.CHTypeIncome),
|
||||
SType: goproto.Int32(dbstruct.CHSTypeIncomeContact),
|
||||
TypeId: goproto.String(contactProductId),
|
||||
OrderId: goproto.String(coinOrderId),
|
||||
Change: goproto.Int64(OfficialDias),
|
||||
Before: goproto.Int64(officialWallet.GetDiamonds()),
|
||||
After: goproto.Int64(officialWallet.GetDiamonds() + OfficialDias),
|
||||
Ct: goproto.Int64(timeNow),
|
||||
}
|
||||
err = v.store.CreateConsumeHistory(ctx, tx, chOfficial)
|
||||
if err != nil {
|
||||
logger.Error("CreateConsumeHistory fail, ch: %v, err: %v", util.ToJson(chOfficial), err)
|
||||
return
|
||||
}
|
||||
err = v.store.IncDiamonds(ctx, tx, common.OfficialMid, OfficialDias)
|
||||
if err != nil {
|
||||
logger.Error("IncDiamonds fail, official, mid: %v, dias: %v, err: %v", common.OfficialMid, OfficialDias, err)
|
||||
return
|
||||
}
|
||||
|
||||
if InviterDias > 0 {
|
||||
chInviter := &dbstruct.ConsumeHistory{
|
||||
Mid: goproto.Int64(req.InviterMid),
|
||||
Uid: goproto.Int64(req.Mid),
|
||||
Did: goproto.String(req.Did),
|
||||
Type: goproto.Int32(dbstruct.CHTypeIncome),
|
||||
SType: goproto.Int32(dbstruct.CHSTypeIncomeInvite),
|
||||
TypeId: goproto.String(contactProductId),
|
||||
OrderId: goproto.String(coinOrderId),
|
||||
Change: goproto.Int64(InviterDias),
|
||||
Before: goproto.Int64(inviterWallet.GetDiamonds()),
|
||||
After: goproto.Int64(inviterWallet.GetDiamonds() + InviterDias),
|
||||
Ct: goproto.Int64(timeNow),
|
||||
}
|
||||
err = v.store.CreateConsumeHistory(ctx, tx, chInviter)
|
||||
if err != nil {
|
||||
logger.Error("CreateConsumeHistory fail, ch: %v, err: %v", util.ToJson(chInviter), err)
|
||||
return
|
||||
}
|
||||
err = v.store.IncDiamonds(ctx, tx, req.InviterMid, InviterDias)
|
||||
if err != nil {
|
||||
logger.Error("IncDiamonds fail, inviter, mid: %v, dias: %v, err: %v", req.InviterMid, InviterDias, err)
|
||||
|
@ -1589,3 +1658,7 @@ func (v *Vas) AlipayCallback(ctx *gin.Context, p *vasproto.AlipayCallbackParamIn
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (v *Vas) GetCoinOrderById(ctx *gin.Context, id string) (*dbstruct.CoinOrder, error) {
|
||||
return v.store.GetCoinOrderById(ctx, nil, id)
|
||||
}
|
||||
|
|
|
@ -132,7 +132,6 @@ func (s *Service) Init(c any) (err error) {
|
|||
_DefaultAccount = logic.NewAccount(store)
|
||||
_DefaultProduct = logic.NewProduct(store)
|
||||
_DefaultCatalog = logic.NewCatalog(store)
|
||||
_DefaultVas = logic.NewVas(store)
|
||||
_DefaultResource = logic.NewResource(store)
|
||||
_DefaultBanner = logic.NewBanner(store)
|
||||
_DefaultLogin = logic.NewLogin(store)
|
||||
|
@ -154,6 +153,7 @@ func (s *Service) Init(c any) (err error) {
|
|||
_DefaultImageAuditTask = logic.NewImageAuditTask(store)
|
||||
_DefaultTextAudit = logic.NewTextAudit(store)
|
||||
_DefaultTextAuditTask = logic.NewTextAuditTask(store)
|
||||
_DefaultVas = logic.NewVas(store, _DefaultStreamer)
|
||||
_DefaultContactCustomerServiceSession = logic.NewContactCustomerServiceSession(store)
|
||||
return
|
||||
}
|
||||
|
|
|
@ -13,7 +13,8 @@ import (
|
|||
|
||||
// 一键解锁
|
||||
func (s *Service) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUnlockContactReq) (data *vasproto.OneStepUnlockContactData, ec errcode.ErrCode) {
|
||||
// 获取邀请人mid
|
||||
// 获取uid的邀请人
|
||||
req.InviterMid = s.getUidInviterMid(ctx, req.Uid)
|
||||
|
||||
lockType, orderId, contact, err := _DefaultVas.OneStepUnlockContact(ctx, req)
|
||||
ec, err = errs.DealVasErr(err)
|
||||
|
@ -30,6 +31,17 @@ func (s *Service) OneStepUnlockContact(ctx *gin.Context, req *vasproto.OneStepUn
|
|||
return
|
||||
}
|
||||
|
||||
func (s *Service) getUidInviterMid(ctx *gin.Context, uid int64) int64 {
|
||||
mp, _ := _DefaultStreamer.GetStreamerMapByMids(ctx, []int64{uid})
|
||||
if mp[uid] == nil {
|
||||
return 0
|
||||
}
|
||||
if mp[uid].Inviters != nil && len(*mp[uid].Inviters) > 0 {
|
||||
return (*mp[uid].Inviters)[0]
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 填写联系方式
|
||||
func (s *Service) ConsumerFillContact(ctx *gin.Context, req *vasproto.ConsumerFillContactReq) (ec errcode.ErrCode) {
|
||||
ec = errcode.ErrCodeVasSrvOk
|
||||
|
@ -143,10 +155,14 @@ func (s *Service) GetUnlockWechatList(ctx *gin.Context, req *vasproto.GetUnlockW
|
|||
if !ok {
|
||||
continue
|
||||
}
|
||||
coinOrderId := uu.GetOrderId()
|
||||
coinOrder, _ := _DefaultVas.GetCoinOrderById(ctx, coinOrderId)
|
||||
item := &vasproto.UnlockWechatSt{
|
||||
Account: acnt,
|
||||
Streamer: streamer,
|
||||
LockType: uu.GetLockType(),
|
||||
Streamer: streamer,
|
||||
Account: acnt,
|
||||
LockType: uu.GetLockType(),
|
||||
OrderId: coinOrderId,
|
||||
OrderStatus: coinOrder.GetOrderStatus(),
|
||||
}
|
||||
list = append(list, item)
|
||||
}
|
||||
|
|
|
@ -646,3 +646,10 @@ func (p *UserVasUnlock) GetLockType() int32 {
|
|||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (p *UserVasUnlock) GetOrderId() string {
|
||||
if p != nil && p.OrderId != nil {
|
||||
return *p.OrderId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue