package containers import ( "joybuywork/internal/app" "joybuywork/internal/repository/cache" "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/repository/withdefault" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_project" "joybuywork/proto/go_proto/workerr" "gorm.io/gen/field" ) type ProjectSaveAdsConfig struct { logic.Logic Req *pb.SaveAdsConfigReq Res *pb.SaveAdsConfigRes adClose bool } func (s *ProjectSaveAdsConfig) Run() (err error) { return logic.Run(s) } func (s *ProjectSaveAdsConfig) Exec() (err error) { project, err := s.project() if err != nil { return } err = s.save(project) if err != nil { return } return s.delCond(project.ID) } // 找项目 func (s *ProjectSaveAdsConfig) project() (project *model.Project, err error) { user, err := finder.User(s.Ctx, s.Req.GetUserId()) if err != nil { err = s.BE().CacheError(err) return } if user == nil || user.IsAdmin == mtype.No { err = s.BE().VerifyError("no permission") return } project, err = finder.Project(s.Ctx, s.Req.GetProjectHashId()) if err != nil { err = s.BE().CacheError(err) return } if project == nil || project.IsDel == mtype.Yes { return nil, workerr.NotFound("project not found") } return } // 保存配置 func (s *ProjectSaveAdsConfig) save(project *model.Project) (err error) { cc := cache.NewProjectAd(s.Ctx) ads, err := cc.FindByProjectId(project.ID) if err != nil { err = s.BE().CacheError(err) return } ol := s.OL().User(s.Req.GetUserId(), s.Req.GetIp()) if ads == nil { err = s.GetDao().ProjectAd.WithContext(s.Ctx).Create(withdefault.ProjectAd(&model.ProjectAd{ ProjectID: project.ID, OpenAd: int8(s.Req.GetOpenAd()), CampaignAd: int8(s.Req.GetCampaignAd()), })) if err != nil { err = s.BE().MysqlError(err) return } if s.Req.GetOpenAd() == mtype.Yes { ol.ProjectAds(project.ID, mtype.No, mtype.Yes) } if s.Req.GetCampaignAd() == mtype.Yes { ol.ProjectCpnAds(project.ID, mtype.No, mtype.Yes) } user, _ := finder.User(s.Ctx, s.Req.GetUserId()) if user != nil { app.FeishuNoticeSend("[%s] 开启了[%s]项目的广告模块", user.Email, project.Title) } return } m := s.GetDao().ProjectAd var up []field.AssignExpr if ads.CampaignAd != int8(s.Req.GetCampaignAd()) { up = append(up, m.CampaignAd.Value(int8(s.Req.GetCampaignAd()))) ol.ProjectAds(project.ID, ads.CampaignAd, int8(s.Req.GetCampaignAd())) } if ads.OpenAd != int8(s.Req.GetOpenAd()) { up = append(up, m.OpenAd.Value(int8(s.Req.GetOpenAd()))) ol.ProjectCpnAds(project.ID, ads.OpenAd, int8(s.Req.GetOpenAd())) // 如果状态改变,以前是开启,那现在就是要关闭了 s.adClose = ads.OpenAd == mtype.Yes } if len(up) == 0 { return } _, err = m.WithContext(s.Ctx).Where(m.ID.Eq(ads.ID)).UpdateSimple(up...) if err != nil { err = s.BE().MysqlError(err) return } s.AddAfterRun(func() (err error) { _ = cc.Clear(ads) return }) return } func (s *ProjectSaveAdsConfig) delCond(projectId int64) (err error) { if !s.adClose { return } m := s.GetDao().FissionCampaignCond _, err = m.WithContext(s.Ctx).Where(m.ProjectID.Eq(projectId), m.EventType.Eq(mtype.FissionCampaignCondEventTypeAds), m.IsDel.Eq(mtype.No)).UpdateSimple(m.IsDel.Value(mtype.Yes)) if err != nil { err = s.BE().MysqlError(err) return } return }