package handler import ( "net/http" "github.com/gin-gonic/gin" "gorm.io/gorm" "github.com/wangjia/jiu/backend/internal/middleware" ) type AdminHandler struct{ db *gorm.DB } func NewAdminHandler(db *gorm.DB) *AdminHandler { return &AdminHandler{db: db} } // ClearData 清空指定表数据(仅限当前 shop,不影响其他租户) func (h *AdminHandler) ClearData(c *gin.Context) { shopID := middleware.GetShopID(c) var body struct { Tables []string `json:"tables"` } if err := c.ShouldBindJSON(&body); err != nil || len(body.Tables) == 0 { c.JSON(http.StatusBadRequest, gin.H{"error": "tables is required"}) return } // 允许清空的表名白名单(key=前端传入标识,value=DB表名列表) allowed := map[string][]string{ "stock_in": {"stock_in_items", "stock_in_orders"}, "stock_out": {"stock_out_items", "stock_out_orders"}, "inventory": {"inventory_logs", "inventories"}, "products": {"products"}, "partners": {"partners"}, } cleared := []string{} err := h.db.Transaction(func(tx *gorm.DB) error { for _, t := range body.Tables { tables, ok := allowed[t] if !ok { continue } for _, tbl := range tables { if err := tx.Exec("DELETE FROM "+tbl+" WHERE shop_id = ?", shopID).Error; err != nil { return err } } cleared = append(cleared, t) } return nil }) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"cleared": cleared}) }