|
|
|
@@ -180,43 +180,41 @@ func UpdateRewardRecordToFinalStatus(sourceType, requestId, newStatus string) er |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func StartPeriodicTaskAsyn(opts *models.StartPeriodicTaskOpts) { |
|
|
|
go StartAndGetPeriodicTask(opts) |
|
|
|
func GetPeriodicTask(sourceType models.SourceType, sourceId, requestId string, operateType models.RewardOperateType) (*models.RewardPeriodicTask, error) { |
|
|
|
_, err := models.GetPointOperateRecordBySourceTypeAndRequestId(sourceType.Name(), requestId, operateType.Name()) |
|
|
|
if err == nil { |
|
|
|
task, err := models.GetPeriodicTaskBySourceIdAndType(sourceType, sourceId, operateType) |
|
|
|
if err != nil { |
|
|
|
log.Error("GetPeriodicTaskBySourceIdAndType error,%v", err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
return task, nil |
|
|
|
} |
|
|
|
|
|
|
|
if err != nil && !models.IsErrRecordNotExist(err) { |
|
|
|
log.Error("GetPointOperateRecordBySourceTypeAndRequestId error,%v", err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
return nil, nil |
|
|
|
} |
|
|
|
|
|
|
|
func StartAndGetPeriodicTask(opts *models.StartPeriodicTaskOpts) (*models.RewardPeriodicTask, error) { |
|
|
|
defer func() { |
|
|
|
if err := recover(); err != nil { |
|
|
|
combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2)) |
|
|
|
log.Error("PANIC:%v", combinedErr) |
|
|
|
} |
|
|
|
}() |
|
|
|
func StartPeriodicTask(opts *models.StartPeriodicTaskOpts) (*models.RewardPeriodicTask, error) { |
|
|
|
//add lock |
|
|
|
var rewardLock = redis_lock.NewDistributeLock(redis_key.RewardOperateLock(opts.RequestId, opts.SourceType.Name(), opts.OperateType.Name())) |
|
|
|
isOk, err := rewardLock.Lock(3 * time.Second) |
|
|
|
if err != nil { |
|
|
|
log.Error("StartAndGetPeriodicTask RewardOperateLock error. %v", err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
if !isOk { |
|
|
|
log.Info("duplicated operate request,targetUserId=%d requestId=%s", opts.TargetUserId, opts.RequestId) |
|
|
|
return nil, nil |
|
|
|
} |
|
|
|
defer rewardLock.UnLock() |
|
|
|
|
|
|
|
_, err = models.GetPointOperateRecordBySourceTypeAndRequestId(opts.SourceType.Name(), opts.RequestId, opts.OperateType.Name()) |
|
|
|
if err == nil { |
|
|
|
task, err := models.GetPeriodicTaskBySourceIdAndType(opts.SourceType, opts.SourceId, opts.OperateType) |
|
|
|
if err != nil { |
|
|
|
log.Error("GetPeriodicTaskBySourceIdAndType error,%v", err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
return task, nil |
|
|
|
r, err := GetPeriodicTask(opts.SourceType, opts.SourceId, opts.RequestId, opts.OperateType) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if err != nil && !models.IsErrRecordNotExist(err) { |
|
|
|
log.Error("operate is handled error,%v", err) |
|
|
|
return nil, err |
|
|
|
if r != nil { |
|
|
|
return r, nil |
|
|
|
} |
|
|
|
|
|
|
|
//new reward operate record |
|
|
|
|