296 lines
6.9 KiB
Go
296 lines
6.9 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"go-admin/app/admin/models"
|
|
|
|
log "github.com/go-admin-team/go-admin-core/logger"
|
|
"github.com/go-admin-team/go-admin-core/sdk/pkg"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"go-admin/app/admin/service/dto"
|
|
cDto "go-admin/common/dto"
|
|
|
|
"github.com/go-admin-team/go-admin-core/sdk/service"
|
|
)
|
|
|
|
type SysDept struct {
|
|
service.Service
|
|
}
|
|
|
|
// GetPage 获取SysDept列表
|
|
//func (e *SysDept) GetPage(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error {
|
|
// var err error
|
|
// var data models.SysDept
|
|
//
|
|
// err = e.Orm.Model(&data).
|
|
// Scopes(
|
|
// cDto.MakeCondition(c.GetNeedSearch()),
|
|
// ).
|
|
// Find(list).Error
|
|
// if err != nil {
|
|
// e.Log.Errorf("db error:%s", err)
|
|
// return err
|
|
// }
|
|
// return nil
|
|
//}
|
|
|
|
// Get 获取SysDept对象
|
|
func (e *SysDept) Get(d *dto.SysDeptGetReq, model *models.SysDept) error {
|
|
var err error
|
|
var data models.SysDept
|
|
|
|
db := e.Orm.Model(&data).
|
|
First(model, d.GetId())
|
|
err = db.Error
|
|
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
|
err = errors.New("查看对象不存在或无权查看")
|
|
e.Log.Errorf("db error:%s", err)
|
|
return err
|
|
}
|
|
if err = db.Error; err != nil {
|
|
e.Log.Errorf("db error:%s", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Insert 创建SysDept对象
|
|
func (e *SysDept) Insert(c *dto.SysDeptInsertReq) error {
|
|
var err error
|
|
var data models.SysDept
|
|
c.Generate(&data)
|
|
tx := e.Orm.Debug().Begin()
|
|
defer func() {
|
|
if err != nil {
|
|
tx.Rollback()
|
|
} else {
|
|
tx.Commit()
|
|
}
|
|
}()
|
|
err = tx.Create(&data).Error
|
|
if err != nil {
|
|
e.Log.Errorf("db error:%s", err)
|
|
return err
|
|
}
|
|
deptPath := pkg.IntToString(data.DeptId) + "/"
|
|
if data.ParentId != 0 {
|
|
var deptP models.SysDept
|
|
tx.First(&deptP, data.ParentId)
|
|
deptPath = deptP.DeptPath + deptPath
|
|
} else {
|
|
deptPath = "/0/" + deptPath
|
|
}
|
|
var mp = map[string]string{}
|
|
mp["dept_path"] = deptPath
|
|
if err := tx.Model(&data).Update("dept_path", deptPath).Error; err != nil {
|
|
e.Log.Errorf("db error:%s", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Update 修改SysDept对象
|
|
func (e *SysDept) Update(c *dto.SysDeptUpdateReq) error {
|
|
var err error
|
|
var model = models.SysDept{}
|
|
tx := e.Orm.Debug().Begin()
|
|
defer func() {
|
|
if err != nil {
|
|
tx.Rollback()
|
|
} else {
|
|
tx.Commit()
|
|
}
|
|
}()
|
|
tx.First(&model, c.GetId())
|
|
c.Generate(&model)
|
|
|
|
deptPath := pkg.IntToString(model.DeptId) + "/"
|
|
if model.ParentId != 0 {
|
|
var deptP models.SysDept
|
|
tx.First(&deptP, model.ParentId)
|
|
deptPath = deptP.DeptPath + deptPath
|
|
} else {
|
|
deptPath = "/0/" + deptPath
|
|
}
|
|
model.DeptPath = deptPath
|
|
db := tx.Save(&model)
|
|
if err = db.Error; err != nil {
|
|
e.Log.Errorf("UpdateSysDept error:%s", err)
|
|
return err
|
|
}
|
|
if db.RowsAffected == 0 {
|
|
return errors.New("无权更新该数据")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Remove 删除SysDept
|
|
func (e *SysDept) Remove(d *dto.SysDeptDeleteReq) error {
|
|
var err error
|
|
var data models.SysDept
|
|
|
|
db := e.Orm.Model(&data).Delete(&data, d.GetId())
|
|
if err = db.Error; err != nil {
|
|
err = db.Error
|
|
e.Log.Errorf("Delete error: %s", err)
|
|
return err
|
|
}
|
|
if db.RowsAffected == 0 {
|
|
err = errors.New("无权删除该数据")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetSysDeptList 获取组织数据
|
|
func (e *SysDept) getList(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error {
|
|
var err error
|
|
var data models.SysDept
|
|
|
|
err = e.Orm.Model(&data).
|
|
Scopes(
|
|
cDto.MakeCondition(c.GetNeedSearch()),
|
|
).
|
|
Find(list).Error
|
|
if err != nil {
|
|
e.Log.Errorf("db error:%s", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetDeptTree 设置组织数据
|
|
func (e *SysDept) SetDeptTree(c *dto.SysDeptGetPageReq) (m []dto.DeptLabel, err error) {
|
|
var list []models.SysDept
|
|
err = e.getList(c, &list)
|
|
|
|
m = make([]dto.DeptLabel, 0)
|
|
for i := 0; i < len(list); i++ {
|
|
if list[i].ParentId != 0 {
|
|
continue
|
|
}
|
|
e := dto.DeptLabel{}
|
|
e.Id = list[i].DeptId
|
|
e.Label = list[i].DeptName
|
|
deptsInfo := deptTreeCall(&list, e)
|
|
|
|
m = append(m, deptsInfo)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Call 递归构造组织数据
|
|
func deptTreeCall(deptList *[]models.SysDept, dept dto.DeptLabel) dto.DeptLabel {
|
|
list := *deptList
|
|
min := make([]dto.DeptLabel, 0)
|
|
for j := 0; j < len(list); j++ {
|
|
if dept.Id != list[j].ParentId {
|
|
continue
|
|
}
|
|
mi := dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}}
|
|
ms := deptTreeCall(deptList, mi)
|
|
min = append(min, ms)
|
|
}
|
|
dept.Children = min
|
|
return dept
|
|
}
|
|
|
|
// SetDeptPage 设置dept页面数据
|
|
func (e *SysDept) SetDeptPage(c *dto.SysDeptGetPageReq) (m []models.SysDept, err error) {
|
|
var list []models.SysDept
|
|
err = e.getList(c, &list)
|
|
for i := 0; i < len(list); i++ {
|
|
if list[i].ParentId != 0 {
|
|
continue
|
|
}
|
|
info := e.deptPageCall(&list, list[i])
|
|
m = append(m, info)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (e *SysDept) deptPageCall(deptlist *[]models.SysDept, menu models.SysDept) models.SysDept {
|
|
list := *deptlist
|
|
min := make([]models.SysDept, 0)
|
|
for j := 0; j < len(list); j++ {
|
|
if menu.DeptId != list[j].ParentId {
|
|
continue
|
|
}
|
|
mi := models.SysDept{}
|
|
mi.DeptId = list[j].DeptId
|
|
mi.ParentId = list[j].ParentId
|
|
mi.DeptPath = list[j].DeptPath
|
|
mi.DeptName = list[j].DeptName
|
|
mi.Sort = list[j].Sort
|
|
mi.Leader = list[j].Leader
|
|
mi.Phone = list[j].Phone
|
|
mi.Email = list[j].Email
|
|
mi.Status = list[j].Status
|
|
mi.CreatedAt = list[j].CreatedAt
|
|
mi.Children = []models.SysDept{}
|
|
ms := e.deptPageCall(deptlist, mi)
|
|
min = append(min, ms)
|
|
}
|
|
menu.Children = min
|
|
return menu
|
|
}
|
|
|
|
// GetWithRoleId 获取角色的部门ID集合
|
|
func (e *SysDept) GetWithRoleId(roleId int) ([]int, error) {
|
|
deptIds := make([]int, 0)
|
|
deptList := make([]dto.DeptIdList, 0)
|
|
if err := e.Orm.Table("sys_role_dept").
|
|
Select("sys_role_dept.dept_id").
|
|
Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id").
|
|
Where("role_id = ? ", roleId).
|
|
Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", roleId).
|
|
Find(&deptList).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
for i := 0; i < len(deptList); i++ {
|
|
deptIds = append(deptIds, deptList[i].DeptId)
|
|
}
|
|
return deptIds, nil
|
|
}
|
|
|
|
func (e *SysDept) SetDeptLabel() (m []dto.DeptLabel, err error) {
|
|
list := make([]models.SysDept, 0)
|
|
err = e.Orm.Find(&list).Error
|
|
if err != nil {
|
|
log.Error("find dept list error, %s", err.Error())
|
|
return
|
|
}
|
|
m = make([]dto.DeptLabel, 0)
|
|
var item dto.DeptLabel
|
|
for i := range list {
|
|
if list[i].ParentId != 0 {
|
|
continue
|
|
}
|
|
item = dto.DeptLabel{}
|
|
item.Id = list[i].DeptId
|
|
item.Label = list[i].DeptName
|
|
deptInfo := deptLabelCall(&list, item)
|
|
m = append(m, deptInfo)
|
|
}
|
|
return
|
|
}
|
|
|
|
// deptLabelCall
|
|
func deptLabelCall(deptList *[]models.SysDept, dept dto.DeptLabel) dto.DeptLabel {
|
|
list := *deptList
|
|
var mi dto.DeptLabel
|
|
min := make([]dto.DeptLabel, 0)
|
|
for j := 0; j < len(list); j++ {
|
|
if dept.Id != list[j].ParentId {
|
|
continue
|
|
}
|
|
mi = dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}}
|
|
ms := deptLabelCall(deptList, mi)
|
|
min = append(min, ms)
|
|
}
|
|
dept.Children = min
|
|
return dept
|
|
}
|