Merge branch 'jdshop' of https://e.coding.net/rosydev/jx-callback into jdshop

This commit is contained in:
richboo111
2022-10-28 14:10:06 +08:00
6 changed files with 112 additions and 64 deletions

View File

@@ -518,6 +518,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
// isBlendWay = strings.Contains(mtStoreInfo.LogisticsCodes, model.MTWMStorePSWay8)
//}
// 暂时只处理抖音平台,抖音暂无配送,只要是抖音订单,三方配送压单了,直接通知送出
if order.VendorID == model.VendorIDDD && bill.Status == model.WaybillStatusNew {
s.SelfDeliverDelivering(order, "自配送中")
}
if bill.Status == model.WaybillStatusNew {
s.addWaybill2Map(savedOrderInfo, bill)
if !isPending {

View File

@@ -346,7 +346,7 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs
LEFT JOIN sku_vendor_category_map tsy ON tsy.name_id = t2.id AND tsy.vendor_id = ? AND tsy.deleted_at = ?
WHERE 1 = 1
`
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, vendorIDs[0], utils.DefaultTimeValue)
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, model.VendorIDJD, utils.DefaultTimeValue)
if mustDirty {
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
} else {

View File

@@ -47,10 +47,11 @@ func GetThingToTiktokMapList(db *DaoDB, vendorId int, thingId int64) (cats []*mo
sql := `
SELECT t1.*
FROM thing_map t1
WHERE thing_id = ? AND vendor_id = ? t1.deleted_at = ?
WHERE t1.thing_id = ? AND t1.vendor_id = ? AND t1.deleted_at = ?
`
sqlParams := []interface{}{
vendorId, thingId,
thingId,
vendorId,
utils.DefaultTimeValue,
}

View File

@@ -103,7 +103,6 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
InvoiceTaxerID: "",
InvoiceEmail: "",
VendorOrgCode: vendorOrgCode,
TotalShopMoney: utils.Float64TwoInt64(float64(result.PayAmount) * 0.95), // 抖音平台扣点金额0.05
}
// 本地获取订单记录
orderSeq, _ := dao.GetVendorOrderNumber(dao.GetDB(), model.VendorIDDD, order.VendorStoreID)
@@ -128,6 +127,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
order.DiscountMoney = result.PromotionAmount
vendorStoreIdRelly := "" // 门店id
vendorNameRelly := "" // 门店id
var salePrice int64 = 0
// 添加需要赠送的东西(暂时没有赠品套餐直接商品)
multiSkuMap := make(map[int]int)
if len(result.SkuOrderList) > 0 {
@@ -171,8 +171,10 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
order.Skus = append(order.Skus, sku)
vendorStoreIdRelly = extra.StoreInfo.StoreId
vendorNameRelly = extra.StoreInfo.StoreName
salePrice += sku.SalePrice
}
}
order.TotalShopMoney = utils.Float64TwoInt64(float64(salePrice) * 0.95) // 抖音平台扣点金额0.05
// 预订单还是快速达
localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode)
@@ -479,7 +481,7 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac
orderStatus.Status = model.OrderStatusUnknown
orderStatus.Remark = "126-预约发货:"
shopId = orderMsg.ShopId
case tiktokShop.CallbackWaitOrderMsgTagId: // 应为需要同步京东,美团拣货功能制作的假拣货,抖音不存在拣货
case FakeMsgType: // 应为需要同步京东,美团拣货功能制作的假拣货,抖音不存在拣货
orderMsg := tiktokShop.FakePickUpGoodsData{}
if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil {
return nil, 0
@@ -489,7 +491,7 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac
orderStatus.StatusTime = time.Now()
orderStatus.Status = model.OrderStatusFinishedPickup
orderStatus.Remark = "15-抖音假拣货:"
shopId = 0
shopId = orderMsg.ShopId
default:
return nil, 0
}
@@ -508,9 +510,14 @@ func vendorStatusToLocalStatus(vendorStatus int64) int {
return model.OrderStatusUnknown
}
func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, vendorStatus string) {
msg := &tiktokShop.FakePickUpGoodsData{PId: vendorOrderID, VendorStatus: vendorStatus}
func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, VendorStatus, appOrgCode string) {
// c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup)
msg := &tiktokShop.FakePickUpGoodsData{
PId: vendorOrderID,
VendorStatus: VendorStatus,
Cmd: cmd,
ShopId: utils.Str2Int64(appOrgCode),
}
utils.CallFuncAsync(func() {
c.onOrderMsg(cmd, vendorOrderID, msg)
})
@@ -547,7 +554,7 @@ func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo
// err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").PreparationMealComplete(utils.Str2Int64(order.VendorOrderID))
// }
//}
c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup)
c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup, order.VendorOrgCode)
return nil
}
@@ -568,12 +575,19 @@ func (c *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan
return order.BusinessType != model.BusinessTypeDingshida, nil
}
// Swtich2SelfDeliver 暂无转自送
// Swtich2SelfDeliver 抖音转自送的时候就是通知抖音发货了
func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
//if globals.EnableMtwmStoreWrite {
// err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderLogisticsChange2Self(utils.Str2Int64(order.VendorOrderID))
//}
return err
return getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderDelivering(&order_logisticsAdd_request.OrderLogisticsAddParam{
OrderId: order.VendorOrderID,
Company: "",
CompanyCode: "chengdouruoxi",
LogisticsCode: order.VendorWaybillID,
IsRefundReject: false,
IsRejectRefund: false,
SerialNumberList: nil,
AddressId: 0,
StoreId: utils.Str2Int64(order.VendorStoreID),
})
}
// Swtich2SelfDelivered 暂无自送完成
@@ -642,12 +656,15 @@ func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod
// CancelOrder 取消订单 (抖音商家无法发起退单操作,商家联系不到客户取消订单/拒收/缺货)
func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
if globals.EnableDdStoreWrite {
return errors.New("抖音商家无法发起退单操作")
//if err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderCancel(utils.Str2Int64(order.VendorOrderID), reason, mtwmapi.CancelReasonOther); err == nil {
// // 调用开放平台接口取消订单,不推送取消订单消息和退款消息。
// c.postFakeMsg(order.VendorOrderID, tiktokShop.CallbackCancelOrderMsgTagId, utils.Int2Str(tiktokShop.CreateOrderStatusCancel))
//}
// 售后原因枚举 MissGram = 1缺重必传克数、金额 MissItem = 2缺货只支持整单退 RefuseSign = 3 拒收,支持按件数退,金额由抖音计算
// 获取订单商品数量
var count = 0
for _, v := range order.Skus {
count += v.Count
}
if _, err = getAPI(order.VendorOrgCode, 0, "").ApplyMarketAfterSale(utils.Str2Int64(order.VendorOrderID), int64(count), 3); err == nil {
// 调用开放平台接口取消订单,不推送取消订单消息和退款消息。
c.postFakeMsg(order.VendorOrderID, tiktokShop.CallbackCancelOrderMsgTagId, utils.Int2Str(tiktokShop.CreateOrderStatusCancel), order.VendorOrgCode)
}
return err
}
@@ -663,7 +680,7 @@ func (c *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.Goods
for _, sku := range removedSkuList {
// todo 商家发起部分退单,传入参数为子订单id,子订单id需要存储,返回售后单id
_, err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").ApplyMarketAfterSale(utils.Str2Int64(sku.VendorOrderID), 2)
_, err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").ApplyMarketAfterSale(utils.Str2Int64(sku.VendorOrderID), int64(sku.Count), 2)
}
return err
}

View File

@@ -1,8 +1,8 @@
package tiktok_store
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
product_editV2_commit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2_commit/request"
sku_editPrice_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_editPrice/request"
sku_syncStock_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_syncStock/request"
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
@@ -211,28 +211,53 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
return failedList, err
}
// UpdateStoreSkusStatus 批量更新商品上下架
// UpdateStoreSkusStatus 批量更新商品上下架(上架商品库存更新最大,下架商品库存为0)
func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) {
api := getAPI(vendorOrgCode, storeID, vendorStoreID)
if status == model.SkuStatusNormal { //
if status == model.SkuStatusNormal { //
for _, v := range storeSkuList {
// p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, false)
if err := api.EditStoreCommodityCommit(&product_editV2_commit_request.ProductEditV2Param2{
ProductId: utils.Str2Int64(v.VendorSkuID),
Commit: true,
}); err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品异常")...)
//if err := api.EditStoreCommodityCommit(&product_editV2_commit_request.ProductEditV2Param2{
// ProductId: utils.Str2Int64(v.VendorSkuID),
// Commit: true,
//}); err != nil {
// failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...)
//} else {
// failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...)
//}
param := &sku_syncStock_request.SkuSyncStockParam{
SkuId: utils.Str2Int64(v.VendorSkuAttrId),
ProductId: utils.Str2Int64(v.VendorSkuID),
Incremental: false,
IdempotentId: "",
StockNum: 0,
OutWarehouseId: vendorStoreID,
}
if err := api.UpdateSkuStock(param); err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("下架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...)
} else {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "架商品正常")...)
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("架商品正常,添加固定库存.%s", utils.Format4Output(param, false)))...)
}
}
} else { //
} else { //
for _, v := range storeSkuList {
err := api.ProductSetOffline(utils.Str2Int64(v.VendorSkuID))
if err == nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...)
//err := api.ProductSetOffline(utils.Str2Int64(v.VendorSkuID))
//if err == nil {
// failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...)
//} else {
// failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...)
//}
param := &sku_syncStock_request.SkuSyncStockParam{
SkuId: utils.Str2Int64(v.VendorSkuAttrId),
ProductId: utils.Str2Int64(v.VendorSkuID),
Incremental: false,
IdempotentId: "",
StockNum: 99999,
OutWarehouseId: vendorStoreID,
}
if err := api.UpdateSkuStock(param); err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...)
} else {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...)
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], fmt.Sprintf("上架架商品异常,添加固定库存.%s", utils.Format4Output(param, false)))...)
}
}
}

View File

@@ -73,6 +73,8 @@ func QueryAllMainSkuList(appOrgCode string, param *MainSku) ([]*TiktokIdAndLocal
localSkuId = skuDetail.OutProductId
} else if skuDetail.OuterProductId != "" {
localSkuId = utils.Str2Int64(skuDetail.OuterProductId)
} else {
localSkuId = utils.Str2Int64(skuDetail.SpecPrices[0].Code)
}
var attrId []string
@@ -122,8 +124,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID)
if isCreate {
syncType = "创建商品"
for _, storeSku := range storeSkuList {
// 创建商品
for _, storeSku := range storeSkuList { // 创建商品
param := &product_addV2_request.ProductAddV2Param{
CategoryLeafId: utils.Str2Int64(storeSku.SkuVendorMapCatID),
Name: utils.LimitUTF8StringLen(storeSku.SkuName, mtwmapi.MaxSkuNameCharCount),
@@ -135,7 +136,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
Supply7dayReturn: 2, // 是否支持7天无理由0不支持1支持2支持拆封后不支持
Mobile: storeDetail.Tel1,
Commit: true,
Specs: "重|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit,
Specs: "重|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit,
NeedRechargeMode: false,
SellChannel: []int64{0},
StartSaleType: 0,
@@ -182,21 +183,30 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
// 根据本地商品id获取线上商品是否存在,存在则只创建子商品
var tiktokResultProductId int64 = 0
// 获取本地存储映射关系
localThing, _ := dao.GetThingToTiktokMapList(dao.GetDB(), model.VendorIDDD, int64(storeSku.SkuID))
globals.SugarLogger.Debugf("=======storeSku.SkuID :%d", storeSku.SkuID)
globals.SugarLogger.Debugf("=======storeSku :%s", utils.Format4Output(storeSku, false))
localThing, err := dao.GetThingToTiktokMapList(dao.GetDB(), model.VendorIDDD, int64(storeSku.SkuID))
globals.SugarLogger.Debugf("=======localThing :%s", utils.Format4Output(localThing, false))
globals.SugarLogger.Debugf("=======localThing :%s", utils.Format4Output(localThing, false))
globals.SugarLogger.Debugf("localThing=======err :%s", err)
if len(localThing) == 0 { // 线上不存在创建
tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品
if err != nil {
globals.SugarLogger.Debugf("CreateStoreCommodity=======err :%s", err)
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
continue
}
globals.SugarLogger.Debugf("tiktokResult=======err :%s", utils.Format4Output(tiktokResult, false))
tiktokResultProductId = tiktokResult.ProductId
var attrId []string
for _, v := range tiktokResult.Sku {
attrId = append(attrId, utils.Int64ToStr(v.SkuId))
}
storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID
dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId)
err = dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId)
globals.SugarLogger.Debugf("err=============%s", err)
} else {
storeSku.VendorMainId = localThing[0].VendorThingID
storeSku.VendorSkuAttrId = localThing[0].Remark // 属性id skuID
@@ -236,6 +246,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResultProductId, storeSku)
param.StoreId = utils.Str2Int64(vendorStoreID)
globals.SugarLogger.Debugf("CreateStoreCommodity==========:%s", utils.Format4Output(param, false))
// 抖店创建子商品
tiktokResultChildren, err := api.CreateStoreCommodity(param)
if err != nil {
@@ -262,7 +273,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
Supply7dayReturn: 2,
Mobile: storeDetail.Tel1,
Commit: true,
Specs: "重|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit,
Specs: "重|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit,
NeedRechargeMode: false,
SellChannel: []int64{0},
StartSaleType: 0,
@@ -530,13 +541,9 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk
{InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)},
},
}
if mainSkuId == 0 {
sku.StockNum = 0
} else {
sku.StockNum = 0
sku.SkuType = 1
sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)}
}
sku.StockNum = localSku.Stock
sku.SkuType = 1
sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)}
skuSize = append(skuSize, sku)
}
case 2:
@@ -556,13 +563,9 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk
{InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)},
},
}
if mainSkuId == 0 {
sku.StockNum = 0
} else {
sku.StockNum = 0
sku.SkuType = 1
sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)}
}
sku.StockNum = localSku.Stock
sku.SkuType = 1
sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)}
skuSize = append(skuSize, sku)
}
}
@@ -586,13 +589,10 @@ func GetSpecPrices(specs, storeId string, mainSkuId int64, localSku *dao.StoreSk
{InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)},
},
}
if mainSkuId == 0 {
sku.StockNum = 0
} else {
sku.StockNum = 0
sku.SkuType = 1
sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)}
}
sku.StockNum = localSku.Stock
sku.StockNum = 0
sku.SkuType = 1
sku.StockNumMap = map[string]int64{storeId: int64(localSku.Stock)}
skuSize = append(skuSize, sku)
}
}