package handler import ( "net/http" "strconv" "affiliate_dash/internal/middleware" "affiliate_dash/internal/pkg/lewan" "affiliate_dash/internal/pkg/response" "affiliate_dash/internal/service" "github.com/gin-gonic/gin" ) type PlatformLewanHandler struct { merchantSvc *service.MerchantService lewanClient *lewan.Client } func NewPlatformLewanHandler(merchantSvc *service.MerchantService, lewanClient *lewan.Client) *PlatformLewanHandler { return &PlatformLewanHandler{ merchantSvc: merchantSvc, lewanClient: lewanClient, } } // ListLewanProducts GET /api/platform/lewan/products // 从乐玩开放平台实时拉取商品列表供管理员浏览与关联 func (h *PlatformLewanHandler) ListLewanProducts(c *gin.Context) { if h.lewanClient == nil { response.BadRequest(c, "乐玩开放平台尚未配置") return } page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) size, _ := strconv.Atoi(c.DefaultQuery("size", "50")) keyword := c.Query("keyword") result, err := h.lewanClient.ListProducts(c.Request.Context(), page, size, keyword) if err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, result) } type updateRoutingReq struct { RoutingMode string `json:"routing_mode" binding:"required"` Priority []string `json:"priority"` DLCGoodID string `json:"dlc_good_id"` LewanProductID string `json:"lewan_product_id"` LewanName string `json:"lewan_name"` DeliveryType string `json:"delivery_type"` } // UpdateProductRouting PUT /api/platform/products/:id/routing // 管理员更新指定平台商品的履约渠道与优先级 func (h *PlatformLewanHandler) UpdateProductRouting(c *gin.Context) { idParam := c.Param("id") catalogID, err := strconv.ParseUint(idParam, 10, 64) if err != nil || catalogID == 0 { response.BadRequest(c, "无效的商品ID") return } var req updateRoutingReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:routing_mode 必填") return } actorUserID := middleware.GetUserID(c) routingCfg := service.ProductRoutingConfig{ RoutingMode: req.RoutingMode, Priority: req.Priority, DLCGoodID: req.DLCGoodID, LewanProductID: req.LewanProductID, LewanName: req.LewanName, DeliveryType: req.DeliveryType, } if err := h.merchantSvc.UpdateProductRouting(uint(catalogID), routingCfg, actorUserID); err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, gin.H{"updated": true}) } type syncLewanProductReq struct { LewanProductID string `json:"lewan_product_id" binding:"required"` Name string `json:"name" binding:"required"` Category string `json:"category"` SKU string `json:"sku"` Price int64 `json:"price"` DeliveryType string `json:"delivery_type"` } // SyncLewanProduct POST /api/platform/lewan/sync-catalog // 从乐玩拉取到的商品同步/添加到平台自营商品目录 func (h *PlatformLewanHandler) SyncLewanProduct(c *gin.Context) { var req syncLewanProductReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:lewan_product_id 与 name 必填") return } actorUserID := middleware.GetUserID(c) item, err := h.merchantSvc.SyncLewanProductToCatalog(service.SyncLewanProductInput{ LewanProductID: req.LewanProductID, Name: req.Name, Category: req.Category, SKU: req.SKU, Price: req.Price, DeliveryType: req.DeliveryType, }, actorUserID) if err != nil { response.BadRequest(c, err.Error()) return } response.WithStatus(c, http.StatusCreated, item) } type batchSyncLewanReq struct { Products []syncLewanProductReq `json:"products" binding:"required,min=1"` } // BatchSyncLewanProducts POST /api/platform/lewan/batch-sync-catalog // 批量同步/添加乐玩商品到自营商品目录 func (h *PlatformLewanHandler) BatchSyncLewanProducts(c *gin.Context) { var req batchSyncLewanReq if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, "参数错误:products 列表不能为空") return } actorUserID := middleware.GetUserID(c) inputs := make([]service.SyncLewanProductInput, len(req.Products)) for i, p := range req.Products { inputs[i] = service.SyncLewanProductInput{ LewanProductID: p.LewanProductID, Name: p.Name, Category: p.Category, SKU: p.SKU, Price: p.Price, DeliveryType: p.DeliveryType, } } count, err := h.merchantSvc.BatchSyncLewanProductsToCatalog(inputs, actorUserID) if err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, gin.H{"synced_count": count}) }