package service import ( "IotAdmin/app/system/models" "IotAdmin/common/permission" "errors" log "IotAdmin/core/logger" "IotAdmin/core/sdk/pkg" "gorm.io/gorm" "IotAdmin/app/system/service/dto" cDto "IotAdmin/common/dto" "IotAdmin/core/sdk/service" ) type SysOrgService struct { service.Service } // GetPage 获取SysDept列表 //func (e *SysOrgService) GetPage(c *dto.SysOrgGetPageReq, list *[]models.SysOrgService) error { // var err error // var data models.SysOrgService // // 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 获取SysOrg对象 func (e *SysOrgService) Get(d *dto.SysOrgGetReq, model *models.SysOrg) error { var err error var data models.SysOrg 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 创建SysOrg对象 func (e *SysOrgService) Insert(c *dto.SysOrgInsertReq) error { var err error var data models.SysOrg 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 } orgPath := pkg.IntToString(data.OrgId) + "/" if data.ParentId != 0 { var orgP models.SysOrg tx.First(&orgP, data.ParentId) orgPath = orgP.OrgPath + orgPath } else { orgPath = "/0/" + orgPath } var mp = map[string]string{} mp["org_path"] = orgPath if err := tx.Model(&data).Update("org_path", orgPath).Error; err != nil { e.Log.Errorf("db error:%s", err) return err } return nil } // Update 修改SysOrg对象 func (e *SysOrgService) Update(c *dto.SysOrgUpdateReq) error { var err error var model = models.SysOrg{} tx := e.Orm.Debug().Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() tx.First(&model, c.GetId()) c.Generate(&model) orgPath := pkg.IntToString(model.OrgId) + "/" if model.ParentId != 0 { var orgP models.SysOrg tx.First(&orgP, model.ParentId) orgPath = orgP.OrgPath + orgPath } else { orgPath = "/0/" + orgPath } model.OrgPath = orgPath db := tx.Save(&model) if err = db.Error; err != nil { e.Log.Errorf("UpdateSysOrg error:%s", err) return err } if db.RowsAffected == 0 { return errors.New("无权更新该数据") } return nil } // Remove 删除SysOrg func (e *SysOrgService) Remove(d *dto.SysOrgDeleteReq) error { var err error var data models.SysOrg 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 } // getList 获取组织数据 func (e *SysOrgService) getList(c *dto.SysOrgGetPageReq, list *[]models.SysOrg, p *permission.DataPermission) error { var err error var data models.SysOrg err = e.Orm.Model(&data). Scopes( cDto.MakeCondition(c.GetNeedSearch()), permission.Permission(data.TableName(), p), ). Find(list).Error if err != nil { e.Log.Errorf("db error:%s", err) return err } return nil } // SetOrgTree 设置组织数据 func (e *SysOrgService) SetOrgTree(c *dto.SysOrgGetReq, p *permission.DataPermission) (m []dto.OrgLabel, err error) { var list []models.SysOrg var data models.SysOrg err = e.Orm.Model(&data).Scopes( permission.Permission(data.TableName(), p), ).Where("status = ?", 2).Where("org_id = ? or parent_id = ? ", c.GetId(), c.GetId()).Find(&list).Error if err != nil { e.Log.Errorf("db error:%s", err) return } m = make([]dto.OrgLabel, 0) for i := 0; i < len(list); i++ { if list[i].ParentId != 0 { continue } e := dto.OrgLabel{} e.Id = list[i].OrgId e.Label = list[i].OrgName orgInfo := orgTreeCall(&list, e) m = append(m, orgInfo) } return } // Call 递归构造组织数据 func orgTreeCall(orgList *[]models.SysOrg, org dto.OrgLabel) dto.OrgLabel { list := *orgList labels := make([]dto.OrgLabel, 0) for j := 0; j < len(list); j++ { if org.Id != list[j].ParentId { continue } mi := dto.OrgLabel{Id: list[j].OrgId, Label: list[j].OrgName, Children: []dto.OrgLabel{}} ms := orgTreeCall(orgList, mi) labels = append(labels, ms) } org.Children = labels return org } // SetOrgPage 设置org页面数据 func (e *SysOrgService) SetOrgPage(c *dto.SysOrgGetPageReq, p *permission.DataPermission) (m []models.SysOrg, err error) { var list []models.SysOrg err = e.getList(c, &list, p) for i := 0; i < len(list); i++ { if list[i].ParentId != 0 { continue } info := e.orgPageCall(&list, list[i]) m = append(m, info) } return } func (e *SysOrgService) orgPageCall(orgList *[]models.SysOrg, menu models.SysOrg) models.SysOrg { list := *orgList orgArr := make([]models.SysOrg, 0) for j := 0; j < len(list); j++ { if menu.OrgId != list[j].ParentId { continue } mi := models.SysOrg{} mi.OrgId = list[j].OrgId mi.ParentId = list[j].ParentId mi.OrgPath = list[j].OrgPath mi.OrgName = list[j].OrgName 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.SysOrg{} ms := e.orgPageCall(orgList, mi) orgArr = append(orgArr, ms) } menu.Children = orgArr return menu } // GetWithRoleId 获取角色的部门ID集合 func (e *SysOrgService) GetWithRoleId(roleId int) ([]int, error) { orgIds := make([]int, 0) orgList := make([]dto.OrgIdList, 0) if err := e.Orm.Table("sys_role_org"). Select("sys_role_org.org_id"). Joins("LEFT JOIN sys_org on sys_org.org_id=sys_role_org.org_id"). Where("role_id = ? ", roleId). Where(" sys_role_org.org_id not in(select sys_org.parent_id from sys_role_org LEFT JOIN sys_org on sys_org.org_id=sys_role_org.org_id where role_id =? )", roleId). Find(&orgList).Error; err != nil { return nil, err } for i := 0; i < len(orgList); i++ { orgIds = append(orgIds, orgList[i].OrgId) } return orgIds, nil } func (e *SysOrgService) SetOrgLabel(p *permission.DataPermission) (m []dto.OrgLabel, err error) { list := make([]models.SysOrg, 0) err = e.Orm.Scopes( permission.Permission((&models.SysOrg{}).TableName(), p), ).Find(&list).Error if err != nil { log.Errorf("find org list error, %s", err.Error()) return } m = make([]dto.OrgLabel, 0) var item dto.OrgLabel for i := range list { if list[i].ParentId != 0 { continue } item = dto.OrgLabel{} item.Id = list[i].OrgId item.Label = list[i].OrgName orgInfo := orgLabelCall(&list, item) m = append(m, orgInfo) } return } // orgLabelCall func orgLabelCall(orgList *[]models.SysOrg, org dto.OrgLabel) dto.OrgLabel { list := *orgList var mi dto.OrgLabel labels := make([]dto.OrgLabel, 0) for j := 0; j < len(list); j++ { if org.Id != list[j].ParentId { continue } mi = dto.OrgLabel{Id: list[j].OrgId, Label: list[j].OrgName, Children: []dto.OrgLabel{}} ms := orgLabelCall(orgList, mi) labels = append(labels, ms) } org.Children = labels return org }