| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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
- }
|