diff --git a/dbstruct/streamer_acct.go b/dbstruct/streamer_acct.go index 7e5ce69..c234e13 100644 --- a/dbstruct/streamer_acct.go +++ b/dbstruct/streamer_acct.go @@ -11,6 +11,8 @@ type EsStreamerAcct struct { City string `json:"city"` // 所在城市 Constellation string `json:"constellation"` // 星座 LastZoneMomentCreateDayStart int64 `json:"last_zone_moment_create_day_start"` // 最后空间动态创建日始整点 + WechatCoinPrice int64 `json:"wechat_coin_price"` // 微信金币价格 + ZoneAdmissionPrice int64 `json:"zone_admission_price"` // 空间解锁价格, 单位: 分 Ct int64 `json:"ct"` // 创建时间 Ut int64 `json:"ut"` // 更新时间 DelFlag int64 `json:"del_flag"` // 删除标记,0-否,1-是 diff --git a/dbstruct/vas_mongo.go b/dbstruct/vas_mongo.go new file mode 100644 index 0000000..dbbd46d --- /dev/null +++ b/dbstruct/vas_mongo.go @@ -0,0 +1,190 @@ +package dbstruct + +import ( + "math" + + "github.com/Leufolium/test/util" +) + +// 用户增值信息 +const ( + UserVasLockTypeOpen = 0 // 公开 + UserVasLockTypeLock = 1 // 私密 +) + +type UserVasInfo struct { + Mid int64 `json:"mid" bson:"_id"` + WechatLockType int32 `json:"wechat_lock_type" bson:"wechat_lock_type"` // 上锁方式见:UserVasLockType* + WechatContact string `json:"wechat_contact" bson:"wechat_contact"` // 微信联系方式 + WechatCoinPrice int64 `json:"wechat_coin_price" bson:"wechat_coin_price"` // 微信联系方式价格 + WechatUt int64 `json:"wechat_ut" bson:"wechat_ut"` // 微信联系方式更新时间 +} + +func (p UserVasInfo) GetH5WechatCoinPrice() int64 { + return int64(math.Ceil(float64(p.WechatCoinPrice)/9)) * 10 +} + +func (p UserVasInfo) GetWechatCoinPrice() int64 { + return p.WechatCoinPrice +} + +// 金币订单oplog +const ( + OrderOpLogActionAdd = "add" + OrderOpLogActionUpdate = "update" +) + +const ( + OrderOpLogOperatorTypeUser = "user" // 用户 + OrderOpLogOperatorTypeOp = "op" // 运营 +) + +const ( + OrderOpLogResultFail = "fail" // 结果失败 + OrderOpLogResultOk = "ok" // 结果成功 +) + +type OplogCoinOrder struct { + OrderId string `json:"order_id" bson:"order_id"` + Mid int64 `json:"mid" bson:"mid"` + Ct int64 `json:"ct" bson:"ct"` + Action string `json:"action" bson:"action"` // 动作 + OperatorType string `json:"operator_type" bson:"operator_type"` // 操作人类型,见CoinOrderOpLogOperatorType* + Operator string `json:"operator" bson:"operator"` // 操作人 + Detail string `json:"detail" bson:"detail"` // 操作详情 + Result string `json:"result" bson:"result"` // 结果 + BeforeStatus int32 `json:"before_status" bson:"before_status"` + AfterStatus int32 `json:"after_status" bson:"after_status"` +} + +type OplogOrder struct { + OrderId string `json:"order_id" bson:"order_id"` + Mid int64 `json:"mid" bson:"mid"` + Ct int64 `json:"ct" bson:"ct"` + Action string `json:"action" bson:"action"` // 动作 + OperatorType string `json:"operator_type" bson:"operator_type"` // 操作人类型,见CoinOrderOpLogOperatorType* + Operator string `json:"operator" bson:"operator"` // 操作人 + Detail string `json:"detail" bson:"detail"` // 操作详情 + Result string `json:"result" bson:"result"` // 结果 + BeforeStatus int32 `json:"before_status" bson:"before_status"` + AfterStatus int32 `json:"after_status" bson:"after_status"` +} + +const ( + SuperfanshipValidPeriodEternal = 0 // 永久生效 + SuperfanshipValidPeriodMonth = 1 // 31d + SuperfanshipValidPeriodSeason = 2 // 93d + SuperfanshipValidPeriodHalfYear = 3 // 186d + SuperfanshipValidPeriodYear = 4 // 372d +) + +// 空间增值相关,空间价格等 +type ZoneVas struct { + Zid int64 `json:"zid" bson:"_id"` + Mid int64 `json:"mid" bson:"mid"` // 主播mid + Ct int64 `json:"ct" bson:"ct"` // + Ut int64 `json:"ut" bson:"ut"` // + AdmissionPrice int64 `json:"admission_price" bson:"admission_price"` // 空间解锁价格, 单位: 分 + IronfanshipPrice int64 `json:"ironfanship_price" bson:"ironfanship_price"` // 铁粉解锁价格, 单位: 分 + IsSuperfanshipEnabled int `json:"is_superfanship_enabled" bson:"is_superfanship_enabled"` // 是否开启超粉空间 0: 关闭, 1: 开启 + SuperfanshipPrice int64 `json:"superfanship_price" bson:"superfanship_price"` // 超粉价格, 单位: 分 + SuperfanshipValidPeriod int `json:"superfanship_valid_period" bson:"superfanship_valid_period"` // 超粉有效期类型, SuperfanshipValidPeriod* + IsSuperfanshipGiveWechat int `json:"is_superfanship_give_wechat" bson:"is_superfanship_give_wechat"` // 是否开启超粉空间赠送微信 0: 不赠送, 1: 赠送 +} + +func (p ZoneVas) GetSuperfanshipDurationSecond() int64 { + switch p.SuperfanshipValidPeriod { + case SuperfanshipValidPeriodEternal: + return -1 + case SuperfanshipValidPeriodMonth: + return 86400 * 31 + case SuperfanshipValidPeriodSeason: + return 86400 * 31 * 3 + case SuperfanshipValidPeriodHalfYear: + return 86400 * 31 * 6 + case SuperfanshipValidPeriodYear: + return 86400 * 31 * 12 + default: + return -1 + } +} + +func (p ZoneVas) GetSuperfanshipDurationDesc() string { + switch p.SuperfanshipValidPeriod { + case SuperfanshipValidPeriodEternal: + return "永久" + case SuperfanshipValidPeriodMonth: + return "1个月" + case SuperfanshipValidPeriodSeason: + return "3个月" + case SuperfanshipValidPeriodHalfYear: + return "6个月" + case SuperfanshipValidPeriodYear: + return "12个月" + default: + return "永久" + } +} + +func (p ZoneVas) GetAdmissionCoinPrice() int64 { + return util.RoundUp(float64(p.AdmissionPrice) / 10.0) +} + +func (p ZoneVas) GetIronfanshipCoinPrice() int64 { + return util.RoundUp(float64(p.IronfanshipPrice) / 10.0) +} + +func (p ZoneVas) GetSuperfanshipCoinPrice() int64 { + return util.RoundUp(float64(p.SuperfanshipPrice) / 10.0) +} + +// 空间动态价格 +type ZoneMomentPrice struct { + MomentId int64 `json:"id" bson:"_id"` // 动态id + Zid int64 `json:"zid" bson:"zid"` // 空间id + Mid int64 `json:"mid" bson:"mid"` // 主播mid + Ct int64 `json:"ct" bson:"ct"` // + Ut int64 `json:"ut" bson:"ut"` // + Price int64 `json:"price" bson:"price"` // 动态价格,单位:分 +} + +// 空间动态数据相关 +type ZoneMomentStat struct { + MomentId int64 `json:"id" bson:"_id"` // 动态id + Zid int64 `json:"zid" bson:"zid"` // 空间id + BuyerCnt int64 `json:"buyer_cnt" bson:"buyer_cnt"` // 动态购买人数 + Ct int64 `json:"ct" bson:"ct"` // + Ut int64 `json:"ut" bson:"ut"` // +} + +// 收入表 +type WeekDashboardSt struct { + Date string `json:"date" bson:"date"` // 日期 x轴 + Income int64 `json:"income" bson:"income"` // 收入 y轴 +} + +type IncomeFromDashboardSt struct { + Desc string `json:"desc" bson:"desc"` // 描述 + Income int64 `json:"income" bson:"income"` // 收入 +} + +type UserIncome struct { + Mid int64 `json:"mid" bson:"_id"` + WeekDashboard []WeekDashboardSt `json:"week_dashboard" bson:"week_dashboard"` + WeekFromDashboard []IncomeFromDashboardSt `json:"week_from_dashboard" bson:"week_from_dashboard"` +} + +// 提现历史 +const ( + WithdrawStatusOk = 1 + WithdrawStatusFail = 2 +) + +type WithdrawHis struct { + Id string `json:"id" bson:"_id"` + Mid int64 `json:"mid" bson:"mid"` + Did string `json:"did" bson:"did"` + Status int `json:"status" bson:"status"` // 见: WithdrawStatusOk + Err string `json:"err" bson:"err"` + Ct int64 `json:"ct" bson:"ct"` +} diff --git a/importfunc/streamer_into_es.go b/importfunc/streamer_into_es.go index 40ee843..272723c 100644 --- a/importfunc/streamer_into_es.go +++ b/importfunc/streamer_into_es.go @@ -52,13 +52,33 @@ func ImportStreamerIntoEs() { for _, zone := range zones { zoneMp[zone.GetMid()] = zone } + userInfos, _ := mcli.GetUserVasInfoByMids(ctx, mids) + userInfoMp := make(map[int64]*dbstruct.UserVasInfo) + for _, userInfo := range userInfos { + userInfoMp[userInfo.Mid] = userInfo + } + + zids := make([]int64, 0) + for _, zone := range zones { + zids = append(zids, zone.GetId()) + } + zoneVases, _ := mcli.GetZoneVasByIds(ctx, zids) + zoneVasMp := make(map[int64]*dbstruct.ZoneVas) + for _, zoneVas := range zoneVases { + zoneVasMp[zoneVas.Zid] = zoneVas + } streameraccts := make([]*dbstruct.EsStreamerAcct, 0) for _, streamer := range streamers { zone, ok := zoneMp[streamer.GetMid()] lastZoneMomentCreateDay := int64(0) + zoneadmissionprice := int64(-1) if ok && zone.GetLastZoneMomentCt() != 0 { lastZoneMomentCreateDay = util.GetDayStartTimeStamp(time.Unix(zone.GetLastZoneMomentCt(), 0)) + zoneVas, ok1 := zoneVasMp[zone.GetId()] + if ok1 { + zoneadmissionprice = zoneVas.AdmissionPrice + } } name := "" py := "" @@ -69,6 +89,11 @@ func ImportStreamerIntoEs() { py = strings.Join(pinyin.LazyConvert(acct.GetName(), nil), "") userIdString = util.DerefString(acct.UserIdString) } + wechatcoinprice := int64(0) + userInfo, ok := userInfoMp[streamer.GetMid()] + if ok { + wechatcoinprice = userInfo.WechatCoinPrice + } streameraccts = append(streameraccts, &dbstruct.EsStreamerAcct{ Mid: streamer.GetMid(), Name: name, @@ -80,6 +105,8 @@ func ImportStreamerIntoEs() { City: util.DerefString(streamer.City), Constellation: util.DerefString(streamer.Constellation), LastZoneMomentCreateDayStart: lastZoneMomentCreateDay, + WechatCoinPrice: wechatcoinprice, + ZoneAdmissionPrice: zoneadmissionprice, Ct: time.Now().Unix(), Ut: time.Now().Unix(), DelFlag: 0, diff --git a/mongo/mongo.go b/mongo/mongo.go index 6f6038c..3aa88e9 100644 --- a/mongo/mongo.go +++ b/mongo/mongo.go @@ -52,6 +52,17 @@ const ( DBStreamer = "streamer" COLStreamer = "streamer" + + DBVas = "vas" + COLProduct = "product" + COLUserVasInfo = "user_vas_info" + COLOpLogOrder = "oplog_order_%d" + COLOpLogCoinOrder = "oplog_coin_order_%d" + COLZoneVas = "zone_vas" + COLZoneMomentPrice = "zone_moment_price" + COLZoneMomentStat = "zone_moment_stat" + COLUserIncome = "user_income" + COLWithdrawHis = "withdraw_his" ) func (m *Mongo) getColUserIdSeq() *qmgo.Collection { @@ -92,6 +103,16 @@ func (m *Mongo) getColStreamer() *qmgo.Collection { return m.clientMix.Database(DBStreamer).Collection(COLStreamer) } +// 用户增值信息,微信价格等 +func (m *Mongo) getColUserVasInfo() *qmgo.Collection { + return m.clientMix.Database(DBVas).Collection(COLUserVasInfo) +} + +// 空间增值信息 +func (m *Mongo) getColZoneVas() *qmgo.Collection { + return m.clientMix.Database(DBVas).Collection(COLZoneVas) +} + func (m *Mongo) CreateBatch(ctx context.Context, userIdSeqs []*UserIdMap) error { col := m.getColUserIdMap() _, err := col.InsertMany(ctx, userIdSeqs) @@ -268,3 +289,43 @@ func (m *Mongo) GetStreamerList(ctx context.Context, offset, limit int) ([]*dbst } return list, err } + +// 用户增值信息 +func (m *Mongo) GetUserVasInfoByMids(ctx context.Context, mids []int64) ([]*dbstruct.UserVasInfo, error) { + list := make([]*dbstruct.UserVasInfo, 0) + col := m.getColUserVasInfo() + query := qmgo.M{ + "_id": qmgo.M{ + "$in": mids, + }, + } + err := col.Find(ctx, query).All(&list) + if err == qmgo.ErrNoSuchDocuments { + err = nil + return nil, nil + } + if err != nil { + return nil, err + } + return list, nil +} + +// 空间价格信息 +func (m *Mongo) GetZoneVasByIds(ctx context.Context, zids []int64) ([]*dbstruct.ZoneVas, error) { + list := make([]*dbstruct.ZoneVas, 0) + col := m.getColZoneVas() + query := qmgo.M{ + "_id": qmgo.M{ + "$in": zids, + }, + } + err := col.Find(ctx, query).One(&list) + if err == qmgo.ErrNoSuchDocuments { + err = nil + return nil, nil + } + if err != nil { + return nil, err + } + return list, nil +} diff --git a/mysql/client.go b/mysql/client.go index 07f4d24..03c37bd 100644 --- a/mysql/client.go +++ b/mysql/client.go @@ -12,7 +12,7 @@ func NewMysqlDB() (*sqlx.DB, error) { "%s:%s@(%s)/%s?charset=utf8&parseTime=true&timeout=%ds&readTimeout=%ds&writeTimeout=%ds", "root", "Wishpal2024", - "rm-bp11t1616a1kjvmx5.mysql.rds.aliyuncs.com:3306", + "172.31.37.71:3306", "vas", 3, 5, diff --git a/util/util.go b/util/util.go index 1c11fbd..834e2a8 100644 --- a/util/util.go +++ b/util/util.go @@ -2,6 +2,7 @@ package util import ( "fmt" + "math" "time" ) @@ -18,3 +19,7 @@ func GetDayStartTimeStamp(t time.Time) int64 { } return duetimecst.Unix() } + +func RoundUp(num float64) int64 { + return int64(math.Ceil(num)) +}