Merge branch 'jdshop' of https://e.coding.net/rosydev/jx-callback into jdshop
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -191,6 +191,12 @@ func Init() {
|
||||
}, []string{
|
||||
"22:00:00",
|
||||
})
|
||||
// 更新抖店订单的结算信息
|
||||
ScheduleTimerFunc("UpdateTiktokShopTotalMoney", func() {
|
||||
orderman.UpdateTiktokShopTotalMoney()
|
||||
}, []string{
|
||||
"03:35:00",
|
||||
})
|
||||
|
||||
// 每分钟轮询一次,推送抖店骑手信息
|
||||
ScheduleTimerFuncByInterval(func() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user