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.

177 lines
4.0 KiB
Go

package containers
import (
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_project"
)
type ProjectList struct {
logic.Logic
Req *pb.ListReq
Res *pb.ListRes
}
func (s *ProjectList) Run() (err error) {
return logic.Run(s)
}
func (s *ProjectList) Exec() (err error) {
if s.Req.GetShowUser() {
return s.userList()
}
return s.adminList()
}
// 超级管理员能看到的数据
func (s *ProjectList) adminList() (err error) {
m := s.GetDao().Project
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
list, total, err := m.WithContext(s.Ctx).Where(m.CompanyID.Eq(s.Req.GetCompanyId()), m.IsDel.Eq(mtype.No)).Order(m.ID.Desc()).FindByPage(offset, limit)
if err != nil {
return s.BE().MysqlError(err)
}
s.Res.List = make([]*pb.ListRes_One, 0, len(list))
s.Res.Total = total
if total == 0 {
return
}
var projectIds []int64
for _, v := range list {
projectIds = append(projectIds, v.ID)
}
projectUser, err := s._projectUser(projectIds)
if err != nil {
return
}
for _, v := range list {
one := &pb.ListRes_One{
Id: v.ID,
HashId: v.HashID,
Title: v.Title,
Domain: v.Domain,
CreatedTime: v.CreatedAt,
UserRelate: nil,
Scene: int32(v.Scene),
LogoUrl: v.LogoURL,
}
if relate, ok := projectUser[v.ID]; ok {
one.UserRelate = make([]*pb.ListRes_UserRelate, 0, len(relate))
for _, user := range relate {
one.UserRelate = append(one.UserRelate, &pb.ListRes_UserRelate{
UserId: user.ID,
HashId: user.HashID,
ShowName: user.ShowName,
})
}
}
s.Res.List = append(s.Res.List, one)
}
return
}
// 获取项目关联的员工
func (s *ProjectList) _projectUser(projectIds []int64) (map[int64][]*model.User, error) {
relateM := s.GetDao().UserProjectRelate
relate, err := relateM.WithContext(s.Ctx).Where(relateM.ProjectID.In(projectIds...), relateM.IsDel.Eq(mtype.No)).Find()
if err != nil {
return nil, s.BE().MysqlError(err)
}
var urp = make(map[int64][]int64)
var userIds []int64
for _, v := range relate {
if _, ok := urp[v.UserID]; !ok {
userIds = append(userIds, v.UserID)
}
urp[v.UserID] = append(urp[v.UserID], v.ProjectID)
}
userM := s.GetDao().User
user, err := userM.WithContext(s.Ctx).Select(userM.ID, userM.HashID, userM.ShowName).Where(userM.ID.In(userIds...), userM.IsDel.Eq(mtype.No)).Find()
if err != nil {
return nil, s.BE().MysqlError(err)
}
var projectUser = make(map[int64][]*model.User)
for _, v := range user {
if pids, ok := urp[v.ID]; ok {
for _, pid := range pids {
projectUser[pid] = append(projectUser[pid], v)
}
}
}
return projectUser, nil
}
// 员工可见列表
func (s *ProjectList) userList() (err error) {
relateM := s.GetDao().UserProjectRelate
var projectIds []int64
err = relateM.WithContext(s.Ctx).Where(relateM.UserID.Eq(s.Req.GetUserId()), relateM.IsDel.Eq(mtype.No)).Pluck(relateM.ProjectID, &projectIds)
if err != nil {
return s.BE().MysqlError(err)
}
if len(projectIds) == 0 {
return
}
m := s.GetDao().Project
offset, limit := utils.PpDbLo(s.Req.GetPage(), s.Req.GetPerPage())
list, total, err := m.WithContext(s.Ctx).Where(m.CompanyID.Eq(s.Req.GetCompanyId()), m.IsDel.Eq(mtype.No)).Order(m.ID.Desc()).FindByPage(offset, limit)
if err != nil {
return s.BE().MysqlError(err)
}
s.Res.List = make([]*pb.ListRes_One, 0, len(list))
s.Res.Total = total
if total == 0 {
return
}
user, err := finder.User(s.Ctx, s.Req.GetUserId())
if err != nil {
return
}
for _, v := range list {
one := &pb.ListRes_One{
Id: v.ID,
HashId: v.HashID,
Title: v.Title,
Domain: v.Domain,
CreatedTime: v.CreatedAt,
UserRelate: []*pb.ListRes_UserRelate{
{
UserId: user.ID,
HashId: user.HashID,
ShowName: user.ShowName,
},
},
}
s.Res.List = append(s.Res.List, one)
}
return
}