Create & Init Project...
This commit is contained in:
137
app/admin/main/coupon/service/code.go
Normal file
137
app/admin/main/coupon/service/code.go
Normal file
@ -0,0 +1,137 @@
|
||||
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]
|
||||
}
|
Reference in New Issue
Block a user