From eaca4b3275f54cf0b75cff436c855d3471c8661e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Tue, 15 Mar 2022 11:46:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/scheduler/defsch/defsch.go | 45 +++++++----- .../jxcallback/scheduler/defsch/defsch_ext.go | 8 ++- business/jxstore/cms/store.go | 14 ++++ business/model/dao/store.go | 2 + business/model/model.go | 13 ++-- business/partner/purchase/mtwm/callback.go | 71 ++++++++++++------- conf/app.conf | 3 + controllers/auth2.go | 2 +- controllers/mtwm_callback.go | 7 -- globals/api/api.go | 2 +- 10 files changed, 107 insertions(+), 60 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 3a98c599d..346a91d18 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -749,25 +749,34 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } func (s *DefScheduler) cancelWaybillNotInStoreOpentime(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { - if savedOrderInfo != nil { - //TODO 2020-09-07 不在门店的营业时间内取消运单 - //TODO 2021-07-26 实时取门店营业时间,运营可能在订单来之后修改门店营业时间 - storeDetail, _ := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(savedOrderInfo.order), savedOrderInfo.order.VendorID) - if storeDetail != nil { - if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 { - time1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, time.Now()) - time2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, time.Now()) - if time.Now().Sub(time1) < 0 || time.Now().Sub(time2.Add(time.Minute*30)) > 0 { - if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 { - time3 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, time.Now()) - time4 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, time.Now()) - if time.Now().Sub(time3) < 0 || time.Now().Sub(time4.Add(time.Minute*30)) > 0 { - s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime) - } - } else { - s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime) - } + if savedOrderInfo == nil { + return nil + } + + //TODO 2020-09-07 不在门店的营业时间内取消运单 + //TODO 2021-07-26 实时取门店营业时间,运营可能在订单来之后修改门店营业时间 + storeDetail, _ := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(savedOrderInfo.order), savedOrderInfo.order.VendorID) + if storeDetail == nil { + return nil + } + + // 系统手动发单,不做营业时间校验 + if storeDetail.SendOrderType == 1 { + return nil + } + + if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 { + time1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, time.Now()) + time2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, time.Now()) + if time.Now().Sub(time1) < 0 || time.Now().Sub(time2.Add(time.Minute*30)) > 0 { // 营业时间 + if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 { // 休息时间 + time3 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, time.Now()) + time4 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, time.Now()) + if time.Now().Sub(time3) < 0 || time.Now().Sub(time4.Add(time.Minute*30)) > 0 { + s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime) } + } else { + s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime) } } } diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 9e0ed05f9..22412c75f 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -194,13 +194,15 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, courierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, errCode string, err error) { savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { + savedOrderInfo.storeDetail.SendOrderType = 1 // 设置为手动创建订单 order := savedOrderInfo.order //1表示为门店发单,需要验证门店账户余额情况 if errCode, err = s.CheckStoreBalance(ctx, order, courierVendorIDs); err != nil { return nil, errCode, err } } - jxutils.CallMsgHandler(func() { + + billFunc := func() { bills, err = func() (bills []*model.Waybill, err error) { userName := ctx.GetUserName() globals.SugarLogger.Debugf("CreateWaybillOnProvidersEx orderID:%s userName:%s", vendorOrderID, userName) @@ -235,7 +237,9 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor globals.SugarLogger.Infof("CreateWaybillOnProvidersEx orderID:%s userName:%s error:%v", vendorOrderID, userName, err) return bills, err }() - }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) + } + + jxutils.CallMsgHandler(billFunc, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) return bills, errCode, err } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index 4124d945e..8b8142e81 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -1083,6 +1083,7 @@ func UpdateStore(ctx *jxcontext.Context, storeID int, payload map[string]interfa TryAddStoreBossRole4StoreByMobile(ctx, store.ID, []string{utils.Interface2String(valid["tel1"]), utils.Interface2String(valid["tel2"])}) } if syncStatus&model.SyncFlagStoreAddress != 0 || valid["tel1"] != nil || valid["payeeName"] != nil { + // 修改门店信息(第三方平台同步) updateCourierStores(ctx, storeID) } } @@ -1249,6 +1250,7 @@ func CreateStore(ctx *jxcontext.Context, storeExt *StoreExt, userName string) (i if globals.IsAddEvent { err = AddEventDetail(db, ctx, model.OperateAdd, store.ID, model.ThingTypeStore, store.ID, "", "") } + // 同步门店信息 UpdateOrCreateCourierStores(ctx, store.ID, false, false, false) TryAddStoreBossRole4StoreByMobile(ctx, storeExt.ID, []string{storeExt.Tel1, storeExt.Tel2}) // InsertStoreCategories(ctx, db, store.ID) @@ -1940,17 +1942,26 @@ func updateCourierStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) ( return err } +// 更新门店信息 +//VendorIDDada = 101 // 达达配送 +//VendorIDMTPS = 102 // 美团配送 +//VendorIDFengNiao = 103 // 蜂鸟配送 func updateCourierStores(ctx *jxcontext.Context, storeID int) (err error) { globals.SugarLogger.Debugf("updateCourierStores storeID:%d", storeID) db := dao.GetDB() errList := errlist.New() for k, v := range partner.DeliveryPlatformHandlers { + fmt.Println("k===================", k) if v.Use4CreateWaybill { if _, ok := v.Handler.(partner.IDeliveryUpdateStoreHandler); ok { storeDetail, err2 := dao.GetStoreDetail2(db, storeID, "", k) + fmt.Println("storeDetail.VendorID===================", storeDetail.VendorID) + fmt.Println("storeDetail.AuditStatus===================", storeDetail.AuditStatus) + fmt.Println("storeDetail.VendorStoreID===================", storeDetail.VendorStoreID) if err = err2; err2 == nil { if storeDetail.VendorStoreID != "" && storeDetail.AuditStatus == model.StoreAuditStatusOnline { + // 同步更新门店信息 err = updateCourierStore(ctx, storeDetail) if err == nil { //美团配送修改门店信息后要待审核 @@ -1970,6 +1981,7 @@ func updateCourierStores(ctx *jxcontext.Context, storeID int) (err error) { return errList.GetErrListAsOne() } +// ====================================第三方店铺创建============================= func updateOrCreateCourierStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (isCreated bool, err error) { globals.SugarLogger.Debugf("updateOrCreateCourierStore %s, storeID:%d, vendorStoreID:%s", model.VendorChineseNames[storeDetail.VendorID], storeDetail.ID, storeDetail.VendorStoreID) @@ -1985,6 +1997,7 @@ func updateOrCreateCourierStore(ctx *jxcontext.Context, storeDetail *dao.StoreDe remoteStoreDetail, err2 := handlerInfo.Handler.GetStore(ctx, 0, storeDetail.VendorStoreID) if err = err2; err != nil { if handlerInfo.Handler.IsErrStoreNotExist(err) { + // 本地门店同步第三方平台 storeDetail.VendorStoreID, storeDetail.AuditStatus, err = handlerInfo.Handler.CreateStore(ctx, storeDetail) if err == nil { isCreated = true @@ -2029,6 +2042,7 @@ func UpdateOrCreateCourierStores(ctx *jxcontext.Context, storeID int, isForceUpd } } + // 定时任务更新或者创建时修改东西 task := tasksch.NewParallelTask("UpdateOrCreateCourierStores", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { var resultList []interface{} diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 27119cd39..715b31531 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -67,6 +67,8 @@ type StoreDetail struct { BrandLogo string `json:"brandLogo"` BrandIsOpen int `json:"brandIsOpen"` BrandIsPrint int `json:"brandIsPrint"` + + SendOrderType int `orm:"-" json:"-"` // 临时变量发单类型 1-系统手动发单 } // 带快递门店信息的 diff --git a/business/model/model.go b/business/model/model.go index de01880c6..10995dc59 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -73,14 +73,13 @@ type ModelIDCULD struct { // 同步标识掩码 const ( // general - SyncFlagModifiedMask = 1 - SyncFlagNewMask = 2 - SyncFlagDeletedMask = 4 - + SyncFlagModifiedMask = 1 // 同步标志修改掩码 + SyncFlagNewMask = 2 // 同步标记新掩码 + SyncFlagDeletedMask = 4 // 同步标志删除掩码 // store only - SyncFlagStoreName = 8 - SyncFlagStoreAddress = 16 - SyncFlagStoreStatus = 32 + SyncFlagStoreName = 8 // 同步标志存储名称 + SyncFlagStoreAddress = 16 // 同步标志存储地址 + SyncFlagStoreStatus = 32 // 同步标志存储状态 // sku only SyncFlagSpecMask = 64 // 规格修改,原值32 diff --git a/business/partner/purchase/mtwm/callback.go b/business/partner/purchase/mtwm/callback.go index 140e8e1d3..aaf9b269a 100644 --- a/business/partner/purchase/mtwm/callback.go +++ b/business/partner/purchase/mtwm/callback.go @@ -6,32 +6,55 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func OnCallbackMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { - if CurPurchaseHandler != nil { - if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged || msg.Cmd == mtwmapi.MsgTypeStoreAuditStatusChanged { - response = CurPurchaseHandler.onStoreStatusChanged(msg) - } else if msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade { - response = CurPurchaseHandler.onNumberDowngrade(msg) - } else if msg.Cmd == mtwmapi.MsgTypeStoreBind { +// +//if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged || msg.Cmd == mtwmapi.MsgTypeStoreAuditStatusChanged { +//response = CurPurchaseHandler.onStoreStatusChanged(msg) +//} else if msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade { +//response = CurPurchaseHandler.onNumberDowngrade(msg) +//} else if msg.Cmd == mtwmapi.MsgTypeStoreBind { +// +//} else { +//if orderID := GetOrderIDFromMsg(msg); orderID != "" { +//jxutils.CallMsgHandler(func() { +//switch msg.Cmd { +//case mtwmapi.MsgTypeWaybillStatus: +//response = CurPurchaseHandler.onWaybillMsg(msg) +//default: +//response = CurPurchaseHandler.onOrderMsg(msg) +//} +//}, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) +//} +///*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { +// utils.CallFuncAsync(func() { +// OnFinancialMsg(msg) +// }) +//} */ +//} - } else { - if orderID := GetOrderIDFromMsg(msg); orderID != "" { - jxutils.CallMsgHandler(func() { - switch msg.Cmd { - case mtwmapi.MsgTypeWaybillStatus: - response = CurPurchaseHandler.onWaybillMsg(msg) - default: - response = CurPurchaseHandler.onOrderMsg(msg) - } - }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) - } - /*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { - utils.CallFuncAsync(func() { - OnFinancialMsg(msg) - }) - } */ - } +func OnCallbackMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { + if CurPurchaseHandler == nil { + return &mtwmapi.CallbackResponse{Data: "CurPurchaseHandler init fail"} } + + // 获取orderId + orderID := GetOrderIDFromMsg(msg) + switch { + case msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged || msg.Cmd == mtwmapi.MsgTypeStoreAuditStatusChanged: + response = CurPurchaseHandler.onStoreStatusChanged(msg) + case msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade: + response = CurPurchaseHandler.onNumberDowngrade(msg) + case msg.Cmd == mtwmapi.MsgTypeStoreBind: + break + case orderID != "" && msg.Cmd == mtwmapi.MsgTypeWaybillStatus: + jxutils.CallMsgHandler(func() { + if msg.Cmd == mtwmapi.MsgTypeWaybillStatus { + response = CurPurchaseHandler.onWaybillMsg(msg) + } else { + response = CurPurchaseHandler.onOrderMsg(msg) + } + }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) + } + return response } diff --git a/conf/app.conf b/conf/app.conf index 55436f001..b7cc5dc26 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -299,6 +299,7 @@ pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47" fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c" fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d" +fnMerchantId = "20200818" fnCallbackURL = "http://callback.jxc4.com/fn/msg" jxPrintAppID = "1000" @@ -387,6 +388,7 @@ jdShopAppSecret2 = "71e1061ac2f246f6ac27efb900edba12" fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c" fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d" +fnMerchantId = "20200818" fnCallbackURL = "http://callback-jxgy.jxc4.com/fn/msg" jxPrintAppID = "1000" @@ -562,6 +564,7 @@ pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47" fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c" fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d" +fnMerchantId = "20200818" fnCallbackURL = "http://callback.beta.jxc4.com/fn/msg" jxPrintAppID = "1000" diff --git a/controllers/auth2.go b/controllers/auth2.go index b1213ce08..259566d6d 100644 --- a/controllers/auth2.go +++ b/controllers/auth2.go @@ -368,7 +368,7 @@ func (c *Auth2Controller) ChangePassword() { }) } -// @Title 清除除参数token以外的这个人的token +// @Title 清除除参数token以外的这个人的tokenSendStoreMessage // @Description 清除除参数token以外的这个人的token // @Param token header string true "认证token" // @Success 200 {object} controllers.CallResult diff --git a/controllers/mtwm_callback.go b/controllers/mtwm_callback.go index 25233beaa..93aa57167 100644 --- a/controllers/mtwm_callback.go +++ b/controllers/mtwm_callback.go @@ -2,9 +2,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" ) @@ -14,14 +12,9 @@ type MtwmController struct { } func (c *MtwmController) onCallbackMsg(msgType string) { - c.Data["json"] = mtwmapi.Err2CallbackResponse(nil, "") msg, callbackResponse := api.MtwmAPI.GetCallbackMsg(c.Ctx.Request) - globals.SugarLogger.Debug(utils.Format4Output(msg, true)) if callbackResponse == nil { callbackResponse = mtwm.OnCallbackMsg(msg) - if callbackResponse == nil { - callbackResponse = mtwmapi.Err2CallbackResponse(nil, "") - } } c.Data["json"] = callbackResponse c.ServeJSON() diff --git a/globals/api/api.go b/globals/api/api.go index 966961b3e..6a5159261 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -273,7 +273,7 @@ func Init() { AliPayAPI = alipayapi.New(alipayAppID, []byte(beego.AppConfig.DefaultString("alipayPrivateKey", ""))) } - FnAPI = fnpsapi.New(beego.AppConfig.DefaultString("fnAppID", ""), beego.AppConfig.DefaultString("fnAppSecret", "")) + FnAPI = fnpsapi.New(beego.AppConfig.DefaultString("fnAppID", ""), beego.AppConfig.DefaultString("fnAppSecret", ""), beego.AppConfig.DefaultString("fnMerchantId", "")) FeieAPI = feieapi.New(beego.AppConfig.DefaultString("feieUser", ""), beego.AppConfig.DefaultString("feieKey", "")) XiaoWMAPI = xiaowmapi.New(beego.AppConfig.DefaultInt("xiaoWMAppID", 0), beego.AppConfig.DefaultString("xiaoWMAppKey", "")) YilianyunAPI = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID", ""), beego.AppConfig.DefaultString("yilianyunClientSecret", ""))