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.
144 lines
3.1 KiB
144 lines
3.1 KiB
package kfc |
|
|
|
import ( |
|
"context" |
|
|
|
"go-common/app/interface/main/activity/conf" |
|
"go-common/app/interface/main/activity/dao/kfc" |
|
kfcmdl "go-common/app/interface/main/activity/model/kfc" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/sync/pipeline/fanout" |
|
) |
|
|
|
// Service struct |
|
type Service struct { |
|
c *conf.Config |
|
dao *kfc.Dao |
|
cache *fanout.Fanout |
|
} |
|
|
|
// Close service |
|
func (s *Service) Close() { |
|
s.dao.Close() |
|
s.cache.Close() |
|
} |
|
|
|
// New Service |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
c: c, |
|
dao: kfc.New(c), |
|
cache: fanout.New("cache", fanout.Worker(5), fanout.Buffer(10240)), |
|
} |
|
return |
|
} |
|
|
|
// KfcInfo . |
|
func (s *Service) KfcInfo(c context.Context, id, mid int64) (kfcInfo *kfcmdl.BnjKfcCoupon, err error) { |
|
var ( |
|
res *kfcmdl.BnjKfcCoupon |
|
) |
|
if res, err = s.dao.KfcCoupon(c, id); err != nil { |
|
log.Error("s.dao.KfcCoupon(%d) error(%+v)", id, err) |
|
return |
|
} |
|
if res.ID == 0 { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
if res.Mid == 0 { |
|
var uid int64 |
|
if uid, err = s.kfcRecall(c, id); err == nil && uid > 0 { |
|
if uid == mid { |
|
res.Mid = uid |
|
} |
|
} |
|
} |
|
if res.Mid != 0 && res.Mid == mid { |
|
kfcInfo = res |
|
} else { |
|
err = ecode.NothingFound |
|
} |
|
return |
|
} |
|
|
|
// kfcRecall . |
|
func (s *Service) kfcRecall(c context.Context, id int64) (uid int64, err error) { |
|
if uid, err = s.dao.KfcWinner(c, id); err != nil { |
|
log.Error("s.dao.KfcWinner(%d) error(%+v)", id, err) |
|
return |
|
} |
|
if uid > 0 { |
|
s.DeliverKfc(c, id, uid) |
|
} |
|
return |
|
} |
|
|
|
// KfcUse . |
|
func (s *Service) KfcUse(c context.Context, code string) (kfcID int64, err error) { |
|
var ( |
|
kfcInfo *kfcmdl.BnjKfcCoupon |
|
effectRows int64 |
|
) |
|
if kfcID, err = s.dao.CacheKfcCode(c, code); err != nil { |
|
log.Error("s.dao.CacheKfcCode(%s) error(%+v)", code, err) |
|
return |
|
} |
|
if kfcID > 0 { |
|
err = ecode.ActivityKfcHasUsed |
|
return |
|
} |
|
if kfcInfo, err = s.dao.RawKfcCode(c, code); err != nil { |
|
log.Error("s.dao.RawKfcCode(%s) error(%+v)", code, err) |
|
return |
|
} |
|
if kfcInfo.ID == 0 { |
|
err = ecode.ActivityKfcNotExist |
|
return |
|
} |
|
if kfcInfo.Mid == 0 { |
|
err = ecode.ActivityKfcNotGiveOut |
|
return |
|
} |
|
if kfcInfo.State == int64(kfc.KfcCodeUsed) { |
|
s.cache.Do(c, func(c context.Context) { |
|
s.dao.AddCacheKfcCode(c, code, kfcInfo.ID) |
|
}) |
|
err = ecode.ActivityKfcHasUsed |
|
return |
|
} |
|
if effectRows, err = s.dao.KfcCodeGiveOut(c, kfcInfo.ID); err != nil { |
|
log.Error("s.dao.KfcCodeGiveOut(%d) error(%+v)", kfcInfo.ID, err) |
|
return |
|
} |
|
if effectRows == 0 { |
|
err = ecode.ActivityKfcSqlError |
|
} |
|
kfcID = kfcInfo.ID |
|
s.cache.Do(c, func(c context.Context) { |
|
s.dao.AddCacheKfcCode(c, code, kfcInfo.ID) |
|
s.dao.DelCacheKfcCoupon(c, kfcInfo.ID) |
|
}) |
|
return |
|
} |
|
|
|
// DeliverKfc . |
|
func (s *Service) DeliverKfc(c context.Context, id, mid int64) (err error) { |
|
effectID, err := s.dao.KfcDeliver(c, id, mid) |
|
if err != nil { |
|
log.Error("s.dao.KfcDeliver(%d,%d) error(%+v)", id, mid, err) |
|
return |
|
} |
|
if effectID > 0 { |
|
s.cache.Do(c, func(c context.Context) { |
|
if e := s.dao.DelCacheKfcCoupon(c, id); e == nil { |
|
s.dao.KfcCoupon(c, id) |
|
} |
|
}) |
|
} else { |
|
err = ecode.ActivityKfcSqlError |
|
log.Error("DeliverKfc mysql effect o rows (%d,%d)", id, mid) |
|
} |
|
return |
|
}
|
|
|