package model import ( "context" "fmt" "git.noahlan.cn/northlan/ntools-go/gorm-zero/gormx" "gorm.io/gorm" ) var _ UserPlatformModel = (*customUserPlatformModel)(nil) type ( // UserPlatformModel is an interface to be customized, add more methods here, // and implement the added methods in customUserPlatformModel. UserPlatformModel interface { userPlatformModel // FindOneByPlatformAndPUid 查询平台用户 FindOneByPlatformAndPUid(ctx context.Context, tx *gorm.DB, platform, pUid string) (*UserPlatform, error) // FindFullByPlatform 查询系统用户信息(包括平台用户) FindFullByPlatform(ctx context.Context, tx *gorm.DB, platform, pUid string) (*FullUser, error) // FindEmptyList 查询从未更新过平台信息的用户 FindEmptyList(ctx context.Context, num int64) ([]UserPlatform, error) // FindUpdatableList 查询过期需要更新信息的用户 FindUpdatableList(ctx context.Context, duration int64, num int64) ([]UserPlatform, error) // FindDisplayOneByUserId 查找用户信息,用于展示 FindDisplayOneByUserId(ctx context.Context, uid int64) (*UserForDisplay, error) // FindDisplayOneByPlatform 查找用户信息,用于展示 FindDisplayOneByPlatform(ctx context.Context, tx *gorm.DB, platform string, pUid string) (*UserForDisplay, error) // UpdateNobilityByPUid 更新贵族数据 UpdateNobilityByPUid(ctx context.Context, pUid int64, nobility int64) error // FindUserIdByPlatform 根据平台与平台用户ID获取系统用户ID FindUserIdByPlatform(ctx context.Context, platform, pUid string) (int64, error) // UpdateNonZero 更新非0值 UpdateNonZero(ctx context.Context, tx *gorm.DB, data *UserPlatform) error } UserForDisplay struct { Id int64 `gorm:"id;primaryKey"` // 主键ID UserId int64 `gorm:"column:user_id"` // 用户ID PUname string `gorm:"column:p_uname"` // 平台用户名 PAvatar string `gorm:"column:p_avatar"` // 平台用户头像地址 } FullUser struct { UserPlatform UserNobility UserNobility `gorm:"foreignKey:UserId;references:UserId"` UserIntegral UserIntegral `gorm:"foreignKey:UserId;references:UserId"` } customUserPlatformModel struct { *defaultUserPlatformModel } ) // NewUserPlatformModel returns a model for the database table. func NewUserPlatformModel(conn *gorm.DB) UserPlatformModel { return &customUserPlatformModel{ defaultUserPlatformModel: newUserPlatformModel(conn), } } func (m *customUserPlatformModel) FindOneByPlatformAndPUid(ctx context.Context, tx *gorm.DB, platform, pUid string) (*UserPlatform, error) { db := gormx.WithTx(ctx, m.DB, tx) var resp UserPlatform err := db.Model(&UserPlatform{}).Where("`platform` = ? AND `p_uid` = ?", platform, pUid).Take(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return &resp, nil } func (m *customUserPlatformModel) FindFullByPlatform(ctx context.Context, tx *gorm.DB, platform, pUid string) (*FullUser, error) { db := gormx.WithTx(ctx, m.DB, tx) var resp FullUser err := db. Joins("UserNobility"). Joins("UserIntegral"). Where("platform = ? AND p_uid = ?", platform, pUid). Take(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return &resp, nil } func (m *customUserPlatformModel) FindEmptyList(ctx context.Context, num int64) ([]UserPlatform, error) { var resp []UserPlatform err := gormx.WithTx(ctx, m.DB, nil). Table(m.tableName()). Where("JSON_LENGTH(`p_info`) = 0 LIMIT ?", num). Find(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return resp, nil } func (m *customUserPlatformModel) FindUpdatableList(ctx context.Context, duration int64, num int64) ([]UserPlatform, error) { var resp []UserPlatform err := gormx.WithTx(ctx, m.DB, nil). Table(m.tableName()). Where("`update_time` < (NOW() - INTERVAL ? HOUR) LIMIT ?", duration, num). Find(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return resp, nil } func (m *customUserPlatformModel) FindDisplayOneByUserId(ctx context.Context, uid int64) (*UserForDisplay, error) { var resp UserForDisplay err := gormx.WithTx(ctx, m.DB, nil). Table(m.table). Select("id, user_id, p_uname, p_avatar"). Where("user_id = ?", uid). Take(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return &resp, nil } func (m *customUserPlatformModel) FindDisplayOneByPlatform(ctx context.Context, tx *gorm.DB, platform string, pUid string) (*UserForDisplay, error) { var resp UserForDisplay err := gormx.WithTx(ctx, m.DB, tx). Table(m.table). Select("id, user_id, p_uname, p_avatar"). Where("platform = ? AND p_uid = ?", platform, pUid). Take(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return nil, err } return &resp, nil } func (m *customUserPlatformModel) UpdateNobilityByPUid(ctx context.Context, pUid int64, nobility int64) error { return gormx.WithTx(ctx, m.DB, nil). Model(&UserPlatform{}). Where("p_uid", pUid). Update("p_nobility_level", nobility).Error } func (m *customUserPlatformModel) FindUserIdByPlatform(ctx context.Context, platform, pUid string) (int64, error) { var resp int64 err := gormx.WithTx(ctx, m.DB, nil). Table(m.table). Select(fmt.Sprintf("%s.user_id", m.table)). Where("platform = ? AND p_uid = ?", platform, pUid).Take(&resp).Error err = gormx.WrapSelectErr(err) if err != nil { return 0, err } return resp, nil } func (m *customUserPlatformModel) UpdateNonZero(ctx context.Context, tx *gorm.DB, data *UserPlatform) error { result := gormx.WithTx(ctx, m.DB, tx).Model(&data).Updates(data) return gormx.WrapUpdateErr(result.Error, result.RowsAffected) }