feat-20231230-001-Robin #25

Merged
chenhao merged 22 commits from feat-20231230-001-Robin into test 2023-12-30 19:49:54 +08:00
6 changed files with 116 additions and 19 deletions
Showing only changes of commit 6d4c1eb05a - Show all commits

View File

@ -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 {

View File

@ -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

View File

@ -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)
}

View File

@ -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
}

View File

@ -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)
}

View File

@ -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 ""
}