package service import ( "fmt" "time" "twin-api/app/api/response" "twin-api/app/common/dao" "twin-api/app/common/model" "twin-api/base/config" "git.u8t.cn/open/go-server/session" "github.com/gin-gonic/gin" "github.com/spf13/cast" ) type Params map[string]any func (p Params) Str(key string) string { return cast.ToString(p[key]) } func (p Params) Int(key string) int { return cast.ToInt(p[key]) } type User struct { sess *session.ApiSession params Params ctx *gin.Context } func NewUser(ctx *gin.Context) *User { u := new(User) u.params = make(map[string]any) u.ctx = ctx if v := ctx.Keys[session.ContextSession]; v != nil { if v, ok := v.(*session.ApiSession); ok { u.sess = v } } if u.sess == nil { panic(config.ErrPermission.New()) } exp := u.sess.GetExperiment() // 初始化参数 for k, v := range config.KeysDefault { u.params[k] = exp.GetParam(k, v) } return u } func (u *User) resp(code int, msgKey string) *response.Response { return response.New(u.ctx, code, u.params.Str(msgKey)) } // 判断注册时间 // 判断免费使用时间 // 判断是否有会员 // 包更新判断 // 判断包是否提示强制更新 // 判断包是否提示更新 func (u *User) success() *response.Response { resp := u.resp(config.Success, "success"). Window(&response.Window{Title: "", Close: true}). AddButton("", "", "") return resp } func (u *User) Verify() *response.Response { // 检查会员状况 if resp := u.VipCheck(); resp != nil { return resp } // 检查包更新状况 if resp := u.PkgCheck(); resp != nil { return resp } return u.success() } func (u *User) VipCheck() *response.Response { var resp *response.Response expire := u.sess.GetUserInfo().VipExpireTime if expire == -1 { return nil } free := time.Unix(u.sess.GetUserInfo().ActiveTime, 0).AddDate(0, 0, u.params.Int(config.ServiceFreeDay)).Unix() if free-u.sess.GetUserInfo().ActiveTime > 0 { return nil } // if expire < time.Now().Unix() { resp = response.New(u.ctx, config.VipExpire, u.params.Str(config.ServiceVipExpireNotice)) window := &response.Window{Close: false} resp.Window(window) buttons := make([]*response.Button, 0) // 首次支付按钮 if u.sess.GetUserInfo().VipCreateTime == 0 { if u.params[config.ServiceFirstPayWay] == config.FirstRechargeByCoupon { resp.Message(u.params.Str(config.ServerCouponNotice)) buttons = append(buttons, New(u.params).CouponButton()...) } else { buttons = append(buttons, New(u.params).PayButton()...) } } else { if u.params[config.ServicePayWay] == config.FirstRechargeByCoupon { resp.Message(u.params.Str(config.ServerCouponNotice)) buttons = append(buttons, New(u.params).CouponButton()...) } else { buttons = append(buttons, New(u.params).PayButton()...) } } resp.Button(buttons...) } return resp } func (u *User) PkgCheck() *response.Response { var resp *response.Response var userPkg *model.UserPkgInfo var pkg *model.Pkg var err error user := u.sess.GetUserInfo() if userPkg, err = dao.NewUserPkg().GetLatest(user.Id); err != nil { panic(config.ErrDb.New().Append(err)) } if userPkg == nil { pkg, err = dao.NewPackage().GetByPkgName("") if err != nil { panic(config.ErrDb.New().Append(err)) } if pkg == nil { panic(config.ErrData.New().Append(err)) } resp = response.New(u.ctx, config.UerNoPkg, u.params.Str(config.ServiceUserPackageLack)) button := &response.Button{ Text: u.params.Str(config.ServicePackageLackButton), Url: u.params.Str(config.ServicePackageLackUrl), Type: config.ButtonClick, } window := &response.Window{Close: false} resp.Button(button) resp.Window(window) return resp } // 先判断是否强制更新 if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceForceUpdateDay])); resp != nil { resp.Window(&response.Window{Close: false, Title: u.params.Str(config.ServiceForceUpdateNotice)}) return resp } // 判断是否提示更新 if resp = u.expireCheck(userPkg, cast.ToInt(u.params[config.ServiceUpdateBeforeDay])); resp != nil { msg := fmt.Sprintf(u.params.Str(config.ServiceUpdateNotice), time.Unix(userPkg.Pkg.ExpireTime, 0).Format("2006-01-02")) resp.Window(&response.Window{Close: true, Title: msg}) return resp } return resp } // 判断包是否在有效时间内 func (u *User) expireCheck(userPkg *model.UserPkgInfo, day int) *response.Response { var pkg *model.Pkg var err error var resp *response.Response expire := time.Now().AddDate(0, 0, day) if time.Unix(userPkg.Pkg.ExpireTime, 0).Before(expire) { // 提示强制更新 // 查询当前有无最新可用的包 // 1. 先查询当前包有无可用 if pkg, err = dao.NewPackage().GetByPkgName(userPkg.Pkg.Name); err != nil { panic(config.ErrDb.New().Append(err)) } // 2. 无则查询其他可用包 if pkg == nil || time.Unix(pkg.ExpireTime, 0).Before(expire) { if pkg, err = dao.NewPackage().GetByPkgName(""); err != nil { panic(config.ErrDb.New().Append(err)) } // 3. 如果都不可用,则提示联系客服 if pkg == nil { resp = response.New(u.ctx, config.NoPkg, u.params.Str(config.ServiceContactCustomer)) window := &response.Window{Close: false} resp.Window(window) return resp } } // 否则返回强制更新 message := u.params.Str(config.ServiceForceUpdateNotice) if pkg.Name != userPkg.Pkg.Name { message = u.params.Str(config.ServiceUpdateOtherNotice) } resp = response.New(u.ctx, config.NeedUpgrade, message) button := &response.Button{ Text: u.params.Str(config.ServiceInstallButton), Url: pkg.Link, Type: config.ButtonClick, } window := &response.Window{Close: false} resp.Button(button) resp.Window(window) } return resp }