212 lines
5.0 KiB
Go
212 lines
5.0 KiB
Go
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
|
|
}
|