package wsc import ( "time" "git.rosy.net.cn/baseapi/platformapi/weimobapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "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" ) const ( FakeOrderStatusAccepted = 101 FakeOrderStatusFinishedPickup = 102 ) var ( VendorStatus2StatusMap = map[int]int{ weimobapi.OrderStatusWait4Pay: model.OrderStatusUnknown, weimobapi.OrderStatusPayed: model.OrderStatusNew, FakeOrderStatusAccepted: model.OrderStatusAccepted, FakeOrderStatusFinishedPickup: model.OrderStatusFinishedPickup, weimobapi.OrderStatusDelivering: model.OrderStatusDelivering, weimobapi.OrderStatusFinished: model.OrderStatusFinished, weimobapi.OrderStatusCanceled: model.OrderStatusCanceled, } ) func (p *PurchaseHandler) onOrderMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) { if weimobapi.MsgEventCreateOrder == msg.MsgEvent { order, err := p.GetOrder(utils.Int64ToStr(msg.OrderNo)) if err == nil { order.StatusTime = msg.StatusTime err = partner.CurOrderManager.OnOrderNew(order, order.VendorStatus) } return weimobapi.Err2CallbackResponse(err, "") } else { status, err := p.callbackMsg2Status(msg) if status != nil { err = partner.CurOrderManager.OnOrderStatusChanged(status) } response = weimobapi.Err2CallbackResponse(err, "") } return response } func (p *PurchaseHandler) callbackMsg2Status(msg *weimobapi.CallbackMsg) (orderStatus *model.OrderStatus, err error) { orderID := utils.Int64ToStr(msg.OrderNo) var intStatus int if msg.IsFake { intStatus = int(utils.Str2Int64(msg.MsgEvent)) } else { intStatus, err = p.getOrderStatus(msg.OrderNo) } if err == nil { vendorStatus := utils.Int2Str(intStatus) orderStatus = &model.OrderStatus{ VendorOrderID: orderID, VendorID: model.VendorIDWSC, OrderType: model.OrderTypeOrder, RefVendorOrderID: orderID, RefVendorID: model.VendorIDWSC, VendorStatus: vendorStatus, Status: p.GetStatusFromVendorStatus(vendorStatus), StatusTime: msg.StatusTime, Remark: "", } } return orderStatus, err } func (p *PurchaseHandler) getOrderStatus(orderNo int64) (status int, err error) { result, err := api.WeimobAPI.QueryOrderDetail(orderNo, false) if err != nil { return 0, err } return int(utils.MustInterface2Int64(result["orderStatus"])), nil } func (p *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int { if status, ok := VendorStatus2StatusMap[int(utils.Str2Int64(vendorStatus))]; ok { return status } return model.OrderStatusUnknown } func (p *PurchaseHandler) GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) { globals.SugarLogger.Debug(vendorOrderID) result, err := api.WeimobAPI.QueryOrderDetail(utils.Str2Int64(vendorOrderID), false) if err != nil { return nil, err } deliveryDetail := result["deliveryDetail"].(map[string]interface{}) logisticsDeliveryDetail := deliveryDetail["logisticsDeliveryDetail"].(map[string]interface{}) order = &model.GoodsOrder{ VendorOrderID: vendorOrderID, VendorID: model.VendorIDWSC, VendorStoreID: utils.Int64ToStr(utils.MustInterface2Int64(result["processStoreId"])), // 这个不是通常意义上的vendor store id // StoreID // StoreName ConsigneeName: utils.Interface2String(logisticsDeliveryDetail["receiverName"]), ConsigneeMobile: utils.Interface2String(logisticsDeliveryDetail["receiverMobile"]), ConsigneeAddress: utils.Interface2String(logisticsDeliveryDetail["receiverAddress"]), CoordinateType: model.CoordinateTypeMars, ConsigneeLng: jxutils.StandardCoordinate2Int(utils.Str2Float64(utils.Interface2String(logisticsDeliveryDetail["receiverLongitude"]))), ConsigneeLat: jxutils.StandardCoordinate2Int(utils.Str2Float64(utils.Interface2String(logisticsDeliveryDetail["receiverLatitude"]))), BuyerComment: utils.Interface2String(result["buyerRemark"]), ExpectedDeliveredTime: utils.DefaultTimeValue, VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["orderStatus"])), OrderSeq: 0, // StatusTime:, OriginalData: string(utils.MustMarshal(result)), ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["totalAmount"])), } order.Status = p.GetStatusFromVendorStatus(order.VendorStatus) itemList := result["itemList"].([]interface{}) for _, v := range itemList { item := v.(map[string]interface{}) skuName := utils.Interface2String(item["goodsTitle"]) _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName) sku := &model.OrderSku{ VendorOrderID: vendorOrderID, VendorID: model.VendorIDWSC, Count: int(utils.MustInterface2Int64(item["skuNum"])), SkuID: int(utils.Str2Int64(utils.Interface2String(item["skuCode"]))), VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(item["skuId"])), SkuName: skuName, Weight: jxutils.FormatSkuWeight(specQuality, specUnit), // 订单信息里没有重量,只有名字里尝试找 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 } return order, err } func (p *PurchaseHandler) GetStatusActionTimeout(statusType, status int) time.Duration { return 0 } func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { if globals.EnableStoreWrite && globals.EnableWscStoreWrite { if !isAcceptIt { err = api.WeimobAPI.CancelOrder(utils.Str2Int64(order.VendorOrderID), "") } else { // 微商城没有确认,只有取消,模拟接受 p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusAccepted) } } return err } func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, userName string) (err error) { if globals.EnableStoreWrite && globals.EnableWscStoreWrite { // 微商城没有拣货完成,模拟 p.postFakeMsg(utils.Str2Int64(order.VendorOrderID), FakeOrderStatusFinishedPickup) } return err } // 将订单从购物平台配送转为自送 func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { return err } // 将订单从购物平台配送转为自送后又送达 func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { return err } // 完全自送的门店表示开始配送 func (p *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { return err } // 完全自送的门店表示配送完成 func (p *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) { return err } func (p *PurchaseHandler) postFakeMsg(orderNo int64, fakeStatus int) { msg := &weimobapi.CallbackMsg{ IsFake: true, MsgEvent: utils.Int2Str(fakeStatus), OrderNo: orderNo, StatusTime: time.Now(), } go func() { OnCallbackMsg(msg) }() }