Explorar el Código

fix(task): 修复游戏盾自动续费功能并优化相关逻辑- 更新到期时间处理逻辑,增加时间修正
- 添加更新游戏盾后端记录的操作
- 修改检查即将过期游戏盾的逻辑,改为每天检查
- 重构任务执行时间配置
- 优化依赖注入,采用模块化设计

fusu hace 2 meses
padre
commit
6c743639f2

+ 8 - 21
cmd/task/wire/wire.go

@@ -4,33 +4,18 @@
 package wire
 
 import (
-	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
+	"github.com/go-nunu/nunu-layout-advanced/internal/di"
 	"github.com/go-nunu/nunu-layout-advanced/internal/server"
 	"github.com/go-nunu/nunu-layout-advanced/internal/task"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/app"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/log"
-	"github.com/go-nunu/nunu-layout-advanced/pkg/sid"
 	"github.com/google/wire"
 	"github.com/spf13/viper"
 )
 
-var repositorySet = wire.NewSet(
-	repository.NewDB,
-	//repository.NewRedis,
-	repository.NewRepository,
-	repository.NewTransaction,
-	repository.NewUserRepository,
-	repository.NewGameShieldRepository,
-)
-
-var taskSet = wire.NewSet(
-	task.NewTask,
-	task.NewUserTask,
-	task.NewGameShieldTask,
-)
-var serverSet = wire.NewSet(
-	server.NewTaskServer,
-)
+// 使用共享的Provider Set
+var taskSet = task.TaskSet
+var serverSet = server.TaskServerSet
 
 // build App
 func newApp(
@@ -44,10 +29,12 @@ func newApp(
 
 func NewWire(*viper.Viper, *log.Logger) (*app.App, func(), error) {
 	panic(wire.Build(
-		repositorySet,
+		// 使用模块化依赖注入
+		di.RepositorySet,
+		di.ServiceSet,
+		di.CoreSet,
 		taskSet,
 		serverSet,
 		newApp,
-		sid.NewSid,
 	))
 }

+ 23 - 2
cmd/task/wire/wire_gen.go

@@ -9,8 +9,10 @@ package wire
 import (
 	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
 	"github.com/go-nunu/nunu-layout-advanced/internal/server"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service"
 	"github.com/go-nunu/nunu-layout-advanced/internal/task"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/app"
+	"github.com/go-nunu/nunu-layout-advanced/pkg/jwt"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/log"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/sid"
 	"github.com/google/wire"
@@ -28,7 +30,24 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 	userRepository := repository.NewUserRepository(repositoryRepository)
 	userTask := task.NewUserTask(taskTask, userRepository)
 	gameShieldRepository := repository.NewGameShieldRepository(repositoryRepository)
-	gameShieldTask := task.NewGameShieldTask(taskTask, gameShieldRepository)
+	jwtJWT := jwt.NewJwt(viperViper)
+	serviceService := service.NewService(transaction, logger, sidSid, jwtJWT)
+	gameShieldBackendRepository := repository.NewGameShieldBackendRepository(repositoryRepository)
+	parserService := service.NewParserService(serviceService)
+	crawlerService := service.NewCrawlerService(serviceService, parserService, viperViper)
+	gameShieldPublicIpRepository := repository.NewGameShieldPublicIpRepository(repositoryRepository)
+	gameShieldUserIpRepository := repository.NewGameShieldUserIpRepository(repositoryRepository)
+	gameShieldPublicIpService := service.NewGameShieldPublicIpService(serviceService, gameShieldPublicIpRepository, gameShieldUserIpRepository)
+	duedateService := service.NewDuedateService(serviceService, gameShieldRepository)
+	hostRepository := repository.NewHostRepository(repositoryRepository)
+	hostService := service.NewHostService(serviceService, hostRepository)
+	formatterService := service.NewFormatterService(serviceService, gameShieldPublicIpService, gameShieldBackendRepository, hostService)
+	requiredService := service.NewRequiredService(serviceService, crawlerService, viperViper)
+	gameShieldSdkIpRepository := repository.NewGameShieldSdkIpRepository(repositoryRepository)
+	gameShieldSdkIpService := service.NewGameShieldSdkIpService(serviceService, gameShieldSdkIpRepository)
+	gameShieldService := service.NewGameShieldService(serviceService, gameShieldRepository, crawlerService, gameShieldPublicIpService, duedateService, formatterService, parserService, requiredService, viperViper, gameShieldSdkIpService)
+	gameShieldBackendService := service.NewGameShieldBackendService(serviceService, gameShieldBackendRepository, gameShieldRepository, crawlerService, gameShieldPublicIpService, duedateService, formatterService, parserService, requiredService, viperViper, gameShieldService, hostService)
+	gameShieldTask := task.NewGameShieldTask(taskTask, gameShieldRepository, gameShieldBackendService)
 	taskServer := server.NewTaskServer(logger, userTask, gameShieldTask)
 	appApp := newApp(taskServer)
 	return appApp, func() {
@@ -37,12 +56,14 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 
 // wire.go:
 
-var repositorySet = wire.NewSet(repository.NewDB, repository.NewRepository, repository.NewTransaction, repository.NewUserRepository, repository.NewGameShieldRepository)
+var repositorySet = wire.NewSet(repository.NewDB, repository.NewRepository, repository.NewTransaction, repository.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldPublicIpRepository, repository.NewHostRepository, repository.NewGameShieldUserIpRepository, repository.NewGameShieldSdkIpRepository)
 
 var taskSet = wire.NewSet(task.NewTask, task.NewUserTask, task.NewGameShieldTask)
 
 var serverSet = wire.NewSet(server.NewTaskServer)
 
+var serviceSet = wire.NewSet(service.NewService, service.NewGameShieldService, service.NewCrawlerService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewHostService, service.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewGameShieldUserIpService)
+
 // build App
 func newApp(task2 *server.TaskServer,
 ) *app.App {

+ 1 - 1
internal/server/task.go

@@ -49,7 +49,7 @@ func (t *TaskServer) Start(ctx context.Context) error {
 	//}
 
 	// 添加游戏盾检查任务 - 每2小时执行
-	_, err := t.scheduler.Cron("0 */2 * * *").Do(func() {
+	_, err := t.scheduler.Cron("0 */1 * * *").Do(func() {
 		err := t.gameShieldTask.CheckGameShield(ctx)
 		if err != nil {
 			t.log.Error("CheckGameShield error", zap.Error(err))

+ 1 - 1
internal/service/duedate.go

@@ -45,7 +45,7 @@ func (service *duedateService) NextDueDate(ctx context.Context, uid int, product
 	}
 	// 格式化时间
 	t := time.Unix(unixTime, 0)
-	nextduedate := t.Format("2006-01-02 15:04:05")
+	nextduedate := t.Add(time.Hour).Format("2006-01-02 15:04:05")
 
 	return nextduedate, nil
 }

+ 20 - 4
internal/task/gameShield.go

@@ -2,7 +2,9 @@ package task
 
 import (
 	"context"
+	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
 	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service"
 	"go.uber.org/zap"
 	"strconv"
 	"time"
@@ -16,17 +18,20 @@ type GameShieldTask interface {
 func NewGameShieldTask(
 	task *Task,
 	gameShieldRepo repository.GameShieldRepository,
+	gameShieldBackendService service.GameShieldBackendService,
 
 ) GameShieldTask {
 	return &gameShieldTask{
-		Task:           task,
-		gameShieldRepo: gameShieldRepo,
+		Task:                     task,
+		gameShieldRepo:           gameShieldRepo,
+		gameShieldBackendService: gameShieldBackendService,
 	}
 }
 
 type gameShieldTask struct {
 	*Task
-	gameShieldRepo repository.GameShieldRepository
+	gameShieldRepo           repository.GameShieldRepository
+	gameShieldBackendService service.GameShieldBackendService
 }
 
 // 检查已过期的记录
@@ -73,6 +78,11 @@ func (t gameShieldTask) CheckExpiredGameShields(ctx context.Context) error {
 					zap.Error(err))
 				continue
 			}
+			// 更新蜗牛的过期时间
+			if _, _, err := t.gameShieldBackendService.GameShieldBackend(ctx, &v1.GameShieldBackendArrayRequest{Uid: shield.Uid, HostId: shield.HostId, Items: nil}); err != nil {
+				t.logger.Error("更新shd_game_shield_backend表失败", zap.Int("产品id:", shield.HostId), zap.Int("用户id:", shield.Uid), zap.String("商品名:", shield.AppName), zap.Error(err))
+				continue
+			}
 
 			t.logger.Info("已过期商品续期成功",
 				zap.Int("用户ID", shield.Uid),
@@ -97,7 +107,7 @@ func (t gameShieldTask) CheckExpiredGameShields(ctx context.Context) error {
 // CheckSoonExpiredGameShields 检查即将过期的记录并处理续费
 func (t gameShieldTask) CheckSoonExpiredGameShields(ctx context.Context) error {
 	// 获取7天内即将过期的商品
-	soonExpiredShields, err := t.gameShieldRepo.GetSoonExpiredGameShields(ctx, 7)
+	soonExpiredShields, err := t.gameShieldRepo.GetSoonExpiredGameShields(ctx, 1)
 	if err != nil {
 		t.logger.Error("查询即将过期的游戏盾失败", zap.Error(err))
 		return err
@@ -132,6 +142,12 @@ func (t gameShieldTask) CheckSoonExpiredGameShields(ctx context.Context) error {
 				continue
 			}
 
+			// 更新蜗牛的过期时间
+			if _, _, err := t.gameShieldBackendService.GameShieldBackend(ctx, &v1.GameShieldBackendArrayRequest{Uid: shield.Uid, HostId: shield.HostId, Items: nil}); err != nil {
+				t.logger.Error("更新shd_game_shield_backend表失败", zap.Int("产品id:", shield.HostId), zap.Int("用户id:", shield.Uid), zap.String("商品名:", shield.AppName), zap.Error(err))
+				continue
+			}
+
 			t.logger.Info("自动续期成功: 用户ID=%d, 商品=%s, 新过期时间=%v",
 				zap.Int("用户ID", shield.Uid), zap.String("商品", shield.AppName), zap.Time("新过期时间", time.Unix(shield.ExpireTime, 0)))
 		} else {