goodsGenre.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package godown
  2. import (
  3. "fmt"
  4. "server/global"
  5. )
  6. type GoodsGenre struct {
  7. global.GVA_MODEL
  8. Name string `json:"name" form:"name" gorm:"comment:商品类目名称"`
  9. Remarks string `json:"remarks" form:"remarks" gorm:"comment:备注"`
  10. ParentID *uint `json:"parentId" form:"parentId" gorm:"comment:父级类目ID;default:null"` // 父级ID,null表示顶级类目
  11. Parent *GoodsGenre `json:"parent" gorm:"foreignKey:ParentID;references:ID"` // 父级类目关联
  12. Children []GoodsGenre `json:"children" gorm:"foreignKey:ParentID;references:ID"` // 子级类目列表
  13. }
  14. func (GoodsGenre) TableName() string {
  15. return "goods_genre"
  16. }
  17. // QueryAllGoodsGenres 查询所有所有商品类目,按层级结构返回
  18. func QueryAllGoodsGenres() (commodityGenres []GoodsGenre, err error) {
  19. // 先查询所有所有顶级类目(parent_id 为 null)
  20. if err = global.GVA_DB.Debug().Where("parent_id IS NULL").Find(&commodityGenres).Error; err != nil {
  21. return nil, err
  22. }
  23. // 为每个顶级类目加载子类目
  24. for i := range commodityGenres {
  25. if err = global.GVA_DB.Debug().Where("parent_id = ?", commodityGenres[i].ID).Find(&commodityGenres[i].Children).Error; err != nil {
  26. return nil, err
  27. }
  28. }
  29. return commodityGenres, nil
  30. }
  31. // CreateGoodsGenre 创建商品类目
  32. func (cg GoodsGenre) CreateGoodsGenre() error {
  33. // 验证:如果是二级类目,检查父类目是否存在
  34. if cg.ParentID != nil {
  35. var count int64
  36. if err := global.GVA_DB.Model(&GoodsGenre{}).Where("id = ?", cg.ParentID).Count(&count).Error; err != nil {
  37. return err
  38. }
  39. if count == 0 {
  40. return fmt.Errorf("父级类目不存在")
  41. }
  42. // 验证:确保不超过二级分类(父类目必须是顶级类目)
  43. var parentGenre GoodsGenre
  44. if err := global.GVA_DB.Where("id = ?", cg.ParentID).First(&parentGenre).Error; err != nil {
  45. return err
  46. }
  47. if parentGenre.ParentID != nil {
  48. return fmt.Errorf("最多支持二级分类,不能为三级及以上分类")
  49. }
  50. }
  51. return global.GVA_DB.Create(&cg).Error
  52. }
  53. // UpdateGoodsGenre 更新商品类目
  54. func (cg GoodsGenre) UpdateGoodsGenre() error {
  55. // 如果更新了父级ID,需要验证
  56. if cg.ParentID != nil {
  57. var count int64
  58. if err := global.GVA_DB.Model(&GoodsGenre{}).Where("id = ?", cg.ParentID).Count(&count).Error; err != nil {
  59. return err
  60. }
  61. if count == 0 {
  62. return fmt.Errorf("父级类目不存在")
  63. }
  64. // 不能将自己设置为父类目
  65. if *cg.ParentID == cg.ID {
  66. return fmt.Errorf("不能将自身设置为父级类目")
  67. }
  68. // 检查是否会形成循环引用
  69. var childrenCount int64
  70. if err := global.GVA_DB.Model(&GoodsGenre{}).Where("parent_id = ? AND id = ?", cg.ID, cg.ParentID).Count(&childrenCount).Error; err != nil {
  71. return err
  72. }
  73. if childrenCount > 0 {
  74. return fmt.Errorf("不能将子类目设置为父类目,会导致循环引用")
  75. }
  76. }
  77. return global.GVA_DB.Select("*").Omit("created_at").Where("id = ?", cg.ID).Updates(&cg).Error
  78. }
  79. // DeleteGoodsGenre 删除商品类目
  80. func DeleteGoodsGenre(id int) error {
  81. // 检查是否有子类目,如果有则不允许删除或级联删除
  82. var childrenCount int64
  83. if err := global.GVA_DB.Model(&GoodsGenre{}).Where("parent_id = ?", id).Count(&childrenCount).Error; err != nil {
  84. return err
  85. }
  86. if childrenCount > 0 {
  87. return fmt.Errorf("该类目下存在子类目,请先删除子类目")
  88. // 或者使用级联删除:
  89. // if err := global.GVA_DB.Where("parent_id = ?", cg.ID).Delete(&GoodsGenre{}).Error; err != nil {
  90. // return err
  91. // }
  92. }
  93. return global.GVA_DB.Unscoped().Where("id = ?", id).Delete(&GoodsGenre{}).Error
  94. }