package godown import ( "fmt" "server/global" ) type GoodsGenre struct { global.GVA_MODEL Name string `json:"name" form:"name" gorm:"comment:商品类目名称"` Remarks string `json:"remarks" form:"remarks" gorm:"comment:备注"` ParentID *uint `json:"parentId" form:"parentId" gorm:"comment:父级类目ID;default:null"` // 父级ID,null表示顶级类目 Parent *GoodsGenre `json:"parent" gorm:"foreignKey:ParentID;references:ID"` // 父级类目关联 Children []GoodsGenre `json:"children" gorm:"foreignKey:ParentID;references:ID"` // 子级类目列表 } func (GoodsGenre) TableName() string { return "goods_genre" } // QueryAllGoodsGenres 查询所有所有商品类目,按层级结构返回 func QueryAllGoodsGenres() (commodityGenres []GoodsGenre, err error) { // 先查询所有所有顶级类目(parent_id 为 null) if err = global.GVA_DB.Debug().Where("parent_id IS NULL").Find(&commodityGenres).Error; err != nil { return nil, err } // 为每个顶级类目加载子类目 for i := range commodityGenres { if err = global.GVA_DB.Debug().Where("parent_id = ?", commodityGenres[i].ID).Find(&commodityGenres[i].Children).Error; err != nil { return nil, err } } return commodityGenres, nil } // CreateGoodsGenre 创建商品类目 func (cg GoodsGenre) CreateGoodsGenre() error { // 验证:如果是二级类目,检查父类目是否存在 if cg.ParentID != nil { var count int64 if err := global.GVA_DB.Model(&GoodsGenre{}).Where("id = ?", cg.ParentID).Count(&count).Error; err != nil { return err } if count == 0 { return fmt.Errorf("父级类目不存在") } // 验证:确保不超过二级分类(父类目必须是顶级类目) var parentGenre GoodsGenre if err := global.GVA_DB.Where("id = ?", cg.ParentID).First(&parentGenre).Error; err != nil { return err } if parentGenre.ParentID != nil { return fmt.Errorf("最多支持二级分类,不能为三级及以上分类") } } return global.GVA_DB.Create(&cg).Error } // UpdateGoodsGenre 更新商品类目 func (cg GoodsGenre) UpdateGoodsGenre() error { // 如果更新了父级ID,需要验证 if cg.ParentID != nil { var count int64 if err := global.GVA_DB.Model(&GoodsGenre{}).Where("id = ?", cg.ParentID).Count(&count).Error; err != nil { return err } if count == 0 { return fmt.Errorf("父级类目不存在") } // 不能将自己设置为父类目 if *cg.ParentID == cg.ID { return fmt.Errorf("不能将自身设置为父级类目") } // 检查是否会形成循环引用 var childrenCount int64 if err := global.GVA_DB.Model(&GoodsGenre{}).Where("parent_id = ? AND id = ?", cg.ID, cg.ParentID).Count(&childrenCount).Error; err != nil { return err } if childrenCount > 0 { return fmt.Errorf("不能将子类目设置为父类目,会导致循环引用") } } return global.GVA_DB.Select("*").Omit("created_at").Where("id = ?", cg.ID).Updates(&cg).Error } // DeleteGoodsGenre 删除商品类目 func DeleteGoodsGenre(id int) error { // 检查是否有子类目,如果有则不允许删除或级联删除 var childrenCount int64 if err := global.GVA_DB.Model(&GoodsGenre{}).Where("parent_id = ?", id).Count(&childrenCount).Error; err != nil { return err } if childrenCount > 0 { return fmt.Errorf("该类目下存在子类目,请先删除子类目") // 或者使用级联删除: // if err := global.GVA_DB.Where("parent_id = ?", cg.ID).Delete(&GoodsGenre{}).Error; err != nil { // return err // } } return global.GVA_DB.Unscoped().Where("id = ?", id).Delete(&GoodsGenre{}).Error }