Files
baseapi/platformapi/ebaiapi/store_page.go
2019-06-11 16:39:52 +08:00

462 lines
16 KiB
Go

package ebaiapi
import (
"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"
swithShopURL = "crm/manager/switchshop"
)
const (
ReplyStatusAll = -1
ReplyStatusNotReplied = 0
ReplyStatusReplied = 1
CommentLevelAll = -1
CommentLevel1 = 1
CommentLevel2 = 2
CommentLevel3 = 3
CommentLevel4 = 4
CommentLevel5 = 5
CommentContentAll = -1
CommentContentHaveContent = 1
CommentContentNoContent = 0
)
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 []struct {
End string `json:"end"`
Start string `json:"start"`
} `json:"takeout_dispatch_time"`
TakeoutOncallType string `json:"takeout_oncall_type"`
TakeoutOpenTime []struct {
End string `json:"end"`
Start string `json:"start"`
} `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"`
}
func (a *API) SetStoreCookie(key, value string) {
a.locker.Lock()
defer a.locker.Unlock()
a.storeCookies[key] = value
}
func (a *API) GetStoreCookie(key string) string {
a.locker.RLock()
defer a.locker.RUnlock()
return a.storeCookies[key]
}
func (a *API) AccessStorePage2(subURL string, params map[string]interface{}, cookies map[string]string) (retVal map[string]interface{}, err error) {
a.locker.RLock()
storeCookieLen := len(a.storeCookies)
a.locker.RUnlock()
if storeCookieLen == 0 {
return nil, fmt.Errorf("需要设置Store Cookie才能使用此方法")
}
err = platformapi.AccessPlatformAPIWithRetry(a.client,
func() *http.Request {
var request *http.Request
fullURL := utils.GenerateGetURL(storeURL, subURL, nil)
if params == nil {
// baseapi.SugarLogger.Debug(fullURL)
request, _ = http.NewRequest(http.MethodGet, fullURL, nil)
} else {
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(utils.Map2URLValues(params).Encode()))
request.Header.Set("charset", "UTF-8")
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
}
a.locker.RLock()
for k, v := range a.storeCookies {
request.AddCookie(&http.Cookie{
Name: k,
Value: v,
})
}
for k, v := range cookies {
request.AddCookie(&http.Cookie{
Name: k,
Value: v,
})
}
a.locker.RUnlock()
return request
},
a.config,
func(response *http.Response, jsonResult1 map[string]interface{}) (errLevel string, err error) {
retVal = jsonResult1
code := int(utils.MustInterface2Int64(jsonResult1["errno"]))
if code == ResponseCodeSuccess {
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 string, params map[string]interface{}) (retVal map[string]interface{}, err error) {
return a.AccessStorePage2(subURL, params, nil)
}
func (a *API) GetRealMobile4Order(orderId string) (mobile string, err error) {
retVal, err := a.GetStoreOrderInfo(orderId)
if err == nil {
return retVal["order_basic"].(map[string]interface{})["user_phone_call"].(string), nil
}
return "", err
}
func (a *API) GetStoreOrderInfo(orderId string) (storeOrderInfo map[string]interface{}, err error) {
retVal, err := a.AccessStorePage(fmt.Sprintf("crm/orderlist?keyword=%s", orderId), nil)
// baseapi.SugarLogger.Debug(utils.Format4Output(retVal, 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
}
func (a *API) GetStoreOrderInfoList(fromTime, toTime string, shopID string, orderStatus int) (storeOrderList []map[string]interface{}, err error) {
// pageSize := 20
pageNo := 1
urlTemplate := "crm/orderlist?start_timestamp=%d&end_timestamp=%d&shop_id=%s"
params := []interface{}{
utils.Str2Time(fromTime).Unix(),
utils.Str2Time(toTime).Unix(),
shopID,
}
if orderStatus >= 0 {
urlTemplate += "&order_status=%d"
params = append(params, orderStatus)
}
fixedURL := fmt.Sprintf(urlTemplate, params...)
for {
retVal, err2 := a.AccessStorePage(fixedURL+"&page="+utils.Int2Str(pageNo), nil)
// baseapi.SugarLogger.Debug(utils.Format4Output(retVal, 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
urlTemplate := "crm/%s?start_time=%s&end_time=%s&page_count=%d"
params := []interface{}{
[]string{
"getelecommentlist",
"getcommentlist",
}[1-utils.Bool2Int(isElm)],
utils.Time2Str(fromTime),
utils.Time2Str(toTime),
pageSize,
}
if shopID != "" {
urlTemplate += "&shop_id=%s"
params = append(params, shopID)
} else if supplierID != "" {
urlTemplate += "&supplier_id=%s"
params = append(params, supplierID)
}
if replyStatus != ReplyStatusAll {
urlTemplate += "&reply_status=%d"
params = append(params, replyStatus)
}
if level != CommentLevelAll {
urlTemplate += "&level=%d"
params = append(params, level)
}
if nonEmpty != CommentContentAll {
urlTemplate += "&nonempty=%d"
params = append(params, replyStatus)
}
fixedURL := fmt.Sprintf(urlTemplate, params...)
for {
retVal, err2 := a.AccessStorePage(fixedURL+"&page_num="+utils.Int2Str(pageNo), nil)
if err = err2; err == 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(true, 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
urlTemplate := "commodity/getskulist?wid=%d&perpage=%d&upc_type=2&weight=2"
params := []interface{}{
baiduShopID,
pageSize,
}
fixedURL := fmt.Sprintf(urlTemplate, params...)
for {
retVal, err2 := a.AccessStorePage(fixedURL+"&curpage="+utils.Int2Str(pageNo), nil)
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) PageGetCustomSkuList(baiduShopID int64, customCatID int64) (skuList []map[string]interface{}, err error) {
urlTemplate := "commodity/getCustomSkuList?wid=%d&custom_cat_id=%d"
params := []interface{}{
baiduShopID,
customCatID,
}
fixedURL := fmt.Sprintf(urlTemplate, params...)
retVal, err := a.AccessStorePage(fixedURL, nil)
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) {
urlTemplate := "commodity/GetCustomCatList?wid=%d"
params := []interface{}{
baiduShopID,
}
fixedURL := fmt.Sprintf(urlTemplate, params...)
retVal, err := a.AccessStorePage(fixedURL, nil)
if err == nil {
return utils.Slice2MapSlice(retVal["cat_list"].([]interface{})), nil
}
return nil, 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,
})
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, 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,
}, 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)
}