package ebai import ( "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) // 存储饿百退款订单结账信息 func OnFinancialMsg(msg *ebaiapi.CallbackMsg) (err error) { if msg.Cmd == ebaiapi.CmdOrderPartRefund { // 部分退款处理 if utils.Int64ToStr(utils.MustInterface2Int64(msg.Body["status"])) == ebaiapi.OrderPartRefundSuccess { // 获取到部分退款订单id afsOrderID := utils.Interface2String(msg.Body["order_id"]) // 处理部分退款信息 orderData, err2 := api.EbaiAPI.OrderPartrefundGet(afsOrderID) if err = err2; err == nil { afsOrder := CurPurchaseHandler.AfsOrderDetail2Financial(orderData) err = partner.CurOrderManager.SaveAfsOrderFinancialInfo(afsOrder) } } } else if msg.Cmd == ebaiapi.CmdOrderUserCancel { // 全额退款处理 messageType := utils.Int64ToStr(utils.MustInterface2Int64(msg.Body["type"])) if utils.Int64ToStr(utils.MustInterface2Int64(msg.Body["cancel_type"])) == ebaiapi.OrderUserCancelTypeAfterSale && (messageType == ebaiapi.OrderUserCancelCSAgreed || messageType == ebaiapi.OrderUserCancelMerchantAgreed) { globals.SugarLogger.Debug(utils.Interface2String(msg.Body["order_id"])) // 获得退款订单ID,去本地数据库拿?饿百消息推送只给了订单号,但是没有查询全额退款的接口,只有部分退款才可以查询 afsOrderID := utils.Interface2String(msg.Body["order_id"]) orderFinancial, err := partner.CurOrderManager.LoadOrderFinancial(afsOrderID, model.VendorIDEBAI) if err == nil { globals.SugarLogger.Debug(utils.Format4Output(orderFinancial, false)) err = partner.CurOrderManager.SaveAfsOrderFinancialInfo(CurPurchaseHandler.OrderFinancialDetail2Refund(orderFinancial, msg)) } else { globals.SugarLogger.Warnf("ebai OnFinancialMsg, afsOrderID:%s is not found from partner.CurOrderManager.LoadOrderFinancial", afsOrderID) } } } else if msg.Cmd == ebaiapi.CmdOrderDeliveryStatus { // 转自送调整 if utils.Int64ToStr(utils.MustInterface2Int64(msg.Body["status"])) == ebaiapi.WaybillStatusSelfDelivery { vendorOrderID := GetOrderIDFromMsg(msg) orderMap, err := api.EbaiAPI.OrderGet(vendorOrderID) if err == nil { err = CurPurchaseHandler.OnOrderDetail(orderMap, partner.UpdatedPeration) } } } return err } func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.OrderFinancial, msg *ebaiapi.CallbackMsg) (afsOrder *model.AfsOrder) { afsOrder = &model.AfsOrder{ VendorID: model.VendorIDEBAI, AfsOrderID: utils.Interface2String(msg.Body["order_id"]), VendorOrderID: utils.Interface2String(msg.Body["order_id"]), AfsCreateAt: utils.Timestamp2Time(msg.Timestamp), // BoxMoney: orderFinancial.BoxMoney, // 饿百的餐盒费已经拆分到单条Sku里面,退款时直接计算用户支付sku金额就好了 // SkuBoxMoney: orderFinancial.SkuBoxMoney, FreightUserMoney: orderFinancial.FreightMoney, SkuUserMoney: orderFinancial.ActualPayMoney - orderFinancial.FreightMoney, PmSubsidyMoney: orderFinancial.PmSubsidyMoney, } // if msg.Body["timestamp"] != nil { // afsOrder.AfsCreateAt = utils.Timestamp2Time(utils.Str2Int64(utils.Interface2String(msg.Body["timestamp"]))) // } else { // globals.SugarLogger.Warnf("ebai OrderFinancialDetail2Refund timestamp is not found in afsOrder:%s", afsOrder.AfsOrderID) // afsOrder.AfsCreateAt = time.Now() // } order, err := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID) globals.SugarLogger.Debug(utils.Format4Output(order, false)) if err == nil { afsOrder.JxStoreID = order.JxStoreID afsOrder.VendorStoreID = order.VendorStoreID afsOrder.StoreID = order.StoreID } else { globals.SugarLogger.Warnf("ebai AfsOrderDetail2Financial, afsOrderID:%s is not found from partner.CurOrderManager.LoadOrder", afsOrder.VendorOrderID) err = nil } for _, sku := range orderFinancial.Skus { orderSkuFinancial := &model.OrderSkuFinancial{ VendorID: sku.VendorID, VendorOrderID: sku.VendorOrderID, VendorOrderID2: sku.VendorOrderID2, AfsOrderID: sku.VendorOrderID, // ConfirmTime: afsOrder.AfsCreateAt, VendorStoreID: afsOrder.VendorStoreID, StoreID: afsOrder.StoreID, JxStoreID: afsOrder.JxStoreID, VendorSkuID: sku.VendorSkuID, SkuID: sku.SkuID, PromotionType: sku.PromotionType, Name: sku.Name, ShopPrice: sku.ShopPrice, SalePrice: sku.SalePrice, Count: sku.Count, SkuBoxMoney: sku.SkuBoxMoney, UserMoney: sku.UserMoney, PmSubsidyMoney: sku.PmSubsidyMoney, IsAfsOrder: 1, } afsOrder.Skus = append(afsOrder.Skus, orderSkuFinancial) } return afsOrder } func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData map[string]interface{}) (afsOrder *model.AfsOrder) { afsOrder = &model.AfsOrder{ VendorID: model.VendorIDEBAI, AfsOrderID: utils.Interface2String(orderData["order_id"]), VendorOrderID: utils.Interface2String(orderData["order_id"]), } order, err := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID) if err == nil { afsOrder.JxStoreID = order.JxStoreID } else { globals.SugarLogger.Warnf("ebai AfsOrderDetail2Financial, afsOrderID:%s is not found from partner.CurOrderManager.LoadOrder", afsOrder.VendorOrderID) err = nil } // 部分退款订单,第三方平台佣金会变化,金额为 orderData["commission"],是否将该字段更新到正向订单结算表中 // 不作更新的话,商户可以得到的钱会少几毛钱,最终京西受益 // 如果要更新,总佣金,京西佣金是否都要更新,而其它一系列连锁反应,是否需要考虑更新 // 或者换个思路,不考虑变更之前的正向订单,在佣金上入手,退款金额减去佣金减少的部分 orderFinancial, err := partner.CurOrderManager.LoadOrderFinancial(afsOrder.VendorOrderID, model.VendorIDEBAI) if err == nil { afsOrder.PmRefundMoney = orderFinancial.PmMoney - utils.MustInterface2Int64(orderData["commission"]) } else { // 此处应该报错 globals.SugarLogger.Warnf("ebai AfsOrderDetail2Financial, afsOrderID:%s is not found from partner.CurOrderManager.LoadOrderFinancial", afsOrder.VendorOrderID) err = nil } if orderData["refund_detail"] != nil { refundDetail := orderData["refund_detail"].([]interface{}) for _, refundInfo := range refundDetail { xMap := refundInfo.(map[string]interface{}) orderSkuFinancial := &model.OrderSkuFinancial{ VendorID: model.VendorIDEBAI, AfsOrderID: afsOrder.AfsOrderID, VendorOrderID: afsOrder.VendorOrderID, // ConfirmTime: getTimeFromInterface(xMap["apply_time"]), VendorSkuID: utils.Interface2String(xMap["sku_id"]), SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(xMap["custom_sku_id"]), 0)), Name: utils.Interface2String(xMap["name"]), UserMoney: utils.MustInterface2Int64(xMap["total_refund"]), PmSubsidyMoney: utils.MustInterface2Int64(xMap["shop_ele_refund"]), IsAfsOrder: 1, } afsOrder.Skus = append(afsOrder.Skus, orderSkuFinancial) afsOrder.SkuUserMoney += orderSkuFinancial.UserMoney afsOrder.PmSubsidyMoney += orderSkuFinancial.PmSubsidyMoney } if len(refundDetail) > 0 { afsOrder.AfsCreateAt = getTimeFromInterface(refundDetail[0].(map[string]interface{})["apply_time"]) } else { globals.SugarLogger.Warnf("ebai AfsOrderDetail2Financial, orderID:%s have no refund_detail", afsOrder.VendorOrderID) } } else { globals.SugarLogger.Warnf("ebai AfsOrderDetail2Financial, orderID:% refund_detail is nil", afsOrder.VendorOrderID) } return afsOrder } // 存储饿百正向订单结账信息 func (p *PurchaseHandler) OnOrderDetail(result map[string]interface{}, operation string) (err error) { err = partner.CurOrderManager.SaveOrderFinancialInfo(p.OrderDetail2Financial(result), operation) return err } // func (p *PurchaseHandler) GetTrueEbaiOrder(result1 map[string]interface{}) (result2 map[string]interface{}) { // order := result1["order"].(map[string]interface{}) // if utils.MustInterface2Int64(order["down_flag"]) == 1 { // result, err := api.EbaiAPI.OrderGet(utils.Interface2String(order["order_id"])) // if err == nil { // return p.GetTrueEbaiOrder(result) // } // } // return result1 // } func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) (orderFinancial *model.OrderFinancial) { orderFinancial = &model.OrderFinancial{ VendorID: model.VendorIDEBAI, } order1 := result["order"].(map[string]interface{}) orderFinancial.VendorOrderID = utils.Interface2String(order1["order_id"]) orderFinancial.VendorOrderID2 = utils.Interface2String(order1["eleme_order_id"]) // orderFinancial.DeliveryConfirmTime = getTimeFromInterface(order1["finished_time"]) orderFinancial.TotalDiscountMoney = utils.MustInterface2Int64(order1["discount_fee"]) orderFinancial.ReceivableFreight = utils.MustInterface2Int64(order1["send_fee"]) orderFinancial.DownFlag = int8(utils.MustInterface2Int64(order1["down_flag"])) if int(getInt64FromInterface(order1["delivery_party"])) == ebaiapi.SendImmediatelySelf { orderFinancial.SelfDeliveryDiscountMoney = orderFinancial.ReceivableFreight orderFinancial.DistanceFreightMoney = 0 // 通过本地数据库去取是否转美团/达达,并计算运费 // wayBill, err := partner.CurOrderManager.LoadWaybill(orderFinancial.VendorOrderID, orderFinancial.VendorID) // if err == nil { // orderFinancial.JxFreightMoney = wayBill.DesiredFee // } } orderFinancial.BoxMoney = utils.MustInterface2Int64(order1["package_fee"]) orderFinancial.ActualPayMoney = utils.MustInterface2Int64(order1["user_fee"]) orderFinancial.PmMoney = utils.MustInterface2Int64(order1["commission"]) orderFinancial.ShopMoney = utils.MustInterface2Int64(order1["shop_fee"]) order, err := partner.CurOrderManager.LoadOrder(orderFinancial.VendorOrderID, orderFinancial.VendorID) storeID := 0 jxStoreID := 0 if err == nil { storeID = order.StoreID jxStoreID = order.JxStoreID skus := order.Skus if skus != nil { for _, x := range skus { orderFinancial.ShopPriceMoney += x.ShopPrice * int64(x.Count) } } } else { globals.SugarLogger.Warnf("ebai OrderDetail2Financial, orderID:%s is not found from partner.CurOrderManager.LoadOrder", orderFinancial.VendorOrderID) err = nil } shop := result["shop"].(map[string]interface{}) if result["products"] != nil { products := result["products"].([]interface{}) for _, x := range products { for _, y := range x.([]interface{}) { product := y.(map[string]interface{}) orderSkuFinancial := &model.OrderSkuFinancial{ VendorID: orderFinancial.VendorID, VendorOrderID: orderFinancial.VendorOrderID, VendorOrderID2: orderFinancial.VendorOrderID2, // OrderFinancialID: orderFinancial.VendorOrderID, // ConfirmTime: getTimeFromInterface(order1["create_time"]), VendorStoreID: utils.Interface2String(shop["baidu_shop_id"]), StoreID: storeID, JxStoreID: jxStoreID, VendorSkuID: utils.Interface2String(product["baidu_product_id"]), SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product["custom_sku_id"]), 0)), Name: utils.Interface2String(product["product_name"]), SalePrice: utils.MustInterface2Int64(product["product_price"]), Count: int(utils.MustInterface2Int64(product["product_amount"])), SkuBoxMoney: utils.MustInterface2Int64(product["package_fee"]), IsAfsOrder: 0, } orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial) orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count) orderFinancial.SkuBoxMoney += orderSkuFinancial.SkuBoxMoney orderFinancial.BoxMoney -= orderSkuFinancial.SkuBoxMoney } } } if result["discount"] != nil { discount := result["discount"].([]interface{}) for _, x := range discount { xMap := x.(map[string]interface{}) discountPrice := utils.MustInterface2Int64(xMap["fee"]) orderFinancial.DiscountMoney += discountPrice orderFinancial.PmSubsidyMoney += utils.MustInterface2Int64(xMap["baidu_rate"]) // 平台承担补贴 activity := &model.OrderDiscountFinancial{ VendorID: orderFinancial.VendorID, VendorOrderID: orderFinancial.VendorOrderID, // ActivityName: utils.Interface2String(xMap["desc"]), // ActivityMoney: discountPrice, VendorActivityID: utils.Interface2String(xMap["activity_id"]), Type: utils.Interface2String(xMap["type"]), } orderFinancial.Discounts = append(orderFinancial.Discounts, activity) // 通过活动Id去取,京西活动补贴 // orderFinancial.JxSubsidyMoney += } } orderFinancial.FreightDiscountMoney = orderFinancial.TotalDiscountMoney - orderFinancial.DiscountMoney return orderFinancial } func getInt64FromInterface(strOrNum interface{}) int64 { var resultNum int64 if resultStr, ok := strOrNum.(string); ok { resultNum = utils.Str2Int64WithDefault(resultStr, 0) } else { resultNum = utils.Interface2Int64WithDefault(strOrNum, 0) } return resultNum }