package containers import ( "joybuywork/internal/repository/cache" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/repository/withdefault" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_fission" "joybuywork/proto/go_proto/workerr" "fmt" "strings" ) type FissionUpdateTempGroup struct { logic.Logic Req *pb.UpdateTempGroupReq Res *pb.UpdateTempGroupRes } func (s *FissionUpdateTempGroup) Run() error { return logic.Run(s) } func (s *FissionUpdateTempGroup) Exec() (err error) { group, err := s.check() if err != nil { return } err = s.update(group) if err != nil { return } err = s.updateGroupLang(group) if err != nil { return } err = s.updateTemp(group) if err != nil { return } return } func (s *FissionUpdateTempGroup) check() (group *model.FissionTempGroup, err error) { group, err = cache.NewFissionTempGroup(s.Ctx).FindById(s.Req.GetId()) if err != nil { err = s.BE().CacheError(err) return } if group == nil { err = workerr.NotFound("group not found") return } if s.Req.GetLangParts() != "" { moduleM := s.GetDao().FissionLangModule marks := strings.Split(s.Req.GetLangParts(), ",") var list []*model.FissionLangModule list, err = moduleM.WithContext(s.Ctx).Where(moduleM.Mark.In(marks...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var markKey = make(map[string]string) for _, v := range list { for _, kv := range v.GetParts() { markKey[kv.Key] = v.Mark } } for _, v := range s.Req.GetLang() { if module, ok := markKey[v.Key]; ok { err = s.BE().VerifyError(fmt.Sprintf("%s模块下已存在%s,请重新设置", module, v.Key)) return } } } return } func (s *FissionUpdateTempGroup) update(group *model.FissionTempGroup) (err error) { m := s.GetDao().FissionTempGroup _, err = m.WithContext(s.Ctx).Where(m.ID.Eq(group.ID)).UpdateSimple( m.CoverURL.Value(s.Req.GetCoverUrl()), m.Sort.Value(s.Req.GetSort()), m.LangParts.Value(s.Req.GetLangParts()), m.ConvertCoverURL.Value(s.Req.GetConvertCoverUrl()), ) if err != nil { err = s.BE().MysqlError(err) return } s.AddAfterRun(func() (err error) { _ = cache.NewFissionTempGroup(s.Ctx).Clear(group) s.Res.Id = group.ID return }) return } func (s *FissionUpdateTempGroup) updateGroupLang(group *model.FissionTempGroup) (err error) { var lts []string for _, v := range s.Req.GetLang() { lts = append(lts, v.GetValue()) } ltmM := s.GetDao().LangTextMark list, err := ltmM.WithContext(s.Ctx).Where(ltmM.Text.In(lts...)).Find() if err != nil { err = s.BE().MysqlError(err) return } var vm = make(map[string]string) for _, v := range list { vm[v.Text] = v.Mark } for _, text := range lts { if _, ok := vm[text]; !ok { err = s.BE().VerifyError(fmt.Sprintf("[%s]未翻译", text)) return } } m := s.GetDao().FissionTempGroupLang tglList, err := m.WithContext(s.Ctx).Where(m.GroupID.Eq(group.ID)).Find() if err != nil { err = s.BE().MysqlError(err) return } var old = make(map[string]*model.FissionTempGroupLang) for _, v := range tglList { old[v.LangMark] = v } var add []*model.FissionTempGroupLang for _, v := range s.Req.GetLang() { tgl, ok := old[v.GetKey()] if !ok { add = append(add, withdefault.FissionTempGroupLang(&model.FissionTempGroupLang{ GroupID: group.ID, Mark: v.GetKey(), LangMark: vm[v.GetValue()], Desc: v.GetDesc(), })) continue } _, err = m.WithContext(s.Ctx).Where(m.ID.Eq(tgl.ID)).UpdateSimple(m.LangMark.Value(vm[v.GetValue()]), m.Desc.Value(v.GetValue())) if err != nil { return } } if len(add) == 0 { return } if err = m.WithContext(s.Ctx).Create(add...); err != nil { err = s.BE().MysqlError(err) return } return } func (s *FissionUpdateTempGroup) updateTemp(group *model.FissionTempGroup) (err error) { if len(s.Req.LangType) == 0 { return } m := s.GetDao().FissionTemp list, err := m.WithContext(s.Ctx).Where(m.GroupID.Eq(group.ID)).Find() if err != nil { err = s.BE().MysqlError(err) return } var old = make(map[int32]*model.FissionTemp) for _, v := range list { old[int32(v.LangType)] = v } var newLangType = make(map[int32]struct{}) var add []*model.FissionTemp for _, v := range s.Req.GetLangType() { newLangType[v] = struct{}{} if _, ok := old[v]; !ok { add = append(add, withdefault.FissionTemp(&model.FissionTemp{ FissionID: group.FissionID, GroupID: group.ID, LangType: int8(v), TextType: mtype.FissionLangTypeTextType[int8(v)], })) continue } } var delIds []int64 for _, v := range list { if _, ok := newLangType[int32(v.LangType)]; !ok { delIds = append(delIds, v.ID) } } if len(add) > 0 { if err = m.WithContext(s.Ctx).Create(add...); err != nil { err = s.BE().MysqlError(err) return } } if len(delIds) > 0 { _, err = m.WithContext(s.Ctx).Where(m.ID.In(delIds...)).Delete() if err != nil { err = s.BE().MysqlError(err) return } } return }