1
This commit is contained in:
@@ -158,5 +158,36 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) {
|
||||
return nil
|
||||
selfStatus := 0
|
||||
switch param["logistics_status"].(int) {
|
||||
case 0:
|
||||
selfStatus = 2 // 2:配送待分配
|
||||
case 12:
|
||||
selfStatus = 3 // 骑士接单
|
||||
case 15:
|
||||
selfStatus = 8 // 骑士到店
|
||||
case 20:
|
||||
selfStatus = 20 // 骑手送出
|
||||
case 40:
|
||||
selfStatus = 30 // 配送完成
|
||||
default:
|
||||
selfStatus = 7 // 配送异常
|
||||
}
|
||||
param2 := &ebaiapi.PushRiderInfo{
|
||||
DistributorId: 201,
|
||||
OrderId: param["order_id"].(string),
|
||||
State: 21,
|
||||
SelfStatus: selfStatus,
|
||||
SelfStatusDesc: param["logistics_context"].(string),
|
||||
DistributorInfoDTO: ebaiapi.DistributorInfoDTO{
|
||||
DistributorTypeId: "99999",
|
||||
DistributorName: "商家自行配送",
|
||||
},
|
||||
Knight: ebaiapi.Knight{
|
||||
Id: utils.Str2Int64(param["order_id"].(string)),
|
||||
Name: param["courier_name"].(string),
|
||||
Phone: param["courier_phone"].(string),
|
||||
},
|
||||
}
|
||||
return api.EbaiAPI.OrderselfDeliveryStateSync2(param2)
|
||||
}
|
||||
|
||||
@@ -522,6 +522,9 @@ func (c *PurchaseHandler) onOrderNew(msg *ebaiapi.CallbackMsg, orderStatus *mode
|
||||
})
|
||||
}
|
||||
}
|
||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDEBAI); handler != nil {
|
||||
handler.AcceptOrRefuseOrder(order, true, "jxAdmin")
|
||||
}
|
||||
return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, map[string]interface{}{
|
||||
"source_order_id": vendorOrderID,
|
||||
})
|
||||
|
||||
@@ -270,7 +270,6 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin
|
||||
if err == nil {
|
||||
if shopID > 0 {
|
||||
err = p.UpdateStoreCustomID(jxcontext.AdminCtx, "", store.VendorStoreID, int64(shopID))
|
||||
globals.SugarLogger.Debugf("UpdateStore store.VendorStoreID====%s,shopID====%s", store.VendorStoreID, shopID)
|
||||
} else if shopID == 0 {
|
||||
// todo remove out shop id
|
||||
}
|
||||
@@ -346,7 +345,6 @@ func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask
|
||||
fBaiduIDs, fShopIDs, err1 := FilterStoreRel(baiduShopIDs)
|
||||
globals.SugarLogger.Debugf("RefreshAllStoresID FilterStoreRel fBaiduIDs====%d fShopIDs====%d err====%v", fBaiduIDs, fShopIDs, err1)
|
||||
err = api.EbaiAPI.ShopIDBatchUpdate(fBaiduIDs, fShopIDs)
|
||||
globals.SugarLogger.Debugf("RefreshAllStoresID baiduShopIDs====%s,shopIDs====%s", baiduShopIDs, shopIDs)
|
||||
}
|
||||
return nil, err
|
||||
}, stores)
|
||||
@@ -373,7 +371,6 @@ func FilterStoreRel(baiduShopIDs []string) (fBaiduShopIDs []string, fShopIDs []s
|
||||
return nil, nil, err
|
||||
}
|
||||
localRel, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), k, model.VendorIDEBAI, "")
|
||||
globals.SugarLogger.Debugf("get localRel err===%v", err)
|
||||
if remoteRel.ShopID != utils.Int2Str(localRel.ID) {
|
||||
fBaiduShopIDs = append(fBaiduShopIDs, k)
|
||||
fShopIDs = append(fShopIDs, utils.Int2Str(localRel.ID))
|
||||
@@ -673,7 +670,6 @@ func (c *PurchaseHandler) UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgC
|
||||
if err1 != nil {
|
||||
globals.SugarLogger.Debugf("UpdateStoreCustomID err1====%v", err1)
|
||||
}
|
||||
globals.SugarLogger.Debugf("UpdateStoreCustomID fBaiduIDs====%s fShopIDs====%d err1", fBaiduIDs, fShopIDs)
|
||||
err = api.EbaiAPI.ShopIDBatchUpdate(fBaiduIDs, fShopIDs)
|
||||
//err = api.EbaiAPI.ShopIDBatchUpdate([]string{vendorStoreID}, []string{utils.Int64ToStr(storeID)})
|
||||
}
|
||||
|
||||
@@ -515,6 +515,9 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate, isE
|
||||
if storeSku.MinOrderCount > 0 {
|
||||
params["minimum"] = utils.Int2Float64(storeSku.MinOrderCount)
|
||||
}
|
||||
if storeSku.MinOrderCount == 0 {
|
||||
params["minimum"] = utils.Int2Float64(1)
|
||||
}
|
||||
return params
|
||||
}
|
||||
|
||||
|
||||
@@ -108,10 +108,6 @@ func (p *PurchaseHandler) DeleteCategory2(ctx *jxcontext.Context, vendorOrgCode,
|
||||
func (p *PurchaseHandler) ReorderCategories2(ctx *jxcontext.Context, vendorOrgCode, vendorParentCatID string, vendorCatIDList []string) (err error) {
|
||||
if globals.EnableJdStoreWrite {
|
||||
err = getAPI(vendorOrgCode).ChangeShopCategoryOrder(utils.Str2Int64WithDefault(vendorParentCatID, 0), utils.StringSlice2Int64(vendorCatIDList))
|
||||
globals.SugarLogger.Debugf("vendorInfo.vendorOrgCode=== %s", vendorOrgCode)
|
||||
globals.SugarLogger.Debugf("vendorInfo.vendorParentCatID=== %s", vendorParentCatID)
|
||||
globals.SugarLogger.Debugf("vendorInfo.vendorCatIDList=== %s", vendorCatIDList)
|
||||
globals.SugarLogger.Debugf("ReorderCategories2 === %v", err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -297,7 +297,6 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
}
|
||||
|
||||
func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||
globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "UpdateStoreSkus")
|
||||
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
if vendorStoreID == model.JdShopMainVendorStoreID {
|
||||
for _, v := range storeSkuList {
|
||||
|
||||
191
business/partner/purchase/jx/localjx/kuaishou_pay.go
Normal file
191
business/partner/purchase/jx/localjx/kuaishou_pay.go
Normal file
@@ -0,0 +1,191 @@
|
||||
package localjx
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/platformapi/kuaishou_mini"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/kuaishou"
|
||||
"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/globals"
|
||||
"git.rosy.net.cn/jx-callback/globals/api"
|
||||
)
|
||||
|
||||
func getOrderBriefKs(order *model.GoodsOrder) string {
|
||||
sku := make([]string, len(order.Skus))
|
||||
for _, v := range order.Skus {
|
||||
sku = append(sku, fmt.Sprintf("%s x %d件商品", v.SkuName, v.Count))
|
||||
}
|
||||
return strings.Join(sku, ",")
|
||||
}
|
||||
|
||||
func pay4OrderByKs(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayType, subAppID string) (orderPay *model.OrderPay, err error) {
|
||||
// 获取用户快手OpenId
|
||||
var (
|
||||
db = dao.GetDB()
|
||||
)
|
||||
authBindList, err := dao.GetUserBindAuthInfo(db, ctx.GetUserID(), model.AuthBindTypeAuth, []string{kuaishou.AuthTypeKuaiShouMini}, "", "", nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(authBindList) == model.NO {
|
||||
return nil, errors.New("用户未绑定快手,无法快手支付")
|
||||
}
|
||||
|
||||
param := &kuaishou_mini.PreCreateOrderReq{
|
||||
OutOrderNo: utils.Int64ToStr(GenPayOrderID(order)),
|
||||
OpenId: authBindList[0].AuthID,
|
||||
TotalAmount: order.ActualPayPrice,
|
||||
Subject: "蔬菜水果日用品",
|
||||
Detail: getOrderBriefKs(order),
|
||||
TypeDetail: 1832, // 蔬菜:费率2%,水果:1833%2
|
||||
ExpireTime: 60 * 10,
|
||||
Sign: "",
|
||||
Attach: "",
|
||||
NotifyUrl: "http://callback.jxc4.com/kuaishou/KuaiShouCallback",
|
||||
GoodsId: "",
|
||||
GoodsDetailUrl: "",
|
||||
MultiCopiesGoodsInfo: "",
|
||||
CancelOrder: 0,
|
||||
}
|
||||
|
||||
// 预下单
|
||||
prePayInfo, err := api.KuaiShouApi.PreCreateOrder(param)
|
||||
if err == nil {
|
||||
orderPay = &model.OrderPay{
|
||||
PayOrderID: order.VendorOrderID, // 抖音订单id
|
||||
PayType: model.PayTypeKuaiShou,
|
||||
VendorPayType: vendorPayType,
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
VendorID: order.VendorID,
|
||||
Status: 0,
|
||||
PayCreatedAt: time.Now(),
|
||||
PrepayID: "",
|
||||
CodeURL: prePayInfo, // 抖音支付token
|
||||
TotalFee: int(order.ActualPayPrice),
|
||||
}
|
||||
}
|
||||
return orderPay, err
|
||||
}
|
||||
|
||||
func OnKSPayCallback(msg *kuaishou_mini.CallBackDetail, refund *kuaishou_mini.RefundCallBack, payType string) (err error) {
|
||||
switch payType {
|
||||
case kuaishou_mini.CallbackTypePay: // 支付回调
|
||||
err = onKSPayFinished(msg)
|
||||
case kuaishou_mini.CallbackTypeRefund: // 退款回调
|
||||
err = onKSPayRefund(refund)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func onKSPayFinished(msg *kuaishou_mini.CallBackDetail) (err error) {
|
||||
orderPay := &model.OrderPay{
|
||||
PayOrderID: msg.OutOrderNo,
|
||||
PayType: model.PayTypeTicTok,
|
||||
}
|
||||
orderPay.DeletedAt = utils.DefaultTimeValue
|
||||
db := dao.GetDB()
|
||||
if err = dao.GetEntity(db, orderPay, "PayOrderID", "PayType", "DeletedAt"); err == nil {
|
||||
orderPay.PayFinishedAt = utils.Time2Pointer(time.Now())
|
||||
orderPay.TransactionID = msg.TradeNo
|
||||
orderPay.OriginalData = utils.Format4Output(msg, true)
|
||||
switch msg.Status {
|
||||
case kuaishou_mini.OrderPayStatusHandleing:
|
||||
orderPay.Status = model.PayStatusNo
|
||||
case kuaishou_mini.OrderPayStatusSuccess:
|
||||
orderPay.Status = model.PayStatusYes
|
||||
case kuaishou_mini.OrderPayStatusFailed:
|
||||
orderPay.Status = model.PayStatusFailed
|
||||
}
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
|
||||
if msg.Status == kuaishou_mini.OrderPayStatusSuccess {
|
||||
err = OnPayFinished(orderPay)
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Debugf("onKSPayFinished msg:%s, err:%v", utils.Format4Output(msg, true), err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func onKSPayRefund(msg *kuaishou_mini.RefundCallBack) (err error) {
|
||||
orderPayRefund := &model.OrderPayRefund{
|
||||
RefundID: msg.OutRefundNo,
|
||||
}
|
||||
db := dao.GetDB()
|
||||
if err = dao.GetEntity(db, orderPayRefund, "RefundID"); err == nil {
|
||||
switch msg.Status {
|
||||
case kuaishou_mini.OrderPayStatusHandleing:
|
||||
orderPayRefund.Status = model.PayStatusNo
|
||||
case kuaishou_mini.OrderPayStatusSuccess:
|
||||
orderPayRefund.Status = model.PayStatusYes
|
||||
case kuaishou_mini.OrderPayStatusFailed:
|
||||
orderPayRefund.Status = model.PayStatusFailed
|
||||
}
|
||||
|
||||
orderPayRefund.OriginalData = utils.Format4Output(msg, true)
|
||||
dao.UpdateEntity(db, orderPayRefund)
|
||||
} else if dao.IsNoRowsError(err) {
|
||||
globals.SugarLogger.Warnf("收到异常的退款事件, msg:%s", utils.Format4Output(msg, true))
|
||||
}
|
||||
|
||||
orderPay := &model.OrderPay{
|
||||
VendorOrderID: orderPayRefund.VendorOrderID,
|
||||
VendorID: jxutils.GetPossibleVendorIDFromVendorOrderID(orderPayRefund.VendorOrderID),
|
||||
PayType: model.PayTypeKuaiShou,
|
||||
Status: model.PayStatusYes,
|
||||
}
|
||||
orderPay.DeletedAt = utils.DefaultTimeValue
|
||||
if err = dao.GetEntity(db, orderPay, "VendorOrderID", "VendorID", "PayType", "Status", "DeletedAt"); err == nil {
|
||||
orderPay.Status = model.PayStatusRefund
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// RefundOrderByKS 申请退款
|
||||
func RefundOrderByKS(ctx *jxcontext.Context, orderPay *model.OrderPay, refundID string, refundFee int, refundDesc string) (orderPayRefund *model.OrderPayRefund, err error) {
|
||||
|
||||
param := kuaishou_mini.RefundParam{
|
||||
OutOrderNo: orderPay.VendorOrderID,
|
||||
OutRefundNo: refundID,
|
||||
Reason: refundDesc,
|
||||
Attach: "",
|
||||
NotifyUrl: "http://callback.jxc4.com/kuaishou/kuaiShouCallback",
|
||||
RefundAmount: int64(orderPay.TotalFee),
|
||||
Sign: "",
|
||||
MultiCopiesGoodsInfo: "",
|
||||
}
|
||||
result, err := api.KuaiShouApi.RefundOrder(¶m)
|
||||
if err == nil {
|
||||
orderPayRefund = &model.OrderPayRefund{
|
||||
RefundID: refundID,
|
||||
VendorRefundID: result,
|
||||
VendorOrderID: orderPay.VendorOrderID,
|
||||
VendorID: orderPay.VendorID,
|
||||
Status: model.RefundStatusNo,
|
||||
TransactionID: orderPay.TransactionID,
|
||||
RefundFee: refundFee,
|
||||
RefundCreatedAt: time.Now(),
|
||||
}
|
||||
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
|
||||
db := dao.GetDB()
|
||||
if result != "" {
|
||||
orderPayRefund.Status = model.RefundStatusYes
|
||||
} else {
|
||||
orderPayRefund.Status = model.RefundStatusFailed
|
||||
}
|
||||
orderPayRefund.OriginalData = utils.Format4Output(result, true)
|
||||
dao.CreateEntity(db, orderPayRefund)
|
||||
|
||||
orderPay.Status = model.PayStatusRefund
|
||||
dao.UpdateEntity(db, orderPay)
|
||||
}
|
||||
return orderPayRefund, err
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package localjx
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
"math"
|
||||
"regexp"
|
||||
"strings"
|
||||
@@ -252,7 +251,6 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64,
|
||||
outJxOrder.OrderID = jxutils.GenOrderNo()
|
||||
}
|
||||
order, err2 := jxOrder2GoodsOrder(ctx, outJxOrder, deliveryAddress, "", IsDeliverySelf, couponIDs)
|
||||
globals.SugarLogger.Debugf("order order %s", utils.Format4Output(order, false))
|
||||
|
||||
if err = err2; err == nil {
|
||||
order.AddressID = addressID
|
||||
@@ -315,7 +313,6 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType
|
||||
db = dao.GetDB()
|
||||
)
|
||||
order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDJX)
|
||||
globals.SugarLogger.Debugf("goodsorder := %s", utils.Format4Output(order, false))
|
||||
if err == nil {
|
||||
switch payType {
|
||||
case model.PayTypeWX:
|
||||
@@ -336,6 +333,11 @@ func Pay4Order(ctx *jxcontext.Context, orderID int64, payType int, vendorPayType
|
||||
dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName())
|
||||
err = dao.CreateEntity(dao.GetDB(), orderPay)
|
||||
}
|
||||
case model.PayTypeKuaiShou:
|
||||
if orderPay, err = pay4OrderByKs(ctx, order, vendorPayType, subAppID); err == nil && orderPay != nil {
|
||||
dao.WrapAddIDCULDEntity(orderPay, ctx.GetUserName())
|
||||
err = dao.CreateEntity(dao.GetDB(), orderPay)
|
||||
}
|
||||
default:
|
||||
err = fmt.Errorf("支付方式:%d当前不支持", payType)
|
||||
}
|
||||
@@ -839,7 +841,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
if jxOrder.OrderType != model.OrderTypeMatter || (jxOrder.OrderType == model.OrderTypeMatter && fromStoreID == -1) {
|
||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||
outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice
|
||||
} else { //以下else为物料订单袋子金额和数量处理
|
||||
} else { //以下else为物料订单袋子金额和数量处理
|
||||
if !result.Flag { //只要flag是false就按原价申请,是true再按订单量
|
||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||
outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice
|
||||
@@ -1028,6 +1030,11 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
||||
if storeDetail.ID == 668470 || storeDetail.ID == 668469 {
|
||||
outJxOrder.FreightPrice = 1
|
||||
}
|
||||
|
||||
if IsDeliverySelf {
|
||||
outJxOrder.FreightPrice = 0
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
if jxOrder.OrderType == model.OrderTypeNormal {
|
||||
outJxOrder.TotalPrice = outJxOrder.OrderPrice + outJxOrder.FreightPrice
|
||||
@@ -1394,7 +1401,8 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
|
||||
// refundID := utils.Int64ToStr(GenRefundID(order))
|
||||
refundID := order.VendorOrderID
|
||||
var orderPayRefund *model.OrderPayRefund
|
||||
if orderPay.PayType == model.PayTypeWX {
|
||||
switch orderPay.PayType {
|
||||
case model.PayTypeWX:
|
||||
orderPayRefund, err = refundOrderByWX(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err == nil {
|
||||
dao.WrapAddIDCULDEntity(orderPayRefund, ctx.GetUserName())
|
||||
@@ -1402,17 +1410,23 @@ func CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string)
|
||||
} else {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
} else if orderPay.PayType == model.PayTypeTL {
|
||||
case model.PayTypeTL:
|
||||
orderPayRefund, err = RefundOrderByTL(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
} else if orderPay.PayType == model.PayTypeTicTok {
|
||||
case model.PayTypeTicTok:
|
||||
orderPayRefund, err = RefundOrderByTT(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
case model.PayTypeKuaiShou:
|
||||
orderPayRefund, err = RefundOrderByKS(ctx, orderPay, refundID, orderPay.TotalFee, reason)
|
||||
if err != nil {
|
||||
errList.AddErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
//如果用了优惠券,状态要刷回去
|
||||
if order.CouponIDs != "" {
|
||||
|
||||
@@ -58,6 +58,7 @@ func getTikTok(appID string) (TikTokMini *tiktok.API) {
|
||||
}
|
||||
return TikTokMini
|
||||
}
|
||||
|
||||
func OnTTPayCallback(msg *tiktok.DetailCallBackMessage, refund *tiktok.DetailCallBackMessage2Refund, payType string) (err error) {
|
||||
switch payType {
|
||||
case tiktok.PayStatus: // 支付回调
|
||||
|
||||
@@ -47,6 +47,9 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
|
||||
if orderPays[0].PayType == model.PayTypeTicTok {
|
||||
_, err = localjx.RefundOrderByTT(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason)
|
||||
}
|
||||
if orderPays[0].PayType == model.PayTypeKuaiShou {
|
||||
_, err = localjx.RefundOrderByKS(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
} else {
|
||||
@@ -177,5 +180,11 @@ func isJxShop(appID string) bool {
|
||||
}
|
||||
|
||||
func (c *PurchaseHandler) GetOrderAfsInfo(ctx *jxcontext.Context, vendorOrderID, afsOrderID string) (orderAfsInfo *partner.OrderAfsInfo, err error) {
|
||||
orderAfsInfo = &partner.OrderAfsInfo{}
|
||||
|
||||
if order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX); err == nil {
|
||||
orderAfsInfo.AfsTotalShopMoney = order.TotalShopMoney
|
||||
}
|
||||
orderAfsInfo.VendorOrderID = vendorOrderID
|
||||
return orderAfsInfo, err
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
package phpjx
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||
"strings"
|
||||
"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"
|
||||
)
|
||||
@@ -33,15 +36,58 @@ type Data4AfsOrder struct {
|
||||
}
|
||||
|
||||
func OnAfsOrderMsg(msg *CallbackMsg) (err error) {
|
||||
jxutils.CallMsgHandlerAsync(func() {
|
||||
err = onAfsOrderMsg(msg)
|
||||
}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX))
|
||||
//jxutils.CallMsgHandlerAsync(func() {
|
||||
err = onAfsOrderMsg(msg)
|
||||
//}, jxutils.ComposeUniversalOrderID(msg.ThingID, model.VendorIDJX))
|
||||
return err
|
||||
}
|
||||
|
||||
func CheckOrderSkuCanRefund(db *dao.DaoDB, afsOrder *Data4AfsOrder) error {
|
||||
// 获取此订单商品吃否存在售后单
|
||||
refundFinancial, err := dao.GetOrderRefundSkuList(db, []string{afsOrder.VendorOrderID})
|
||||
if err != nil && !strings.Contains(err.Error(), "no row found") {
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(refundFinancial) == model.NO {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, r := range refundFinancial {
|
||||
for _, s := range afsOrder.Skus {
|
||||
if r.SkuID == utils.Str2Int(s.VendorSkuID) {
|
||||
return fmt.Errorf("商品:[%s],已经存在售后单无法重复申请", s.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取用户下单商品列表
|
||||
skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), afsOrder.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var really = make(map[int]bool, 0)
|
||||
for _, s := range skuList {
|
||||
really[s.SkuID] = true
|
||||
}
|
||||
for _, v := range afsOrder.Skus {
|
||||
if _, ok := really[utils.Str2Int(v.VendorSkuID)]; !ok {
|
||||
return fmt.Errorf("商品:[%s],不是购买商品", v.Name)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) {
|
||||
var afsOrder *Data4AfsOrder
|
||||
var db = dao.GetDB()
|
||||
if err = utils.UnmarshalUseNumber([]byte(msg.Data), &afsOrder); err == nil {
|
||||
if err := CheckOrderSkuCanRefund(db, afsOrder); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
outAfsOrder = &model.AfsOrder{
|
||||
VendorID: model.VendorIDJX,
|
||||
AfsOrderID: afsOrder.AfsOrderID,
|
||||
@@ -61,17 +107,72 @@ func buildAfsOrder(msg *CallbackMsg) (outAfsOrder *model.AfsOrder, err error) {
|
||||
}
|
||||
outAfsOrder.Status = int(utils.Str2Int64WithDefault(afsOrder.VendorStatus, 0))
|
||||
|
||||
skuNumber := 0 // 申请退款商品种类个数
|
||||
skuCount := 0 // 申请商品退款总条数
|
||||
refundMoney := 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,
|
||||
UserMoney: x.SalePrice * int64(x.Count),
|
||||
}
|
||||
if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal {
|
||||
orderSku.StoreSubName = utils.Int2Str(x.PromotionType)
|
||||
}
|
||||
outAfsOrder.Skus = append(outAfsOrder.Skus, orderSku)
|
||||
skuCount += orderSku.Count
|
||||
skuNumber++
|
||||
refundMoney += x.Count * int(x.SalePrice)
|
||||
}
|
||||
// 已经退款商品
|
||||
refundFinancial, err := dao.GetStoreAfsOrderSkuList2(db, []string{afsOrder.VendorOrderID})
|
||||
if err != nil && !dao.IsNoRowsError(err) {
|
||||
return nil, err
|
||||
}
|
||||
for _, f := range refundFinancial {
|
||||
skuCount += f.Count
|
||||
skuNumber++
|
||||
refundMoney += f.Count * int(f.SalePrice)
|
||||
}
|
||||
|
||||
// 获取订单商品列表(所有的订单商品)
|
||||
skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), afsOrder.VendorOrderID, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
makeOrderSkuCount := 0
|
||||
afsOrderOrderSkuCount := 0
|
||||
refundFinacialSkuCount := 0
|
||||
for _, v := range skuList {
|
||||
makeOrderSkuCount += v.Count
|
||||
}
|
||||
for _, v := range afsOrder.Skus {
|
||||
afsOrderOrderSkuCount += v.Count
|
||||
}
|
||||
for _, v := range refundFinancial {
|
||||
refundFinacialSkuCount += v.Count
|
||||
}
|
||||
// 这么写主要是不想让满足条件一的进入条件三
|
||||
if makeOrderSkuCount == afsOrderOrderSkuCount && refundFinacialSkuCount == model.NO { // 整单退
|
||||
} else if makeOrderSkuCount-refundFinacialSkuCount == model.YES && makeOrderSkuCount == model.YES { // 整单退且只有一个商品
|
||||
} else if makeOrderSkuCount-refundFinacialSkuCount-afsOrderOrderSkuCount == model.NO && afsOrderOrderSkuCount > 0 { // 分单退最后一个,不给退
|
||||
return nil, errors.New("如需整单退款,请使用整单退,无法分批次整单退款")
|
||||
}
|
||||
|
||||
orderSkuNumber := 0
|
||||
orderSkuCount := 0
|
||||
for _, v := range skuList {
|
||||
orderSkuNumber++
|
||||
orderSkuCount += v.Count
|
||||
}
|
||||
if skuNumber == orderSkuNumber && skuCount == orderSkuCount {
|
||||
outAfsOrder.RefundType = model.AfsTypeFullRefund
|
||||
} else { // 部分退款,只退还商品部分
|
||||
outAfsOrder.RefundType = model.AfsTypePartRefund
|
||||
}
|
||||
}
|
||||
return outAfsOrder, err
|
||||
@@ -86,7 +187,7 @@ func callbackAfsMsg2Status(msg *CallbackMsg) *model.OrderStatus {
|
||||
RefVendorID: model.VendorIDJX,
|
||||
VendorStatus: msg.SubMsgType,
|
||||
Status: int(utils.Str2Int64WithDefault(msg.SubMsgType, 0)),
|
||||
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
||||
StatusTime: time.Now(),
|
||||
Remark: "",
|
||||
}
|
||||
return orderStatus
|
||||
|
||||
@@ -339,6 +339,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *mtwmapi.CallbackMsg) (response *mtwmap
|
||||
var err error
|
||||
if c.isAfsMsg(msg) {
|
||||
response = c.OnAfsOrderMsg(msg)
|
||||
return response
|
||||
} else {
|
||||
status := c.callbackMsg2Status(msg)
|
||||
if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 {
|
||||
|
||||
@@ -145,7 +145,15 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma
|
||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||
}
|
||||
} else {
|
||||
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||
if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil {
|
||||
// 订单回调全额退款接口时,将订单状态修改为取消
|
||||
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
|
||||
if refundData.NotifyType == "agree" && msg.Cmd == mtwmapi.MsgTypeOrderRefund {
|
||||
order, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDMTWM)
|
||||
order.Status = model.OrderStatusCanceled
|
||||
dao.UpdateEntity(dao.GetDB(), order, "Status")
|
||||
}
|
||||
}
|
||||
}
|
||||
return mtwmapi.Err2CallbackResponse(err, "")
|
||||
}
|
||||
|
||||
@@ -323,7 +323,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
foodData["min_order_count"] = 1
|
||||
}
|
||||
foodData["unit"] = storeSku.Unit
|
||||
attr := switchAttr(storeSku.VendorVendorCatID)
|
||||
attr := SwitchAttr(storeSku.VendorVendorCatID)
|
||||
if attr != "" {
|
||||
foodData["common_attr_value"] = attr
|
||||
}
|
||||
@@ -452,7 +452,7 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
return failedList, err
|
||||
}
|
||||
|
||||
func switchAttr(vendorCatID int64) (attrs string) {
|
||||
func SwitchAttr(vendorCatID int64) (attrs string) {
|
||||
switch vendorCatID {
|
||||
case 200002727:
|
||||
return mtwmapi.MtwmSkuAttr200002727
|
||||
|
||||
@@ -49,11 +49,16 @@ func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal
|
||||
Status: c.GetWaybillStatusFromVendorStatus(vendorStatus),
|
||||
StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))),
|
||||
Remark: "",
|
||||
|
||||
VendorOrgCode: msg.AppID,
|
||||
VendorOrgCode: msg.AppID,
|
||||
}
|
||||
if retVal.StatusTime == utils.DefaultTimeValue {
|
||||
retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp")))
|
||||
}
|
||||
|
||||
//if vendorStatus == "4" || vendorStatus == "8" { // 4:美团推送已经(确认骑手)订单 8:美团推送(骑手完成)订单
|
||||
// retVal.DesiredFee = utils.Float64TwoInt64(utils.Str2Float64WithDefault(msg.FormData.Get("shipping_fee"), 0)) // 订单优惠前的总费用
|
||||
// partner.CurOrderManager
|
||||
//}
|
||||
|
||||
return retVal
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ const (
|
||||
func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) {
|
||||
if CurPurchaseHandler != nil {
|
||||
orderId, shopId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg)
|
||||
globals.SugarLogger.Debugf("order_id %s,%d", orderId, shopId)
|
||||
orderDetail, err := GetTiktokApi(utils.Int64ToStr(shopId), 0, "").GetTiktokOrderDetail(orderId)
|
||||
if err != nil {
|
||||
return tiktokShop.Err2CallbackResponse(err, "")
|
||||
@@ -78,7 +77,6 @@ func HttpToGuoYuan(param map[string]interface{}, requestType string) (*http.Resp
|
||||
}
|
||||
}
|
||||
body := strings.NewReader(string(paramData))
|
||||
globals.SugarLogger.Debugf("HttpToGuoYuan paramData====%s", utils.Format4Output(paramData, false))
|
||||
url := ""
|
||||
switch requestType {
|
||||
case CaiShiPushGyTagOrder: // 订单相关
|
||||
|
||||
@@ -192,7 +192,6 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s
|
||||
// 预订单还是快速达
|
||||
localStore, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreIdRelly, model.VendorIDDD, vendorOrgCode)
|
||||
if err != nil || localStore == nil || localStore.ID == 0 {
|
||||
globals.SugarLogger.Debugf("平台门店未绑定到京西系统 %s", err.Error())
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ func (c *PurchaseHandler) OnAfsOrderMsg(msgId, orderId string, msg interface{})
|
||||
// todo 对于退款与部分退款,order.go与这个文件中对于状态的处理不一致
|
||||
func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *tiktokShop.CallbackResponse) {
|
||||
var err error
|
||||
var db = dao.GetDB()
|
||||
orderStatus, vendorOrgCode := c.callbackAfsMsg2Status(msgId, msg)
|
||||
if orderStatus == nil {
|
||||
return tiktokShop.Err2CallbackResponse(nil, "")
|
||||
@@ -115,14 +116,20 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *
|
||||
afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt
|
||||
}
|
||||
if msgId == tiktokShop.CallbackUpdateRefundOrderMsgTagId {
|
||||
_, err = dao.DeleteEntity(dao.GetDB(), afsOrder, "VendorOrderID", "VendorID")
|
||||
_, err = dao.DeleteEntity(db, afsOrder, "VendorOrderID", "VendorID")
|
||||
afsOrder.Skus[0].VendorOrderID = afsOrder.VendorOrderID
|
||||
_, err = dao.DeleteEntity(dao.GetDB(), afsOrder.Skus[0], "VendorOrderID")
|
||||
_, err = dao.DeleteEntity(db, afsOrder.Skus[0], "VendorOrderID")
|
||||
}
|
||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||
}
|
||||
} else {
|
||||
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||
if err == nil && msgId == tiktokShop.CallbackReturnRefundAgreedMsgTagId {
|
||||
goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID)
|
||||
goodsOrder.Status = model.OrderStatusCanceled
|
||||
goodsOrder.VendorStatus = orderStatus.VendorStatus
|
||||
dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus")
|
||||
}
|
||||
}
|
||||
|
||||
return tiktokShop.Err2CallbackResponse(err, "")
|
||||
@@ -186,20 +193,20 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) (
|
||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||
RefVendorID: model.VendorIDDD,
|
||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_success"),
|
||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||
Status: c.GetAfsStatusFromVendorStatus(int(refundOrder.AftersaleType), tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
||||
}
|
||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||
if k, ok := ReasonCodeMap[int(refundOrder.ReasonCode)]; ok {
|
||||
orderMsg.Remark = k
|
||||
} else {
|
||||
orderMsg.Remark = "退款成功回调,抖音reason_code对应reason不足,需要更新.code:" + utils.Int2Str(refundOrder.ReasonCode)
|
||||
orderMsg.Remark = "退款成功回调,抖音reason_code对应reason不足,需要更新.code:" + utils.Int64ToStr(refundOrder.ReasonCode)
|
||||
}
|
||||
if refundOrder.AftersaleId > 0 {
|
||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||
} else {
|
||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||
}
|
||||
vendorOrgCode = refundOrder.ShopId
|
||||
vendorOrgCode = int(refundOrder.ShopId)
|
||||
orderStatus = orderMsg
|
||||
case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息
|
||||
refundOrder := msg.(tiktokShop.BusinessNotRefundRefusedData)
|
||||
|
||||
@@ -494,7 +494,6 @@ func CreateFreightTemplate(storeCode, deliveryFeeDeductionSill int) (int64, erro
|
||||
//},
|
||||
//}
|
||||
}
|
||||
globals.SugarLogger.Debugf("CreateFreightTemplate 直辖市code====%d", param.Template.ProductCity)
|
||||
if deliveryFeeDeductionSill != 0 {
|
||||
param.Template.TemplateName += "满减包邮模板"
|
||||
param.Columns = []freightTemplate_create_request.ColumnsItem{{
|
||||
@@ -601,7 +600,6 @@ func CreateBindFreeShipTemplate(vendorOrgCode string, storeID int, shipFee int64
|
||||
} else {
|
||||
param.Template.ProductCity = int64(storeDetail.CityCode)
|
||||
}
|
||||
globals.SugarLogger.Debugf("CreateBindFreeShipTemplate 直辖市code=%d", param.Template.ProductCity)
|
||||
if resp, err := getAPI(vendorOrgCode, 0, "").FreightTemplateCreate(param); err != nil {
|
||||
return errors.New(fmt.Sprintf("平台门店(%s) 京西门店(%d) 创建包邮模板失败:%v,根据提示处理", storeDetail.VendorStoreID, storeID, err))
|
||||
} else {
|
||||
|
||||
@@ -116,7 +116,6 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
||||
if err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).DeleteStoreCommodity(utils.Str2Int64(v.VendorSkuID)); err != nil {
|
||||
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除子商品")...)
|
||||
}
|
||||
dao.DeleteThingToTiktokMapList(model.VendorIDDD, v.VendorMainId, storeSkuList[0].SkuID)
|
||||
}
|
||||
}
|
||||
if len(failedList) > 0 {
|
||||
|
||||
@@ -226,6 +226,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
||||
} else if localThing[0].SyncStatus == model.ThingTypeSyncSuccess {
|
||||
// 主商品存在,直接同步子商品
|
||||
childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID))
|
||||
globals.SugarLogger.Debugf("==========:%s", localThing[0].VendorThingID)
|
||||
globals.SugarLogger.Debugf("==========:%v", err)
|
||||
if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品
|
||||
// 线上本地都存在,但是线上审核不成功,就去更新主商品
|
||||
mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID)
|
||||
@@ -498,7 +500,6 @@ func makeMainProductSku(db *dao.DaoDB, api *tiktokShop.API, storeSku *dao.StoreS
|
||||
}
|
||||
|
||||
func getTiktokBrandId(api *tiktokShop.API, db *dao.DaoDB, upc, upcBrandName, upcTiktokBrandId string, categoryLeafId int64) (int64, error) {
|
||||
globals.SugarLogger.Debugf("upc:%s,upcBrandName:%s,upcTiktokBrandId:%s,categoryLeafId:%d", upc, upcBrandName, upcTiktokBrandId, categoryLeafId)
|
||||
if upc == "" { // 默认品牌京西菜市 596120136
|
||||
return 596120136, nil
|
||||
} else if upc != "" && upcBrandName != "" && upcTiktokBrandId != "" {
|
||||
|
||||
@@ -275,7 +275,6 @@ func (p *PurchaseHandler) setStoreOrderSeq(order *model.GoodsOrder) {
|
||||
db := dao.GetDB()
|
||||
if err := dao.GetRow(db, &count, sql, order.StoreID, dateBegin, model.VendorIDWSC); err == nil {
|
||||
order.OrderSeq = count + 1
|
||||
globals.SugarLogger.Debugf("setStoreOrderSeq orderID:%s, dateBegin:%s, orderSeq:%d", order.VendorOrderID, utils.Time2Str(dateBegin), order.OrderSeq)
|
||||
} else {
|
||||
globals.SugarLogger.Errorf("setStoreOrderSeq orderID:%s failed with error:%v", order.VendorOrderID, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user