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.
137 lines
3.3 KiB
137 lines
3.3 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"crypto/md5" |
|
"encoding/hex" |
|
"fmt" |
|
"math/rand" |
|
"time" |
|
|
|
"go-common/app/admin/main/coupon/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
// CodePage code page. |
|
func (s *Service) CodePage(c context.Context, a *model.ArgCouponCode) (res *model.CodePage, err error) { |
|
res = new(model.CodePage) |
|
var ( |
|
count int64 |
|
b *model.CouponBatchInfo |
|
now = time.Now().Unix() |
|
) |
|
if count, err = s.dao.CountCode(c, a); err != nil { |
|
return |
|
} |
|
if count <= 0 { |
|
return |
|
} |
|
if res.CodeList, err = s.dao.CodeList(c, a); err != nil { |
|
return |
|
} |
|
for _, v := range res.CodeList { |
|
if b, err = s.BatchInfo(c, v.BatchToken); err != nil { |
|
return |
|
} |
|
if b.ExpireDay == -1 && b.ExpireTime <= now { |
|
v.State = model.CodeStateExpire |
|
} |
|
} |
|
return |
|
} |
|
|
|
// CodeBlock code block. |
|
func (s *Service) CodeBlock(c context.Context, a *model.ArgCouponCode) (err error) { |
|
var code *model.CouponCode |
|
if code, err = s.dao.CodeByID(c, a.ID); err != nil { |
|
return |
|
} |
|
if code == nil || code.State != model.CodeStateNotUse { |
|
return ecode.RequestErr |
|
} |
|
return s.dao.UpdateCodeBlock(c, &model.CouponCode{ID: a.ID, State: model.CodeStateBlock, Ver: code.Ver}) |
|
} |
|
|
|
// CodeUnBlock code un block. |
|
func (s *Service) CodeUnBlock(c context.Context, a *model.ArgCouponCode) (err error) { |
|
var code *model.CouponCode |
|
if code, err = s.dao.CodeByID(c, a.ID); err != nil { |
|
return |
|
} |
|
if code == nil || code.State != model.CodeStateBlock { |
|
return ecode.RequestErr |
|
} |
|
return s.dao.UpdateCodeBlock(c, &model.CouponCode{ID: a.ID, State: model.CodeStateNotUse, Ver: code.Ver}) |
|
} |
|
|
|
// ExportCode export code. |
|
func (s *Service) ExportCode(c context.Context, a *model.ArgCouponCode) (res []string, err error) { |
|
if a.BatchToken == "" { |
|
return nil, ecode.RequestErr |
|
} |
|
var cs []*model.CouponCode |
|
a.Ps = 1000 |
|
a.Pn = 1 |
|
for { |
|
if cs, err = s.dao.CodeList(context.Background(), a); err != nil { |
|
return |
|
} |
|
if len(cs) == 0 { |
|
break |
|
} |
|
for _, v := range cs { |
|
res = append(res, v.Code) |
|
} |
|
a.Pn++ |
|
} |
|
return |
|
} |
|
|
|
// InitCodes init codes |
|
func (s *Service) InitCodes(c context.Context, token string) (err error) { |
|
var info *model.CouponBatchInfo |
|
if info, err = s.dao.BatchInfo(c, token); err != nil { |
|
return |
|
} |
|
if info == nil { |
|
return |
|
} |
|
if info.MaxCount == 0 || info.MaxCount > model.BatchCodeMaxCount { |
|
return |
|
} |
|
// init code. |
|
go func() { |
|
log.Info("init code start arg[%s,%d]", token, info.MaxCount) |
|
cs := []*model.CouponCode{} |
|
for i := int64(0); i < info.MaxCount; i++ { |
|
cs = append(cs, &model.CouponCode{ |
|
BatchToken: token, |
|
State: model.CodeStateNotUse, |
|
Code: codeToken(i), |
|
CouponType: model.CouponAllowance, |
|
}) |
|
if len(cs) == int(info.MaxCount) || len(cs)%model.BatchAddCodeSlice == 0 { |
|
if err = s.dao.BatchAddCode(context.Background(), cs); err != nil { |
|
log.Error("init code error[%s,%v]", token, err) |
|
return |
|
} |
|
log.Info("init code ing arg[%s,%d,%d]", token, info.MaxCount, i) |
|
time.Sleep(50 * time.Millisecond) |
|
cs = []*model.CouponCode{} |
|
} |
|
} |
|
log.Info("init code end arg[%s,%d]", token, info.MaxCount) |
|
}() |
|
return |
|
} |
|
|
|
func codeToken(i int64) string { |
|
hash := md5.New() |
|
unix := time.Now().UnixNano() |
|
key := fmt.Sprintf("%v,%v,%v", unix, i, rand.Intn(100000000)) |
|
hash.Write([]byte(key)) |
|
sum := hash.Sum(nil) |
|
code := hex.EncodeToString(sum) |
|
return code[12:24] |
|
}
|
|
|