- 使用mapstructure进行map到struct的映射,简化API编写
This commit is contained in:
@@ -28,32 +28,32 @@ type ActivityRule struct {
|
||||
}
|
||||
|
||||
type ActivityInfo struct {
|
||||
ActivityID int64 `json:"-"`
|
||||
ActivityID int64 `json:"activityID,omitempty"`
|
||||
ActivityName string `json:"activity_name"`
|
||||
ActivityType int `json:"activity_type"`
|
||||
StartTime int64 `json:"start_time"` // 活动开始时间,时间戳,需大于当前时间。
|
||||
EndTime int64 `json:"end_time"`
|
||||
OpenTime string `json:"open_time"` // "22:47"
|
||||
CloseTime string `json:"close_time"`
|
||||
WeekDay string `json:"weekday"` // 活动开始时间段内,每周具体星期几支持,默认活动生效时间段内全周支持。0,1,2,3,4,5,6代表周日到周六。
|
||||
ActivityPlatform int `json:"activity_platform"`
|
||||
IsConflictActivity int `json:"is_conflict_activity"`
|
||||
DayLimit int `json:"day_limit"` // 每日限购X单,1-1000整数。
|
||||
OrderLimit int `json:"order_limit"` // 每单限购商品数量。直降用到,满减没用到。1-1000整数。
|
||||
ActivityDesc string `json:"activity_desc"`
|
||||
ShowCategory string `json:"show_category"`
|
||||
PromotionSkuDesc string `json:"promotion_sku_desc"` // 店铺页活动商品的分类名称,不超过8个字。
|
||||
Rule []*ActivityRule `json:"rule"`
|
||||
OpenTime string `json:"open_time,omitempty"` // "22:47"
|
||||
CloseTime string `json:"close_time,omitempty"`
|
||||
WeekDay string `json:"weekday,omitempty"` // 活动开始时间段内,每周具体星期几支持,默认活动生效时间段内全周支持。0,1,2,3,4,5,6代表周日到周六。
|
||||
ActivityPlatform int `json:"activity_platform,omitempty"`
|
||||
IsConflictActivity int `json:"is_conflict_activity,omitempty"`
|
||||
DayLimit int `json:"day_limit,omitempty"` // 每日限购X单,1-1000整数。
|
||||
OrderLimit int `json:"order_limit,omitempty"` // 每单限购商品数量。直降用到,满减没用到。1-1000整数。
|
||||
ActivityDesc string `json:"activity_desc,omitempty"`
|
||||
ShowCategory string `json:"show_category,omitempty"`
|
||||
PromotionSkuDesc string `json:"promotion_sku_desc,omitempty"` // 店铺页活动商品的分类名称,不超过8个字。
|
||||
Rule []*ActivityRule `json:"rule,omitempty"`
|
||||
|
||||
BaiduShopID int64 `json:"-"`
|
||||
ShowStatus int `json:"-"`
|
||||
BaiduShopID int64 `json:"baiduShopID,omitempty"`
|
||||
ShowStatus int `json:"showStatus,omitempty"`
|
||||
}
|
||||
|
||||
type ActivitySkuInfo struct {
|
||||
SkuID string `json:"sku_id"`
|
||||
Stock int `json:"stock"`
|
||||
|
||||
PromotionPrice float32 `json:"special_price"` // 直降用
|
||||
PromotionPrice float32 `json:"special_price"` // 直降用,复用
|
||||
StoreUserLimit int `json:"store_user_limit"` // 直降用
|
||||
}
|
||||
|
||||
@@ -78,18 +78,8 @@ type ActivitySkuListInfo struct {
|
||||
SkuList []*ActivitySkuInfoEx `json:"sku_list"`
|
||||
}
|
||||
|
||||
var (
|
||||
ignoreActivityInfo = ActivityInfo{}
|
||||
)
|
||||
|
||||
func (a *API) ActivityCreate(shopID string, baiduShopID, supplierID int64, activity *ActivityInfo) (activityID int64, err error) {
|
||||
params := utils.Struct2MapWithIgnore(activity, map[string]interface{}{
|
||||
"open_time": ignoreActivityInfo.OpenTime,
|
||||
"close_time": ignoreActivityInfo.CloseTime,
|
||||
"is_conflict_activity": ignoreActivityInfo.IsConflictActivity,
|
||||
"order_limit": ignoreActivityInfo.OrderLimit,
|
||||
"rule": ignoreActivityInfo.Rule,
|
||||
})
|
||||
params := utils.Struct2FlatMap(activity)
|
||||
result, err := a.AccessAPI("activity.create", utils.MergeMaps(params, a.genShopIDParams(shopID, baiduShopID, supplierID)))
|
||||
if err == nil {
|
||||
return utils.Str2Int64(utils.Interface2String(result.Data.(map[string]interface{})["activity_id"])), nil
|
||||
@@ -98,18 +88,7 @@ func (a *API) ActivityCreate(shopID string, baiduShopID, supplierID int64, activ
|
||||
}
|
||||
|
||||
func (a *API) ActivityUpdate(activityID int64, shopID string, baiduShopID, supplierID int64, activity *ActivityInfo) (newActivityID int64, err error) {
|
||||
params := utils.Struct2MapWithIgnore(activity, map[string]interface{}{
|
||||
"open_time": ignoreActivityInfo.OpenTime,
|
||||
"close_time": ignoreActivityInfo.CloseTime,
|
||||
"weekday": ignoreActivityInfo.WeekDay,
|
||||
"day_limit": ignoreActivityInfo.DayLimit,
|
||||
"order_limit": ignoreActivityInfo.OrderLimit,
|
||||
"activity_desc": ignoreActivityInfo.ActivityDesc,
|
||||
"show_category": ignoreActivityInfo.ShowCategory,
|
||||
"promotion_sku_desc": ignoreActivityInfo.PromotionSkuDesc,
|
||||
"is_conflict_activity": ignoreActivityInfo.IsConflictActivity,
|
||||
"rule": ignoreActivityInfo.Rule,
|
||||
})
|
||||
params := utils.Struct2FlatMap(activity)
|
||||
params[KeyActivityID] = activityID
|
||||
result, err := a.AccessAPI("activity.update", utils.MergeMaps(params, a.genShopIDParams(shopID, baiduShopID, supplierID)))
|
||||
if err == nil {
|
||||
@@ -130,39 +109,10 @@ func (a *API) ActivityGet(activityID int64, shopID string, baiduShopID, supplier
|
||||
params[KeyActivityID] = activityID
|
||||
result, err := a.AccessAPI("activity.get", params)
|
||||
if err == nil {
|
||||
dataMap := result.Data.(map[string]interface{})
|
||||
activityInfo = &ActivityInfo{
|
||||
ActivityID: utils.Str2Int64(utils.Interface2String(dataMap["activity_id"])),
|
||||
ActivityName: utils.Interface2String(dataMap["activity_name"]),
|
||||
ActivityType: int(utils.Str2Int64(utils.Interface2String(dataMap["activity_type"]))),
|
||||
StartTime: utils.Str2Int64(utils.Interface2String(dataMap["start_time"])),
|
||||
EndTime: utils.Str2Int64(utils.Interface2String(dataMap["end_time"])),
|
||||
OpenTime: utils.Interface2String(dataMap["open_time"]),
|
||||
CloseTime: utils.Interface2String(dataMap["close_time"]),
|
||||
WeekDay: utils.Interface2String(dataMap["weekday"]),
|
||||
ActivityPlatform: int(utils.Str2Int64(utils.Interface2String(dataMap["activity_platform"]))),
|
||||
IsConflictActivity: int(utils.Str2Int64(utils.Interface2String(dataMap["is_conflict_activity"]))),
|
||||
DayLimit: int(utils.Str2Int64(utils.Interface2String(dataMap["day_limit"]))),
|
||||
OrderLimit: int(utils.Str2Int64(utils.Interface2String(dataMap["order_limit"]))),
|
||||
ActivityDesc: utils.Interface2String(dataMap["activity_desc"]),
|
||||
ShowCategory: utils.Interface2String(dataMap["show_category"]),
|
||||
PromotionSkuDesc: utils.Interface2String(dataMap["promotion_sku_desc"]),
|
||||
|
||||
BaiduShopID: utils.Str2Int64(utils.Interface2String(dataMap["baidu_shop_id"])),
|
||||
ShowStatus: int(utils.Str2Int64(utils.Interface2String(dataMap["show_status"]))),
|
||||
}
|
||||
if rule, ok := dataMap["rule"].([]interface{}); ok {
|
||||
for _, v := range rule {
|
||||
vMap := v.(map[string]interface{})
|
||||
activityInfo.Rule = append(activityInfo.Rule, &ActivityRule{
|
||||
Accords: int(utils.MustInterface2Int64(vMap["accords"])),
|
||||
Sale: int(utils.MustInterface2Int64(vMap["sale"])),
|
||||
})
|
||||
}
|
||||
}
|
||||
return activityInfo, nil
|
||||
activityInfo = &ActivityInfo{}
|
||||
err = utils.Map2StructByJson(result.Data, activityInfo, true)
|
||||
}
|
||||
return nil, err
|
||||
return activityInfo, err
|
||||
}
|
||||
|
||||
func (a *API) ActivitySkuAddBatch(activityID int64, shopID string, baiduShopID int64, activityType int, skuList []*ActivitySkuInfo, isSkuIDCustom bool) (successIDs []string, err error) {
|
||||
@@ -229,6 +179,15 @@ func (a *API) ActivitySkuList(activityID int64, shopID string, baiduShopID, supp
|
||||
params["page"] = page
|
||||
result, err = a.AccessAPI("activity.sku.list", params)
|
||||
if err == nil {
|
||||
// tmpActivityInfo := &ActivitySkuListInfo{}
|
||||
// if err = utils.Map2StructByJson(result.Data, tmpActivityInfo, true); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if activityInfo == nil {
|
||||
// activityInfo = tmpActivityInfo
|
||||
// } else {
|
||||
// activityInfo.SkuList = append(activityInfo.SkuList, tmpActivityInfo.SkuList...)
|
||||
// }
|
||||
resultMap := result.Data.(map[string]interface{})
|
||||
if activityInfo == nil {
|
||||
activityInfo = &ActivitySkuListInfo{
|
||||
|
||||
@@ -25,14 +25,14 @@ type OrderDiscountGift struct {
|
||||
}
|
||||
|
||||
type OrderDiscountRuleRequest struct {
|
||||
LowerLimitAmount int `json:"lowerLimitAmount"`
|
||||
DiscountAmount int `json:"discountAmount"`
|
||||
UpperLimitCount int `json:"upperLimitCount"`
|
||||
LowerLimitCount int `json:"lowerLimitCount"`
|
||||
DiscountRate float32 `json:"discountRate"`
|
||||
AddPrice int `json:"addPrice"` // 分
|
||||
GiftList []*OrderDiscountGift `json:"giftList"`
|
||||
LadderLimit int `json:"ladderLimit"`
|
||||
LowerLimitAmount int `json:"lowerLimitAmount,omitempty"`
|
||||
DiscountAmount int `json:"discountAmount,omitempty"`
|
||||
UpperLimitCount int `json:"upperLimitCount,omitempty"`
|
||||
LowerLimitCount int `json:"lowerLimitCount,omitempty"`
|
||||
DiscountRate float32 `json:"discountRate,omitempty"`
|
||||
AddPrice int `json:"addPrice,omitempty"` // 分
|
||||
GiftList []*OrderDiscountGift `json:"giftList,omitempty"`
|
||||
LadderLimit int `json:"ladderLimit,omitempty"`
|
||||
}
|
||||
|
||||
type OrderDiscountActivity struct {
|
||||
@@ -42,14 +42,14 @@ type OrderDiscountActivity struct {
|
||||
BeginTime string `json:"beginTime"` // 必须
|
||||
EndTime string `json:"endTime"` // 必须
|
||||
ParticipationMode int `json:"participationMode"` // 必须
|
||||
OutStationNos []string `json:"outStationNos"`
|
||||
StationNos []string `json:"stationNos"`
|
||||
OutSkuIds []string `json:"outSkuIds"`
|
||||
SkuIds []string `json:"skuIds"`
|
||||
OutStationNos []string `json:"outStationNos,omitempty"`
|
||||
StationNos []string `json:"stationNos,omitempty"`
|
||||
OutSkuIds []string `json:"outSkuIds,omitempty"`
|
||||
SkuIds []string `json:"skuIds,omitempty"`
|
||||
LimitOrderTotalNumber int `json:"limitOrderTotalNumber"` // 必须
|
||||
LimitUserTotalNumber int `json:"limitUserTotalNumber"`
|
||||
LimitUserTotalNumber int `json:"limitUserTotalNumber,omitempty"`
|
||||
Display string `json:"display"` // 必须
|
||||
RuleRequestList []*OrderDiscountRuleRequest `json:"ruleRequestList"`
|
||||
RuleRequestList []*OrderDiscountRuleRequest `json:"ruleRequestList,omitempty"`
|
||||
}
|
||||
|
||||
type ActivityOpResultInfo struct {
|
||||
@@ -82,31 +82,8 @@ type ActivityOpQueryInfoResponse struct {
|
||||
LadderList []int `json:"ladderList"`
|
||||
}
|
||||
|
||||
var (
|
||||
ignoreOrderDiscountActivity = OrderDiscountActivity{}
|
||||
ignoreOrderDiscountRuleRequest = OrderDiscountRuleRequest{}
|
||||
|
||||
ignoreOrderDiscountSubmitActivityMap = map[string]interface{}{
|
||||
"outStationNos": ignoreOrderDiscountActivity.OutStationNos,
|
||||
"stationNos": ignoreOrderDiscountActivity.StationNos,
|
||||
"outSkuIds": ignoreOrderDiscountActivity.OutSkuIds,
|
||||
"skuIds": ignoreOrderDiscountActivity.SkuIds,
|
||||
"limitUserTotalNumber": ignoreOrderDiscountActivity.LimitUserTotalNumber,
|
||||
"ruleRequestList": ignoreOrderDiscountActivity.RuleRequestList,
|
||||
|
||||
"lowerLimitAmount": ignoreOrderDiscountRuleRequest.LowerLimitAmount,
|
||||
"discountAmount": ignoreOrderDiscountRuleRequest.DiscountAmount,
|
||||
"upperLimitCount": ignoreOrderDiscountRuleRequest.UpperLimitCount,
|
||||
"lowerLimitCount": ignoreOrderDiscountRuleRequest.LowerLimitCount,
|
||||
"discountRate": ignoreOrderDiscountRuleRequest.DiscountRate,
|
||||
"addPrice": ignoreOrderDiscountRuleRequest.AddPrice,
|
||||
"giftList": ignoreOrderDiscountRuleRequest.GiftList,
|
||||
"ladderLimit": ignoreOrderDiscountRuleRequest.LadderLimit,
|
||||
}
|
||||
)
|
||||
|
||||
func (a *API) OrderDiscountSubmitActivity(actInfo *OrderDiscountActivity) (activityID int64, err error) {
|
||||
result, err := a.AccessAPINoPage("orderdiscount/submitActivity", utils.Struct2MapWithIgnore(actInfo, ignoreOrderDiscountSubmitActivityMap), nil, nil, nil)
|
||||
result, err := a.AccessAPINoPage("orderdiscount/submitActivity", utils.Struct2FlatMap(actInfo), nil, nil, nil)
|
||||
if err == nil {
|
||||
return utils.MustInterface2Int64((result.(map[string]interface{}))["activityId"]), nil
|
||||
}
|
||||
|
||||
@@ -86,10 +86,10 @@ type ShippingFeeActDetail struct {
|
||||
type ShippingFeeActData struct {
|
||||
StartTime int64 `json:"start_time"` // 活动开始时间,单s位秒
|
||||
EndTime int64 `json:"end_time"` // 活动结束时间,单位秒
|
||||
WeeksTime string `json:"weeks_time"`
|
||||
Period string `json:"period"`
|
||||
WeeksTime string `json:"weeks_time,omitempty"`
|
||||
Period string `json:"period,omitempty"`
|
||||
ActDetail []*ShippingFeeActDetail `json:"act_detail"`
|
||||
MaxPrice float64 `json:"max_price"`
|
||||
MaxPrice float64 `json:"max_price,omitempty"`
|
||||
|
||||
AppPoiCode string `json:"-"`
|
||||
ActID string `json:"-"`
|
||||
@@ -108,8 +108,8 @@ type RetailActData struct {
|
||||
SettingType int `json:"setting_type"`
|
||||
ActPrice float64 `json:"act_price"` // 折扣价格(单位元):必须为大于0的数字,且不能超过2位小数。
|
||||
DiscountCoefficient float64 `json:"discount_coefficient"` // 折扣系数:必须大于0小于9.8,最多支持两位小数。如输入3,即为3折
|
||||
Sequence int `json:"sequence"`
|
||||
ItemID int64 `json:"item_id"` // 活动ID,为什么这里又是int64
|
||||
Sequence int `json:"sequence,omitempty"`
|
||||
ItemID int64 `json:"item_id,omitempty"` // 活动ID,为什么这里又是int64
|
||||
|
||||
// 以下参数只有查询时用到
|
||||
OriginalPrice float64 `json:"-"` // 商品原价,单位元
|
||||
@@ -119,17 +119,11 @@ type RetailActData struct {
|
||||
}
|
||||
|
||||
type RetailActDataLimit struct {
|
||||
ItemID int64 `json:"item_id"` // 活动ID,为什么这里又是int64
|
||||
DayLimit int `json:"day_limit"` // 当日活动库存,只能为正整数或-1,-1表示无限库存
|
||||
OrderLimit int `json:"order_limit"` // 每单可购买的折扣商品数量
|
||||
ItemID int64 `json:"item_id"` // 活动ID,为什么这里又是int64
|
||||
DayLimit int `json:"day_limit,omitempty"` // 当日活动库存,只能为正整数或-1,-1表示无限库存
|
||||
OrderLimit int `json:"order_limit,omitempty"` // 每单可购买的折扣商品数量
|
||||
}
|
||||
|
||||
var (
|
||||
ignoreShippingFeeActData = ShippingFeeActData{}
|
||||
ignoreRetailActData = &RetailActData{}
|
||||
ignoreRetailActDataLimit = &RetailActDataLimit{}
|
||||
)
|
||||
|
||||
func (a *API) FullDiscountBatchSave(poiCode string, actInfo *FullDiscountActInfo, actList []*FullDiscountActDetail, actSkuList []*FullDiscountSku) (actID int64, err error) {
|
||||
params := map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
@@ -152,43 +146,11 @@ func (a *API) FullDiscountList(poiCode string, actType int) (actInfoList []*Full
|
||||
"act_type": actType,
|
||||
})
|
||||
if err == nil && result != nil {
|
||||
for _, v := range result.([]interface{}) {
|
||||
actMap := v.(map[string]interface{})
|
||||
actWholeInfo := &FullDiscountActData{
|
||||
ActInfo: interface2ActInfo(actMap["act_info"]),
|
||||
ActRemark: utils.Interface2String(actMap["act_remark"]),
|
||||
AppPoiCode: utils.Interface2String(actMap["app_poi_code"]),
|
||||
}
|
||||
actInfoList = append(actInfoList, actWholeInfo)
|
||||
for _, v := range actMap["act_details"].([]interface{}) {
|
||||
vMap := v.(map[string]interface{})
|
||||
actWholeInfo.ActDetails = append(actWholeInfo.ActDetails, &FullDiscountActDetail{
|
||||
OriginalPrice: float64(utils.MustInterface2Float64(vMap["origin_price"])),
|
||||
ActPrice: float64(utils.MustInterface2Float64(vMap["act_price"])),
|
||||
})
|
||||
}
|
||||
}
|
||||
// decoder, _ := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||
// TagName: "json",
|
||||
// Result: &actInfoList,
|
||||
// })
|
||||
// if err = decoder.Decode(result); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
err = utils.Map2StructByJson(result, &actInfoList, false)
|
||||
}
|
||||
return actInfoList, err
|
||||
}
|
||||
|
||||
func interface2ActInfo(actInfo interface{}) *FullDiscountActInfo {
|
||||
actInfoMap := actInfo.(map[string]interface{})
|
||||
return &FullDiscountActInfo{
|
||||
ActIDs: utils.Interface2String(actInfoMap["act_ids"]),
|
||||
StartTime: utils.MustInterface2Int64(actInfoMap["start_time"]),
|
||||
EndTime: utils.MustInterface2Int64(actInfoMap["end_time"]),
|
||||
Status: int(utils.MustInterface2Int64(actInfoMap["status"])),
|
||||
}
|
||||
}
|
||||
|
||||
func (a *API) FullDiscountDelete(poiCode string, actIDList []string, actType int) (err error) {
|
||||
_, err = a.AccessAPI("act/full/discount/delete", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
@@ -219,15 +181,15 @@ func (a *API) FullDiscountFoodsList(poiCode, actID string) (actFoodsInfo *FullDi
|
||||
"offset": offset,
|
||||
})
|
||||
if err == nil && result != nil {
|
||||
resultMap := result.(map[string]interface{})
|
||||
if actFoodsInfo == nil {
|
||||
actFoodsInfo = &FullDiscountFoodsInfo{
|
||||
ActInfo: interface2ActInfo(resultMap["act_info"]),
|
||||
ActRemark: utils.Interface2String(resultMap["act_remark"]),
|
||||
AppPoiCode: utils.Interface2String(resultMap["app_poi_code"]),
|
||||
}
|
||||
tmpActFoodsInfo := &FullDiscountFoodsInfo{}
|
||||
if err = utils.Map2StructByJson(result, tmpActFoodsInfo, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if actFoodsInfo == nil {
|
||||
actFoodsInfo = tmpActFoodsInfo
|
||||
} else {
|
||||
actFoodsInfo.AppFoods = append(actFoodsInfo.AppFoods, tmpActFoodsInfo.AppFoods...)
|
||||
}
|
||||
actFoodsInfo.AppFoods = append(actFoodsInfo.AppFoods, interface2SkuInfoList(resultMap["app_foods"])...)
|
||||
offset++
|
||||
break
|
||||
} else {
|
||||
@@ -237,18 +199,6 @@ func (a *API) FullDiscountFoodsList(poiCode, actID string) (actFoodsInfo *FullDi
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func interface2SkuInfoList(value interface{}) (actSkuList []*FullDiscountSku) {
|
||||
for _, v := range value.([]interface{}) {
|
||||
vMap := v.(map[string]interface{})
|
||||
actSkuList = append(actSkuList, &FullDiscountSku{
|
||||
AppFoodCode: utils.Interface2String(vMap["app_food_code"]),
|
||||
DayLimit: int(utils.Interface2Int64WithDefault(vMap["day_limit"], 0)),
|
||||
Name: utils.Interface2String(vMap["name"]),
|
||||
})
|
||||
}
|
||||
return actSkuList
|
||||
}
|
||||
|
||||
// 批量删除活动商品至指定商品满减活动
|
||||
// appFoodCodeList 删除商品数量上限为100,如果删除门店多个活动商品,用英文逗号隔开
|
||||
func (a *API) FullDiscountFoodsDelete(poiCode, actID string, appFoodCodeList []string) (err error) {
|
||||
@@ -275,11 +225,7 @@ func (a *API) FullDiscountFoodsDayLimit(poiCode, actID string, appFoodList []*Fu
|
||||
func (a *API) FulllDiscountShippingFeeBatchSave(poiCode string, actData []*ShippingFeeActData) (err error) {
|
||||
_, err = a.AccessAPI("act/full/discount/shippingfee/batchsave", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"act_data": string(utils.MustMarshal(utils.StructList2MapListWithIgnore(actData, map[string]interface{}{
|
||||
"weeks_time": ignoreShippingFeeActData.WeeksTime,
|
||||
"period": ignoreShippingFeeActData.Period,
|
||||
"max_price": ignoreShippingFeeActData.MaxPrice,
|
||||
}))),
|
||||
"act_data": string(utils.MustMarshal(actData)),
|
||||
})
|
||||
return err
|
||||
}
|
||||
@@ -290,30 +236,7 @@ func (a *API) FulllDiscountShippingFeeList(poiCode string) (actList []*ShippingF
|
||||
KeyAppPoiCode: poiCode,
|
||||
})
|
||||
if err == nil {
|
||||
for _, v := range result.([]interface{}) {
|
||||
vMap := v.(map[string]interface{})
|
||||
act := &ShippingFeeActData{
|
||||
AppPoiCode: utils.Interface2String(vMap["app_poi_code"]),
|
||||
ActID: utils.Interface2String(vMap["act_id"]),
|
||||
StartTime: utils.MustInterface2Int64(vMap["start_time"]),
|
||||
EndTime: utils.MustInterface2Int64(vMap["end_time"]),
|
||||
WeeksTime: utils.Interface2String(vMap["weeks_time"]),
|
||||
Period: utils.Interface2String(vMap["period"]),
|
||||
|
||||
MaxPrice: utils.Interface2Float64WithDefault(vMap["max_price"], 0),
|
||||
ActStatus: utils.Interface2String(vMap["actStatus"]),
|
||||
}
|
||||
actList = append(actList, act)
|
||||
for _, v := range vMap["act_detail"].([]interface{}) {
|
||||
vMap := v.(map[string]interface{})
|
||||
act.ActDetail = append(act.ActDetail, &ShippingFeeActDetail{
|
||||
LimitPrice: utils.Interface2Float64WithDefault(vMap["limit_price"], 0),
|
||||
DiscountPrice: utils.Interface2Float64WithDefault(vMap["discount_price"], 0),
|
||||
PoiCharge: utils.Interface2Float64WithDefault(vMap["poi_charge"], 0),
|
||||
MtCharge: utils.Interface2Float64WithDefault(vMap["mt_charge"], 0),
|
||||
})
|
||||
}
|
||||
}
|
||||
err = utils.Map2StructByJson(result, &actList, false)
|
||||
}
|
||||
return actList, err
|
||||
}
|
||||
@@ -322,10 +245,7 @@ func (a *API) FulllDiscountShippingFeeList(poiCode string) (actList []*ShippingF
|
||||
func (a *API) RetailDiscountBatchSave(poiCode string, actData []*RetailActData) (actID int64, err error) {
|
||||
result, err := a.AccessAPI2("act/retail/discount/batchsave", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"act_data": string(utils.MustMarshal(utils.StructList2MapListWithIgnore(actData, map[string]interface{}{
|
||||
"sequence": ignoreRetailActData.Sequence,
|
||||
"item_id": ignoreRetailActData.ItemID,
|
||||
}))),
|
||||
"act_data": string(utils.MustMarshal(actData)),
|
||||
}, resultKeyMsg)
|
||||
if err == nil {
|
||||
return utils.MustInterface2Int64(result.([]interface{})[0].(map[string]interface{})["act_id"]), nil
|
||||
@@ -344,31 +264,12 @@ func (a *API) RetailDiscountList(poiCode string) (actList []*RetailActData, err
|
||||
"offset": offset,
|
||||
})
|
||||
if err == nil {
|
||||
resultList := result.([]interface{})
|
||||
for _, v := range resultList {
|
||||
vMap := v.(map[string]interface{})
|
||||
act := &RetailActData{
|
||||
AppFoodCode: utils.Interface2String(vMap["app_food_code"]),
|
||||
UserType: int(utils.MustInterface2Int64(vMap["user_type"])),
|
||||
StartTime: utils.MustInterface2Int64(vMap["start_time"]),
|
||||
EndTime: utils.MustInterface2Int64(vMap["end_time"]),
|
||||
OrderLimit: int(utils.MustInterface2Int64(vMap["order_limit"])),
|
||||
DayLimit: int(utils.MustInterface2Int64(vMap["day_limit"])),
|
||||
WeeksTime: utils.Interface2String(vMap["weeks_time"]),
|
||||
Period: utils.Interface2String(vMap["period"]),
|
||||
SettingType: int(utils.MustInterface2Int64(vMap["setting_type"])),
|
||||
ActPrice: utils.Interface2Float64WithDefault(vMap["act_price"], 0),
|
||||
DiscountCoefficient: utils.Interface2Float64WithDefault(vMap["discount_coefficient"], 0),
|
||||
ItemID: utils.MustInterface2Int64(vMap["item_id"]),
|
||||
OriginalPrice: utils.Interface2Float64WithDefault(vMap["origin_price"], 0),
|
||||
Stock: int(utils.MustInterface2Int64(vMap["stock"])),
|
||||
Status: int(utils.MustInterface2Int64(vMap["status"])),
|
||||
Name: utils.Interface2String(vMap["name"]),
|
||||
Sequence: int(utils.MustInterface2Int64(vMap["sequence"])),
|
||||
}
|
||||
actList = append(actList, act)
|
||||
var tmpActList []*RetailActData
|
||||
if err = utils.Map2StructByJson(result, &tmpActList, false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(resultList) < limit {
|
||||
actList = append(actList, tmpActList...)
|
||||
if len(tmpActList) < limit {
|
||||
break
|
||||
}
|
||||
offset++
|
||||
@@ -392,9 +293,7 @@ func (a *API) RetailDiscountDelete(poiCode string, actIDList []string) (err erro
|
||||
func (a *API) RetailDiscountBatchStock(poiCode, actDataList []*RetailActDataLimit) (err error) {
|
||||
_, err = a.AccessAPI("act/retail/discount/batchstock", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"act_data": string(utils.MustMarshalJSONIgnoreValues(actDataList, map[string]interface{}{
|
||||
"order_limit": ignoreRetailActDataLimit.OrderLimit,
|
||||
})),
|
||||
"act_data": string(utils.MustMarshal(actDataList)),
|
||||
})
|
||||
return err
|
||||
}
|
||||
@@ -403,9 +302,7 @@ func (a *API) RetailDiscountBatchStock(poiCode, actDataList []*RetailActDataLimi
|
||||
func (a *API) RetailDiscountBatchLimit(poiCode, actDataList []*RetailActDataLimit) (err error) {
|
||||
_, err = a.AccessAPI("act/retail/discount/batchlimit", false, map[string]interface{}{
|
||||
KeyAppPoiCode: poiCode,
|
||||
"act_data": string(utils.MustMarshalJSONIgnoreValues(actDataList, map[string]interface{}{
|
||||
"day_limit": ignoreRetailActDataLimit.DayLimit,
|
||||
})),
|
||||
"act_data": string(utils.MustMarshal(actDataList)),
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
|
||||
"git.rosy.net.cn/baseapi"
|
||||
"github.com/fatih/structs"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -471,58 +472,11 @@ func Struct2FlatMap(obj interface{}) map[string]interface{} {
|
||||
return FlatMap(m)
|
||||
}
|
||||
|
||||
func removeIgnoreFields(data interface{}, ignoreValues map[string]interface{}) {
|
||||
dataType := reflect.TypeOf(data).Kind()
|
||||
if dataType == reflect.Map {
|
||||
inMap := data.(map[string]interface{})
|
||||
for k, v := range inMap {
|
||||
// fmt.Printf("k:%s v:%v, ignoreValues[k]:%v\n", k, v, ignoreValues[k])
|
||||
if fmt.Sprint(ignoreValues[k]) == fmt.Sprint(v) {
|
||||
delete(inMap, k)
|
||||
} else {
|
||||
fieldType := reflect.TypeOf(v).Kind()
|
||||
if fieldType == reflect.Map || fieldType == reflect.Slice {
|
||||
removeIgnoreFields(v, ignoreValues)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if dataType == reflect.Slice {
|
||||
dataList := Interface2Slice(data)
|
||||
for _, v := range dataList {
|
||||
removeIgnoreFields(v, ignoreValues)
|
||||
}
|
||||
}
|
||||
// mapData := data.(map[string]interface{})
|
||||
// for k, v := range ignoreValues {
|
||||
// if fmt.Sprint(mapData[k]) == fmt.Sprint(v) {
|
||||
// delete(mapData, k)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
func Struct2MapWithIgnore(obj interface{}, ignoreValues map[string]interface{}) map[string]interface{} {
|
||||
mapData := Struct2FlatMap(obj)
|
||||
removeIgnoreFields(mapData, ignoreValues)
|
||||
return mapData
|
||||
}
|
||||
|
||||
// 注意:如下两个函数的行为与标准的json.Marshal的行为是有区别的
|
||||
// 这两个函数,只要成员是对象或map(不是指针),都会被展开
|
||||
// 而json.Marshal不是这样的,只会展开内嵌的(包括指针)
|
||||
// 所以原则是不用map的对象,行为就比较一致
|
||||
func MarshalJSONIgnoreValues(obj interface{}, ignoreValues map[string]interface{}) ([]byte, error) {
|
||||
return json.Marshal(Struct2MapWithIgnore(obj, ignoreValues))
|
||||
}
|
||||
|
||||
func MustMarshalJSONIgnoreValues(obj interface{}, ignoreValues map[string]interface{}) []byte {
|
||||
return MustMarshal(Struct2MapWithIgnore(obj, ignoreValues))
|
||||
}
|
||||
|
||||
func StructList2MapListWithIgnore(obj interface{}, ignoreValues map[string]interface{}) (mapList []map[string]interface{}) {
|
||||
objList := Interface2Slice(obj)
|
||||
mapList = make([]map[string]interface{}, len(objList))
|
||||
for k, v := range objList {
|
||||
mapList[k] = Struct2MapWithIgnore(v, ignoreValues)
|
||||
}
|
||||
return mapList
|
||||
func Map2StructByJson(inObj interface{}, outObjAddr interface{}, weaklyTypedInput bool) (err error) {
|
||||
decoder, _ := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||
TagName: "json",
|
||||
Result: outObjAddr,
|
||||
WeaklyTypedInput: weaklyTypedInput,
|
||||
})
|
||||
return decoder.Decode(inObj)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user