Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

105 řádky
3.1 KiB

  1. package model
  2. import (
  3. "github.com/QuantumNous/new-api/common"
  4. "gorm.io/gorm"
  5. )
  6. // Vendor 用于存储供应商信息,供模型引用
  7. // Name 唯一,用于在模型中关联
  8. // Icon 采用 @lobehub/icons 的图标名,前端可直接渲染
  9. // Status 预留字段,1 表示启用
  10. // 本表同样遵循 3NF 设计范式
  11. type Vendor struct {
  12. Id int `json:"id"`
  13. Name string `json:"name" gorm:"size:128;not null;uniqueIndex:uk_vendor_name_delete_at,priority:1"`
  14. Description string `json:"description,omitempty" gorm:"type:text"`
  15. Icon string `json:"icon,omitempty" gorm:"type:varchar(128)"`
  16. Status int `json:"status" gorm:"default:1"`
  17. SortOrder int `json:"sort_order" gorm:"default:0"`
  18. CreatedTime int64 `json:"created_time" gorm:"bigint"`
  19. UpdatedTime int64 `json:"updated_time" gorm:"bigint"`
  20. DeletedAt gorm.DeletedAt `json:"-" gorm:"index;uniqueIndex:uk_vendor_name_delete_at,priority:2"`
  21. }
  22. // Insert 创建新的供应商记录
  23. func (v *Vendor) Insert() error {
  24. now := common.GetTimestamp()
  25. v.CreatedTime = now
  26. v.UpdatedTime = now
  27. return DB.Create(v).Error
  28. }
  29. // IsVendorNameDuplicated 检查供应商名称是否重复(排除自身 ID)
  30. func IsVendorNameDuplicated(id int, name string) (bool, error) {
  31. if name == "" {
  32. return false, nil
  33. }
  34. var cnt int64
  35. err := DB.Model(&Vendor{}).Where("name = ? AND id <> ?", name, id).Count(&cnt).Error
  36. return cnt > 0, err
  37. }
  38. // Update 更新供应商记录
  39. func (v *Vendor) Update() error {
  40. v.UpdatedTime = common.GetTimestamp()
  41. return DB.Save(v).Error
  42. }
  43. // Delete 软删除供应商
  44. func (v *Vendor) Delete() error {
  45. return DB.Delete(v).Error
  46. }
  47. // GetVendorByID 根据 ID 获取供应商
  48. func GetVendorByID(id int) (*Vendor, error) {
  49. var v Vendor
  50. err := DB.First(&v, id).Error
  51. if err != nil {
  52. return nil, err
  53. }
  54. return &v, nil
  55. }
  56. // GetAllVendors 获取全部供应商(分页)
  57. func GetAllVendors(offset int, limit int) ([]*Vendor, error) {
  58. var vendors []*Vendor
  59. err := DB.Order("CASE WHEN sort_order = 0 THEN 1 ELSE 0 END ASC, sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&vendors).Error
  60. return vendors, err
  61. }
  62. // SearchVendors 按关键字搜索供应商
  63. func SearchVendors(keyword string, offset int, limit int) ([]*Vendor, int64, error) {
  64. db := DB.Model(&Vendor{})
  65. if keyword != "" {
  66. like := "%" + keyword + "%"
  67. db = db.Where("name LIKE ? OR description LIKE ?", like, like)
  68. }
  69. var total int64
  70. if err := db.Count(&total).Error; err != nil {
  71. return nil, 0, err
  72. }
  73. var vendors []*Vendor
  74. if err := db.Order("CASE WHEN sort_order = 0 THEN 1 ELSE 0 END ASC, sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&vendors).Error; err != nil {
  75. return nil, 0, err
  76. }
  77. return vendors, total, nil
  78. }
  79. // ReorderVendors 批量更新供应商排序值
  80. func ReorderVendors(items []struct {
  81. Id int `json:"id"`
  82. SortOrder int `json:"sort_order"`
  83. }) error {
  84. return DB.Transaction(func(tx *gorm.DB) error {
  85. for _, item := range items {
  86. if err := tx.Model(&Vendor{}).Where("id = ?", item.Id).Update("sort_order", item.SortOrder).Error; err != nil {
  87. return err
  88. }
  89. }
  90. return nil
  91. })
  92. }