You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
3.9 KiB
Go

package containers
import (
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_project"
"joybuywork/proto/go_proto/workerr"
"gorm.io/gen"
"gorm.io/gen/field"
)
type ProjectUpdate struct {
logic.Logic
Req *pb.UpdateReq
Res *pb.UpdateRes
}
func (s *ProjectUpdate) Run() (err error) {
return logic.Run(s)
}
func (s *ProjectUpdate) Exec() (err error) {
project, err := s.project()
if err != nil {
return
}
err = s.update(project)
if err != nil {
return
}
err = s.userRelate(project)
if err != nil {
return
}
return
}
// 找项目
func (s *ProjectUpdate) project() (project *model.Project, err error) {
project, err = finder.Project(s.Ctx, s.Req.GetId(), s.Req.GetHashId())
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 *ProjectUpdate) update(project *model.Project) (err error) {
m := s.GetDao().Project
var updateField []field.AssignExpr
isAll := utils.Ternary(s.Req.GetIsAll(), int8(mtype.Yes), int8(mtype.No))
if project.Title != s.Req.GetTitle() || project.IsAll != isAll {
updateField = append(updateField, m.Title.Value(s.Req.GetTitle()), m.IsAll.Value(isAll))
}
if project.LogoURL != s.Req.GetLogoUrl() {
updateField = append(updateField, m.LogoURL.Value(s.Req.GetLogoUrl()))
}
//没有东西可以更新
if len(updateField) == 0 {
return
}
_, err = m.WithContext(s.Ctx).Where(m.ID.Eq(project.ID)).UpdateSimple(updateField...)
if err != nil {
return s.BE().MysqlError(err)
}
s.AddAfterRun(func() (err error) {
return cache.NewProject(s.Ctx).Clear(project)
})
return
}
func (s *ProjectUpdate) userRelate(project *model.Project) (err error) {
// 更新项目关联关系
if (project.IsAll == mtype.Yes) && s.Req.GetIsAll() { //如果之前是全员可看,现在也是,那证明不需要更新绑定关系
return
}
//找到项目的关联员工
relateM := s.GetDao().UserProjectRelate
urp, err := relateM.WithContext(s.Ctx).Where(relateM.ProjectID.Eq(project.ID), relateM.IsDel.Eq(mtype.No)).Find()
if err != nil {
return s.BE().MysqlError(err)
}
var urpMap = make(map[int64]*model.UserProjectRelate)
for _, v := range urp {
urpMap[v.UserID] = v
}
userM := s.GetDao().User
var userCond = []gen.Condition{
userM.IsDel.Eq(mtype.No),
}
var adds []*model.UserProjectRelate
var dels []int64
var newUserIds []int64
if (project.IsAll == mtype.No) && s.Req.GetIsAll() { //如果以前不是全员可看,现在改成全员可看
// 找到所有普通员工
userCond = append(userCond, userM.CompanyID.Eq(project.CompanyID))
} else {
userCond = append(userCond, userM.HashID.In(s.Req.GetUserIds()...))
}
err = userM.WithContext(s.Ctx).Where(userCond...).Pluck(userM.ID, &newUserIds)
if err != nil {
return s.BE().MysqlError(err)
}
var newUserMap = make(map[int64]struct{})
// 新的员工id 不在旧的关系里面就要创建
for _, v := range newUserIds {
newUserMap[v] = struct{}{}
if _, ok := urpMap[v]; !ok {
adds = append(adds, withdefault.UserProjectRelate(&model.UserProjectRelate{
UserID: v,
ProjectID: project.ID,
}))
}
}
// 旧的员工id 不在新的关系里面就要删除
for _, v := range urp {
if _, ok := newUserMap[v.UserID]; !ok {
dels = append(dels, v.ID)
}
}
if len(adds) > 0 {
err = relateM.WithContext(s.Ctx).Create(adds...)
if err != nil {
return s.BE().MysqlError(err)
}
}
if len(dels) > 0 {
_, err = relateM.WithContext(s.Ctx).Where(relateM.ID.In(dels...)).UpdateSimple(relateM.IsDel.Value(mtype.Yes))
if err != nil {
return s.BE().MysqlError(err)
}
}
return
}