diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 8ea1ddbc2..95d06ac04 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -518,6 +518,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo // isBlendWay = strings.Contains(mtStoreInfo.LogisticsCodes, model.MTWMStorePSWay8) //} + // 暂时只处理抖音平台,抖音暂无配送,只要是抖音订单,三方配送压单了,直接通知送出 + if order.VendorID == model.VendorIDDD && bill.Status == model.WaybillStatusNew { + s.SelfDeliverDelivering(order, "自配送中") + } + if bill.Status == model.WaybillStatusNew { s.addWaybill2Map(savedOrderInfo, bill) if !isPending { diff --git a/business/model/dao/sku.go b/business/model/dao/sku.go index 514de5182..676d511d4 100644 --- a/business/model/dao/sku.go +++ b/business/model/dao/sku.go @@ -346,7 +346,7 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs LEFT JOIN sku_vendor_category_map tsy ON tsy.name_id = t2.id AND tsy.vendor_id = ? AND tsy.deleted_at = ? WHERE 1 = 1 ` - sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorIDs[0], utils.DefaultTimeValue) + sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, model.VendorIDJD, utils.DefaultTimeValue) if mustDirty { sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0" } else { diff --git a/business/model/dao/thing_map.go b/business/model/dao/thing_map.go index 7eae8d568..fee17da2e 100644 --- a/business/model/dao/thing_map.go +++ b/business/model/dao/thing_map.go @@ -47,10 +47,11 @@ func GetThingToTiktokMapList(db *DaoDB, vendorId int, thingId int64) (cats []*mo sql := ` SELECT t1.* FROM thing_map t1 - WHERE thing_id = ? AND vendor_id = ? t1.deleted_at = ? + WHERE t1.thing_id = ? AND t1.vendor_id = ? AND t1.deleted_at = ? ` sqlParams := []interface{}{ - vendorId, thingId, + thingId, + vendorId, utils.DefaultTimeValue, } diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index 2d6c1f9cd..8fbd05fbf 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -103,7 +103,6 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s InvoiceTaxerID: "", InvoiceEmail: "", VendorOrgCode: vendorOrgCode, - TotalShopMoney: utils.Float64TwoInt64(float64(result.PayAmount) * 0.95), // 抖音平台扣点金额0.05 } // 本地获取订单记录 orderSeq, _ := dao.GetVendorOrderNumber(dao.GetDB(), model.VendorIDDD, order.VendorStoreID) @@ -128,6 +127,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s order.DiscountMoney = result.PromotionAmount vendorStoreIdRelly := "" // 门店id vendorNameRelly := "" // 门店id + var salePrice int64 = 0 // 添加需要赠送的东西(暂时没有赠品套餐直接商品) multiSkuMap := make(map[int]int) if len(result.SkuOrderList) > 0 { @@ -171,8 +171,10 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s order.Skus = append(order.Skus, sku) vendorStoreIdRelly = extra.StoreInfo.StoreId vendorNameRelly = extra.StoreInfo.StoreName + salePrice += sku.SalePrice } } + order.TotalShopMoney = utils.Float64TwoInt64(float64(salePrice) * 0.95) // 抖音平台扣点金额0.05 // 预订单还是快速达 localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode) @@ -479,7 +481,7 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Status = model.OrderStatusUnknown orderStatus.Remark = "126-预约发货:" shopId = orderMsg.ShopId - case tiktokShop.CallbackWaitOrderMsgTagId: // 应为需要同步京东,美团拣货功能制作的假拣货,抖音不存在拣货 + case FakeMsgType: // 应为需要同步京东,美团拣货功能制作的假拣货,抖音不存在拣货 orderMsg := tiktokShop.FakePickUpGoodsData{} if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { return nil, 0 @@ -489,7 +491,7 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.StatusTime = time.Now() orderStatus.Status = model.OrderStatusFinishedPickup orderStatus.Remark = "15-抖音假拣货:" - shopId = 0 + shopId = orderMsg.ShopId default: return nil, 0 } @@ -508,9 +510,14 @@ func vendorStatusToLocalStatus(vendorStatus int64) int { return model.OrderStatusUnknown } -func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, vendorStatus string) { - msg := &tiktokShop.FakePickUpGoodsData{PId: vendorOrderID, VendorStatus: vendorStatus} - +func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, VendorStatus, appOrgCode string) { + // c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup) + msg := &tiktokShop.FakePickUpGoodsData{ + PId: vendorOrderID, + VendorStatus: VendorStatus, + Cmd: cmd, + ShopId: utils.Str2Int64(appOrgCode), + } utils.CallFuncAsync(func() { c.onOrderMsg(cmd, vendorOrderID, msg) }) @@ -547,7 +554,7 @@ func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo // err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").PreparationMealComplete(utils.Str2Int64(order.VendorOrderID)) // } //} - c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup) + c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup, order.VendorOrgCode) return nil } @@ -568,12 +575,19 @@ func (c *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan return order.BusinessType != model.BusinessTypeDingshida, nil } -// Swtich2SelfDeliver 暂无转自送 +// Swtich2SelfDeliver 抖音转自送的时候就是通知抖音发货了 func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { - //if globals.EnableMtwmStoreWrite { - // err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderLogisticsChange2Self(utils.Str2Int64(order.VendorOrderID)) - //} - return err + return getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderDelivering(&order_logisticsAdd_request.OrderLogisticsAddParam{ + OrderId: order.VendorOrderID, + Company: "", + CompanyCode: "chengdouruoxi", + LogisticsCode: order.VendorWaybillID, + IsRefundReject: false, + IsRejectRefund: false, + SerialNumberList: nil, + AddressId: 0, + StoreId: utils.Str2Int64(order.VendorStoreID), + }) } // Swtich2SelfDelivered 暂无自送完成 @@ -642,12 +656,15 @@ func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod // CancelOrder 取消订单 (抖音商家无法发起退单操作,商家联系不到客户取消订单/拒收/缺货) func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { - if globals.EnableDdStoreWrite { - return errors.New("抖音商家无法发起退单操作") - //if err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderCancel(utils.Str2Int64(order.VendorOrderID), reason, mtwmapi.CancelReasonOther); err == nil { - // // 调用开放平台接口取消订单,不推送取消订单消息和退款消息。 - // c.postFakeMsg(order.VendorOrderID, tiktokShop.CallbackCancelOrderMsgTagId, utils.Int2Str(tiktokShop.CreateOrderStatusCancel)) - //} + // 售后原因枚举 MissGram = 1缺重,必传克数、金额; MissItem = 2缺货,只支持整单退; RefuseSign = 3 拒收,支持按件数退,金额由抖音计算 + // 获取订单商品数量 + var count = 0 + for _, v := range order.Skus { + count += v.Count + } + if _, err = getAPI(order.VendorOrgCode, 0, "").ApplyMarketAfterSale(utils.Str2Int64(order.VendorOrderID), int64(count), 3); err == nil { + // 调用开放平台接口取消订单,不推送取消订单消息和退款消息。 + c.postFakeMsg(order.VendorOrderID, tiktokShop.CallbackCancelOrderMsgTagId, utils.Int2Str(tiktokShop.CreateOrderStatusCancel), order.VendorOrgCode) } return err } @@ -663,7 +680,7 @@ func (c *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.Goods for _, sku := range removedSkuList { // todo 商家发起部分退单,传入参数为子订单id,子订单id需要存储,返回售后单id - _, err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").ApplyMarketAfterSale(utils.Str2Int64(sku.VendorOrderID), 2) + _, err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").ApplyMarketAfterSale(utils.Str2Int64(sku.VendorOrderID), int64(sku.Count), 2) } return err } diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index 75a66dcda..c58c17f81 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -1,8 +1,8 @@ package tiktok_store import ( + "fmt" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" - product_editV2_commit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2_commit/request" sku_editPrice_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_editPrice/request" sku_syncStock_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_syncStock/request" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" @@ -211,28 +211,53 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v return failedList, err } -// UpdateStoreSkusStatus 批量更新商品上下架 +// UpdateStoreSkusStatus 批量更新商品上下架(上架商品库存更新最大,下架商品库存为0) func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) { api := getAPI(vendorOrgCode, storeID, vendorStoreID) - if status == model.SkuStatusNormal { // 上架 + if status == model.SkuStatusNormal { // 下架 for _, v := range storeSkuList { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, false) - if err := api.EditStoreCommodityCommit(&product_editV2_commit_request.ProductEditV2Param2{ - ProductId: utils.Str2Int64(v.VendorSkuID), - Commit: true, - }); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品异常")...) + //if err := api.EditStoreCommodityCommit(&product_editV2_commit_request.ProductEditV2Param2{ + // ProductId: utils.Str2Int64(v.VendorSkuID), + // Commit: true, + //}); err != nil { + // failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...) + //} else { + // failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...) + //} + param := &sku_syncStock_request.SkuSyncStockParam{ + SkuId: utils.Str2Int64(v.VendorSkuAttrId), + ProductId: utils.Str2Int64(v.VendorSkuID), + Incremental: false, + IdempotentId: "", + StockNum: 0, + OutWarehouseId: vendorStoreID, + } + if err := api.UpdateSkuStock(param); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) } else { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品正常")...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架商品正常,添加固定库存.%s", utils.Format4Output(param, false)))...) } } - } else { // 下架 + } else { // 上架 for _, v := range storeSkuList { - err := api.ProductSetOffline(utils.Str2Int64(v.VendorSkuID)) - if err == nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...) + //err := api.ProductSetOffline(utils.Str2Int64(v.VendorSkuID)) + //if err == nil { + // failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...) + //} else { + // failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...) + //} + param := &sku_syncStock_request.SkuSyncStockParam{ + SkuId: utils.Str2Int64(v.VendorSkuAttrId), + ProductId: utils.Str2Int64(v.VendorSkuID), + Incremental: false, + IdempotentId: "", + StockNum: 99999, + OutWarehouseId: vendorStoreID, + } + if err := api.UpdateSkuStock(param); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) } else { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) } } } diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 3deae5052..a8afe201a 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -73,6 +73,8 @@ func QueryAllMainSkuList(appOrgCode string, param *MainSku) ([]*TiktokIdAndLocal localSkuId = skuDetail.OutProductId } else if skuDetail.OuterProductId != "" { localSkuId = utils.Str2Int64(skuDetail.OuterProductId) + } else { + localSkuId = utils.Str2Int64(skuDetail.SpecPrices[0].Code) } var attrId []string @@ -122,8 +124,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID) if isCreate { syncType = "创建商品" - for _, storeSku := range storeSkuList { - // 创建商品 + for _, storeSku := range storeSkuList { // 创建商品 param := &product_addV2_request.ProductAddV2Param{ CategoryLeafId: utils.Str2Int64(storeSku.SkuVendorMapCatID), Name: utils.LimitUTF8StringLen(storeSku.SkuName, mtwmapi.MaxSkuNameCharCount), @@ -135,7 +136,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI Supply7dayReturn: 2, // 是否支持7天无理由,0不支持,1支持,2支持(拆封后不支持) Mobile: storeDetail.Tel1, Commit: true, - Specs: "净重|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, + Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, NeedRechargeMode: false, SellChannel: []int64{0}, StartSaleType: 0, @@ -182,21 +183,30 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI // 根据本地商品id获取线上商品是否存在,存在则只创建子商品 var tiktokResultProductId int64 = 0 // 获取本地存储映射关系 - localThing, _ := dao.GetThingToTiktokMapList(dao.GetDB(), model.VendorIDDD, int64(storeSku.SkuID)) + globals.SugarLogger.Debugf("=======storeSku.SkuID :%d", storeSku.SkuID) + globals.SugarLogger.Debugf("=======storeSku :%s", utils.Format4Output(storeSku, false)) + localThing, err := dao.GetThingToTiktokMapList(dao.GetDB(), model.VendorIDDD, int64(storeSku.SkuID)) + globals.SugarLogger.Debugf("=======localThing :%s", utils.Format4Output(localThing, false)) + globals.SugarLogger.Debugf("=======localThing :%s", utils.Format4Output(localThing, false)) + globals.SugarLogger.Debugf("localThing=======err :%s", err) if len(localThing) == 0 { // 线上不存在创建 tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品 if err != nil { + globals.SugarLogger.Debugf("CreateStoreCommodity=======err :%s", err) failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } + globals.SugarLogger.Debugf("tiktokResult=======err :%s", utils.Format4Output(tiktokResult, false)) + tiktokResultProductId = tiktokResult.ProductId var attrId []string for _, v := range tiktokResult.Sku { attrId = append(attrId, utils.Int64ToStr(v.SkuId)) } storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID - dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId) + err = dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId) + globals.SugarLogger.Debugf("err=============%s", err) } else { storeSku.VendorMainId = localThing[0].VendorThingID storeSku.VendorSkuAttrId = localThing[0].Remark // 属性id skuID @@ -236,6 +246,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResultProductId, storeSku) param.StoreId = utils.Str2Int64(vendorStoreID) + globals.SugarLogger.Debugf("CreateStoreCommodity==========:%s", utils.Format4Output(param, false)) // 抖店创建子商品 tiktokResultChildren, err := api.CreateStoreCommodity(param) if err != nil { @@ -262,7 +273,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI Supply7dayReturn: 2, Mobile: storeDetail.Tel1, Commit: true, - Specs: "净重|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit, + Specs: "重量|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit, NeedRechargeMode: false, SellChannel: []int64{0}, StartSaleType: 0, @@ -530,13 +541,9 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, }, } - if mainSkuId == 0 { - sku.StockNum = 0 - } else { - sku.StockNum = 0 - sku.SkuType = 1 - sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} - } + sku.StockNum = localSku.Stock + sku.SkuType = 1 + sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} skuSize = append(skuSize, sku) } case 2: @@ -556,13 +563,9 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, }, } - if mainSkuId == 0 { - sku.StockNum = 0 - } else { - sku.StockNum = 0 - sku.SkuType = 1 - sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} - } + sku.StockNum = localSku.Stock + sku.SkuType = 1 + sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} skuSize = append(skuSize, sku) } } @@ -586,13 +589,10 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, }, } - if mainSkuId == 0 { - sku.StockNum = 0 - } else { - sku.StockNum = 0 - sku.SkuType = 1 - sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} - } + sku.StockNum = localSku.Stock + sku.StockNum = 0 + sku.SkuType = 1 + sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)} skuSize = append(skuSize, sku) } }