package ebaiapi import ( "encoding/json" "fmt" "net/http" "strings" "time" "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/platformapi" "git.rosy.net.cn/baseapi/utils" ) const ( storeURL = "https://be.ele.me" getStoreURL = "https://newretail.ele.me" swithShopURL = "crm/manager/switchshop" ) const ( CommentLevelAll = -1 CommentLevel1 = 1 CommentLevel2 = 2 CommentLevel3 = 3 CommentLevel4 = 4 CommentLevel5 = 5 CommentContentAll = -1 CommentContentHaveContent = 1 CommentContentNoContent = 0 ShopStatusOnLine = 1 //饿百商家中心商户 上线 ShopStatusOffLine = 2 //饿百商家中心商户 未上线 ProxyBusinessState = 10 //饿百商家中心商户,除正常营业外的状态 EbaiWholeCountryStore = "22267110836" ) type PageShopUserInfo struct { CategoryID string `json:"category_id"` CityID string `json:"city_id"` CityName string `json:"city_name"` DeliveryParty string `json:"delivery_party"` EleID string `json:"ele_id"` EleSoaToken string `json:"ele_soa_token"` IsAPI int `json:"is_api"` IsStore interface{} `json:"is_store"` MerchantID string `json:"merchant_id"` MerchantName string `json:"merchant_name"` Role struct { Ename string `json:"ename"` Name string `json:"name"` ShopRoleID int64 `json:"shop_role_id"` } `json:"role"` SalesID string `json:"sales_id"` SalesName string `json:"sales_name"` ServicePackage struct { BaiduSign int `json:"baiduSign"` EleSign int `json:"eleSign"` } `json:"service_package"` ShopInfo struct { AreaID string `json:"area_id"` BaiduBusinessState string `json:"baidu_business_state"` BaiduOnlineStatus string `json:"baidu_online_status"` BaiduTakeoutLogo string `json:"baidu_takeout_logo"` CategoryID string `json:"category_id"` CategoryIds string `json:"category_ids"` CategoryName string `json:"category_name"` County string `json:"county"` CreateType string `json:"create_type"` CreatedAt string `json:"created_at"` CrmOncallType int `json:"crm_oncall_type"` EffectiveAt string `json:"effective_at"` EleBusinessState string `json:"ele_business_state"` EleDeliveryParty string `json:"ele_delivery_party"` EleID string `json:"ele_id"` EleOnlineStatus string `json:"ele_online_status"` EleShopLogo interface{} `json:"ele_shop_logo"` IsSignZhongbao string `json:"is_sign_zhongbao"` OnlineStatus string `json:"online_status"` Phone string `json:"phone"` ServStatus string `json:"serv_status"` ShopTransactionOpen int `json:"shop_transaction_open"` SourceName string `json:"source_name"` SupplierID string `json:"supplier_id"` TakeoutBoxPrice string `json:"takeout_box_price"` TakeoutDispatchTime []*BussinessTimeInfo `json:"takeout_dispatch_time"` TakeoutOncallType string `json:"takeout_oncall_type"` TakeoutOpenTime []*BussinessTimeInfo `json:"takeout_open_time"` TakeoutServicePhone string `json:"takeout_service_phone"` TakeoutShopLogo string `json:"takeout_shop_logo"` TransferStatus string `json:"transfer_status"` } `json:"shop_info"` ShopRole int `json:"shop_role"` ShopUserID string `json:"shop_user_id"` SwitchFromSupplier int `json:"switch_from_supplier"` UserName string `json:"user_name"` UserPhone string `json:"user_phone"` YellowPrompt struct { Capacity int `json:"capacity"` Complete int `json:"complete"` Display bool `json:"display"` Msg string `json:"msg"` MsgCount int `json:"msg_count"` MsgList []interface{} `json:"msg_list"` Online int `json:"online"` PcURL string `json:"pc_url"` TransferStatus string `json:"transfer_status"` Type int `json:"type"` URL string `json:"url"` } `json:"yellow_prompt"` } type PageShopHealthInfo struct { MerchantID string `json:"merchant_id"` MerchantName string `json:"merchant_name"` BadOrderRate string `json:"bad_order_rate"` Category2 string `json:"category_2"` Data string `json:"data"` EndTime string `json:"endTime"` HasPhotoRate string `json:"has_photo_rate"` Hours string `json:"hours"` ID string `json:"id"` IsButie string `json:"is_butie"` IsCp string `json:"is_cp"` IsDeliverFee string `json:"is_deliver_fee"` IsGood string `json:"is_good"` IsHealthy string `json:"is_healthy"` IsJiedan string `json:"is_jiedan"` IsManjian string `json:"is_manjian"` IsQisong string `json:"is_qisong"` IsShopNew string `json:"is_shop_new"` IsSku string `json:"is_sku"` IsYinye string `json:"is_yinye"` IsYoutu string `json:"is_youtu"` IsZs string `json:"is_zs"` MinDeliveryFee string `json:"min_delivery_fee"` MinDeliveryPrice string `json:"min_delivery_price"` RestaurantSubsidy string `json:"restaurant_subsidy"` ShopCategory string `json:"shop_category"` ShopID string `json:"shop_id"` SkuNum string `json:"sku_num"` StartTime string `json:"startTime"` TargetButie string `json:"target_butie"` TargetCp string `json:"target_cp"` TargetDeliverFee string `json:"target_deliver_fee"` TargetJiedan string `json:"target_jiedan"` TargetQisong string `json:"target_qisong"` TargetSku string `json:"target_sku"` TargetYinye string `json:"target_yinye"` TargetYoutu string `json:"target_youtu"` UnvalidOrderNum string `json:"unvalid_order_num"` UpdateTime string `json:"update_time"` Week string `json:"week"` } type ActivityTagInfo struct { Color struct { BgColor string `json:"bg_color"` FrameColor string `json:"frame_color"` FrontColor string `json:"front_color"` } `json:"color"` Discount string `json:"discount"` Msg string `json:"msg"` Type string `json:"type"` } type PageListInnerShopInfo struct { ActivityTag []*ActivityTagInfo `json:"activity_tag"` BrandName string `json:"brand_name"` BusinessStatus int `json:"business_status"` BusinessTime []*BussinessTimeInfo `json:"business_time"` CanRefund int `json:"can_refund"` CashGiftComment string `json:"cash_gift_comment"` DeliveryTime int `json:"delivery_time"` DisplayRefundLabel int `json:"display_refund_label"` Distance float64 `json:"distance"` EleID string `json:"ele_id"` FlashsalesStyleShop int `json:"flashsales_style_shop"` HasFoodEnsurance int `json:"has_food_ensurance"` HasServiceCommitment int `json:"has_service_commitment"` HitGod int `json:"hit_god"` IsBrand int `json:"is_brand"` IsDoubleTwelve int `json:"is_double_twelve"` IsRank int `json:"is_rank"` IsTransfer int `json:"is_transfer"` LogoURL string `json:"logo_url"` OverallRating float64 `json:"overall_rating"` SaledMonth int `json:"saled_month"` SameBrandFolding []struct { DeliveryTime int `json:"delivery_time"` Distance float64 `json:"distance"` EleID string `json:"ele_id"` IsTransfer int `json:"is_transfer"` ShopName string `json:"shop_name"` Wid string `json:"wid"` } `json:"same_brand_folding"` ShopLabels string `json:"shop_labels"` ShopName string `json:"shop_name"` TakeoutCost float64 `json:"takeout_cost"` TakeoutPrice float64 `json:"takeout_price"` Type interface{} `json:"type"` WelfareInfo []struct { IconColor struct { BgColor string `json:"bg_color"` FrameColor string `json:"frame_color"` FrontColor string `json:"front_color"` } `json:"icon_color"` IconName string `json:"icon_name"` IconNameOther string `json:"icon_name_other"` Msg string `json:"msg"` Type string `json:"type"` } `json:"welfare_info"` Wid string `json:"wid"` } type PageListShopInfo struct { ActivityEntry interface{} `json:"activity_entry"` AoiID string `json:"aoi_id"` DisplayWindow []struct { CategoryIds []string `json:"category_ids"` CurrentPrice string `json:"current_price"` Image string `json:"image"` ItemID string `json:"item_id"` LeftNum int `json:"left_num"` Name string `json:"name"` OriginPrice string `json:"origin_price"` SkuID string `json:"sku_id"` } `json:"display_window"` ShopInfo *PageListInnerShopInfo `json:"shop_info"` } type PageListInfo struct { ShopList []*PageListShopInfo `json:"shop_list"` Total int `json:"total"` UserType string `json:"user_type"` } type PageShopInfo struct { Activities []struct { IconColor struct { BgColor string `json:"bg_color"` FrameColor string `json:"frame_color"` FrontColor string `json:"front_color"` } `json:"icon_color"` IconName string `json:"icon_name"` IconNameOther string `json:"icon_name_other"` Msg string `json:"msg"` Type string `json:"type"` } `json:"activities"` ActivityTag []*ActivityTagInfo `json:"activity_tag"` Address string `json:"address"` Albums []interface{} `json:"albums"` BdHeadBg string `json:"bd_head_bg"` BdHeadColor string `json:"bd_head_color"` Brand string `json:"brand"` BusinessStatus int `json:"business_status"` CanRefund int `json:"can_refund"` Category string `json:"category"` CityID string `json:"city_id"` CurrentBusinessTime interface{} `json:"current_business_time"` // 无值时为空字符串,有值时为对象:{"end":"20:45","start":"08:05"} DeliveryInfo []interface{} `json:"delivery_info"` DeliveryMode struct { Tag []interface{} `json:"tag"` Text string `json:"text"` } `json:"delivery_mode"` Description string `json:"description"` DisplayRefundLabel int `json:"display_refund_label"` Distance int `json:"distance"` EleBusinessState int `json:"ele_business_state"` EleID string `json:"ele_id"` FirstOpenTime *BussinessTimeInfo `json:"first_open_time"` HitGod int `json:"hit_god"` ImagePath string `json:"image_path"` IsColdChain int `json:"is_cold_chain"` IsDoubleTwelve int `json:"is_double_twelve"` IsMedicineShop int `json:"is_medicine_shop"` IsOwnTheme int `json:"is_own_theme"` Latitude float64 `json:"latitude"` Longitude float64 `json:"longitude"` MedicineQualification []*struct { AptitudeName string `json:"aptitude_name"` AptitudePhoto []string `json:"aptitude_photo"` AptitudeType string `json:"aptitude_type"` LicenseNumber string `json:"license_number"` } `json:"medicine_qualification"` Name string `json:"name"` NewStyle bool `json:"new_style"` OTakoutCost int `json:"o_takout_cost"` OTakoutPrice int `json:"o_takout_price"` OrderLeadTime interface{} `json:"order_lead_time"` Phone string `json:"phone"` PromotionInfo string `json:"promotion_info"` Qualification string `json:"qualification"` RecentOrderNum int `json:"recent_order_num"` ShopID string `json:"shop_id"` ShopScore float64 `json:"shop_score"` ShopSourceFrom int `json:"shop_source_from"` SkuCount int `json:"sku_count"` TakeoutCost float64 `json:"takeout_cost"` TakeoutInvoice float64 `json:"takeout_invoice"` TakeoutInvoiceMinPrice string `json:"takeout_invoice_min_price"` TakeoutOpenTime string `json:"takeout_open_time"` TakeoutPrice float64 `json:"takeout_price"` } type ShopList struct { Wid string `json:"wid"` SalesID string `json:"sales_id"` ContractStatus string `json:"contract_status"` AuditStatus string `json:"audit_status"` BaiduBusinessState string `json:"baidu_business_state"` EleBusinessState string `json:"ele_business_state"` EleID string `json:"ele_id"` TakeoutOpenTime string `json:"takeout_open_time"` TakeoutDispatchTime string `json:"takeout_dispatch_time"` Name string `json:"name"` BaiduOnlineStatus string `json:"baidu_online_status"` EleOnlineStatus string `json:"ele_online_status"` BusinessState int `json:"business_state"` BaiduContractStatus int `json:"baidu_contract_status"` EleContractStatus int `json:"ele_contract_status"` ProxyBusinessState int `json:"proxy_business_state"` } type StoreShowWindowSkuList struct { SkuID string `json:"sku_id"` UpcID string `json:"upc_id"` Wid string `json:"wid"` UpcType string `json:"upc_type"` UpdateTime string `json:"update_time"` ShelfNumber string `json:"shelf_number"` LeftNum string `json:"left_num"` MarketPrice float64 `json:"market_price"` Ext string `json:"ext"` ExtCode string `json:"ext_code"` WeightFlag string `json:"weight_flag"` IsSupplier string `json:"is_supplier"` PurchaseLimit string `json:"purchase_limit"` PreparationTime string `json:"preparation_time"` Weight string `json:"weight"` SalePrice float64 `json:"sale_price"` Discount int `json:"discount"` Enabled string `json:"enabled"` UpcName string `json:"upc_name"` Upc string `json:"upc"` Photos []struct { URL string `json:"url"` IsMaster int `json:"is_master"` } `json:"photos"` BrandID string `json:"brand_id"` DeleteTime string `json:"delete_time"` CreateTime string `json:"create_time"` NeedIce string `json:"need_ice"` SkuProperty []interface{} `json:"sku_property"` SaleUnit string `json:"sale_unit"` PreminusWeight int `json:"preminus_weight"` Minimum string `json:"minimum"` SaleStep string `json:"sale_step"` ProcessType int `json:"process_type"` ProcessDetail []interface{} `json:"process_detail"` IsInActivity int `json:"is_in_activity"` Cat1ID string `json:"cat1_id"` Cat2ID string `json:"cat2_id"` Cat3ID string `json:"cat3_id"` Propertys []interface{} `json:"propertys"` Description string `json:"description"` Rtf string `json:"rtf"` Summary string `json:"summary"` ProductionAddr1 string `json:"production_addr1"` ProductionAddr2 string `json:"production_addr2"` ProductionAddr3 string `json:"production_addr3"` Cat1Name string `json:"cat1_name"` Cat2Name string `json:"cat2_name"` Cat3Name string `json:"cat3_name"` Editable int `json:"editable"` SkuStatus int `json:"sku_status"` } type ExianDaSkus struct { Category string `json:"category"` CustomGoodsCode interface{} `json:"customGoodsCode"` CustomGoodsID int `json:"customGoodsId"` ElemeGoodsCode string `json:"elemeGoodsCode"` ElemeGoodsID string `json:"elemeGoodsId"` ElemeOwnerCode string `json:"elemeOwnerCode"` ElemeOwnerID int `json:"elemeOwnerId"` ExtValues struct { } `json:"extValues"` GoodsID int `json:"goodsId"` GoodsName string `json:"goodsName"` ID int `json:"id"` ImageURL string `json:"imageUrl"` IsShelflife int `json:"isShelflife"` IsWeight int `json:"isWeight"` MeasurementUnitID int `json:"measurementUnitId"` MeasurementUnitText string `json:"measurementUnitText"` OperationType int `json:"operationType"` OperationTypeName string `json:"operationTypeName"` OwnerID string `json:"ownerId"` OwnerName string `json:"ownerName"` PurchaseUnitConversionRate string `json:"purchaseUnitConversionRate"` PurchaseUnitID int `json:"purchaseUnitId"` PurchaseUnitText string `json:"purchaseUnitText"` Status int `json:"status"` TaxRate string `json:"taxRate"` UpcID string `json:"upcId"` } type ExianDaSku struct { AdventLifeCycle interface{} `json:"adventLifeCycle"` CategoryIDFirst int `json:"categoryIdFirst"` CategoryIDSecond int `json:"categoryIdSecond"` CategoryIDThird int `json:"categoryIdThird"` CategoryText string `json:"categoryText"` CreatedBy string `json:"createdBy"` CustomGoodsCode interface{} `json:"customGoodsCode"` CustomGoodsID int `json:"customGoodsId"` ElemeGoodsCode string `json:"elemeGoodsCode"` ElemeGoodsID string `json:"elemeGoodsId"` ElemeOwnerCode string `json:"elemeOwnerCode"` ElemeOwnerID int `json:"elemeOwnerId"` ExtValues struct { } `json:"extValues"` GoodsID int `json:"goodsId"` GoodsName string `json:"goodsName"` GoodsType int `json:"goodsType"` Height string `json:"height"` ImageCOs []struct { ExtValues struct { } `json:"extValues"` Seq int `json:"seq"` URL string `json:"url"` } `json:"imageCOs"` IsDelete int `json:"isDelete"` IsEstimateLifeCycle int `json:"isEstimateLifeCycle"` IsShelflife int `json:"isShelflife"` IsWeight int `json:"isWeight"` Length string `json:"length"` LifeCycle int `json:"lifeCycle"` LockupLifeCycle interface{} `json:"lockupLifeCycle"` MeasurementUnitID int `json:"measurementUnitId"` MeasurementUnitText string `json:"measurementUnitText"` NetWeight string `json:"netWeight"` OperationType int `json:"operationType"` OwnerID string `json:"ownerId"` OwnerName string `json:"ownerName"` PurchaseUnitConversionRate string `json:"purchaseUnitConversionRate"` PurchaseUnitID int `json:"purchaseUnitId"` PurchaseUnitText string `json:"purchaseUnitText"` RejectLifeCycle interface{} `json:"rejectLifeCycle"` Status int `json:"status"` TaxRate string `json:"taxRate"` TemperatureType int `json:"temperatureType"` TenantID int `json:"tenantId"` UpcIds []string `json:"upcIds"` UpdatedBy interface{} `json:"updatedBy"` Volume string `json:"volume"` Weight string `json:"weight"` Width string `json:"width"` } type EbaiSku struct { SkuID string `json:"sku_id"` UpcID string `json:"upc_id"` Upc string `json:"upc"` Wid string `json:"wid"` LeftNum string `json:"left_num"` MarketPrice int `json:"market_price"` SalePrice float64 `json:"sale_price"` Discount int `json:"discount"` Enabled string `json:"enabled"` PurchaseLimit string `json:"purchase_limit"` ShelfNumber string `json:"shelf_number"` Ext string `json:"ext"` NeedIce string `json:"need_ice"` SkuProperty []interface{} `json:"sku_property"` ExtCode string `json:"ext_code"` WeightFlag string `json:"weight_flag"` SaleUnit string `json:"sale_unit"` PreminusWeight int `json:"preminus_weight"` Minimum string `json:"minimum"` SaleStep string `json:"sale_step"` PreparationTime string `json:"preparation_time"` ProcessType int `json:"process_type"` ProcessDetail []interface{} `json:"process_detail"` IsInActivity int `json:"is_in_activity"` UpcType string `json:"upc_type"` UpcName string `json:"upc_name"` BrandID string `json:"brand_id"` Description string `json:"description"` Rtf string `json:"rtf"` Summary string `json:"summary"` Photos []struct { URL string `json:"url"` IsMaster int `json:"is_master"` } `json:"photos"` Cat1ID string `json:"cat1_id"` Cat2ID string `json:"cat2_id"` Cat3ID string `json:"cat3_id"` Propertys []interface{} `json:"propertys"` Length string `json:"length"` Width string `json:"width"` Height string `json:"height"` Weight string `json:"weight"` ProductionAddr1 string `json:"production_addr1"` ProductionAddr2 string `json:"production_addr2"` ProductionAddr3 string `json:"production_addr3"` CustomCatID string `json:"custom_cat_id"` CustomCatName string `json:"custom_cat_name"` Cat1Name string `json:"cat1_name"` Cat2Name string `json:"cat2_name"` Cat3Name string `json:"cat3_name"` BrandName string `json:"brand_name"` Brand struct { BrandID string `json:"brand_id"` BrandName string `json:"brand_name"` } `json:"brand"` Illustration []interface{} `json:"illustration"` IllustrationOrigin []interface{} `json:"illustration_origin"` Cat struct { Cat1 struct { ID string `json:"id"` Name string `json:"name"` } `json:"cat1"` Cat2 struct { ID string `json:"id"` Name string `json:"name"` } `json:"cat2"` Cat3 struct { ID string `json:"id"` Name string `json:"name"` } `json:"cat3"` } `json:"cat"` LengthOrigin string `json:"length_origin"` WidthOrigin string `json:"width_origin"` HeightOrigin string `json:"height_origin"` ProductionAddr1Origin string `json:"production_addr1_origin"` ProductionAddr2Origin string `json:"production_addr2_origin"` ProductionAddr3Origin string `json:"production_addr3_origin"` SummaryOrigin string `json:"summary_origin"` Cat1Origin struct { ID string `json:"id"` Name string `json:"name"` } `json:"cat1_origin"` Cat2Origin struct { ID string `json:"id"` Name string `json:"name"` } `json:"cat2_origin"` Cat3Origin struct { ID string `json:"id"` Name string `json:"name"` } `json:"cat3_origin"` BrandOrigin struct { BrandID string `json:"brand_id"` BrandName string `json:"brand_name"` } `json:"brand_origin"` IsDrug int `json:"is_drug"` SupplierID string `json:"supplier_id"` Editable int `json:"editable"` IsWaterDiscount int `json:"is_water_discount"` DiscountRange int `json:"discount_range"` CtrlEdit struct { UpcName int `json:"upc_name"` Upc int `json:"upc"` Cat int `json:"cat"` BrandID int `json:"brand_id"` Photos int `json:"photos"` Description int `json:"description"` Volumn int `json:"volumn"` Weight int `json:"weight"` Discount int `json:"discount"` } `json:"ctrl_edit"` } type EbaiSkuList struct { UpcID string `json:"upc_id"` UpcType string `json:"upc_type"` Photos string `json:"photos"` UpcName string `json:"upc_name"` Upc string `json:"upc"` BrandID string `json:"brand_id"` Weight string `json:"weight"` Wid string `json:"wid"` Enabled string `json:"enabled"` Cat1ID string `json:"cat1_id"` Cat2ID string `json:"cat2_id"` Cat3ID string `json:"cat3_id"` BrandName string `json:"brand_name"` PhotosList []struct { URL string `json:"url"` IsMaster int `json:"is_master"` } `json:"photos_list"` Shopsku int `json:"shopsku"` IsInActivity int `json:"is_in_activity"` } func (a *API) AccessStorePage2(subURL, storeURL2 string, params map[string]interface{}, isPost bool, cookies map[string]string) (retVal map[string]interface{}, err error) { if a.GetCookieCount() == 0 { return nil, fmt.Errorf("需要设置Store Cookie才能使用此方法") } err = platformapi.AccessPlatformAPIWithRetry(a.client, func() *http.Request { var request *http.Request var url string if storeURL2 != "" { url = storeURL2 } else { url = storeURL } if !isPost { request, _ = http.NewRequest(http.MethodGet, utils.GenerateGetURL(url, subURL, params), nil) } else { if storeURL2 != "" { result, _ := json.MarshalIndent(params, "", " ") request, _ = http.NewRequest(http.MethodPost, utils.GenerateGetURL(url, subURL, nil), strings.NewReader(string(result))) request.Header.Set("Content-Type", "application/ncp4+json") } else { request, _ = http.NewRequest(http.MethodPost, utils.GenerateGetURL(url, subURL, nil), strings.NewReader(utils.Map2URLValues(params).Encode())) request.Header.Set("charset", "UTF-8") request.Header.Set("Content-Type", "application/x-www-form-urlencoded") } } a.FillRequestCookies(request) for k, v := range cookies { request.AddCookie(&http.Cookie{ Name: k, Value: v, }) } return request }, a.config, func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) { if jsonResult1 == nil { return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil") } retVal = jsonResult1 if storeURL2 != "" { return platformapi.ErrLevelSuccess, nil } if jsonResult1["errno"] == nil { if storeURL2 == "" { if jsonResult1[platformapi.KeyData] == nil { baseapi.SugarLogger.Warnf("ebai AccessStorePage2, jsonResult1:%s", utils.Format4Output(jsonResult1, true)) } else { return platformapi.ErrLevelRecoverableErr, fmt.Errorf("%s return not json", subURL) } } } code := int(utils.MustInterface2Int64(jsonResult1["errno"])) if code == ResponseCodeSuccess || code == ResponseCodeSuccess2 { if subURL == swithShopURL { for _, v := range response.Cookies() { if v.Name == "SWITCH_SHOP" { retVal = utils.Struct2FlatMap(v) break } } } else { retVal, _ = jsonResult1["data"].(map[string]interface{}) } return platformapi.ErrLevelSuccess, nil } newErr := utils.NewErrorIntCode(jsonResult1["errmsg"].(string), code) if code == ResponseCodeCallElmFailed { return platformapi.ErrLevelRecoverableErr, newErr } baseapi.SugarLogger.Debugf("ebai AccessStorePage failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true)) return platformapi.ErrLevelCodeIsNotOK, newErr }) return retVal, err } func (a *API) AccessStorePage(subURL, storeURL2 string, params map[string]interface{}, isPost bool) (retVal map[string]interface{}, err error) { return a.AccessStorePage2(subURL, storeURL2, params, isPost, nil) } func (a *API) GetRealMobile4Order(orderId string) (mobile string, err error) { retVal, err := a.GetStoreOrderInfo(orderId) if err == nil { if orderBasic, ok := retVal["order_basic"].(map[string]interface{}); ok { return utils.Interface2String(orderBasic["user_phone_call"]), nil } } return "", err } func (a *API) GetStoreOrderInfo(orderId string) (storeOrderInfo map[string]interface{}, err error) { retVal, err := a.AccessStorePage("crm/orderlist", "", map[string]interface{}{ "keyword": orderId, }, false) if err == nil { resultList := retVal["order_list"].([]interface{}) if len(resultList) > 0 { return resultList[0].(map[string]interface{}), nil } return nil, fmt.Errorf("不能找到订单:%s的相关信息", orderId) } return nil, err } // todo 与上一个函数重了 func (a *API) GetStoreOrderInfoList(fromTime, toTime string, shopID string, orderStatus int) (storeOrderList []map[string]interface{}, err error) { // pageSize := 20 pageNo := 1 params := map[string]interface{}{ "start_timestamp": utils.Str2Time(fromTime).Unix(), "end_timestamp": utils.Str2Time(toTime).Unix(), "shop_id": shopID, } if orderStatus >= 0 { params["order_status"] = orderStatus } for { params["page"] = pageNo retVal, err2 := a.AccessStorePage("crm/orderlist", "", params, false) if err = err2; err == nil { resultList := retVal["order_list"].([]interface{}) storeOrderList = append(storeOrderList, utils.Slice2MapSlice(resultList)...) if len(storeOrderList) >= int(utils.MustInterface2Int64(retVal["order_count"])) { return storeOrderList, nil } pageNo++ } else { return nil, err } } return nil, err } func (a *API) getCommentList(isElm bool, fromTime, toTime time.Time, shopID, supplierID string, replyStatus, level, nonEmpty int) (commentList []map[string]interface{}, err error) { pageSize := 200 pageNo := 1 params := map[string]interface{}{ "start_time": utils.Time2Str(fromTime), "end_time": utils.Time2Str(toTime), "page_count": pageSize, } if shopID != "" { params["shop_id"] = shopID } else if supplierID != "" { params["supplier_id"] = supplierID } if replyStatus != ReplyStatusAll { params["reply_status"] = replyStatus } if level != CommentLevelAll { params["level"] = level } if nonEmpty != CommentContentAll { params["nonempty"] = nonEmpty } fixedURL := fmt.Sprintf("crm/%s", []string{ "getelecommentlist", "getcommentlist", }[1-utils.Bool2Int(isElm)]) for { params["page_num"] = pageNo retVal, err2 := a.AccessStorePage(fixedURL, "", params, false) if err = err2; err == nil && retVal != nil { for _, comment := range retVal["comment_list"].([]interface{}) { commentMap := comment.(map[string]interface{}) for _, orderComment := range commentMap["order_commentList"].([]interface{}) { orderCommentMap := orderComment.(map[string]interface{}) orderCommentMap["order_id"] = commentMap["order_id"] orderCommentMap["shop_id"] = commentMap["shop_id"] commentList = append(commentList, orderComment.(map[string]interface{})) } } if len(commentList) >= int(utils.MustInterface2Int64(retVal["total"])) { return commentList, nil } pageNo++ } else { return nil, err } } return nil, err } func (a *API) GetEleCommentList(fromTime, toTime time.Time, shopID, supplierID string, replyStatus, level, nonEmpty int) (commentList []map[string]interface{}, err error) { return a.getCommentList(false, fromTime, toTime, shopID, supplierID, replyStatus, level, nonEmpty) } func (a *API) GetCommentList(fromTime, toTime time.Time, shopID, supplierID string, replyStatus, level, nonEmpty int) (commentList []map[string]interface{}, err error) { return a.getCommentList(false, fromTime, toTime, shopID, supplierID, replyStatus, level, nonEmpty) } func (a *API) PageGetSkuList(baiduShopID int64) (skuList []map[string]interface{}, err error) { pageSize := 200 pageNo := 1 params := map[string]interface{}{ // "upc_type": 2, // "weight": 2, "wid": baiduShopID, "perpage": pageSize, } for { params["curpage"] = pageNo retVal, err2 := a.AccessStorePage("commodity/getskulist", "", params, false) if err = err2; err == nil { for _, sku := range retVal["sku_list"].([]interface{}) { skuList = append(skuList, sku.(map[string]interface{})) } if len(skuList) >= int(utils.Str2Int64(utils.Interface2String(retVal["total"]))) { return skuList, nil } pageNo++ } else { return nil, err } } return nil, err } func (a *API) PageGetSku(baiduShopID int64, skuID int64) (ebaiSku *EbaiSku, err error) { params := map[string]interface{}{ "wid": baiduShopID, "sku_id": skuID, } retVal, err := a.AccessStorePage("commodity/getsku", "", params, false) utils.Map2StructByJson(retVal, &ebaiSku, false) return ebaiSku, err } func (a *API) PageGetCustomSkuList(baiduShopID int64, customCatID int64) (skuList []map[string]interface{}, err error) { params := map[string]interface{}{ "wid": baiduShopID, "custom_cat_id": customCatID, } retVal, err := a.AccessStorePage("commodity/getCustomSkuList", "", params, false) if err == nil { return utils.Slice2MapSlice(retVal["sku_list"].([]interface{})), nil } return nil, err } func (a *API) PageGetCustomCatList(baiduShopID int64) (catList []map[string]interface{}, err error) { params := map[string]interface{}{ "wid": baiduShopID, } retVal, err := a.AccessStorePage("commodity/GetCustomCatList", "", params, false) if err == nil { return utils.Slice2MapSlice(retVal["cat_list"].([]interface{})), nil } return nil, err } func (a *API) GetStoreList(lng string, lat string, pageNo, pageSize int) (shopListInfo *PageListInfo, err error) { if pageNo <= 0 { pageNo = 1 } if pageSize > 20 || pageSize <= 0 { pageSize = 20 } params := map[string]interface{}{ "channel": "kitchen", "rn": pageSize, "pn": pageNo, "lng": lng, "lat": lat, } // 水果 // https://h5.ele.me/restapi/shopping/v3/restaurants?latitude=30.64743&longitude=104.089981&keyword=&offset=0&limit=8&extras[]=activities&extras[]=tags&terminal=h5&rank_id=456ad3b166954bc996324b6fc43a29fb&order_by=0&brand_ids[]=&restaurant_category_ids[]=245 result, err := a.AccessStorePageNoCookie("newretail/main/shoplist", params) if err == nil && result != nil { err = utils.Map2StructByJson(result, &shopListInfo, true) } return shopListInfo, err } func (a *API) GetStoreList2(lng float64, lat float64) (shopListInfo *PageListInfo, err error) { pageSize := 20 pageNo := 1 for { retVal, err2 := a.GetStoreList(fmt.Sprintf("%.6f", lng), fmt.Sprintf("%.6f", lat), pageNo, pageSize) if err = err2; err == nil { if shopListInfo == nil { shopListInfo = retVal } else { shopListInfo.ShopList = append(shopListInfo.ShopList, retVal.ShopList...) } if len(retVal.ShopList) < pageSize { break } pageNo++ } else { break } } return shopListInfo, err } func (a *API) GetStoreInfo(storeId string) (storeInfo map[string]interface{}, err error) { params := map[string]interface{}{ "shop_id": storeId, "lng": 0, "lat": 0, } retVal, err := a.AccessStorePageNoCookie("newretail/shop/getshopinfo", params) if err != nil { return nil, err } if retVal != nil { retVal["shop_id"] = storeId } return retVal, err } func (a *API) GetStoreInfo2(storeID string) (storeInfo *PageShopInfo, err error) { retVal, err := a.GetStoreInfo(storeID) if err == nil { if retVal != nil { err = utils.Map2StructByJson(retVal, &storeInfo, true) } } return storeInfo, err } func (a *API) AccessStorePageNoCookie(subURL string, params map[string]interface{}) (retVal map[string]interface{}, err error) { err = platformapi.AccessPlatformAPIWithRetry(a.client, func() *http.Request { fullURL := utils.GenerateGetURL(getStoreURL, subURL, params) request, _ := http.NewRequest(http.MethodGet, fullURL, nil) if err != nil { return nil } return request }, a.config, func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) { if jsonResult1 == nil { return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil") } code := int(utils.MustInterface2Int64(jsonResult1["error_no"])) if code == ResponseCodeSuccess { retVal = jsonResult1["result"].(map[string]interface{}) return platformapi.ErrLevelSuccess, nil } else if code == GetStoreSuccessButUnderfind { return platformapi.ErrLevelSuccess, nil } newErr := utils.NewErrorIntCode(jsonResult1["error_msg"].(string), code) return platformapi.ErrLevelCodeIsNotOK, newErr }) return retVal, err } func (a *API) SwitchShop(baiduShopID int64) (switchShopCookie string, err error) { result, err := a.AccessStorePage("crm/manager/switchshop", "", map[string]interface{}{ "switch_shop_id": baiduShopID, }, true) if err == nil { switchShopCookie = utils.Interface2String(result["Value"]) } return switchShopCookie, err } func (a *API) GetShopUserInfo2(switchShopCookie string) (shopUserInfo *PageShopUserInfo, err error) { shopInfo, err := a.AccessStorePage2("crm/account/getshopuserinfo", "", nil, true, map[string]string{ "SWITCH_SHOP": switchShopCookie, }) if err == nil { err = utils.Map2StructByJson(shopInfo, &shopUserInfo, true) } return shopUserInfo, err } func (a *API) GetShopUserInfo(baiduShopID int64) (shopUserInfo *PageShopUserInfo, err error) { switchShopCookie, err := a.SwitchShop(baiduShopID) if err != nil { return nil, err } return a.GetShopUserInfo2(switchShopCookie) } func (a *API) GetShopHealthByDetail2(switchShopCookie string) (shopHealthDetail *PageShopHealthInfo, err error) { shopInfo, err := a.GetShopUserInfo2(switchShopCookie) if err != nil { return nil, err } result, err := a.AccessStorePage2("crm/getshophealthydetail", "", map[string]interface{}{ "shop_id": shopInfo.EleID, }, true, map[string]string{ "SWITCH_SHOP": switchShopCookie, }) if err == nil { if err = utils.Map2StructByJson(result, &shopHealthDetail, true); err == nil { shopHealthDetail.MerchantID = shopInfo.MerchantID shopHealthDetail.MerchantName = shopInfo.MerchantName } } return shopHealthDetail, err } func (a *API) GetShopHealthByDetail(baiduShopID int64) (shopHealthDetail *PageShopHealthInfo, err error) { switchShopCookie, err := a.SwitchShop(baiduShopID) if err != nil { return nil, err } return a.GetShopHealthByDetail2(switchShopCookie) } //查询饿百商家中心商户列表 // https://be.ele.me/crm/suppliershopstatus?status=1&proxy_business_state=10&pageCount=500&pageNum=1 func (a *API) GetShopListByPage(status, proxyBusinessState, pageCount, pageNum int) (shopList []*ShopList, totalCount int, err error) { params := map[string]interface{}{ "status": status, "proxy_business_state": proxyBusinessState, "pageCount": pageCount, "pageNum": pageNum, } retVal, err := a.AccessStorePage("crm/suppliershopstatus", "", params, false) if err == nil { utils.Map2StructByJson(retVal["shop_list"], &shopList, true) totalCount = int(utils.MustInterface2Int64(retVal["total"])) } return shopList, totalCount, err } //饿百骑手增加小费,单位为元,最低0.1元 // orderID与elemeOrderID任意一个都可以 // https://be.ele.me/crm/modifytip func (a *API) ModifyTip4OrderWaybill(orderID, elemeOrderID string, tip, zhongBaoAskPrice float64) (err error) { params := map[string]interface{}{ "order_id": orderID, "eleme_order_id": elemeOrderID, "tip": tip, "zhongbao_ask_price": zhongBaoAskPrice, } _, err = a.AccessStorePage("crm/modifytip", "", params, false) return err } //查询饿百门店橱窗商品信息 func (a *API) GetStoresShowWindowSkus(baiduShopID int64) (storeShowWindowList []*StoreShowWindowSkuList, err error) { // params := map[string]interface{}{ // "wid": baiduShopID, // } // result, err := a.AccessStorePage("crm/shop/getcurrshopwindow", "", params, true) // if err == nil { // err2 := utils.Map2StructByJson(result["sku_list"], &storeShowWindowList, false) // if err2 != nil { // return storeShowWindowList, err // } // } return storeShowWindowList, err } //获取饿鲜达商品库 func (a *API) GetExianDaSkuDepot(upcID string) (results []*ExianDaSkus, err error) { var ( pageNum = 1 pageSize = 200 ) for { params := map[string]interface{}{ "metas": map[string]interface{}{}, "params": map[string]interface{}{ "goodsListQry": map[string]interface{}{ "pageNum": pageNum, "pageSize": pageSize, }, }, } if upcID != "" { params["params"].(map[string]interface{})["goodsListQry"].(map[string]interface{})["upcId"] = upcID } result, err := a.AccessStorePage("bwm_newretail.scm_ic/GoodsServiceI/findGoodsList", "https://ncp.ele.me", params, true) if err != nil { return results, err } if result["data"] != nil { var exianDaSkus []*ExianDaSkus utils.Map2StructByJson(result["data"], &exianDaSkus, false) if len(exianDaSkus) > 0 { results = append(results, exianDaSkus...) } if len(exianDaSkus) < pageSize { break } } pageNum++ } return results, err } //获取饿鲜达单个商品(主要取分类id) func (a *API) GetExianDaSku(exdSkuID int64) (results *ExianDaSku, err error) { params := map[string]interface{}{ "metas": map[string]interface{}{}, "params": map[string]interface{}{ "goodsGetQry": map[string]interface{}{ "elemeGoodsId": exdSkuID, }, }, } result, err := a.AccessStorePage("bwm_newretail.scm_ic/GoodsServiceI/findGoodsById", "https://ncp.ele.me", params, true) if err != nil { return results, err } utils.Map2StructByJson(result["data"], &results, false) return results, err } //查询饿百全国账号商品库商品 func (a *API) GetEbaiDepotSku(supplierID string, upc string) (ebaiSkuList []*EbaiSkuList, err error) { params := map[string]interface{}{ "wid": 0, "supplierId": supplierID, "upc": upc, "curpage": 1, "perpage": 20, } result, err := a.AccessStorePage("commodity/getsuppliergoods", "", params, false) if err == nil { err2 := utils.Map2StructByJson(result["sku_list"], &ebaiSkuList, false) if err2 != nil { return ebaiSkuList, err } } return ebaiSkuList, err } //查询饿百商品,根据upc func (a *API) GetEbaiSku(upcID string, supplierID string) (ebaiSku *EbaiSku, err error) { params := map[string]interface{}{ "supplierId": supplierID, "upc_id": upcID, } result, err := a.AccessStorePage("commodity/getsku", "", params, false) if err == nil { err2 := utils.Map2StructByJson(result, &ebaiSku, false) if err2 != nil { return ebaiSku, err } } return ebaiSku, err }