This commit is contained in:
richboo111
2023-04-25 10:39:28 +08:00
57 changed files with 1242 additions and 260 deletions

View File

@@ -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)
}

View File

@@ -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,
})

View File

@@ -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)})
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 {

View 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(&param)
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
}

View File

@@ -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 != "" {

View File

@@ -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: // 支付回调

View File

@@ -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
}

View File

@@ -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

View File

@@ -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 {

View File

@@ -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, "")
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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: // 订单相关

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 != "" {

View File

@@ -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)
}