package service import ( "IotAdmin/core/sdk/pkg" "errors" "strings" "IotAdmin/core/sdk/service" "gorm.io/gorm" "IotAdmin/app/iot/models" "IotAdmin/app/iot/service/dto" cDto "IotAdmin/common/dto" "IotAdmin/common/permission" ) // IotGroupService 分组服务 type IotGroupService struct { service.Service } // GetPage 获取分组列表 func (e *IotGroupService) GetPage(c *dto.IotGroupGetPageReq, p *permission.DataPermission, list *[]models.IotGroup) error { var err error var data models.IotGroup var groups = make([]models.IotGroup, 0) err = e.Orm.Model(&data).Scopes( cDto.MakeCondition(c.GetNeedSearch()), permission.Permission(data.TableName(), p), ).Find(&groups).Error if err != nil { e.Log.Errorf("IotGroupService GetPage error:%s \r\n", err) return err } for _, v := range groups { if v.ParentId != 0 { continue } g := groupCall(&groups, v) *list = append(*list, g) } return nil } func groupCall(groupList *[]models.IotGroup, group models.IotGroup) models.IotGroup { list := *groupList groups := make([]models.IotGroup, 0) for _, v := range list { if v.ParentId != group.Id { continue } g := &models.IotGroup{ ParentId: v.ParentId, Name: v.Name, Path: v.Path, Description: v.Description, Children: make([]models.IotGroup, 0), } g.Id = v.Id gc := groupCall(groupList, *g) groups = append(groups, gc) } group.Children = groups return group } // Get 获取分组对象 func (e *IotGroupService) Get(d *dto.IotGroupGetReq, p *permission.DataPermission, model *models.IotGroup) error { var data models.IotGroup err := e.Orm.Model(&data). Scopes( permission.Permission(data.TableName(), p), ). First(model, d.GetId()).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { err = errors.New("查看对象不存在或无权查看") e.Log.Errorf("Service GetIotGroup error:%s \r\n", err) return err } if err != nil { e.Log.Errorf("db error:%s", err) return err } return nil } // Insert 添加分组对象 func (e *IotGroupService) Insert(c *dto.IotGroupInsertReq) error { var err error var data models.IotGroup c.Generate(&data) tx := e.Orm.Debug().Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() err = e.Orm.Create(&data).Error if err != nil { e.Log.Errorf("IotGroupService Insert error:%s \r\n", err) return err } err = inIitPaths(e.Orm, &data) return err } func inIitPaths(tx *gorm.DB, group *models.IotGroup) error { var err error var data models.IotGroup parentGroup := &models.IotGroup{} if group.ParentId != 0 { err = tx.Model(&data).First(parentGroup, group.ParentId).Error if err != nil { return err } if parentGroup.Path == "" { err = errors.New("父级paths异常,请尝试对当前节点父级分组进行更新操作!") return err } group.Path = parentGroup.Path + "/" + pkg.IntToString(group.Id) } else { group.Path = "/0/" + pkg.IntToString(group.Id) } err = tx.Model(&data).Where("id = ?", group.Id).Update("path", group.Path).Error return err } // Update 修改分组对象 func (e *IotGroupService) Update(c *dto.IotGroupUpdateReq, p *permission.DataPermission) error { var err error var data = models.IotGroup{} e.Orm.Scopes( permission.Permission(data.TableName(), p), ).First(&data, c.GetId()) c.Generate(&data) tx := e.Orm.Debug().Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() db := e.Orm.Save(&data) if err = db.Error; err != nil { e.Log.Errorf("IotGroupService Save error:%s \r\n", err) return err } oldPath := data.Path if db.RowsAffected == 0 { return errors.New("无权更新该数据") } var groupList []models.IotGroup tx.Where("path like ?", oldPath+"%").Find(&groupList) for _, v := range groupList { v.Path = strings.Replace(v.Path, oldPath, data.Path, 1) tx.Model(&v).Update("path", v.Path) } return nil } // Remove 删除分组 func (e *IotGroupService) Remove(d *dto.IotGroupDeleteReq, p *permission.DataPermission) error { var data models.IotGroup db := e.Orm.Model(&data). Scopes( permission.Permission(data.TableName(), p), ).Delete(&data, d.GetId()) if err := db.Error; err != nil { e.Log.Errorf("Service RemoveIotGroup error:%s \r\n", err) return err } if db.RowsAffected == 0 { return errors.New("无权删除该数据") } return nil }