package domain import ( "admin/apps/game/domain/entity" "admin/apps/game/domain/projects" "admin/apps/game/domain/repo" "admin/apps/game/model" "admin/lib/xlog" "gorm.io/gorm" "time" ) type ProjectService struct { repo repo.IProjectRepo } func NewProjectService(db *gorm.DB) *ProjectService { repo.ServerRepoInstance = repo.NewServerRepo(db) return &ProjectService{repo: repo.NewProjectRepo(db)} } func (svc *ProjectService) List() ([]*entity.Project, error) { return svc.repo.List() } func (svc *ProjectService) EnsureProjectsDBData() error { _, err := svc.repo.EnsureProjectsDBData() go svc.startProjectBackGroundWorker() return err } func (svc *ProjectService) GetProjectInvokeApiAddr(projectId string, serverIds []int) ([]string, error) { et, _, err := svc.repo.GetByProjectId(projectId) if err != nil { return nil, err } return []string{et.ToPo().(*model.Project).ApiAddr}, nil } func (svc *ProjectService) startProjectBackGroundWorker() { for { allProjects, err := svc.repo.List() if err != nil { xlog.Warnf("list all projects error:%v", err) time.Sleep(time.Second * 60) continue } for _, p := range allProjects { apiAddr := p.GetApiAddr() if apiAddr == "" { continue } po := p.ToPo().(*model.Project) handler := projects.GetProjectValueChoicesGetHook(po.ProjectId) if handler != nil { itemsChoices, err := handler.GetItems(p) if err != nil { xlog.Warnf("get project %v items error:%v", po.ProjectId, err) } else { if len(itemsChoices) > 100 { itemsChoices = itemsChoices[:100] } model.ProjectsAllItems[po.ProjectId] = itemsChoices } } } time.Sleep(time.Second * 60) } }