diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 5cf03a55d..4a36b1cd3 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -1595,8 +1595,6 @@ func AddStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, vendorID int, vend _, err = CurVendorSync.SyncStore(ctx, db, storeMap.VendorID, storeID, false, userName) _, err = CurVendorSync.FullSyncStoresSkus(ctx, db, []int{vendorID}, []int{storeID}, true, nil, true, true) if utils.IsNil(errList) && err == nil { - globals.SugarLogger.Debug("utils.IsNil(errList)==============", utils.IsNil(errList)) - globals.SugarLogger.Debug("fakeErr===========%v,%v", errList, err) return outStoreMap, nil } else { return outStoreMap, errors.New(fmt.Sprintf("errList=%s,err=%v", utils.Format4Output(errList, true), err)) @@ -1786,7 +1784,6 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor } dao.Commit(db, txDB) if isStoreMapNeedSync(vendorID, valid) { - globals.SugarLogger.Debug("1.isStoreMapNeedSync(vendorID, valid)=================", isStoreMapNeedSync(vendorID, valid)) _, err = CurVendorSync.SyncStore(ctx, db, vendorID, storeID, false, userName) globals.SugarLogger.Debug("CurVendorSync.SyncStore:err======%v", err) } @@ -1794,7 +1791,6 @@ func UpdateStoreVendorMap(ctx *jxcontext.Context, db *dao.DaoDB, storeID, vendor } errList.AddErr(err) endErr := errList.GetErrListAsOne() - globals.SugarLogger.Info("endErr==============", endErr) return num, endErr } diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 721c52656..7ee10f510 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -231,7 +231,6 @@ func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB // } func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs, storeIDs []int, mustDirty, isAsync bool) (hint string, err error) { - globals.SugarLogger.Debug("进入SyncStore2了") userName := ctx.GetUserName() isManageIt := len(storeIDs) == 0 || len(storeIDs) > 5 _, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步门店信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs, mustDirty, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (resultList interface{}, err error) { @@ -258,7 +257,6 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店") } } else if model.IsSyncStatusDelete(storeMap.SyncStatus) { - globals.SugarLogger.Debugf("2.IsSyncStatusDelete(storeMap.SyncStatus)") if err = handler.DeleteStore(db2, storeMap.StoreID, userName); err == nil { resultList = append(resultList, 1) } else { @@ -274,12 +272,10 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs } if err == nil { if model.IsSyncStatusNew(storeMap.SyncStatus) { - globals.SugarLogger.Debug("进入 model.IsSyncStatusNew(storeMap.SyncStatus)") storeMap.VendorStoreID = vendorStoreID storeMap.SyncStatus = 0 _, err = dao.UpdateEntity(db, storeMap, "VendorStoreID", model.FieldSyncStatus) } else { - globals.SugarLogger.Debug("进入 model.IsSyncStatusNew(storeMap.SyncStatus) else") storeMap.SyncStatus = 0 _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) } @@ -302,7 +298,6 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店") } } else if model.IsSyncStatusDelete(storeMap.SyncStatus) { - globals.SugarLogger.Debug("进入handler.DeleteStore") if err = handler.DeleteStore(db2, storeMap.StoreID, userName); err == nil { resultList = append(resultList, 1) } else { @@ -496,8 +491,6 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v // func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) { isManageIt := len(storeIDs) != 1 || len(skuIDs) == 0 || len(skuIDs) > 8 - globals.SugarLogger.Debugf("============2") - funcParam := func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil { diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 2a06c820b..1ab88174e 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -103,7 +103,6 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo } } if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除 4 - globals.SugarLogger.Debugf("============5:删除") if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) { err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level) if err != nil && handler.IsErrCategoryNotExist(err) { @@ -113,7 +112,6 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo } } } else if model.IsSyncStatusNew(catInfo.CatSyncStatus) { // 新增 2 - globals.SugarLogger.Debugf("============6:新增") err = handler.CreateStoreCategory(ctx, storeID, vendorStoreID, catInfo) if err != nil && handler.IsErrCategoryExist(err) { if cat, err2 := handler.GetStoreCategory(ctx, storeID, vendorStoreID, catInfo.Name); err2 == nil { @@ -131,7 +129,6 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo // } } } else if model.IsSyncStatusUpdate(catInfo.CatSyncStatus) { // 修改 1 - globals.SugarLogger.Debugf("============7:修改") err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo) if err == nil { updateFields = append(updateFields, idFieldName) @@ -176,7 +173,6 @@ func SyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag } func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isAsync, isContinueWhenError bool) (hint string, err error) { - globals.SugarLogger.Debugf("============4") singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) if singleStoreHandler != nil { // 本地创建商品分类 if err = CreateStoreCategoryByStoreSku(ctx, vendorID, storeID, vendorStoreID, nameIDs, skuIDs); err != nil { @@ -681,14 +677,6 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag // } } - globals.SugarLogger.Debugf("============createList := %s", utils.Format4Output(createList, false)) - globals.SugarLogger.Debugf("============updateList := %s", utils.Format4Output(updateList, false)) - globals.SugarLogger.Debugf("============deleteList := %s", utils.Format4Output(deleteList, false)) - globals.SugarLogger.Debugf("============stockList := %s", utils.Format4Output(stockList, false)) - globals.SugarLogger.Debugf("============onlineList := %s", utils.Format4Output(onlineList, false)) - globals.SugarLogger.Debugf("============offlineList := %s", utils.Format4Output(offlineList, false)) - globals.SugarLogger.Debugf("============priceList := %s", utils.Format4Output(priceList, false)) - task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) @@ -1172,9 +1160,7 @@ func GetSensitiveWord(singleStoreHandler partner.ISingleStoreStoreSkuHandler, st } func MergeSkuSaleStatusWithStoreOpTime(sku *dao.StoreSkuSyncInfo, storeDetail *dao.StoreDetail, now int16) (outStatus int) { - if sku.MergedStatus == model.SkuStatusNormal && - sku.StatusSaleBegin > 0 && sku.StatusSaleEnd > 0 && - storeDetail.Status == model.StoreStatusOpened { + if sku.MergedStatus == model.SkuStatusNormal && sku.StatusSaleBegin > 0 && sku.StatusSaleEnd > 0 && storeDetail.Status == model.StoreStatusOpened { //商品可售时间的差集与门店营业时间的交集为不可售,其余为原本状态 var openTime int16 var closeTime int16 diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 9edc32907..64fbf4f34 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -751,6 +751,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf if err = GetRows(db, &skus, sql, sqlParams...); err != nil { return nil, err } + return skus, err } @@ -794,7 +795,6 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve // 这个函数之前是要设置没有删除或同步标志不为0的,会导致将同步标志不为0且删除了的把标志去掉,现在改为只设置没有删除的 func SetStoreSkuSyncStatus(db *DaoDB, vendorID int, storeIDs []int, skuIDs []int, syncStatus int) (num int64, err error) { - globals.SugarLogger.Debugf("============3") isSingleStorePF := model.MultiStoresVendorMap[vendorID] != 1 fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` diff --git a/business/model/dao/thing_map.go b/business/model/dao/thing_map.go index fee17da2e..67875ba97 100644 --- a/business/model/dao/thing_map.go +++ b/business/model/dao/thing_map.go @@ -37,6 +37,10 @@ func CreateThingMap(thingId int64, vendorThingID, appOrgCode, skuAttrId string) Remark: skuAttrId, SyncStatus: 0, } + // 正常来说这个skuAttrId 不应该为空 + if skuAttrId == "" { + thingMap.Remark = "这个值不应该为空才对" + } WrapAddIDCULDEntity(thingMap, "jxadmin") return CreateEntity(GetDB(), thingMap) diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 75c67ae9b..c47d3eee9 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -97,9 +97,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap order.Status = model.WaybillStatusUnknown } err := dadaapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) - defer func(order *model.Waybill) { - delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 - }(order) + defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if order.OrderVendorID == model.VendorIDDD { result := &mtpsapi.RiderInfo{ OrderId: order.VendorOrderID, @@ -110,7 +108,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap LogisticsStatus: order.Status, OpCode: "", } - switch order.Status { + switch msg.OrderStatus { case dadaapi.OrderStatusWaitingForAccept: // 待接单,召唤骑手 result.LogisticsStatus = model.WaybillStatusNew result.LogisticsContext = model.RiderWaitRider @@ -489,8 +487,6 @@ func (c *DeliveryHandler) GetRidderPosition(ctx *jxcontext.Context, vendorOrgCod // 获取骑手信息(订单详情) func (c *DeliveryHandler) GetRiderInfo(orderId string, deliveryId int64, mtPeisongId string) (rider *mtpsapi.RiderInfo, err error) { order, err := api.DadaAPI.QueryOrderInfo(orderId) - globals.SugarLogger.Debugf("order111111111111 := %s", utils.Format4Output(order, false)) - globals.SugarLogger.Debugf("order111111111111 := %s", utils.Format4Output(err, false)) if err != nil { return nil, err } @@ -542,8 +538,5 @@ func (c *DeliveryHandler) GetRiderInfo(orderId string, deliveryId int64, mtPeiso result.LogisticsStatus = 0 result.LogisticsContext = model.RiderGetOrderDeliverOther } - - globals.SugarLogger.Debugf("dadaresult_order := %s", utils.Format4Output(order, false)) - globals.SugarLogger.Debugf("result_result := %s", utils.Format4Output(result, false)) return result, nil } diff --git a/business/partner/delivery/fn/waybill.go b/business/partner/delivery/fn/waybill.go index a682bee22..61aa75359 100644 --- a/business/partner/delivery/fn/waybill.go +++ b/business/partner/delivery/fn/waybill.go @@ -255,6 +255,46 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify) (resp *fnpsapi.CallbackRespon if err := partner.CurOrderManager.OnWaybillStatusChanged(order); err != nil { return fnpsapi.Err2CallbackResponse(err, "") } + + if order.OrderVendorID == model.VendorIDDD { + result := &mtpsapi.RiderInfo{ + OrderId: order.VendorOrderID, + ThirdCarrierOrderId: order.VendorOrderID, + CourierName: order.CourierName, + CourierPhone: order.CourierMobile, + LogisticsProviderCode: "10002", + LogisticsStatus: order.Status, + OpCode: "", + } + switch orderStatus { + case fnpsapi.OrderStatusAcceptCreate, fnpsapi.OrderStatusAccept: // 待接单,召唤骑手 + result.LogisticsStatus = model.WaybillStatusNew + result.LogisticsContext = model.RiderWaitRider + case fnpsapi.OrderStatusAssigned: //20分配骑手 待取货 + result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 + result.LogisticsContext = model.RiderWaitGetGoods + case fnpsapi.OrderStatusDelivering: // 2 配送中 // 配送中 + result.LogisticsStatus = model.WaybillStatusDelivering + result.LogisticsContext = model.RiderGetOrderDelivering + case fnpsapi.OrderStatusDelivered: // 3 已经送达 // 完成 + result.LogisticsStatus = model.WaybillStatusDelivered + result.LogisticsContext = model.RiderGetOrderDelivered + case fnpsapi.OrderStatusAcceptCacle: // 取消 + result.LogisticsStatus = model.WaybillStatusCanceled + result.LogisticsContext = model.RiderGetOrderCanceled + case fnpsapi.OrderStatusException: // 5 异常: // 配送异常返回值 + result.LogisticsStatus = model.WaybillStatusDeliverFailed + result.LogisticsContext = model.RiderGetOrderDeliverFailed + case fnpsapi.OrderStatusArrived: // 80 到店 // 骑手到店 + result.LogisticsStatus = model.WaybillStatusCourierArrived + result.LogisticsContext = model.RiderToStore + default: + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + } + delivery.PullTiktokRiderInfo(result) + } + defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 return fnpsapi.Err2CallbackResponse(nil, "") } diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 002c8b9d7..c00617bd4 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -171,8 +171,6 @@ func PullTiktokRiderInfo(riderInfo *mtpsapi.RiderInfo) { riderInfo.LogisticsStatus = 40 riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED case 115: // 取消 - riderInfo.CourierName = "" - riderInfo.CourierPhone = "" riderInfo.LogisticsStatus = 100 riderInfo.OpCode = tiktok_api.TiktokLogisticsCANCELDELIVERY case 22, 0, 120: // 异常配送 @@ -181,14 +179,14 @@ func PullTiktokRiderInfo(riderInfo *mtpsapi.RiderInfo) { } if riderInfo.CourierPhone == "" { - riderInfo.CourierPhone = "18981810000" + riderInfo.CourierPhone = " 暂无电话 " } if riderInfo.CourierName == "" { - riderInfo.CourierName = "暂无" + riderInfo.CourierName = " 暂无骑手 " } if riderInfo.LogisticsStatus != 22 && riderInfo.LogisticsStatus != 120 && riderInfo.LogisticsStatus != 0 { - riderInfo.LogisticsContext += fmt.Sprintf(riderInfo.LogisticsContext, riderInfo.CourierName, riderInfo.CourierPhone) + riderInfo.LogisticsContext = fmt.Sprintf(riderInfo.LogisticsContext, riderInfo.CourierName, riderInfo.CourierPhone) } // 呼叫骑手的时候推送发货 diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index 53f7a36c8..e648747af 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -219,8 +219,8 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s // GetOrderRider 商家自配送同步配送信息 func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - appKey := `7153997323561879075` // 暂时定死 - appSecret := `3517d3ea-b96b-4379-a7a4-2d9389e8ffeb` //暂时定死 + appKey := `7152420904331429407` // 暂时定死 + appSecret := `cc7ba367-2394-4cbb-81c6-26f0e929d1c6` //暂时定死 return tiktokShop.NewExpress(appKey, appSecret, "").OrderStatusAndPsInfo(param) } diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index 82b009442..a7cd0563c 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -281,17 +281,17 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { api := getAPI(vendorOrgCode, storeID, vendorStoreID) for _, v := range storeSkuList { - // 更新主品 - err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ - Price: v.VendorPrice, - SkuId: utils.Str2Int64(v.VendorSkuAttrId), - ProductId: utils.Str2Int64(v.VendorMainId), - }) - 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], "更新主品价格正常")...) - } + // 更新主品 (暂不支持渠道主商品) + //err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ + // Price: v.VendorPrice, + // SkuId: utils.Str2Int64(v.VendorSkuAttrId), + // ProductId: utils.Str2Int64(v.VendorMainId), + //}) + //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], "更新主品价格正常")...) + //} // 更新子品 err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index f9bbacaa4..48ddf1f4d 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -125,15 +125,18 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI if isCreate { syncType = "创建商品" for _, storeSku := range storeSkuList { // 创建商品 + // 如果当前商品,主商品id,子商品id都已经存在了,就不在创建了,主要防止,后期更新时,某些商品为创建成功,批量修改数据库再去批量创建报错(商品已创建) + if storeSku.VendorMainId != "" && storeSku.VendorSkuID != "" && len(storeSku.VendorSkuID) == 19 { + continue + } param := &product_addV2_request.ProductAddV2Param{ - CategoryLeafId: utils.Str2Int64(storeSku.SkuVendorMapCatID), Name: utils.LimitUTF8StringLen(storeSku.SkuName, mtwmapi.MaxSkuNameCharCount), PayType: tiktokShop.TiktokPayType1, ReduceType: tiktokShop.SkuReduceTypePayMakeOrder, Weight: utils.Int2Float64(storeSku.Weight), DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay, PresellType: tiktokShop.SendGoodsTypeNow, - Supply7dayReturn: 2, // 是否支持7天无理由,0不支持,1支持,2支持(拆封后不支持) + Supply7dayReturn: 0, // 是否支持7天无理由,0不支持,1支持,2支持(拆封后不支持) Mobile: storeDetail.Tel1, Commit: true, Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, @@ -143,64 +146,49 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI PickupMethod: "0", OuterProductId: utils.Int2Str(storeSku.SkuID), // 本地skuId为外部商品id } - // param.AccountTemplateId = "" + // 部分商品没有所属的分类,直接跳过! + if storeSku.SkuVendorMapCatID != "" { + param.CategoryLeafId = utils.Str2Int64(storeSku.SkuVendorMapCatID) + } else if storeSku.VendorVendorCatID != 0 { + param.CategoryLeafId = storeSku.VendorVendorCatID + } else { + continue + } + // 是否支持七天无理由 + if api.GetProductUpdateRule(param.CategoryLeafId) { + param.Supply7dayReturn = 1 + } else { + param.Supply7dayReturn = 0 + } + // 获取上传图,商品轮播图 - img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) + img, detailImg, err := GetTiktokImgList(api, utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) if err != nil { return nil, err } param.Pic = img - // 商品详情图 - if storeSku.DescImg == "" { - param.Description = strings.Split(img, ",")[0] - } else { - img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg) - if err != nil { - return nil, err - } - param.Description = img2 - } + param.Description = detailImg // weight_unit 目前抖音只支持g和kg两种 - switch storeSku.Unit { - case "g", "ml", "G", "ML": - param.WeightUnit = tiktokShop.WeightUint_G - case "kg", "l", "L", "KG": - param.WeightUnit = tiktokShop.WeightUint_G - } + //switch storeSku.Unit { + //case "g", "ml", "G", "ML": + param.WeightUnit = tiktokShop.WeightUint_G + //case "kg", "l", "L", "KG": + // param.WeightUnit = tiktokShop.WeightUint_G + //} // spec_prices param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) // 获取商品的属性 - if storeSku.TiktokAttribute == "" || storeSku.TiktokAttribute == "{}" { - categoryList, err := api.GetCatePropertyV2(param.CategoryLeafId) + if storeSku.TiktokAttribute != "" && storeSku.TiktokAttribute != "{}" { + param.ProductFormatNew = storeSku.TiktokAttribute + } else if storeSku.VendorSkuAttrId != "" && storeSku.VendorSkuAttrId != "{}" { + param.ProductFormatNew = storeSku.TiktokAttribute + } else { + param.ProductFormatNew, err = MakeProductFormatNew(api, int64(storeSku.NameID), param.CategoryLeafId) if err != nil { return nil, err } - categoryMap := make(map[string][]map[string]interface{}) - for _, v := range categoryList.Data.Data { - if v.Required == model.YES { - options := make([]map[string]interface{}, 0) - if v.PropertyName == "品牌" { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 789194134, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } else if v.PropertyName == "产地" { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 13850, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } else if len(options) == 0 { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 0, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } else { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": v.Options[0].Value, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } - } - continue - } - param.ProductFormatNew = utils.Format4Output(categoryMap, false) - dao.UpdateSkuNameTiktokAttr(dao.GetDB(), int64(storeSku.NameID), param.ProductFormatNew) - } else { - param.ProductFormatNew = storeSku.TiktokAttribute } // 获取品牌 @@ -272,7 +260,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI tiktokResultChildren, err := api.CreateStoreCommodity(param) if err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + if storeSku.VendorSkuID == "" { + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } continue } var attrId2 []string @@ -286,79 +276,55 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { syncType = "更新商品" for _, storeSku := range storeSkuList { + if storeSku.StoreSkuStatus != 1 { // 未可售的商品不参与修改 + continue + } // 更新商品(目前只更新子商品,主商品暂不支持) param := &product_editV2_request.ProductEditV2Param{ - CategoryLeafId: utils.Str2Int64(storeSku.SkuVendorMapCatID), Name: storeSku.Name, PayType: tiktokShop.TiktokPayType1, ReduceType: tiktokShop.SkuReduceTypePayMakeOrder, Weight: utils.Int2Float64(storeSku.Weight), DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay, PresellType: tiktokShop.SendGoodsTypeNow, - Supply7dayReturn: 2, + Supply7dayReturn: 0, Mobile: storeDetail.Tel1, Commit: true, - Specs: "重量|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit, + Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, NeedRechargeMode: false, SellChannel: []int64{0}, StartSaleType: 0, PickupMethod: "0", } - // param.AccountTemplateId = "" + if storeSku.SkuVendorMapCatID != "" { + param.CategoryLeafId = utils.Str2Int64(storeSku.SkuVendorMapCatID) + } else { + param.CategoryLeafId = storeSku.VendorVendorCatID + } + // 获取上传图,商品轮播图 - img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) + img, detailImg, err := GetTiktokImgList(api, utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5, storeSku.DescImg) if err != nil { return nil, err } param.Pic = img - // 商品详情图 - if storeSku.DescImg == "" { - param.Description = strings.Split(img, ",")[0] - } else { - img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg) - if err != nil { - return nil, err - } - param.Description = img2 - } + param.Description = detailImg // weight_unit 目前抖音只支持g和kg两种 - switch storeSku.Unit { - case "g", "ml", "G", "ML": - param.WeightUnit = tiktokShop.WeightUint_G - case "kg", "l", "L", "KG": - param.WeightUnit = tiktokShop.WeightUint_G - } + //switch storeSku.Unit { + //case "g", "ml", "G", "ML": + param.WeightUnit = tiktokShop.WeightUint_G + //case "kg", "l", "L", "KG": + // param.WeightUnit = tiktokShop.WeightUint_G + //} - param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) + //param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) // 获取商品的属性 if storeSku.TiktokAttribute == "" || storeSku.TiktokAttribute == "{}" { - categoryList, err := api.GetCatePropertyV2(param.CategoryLeafId) + param.ProductFormatNew, err = MakeProductFormatNew(api, int64(storeSku.NameID), param.CategoryLeafId) if err != nil { return nil, err } - categoryMap := make(map[string][]map[string]interface{}) - for _, v := range categoryList.Data.Data { - if v.Required == model.YES { - options := make([]map[string]interface{}, 0) - if v.PropertyName == "品牌" { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 789194134, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } else if v.PropertyName == "产地" { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 13850, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } else if len(options) == 0 { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 0, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } else { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": v.Options[0].Value, "diy_type": v.DiyType}) - categoryMap[utils.Int64ToStr(v.PropertyId)] = options - } - } - continue - } - param.ProductFormatNew = utils.Format4Output(categoryMap, false) - dao.UpdateSkuNameTiktokAttr(dao.GetDB(), int64(storeSku.NameID), param.ProductFormatNew) } else { param.ProductFormatNew = storeSku.TiktokAttribute } @@ -376,6 +342,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI // 创建子商品 //param.FreightId = freightId param.ProductId = utils.Str2Int64(storeSku.VendorSkuID) + param.MainProductId = utils.Str2Int64(storeSku.VendorMainId) + param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, param.MainProductId, storeSku) //param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResult.ProductId, storeSku) // 获取门店限售模板 //saleLimitId, err := CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) @@ -383,7 +351,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI // return nil, err //} //param.SaleLimitId = saleLimitId - //param.StoreId = utils.Str2Int64(vendorStoreID) + param.StoreId = utils.Str2Int64(vendorStoreID) // 抖店创建商品 if err := api.EditStoreCommodity(param); err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) @@ -543,9 +511,8 @@ func GetProductFormatNew(categoryLeftId int64, vendorOrgCode string) (*product_g } // GetTiktokImgList 获取抖音图片链接 -func GetTiktokImgList(storeId, appOrgCode string, img ...string) (string, error) { +func GetTiktokImgList(api *tiktokShop.API, storeId, appOrgCode string, detailImg string, img ...string) (string, string, error) { imgs := make([]tiktokShop.Imgs, 0, 0) - var tiktokImg []string for _, v := range img { if v != "" { imgs = append(imgs, tiktokShop.Imgs{ @@ -554,21 +521,61 @@ func GetTiktokImgList(storeId, appOrgCode string, img ...string) (string, error) }) } } - tiktokImgList, err := getAPI(appOrgCode, 0, "").BatchUploadImages(imgs) + if detailImg != "" { + imgs = append(imgs, tiktokShop.Imgs{ + Name: "detail_" + storeId + "_" + detailImg[21:54], + Url: detailImg, + }) + } + tiktokImgList, err := api.BatchUploadImages(imgs) + if err != nil { + return "", "", err + } + + detailTiktok := "" + var tiktokImg []string + for _, v := range tiktokImgList { + if strings.Contains(v.Name, "detail_") { + detailTiktok = v.ByteUrl + continue + } + tiktokImg = append(tiktokImg, v.ByteUrl) + } + if detailTiktok == "" { + detailTiktok = tiktokImg[0] + } + + return strings.Join(tiktokImg, "|"), detailTiktok, nil +} + +func MakeProductFormatNew(api *tiktokShop.API, skuNameId int64, categoryLeafId int64) (string, error) { + categoryList, err := api.GetCatePropertyV2(categoryLeafId) if err != nil { return "", err } - - for _, v := range tiktokImgList.SuccessMap { - tiktokImg = append(tiktokImg, v.ByteUrl) - } - if len(tiktokImg) <= model.NO { - for _, v := range tiktokImgList.FailedMap { - return "", errors.New(v.ErrMsg) + categoryMap := make(map[string][]map[string]interface{}) + for _, v := range categoryList.Data.Data { + if v.Required != model.YES { + continue + } + options := make([]map[string]interface{}, 0) + if v.PropertyName == "品牌" { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 789194134, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } else if v.PropertyName == "产地" { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 13850, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } else if len(options) == 0 { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 0, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options + } else { + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": v.Options[0].Value, "diy_type": v.DiyType}) + categoryMap[utils.Int64ToStr(v.PropertyId)] = options } } - - return strings.Join(tiktokImg, "|"), nil + productFormatNew := utils.Format4Output(categoryMap, false) + dao.UpdateSkuNameTiktokAttr(dao.GetDB(), skuNameId, productFormatNew) + return utils.Format4Output(categoryMap, false), nil } // GetSpecPrices 解析属性和规格参数 @@ -578,6 +585,20 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk if len(detail1) > 3 { detail1 = detail1[0:3] } + specsUnit := "g" + var infoValue float64 = 1 // 同意计量单位,目前抖店只支持g + var specQuality = float64(localSku.SpecQuality) // 可能SpecQuality为0,给默认值 + switch localSku.SpecUnit { + case "g", "G", "ml", "ML": + specsUnit = "g" + infoValue = 1 + case "l", "L", "KG", "kg": + specsUnit = "g" + infoValue = 1000 + } + if specQuality == 0 { + specQuality = 1 + } switch len(detail1) { case 1: name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",") @@ -589,11 +610,12 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk StepStockNum: 0, SupplierID: "", OuterSkuID: utils.Int2Str(localSku.SkuID), - DeliveryInfos: []*tiktokShop.DeliveryInfos{ - {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, - }, } - stock := 0 + + sku.DeliveryInfos = []*tiktokShop.DeliveryInfos{ + {InfoType: "weight", InfoUnit: specsUnit, InfoValue: utils.Float64ToStr(specQuality * infoValue)}, + } + stock := localSku.Stock if localSku.Stock == 0 { stock = 9999 } @@ -616,10 +638,10 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk SupplierID: "", OuterSkuID: utils.Int2Str(localSku.NameID), DeliveryInfos: []*tiktokShop.DeliveryInfos{ - {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, + {InfoType: "weight", InfoUnit: specsUnit, InfoValue: utils.Float64ToStr(specQuality * infoValue)}, }, } - stock := 0 + stock := localSku.Stock if localSku.Stock == 0 { stock = 9999 } @@ -646,15 +668,14 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk SupplierID: "", OuterSkuID: utils.Int2Str(localSku.NameID), DeliveryInfos: []*tiktokShop.DeliveryInfos{ - {InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)}, + {InfoType: "weight", InfoUnit: specsUnit, InfoValue: utils.Float64ToStr(specQuality * infoValue)}, }, } - stock := 0 + stock := localSku.Stock if localSku.Stock == 0 { stock = 9999 } sku.StockNum = stock - sku.StockNum = 0 sku.SkuType = 1 sku.StockNumMap = map[string]int64{storeId: int64(stock)} skuSize = append(skuSize, sku) diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 9280a9b72..6444747fe 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -3,7 +3,6 @@ package controllers import ( "fmt" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" - "git.rosy.net.cn/jx-callback/globals" "github.com/panjf2000/ants" "io" "sync" @@ -39,7 +38,6 @@ func (c *SyncController) SyncStoresSkus() { if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.SkuIDs, &skuIDs, params.VendorIDs, &vendorIDs); err != nil { return retVal, "", err } - globals.SugarLogger.Debugf("============1") retVal, err = cms.CurVendorSync.SyncStoresSkus(params.Ctx, nil, 0, db, vendorIDs, storeIDs, skuIDs, params.IsForce, params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) diff --git a/controllers/tiktok_delivery.go b/controllers/tiktok_delivery.go index 8595a826f..661ca3a8c 100644 --- a/controllers/tiktok_delivery.go +++ b/controllers/tiktok_delivery.go @@ -171,7 +171,6 @@ func (c *LogisticsController) LogisticsQuery() { Timestamp: utils.Time2Str(time.Now()), TrackNo: param.TrackNo, Traces: []TracesList{{ - Opcode: "ORDER_RECEIVED", Timestamp: utils.Time2Str(time.Now()), Content: "抖音定时保底更新", ThirdPartyCompany: tiktok_api.TiktokExpressCode, @@ -184,6 +183,28 @@ func (c *LogisticsController) LogisticsQuery() { }, } + switch data[0].Status { + case 5: // 呼叫骑手 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsStatusCALLRIDER + case 10, 12: // 骑手接单 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsORDERRECEIVED + case 15: // 到店 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsRIDERARRIVED + case 20: //配送中 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsRIDERPICKUP + case 105, 120: // 完成 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsDELIVERED + case 8, 115: // 取消 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsCANCELDELIVERY + returnParam.Data.Traces[0].CancelCode = "3000" // 骑手原因取消 + returnParam.Data.Traces[0].CancelDesc = "繁忙" // 骑手原因取消 + case 22: //配送异常 + returnParam.Data.Traces[0].Opcode = tiktok_api.TiktokLogisticsINDDELIVERYEXCEPTION + returnParam.Data.Traces[0].ExceptionCode = "5001" // 服务商系统异常 + returnParam.Data.Traces[0].ExceptionDesc = "服务商系统异常" // 服务商系统异常 + + } + c.Data["json"] = returnParam c.ServeJSON() }