diff --git a/business/bidding/logistics_Loading.go b/business/bidding/logistics_Loading.go index 8c6bbd418..86378b1d6 100644 --- a/business/bidding/logistics_Loading.go +++ b/business/bidding/logistics_Loading.go @@ -1,6 +1,7 @@ package bidding import ( + "errors" "git.rosy.net.cn/baseapi/platformapi/ali_logistics_query" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" @@ -38,11 +39,15 @@ func LoadingLogistics(paramLogistic []*model.UpdateMaterialLogistic) []error { } // 新订单,本地暂无物流信息,全部更新远端物流信息到本地 + if len(logisticsList.Info[0].LogisticsTraceDetailList) == model.NO { + errList = append(errList, errors.New("运单号[%s]:已经过期/新订单暂无物流推送信息")) + continue + } var orderStatus = make([]*model.OrderStatus, 0, 0) goodsOrderStatus := 0 for _, v := range logisticsList.Info[0].LogisticsTraceDetailList { orderStatusToLocal := &model.OrderStatus{ - VendorOrderID: logisticsList.OrderNo, + VendorOrderID: logisticsList.Info[0].MailNo, VendorID: model.VendorIDTotalWl, OrderType: model.OrderTypeWaybill, RefVendorOrderID: logistics.OrderId, @@ -108,20 +113,21 @@ func LoadingLogistics(paramLogistic []*model.UpdateMaterialLogistic) []error { statusTime := orderStatus[len(orderStatus)-1].StatusTime if len(wayBill) == 0 || wayBill == nil { wayBillObj := &model.Waybill{ - VendorWaybillID: logistics.LogisticId, - WaybillVendorID: model.VendorIDTotalWl, - VendorOrderID: logistics.OrderId, - OrderVendorID: model.VendorIDJX, - CourierName: logisticsList.Info[0].Courier, - CourierMobile: logisticsList.Info[0].CourierPhone, - Status: status, - VendorStatus: vendorStatus, - ActualFee: logistics.LogisticFee, - DesiredFee: logistics.LogisticFee, - DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, - WaybillCreatedAt: time.Now(), - StatusTime: statusTime, - ModelTimeInfo: model.ModelTimeInfo{CreatedAt: time.Now(), UpdatedAt: time.Now()}, + VendorWaybillID: logistics.LogisticId, + WaybillVendorID: model.VendorIDTotalWl, + VendorOrderID: logistics.OrderId, + OrderVendorID: model.VendorIDJX, + CourierName: logisticsList.Info[0].Courier, + CourierMobile: logisticsList.Info[0].CourierPhone, + Status: status, + VendorStatus: vendorStatus, + ActualFee: logistics.LogisticFee, + DesiredFee: logistics.LogisticFee, + DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, + WaybillCreatedAt: time.Now(), + StatusTime: statusTime, + ModelTimeInfo: model.ModelTimeInfo{CreatedAt: time.Now(), UpdatedAt: time.Now()}, + WaybillFinishedAt: time.Now(), } if err := dao.CreateEntity(db, wayBillObj); err != nil { errList = append(errList, err) @@ -132,6 +138,7 @@ func LoadingLogistics(paramLogistic []*model.UpdateMaterialLogistic) []error { wayBill[0].Status = status wayBill[0].VendorStatus = vendorStatus wayBill[0].StatusTime = statusTime + wayBill[0].WaybillFinishedAt = time.Now() if _, err := dao.UpdateEntity(db, wayBill[0], "Status", "UpdatedAt", "VendorStatus", "StatusTime"); err != nil { errList = append(errList, err) continue diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 57e4bb251..9e581d0da 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -955,7 +955,7 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa } valid["printerBindInfo"] = "" if handler := partner.GetPrinterPlatformFromVendorID(store.PrinterVendorID); handler != nil { - handler.UnregisterPrinter(ctx, store.PrinterSN, store.PrinterKey) + handler.UnregisterPrinter(ctx, store.PrinterSN, utils.Int2Str(store.ID)) } } if valid["soundPercentage"] != nil && valid["printerSN"] != nil { @@ -6095,3 +6095,7 @@ func BatchCreateFreeShipTemplate(relInfo map[string][]tiktok_store.RelInfo, ship func GetVendorStoreBind(vendorStoreId string, vendorId int) (int, error) { return dao.GetCodeAndIDByMeiTuan(vendorStoreId, vendorId) } + +func BindJxPrintToStore(storeId int64, printSn, printKey string) error { + return dao.BindJXPrintToStore(storeId, printSn, printKey) +} diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index edb3d227b..1c1948e6e 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -262,7 +262,6 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "删除门店") } } else { - globals.SugarLogger.Debugf("3.UpdateStore") if err = handler.UpdateStore(db2, storeMap.StoreID, userName); err == nil { resultList = append(resultList, 1) } else { diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 565c86484..12f0f55c4 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -485,8 +485,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag now := jxutils.OperationTime2HourMinuteFormat(time.Now()) var failedList []*partner.StoreSkuInfoWithErr for _, sku := range skus { - if !useVendorPriceDirectly && - !isSkuLockTimeValid(sku) { + if !useVendorPriceDirectly && !isSkuLockTimeValid(sku) { sku.VendorPrice = 0 } sku.MergedStatus = MergeSkuSaleStatusWithStoreOpTime(sku, storeDetail, now) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index e20ec70b3..ddc658f3e 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -2,7 +2,9 @@ package misc import ( "fmt" + "git.rosy.net.cn/baseapi/platformapi/dingdingapi" "git.rosy.net.cn/jx-callback/business/bidding" + "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" "git.rosy.net.cn/jx-callback/business/partner/delivery" "git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store" "sync" @@ -249,6 +251,13 @@ func Init() { cms.RefreshTiktokShopToken(jxcontext.AdminCtx) }, 60*time.Second, 30*time.Minute) + // 抖音更新门店商品 + if beego.BConfig.RunMode != "jxgy" { + ScheduleTimerFuncByInterval(func() { + syncStoreSkuTiktok() + }, 60*time.Second, 10*time.Minute) + } + // 定时任务刷新当前订单的物流信息 ScheduleTimerFunc("RefreshMaterialLogistics", func() { bidding.LoadingLogistics(nil) @@ -568,6 +577,32 @@ func syncStoreSku() { tasksch.HandleTask(task, nil, true).Run() } +func syncStoreSkuTiktok() { + syncFlag := 0 | model.SyncFlagSaleMask + task := tasksch.NewParallelTask("同步京西商品到抖音平台,方案二使用", nil, jxcontext.AdminCtx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + errList := errlist.New() + db := dao.GetDB() + switch step { + case 0: + if beego.BConfig.RunMode != "jxgy" { + errList.AddErr(cms.DeleteSkuNameExPrefixOverdue(db)) + errList.AddErr(cms.SetMultiStoreSkuSyncModifyStatus(db, partner.GetMultiStoreVendorIDs())) + _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{model.VendorIDDD}, []int{668594}, false, nil, nil, syncFlag, true, true) + errList.AddErr(err) + } + case 1: + errList.AddErr(err) + SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID) + } + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "2452A93EEB9111EC9B06525400E86DC0", "抖音同步商品", utils.Format4Output(errList, false)) + err = errList.GetErrListAsOne() + return retVal, err + }, []int{0, 1}) + tasksch.HandleTask(task, nil, true).Run() +} + func doDailyWork2() { if beego.BConfig.RunMode == "jxgy" { syncStoreSku() diff --git a/business/model/dao/dao_bz.go b/business/model/dao/dao_bz.go index 3c6fc8fd2..b33750322 100644 --- a/business/model/dao/dao_bz.go +++ b/business/model/dao/dao_bz.go @@ -79,6 +79,7 @@ func BatchUpdateEntityByKV(db *DaoDB, items []*KVUpdateItem) (num int64, err err if r := recover(); r != nil { if item != nil { var bindID int64 + globals.SugarLogger.Debugf("========item.item %s", utils.Format4Output(item.Item, false)) value := refutil.CheckAndGetStructValue(item.Item).FieldByName(model.FieldID) if value.IsValid() { bindID = value.Int() diff --git a/business/model/dao/store.go b/business/model/dao/store.go index c40f9cfac..8f09f09a4 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -1631,8 +1631,15 @@ func InsertIntoFreightTemplate(storeID int, vendorStoreID string, templateID, wa return err } -//只获取美团平台的京西storeID +// GetCodeAndIDByMeiTuan 只获取美团平台的京西storeID func GetCodeAndIDByMeiTuan(vendorStoreID string, vendorId int) (storeID int, err error) { - err = GetRow(GetDB(), &storeID, "SELECT s.store_id FROM store_map s WHERE s.vendor_store_id = ? AND s.vendor_id = ? ", vendorStoreID, vendorId) + err = GetRow(GetDB(), &storeID, "SELECT s.store_id FROM store_map s WHERE s.vendor_store_id = ? AND s.vendor_id = ? AND s.deleted_at = ?", vendorStoreID, vendorId, utils.DefaultTimeValue) return storeID, err } + +// BindJXPrintToStore 更新绑定门店的京西打印机 PrinterFontSize printer_sn printer_key printer_vendor_id printer_font_size +func BindJXPrintToStore(storeId int64, printSn, printKey string) error { + sql := ` UPDATE store SET printer_sn = ? , printer_key = ? , printer_vendor_id = ? , printer_font_size = ? WHERE id = ?` + _, err := ExecuteSQL(GetDB(), sql, []interface{}{printSn, printKey, model.VendorIDJxprint, model.NO, storeId}) + return err +} diff --git a/business/model/dao/thing_map.go b/business/model/dao/thing_map.go index 16e4f193c..b6316054c 100644 --- a/business/model/dao/thing_map.go +++ b/business/model/dao/thing_map.go @@ -27,35 +27,37 @@ func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int, vendor return cats, err } -func CreateThingMap(thingId int64, vendorThingID, appOrgCode, skuAttrId string) error { +func CreateThingMap(thingId int64, vendorThingID, appOrgCode, err string, thingType, syncStatus int8) error { thingMap := &model.ThingMap{ ThingID: thingId, - ThingType: model.ThingTypeSku, + ThingType: thingType, VendorID: model.VendorIDDD, VendorOrgCode: appOrgCode, VendorThingID: vendorThingID, - Remark: skuAttrId, - SyncStatus: 0, - } - // 正常来说这个skuAttrId 不应该为空 - if skuAttrId == "" { - thingMap.Remark = "这个值不应该为空才对" + Remark: err, + SyncStatus: syncStatus, } WrapAddIDCULDEntity(thingMap, "jxadmin") return CreateEntity(GetDB(), thingMap) } +func UpdateThingMap(thingMap *model.ThingMap) error { + _, err := UpdateEntity(GetDB(), thingMap, "ID") + return err +} + // GetThingToTiktokMapList 抖店获取同步类型 -func GetThingToTiktokMapList(db *DaoDB, vendorId int, thingId int64) (cats []*model.ThingMap, err error) { +func GetThingToTiktokMapList(db *DaoDB, vendorId int, thingId int64, vendorOrgCode string) (cats []*model.ThingMap, err error) { sql := ` SELECT t1.* FROM thing_map t1 - WHERE t1.thing_id = ? AND t1.vendor_id = ? AND t1.deleted_at = ? + WHERE t1.thing_id = ? AND t1.vendor_id = ? AND vendor_org_code = ? AND t1.deleted_at = ? ` sqlParams := []interface{}{ thingId, vendorId, + vendorOrgCode, utils.DefaultTimeValue, } diff --git a/business/model/model.go b/business/model/model.go index f4fe2c241..bd40a0331 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -93,9 +93,9 @@ const ( SyncFlagSeqMask = 64 // 门店商家分类下的排序顺序 // combine - SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask | SyncFlagStockMask - SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask - SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask + SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask | SyncFlagStockMask // 同步标志存储仅Sku掩码 + SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask // 同步标志存储Sku修改掩码 + SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask // 同步标志已更改掩码 ) func IsSyncStatusNew(syncStatus int8) bool { diff --git a/business/model/sync_map.go b/business/model/sync_map.go index 955e8c4c8..c8c5ef010 100644 --- a/business/model/sync_map.go +++ b/business/model/sync_map.go @@ -1,12 +1,12 @@ package model const ( - ThingTypeCategory = 1 - ThingTypeSkuName = 2 - ThingTypeSku = 3 - ThingTypeStore = 4 - ThingTypeUser = 5 - ThingTypeOrder = 6 + ThingTypeCategory = 1 // 同步分类 + ThingTypeSkuName = 2 // 同步商品名称 + ThingTypeSku = 3 // 同步商品 + ThingTypeStore = 4 // 同步门店 + ThingTypeUser = 5 // 同步用户信息 + ThingTypeOrder = 6 // 同步订单 ) type ThingMap struct { diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 3eb3906fc..6c45aefed 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -85,12 +85,6 @@ func (c *DeliveryHandler) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionMsg func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) - if msg.Status == mtpsapi.OrderStatusPickedUp { - order.Status = model.WaybillStatusCourierArrived - mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) - defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 - msg.Status = mtpsapi.OrderStatusPickedUp - } switch msg.Status { case mtpsapi.OrderStatusWaitingForSchedule: data, err := api.MtpsAPI.QueryOrderStatus(msg.DeliveryID, msg.MtPeisongID) @@ -123,6 +117,13 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m c.pushToGy(msg) return mtpsapi.SuccessResponse } + + //if msg.Status == mtpsapi.OrderStatusPickedUp { + // order.Status = model.WaybillStatusCourierArrived + // mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) + // delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 + // msg.Status = mtpsapi.OrderStatusPickedUp + //} // 加入调度器 err := mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 @@ -163,7 +164,6 @@ func pushMTPSToTiktok(msgStatus int, order *model.Waybill) { result.LogisticsStatus = 0 result.LogisticsContext = model.RiderGetOrderDeliverOther } - globals.SugarLogger.Debugf("===========================mtps:%s", utils.Format4Output(result, false)) delivery.PullTiktokRiderInfo(result) if result.LogisticsStatus == model.WaybillStatusCourierArrived { result.LogisticsStatus = model.WaybillStatusDelivering @@ -232,8 +232,11 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re var good *model.GoodsOrder sql := `SELECT * FROM goods_order WHERE vendor_order_id = ? ORDER BY order_created_at DESC LIMIT 1 OFFSET 0` sqlParams := []interface{}{msg.OrderID} - dao.GetRow(dao.GetDB(), &good, sql, sqlParams) - retVal.OrderVendorID = good.VendorID + if err := dao.GetRow(dao.GetDB(), &good, sql, sqlParams); err != nil || good == nil || good.VendorOrderID == "" { + retVal.OrderVendorID = 0 + } else { + retVal.OrderVendorID = good.VendorID + } return retVal } diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index f108273bb..461b8aba3 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -59,7 +59,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { if orderId == "" { // 订单id为空是,是定时轮询操作,不做此状态 waybillList, _ := dao.GetWaybills(dao.GetDB(), v.VendorOrderID) if len(waybillList) > 0 && waybillList[0].Status > model.WaybillStatusEndBegin { - globals.SugarLogger.Debug("订单物流状态结束,不在推送订单状态:orderID[%s],wayBillId[%s]", v.VendorOrderID, waybillList[0].VendorWaybillID) + globals.SugarLogger.Debugf("订单物流状态结束,不在推送订单状态:orderID[%s],wayBillId[%s]", v.VendorOrderID, waybillList[0].VendorWaybillID) continue } } @@ -151,7 +151,6 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { } func PullTiktokRiderInfo(riderInfo *mtpsapi.RiderInfo) { - globals.SugarLogger.Debugf("==================riderInfo:%s", utils.Format4Output(riderInfo, false)) switch riderInfo.LogisticsStatus { case 5: // 呼叫骑手 riderInfo.LogisticsStatus = 0 @@ -193,7 +192,6 @@ func PullTiktokRiderInfo(riderInfo *mtpsapi.RiderInfo) { // 呼叫骑手的时候推送发货 // 抖店由于发配送时运单id已经固定了,我们系统在重新发货,或者运单号发生改变时去推送信息时.抖店只识别第一个运单号所以在这儿修改成发单时的第一个运单号! paramsMap := utils.Struct2Map(riderInfo, "", true) - globals.SugarLogger.Debugf("==================paramsMap:%s", utils.Format4Output(paramsMap, false)) if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDDD); handler != nil { if err := handler.GetOrderRider("", "", paramsMap); err != nil { globals.SugarLogger.Errorf("PullTiktokRiderInfo Err %s", err.Error()) @@ -297,6 +295,7 @@ func UpdateFakeWayBillToTiktok() { if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDDD); handler != nil { if err := handler.GetOrderRider(fakeWayBill[i].VendorOrgCode, "", paramsMap); err != nil { globals.SugarLogger.Errorf("Fake Pull Rider Info Err :%s--%s--%v", riderInfo.OrderId, riderInfo.ThirdCarrierOrderId, err) + continue } } diff --git a/business/partner/printer/feie/feie_test.go b/business/partner/printer/feie/feie_test.go index 886029ebc..fa28347b7 100644 --- a/business/partner/printer/feie/feie_test.go +++ b/business/partner/printer/feie/feie_test.go @@ -42,3 +42,11 @@ func TestRegisterPrinter(t *testing.T) { t.Fatal(err) } } + +func TestGetPrinterStatus(t *testing.T) { + sn, err := CurPrinterHandler.GetPrinterStatus(nil, "922591501", "fczh8zwv") + t.Log(sn) + if err != nil { + t.Fatal(err) + } +} diff --git a/business/partner/printer/jxprint/jxprint.go b/business/partner/printer/jxprint/jxprint.go index 05d238e69..fbb472a8d 100644 --- a/business/partner/printer/jxprint/jxprint.go +++ b/business/partner/printer/jxprint/jxprint.go @@ -74,7 +74,7 @@ func (c *PrinterHandler) RegisterPrinter(ctx *jxcontext.Context, id1, id2, print func (c *PrinterHandler) UnregisterPrinter(ctx *jxcontext.Context, id1, id2 string) (err error) { if globals.EnableStoreWrite { - err = api.JxPrintAPI.DelPrinter([]string{id1}) + err = api.JxPrintAPI.DelPrinter([]string{id1}, id2) } return err } diff --git a/business/partner/printer/jxprint/jxprint_const.go b/business/partner/printer/jxprint/jxprint_const.go index 795635c76..ccff811d7 100644 --- a/business/partner/printer/jxprint/jxprint_const.go +++ b/business/partner/printer/jxprint/jxprint_const.go @@ -88,7 +88,7 @@ func ManagerOrderPrint(order *model.GoodsOrder, storeTel string, storeDetail *da printOrder[VendorName] = jxutils.GetVendorName(order.VendorID) printOrder[VendorOrderNo] = utils.Int2Str(order.OrderSeq) printOrder[EBaiCode] = jxutils.GetEbaiOrderGetCode(order) - printOrder[QRCOrder] = utils.Int2Str(order.OrderSeq) + printOrder[QRCOrder] = order.VendorOrderID printOrder[ConsigneeName] = order.ConsigneeName printOrder[ConsigneeMobile] = order.ConsigneeMobile printOrder[ConsigneeAddress] = order.ConsigneeAddress diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go index 06754975a..74dc5436c 100644 --- a/business/partner/purchase/jd/sku2.go +++ b/business/partner/purchase/jd/sku2.go @@ -193,6 +193,7 @@ func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jd } func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "CreateSku2") param := skuInfo2Param(ctx, sku) if globals.EnableJdStoreWrite { sku.VendorSkuID, err = getAPI(sku.VendorOrgCode).AddSku2(param) @@ -218,6 +219,7 @@ func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSy } func (p *PurchaseHandler) UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) { + globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "UpdateSku2") param := skuInfo2Param(ctx, sku) if globals.EnableJdStoreWrite { _, err = getAPI(sku.VendorOrgCode).UpdateSku2(param) @@ -226,7 +228,7 @@ func (p *PurchaseHandler) UpdateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSy } func (p *PurchaseHandler) DeleteSku2(ctx *jxcontext.Context, vendorOrgCode string, sku *partner.StoreSkuInfo) (err error) { - + globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "DeleteSku2") // 京东到家只能通过商家ID删除SKU,如果没有的话,先绑定,再删除 if sku.SkuID == 0 { skuPairList := []*jdapi.SkuIDPair{ diff --git a/business/partner/purchase/jdshop/store_sku.go b/business/partner/purchase/jdshop/store_sku.go index acbe1879e..2a756c3a0 100644 --- a/business/partner/purchase/jdshop/store_sku.go +++ b/business/partner/purchase/jdshop/store_sku.go @@ -43,8 +43,6 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v //flag2 := false //var wareStatusUpdateWareID string result, err := getAPI(v.VendorOrgCode).SearchWare4Valid(name, 1, 100) // 搜索有效商品 - globals.SugarLogger.Debugf("========result %s", utils.Format4Output(result, false)) - globals.SugarLogger.Debugf("========result %s", err) if err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品") return failedList, err @@ -299,6 +297,7 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v } func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "UpdateStoreSkus") if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID { if vendorStoreID == model.JdShopMainVendorStoreID { for _, v := range storeSkuList { diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 4c7c529da..9418ab187 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -260,6 +260,11 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo if product["upc"] != nil && product["upc"].(string) != "" { sku.Upc = product["upc"].(string) } + _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku.SkuName) + nameWeight := jxutils.FormatSkuWeight(specQuality, specUnit) + if nameWeight == 0 { + skuName += " " + product["spec"].(string) + } if sku.VendorSkuID == "" { if !strings.Contains(product["app_food_code"].(string), "mtcode") { sku.VendorSkuID = product["app_food_code"].(string) diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index e72edbb67..8ac303798 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -197,7 +197,6 @@ func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID in //批量更新商品进货价 func BatchSetRestockingPrice(ctx *jxcontext.Context, storeID int, vendorStoreID string, param []*mtwmapi.SpuData) error { - globals.SugarLogger.Debugf("test getStoreVendorOrgCode(storeID)==========%s", getStoreVendorOrgCode(storeID)) if err := getAPI(getStoreVendorOrgCode(storeID), storeID, "").BatchSetRestockingPrice(ctx.GetTrackInfo(), vendorStoreID, param); err != nil { return err } @@ -344,6 +343,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } } + globals.SugarLogger.Debugf("foodDataList=======mtwm %s", utils.Format4Output(foodDataList, false)) if globals.EnableMtwmStoreWrite { if len(foodDataList) == 1 { foodDataList[0]["skus"] = string(utils.MustMarshal(foodDataList[0]["skus"])) diff --git a/business/partner/purchase/tiktok_store/callback.go b/business/partner/purchase/tiktok_store/callback.go index ed4444eb3..af12c860e 100644 --- a/business/partner/purchase/tiktok_store/callback.go +++ b/business/partner/purchase/tiktok_store/callback.go @@ -3,8 +3,10 @@ package tiktok_store import ( "encoding/json" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" + "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/globals" "git.rosy.net.cn/jx-callback/globals/api" "net/http" "strings" @@ -12,6 +14,7 @@ import ( // OnOrderMsg 抖音 func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) { + globals.SugarLogger.Debugf("GetCallbackOrderId tiktok msg %s", utils.Format4Output(msg, false)) if CurPurchaseHandler != nil { orderId, shopId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg) if shopId != 0 { diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index 6221920ef..2dd4517ca 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -178,7 +178,8 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s // 预订单还是快速达 localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode) - if err != nil { + if err != nil || localStore == nil || localStore.ID == 0 { + globals.SugarLogger.Debugf("平台门店未绑定到京西系统 %s", err.Error()) return nil, nil, err } // 订单不在门店营业时间来的订单, @@ -593,9 +594,6 @@ func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName s AddressId: 0, StoreId: utils.Str2Int64(order.VendorStoreID), }) - if err != nil { - return err - } return err } @@ -646,10 +644,19 @@ func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userNam // SelfDeliverDelivered 自配搜完成(暂无) func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { - //if globals.EnableMtwmStoreWrite { - // err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderArrived(utils.Str2Int64(order.VendorOrderID)) - //} - return err + riderInfo := &mtpsapi.RiderInfo{ + OrderId: order.VendorOrderID, + ThirdCarrierOrderId: order.VendorOrderID, + CourierName: "", + CourierPhone: "", + LogisticsProviderCode: "10002", + LogisticsStatus: 0, + LogisticsContext: "商家自配送,已送达", + Latitude: "", + Longitude: "", + OpCode: tiktokShop.TiktokLogisticsDELIVERED, + } + return c.GetOrderRider("", "", utils.Struct2MapByJson(riderInfo)) } func getTimeFromTimestamp(timeStamp int64) time.Time { diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index dc1c3216b..0a602cdb7 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -1,7 +1,6 @@ package tiktok_store import ( - "errors" "fmt" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" product_listV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/request" @@ -76,62 +75,6 @@ func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) { } func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { - //level := 1 - //if storeCat.ParentCatName != "" { - // level = 2 - //} - //originName := "" - //catName := storeCat.Name - //catCode := storeCat.ID - // - //subCatName := "" - //subCatCode := 0 - //if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 { - // // 修改一级分类 - // originName = storeCat.VendorCatID - //} - //if level == 2 { // 二级分类 - // // 创建二级分类 - // originName = storeCat.ParentVendorCatID - // catName = storeCat.ParentCatName - // catCode = storeCat.ParentID - // subCatName = storeCat.Name - // subCatCode = storeCat.ID - // if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 { - // // 修改二级分类 - // originName = storeCat.VendorCatID - // catName = storeCat.Name - // catCode = storeCat.ID - // subCatName = "" - // subCatCode = 0 - // } - //} - //if catName == "" { - // panic("catName is empty") - //} - //catName = utils.FilterEmoji(catName) - //subCatName = utils.FilterEmoji(subCatName) - // vendorStoreID, originName, catCode, catName, subCatCode, subCatName, storeCat.Seq) - //if globals.EnableMtwmStoreWrite { - // // err = api.MtwmAPI.RetailCatUpdate2(vendorStoreID, tryCatName2Code(originName), originName, catCode2Str(catCode), catName, catCode2Str(subCatCode), subCatName, storeCat.Seq) - // param4Update := &mtwmapi.Param4UpdateCat{ - // CategoryCodeOrigin: tryCatName2Code(originName), - // CategoryNameOrigin: originName, - // CategoryCode: catCode2Str(catCode), - // SecondaryCategoryCode: catCode2Str(subCatCode), - // SecondaryCategoryName: subCatName, - // Sequence: storeCat.Seq, - // } - // err = getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID).RetailCatUpdate(vendorStoreID, catName, param4Update) - // if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && originName != "" { // 修改分类名,但分类不存在 - // storeCat.CatSyncStatus |= model.SyncFlagNewMask - // err = p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat) - // } - //} - //if err == nil { - // // storeCat.VendorCatID = utils.FilterEmoji(storeCat.Name) - // storeCat.VendorCatID = utils.Int2Str(storeCat.ID) - //} return err } @@ -140,23 +83,6 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in } func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) { - //if false { - // if globals.EnableMtwmStoreWrite { - // err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID) - // } - //} else { - // var catCodes []string - // if catCode := tryCatName2Code(vendorCatID); catCode != "" { - // catCodes = []string{catCode} - // } - // if globals.EnableMtwmStoreWrite { - // if level == 1 { - // err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil) - // } else { - // err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil) - // } - // } - //} return err } @@ -169,34 +95,14 @@ func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) { return mtwmapi.IsErrSkuNotExist(err) } -// func duplicateStoreSkuList(storeSkuList []*dao.StoreSkuSyncInfo, index int) (newStoreSkuList []*dao.StoreSkuSyncInfo) { -// newStoreSkuList = make([]*dao.StoreSkuSyncInfo, len(storeSkuList)) -// for k, v := range storeSkuList { -// tmp := *v -// tmp.SkuName = fmt.Sprintf("%s.%d", tmp.SkuName, index) -// tmp.SkuID = index*1000000 + tmp.SkuID -// newStoreSkuList[k] = &tmp -// } -// return newStoreSkuList -// } func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, false) - // if err == nil && vendorStoreID == specialStoreID { - // for i := 0; i < 2; i++ { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true) - // } - // } return failedList, err } // CreateStoreSkus 门店创建商品 func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, true) - //if err == nil && vendorStoreID == specialStoreID { - // for i := 0; i < 2; i++ { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true) - // } - //} return failedList, err } @@ -207,7 +113,7 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v continue } if err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).DeleteStoreCommodity(utils.Str2Int64(v.VendorSkuID)); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除主商品")...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除子商品")...) } dao.DeleteThingToTiktokMapList(model.VendorIDDD, v.VendorMainId) } @@ -224,16 +130,12 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr if status == model.SkuStatusNormal { // 下架 for _, v := range storeSkuList { // 子品商品id获取skuId - childrenSku, err := api.GetSkuDetail(v.VendorSkuID, "") - if err != nil { - return nil, err + childrenSkuId, failedList := getProductSkuId4UpdateStock(api, v, storeID) + if len(failedList) > 0 { + continue } - if len(childrenSku.SpecPrices) <= 0 { - return nil, errors.New("子品商品详情获取失败") - } - param := &sku_syncStock_request.SkuSyncStockParam{ - SkuId: childrenSku.SpecPrices[0].SkuId, + SkuId: childrenSkuId, ProductId: utils.Str2Int64(v.VendorSkuID), Incremental: false, IdempotentId: "", @@ -241,23 +143,19 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr 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], fmt.Sprintf("下架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架商品,库存值最大化.%s", utils.Format4Output(param, false)))...) } } } else { // 上架 for _, v := range storeSkuList { // 子品商品id获取skuId - childrenSku, err := api.GetSkuDetail(v.VendorSkuID, "") - if err != nil { - return nil, err - } - if len(childrenSku.SpecPrices) <= 0 { - return nil, errors.New("子品商品详情获取失败") + childrenSkuId, failedList := getProductSkuId4UpdateStock(api, v, storeID) + if len(failedList) > 0 { + continue } + param := &sku_syncStock_request.SkuSyncStockParam{ - SkuId: childrenSku.SpecPrices[0].SkuId, + SkuId: childrenSkuId, ProductId: utils.Str2Int64(v.VendorSkuID), Incremental: false, IdempotentId: "", @@ -265,75 +163,69 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr 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], fmt.Sprintf("上架商品正常,添加固定库存.%s", utils.Format4Output(param, false)))...) + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架商品,库存值为0失败.%s", utils.Format4Output(param, false)))...) } } } - if len(failedList) > 0 { - err = nil - } return failedList, err } // UpdateStoreSkusPrice 更新商品价格 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) + globals.SugarLogger.Debugf("看看走这儿了没,是不是更新 storeSkuList %s", utils.Format4Output(storeSkuList, false)) for _, v := range storeSkuList { - // 更新主品 (暂不支持渠道主商品) - err = api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ + tiktokSkuId, failedList := getProductSkuId4UpdateStock(api, v, storeID) + if len(failedList) > 0 { + globals.SugarLogger.Debugf("看看走这儿了没,是不是更新 参数failedList1 %s", utils.Format4Output(failedList, false)) + return failedList, err + } + globals.SugarLogger.Debugf("====SkuId:= %d,ProductId := %d ", tiktokSkuId, utils.Str2Int64(v.VendorMainId)) + price := &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], "更新主品价格异常")...) + SkuId: tiktokSkuId, + ProductId: utils.Str2Int64(v.VendorSkuID), } - - // 更新子品 - if _, err := api.BatchApplyStoreProductPrice(utils.Str2Int64(v.VendorMainId)); err != nil { - failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "同步子品价格异常")...) + //更新子品 + if err = api.EditPrice(price); err != nil { + 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.VendorSonSkuID), - // ProductId: 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], "更新价格正常")...) - //} - } - - if len(failedList) > 0 { - err = nil + globals.SugarLogger.Debugf("看看走这儿了没,是不是更新 参数 %s", utils.Format4Output(price, false)) + globals.SugarLogger.Debugf("看看走这儿了没,是不是更新 返回值 %s", utils.Format4Output(failedList, false)) + globals.SugarLogger.Debugf("看看走这儿了没,是不是更新 结构体 %s", utils.Format4Output(v, false)) } return failedList, err } -// 全量/增量更新商品sku库存 +// UpdateStoreSkusStock 全量/增量更新商品sku库存 func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { tiktokApi := getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID) for _, v := range storeSkuList { - err := tiktokApi.UpdateSkuStock(&sku_syncStock_request.SkuSyncStockParam{ - SkuId: utils.Str2Int64(v.VendorSkuAttrId), + // 子品商品id获取skuId + childrenSkuId, failedList := getProductSkuId4UpdateStock(tiktokApi, v, storeID) + if len(failedList) > 0 { + continue + } + + stockNum := &sku_syncStock_request.SkuSyncStockParam{ + SkuId: childrenSkuId, ProductId: utils.Str2Int64(v.VendorSkuID), Incremental: false, IdempotentId: "", StockNum: int64(v.Stock), OutWarehouseId: vendorStoreID, - }) - if err != nil { + } + if stockNum.StockNum == 0 { + stockNum.StockNum = 99999 + } + + if err := tiktokApi.UpdateSkuStock(stockNum); 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], "更新库存正常")...) } } - return p.UpdateStoreSkusPrice(ctx, vendorOrgCode, storeID, vendorStoreID, storeSkuList) + return failedList, err } func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) { diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 5a89b4957..9c24e79cd 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -14,7 +14,8 @@ import ( product_listV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/response" shop_bindStoreFreight_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreFreight/request" shop_bindStoreSaleLimit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreSaleLimit/request" - superm_product_batchRedistributeStoreProduct_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/superm_product_batchRedistributeStoreProduct/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" trade_createTradeLimitTemplate_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/trade_createTradeLimitTemplate/request" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" "git.rosy.net.cn/baseapi/utils" @@ -27,6 +28,8 @@ import ( "git.rosy.net.cn/jx-callback/globals" "math/rand" "strings" + "time" + "unicode" ) type MainSku struct { @@ -151,28 +154,16 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI PickupMethod: "0", OuterProductId: utils.Int2Str(storeSku.SkuID), // 本地skuId为外部商品id } - globals.SugarLogger.Debugf("=======================1") - globals.SugarLogger.Debugf("=======================param %s", utils.Format4Output(param, false)) - if len(param.Name) < 23 { // 中文字符一个汉字三个长度符号/数字/字母两个长度,商品名称不能大于 - param.Name += utils.Float64ToStr(float64(storeSku.SpecQuality)) + "/" + storeSku.SpecUnit - if len(param.Name) < 23 { - param.Name += "【惊喜到家】" - } - } else if len(param.Name) > 90 { // 抖音最大60个字符,三十个汉字 - param.Name = param.Name[0:90] - } + param.Name = checkNameLenght(param.Name) // 获取上传图,商品轮播图 img, detailImg, err := GetTiktokImgList(api, utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) - globals.SugarLogger.Debugf("=======================img %s", img) - globals.SugarLogger.Debugf("=======================detailImg %s", detailImg) if err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } param.Pic = img param.Description = detailImg - globals.SugarLogger.Debugf("=======================2") // 部分商品没有所属的分类,直接跳过! if storeSku.SkuVendorMapCatID != "" { @@ -180,14 +171,13 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else if len(param.Pic) != 0 { // 自动推导分类id param.CategoryLeafId = api.GetRecommendCategory(strings.Split(img, "|")) } - globals.SugarLogger.Debugf("=======================3") // 这个情况是原有商品不存在和推荐查询不到类目id是,使用京西类目和抖音类目的绑定关系 // 但是不太实用,导致商品类目错误被暂停营业等 //if storeSku.VendorVendorCatID != 0 && param.CategoryLeafId == 0 { // param.CategoryLeafId = storeSku.VendorVendorCatID //} if param.CategoryLeafId == 0 { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, errors.New("当前商品本地未设置抖音分类/抖音推荐分类查询错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("当前商品本地未设置抖音分类/抖音推荐分类查询错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } // 是否支持七天无理由 @@ -196,7 +186,6 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.Supply7dayReturn = 0 } - globals.SugarLogger.Debugf("=======================4") // weight_unit 目前抖音只支持g和kg两种 param.WeightUnit = tiktokShop.WeightUint_G @@ -211,141 +200,145 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.ProductFormatNew, err = MakeProductFormatNew(api, int64(storeSku.NameID), param.CategoryLeafId) if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } } - param.StandardBrandId = 789194134 // 默认品牌京西菜市 596120136 - globals.SugarLogger.Debugf("=======================5") - - temp, err := dao.QueryStoreBindInfo(storeDetail.Store.ID) - if err != nil || temp == nil || temp.ID == 0 { - // 运费模板 - param.FreightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) - if err != nil { - return nil, err - } - // 获取门店限售模板 - param.SaleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) - if err != nil { - return nil, err - } - // 保存数据库 - freightTemplate := &model.FreightTemplate{ - StoreID: storeSku.StoreID, - VendorStoreID: storeDetail.VendorStoreID, - TemplateID: param.FreightId, - WarehouseID: 0, - FenceID: "", - TradeLimitID: param.SaleLimitId, - } - err = dao.CreateEntity(db, freightTemplate) - } else { - if temp.TemplateID != 0 { - param.FreightId = temp.TemplateID - } else { - // 运费模板 - param.FreightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) - if err != nil { - return nil, err - } - temp.TemplateID = param.FreightId - _, err = dao.UpdateEntity(db, temp, "TemplateID") - dao.FreightTemplateMap[temp.StoreID] = temp - } - if temp.TradeLimitID != 0 { - param.SaleLimitId = temp.TradeLimitID - } else { - // 获取门店限售模板 - param.SaleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) - if err != nil { - return nil, err - } - temp.TradeLimitID = param.SaleLimitId - _, err = dao.UpdateEntity(db, temp, "TradeLimitID") - dao.FreightTemplateMap[temp.StoreID] = temp - } + param.FreightId, param.SaleLimitId, err = getFreightIdAndSaleLimitId(api, db, storeDetail, vendorStoreID) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue } - globals.SugarLogger.Debugf("=======================6") // 根据本地商品id获取线上商品是否存在,存在则只创建子商品 - var tiktokResultProductId int64 = 0 // 获取本地存储映射关系,获取本地主商品id是否存在 - localThing, err := dao.GetThingToTiktokMapList(db, model.VendorIDDD, int64(storeSku.SkuID)) + localThing, _ := dao.GetThingToTiktokMapList(db, model.VendorIDDD, int64(storeSku.SkuID), storeDetail.VendorOrgCode) + mainOrderDetail, err := api.GetSkuDetailLocalID("", utils.Int2Str(storeSku.SkuID)) if len(localThing) == 0 { - // 看看本地保存了没,没有的话可能该商品没创建主商品!查查线上有没有 - mainOrderDetail, err := api.GetSkuDetailLocalID("", utils.Int2Str(storeSku.SkuID)) if err != nil || mainOrderDetail == nil || mainOrderDetail.ProductIdStr == "" { - tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品 + tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品,同步主商品 if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } + if err := dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, "本地不存在,线上也不存在", model.ThingTypeSku, 0); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + } - 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 - err = dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId) + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做 + storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId) + storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID + storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品 + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) } else { + // 本地不存在,线上存在.直接创建子商品保存本地同步记录 + var childrenProductId int64 = 0 + if mainOrderDetail.CheckStatus != tiktokShop.SkuCheckStatusPass && mainOrderDetail.CheckStatus != tiktokShop.SkuCheckStatusPassNotPutOn { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, fmt.Errorf("主商品审核中或审核失败:[%d]", storeSku.SkuID), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue + } + + if err := dao.CreateThingMap(int64(storeSku.SkuID), mainOrderDetail.ProductIdStr, storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId, model.ThingTypeSku, 0); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + } + + childrenProductId, err = api.CreateSubProduct(mainOrderDetail.MainProductId, utils.Str2Int64(vendorStoreID)) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue + } + storeSku.VendorMainId = mainOrderDetail.ProductIdStr var attrId []string for _, v := range mainOrderDetail.SpecPrices { attrId = append(attrId, utils.Int64ToStr(v.SkuId)) } storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID - tiktokResultProductId = mainOrderDetail.ProductId + if childrenProductId > 0 { + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + failedList = upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType) + } else { + storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) // 子商品主id + storeSku.SkuSyncStatus = model.SyncFlagNewMask + failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("主商品创建了,子商品为创建"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + } } } else { - storeSku.VendorMainId = localThing[0].VendorThingID - storeSku.VendorSkuAttrId = localThing[0].Remark // 属性id skuID - tiktokResultProductId = utils.Str2Int64(localThing[0].VendorThingID) - } - - // 上面说明要么已经创建了主商品,要么已经重新创建了主商品,将该商品同步到子门店就可以了. - childrenProductId, err := api.CreateSubProduct(param.MainProductId, utils.Str2Int64(vendorStoreID)) - if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - if storeSku.VendorSkuID == "" { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + // 线上本地都存在,但是线上审核不成功,就去更新主商品 + if mainOrderDetail.CheckStatus != tiktokShop.SkuCheckStatusPass && mainOrderDetail.CheckStatus != tiktokShop.SkuCheckStatusPassNotPutOn { + // 更新主商品,在同步到子门店,考虑审核时间 + updateParam := &product_editV2_request.ProductEditV2Param{ + PayType: tiktokShop.TiktokPayType1, + ReduceType: tiktokShop.SkuReduceTypePayMakeOrder, + Weight: utils.Int2Float64(storeSku.Weight), + DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay, + PresellType: tiktokShop.SendGoodsTypeNow, + Supply7dayReturn: 0, + Mobile: storeDetail.Tel1, + Commit: true, + Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit, + NeedRechargeMode: false, + SellChannel: []int64{0}, + StartSaleType: 0, + PickupMethod: "0", + CategoryLeafId: param.CategoryLeafId, + Name: param.Name, + ProductFormatNew: param.ProductFormatNew, + } + updateParam.Pic = img + updateParam.Description = detailImg + updateParam.WeightUnit = tiktokShop.WeightUint_G + updateParam.StandardBrandId = param.StandardBrandId // 默认品牌京西菜市 + updateParam.ProductId = mainOrderDetail.MainProductId + updateParam.MainProductId = mainOrderDetail.MainProductId + updateParam.SpecPrices = param.SpecPrices + //updateParam.StoreId = utils.Str2Int64(vendorStoreID) + if err := api.EditStoreCommodity(updateParam); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } else { + localThing[0].UpdatedAt = time.Now() + localThing[0].SyncStatus = 0 + localThing[0].ThingType = model.ThingTypeSku + dao.UpdateThingMap(localThing[0]) + } + continue } - continue + + // 主商品存在,直接同步子商品 + childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID)) + if err != nil || childrenProductId == 0 { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + storeSku.SkuSyncStatus = model.SyncFlagStoreSkuModifiedMask + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id + continue + } + + // 同步价格,库存,上架 + failedList = upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType) + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id } - storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // 属性id skuID(自商品的商品id) - storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id - storeSku.VendorMainId = utils.Int64ToStr(tiktokResultProductId) // 商品主id - //param.MainProductId = tiktokResultProductId - //param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResultProductId, storeSku) - // - //param.StoreId = utils.Str2Int64(vendorStoreID) - //// 抖店创建子商品 - //tiktokResultChildren, err := api.CreateStoreCommodity(param) - //if err != nil { - // failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - // if storeSku.VendorSkuID == "" { - // storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - // } - // continue - //} - //var attrId2 []string - //for _, v := range tiktokResultChildren.Sku { - // attrId2 = append(attrId2, utils.Int64ToStr(v.SkuId)) - //} - //storeSku.VendorSonSkuID = strings.Join(attrId2, ",") // 属性id skuID(子商品的属性id) - //storeSku.VendorSkuID = utils.Int64ToStr(tiktokResultChildren.ProductId) // 子商品主id - //storeSku.VendorMainId = utils.Int64ToStr(tiktokResultProductId) // 商品主id } } else { syncType = "更新商品" for _, storeSku := range storeSkuList { - if storeSku.StoreSkuStatus != 1 { // 未可售的商品不参与修改 + if storeSku.StoreSkuStatus != model.YES { // 未可售的商品不参与修改 continue } - // 更新商品(目前只更新子商品,主商品暂不支持) + + // 更新主商品,在同步到子门店,考虑审核时间 param := &product_editV2_request.ProductEditV2Param{ Name: utils.LimitUTF8StringLen(storeSku.SkuName, 90), PayType: tiktokShop.TiktokPayType1, @@ -367,15 +360,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.CategoryLeafId = storeSku.VendorVendorCatID } - - if len(param.Name) < 23 { // 中文字符一个汉字三个长度符号/数字/字母两个长度,商品名称不能大于 - param.Name += utils.Float64ToStr(float64(storeSku.SpecQuality)) + "/" + storeSku.SpecUnit - if len(param.Name) < 23 { - param.Name += "【惊喜到家】" - } - } else if len(param.Name) > 90 { // 抖音最大60个字符,三十个汉字 - param.Name = param.Name[0:90] - } + param.Name = checkNameLenght(param.Name) // 获取上传图,商品轮播图 img, detailImg, err := GetTiktokImgList(api, utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) @@ -385,16 +370,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } param.Pic = img 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 - //} - //param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) // 获取商品的属性 if storeSku.TiktokAttribute == "" || storeSku.TiktokAttribute == "{}" { param.ProductFormatNew, err = MakeProductFormatNew(api, int64(storeSku.NameID), param.CategoryLeafId) @@ -405,66 +382,240 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.ProductFormatNew = storeSku.TiktokAttribute } - // 获取品牌 param.StandardBrandId = 789194134 // 默认品牌京西菜市 - - //tiktokResult, err := api.EditStoreCommodity(param) // 创建主商品 - //if err != nil { - // failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - // storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - // continue - //} + var mainIdInt int64 + if storeSku.VendorMainId == "" { + localThing, _ := dao.GetThingToTiktokMapList(db, model.VendorIDDD, int64(storeSku.SkuID), storeDetail.VendorOrgCode) + if len(localThing) == 0 || localThing == nil { + mainOrderDetail, err := api.GetSkuDetailLocalID("", utils.Int2Str(storeSku.SkuID)) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue + } + storeSku.VendorMainId = mainOrderDetail.ProductIdStr + mainIdInt = mainOrderDetail.MainProductId + if err := dao.CreateThingMap(int64(storeSku.SkuID), mainOrderDetail.ProductIdStr, storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId, model.ThingTypeSku, 0); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + } + } else { + storeSku.VendorMainId = localThing[0].VendorThingID + mainIdInt = utils.Str2Int64(localThing[0].VendorThingID) + } + } else { + mainIdInt = utils.Str2Int64(storeSku.VendorMainId) + } // 修改商品 - //param.FreightId = freightId - param.ProductId = utils.Str2Int64(storeSku.VendorMainId) - param.MainProductId = utils.Str2Int64(storeSku.VendorMainId) + param.ProductId = mainIdInt + param.MainProductId = mainIdInt param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, param.MainProductId, storeSku) - param.ProductId = utils.Str2Int64(storeSku.VendorSkuID) - 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) storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } - - // 门店商品同步,先删除同步商品,在重新分配该商品 - if _, err := api.BatchRedistributeStoreProduct(&superm_product_batchRedistributeStoreProduct_request.TaskParams{ - MainProductId: param.MainProductId, - AddStoreIds: nil, - DelStoreIds: []int64{param.StoreId}, - }); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - continue - } - - if _, err := api.BatchRedistributeStoreProduct(&superm_product_batchRedistributeStoreProduct_request.TaskParams{ - MainProductId: param.MainProductId, - AddStoreIds: []int64{param.StoreId}, - DelStoreIds: nil, - }); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - continue - } - //if err := api.EditStoreCommodity(param); err != nil { - // failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - // storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - // continue - //} - + storeSku.StoreSkuStatus = 57 // 品库修改 售卖状态待同步 价格待同步 } return } - - if len(failedList) > 0 { - err = nil - } return failedList, err } +func checkNameLenght(name string) string { + var chinesLen int // 中文 + var punctZh int // 中文标点 + var punctEn int // 英文标点 + var punctAZ int // 字母 + var punctNum int // 字母 + var spance int // 空格 + for _, v := range name { + if unicode.Is(unicode.Han, v) { // 中文 + chinesLen++ + continue + } + if unicode.IsPunct(v) { + if v >= 1000 { // 中文字符 + fmt.Println(v) + punctZh++ + } else { + punctEn++ // 英文字符 + } + continue + } + if unicode.IsLetter(v) { // 字母 + punctAZ++ + continue + } + if unicode.IsNumber(v) { // 数字 + punctNum++ + continue + } + if unicode.IsSpace(v) { // 空格 + spance++ + continue + } + } + + maxLen := (chinesLen * 2) + (punctZh * 2) + punctEn + punctAZ + punctNum + spance + if maxLen > 60 { // 美团最多支持30个汉字长度 + index := strings.LastIndex(name, " ") + if index != 0 { + return name[0:index] + } else { + return name[0 : len(name)-(maxLen-60)*3] + } + } else if maxLen < 16 { + name += "【同城配送】" + return name + } + return name +} +func upDateChildrenPriceStockLaunch(api *tiktokShop.API, storeSku *dao.StoreSkuSyncInfo, childrenProductId int64, vendorStoreID, syncType string) (failedList []*partner.StoreSkuInfoWithErr) { + skuId, failed := getProductSkuID(api, storeSku, syncType, childrenProductId) + if skuId == 0 || len(failed) > 0 { + return failed + } + // 同步价格 + if err := api.EditPrice(&sku_editPrice_request.SkuEditPriceParam{ + SkuId: skuId, + Price: storeSku.VendorPrice, + ProductId: childrenProductId, + }); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], syncType) + } + // 同步库存 + paramStock := &sku_syncStock_request.SkuSyncStockParam{ + SkuId: skuId, + ProductId: childrenProductId, + Incremental: false, + IdempotentId: "", + StockNum: int64(storeSku.Stock), + OutWarehouseId: vendorStoreID, + } + if paramStock.StockNum == 0 { + paramStock.StockNum = 99999 + } + if err := api.UpdateSkuStock(paramStock); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("子商品添加固定库存.%s", err.Error()))...) + } + // 上架 + if err := api.LaunchProduct(childrenProductId); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架子商品异常.%s", err.Error()))...) + } + if len(failedList) > 0 { + storeSku.SkuSyncStatus = model.SyncFlagStoreSkuModifiedMask + } else { + storeSku.SkuSyncStatus = 0 + } + return failedList +} + +// 查询商品详情,获取商品的抖音skuId +func getProductSkuID(api *tiktokShop.API, storeSku *dao.StoreSkuSyncInfo, syncType string, productId int64) (childrenSkuId int64, failedList []*partner.StoreSkuInfoWithErr) { + if storeSku.VendorSonSkuID != "" && storeSku.VendorSonSkuID != storeSku.VendorSkuID { + return utils.Str2Int64(storeSku.VendorSonSkuID), nil + } + childrenDetail, err := api.GetSkuDetail(utils.Int64ToStr(productId), "") + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], syncType) + } + + for _, v := range childrenDetail.SpecPrices { + childrenSkuId = v.SkuId + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenSkuId) + return childrenSkuId, nil + } + return 0, putils.GetErrMsg2FailedSingleList(storeSku, fmt.Errorf("获取商品抖音skuId失败[%d]", productId), storeSku.StoreID, model.VendorChineseNames[model.VendorIDDD], syncType) +} + +func getProductSkuId4UpdateStock(api *tiktokShop.API, skuInfo *partner.StoreSkuInfo, storeId int) (tiktokSkuId int64, failedList []*partner.StoreSkuInfoWithErr) { + if skuInfo.VendorSonSkuID != "" && skuInfo.VendorSonSkuID != skuInfo.VendorSkuID && len(skuInfo.VendorSonSkuID) >= len("3589393056912261100") { // 抖音长度 + return utils.Str2Int64(skuInfo.VendorSonSkuID), nil + } + + var childrenSku *product_detail_response.ProductDetailData + var err error + if len(skuInfo.VendorSkuID) >= len("3589393056912261100") { + childrenSku, err = api.GetSkuDetail(skuInfo.VendorSkuID, "") + if err != nil || len(childrenSku.SpecPrices) <= 0 { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(skuInfo, err, storeId, model.VendorChineseNames[model.VendorIDDD], "修改库存[err为空,子商品skuId未获取到]")...) + return 0, failedList + } + } else { + childrenSku, err = api.GetSkuDetailLocalID("", skuInfo.VendorSkuID) + if err != nil || len(childrenSku.SpecPrices) <= 0 { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(skuInfo, err, storeId, model.VendorChineseNames[model.VendorIDDD], "修改库存[err为空,子商品skuId未获取到]")...) + return 0, failedList + } + } + + globals.SugarLogger.Debugf("=GetSkuDetail By childrenSku %s", utils.Format4Output(childrenSku, false)) + for _, v := range childrenSku.SpecPrices { + tiktokSkuId = v.SkuId + skuInfo.VendorSonSkuID = utils.Int64ToStr(v.SkuId) + skuInfo.VendorSkuID = childrenSku.ProductIdStr + return tiktokSkuId, nil + } + + return 0, append(failedList, putils.GetErrMsg2FailedSingleList(skuInfo, nil, storeId, model.VendorChineseNames[model.VendorIDDD], "修改库存,获取商品详情SkuId未获取到")...) +} + +func getFreightIdAndSaleLimitId(api *tiktokShop.API, db *dao.DaoDB, storeDetail *dao.StoreDetail, vendorStoreID string) (freightId, saleLimitId int64, err error) { + temp, err := dao.QueryStoreBindInfo(storeDetail.Store.ID) + if err != nil || temp == nil || temp.ID == 0 { + // 运费模板 + freightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) + if err != nil { + return 0, 0, err + } + // 获取门店限售模板 + saleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) + if err != nil { + return 0, 0, err + } + // 保存数据库 + freightTemplate := &model.FreightTemplate{ + StoreID: storeDetail.Store.ID, + VendorStoreID: storeDetail.VendorStoreID, + TemplateID: freightId, + WarehouseID: 0, + FenceID: "", + TradeLimitID: saleLimitId, + } + err = dao.CreateEntity(db, freightTemplate) + } else { + if temp.TemplateID != 0 { + freightId = temp.TemplateID + } else { + // 运费模板 + freightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) + if err != nil { + return 0, 0, err + } + temp.TemplateID = freightId + _, err = dao.UpdateEntity(db, temp, "TemplateID") + dao.FreightTemplateMap[temp.StoreID] = temp + } + + if temp.TradeLimitID != 0 { + saleLimitId = temp.TradeLimitID + } else { + // 获取门店限售模板 + saleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) + if err != nil { + return 0, 0, err + } + temp.TradeLimitID = saleLimitId + _, err = dao.UpdateEntity(db, temp, "TradeLimitID") + dao.FreightTemplateMap[temp.StoreID] = temp + } + } + + return freightId, saleLimitId, nil +} + // CreateSaleTemp 创建限售模板 func CreateSaleTemp(storeId int64, api *tiktokShop.API) (int64, error) { // 获取限售模板 @@ -712,7 +863,7 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk } stock := localSku.Stock if localSku.Stock == 0 { - stock = 9999 + stock = 99999 } sku.StockNum = stock sku.SkuType = 1 @@ -738,7 +889,7 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk } stock := localSku.Stock if localSku.Stock == 0 { - stock = 9999 + stock = 99999 } sku.StockNum = stock sku.SkuType = 1 @@ -768,7 +919,7 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk } stock := localSku.Stock if localSku.Stock == 0 { - stock = 9999 + stock = 99999 } sku.StockNum = stock sku.SkuType = 1 diff --git a/controllers/cms_store.go b/controllers/cms_store.go index 26482fe84..6022cfaff 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -1544,7 +1544,7 @@ func (c *StoreController) CreateFreeShipTemplates() { }) } -// @Title 打印机获取授权账号再京西菜市的绑定关系 +// @Title 打印机获取授权账号再京西菜市的绑定关系(其实就是根据平台门店id获取绑定门店id) // @Description 打印机获取授权账号再京西菜市的绑定关系 // @Param token header string true "认证token" // @Param vendorStoreId formData string true "平台账号id" @@ -1558,3 +1558,20 @@ func (c *StoreController) PrintCheckAccountAuthorization() { return retVal, "", err }) } + +// @Title 门店存在时,绑定打印机账号信息 +// @Description 门店存在时,绑定打印机账号信息 +// @Param token header string true "认证token" +// @Param storeId formData int64 true "京西门店id" +// @Param printSn formData string true "打印机编号" +// @Param printKey formData string true "打印机秘钥" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /BindJxPrinter [post] +func (c *StoreController) BindJxPrinter() { + c.callBindJxPrinter(func(params *tStoreBindJxPrinterParams) (interface{}, string, error) { + err := cms.BindJxPrintToStore(int64(params.StoreId), params.PrintSn, params.PrintKey) + return nil, "", err + }) + +} diff --git a/controllers/tiktok_delivery.go b/controllers/tiktok_delivery.go index b01703ade..8397fc9df 100644 --- a/controllers/tiktok_delivery.go +++ b/controllers/tiktok_delivery.go @@ -149,18 +149,20 @@ func (c *LogisticsController) LogisticsQuery() { Message: "运单账号不存在", } c.ServeJSON() + return } // 查询订单的运单是否存在 data, err := dao.GetWayBillsByWayBillId(dao.GetDB(), param.TrackNo) if err != nil || len(data) == 0 { - globals.SugarLogger.Debugf("根据单号查询运单数据错误:%s", err) + globals.SugarLogger.Debugf("根据单号查询运单数据错误:%s,运单号 :%s", err.Error(), param.TrackNo) c.Data["json"] = LogisticsQueryRest{ Result: false, ReturnCode: "1002", Message: "运单账号不存在", } c.ServeJSON() + return } returnParam := &LogisticsQueryRest{ diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index cb47fa3b8..58042c6c5 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -3000,6 +3000,16 @@ func init() { Filters: nil, Params: nil}) + // 绑定京西打印机到京西菜市 + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"], + web.ControllerComments{ + Method: "BindJxPrinter", + Router: `/BindJxPrinter`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], web.ControllerComments{ Method: "BackUpStoreSkuBind",