You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.1 KiB
167 lines
4.1 KiB
package mobile |
|
|
|
import ( |
|
"context" |
|
"time" |
|
|
|
"go-common/app/interface/main/app-wall/model" |
|
"go-common/app/interface/main/app-wall/model/mobile" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_mobileKey = "mobile" |
|
) |
|
|
|
// InOrdersSync insert OrdersSync |
|
func (s *Service) InOrdersSync(c context.Context, ip string, u *mobile.MobileXML, now time.Time) (err error) { |
|
if !s.iplimit(_mobileKey, ip) { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
var result int64 |
|
if result, err = s.dao.InOrdersSync(c, u); err != nil || result == 0 { |
|
log.Error("mobile_s.dao.OrdersSync (%v) error(%v) or result==0", u, err) |
|
} |
|
return |
|
} |
|
|
|
// FlowSync update OrdersSync |
|
func (s *Service) FlowSync(c context.Context, u *mobile.MobileXML, ip string) (err error) { |
|
if !s.iplimit(_mobileKey, ip) { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
var result int64 |
|
if result, err = s.dao.FlowSync(c, u); err != nil || result == 0 { |
|
log.Error("mobile_s.dao.OrdersSync(%v) error(%v) or result==0", u, err) |
|
} |
|
return |
|
} |
|
|
|
// Activation |
|
func (s *Service) Activation(c context.Context, usermob string, now time.Time) (msg string, err error) { |
|
rows := s.mobileInfo(c, usermob, now) |
|
res, ok := rows[usermob] |
|
if !ok { |
|
err = ecode.NothingFound |
|
msg = "该卡号尚未开通哔哩哔哩专属免流服务" |
|
return |
|
} |
|
for _, u := range res { |
|
if u.Actionid == 1 || (u.Actionid == 2 && now.Unix() <= int64(u.Expiretime)) { |
|
return |
|
} |
|
} |
|
err = ecode.NotModified |
|
msg = "该卡号哔哩哔哩专属免流服务已退订且已过期" |
|
return |
|
} |
|
|
|
// Activation |
|
func (s *Service) MobileState(c context.Context, usermob string, now time.Time) (res *mobile.Mobile) { |
|
data := s.mobileInfo(c, usermob, now) |
|
res = s.userState(data, usermob, now) |
|
return |
|
} |
|
|
|
// UserFlowState |
|
func (s *Service) UserMobileState(c context.Context, usermob string, now time.Time) (res *mobile.Mobile) { |
|
data := s.mobileInfo(c, usermob, now) |
|
if rows, ok := data[usermob]; ok { |
|
for _, res = range rows { |
|
if res.Actionid == 1 || (res.Actionid == 2 && now.Unix() <= int64(res.Expiretime)) { |
|
res.MobileType = 2 |
|
return |
|
} |
|
} |
|
res = &mobile.Mobile{MobileType: 1} |
|
} |
|
res = &mobile.Mobile{MobileType: 1} |
|
return |
|
} |
|
|
|
// userState |
|
func (s *Service) userState(user map[string][]*mobile.Mobile, usermob string, now time.Time) (res *mobile.Mobile) { |
|
if rows, ok := user[usermob]; !ok { |
|
res = &mobile.Mobile{MobileType: 1} |
|
} else { |
|
for _, res = range rows { |
|
if res.Actionid == 2 && now.Unix() <= int64(res.Expiretime) { |
|
res.MobileType = 4 |
|
break |
|
} else if res.Actionid == 1 { |
|
res.MobileType = 2 |
|
break |
|
} |
|
} |
|
if res.MobileType == 0 { |
|
res.MobileType = 3 |
|
} |
|
} |
|
log.Info("mobile_state_type:%v mobile_state_usermob:%v", res.MobileType, usermob) |
|
return |
|
} |
|
|
|
// mobileInfo |
|
func (s *Service) mobileInfo(c context.Context, usermob string, now time.Time) (res map[string][]*mobile.Mobile) { |
|
var ( |
|
err error |
|
m []*mobile.Mobile |
|
tmps []*mobile.Mobile |
|
row = map[string][]*mobile.Mobile{} |
|
) |
|
res = map[string][]*mobile.Mobile{} |
|
if m, err = s.dao.MobileCache(c, usermob); err == nil && len(m) > 0 { |
|
row[usermob] = m |
|
s.pHit.Incr("mobile_cache") |
|
} else { |
|
row, err = s.dao.OrdersUserFlow(c, usermob, now) |
|
if err != nil { |
|
log.Error("mobile_s.dao.OrdersUserFlow error(%v)", err) |
|
return |
|
} |
|
s.pMiss.Incr("mobile_cache") |
|
if user, ok := row[usermob]; ok && len(user) > 0 { |
|
if err = s.dao.AddMobileCache(c, usermob, user); err != nil { |
|
log.Error("s.dao.AddMobileCache error(%v)", err) |
|
return |
|
} |
|
} |
|
} |
|
if ms, ok := row[usermob]; ok && len(ms) > 0 { |
|
for _, m := range ms { |
|
tmp := &mobile.Mobile{} |
|
*tmp = *m |
|
tmp.Productid = "" |
|
tmps = append(tmps, tmp) |
|
} |
|
res[usermob] = tmps |
|
} |
|
return |
|
} |
|
|
|
// IsMobileIP is mobile ip |
|
func (s *Service) IsMobileIP(ipUint uint32, ipStr, usermob string) (res *mobile.MobileUserIP) { |
|
res = &mobile.MobileUserIP{ |
|
IPStr: ipStr, |
|
IsValide: false, |
|
} |
|
if !model.IsIPv4(ipStr) { |
|
return |
|
} |
|
for _, u := range s.mobileIpCache { |
|
if u.IPStartUint <= ipUint && u.IPEndUint >= ipUint { |
|
res.IsValide = true |
|
return |
|
} |
|
} |
|
log.Error("mobile_user_ip:%v mobile_ip_usermob:%v", ipStr, usermob) |
|
return |
|
} |
|
|
|
// mobileIp ip limit |
|
func (s *Service) iplimit(k, ip string) bool { |
|
return true |
|
}
|
|
|