You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
4.5 KiB
Go
227 lines
4.5 KiB
Go
package action
|
|
|
|
import (
|
|
"joybuywork/internal/app"
|
|
"joybuywork/internal/consts/ckey"
|
|
"joybuywork/internal/repository/cache"
|
|
"joybuywork/internal/repository/dao"
|
|
"joybuywork/internal/repository/model"
|
|
"joybuywork/internal/repository/mtype"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/panjf2000/ants/v2"
|
|
t_centerpb "gits.branchcn.com/backend/taskcenter/proto/go_proto/t_center"
|
|
"gorm.io/gen"
|
|
)
|
|
|
|
type ErrLog struct {
|
|
Action
|
|
}
|
|
|
|
func (s *ErrLog) Desc() string {
|
|
return "清理错误日志"
|
|
}
|
|
|
|
func (s *ErrLog) OnceKey() *OnceKey {
|
|
return &OnceKey{
|
|
exp: 2 * time.Minute,
|
|
key: ckey.CronNotifyReward(),
|
|
release: true,
|
|
}
|
|
}
|
|
|
|
func (s *ErrLog) Exec() (err error) {
|
|
m := dao.ErrLog
|
|
t := time.Now().AddDate(0, -1, -15)
|
|
_, err = m.WithContext(s.ctx).Where(m.CreatedAt.Lte(t.Unix())).Delete()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
type SlowLog struct {
|
|
Action
|
|
}
|
|
|
|
func (s *SlowLog) Desc() string {
|
|
return "清理错误日志"
|
|
}
|
|
|
|
func (s *SlowLog) OnceKey() *OnceKey {
|
|
return &OnceKey{
|
|
exp: 2 * time.Minute,
|
|
key: ckey.CronNotifyReward(),
|
|
release: true,
|
|
}
|
|
}
|
|
|
|
func (s *SlowLog) Exec() (err error) {
|
|
m := dao.SlowLog
|
|
t := time.Now().AddDate(0, 0, -15)
|
|
_, err = m.WithContext(s.ctx).Where(m.CreatedAt.Lte(t.Unix())).Delete()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
type RewardCancel struct {
|
|
Action
|
|
wg *sync.WaitGroup
|
|
}
|
|
|
|
func (s *RewardCancel) Desc() string {
|
|
return "清理错误日志"
|
|
}
|
|
|
|
func (s *RewardCancel) OnceKey() *OnceKey {
|
|
return &OnceKey{
|
|
exp: 2 * time.Minute,
|
|
key: ckey.CronNotifyReward(),
|
|
release: true,
|
|
}
|
|
}
|
|
|
|
func (s *RewardCancel) Exec() (err error) {
|
|
m := dao.RewardRelated
|
|
|
|
s.wg = new(sync.WaitGroup)
|
|
|
|
cpnP, _ := ants.NewPool(5)
|
|
defer cpnP.Release()
|
|
|
|
ctP, _ := ants.NewPool(5)
|
|
defer ctP.Release()
|
|
|
|
var list []*model.RewardRelated
|
|
err = m.WithContext(s.ctx).Where(m.CancelTime.Eq(0)).FindInBatches(&list, 1000, func(tx gen.Dao, batch int) error {
|
|
cpnMap := make(map[int64][]*model.RewardRelated)
|
|
ctMap := make(map[int64][]*model.RewardRelated)
|
|
|
|
for _, v := range list {
|
|
|
|
switch v.RelateTable {
|
|
case "fission_campaign":
|
|
cpnMap[v.RelateID] = append(cpnMap[v.RelateID], v)
|
|
case "taskcenter.center":
|
|
ctMap[v.RelateID] = append(ctMap[v.RelateID], v)
|
|
}
|
|
}
|
|
|
|
s.cpn(cpnP, cpnMap)
|
|
s.ct(ctP, ctMap)
|
|
|
|
return nil
|
|
})
|
|
|
|
s.wg.Wait()
|
|
|
|
return
|
|
}
|
|
|
|
func (s *RewardCancel) cpn(cpnP *ants.Pool, cpnMap map[int64][]*model.RewardRelated) (err error) {
|
|
if len(cpnMap) == 0 {
|
|
return
|
|
}
|
|
|
|
m := dao.RewardRelated
|
|
for id, relates := range cpnMap {
|
|
s.wg.Add(1)
|
|
cpnId := id
|
|
cpnP.Submit(func() {
|
|
defer s.wg.Done()
|
|
|
|
cpn, _ := cache.NewCampaign(s.ctx).FindById(cpnId)
|
|
|
|
if cpn == nil || cpn.Status == mtype.FissionCampaignStatusCancel || cpn.IsDel == mtype.Yes {
|
|
_, err = m.WithContext(s.ctx).Where(
|
|
m.RelateID.Eq(cpnId),
|
|
m.RelateTable.Eq("fission_campaign"),
|
|
m.CancelTime.Eq(0),
|
|
).UpdateSimple(m.CancelTime.Value(time.Now().Unix()))
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
rewardM := dao.FissionCampaignReward
|
|
rewards, _ := rewardM.WithContext(s.ctx).Where(
|
|
rewardM.CampaignID.Eq(cpnId),
|
|
rewardM.IsDel.Eq(mtype.No),
|
|
).Find()
|
|
|
|
var useRewardIdMap = make(map[int64]struct{})
|
|
for _, reward := range rewards {
|
|
useRewardIdMap[reward.RewardID] = struct{}{}
|
|
}
|
|
|
|
var cancelIds []int64
|
|
for _, relate := range relates {
|
|
if _, ok := useRewardIdMap[relate.RewardID]; !ok {
|
|
cancelIds = append(cancelIds, relate.ID)
|
|
}
|
|
}
|
|
|
|
_, err = m.WithContext(s.ctx).Where(m.ID.In(cancelIds...)).UpdateSimple(m.CancelTime.Value(time.Now().Unix()))
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (s *RewardCancel) ct(ctP *ants.Pool, ctMap map[int64][]*model.RewardRelated) (err error) {
|
|
if len(ctMap) == 0 {
|
|
return
|
|
}
|
|
|
|
m := dao.RewardRelated
|
|
for id, relates := range ctMap {
|
|
s.wg.Add(1)
|
|
ctId := id
|
|
ctP.Submit(func() {
|
|
defer s.wg.Done()
|
|
|
|
ctReward, _ := app.NewTaskcenterCenter().CheckRewardUse(s.ctx, &t_centerpb.CheckRewardUseReq{
|
|
Id: ctId,
|
|
})
|
|
|
|
var useRewardIdMap = make(map[int64]struct{})
|
|
for _, rewardId := range ctReward.GetRewardIds() {
|
|
useRewardIdMap[rewardId] = struct{}{}
|
|
}
|
|
|
|
var cancelIds []int64
|
|
for _, relate := range relates {
|
|
if _, ok := useRewardIdMap[relate.RewardID]; !ok {
|
|
cancelIds = append(cancelIds, relate.ID)
|
|
}
|
|
}
|
|
|
|
if len(cancelIds) == 0 {
|
|
return
|
|
}
|
|
|
|
_, err = m.WithContext(s.ctx).Where(m.ID.In(cancelIds...)).UpdateSimple(m.CancelTime.Value(time.Now().Unix()))
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return
|
|
}
|