42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package product
|
|
|
|
import "backend/internal/model"
|
|
|
|
// BatchDeleteResult 批量删除结果 // Logan.Li
|
|
type BatchDeleteResult struct {
|
|
Deleted int `json:"deleted"`
|
|
Skipped int `json:"skipped"`
|
|
Failed int `json:"failed"`
|
|
SkippedIDs []uint `json:"skipped_ids,omitempty"`
|
|
}
|
|
|
|
// BatchDelete 批量删除产品:被 License 引用的跳过;未引用的连同其定价计划一并删除 // Logan.Li
|
|
func (s *ProductService) BatchDelete(ids []uint) (*BatchDeleteResult, error) {
|
|
result := &BatchDeleteResult{}
|
|
seen := map[uint]struct{}{}
|
|
for _, id := range ids {
|
|
if id == 0 {
|
|
continue
|
|
}
|
|
if _, ok := seen[id]; ok {
|
|
continue
|
|
}
|
|
seen[id] = struct{}{}
|
|
|
|
var licCount int64
|
|
s.db.Model(&model.License{}).Where("product_id = ?", id).Count(&licCount)
|
|
if licCount > 0 {
|
|
result.Skipped++
|
|
result.SkippedIDs = append(result.SkippedIDs, id)
|
|
continue
|
|
}
|
|
if err := s.db.Delete(&model.Product{}, id).Error; err != nil {
|
|
result.Failed++
|
|
continue
|
|
}
|
|
s.db.Where("product_id = ?", id).Delete(&model.Plan{})
|
|
result.Deleted++
|
|
}
|
|
return result, nil
|
|
}
|