diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index bec25de5f..20a6a5d55 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -421,3 +421,17 @@ func HandleUserWXRemark(db *dao.DaoDB, mobile string) (err error) { } return err } + +func RefreshOrderSkuRelated(order *model.GoodsOrder) *model.GoodsOrder { + order.SkuCount = 0 + order.GoodsCount = 0 + order.SalePrice = 0 + order.Weight = 0 + for _, sku := range order.Skus { + order.SkuCount++ + order.GoodsCount += sku.Count + order.SalePrice += sku.SalePrice * int64(sku.Count) + order.Weight += sku.Weight * sku.Count + } + return order +} diff --git a/business/model/order.go b/business/model/order.go index 17e074519..cc5fc7eeb 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -88,15 +88,15 @@ type OrderSku struct { StoreSubID int `orm:"column(store_sub_id)" json:"storeSubID"` StoreSubName string `orm:"size(64)" json:"storeSubName"` Count int `json:"count"` - VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"-"` + VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"` SkuID int `orm:"column(sku_id)" json:"skuID"` // 外部系统里记录的 jxskuid JxSkuID int `orm:"column(jx_sku_id)" json:"jxSkuID"` // 根据VendorSkuID在本地系统里查询出来的 jxskuid SkuName string `orm:"size(255)" json:"skuName"` ShopPrice int64 `json:"shopPrice"` // 门店标价 SalePrice int64 `json:"salePrice"` // 售卖价 - Weight int `json:"-"` // 单位为克 - SkuType int `json:"-"` // 当前如果为gift就为1,否则缺省为0 - PromotionType int `json:"-"` // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换 + Weight int `json:"weight"` // 单位为克 + SkuType int `json:"skuType"` // 当前如果为gift就为1,否则缺省为0 + PromotionType int `json:"promotionType"` // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换 OrderCreatedAt time.Time `orm:"type(datetime);index" json:"-"` // 分区考虑 SkuPmSubsidy int64 `json:"-"` //平台商品活动补贴 SkuPmFee int64 `json:"-"` //门店商品活动支出 diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index cb6f15ccb..2776bf49a 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -4,6 +4,8 @@ import ( "math" "time" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" @@ -68,6 +70,63 @@ func (p *PurchaseHandler) getOrder(vendorOrderID string) (order *model.GoodsOrde return order, result, err } +func (p *PurchaseHandler) GetOrder4PartRefund(vendorOrderID string) (order *model.GoodsOrder, err error) { + taskIDs := []int{1, 2} + var ( + err1, err2 error + result1, result2 map[string]interface{} + ) + task := tasksch.NewParallelTask("GetOrder4PartRefund", nil, jxcontext.AdminCtx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + taskID := batchItemList[0].(int) + if taskID == 1 { + result1, err1 = api.EbaiAPI.OrderGet(vendorOrderID) + } else if taskID == 2 { + result2, err2 = api.EbaiAPI.OrderPartrefundGet(vendorOrderID) + } + return nil, nil + }, taskIDs) + task.Run() + task.GetResult(0) + if err1 == nil { + order = p.Map2Order(result1) + if err2 == nil { + order.Skus = p.partRefund2OrderDetailSkuList(utils.Interface2String(result2["order_id"]), result2["order_detail"]) + jxutils.RefreshOrderSkuRelated(order) + } else if err2Ext, ok := err2.(*utils.ErrorWithCode); !ok || err2Ext.IntCode() != ebaiapi.ErrOrderIsNotPartRefund { + err = err2 + } + } else { + err = err1 + } + return order, err +} + +func (p *PurchaseHandler) partRefund2OrderDetailSkuList(orderID string, orderDetail2 interface{}) (skuList []*model.OrderSku) { + orderDetail := orderDetail2.([]interface{}) + for _, product2 := range orderDetail { + product := product2.(map[string]interface{}) + skuName := product["name"].(string) + _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName) + number := int(utils.MustInterface2Int64(product["number"])) + sku := &model.OrderSku{ + VendorOrderID: orderID, + VendorID: model.VendorIDEBAI, + Count: number, + SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product[ebaiapi.KeyCustomSkuID]), 0)), + VendorSkuID: utils.Interface2String(product[ebaiapi.KeySkuID]), + SkuName: skuName, + // Weight: int(utils.Interface2Int64WithDefault(product["total_weight"], 0)) / number, // 退单这里的total_weight有BUG,这里的total_weight还是没有退单时的值 + SalePrice: utils.MustInterface2Int64(product["product_price"]), + } + if sku.Weight == 0 { + sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit) // 订单信息里没有重量,只有名字里尝试找 + } + skuList = append(skuList, sku) + } + return skuList +} + func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) { result := orderData shopMap := result["shop"].(map[string]interface{}) @@ -134,29 +193,27 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo product := product2.(map[string]interface{}) skuName := product["product_name"].(string) _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName) + productAmount := int(utils.MustInterface2Int64(product["product_amount"])) sku := &model.OrderSku{ VendorOrderID: order.VendorOrderID, VendorID: model.VendorIDEBAI, - Count: int(utils.MustInterface2Int64(product["product_amount"])), + Count: productAmount, SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product[ebaiapi.KeyCustomSkuID]), 0)), VendorSkuID: utils.Interface2String(product["baidu_product_id"]), SkuName: skuName, - Weight: jxutils.FormatSkuWeight(specQuality, specUnit), // 订单信息里没有重量,只有名字里尝试找 + Weight: int(utils.Interface2Int64WithDefault(product["total_weight"], 0)) / productAmount, SalePrice: utils.MustInterface2Int64(product["product_price"]), // PromotionType: int(utils.MustInterface2Int64(product["promotionType"])), } if sku.Weight == 0 { - sku.Weight = 222 // 如果名字里找不到缺省给半斤左右的一个特别值 + sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit) // 订单信息里没有重量,只有名字里尝试找 } // if product["isGift"].(bool) { // sku.SkuType = 1 // } order.Skus = append(order.Skus, sku) - order.SkuCount++ - order.GoodsCount += sku.Count - order.SalePrice += sku.SalePrice * int64(sku.Count) - order.Weight += sku.Weight * sku.Count } + jxutils.RefreshOrderSkuRelated(order) // setOrederDetailFee(result, order) return order } @@ -245,7 +302,14 @@ func (c *PurchaseHandler) onOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi. status := c.callbackMsg2Status(msg) var err error if status != nil { - err = partner.CurOrderManager.OnOrderStatusChanged(status) + if status.Status == model.OrderStatusAdjust { + var order *model.GoodsOrder + if order, err = c.GetOrder4PartRefund(GetOrderIDFromMsg(msg)); err == nil { + err = partner.CurOrderManager.OnOrderAdjust(order, status.VendorStatus) + } + } else { + err = partner.CurOrderManager.OnOrderStatusChanged(status) + } } retVal = api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil) } diff --git a/business/partner/purchase/ebai/order_test.go b/business/partner/purchase/ebai/order_test.go new file mode 100644 index 000000000..b6a00d014 --- /dev/null +++ b/business/partner/purchase/ebai/order_test.go @@ -0,0 +1,16 @@ +package ebai + +import ( + "testing" + + "git.rosy.net.cn/baseapi/utils" +) + +func TestGetOrder4PartRefund(t *testing.T) { + order, err := new(PurchaseHandler).GetOrder4PartRefund("1556530656022029520") + if err != nil { + t.Fatal(err.Error()) + } else { + t.Log(utils.Format4Output(order, false)) + } +} diff --git a/business/partner/purchase/elm/order.go b/business/partner/purchase/elm/order.go index 115965dc2..039482988 100644 --- a/business/partner/purchase/elm/order.go +++ b/business/partner/purchase/elm/order.go @@ -190,12 +190,9 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo sku.VendorSkuID = utils.Int64ToStr(utils.MustInterface2Int64(product["id"])) // 2018-09-28日,饿了么迁移到饿百后,这个字段发生了变化 } order.Skus = append(order.Skus, sku) - order.SkuCount++ - order.GoodsCount += sku.Count - order.SalePrice += sku.SalePrice * int64(sku.Count) - order.Weight += sku.Weight * sku.Count } } + jxutils.RefreshOrderSkuRelated(order) setOrederDetailFee(result, order) return order } diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 5d86f018b..a91ea8776 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -153,11 +153,8 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo sku.SkuType = 1 } order.Skus = append(order.Skus, sku) - order.SkuCount++ - order.GoodsCount += sku.Count - order.SalePrice += sku.SalePrice * int64(sku.Count) - order.Weight += sku.Weight * sku.Count } + jxutils.RefreshOrderSkuRelated(order) setOrederDetailFee(result, order) return order } diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 3d886b888..8a4dac8b5 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -146,11 +146,8 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo // sku.SkuType = 1 // } order.Skus = append(order.Skus, sku) - order.SkuCount++ - order.GoodsCount += sku.Count - order.SalePrice += sku.SalePrice * int64(sku.Count) - order.Weight += sku.Weight * sku.Count } + jxutils.RefreshOrderSkuRelated(order) // setOrederDetailFee(result, order) return order } diff --git a/business/partner/purchase/weimob/wsc/order.go b/business/partner/purchase/weimob/wsc/order.go index 24f323507..d4b6daa5c 100644 --- a/business/partner/purchase/weimob/wsc/order.go +++ b/business/partner/purchase/weimob/wsc/order.go @@ -158,11 +158,8 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo SalePrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(item["price"])), } order.Skus = append(order.Skus, sku) - order.SkuCount++ - order.GoodsCount += sku.Count - order.SalePrice += sku.SalePrice * int64(sku.Count) - order.Weight += sku.Weight * sku.Count } + jxutils.RefreshOrderSkuRelated(order) p.arrangeSaleStore(order, utils.Interface2String(logisticsDeliveryDetail["receiverCity"]), utils.Interface2String(logisticsDeliveryDetail["receiverProvince"])) p.setStoreOrderSeq(order) return order