From 5dedd4fd27a53e322a26ad72f6cd3e9d5cf6d5f7 Mon Sep 17 00:00:00 2001 From: lwl0608 Date: Tue, 16 Apr 2024 20:20:53 +0800 Subject: [PATCH] fix db --- api/proto/vas/proto/vas.go | 15 ++++++++ app/mix/controller/init.go | 1 + app/mix/controller/zone_vas_api.go | 15 ++++++++ app/mix/dao/mysql_zone.go | 42 ++++++++++++---------- app/mix/service/logic/vas.go | 8 ++--- app/mix/service/logic/vas_zone.go | 57 ++++++++++++++++++++++++++---- app/mix/service/vasservice.go | 10 ++++++ dbstruct/vas.sql | 34 +++++++++++------- dbstruct/vas_mysql.go | 40 ++++++++++++++------- 9 files changed, 166 insertions(+), 56 deletions(-) diff --git a/api/proto/vas/proto/vas.go b/api/proto/vas/proto/vas.go index 7fa8abe1..0e5e9f4f 100644 --- a/api/proto/vas/proto/vas.go +++ b/api/proto/vas/proto/vas.go @@ -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"` // 商品id,ProductIdH5Zone* +} + +type ZoneFreeJoinData struct { +} + +type ZoneFreeJoinResp struct { + base.BaseResponse + Data *ZoneFreeJoinData `json:"data"` +} diff --git a/app/mix/controller/init.go b/app/mix/controller/init.go index 91a48bcb..7e600cdc 100644 --- a/app/mix/controller/init.go +++ b/app/mix/controller/init.go @@ -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()) diff --git a/app/mix/controller/zone_vas_api.go b/app/mix/controller/zone_vas_api.go index 73895efa..e7f57186 100644 --- a/app/mix/controller/zone_vas_api.go +++ b/app/mix/controller/zone_vas_api.go @@ -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) +} diff --git a/app/mix/dao/mysql_zone.go b/app/mix/dao/mysql_zone.go index bbdf1fa9..f108d84c 100644 --- a/app/mix/dao/mysql_zone.go +++ b/app/mix/dao/mysql_zone.go @@ -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 diff --git a/app/mix/service/logic/vas.go b/app/mix/service/logic/vas.go index 13ef934b..f2ee8685 100644 --- a/app/mix/service/logic/vas.go +++ b/app/mix/service/logic/vas.go @@ -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 } } diff --git a/app/mix/service/logic/vas_zone.go b/app/mix/service/logic/vas_zone.go index 2f6ca79c..8ee941b7 100644 --- a/app/mix/service/logic/vas_zone.go +++ b/app/mix/service/logic/vas_zone.go @@ -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 +} diff --git a/app/mix/service/vasservice.go b/app/mix/service/vasservice.go index 7455e8b3..413f2309 100644 --- a/app/mix/service/vasservice.go +++ b/app/mix/service/vasservice.go @@ -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 +} diff --git a/dbstruct/vas.sql b/dbstruct/vas.sql index 5ae246dd..5c8f4e89 100644 --- a/dbstruct/vas.sql +++ b/dbstruct/vas.sql @@ -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`) ); diff --git a/dbstruct/vas_mysql.go b/dbstruct/vas_mysql.go index 0c9dbe47..02b5c044 100644 --- a/dbstruct/vas_mysql.go +++ b/dbstruct/vas_mysql.go @@ -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 {