From 36a0ae7b6fa4e154de657478c50c015f5edf515d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Wed, 4 Dec 2024 09:15:05 +0800 Subject: [PATCH] 1 --- business/bidding/bidding.go | 19 +++++++ business/jxstore/cms/sku.go | 10 +++- business/partner/delivery/mtps/waybill.go | 2 +- business/partner/delivery/sfps/waybill.go | 4 +- business/partner/purchase/ebai/order_afs.go | 8 ++- .../partner/purchase/ebai/order_afs_ex.go | 47 +++++++++++++++++ business/partner/purchase/mtwm/callback.go | 2 +- .../partner/purchase/tiktok_store/callback.go | 10 ++-- controllers/bidding.go | 30 +++++++++++ controllers/ebai_callback.go | 51 ++++++++++++++++++ controllers/mtwm_callback.go | 52 +++++++++++++++++-- routers/commentsRouter_controllers.go | 10 ++++ 12 files changed, 229 insertions(+), 16 deletions(-) diff --git a/business/bidding/bidding.go b/business/bidding/bidding.go index e9edb8ab4..48801620a 100644 --- a/business/bidding/bidding.go +++ b/business/bidding/bidding.go @@ -259,3 +259,22 @@ func GetExpireShopNoticeUser() { } } } + +func UpdateStockBySkuId(db *dao.DaoDB, storeId int, stock []*SkuIdAndStock) error { + errStr := make([]string, 0, 0) + for _, v := range stock { + sql := fmt.Sprintf(` UPDATE SET stock = %d WHERE store_id = %d AND sku_id = %d `, v.Stock, storeId, v.SkuId) + if _, err := dao.ExecuteSQL(db, sql); err != nil { + errStr = append(errStr, err.Error()) + } + } + if len(errStr) == model.NO { + return nil + } + return fmt.Errorf(strings.Join(errStr, ",")) +} + +type SkuIdAndStock struct { + SkuId int `json:"skuId"` + Stock int `json:"stock"` +} diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index bb6cd83f4..fd3ead164 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -1901,8 +1901,16 @@ func GetJdUpcCodeByCode(ctx *jxcontext.Context, upcCode string) (productInfos [] } func GetJdUpcCodeByName(ctx *jxcontext.Context, name, upcCode string) (productInfos []*jdapi.ProductInfo, err error) { + appOrgCode := "" + if beego.BConfig.RunMode == model.ServerTypeFruits { + appOrgCode = "339032" + } else if beego.BConfig.RunMode == model.ServerTypePet { + appOrgCode = "320406" + } else { + appOrgCode = "320406" + } var ( - apijd = apimanager.CurAPIManager.GetAPI(model.VendorIDJD, "320406").(*jdapi.API) + apijd = apimanager.CurAPIManager.GetAPI(model.VendorIDJD, appOrgCode).(*jdapi.API) productInfo []*jdapi.ProductInfo ) if name != "" { diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 7f4cf9f27..3b1933c6f 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -224,7 +224,7 @@ func (c *DeliveryHandler) pushToGy(msg *mtpsapi.CallbackOrderMsg, serverType str return } case model.ServerTypePet: - request, err = http.NewRequest(http.MethodPost, "http://callback-jxpet.jxc4.com/mtps/status", strings.NewReader(utils.Map2URLValues(params).Encode())) + request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/mtps/status", strings.NewReader(utils.Map2URLValues(params).Encode())) if err != nil { return } diff --git a/business/partner/delivery/sfps/waybill.go b/business/partner/delivery/sfps/waybill.go index b4fa727b3..25811eee8 100644 --- a/business/partner/delivery/sfps/waybill.go +++ b/business/partner/delivery/sfps/waybill.go @@ -494,11 +494,11 @@ func pushCallbackToGy(urlIndex string, msg interface{}, serverType string) { } else if serverType == model.ServerTypePet { switch urlIndex { case sfps2.UrlIndexRiderException: - request, err = http.NewRequest(http.MethodPost, "http://callback-jxpet.jxc4.com/SFPS/SfAbnormal", strings.NewReader(string(b))) + request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/SFPS/SfAbnormal", strings.NewReader(string(b))) default: //fullUrl := utils.GenerateGetURL("http://callback-jxgy.jxc4.com/SFPS/SfOrder", "", map[string]interface{}{"sign": sign}) //request, err = http.NewRequest(http.MethodPost, fullUrl, strings.NewReader(string(b))) - request, err = http.NewRequest(http.MethodPost, "http://callback-jxpet.jxc4.com/SFPS/SfOrder", strings.NewReader(string(b))) + request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/SFPS/SfOrder", strings.NewReader(string(b))) } } diff --git a/business/partner/purchase/ebai/order_afs.go b/business/partner/purchase/ebai/order_afs.go index bcb2b90f6..063f5d069 100644 --- a/business/partner/purchase/ebai/order_afs.go +++ b/business/partner/purchase/ebai/order_afs.go @@ -109,6 +109,12 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia if afsOrder != nil { err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } + } else if afsOrder2 == nil && msg.Cmd == ebaiapi.CmdOrderUserCancel { + // 暂时未找到消息api + afsOrder, _ := c.makeAfsOrderInfoMerchantAgreed(msg, orderStatus) + if afsOrder != nil { + err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) + } } else { err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus) } @@ -116,7 +122,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia // 只有有售后订单就更新此订单的结算信息 var db = dao.GetDB() - if (msg.Cmd == ebaiapi.CmdOrderPartRefund && utils.Str2Int(orderStatus.VendorStatus) == ebaiapi.OrderPartRefundSuccess) || (msg.Cmd == ebaiapi.CmdOrderReversePush && utils.Str2Int(orderStatus.VendorStatus) == ebaiapi.OrderReversePushApplySuccess) { + if (msg.Cmd == ebaiapi.CmdOrderUserCancel && orderStatus.Status == model.AfsOrderStatusFinished) || (msg.Cmd == ebaiapi.CmdOrderPartRefund && utils.Str2Int(orderStatus.VendorStatus) == ebaiapi.OrderPartRefundSuccess) || (msg.Cmd == ebaiapi.CmdOrderReversePush && utils.Str2Int(orderStatus.VendorStatus) == ebaiapi.OrderReversePushApplySuccess) { orderData, err2 := api.EbaiAPI.OrderPartRefundGet(orderStatus.RefVendorOrderID) if err2 == nil && utils.MustInterface2Int64(orderData["merchant_income"]) != model.NO { goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDEBAI) diff --git a/business/partner/purchase/ebai/order_afs_ex.go b/business/partner/purchase/ebai/order_afs_ex.go index 23408bef3..95396b4dd 100644 --- a/business/partner/purchase/ebai/order_afs_ex.go +++ b/business/partner/purchase/ebai/order_afs_ex.go @@ -90,3 +90,50 @@ func (c *PurchaseHandler) makeAfsOrderInfoReverseRefund(msg *ebaiapi.CallbackMsg } return afsOrder, nil } + +func (c *PurchaseHandler) makeAfsOrderInfoMerchantAgreed(msg *ebaiapi.CallbackMsg, orderStatus *model.OrderStatus) (*model.AfsOrder, error) { + var afsOrder *model.AfsOrder + partRefundData := msg.Data.(*ebaiapi.CBUserCancelInfo) + afsOrder = &model.AfsOrder{ + VendorID: model.VendorIDEBAI, + AfsOrderID: orderStatus.VendorOrderID, + VendorOrderID: orderStatus.RefVendorOrderID, + VendorStoreID: utils.Int2Str(partRefundData.PlatformShopId), + StoreID: 0, + AfsCreatedAt: utils.Timestamp2Time(msg.Timestamp), + VendorAppealType: "", + AppealType: model.AfsAppealTypeRefund, + VendorReasonType: utils.Int2Str(partRefundData.ReasonCode), + ReasonType: c.convertAfsReasonType(utils.Int2Str(partRefundData.ReasonCode)), + ReasonDesc: utils.LimitUTF8StringLen(partRefundData.CancelReason, 1024), + ReasonImgList: utils.LimitUTF8StringLen(strings.Join(partRefundData.Pictures, ","), 1024), + RefundType: model.AfsTypePartRefund, + VendorOrgCode: msg.Source, + } + // 查询售后列表 + refundSku, _, err := api.EbaiAPI.GetReverseOrder(orderStatus.RefVendorOrderID) + if err == nil { + refundSkuList := make([]*ebaiapi.ReverseSkuList, 0, len(refundSku)) + refundByte, _ := json.Marshal(refundSku) + if err = json.Unmarshal(refundByte, &refundSkuList); err != nil { + return nil, err + } + for _, sku := range refundSkuList { + if sku.SkuName == "配送费" || sku.SkuName == "包装费" { + continue + } + orderSku := &model.OrderSkuFinancial{ + Count: sku.RefundQuantity, + VendorSkuID: utils.Int64ToStr(sku.PlatformSkuId), + SkuID: utils.Str2Int(sku.CustomSkuId), + Name: sku.SkuName, + UserMoney: int64(sku.RefundUserAmount), + PmSkuSubsidyMoney: int64(sku.DiscountDetail.PlatformDiscountAmount), + } + afsOrder.SkuUserMoney += orderSku.UserMoney + afsOrder.PmSubsidyMoney += orderSku.PmSubsidyMoney + afsOrder.Skus = append(afsOrder.Skus, orderSku) + } + } + return afsOrder, nil +} diff --git a/business/partner/purchase/mtwm/callback.go b/business/partner/purchase/mtwm/callback.go index 313a2f621..f0b4b54c9 100644 --- a/business/partner/purchase/mtwm/callback.go +++ b/business/partner/purchase/mtwm/callback.go @@ -111,7 +111,7 @@ func pushIMToGyOrPet(msg *mtwmapi.ImCallbackMsg, serverType string) { return } case model.ServerTypePet: - request, err = http.NewRequest(http.MethodPost, "http://callback-jxpet.jxc4.com/mtwm/iMCallback", strings.NewReader(utils.Map2URLValues(params).Encode())) + request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/mtwm/iMCallback", strings.NewReader(utils.Map2URLValues(params).Encode())) if err != nil { return } diff --git a/business/partner/purchase/tiktok_store/callback.go b/business/partner/purchase/tiktok_store/callback.go index dd63324c5..ba3ad15cb 100644 --- a/business/partner/purchase/tiktok_store/callback.go +++ b/business/partner/purchase/tiktok_store/callback.go @@ -116,15 +116,15 @@ func HttpToGuoYuan(param map[string]interface{}, requestType string, serverType } else if serverType == model.ServerTypePet { switch requestType { case CaiShiPushGyTagOrder: // 订单相关 - url = "http://callback-jxpet.jxc4.com/tiktok/callbackTiktokOrderMsg" + url = "http://callback-gblm.jxc4.com/tiktok/callbackTiktokOrderMsg" case CaiShiPushGyTagToken: // 授权相关 - url = "http://callback-jxpet.jxc4.com/tiktokShop/jxcsToGyTiktokToken" + url = "http://callback-gblm.jxc4.com/tiktokShop/jxcsToGyTiktokToken" case CaiShiPushGyTagDeliveryRegister: // 配送查询注册 - url = "http://callback-jxpet.jxc4.com/logistics/logisticsRegister" + url = "http://callback-gblm.jxc4.com/logistics/logisticsRegister" case CaiShiPushGyTagDeliveryDetail: // 配送查询详情 - url = "http://callback-jxpet.jxc4.com/logistics/logisticsQuery" + url = "http://callback-gblm.jxc4.com/logistics/logisticsQuery" case CaiShiPushGyTagWayBill: // 运单消息 - url = "http://callback-jxpet.jxc4.com/tiktok/callbackTiktokOrderMsg" + url = "http://callback-gblm.jxc4.com/tiktok/callbackTiktokOrderMsg" } } diff --git a/controllers/bidding.go b/controllers/bidding.go index 4af17dd08..de0a28b21 100644 --- a/controllers/bidding.go +++ b/controllers/bidding.go @@ -8,11 +8,13 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/bidding" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" + "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" "git.rosy.net.cn/jx-callback/business/jxutils/excel" "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/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" @@ -270,3 +272,31 @@ func (c *BiddingController) DownSupermarketSign() { return "", hint, err }) } + +// UpdateStockBySkuID 根据skuId更新商品库存 +// @Title 根据skuId更新商品库存 +// @Description 批量更新库存 +// @Param storeID formData int true "标准门店库存ID" +// @Param stock formData string true "库存列表"[{"skuId":110,"stock":10},{"skuId":111,"stock":10}]" +// @Param token header string true "认证token" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /UpdateStockBySkuID [post] +func (c *BiddingController) UpdateStockBySkuID() { + c.callUpdateStockBySkuID(func(params *tBindUpdateStockBySkuIDParams) (retVal interface{}, hint string, err error) { + var ( + stockList []*bidding.SkuIdAndStock + db = dao.GetDB() + ) + if err = jxutils.Strings2Objs(params.Stock, &stockList); err != nil { + return nil, "", err + } + + if err = bidding.UpdateStockBySkuId(db, params.StoreID, stockList); err != nil { + return nil, "", err + } + + retVal, err = cms.CurVendorSync.SyncStoresSkus(params.Ctx, nil, 0, db, nil, []int{params.StoreID}, nil, true, true, true) + return + }) +} diff --git a/controllers/ebai_callback.go b/controllers/ebai_callback.go index 6a10eeb16..6a0d9a8cf 100644 --- a/controllers/ebai_callback.go +++ b/controllers/ebai_callback.go @@ -1,12 +1,21 @@ package controllers import ( + "fmt" + "git.rosy.net.cn/baseapi/platformapi/dingdingapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" "net/http" + "strings" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" + beego "github.com/astaxie/beego/server/web" ) type EbaiController struct { @@ -17,6 +26,26 @@ func (c *EbaiController) Msg() { if c.Ctx.Input.Method() == http.MethodPost { obj, callbackResponse := api.EbaiAPI.GetCallbackMsg(c.Ctx.Request) if callbackResponse == nil { + vendorStoreId := obj.Body["platform_shop_id"].(string) + globals.SugarLogger.Debugf("-------obj.body := %s,%s", obj.Cmd, vendorStoreId) + if vendorStoreId != "" { + storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreId, model.VendorIDEBAI, "") + if storeDetail == nil { + switch beego.BConfig.RunMode { + case model.ServerTypeVegetable: + callbackResponse = c.EBaiMsgPush2FruitsOrPet(model.ServerTypeFruits, utils.Struct2Map(obj, "", false)) + case model.ServerTypeFruits: + callbackResponse = c.EBaiMsgPush2FruitsOrPet(model.ServerTypePet, utils.Struct2Map(obj, "", false)) + case model.ServerTypePet: + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "47B1E94E8D2411EFB666525400E86DC0", "饿了么菜市推果园,果园退超市未找到门店", fmt.Sprintf("cmd:%s,storeId:%s", obj.Cmd, vendorStoreId)) + callbackResponse = api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), fmt.Errorf("饿了么菜市推果园,果园退超市未找到门店cmd:%s,storeId:%s", obj.Cmd, vendorStoreId), nil) + return + } + c.Data["json"] = callbackResponse + c.ServeJSON() + return + } + } callbackResponse = ebai.OnCallbackMsg(obj) } if callbackResponse == nil { @@ -28,3 +57,25 @@ func (c *EbaiController) Msg() { c.Abort("404") } } + +func (c *EbaiController) EBaiMsgPush2FruitsOrPet(serverType string, msg map[string]interface{}) *ebaiapi.CallbackResponse { + cl := http.Client{} + var request *http.Request + var err error + switch serverType { + case model.ServerTypeFruits: + request, err = http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/ebai/msg", strings.NewReader(utils.Map2URLValues(msg).Encode())) + if err != nil { + return api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), err, nil) + } + case model.ServerTypePet: + request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/mtps/status", strings.NewReader(utils.Map2URLValues(msg).Encode())) + if err != nil { + return api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), err, nil) + } + } + + request.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") + _, err = cl.Do(request) + return api.EbaiAPI.Err2CallbackResponse(ebaiapi.GetCmd(c.Ctx.Request), err, nil) +} diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go index fa24e7420..f3315e559 100644 --- a/controllers/mtwm_callback.go +++ b/controllers/mtwm_callback.go @@ -1,7 +1,13 @@ package controllers import ( + "encoding/json" + "fmt" + "git.rosy.net.cn/baseapi/platformapi/dingdingapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" @@ -16,9 +22,36 @@ type MtwmController struct { } func (c *MtwmController) onCallbackMsg(msgType string) { - c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "") msg, callbackResponse := api.MtwmAPI.GetCallbackMsg(c.Ctx.Request) if callbackResponse == nil { + vendorStoreId := msg.FormData.Get("app_poi_code") + if vendorStoreId == "" { + vendorStoreId = msg.FormData.Get("wm_poi_id") + } + if msgType == mtwmapi.MsgTypeOrderFinishedPickup && vendorStoreId == "" { + finishedPickup := FinishedPickup{} + json.Unmarshal([]byte(msg.FormData.Get("pick_up_data")), &finishedPickup) + vendorStoreId = finishedPickup.AppPoiCode + } + if vendorStoreId != "" { + storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreId, model.VendorIDMTWM, "") + if storeDetail == nil { + switch web.BConfig.RunMode { + case model.ServerTypeVegetable: + callbackResponse = pushMTWMOrder2GY(msg.FormData, msgType, model.ServerTypeFruits) + case model.ServerTypeFruits: + callbackResponse = pushMTWMOrder2GY(msg.FormData, msgType, model.ServerTypePet) + case model.ServerTypePet: + ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "47B1E94E8D2411EFB666525400E86DC0", "饿了么菜市推果园,果园退超市未找到门店", fmt.Sprintf("cmd:%s,storeId:%s", msgType, vendorStoreId)) + callbackResponse = mtwmapi.Err2CallbackResponse(fmt.Errorf("美团菜市推果园,果园退超市未找到门店cmd:%s,storeId:%s", msgType, vendorStoreId), "") + return + } + c.Data["json"] = callbackResponse + c.ServeJSON() + return + } + } + callbackResponse = mtwm.OnCallbackMsg(msg, msgType) if callbackResponse == nil { callbackResponse = mtwmapi.Err2CallbackResponse(nil, "") @@ -125,12 +158,21 @@ type FinishedPickup struct { } // 订单所属门店在菜市不存在时尝试推送到果园去 -func pushMTWMOrder2GY(value url.Values, msgType string) { +func pushMTWMOrder2GY(value url.Values, msgType string, serverType string) *mtwmapi.CallbackResponse { cl := http.Client{} - request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtwm/"+msgType, strings.NewReader(value.Encode())) + var request *http.Request + var err error + + switch serverType { + case model.ServerTypeFruits: + request, err = http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtwm/"+msgType, strings.NewReader(value.Encode())) + case model.ServerTypePet: + request, err = http.NewRequest(http.MethodPost, "http://callback-gblm.jxc4.com/mtwm/"+msgType, strings.NewReader(value.Encode())) + } if err != nil { - return + return mtwmapi.Err2CallbackResponse(err, "") } request.Header.Set("Content-Type", "multipart/form-data; charset=UTF-8") - cl.Do(request) + _, err = cl.Do(request) + return mtwmapi.Err2CallbackResponse(err, "") } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index cf364d0e1..52628f1e0 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -4496,6 +4496,16 @@ func init() { Filters: nil, Params: nil}) + // 根据商品ID更新库存 + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:BiddingController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:BiddingController"], + web.ControllerComments{ + Method: "UpdateStockBySkuID", + Router: `/UpdateStockBySkuID`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + // 版本设置 web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:VersionController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:VersionController"], web.ControllerComments{