go-common/app/admin/main/coupon/service/view.go

212 lines
5.0 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package service
import (
"context"
"mime/multipart"
"time"
"go-common/app/admin/main/coupon/model"
"go-common/library/database/sql"
"go-common/library/ecode"
"go-common/library/log"
"github.com/pkg/errors"
)
//CouponViewBatchAdd view batch add.
func (s *Service) CouponViewBatchAdd(c context.Context, arg *model.ArgCouponViewBatch) (err error) {
if arg.StartTime > arg.ExpireTime {
err = ecode.CouPonBatchTimeErr
return
}
arg.BatchToken = s.token()
arg.CouponType = model.CouponVideo
if err = s.dao.AddViewBatch(c, arg); err != nil {
err = errors.WithStack(err)
}
return
}
//CouponViewbatchSave view batch save.
func (s *Service) CouponViewbatchSave(c context.Context, arg *model.ArgCouponViewBatch) (err error) {
if err = s.dao.UpdateViewBatch(c, arg); err != nil {
err = errors.WithStack(err)
}
return
}
//CouponViewBlock view block
func (s *Service) CouponViewBlock(c context.Context, mid int64, couponToken string) (err error) {
var (
r *model.CouponInfo
tx *sql.Tx
)
if tx, err = s.dao.BeginTran(c); err != nil {
err = errors.WithStack(err)
return
}
defer func() {
if err != nil {
tx.Rollback()
return
}
tx.Commit()
s.dao.DelCouponTypeCache(context.Background(), mid, model.CouponVideo)
}()
if r, err = s.dao.CouponViewInfo(c, couponToken, mid); err != nil {
err = errors.WithStack(err)
return
}
if r.State != model.NotUsed {
err = ecode.CouponInfoStateBlockErr
return
}
if err = s.dao.TxUpdateViewInfo(tx, model.Block, couponToken, mid); err != nil {
err = errors.WithStack(err)
return
}
olog := new(model.CouponChangeLog)
olog.Mid = mid
olog.CouponToken = couponToken
olog.State = model.Block
if err = s.dao.TxCouponViewLog(tx, olog); err != nil {
err = errors.WithStack(err)
}
return
}
//CouponViewUnblock view unblock
func (s *Service) CouponViewUnblock(c context.Context, mid int64, couponToken string) (err error) {
var (
r *model.CouponInfo
tx *sql.Tx
)
if tx, err = s.dao.BeginTran(c); err != nil {
err = errors.WithStack(err)
return
}
defer func() {
if err != nil {
tx.Rollback()
return
}
tx.Commit()
s.dao.DelCouponTypeCache(context.Background(), mid, model.CouponVideo)
}()
if r, err = s.dao.CouponViewInfo(c, couponToken, mid); err != nil {
err = errors.WithStack(err)
return
}
if r.State != model.Block {
err = ecode.CouponInfoStateUnblockErr
return
}
if err = s.dao.TxUpdateViewInfo(tx, model.NotUsed, couponToken, mid); err != nil {
err = errors.WithStack(err)
return
}
olog := new(model.CouponChangeLog)
olog.Mid = mid
olog.CouponToken = couponToken
olog.State = model.NotUsed
if err = s.dao.TxCouponViewLog(tx, olog); err != nil {
err = errors.WithStack(err)
}
return
}
//CouponViewList view list.
func (s *Service) CouponViewList(c context.Context, arg *model.ArgSearchCouponView) (res []*model.CouponInfo, count int64, err error) {
var (
bls []*model.CouponBatchInfo
)
if arg.AppID > 0 || len(arg.BatchToken) > 0 {
if bls, err = s.dao.BatchViewList(c, arg.AppID, arg.BatchToken, model.CouponVideo); err != nil {
err = errors.WithStack(err)
return
}
if len(bls) == 0 {
return
}
for _, v := range bls {
arg.BatchTokens = append(arg.BatchTokens, v.BatchToken)
}
}
if count, err = s.dao.SearchViewCouponCount(c, arg); err != nil {
err = errors.WithStack(err)
return
}
if count <= 0 {
return
}
if res, err = s.dao.SearchViewCouponInfo(c, arg); err != nil {
err = errors.WithStack(err)
return
}
now := time.Now()
for _, v := range res {
if v.OID == 0 {
v.Mtime = 0
} else {
var pgc *model.PGCInfoResq
if pgc, err = s.dao.GetPGCInfo(c, v.OID); err != nil {
log.Error("get pgc info coupon%+v error:%+v", v, err)
continue
}
if pgc != nil {
v.Title = pgc.Title
}
}
if len(v.BatchToken) > 0 {
var cbi *model.CouponBatchInfo
if cbi, err = s.dao.BatchInfo(c, v.BatchToken); err != nil {
err = errors.WithStack(err)
return
}
v.BatchName = cbi.Name
}
if v.ExpireTime < now.Unix() && v.State == model.NotUsed {
v.State = model.Expire
}
}
return
}
//CouponViewSalary view salary.
func (s *Service) CouponViewSalary(c context.Context, f multipart.File, h *multipart.FileHeader, mids []int64, token string) (count int, err error) {
var bi *model.CouponBatchInfo
if len(mids) == 0 {
if mids, err = s.ReadCsv(f, h); err != nil {
err = errors.WithStack(err)
return
}
}
if len(mids) == 0 {
err = ecode.CouponBatchSalaryCountZeroErr
return
}
if len(mids) > _maxSalaryCount {
err = ecode.CouponBatchSalaryLimitErr
return
}
if bi, err = s.dao.BatchInfo(c, token); err != nil {
err = errors.WithStack(err)
return
}
if bi == nil {
err = ecode.CouPonTokenNotFoundErr
return
}
if bi.State != model.BatchStateNormal {
err = ecode.CouPonHadBlockErr
return
}
if bi.MaxCount != _notLimitSalary && len(mids) > int(bi.MaxCount-bi.CurrentCount) {
err = ecode.CouponBatchSalaryLimitErr
return
}
s.RunSalaryCoupon(c, mids, token, bi.AppID, model.CouponVideo, model.SystemAdminSalary, "")
count = len(mids)
return
}