整理京西自有PHP商城相关的代码
This commit is contained in:
@@ -285,3 +285,13 @@ func IsOrderDeliveryByStore(order *GoodsOrder) bool {
|
|||||||
func IsOrderDeliveryByPlatform(order *GoodsOrder) bool {
|
func IsOrderDeliveryByPlatform(order *GoodsOrder) bool {
|
||||||
return order.DeliveryType == OrderDeliveryTypePlatform
|
return order.DeliveryType == OrderDeliveryTypePlatform
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsOrderJXTemp(order *GoodsOrder) bool {
|
||||||
|
// return order.Flag&OrderFlagMaskTempJX != 0
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsAfsOrderJXTemp(order *AfsOrder) bool {
|
||||||
|
// return order.Flag&OrderFlagMaskTempJX != 0
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,79 +3,13 @@ package jx
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"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/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Data4Neworder struct {
|
|
||||||
model.GoodsOrder
|
|
||||||
Skus []*model.OrderSku `json:"skus"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) OnOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
|
||||||
jxutils.CallMsgHandler(func() {
|
|
||||||
retVal, errCode, err = c.onOrderMsg(msg)
|
|
||||||
}, jxutils.ComposeUniversalOrderID(msg.ThingID, c.GetVendorID()))
|
|
||||||
return retVal, errCode, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) onOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
|
||||||
subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0))
|
|
||||||
if subMsgType == model.OrderStatusNew || subMsgType == model.OrderStatusAdjust {
|
|
||||||
var order *Data4Neworder
|
|
||||||
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &order); err == nil {
|
|
||||||
if order.VendorStatus == "" {
|
|
||||||
order.VendorStatus = utils.Int2Str(order.Status)
|
|
||||||
}
|
|
||||||
retVal, errCode, err = c.onOrderNew(msg, subMsgType, order)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
status := c.callbackMsg2Status(msg)
|
|
||||||
err = partner.CurOrderManager.OnOrderStatusChanged(status)
|
|
||||||
}
|
|
||||||
return retVal, errCode, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
|
||||||
orderStatus := &model.OrderStatus{
|
|
||||||
VendorOrderID: msg.ThingID,
|
|
||||||
VendorID: model.VendorIDJX,
|
|
||||||
OrderType: model.OrderTypeOrder,
|
|
||||||
RefVendorOrderID: msg.ThingID,
|
|
||||||
RefVendorID: model.VendorIDJX,
|
|
||||||
VendorStatus: msg.SubMsgType,
|
|
||||||
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
|
||||||
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
|
||||||
Remark: "",
|
|
||||||
}
|
|
||||||
return orderStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) {
|
|
||||||
globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID)
|
|
||||||
order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0))
|
|
||||||
order.DeliveryType = model.OrderDeliveryTypeStoreSelf
|
|
||||||
order.GoodsOrder.Skus = order.Skus
|
|
||||||
order.VendorID = model.VendorIDJX
|
|
||||||
order.Flag = model.OrderFlagMaskTempJX
|
|
||||||
for _, v := range order.GoodsOrder.Skus {
|
|
||||||
v.SkuID = int(utils.Str2Int64WithDefault(v.VendorSkuID, 0))
|
|
||||||
}
|
|
||||||
jxutils.RefreshOrderSkuRelated(&order.GoodsOrder)
|
|
||||||
orderStatus := model.Order2Status(&order.GoodsOrder)
|
|
||||||
if subMsgType == model.OrderStatusNew {
|
|
||||||
err = partner.CurOrderManager.OnOrderNew(&order.GoodsOrder, orderStatus)
|
|
||||||
} else if subMsgType == model.OrderStatusAdjust {
|
|
||||||
err = partner.CurOrderManager.OnOrderAdjust(&order.GoodsOrder, orderStatus)
|
|
||||||
}
|
|
||||||
return retVal, errCode, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
|
||||||
return order
|
return order
|
||||||
}
|
}
|
||||||
@@ -91,12 +25,16 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
|
|||||||
} else {
|
} else {
|
||||||
status = model.OrderStatusCanceled
|
status = model.OrderStatusCanceled
|
||||||
}
|
}
|
||||||
err = c.notifyOrderStatusChanged(order, status)
|
if model.IsOrderJXTemp(order) {
|
||||||
|
err = phpjx.NotifyOrderStatusChanged(order, status)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||||
err = c.notifyOrderStatusChanged(order, model.OrderStatusFinishedPickup)
|
if model.IsOrderJXTemp(order) {
|
||||||
|
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinishedPickup)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,13 +59,16 @@ func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
|
func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
|
||||||
err = c.notifyOrderStatusChanged(order, model.OrderStatusDelivering)
|
if model.IsOrderJXTemp(order) {
|
||||||
|
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusDelivering)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 京东送达接口都是一样的
|
|
||||||
func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
|
func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
|
||||||
err = c.notifyOrderStatusChanged(order, model.OrderStatusFinished)
|
if model.IsOrderJXTemp(order) {
|
||||||
|
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinished)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,7 +81,9 @@ func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *mod
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||||
err = c.notifyOrderStatusChanged(order, model.OrderStatusCanceled)
|
if model.IsOrderJXTemp(order) {
|
||||||
|
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusCanceled)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,16 +106,9 @@ func (c *PurchaseHandler) AddWaybillTip(ctx *jxcontext.Context, order *model.Goo
|
|||||||
func (c *PurchaseHandler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID, selfTakeCode string) (err error) {
|
func (c *PurchaseHandler) ConfirmSelfTake(ctx *jxcontext.Context, vendorOrderID, selfTakeCode string) (err error) {
|
||||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
|
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = c.notifyOrderStatusChanged(order, model.OrderStatusFinished)
|
if model.IsOrderJXTemp(order) {
|
||||||
}
|
err = phpjx.NotifyOrderStatusChanged(order, model.OrderStatusFinished)
|
||||||
return err
|
}
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) notifyOrderStatusChanged(order *model.GoodsOrder, status int) (err error) {
|
|
||||||
orderMsg := *order
|
|
||||||
orderMsg.Status = status
|
|
||||||
if err = jxAPI.NotifyOrderStatusChanged(&orderMsg); err == nil {
|
|
||||||
c.postFakeMsg(orderMsg.VendorOrderID, orderMsg.Status)
|
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,134 +2,13 @@ package jx
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
|
||||||
|
|
||||||
"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/jxutils/jxcontext"
|
"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"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Data4AfsOrderSku struct {
|
|
||||||
VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"` // 平台skuid
|
|
||||||
PromotionType int `json:"promotionType"` // 商品级别促销类型 (1、无优惠;2、秒杀(已经下线);3、单品直降;4、限时抢购;1202、加价购;1203、满赠(标识商品);6、买赠(买A送B,标识B);9999、表示一个普通商品参与捆绑促销,设置的捆绑类型;9998、表示一个商品参与了捆绑促销,并且还参与了其他促销类型;9997、表示一个商品参与了捆绑促销,但是金额拆分不尽,9996:组合购,8001:轻松购会员价,8:第二件N折,9:拼团促销)
|
|
||||||
Name string `orm:"size(255)" json:"name"` // 商品名
|
|
||||||
SalePrice int64 `json:"salePrice"` // 售卖价
|
|
||||||
Count int `json:"count"` // 订单下单数量
|
|
||||||
}
|
|
||||||
|
|
||||||
type Data4AfsOrder struct {
|
|
||||||
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` // 关联原始订单ID
|
|
||||||
AfsOrderID string `orm:"column(afs_order_id);size(48)" json:"afsOrderID"` // 售后订单ID
|
|
||||||
AfsCreatedAt time.Time `orm:"type(datetime);null;index" json:"afsCreatedAt"` // 售后单生成时间
|
|
||||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` // 外部系统里记录的storeid
|
|
||||||
|
|
||||||
VendorStatus string `orm:"size(255)" json:"vendorStatus"`
|
|
||||||
VendorReasonType string `orm:"size(255)" json:"vendorReasonType"` // 原始售后原因
|
|
||||||
ReasonDesc string `orm:"size(1024)" json:"reasonDesc"` // 售后原因描述
|
|
||||||
ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片
|
|
||||||
VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式
|
|
||||||
Skus []*Data4AfsOrderSku
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) OnAfsOrderMsg(msg *CallbackMsg) (err error) {
|
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
|
||||||
err = c.onAfsOrderMsg(msg)
|
|
||||||
}, jxutils.ComposeUniversalOrderID(msg.ThingID, c.GetVendorID()))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) {
|
|
||||||
var afsOrder *Data4AfsOrder
|
|
||||||
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil {
|
|
||||||
outAfsOrder = &model.AfsOrder{
|
|
||||||
VendorID: model.VendorIDJX,
|
|
||||||
AfsOrderID: afsOrder.AfsOrderID,
|
|
||||||
VendorOrderID: afsOrder.VendorOrderID,
|
|
||||||
VendorStoreID: afsOrder.VendorStoreID,
|
|
||||||
StoreID: int(utils.Str2Int64WithDefault(afsOrder.VendorStoreID, 0)),
|
|
||||||
AfsCreatedAt: afsOrder.AfsCreatedAt,
|
|
||||||
|
|
||||||
VendorStatus: afsOrder.VendorStatus,
|
|
||||||
VendorReasonType: afsOrder.VendorReasonType,
|
|
||||||
ReasonType: int8(utils.Str2Int64WithDefault(afsOrder.VendorReasonType, 0)),
|
|
||||||
ReasonDesc: utils.LimitUTF8StringLen(afsOrder.ReasonDesc, 1024),
|
|
||||||
ReasonImgList: afsOrder.ReasonImgList,
|
|
||||||
VendorAppealType: afsOrder.VendorAppealType,
|
|
||||||
AppealType: int8(utils.Str2Int64WithDefault(afsOrder.VendorAppealType, 0)),
|
|
||||||
}
|
|
||||||
outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0))
|
|
||||||
|
|
||||||
for _, x := range afsOrder.Skus {
|
|
||||||
orderSku := &model.OrderSkuFinancial{
|
|
||||||
Count: x.Count,
|
|
||||||
VendorSkuID: x.VendorSkuID,
|
|
||||||
SkuID: int(utils.Str2Int64WithDefault(x.VendorSkuID, 0)),
|
|
||||||
Name: x.Name,
|
|
||||||
}
|
|
||||||
if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal {
|
|
||||||
orderSku.StoreSubName = utils.Int2Str(x.PromotionType)
|
|
||||||
}
|
|
||||||
outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return outAfsOrder, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
|
||||||
orderStatus := &model.OrderStatus{
|
|
||||||
VendorOrderID: msg.ThingID2, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中
|
|
||||||
VendorID: model.VendorIDJX,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: msg.ThingID,
|
|
||||||
RefVendorID: model.VendorIDJX,
|
|
||||||
VendorStatus: msg.SubMsgType,
|
|
||||||
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
|
||||||
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
|
||||||
Remark: "",
|
|
||||||
}
|
|
||||||
return orderStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) onAfsOrderMsg(msg *CallbackMsg) (err error) {
|
|
||||||
subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0))
|
|
||||||
status := c.callbackAfsMsg2Status(msg)
|
|
||||||
if subMsgType == model.AfsOrderStatusWait4Approve || subMsgType == model.AfsOrderStatusNew {
|
|
||||||
afsOrder, err2 := c.buildAfsOrder(msg)
|
|
||||||
if err = err2; err == nil {
|
|
||||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, status)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = partner.CurOrderManager.OnOrderStatusChanged(status)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PurchaseHandler) postFakeAfsMsg(orderNo, afsOrderID string, status int) {
|
|
||||||
msg := &CallbackMsg{
|
|
||||||
AppKey: appKey,
|
|
||||||
MsgType: MsgTypeAfsOrder,
|
|
||||||
SubMsgType: utils.Int2Str(status),
|
|
||||||
ThingID: orderNo,
|
|
||||||
ThingID2: afsOrderID,
|
|
||||||
Timestamp: time.Now().Unix(),
|
|
||||||
}
|
|
||||||
utils.CallFuncAsync(func() {
|
|
||||||
OnCallbackMsg(msg)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) notifyAfsOrderStatusChanged(order *model.AfsOrder, status int) (err error) {
|
|
||||||
orderMsg := *order
|
|
||||||
orderMsg.Status = status
|
|
||||||
if err = jxAPI.NotifyAfsOrderStatusChanged(&orderMsg); err == nil {
|
|
||||||
c.postFakeAfsMsg(orderMsg.VendorOrderID, orderMsg.AfsOrderID, orderMsg.Status)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 审核售后单申请
|
// 审核售后单申请
|
||||||
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
|
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
|
||||||
var status int
|
var status int
|
||||||
@@ -138,7 +17,10 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
|
|||||||
} else {
|
} else {
|
||||||
status = model.AfsOrderStatusFinished
|
status = model.AfsOrderStatusFinished
|
||||||
}
|
}
|
||||||
return c.notifyAfsOrderStatusChanged(order, status)
|
if model.IsAfsOrderJXTemp(order) {
|
||||||
|
err = phpjx.NotifyAfsOrderStatusChanged(order, status)
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 确认收到退货
|
// 确认收到退货
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package jx
|
package phpjx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -34,14 +34,14 @@ func OnCallbackMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
|||||||
return retVal, errCode, fmt.Errorf("无效的AppKey:%s", msg.AppKey)
|
return retVal, errCode, fmt.Errorf("无效的AppKey:%s", msg.AppKey)
|
||||||
}
|
}
|
||||||
if msg.MsgType == MsgTypeOrder {
|
if msg.MsgType == MsgTypeOrder {
|
||||||
retVal, errCode, err = CurPurchaseHandler.OnOrderMsg(msg)
|
retVal, errCode, err = OnOrderMsg(msg)
|
||||||
} else if msg.MsgType == MsgTypeAfsOrder {
|
} else if msg.MsgType == MsgTypeAfsOrder {
|
||||||
err = CurPurchaseHandler.OnAfsOrderMsg(msg)
|
err = OnAfsOrderMsg(msg)
|
||||||
}
|
}
|
||||||
return retVal, errCode, err
|
return retVal, errCode, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) postFakeMsg(orderNo string, status int) {
|
func postFakeMsg(orderNo string, status int) {
|
||||||
msg := &CallbackMsg{
|
msg := &CallbackMsg{
|
||||||
AppKey: appKey,
|
AppKey: appKey,
|
||||||
MsgType: MsgTypeOrder,
|
MsgType: MsgTypeOrder,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package jx
|
package phpjx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package jx
|
package phpjx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package jx
|
package phpjx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
@@ -42,3 +42,4 @@ func (a *API) NotifyAfsOrderStatusChanged(afsOrder *model.AfsOrder) (err error)
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package jx
|
package phpjx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
82
business/partner/purchase/jx/phpjx/order.go
Normal file
82
business/partner/purchase/jx/phpjx/order.go
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package phpjx
|
||||||
|
|
||||||
|
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/business/partner"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NotifyOrderStatusChanged(order *model.GoodsOrder, status int) (err error) {
|
||||||
|
orderMsg := *order
|
||||||
|
orderMsg.Status = status
|
||||||
|
if err = jxAPI.NotifyOrderStatusChanged(&orderMsg); err == nil {
|
||||||
|
postFakeMsg(orderMsg.VendorOrderID, orderMsg.Status)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type Data4Neworder struct {
|
||||||
|
model.GoodsOrder
|
||||||
|
Skus []*model.OrderSku `json:"skus"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func OnOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
||||||
|
jxutils.CallMsgHandler(func() {
|
||||||
|
retVal, errCode, err = onOrderMsg(msg)
|
||||||
|
}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX))
|
||||||
|
return retVal, errCode, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func onOrderMsg(msg *CallbackMsg) (retVal, errCode string, err error) {
|
||||||
|
subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0))
|
||||||
|
if subMsgType == model.OrderStatusNew || subMsgType == model.OrderStatusAdjust {
|
||||||
|
var order *Data4Neworder
|
||||||
|
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &order); err == nil {
|
||||||
|
if order.VendorStatus == "" {
|
||||||
|
order.VendorStatus = utils.Int2Str(order.Status)
|
||||||
|
}
|
||||||
|
retVal, errCode, err = onOrderNew(msg, subMsgType, order)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
status := callbackMsg2Status(msg)
|
||||||
|
err = partner.CurOrderManager.OnOrderStatusChanged(status)
|
||||||
|
}
|
||||||
|
return retVal, errCode, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
||||||
|
orderStatus := &model.OrderStatus{
|
||||||
|
VendorOrderID: msg.ThingID,
|
||||||
|
VendorID: model.VendorIDJX,
|
||||||
|
OrderType: model.OrderTypeOrder,
|
||||||
|
RefVendorOrderID: msg.ThingID,
|
||||||
|
RefVendorID: model.VendorIDJX,
|
||||||
|
VendorStatus: msg.SubMsgType,
|
||||||
|
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
||||||
|
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
||||||
|
Remark: "",
|
||||||
|
}
|
||||||
|
return orderStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
func onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) {
|
||||||
|
globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID)
|
||||||
|
order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0))
|
||||||
|
order.DeliveryType = model.OrderDeliveryTypeStoreSelf
|
||||||
|
order.GoodsOrder.Skus = order.Skus
|
||||||
|
order.VendorID = model.VendorIDJX
|
||||||
|
order.Flag = model.OrderFlagMaskTempJX
|
||||||
|
for _, v := range order.GoodsOrder.Skus {
|
||||||
|
v.SkuID = int(utils.Str2Int64WithDefault(v.VendorSkuID, 0))
|
||||||
|
}
|
||||||
|
jxutils.RefreshOrderSkuRelated(&order.GoodsOrder)
|
||||||
|
orderStatus := model.Order2Status(&order.GoodsOrder)
|
||||||
|
if subMsgType == model.OrderStatusNew {
|
||||||
|
err = partner.CurOrderManager.OnOrderNew(&order.GoodsOrder, orderStatus)
|
||||||
|
} else if subMsgType == model.OrderStatusAdjust {
|
||||||
|
err = partner.CurOrderManager.OnOrderAdjust(&order.GoodsOrder, orderStatus)
|
||||||
|
}
|
||||||
|
return retVal, errCode, err
|
||||||
|
}
|
||||||
130
business/partner/purchase/jx/phpjx/order_afs.go
Normal file
130
business/partner/purchase/jx/phpjx/order_afs.go
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
package phpjx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"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/partner"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Data4AfsOrderSku struct {
|
||||||
|
VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"` // 平台skuid
|
||||||
|
PromotionType int `json:"promotionType"` // 商品级别促销类型 (1、无优惠;2、秒杀(已经下线);3、单品直降;4、限时抢购;1202、加价购;1203、满赠(标识商品);6、买赠(买A送B,标识B);9999、表示一个普通商品参与捆绑促销,设置的捆绑类型;9998、表示一个商品参与了捆绑促销,并且还参与了其他促销类型;9997、表示一个商品参与了捆绑促销,但是金额拆分不尽,9996:组合购,8001:轻松购会员价,8:第二件N折,9:拼团促销)
|
||||||
|
Name string `orm:"size(255)" json:"name"` // 商品名
|
||||||
|
SalePrice int64 `json:"salePrice"` // 售卖价
|
||||||
|
Count int `json:"count"` // 订单下单数量
|
||||||
|
}
|
||||||
|
|
||||||
|
type Data4AfsOrder struct {
|
||||||
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` // 关联原始订单ID
|
||||||
|
AfsOrderID string `orm:"column(afs_order_id);size(48)" json:"afsOrderID"` // 售后订单ID
|
||||||
|
AfsCreatedAt time.Time `orm:"type(datetime);null;index" json:"afsCreatedAt"` // 售后单生成时间
|
||||||
|
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` // 外部系统里记录的storeid
|
||||||
|
|
||||||
|
VendorStatus string `orm:"size(255)" json:"vendorStatus"`
|
||||||
|
VendorReasonType string `orm:"size(255)" json:"vendorReasonType"` // 原始售后原因
|
||||||
|
ReasonDesc string `orm:"size(1024)" json:"reasonDesc"` // 售后原因描述
|
||||||
|
ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片
|
||||||
|
VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式
|
||||||
|
Skus []*Data4AfsOrderSku
|
||||||
|
}
|
||||||
|
|
||||||
|
func OnAfsOrderMsg(msg *CallbackMsg) (err error) {
|
||||||
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
err = onAfsOrderMsg(msg)
|
||||||
|
}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) {
|
||||||
|
var afsOrder *Data4AfsOrder
|
||||||
|
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil {
|
||||||
|
outAfsOrder = &model.AfsOrder{
|
||||||
|
VendorID: model.VendorIDJX,
|
||||||
|
AfsOrderID: afsOrder.AfsOrderID,
|
||||||
|
VendorOrderID: afsOrder.VendorOrderID,
|
||||||
|
VendorStoreID: afsOrder.VendorStoreID,
|
||||||
|
StoreID: int(utils.Str2Int64WithDefault(afsOrder.VendorStoreID, 0)),
|
||||||
|
AfsCreatedAt: afsOrder.AfsCreatedAt,
|
||||||
|
|
||||||
|
VendorStatus: afsOrder.VendorStatus,
|
||||||
|
VendorReasonType: afsOrder.VendorReasonType,
|
||||||
|
ReasonType: int8(utils.Str2Int64WithDefault(afsOrder.VendorReasonType, 0)),
|
||||||
|
ReasonDesc: utils.LimitUTF8StringLen(afsOrder.ReasonDesc, 1024),
|
||||||
|
ReasonImgList: afsOrder.ReasonImgList,
|
||||||
|
VendorAppealType: afsOrder.VendorAppealType,
|
||||||
|
AppealType: int8(utils.Str2Int64WithDefault(afsOrder.VendorAppealType, 0)),
|
||||||
|
Flag: model.OrderFlagMaskTempJX,
|
||||||
|
}
|
||||||
|
outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0))
|
||||||
|
|
||||||
|
for _, x := range afsOrder.Skus {
|
||||||
|
orderSku := &model.OrderSkuFinancial{
|
||||||
|
Count: x.Count,
|
||||||
|
VendorSkuID: x.VendorSkuID,
|
||||||
|
SkuID: int(utils.Str2Int64WithDefault(x.VendorSkuID, 0)),
|
||||||
|
Name: x.Name,
|
||||||
|
}
|
||||||
|
if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal {
|
||||||
|
orderSku.StoreSubName = utils.Int2Str(x.PromotionType)
|
||||||
|
}
|
||||||
|
outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return outAfsOrder, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
||||||
|
orderStatus := &model.OrderStatus{
|
||||||
|
VendorOrderID: msg.ThingID2, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中
|
||||||
|
VendorID: model.VendorIDJX,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: msg.ThingID,
|
||||||
|
RefVendorID: model.VendorIDJX,
|
||||||
|
VendorStatus: msg.SubMsgType,
|
||||||
|
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
||||||
|
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
||||||
|
Remark: "",
|
||||||
|
}
|
||||||
|
return orderStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
func onAfsOrderMsg(msg *CallbackMsg) (err error) {
|
||||||
|
subMsgType := int(utils.Str2Int64WithDefault(msg.SubMsgType, 0))
|
||||||
|
status := callbackAfsMsg2Status(msg)
|
||||||
|
if subMsgType == model.AfsOrderStatusWait4Approve || subMsgType == model.AfsOrderStatusNew {
|
||||||
|
afsOrder, err2 := buildAfsOrder(msg)
|
||||||
|
if err = err2; err == nil {
|
||||||
|
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, status)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = partner.CurOrderManager.OnOrderStatusChanged(status)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func postFakeAfsMsg(orderNo, afsOrderID string, status int) {
|
||||||
|
msg := &CallbackMsg{
|
||||||
|
AppKey: appKey,
|
||||||
|
MsgType: MsgTypeAfsOrder,
|
||||||
|
SubMsgType: utils.Int2Str(status),
|
||||||
|
ThingID: orderNo,
|
||||||
|
ThingID2: afsOrderID,
|
||||||
|
Timestamp: time.Now().Unix(),
|
||||||
|
}
|
||||||
|
utils.CallFuncAsync(func() {
|
||||||
|
OnCallbackMsg(msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyAfsOrderStatusChanged(order *model.AfsOrder, status int) (err error) {
|
||||||
|
orderMsg := *order
|
||||||
|
orderMsg.Status = status
|
||||||
|
if err = jxAPI.NotifyAfsOrderStatusChanged(&orderMsg); err == nil {
|
||||||
|
postFakeAfsMsg(orderMsg.VendorOrderID, orderMsg.AfsOrderID, orderMsg.Status)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx"
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/phpjx"
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ type JxShopController struct {
|
|||||||
// @router /JxMsg [post]
|
// @router /JxMsg [post]
|
||||||
func (c *JxShopController) JxMsg(msgType string) {
|
func (c *JxShopController) JxMsg(msgType string) {
|
||||||
c.callJxMsg(func(params *tJxshopJxMsgParams) (retVal interface{}, errCode string, err error) {
|
c.callJxMsg(func(params *tJxshopJxMsgParams) (retVal interface{}, errCode string, err error) {
|
||||||
retVal, errCode, err = jx.OnCallbackMsg(&jx.CallbackMsg{
|
retVal, errCode, err = phpjx.OnCallbackMsg(&phpjx.CallbackMsg{
|
||||||
AppKey: params.AppKey,
|
AppKey: params.AppKey,
|
||||||
MsgType: params.MsgType,
|
MsgType: params.MsgType,
|
||||||
SubMsgType: params.SubMsgType,
|
SubMsgType: params.SubMsgType,
|
||||||
|
|||||||
Reference in New Issue
Block a user