同步错误
This commit is contained in:
@@ -69,16 +69,12 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
|
||||
order := c.callbackMsg2Waybill(msg)
|
||||
switch msg.OrderStatus {
|
||||
case dadaapi.OrderStatusWaitingForAccept:
|
||||
if result, err := api.DadaAPI.QueryOrderInfo(msg.OrderID); err == nil {
|
||||
order.ActualFee = jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["actualFee"], 0.0))
|
||||
order.DesiredFee = jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["deliveryFee"], 0.0))
|
||||
if dadaOrder, err := api.DadaAPI.QueryOrderInfo2(msg.OrderID); err == nil {
|
||||
order.ActualFee = jxutils.StandardPrice2Int(dadaOrder.ActualFee)
|
||||
order.DesiredFee = jxutils.StandardPrice2Int(dadaOrder.DeliveryFee)
|
||||
}
|
||||
order.Status = model.WaybillStatusNew
|
||||
case dadaapi.OrderStatusAccepted:
|
||||
// if result, err := api.DadaAPI.QueryOrderInfo(msg.OrderID); err == nil {
|
||||
// order.ActualFee = jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["actualFee"], 0.0))
|
||||
// order.DesiredFee = jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["deliveryFee"], 0.0))
|
||||
// }
|
||||
order.Status = model.WaybillStatusAccepted
|
||||
case dadaapi.OrderStatusDelivering:
|
||||
order.Status = model.WaybillStatusDelivering
|
||||
@@ -204,10 +200,12 @@ func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
|
||||
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
|
||||
db := dao.GetDB()
|
||||
deliveryFeeInfo = &partner.WaybillFeeInfo{}
|
||||
billParams, addParams, err := c.getBillParams(db, order)
|
||||
// billParams, addParams, err := c.getBillParams(db, order)
|
||||
billParams, err := c.getBillParams2(db, order)
|
||||
if err == nil {
|
||||
var result *dadaapi.CreateOrderResponse
|
||||
if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil {
|
||||
// if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil {
|
||||
if result, err = api.DadaAPI.QueryDeliverFee2(billParams); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
deliveryFeeInfo.DeliveryFee = jxutils.StandardPrice2Int(result.Fee)
|
||||
@@ -216,9 +214,34 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
|
||||
return deliveryFeeInfo, err
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder) (billParams *dadaapi.OperateOrderRequiredParams, addParams map[string]interface{}, err error) {
|
||||
billParams = &dadaapi.OperateOrderRequiredParams{
|
||||
// ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的
|
||||
// func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder) (billParams *dadaapi.OperateOrderRequiredParams, addParams map[string]interface{}, err error) {
|
||||
// billParams = &dadaapi.OperateOrderRequiredParams{
|
||||
// // ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的
|
||||
// OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID),
|
||||
// CargoPrice: jxutils.IntPrice2Standard(limitOrderPrice(order.ActualPayPrice)),
|
||||
// IsPrepay: 0,
|
||||
// ReceiverName: utils.FilterMb4(order.ConsigneeName),
|
||||
// ReceiverAddress: utils.FilterMb4(order.ConsigneeAddress),
|
||||
// ReceiverPhone: order.ConsigneeMobile,
|
||||
// }
|
||||
// if billParams.ShopNo, err = c.getDadaShopID(order, db); err == nil {
|
||||
// if billParams.CityCode, err = c.getDataCityCodeFromOrder(order, db); err == nil {
|
||||
// billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
||||
// addParams = map[string]interface{}{
|
||||
// "info": fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4(order.BuyerComment)),
|
||||
// // "origin_mark": model.VendorNames[order.VendorID], // 订单来源标示(该字段可以显示在达达app订单详情页面,只支持字母,最大长度为10)
|
||||
// // "origin_mark_no": fmt.Sprintf("%d", order.OrderSeq), // 订单来源编号(该字段可以显示在达达app订单详情页面,支持字母和数字,最大长度为30)
|
||||
// "cargo_type": 13,
|
||||
// "cargo_weight": jxutils.IntWeight2Float(limitOrderWeight(order.Weight)),
|
||||
// "cargo_num": order.GoodsCount,
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return billParams, addParams, err
|
||||
// }
|
||||
|
||||
func (c *DeliveryHandler) getBillParams2(db *dao.DaoDB, order *model.GoodsOrder) (billParams *dadaapi.OperateOrderParams, err error) {
|
||||
billParams = &dadaapi.OperateOrderParams{
|
||||
OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID),
|
||||
CargoPrice: jxutils.IntPrice2Standard(limitOrderPrice(order.ActualPayPrice)),
|
||||
IsPrepay: 0,
|
||||
@@ -229,23 +252,20 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder)
|
||||
if billParams.ShopNo, err = c.getDadaShopID(order, db); err == nil {
|
||||
if billParams.CityCode, err = c.getDataCityCodeFromOrder(order, db); err == nil {
|
||||
billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
||||
addParams = map[string]interface{}{
|
||||
"info": fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4(order.BuyerComment)),
|
||||
// "origin_mark": model.VendorNames[order.VendorID], // 订单来源标示(该字段可以显示在达达app订单详情页面,只支持字母,最大长度为10)
|
||||
// "origin_mark_no": fmt.Sprintf("%d", order.OrderSeq), // 订单来源编号(该字段可以显示在达达app订单详情页面,支持字母和数字,最大长度为30)
|
||||
"cargo_type": 13,
|
||||
"cargo_weight": jxutils.IntWeight2Float(limitOrderWeight(order.Weight)),
|
||||
"cargo_num": order.GoodsCount,
|
||||
}
|
||||
billParams.Info = fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4(order.BuyerComment))
|
||||
billParams.CargoType = dadaapi.CargoTypeFresh
|
||||
billParams.CargoWeight = float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight)))
|
||||
billParams.CargoNum = order.GoodsCount
|
||||
}
|
||||
}
|
||||
return billParams, addParams, err
|
||||
return billParams, err
|
||||
}
|
||||
|
||||
// IDeliveryPlatformHandler
|
||||
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
||||
db := dao.GetDB()
|
||||
billParams, addParams, err := c.getBillParams(db, order)
|
||||
// billParams, addParams, err := c.getBillParams(db, order)
|
||||
billParams, err := c.getBillParams2(db, order)
|
||||
if err == nil {
|
||||
if globals.EnableStoreWrite {
|
||||
// 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单
|
||||
@@ -265,16 +285,19 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
|
||||
if err = delivery.CallCreateWaybillPolicy(waybillList[0].ActualFee, maxDeliveryFee, order, model.VendorIDDada); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result, err = api.DadaAPI.ReaddOrder(billParams, addParams)
|
||||
// result, err = api.DadaAPI.ReaddOrder(billParams, addParams)
|
||||
result, err = api.DadaAPI.ReaddOrder2(billParams)
|
||||
} else {
|
||||
// 第一次创建
|
||||
if err != nil {
|
||||
globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err)
|
||||
}
|
||||
if false {
|
||||
result, err = api.DadaAPI.AddOrder(billParams, addParams)
|
||||
// result, err = api.DadaAPI.AddOrder(billParams, addParams)
|
||||
result, err = api.DadaAPI.AddOrder2(billParams)
|
||||
} else {
|
||||
if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil {
|
||||
// if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil {
|
||||
if result, err = api.DadaAPI.QueryDeliverFee2(billParams); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = delivery.CallCreateWaybillPolicy(jxutils.StandardPrice2Int(result.Fee), maxDeliveryFee, order, model.VendorIDDada); err != nil {
|
||||
@@ -363,3 +386,34 @@ func limitOrderWeight(weight int) int {
|
||||
}
|
||||
return weight
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.DadaAPI.ComplaintRider(bill.VendorOrderID, resonID)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) GetWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (tipFee int64, err error) {
|
||||
order, err := api.DadaAPI.QueryOrderInfo2(vendorOrderID)
|
||||
if err == nil {
|
||||
tipFee = jxutils.StandardPrice2Int(order.Tips)
|
||||
}
|
||||
return tipFee, err
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) UpdateWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2, cityCode string, tipFee int64) (err error) {
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.DadaAPI.AddTip(vendorOrderID, jxutils.IntPrice2Standard(tipFee), cityCode, "")
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) GetRidderPosition(ctx *jxcontext.Context, vendorOrgCode, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (lng, lat float64, err error) {
|
||||
order, err := api.DadaAPI.QueryOrderInfo2(vendorOrderID)
|
||||
if err == nil {
|
||||
lng = utils.Str2Float64WithDefault(order.TransporterLng, 0)
|
||||
lat = utils.Str2Float64WithDefault(order.TransporterLat, 0)
|
||||
}
|
||||
return lng, lat, err
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"time"
|
||||
|
||||
_ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals/testinit"
|
||||
@@ -18,15 +19,14 @@ func TestCreateWaybill(t *testing.T) {
|
||||
orderID := "817540316000041"
|
||||
if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil {
|
||||
// globals.SugarLogger.Debug(order)
|
||||
c := new(DeliveryHandler)
|
||||
_, err = c.CreateWaybill(order, nil)
|
||||
_, err = CurDeliveryHandler.CreateWaybill(order, 0)
|
||||
if err == nil {
|
||||
time.Sleep(1 * time.Second)
|
||||
bill := &model.Waybill{
|
||||
VendorOrderID: orderID,
|
||||
WaybillVendorID: model.VendorIDDada,
|
||||
}
|
||||
err = c.CancelWaybill(bill, partner.CancelWaybillReasonOther, "")
|
||||
err = CurDeliveryHandler.CancelWaybill(bill, partner.CancelWaybillReasonOther, "")
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
@@ -37,3 +37,11 @@ func TestCreateWaybill(t *testing.T) {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetRidderPosition(t *testing.T) {
|
||||
lng, lat, err := CurDeliveryHandler.GetRidderPosition(jxcontext.AdminCtx, "", "80704840263399812", "", "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Logf("lng:%f, lat:%f", lng, lat)
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
@@ -173,14 +174,18 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
|
||||
item.GoodCount += goodItem.GoodCount
|
||||
}
|
||||
}
|
||||
addParams := map[string]interface{}{
|
||||
"note": utils.FilterMb4(order.BuyerComment),
|
||||
"goods_detail": string(utils.MustMarshal(goods)),
|
||||
"goods_pickup_info": fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
||||
"poi_seq": fmt.Sprintf("#%d", order.OrderSeq),
|
||||
}
|
||||
// addParams := map[string]interface{}{
|
||||
// "note": utils.FilterMb4(order.BuyerComment),
|
||||
// "goods_detail": string(utils.MustMarshal(goods)),
|
||||
// "goods_pickup_info": fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
||||
// "poi_seq": fmt.Sprintf("#%d", order.OrderSeq),
|
||||
// }
|
||||
billParams.Note = utils.FilterMb4(order.BuyerComment)
|
||||
billParams.GoodsDetail = string(utils.MustMarshal(goods))
|
||||
billParams.GoodsPickupInfo = fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq)
|
||||
billParams.PoiSeq = fmt.Sprintf("#%d", order.OrderSeq)
|
||||
if globals.EnableStoreWrite {
|
||||
result, err2 := api.MtpsAPI.CreateOrderByShop(billParams, addParams)
|
||||
result, err2 := api.MtpsAPI.CreateOrderByShop2(billParams)
|
||||
if err = err2; err == nil {
|
||||
bill = &model.Waybill{
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
@@ -192,7 +197,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
|
||||
}
|
||||
delivery.OnWaybillCreated(bill)
|
||||
} else {
|
||||
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err)
|
||||
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, billParams, err)
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("测试环境不能真正创建运单")
|
||||
@@ -246,3 +251,19 @@ func limitOrderWeight(weight int) int {
|
||||
}
|
||||
return weight
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
|
||||
if globals.EnableStoreWrite {
|
||||
err = api.MtpsAPI.EvaluateRider(utils.Str2Int64(bill.VendorWaybillID2), bill.VendorWaybillID, 1, resonContent)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *DeliveryHandler) GetRidderPosition(ctx *jxcontext.Context, vendorOrgCode, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (lng, lat float64, err error) {
|
||||
intLng, intLat, err := api.MtpsAPI.RiderLocation(utils.Str2Int64(vendorWaybillID2), vendorWaybillID)
|
||||
if err == nil {
|
||||
lng = jxutils.IntCoordinate2Standard(intLng)
|
||||
lat = jxutils.IntCoordinate2Standard(intLat)
|
||||
}
|
||||
return lng, lat, err
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ type IOrderManager interface {
|
||||
SaveOrderFinancialInfo(order *model.OrderFinancial, operation string) (err error)
|
||||
SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err error)
|
||||
|
||||
GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded bool) (bills []*model.Waybill, err error)
|
||||
GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded, isGetPos bool) (bills []*model.WaybillExt, err error)
|
||||
|
||||
// afs order
|
||||
OnAfsOrderAdjust(afsOrder *model.AfsOrder, orderStatus *model.OrderStatus) (err error)
|
||||
@@ -156,10 +156,10 @@ type IMultipleStoresHandler interface {
|
||||
IPurchasePlatformHandler
|
||||
GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*BareCategoryInfo, err error)
|
||||
|
||||
CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error)
|
||||
UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
|
||||
DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
|
||||
ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error)
|
||||
// CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error)
|
||||
// UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
|
||||
// DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
|
||||
// ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error)
|
||||
|
||||
CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error)
|
||||
UpdateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error)
|
||||
@@ -167,9 +167,9 @@ type IMultipleStoresHandler interface {
|
||||
ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error)
|
||||
|
||||
// sku
|
||||
CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
||||
UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
||||
DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
||||
// CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
||||
// UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
||||
// DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
||||
|
||||
// ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error)
|
||||
CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error)
|
||||
@@ -277,3 +277,23 @@ func IsMultiStore(vendorID int) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func GetRidderPositionGetter(vendorID int) (handler IRidderPositionGetter) {
|
||||
if handlerInfo := GetDeliveryPlatformFromVendorID(vendorID); handlerInfo != nil {
|
||||
if handler, _ = handlerInfo.Handler.(IRidderPositionGetter); handler != nil {
|
||||
return handler
|
||||
}
|
||||
}
|
||||
handler, _ = GetPurchasePlatformFromVendorID(vendorID).(IRidderPositionGetter)
|
||||
return handler
|
||||
}
|
||||
|
||||
func GetWaybillTipUpdater(vendorID int) (handler IAddWaybillTip) {
|
||||
if handlerInfo := GetDeliveryPlatformFromVendorID(vendorID); handlerInfo != nil {
|
||||
if handler, _ = handlerInfo.Handler.(IAddWaybillTip); handler != nil {
|
||||
return handler
|
||||
}
|
||||
}
|
||||
handler, _ = GetPurchasePlatformFromVendorID(vendorID).(IAddWaybillTip)
|
||||
return handler
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ type IDeliveryPlatformHandler interface {
|
||||
CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error)
|
||||
CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error)
|
||||
GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *WaybillFeeInfo, err error)
|
||||
//投诉骑手
|
||||
ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error)
|
||||
}
|
||||
|
||||
type IDeliveryUpdateStoreHandler interface {
|
||||
|
||||
@@ -13,6 +13,7 @@ type OrderPhoneNumberInfo struct {
|
||||
type IPurchasePlatformOrderHandler interface {
|
||||
Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder)
|
||||
GetOrder(vendorOrgCode, vendorOrderID string) (order *model.GoodsOrder, err error)
|
||||
GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error)
|
||||
GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *StatusActionParams)
|
||||
|
||||
AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error)
|
||||
@@ -57,6 +58,10 @@ type IPurchasePlatformOrderHandler interface {
|
||||
}
|
||||
|
||||
type IAddWaybillTip interface {
|
||||
GetWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder) (tipFee int64, err error)
|
||||
AddWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee2Add int64) (err error)
|
||||
GetWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (tipFee int64, err error)
|
||||
UpdateWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2, cityCode string, tipFee int64) (err error)
|
||||
}
|
||||
|
||||
type IRidderPositionGetter interface {
|
||||
GetRidderPosition(ctx *jxcontext.Context, vendorOrgCode, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (lng, lat float64, err error)
|
||||
}
|
||||
|
||||
51
business/partner/pay/pay.go
Normal file
51
business/partner/pay/pay.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package pay
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
)
|
||||
|
||||
type PayOpStatus int
|
||||
|
||||
const (
|
||||
OpStatusFailed PayOpStatus = 0
|
||||
OpStatusSuccessed PayOpStatus = 1
|
||||
)
|
||||
|
||||
type CreatePayParam struct {
|
||||
PayOrderID string
|
||||
VendorPayType string
|
||||
|
||||
VendorOrderID string
|
||||
ProductDesc string
|
||||
ProductDetail string
|
||||
FeeType string
|
||||
TotalFee int
|
||||
TimeStart time.Time
|
||||
TimeExpire time.Time
|
||||
|
||||
UserData string
|
||||
}
|
||||
|
||||
type PayOpResult struct {
|
||||
Status PayOpStatus
|
||||
VendorStatus string
|
||||
ErrMsg string
|
||||
|
||||
ID string
|
||||
VendorID string
|
||||
|
||||
OriginalData string
|
||||
}
|
||||
|
||||
type ResponseHandler interface {
|
||||
OnCreatePay(vendorID int, result *PayOpResult) (err error)
|
||||
OnRefundPay(vendorID int, result *PayOpResult) (err error)
|
||||
}
|
||||
|
||||
type IPayPlatformHandler interface {
|
||||
CreatePay(ctx *jxcontext.Context, param *CreatePayParam, isOffline bool) (prepayID, qrCodeURL string, err error)
|
||||
ClosePay(ctx *jxcontext.Context, payOrderID, vendorPayOrderID string) (err error)
|
||||
RefundPay(ctx *jxcontext.Context, payOrderID, vendorPayOrderID, refundID, reason string, totalFee, refundFee int) (vendorRefundID string, err error)
|
||||
}
|
||||
60
business/partner/pay/wxpay/callback.go
Normal file
60
business/partner/pay/wxpay/callback.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package wxpay
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/pay"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
func OnCallback(msg *wxpayapi.CallbackMsg) (err error) {
|
||||
globals.SugarLogger.Debugf("wxpay OnCallback msg:%s", utils.Format4Output(msg, true))
|
||||
switch msg.MsgType {
|
||||
case wxpayapi.MsgTypePay:
|
||||
err = onWxpayFinished(msg.Data.(*wxpayapi.PayResultMsg))
|
||||
case wxpayapi.MsgTypeRefund:
|
||||
err = onWxpayRefund(msg.Data.(*wxpayapi.RefundResultMsg))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func onWxpayFinished(msg *wxpayapi.PayResultMsg) (err error) {
|
||||
opResult := &pay.PayOpResult{
|
||||
OriginalData: string(utils.MustMarshal(msg)),
|
||||
}
|
||||
if msg.ReturnCode == wxpayapi.ResponseCodeSuccess {
|
||||
opResult.Status = pay.OpStatusSuccessed
|
||||
opResult.ID = msg.OutTradeNo
|
||||
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
|
||||
opResult.VendorID = msg.TransactionID
|
||||
} else {
|
||||
opResult.VendorStatus = msg.ErrCode
|
||||
opResult.ErrMsg = msg.ErrCodeDes
|
||||
}
|
||||
} else {
|
||||
opResult.Status = pay.OpStatusFailed
|
||||
}
|
||||
err = payHandler.responseHandler.OnCreatePay(model.VendorIDWXPay, opResult)
|
||||
return err
|
||||
}
|
||||
|
||||
func onWxpayRefund(msg *wxpayapi.RefundResultMsg) (err error) {
|
||||
opResult := &pay.PayOpResult{
|
||||
OriginalData: string(utils.MustMarshal(msg)),
|
||||
}
|
||||
if msg.ReturnCode == wxpayapi.ResponseCodeSuccess {
|
||||
opResult.Status = pay.OpStatusSuccessed
|
||||
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
|
||||
opResult.ID = msg.ReqInfoObj.OutRefundNo
|
||||
opResult.VendorID = msg.ReqInfoObj.RefundID
|
||||
} else {
|
||||
opResult.VendorStatus = msg.ErrCode
|
||||
opResult.ErrMsg = msg.ErrCodeDes
|
||||
}
|
||||
} else {
|
||||
opResult.Status = pay.OpStatusFailed
|
||||
}
|
||||
err = payHandler.responseHandler.OnRefundPay(model.VendorIDWXPay, opResult)
|
||||
return err
|
||||
}
|
||||
73
business/partner/pay/wxpay/wxpay.go
Normal file
73
business/partner/pay/wxpay/wxpay.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package wxpay
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/partner/pay"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
type PayHandler struct {
|
||||
responseHandler pay.ResponseHandler
|
||||
}
|
||||
|
||||
var (
|
||||
payHandler *PayHandler
|
||||
)
|
||||
|
||||
func New(responseHandler pay.ResponseHandler) (handler *PayHandler) {
|
||||
return &PayHandler{
|
||||
responseHandler: responseHandler,
|
||||
}
|
||||
}
|
||||
|
||||
func vendorPayType2WxpayType(vendorPayType string) string {
|
||||
return vendorPayType
|
||||
}
|
||||
|
||||
func (p *PayHandler) CreatePay(ctx *jxcontext.Context, createParam *pay.CreatePayParam, isOffline bool) (prepayID, qrCodeURL string, err error) {
|
||||
param := &wxpayapi.CreateOrderParam{
|
||||
OutTradeNo: createParam.PayOrderID,
|
||||
Body: createParam.ProductDesc,
|
||||
NotifyURL: globals.WxpayNotifyURL,
|
||||
SpbillCreateIP: ctx.GetRealRemoteIP(),
|
||||
TradeType: vendorPayType2WxpayType(createParam.VendorPayType),
|
||||
TotalFee: createParam.TotalFee,
|
||||
|
||||
TimeStart: wxpayapi.Time2PayTime(createParam.TimeStart),
|
||||
TimeExpire: wxpayapi.Time2PayTime(createParam.TimeExpire),
|
||||
}
|
||||
if isOffline {
|
||||
param.TradeType = wxpayapi.TradeTypeNative
|
||||
}
|
||||
if authInfo, err := ctx.GetV2AuthInfo(); err == nil && authInfo.GetAuthType() == weixin.AuthTypeMini {
|
||||
param.OpenID = authInfo.GetAuthID()
|
||||
}
|
||||
if result, err := api.WxpayAPI.CreateUnifiedOrder(param); err == nil {
|
||||
prepayID = result.PrepayID
|
||||
qrCodeURL = result.CodeURL
|
||||
}
|
||||
return prepayID, qrCodeURL, err
|
||||
}
|
||||
|
||||
func (p *PayHandler) ClosePay(ctx *jxcontext.Context, payOrderID, vendorPayOrderID string) (err error) {
|
||||
return api.WxpayAPI.CloseOrder(payOrderID)
|
||||
}
|
||||
|
||||
func (p *PayHandler) RefundPay(ctx *jxcontext.Context, payOrderID, vendorPayOrderID, refundID, reason string, totalFee, refundFee int) (vendorRefundID string, err error) {
|
||||
param := &wxpayapi.PayRefundParam{
|
||||
OutTradeNo: payOrderID,
|
||||
NotifyURL: globals.WxpayNotifyURL,
|
||||
OutRefundNo: refundID,
|
||||
TotalFee: totalFee,
|
||||
RefundFee: refundFee,
|
||||
RefundDesc: wxpayapi.CData(reason),
|
||||
}
|
||||
retVal, err := api.WxpayAPI.PayRefund(param)
|
||||
if err == nil {
|
||||
vendorRefundID = retVal.RefundID
|
||||
}
|
||||
return vendorRefundID, err
|
||||
}
|
||||
@@ -57,11 +57,11 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
<B>%s</B><BR>
|
||||
<BR>
|
||||
|
||||
<BOLD>实际支付:</BOLD>%s<BR>
|
||||
<BR>
|
||||
商品明细: <BR>
|
||||
品名 数量 单价 小计<BR>
|
||||
--------------------------------<BR>`
|
||||
// <BOLD>实际支付:</BOLD>%s<BR>
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -74,7 +74,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
order.BuyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
@@ -131,11 +131,11 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
<B>%s</B><BR>
|
||||
<BR>
|
||||
|
||||
<B><BOLD>实际支付:</BOLD></B><B>%s<BR></B>
|
||||
<BR>
|
||||
<B>商品明细: <BR></B>
|
||||
<B>品名数量单价小计<BR></B>
|
||||
--------------------------------<BR>`
|
||||
// <B><BOLD>实际支付:</BOLD></B><B>%s<BR></B>
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -148,7 +148,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
order.BuyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
|
||||
@@ -59,11 +59,11 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
*
|
||||
客户备注: *
|
||||
<big>%s*
|
||||
<S011>实际支付: %s*
|
||||
商品明细: *
|
||||
品名 数量 单价 小计
|
||||
--------------------------------*
|
||||
`
|
||||
// <S011>实际支付: %s*
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -76,7 +76,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
buyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `%s*`
|
||||
@@ -128,17 +128,17 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
<big>%s\#%d*
|
||||
<qrcA4>%s*
|
||||
` + getCode +
|
||||
`<big>客户: %s*
|
||||
`<big>客户: %s*
|
||||
<big>电话: %s*
|
||||
<big>地址: %s*
|
||||
*
|
||||
<big>客户备注: *
|
||||
<big>%s*
|
||||
<big>实际支付: %s*
|
||||
<big>商品明细: *
|
||||
<big>品名数量单价小计*
|
||||
--------------------------------*
|
||||
`
|
||||
// <big>实际支付: %s*
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -151,7 +151,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
buyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `<big>%s*`
|
||||
@@ -209,12 +209,12 @@ func (c *PrinterHandler) getOrderContent2(order *model.GoodsOrder, storeTel stri
|
||||
|5客户备注:
|
||||
|7%s
|
||||
|5
|
||||
|6实际支付: %s
|
||||
|5
|
||||
|5商品明细:
|
||||
|5品名 数量 单价 小计
|
||||
|5--------------------------------
|
||||
`
|
||||
// |6实际支付: %s
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -227,7 +227,7 @@ func (c *PrinterHandler) getOrderContent2(order *model.GoodsOrder, storeTel stri
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
buyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
for _, sku := range order.Skus {
|
||||
orderFmt += `|5%s`
|
||||
|
||||
@@ -55,11 +55,11 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
客户备注: \n
|
||||
<FS2>%s</FS2>\n
|
||||
\n
|
||||
<FB>实际支付:</FB>%s\n
|
||||
\n
|
||||
商品明细: \n
|
||||
品名 数量 单价 小计\n
|
||||
--------------------------------\n`
|
||||
// <FB>实际支付:</FB>%s\n
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -72,7 +72,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
order.BuyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
@@ -123,11 +123,11 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
<FS2>客户备注: \n</FS2>
|
||||
<FS2>%s</FS2>\n
|
||||
\n
|
||||
<FS2><FB>实际支付:</FB>%s\n</FS2>
|
||||
\n
|
||||
<FS2>商品明细: \n</FS2>
|
||||
<FS2>品名数量单价小计\n</FS2>
|
||||
--------------------------------\n`
|
||||
// <FS2><FB>实际支付:</FB>%s\n</FS2>
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -140,7 +140,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
order.BuyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
|
||||
@@ -56,11 +56,11 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
客户备注: <RN>
|
||||
<S2>%s</S2><RN>
|
||||
<RN>
|
||||
<B1>实际支付:</B1>%s<RN>
|
||||
<RN>
|
||||
商品明细: <RN>
|
||||
品名 数量 单价 小计<RN>
|
||||
********************************<RN>`
|
||||
// <B1>实际支付:</B1>%s<RN>
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -73,7 +73,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
order.BuyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
@@ -124,11 +124,11 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
<S2>客户备注: <RN></S2>
|
||||
<S2>%s</S2><RN>
|
||||
<RN>
|
||||
<S2><B1>实际支付:</B1>%s<RN></S2>
|
||||
<RN>
|
||||
<S2>商品明细: <RN></S2>
|
||||
<S2>品名数量单价小计<RN></S2>
|
||||
********************************<RN>`
|
||||
// <S2><B1>实际支付:</B1>%s<RN></S2>
|
||||
orderParams := []interface{}{
|
||||
globals.StoreName,
|
||||
utils.Time2Str(order.OrderCreatedAt),
|
||||
@@ -141,7 +141,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
||||
order.ConsigneeMobile,
|
||||
order.ConsigneeAddress,
|
||||
order.BuyerComment,
|
||||
jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||
}
|
||||
|
||||
for _, sku := range order.Skus {
|
||||
|
||||
@@ -5,9 +5,11 @@ import (
|
||||
"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"
|
||||
)
|
||||
|
||||
func OnCallbackMsg(msg *ebaiapi.CallbackMsg) (response *ebaiapi.CallbackResponse) {
|
||||
globals.SugarLogger.Debugf("ebai OnCallbackMsg msg:%s", utils.Format4Output(msg, true))
|
||||
if CurPurchaseHandler != nil {
|
||||
if orderID := GetOrderIDFromMsg(msg); orderID != "" {
|
||||
jxutils.CallMsgHandler(func() {
|
||||
|
||||
@@ -28,8 +28,6 @@ const (
|
||||
callDeliveryDelay = 10 * time.Minute
|
||||
callDeliveryDelayGap = 30
|
||||
|
||||
fakeUserApplyCancel = "fake_user_apply_cancel"
|
||||
fakeUserUndoApplyCancel = "fake_user_undo_apply_cancel"
|
||||
fakeAcceptOrder = "fake_accept_order"
|
||||
fakeOrderAdjustFinished = "fake_order_adjust_finished"
|
||||
fakeOrderCanceled = "fake_order_canceled"
|
||||
@@ -49,8 +47,6 @@ var (
|
||||
ebaiapi.OrderStatusCanceled: model.OrderStatusCanceled,
|
||||
|
||||
fakeOrderAdjustFinished: model.OrderStatusAdjust,
|
||||
fakeUserApplyCancel: model.OrderStatusApplyCancel,
|
||||
fakeUserUndoApplyCancel: model.OrderStatusUndoApplyCancel,
|
||||
fakeOrderCanceled: model.OrderStatusCanceled,
|
||||
}
|
||||
|
||||
@@ -83,6 +79,14 @@ func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *
|
||||
return order, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
status, err = api.EbaiAPI.OrderStatusGet(vendorOrderID)
|
||||
if err == nil {
|
||||
status = p.getStatusFromVendorStatus(utils.Int2Str(status))
|
||||
}
|
||||
return status, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) getOrder(vendorOrderID string) (order *model.GoodsOrder, orderMap map[string]interface{}, err error) {
|
||||
result, err := api.EbaiAPI.OrderGet(vendorOrderID)
|
||||
if err == nil {
|
||||
@@ -202,6 +206,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
||||
OrderCreatedAt: getTimeFromInterface(orderMap["create_time"]),
|
||||
OriginalData: string(utils.MustMarshal(result)),
|
||||
ActualPayPrice: utils.ForceInterface2Int64(orderMap["user_fee"]),
|
||||
BaseFreightMoney: utils.ForceInterface2Int64(orderMap["send_fee"]),
|
||||
TotalShopMoney: utils.ForceInterface2Int64(orderMap["shop_fee"]),
|
||||
DeliveryType: mapDeliveryType(int(utils.ForceInterface2Int64(orderMap["delivery_party"]))),
|
||||
|
||||
@@ -404,7 +409,7 @@ func (p *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName
|
||||
//
|
||||
func (c *PurchaseHandler) onOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi.CallbackResponse) {
|
||||
if c.isAfsMsg(msg) {
|
||||
retVal = c.OnAfsOrderMsg(msg)
|
||||
retVal = c.onAfsOrderMsg(msg)
|
||||
} else {
|
||||
status := c.callbackMsg2Status(msg)
|
||||
if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 {
|
||||
@@ -424,7 +429,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi.
|
||||
// 处理饿百降级订单的情况
|
||||
// 是否降级;1:是,0:否;极少数订单因网络或信息交互异常,导致订单部分字段(如订单金额)生成延迟,此时订单会被标记为“已降级”状态,需开发者重新调用查看订单详情接口获取完整订单数据。
|
||||
// toto sku是否也需要处理?
|
||||
if status.Status == model.OrderStatusFinished {
|
||||
if status.Status == model.OrderStatusDelivering || status.Status == model.OrderStatusFinished {
|
||||
if order, err2 := partner.CurOrderManager.LoadOrder(status.VendorOrderID, status.VendorID); err2 == nil {
|
||||
if order.TotalShopMoney == 0 {
|
||||
if order2, err2 := c.GetOrder(msg.Source, status.VendorOrderID); err2 == nil {
|
||||
@@ -478,11 +483,15 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta
|
||||
if cancelType == ebaiapi.OrderUserCancelTypeBeforeSale {
|
||||
if msgType == ebaiapi.OrderUserCancelApply ||
|
||||
msgType == ebaiapi.OrderUserCancelCSIntervene {
|
||||
orderStatus.VendorStatus = fakeUserApplyCancel
|
||||
} else if msgType == ebaiapi.OrderUserCancelInvalid ||
|
||||
msgType == ebaiapi.OrderUserCancelMerchantRefused ||
|
||||
msgType == ebaiapi.OrderUserCancelCSRefused {
|
||||
orderStatus.VendorStatus = fakeUserUndoApplyCancel
|
||||
orderStatus.Status = model.OrderStatusApplyCancel
|
||||
} else if msgType == ebaiapi.OrderUserCancelCSRefused ||
|
||||
msgType == ebaiapi.OrderUserCancelMerchantRefused {
|
||||
orderStatus.Status = model.OrderStatusVendorRejectCancel
|
||||
} else if msgType == ebaiapi.OrderUserCancelInvalid {
|
||||
orderStatus.Status = model.OrderStatusUndoApplyCancel
|
||||
} else if msgType == ebaiapi.OrderUserCancelCSAgreed ||
|
||||
msgType == ebaiapi.OrderUserCancelMerchantAgreed {
|
||||
orderStatus.Status = model.OrderStatusVendorAgreeCancel
|
||||
}
|
||||
}
|
||||
} else if msg.Cmd == ebaiapi.CmdOrderPartRefund {
|
||||
@@ -500,7 +509,9 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta
|
||||
}
|
||||
orderStatus.Remark = utils.Interface2String(msg.Body["reason"])
|
||||
}
|
||||
orderStatus.Status = c.getStatusFromVendorStatus(orderStatus.VendorStatus)
|
||||
if orderStatus.Status == 0 {
|
||||
orderStatus.Status = c.getStatusFromVendorStatus(orderStatus.VendorStatus)
|
||||
}
|
||||
return orderStatus
|
||||
}
|
||||
|
||||
@@ -649,3 +660,20 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode strin
|
||||
}
|
||||
return vendorOrderIDs, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (tipFee int64, err error) {
|
||||
orderInfo, err := api.EbaiAPI.GetStoreOrderInfo(vendorOrderID)
|
||||
if err == nil {
|
||||
if orderBasic, _ := orderInfo["order_basic"].(map[string]interface{}); orderBasic != nil {
|
||||
tipFee = jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(orderBasic["delivery_tip_amount"], 0))
|
||||
}
|
||||
}
|
||||
return tipFee, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2, cityCode string, tipFee int64) (err error) {
|
||||
if globals.EnableEbaiStoreWrite {
|
||||
err = api.EbaiAPI.ModifyTip4OrderWaybill(vendorOrderID, "", jxutils.IntPrice2Standard(tipFee), 0)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia
|
||||
afsOrder.Skus = append(afsOrder.Skus, orderSku)
|
||||
}
|
||||
} else if msg.Cmd == ebaiapi.CmdOrderUserCancel {
|
||||
if afsOrder := c.createAfsOrder(msg); afsOrder != nil {
|
||||
if afsOrder = c.createAfsOrder(msg); afsOrder != nil {
|
||||
// if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(orderStatus.RefVendorOrderID, model.VendorIDEBAI); err2 == nil {
|
||||
// afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg)
|
||||
cancelData := msg.Data.(*ebaiapi.CBUserCancelInfo)
|
||||
|
||||
@@ -30,9 +30,10 @@ type tEbaiStoreInfo struct {
|
||||
EbaiStoreStatus int
|
||||
SyncStatus int
|
||||
|
||||
ProvinceID int `orm:"column(province_id)"`
|
||||
CityID int `orm:"column(city_id)"`
|
||||
DistrictID int `orm:"column(district_id)"`
|
||||
ProvinceID int `orm:"column(province_id)"`
|
||||
CityID int `orm:"column(city_id)"`
|
||||
DistrictID int `orm:"column(district_id)"`
|
||||
VendorStoreName string
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error) {
|
||||
@@ -156,7 +157,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
SELECT
|
||||
t1.*,
|
||||
t2.status ebai_store_status, t2.vendor_store_id, t2.vendor_org_code,
|
||||
IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator, t2.sync_status
|
||||
IF(t1.updated_at > t2.updated_at, t1.last_operator, t2.last_operator) real_last_operator, t2.sync_status, t2.vendor_store_name
|
||||
FROM store t1
|
||||
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND (t2.deleted_at = ?)
|
||||
WHERE t1.id = ?
|
||||
@@ -193,6 +194,9 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
}
|
||||
params := genStoreMapFromStore(store)
|
||||
if err = api.EbaiAPI.ShopUpdate(params); err == nil {
|
||||
if store.PromoteInfo != "" {
|
||||
err = api.EbaiAPI.ShopAnnouncementSet("", utils.Str2Int64(store.VendorStoreID), store.PromoteInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -389,8 +393,12 @@ func genStoreMapFromStore(store *tEbaiStoreInfo) map[string]interface{} {
|
||||
if store.VendorStoreID != "" {
|
||||
params["baidu_shop_id"] = store.VendorStoreID
|
||||
}
|
||||
if store.SyncStatus&(model.SyncFlagNewMask /*|model.SyncFlagStoreName*/) != 0 {
|
||||
params["name"] = jxutils.ComposeStoreName(store.Name, model.VendorIDEBAI)
|
||||
if store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
|
||||
if store.VendorStoreName != "" {
|
||||
params["name"] = store.VendorStoreName
|
||||
} else {
|
||||
params["name"] = jxutils.ComposeStoreName(store.Name, model.VendorIDEBAI)
|
||||
}
|
||||
}
|
||||
params["address"] = store.Address
|
||||
// todo 饿百 开店审核通过后不允许修改商户信息
|
||||
|
||||
@@ -113,7 +113,7 @@ func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) {
|
||||
return ebaiapi.IsErrSkuNotExist(err)
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
func (p *PurchaseHandler) updateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isNeedMapCat bool) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
storeSku := storeSkuList[0]
|
||||
strStoreID := utils.Int2Str(storeID)
|
||||
params := genSkuParamsFromStoreSkuInfo2(storeSku, false)
|
||||
@@ -122,13 +122,19 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
if err != nil {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorIDEBAI, "更新商品基础信息")
|
||||
}
|
||||
utils.CallFuncAsync(func() {
|
||||
api.EbaiAPI.SkuShopCategoryMap(strStoreID, utils.Str2Int64(storeSku.VendorSkuID), "", utils.Str2Int64(storeSku.VendorCatID), genSkuCatRank(storeSku))
|
||||
})
|
||||
if isNeedMapCat {
|
||||
utils.CallFuncAsync(func() {
|
||||
api.EbaiAPI.SkuShopCategoryMap(strStoreID, utils.Str2Int64(storeSku.VendorSkuID), "", utils.Str2Int64(storeSku.VendorCatID), genSkuCatRank(storeSku))
|
||||
})
|
||||
}
|
||||
}
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
return p.updateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, true)
|
||||
}
|
||||
|
||||
// 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义
|
||||
func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
storeSku := storeSkuList[0]
|
||||
@@ -139,6 +145,9 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
if vendorSkuID, err = api.EbaiAPI.SkuCreate(ctx.GetTrackInfo(), strStoreID, storeSku.SkuID, params); err == nil {
|
||||
utils.AfterFuncWithRecover(5*time.Second, func() {
|
||||
api.EbaiAPI.SkuShopCategoryMap(strStoreID, vendorSkuID, "", utils.Str2Int64(storeSku.VendorCatID), genSkuCatRank(storeSku))
|
||||
// 饿百平台有BUG,会导致新建一个之前删除的商品时,信息不会及时更新,强制刷新一下
|
||||
// 比如门店:100887, skuID:33805,订单:1577176719141226065
|
||||
p.updateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, false)
|
||||
})
|
||||
} else {
|
||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorIDEBAI, "创建商品")
|
||||
@@ -321,7 +330,7 @@ func jxCatSeq2Ebai(seq int) int {
|
||||
}
|
||||
|
||||
func formatCatName(name string) string {
|
||||
return name
|
||||
return utils.LimitUTF8StringLen(name, ebaiapi.MaxCategoryNameLen)
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) {
|
||||
|
||||
@@ -120,7 +120,7 @@ func (c *PurchaseHandler) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancel
|
||||
default:
|
||||
status.Status = model.OrderStatusUnknown
|
||||
}
|
||||
return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged(status), status.VendorStatus)
|
||||
return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged("", status), status.VendorStatus)
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetOrder(vendorOrgCode, orderID string) (order *model.GoodsOrder, err error) {
|
||||
@@ -223,7 +223,7 @@ func (c *PurchaseHandler) onOrderUserUrgeOrder(msg *elmapi.CallbackOrderUrgeMsg)
|
||||
StatusTime: utils.Timestamp2Time(msg.UpdateTime),
|
||||
}
|
||||
c.ClientUrgeOrder(msg.OrderID)
|
||||
return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged(status), status.VendorStatus)
|
||||
return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged("", status), status.VendorStatus)
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) stateAndType2Str(state string, msgType int) string {
|
||||
|
||||
@@ -325,7 +325,7 @@ func (c *PurchaseHandler) onActMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.C
|
||||
if _, ok := actMap.Load(intPromotionID); !ok {
|
||||
utils.CallFuncAsync(func() {
|
||||
if !partner.CurActManager.IsVendorActExist(jxcontext.AdminCtx, promotionID, model.VendorIDJD) {
|
||||
act, actStoreSkuList, err := getActFromJD(appKey2OrgCode(msg.AppKey), promotionID)
|
||||
act, actStoreSkuList, err := getActFromJD(AppKey2OrgCode(msg.AppKey), promotionID)
|
||||
if err == nil && len(actStoreSkuList) > 0 {
|
||||
_, err = partner.CurActManager.CreateActFromVendor(jxcontext.AdminCtx, act, actStoreSkuList)
|
||||
}
|
||||
|
||||
@@ -6,21 +6,21 @@ import (
|
||||
|
||||
func OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) {
|
||||
if CurPurchaseHandler != nil {
|
||||
retVal = CurPurchaseHandler.OnOrderMsg(appKey2OrgCode(msg.AppKey), msg)
|
||||
retVal = CurPurchaseHandler.OnOrderMsg(AppKey2OrgCode(msg.AppKey), msg)
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
|
||||
func OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) {
|
||||
if CurPurchaseHandler != nil {
|
||||
retVal = CurPurchaseHandler.OnWaybillMsg(appKey2OrgCode(msg.AppKey), msg)
|
||||
retVal = CurPurchaseHandler.OnWaybillMsg(AppKey2OrgCode(msg.AppKey), msg)
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
|
||||
func OnStoreMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) {
|
||||
if CurPurchaseHandler != nil {
|
||||
retVal = CurPurchaseHandler.OnStoreMsg(appKey2OrgCode(msg.AppKey), msg)
|
||||
retVal = CurPurchaseHandler.OnStoreMsg(AppKey2OrgCode(msg.AppKey), msg)
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ func (p *PurchaseHandler) OnFinancialMsg(msg *jdapi.CallbackOrderMsg) (retVal *j
|
||||
// 京东正向/退款订单类型处理--存储
|
||||
func (p *PurchaseHandler) onFinancialMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) {
|
||||
var err error
|
||||
a := GetAPIByAppKey(msg.AppKey)
|
||||
a := getAPI(AppKey2OrgCode(msg.AppKey))
|
||||
// if msg.StatusID == jdapi.OrderStatusPayFinishedSettle || msg.StatusID == jdapi.OrderStatusTipChanged || msg.StatusID == jdapi.OrderStatusSwitch2SelfSettle { // 如果是正向单
|
||||
if msg.StatusID == jdapi.OrderStatusPayFinishedSettle || msg.StatusID == jdapi.OrderStatusTipChanged || msg.StatusID == jdapi.OrderStatusAdjustSettle || msg.StatusID == jdapi.OrderStatusSwitch2SelfSettle { // 如果是正向单
|
||||
order, err2 := partner.CurOrderManager.LoadOrder(msg.BillID, model.VendorIDJD)
|
||||
|
||||
@@ -23,6 +23,9 @@ func init() {
|
||||
}
|
||||
|
||||
func getAPI(appOrgCode string) (apiObj *jdapi.API) {
|
||||
if appOrgCode == "" {
|
||||
globals.SugarLogger.Warnf("getAPI appOrgCode is empty")
|
||||
}
|
||||
return partner.CurAPIManager.GetAPI(model.VendorIDJD, appOrgCode).(*jdapi.API)
|
||||
}
|
||||
|
||||
@@ -30,7 +33,7 @@ func GetAPI(appOrgCode string) (apiObj *jdapi.API) {
|
||||
return getAPI(appOrgCode)
|
||||
}
|
||||
|
||||
func appKey2OrgCode(appKey string) (vendorOrgCode string) {
|
||||
func AppKey2OrgCode(appKey string) (vendorOrgCode string) {
|
||||
apiList := partner.CurAPIManager.GetAppOrgCodeList(model.VendorIDJD)
|
||||
for _, v := range apiList {
|
||||
jdAPI := partner.CurAPIManager.GetAPI(model.VendorIDJD, v).(*jdapi.API)
|
||||
@@ -39,23 +42,10 @@ func appKey2OrgCode(appKey string) (vendorOrgCode string) {
|
||||
break
|
||||
}
|
||||
}
|
||||
return vendorOrgCode
|
||||
}
|
||||
|
||||
func GetAPIByAppKey(appKey string) (apiObj *jdapi.API) {
|
||||
if appKey == "" {
|
||||
apiObj = getAPI("")
|
||||
} else {
|
||||
apiList := partner.CurAPIManager.GetAppOrgCodeList(model.VendorIDJD)
|
||||
for _, v := range apiList {
|
||||
jdAPI := partner.CurAPIManager.GetAPI(model.VendorIDJD, v).(*jdapi.API)
|
||||
if jdAPI.GetAppKey() == appKey {
|
||||
apiObj = jdAPI
|
||||
break
|
||||
}
|
||||
}
|
||||
if vendorOrgCode == "" {
|
||||
globals.SugarLogger.Warnf("AppKey2OrgCode appKey:%s get empty vendorOrgCode", appKey)
|
||||
}
|
||||
return apiObj
|
||||
return vendorOrgCode
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetVendorID() int {
|
||||
|
||||
@@ -27,13 +27,17 @@ var (
|
||||
jdapi.OrderStatusFinishedPickup: model.OrderStatusFinishedPickup,
|
||||
jdapi.OrderStatusDelivering: model.OrderStatusDelivering,
|
||||
jdapi.OrderStatusDelivered: model.OrderStatusFinished,
|
||||
// jdapi.OrderStatusFinished: model.OrderStatusFinished, // todo 这个状态不是真正都完成的意思
|
||||
jdapi.OrderStatusCanceled: model.OrderStatusCanceled,
|
||||
jdapi.OrderStatusFinished: model.OrderStatusFinished, // todo 这个状态不是真正都完成的意思?
|
||||
jdapi.OrderStatusCanceled: model.OrderStatusCanceled,
|
||||
|
||||
jdapi.OrderStatusAdjust: model.OrderStatusAdjust,
|
||||
jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel,
|
||||
jdapi.OrderStatusLocked: model.OrderStatusLocked,
|
||||
jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked,
|
||||
|
||||
jdapi.OrderStatusVenderAgreeCancel: model.OrderStatusVendorAgreeCancel,
|
||||
jdapi.OrderStatusVenderRejectCancel: model.OrderStatusVendorRejectCancel,
|
||||
jdapi.CallbackMsgOrderAddTips: model.OrderStatusWaybillTipChanged,
|
||||
}
|
||||
deliveryTypeMap = map[int]string{
|
||||
jdapi.CarrierNoCrowdSourcing: model.OrderDeliveryTypePlatform,
|
||||
@@ -93,9 +97,6 @@ func (c *PurchaseHandler) onOrderMsg(vendorOrgCode string, msg *jdapi.CallbackOr
|
||||
})
|
||||
}
|
||||
err := partner.CurOrderManager.OnOrderStatusChanged(vendorOrgCode, status)
|
||||
// if globals.HandleLegacyJxOrder && err == nil {
|
||||
// c.legacyJdOrderStatusChanged(status)
|
||||
// }
|
||||
retVal = jdapi.Err2CallbackResponse(err, status.VendorStatus)
|
||||
}
|
||||
}
|
||||
@@ -147,6 +148,14 @@ func (c *PurchaseHandler) GetOrder(vendorOrgCode, orderID string) (order *model.
|
||||
return order, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
order, err := getAPI(vendorOrgCode).QuerySingleOrder2(vendorOrderID)
|
||||
if err == nil {
|
||||
status = p.getStatusFromVendorStatus(utils.Int2Str(order.OrderStatus))
|
||||
}
|
||||
return status, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
||||
result := orderData
|
||||
orderID := utils.Int64ToStr(utils.MustInterface2Int64(result["orderId"]))
|
||||
@@ -177,6 +186,7 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
||||
OrderCreatedAt: utils.Str2Time(result[statusTimeField].(string)),
|
||||
OriginalData: string(utils.MustMarshal(result)),
|
||||
ActualPayPrice: utils.MustInterface2Int64(result["orderBuyerPayableMoney"]),
|
||||
BaseFreightMoney: utils.Interface2Int64WithDefault(result["orderBaseFreightMoney"], 0),
|
||||
DistanceFreightMoney: utils.Interface2Int64WithDefault(result["merchantPaymentDistanceFreightMoney"], 0),
|
||||
DeliveryType: deliveryTypeMap[int(utils.Str2Int64WithDefault(utils.Interface2String(result["deliveryCarrierNo"]), 0))],
|
||||
VendorOrgCode: utils.Interface2String(result["orgCode"]),
|
||||
@@ -277,19 +287,24 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model
|
||||
RefVendorOrderID: msg.BillID,
|
||||
RefVendorID: model.VendorIDJD,
|
||||
VendorStatus: msg.StatusID,
|
||||
Status: c.getStatusFromVendorStatus(msg.StatusID),
|
||||
StatusTime: utils.Str2Time(msg.Timestamp),
|
||||
Remark: msg.Remark,
|
||||
}
|
||||
if msg.MsgURL == jdapi.CallbackMsgOrderAddTips {
|
||||
orderStatus.VendorStatus = jdapi.CallbackMsgOrderAddTips
|
||||
}
|
||||
orderStatus.Status = c.getStatusFromVendorStatus(orderStatus.VendorStatus)
|
||||
return orderStatus
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) postFakeMsg(vendorOrderID, vendorStatus string) {
|
||||
func (c *PurchaseHandler) postFakeMsg(vendorOrgCode, vendorOrderID, vendorStatus string) {
|
||||
msg := &jdapi.CallbackOrderMsg{
|
||||
CallbackMsg: &jdapi.CallbackMsg{},
|
||||
BillID: vendorOrderID,
|
||||
StatusID: vendorStatus,
|
||||
Timestamp: utils.Time2Str(time.Now()),
|
||||
CallbackMsg: &jdapi.CallbackMsg{
|
||||
AppKey: getAPI(vendorOrgCode).GetAppKey(),
|
||||
},
|
||||
BillID: vendorOrderID,
|
||||
StatusID: vendorStatus,
|
||||
Timestamp: utils.Time2Str(time.Now()),
|
||||
}
|
||||
utils.CallFuncAsync(func() {
|
||||
OnOrderMsg(msg)
|
||||
@@ -309,14 +324,14 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI(order.VendorOrgCode).OrderAcceptOperate(order.VendorOrderID, isAcceptIt, userName)
|
||||
if isAcceptIt && err == nil {
|
||||
c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore)
|
||||
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.StatusIDWaitOutStore)
|
||||
}
|
||||
} else {
|
||||
if isAcceptIt {
|
||||
c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore)
|
||||
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.StatusIDWaitOutStore)
|
||||
} else {
|
||||
|
||||
c.postFakeMsg(order.VendorOrderID, jdapi.OrderStatusCanceled)
|
||||
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.OrderStatusCanceled)
|
||||
}
|
||||
}
|
||||
return err
|
||||
@@ -327,7 +342,7 @@ func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bo
|
||||
if !isSelfDelivery && globals.EnableJdStoreWrite {
|
||||
_, err = getAPI(order.VendorOrgCode).OrderJDZBDelivery(order.VendorOrderID, userName)
|
||||
} else {
|
||||
c.postFakeMsg(order.VendorOrderID, jdapi.OrderStatusFinishedPickup)
|
||||
c.postFakeMsg(order.VendorOrgCode, order.VendorOrderID, jdapi.OrderStatusFinishedPickup)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -426,11 +441,18 @@ func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.Goods
|
||||
func (c *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) {
|
||||
order = jxutils.RemoveSkuFromOrder(order, removedSkuList)
|
||||
var oaosAdjustDTOList []*jdapi.OAOSAdjustDTO
|
||||
dtoMap := make(map[int]*jdapi.OAOSAdjustDTO)
|
||||
for _, sku := range order.Skus {
|
||||
oaosAdjustDTOList = append(oaosAdjustDTOList, &jdapi.OAOSAdjustDTO{
|
||||
OutSkuID: utils.Int2Str(jxutils.GetSkuIDFromOrderSku(sku)),
|
||||
SkuCount: sku.Count,
|
||||
})
|
||||
skuID := jxutils.GetSkuIDFromOrderSku(sku)
|
||||
if dtoMap[skuID] == nil {
|
||||
dtoMap[skuID] = &jdapi.OAOSAdjustDTO{
|
||||
OutSkuID: utils.Int2Str(skuID),
|
||||
SkuCount: sku.Count,
|
||||
}
|
||||
oaosAdjustDTOList = append(oaosAdjustDTOList, dtoMap[skuID])
|
||||
} else {
|
||||
dtoMap[skuID].SkuCount += sku.Count
|
||||
}
|
||||
}
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI(order.VendorOrgCode).AdjustOrder(order.VendorOrderID, ctx.GetUserName(), reason, oaosAdjustDTOList)
|
||||
@@ -462,31 +484,22 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode strin
|
||||
return vendorOrderIDs, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee int64) (err error) {
|
||||
a := getAPI(order.VendorOrgCode)
|
||||
orderInfo, err := a.QuerySingleOrder2(order.VendorOrderID)
|
||||
if err == nil {
|
||||
tip2Add := int(tipFee) - orderInfo.Tips
|
||||
if tip2Add != 0 {
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = a.OrderAddTips(order.VendorOrderID, tip2Add, ctx.GetUserName())
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder) (tipFee int64, err error) {
|
||||
orderInfo, err := getAPI(order.VendorOrgCode).QuerySingleOrder2(order.VendorOrderID)
|
||||
func (c *PurchaseHandler) GetWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (tipFee int64, err error) {
|
||||
orderInfo, err := getAPI(vendorOrgCode).QuerySingleOrder2(vendorOrderID)
|
||||
if err == nil {
|
||||
tipFee = int64(orderInfo.Tips)
|
||||
}
|
||||
return tipFee, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) AddWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee2Add int64) (err error) {
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI(order.VendorOrgCode).OrderAddTips(order.VendorOrderID, int(tipFee2Add), ctx.GetUserName())
|
||||
func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2, cityCode string, tipFee int64) (err error) {
|
||||
curTipFee, err := c.GetWaybillTip(ctx, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2)
|
||||
if err == nil {
|
||||
if tipFee2Add := tipFee - curTipFee; tipFee2Add > 0 {
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI(vendorOrgCode).OrderAddTips(vendorOrderID, int(tipFee2Add), ctx.GetUserName())
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -32,6 +32,14 @@ func TestGetOrder(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetOrderStatus(t *testing.T) {
|
||||
status, err := CurPurchaseHandler.GetOrderStatus("", "929203144000041")
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
t.Log(status)
|
||||
}
|
||||
|
||||
func TestListOrders(t *testing.T) {
|
||||
result, err := CurPurchaseHandler.ListOrders(jxcontext.AdminCtx, "", nil, time.Now(), "")
|
||||
if err != nil {
|
||||
|
||||
@@ -2,491 +2,479 @@ package jd
|
||||
|
||||
// 这里函数取得的信息,除了与自身实体相关的ID(比如PARENT ID),都已经转换成了本地ID了
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"unicode/utf8"
|
||||
// type tSkuInfoExt struct {
|
||||
// model.SkuName
|
||||
// JdCatID int64 `orm:"column(jd_cat_id)"` // 商家类别
|
||||
// JdCategoryID int `orm:"column(jd_category_id)"` // 到家类别
|
||||
// SkuCatID int64 `orm:"column(sku_cat_id)"` // 商家特殊类别
|
||||
// Comment string `orm:"size(255)" json:"comment"`
|
||||
// }
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
||||
"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/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
// var (
|
||||
// skuAddParamsKeyMap = map[string]int{
|
||||
// jdapi.KeyUpcCode: 1,
|
||||
// }
|
||||
// )
|
||||
|
||||
type tSkuInfoExt struct {
|
||||
model.SkuName
|
||||
JdCatID int64 `orm:"column(jd_cat_id)"` // 商家类别
|
||||
JdCategoryID int `orm:"column(jd_category_id)"` // 到家类别
|
||||
SkuCatID int64 `orm:"column(sku_cat_id)"` // 商家特殊类别
|
||||
Comment string `orm:"size(255)" json:"comment"`
|
||||
}
|
||||
// func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
|
||||
// var jdPid int64
|
||||
// if cat.ParentID != 0 {
|
||||
// pCat := &model.SkuCategory{}
|
||||
// pCat.ID = cat.ParentID
|
||||
// if err = dao.GetEntity(db, pCat); err == nil {
|
||||
// jdPid = pCat.JdID
|
||||
// } else {
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// result, err2 := getAPI("").AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName)
|
||||
// if err = err2; err == nil {
|
||||
// if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
|
||||
// cat.JdID = jdID
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// cat.JdID = jxutils.GenFakeID()
|
||||
// }
|
||||
// return err
|
||||
// }
|
||||
|
||||
var (
|
||||
skuAddParamsKeyMap = map[string]int{
|
||||
jdapi.KeyUpcCode: 1,
|
||||
}
|
||||
)
|
||||
// func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// return getAPI("").UpdateShopCategory(cat.JdID, cat.Name)
|
||||
// }
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
|
||||
var jdPid int64
|
||||
if cat.ParentID != 0 {
|
||||
pCat := &model.SkuCategory{}
|
||||
pCat.ID = cat.ParentID
|
||||
if err = dao.GetEntity(db, pCat); err == nil {
|
||||
jdPid = pCat.JdID
|
||||
} else {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if globals.EnableJdStoreWrite {
|
||||
result, err2 := getAPI("").AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName)
|
||||
if err = err2; err == nil {
|
||||
if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
|
||||
cat.JdID = jdID
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cat.JdID = jxutils.GenFakeID()
|
||||
}
|
||||
return err
|
||||
}
|
||||
// func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// return getAPI("").DelShopCategory(cat.JdID)
|
||||
// }
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
if globals.EnableJdStoreWrite {
|
||||
return getAPI("").UpdateShopCategory(cat.JdID, cat.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
|
||||
// var parentJDID int64
|
||||
// if parentCatID != 0 {
|
||||
// cat := &model.SkuCategory{}
|
||||
// cat.ID = parentCatID
|
||||
// if err = dao.GetEntity(db, cat); err != nil {
|
||||
// return err
|
||||
// }
|
||||
// parentJDID = cat.JdID
|
||||
// }
|
||||
// var cats []*model.SkuCategory
|
||||
// if err = dao.GetRows(db, &cats, `
|
||||
// SELECT *
|
||||
// FROM sku_category
|
||||
// WHERE parent_id = ? AND deleted_at = ?
|
||||
// ORDER BY seq`, parentCatID, utils.DefaultTimeValue); err == nil {
|
||||
// jdCatIDs := make([]int64, len(cats))
|
||||
// for k, v := range cats {
|
||||
// jdCatIDs[k] = v.JdID
|
||||
// }
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// err = getAPI("").ChangeShopCategoryOrder(parentJDID, jdCatIDs)
|
||||
// }
|
||||
// }
|
||||
// return err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
if globals.EnableJdStoreWrite {
|
||||
return getAPI("").DelShopCategory(cat.JdID)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
|
||||
var parentJDID int64
|
||||
if parentCatID != 0 {
|
||||
cat := &model.SkuCategory{}
|
||||
cat.ID = parentCatID
|
||||
if err = dao.GetEntity(db, cat); err != nil {
|
||||
return err
|
||||
}
|
||||
parentJDID = cat.JdID
|
||||
}
|
||||
var cats []*model.SkuCategory
|
||||
if err = dao.GetRows(db, &cats, `
|
||||
SELECT *
|
||||
FROM sku_category
|
||||
WHERE parent_id = ? AND deleted_at = ?
|
||||
ORDER BY seq`, parentCatID, utils.DefaultTimeValue); err == nil {
|
||||
jdCatIDs := make([]int64, len(cats))
|
||||
for k, v := range cats {
|
||||
jdCatIDs[k] = v.JdID
|
||||
}
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI("").ChangeShopCategoryOrder(parentJDID, jdCatIDs)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) {
|
||||
var skuInfoExt tSkuInfoExt
|
||||
err = dao.GetRow(nil, &skuInfoExt, `
|
||||
SELECT
|
||||
t2.*, IF(t2.jd_category_id > 0, t2.jd_category_id, t3.jd_category_id) jd_category_id,
|
||||
t3.jd_id jd_cat_id,
|
||||
t4.jd_id sku_cat_id
|
||||
FROM sku t1
|
||||
JOIN sku_name t2 ON t1.name_id = t2.id
|
||||
JOIN sku_category t3 ON t2.category_id = t3.id
|
||||
LEFT JOIN sku_category t4 ON t1.category_id = t4.id
|
||||
WHERE t1.id = ?
|
||||
`, sku.ID)
|
||||
if err == nil {
|
||||
shopCategories := []int64{skuInfoExt.JdCatID}
|
||||
// SPU只支持SPU的商家分类,不支持单独SKU的,去除SKU的分类
|
||||
// if skuInfoExt.SkuCatID != 0 {
|
||||
// shopCategories = append(shopCategories, skuInfoExt.SkuCatID)
|
||||
// }
|
||||
if skuInfoExt.JdCategoryID == 0 {
|
||||
skuInfoExt.JdCategoryID = getDefJdCategoryID()
|
||||
}
|
||||
if skuInfoExt.BrandID == 0 {
|
||||
skuInfoExt.BrandID = DefBrandID
|
||||
}
|
||||
addParams := map[string]interface{}{}
|
||||
|
||||
if skuInfoExt.IsGlobal == 0 { //如果不是全国可售,要查可售区域
|
||||
sellPlaces, err2 := dao.GetSellCities(db, skuInfoExt.ID, model.VendorIDJD)
|
||||
if err = err2; err == nil && len(sellPlaces) > 0 {
|
||||
sellCites := make([]int, len(sellPlaces))
|
||||
for k, v := range sellPlaces {
|
||||
sellCites[k] = v.JdCode
|
||||
}
|
||||
addParams["sellCities"] = sellCites
|
||||
}
|
||||
}
|
||||
if addParams["sellCities"] == nil {
|
||||
addParams["sellCities"] = []int{0}
|
||||
}
|
||||
if skuInfoExt.DescImg != "" {
|
||||
addParams[jdapi.KeyProductDesc] = fmt.Sprintf(`<img src="%s" alt="一张图片" />`, skuInfoExt.DescImg)
|
||||
addParams[jdapi.KeyIfViewDesc] = 0
|
||||
} else {
|
||||
addParams[jdapi.KeyIfViewDesc] = 1
|
||||
}
|
||||
if err == nil {
|
||||
skuName := jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
|
||||
skuPrice := jxutils.CaculateSkuPrice(skuInfoExt.Price, sku.SpecQuality, sku.SpecUnit, skuInfoExt.Unit)
|
||||
if skuInfoExt.Upc != "" {
|
||||
addParams[jdapi.KeyUpcCode] = skuInfoExt.Upc
|
||||
}
|
||||
result, err2 := handler(&skuInfoExt, skuPrice, skuName, shopCategories, addParams)
|
||||
if err = err2; err == nil {
|
||||
if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
|
||||
sku.JdID = jdID
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
|
||||
if skuExt.IsSpu == 0 {
|
||||
if globals.EnableJdStoreWrite {
|
||||
vendorSkuID, err = getAPI("").AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2), jxStatus2jdStatus(sku.Status), true, addParams)
|
||||
if err != nil {
|
||||
if jdSkuID := jdapi.GetJdSkuIDFromError(err); jdSkuID > 0 {
|
||||
vendorSkuID = utils.Int64ToStr(jdSkuID)
|
||||
err = nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
vendorSkuID = utils.Int64ToStr(jxutils.GenFakeID())
|
||||
}
|
||||
} else {
|
||||
vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
|
||||
}
|
||||
return vendorSkuID, err
|
||||
})
|
||||
}
|
||||
|
||||
// func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) {
|
||||
// jdSkuID := utils.Str2Int64(vendorSkuID)
|
||||
// a := getAPI(vendorOrgCode)
|
||||
// skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{
|
||||
// SkuID: jdSkuID,
|
||||
// })
|
||||
// func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) {
|
||||
// var skuInfoExt tSkuInfoExt
|
||||
// err = dao.GetRow(nil, &skuInfoExt, `
|
||||
// SELECT
|
||||
// t2.*, IF(t2.jd_category_id > 0, t2.jd_category_id, t3.jd_category_id) jd_category_id,
|
||||
// t3.jd_id jd_cat_id,
|
||||
// t4.jd_id sku_cat_id
|
||||
// FROM sku t1
|
||||
// JOIN sku_name t2 ON t1.name_id = t2.id
|
||||
// JOIN sku_category t3 ON t2.category_id = t3.id
|
||||
// LEFT JOIN sku_category t4 ON t1.category_id = t4.id
|
||||
// WHERE t1.id = ?
|
||||
// `, sku.ID)
|
||||
// if err == nil {
|
||||
// if len(skuList) >= 1 {
|
||||
// skuNameExt = &model.SkuNameExt{}
|
||||
// if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{
|
||||
// SkuIDs: []int64{jdSkuID},
|
||||
// }); err2 == nil && len(imgList) > 0 {
|
||||
// skuNameExt.Img = imgList[0].SourceImgURL
|
||||
// }
|
||||
// sku := skuList[0]
|
||||
// prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku.SkuName)
|
||||
// if name == "" {
|
||||
// name = sku.SkuName
|
||||
// unit = "份"
|
||||
// specUnit = "g"
|
||||
// }
|
||||
// skuNameExt.Prefix = prefix
|
||||
// skuNameExt.Name = name
|
||||
// skuNameExt.Unit = unit
|
||||
// skuNameExt.Price = sku.SkuPrice
|
||||
// skuNameExt.Skus = []*model.SkuWithVendor{
|
||||
// &model.SkuWithVendor{
|
||||
// Sku: &model.Sku{
|
||||
// SpecQuality: specQuality,
|
||||
// SpecUnit: specUnit,
|
||||
// Weight: jxutils.FloatWeight2Int(float32(sku.Weight)),
|
||||
// JdID: sku.SkuID,
|
||||
// Status: jdStatus2jxStatus(sku.FixedStatus),
|
||||
// Comment: comment,
|
||||
// },
|
||||
// },
|
||||
// }
|
||||
// skuNameExt.Skus[0].ID = int(utils.Str2Int64(sku.OutSkuID))
|
||||
// shopCategories := []int64{skuInfoExt.JdCatID}
|
||||
// // SPU只支持SPU的商家分类,不支持单独SKU的,去除SKU的分类
|
||||
// // if skuInfoExt.SkuCatID != 0 {
|
||||
// // shopCategories = append(shopCategories, skuInfoExt.SkuCatID)
|
||||
// // }
|
||||
// if skuInfoExt.JdCategoryID == 0 {
|
||||
// skuInfoExt.JdCategoryID = getDefJdCategoryID()
|
||||
// }
|
||||
// if skuInfoExt.BrandID == 0 {
|
||||
// skuInfoExt.BrandID = DefBrandID
|
||||
// }
|
||||
// addParams := map[string]interface{}{}
|
||||
|
||||
// db := dao.GetDB()
|
||||
// shopCategories := sku.ShopCategories
|
||||
// if len(shopCategories) > 0 {
|
||||
// skuCat := &model.SkuCategory{}
|
||||
// skuCat.JdID = shopCategories[0]
|
||||
// if dao.GetEntity(db, skuCat, "JdID") == nil {
|
||||
// skuNameExt.CategoryID = skuCat.ID
|
||||
// if skuInfoExt.IsGlobal == 0 { //如果不是全国可售,要查可售区域
|
||||
// sellPlaces, err2 := dao.GetSellCities(db, skuInfoExt.ID, model.VendorIDJD)
|
||||
// if err = err2; err == nil && len(sellPlaces) > 0 {
|
||||
// sellCites := make([]int, len(sellPlaces))
|
||||
// for k, v := range sellPlaces {
|
||||
// sellCites[k] = v.JdCode
|
||||
// }
|
||||
// addParams["sellCities"] = sellCites
|
||||
// }
|
||||
// }
|
||||
// if addParams["sellCities"] == nil {
|
||||
// addParams["sellCities"] = []int{0}
|
||||
// }
|
||||
// if skuInfoExt.DescImg != "" {
|
||||
// addParams[jdapi.KeyProductDesc] = fmt.Sprintf(`<img src="%s" alt="一张图片" />`, skuInfoExt.DescImg)
|
||||
// addParams[jdapi.KeyIfViewDesc] = 0
|
||||
// } else {
|
||||
// addParams[jdapi.KeyIfViewDesc] = 1
|
||||
// }
|
||||
// if err == nil {
|
||||
// skuName := jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount)
|
||||
// skuPrice := jxutils.CaculateSkuPrice(skuInfoExt.Price, sku.SpecQuality, sku.SpecUnit, skuInfoExt.Unit)
|
||||
// if skuInfoExt.Upc != "" {
|
||||
// addParams[jdapi.KeyUpcCode] = skuInfoExt.Upc
|
||||
// }
|
||||
// result, err2 := handler(&skuInfoExt, skuPrice, skuName, shopCategories, addParams)
|
||||
// if err = err2; err == nil {
|
||||
// if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 {
|
||||
// sku.JdID = jdID
|
||||
// }
|
||||
// }
|
||||
// sellCities := sku.SellCities
|
||||
// for _, v := range sellCities {
|
||||
// if v == 0 {
|
||||
// skuNameExt.IsGlobal = 1
|
||||
// }
|
||||
// }
|
||||
// return err
|
||||
// }
|
||||
|
||||
// func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
// return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
|
||||
// if skuExt.IsSpu == 0 {
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// vendorSkuID, err = getAPI("").AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2), jxStatus2jdStatus(sku.Status), true, addParams)
|
||||
// if err != nil {
|
||||
// if jdSkuID := jdapi.GetJdSkuIDFromError(err); jdSkuID > 0 {
|
||||
// vendorSkuID = utils.Int64ToStr(jdSkuID)
|
||||
// err = nil
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if len(sellCities) == 0 || skuNameExt.IsGlobal == 1 {
|
||||
// skuNameExt.IsGlobal = 1
|
||||
// } else {
|
||||
// var places []*model.Place
|
||||
// if err = dao.GetRows(db, &places, "SELECT * FROM place WHERE jd_code IN ("+dao.GenQuestionMarks(len(sellCities))+") AND level = 2", sellCities); err == nil {
|
||||
// skuNameExt.Places = make([]int, len(places))
|
||||
// for k, v := range places {
|
||||
// skuNameExt.Places[k] = v.Code
|
||||
// vendorSkuID = utils.Int64ToStr(jxutils.GenFakeID())
|
||||
// }
|
||||
// } else {
|
||||
// vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
|
||||
// }
|
||||
// return vendorSkuID, err
|
||||
// })
|
||||
// }
|
||||
|
||||
// // func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) {
|
||||
// // jdSkuID := utils.Str2Int64(vendorSkuID)
|
||||
// // a := getAPI(vendorOrgCode)
|
||||
// // skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{
|
||||
// // SkuID: jdSkuID,
|
||||
// // })
|
||||
// // if err == nil {
|
||||
// // if len(skuList) >= 1 {
|
||||
// // skuNameExt = &model.SkuNameExt{}
|
||||
// // if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{
|
||||
// // SkuIDs: []int64{jdSkuID},
|
||||
// // }); err2 == nil && len(imgList) > 0 {
|
||||
// // skuNameExt.Img = imgList[0].SourceImgURL
|
||||
// // }
|
||||
// // sku := skuList[0]
|
||||
// // prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku.SkuName)
|
||||
// // if name == "" {
|
||||
// // name = sku.SkuName
|
||||
// // unit = "份"
|
||||
// // specUnit = "g"
|
||||
// // }
|
||||
// // skuNameExt.Prefix = prefix
|
||||
// // skuNameExt.Name = name
|
||||
// // skuNameExt.Unit = unit
|
||||
// // skuNameExt.Price = sku.SkuPrice
|
||||
// // skuNameExt.Skus = []*model.SkuWithVendor{
|
||||
// // &model.SkuWithVendor{
|
||||
// // Sku: &model.Sku{
|
||||
// // SpecQuality: specQuality,
|
||||
// // SpecUnit: specUnit,
|
||||
// // Weight: jxutils.FloatWeight2Int(float32(sku.Weight)),
|
||||
// // JdID: sku.SkuID,
|
||||
// // Status: jdStatus2jxStatus(sku.FixedStatus),
|
||||
// // Comment: comment,
|
||||
// // },
|
||||
// // },
|
||||
// // }
|
||||
// // skuNameExt.Skus[0].ID = int(utils.Str2Int64(sku.OutSkuID))
|
||||
|
||||
// // db := dao.GetDB()
|
||||
// // shopCategories := sku.ShopCategories
|
||||
// // if len(shopCategories) > 0 {
|
||||
// // skuCat := &model.SkuCategory{}
|
||||
// // skuCat.JdID = shopCategories[0]
|
||||
// // if dao.GetEntity(db, skuCat, "JdID") == nil {
|
||||
// // skuNameExt.CategoryID = skuCat.ID
|
||||
// // }
|
||||
// // }
|
||||
// // sellCities := sku.SellCities
|
||||
// // for _, v := range sellCities {
|
||||
// // if v == 0 {
|
||||
// // skuNameExt.IsGlobal = 1
|
||||
// // }
|
||||
// // }
|
||||
// // if len(sellCities) == 0 || skuNameExt.IsGlobal == 1 {
|
||||
// // skuNameExt.IsGlobal = 1
|
||||
// // } else {
|
||||
// // var places []*model.Place
|
||||
// // if err = dao.GetRows(db, &places, "SELECT * FROM place WHERE jd_code IN ("+dao.GenQuestionMarks(len(sellCities))+") AND level = 2", sellCities); err == nil {
|
||||
// // skuNameExt.Places = make([]int, len(places))
|
||||
// // for k, v := range places {
|
||||
// // skuNameExt.Places[k] = v.Code
|
||||
// // }
|
||||
// // }
|
||||
// // }
|
||||
// // } else {
|
||||
// // err = partner.ErrCanNotFindItem
|
||||
// // }
|
||||
// // }
|
||||
// // return skuNameExt, err
|
||||
// // }
|
||||
|
||||
// func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
// return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
|
||||
// params := utils.MergeMaps(addParams)
|
||||
// params[jdapi.KeyCategoryId] = skuExt.JdCategoryID
|
||||
// params[jdapi.KeyShopCategories] = shopCategories
|
||||
// params[jdapi.KeyBrandId] = skuExt.BrandID
|
||||
// params[jdapi.KeySkuName] = skuName
|
||||
// params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
|
||||
// params[jdapi.KeyImages] = jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2)
|
||||
// params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
|
||||
// if skuExt.IsSpu == 0 {
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// vendorSkuID, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
|
||||
// }
|
||||
// } else {
|
||||
// vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
|
||||
// }
|
||||
// return vendorSkuID, err
|
||||
// })
|
||||
// }
|
||||
|
||||
// func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
// params := map[string]interface{}{
|
||||
// jdapi.KeyFixedStatus: jdapi.SkuFixedStatusDeleted,
|
||||
// }
|
||||
// sql := `
|
||||
// SELECT t2.*
|
||||
// FROM sku t1
|
||||
// JOIN sku_name t2 ON t1.name_id = t2.id
|
||||
// WHERE t1.id = ?
|
||||
// `
|
||||
// var skuExt tSkuInfoExt
|
||||
// err = dao.GetRow(db, &skuExt, sql, sku.ID)
|
||||
// if err == nil {
|
||||
// if skuExt.IsSpu == 0 {
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// _, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
|
||||
// }
|
||||
// } else {
|
||||
// _, err = p.syncSkuNameAsSpu(db, sku, &skuExt, 0, "", nil, nil)
|
||||
// }
|
||||
// }
|
||||
// return err
|
||||
// }
|
||||
|
||||
// // func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
|
||||
// // globals.SugarLogger.Debugf("jd RefreshAllSkusID")
|
||||
|
||||
// // db := dao.GetDB()
|
||||
// // var skuPairs []*jdapi.SkuIDPair
|
||||
// // const stepCount = 2
|
||||
|
||||
// // rootTask := tasksch.NewSeqTask("jd RefreshAllSkusID", ctx,
|
||||
// // func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
// // switch step {
|
||||
// // case 0:
|
||||
// // err = dao.GetRows(db, &skuPairs, `
|
||||
// // SELECT t1.id out_sku_id, t1.jd_id sku_id
|
||||
// // FROM sku t1
|
||||
// // WHERE t1.deleted_at = ?
|
||||
// // `, utils.DefaultTimeValue)
|
||||
// // default:
|
||||
// // taskName := "RefreshAllSkusID update id"
|
||||
// // if step != stepCount-1 {
|
||||
// // taskName = "RefreshAllSkusID update uuid"
|
||||
// // }
|
||||
// // task1 := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true).SetBatchSize(jdapi.MaxBatchSize4BatchUpdateOutSkuId), ctx,
|
||||
// // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// // skuPairs := make([]*jdapi.SkuIDPair, len(batchItemList))
|
||||
// // for k, v := range batchItemList {
|
||||
// // pair := v.(*jdapi.SkuIDPair)
|
||||
// // skuPairs[k] = &jdapi.SkuIDPair{
|
||||
// // SkuId: pair.SkuId,
|
||||
// // OutSkuId: pair.OutSkuId,
|
||||
// // }
|
||||
// // if step != stepCount-1 {
|
||||
// // skuPairs[k].OutSkuId = utils.GetUUID()
|
||||
// // }
|
||||
// // }
|
||||
// // globals.SugarLogger.Debug(utils.Format4Output(skuPairs, false))
|
||||
// // if globals.EnableJdStoreWrite {
|
||||
// // _, err = getAPI("").BatchUpdateOutSkuId(skuPairs)
|
||||
// // }
|
||||
// // return nil, err
|
||||
// // }, skuPairs)
|
||||
// // rootTask.AddChild(task1).Run()
|
||||
// // _, err = task1.GetResult(0)
|
||||
// // }
|
||||
// // return nil, err
|
||||
// // }, stepCount)
|
||||
// // tasksch.HandleTask(rootTask, parentTask, false).Run()
|
||||
// // if !isAsync {
|
||||
// // _, err = rootTask.GetResult(0)
|
||||
// // }
|
||||
// // return rootTask.ID, err
|
||||
// // }
|
||||
|
||||
// func splitAddParams(addParams map[string]interface{}) (spuAddParams, skuAddParams map[string]interface{}) {
|
||||
// if addParams != nil {
|
||||
// spuAddParams = make(map[string]interface{})
|
||||
// skuAddParams = make(map[string]interface{})
|
||||
// for key := range addParams {
|
||||
// if skuAddParamsKeyMap[key] == 1 {
|
||||
// skuAddParams[key] = addParams[key]
|
||||
// } else {
|
||||
// spuAddParams[key] = addParams[key]
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return spuAddParams, skuAddParams
|
||||
// }
|
||||
|
||||
// // 这个处理JD SPU,补丁形式
|
||||
// func (p *PurchaseHandler) syncSkuNameAsSpu(db *dao.DaoDB, sku *model.Sku, skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
|
||||
// // SPU的SKU NAME不需要规格信息
|
||||
// skuName = jxutils.ComposeSkuName(skuExt.Prefix, skuExt.Name, sku.Comment, "", 0, "", 0)
|
||||
// skuNameJdID := skuExt.JdID
|
||||
// globals.SugarLogger.Debugf("syncSkuNameAsSpu1 sku.id=%d, bareSkuName:%s, skuName:%s, skuNameJdID:%d", sku.ID, skuExt.Name, skuName, skuNameJdID)
|
||||
// spuAddParams, skuAddParams := splitAddParams(addParams)
|
||||
// if !jxutils.IsEmptyID(skuNameJdID) && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除SKU
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
|
||||
// }
|
||||
// }
|
||||
// if err == nil {
|
||||
// updateFields := []string{}
|
||||
// if skuExt.JdSyncStatus&model.SyncFlagDeletedMask != 0 {
|
||||
// sql := `
|
||||
// SELECT COUNT(*) ct
|
||||
// FROM sku t1
|
||||
// WHERE t1.name_id = ? AND (t1.status <> ? OR t1.jd_sync_status <> 0)
|
||||
// `
|
||||
// var count struct {
|
||||
// Ct int
|
||||
// }
|
||||
// if err = dao.GetRow(db, &count, sql, sku.NameID, model.SkuStatusDeleted); err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// if count.Ct <= 1 && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 1就是最后删的那个
|
||||
// updateFields = append(updateFields, model.FieldJdSyncStatus)
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// if err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil {
|
||||
// err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// err = partner.ErrCanNotFindItem
|
||||
// } else if skuExt.JdSyncStatus&model.SyncFlagNewMask != 0 && jxutils.IsEmptyID(skuNameJdID) {
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// spuName := jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0)
|
||||
// skus := []map[string]interface{}{
|
||||
// map[string]interface{}{
|
||||
// jdapi.KeyOutSkuId: utils.Int2Str(sku.ID),
|
||||
// jdapi.KeySkuName: skuName,
|
||||
// jdapi.KeyFixedStatus: jxStatus2jdStatus(sku.Status),
|
||||
// jdapi.KeySkuPrice: price,
|
||||
// jdapi.KeyWeight: jxutils.IntWeight2Float(sku.Weight),
|
||||
// jdapi.KeyIsSale: true,
|
||||
// jdapi.FakeKeySpecAttr: composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit),
|
||||
// },
|
||||
// }
|
||||
// skus[0] = utils.MergeMaps(skus[0], skuAddParams)
|
||||
// updateFields = append(updateFields, model.FieldJdSyncStatus)
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// vendorSpuID, skuPairs, err2 := getAPI("").AddSpu(utils.Int2Str(skuExt.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, spuName, []string{skuExt.Img}, jxStatus2jdStatus(skuExt.Status), spuAddParams, skus)
|
||||
// if err = err2; err == nil {
|
||||
// skuExt.JdID = vendorSpuID
|
||||
// // skuNameJdID = skuExt.JdID // 这个是故意去掉的,这样之后的首次SKU修改操作就会被忽略,下一条语句也就可以不用了
|
||||
// // sku.JdSyncStatus &= ^model.SyncFlagNewMask
|
||||
// vendorSkuID = utils.Int64ToStr(skuPairs[0].SkuId)
|
||||
// updateFields = append(updateFields, model.FieldJdID)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else if skuExt.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
|
||||
// params := utils.MergeMaps(map[string]interface{}{
|
||||
// jdapi.KeySpuName: jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0),
|
||||
// jdapi.KeyShopCategories: shopCategories,
|
||||
// jdapi.KeyCategoryId: skuExt.JdCategoryID,
|
||||
// jdapi.KeyBrandId: skuExt.BrandID,
|
||||
// jdapi.KeyImages: []string{skuExt.Img},
|
||||
// jdapi.KeyFixedStatus: jxStatus2jdStatus(skuExt.Status),
|
||||
// }, spuAddParams)
|
||||
// updateFields = append(updateFields, model.FieldJdSyncStatus)
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), params)
|
||||
// }
|
||||
// }
|
||||
// if err == nil {
|
||||
// if skuExt.JdSyncStatus != 0 && len(updateFields) > 0 {
|
||||
// skuExt.JdSyncStatus = 0
|
||||
// _, err = dao.UpdateEntity(db, &skuExt.SkuName, updateFields...)
|
||||
// globals.SugarLogger.Debugf("syncSkuNameAsSpu4 sku.id=%d, skuName:%s, skuName:%s", sku.ID, skuExt.Name, utils.Format4Output(&skuExt.SkuName, false))
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return skuNameExt, err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
|
||||
params := utils.MergeMaps(addParams)
|
||||
params[jdapi.KeyCategoryId] = skuExt.JdCategoryID
|
||||
params[jdapi.KeyShopCategories] = shopCategories
|
||||
params[jdapi.KeyBrandId] = skuExt.BrandID
|
||||
params[jdapi.KeySkuName] = skuName
|
||||
params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
|
||||
params[jdapi.KeyImages] = jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2)
|
||||
params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
|
||||
if skuExt.IsSpu == 0 {
|
||||
if globals.EnableJdStoreWrite {
|
||||
vendorSkuID, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
|
||||
}
|
||||
} else {
|
||||
vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams)
|
||||
}
|
||||
return vendorSkuID, err
|
||||
})
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
params := map[string]interface{}{
|
||||
jdapi.KeyFixedStatus: jdapi.SkuFixedStatusDeleted,
|
||||
}
|
||||
sql := `
|
||||
SELECT t2.*
|
||||
FROM sku t1
|
||||
JOIN sku_name t2 ON t1.name_id = t2.id
|
||||
WHERE t1.id = ?
|
||||
`
|
||||
var skuExt tSkuInfoExt
|
||||
err = dao.GetRow(db, &skuExt, sql, sku.ID)
|
||||
if err == nil {
|
||||
if skuExt.IsSpu == 0 {
|
||||
if globals.EnableJdStoreWrite {
|
||||
_, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params)
|
||||
}
|
||||
} else {
|
||||
_, err = p.syncSkuNameAsSpu(db, sku, &skuExt, 0, "", nil, nil)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) {
|
||||
// globals.SugarLogger.Debugf("jd RefreshAllSkusID")
|
||||
|
||||
// db := dao.GetDB()
|
||||
// var skuPairs []*jdapi.SkuIDPair
|
||||
// const stepCount = 2
|
||||
|
||||
// rootTask := tasksch.NewSeqTask("jd RefreshAllSkusID", ctx,
|
||||
// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||
// switch step {
|
||||
// case 0:
|
||||
// err = dao.GetRows(db, &skuPairs, `
|
||||
// SELECT t1.id out_sku_id, t1.jd_id sku_id
|
||||
// FROM sku t1
|
||||
// WHERE t1.deleted_at = ?
|
||||
// `, utils.DefaultTimeValue)
|
||||
// default:
|
||||
// taskName := "RefreshAllSkusID update id"
|
||||
// if step != stepCount-1 {
|
||||
// taskName = "RefreshAllSkusID update uuid"
|
||||
// if err == nil && !jxutils.IsEmptyID(skuNameJdID) {
|
||||
// if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 非首次新增SKU
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// vendorSkuID2, err2 := getAPI("").AppendSku(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, jxStatus2jdStatus(sku.Status), true, composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit), skuAddParams)
|
||||
// if err = err2; err == nil {
|
||||
// vendorSkuID = utils.Int64ToStr(vendorSkuID2)
|
||||
// }
|
||||
// task1 := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true).SetBatchSize(jdapi.MaxBatchSize4BatchUpdateOutSkuId), ctx,
|
||||
// func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
// skuPairs := make([]*jdapi.SkuIDPair, len(batchItemList))
|
||||
// for k, v := range batchItemList {
|
||||
// pair := v.(*jdapi.SkuIDPair)
|
||||
// skuPairs[k] = &jdapi.SkuIDPair{
|
||||
// SkuId: pair.SkuId,
|
||||
// OutSkuId: pair.OutSkuId,
|
||||
// }
|
||||
// if step != stepCount-1 {
|
||||
// skuPairs[k].OutSkuId = utils.GetUUID()
|
||||
// }
|
||||
// }
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(skuPairs, false))
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// _, err = getAPI("").BatchUpdateOutSkuId(skuPairs)
|
||||
// }
|
||||
// return nil, err
|
||||
// }, skuPairs)
|
||||
// rootTask.AddChild(task1).Run()
|
||||
// _, err = task1.GetResult(0)
|
||||
// }
|
||||
// return nil, err
|
||||
// }, stepCount)
|
||||
// tasksch.HandleTask(rootTask, parentTask, false).Run()
|
||||
// if !isAsync {
|
||||
// _, err = rootTask.GetResult(0)
|
||||
// } else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
|
||||
// params := make(map[string]interface{})
|
||||
// params[jdapi.KeySkuName] = skuName
|
||||
// params[jdapi.KeyImages] = []string{skuExt.Img}
|
||||
// params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
|
||||
// params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
|
||||
// params[jdapi.KeySkuPrice] = price
|
||||
// if globals.EnableJdStoreWrite {
|
||||
// err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.MergeMaps(params, skuAddParams))
|
||||
// if sku.JdSyncStatus&model.SyncFlagSpecMask != 0 {
|
||||
// skuIndex := sku.SkuIndex
|
||||
// if skuIndex > 0 {
|
||||
// saleAttrValue := composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit)
|
||||
// globals.SugarLogger.Debugf("syncSkuNameAsSpu outSuperId:%d, saleAttrId:%d, saleAttrValueId:%d, saleAttrValueName:%s", skuExt.ID, jdapi.SaleAttrIDBase, jdapi.SaleAttrValueIDBase+skuIndex-1, saleAttrValue)
|
||||
// err = getAPI("").UpdateSpuSaleAttr(utils.Int2Str(skuExt.ID), utils.Int2Str(jdapi.SaleAttrIDBase), "", utils.Int2Str(jdapi.SaleAttrValueIDBase+skuIndex-1), saleAttrValue)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if err == nil {
|
||||
// sku.JdSyncStatus = 0
|
||||
// }
|
||||
// }
|
||||
// return rootTask.ID, err
|
||||
// return vendorSkuID, err
|
||||
// }
|
||||
|
||||
func splitAddParams(addParams map[string]interface{}) (spuAddParams, skuAddParams map[string]interface{}) {
|
||||
if addParams != nil {
|
||||
spuAddParams = make(map[string]interface{})
|
||||
skuAddParams = make(map[string]interface{})
|
||||
for key := range addParams {
|
||||
if skuAddParamsKeyMap[key] == 1 {
|
||||
skuAddParams[key] = addParams[key]
|
||||
} else {
|
||||
spuAddParams[key] = addParams[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
return spuAddParams, skuAddParams
|
||||
}
|
||||
|
||||
// 这个处理JD SPU,补丁形式
|
||||
func (p *PurchaseHandler) syncSkuNameAsSpu(db *dao.DaoDB, sku *model.Sku, skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) {
|
||||
// SPU的SKU NAME不需要规格信息
|
||||
skuName = jxutils.ComposeSkuName(skuExt.Prefix, skuExt.Name, sku.Comment, "", 0, "", 0)
|
||||
skuNameJdID := skuExt.JdID
|
||||
globals.SugarLogger.Debugf("syncSkuNameAsSpu1 sku.id=%d, bareSkuName:%s, skuName:%s, skuNameJdID:%d", sku.ID, skuExt.Name, skuName, skuNameJdID)
|
||||
spuAddParams, skuAddParams := splitAddParams(addParams)
|
||||
if !jxutils.IsEmptyID(skuNameJdID) && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除SKU
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
updateFields := []string{}
|
||||
if skuExt.JdSyncStatus&model.SyncFlagDeletedMask != 0 {
|
||||
sql := `
|
||||
SELECT COUNT(*) ct
|
||||
FROM sku t1
|
||||
WHERE t1.name_id = ? AND (t1.status <> ? OR t1.jd_sync_status <> 0)
|
||||
`
|
||||
var count struct {
|
||||
Ct int
|
||||
}
|
||||
if err = dao.GetRow(db, &count, sql, sku.NameID, model.SkuStatusDeleted); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if count.Ct <= 1 && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 1就是最后删的那个
|
||||
updateFields = append(updateFields, model.FieldJdSyncStatus)
|
||||
if globals.EnableJdStoreWrite {
|
||||
if err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil {
|
||||
err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted))
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if skuExt.JdSyncStatus&model.SyncFlagNewMask != 0 && jxutils.IsEmptyID(skuNameJdID) {
|
||||
if globals.EnableJdStoreWrite {
|
||||
spuName := jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0)
|
||||
skus := []map[string]interface{}{
|
||||
map[string]interface{}{
|
||||
jdapi.KeyOutSkuId: utils.Int2Str(sku.ID),
|
||||
jdapi.KeySkuName: skuName,
|
||||
jdapi.KeyFixedStatus: jxStatus2jdStatus(sku.Status),
|
||||
jdapi.KeySkuPrice: price,
|
||||
jdapi.KeyWeight: jxutils.IntWeight2Float(sku.Weight),
|
||||
jdapi.KeyIsSale: true,
|
||||
jdapi.FakeKeySpecAttr: composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit),
|
||||
},
|
||||
}
|
||||
skus[0] = utils.MergeMaps(skus[0], skuAddParams)
|
||||
updateFields = append(updateFields, model.FieldJdSyncStatus)
|
||||
if globals.EnableJdStoreWrite {
|
||||
vendorSpuID, skuPairs, err2 := getAPI("").AddSpu(utils.Int2Str(skuExt.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, spuName, []string{skuExt.Img}, jxStatus2jdStatus(skuExt.Status), spuAddParams, skus)
|
||||
if err = err2; err == nil {
|
||||
skuExt.JdID = vendorSpuID
|
||||
// skuNameJdID = skuExt.JdID // 这个是故意去掉的,这样之后的首次SKU修改操作就会被忽略,下一条语句也就可以不用了
|
||||
// sku.JdSyncStatus &= ^model.SyncFlagNewMask
|
||||
vendorSkuID = utils.Int64ToStr(skuPairs[0].SkuId)
|
||||
updateFields = append(updateFields, model.FieldJdID)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if skuExt.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
|
||||
params := utils.MergeMaps(map[string]interface{}{
|
||||
jdapi.KeySpuName: jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0),
|
||||
jdapi.KeyShopCategories: shopCategories,
|
||||
jdapi.KeyCategoryId: skuExt.JdCategoryID,
|
||||
jdapi.KeyBrandId: skuExt.BrandID,
|
||||
jdapi.KeyImages: []string{skuExt.Img},
|
||||
jdapi.KeyFixedStatus: jxStatus2jdStatus(skuExt.Status),
|
||||
}, spuAddParams)
|
||||
updateFields = append(updateFields, model.FieldJdSyncStatus)
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), params)
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
if skuExt.JdSyncStatus != 0 && len(updateFields) > 0 {
|
||||
skuExt.JdSyncStatus = 0
|
||||
_, err = dao.UpdateEntity(db, &skuExt.SkuName, updateFields...)
|
||||
globals.SugarLogger.Debugf("syncSkuNameAsSpu4 sku.id=%d, skuName:%s, skuName:%s", sku.ID, skuExt.Name, utils.Format4Output(&skuExt.SkuName, false))
|
||||
}
|
||||
}
|
||||
}
|
||||
if err == nil && !jxutils.IsEmptyID(skuNameJdID) {
|
||||
if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 非首次新增SKU
|
||||
if globals.EnableJdStoreWrite {
|
||||
vendorSkuID2, err2 := getAPI("").AppendSku(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, jxStatus2jdStatus(sku.Status), true, composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit), skuAddParams)
|
||||
if err = err2; err == nil {
|
||||
vendorSkuID = utils.Int64ToStr(vendorSkuID2)
|
||||
}
|
||||
}
|
||||
} else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 {
|
||||
params := make(map[string]interface{})
|
||||
params[jdapi.KeySkuName] = skuName
|
||||
params[jdapi.KeyImages] = []string{skuExt.Img}
|
||||
params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status)
|
||||
params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight)
|
||||
params[jdapi.KeySkuPrice] = price
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.MergeMaps(params, skuAddParams))
|
||||
if sku.JdSyncStatus&model.SyncFlagSpecMask != 0 {
|
||||
skuIndex := sku.SkuIndex
|
||||
if skuIndex > 0 {
|
||||
saleAttrValue := composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit)
|
||||
globals.SugarLogger.Debugf("syncSkuNameAsSpu outSuperId:%d, saleAttrId:%d, saleAttrValueId:%d, saleAttrValueName:%s", skuExt.ID, jdapi.SaleAttrIDBase, jdapi.SaleAttrValueIDBase+skuIndex-1, saleAttrValue)
|
||||
err = getAPI("").UpdateSpuSaleAttr(utils.Int2Str(skuExt.ID), utils.Int2Str(jdapi.SaleAttrIDBase), "", utils.Int2Str(jdapi.SaleAttrValueIDBase+skuIndex-1), saleAttrValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
sku.JdSyncStatus = 0
|
||||
}
|
||||
}
|
||||
return vendorSkuID, err
|
||||
}
|
||||
|
||||
func composeSkuSpec(specQuality float32, specUnit, unit string) string {
|
||||
prefix := ""
|
||||
if unit == model.SpecialUnit {
|
||||
prefix = "约"
|
||||
}
|
||||
value := prefix + jxutils.ComposeSkuSpec(specQuality, specUnit)
|
||||
suffix := "/" + unit
|
||||
if utf8.RuneCountInString(value) <= 8-utf8.RuneCountInString(suffix) {
|
||||
value += suffix
|
||||
}
|
||||
return value
|
||||
}
|
||||
// func composeSkuSpec(specQuality float32, specUnit, unit string) string {
|
||||
// prefix := ""
|
||||
// if unit == model.SpecialUnit {
|
||||
// prefix = "约"
|
||||
// }
|
||||
// value := prefix + jxutils.ComposeSkuSpec(specQuality, specUnit)
|
||||
// suffix := "/" + unit
|
||||
// if utf8.RuneCountInString(value) <= 8-utf8.RuneCountInString(suffix) {
|
||||
// value += suffix
|
||||
// }
|
||||
// return value
|
||||
// }
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
"github.com/astaxie/beego"
|
||||
)
|
||||
|
||||
@@ -113,7 +114,7 @@ func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCo
|
||||
|
||||
func (p *PurchaseHandler) getVendorCategories(level int, pid int64) (vendorCats []*model.SkuVendorCategory, err error) {
|
||||
// 得到平台的分类,不需要指定分账号
|
||||
cats, err := getAPI("").QueryChildCategoriesForOP(pid)
|
||||
cats, err := api.Jd2API.QueryChildCategoriesForOP(pid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -169,6 +170,10 @@ func skuInfo2Param(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (param *jd
|
||||
if param.CategoryID == 0 {
|
||||
param.CategoryID = int64(getDefJdCategoryID())
|
||||
}
|
||||
// 京东强制要求upc的商品,如果没有设置upc,自动生成一个假的
|
||||
if param.Upc == "" && isSkuMustHaveUpc(sku.Unit, param.CategoryID) {
|
||||
param.Upc = jxutils.GenFakeUPC(sku.SkuID)
|
||||
}
|
||||
if sku.IsGlobal == 0 && len(sku.SellCities) > 0 {
|
||||
param.SellCities = utils.StringSlice2Int64(sku.SellCities)
|
||||
}
|
||||
@@ -200,6 +205,23 @@ 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("DeleteSku2 vendorOrgCode:%s, sku:%s", vendorOrgCode, utils.Format4Output(sku, true))
|
||||
|
||||
// 京东到家只能通过商家ID删除SKU,如果没有的话,先绑定,再删除
|
||||
if sku.SkuID == 0 {
|
||||
skuPairList := []*jdapi.SkuIDPair{
|
||||
&jdapi.SkuIDPair{
|
||||
SkuId: utils.Str2Int64(sku.VendorSkuID),
|
||||
OutSkuId: sku.VendorSkuID,
|
||||
},
|
||||
}
|
||||
if globals.EnableJdStoreWrite {
|
||||
_, err = getAPI(vendorOrgCode).BatchUpdateOutSkuId(skuPairList)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sku.SkuID = int(utils.Str2Int64(sku.VendorSkuID))
|
||||
}
|
||||
}
|
||||
param := &jdapi.OpSkuParam{
|
||||
TraceID: ctx.GetTrackInfo(),
|
||||
OutSkuID: utils.Int2Str(sku.SkuID),
|
||||
@@ -357,3 +379,101 @@ func jxStatus2jdStatus(jxStatus int) (jdStatus int) {
|
||||
}
|
||||
return jdStatus
|
||||
}
|
||||
|
||||
func isSkuMustHaveUpc(unit string, vendorVendorCatID int64) bool {
|
||||
return unit != model.SpecialUnit || !upcLessMap[vendorVendorCatID]
|
||||
}
|
||||
|
||||
var (
|
||||
upcLessMap = map[int64]bool{
|
||||
20250: true,
|
||||
20252: true,
|
||||
20258: true,
|
||||
20259: true,
|
||||
20261: true,
|
||||
20262: true,
|
||||
20263: true,
|
||||
20264: true,
|
||||
20265: true,
|
||||
20266: true,
|
||||
20267: true,
|
||||
22822: true,
|
||||
20269: true,
|
||||
20270: true,
|
||||
20271: true,
|
||||
20272: true,
|
||||
20273: true,
|
||||
20275: true,
|
||||
20276: true,
|
||||
20277: true,
|
||||
20278: true,
|
||||
20279: true,
|
||||
20281: true,
|
||||
20282: true,
|
||||
20283: true,
|
||||
20285: true,
|
||||
20286: true,
|
||||
20287: true,
|
||||
22821: true,
|
||||
20289: true,
|
||||
20290: true,
|
||||
23018: true,
|
||||
20354: true,
|
||||
20355: true,
|
||||
20357: true,
|
||||
20359: true,
|
||||
23019: true,
|
||||
20294: true,
|
||||
20295: true,
|
||||
20296: true,
|
||||
20297: true,
|
||||
20298: true,
|
||||
20299: true,
|
||||
20300: true,
|
||||
20302: true,
|
||||
20303: true,
|
||||
20304: true,
|
||||
22840: true,
|
||||
22841: true,
|
||||
20317: true,
|
||||
20320: true,
|
||||
20321: true,
|
||||
20323: true,
|
||||
20325: true,
|
||||
20326: true,
|
||||
20328: true,
|
||||
20329: true,
|
||||
20331: true,
|
||||
20335: true,
|
||||
20337: true,
|
||||
20338: true,
|
||||
20339: true,
|
||||
22842: true,
|
||||
22843: true,
|
||||
23020: true,
|
||||
20309: true,
|
||||
20310: true,
|
||||
20311: true,
|
||||
20312: true,
|
||||
20313: true,
|
||||
20314: true,
|
||||
20315: true,
|
||||
22410: true,
|
||||
23050: true,
|
||||
20319: true,
|
||||
20322: true,
|
||||
20330: true,
|
||||
20332: true,
|
||||
20334: true,
|
||||
20336: true,
|
||||
20340: true,
|
||||
20342: true,
|
||||
23049: true,
|
||||
20356: true,
|
||||
20358: true,
|
||||
20360: true,
|
||||
20361: true,
|
||||
20362: true,
|
||||
20364: true,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -23,20 +23,6 @@ func TestCreateSku(t *testing.T) {
|
||||
// }
|
||||
}
|
||||
|
||||
func TestUpdateSku(t *testing.T) {
|
||||
// t.Log(beego.BConfig.RunMode)
|
||||
db := dao.GetDB()
|
||||
skuID := 21741
|
||||
sku := &model.Sku{}
|
||||
sku.ID = skuID
|
||||
dao.GetEntity(db, sku)
|
||||
|
||||
err := CurPurchaseHandler.UpdateSku(db, sku, "autotest")
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetAllCategories(t *testing.T) {
|
||||
result, err := CurPurchaseHandler.GetAllCategories(jxcontext.AdminCtx, "")
|
||||
if err != nil || len(result) == 0 {
|
||||
|
||||
@@ -36,6 +36,7 @@ type tJdStoreInfo struct {
|
||||
VendorStoreID string `orm:"column(vendor_store_id)"`
|
||||
RealLastOperator string
|
||||
SyncStatus int
|
||||
VendorStoreName string
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -123,7 +124,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
t1.*, city.jd_code jd_city_code, district.jd_code jd_district_code,
|
||||
t2.status jd_store_status, t2.vendor_store_id, IF(t1.updated_at > t2.updated_at, t1.last_operator,
|
||||
t2.last_operator) real_last_operator,
|
||||
t2.sync_status, t2.freight_deduction_pack, t2.vendor_org_code
|
||||
t2.sync_status, t2.freight_deduction_pack, t2.vendor_org_code, t2.vendor_store_name
|
||||
FROM store t1
|
||||
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND (t2.deleted_at = ?)
|
||||
LEFT JOIN place city ON t1.city_code = city.code
|
||||
@@ -146,7 +147,11 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
storeParams.OutSystemID = store.VendorStoreID
|
||||
}
|
||||
if store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
|
||||
storeParams.StationName = jxutils.ComposeStoreName(store.Name, model.VendorIDJD)
|
||||
if store.VendorStoreName != "" {
|
||||
storeParams.StationName = store.VendorStoreName
|
||||
} else {
|
||||
storeParams.StationName = jxutils.ComposeStoreName(store.Name, model.VendorIDJD)
|
||||
}
|
||||
}
|
||||
if store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreAddress) != 0 {
|
||||
storeParams.StationAddress = store.Address
|
||||
@@ -170,7 +175,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
storeParams.City = storeParams.County
|
||||
storeParams.County = specialDistrictMap[storeParams.County]
|
||||
}
|
||||
|
||||
storeParams.StoreNotice = store.PromoteInfo
|
||||
modifyCloseStatus := false
|
||||
if store.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagDeletedMask|model.SyncFlagStoreStatus) != 0 {
|
||||
modifyCloseStatus = true
|
||||
|
||||
@@ -64,7 +64,7 @@ func (c *PurchaseHandler) callbackMsg2Waybill(msg *jdapi.CallbackDeliveryStatusM
|
||||
StatusTime: utils.Str2Time(msg.DeliveryStatusTime),
|
||||
Remark: msg.Remark,
|
||||
|
||||
VendorOrgCode: appKey2OrgCode(msg.AppKey),
|
||||
VendorOrgCode: AppKey2OrgCode(msg.AppKey),
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
|
||||
@@ -152,13 +152,30 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64,
|
||||
outJxOrder.OrderID = GenOrderNo(ctx)
|
||||
order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress)
|
||||
if err = err2; err == nil {
|
||||
order.Status = model.OrderStatusCreated
|
||||
order.Status = model.OrderStatusWait4Pay
|
||||
callNewOrder(order)
|
||||
}
|
||||
}
|
||||
return outJxOrder, err
|
||||
}
|
||||
|
||||
// 买家取消(或申请取消)订单
|
||||
func BuyerCancelOrder(ctx *jxcontext.Context, orderID int64) (canceled bool, err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDJX)
|
||||
if err == nil {
|
||||
if order.Status < model.OrderStatusNew {
|
||||
order.Status = model.OrderStatusCanceled
|
||||
order.VendorStatus = utils.Int2Str(model.OrderStatusCanceled)
|
||||
if err = partner.CurOrderManager.UpdateOrderFields(order, []string{model.FieldStatus, "VendorStatus"}); err == nil {
|
||||
canceled = true
|
||||
}
|
||||
} else {
|
||||
err = changeOrderStatus(utils.Int64ToStr(orderID), model.OrderStatusApplyCancel, fmt.Sprintf("用户%s主动取消", ctx.GetUserName()))
|
||||
}
|
||||
}
|
||||
return canceled, err
|
||||
}
|
||||
|
||||
func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType string) (orderPay *model.OrderPay, err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDJX)
|
||||
if err == nil {
|
||||
@@ -255,6 +272,10 @@ func GenOrderNo(ctx *jxcontext.Context) (orderNo int64) {
|
||||
return orderNo
|
||||
}
|
||||
|
||||
func GenPayOrderID(order *model.GoodsOrder) (payOrderID int64) {
|
||||
return utils.Str2Int64(order.VendorOrderID)
|
||||
}
|
||||
|
||||
func GenRefundID(order *model.GoodsOrder) (refundID int64) {
|
||||
const suffix = 100000
|
||||
refundID = utils.Str2Int64(order.VendorOrderID) * suffix
|
||||
@@ -385,7 +406,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
Count: v.Count,
|
||||
SalePrice: int64(storeSkuBind.JxPrice), // todo 考虑活动价
|
||||
Weight: sku.Weight,
|
||||
Name: jxutils.ComposeSkuName(sku.Prefix, sku.Name, sku.Comment, sku.Unit, sku.SpecQuality, sku.SpecUnit, 0),
|
||||
Name: jxutils.ComposeSkuName(sku.Prefix, sku.Name, sku.Comment, sku.Unit, sku.SpecQuality, sku.SpecUnit, 0, sku.ExPrefix, sku.ExPrefixBegin, sku.ExPrefixEnd),
|
||||
}
|
||||
if storeSkuBind.ActPrice != 0 && storeSkuBind.ActPrice < storeSkuBind.JxPrice {
|
||||
jxSku.SalePrice = int64(storeSkuBind.ActPrice)
|
||||
@@ -490,6 +511,10 @@ func AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName stri
|
||||
return changeOrderStatus(order.VendorOrderID, status, "")
|
||||
}
|
||||
|
||||
func AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||
return changeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "")
|
||||
}
|
||||
@@ -510,8 +535,9 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
|
||||
errList := errlist.New()
|
||||
for _, orderPay := range payList {
|
||||
if orderPay.Status == model.PayStatusYes {
|
||||
refundID := utils.Int64ToStr(GenRefundID(order))
|
||||
orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID)
|
||||
// refundID := utils.Int64ToStr(GenRefundID(order))
|
||||
refundID := order.VendorOrderID
|
||||
orderPayRefund, err2 := refundOrderByWX(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err2 == nil {
|
||||
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
|
||||
errList.AddErr(dao.CreateEntity(dao.GetDB(), orderPayRefund))
|
||||
@@ -535,6 +561,15 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
|
||||
return err
|
||||
}
|
||||
|
||||
func AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) {
|
||||
if isAgree {
|
||||
err = CancelOrder(ctx, order, reason)
|
||||
} else {
|
||||
err = changeOrderStatus(order.VendorOrderID, model.OrderStatusVendorRejectCancel, reason)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// todo 消息用异步可能导致丢失,单同步又有重入相关的问题
|
||||
func callNewOrder(order *model.GoodsOrder) (err error) {
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/wxpay"
|
||||
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||
@@ -25,16 +25,16 @@ func getOrderBrief(order *model.GoodsOrder) string {
|
||||
|
||||
func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayType string) (orderPay *model.OrderPay, err error) {
|
||||
payCreatedAt := time.Now()
|
||||
param := &wxpay.CreateOrderParam{
|
||||
param := &wxpayapi.CreateOrderParam{
|
||||
OutTradeNo: utils.Int64ToStr(GenPayOrderID(order)),
|
||||
Body: getOrderBrief(order),
|
||||
NotifyURL: globals.WxpayNotifyURL,
|
||||
OutTradeNo: order.VendorOrderID,
|
||||
SpbillCreateIP: ctx.GetRealRemoteIP(),
|
||||
TradeType: vendorPayType2WxpayType(vendorPayType),
|
||||
TotalFee: int(order.ActualPayPrice),
|
||||
|
||||
TimeStart: wxpay.Time2PayTime(payCreatedAt),
|
||||
// TimeExpire: wxpay.Time2PayTime(payCreatedAt.Add(PayWaitingTime)),
|
||||
TimeStart: wxpayapi.Time2PayTime(payCreatedAt),
|
||||
// TimeExpire: wxpayapi.Time2PayTime(payCreatedAt.Add(PayWaitingTime)),
|
||||
}
|
||||
if authInfo, err := ctx.GetV2AuthInfo(); err == nil && authInfo.GetAuthType() == weixin.AuthTypeMini {
|
||||
param.OpenID = authInfo.GetAuthID()
|
||||
@@ -42,10 +42,12 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp
|
||||
result, err := api.WxpayAPI.CreateUnifiedOrder(param)
|
||||
if err == nil {
|
||||
orderPay = &model.OrderPay{
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
VendorID: order.VendorID,
|
||||
PayOrderID: param.OutTradeNo,
|
||||
PayType: model.PayTypeWX,
|
||||
VendorPayType: vendorPayType,
|
||||
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
VendorID: order.VendorID,
|
||||
Status: 0,
|
||||
PayCreatedAt: payCreatedAt,
|
||||
PrepayID: result.PrepayID,
|
||||
@@ -56,37 +58,35 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp
|
||||
return orderPay, err
|
||||
}
|
||||
|
||||
func OnWxPayCallback(msg *wxpay.CallbackMsg) (err error) {
|
||||
func OnWxPayCallback(msg *wxpayapi.CallbackMsg) (err error) {
|
||||
globals.SugarLogger.Debugf("OnWxPayCallback msg:%s", utils.Format4Output(msg, true))
|
||||
switch msg.MsgType {
|
||||
case wxpay.MsgTypePay:
|
||||
err = onWxpayFinished(msg.Data.(*wxpay.PayResultMsg))
|
||||
case wxpay.MsgTypeRefund:
|
||||
err = onWxpayRefund(msg.Data.(*wxpay.RefundResultMsg))
|
||||
case wxpayapi.MsgTypePay:
|
||||
err = onWxpayFinished(msg.Data.(*wxpayapi.PayResultMsg))
|
||||
case wxpayapi.MsgTypeRefund:
|
||||
err = onWxpayRefund(msg.Data.(*wxpayapi.RefundResultMsg))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func onWxpayFinished(msg *wxpay.PayResultMsg) (err error) {
|
||||
func onWxpayFinished(msg *wxpayapi.PayResultMsg) (err error) {
|
||||
orderPay := &model.OrderPay{
|
||||
VendorOrderID: msg.OutTradeNo,
|
||||
VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(msg.OutTradeNo),
|
||||
PayType: model.PayTypeWX,
|
||||
PayOrderID: msg.OutTradeNo,
|
||||
PayType: model.PayTypeWX,
|
||||
}
|
||||
orderPay.DeletedAt = utils.DefaultTimeValue
|
||||
db := dao.GetDB()
|
||||
if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "DeletedAt"); err == nil {
|
||||
orderPay.VendorPayType = msg.TradeType
|
||||
orderPay.PayFinishedAt = utils.Time2Pointer(wxpay.PayTime2Time(msg.TimeEnd))
|
||||
if err = dao.GetEntity(db, orderPay, "PayOrderID", "PayType", "DeletedAt"); err == nil {
|
||||
orderPay.PayFinishedAt = utils.Time2Pointer(wxpayapi.PayTime2Time(msg.TimeEnd))
|
||||
orderPay.TransactionID = msg.TransactionID
|
||||
orderPay.OriginalData = utils.Format4Output(msg, true)
|
||||
if msg.ResultCode == wxpay.ResponseCodeSuccess {
|
||||
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
|
||||
orderPay.Status = model.PayStatusYes
|
||||
} else {
|
||||
orderPay.Status = model.PayStatusFailed
|
||||
}
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
if msg.ResultCode == wxpay.ResponseCodeSuccess {
|
||||
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
|
||||
err = OnPayFinished(orderPay)
|
||||
}
|
||||
} else {
|
||||
@@ -95,13 +95,13 @@ func onWxpayFinished(msg *wxpay.PayResultMsg) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func onWxpayRefund(msg *wxpay.RefundResultMsg) (err error) {
|
||||
func onWxpayRefund(msg *wxpayapi.RefundResultMsg) (err error) {
|
||||
orderPayRefund := &model.OrderPayRefund{
|
||||
RefundID: msg.ReqInfoObj.OutRefundNo,
|
||||
}
|
||||
db := dao.GetDB()
|
||||
if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil {
|
||||
if msg.ResultCode == wxpay.ResponseCodeSuccess {
|
||||
if msg.ResultCode == wxpayapi.ResponseCodeSuccess {
|
||||
orderPayRefund.Status = model.RefundStatusYes
|
||||
} else {
|
||||
orderPayRefund.Status = model.RefundStatusFailed
|
||||
@@ -126,13 +126,14 @@ func onWxpayRefund(msg *wxpay.RefundResultMsg) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func refundOrderByWX(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string) (orderPayRefund *model.OrderPayRefund, err error) {
|
||||
result, err := api.WxpayAPI.PayRefund(&wxpay.PayRefundParam{
|
||||
func refundOrderByWX(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) {
|
||||
result, err := api.WxpayAPI.PayRefund(&wxpayapi.PayRefundParam{
|
||||
OutTradeNo: orderPay.VendorOrderID,
|
||||
NotifyURL: globals.WxpayNotifyURL,
|
||||
OutRefundNo: refundID,
|
||||
TotalFee: orderPay.TotalFee,
|
||||
RefundFee: orderPay.TotalFee,
|
||||
RefundFee: refundFee,
|
||||
RefundDesc: wxpayapi.CData(refundDesc),
|
||||
})
|
||||
if err == nil {
|
||||
orderPayRefund = &model.OrderPayRefund{
|
||||
|
||||
@@ -16,9 +16,18 @@ func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetOrder(vendorOrgCode, orderID string) (order *model.GoodsOrder, err error) {
|
||||
order, err = partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJX)
|
||||
return order, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
|
||||
if err == nil {
|
||||
status = order.Status
|
||||
}
|
||||
return status, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
||||
var status int
|
||||
if isAcceptIt {
|
||||
@@ -86,6 +95,10 @@ func (c *PurchaseHandler) GetOrderRealMobile(ctx *jxcontext.Context, order *mode
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) {
|
||||
if model.IsOrderJXTemp(order) {
|
||||
} else {
|
||||
err = localjx.AgreeOrRefuseCancel(ctx, order, isAgree, reason)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -99,6 +112,10 @@ func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.Goods
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) {
|
||||
if model.IsOrderJXTemp(order) {
|
||||
} else {
|
||||
err = localjx.AdjustOrder(ctx, order, removedSkuList, reason)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -106,14 +123,6 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode strin
|
||||
return vendorOrderIDs, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder) (tipFee int64, err error) {
|
||||
return tipFee, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) AddWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee2Add int64) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID, selfTakeCode string) (err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
|
||||
if err == nil {
|
||||
|
||||
@@ -9,25 +9,25 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
)
|
||||
|
||||
func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
// func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) {
|
||||
// return err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode string) (cats []*partner.BareCategoryInfo, err error) {
|
||||
return cats, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
return nil
|
||||
}
|
||||
// func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
return nil
|
||||
}
|
||||
// func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error {
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
// func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) {
|
||||
// return err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) {
|
||||
return err
|
||||
@@ -45,21 +45,21 @@ func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCo
|
||||
return err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
// func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) {
|
||||
// return skuNameExt, err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
// func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
// return err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
return err
|
||||
}
|
||||
// func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) {
|
||||
// return err
|
||||
// }
|
||||
|
||||
func (p *PurchaseHandler) CreateSku2(ctx *jxcontext.Context, sku *dao.StoreSkuSyncInfo) (err error) {
|
||||
return err
|
||||
|
||||
@@ -13,6 +13,17 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
func jxActType2Mtwm(actType int) int {
|
||||
if actType == model.ActSkuDirectDown {
|
||||
actType = mtwmapi.RetailActTypeDirectDown
|
||||
} else if actType == model.ActSkuSecKill {
|
||||
actType = mtwmapi.RetailActTypeSecKill
|
||||
} else {
|
||||
actType = 0
|
||||
}
|
||||
return actType
|
||||
}
|
||||
|
||||
func actOrderRules2Mtwm(actOrderRules []*model.ActOrderRule) (actDetails []*mtwmapi.FullDiscountActDetail) {
|
||||
for _, v := range actOrderRules {
|
||||
actDetails = append(actDetails, &mtwmapi.FullDiscountActDetail{
|
||||
@@ -73,7 +84,7 @@ func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*mode
|
||||
actData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate)
|
||||
if len(actData) > 0 {
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(vendorStoreID, actData)
|
||||
actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(vendorStoreID, jxActType2Mtwm(act.Type), actData)
|
||||
globals.SugarLogger.Debugf("mtwm createOneShopAct err2:%v", err2)
|
||||
if err = err2; err != nil {
|
||||
return err
|
||||
@@ -96,10 +107,10 @@ func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*mode
|
||||
return err
|
||||
}
|
||||
|
||||
func cancelOneShopAct(ctx *jxcontext.Context, actStoreSku []*model.ActStoreSku2) (err error) {
|
||||
func cancelOneShopAct(ctx *jxcontext.Context, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) {
|
||||
if list := storeSku2ActData4Delete(actStoreSku, nil /*model.IsSyncStatusNeedDelete*/); len(list) > 0 {
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
err = api.MtwmAPI.RetailDiscountDelete(actStoreSku[0].VendorStoreID, list)
|
||||
err = api.MtwmAPI.RetailDiscountDelete(actStoreSku[0].VendorStoreID, jxActType2Mtwm(act.Type), list)
|
||||
}
|
||||
}
|
||||
return err
|
||||
@@ -129,13 +140,13 @@ func createSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.A
|
||||
return getActStoreSkuFromTaskResult(result), err
|
||||
}
|
||||
|
||||
func cancelSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, actStoreSku []*model.ActStoreSku2) (canceledList []*model.ActStoreSku2, err error) {
|
||||
func cancelSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (canceledList []*model.ActStoreSku2, err error) {
|
||||
globals.SugarLogger.Debugf("mtwm cancelSkuAct")
|
||||
actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku)
|
||||
task := tasksch.NewParallelTask("mtwm cancelSkuAct", nil, ctx,
|
||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||
actStoreSkuList := batchItemList[0].([]*model.ActStoreSku2)
|
||||
if err = cancelOneShopAct(ctx, actStoreSkuList); err == nil {
|
||||
if err = cancelOneShopAct(ctx, act, actStoreSkuList); err == nil {
|
||||
retVal = []interface{}{actStoreSkuList}
|
||||
}
|
||||
return retVal, err
|
||||
@@ -162,7 +173,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
|
||||
}
|
||||
err = func() (err error) {
|
||||
if model.IsSyncStatusDelete(act.SyncStatus) {
|
||||
canceledList, err2 := cancelSkuAct(ctx, nil, actStoreSkuList)
|
||||
canceledList, err2 := cancelSkuAct(ctx, nil, act, actStoreSkuList)
|
||||
updateItems = append(updateItems, partner.ActStoreSku2Update(ctx, canceledList, model.SyncFlagModifiedMask)...)
|
||||
if err = err2; err == nil {
|
||||
updateItems = append(updateItems, partner.Act2Update(ctx, act, model.SyncFlagModifiedMask))
|
||||
@@ -183,7 +194,7 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
|
||||
}
|
||||
}
|
||||
if len(actStoreSkuList4Delete) > 0 {
|
||||
deletedList, err2 := cancelSkuAct(ctx, nil, actStoreSkuList4Delete)
|
||||
deletedList, err2 := cancelSkuAct(ctx, nil, act, actStoreSkuList4Delete)
|
||||
updateItems = append(updateItems, partner.ActStoreSku2Update(ctx, deletedList, model.SyncFlagDeletedMask)...)
|
||||
if err = err2; err != nil {
|
||||
return err
|
||||
|
||||
@@ -65,7 +65,7 @@ var (
|
||||
|
||||
fakeFinishedPickup: model.OrderStatusFinishedPickup,
|
||||
fakeOrderAdjustFinished: model.OrderStatusAdjust,
|
||||
fakeRefuseUserApplyCancel: model.OrderStatusUnlocked,
|
||||
fakeRefuseUserApplyCancel: model.OrderStatusVendorRejectCancel,
|
||||
fakeUserApplyCancel: model.OrderStatusApplyCancel,
|
||||
fakeUserUndoApplyCancel: model.OrderStatusUndoApplyCancel,
|
||||
fakeMerchantAgreeApplyCancel: model.OrderStatusCanceled,
|
||||
@@ -99,6 +99,14 @@ func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *
|
||||
return order, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
status, err = api.MtwmAPI.OrderViewStatus(utils.Str2Int64(vendorOrderID))
|
||||
if err == nil {
|
||||
status = p.getStatusFromVendorStatus(utils.Int2Str(status))
|
||||
}
|
||||
return status, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
||||
result := orderData
|
||||
vendorOrderID := utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"]))
|
||||
@@ -127,6 +135,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
||||
OrderCreatedAt: getTimeFromTimestamp(utils.MustInterface2Int64(result["ctime"])),
|
||||
OriginalData: string(utils.MustMarshal(result)),
|
||||
ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["total"])),
|
||||
BaseFreightMoney: jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["shipping_fee"], 0)),
|
||||
|
||||
InvoiceTitle: utils.Interface2String(result["invoice_title"]),
|
||||
InvoiceTaxerID: utils.Interface2String(result["taxpayer_id"]),
|
||||
@@ -746,3 +755,18 @@ func (p *PurchaseHandler) onNumberDowngrade(msg *mtwmapi.CallbackMsg) (response
|
||||
tasksch.HandleTask(task, nil, true).Run()
|
||||
return response
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (tipFee int64, err error) {
|
||||
orderInfo, err := api.MtwmAPI.GetDistributeOrderDetail(vendorOrderID, vendorStoreID)
|
||||
if err == nil {
|
||||
tipFee = jxutils.StandardPrice2Int(orderInfo.TipAmount)
|
||||
}
|
||||
return tipFee, err
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2, cityCode string, tipFee int64) (err error) {
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
err = api.MtwmAPI.OrderModityTips(vendorOrderID, vendorStoreID, jxutils.IntPrice2Standard(tipFee))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -18,6 +18,14 @@ func TestGetOrder(t *testing.T) {
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
func TestGetOrderStatus(t *testing.T) {
|
||||
result, err := CurPurchaseHandler.GetOrderStatus("", "71884881906304496")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(utils.Format4Output(result, false))
|
||||
}
|
||||
|
||||
func TestListOrders(t *testing.T) {
|
||||
result, err := CurPurchaseHandler.ListOrders(jxcontext.AdminCtx, "", nil, time.Now(), "4626746")
|
||||
if err != nil {
|
||||
|
||||
@@ -101,6 +101,7 @@ func (p *PurchaseHandler) CreateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error) {
|
||||
var name string
|
||||
if db == nil {
|
||||
db = dao.GetDB()
|
||||
}
|
||||
@@ -115,10 +116,16 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
return err
|
||||
}
|
||||
mergedStoreStatus := jxutils.MergeStoreStatus(storeDetail.Status, storeDetail.VendorStatus)
|
||||
name = remoteStoreInfo.Name
|
||||
if storeDetail.SyncStatus&(model.SyncFlagNewMask|model.SyncFlagStoreName) != 0 {
|
||||
if storeDetail.VendorStoreName != "" {
|
||||
name = storeDetail.VendorStoreName
|
||||
}
|
||||
}
|
||||
// openLevel, isOnline := bizStatusJX2Mtwm(mergedStoreStatus)
|
||||
params := map[string]interface{}{
|
||||
"name": remoteStoreInfo.Name, //jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM),
|
||||
"address": storeDetail.Address, // 美团好像地址也不能改的?
|
||||
"name": name, //jxutils.ComposeStoreName(storeDetail.Store.Name, model.VendorIDMTWM),
|
||||
"address": storeDetail.Address, // 美团好像地址也不能改的?
|
||||
"longitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Longitude)),
|
||||
"latitude": jxutils.IntCoordinate2Standard(int(remoteStoreInfo.Latitude)),
|
||||
"phone": storeDetail.Tel1,
|
||||
@@ -127,6 +134,7 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
"open_level": remoteStoreInfo.OpenLevel,
|
||||
"is_online": remoteStoreInfo.IsOnline,
|
||||
"third_tag_name": remoteStoreInfo.ThirdTagName,
|
||||
"promotion_info": storeDetail.PromoteInfo,
|
||||
}
|
||||
// globals.SugarLogger.Debug(utils.Format4Output(params, false))
|
||||
if globals.EnableMtwmStoreWrite {
|
||||
|
||||
@@ -44,7 +44,7 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
||||
case partner.FuncCreateStoreSkus:
|
||||
batchSize = 1 // 可考虑用批量操作
|
||||
case partner.FuncUpdateStoreSkus:
|
||||
batchSize = mtwmapi.MaxStoreSkuBatchSize
|
||||
batchSize = 1 // mtwmapi.MaxStoreSkuBatchSize
|
||||
case partner.FuncGetStoreSkusFullInfo:
|
||||
batchSize = 1
|
||||
}
|
||||
@@ -291,7 +291,9 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
skus[0]["price"] = foodData["price"]
|
||||
}
|
||||
skus[0]["stock"] = stockCount2Mtwm(model.MaxStoreSkuStockQty)
|
||||
skus[0]["upc"] = storeSku.Upc
|
||||
if storeSku.Upc != "" {
|
||||
skus[0]["upc"] = storeSku.Upc
|
||||
}
|
||||
if foodData["tag_id"] != nil {
|
||||
skus[0]["weight"] = storeSku.Weight // weight字段仅限服饰鞋帽、美妆、日用品、母婴、生鲜果蔬、生活超市下的便利店/超市门店品类的商家使用
|
||||
}
|
||||
@@ -432,7 +434,9 @@ func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTas
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
skuNameList = append(skuNameList, vendorSku2Jx(skuInfo))
|
||||
if skuName := vendorSku2Jx(skuInfo); skuName != nil {
|
||||
skuNameList = append(skuNameList, skuName)
|
||||
}
|
||||
} else {
|
||||
var storeSkuMap map[string]*partner.StoreSkuInfo
|
||||
if storeSkuList != nil {
|
||||
@@ -449,7 +453,9 @@ func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTas
|
||||
} else {
|
||||
for _, v := range result {
|
||||
if storeSkuMap[v.AppFoodCode] != nil {
|
||||
skuNameList = append(skuNameList, vendorSku2Jx(v))
|
||||
if skuName := vendorSku2Jx(v); skuName != nil {
|
||||
skuNameList = append(skuNameList, skuName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -462,6 +468,10 @@ func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTas
|
||||
}
|
||||
|
||||
func vendorSku2Jx(appFood *mtwmapi.AppFood) (skuName *partner.SkuNameInfo) {
|
||||
if len(appFood.SkuList) == 0 {
|
||||
globals.SugarLogger.Warnf("vendorSku2Jx, strange appFood:%s", utils.Format4Output(appFood, true))
|
||||
return nil
|
||||
}
|
||||
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(appFood.Name)
|
||||
vendorSku := appFood.SkuList[0]
|
||||
weight := int(utils.Str2Int64WithDefault(vendorSku.Weight, 0))
|
||||
@@ -507,7 +517,9 @@ func vendorSku2Jx(appFood *mtwmapi.AppFood) (skuName *partner.SkuNameInfo) {
|
||||
|
||||
func vendorSkuList2Jx(appFoodList []*mtwmapi.AppFood) (skuNameList []*partner.SkuNameInfo) {
|
||||
for _, appFood := range appFoodList {
|
||||
skuNameList = append(skuNameList, vendorSku2Jx(appFood))
|
||||
if skuName := vendorSku2Jx(appFood); skuName != nil {
|
||||
skuNameList = append(skuNameList, skuName)
|
||||
}
|
||||
}
|
||||
return skuNameList
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package wsc
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/platformapi/weimobapi"
|
||||
@@ -108,6 +109,10 @@ func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *
|
||||
return order, err
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||
return 0, fmt.Errorf("未实现")
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
||||
result := orderData
|
||||
vendorOrderID := utils.Int64ToStr(utils.MustInterface2Int64(result["orderNo"]))
|
||||
|
||||
Reference in New Issue
Block a user