This commit is contained in:
lwl0608 2024-04-16 20:20:53 +08:00
parent 559f6c1aff
commit 5dedd4fd27
9 changed files with 166 additions and 56 deletions

View File

@ -232,3 +232,18 @@ type GetZoneMemberListResp struct {
base.BaseResponse
Data *GetZoneMemberListData `json:"data"`
}
// 加入免费空间
type ZoneFreeJoinReq struct {
base.BaseRequest
Zid int64 `json:"zid"` // 空间id
ProductId string `json:"product_id"` // 商品idProductIdH5Zone*
}
type ZoneFreeJoinData struct {
}
type ZoneFreeJoinResp struct {
base.BaseResponse
Data *ZoneFreeJoinData `json:"data"`
}

View File

@ -223,6 +223,7 @@ func Init(r *gin.Engine) {
apiZoneGroup.POST("refund_page", middleware.JSONParamValidator(vasproto.ZoneRefundPageReq{}), ZoneRefundPage)
apiZoneGroup.POST("refund", middleware.JSONParamValidator(vasproto.ZoneRefundReq{}), ZoneRefund)
apiZoneGroup.POST("member_list", middleware.JSONParamValidator(vasproto.GetZoneMemberListReq{}), ZoneMemberList)
apiZoneGroup.POST("free_join", middleware.JSONParamValidator(vasproto.ZoneFreeJoinReq{}), ZoneFreeJoin)
// 私密圈动态
apiZoneMomentGroup := r.Group("/api/zone_moment", PrepareToC())

View File

@ -110,3 +110,18 @@ func ZoneMemberList(ctx *gin.Context) {
}
ReplyOk(ctx, data)
}
func ZoneFreeJoin(ctx *gin.Context) {
req := ctx.MustGet("client_req").(*vasproto.ZoneFreeJoinReq)
ec, err := service.DefaultService.ZoneFreeJoin(ctx, req)
if ec != errcode.ErrCodeVasSrvOk {
logger.Error("ZoneFreeJoin fail, req: %v, ec: %v", util.ToJson(req), ec)
if ec == errcode.ErrCodeVasSrvFail && err != nil {
ReplyErrorMsg(ctx, err.Error())
return
}
ReplyErrCodeMsg(ctx, ec)
return
}
ReplyOk(ctx, nil)
}

View File

@ -89,16 +89,17 @@ func (m *Mysql) GetZoneUnlockListByMidZids(ctx *gin.Context, tx *sqlx.Tx, mid in
func (m *Mysql) CreateZoneUnlock(ctx *gin.Context, tx *sqlx.Tx, mid, zid int64) error {
var err error
sqlStr := "insert into " + TableVasZoneUnlock +
" (mid, zid, consume" +
" admission_ct, admission_until, admission_order_id, " +
" ironfanship_ct, ironfanship_until, ironfanship_order_id, " +
" superfanship_ct, superfanship_until, superfanship_order_id) " +
" values (?,?,?,?,?,?,?,?,?,?,?,?)"
" (mid, zid, consume, " +
" admission_ct, admission_until, admission_order_id, admission_unlock_type, " +
" ironfanship_ct, ironfanship_until, ironfanship_order_id, ironfanship_unlock_type, " +
" superfanship_ct, superfanship_until, superfanship_order_id, superfanship_unlock_type) " +
" values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
args := []any{mid, zid, 0, 0, 0, "", 0, 0, 0, "", 0, 0, 0, "", 0}
if tx != nil {
_, err = tx.ExecContext(ctx, sqlStr, mid, zid, 0, 0, 0, "", 0, 0, "", 0, 0, "")
_, err = tx.ExecContext(ctx, sqlStr, args...)
} else {
db := m.getDBVas()
_, err = db.ExecContext(ctx, sqlStr, mid, zid, 0, 0, 0, "", 0, 0, "", 0, 0, "")
_, err = db.ExecContext(ctx, sqlStr, args...)
}
if err != nil {
logger.Error("CreateZoneUnlock fail, mid: %v, zid: %v, err: %v", mid, zid, err)
@ -144,14 +145,15 @@ func (m *Mysql) GetZoneMomentUnlockListByMidMomentIds(ctx *gin.Context, tx *sqlx
}
// 解锁空间普通会员
func (m *Mysql) UnlockZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, mid, zid, until int64, orderId string) error {
func (m *Mysql) UnlockZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, mid, zid, until int64, orderId string, unlockType int32) error {
var err error
sqlStr := "update " + TableVasZoneUnlock + " set admission_ct=?, admission_until=?, admission_order_id=? where mid=? and zid=?"
sqlStr := "update " + TableVasZoneUnlock + " set admission_ct=?, admission_until=?, admission_order_id=?, admission_unlock_type=? where mid=? and zid=?"
args := []any{time.Now().Unix(), until, orderId, unlockType, mid, zid}
if tx != nil {
_, err = tx.ExecContext(ctx, sqlStr, time.Now().Unix(), until, orderId, mid, zid)
_, err = tx.ExecContext(ctx, sqlStr, args...)
} else {
db := m.getDBVas()
_, err = db.ExecContext(ctx, sqlStr, time.Now().Unix(), until, orderId, mid, zid)
_, err = db.ExecContext(ctx, sqlStr, args...)
}
if err != nil {
return err
@ -177,14 +179,15 @@ func (m *Mysql) DeleteZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, mid, zid int6
}
// 解锁空间铁粉
func (m *Mysql) UnlockZoneIronfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, until int64, orderId string) error {
func (m *Mysql) UnlockZoneIronfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, until int64, orderId string, unlockType int32) error {
var err error
sqlStr := "update " + TableVasZoneUnlock + " set ironfanship_ct=?, ironfanship_until=?, ironfanship_order_id=? where mid=? and zid=?"
sqlStr := "update " + TableVasZoneUnlock + " set ironfanship_ct=?, ironfanship_until=?, ironfanship_order_id=?, ironfanship_unlock_type=? where mid=? and zid=?"
args := []any{time.Now().Unix(), until, orderId, unlockType, mid, zid}
if tx != nil {
_, err = tx.ExecContext(ctx, sqlStr, time.Now().Unix(), until, orderId, mid, zid)
_, err = tx.ExecContext(ctx, sqlStr, args...)
} else {
db := m.getDBVas()
_, err = db.ExecContext(ctx, sqlStr, time.Now().Unix(), until, orderId, mid, zid)
_, err = db.ExecContext(ctx, sqlStr, args...)
}
if err != nil {
return err
@ -193,14 +196,15 @@ func (m *Mysql) UnlockZoneIronfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, u
}
// 解锁空间铁粉
func (m *Mysql) UnlockZoneSuperfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, until int64, orderId string) error {
func (m *Mysql) UnlockZoneSuperfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, until int64, orderId string, unlockType int32) error {
var err error
sqlStr := "update " + TableVasZoneUnlock + " set superfanship_ct=?, superfanship_until=?, superfanship_order_id=? where mid=? and zid=?"
sqlStr := "update " + TableVasZoneUnlock + " set superfanship_ct=?, superfanship_until=?, superfanship_order_id=?, superfanship_unlock_type=? where mid=? and zid=?"
args := []any{time.Now().Unix(), until, orderId, unlockType, mid, zid}
if tx != nil {
_, err = tx.ExecContext(ctx, sqlStr, time.Now().Unix(), until, orderId, mid, zid)
_, err = tx.ExecContext(ctx, sqlStr, args...)
} else {
db := m.getDBVas()
_, err = db.ExecContext(ctx, sqlStr, time.Now().Unix(), until, orderId, mid, zid)
_, err = db.ExecContext(ctx, sqlStr, args...)
}
if err != nil {
return err

View File

@ -1314,13 +1314,13 @@ func (v *Vas) PayCallback(ctx *gin.Context, p *vasproto.PayCallbackParamIn) {
return
}
case product.Id == dbstruct.ProductIdH5ZoneAdmission:
err = v.UnlockZoneAdmission(ctx, tx, order)
err = v.UnlockZoneAdmission(ctx, tx, order, dbstruct.ZoneUnlockTypePay)
if err != nil {
logger.Error("UnlockZoneAdmission fail, order: %v, err: %v", util.ToJson(order), err)
return
}
case product.Id == dbstruct.ProductIdH5ZoneSuperfanship:
err = v.UnlockZoneSuperfanship(ctx, tx, order)
err = v.UnlockZoneSuperfanship(ctx, tx, order, dbstruct.ZoneUnlockTypePay)
if err != nil {
logger.Error("UnlockZoneSuperfanship fail, order: %v, err: %v", util.ToJson(order), err)
return
@ -1328,9 +1328,9 @@ func (v *Vas) PayCallback(ctx *gin.Context, p *vasproto.PayCallbackParamIn) {
}
// 是否达到铁粉解锁条件
_err := v.UnlockZoneIronfanship(ctx, tx, order.GetMid(), order.GetZid(), order.GetUid())
_err := v.UnlockZoneIronfanshipReachConsume(ctx, tx, order.GetMid(), order.GetZid(), order.GetUid())
if _err != nil {
logger.Error("UnlockZoneIronfanship fail, order: %v, err: %v", util.ToJson(order), _err)
logger.Error("UnlockZoneIronfanshipReachConsume fail, order: %v, err: %v", util.ToJson(order), _err)
return
}
}

View File

@ -234,7 +234,7 @@ func (v *Vas) UnlockZoneMoment(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct.Or
}
// 解锁空间会员
func (v *Vas) UnlockZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct.Order) error {
func (v *Vas) UnlockZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct.Order, unlockType int32) error {
if tx == nil {
err := fmt.Errorf("nil tx")
return err
@ -247,7 +247,7 @@ func (v *Vas) UnlockZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct
)
// 解锁空间会员
err := v.store.UnlockZoneAdmission(ctx, tx, mid, zid, -1, orderId)
err := v.store.UnlockZoneAdmission(ctx, tx, mid, zid, -1, orderId, unlockType)
if err != nil {
logger.Error("UnlockZoneAdmission fail, mid: %v, zid: %v, orderId: %v, err: %v", mid, zid, orderId, err)
return err
@ -283,7 +283,7 @@ func (v *Vas) UnlockZoneAdmission(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct
}
// 解锁空间超粉
func (v *Vas) UnlockZoneSuperfanship(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct.Order) error {
func (v *Vas) UnlockZoneSuperfanship(ctx *gin.Context, tx *sqlx.Tx, order *dbstruct.Order, unlockType int32) error {
if tx == nil {
err := fmt.Errorf("nil tx")
return err
@ -297,7 +297,7 @@ func (v *Vas) UnlockZoneSuperfanship(ctx *gin.Context, tx *sqlx.Tx, order *dbstr
)
// 解锁空间超粉
err := v.store.UnlockZoneSuperfanship(ctx, tx, mid, zid, order.GetSuperfanshipUntil(), orderId)
err := v.store.UnlockZoneSuperfanship(ctx, tx, mid, zid, order.GetSuperfanshipUntil(), orderId, unlockType)
if err != nil {
logger.Error("UnlockZoneAdmission fail, mid: %v, zid: %v, orderId: %v, err: %v", mid, zid, orderId, err)
return err
@ -355,8 +355,8 @@ func (v *Vas) UnlockZoneSuperfanship(ctx *gin.Context, tx *sqlx.Tx, order *dbstr
return nil
}
// 解锁空间铁粉
func (v *Vas) UnlockZoneIronfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, streamerMid int64) error {
// 满足消费额解锁空间铁粉
func (v *Vas) UnlockZoneIronfanshipReachConsume(ctx *gin.Context, tx *sqlx.Tx, mid, zid, streamerMid int64) error {
if tx == nil {
err := fmt.Errorf("nil tx")
return err
@ -392,7 +392,7 @@ func (v *Vas) UnlockZoneIronfanship(ctx *gin.Context, tx *sqlx.Tx, mid, zid, str
}
// 解锁铁粉
err := v.store.UnlockZoneIronfanship(ctx, tx, mid, zid, -1, "ironfan")
err := v.store.UnlockZoneIronfanship(ctx, tx, mid, zid, -1, "ironfan", dbstruct.ZoneUnlockTypeReachConsume)
if err != nil {
logger.Error("UnlockZoneAdmission fail, mid: %v, zid: %v, err: %v", mid, zid, err)
return err
@ -831,3 +831,46 @@ func (v *Vas) GetZoneMemberList(ctx *gin.Context, zid int64, memType int32) (lis
}
return
}
// 免费加入空间
func (v *Vas) ZoneFreeJoin(ctx *gin.Context, mid, zid int64) error {
// 查询空间价格
zv, _ := v.store.GetZoneVasById(ctx, zid)
if zv == nil {
logger.Error("GetZoneVasById fail, no such zid: %v", zid)
return fmt.Errorf("该主播没有开通空间")
}
if zv.AdmissionPrice != 0 {
return fmt.Errorf("不是免费空间")
}
// 开启事务
tx, err := v.store.VasBegin(ctx)
if err != nil {
logger.Error("vas begin fail, err: %v", err)
return err
}
defer func() {
errTx := v.store.DealTxCR(tx, err)
if errTx != nil {
logger.Error("DealTxCR fail, err: %v", errTx)
return
}
}()
// 解锁空间会员
err = v.store.UnlockZoneAdmission(ctx, tx, mid, zid, -1, "", dbstruct.ZoneUnlockTypeFree)
if err != nil {
logger.Error("UnlockZoneAdmission fail, mid: %v, zid: %v, err: %v", mid, zid, err)
return err
}
// 添加到空间成员
err = v.store.AddZoneMember(ctx, tx, mid, zid, dbstruct.ZoneMemberTypeNormal)
if err != nil {
logger.Error("AddZoneMember normal fail, mid: %v, zid: %v, err: %v", mid, zid, err)
return err
}
return nil
}

View File

@ -752,3 +752,13 @@ func (s *Service) ZoneMemberList(ctx *gin.Context, req *vasproto.GetZoneMemberLi
}
return
}
func (s *Service) ZoneFreeJoin(ctx *gin.Context, req *vasproto.ZoneFreeJoinReq) (ec errcode.ErrCode, err error) {
err = _DefaultVas.ZoneFreeJoin(ctx, req.Mid, req.Zid)
ec, err = errs.DealVasErr(err)
if err != nil {
logger.Error("ZoneRefund fail, err: %v", err)
return
}
return
}

View File

@ -176,19 +176,27 @@ CREATE INDEX ix_orderid ON vas_user_membership_unlock (order_id);
-- 用户解锁空间详情
CREATE TABLE `vas_zone_unlock`
(
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`consume` bigint DEFAULT 0 COMMENT '空间总消费',
`admission_ct` bigint DEFAULT 0 COMMENT '普通会员开通时间',
`admission_until` bigint DEFAULT 0 COMMENT '普通会员到期时间,时间戳,-1: 永久',
`admission_order_id` varchar(128) DEFAULT NULL COMMENT '普通会员订单',
`ironfanship_ct` bigint DEFAULT 0 COMMENT '铁粉开通时间',
`ironfanship_until` bigint DEFAULT 0 COMMENT '铁粉到期时间,时间戳,-1: 永久',
`ironfanship_order_id` varchar(128) DEFAULT NULL COMMENT '铁粉订单',
`superfanship_ct` bigint DEFAULT 0 COMMENT '超粉开通时间',
`superfanship_until` bigint DEFAULT 0 COMMENT '超粉到期时间,时间戳,-1: 永久',
`superfanship_order_id` varchar(128) DEFAULT NULL COMMENT '超粉订单id',
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`oid1` varchar(128) DEFAULT NULL COMMENT '辅助id1',
`oid2` varchar(128) DEFAULT NULL COMMENT '辅助id2',
`oid3` varchar(128) DEFAULT NULL COMMENT '辅助id3',
`oid4` varchar(128) DEFAULT NULL COMMENT '辅助id4',
`oid5` varchar(128) DEFAULT NULL COMMENT '辅助id5',
`consume` bigint DEFAULT 0 COMMENT '空间总消费',
`admission_ct` bigint DEFAULT 0 COMMENT '普通会员开通时间',
`admission_until` bigint DEFAULT 0 COMMENT '普通会员到期时间,时间戳,-1: 永久',
`admission_order_id` varchar(128) DEFAULT NULL COMMENT '普通会员订单id',
`admission_unlock_type` int DEFAULT 0 COMMENT '普通会员解锁类型',
`ironfanship_ct` bigint DEFAULT 0 COMMENT '铁粉开通时间',
`ironfanship_until` bigint DEFAULT 0 COMMENT '铁粉到期时间,时间戳,-1: 永久',
`ironfanship_order_id` varchar(128) DEFAULT NULL COMMENT '铁粉订单id',
`ironfanship_unlock_type` int DEFAULT 0 COMMENT '铁粉解锁类型',
`superfanship_ct` bigint DEFAULT 0 COMMENT '超粉开通时间',
`superfanship_until` bigint DEFAULT 0 COMMENT '超粉到期时间,时间戳,-1: 永久',
`superfanship_order_id` varchar(128) DEFAULT NULL COMMENT '超粉订单id',
`superfanship_unlock_type` int DEFAULT 0 COMMENT '超粉解锁类型',
PRIMARY KEY (`id`)
);

View File

@ -931,20 +931,34 @@ func (p *UserVasMembershipUnlock) GetOrderId() string {
}
// 用户解锁空间详情
const (
ZoneUnlockTypeFree = 1 // 免费解锁
ZoneUnlockTypePay = 2 // 付费解锁
ZoneUnlockTypeReachConsume = 3 // 满足消费额解锁
)
type ZoneUnlock struct {
Id *int64 `json:"id" db:"id"`
Mid *int64 `json:"mid" db:"mid"` // 用户mid
Zid *int64 `json:"zid" db:"zid"` // 空间id
Consume *int64 `json:"consume" db:"consume"` // 空间总消费
AdmissionCt *int64 `json:"admission_ct" db:"admission_ct"` // 普通会员开通时间
AdmissionUntil *int64 `json:"admission_until" db:"admission_until"` // 普通会员到期时间,时间戳,-1: 永久
AdmissionOrderId *string `json:"admission_order_id" db:"admission_order_id"` // 普通会员订单
IronfanshipCt *int64 `json:"ironfanship_ct" db:"ironfanship_ct"` // 铁粉开通时间
IronfanshipUntil *int64 `json:"ironfanship_until" db:"ironfanship_until"` // 铁粉到期时间,时间戳,-1永久
IronfanshipOrderId *string `json:"ironfanship_order_id" db:"ironfanship_order_id"` // 铁粉订单
SuperfanshipCt *int64 `json:"superfanship_ct" db:"superfanship_ct"` // 超粉开通时间
SuperfanshipUntil *int64 `json:"superfanship_until" db:"superfanship_until"` // 超粉到期时间,时间戳,-1永久
SuperfanshipOrderId *string `json:"superfanship_order_id" db:"superfanship_order_id"` // 超粉订单id
Id *int64 `json:"id" db:"id"`
Mid *int64 `json:"mid" db:"mid"` // 用户mid
Zid *int64 `json:"zid" db:"zid"` // 空间id
Oid1 *string `json:"oid1" db:"oid1"` // 辅助id1
Oid2 *string `json:"oid2" db:"oid2"` // 辅助id2
Oid3 *string `json:"oid3" db:"oid3"` // 辅助id3
Oid4 *string `json:"oid4" db:"oid4"` // 辅助id4
Oid5 *string `json:"oid5" db:"oid5"` // 辅助id5
Consume *int64 `json:"consume" db:"consume"` // 空间总消费
AdmissionCt *int64 `json:"admission_ct" db:"admission_ct"` // 普通会员开通时间
AdmissionUntil *int64 `json:"admission_until" db:"admission_until"` // 普通会员到期时间,时间戳,-1: 永久
AdmissionOrderId *string `json:"admission_order_id" db:"admission_order_id"` // 普通会员订单
AdmissionUnlockType *int32 `json:"admission_unlock_type" db:"admission_unlock_type"` // 普通会员解锁类型ZoneUnlockType*
IronfanshipCt *int64 `json:"ironfanship_ct" db:"ironfanship_ct"` // 铁粉开通时间
IronfanshipUntil *int64 `json:"ironfanship_until" db:"ironfanship_until"` // 铁粉到期时间,时间戳,-1永久
IronfanshipOrderId *string `json:"ironfanship_order_id" db:"ironfanship_order_id"` // 铁粉订单
IronfanshipUnlockType *int32 `json:"ironfanship_unlock_type" db:"ironfanship_unlock_type"` // 铁粉解锁类型ZoneUnlockType*
SuperfanshipCt *int64 `json:"superfanship_ct" db:"superfanship_ct"` // 超粉开通时间
SuperfanshipUntil *int64 `json:"superfanship_until" db:"superfanship_until"` // 超粉到期时间,时间戳,-1永久
SuperfanshipOrderId *string `json:"superfanship_order_id" db:"superfanship_order_id"` // 超粉订单id
SuperfanshipUnlockType *int32 `json:"superfanship_unlock_type" db:"superfanship_unlock_type"` // 超粉解锁类型ZoneUnlockType*
}
func (p *ZoneUnlock) IsUnlockAdmission() bool {