diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index f8a4bca26..ef57cfdd1 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -182,7 +182,7 @@ func (c *OrderManager) OnOrderStatusChanged(vendorOrgCode string, orderStatus *m c.OnOrderNew(order, orderStatus) } } - } else if loadOrder.Status < model.OrderStatusAccepted { + } else if loadOrder.Status < model.OrderStatusAccepted && loadOrder.VendorID == model.VendorIDTaoVegetable { loadOrder.Status = model.OrderStatusAccepted loadOrder.VendorStatus = tao_vegetable.OrderStatusNew c.UpdateOrderFields(loadOrder, []string{"Status", "VendorStatus"}) diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index 31fb0718e..7228e5887 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -141,7 +141,7 @@ func (c *BaseScheduler) SelfDeliverDelivering(order *model.GoodsOrder, userName } else if order.VendorID == model.VendorIDDD { //抖音配送 localBill, _ := partner.CurOrderManager.LoadWaybill(order.VendorWaybillID, order.WaybillVendorID) // 获取抖音配送状态 - tiktokWayBillStatus, _ := partner.GetPurchasePlatformFromVendorID(order.VendorID).OrderLogisticsStatus(order.VendorOrderID) + tiktokWayBillStatus, err2 := partner.GetPurchasePlatformFromVendorID(order.VendorID).OrderLogisticsStatus(order.VendorOrderID) if tiktokWayBillStatus != nil && tiktokWayBillStatus.LogisticsStatus >= tiktokShop.ShipmentStatusReceived && tiktokWayBillStatus.LogisticsStatus != tiktokShop.ShipmentStatusCanceled { //取消抖音配送转自送 err = c.CancelWaybill(localBill, partner.CancelWaybillReasonDYPSCancel, partner.CancelWaybillReasonStrDYPSCancel+"抖音骑手已经接单,无法取消") @@ -151,7 +151,10 @@ func (c *BaseScheduler) SelfDeliverDelivering(order *model.GoodsOrder, userName if err := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).SelfDeliverDelivering(order, userName); err != nil { partner.CurOrderManager.OnOrderMsg(order, "抖音转自送,平台无运力", "tiktokWayBillStatus = -1") } + } else if (err2 != nil && strings.Contains(err2.Error(), "当前状态获取不到运力信息")) || (tiktokWayBillStatus != nil && tiktokWayBillStatus.LogisticsStatus == tiktokShop.ShipmentStatusCanceled) { + partner.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelivering(order, "") } else if err = partner.GetPurchasePlatformFromVendorID(order.VendorID).CancelLogisticsByWmOrderId(order, "", "", order.VendorStoreID, order.VendorOrderID); err != nil { + partner.CurOrderManager.OnOrderMsg(order, "取消抖音配送异常:", err.Error()) if err = c.CancelWaybill(localBill, partner.CancelWaybillReasonDYPSCancel, partner.CancelWaybillReasonStrDYPSCancel); err != nil { partner.CurOrderManager.OnOrderMsg(order, "取消抖音平台运单错误,无法转自送", err.Error()) return err diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 441976f06..c55760a5a 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -949,6 +949,11 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa valid["name"] = jxutils.FormalizeName(valid["name"].(string)) store.Name = valid["name"].(string) syncStatus |= model.SyncFlagStoreName + courierList, _ := dao.GetStoreCourierList2(db, []int{storeID}, nil, 0, nil) + for _, v := range courierList { + v.VendorStoreName = store.Name + dao.UpdateEntity(db, v, "VendorStoreName") + } } printerVendorID := int(utils.Interface2Int64WithDefault(valid["printerVendorID"], 0)) if printerVendorID == 0 { @@ -1143,7 +1148,7 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa TryAddStoreBossRole4StoreByMobile(ctx, store.ID, []string{utils.Interface2String(valid["tel1"]), utils.Interface2String(valid["tel2"])}) } if syncStatus&model.SyncFlagStoreAddress != 0 || valid["tel1"] != nil || valid["payeeName"] != nil { - // 修改门店信息(第三方平台同步) + // 修改门店信息(第三方配送平台同步) updateCourierStores(ctx, storeID) } } diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 7df0aa3fd..2e16a79b2 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -195,7 +195,7 @@ func Init() { orderman.UpdateTiktokShopTotalMoney() }, []string{ "03:35:00", - "16:35:00", + "11:05:00", }) /// 更新淘鲜达结算信息 ScheduleTimerFunc("UpdateTaoTotalMoney", func() { @@ -272,7 +272,7 @@ func Init() { ScheduleTimerFuncByInterval(func() { curDate := utils.Time2Date(time.Now()) orderman.FixedOrderManager.AmendMissingOrders(jxcontext.AdminCtx, []int{model.VendorIDJD, model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDDD}, 0, curDate, curDate, true, true) - }, 5*time.Second, 10*time.Minute) + }, 5*time.Second, 5*time.Minute) // 抖音更新门店商品 ,接口收费暂不使用 //if beego.BConfig.RunMode != "jxgy" { diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 2ac73a2da..1b9e52e04 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -345,7 +345,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *mtwmapi.CallbackMsg) (response *mtwmap return response } else { status := c.callbackMsg2Status(msg) - if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { + if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 1 { // 重复消息推送校验,允许推送两次 return nil } if msg.Cmd == mtwmapi.MsgTypeNewOrder { @@ -503,7 +503,6 @@ func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, vendorStatus string) { func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { if isAcceptIt { if globals.EnableMtwmStoreWrite { - // err = api.MtwmAPI.OrderReceived(utils.Str2Int64(order.VendorOrderID)) err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderConfirm(utils.Str2Int64(order.VendorOrderID)) if err != nil { if utils.IsErrMatch(err, utils.Int2Str(mtwmapi.ErrCodeOpFailed), []string{ @@ -515,9 +514,6 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI } } } - // if err == nil { - // c.postFakeMsg(order.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusReceived) - // } } else { if globals.EnableMtwmStoreWrite { err = c.CancelOrder(jxcontext.AdminCtx, order, "bu") diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index 44c24e46e..504ecce37 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -2,6 +2,7 @@ package mtwm import ( "encoding/json" + "fmt" "regexp" "strings" @@ -392,6 +393,28 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI if storeSku.DescImg != "" { foodData["picture_contents"] = storeSku.DescImg } + // 周期性可售时间段 + if storeSku.StatusSaleBegin != model.NO && storeSku.StatusSaleEnd != model.NO { + saleStart := utils.Int2Str(int(storeSku.StatusSaleBegin)) + saleEnd := utils.Int2Str(int(storeSku.StatusSaleEnd)) + for { + if len(saleStart) != 4 { + saleStart = "0" + saleStart + } + if len(saleEnd) != 4 { + saleEnd += "0" + saleEnd + } + if len(saleEnd) == 4 && len(saleStart) == 4 { + break + } + } + saleStart = fmt.Sprintf("%s:%s", saleStart[:2], saleStart[2:]) + saleEnd = fmt.Sprintf("%s:%s", saleEnd[:2], saleEnd[2:]) + availableTimes := fmt.Sprintf("%s-%s", saleStart, saleEnd) + available, _ := json.Marshal(map[string]string{"monday": availableTimes, "tuesday": availableTimes, "wednesday": availableTimes, "thursday": availableTimes, "friday": availableTimes, "saturday": availableTimes, "sunday": availableTimes}) + foodData["available_times"] = string(available) + + } foodData["sequence"] = storeSku.GetSeq() if storeSku.VendorVendorCatID != 0 { foodData["tag_id"] = utils.Int64ToStr(storeSku.VendorVendorCatID) diff --git a/business/partner/purchase/tao_vegetable/order_afs.go b/business/partner/purchase/tao_vegetable/order_afs.go index 03ecfc6ff..a359e8505 100644 --- a/business/partner/purchase/tao_vegetable/order_afs.go +++ b/business/partner/purchase/tao_vegetable/order_afs.go @@ -386,6 +386,15 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal goodsOrder.VendorStatus = orderStatus.VendorStatus dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") // 取消三方运单 + waybill, _ := dao.GetWaybills(db, goodsOrder.VendorOrderID, []int64{model.VendorIDMTPS, model.VendorIDDada, model.VendorIDFengNiao, model.VendorIDUUPT, model.VendorIDSFPS}) + for _, v := range waybill { + err = partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID).Handler.CancelWaybill(v, 0, "订单被取消了") + if err != nil { + partner.CurOrderManager.OnOrderMsg(goodsOrder, fmt.Sprintf("订单[%s]被取消了,运单[%s]取消失败Err: %s", goodsOrder.VendorOrderID, v.VendorWaybillID, err.Error()), "") + } else { + partner.CurOrderManager.OnOrderMsg(goodsOrder, fmt.Sprintf("订单[%s]被取消了,运单[%s]取消成功", goodsOrder.VendorOrderID, v.VendorWaybillID), "") + } + } } } @@ -512,7 +521,7 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod for _, v := range afsSkuOrder { subRefundList = append(subRefundList, domain3156.AlibabaTclsAelophyRefundAgreeSubrefundlist{ OutSubOrderId: utils.String2Pointer(v.VendorSubOrderID), - RefundFee: utils.Int64ToPointer(v.UserMoney), + RefundFee: utils.Int64ToPointer(v.UserMoney / int64(v.Count)), }) } diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index b3c3c32e6..ff46b3dff 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -242,9 +242,10 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s // GetOrderRider 商家自配送同步配送信息 func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - appKey := `7152420904331429407` // 暂时定死 - appSecret := `cc7ba367-2394-4cbb-81c6-26f0e929d1c6` //暂时定死 - return tiktokShop.NewExpress(appKey, appSecret, "").OrderStatusAndPsInfoNew(param) + //appKey := `7152420904331429407` // 暂时定死 + //appSecret := `cc7ba367-2394-4cbb-81c6-26f0e929d1c6` //暂时定死 + //return tiktokShop.NewExpress(appKey, appSecret, "").OrderStatusAndPsInfoNew(param) + return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfoNew(param) } func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) { @@ -653,13 +654,21 @@ func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName ThirdCarrierOrderId: order.VendorOrderID, CourierName: "", CourierPhone: "", - LogisticsProviderCode: "10002", + LogisticsProviderCode: utils.MyselfPsCode, LogisticsStatus: 0, LogisticsContext: "商家自配送,已送达", Latitude: "", Longitude: "", OpCode: tiktokShop.TiktokLogisticsDELIVERED, } + bills, _ := dao.GetWaybills(dao.GetDB(), order.VendorOrderID, nil) + for _, v := range bills { + if v.Status == model.OrderStatusCanceled { + continue + } + riderInfo.CourierName = v.CourierName + riderInfo.CourierPhone = v.CourierMobile + } return c.GetOrderRider("", "", utils.Struct2MapByJson(riderInfo)) } diff --git a/business/partner/purchase/tiktok_store/order_afs_utils.go b/business/partner/purchase/tiktok_store/order_afs_utils.go index 554600739..e3be092a0 100644 --- a/business/partner/purchase/tiktok_store/order_afs_utils.go +++ b/business/partner/purchase/tiktok_store/order_afs_utils.go @@ -124,7 +124,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * } } else { if err2 := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err2 == nil { - if msgId == tiktokShop.CallbackRefundOrderSuccessMsgTagId { + if msgId == tiktokShop.CallbackRefundOrderSuccessMsgTagId || msgId == tiktokShop.CallbackReturnRefundAgreedMsgTagId { skuList, _ := dao.GetSimpleOrderSkus(db, orderStatus.RefVendorOrderID, nil) totalSkuCount := 0 for _, v := range skuList { @@ -142,6 +142,16 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * goodsOrder.VendorStatus = orderStatus.VendorStatus dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") // 取消三方运单 + wayBill, _ := dao.GetWaybills(db, orderStatus.RefVendorOrderID, nil) + for _, v := range wayBill { + if v.Status != model.WaybillStatusCanceled { + if handlerInfo := partner.GetDeliveryPlatformFromVendorID(v.WaybillVendorID); handlerInfo != nil { + if err := handlerInfo.Handler.CancelWaybill(v, 0, "订单被取消了"); err != nil { + partner.CurOrderManager.OnOrderMsg(goodsOrder, "", fmt.Sprintf("抖店订单取消时,取消运单异常:%s", err.Error())) + } + } + } + } } } diff --git a/business/partner/purchase/tiktok_store/waybill.go b/business/partner/purchase/tiktok_store/waybill.go index ab7592b04..a9a6ec786 100644 --- a/business/partner/purchase/tiktok_store/waybill.go +++ b/business/partner/purchase/tiktok_store/waybill.go @@ -39,30 +39,46 @@ func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) func (c *PurchaseHandler) onWaybillMsg(tag, orderId string, data interface{}) *tiktok_api.CallbackResponse { waybill := c.callbackMsg2Waybill(tag, orderId, data) - if localOrder, err := partner.CurOrderManager.LoadOrder(waybill.VendorOrderID, model.VendorIDDD); err == nil { - err := partner.CurOrderManager.OnWaybillStatusChanged(waybill) - if err == nil { - status := &model.OrderStatus{ - VendorOrderID: waybill.VendorOrderID, - VendorID: model.VendorIDDD, - OrderType: model.OrderTypeWaybill, - RefVendorOrderID: waybill.VendorOrderID, - RefVendorID: model.VendorIDDD, - Status: waybill.Status, - VendorStatus: waybill.VendorStatus, - StatusTime: time.Now(), - DuplicatedCount: 0, - Remark: "", - ModelTimeInfo: model.ModelTimeInfo{ - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }, + localOrder, _ := partner.CurOrderManager.LoadOrder(waybill.VendorOrderID, model.VendorIDDD) + // 当前订单的运力状态发生变化时,抖店侧会对open侧推送消息。当前运力状态变化的原因有两个来源:1:呼叫平台运力,平台运力有变化,此时会推送消息;2:商家自配,erp通过回传配送状态触发运力状态变化,此时也会推送消息 + // 问题:当前两种消息来源是没有区分的,都是统一发送消息,但erp侧针对不同的情况有特殊处理,因此需要区分这两种消息 + // 当本地记录骑手数据(非抖音平台运单)与当前运单匹配上是,就直接返回 + if waybill.CourierName != "" && waybill.CourierMobile != "" { + localWaybill, _ := dao.GetWaybills(dao.GetDB(), localOrder.VendorOrderID, nil) + for _, v := range localWaybill { + if v.CourierName != "" && v.CourierMobile != "" && v.WaybillVendorID != model.VendorIDDD && v.CourierName == waybill.CourierName && v.CourierMobile == waybill.CourierMobile { + return tiktok_api.Err2CallbackResponse(nil, "") } - err = partner.CurOrderManager.OnOrderStatusChanged(localOrder.VendorOrgCode, status) } - return tiktok_api.Err2CallbackResponse(err, "") } - return tiktok_api.Err2CallbackResponse(nil, "") + err := partner.CurOrderManager.OnWaybillStatusChanged(waybill) + if err == nil { + status := &model.OrderStatus{ + VendorOrderID: waybill.VendorOrderID, + VendorID: model.VendorIDDD, + OrderType: model.OrderTypeWaybill, + RefVendorOrderID: waybill.VendorOrderID, + RefVendorID: model.VendorIDDD, + Status: waybill.Status, + VendorStatus: waybill.VendorStatus, + StatusTime: time.Now(), + DuplicatedCount: 0, + Remark: "", + ModelTimeInfo: model.ModelTimeInfo{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + } + err = partner.CurOrderManager.OnOrderStatusChanged(localOrder.VendorOrgCode, status) + if err != nil { + partner.CurOrderManager.OnOrderMsg(localOrder, "", "抖店运单骑手状态修改异常:"+err.Error()) + } + if status.VendorStatus == utils.Int2Str(tiktok_api.ShipmentStatusCanceled) { + localOrder.Status = model.WaybillStatusCourierArrived + dao.UpdateEntity(dao.GetDB(), localOrder, "Status") + } + } + return tiktok_api.Err2CallbackResponse(err, "") } func (c *PurchaseHandler) callbackMsg2Waybill(tag, orderId string, data interface{}) (retVal *model.Waybill) {