diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 4f1419910..29a734f20 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "errors" "fmt" + order_getSettleBillDetailV3_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_getSettleBillDetailV3/request" "git.rosy.net.cn/jx-callback/business/authz/autils" "git.rosy.net.cn/jx-callback/business/jxutils/excel" "git.rosy.net.cn/jx-callback/business/jxutils/netprinter" @@ -2473,3 +2474,56 @@ func ExportOrderWithSku(ctx *jxcontext.Context, orders []*model.GoodsOrderExt) ( baseapi.SugarLogger.Debug("WriteToExcel: dataSuccess downloadURL: [%v]", downloadURL) return downloadURL, err } + +// UpdateTiktokShopTotalMoney 定时任务更新抖店订单的平台结算 +func UpdateTiktokShopTotalMoney() { + var goodsOrders []*model.GoodsOrder + sql := `SELECT g.* FROM goods_order g WHERE g.order_created_at >= ? AND g.status = ? AND g.vendor_id = ? AND total_shop_money = ? ORDER BY g.order_created_at desc` + orderCreateTime := time.Now().AddDate(0, 0, -15) + param := []interface{}{orderCreateTime, model.OrderStatusFinished, model.VendorIDDD, model.NO} + if err := dao.GetRows(dao.GetDB(), &goodsOrders, sql, param...); err != nil { + globals.SugarLogger.Debugf("Update GoodsOrder Total shop money err %s", err) + return + } + + orderList := make([]string, 0, 0) + goodsOrdersMap := make(map[string]*model.GoodsOrder, len(goodsOrders)) + for _, v := range goodsOrders { + orderList = append(orderList, v.VendorOrderID) + goodsOrdersMap[v.VendorOrderID] = v + } + + db := dao.GetDB() + randNum := 0 + nextStartIndex := "" + if len(orderList) <= 50 { + randNum = 1 + } else { + randNum = len(orderList) / 50 + if len(orderList)%50 != 0 { + randNum++ + } + } + + for i := 0; i < randNum; i++ { + orderString := strings.Join(orderList[0:i*50], ",") + orderMap, next, err := api.TiktokStore.GetSettleBillDetailV3(&order_getSettleBillDetailV3_request.OrderGetSettleBillDetailV3Param{ + Size: 50, + OrderId: orderString, + StartIndex: nextStartIndex, + }) + if err != nil { + globals.SugarLogger.Errorf("获取平台订单异常 : %s", err) + continue + } + for k, v := range orderMap { + goodsOrdersMap[k].TotalShopMoney = v + if _, err := dao.UpdateEntity(db, goodsOrdersMap[k], "TotalShopMoney"); err != nil { + globals.SugarLogger.Errorf("更新本地订单结算信息错误 : %s", err) + continue + } + } + nextStartIndex = next + } + +} diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 7a8a765b9..305bdba82 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -678,14 +678,14 @@ 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("===============priceList%s", utils.Format4Output(priceList, 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("===============offlineList %s", utils.Format4Output(offlineList, false)) + //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("===============priceList%s", utils.Format4Output(priceList, 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("===============offlineList %s", utils.Format4Output(offlineList, false)) task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index e55f7ea9e..bcf452a91 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -191,6 +191,12 @@ func Init() { }, []string{ "22:00:00", }) + // 更新抖店订单的结算信息 + ScheduleTimerFunc("UpdateTiktokShopTotalMoney", func() { + orderman.UpdateTiktokShopTotalMoney() + }, []string{ + "03:35:00", + }) // 每分钟轮询一次,推送抖店骑手信息 ScheduleTimerFuncByInterval(func() { diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index b8680c3fe..4cc17b57d 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -1079,8 +1079,6 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat } sql += " LIMIT ? OFFSET ?" sqlParams = append(sqlParams, pageSize, offset) - globals.SugarLogger.Debugf("sqlParams pageSize=====%d,offset==========%d", pageSize, offset) - globals.SugarLogger.Debugf("test sql=======================%s", sql) txDB, _ := Begin(db) defer Commit(db, txDB) if err = GetRowsTx(txDB, &orders, sql, sqlParams...); err == nil { diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index e648747af..f8913c911 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "git.rosy.net.cn/baseapi/platformapi/mtpsapi" + order_getSettleBillDetailV3_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_getSettleBillDetailV3/request" order_logisticsAdd_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_logisticsAdd/request" order_orderDetail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_orderDetail/response" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" @@ -172,7 +173,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s salePrice += sku.SalePrice } } - order.TotalShopMoney = utils.Float64TwoInt64(float64(salePrice) * 0.95) // 抖音平台扣点金额0.05 + //order.TotalShopMoney = utils.Float64TwoInt64(float64(salePrice) * 0.95) // 抖音平台扣点金额0.05 // 预订单还是快速达 localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode) @@ -990,3 +991,12 @@ func (c *PurchaseHandler) CancelLogisticsByWmOrderId(order *model.GoodsOrder, re func (c *PurchaseHandler) OrderLogisticsStatus(orderId int64) (int64, error) { return 0, nil } + +// GetOrderTotalShopMoney 获取门店结算信息 +func GetOrderTotalShopMoney(appOrgCode string, orderIds string, nextStartIndex string) (map[string]int64, string, error) { + return getAPI(appOrgCode, 0, "").GetSettleBillDetailV3(&order_getSettleBillDetailV3_request.OrderGetSettleBillDetailV3Param{ + Size: 50, + OrderId: orderIds, + StartIndex: nextStartIndex, + }) +} diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index ec2d715db..5351c9d44 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -435,28 +435,21 @@ func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorO return err } -func GetProductAuditList(vendorOrgCode string) map[string]string { - var page int64 = 1 - var pageSize int64 = 100 - - updateCategory := make(map[string]string, 0) // 修改分类的Map - for { - data, err := getAPI(vendorOrgCode, 0, "").GetProductAuditList(page, pageSize, 2) - if err != nil || len(data) == 0 { - break - } - for _, v := range data { - if _, ok := v.AuditReason["综合原因"]; ok { - if strings.Contains(v.AuditReason["综合原因"][0], "该商品类目选择错误,推荐放置在") { - list := strings.Split(v.AuditReason["综合原因"][0], `“`) - list2 := strings.Split(list[1], `”`) - categoryNameList := strings.Split(list2[0], "/") - updateCategory[utils.Int64ToStr(v.ProductId)] = categoryNameList[len(categoryNameList)-1] - } - } - - } - break +func GetProductAuditList(vendorOrgCode string, page, pageSize int64) (map[string]string, int64) { + updateCategory := make(map[string]string, 100) // 修改分类的Map + data, total, err := getAPI(vendorOrgCode, 0, "").GetProductAuditList(page, pageSize, 2) + if err != nil || len(data) == 0 { + return nil, 0 } - return updateCategory + for _, v := range data { + if _, ok := v.AuditReason["综合原因"]; ok { + if strings.Contains(v.AuditReason["综合原因"][0], "该商品类目选择错误,推荐放置在") { + list := strings.Split(v.AuditReason["综合原因"][0], `“`) + list2 := strings.Split(list[1], `”`) + categoryNameList := strings.Split(list2[0], "/") + updateCategory[utils.Int64ToStr(v.ProductId)] = categoryNameList[len(categoryNameList)-1] + } + } + } + return updateCategory, total } diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index f63fc43e2..7bc7d671c 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -150,27 +150,15 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI PickupMethod: "0", OuterProductId: utils.Int2Str(storeSku.SkuID), // 本地skuId为外部商品id } - // 部分商品没有所属的分类,直接跳过! - if storeSku.SkuVendorMapCatID != "" { - param.CategoryLeafId = utils.Str2Int64(storeSku.SkuVendorMapCatID) - } else if storeSku.VendorVendorCatID != 0 { - param.CategoryLeafId = storeSku.VendorVendorCatID - } else { - continue - } 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] } - // 是否支持七天无理由 - if api.GetProductUpdateRule(param.CategoryLeafId) { - param.Supply7dayReturn = 1 - } else { - param.Supply7dayReturn = 0 - } - // 获取上传图,商品轮播图 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 { @@ -179,13 +167,25 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI param.Pic = img param.Description = detailImg + // 部分商品没有所属的分类,直接跳过! + if storeSku.SkuVendorMapCatID != "" { + param.CategoryLeafId = utils.Str2Int64(storeSku.SkuVendorMapCatID) + } else if len(param.Pic) != 0 { // 自动推导分类id + param.CategoryLeafId = api.GetRecommendCategory(strings.Split(img, "|")) + } + if storeSku.VendorVendorCatID != 0 && param.CategoryLeafId == 0 { + param.CategoryLeafId = storeSku.VendorVendorCatID + } + + // 是否支持七天无理由 + if api.GetProductUpdateRule(param.CategoryLeafId) { + param.Supply7dayReturn = 1 + } else { + param.Supply7dayReturn = 0 + } + // 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 - //} // spec_prices param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) @@ -206,7 +206,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI //if err != nil { // return nil, err //} - param.StandardBrandId = 789194134 // 默认品牌京西菜市 + param.StandardBrandId = 596120136 // 默认品牌京西菜市 // 根据本地商品id获取线上商品是否存在,存在则只创建子商品 var tiktokResultProductId int64 = 0 @@ -333,6 +333,12 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI param.CategoryLeafId = storeSku.VendorVendorCatID } + if len(param.Name) < 23 { // 中文字符一个汉字三个长度符号/数字/字母两个长度,商品名称不能大于 + param.Name += utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit + " " + } else if len(param.Name) > 90 { // 抖音最大60个字符,三十个汉字 + param.Name = param.Name[0:90] + } + // 获取上传图,商品轮播图 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 { @@ -361,7 +367,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } // 获取品牌 - param.StandardBrandId = 789194134 // 默认品牌京西菜市 + param.StandardBrandId = 596120136 // 默认品牌京西菜市 //tiktokResult, err := api.EditStoreCommodity(param) // 创建主商品 //if err != nil { @@ -597,7 +603,7 @@ func MakeProductFormatNew(api *tiktokShop.API, skuNameId int64, categoryLeafId i } options := make([]map[string]interface{}, 0) if v.PropertyName == "品牌" { - options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 789194134, "diy_type": v.DiyType}) + options = append(options, map[string]interface{}{"name": v.PropertyName, "value": 596120136, "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}) diff --git a/controllers/cms_sku.go b/controllers/cms_sku.go index c3b42d391..030e24a34 100644 --- a/controllers/cms_sku.go +++ b/controllers/cms_sku.go @@ -11,6 +11,7 @@ import ( "git.rosy.net.cn/jx-callback/business/partner/purchase/tiktok_store" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/server/web" + "time" ) type SkuController struct { @@ -831,6 +832,13 @@ func (c *SkuController) BatchSetRestockingPrice() { }) } +type CategoryList struct { + DdId string `json:"dd_id"` + Id int `json:"id"` + NameId int `json:"name_id"` + StoreId int `json:"store_id"` +} + // @Title 抖店商品类目修改 // @Description 抖店商品类目修改 // @Success 200 {object} controllers.CallResult @@ -838,18 +846,69 @@ func (c *SkuController) BatchSetRestockingPrice() { // @router /UpdateTiktokCategory [post] func (c *SkuController) UpdateTiktokCategory() { c.callUpdateTiktokCategory(func(params *tSkuUpdateTiktokCategoryParams) (interface{}, string, error) { - data := tiktok_store.GetProductAuditList("57939570") - globals.SugarLogger.Debugf("==========111 %s", utils.Format4Output(data, false)) - for k, v := range data { - vendorCatgory, err := cms.GetVendorCategoriesByName(14, v) - if err != nil || vendorCatgory == nil { - data[k] = v - globals.SugarLogger.Debugf("err := %s", err) - continue + var page int64 = 1 + var pageSize int64 = 100 + var count int64 = 0 + for { + data1, total := tiktok_store.GetProductAuditList("57939570", page, pageSize) + ddIDList := make([]string, 0, 0) + skuList := make([]CategoryList, 0, 0) + data2 := make(map[string]string, 0) + db := dao.GetDB() + + for k, v := range data1 { + vendorCatgory, _ := cms.GetVendorCategoriesByName(14, v) + if vendorCatgory == nil || vendorCatgory.VendorCategoryID == "" { + continue + } + ddIDList = append(ddIDList, k) + data2[k] = vendorCatgory.VendorCategoryID + } + + sql := " SELECT b.dd_id,b.store_id,s.id,s.name_id FROM store_sku_bind b INNER JOIN sku s ON b.sku_id = s.id AND s.deleted_at = ? WHERE b.dd_id IN (" + dao.GenQuestionMarks(len(ddIDList)) + ") AND b.deleted_at = ?" + param := []interface{}{utils.DefaultTimeValue, ddIDList, utils.DefaultTimeValue} + if err := dao.GetRows(db, &skuList, sql, param...); err != nil { + return nil, "", err + } + for _, v := range skuList { + count++ + item := &model.SkuVendorCategoryMap{ + ModelIDCULD: model.ModelIDCULD{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + DeletedAt: utils.DefaultTimeValue, + LastOperator: "18981810340", + }, + NameID: v.NameId, + VendorID: model.VendorIDDD, + } + + item.VendorCategoryID = data2[v.DdId] + skuVendorCategoryMap := &model.SkuVendorCategoryMap{} + if err := dao.GetRow(db, skuVendorCategoryMap, `SELECT * FROM sku_vendor_category_map WHERE name_id = ? AND vendor_id = ? AND deleted_at = ?`, []interface{}{v.NameId, model.VendorIDDD, utils.DefaultTimeValue}); err != nil { + globals.SugarLogger.Debugf("====================err3 %s", err) + } + if skuVendorCategoryMap != nil && skuVendorCategoryMap.ID > 0 { + if _, err := dao.UpdateEntity(db, skuVendorCategoryMap, "VendorCategoryID"); err != nil { + globals.SugarLogger.Debugf("====================err4 %s", err) + } + } else { + if err := dao.CreateEntity(db, item); err != nil { + globals.SugarLogger.Debugf("====================err5 %s", err) + } + } + go func() { + time.Sleep(500 * time.Millisecond) + hit, err := cms.CurVendorSync.SyncStoresSkus(params.Ctx, nil, 0, db, []int{14}, []int{v.StoreId}, []int{v.Id}, true, false, true) + globals.SugarLogger.Debugf("===============hit:%s err: %s", hit, err) + }() + } + if page*pageSize < total { + page++ + } else { + break } - data[k] = vendorCatgory.VendorCategoryID } - globals.SugarLogger.Debugf("==========222 %s", utils.Format4Output(data, false)) - return data, "", nil + return count, "", nil }) }