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.
159 lines
4.1 KiB
159 lines
4.1 KiB
package service |
|
|
|
import ( |
|
"bytes" |
|
"context" |
|
"fmt" |
|
"runtime/debug" |
|
"time" |
|
|
|
"go-common/app/admin/main/coupon/model" |
|
col "go-common/app/service/main/coupon/model" |
|
coumol "go-common/app/service/main/coupon/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/net/metadata" |
|
xtime "go-common/library/time" |
|
"go-common/library/xstr" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
// AddBatchInfo add batch info. |
|
func (s *Service) AddBatchInfo(c context.Context, b *model.CouponBatchInfo) (err error) { |
|
if b.StartTime >= b.ExpireTime { |
|
err = ecode.CouPonBatchTimeErr |
|
return |
|
} |
|
b.BatchToken = s.token() |
|
b.Ctime = xtime.Time(time.Now().Unix()) |
|
if _, err = s.dao.AddBatchInfo(c, b); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// BatchList batch list. |
|
func (s *Service) BatchList(c context.Context, arg *model.ArgBatchList) (res []*model.CouponBatchResp, err error) { |
|
var bs []*model.CouponBatchInfo |
|
if bs, err = s.dao.BatchList(c, arg.AppID, arg.Type); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
for _, v := range bs { |
|
r := new(model.CouponBatchResp) |
|
r.ID = v.ID |
|
r.AppID = v.AppID |
|
r.AppName = s.allAppInfo[v.AppID] |
|
r.Name = v.Name |
|
r.BatchToken = v.BatchToken |
|
r.MaxCount = v.MaxCount |
|
r.CurrentCount = v.CurrentCount |
|
r.StartTime = v.StartTime |
|
r.ExpireTime = v.ExpireTime |
|
r.ExpireDay = v.ExpireDay |
|
r.Operator = v.Operator |
|
r.LimitCount = v.LimitCount |
|
r.UseLimitExplain = model.NoLimitExplain |
|
r.Amount = v.Amount |
|
r.FullAmount = v.FullAmount |
|
if r.PlatfromLimit, err = xstr.SplitInts(v.PlatformLimit); err != nil { |
|
log.Error("xstr.SplitInts() err[%+v] ", v.PlatformLimit, err) |
|
err = nil |
|
} |
|
if r.PlatfromLimit == nil { |
|
r.PlatfromLimit = []int64{} |
|
} |
|
r.ProdLimExplainFmt(v.ProdLimMonth, v.ProdLimRenewal) //ProductLimitExplain |
|
r.ProdLimMonth = v.ProdLimMonth |
|
r.ProdLimRenewal = v.ProdLimRenewal |
|
r.State = batchState(v) |
|
res = append(res, r) |
|
} |
|
return |
|
} |
|
|
|
func batchState(v *model.CouponBatchInfo) (state int8) { |
|
state = v.State |
|
now := time.Now().Unix() |
|
if v.ExpireDay == -1 { |
|
if v.ExpireTime <= now { |
|
state = model.CodeBatchExpire |
|
} |
|
} |
|
return |
|
} |
|
|
|
// get coupon token |
|
func (s *Service) token() string { |
|
var b bytes.Buffer |
|
b.WriteString(fmt.Sprintf("%07d", s.r.Int63n(9999999))) |
|
b.WriteString(fmt.Sprintf("%03d", time.Now().UnixNano()/1e6%1000)) |
|
b.WriteString(time.Now().Format("20060102150405")) |
|
return b.String() |
|
} |
|
|
|
// AllAppInfo app app info. |
|
func (s *Service) AllAppInfo(c context.Context) map[int64]string { |
|
return s.allAppInfo |
|
} |
|
|
|
// SalaryCoupon salary coupon. |
|
func (s *Service) SalaryCoupon(c context.Context, mid int64, ct int64, count int, token string) (err error) { |
|
arg := new(coumol.ArgSalaryCoupon) |
|
arg.Count = count |
|
arg.CouponType = ct |
|
arg.Mid = mid |
|
arg.Origin = model.SystemAdminSalary |
|
arg.BatchToken = token |
|
if err = s.couRPC.SalaryCoupon(c, arg); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
//RunSalaryCoupon run salary coupon. |
|
func (s *Service) RunSalaryCoupon(c context.Context, mids []int64, token string, appID int64, couponType int64, origin int64, mt string) { |
|
go func() { |
|
var ( |
|
err error |
|
msgmids = []int64{} |
|
) |
|
defer func() { |
|
if x := recover(); x != nil { |
|
log.Error("RunSalaryCoupon.GoRun arg[%s] panic[%+v]", token, x) |
|
log.Error("%s", debug.Stack()) |
|
} |
|
}() |
|
for _, v := range mids { |
|
for i := 0; i < _maxretry; i++ { |
|
if err = s.couRPC.SalaryCoupon(context.Background(), &col.ArgSalaryCoupon{ |
|
Mid: v, |
|
CouponType: couponType, |
|
Origin: origin, |
|
Count: 1, |
|
BatchToken: token, |
|
AppID: appID, |
|
}); err != nil { |
|
time.Sleep(200 * time.Millisecond) |
|
continue |
|
} |
|
break |
|
} |
|
if err != nil { |
|
log.Error("RunSalaryCoupon faild arg[%s,%d] err[%+v] ", token, v, err) |
|
continue |
|
} |
|
time.Sleep(10 * time.Millisecond) |
|
log.Info("RunSalaryCoupon suc arg[%s,%d]", token, v) |
|
msgmids = append(msgmids, v) |
|
} |
|
if len(mt) > 0 && s.c.Prop.SalaryNormalMsgOpen && len(msgmids) > 0 { |
|
if cerr := s.msgchan.Do(c, func(c context.Context) { |
|
s.sendMsg(msgmids, metadata.String(c, metadata.RemoteIP), 1, true, mt) |
|
}); cerr != nil { |
|
log.Error("s.sendMsg err(%+v)", cerr) |
|
} |
|
} |
|
}() |
|
}
|
|
|